internal/templates/PSFProject-1.3.3.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">PSFProject</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">1.3.3</Version> <S N="Description">PowerShell Framework based project scaffold</S> <S N="Author">Friedrich Weinmann</S> <DT N="CreatedOn">2021-07-21T00: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>module</S> <S>psframework</S> </LST> </Obj> <Obj N="Parameters" RefId="3"> <TNRef RefId="2" /> <LST> <S>name</S> <S>author</S> <S>company</S> <S>description</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">year</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_Get-Date -Format "yyyy"_x000D__x000A__x0009__x0009_</S> <S N="Name">year</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_Get-Date -Format "yyyy"_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAEeWVhcgkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAAIA0KCQkJR2V0LURhdGUgLUZvcm1hdCAieXl5eSINCgkJCw==</BA> </MS> </Obj> </En> <En> <S N="Key">guid2</S> <Obj N="Value" RefId="6"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</S> <S N="Name">guid2</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAFZ3VpZDIJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAADYNCgkJCVtTeXN0ZW0uR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygpLlRvVXBwZXIoKQ0KCQkL</BA> </MS> </Obj> </En> <En> <S N="Key">testfolder</S> <Obj N="Value" RefId="7"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_@'_x000D__x000A_Write-PSFMessage -Level Important -Message "Creating test result folder"_x000D__x000A_$null = New-Item -Path "$PSScriptRoot\..\.." -Name TestResults -ItemType Directory -Force_x000D__x000A_'@_x000D__x000A__x0009__x0009_</S> <S N="Name">testfolder</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_@'_x000D__x000A_Write-PSFMessage -Level Important -Message "Creating test result folder"_x000D__x000A_$null = New-Item -Path "$PSScriptRoot\..\.." -Name TestResults -ItemType Directory -Force_x000D__x000A_'@_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAKdGVzdGZvbGRlcgkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAAtAENCgkJCUAnDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIkNyZWF0aW5nIHRlc3QgcmVzdWx0IGZvbGRlciINCiRudWxsID0gTmV3LUl0ZW0gLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi4iIC1OYW1lIFRlc3RSZXN1bHRzIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUZvcmNlDQonQA0KCQkL</BA> </MS> </Obj> </En> <En> <S N="Key">guid</S> <Obj N="Value" RefId="8"> <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> <En> <S N="Key">guid3</S> <Obj N="Value" RefId="9"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</S> <S N="Name">guid3</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAFZ3VpZDMJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAADYNCgkJCVtTeXN0ZW0uR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygpLlRvVXBwZXIoKQ0KCQkL</BA> </MS> </Obj> </En> <En> <S N="Key">psframework</S> <Obj N="Value" RefId="10"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_(Get-Module PSFramework).Version.ToString()_x000D__x000A__x0009__x0009_</S> <S N="Name">psframework</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_(Get-Module PSFramework).Version.ToString()_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAALcHNmcmFtZXdvcmsJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAADQNCgkJCShHZXQtTW9kdWxlIFBTRnJhbWV3b3JrKS5WZXJzaW9uLlRvU3RyaW5nKCkNCgkJCw==</BA> </MS> </Obj> </En> <En> <S N="Key">date</S> <Obj N="Value" RefId="11"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_Get-Date -Format "yyyy-MM-dd"_x000D__x000A__x0009__x0009_</S> <S N="Name">date</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_Get-Date -Format "yyyy-MM-dd"_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAEZGF0ZQkFAAAABQUAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBAwAAAAYGAAAAJg0KCQkJR2V0LURhdGUgLUZvcm1hdCAieXl5eS1NTS1kZCINCgkJCw==</BA> </MS> </Obj> </En> <En> <S N="Key">pesterconfig</S> <Obj N="Value" RefId="12"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A_'$config.TestResult.Enabled = $true'_x000D__x000A__x0009__x0009_</S> <S N="Name">pesterconfig</S> <SBK N="ScriptBlock">_x000D__x000A_'$config.TestResult.Enabled = $true'_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAMcGVzdGVyY29uZmlnCQUAAAAFBQAAADtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgEAAAAKU2NyaXB0VGV4dAEDAAAABgYAAAAqDQonJGNvbmZpZy5UZXN0UmVzdWx0LkVuYWJsZWQgPSAkdHJ1ZScNCgkJCw==</BA> </MS> </Obj> </En> <En> <S N="Key">guid4</S> <Obj N="Value" RefId="13"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</S> <S N="Name">guid4</S> <SBK N="ScriptBlock">_x000D__x000A__x0009__x0009__x0009_[System.Guid]::NewGuid().ToString().ToUpper()_x000D__x000A__x0009__x0009_</SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAFZ3VpZDQJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAADYNCgkJCVtTeXN0ZW0uR3VpZF06Ok5ld0d1aWQoKS5Ub1N0cmluZygpLlRvVXBwZXIoKQ0KCQkL</BA> </MS> </Obj> </En> <En> <S N="Key">dynamicscript_484991</S> <Obj N="Value" RefId="14"> <TNRef RefId="4" /> <ToString>PSModuleDevelopment.Template.ParameterScript</ToString> <Props> <S N="StringScript"> Get-Date -Format 'yyyy-MM-dd' </S> <S N="Name">dynamicscript_484991</S> <SBK N="ScriptBlock"> Get-Date -Format 'yyyy-MM-dd' </SBK> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAwDAAAAX1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24sIFZlcnNpb249My4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj0zMWJmMzg1NmFkMzY0ZTM1BQEAAAAsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABE5hbWULU2NyaXB0QmxvY2sBBDtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlNjcmlwdEJsb2NrU2VyaWFsaXphdGlvbkhlbHBlcgMAAAACAAAABgQAAAAUZHluYW1pY3NjcmlwdF80ODQ5OTEJBQAAAAUFAAAAO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyAQAAAApTY3JpcHRUZXh0AQMAAAAGBgAAAB8gR2V0LURhdGUgLUZvcm1hdCAneXl5eS1NTS1kZCcgCw==</BA> </MS> </Obj> </En> </DCT> </Obj> <Obj N="Parameters2" RefId="15"> <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="16"> <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="17"> <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="18"> <TNRef RefId="6" /> <LST> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> <S>PSModuleDevelopment.Template.TemplateItemFile</S> </LST> </Obj> <S N="Name">.github</S> <S N="RelativePath">.github</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="19"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="20"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAABy5naXRodWIGBQAAAAcuZ2l0aHViBgYAAAACw74JBwAAAAkIAAAABAMAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJCQAAAAIAAAACAAAABAcAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCgAAAAAAAAAAAAAAAQgAAAAHAAAACQoAAAAAAAAAAAAAAAcJAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQsAAAAJDAAAAA0CEQoAAAAAAAAAAQsAAAABAAAACQ0AAAAGDgAAAAl3b3JrZmxvd3MGDwAAABEuZ2l0aHViXHdvcmtmbG93cwkGAAAACREAAAAJEgAAAAUMAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYTAAAA0wUjIFRoZXNlIGFyZSBzdXBwb3J0ZWQgZnVuZGluZyBtb2RlbCBwbGF0Zm9ybXMNCg0KZ2l0aHViOiAjIFJlcGxhY2Ugd2l0aCB1cCB0byA0IEdpdEh1YiBTcG9uc29ycy1lbmFibGVkIHVzZXJuYW1lcyBlLmcuLCBbdXNlcjEsIHVzZXIyXQ0KcGF0cmVvbjogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgUGF0cmVvbiB1c2VybmFtZQ0Kb3Blbl9jb2xsZWN0aXZlOiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBPcGVuIENvbGxlY3RpdmUgdXNlcm5hbWUNCmtvX2ZpOiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBLby1maSB1c2VybmFtZQ0KdGlkZWxpZnQ6ICMgUmVwbGFjZSB3aXRoIGEgc2luZ2xlIFRpZGVsaWZ0IHBsYXRmb3JtLW5hbWUvcGFja2FnZS1uYW1lIGUuZy4sIG5wbS9iYWJlbA0KY29tbXVuaXR5X2JyaWRnZTogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgQ29tbXVuaXR5IEJyaWRnZSBwcm9qZWN0LW5hbWUgZS5nLiwgY2xvdWQtZm91bmRyeQ0KbGliZXJhcGF5OiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBMaWJlcmFwYXkgdXNlcm5hbWUNCmlzc3VlaHVudDogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgSXNzdWVIdW50IHVzZXJuYW1lDQpvdGVjaGllOiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBPdGVjaGllIHVzZXJuYW1lDQpjdXN0b206ICMgUmVwbGFjZSB3aXRoIHVwIHRvIDQgY3VzdG9tIHNwb25zb3JzaGlwIFVSTHMgZS5nLiwgWydsaW5rMScsICdsaW5rMiddDQoBCRQAAAAJFQAAAAYWAAAAC0ZVTkRJTkcueW1sBhcAAAATLmdpdGh1YlxGVU5ESU5HLnltbAkGAAAACRkAAAAJGgAAAAENAAAAAwAAAAkbAAAAAgAAAAIAAAABEQAAAAcAAAAJCgAAAAAAAAAAAAAAARIAAAAHAAAACQoAAAAAAAAAAAAAAAEUAAAABwAAAAkKAAAAAAAAAAAAAAABFQAAAAcAAAAJCgAAAAAAAAAAAAAAARkAAAAHAAAACQoAAAAAAAAAAAAAAAEaAAAABwAAAAkKAAAAAAAAAAAAAAAHGwAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkdAAAACR4AAAANAgEdAAAADAAAAAYfAAAA3gNvbjoNCiAgcHVzaDoNCiAgICBicmFuY2hlczoNCiAgICAgIC0gbWFzdGVyDQoNCmpvYnM6DQogIGJ1aWxkOg0KDQogICAgcnVucy1vbjogd2luZG93cy0yMDE5DQoNCiAgICBzdGVwczoNCiAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjENCiAgICAtIG5hbWU6IEluc3RhbGwgUHJlcmVxdWlzaXRlcw0KICAgICAgcnVuOiAuXGJ1aWxkXHZzdHMtcHJlcmVxdWlzaXRlcy5wczENCiAgICAgIHNoZWxsOiBwb3dlcnNoZWxsDQogICAgLSBuYW1lOiBWYWxpZGF0ZQ0KICAgICAgcnVuOiAuXGJ1aWxkXHZzdHMtdmFsaWRhdGUucHMxDQogICAgICBzaGVsbDogcG93ZXJzaGVsbA0KICAgIC0gbmFtZTogQnVpbGQNCiAgICAgIHJ1bjogLlxidWlsZFx2c3RzLWJ1aWxkLnBzMSAtQXBpS2V5ICRlbnY6QVBJS0VZDQogICAgICBzaGVsbDogcG93ZXJzaGVsbA0KICAgICAgZW52Og0KICAgICAgICBBUElLRVk6ICR7eyBzZWNyZXRzLkFwaUtleSB9fQ0KAQkgAAAACSEAAAAGIgAAAAlidWlsZC55bWwGIwAAABsuZ2l0aHViXHdvcmtmbG93c1xidWlsZC55bWwJBgAAAAklAAAACSYAAAABHgAAAAwAAAAGJwAAALICb246IFtwdWxsX3JlcXVlc3RdDQoNCmpvYnM6DQogIHZhbGlkYXRlOg0KDQogICAgcnVucy1vbjogd2luZG93cy0yMDE5DQoNCiAgICBzdGVwczoNCiAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjENCiAgICAtIG5hbWU6IEluc3RhbGwgUHJlcmVxdWlzaXRlcw0KICAgICAgcnVuOiAuXGJ1aWxkXHZzdHMtcHJlcmVxdWlzaXRlcy5wczENCiAgICAgIHNoZWxsOiBwb3dlcnNoZWxsDQogICAgLSBuYW1lOiBWYWxpZGF0ZQ0KICAgICAgcnVuOiAuXGJ1aWxkXHZzdHMtdmFsaWRhdGUucHMxDQogICAgICBzaGVsbDogcG93ZXJzaGVsbA0KAQkoAAAACSkAAAAGKgAAAAx2YWxpZGF0ZS55bWwGKwAAAB4uZ2l0aHViXHdvcmtmbG93c1x2YWxpZGF0ZS55bWwJBgAAAAktAAAACS4AAAABIAAAAAcAAAAJCgAAAAAAAAAAAAAAASEAAAAHAAAACQoAAAAAAAAAAAAAAAElAAAABwAAAAkKAAAAAAAAAAAAAAABJgAAAAcAAAAJCgAAAAAAAAAAAAAAASgAAAAHAAAACQoAAAAAAAAAAAAAAAEpAAAABwAAAAkKAAAAAAAAAAAAAAABLQAAAAcAAAAJCgAAAAAAAAAAAAAAAS4AAAAHAAAACQoAAAAAAAAAAAAAAAs=</BA> </MS> </Obj> <Obj RefId="21"> <TNRef RefId="7" /> <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString> <Props> <Obj N="Children" RefId="22"> <TNRef RefId="6" /> <LST> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> <S>PSModuleDevelopment.Template.TemplateItemFolder</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">azFunctionResources</S> <S N="RelativePath">azFunctionResources</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="23"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="24"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAAE2F6RnVuY3Rpb25SZXNvdXJjZXMGBQAAABNhekZ1bmN0aW9uUmVzb3VyY2VzBgYAAAACw74JBwAAAAkIAAAABAMAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJCQAAAAoAAAAKAAAABAcAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCgAAAAAAAAAAAAAAAQgAAAAHAAAACQoAAAAAAAAAAAAAAAcJAAAAAAEAAAAQAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQsAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAAAkTAAAACRQAAAANBhEKAAAAAAAAAAELAAAAAQAAAAkVAAAABhYAAAAMY2xpZW50TW9kdWxlBhcAAAAgYXpGdW5jdGlvblJlc291cmNlc1xjbGllbnRNb2R1bGUJBgAAAAkZAAAACRoAAAABDAAAAAEAAAAJGwAAAAYcAAAAEGZ1bmN0aW9uT3ZlcnJpZGUGHQAAACRhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGUJBgAAAAkfAAAACSAAAAABDQAAAAEAAAAJIQAAAAYiAAAAEHByb2ZpbGVGdW5jdGlvbnMGIwAAACRhekZ1bmN0aW9uUmVzb3VyY2VzXHByb2ZpbGVGdW5jdGlvbnMJBgAAAAklAAAACSYAAAAFDgAAAC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUZpbGUJAAAABVZhbHVlCVBsYWluVGV4dBRDb250ZW50UGFyYW1ldGVyRmxhdBZDb250ZW50UGFyYW1ldGVyU2NyaXB0BE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAEAAwMBAQEDAwF/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAGJwAAAFd7DQogICAgInZlcnNpb24iOiAiMi4wIiwNCiAgICAibWFuYWdlZERlcGVuZGVuY3kiOiB7DQogICAgICAiRW5hYmxlZCI6IHRydWUNCiAgICB9DQogIH0BCSgAAAAJKQAAAAYqAAAADGhvc3QtYXouanNvbgYrAAAAIGF6RnVuY3Rpb25SZXNvdXJjZXNcaG9zdC1hei5qc29uCQYAAAAJLQAAAAkuAAAAAQ8AAAAOAAAABi8AAAAbew0KICAgICJ2ZXJzaW9uIjogICIyLjAiDQp9AQkwAAAACTEAAAAGMgAAAAlob3N0Lmpzb24GMwAAAB1hekZ1bmN0aW9uUmVzb3VyY2VzXGhvc3QuanNvbgkGAAAACTUAAAAJNgAAAAEQAAAADgAAAAY3AAAAtQF7DQogICAgIklzRW5jcnlwdGVkIjogZmFsc2UsDQogICAgIlZhbHVlcyI6IHsNCiAgICAgICJGVU5DVElPTlNfV09SS0VSX1JVTlRJTUUiOiAicG93ZXJzaGVsbCIsDQogICAgICAiQXp1cmVXZWJKb2JzU3RvcmFnZSI6ICItLWNvbm5lY3Rpb24gc3RyaW5nIGZvciBzdG9yYWdlIGFjY291bnQtLS0iDQogICAgfQ0KICB9AQk4AAAACTkAAAAGOgAAABNsb2NhbC5zZXR0aW5ncy5qc29uBjsAAAAnYXpGdW5jdGlvblJlc291cmNlc1xsb2NhbC5zZXR0aW5ncy5qc29uCQYAAAAJPQAAAAk+AAAAAREAAAAOAAAABj8AAACOAzwjDQpUaGlzIGlzIHRoZSBnbG9ibCBwcm9maWxlIGZpbGUgZm9yIHRoZSBBenVyZSBGdW5jdGlvbiBBcHAuDQpUaGlzIGZpbGUgd2lsbCBoYXZlIGJlZW4gZXhlY3V0ZWQgZmlyc3QsIGJlZm9yZSBhbnkgZnVuY3Rpb24gcnVucy4NClVzZSB0aGlzIHRvIGNyZWF0ZSBhIGNvbW1vbiBleGVjdXRpb24gZW52aXJvbm1lbnQsDQpidXQga2VlcCBpbiBtaW5kIHRoYXQgdGhlIHByb2ZpbGUgZXhlY3V0aW9uIHRpbWUgaXMgYWRkZWQgdG8gdGhlIGZ1bmN0aW9uIHN0YXJ0dXAgdGltZSBmb3IgQUxMIGZ1bmN0aW9ucy4NCiM+DQoNCmlmICgkZW52Ok1TSV9TRUNSRVQgLWFuZCAoR2V0LU1vZHVsZSAtTGlzdEF2YWlsYWJsZSBBei5BY2NvdW50cykpDQp7DQoJQ29ubmVjdC1BekFjY291bnQgLUlkZW50aXR5DQp9AQlAAAAACUEAAAAGQgAAAAtwcm9maWxlLnBzMQZDAAAAH2F6RnVuY3Rpb25SZXNvdXJjZXNccHJvZmlsZS5wczEJBgAAAAlFAAAACUYAAAABEgAAAA4AAAAGRwAAAIcEIyBBenVyZSBGdW5jdGlvbiBSZXNvdXJjZXMNCg0KVGhpcyBmb2xkZXIgaXMgdXNlZCB0byBzdG9yZSBBenVyZSBGdW5jdGlvbiBzcGVjaWZpYyBtZXRhIGRhdGEgYW5kIHJlc291cmNlcy4NCg0KVGhpcyBmb2xkZXIgaXMgYWxzbyB1c2VkIHRvIGFsbG93IHRoZSB1c2VyIHRvIGVhc2lseSBjcmVhdGUgYSBjdXN0b20gZnVuY3Rpb24tc3BlY2lmaWMgY29uZmlndXJhdGlvbiwgZm9yIGV4YW5tcGxlIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgdHJpZ2dlciBzZXR0aW5ncy4NCg0KVG8gc3BlY2lmeSBjdXN0b20sICdQZXIgRnVuY3Rpb24nIGNvbmZpZ3VyYXRpb24ganNvbiwganVzdCBwbGFjZSB0aGUgZGVzaXJlZCBjb25maWd1cmF0aW9uIGZpbGUgYXMgJ2Z1bmN0aW9ubmFtZS5qc29uJyBpbnRvIHRoaXMgZm9sZGVyIChpdCBkb2VzIG5vdCBtYXR0ZXIgaWYgaXQgaXMgdGhlIFBvd2VyU2hlbGwgZnVuY3Rpb24gbmFtZSBvciB0aGUgY29uZGVuc2VkIHZlcnNpb24gdXNlZCBmb3IgcHVibGlzaGluZyBvbiBBenVyZSkuAQlIAAAACUkAAAAGSgAAAAlyZWFkbWUubWQGSwAAAB1hekZ1bmN0aW9uUmVzb3VyY2VzXHJlYWRtZS5tZAkGAAAACU0AAAAJTgAAAAETAAAADgAAAAZPAAAAEkB7DQoJQXogPSAnMS4qJw0KfQEJUAAAAAlRAAAABlIAAAARcmVxdWlyZW1lbnRzLnBzZDEGUwAAACVhekZ1bmN0aW9uUmVzb3VyY2VzXHJlcXVpcmVtZW50cy5wc2QxCQYAAAAJVQAAAAlWAAAAARQAAAAOAAAABlcAAACHA3BhcmFtICgNCgkkUmVxdWVzdCwNCgkNCgkkVHJpZ2dlck1ldGFkYXRhDQopDQoNCiRwYXJhbWV0ZXJPYmplY3QgPSBDb252ZXJ0LUF6dXJlRnVuY3Rpb25QYXJhbWV0ZXIgLVJlcXVlc3QgJFJlcXVlc3QNCiRwYXJhbWV0ZXJzID0gJHBhcmFtZXRlck9iamVjdC5QYXJhbWV0ZXJzDQp0cnkgeyAkZGF0YSA9ICVmdW5jdGlvbm5hbWUlIEBwYXJhbWV0ZXJzIH0NCmNhdGNoDQp7DQoJV3JpdGUtQXp1cmVGdW5jdGlvbk91dHB1dCAtVmFsdWUgIkZhaWxlZCB0byBleGVjdXRlOiAkXyIgLVN0YXR1cyBJbnRlcm5hbFNlcnZlckVycm9yDQoJcmV0dXJuDQp9DQoNCldyaXRlLUF6dXJlRnVuY3Rpb25PdXRwdXQgLVZhbHVlICRkYXRhIC1TZXJpYWxpemU6JHBhcmFtZXRlck9iamVjdC5TZXJpYWxpemUBCVgAAAAJWQAAAAZaAAAAB3J1bi5wczEGWwAAABthekZ1bmN0aW9uUmVzb3VyY2VzXHJ1bi5wczEJBgAAAAldAAAACV4AAAABFQAAAAMAAAAJXwAAAAQAAAAEAAAAARkAAAAHAAAACQoAAAAAAAAAAAAAAAEaAAAABwAAAAkKAAAAAAAAAAAAAAABGwAAAAMAAAAJYQAAAAMAAAADAAAAAR8AAAAHAAAACQoAAAAAAAAAAAAAAAEgAAAABwAAAAkKAAAAAAAAAAAAAAABIQAAAAMAAAAJYwAAAAIAAAACAAAAASUAAAAHAAAACQoAAAAAAAAAAAAAAAEmAAAABwAAAAkKAAAAAAAAAAAAAAABKAAAAAcAAAAJCgAAAAAAAAAAAAAAASkAAAAHAAAACQoAAAAAAAAAAAAAAAEtAAAABwAAAAkKAAAAAAAAAAAAAAABLgAAAAcAAAAJCgAAAAAAAAAAAAAAATAAAAAHAAAACQoAAAAAAAAAAAAAAAExAAAABwAAAAkKAAAAAAAAAAAAAAABNQAAAAcAAAAJCgAAAAAAAAAAAAAAATYAAAAHAAAACQoAAAAAAAAAAAAAAAE4AAAABwAAAAkKAAAAAAAAAAAAAAABOQAAAAcAAAAJCgAAAAAAAAAAAAAAAT0AAAAHAAAACQoAAAAAAAAAAAAAAAE+AAAABwAAAAkKAAAAAAAAAAAAAAABQAAAAAcAAAAJCgAAAAAAAAAAAAAAAUEAAAAHAAAACQoAAAAAAAAAAAAAAAFFAAAABwAAAAkKAAAAAAAAAAAAAAABRgAAAAcAAAAJCgAAAAAAAAAAAAAAAUgAAAAHAAAACQoAAAAAAAAAAAAAAAFJAAAABwAAAAkKAAAAAAAAAAAAAAABTQAAAAcAAAAJCgAAAAAAAAAAAAAAAU4AAAAHAAAACQoAAAAAAAAAAAAAAAFQAAAABwAAAAkKAAAAAAAAAAAAAAABUQAAAAcAAAAJCgAAAAAAAAAAAAAAAVUAAAAHAAAACQoAAAAAAAAAAAAAAAFWAAAABwAAAAkKAAAAAAAAAAAAAAABWAAAAAcAAAAJCgAAAAAAAAAAAAAAAVkAAAAHAAAACQoAAAAAAAAAAAAAAAFdAAAABwAAAAkKAAAAAAAAAAAAAAABXgAAAAcAAAAJCgAAAAAAAAAAAAAAB18AAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJZQAAAAlmAAAACWcAAAAJaAAAAAdhAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACWkAAAAJagAAAAlrAAAACgdjAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACWwAAAAJbQAAAA0CAWUAAAABAAAACW4AAAAGbwAAAAlmdW5jdGlvbnMGcAAAACphekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxmdW5jdGlvbnMJBgAAAAlyAAAACXMAAAABZgAAAAEAAAAJdAAAAAZ1AAAACGludGVybmFsBnYAAAApYXpGdW5jdGlvblJlc291cmNlc1xjbGllbnRNb2R1bGVcaW50ZXJuYWwJBgAAAAl4AAAACXkAAAABZwAAAA4AAAAGegAAAIICZnVuY3Rpb24gJWZ1bmN0aW9ubmFtZSUNCnsNCgklcGFyYW1ldGVyJQ0KCQ0KCXByb2Nlc3MNCgl7DQoJCSRpbnZva2VQYXJhbWV0ZXJzID0gR2V0LUludGVybmFsQ29ubmVjdGlvbkRhdGEgLU1ldGhvZCAnJW1ldGhvZCUnIC1QYXJhbWV0ZXIgJFBTQm91bmRQYXJhbWV0ZXJzIC1GdW5jdGlvbk5hbWUgJyVjb25kZW5zZWRuYW1lJScNCgkJSW52b2tlLVJlc3RNZXRob2QgQGludm9rZVBhcmFtZXRlcnMgfCBDb252ZXJ0RnJvbS1QU0ZDbGl4bWwNCgl9DQp9AQl7AAAACXwAAAAGfQAAAAxmdW5jdGlvbi5wczEGfgAAAC1hekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxmdW5jdGlvbi5wczEJBgAAAAmAAAAACYEAAAABaAAAAA4AAAAGggAAAKwDJHNjcmlwdDpNb2R1bGVSb290ID0gJFBTU2NyaXB0Um9vdA0KDQpmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAtUGF0aCAiJHNjcmlwdDpNb2R1bGVSb290XGludGVybmFsXGNvbmZpZ3VyYXRpb25zIiAtUmVjdXJzZSAtRmlsdGVyICcqLnBzMScpKQ0Kew0KCS4gJGZpbGUuRnVsbE5hbWUNCn0NCmZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtIC1QYXRoICIkc2NyaXB0Ok1vZHVsZVJvb3RcaW50ZXJuYWxcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsdGVyICcqLnBzMScpKQ0Kew0KCS4gJGZpbGUuRnVsbE5hbWUNCn0NCmZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtIC1QYXRoICIkc2NyaXB0Ok1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsdGVyICcqLnBzMScpKQ0Kew0KCS4gJGZpbGUuRnVsbE5hbWUNCn0BCYMAAAAJhAAAAAaFAAAAD21vZHVsZXJvb3QucHNtMQaGAAAAMGF6RnVuY3Rpb25SZXNvdXJjZXNcY2xpZW50TW9kdWxlXG1vZHVsZXJvb3QucHNtMQkGAAAACYgAAAAJiQAAAAFpAAAADgAAAAaKAAAA5QJ7DQogICAgImJpbmRpbmdzIjogWw0KICAgICAgICB7DQogICAgICAgICJhdXRoTGV2ZWwiOiAiZnVuY3Rpb24iLA0KICAgICAgICAidHlwZSI6ICJodHRwVHJpZ2dlciIsDQogICAgICAgICJkaXJlY3Rpb24iOiAiaW4iLA0KICAgICAgICAibmFtZSI6ICJSZXF1ZXN0IiwNCiAgICAgICAgIm1ldGhvZHMiOiBbDQogICAgICAgICAgICAiZGVsZXRlIg0KICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgInR5cGUiOiAiaHR0cCIsDQogICAgICAgICJkaXJlY3Rpb24iOiAib3V0IiwNCiAgICAgICAgIm5hbWUiOiAiUmVzcG9uc2UiDQogICAgICAgIH0NCiAgICBdLA0KICAgICJkaXNhYmxlZCI6IHRydWUNCn0BCYsAAAAJjAAAAAaNAAAAEEdldC1FeGFtcGxlLmpzb24GjgAAADVhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcR2V0LUV4YW1wbGUuanNvbgkGAAAACZAAAAAJkQAAAAFqAAAADgAAAAaSAAAA+QZmdW5jdGlvbiBHZXQtRXhhbXBsZQ0Kew0KCTwjDQoJCS5OT1RFUw0KCQkJVGhpcyBmaWxlIHdpbGwgYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgYXV0by1nZW5lcmF0ZWQgQ0xJRU5UIE1PRFVMRSBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbi4NCgkJDQoJCQlVc2luZyB0aGUgdnN0cy1jcmVhdGVGdW5jdGlvbkNsaWVudE1vZHVsZS5wczEgdGFzayBzY3JpcHQsIHlvdSBjYW4gYXV0b2dlbmVyYXRlIGEgY2xpZW50IG1vZHVsZS4NCgkJCVRoYXQgbW9kdWxlIGNhbiBiZSB1c2VkIHRvIGNvbm5lY3QgdG8gdGhlIHB1Ymxpc2hlZCBBenVyZSBGdW5jdGlvbiBNb2R1bGUuDQoJCQlIb3dldmVyIHNvbWV0aW1lcyB5b3UgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY2xpZW50IGZ1bmN0aW9uIGZvciBhIGdpdmVuIGNvbW1hbmQsDQoJCQlpbiBvcmRlciB0byBiZXR0ZXIgY3VzdG9taXplIHRoZSB3YXkgaXQgYmVoYXZlcy4NCgkJDQoJCQlDcmVhdGluZyBhIHBzMSBmaWxlIHdpdGggdGhlIG5hbWUgb2YgdGhlIHNwZWNpZmljIGZ1bmN0aW9uIGluIHRoaXMgZm9sZGVyIHdpbGwgdXNlIHRoaXMgZmlsZSwNCgkJCXJhdGhlciB0aGFuIGNyZWF0aW5nIGEgZGVmYXVsdCBjb3B5Lg0KCQkNCgkJCU5PVEU6DQoJCQlUaGVyZSB3aWxsIGJlIG5vIGZ1cnRoZXIgYXV0b21hdGljIGNoYW5nZSBkZXRlY3Rpb24hDQoJCQlJZiB5b3UgbGF0ZXIgdXBkYXRlIHRoZSBBenVyZSBGdW5jdGlvbiwgeW91IG5lZWQgdG8gbWFudWFsbHkgdXBkYXRlIHRoZSBjbGllbnQgZnVuY3Rpb24gYXMgd2VsbC4NCgkjPg0KCVtDbWRsZXRCaW5kaW5nKCldDQoJUGFyYW0gKA0KCQ0KCSkNCgkNCgliZWdpbg0KCXsNCgkJDQoJfQ0KCXByb2Nlc3MNCgl7DQoJDQoJfQ0KCWVuZA0KCXsNCgkNCgl9DQp9AQmTAAAACZQAAAAGlQAAAA9HZXQtRXhhbXBsZS5wczEGlgAAADRhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcR2V0LUV4YW1wbGUucHMxCQYAAAAJmAAAAAmZAAAAAWsAAAAOAAAABpoAAACaAUB7DQoJIyBPdmVycmlkZSB0aGUgcmVzdCBtZXRob2RzIHVzZWQgZm9yIHRoZSBBUEkgZW5kcG9pbnQNCgkjIFJlc3RNZXRob2RzID0gJ2RlbGV0ZScNCgkNCgkjIE92ZXJyaWRlIGluY2x1c2lvbiBpbnRvIGNsaWVudCBtb2R1bGUNCgkjIE5vQ2xpZW50RnVuY3Rpb24NCn0BCZsAAAAJnAAAAAadAAAAEEdldC1FeGFtcGxlLnBzZDEGngAAADVhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcR2V0LUV4YW1wbGUucHNkMQkGAAAACaAAAAAJoQAAAAFsAAAADgAAAAaiAAAAqgpmdW5jdGlvbiBDb252ZXJ0LUF6dXJlRnVuY3Rpb25QYXJhbWV0ZXINCnsNCjwjDQoJLlNZTk9QU0lTDQoJCUV4dHJhY3RzIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCBpbnRvIHRoZSByZXN0IG1ldGhvZC4NCgkNCgkuREVTQ1JJUFRJT04NCgkJRXh0cmFjdHMgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIGludG8gdGhlIHJlc3QgbWV0aG9kIG9mIGFuIEF6dXJlIEZ1bmN0aW9uLg0KCQlSZXR1cm5zIGEgaGFzaHRhYmxlLCBzaW1pbGFyIHRvIHdoYXQgd291bGQgYmUgZm91bmQgb24gYSAkUFNCb3VuZFBhcmFtZXRlcnMgdmFyaWFibGUuDQoJDQoJLlBBUkFNRVRFUiBSZXF1ZXN0DQoJCVRoZSByZXF1ZXN0IHRvIHByb2Nlc3MNCgkNCgkuRVhBTVBMRQ0KCQlQUyBDOlw+IENvbnZlcnQtQXp1cmVGdW5jdGlvblBhcmFtZXRlciAtUmVxdWVzdCAkcmVxdWVzdA0KCQ0KCQlDb252ZXJ0cyB0aGUgJHJlcXVlc3Qgb2JqZWN0IGludG8gYSByZWd1bGFyIGhhc2h0YWJsZS4NCiM+DQoJW091dHB1dFR5cGUoW1N5c3RlbS5Db2xsZWN0aW9ucy5IYXNodGFibGVdKV0NCglbQ21kbGV0QmluZGluZygpXQ0KCXBhcmFtICgNCgkJJFJlcXVlc3QNCgkpDQoJDQoJJHBhcmFtZXRlck9iamVjdCA9IFtwc2N1c3RvbW9iamVjdF1Aew0KCQlQYXJhbWV0ZXJzID0gQHsgfQ0KCQlTZXJpYWxpemUgPSAkZmFsc2UNCgl9DQoJDQoJZm9yZWFjaCAoJGtleSBpbiAkUmVxdWVzdC5RdWVyeS5LZXlzKQ0KCXsNCgkJIyBEbyBOT1QgaW5jbHVkZSB0aGUgYXV0aGVudGljYXRpb24ga2V5DQoJCWlmICgka2V5IC1lcSAnY29kZScpIHsgY29udGludWUgfQ0KCQkkcGFyYW1ldGVyT2JqZWN0LlBhcmFtZXRlcnNbJGtleV0gPSAkUmVxdWVzdC5RdWVyeS4ka2V5DQoJfQ0KCWZvcmVhY2ggKCRrZXkgaW4gJFJlcXVlc3QuQm9keS5LZXlzKQ0KCXsNCgkJJHBhcmFtZXRlck9iamVjdC5QYXJhbWV0ZXJzWyRrZXldID0gJFJlcXVlc3QuQm9keS4ka2V5DQoJfQ0KCWlmICgkcGFyYW1ldGVyT2JqZWN0LlBhcmFtZXRlcnMuX19QU1NlcmlhbGl6ZSkNCgl7DQoJCSRwYXJhbWV0ZXJPYmplY3QuU2VyaWFsaXplID0gJHRydWUNCgkJJG51bGwgPSAkcGFyYW1ldGVyT2JqZWN0LlBhcmFtZXRlcnMuUmVtb3ZlKCdfX1BTU2VyaWFsaXplJykNCgl9DQoJaWYgKCRwYXJhbWV0ZXJPYmplY3QuUGFyYW1ldGVycy5fX1NlcmlhbGl6ZWRQYXJhbWV0ZXJzKQ0KCXsNCgkJJHBhcmFtZXRlck9iamVjdC5QYXJhbWV0ZXJzID0gJHBhcmFtZXRlck9iamVjdC5QYXJhbWV0ZXJzLl9fU2VyaWFsaXplZFBhcmFtZXRlcnMgfCBDb252ZXJ0RnJvbS1QU0ZDbGl4bWwNCgl9DQoJDQoJJHBhcmFtZXRlck9iamVjdA0KfQEJowAAAAmkAAAABqUAAAAiQ29udmVydC1BenVyZUZ1bmN0aW9uUGFyYW1ldGVyLnBzMQamAAAAR2F6RnVuY3Rpb25SZXNvdXJjZXNccHJvZmlsZUZ1bmN0aW9uc1xDb252ZXJ0LUF6dXJlRnVuY3Rpb25QYXJhbWV0ZXIucHMxCQYAAAAJqAAAAAmpAAAAAW0AAAAOAAAABqoAAAC0CmZ1bmN0aW9uIFdyaXRlLUF6dXJlRnVuY3Rpb25PdXRwdXQNCnsNCjwjDQoJLlNZTk9QU0lTDQoJCVdyaXRlIG91dHB1dCBlcXVhbGx5IHdlbGwgZnJvbSBBenVyZSBGdW5jdGlvbnMgb3IgbG9jYWxseS4NCgkNCgkuREVTQ1JJUFRJT04NCgkJV3JpdGUgb3V0cHV0IGVxdWFsbHkgd2VsbCBmcm9tIEF6dXJlIEZ1bmN0aW9ucyBvciBsb2NhbGx5Lg0KCQlXaGVuIGNhbGxpbmcgdGhpcyBjb21tYW5kLCBjYWxsIHJldHVybiBzdHJhaWdodCBhZnRlciBpdC4NCgkJVXNlIFdyaXRlLUF6dXJlRnVuY3Rpb25TdGF0dXMgZmlyc3QgaWYgYW4gZXJyb3Igc2hvdWxkIGJlIHJldHVybmVkLCB0aGVuIHNwZWNpZnkgYW4gZXJyb3IgdGV4dCBoZXJlLg0KCQ0KCS5QQVJBTUVURVIgVmFsdWUNCgkJVGhlIHZhbHVlIGRhdGEgdG8gcmV0dXJuLg0KCQlFaXRoZXIgYW4gZXJyb3IgbWVzc2FnZQ0KCQ0KCS5QQVJBTUVURVIgU2VyaWFsaXplDQoJCVJldHVybiB0aGUgb3V0cHV0IG9iamVjdCBhcyBjb21wcmVzc2VkIGNsaXhtbCBzdHJpbmcuDQoJCVlvdSBjYW4gdXNlIENvbnZlcnRGcm9tLVBTRkNsaXhtbCB0byByZXN0b3JlIHRoZSBvYmplY3Qgb24gdGhlIHJlY2lwaWVudC1zaWRlLg0KCQ0KCS5FWEFNUExFDQoJCVBTIEM6XD4gV3JpdGUtQXp1cmVGdW5jdGlvbk91dHB1dCAtVmFsdWUgJHJlc3VsdA0KCQ0KCQlXcml0ZXMgdGhlIGNvbnRlbnQgb2YgJHJlc3VsdCBhcyBvdXRwdXQuDQoJDQoJLkVYQU1QTEUNCgkJUFMgQzpcPiBXcml0ZS1BenVyZUZ1bmN0aW9uT3V0cHV0IC1WYWx1ZSAkcmVzdWx0IC1TZXJpYWxpemUNCgkNCgkJV3JpdGVzIHRoZSBjb250ZW50IG9mICRyZXN1bHQgYXMgb3V0cHV0Lg0KCQlJZiBjYWxsZWQgZnJvbSBBenVyZSBGdW5jdGlvbnMsIGl0IHdpbGwgY29udmVydCB0aGUgb3V0cHV0IGFzIGNvbXByZXNzZWQgY2xpeG1sIHN0cmluZy4NCgkJDQojPg0KCVtDbWRsZXRCaW5kaW5nKCldDQoJcGFyYW0gKA0KCQlbUGFyYW1ldGVyKE1hbmRhdG9yeSA9ICR0cnVlKV0NCgkJJFZhbHVlLA0KCQkNCgkJW3N3aXRjaF0NCgkJJFNlcmlhbGl6ZSwNCgkJDQoJCVtTeXN0ZW0uTmV0Lkh0dHBTdGF0dXNDb2RlXQ0KCQkkU3RhdHVzID0gW1N5c3RlbS5OZXQuSHR0cFN0YXR1c0NvZGVdOjpPSw0KCSkNCgkNCglpZiAoJFNlcmlhbGl6ZSkNCgl7DQoJCSRWYWx1ZSA9ICRWYWx1ZSB8IENvbnZlcnRUby1QU0ZDbGl4bWwNCgl9DQoJDQoJUHVzaC1PdXRwdXRCaW5kaW5nIC1OYW1lIFJlc3BvbnNlIC1WYWx1ZSAoDQoJCVtIdHRwUmVzcG9uc2VDb250ZXh0XUB7DQoJCQlTdGF0dXNDb2RlID0gJFN0YXR1cw0KCQkJQm9keQkgICA9ICRWYWx1ZQ0KCQl9DQoJKQ0KfQEJqwAAAAmsAAAABq0AAAAdV3JpdGUtQXp1cmVGdW5jdGlvbk91dHB1dC5wczEGrgAAAEJhekZ1bmN0aW9uUmVzb3VyY2VzXHByb2ZpbGVGdW5jdGlvbnNcV3JpdGUtQXp1cmVGdW5jdGlvbk91dHB1dC5wczEJBgAAAAmwAAAACbEAAAABbgAAAAMAAAAJsgAAAAEAAAABAAAAAXIAAAAHAAAACQoAAAAAAAAAAAAAAAFzAAAABwAAAAkKAAAAAAAAAAAAAAABdAAAAAMAAAAJtAAAAAIAAAACAAAAAXgAAAAHAAAACQoAAAAAAAAAAAAAAAF5AAAABwAAAAkKAAAAAAAAAAAAAAABewAAAAcAAAAJCgAAAAAAAAAAAAAAAXwAAAAHAAAACQoAAAAAAAAAAAAAAAGAAAAABwAAAAkKAAAAAAAAAAAAAAABgQAAAAcAAAAJCgAAAAAAAAAAAAAAAYMAAAAHAAAACQoAAAAAAAAAAAAAAAGEAAAABwAAAAkKAAAAAAAAAAAAAAABiAAAAAcAAAAJCgAAAAAAAAAAAAAAAYkAAAAHAAAACQoAAAAAAAAAAAAAAAGLAAAABwAAAAkKAAAAAAAAAAAAAAABjAAAAAcAAAAJCgAAAAAAAAAAAAAAAZAAAAAHAAAACQoAAAAAAAAAAAAAAAGRAAAABwAAAAkKAAAAAAAAAAAAAAABkwAAAAcAAAAJCgAAAAAAAAAAAAAAAZQAAAAHAAAACQoAAAAAAAAAAAAAAAGYAAAABwAAAAkKAAAAAAAAAAAAAAABmQAAAAcAAAAJCgAAAAAAAAAAAAAAAZsAAAAHAAAACQoAAAAAAAAAAAAAAAGcAAAABwAAAAkKAAAAAAAAAAAAAAABoAAAAAcAAAAJCgAAAAAAAAAAAAAAAaEAAAAHAAAACQoAAAAAAAAAAAAAAAGjAAAABwAAAAkKAAAAAAAAAAAAAAABpAAAAAcAAAAJCgAAAAAAAAAAAAAAAagAAAAHAAAACQoAAAAAAAAAAAAAAAGpAAAABwAAAAkKAAAAAAAAAAAAAAABqwAAAAcAAAAJCgAAAAAAAAAAAAAAAawAAAAHAAAACQoAAAAAAAAAAAAAAAGwAAAABwAAAAkKAAAAAAAAAAAAAAABsQAAAAcAAAAJCgAAAAAAAAAAAAAAB7IAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJtgAAAA0DB7QAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJtwAAAAm4AAAADQIBtgAAAA4AAAAGuQAAAM4PZnVuY3Rpb24gQ29ubmVjdC3Dvm5hbWXDvg0Kew0KPCMNCgkuU1lOT1BTSVMNCgkJQ29uZmlndXJlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgw75uYW1lw74gQXp1cmUgRnVuY3Rpb24uDQoJDQoJLkRFU0NSSVBUSU9ODQoJCUNvbmZpZ3VyZXMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIMO+bmFtZcO+IEF6dXJlIEZ1bmN0aW9uLg0KCQ0KCS5QQVJBTUVURVIgVXJpDQoJCVVybCB0byBjb25uZWN0IHRvIHRoZSDDvm5hbWXDviBBenVyZSBmdW5jdGlvbi4NCgkNCgkuUEFSQU1FVEVSIFVucHJvdGVjdGVkVG9rZW4NCgkJVGhlIHVuZW5jcnlwdGVkIGFjY2VzcyB0b2tlbiB0byB0aGUgw75uYW1lw74gQXp1cmUgZnVuY3Rpb24uIE9OTFkgdXNlIHRoaXMgZnJvbSBzZWN1cmUgbG9jYXRpb25zIG9yIG5vbi1zZW5zaXRpdmUgZnVuY3Rpb25zIQ0KCQ0KCS5QQVJBTUVURVIgUHJvdGVjdGVkVG9rZW4NCgkJQW4gZW5jcnlwdGVkIGFjY2VzcyB0b2tlbiB0byB0aGUgw75uYW1lw74gQXp1cmUgZnVuY3Rpb24uIFVzZSB0aGlzIHRvIHBlcnNpc3QgYW4gYWNjZXNzIHRva2VuIGluIGEgd2F5IG9ubHkgdGhlIGN1cnJlbnQgdXNlciBvbiB0aGUgY3VycmVudCBzeXN0ZW0gY2FuIGFjY2Vzcy4NCgkNCgkuUEFSQU1FVEVSIFJlZ2lzdGVyDQoJCVVzaW5nIHRoaXMgY29tbWFuZCwgdGhlIG1vZHVsZSB3aWxsIHJlbWVtYmVyIHRoZSBjb25uZWN0aW9uIHNldHRpbmdzIHBlcnNpc3RlbnRseSBhY3Jvc3MgUG93ZXJTaGVsbCBzZXNzaW9ucy4NCgkJQ0FVVElPTjogV2hlbiB1c2luZyB1bmVuY3J5cHRlZCB0b2tlbiBkYXRhIChzdWNoIGFzIHNwZWNpZmllZCB0aHJvdWdoIHRoZSAtVW5wcm90ZWN0ZWRUb2tlbiBwYXJhbWV0ZXIpLCB0aGUgYXV0aGVudGljYXRpbmcgdG9rZW4gd2lsbCBiZSBzdG9yZWQgaW4gY2xlYXItdGV4dCENCgkNCgkuRVhBTVBMRQ0KCQlQUyBDOlw+IENvbm5lY3Qtw75uYW1lw74gLVVyaSAnaHR0cHM6Ly9kZW1vZnVuY3Rpb25hcHAuYXp1cmV3ZWJzaXRlcy5uZXQvYXBpLycNCgkNCgkJRXN0YWJsaXNoZXMgYSBjb25uZWN0aW9uIHRvIMO+bmFtZcO+DQojPg0KCVtDbWRsZXRCaW5kaW5nKCldDQoJcGFyYW0gKA0KCQlbc3RyaW5nXQ0KCQkkVXJpLA0KCQkNCgkJW3N0cmluZ10NCgkJJFVucHJvdGVjdGVkVG9rZW4sDQoJCQ0KCQlbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5QU0NyZWRlbnRpYWxdDQoJCSRQcm90ZWN0ZWRUb2tlbiwNCgkJDQoJCVtzd2l0Y2hdDQoJCSRSZWdpc3Rlcg0KCSkNCgkNCglwcm9jZXNzDQoJew0KCQlpZiAoVGVzdC1QU0ZQYXJhbWV0ZXJCaW5kaW5nIC1QYXJhbWV0ZXJOYW1lIFVucHJvdGVjdGVkVG9rZW4pDQoJCXsNCgkJCVNldC1QU0ZDb25maWcgLU1vZHVsZSAnw75uYW1lw74nIC1OYW1lICdDbGllbnQuVW5wcm90ZWN0ZWRUb2tlbicgLVZhbHVlICRVbnByb3RlY3RlZFRva2VuDQoJCQlpZiAoJFJlZ2lzdGVyKSB7IFJlZ2lzdGVyLVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5VbnByb3RlY3RlZFRva2VuJyB9DQoJCX0NCgkJaWYgKFRlc3QtUFNGUGFyYW1ldGVyQmluZGluZyAtUGFyYW1ldGVyTmFtZSBVcmkpDQoJCXsNCgkJCVNldC1QU0ZDb25maWcgLU1vZHVsZSAnw75uYW1lw74nIC1OYW1lICdDbGllbnQuVXJpJyAtVmFsdWUgJFVyaQ0KCQkJaWYgKCRSZWdpc3RlcikgeyBSZWdpc3Rlci1QU0ZDb25maWcgLU1vZHVsZSAnw75uYW1lw74nIC1OYW1lICdDbGllbnQuVXJpJyB9DQoJCX0NCgkJaWYgKFRlc3QtUFNGUGFyYW1ldGVyQmluZGluZyAtUGFyYW1ldGVyTmFtZSBQcm90ZWN0ZWRUb2tlbikNCgkJew0KCQkJU2V0LVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5Qcm90ZWN0ZWRUb2tlbicgLVZhbHVlICRQcm90ZWN0ZWRUb2tlbg0KCQkJaWYgKCRSZWdpc3RlcikgeyBSZWdpc3Rlci1QU0ZDb25maWcgLU1vZHVsZSAnw75uYW1lw74nIC1OYW1lICdDbGllbnQuUHJvdGVjdGVkVG9rZW4nIH0NCgkJfQ0KCQkNCgl9DQp9AQm6AAAACbsAAAAGvAAAABRDb25uZWN0LcO+bmFtZcO+LnBzMQa9AAAAP2F6RnVuY3Rpb25SZXNvdXJjZXNcY2xpZW50TW9kdWxlXGZ1bmN0aW9uc1xDb25uZWN0LcO+bmFtZcO+LnBzMQkGAAAACb8AAAAJwAAAAAG3AAAAAQAAAAnBAAAABsIAAAAOY29uZmlndXJhdGlvbnMGwwAAADhhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxpbnRlcm5hbFxjb25maWd1cmF0aW9ucwkGAAAACcUAAAAJxgAAAAG4AAAAAQAAAAnHAAAABsgAAAAJZnVuY3Rpb25zBskAAAAzYXpGdW5jdGlvblJlc291cmNlc1xjbGllbnRNb2R1bGVcaW50ZXJuYWxcZnVuY3Rpb25zCQYAAAAJywAAAAnMAAAAAboAAAAHAAAACc0AAAABAAAAAQAAAAG7AAAABwAAAAkKAAAAAAAAAAAAAAABvwAAAAcAAAAJzwAAAAEAAAABAAAAAcAAAAAHAAAACQoAAAAAAAAAAAAAAAHBAAAAAwAAAAnRAAAAAQAAAAEAAAABxQAAAAcAAAAJCgAAAAAAAAAAAAAAAcYAAAAHAAAACQoAAAAAAAAAAAAAAAHHAAAAAwAAAAnTAAAAAQAAAAEAAAABywAAAAcAAAAJCgAAAAAAAAAAAAAAAcwAAAAHAAAACQoAAAAAAAAAAAAAABHNAAAABAAAAAbVAAAABG5hbWUNAxHPAAAABAAAAAbWAAAABG5hbWUNAwfRAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACdcAAAANAwfTAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACdgAAAANAwHXAAAADgAAAAbZAAAAtwVTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgJ8O+bmFtZcO+JyAtTmFtZSAnQ2xpZW50LlVyaScgLVZhbHVlICRudWxsIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICdzdHJpbmcnIC1EZXNjcmlwdGlvbiAiVXJsIHRvIGNvbm5lY3QgdG8gdGhlIMO+bmFtZcO+IEF6dXJlIGZ1bmN0aW9uIg0KU2V0LVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5VbnByb3RlY3RlZFRva2VuJyAtVmFsdWUgJycgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gJ3N0cmluZycgLURlc2NyaXB0aW9uICJUaGUgdW5lbmNyeXB0ZWQgYWNjZXNzIHRva2VuIHRvIHRoZSDDvm5hbWXDviBBenVyZSBmdW5jdGlvbi4gT05MWSB1c2UgdGhpcyBmcm9tIHNlY3VyZSBsb2NhdGlvbnMgb3Igbm9uLXNlbnNpdGl2ZSBmdW5jdGlvbnMhIg0KU2V0LVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5Qcm90ZWN0ZWRUb2tlbicgLVZhbHVlICRudWxsIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICdjcmVkZW50aWFsJyAtRGVzY3JpcHRpb24gIkFuIGVuY3J5cHRlZCBhY2Nlc3MgdG9rZW4gdG8gdGhlIMO+bmFtZcO+IEF6dXJlIGZ1bmN0aW9uLiBVc2UgdGhpcyB0byBwZXJzaXN0IGFuIGFjY2VzcyB0b2tlbiBpbiBhIHdheSBvbmx5IHRoZSBjdXJyZW50IHVzZXIgb24gdGhlIGN1cnJlbnQgc3lzdGVtIGNhbiBhY2Nlc3MuIgEJ2gAAAAnbAAAABtwAAAAOY29ubmVjdGlvbi5wczEG3QAAAEdhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxpbnRlcm5hbFxjb25maWd1cmF0aW9uc1xjb25uZWN0aW9uLnBzMQkGAAAACd8AAAAJ4AAAAAHYAAAADgAAAAbhAAAAiQ5mdW5jdGlvbiBHZXQtSW50ZXJuYWxDb25uZWN0aW9uRGF0YQ0Kew0KPCMNCgkuU1lOT1BTSVMNCgkJQ3JlYXRlcyBwYXJhbWV0ZXIgaGFzaHRhYmxlcyBmb3IgSW52b2tlLVJlc3RNZXRob2QgY2FsbHMuDQoJDQoJLkRFU0NSSVBUSU9ODQoJCUNyZWF0ZXMgcGFyYW1ldGVyIGhhc2h0YWJsZXMgZm9yIEludm9rZS1SZXN0TWV0aG9kIGNhbGxzLg0KCQlUaGlzIGlzIHRoZSBtYWluIGFic3RyYWN0aW9uIGxheWVyIGZvciBwdWJsaWMgZnVuY3Rpb25zLg0KCQ0KCS5QQVJBTUVURVIgTWV0aG9kDQoJCVRoZSBSZXN0IE1ldGhvZCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uDQoJDQoJLlBBUkFNRVRFUiBQYXJhbWV0ZXJzDQoJCVRoZSBQU0JvdW5kUGFyYW1ldGVycyBvYmplY3QuIFdpbGwgYmUgcGFzc2VkIG9ubGluZSB1c2luZyBQb3dlclNoZWxsIFNlcmlhbGl6YXRpb24uDQoJDQoJLlBBUkFNRVRFUiBGdW5jdGlvbk5hbWUNCgkJVGhlIG5hbWUgb2YgdGhlIEF6dXJlIEZ1bmN0aW9uIHRvIGNhbGwuDQoJCVRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY29uZGVuc2VkIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLg0KIz4NCglbQ21kbGV0QmluZGluZygpXQ0KCXBhcmFtICgNCgkJW3N0cmluZ10NCgkJJE1ldGhvZCwNCgkJDQoJCSRQYXJhbWV0ZXJzLA0KCQkNCgkJW3N0cmluZ10NCgkJJEZ1bmN0aW9uTmFtZQ0KCSkNCgkNCglwcm9jZXNzDQoJew0KCQl0cnkgeyAkdXJpID0gJ3swfXsxfScgLWYgKEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgJ8O+bmFtZcO+LkNsaWVudC5VcmknIC1Ob3ROdWxsKSwgJEZ1bmN0aW9uTmFtZSB9DQoJCWNhdGNoIHsgJFBTQ21kbGV0LlRocm93VGVybWluYXRpbmdFcnJvcigkXykgfQ0KCQkkaGVhZGVyID0gQHsgfQ0KCQkNCgkJI3JlZ2lvbiBBdXRoZW50aWNhdGlvbg0KCQkkdW5wcm90ZWN0ZWRUb2tlbiA9IEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgJ8O+bmFtZcO+LkNsaWVudC5VbnByb3RlY3RlZFRva2VuJw0KCQkkcHJvdGVjdGVkVG9rZW4gPSBHZXQtUFNGQ29uZmlnVmFsdWUgLUZ1bGxOYW1lICfDvm5hbWXDvi5DbGllbnQuUHJvdGVjdGVkVG9rZW4nDQoJCQ0KCQkkYXV0aGVudGljYXRpb25Eb25lID0gJGZhbHNlDQoJCWlmICgkcHJvdGVjdGVkVG9rZW4gLWFuZCAtbm90ICRhdXRoZW50aWNhdGlvbkRvbmUpDQoJCXsNCgkJCSR1cmkgKz0gJz9jb2RlPXswfScgLWYgJHByb3RlY3RlZFRva2VuLkdldE5ldHdvcmtDcmVkZW50aWFsKCkuUGFzc3dvcmQNCgkJCSRhdXRoZW50aWNhdGlvbkRvbmUgPSAkdHJ1ZQ0KCQl9DQoJCWlmICgkdW5wcm90ZWN0ZWRUb2tlbiAtYW5kIC1ub3QgJGF1dGhlbnRpY2F0aW9uRG9uZSkNCgkJew0KCQkJJHVyaSArPSAnP2NvZGU9ezB9JyAtZiAkdW5wcm90ZWN0ZWRUb2tlbg0KCQkJJGF1dGhlbnRpY2F0aW9uRG9uZSA9ICR0cnVlDQoJCX0NCgkJaWYgKC1ub3QgJGF1dGhlbnRpY2F0aW9uRG9uZSkNCgkJew0KCQkJdGhyb3cgIk5vIEF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyZWQhIg0KCQl9DQoJCSNlbmRyZWdpb24gQXV0aGVudGljYXRpb24NCgkJDQoJCQ0KCQlAew0KCQkJTWV0aG9kICA9ICRNZXRob2QNCgkJCVVyaQkgICAgPSAkdXJpDQoJCQlIZWFkZXJzID0gJGhlYWRlcg0KCQkJQm9keSAgICA9IChAew0KCQkJCV9fU2VyaWFsaXplZFBhcmFtZXRlcnMgPSAoJFBhcmFtZXRlcnMgfCBDb252ZXJ0VG8tUFNGSGFzaHRhYmxlIHwgQ29udmVydFRvLVBTRkNsaXhtbCkNCgkJCQlfX1BTU2VyaWFsaXplCQkgICA9ICR0cnVlDQoJCQl9IHwgQ29udmVydFRvLUpzb24pDQoJCX0NCgl9DQp9AQniAAAACeMAAAAG5AAAAB5HZXQtSW50ZXJuYWxDb25uZWN0aW9uRGF0YS5wczEG5QAAAFJhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxpbnRlcm5hbFxmdW5jdGlvbnNcR2V0LUludGVybmFsQ29ubmVjdGlvbkRhdGEucHMxCQYAAAAJ5wAAAAnoAAAAAdoAAAAHAAAACekAAAABAAAAAQAAAAHbAAAABwAAAAkKAAAAAAAAAAAAAAAB3wAAAAcAAAAJCgAAAAAAAAAAAAAAAeAAAAAHAAAACQoAAAAAAAAAAAAAAAHiAAAABwAAAAnrAAAAAQAAAAEAAAAB4wAAAAcAAAAJCgAAAAAAAAAAAAAAAecAAAAHAAAACQoAAAAAAAAAAAAAAAHoAAAABwAAAAkKAAAAAAAAAAAAAAAR6QAAAAQAAAAG7QAAAARuYW1lDQMR6wAAAAQAAAAG7gAAAARuYW1lDQML</BA> </MS> </Obj> <Obj RefId="25"> <TNRef RefId="7" /> <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString> <Props> <Obj N="Children" RefId="26"> <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> </LST> </Obj> <S N="Name">build</S> <S N="RelativePath">build</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="27"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="28"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAABWJ1aWxkBgUAAAAFYnVpbGQGBgAAAALDvgkHAAAACQgAAAAEAwAAAJ4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAAC9QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2VbXQIAAAAICAkJAAAABgAAAAYAAAAEBwAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkKAAAAAAAAAAAAAAABCAAAAAcAAAAJCgAAAAAAAAAAAAAABwkAAAAAAQAAAAgAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJCwAAAAkMAAAACQ0AAAAJDgAAAAkPAAAACRAAAAANAhEKAAAAAAAAAAULAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYRAAAAqAcjIFNldHRpbmcgdXAgdGhlIHJlbGVhc2UgcGlwZWxpbmU6DQoNCiMjIFByZWxpbWluYXJ5DQoNClNldHRpbmcgdXAgYSByZWxlYXNlIHBpcGVsaW5lLCBzZXQgdGhlIHRyaWdnZXIgdG8gZG8gY29udGludW91cyBpbnRlZ3JhdGlvbiBhZ2FpbnN0IHRoZSBtYXN0ZXIgYnJhbmNoIG9ubHkuDQpJbiBTdGFnZSAxIHNldCB1cCBhIHRhc2tzZXF1ZW5jZToNCg0KIyMgMSkgUG93ZXJTaGVsbCBUYXNrOiBQcmVyZXF1aXNpdGVzDQoNCkhhdmUgaXQgZXhlY3V0ZSBgdnN0cy1wcmVyZXF1aXNpdGVzLnBzMWANCg0KIyMgMikgUG93ZXJTaGVsbCBUYXNrOiBWYWxpZGF0ZQ0KDQpIYXZlIGl0IGV4ZWN1dGUgYHZzdHMtcHJlcmVxdWlzaXRlcy5wczFgDQoNCiMjIDMpIFBvd2VyU2hlbGwgVGFzazogQnVpbGQNCg0KSGF2ZSBpdCBleGVjdXRlIGB2c3RzLWJ1aWxkLnBzMWAuDQpUaGUgdGFzayByZXF1aXJlcyB0d28gcGFyYW1ldGVyczoNCg0KIC0gYC1Mb2NhbFJlcG9gDQogLSBgLVdvcmtpbmdEaXJlY3RvcnkgJChTeXN0ZW0uRGVmYXVsdFdvcmtpbmdEaXJlY3RvcnkpL1/vv71uYW1l77+9YA0KDQojIyA0KSBQdWJsaXNoIFRlc3QgUmVzdWx0cw0KDQpDb25maWd1cmUgdGFzayB0byBwaWNrIHVwIG51bml0IHR5cGUgb2YgdGVzdHMgKHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IGp1bml0KS4NCkNvbmZpZ3VyZSB0YXNrIHRvIGV4ZWN1dGUsIGV2ZW4gaWYgcHJldmlvdXMgc3RlcHMgZmFpbGVkIG9yIHRoZSB0YXNrIHNlcXVlbmNlIHdhcyBjYW5jZWxsZWQuDQoNCiMjIDUpIFBvd2VyU2hlbGwgVGFzazogUGFja2FnZSBGdW5jdGlvbg0KDQpIYXZlIGl0IGV4ZWN1dGUgYHZzdHMtcGFja2FnZUZ1bmN0aW9uLnBzMWANCg0KIyMgNikgQXp1cmUgRnVuY3Rpb24gQXBwRGVwbG95DQoNCkNvbmZpZ3VyZSB0byBwdWJsaXNoIHRvIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIGFwcC4BCRIAAAAJEwAAAAYUAAAAF0F6dXJlRnVuY3Rpb24ucmVhZG1lLm1kBhUAAAAdYnVpbGRcQXp1cmVGdW5jdGlvbi5yZWFkbWUubWQJBgAAAAkXAAAACRgAAAABDAAAAAsAAAAGGQAAAO4iPCMNClRoaXMgc2NyaXB0IHB1Ymxpc2hlcyB0aGUgbW9kdWxlIHRvIHRoZSBnYWxsZXJ5Lg0KSXQgZXhwZWN0cyBhcyBpbnB1dCBhbiBBcGlLZXkgYXV0aG9yaXplZCB0byBwdWJsaXNoIHRoZSBtb2R1bGUuDQoNCkluc2VydCBhbnkgYnVpbGQgc3RlcHMgeW91IG1heSBuZWVkIHRvIHRha2UgYmVmb3JlIHB1Ymxpc2hpbmcgaXQgaGVyZS4NCiM+DQpwYXJhbSAoDQoJJEFwaUtleSwNCgkNCgkkV29ya2luZ0RpcmVjdG9yeSwNCgkNCgkkUmVwb3NpdG9yeSA9ICdQU0dhbGxlcnknLA0KCQ0KCVtzd2l0Y2hdDQoJJExvY2FsUmVwbywNCgkNCglbc3dpdGNoXQ0KCSRTa2lwUHVibGlzaCwNCgkNCglbc3dpdGNoXQ0KCSRBdXRvVmVyc2lvbg0KKQ0KDQojcmVnaW9uIEhhbmRsZSBXb3JraW5nIERpcmVjdG9yeSBEZWZhdWx0cw0KaWYgKC1ub3QgJFdvcmtpbmdEaXJlY3RvcnkpDQp7DQoJaWYgKCRlbnY6UkVMRUFTRV9QUklNQVJZQVJUSUZBQ1RTT1VSQ0VBTElBUykNCgl7DQoJCSRXb3JraW5nRGlyZWN0b3J5ID0gSm9pbi1QYXRoIC1QYXRoICRlbnY6U1lTVEVNX0RFRkFVTFRXT1JLSU5HRElSRUNUT1JZIC1DaGlsZFBhdGggJGVudjpSRUxFQVNFX1BSSU1BUllBUlRJRkFDVFNPVVJDRUFMSUFTDQoJfQ0KCWVsc2UgeyAkV29ya2luZ0RpcmVjdG9yeSA9ICRlbnY6U1lTVEVNX0RFRkFVTFRXT1JLSU5HRElSRUNUT1JZIH0NCn0NCmlmICgtbm90ICRXb3JraW5nRGlyZWN0b3J5KSB7ICRXb3JraW5nRGlyZWN0b3J5ID0gU3BsaXQtUGF0aCAkUFNTY3JpcHRSb290IH0NCiNlbmRyZWdpb24gSGFuZGxlIFdvcmtpbmcgRGlyZWN0b3J5IERlZmF1bHRzDQoNCiMgUHJlcGFyZSBwdWJsaXNoIGZvbGRlcg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJDcmVhdGluZyBhbmQgcG9wdWxhdGluZyBwdWJsaXNoaW5nIGRpcmVjdG9yeSINCiRwdWJsaXNoRGlyID0gTmV3LUl0ZW0gLVBhdGggJFdvcmtpbmdEaXJlY3RvcnkgLU5hbWUgcHVibGlzaCAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Gb3JjZQ0KQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVzDvm5hbWXDviIgLURlc3RpbmF0aW9uICRwdWJsaXNoRGlyLkZ1bGxOYW1lIC1SZWN1cnNlIC1Gb3JjZQ0KDQojcmVnaW9uIEdhdGhlciB0ZXh0IGRhdGEgdG8gY29tcGlsZQ0KJHRleHQgPSBAKCkNCiRwcm9jZXNzZWQgPSBAKCkNCg0KIyBHYXRoZXIgU3R1ZmYgdG8gcnVuIGJlZm9yZQ0KZm9yZWFjaCAoJGZpbGVQYXRoIGluICgmICIkKCRQU1NjcmlwdFJvb3QpXC4uXMO+bmFtZcO+XGludGVybmFsXHNjcmlwdHNccHJlaW1wb3J0LnBzMSIpKQ0Kew0KCWlmIChbc3RyaW5nXTo6SXNOdWxsT3JXaGl0ZVNwYWNlKCRmaWxlUGF0aCkpIHsgY29udGludWUgfQ0KCQ0KCSRpdGVtID0gR2V0LUl0ZW0gJGZpbGVQYXRoDQoJaWYgKCRpdGVtLlBTSXNDb250YWluZXIpIHsgY29udGludWUgfQ0KCWlmICgkaXRlbS5GdWxsTmFtZSAtaW4gJHByb2Nlc3NlZCkgeyBjb250aW51ZSB9DQoJJHRleHQgKz0gW1N5c3RlbS5JTy5GaWxlXTo6UmVhZEFsbFRleHQoJGl0ZW0uRnVsbE5hbWUpDQoJJHByb2Nlc3NlZCArPSAkaXRlbS5GdWxsTmFtZQ0KfQ0KDQojIEdhdGhlciBjb21tYW5kcw0KR2V0LUNoaWxkSXRlbSAtUGF0aCAiJCgkcHVibGlzaERpci5GdWxsTmFtZSlcw75uYW1lw75caW50ZXJuYWxcZnVuY3Rpb25zXCIgLVJlY3Vyc2UgLUZpbGUgLUZpbHRlciAiKi5wczEiIHwgRm9yRWFjaC1PYmplY3Qgew0KCSR0ZXh0ICs9IFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCRfLkZ1bGxOYW1lKQ0KfQ0KR2V0LUNoaWxkSXRlbSAtUGF0aCAiJCgkcHVibGlzaERpci5GdWxsTmFtZSlcw75uYW1lw75cZnVuY3Rpb25zXCIgLVJlY3Vyc2UgLUZpbGUgLUZpbHRlciAiKi5wczEiIHwgRm9yRWFjaC1PYmplY3Qgew0KCSR0ZXh0ICs9IFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCRfLkZ1bGxOYW1lKQ0KfQ0KDQojIEdhdGhlciBzdHVmZiB0byBydW4gYWZ0ZXJ3YXJkcw0KZm9yZWFjaCAoJGZpbGVQYXRoIGluICgmICIkKCRQU1NjcmlwdFJvb3QpXC4uXMO+bmFtZcO+XGludGVybmFsXHNjcmlwdHNccG9zdGltcG9ydC5wczEiKSkNCnsNCglpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkZmlsZVBhdGgpKSB7IGNvbnRpbnVlIH0NCgkNCgkkaXRlbSA9IEdldC1JdGVtICRmaWxlUGF0aA0KCWlmICgkaXRlbS5QU0lzQ29udGFpbmVyKSB7IGNvbnRpbnVlIH0NCglpZiAoJGl0ZW0uRnVsbE5hbWUgLWluICRwcm9jZXNzZWQpIHsgY29udGludWUgfQ0KCSR0ZXh0ICs9IFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCRpdGVtLkZ1bGxOYW1lKQ0KCSRwcm9jZXNzZWQgKz0gJGl0ZW0uRnVsbE5hbWUNCn0NCiNlbmRyZWdpb24gR2F0aGVyIHRleHQgZGF0YSB0byBjb21waWxlDQoNCiNyZWdpb24gVXBkYXRlIHRoZSBwc20xIGZpbGUNCiRmaWxlRGF0YSA9IEdldC1Db250ZW50IC1QYXRoICIkKCRwdWJsaXNoRGlyLkZ1bGxOYW1lKVzDvm5hbWXDvlzDvm5hbWXDvi5wc20xIiAtUmF3DQokZmlsZURhdGEgPSAkZmlsZURhdGEuUmVwbGFjZSgnIjx3YXMgbm90IGNvbXBpbGVkPiInLCAnIjx3YXMgY29tcGlsZWQ+IicpDQokZmlsZURhdGEgPSAkZmlsZURhdGEuUmVwbGFjZSgnIjxjb21waWxlIGNvZGUgaW50byBoZXJlPiInLCAoJHRleHQgLWpvaW4gImBuYG4iKSkNCltTeXN0ZW0uSU8uRmlsZV06OldyaXRlQWxsVGV4dCgiJCgkcHVibGlzaERpci5GdWxsTmFtZSlcw75uYW1lw75cw75uYW1lw74ucHNtMSIsICRmaWxlRGF0YSwgW1N5c3RlbS5UZXh0LkVuY29kaW5nXTo6VVRGOCkNCiNlbmRyZWdpb24gVXBkYXRlIHRoZSBwc20xIGZpbGUNCg0KI3JlZ2lvbiBVcGRhdGluZyB0aGUgTW9kdWxlIFZlcnNpb24NCmlmICgkQXV0b1ZlcnNpb24pDQp7DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJVcGRhdGluZyBtb2R1bGUgdmVyc2lvbiBudW1iZXJzLiINCgl0cnkgeyBbdmVyc2lvbl0kcmVtb3RlVmVyc2lvbiA9IChGaW5kLU1vZHVsZSAnw75uYW1lw74nIC1SZXBvc2l0b3J5ICRSZXBvc2l0b3J5IC1FcnJvckFjdGlvbiBTdG9wKS5WZXJzaW9uIH0NCgljYXRjaA0KCXsNCgkJU3RvcC1QU0ZGdW5jdGlvbiAtTWVzc2FnZSAiRmFpbGVkIHRvIGFjY2VzcyAkKCRSZXBvc2l0b3J5KSIgLUVuYWJsZUV4Y2VwdGlvbiAkdHJ1ZSAtRXJyb3JSZWNvcmQgJF8NCgl9DQoJaWYgKC1ub3QgJHJlbW90ZVZlcnNpb24pDQoJew0KCQlTdG9wLVBTRkZ1bmN0aW9uIC1NZXNzYWdlICJDb3VsZG4ndCBmaW5kIMO+bmFtZcO+IG9uIHJlcG9zaXRvcnkgJCgkUmVwb3NpdG9yeSkiIC1FbmFibGVFeGNlcHRpb24gJHRydWUNCgl9DQoJJG5ld0J1aWxkTnVtYmVyID0gJHJlbW90ZVZlcnNpb24uQnVpbGQgKyAxDQoJW3ZlcnNpb25dJGxvY2FsVmVyc2lvbiA9IChJbXBvcnQtUG93ZXJTaGVsbERhdGFGaWxlIC1QYXRoICIkKCRwdWJsaXNoRGlyLkZ1bGxOYW1lKVzDvm5hbWXDvlzDvm5hbWXDvi5wc2QxIikuTW9kdWxlVmVyc2lvbg0KCVVwZGF0ZS1Nb2R1bGVNYW5pZmVzdCAtUGF0aCAiJCgkcHVibGlzaERpci5GdWxsTmFtZSlcw75uYW1lw75cw75uYW1lw74ucHNkMSIgLU1vZHVsZVZlcnNpb24gIiQoJGxvY2FsVmVyc2lvbi5NYWpvcikuJCgkbG9jYWxWZXJzaW9uLk1pbm9yKS4kKCRuZXdCdWlsZE51bWJlcikiDQp9DQojZW5kcmVnaW9uIFVwZGF0aW5nIHRoZSBNb2R1bGUgVmVyc2lvbg0KDQojcmVnaW9uIFB1Ymxpc2gNCmlmICgkU2tpcFB1Ymxpc2gpIHsgcmV0dXJuIH0NCmlmICgkTG9jYWxSZXBvKQ0Kew0KCSMgRGVwZW5kZW5jaWVzIG11c3QgZ28gZmlyc3QNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIkNyZWF0aW5nIE51Z2V0IFBhY2thZ2UgZm9yIG1vZHVsZTogUFNGcmFtZXdvcmsiDQoJTmV3LVBTTURNb2R1bGVOdWdldFBhY2thZ2UgLU1vZHVsZVBhdGggKEdldC1Nb2R1bGUgLU5hbWUgUFNGcmFtZXdvcmspLk1vZHVsZUJhc2UgLVBhY2thZ2VQYXRoIC4NCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIkNyZWF0aW5nIE51Z2V0IFBhY2thZ2UgZm9yIG1vZHVsZTogw75uYW1lw74iDQoJTmV3LVBTTURNb2R1bGVOdWdldFBhY2thZ2UgLU1vZHVsZVBhdGggIiQoJHB1Ymxpc2hEaXIuRnVsbE5hbWUpXMO+bmFtZcO+IiAtUGFja2FnZVBhdGggLg0KfQ0KZWxzZQ0Kew0KCSMgUHVibGlzaCB0byBHYWxsZXJ5DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJQdWJsaXNoaW5nIHRoZSDDvm5hbWXDviBtb2R1bGUgdG8gJCgkUmVwb3NpdG9yeSkiDQoJUHVibGlzaC1Nb2R1bGUgLVBhdGggIiQoJHB1Ymxpc2hEaXIuRnVsbE5hbWUpXMO+bmFtZcO+IiAtTnVHZXRBcGlLZXkgJEFwaUtleSAtRm9yY2UgLVJlcG9zaXRvcnkgJFJlcG9zaXRvcnkNCn0NCiNlbmRyZWdpb24gUHVibGlzaAEJGgAAAAkbAAAABhwAAAAOdnN0cy1idWlsZC5wczEGHQAAABRidWlsZFx2c3RzLWJ1aWxkLnBzMQkGAAAACR8AAAAJIAAAAAENAAAACwAAAAYhAAAAvEENCjwjDQoJLlNZTk9QU0lTDQoJCUJ1aWxkIHNjcmlwdCB0aGF0IGdlbmVyYXRlcyBhIGNsaWVudCBtb2R1bGUgZm9yIFJFU1QgQVBJIGVuZHBvaW50cyBvZiBhIEF6dXJlIFBvd2VyU2hlbGwgRnVuY3Rpb25zIHByb2plY3QuDQoJDQoJLkRFU0NSSVBUSU9ODQoJCUJ1aWxkIHNjcmlwdCB0aGF0IGdlbmVyYXRlcyBhIGNsaWVudCBtb2R1bGUgZm9yIFJFU1QgQVBJIGVuZHBvaW50cyBvZiBhIEF6dXJlIFBvd2VyU2hlbGwgRnVuY3Rpb25zIHByb2plY3QuDQoJDQoJLlBBUkFNRVRFUiBBcGlLZXkNCgkJVGhlIEFQSSBrZXkgdG8gdXNlIHRvIHB1Ymxpc2ggdGhlIG1vZHVsZSB0byBhIE51Z2V0IFJlcG9zaXRvcnkNCgkNCgkuUEFSQU1FVEVSIFdvcmtpbmdEaXJlY3RvcnkNCgkJVGhlIHJvb3QgZm9sZGVyIGZyb20gd2hpY2ggdG8gYnVpbGQgdGhlIG1vZHVsZS4NCgkNCgkuUEFSQU1FVEVSIFJlcG9zaXRvcnkNCgkJVGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnkgdG8gcHVibGlzaCB0by4NCgkJRGVmYXVsdHMgdG8gUFNHYWxsZXJ5Lg0KCQ0KCS5QQVJBTUVURVIgTG9jYWxSZXBvDQoJCUluc3RlYWQgb2YgcHVibGlzaGluZyB0byBhIGdhbGxlcnksIGRyb3AgYSBudWdldCBwYWNrYWdlIGluIHRoZSByb290IGZvbGRlci4NCgkJVGhpcyBwYWNrYWdlIGNhbiB0aGVuIGJlIHBpY2tlZCB1cCBpbiBhIGxhdGVyIHN0ZXAgZm9yIHB1Ymxpc2hpbmcgdG8gQXp1cmUgQXJ0aWZhY3RzLg0KDQoJLlBBUkFNRVRFUiBNb2R1bGVOYW1lDQoJCVRoZSBuYW1lIHRvIGdpdmUgdG8gdGhlIGNsaWVudCBtb2R1bGUuDQoJCUJ5IGRlZmF1bHQsIHRoZSBjbGllbnQgbW9kdWxlIHdpbGwgYmUgbmFtZWQgJzxNb2R1bGVOYW1lPi5DbGllbnQnLg0KCQ0KCS5QQVJBTUVURVIgSW5jbHVkZUZvcm1hdA0KCQlJbmNsdWRlIHRoZSBmb3JtYXQgeG1sIG9mIHRoZSBzb3VyY2UgbW9kdWxlIGZvciB0aGUgY2xpZW50IG1vZHVsZS4NCgkNCgkuUEFSQU1FVEVSIEluY2x1ZGVUeXBlDQoJCUluY2x1ZGUgdGhlIHR5cGUgZXh0ZW5zaW9uIHhtbCBvZiB0aGUgc291cmNlIG1vZHVsZSBmb3IgdGhlIGNsaWVudCBtb2R1bGUuDQoJDQoJLlBBUkFNRVRFUiBJbmNsdWRlQXNzZW1ibHkNCgkJSW5jbHVkZSB0aGUgYmluYXJpZXMgb2YgdGhlIHNvdXJjZSBtb2R1bGUgZm9yIHRoZSBjbGllbnQgbW9kdWxlLg0KIz4NCnBhcmFtICgNCgkkQXBpS2V5LA0KCQ0KCSRXb3JraW5nRGlyZWN0b3J5LA0KCQ0KCSRSZXBvc2l0b3J5ID0gJ1BTR2FsbGVyeScsDQoJDQoJW3N3aXRjaF0NCgkkTG9jYWxSZXBvLA0KCQ0KCSRNb2R1bGVOYW1lLA0KCQ0KCVtzd2l0Y2hdDQoJJEluY2x1ZGVGb3JtYXQsDQoJDQoJW3N3aXRjaF0NCgkkSW5jbHVkZVR5cGUsDQoJDQoJW3N3aXRjaF0NCgkkSW5jbHVkZUFzc2VtYmx5DQopDQoNCiNyZWdpb24gSGFuZGxlIFdvcmtpbmcgRGlyZWN0b3J5IERlZmF1bHRzDQppZiAoLW5vdCAkV29ya2luZ0RpcmVjdG9yeSkNCnsNCglpZiAoJGVudjpSRUxFQVNFX1BSSU1BUllBUlRJRkFDVFNPVVJDRUFMSUFTKQ0KCXsNCgkJJFdvcmtpbmdEaXJlY3RvcnkgPSBKb2luLVBhdGggLVBhdGggJGVudjpTWVNURU1fREVGQVVMVFdPUktJTkdESVJFQ1RPUlkgLUNoaWxkUGF0aCAkZW52OlJFTEVBU0VfUFJJTUFSWUFSVElGQUNUU09VUkNFQUxJQVMNCgl9DQoJZWxzZSB7ICRXb3JraW5nRGlyZWN0b3J5ID0gJGVudjpTWVNURU1fREVGQVVMVFdPUktJTkdESVJFQ1RPUlkgfQ0KfQ0KI2VuZHJlZ2lvbiBIYW5kbGUgV29ya2luZyBEaXJlY3RvcnkgRGVmYXVsdHMNCg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAnU3RhcnRpbmcgQnVpbGQ6IENsaWVudCBNb2R1bGUnDQokcGFyZW50TW9kdWxlID0gJ8O+bmFtZcO+Jw0KaWYgKC1ub3QgJE1vZHVsZU5hbWUpIHsgJE1vZHVsZU5hbWUgPSAnw75uYW1lw74uQ2xpZW50JyB9DQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICdDcmVhdGluZyBGb2xkZXIgU3RydWN0dXJlJw0KJHdvcmtpbmdSb290ID0gTmV3LUl0ZW0gLVBhdGggJFdvcmtpbmdEaXJlY3RvcnkgLU5hbWUgJE1vZHVsZU5hbWUgLUl0ZW1UeXBlIERpcmVjdG9yeQ0KJHB1Ymxpc2hSb290ID0gSm9pbi1QYXRoIC1QYXRoICRXb3JraW5nRGlyZWN0b3J5IC1DaGlsZFBhdGggJ3B1Ymxpc2hcw75uYW1lw74nDQpDb3B5LUl0ZW0gLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcY2xpZW50TW9kdWxlXGZ1bmN0aW9ucyIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5nUm9vdC5GdWxsTmFtZSlcIiAtUmVjdXJzZQ0KQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxpbnRlcm5hbCIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5nUm9vdC5GdWxsTmFtZSlcIiAtUmVjdXJzZQ0KQ29weS1JdGVtIC1QYXRoICIkKCRwdWJsaXNoUm9vdClcZW4tdXMiIC1EZXN0aW5hdGlvbiAiJCgkd29ya2luZ1Jvb3QuRnVsbE5hbWUpXCIgLVJlY3Vyc2UNCiRmdW5jdGlvbkZvbGRlciA9IEdldC1JdGVtIC1QYXRoICIkKCR3b3JraW5nUm9vdC5GdWxsTmFtZSlcZnVuY3Rpb25zIg0KDQojcmVnaW9uIENyZWF0ZSBGdW5jdGlvbnMNCiRlbmNvZGluZyA9IFtQU0ZFbmNvZGluZ10ndXRmOCcNCiRmdW5jdGlvbnNUZXh0ID0gR2V0LUNvbnRlbnQgLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcY2xpZW50TW9kdWxlXGZ1bmN0aW9uLnBzMSIgLVJhdw0KDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICdDcmVhdGluZyBGdW5jdGlvbnMnDQpmb3JlYWNoICgkZnVuY3Rpb25Tb3VyY2VGaWxlIGluIChHZXQtQ2hpbGRJdGVtIC1QYXRoICIkKCRwdWJsaXNoUm9vdClcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsdGVyICcqLnBzMScpKQ0Kew0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIiAgUHJvY2Vzc2luZyBmdW5jdGlvbjogJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lKSINCgkkY29uZGVuc2VkTmFtZSA9ICRmdW5jdGlvblNvdXJjZUZpbGUuQmFzZU5hbWUgLXJlcGxhY2UgJy0nLCAnJw0KCQ0KCSNyZWdpb24gTG9hZCBPdmVycmlkZXMNCgkkb3ZlcnJpZGUgPSBAeyB9DQoJaWYgKFRlc3QtUGF0aCAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZSkucHNkMSIpDQoJew0KCQkkb3ZlcnJpZGUgPSBJbXBvcnQtUG93ZXJTaGVsbERhdGFGaWxlIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lKS5wc2QxIg0KCX0NCglpZiAoVGVzdC1QYXRoIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkY29uZGVuc2VkTmFtZSkucHNkMSIpDQoJew0KCQkkb3ZlcnJpZGUgPSBJbXBvcnQtUG93ZXJTaGVsbERhdGFGaWxlIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkY29uZGVuc2VkTmFtZSkucHNkMSINCgl9DQoJaWYgKCRvdmVycmlkZS5Ob0NsaWVudEZ1bmN0aW9uKQ0KCXsNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAiICAgIE92ZXJyaWRlICdOb0NsaWVudEZ1bmN0aW9uJyBkZXRlY3RlZCwgc2tpcHBpbmchIg0KCQljb250aW51ZQ0KCX0NCgkNCgkjIElmIHRoZXJlIGlzIGFuIGRlZmluaXRpb24gb3ZlcnJpZGUsIHVzZSBpdCBhbmQgY29udGludWUNCglpZiAoVGVzdC1QYXRoIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lKS5wczEiKQ0KCXsNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAiICAgIE92ZXJyaWRlIGZ1bmN0aW9uIGRlZmluaXRpb24gZGV0ZWN0ZWQsIHVzaW5nIG92ZXJyaWRlIg0KCQlDb3B5LUl0ZW0gLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVwkKCRmdW5jdGlvblNvdXJjZUZpbGUuQmFzZU5hbWUpLnBzMSIgLURlc3RpbmF0aW9uICRmdW5jdGlvbkZvbGRlci5GdWxsTmFtZQ0KCQljb250aW51ZQ0KCX0NCgkNCgkjIEZpZ3VyZSBvdXQgdGhlIFJlc3QgTWV0aG9kIHRvIHVzZQ0KCSRtZXRob2ROYW1lID0gJ1Bvc3QnDQoJaWYgKCRvdmVycmlkZS5SZXN0TWV0aG9kcykNCgl7DQoJCSRtZXRob2ROYW1lID0gJG92ZXJyaWRlLlJlc3RNZXRob2RzIHwgV2hlcmUtT2JqZWN0IHsgJF8gLW5lICdHZXQnIH0gfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxDQoJfQ0KCQ0KCSNlbmRyZWdpb24gTG9hZCBPdmVycmlkZXMNCgkNCgkkY3VycmVudEZ1bmN0aW9uc1RleHQgPSAkZnVuY3Rpb25zVGV4dCAtcmVwbGFjZSAnJWZ1bmN0aW9ubmFtZSUnLCAkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lIC1yZXBsYWNlICclY29uZGVuc2VkbmFtZSUnLCAkY29uZGVuc2VkTmFtZSAtcmVwbGFjZSAnJW1ldGhvZCUnLCAkbWV0aG9kTmFtZQ0KCQ0KCSRwYXJzZWRGdW5jdGlvbiA9IFJlYWQtUFNNRFNjcmlwdCAtUGF0aCAkZnVuY3Rpb25Tb3VyY2VGaWxlLkZ1bGxOYW1lDQoJJGZ1bmN0aW9uQXN0ID0gJHBhcnNlZEZ1bmN0aW9uLkFzdC5FbmRCbG9jay5TdGF0ZW1lbnRzIHwgV2hlcmUtT2JqZWN0IHsNCgkJJF8gLWlzIFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkxhbmd1YWdlLkZ1bmN0aW9uRGVmaW5pdGlvbkFzdF0NCgl9IHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMQ0KCQ0KCSRlbmQgPSAkZnVuY3Rpb25Bc3QuQm9keS5QYXJhbUJsb2NrLkV4dGVudC5FbmRPZmZTZXQNCgkkc3RhcnQgPSAkZnVuY3Rpb25Bc3QuQm9keS5FeHRlbnQuU3RhcnRPZmZTZXQgKyAxDQoJJGN1cnJlbnRGdW5jdGlvbnNUZXh0ID0gJGN1cnJlbnRGdW5jdGlvbnNUZXh0LlJlcGxhY2UoJyVwYXJhbWV0ZXIlJywgJGZ1bmN0aW9uQXN0LkJvZHkuRXh0ZW50LlRleHQuU3ViU3RyaW5nKDEsICgkZW5kIC0gJHN0YXJ0KSkpDQoJDQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAiICAgIENyZWF0aW5nIGZpbGU6ICQoJGZ1bmN0aW9uRm9sZGVyLkZ1bGxOYW1lKVwkKCRmdW5jdGlvblNvdXJjZUZpbGUuTmFtZSkiDQoJW1N5c3RlbS5JTy5GaWxlXTo6V3JpdGVBbGxUZXh0KCIkKCRmdW5jdGlvbkZvbGRlci5GdWxsTmFtZSlcJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLk5hbWUpIiwgJGN1cnJlbnRGdW5jdGlvbnNUZXh0LCAkZW5jb2RpbmcpDQp9DQokZnVuY3Rpb25zVG9FeHBvcnQgPSAoR2V0LUNoaWxkSXRlbSAtUGF0aCAkZnVuY3Rpb25Gb2xkZXIuRnVsbE5hbWUgLVJlY3Vyc2UgLUZpbHRlciAqLnBzMSkuQmFzZU5hbWUgfCBTb3J0LU9iamVjdA0KI2VuZHJlZ2lvbiBDcmVhdGUgRnVuY3Rpb25zDQoNCiNyZWdpb24gQ3JlYXRlIENvcmUgTW9kdWxlIEZpbGVzDQojIEdldCBNYW5pZmVzdCBvZiBwdWJsaXNoZWQgdmVyc2lvbiwgaW4gb3JkZXIgdG8gY2F0Y2ggYnVpbGQtcGhhc2UgY2hhbmdlcyBzdWNoIGFzIG1vZHVsZSB2ZXJzaW9uLg0KJG9yaWdpbmFsTWFuaWZlc3REYXRhID0gSW1wb3J0LVBvd2VyU2hlbGxEYXRhRmlsZSAtUGF0aCAiJHB1Ymxpc2hSb290XMO+bmFtZcO+LnBzZDEiDQokcHJlcmVxSGFzaCA9IEB7DQoJTW9kdWxlTmFtZSAgICA9ICdQU0ZyYW1ld29yaycNCglNb2R1bGVWZXJzaW9uID0gKEdldC1Nb2R1bGUgUFNGcmFtZXdvcmspLlZlcnNpb24NCn0NCiRwYXJhbU5ld01vZHVsZU1hbmlmZXN0ID0gQHsNCglQYXRoCQkJICA9ICgnezB9XHsxfS5wc2QxJyAtZiAkd29ya2luZ1Jvb3QuRnVsbE5hbWUsICRNb2R1bGVOYW1lKQ0KCUZ1bmN0aW9uc1RvRXhwb3J0ID0gJGZ1bmN0aW9uc1RvRXhwb3J0DQoJQ29tcGFueU5hbWUJICAgICAgPSAkb3JpZ2luYWxNYW5pZmVzdERhdGEuQ29tcGFueU5hbWUNCglBdXRob3IJCSAgICAgID0gJG9yaWdpbmFsTWFuaWZlc3REYXRhLkF1dGhvcg0KCURlc2NyaXB0aW9uCSAgICAgID0gJG9yaWdpbmFsTWFuaWZlc3REYXRhLkRlc2NyaXB0aW9uDQoJTW9kdWxlVmVyc2lvbgkgID0gJG9yaWdpbmFsTWFuaWZlc3REYXRhLk1vZHVsZVZlcnNpb24NCglSb290TW9kdWxlCSAgICAgID0gKCd7MH0ucHNtMScgLWYgJE1vZHVsZU5hbWUpDQoJQ29weXJpZ2h0CQkgID0gJG9yaWdpbmFsTWFuaWZlc3REYXRhLkNvcHlyaWdodA0KCVR5cGVzVG9Qcm9jZXNzICAgID0gQCgpDQoJRm9ybWF0c1RvUHJvY2VzcyAgPSBAKCkNCglSZXF1aXJlZEFzc2VtYmxpZXMgPSBAKCkNCglSZXF1aXJlZE1vZHVsZXMgICA9IEAoJHByZXJlcUhhc2gpDQoJQ29tcGF0aWJsZVBTRWRpdGlvbnMgPSAnQ29yZScsICdEZXNrdG9wJw0KCVBvd2VyU2hlbGxWZXJzaW9uID0gJzUuMScNCn0NCg0KaWYgKCRJbmNsdWRlQXNzZW1ibHkpIHsgJHBhcmFtTmV3TW9kdWxlTWFuaWZlc3QuUmVxdWlyZWRBc3NlbWJsaWVzID0gJG9yaWdpbmFsTWFuaWZlc3REYXRhLlJlcXVpcmVkQXNzZW1ibGllcyB9DQppZiAoJEluY2x1ZGVGb3JtYXQpIHsgJHBhcmFtTmV3TW9kdWxlTWFuaWZlc3QuRm9ybWF0c1RvUHJvY2VzcyA9ICRvcmlnaW5hbE1hbmlmZXN0RGF0YS5Gb3JtYXRzVG9Qcm9jZXNzIH0NCmlmICgkSW5jbHVkZVR5cGUpIHsgJHBhcmFtTmV3TW9kdWxlTWFuaWZlc3QuVHlwZXNUb1Byb2Nlc3MgPSAkb3JpZ2luYWxNYW5pZmVzdERhdGEuVHlwZXNUb1Byb2Nlc3MgfQ0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAiQ3JlYXRpbmcgTW9kdWxlIE1hbmlmZXN0IGZvciBtb2R1bGU6ICRNb2R1bGVOYW1lIg0KTmV3LU1vZHVsZU1hbmlmZXN0IEBwYXJhbU5ld01vZHVsZU1hbmlmZXN0DQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIkNvcHlpbmcgYWRkaXRpb25hbCBtb2R1bGUgZmlsZXMiDQpDb3B5LUl0ZW0gLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcY2xpZW50TW9kdWxlXG1vZHVsZXJvb3QucHNtMSIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5nUm9vdC5GdWxsTmFtZSlcJCgkTW9kdWxlTmFtZSkucHNtMSINCkNvcHktSXRlbSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcTElDRU5TRSIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5nUm9vdC5GdWxsTmFtZSlcIg0KI2VuZHJlZ2lvbiBDcmVhdGUgQ29yZSBNb2R1bGUgRmlsZXMNCg0KI3JlZ2lvbiBUcmFuc2ZlciBBZGRpdGlvbmFsIENvbnRlbnQNCmlmICgkSW5jbHVkZUFzc2VtYmx5KQ0Kew0KCUNvcHktSXRlbSAtUGF0aCAiJHB1Ymxpc2hSb290XGJpbiIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5nUm9vdC5GdWxsTmFtZSlcIiAtUmVjdXJzZQ0KfQ0KaWYgKCRJbmNsdWRlRm9ybWF0IC1vciAkSW5jbHVkZVR5cGUpDQp7DQoJQ29weS1JdGVtIC1QYXRoICIkcHVibGlzaFJvb3RceG1sIiAtRGVzdGluYXRpb24gIiQoJHdvcmtpbmdSb290LkZ1bGxOYW1lKVwiIC1SZWN1cnNlDQp9DQojZW5kcmVnaW9uIFRyYW5zZmVyIEFkZGl0aW9uYWwgQ29udGVudA0KDQojcmVnaW9uIFB1Ymxpc2gNCmlmICgkTG9jYWxSZXBvKQ0Kew0KCSMgRGVwZW5kZW5jaWVzIG11c3QgZ28gZmlyc3QNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIkNyZWF0aW5nIE51Z2V0IFBhY2thZ2UgZm9yIG1vZHVsZTogUFNGcmFtZXdvcmsiDQoJTmV3LVBTTURNb2R1bGVOdWdldFBhY2thZ2UgLU1vZHVsZVBhdGggKEdldC1Nb2R1bGUgLU5hbWUgUFNGcmFtZXdvcmspLk1vZHVsZUJhc2UgLVBhY2thZ2VQYXRoIC4gLVdhcm5pbmdBY3Rpb24gU2lsZW50bHlDb250aW51ZQ0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiQ3JlYXRpbmcgTnVnZXQgUGFja2FnZSBmb3IgbW9kdWxlOiDDvm5hbWXDviINCglOZXctUFNNRE1vZHVsZU51Z2V0UGFja2FnZSAtTW9kdWxlUGF0aCAkd29ya2luZ1Jvb3QuRnVsbE5hbWUgLVBhY2thZ2VQYXRoIC4gLUVuYWJsZUV4Y2VwdGlvbg0KfQ0KZWxzZQ0Kew0KCSMgUHVibGlzaCB0byBHYWxsZXJ5DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJQdWJsaXNoaW5nIHRoZSDDvm5hbWXDviBtb2R1bGUgdG8gJCgkUmVwb3NpdG9yeSkiDQoJUHVibGlzaC1Nb2R1bGUgLVBhdGggJHdvcmtpbmdSb290LkZ1bGxOYW1lIC1OdUdldEFwaUtleSAkQXBpS2V5IC1Gb3JjZSAtUmVwb3NpdG9yeSAkUmVwb3NpdG9yeQ0KfQ0KI2VuZHJlZ2lvbiBQdWJsaXNoAQkiAAAACSMAAAAGJAAAACN2c3RzLWNyZWF0ZUZ1bmN0aW9uQ2xpZW50TW9kdWxlLnBzMQYlAAAAKWJ1aWxkXHZzdHMtY3JlYXRlRnVuY3Rpb25DbGllbnRNb2R1bGUucHMxCQYAAAAJJwAAAAkoAAAAAQ4AAAALAAAABikAAACbLA0KPCMNCgkuU1lOT1BTSVMNCgkJUGFja2FnZXMgYW4gQXp1cmUgRnVuY3Rpb25zIHByb2plY3QsIHJlYWR5IHRvIHJlbGVhc2UuDQoJDQoJLkRFU0NSSVBUSU9ODQoJCVBhY2thZ2VzIGFuIEF6dXJlIEZ1bmN0aW9ucyBwcm9qZWN0LCByZWFkeSB0byByZWxlYXNlLg0KCQlTaG91bGQgYmUgcGFydCBvZiB0aGUgcmVsZWFzZSBwaXBlbGluZSwgYWZ0ZXIgZW5zdXJpbmcgdmFsaWRhdGlvbi4NCg0KCQlMb29rIGludG8gdGhlICdBenVyZUZ1bmN0aW9uUmVzdCcgdGVtcGxhdGUgZm9yIGdlbmVyYXRpbmcgZnVuY3Rpb25zIGZvciB0aGUgbW9kdWxlIGlmIHlvdSBkby4NCgkNCgkuUEFSQU1FVEVSIFdvcmtpbmdEaXJlY3RvcnkNCgkJVGhlIHJvb3QgZm9sZGVyIHRvIHdvcmsgZnJvbS4NCgkNCgkuUEFSQU1FVEVSIFJlcG9zaXRvcnkNCgkJVGhlIG5hbWUgb2YgdGhlIHJlcG9zaXRvcnkgdG8gdXNlIGZvciBnYXRoZXJpbmcgZGVwZW5kZW5jaWVzIGZyb20uDQojPg0KcGFyYW0gKA0KCSRXb3JraW5nRGlyZWN0b3J5ID0gIiQoJGVudjpTWVNURU1fREVGQVVMVFdPUktJTkdESVJFQ1RPUlkpXF/Dvm5hbWXDviIsDQoJDQoJJFJlcG9zaXRvcnkgPSAnUFNHYWxsZXJ5JywNCg0KCVtzd2l0Y2hdDQoJJEluY2x1ZGVBWg0KKQ0KDQokbW9kdWxlTmFtZSA9ICfDvm5hbWXDvicNCg0KIyBQcmVwYXJlIFBhdGhzDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICJDcmVhdGluZyB3b3JraW5nIGZvbGRlcnMiDQokbW9kdWxlUm9vdCA9IEpvaW4tUGF0aCAtUGF0aCAkV29ya2luZ0RpcmVjdG9yeSAtQ2hpbGRQYXRoICdwdWJsaXNoJw0KJHdvcmtpbmdSb290ID0gTmV3LUl0ZW0gLVBhdGggJFdvcmtpbmdEaXJlY3RvcnkgLU5hbWUgJ3dvcmtpbmcnIC1JdGVtVHlwZSBEaXJlY3RvcnkNCiRtb2R1bGVzRm9sZGVyID0gTmV3LUl0ZW0gLVBhdGggJHdvcmtpbmdSb290LkZ1bGxOYW1lIC1OYW1lIE1vZHVsZXMgLUl0ZW1UeXBlIERpcmVjdG9yeQ0KDQojIEZpbGwgb3V0IHRoZSBtb2R1bGVzIGZvbGRlcg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAiVHJhbnNmZXJpbmcgYnVpbHQgbW9kdWxlIGRhdGEgaW50byB3b3JraW5nIGRpcmVjdG9yeSINCkNvcHktSXRlbSAtUGF0aCAiJG1vZHVsZVJvb3RcJG1vZHVsZU5hbWUiIC1EZXN0aW5hdGlvbiAkbW9kdWxlc0ZvbGRlci5GdWxsTmFtZSAtUmVjdXJzZSAtRm9yY2UNCmZvcmVhY2ggKCRkZXBlbmRlbmN5IGluIChJbXBvcnQtUG93ZXJTaGVsbERhdGFGaWxlIC1QYXRoICIkbW9kdWxlUm9vdFwkbW9kdWxlTmFtZVwkbW9kdWxlTmFtZS5wc2QxIikuUmVxdWlyZWRNb2R1bGVzKQ0Kew0KCSRwYXJhbSA9IEB7DQoJCVJlcG9zaXRvcnkgPSAkUmVwb3NpdG9yeQ0KCQlOYW1lCSAgID0gJGRlcGVuZGVuY3kuTW9kdWxlTmFtZQ0KCQlQYXRoCSAgID0gJG1vZHVsZXNGb2xkZXIuRnVsbE5hbWUNCgl9DQoJaWYgKCRkZXBlbmRlbmN5IC1pcyBbc3RyaW5nXSkgeyAkcGFyYW1bJ05hbWUnXSA9ICRkZXBlbmRlbmN5IH0NCglpZiAoJGRlcGVuZGVuY3kuUmVxdWlyZWRWZXJzaW9uKQ0KCXsNCgkJJHBhcmFtWydSZXF1aXJlZFZlcnNpb24nXSA9ICRkZXBlbmRlbmN5LlJlcXVpcmVkVmVyc2lvbg0KCX0NCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICJQcmVwYXJpbmcgRGVwZW5kZW5jeTogJCgkcGFyYW1bJ05hbWUnXSkiDQoJU2F2ZS1Nb2R1bGUgQHBhcmFtDQp9DQoNCiMgR2VuZXJhdGUgZnVuY3Rpb24gY29uZmlndXJhdGlvbg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAnR2VuZXJhdGluZyBmdW5jdGlvbiBjb25maWd1cmF0aW9uJw0KJHJ1blRlbXBsYXRlID0gR2V0LUNvbnRlbnQgLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNccnVuLnBzMSIgLVJhdw0KZm9yZWFjaCAoJGZ1bmN0aW9uU291cmNlRmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAtUGF0aCAiJCgkbW9kdWxlUm9vdClcJG1vZHVsZU5hbWVcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsdGVyICcqLnBzMScpKQ0Kew0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIiAgUHJvY2Vzc2luZyBmdW5jdGlvbjogJGZ1bmN0aW9uU291cmNlRmlsZSINCgkkY29uZGVuc2VkTmFtZSA9ICRmdW5jdGlvblNvdXJjZUZpbGUuQmFzZU5hbWUgLXJlcGxhY2UgJy0nLCAnJw0KCSRmdW5jdGlvbkZvbGRlciA9IE5ldy1JdGVtIC1QYXRoICR3b3JraW5nUm9vdC5GdWxsTmFtZSAtTmFtZSAkY29uZGVuc2VkTmFtZSAtSXRlbVR5cGUgRGlyZWN0b3J5DQoJDQoJI3JlZ2lvbiBMb2FkIE92ZXJyaWRlcw0KCSRvdmVycmlkZSA9IEB7IH0NCglpZiAoVGVzdC1QYXRoIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lKS5wc2QxIikNCgl7DQoJCSRvdmVycmlkZSA9IEltcG9ydC1Qb3dlclNoZWxsRGF0YUZpbGUgLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVwkKCRmdW5jdGlvblNvdXJjZUZpbGUuQmFzZU5hbWUpLnBzZDEiDQoJfQ0KCWlmIChUZXN0LVBhdGggLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVwkKCRjb25kZW5zZWROYW1lKS5wc2QxIikNCgl7DQoJCSRvdmVycmlkZSA9IEltcG9ydC1Qb3dlclNoZWxsRGF0YUZpbGUgLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVwkKCRjb25kZW5zZWROYW1lKS5wc2QxIg0KCX0NCgkjZW5kcmVnaW9uIExvYWQgT3ZlcnJpZGVzDQoJDQoJI3JlZ2lvbiBDcmVhdGUgRnVuY3Rpb24gQ29uZmlndXJhdGlvbg0KCSRyZXN0TWV0aG9kcyA9ICdnZXQnLCAncG9zdCcNCglpZiAoJG92ZXJyaWRlLlJlc3RNZXRob2RzKSB7ICRyZXN0TWV0aG9kcyA9ICRvdmVycmlkZS5SZXN0TWV0aG9kcyB9DQoJDQoJU2V0LUNvbnRlbnQgLVBhdGggIiQoJGZ1bmN0aW9uRm9sZGVyLkZ1bGxOYW1lKVxmdW5jdGlvbi5qc29uIiAtVmFsdWUgQCINCnsNCiAgICAiYmluZGluZ3MiOiBbDQogICAgICAgIHsNCiAgICAgICAgImF1dGhMZXZlbCI6ICJmdW5jdGlvbiIsDQogICAgICAgICJ0eXBlIjogImh0dHBUcmlnZ2VyIiwNCiAgICAgICAgImRpcmVjdGlvbiI6ICJpbiIsDQogICAgICAgICJuYW1lIjogIlJlcXVlc3QiLA0KICAgICAgICAibWV0aG9kcyI6IFsNCiAgICAgICAgICAgICIkKCRyZXN0TWV0aG9kcyAtam9pbiAiYCIsDQogICAgICAgICAgICBgIiIpIg0KICAgICAgICBdDQogICAgICAgIH0sDQogICAgICAgIHsNCiAgICAgICAgInR5cGUiOiAiaHR0cCIsDQogICAgICAgICJkaXJlY3Rpb24iOiAib3V0IiwNCiAgICAgICAgIm5hbWUiOiAiUmVzcG9uc2UiDQogICAgICAgIH0NCiAgICBdLA0KICAgICJkaXNhYmxlZCI6IGZhbHNlDQp9DQoiQA0KCSNlbmRyZWdpb24gQ3JlYXRlIEZ1bmN0aW9uIENvbmZpZ3VyYXRpb24NCgkNCgkjcmVnaW9uIE92ZXJyaWRlIEZ1bmN0aW9uIENvbmZpZ3VyYXRpb24NCglpZiAoVGVzdC1QYXRoIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lKS5qc29uIikNCgl7DQoJCUNvcHktSXRlbSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZSkuanNvbiIgLURlc3RpbmF0aW9uICIkKCRmdW5jdGlvbkZvbGRlci5GdWxsTmFtZSlcZnVuY3Rpb24uanNvbiIgLUZvcmNlDQoJfQ0KCWlmIChUZXN0LVBhdGggLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVwkKCRjb25kZW5zZWROYW1lKS5qc29uIikNCgl7DQoJCUNvcHktSXRlbSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGNvbmRlbnNlZE5hbWUpLmpzb24iIC1EZXN0aW5hdGlvbiAiJCgkZnVuY3Rpb25Gb2xkZXIuRnVsbE5hbWUpXGZ1bmN0aW9uLmpzb24iIC1Gb3JjZQ0KCX0NCgkjZW5kcmVnaW9uIE92ZXJyaWRlIEZ1bmN0aW9uIENvbmZpZ3VyYXRpb24NCgkNCgkjIEdlbmVyYXRlIHRoZSBydW4ucHMxIGZpbGUNCgkkcnVuVGV4dCA9ICRydW5UZW1wbGF0ZSAtcmVwbGFjZSAnJWZ1bmN0aW9ubmFtZSUnLCAkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lDQoJJHJ1blRleHQgfCBTZXQtQ29udGVudCAtUGF0aCAiJCgkZnVuY3Rpb25Gb2xkZXIuRnVsbE5hbWUpXHJ1bi5wczEiIC1FbmNvZGluZyBVVEY4DQp9DQoNCiMgVHJhbnNmZXIgY29tbW9uIGZpbGVzDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICJUcmFuc2ZlcmluZyBjb3JlIGZ1bmN0aW9uIGRhdGEiDQppZiAoJEluY2x1ZGVBWikNCnsNCglDb3B5LUl0ZW0gLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcaG9zdC1hei5qc29uIiAtRGVzdGluYXRpb24gIiQoJHdvcmtpbmdyb290LkZ1bGxOYW1lKVxob3N0Lmpzb24iDQoJQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXHJlcXVpcmVtZW50cy5wc2QxIiAtRGVzdGluYXRpb24gIiQoJHdvcmtpbmdyb290LkZ1bGxOYW1lKVwiDQp9DQplbHNlDQp7DQoJQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGhvc3QuanNvbiIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5ncm9vdC5GdWxsTmFtZSlcIg0KfQ0KQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGxvY2FsLnNldHRpbmdzLmpzb24iIC1EZXN0aW5hdGlvbiAiJCgkd29ya2luZ3Jvb3QuRnVsbE5hbWUpXCINCg0KIyBCdWlsZCB0aGUgcHJvZmlsZSBmaWxlDQokdGV4dCA9IEAoKQ0KJHRleHQgKz0gR2V0LUNvbnRlbnQgLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNccHJvZmlsZS5wczEiIC1SYXcNCmZvcmVhY2ggKCRmdW5jdGlvbkZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNccHJvZmlsZUZ1bmN0aW9ucyIgLVJlY3Vyc2UpKQ0Kew0KCSR0ZXh0ICs9IEdldC1Db250ZW50IC1QYXRoICRmdW5jdGlvbkZpbGUuRnVsbE5hbWUgLVJhdw0KfQ0KJHRleHQgLWpvaW4gImBuYG4iIHwgU2V0LUNvbnRlbnQgIiQoJHdvcmtpbmdyb290LkZ1bGxOYW1lKVxwcm9maWxlLnBzMSINCg0KIyBaaXAgSXQNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIkNyZWF0aW5nIGZ1bmN0aW9uIGFyY2hpdmUgaW4gJyQoJFdvcmtpbmdEaXJlY3RvcnkpXCRtb2R1bGVOYW1lLnppcCciDQpDb21wcmVzcy1BcmNoaXZlIC1QYXRoICIkKCR3b3JraW5ncm9vdC5GdWxsTmFtZSlcKiIgLURlc3RpbmF0aW9uUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcJG1vZHVsZU5hbWUuemlwIiAtRm9yY2UBCSoAAAAJKwAAAAYsAAAAGHZzdHMtcGFja2FnZUZ1bmN0aW9uLnBzMQYtAAAAHmJ1aWxkXHZzdHMtcGFja2FnZUZ1bmN0aW9uLnBzMQkGAAAACS8AAAAJMAAAAAEPAAAACwAAAAYxAAAApgZwYXJhbSAoDQogICAgW3N0cmluZ10NCiAgICAkUmVwb3NpdG9yeSA9ICdQU0dhbGxlcnknDQopDQoNCiRtb2R1bGVzID0gQCgiUGVzdGVyIiwgIlBTRnJhbWV3b3JrIiwgIlBTTW9kdWxlRGV2ZWxvcG1lbnQiLCAiUFNTY3JpcHRBbmFseXplciIpDQoNCiMgQXV0b21hdGljYWxseSBhZGQgbWlzc2luZyBkZXBlbmRlbmNpZXMNCiRkYXRhID0gSW1wb3J0LVBvd2VyU2hlbGxEYXRhRmlsZSAtUGF0aCAiJFBTU2NyaXB0Um9vdFwuLlzDvm5hbWXDvlzDvm5hbWXDvi5wc2QxIg0KZm9yZWFjaCAoJGRlcGVuZGVuY3kgaW4gJGRhdGEuUmVxdWlyZWRNb2R1bGVzKSB7DQogICAgaWYgKCRkZXBlbmRlbmN5IC1pcyBbc3RyaW5nXSkgew0KICAgICAgICBpZiAoJG1vZHVsZXMgLWNvbnRhaW5zICRkZXBlbmRlbmN5KSB7IGNvbnRpbnVlIH0NCiAgICAgICAgJG1vZHVsZXMgKz0gJGRlcGVuZGVuY3kNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAgIGlmICgkbW9kdWxlcyAtY29udGFpbnMgJGRlcGVuZGVuY3kuTW9kdWxlTmFtZSkgeyBjb250aW51ZSB9DQogICAgICAgICRtb2R1bGVzICs9ICRkZXBlbmRlbmN5Lk1vZHVsZU5hbWUNCiAgICB9DQp9DQoNCmZvcmVhY2ggKCRtb2R1bGUgaW4gJG1vZHVsZXMpIHsNCiAgICBXcml0ZS1Ib3N0ICJJbnN0YWxsaW5nICRtb2R1bGUiIC1Gb3JlZ3JvdW5kQ29sb3IgQ3lhbg0KICAgIEluc3RhbGwtTW9kdWxlICRtb2R1bGUgLUZvcmNlIC1Ta2lwUHVibGlzaGVyQ2hlY2sgLVJlcG9zaXRvcnkgJFJlcG9zaXRvcnkNCiAgICBJbXBvcnQtTW9kdWxlICRtb2R1bGUgLUZvcmNlIC1QYXNzVGhydQ0KfQEJMgAAAAkzAAAABjQAAAAWdnN0cy1wcmVyZXF1aXNpdGVzLnBzMQY1AAAAHGJ1aWxkXHZzdHMtcHJlcmVxdWlzaXRlcy5wczEJBgAAAAk3AAAACTgAAAABEAAAAAsAAAAGOQAAAMoCIyBHdWlkZSBmb3IgYXZhaWxhYmxlIHZhcmlhYmxlcyBhbmQgd29ya2luZyB3aXRoIHNlY3JldHM6DQojIGh0dHBzOi8vZG9jcy5taWNyb3NvZnQuY29tL2VuLXVzL3ZzdHMvYnVpbGQtcmVsZWFzZS9jb25jZXB0cy9kZWZpbml0aW9ucy9idWlsZC92YXJpYWJsZXM/dGFicz1wb3dlcnNoZWxsDQoNCiMgTmVlZHMgdG8gZW5zdXJlIHRoaW5ncyBhcmUgRG9uZSBSaWdodCBhbmQgb25seSBsZWdhbCBjb21taXRzIHRvIG1hc3RlciBnZXQgYnVpbHQNCg0KIyBSdW4gaW50ZXJuYWwgcGVzdGVyIHRlc3RzDQomICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+XHRlc3RzXHBlc3Rlci5wczEiAQk6AAAACTsAAAAGPAAAABF2c3RzLXZhbGlkYXRlLnBzMQY9AAAAF2J1aWxkXHZzdHMtdmFsaWRhdGUucHMxCQYAAAAJPwAAAAlAAAAAARIAAAAHAAAACQoAAAAAAAAAAAAAAAETAAAABwAAAAkKAAAAAAAAAAAAAAABFwAAAAcAAAAJCgAAAAAAAAAAAAAAARgAAAAHAAAACQoAAAAAAAAAAAAAAAEaAAAABwAAAAlCAAAAAQAAAAEAAAABGwAAAAcAAAAJCgAAAAAAAAAAAAAAAR8AAAAHAAAACQoAAAAAAAAAAAAAAAEgAAAABwAAAAkKAAAAAAAAAAAAAAABIgAAAAcAAAAJRAAAAAEAAAABAAAAASMAAAAHAAAACQoAAAAAAAAAAAAAAAEnAAAABwAAAAkKAAAAAAAAAAAAAAABKAAAAAcAAAAJCgAAAAAAAAAAAAAAASoAAAAHAAAACUYAAAABAAAAAQAAAAErAAAABwAAAAkKAAAAAAAAAAAAAAABLwAAAAcAAAAJCgAAAAAAAAAAAAAAATAAAAAHAAAACQoAAAAAAAAAAAAAAAEyAAAABwAAAAlIAAAAAQAAAAEAAAABMwAAAAcAAAAJCgAAAAAAAAAAAAAAATcAAAAHAAAACQoAAAAAAAAAAAAAAAE4AAAABwAAAAkKAAAAAAAAAAAAAAABOgAAAAcAAAAJSgAAAAEAAAABAAAAATsAAAAHAAAACQoAAAAAAAAAAAAAAAE/AAAABwAAAAkKAAAAAAAAAAAAAAABQAAAAAcAAAAJCgAAAAAAAAAAAAAAEUIAAAAEAAAABkwAAAAEbmFtZQ0DEUQAAAAEAAAABk0AAAAEbmFtZQ0DEUYAAAAEAAAABk4AAAAEbmFtZQ0DEUgAAAAEAAAABk8AAAAEbmFtZQ0DEUoAAAAEAAAABlAAAAAEbmFtZQ0DCw==</BA> </MS> </Obj> <Obj RefId="29"> <TNRef RefId="7" /> <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString> <Props> <Obj N="Children" RefId="30"> <TNRef RefId="6" /> <LST> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> </LST> </Obj> <S N="Name">library</S> <S N="RelativePath">library</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="31"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="32"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAAB2xpYnJhcnkGBQAAAAdsaWJyYXJ5BgYAAAACw74JBwAAAAkIAAAABAMAAACeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24EAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlW10CAAAACAgJCQAAAAEAAAABAAAABAcAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCgAAAAAAAAAAAAAAAQgAAAAHAAAACQoAAAAAAAAAAAAAAAcJAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACQsAAAANAxEKAAAAAAAAAAELAAAAAQAAAAkMAAAABg0AAAAIw75uYW1lw74GDgAAABBsaWJyYXJ5XMO+bmFtZcO+CQYAAAAJEAAAAAkRAAAAAQwAAAADAAAACRIAAAACAAAAAgAAAAEQAAAABwAAAAkTAAAAAQAAAAEAAAABEQAAAAcAAAAJCgAAAAAAAAAAAAAABxIAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJFQAAAAkWAAAADQIREwAAAAQAAAAGFwAAAARuYW1lDQMBFQAAAAEAAAAJGAAAAAYZAAAACMO+bmFtZcO+BhoAAAAZbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvgkGAAAACRwAAAAJHQAAAAUWAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYeAAAAsQcNCk1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIFNvbHV0aW9uIEZpbGUsIEZvcm1hdCBWZXJzaW9uIDEyLjAwDQojIFZpc3VhbCBTdHVkaW8gMTUNClZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxNS4wLjI3MTMwLjIwMTANCk1pbmltdW1WaXN1YWxTdHVkaW9WZXJzaW9uID0gMTAuMC40MDIxOS4xDQpQcm9qZWN0KCJ7w74hZ3VpZDIhw759IikgPSAiw75uYW1lw74iLCAiw75uYW1lw75cw75uYW1lw74uY3Nwcm9qIiwgInvDviFndWlkNCHDvn0iDQpFbmRQcm9qZWN0DQpHbG9iYWwNCglHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KCQlEZWJ1Z3xBbnkgQ1BVID0gRGVidWd8QW55IENQVQ0KCQlSZWxlYXNlfEFueSBDUFUgPSBSZWxlYXNlfEFueSBDUFUNCglFbmRHbG9iYWxTZWN0aW9uDQoJR2xvYmFsU2VjdGlvbihQcm9qZWN0Q29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwb3N0U29sdXRpb24NCgkJe8O+IWd1aWQ0IcO+fS5EZWJ1Z3xBbnkgQ1BVLkFjdGl2ZUNmZyA9IERlYnVnfEFueSBDUFUNCgkJe8O+IWd1aWQ0IcO+fS5EZWJ1Z3xBbnkgQ1BVLkJ1aWxkLjAgPSBEZWJ1Z3xBbnkgQ1BVDQoJCXvDviFndWlkNCHDvn0uUmVsZWFzZXxBbnkgQ1BVLkFjdGl2ZUNmZyA9IFJlbGVhc2V8QW55IENQVQ0KCQl7w74hZ3VpZDQhw759LlJlbGVhc2V8QW55IENQVS5CdWlsZC4wID0gUmVsZWFzZXxBbnkgQ1BVDQoJRW5kR2xvYmFsU2VjdGlvbg0KCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQoJCUhpZGVTb2x1dGlvbk5vZGUgPSBGQUxTRQ0KCUVuZEdsb2JhbFNlY3Rpb24NCglHbG9iYWxTZWN0aW9uKEV4dGVuc2liaWxpdHlHbG9iYWxzKSA9IHBvc3RTb2x1dGlvbg0KCQlTb2x1dGlvbkd1aWQgPSB7w74hZ3VpZDMhw759DQoJRW5kR2xvYmFsU2VjdGlvbg0KRW5kR2xvYmFsDQoBCR8AAAAJIAAAAAYhAAAADMO+bmFtZcO+LnNsbgYiAAAAHWxpYnJhcnlcw75uYW1lw75cw75uYW1lw74uc2xuCQYAAAAJJAAAAAklAAAAARgAAAADAAAACSYAAAACAAAAAgAAAAEcAAAABwAAAAknAAAAAQAAAAEAAAABHQAAAAcAAAAJCgAAAAAAAAAAAAAAAR8AAAAHAAAACSkAAAABAAAAAQAAAAEgAAAABwAAAAkqAAAABwAAAAcAAAABJAAAAAcAAAAJKwAAAAEAAAABAAAAASUAAAAHAAAACQoAAAAAAAAAAAAAAAcmAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACS0AAAAJLgAAAA0CEScAAAAEAAAABi8AAAAEbmFtZQ0DESkAAAAEAAAABjAAAAAEbmFtZQ0DESoAAAAIAAAABjEAAAAFZ3VpZDIGMgAAAAVndWlkNAYzAAAABWd1aWQ0BjQAAAAFZ3VpZDQGNQAAAAVndWlkNAY2AAAABWd1aWQ0BjcAAAAFZ3VpZDMKESsAAAAEAAAABjgAAAAEbmFtZQ0DAS0AAAAWAAAABjkAAABSdXNpbmcgU3lzdGVtOw0KDQpuYW1lc3BhY2Ugw75uYW1lw74NCnsNCiAgICBwdWJsaWMgY2xhc3MgQ2xhc3MxDQogICAgew0KICAgIH0NCn0NCgEJOgAAAAk7AAAABjwAAAAJQ2xhc3MxLmNzBj0AAAAjbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvlxDbGFzczEuY3MJBgAAAAk/AAAACUAAAAABLgAAABYAAAAGQQAAANAFPFByb2plY3QgU2RrPSJNaWNyb3NvZnQuTkVULlNkayI+DQoNCiAgPFByb3BlcnR5R3JvdXA+DQogICAgPFRhcmdldEZyYW1ld29yaz5uZXQ0LjUuMjwvVGFyZ2V0RnJhbWV3b3JrPg0KICA8L1Byb3BlcnR5R3JvdXA+DQoNCiAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xBbnlDUFUnIj4NCiAgICA8T3V0cHV0UGF0aD4uLlwuLlwuLlzDvm5hbWXDvlxiaW48L091dHB1dFBhdGg+DQogICAgPERvY3VtZW50YXRpb25GaWxlPi4uXC4uXC4uXMO+bmFtZcO+XGJpblzDvm5hbWXDvi54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KICA8L1Byb3BlcnR5R3JvdXA+DQoNCiAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChSZWxlYXNlKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xBbnlDUFUnIj4NCiAgICA8T3V0cHV0UGF0aD4uLlwuLlwuLlzDvm5hbWXDvlxiaW48L091dHB1dFBhdGg+DQogICAgPERvY3VtZW50YXRpb25GaWxlPi4uXC4uXC4uXMO+bmFtZcO+XGJpblzDvm5hbWXDvi54bWw8L0RvY3VtZW50YXRpb25GaWxlPg0KICA8L1Byb3BlcnR5R3JvdXA+DQogIA0KICA8UHJvcGVydHlHcm91cD4NCiAgICA8QXBwZW5kVGFyZ2V0RnJhbWV3b3JrVG9PdXRwdXRQYXRoPmZhbHNlPC9BcHBlbmRUYXJnZXRGcmFtZXdvcmtUb091dHB1dFBhdGg+DQogIDwvUHJvcGVydHlHcm91cD4NCg0KPC9Qcm9qZWN0Pg0KAQlCAAAACUMAAAAGRAAAAA/Dvm5hbWXDvi5jc3Byb2oGRQAAAClsaWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+XMO+bmFtZcO+LmNzcHJvagkGAAAACUcAAAAJSAAAAAE6AAAABwAAAAlJAAAAAQAAAAEAAAABOwAAAAcAAAAJCgAAAAAAAAAAAAAAAT8AAAAHAAAACQoAAAAAAAAAAAAAAAFAAAAABwAAAAkKAAAAAAAAAAAAAAABQgAAAAcAAAAJSwAAAAEAAAABAAAAAUMAAAAHAAAACQoAAAAAAAAAAAAAAAFHAAAABwAAAAlNAAAAAQAAAAEAAAABSAAAAAcAAAAJCgAAAAAAAAAAAAAAEUkAAAAEAAAABk8AAAAEbmFtZQ0DEUsAAAAEAAAABlAAAAAEbmFtZQ0DEU0AAAAEAAAABlEAAAAEbmFtZQ0DCw==</BA> </MS> </Obj> <Obj RefId="33"> <TNRef RefId="7" /> <ToString>PSModuleDevelopment.Template.TemplateItemFolder</ToString> <Props> <Obj N="Children" RefId="34"> <TNRef RefId="6" /> <LST> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> <S>PSModuleDevelopment.Template.TemplateItemFolder</S> <S>PSModuleDevelopment.Template.TemplateItemFolder</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">þnameþ</S> <S N="RelativePath">þnameþ</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="35"> <TNRef RefId="2" /> <LST> <S>name</S> </LST> </Obj> <Obj N="FileSystemParameterScript" RefId="36"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAL1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRm9sZGVyBgAAAAhDaGlsZHJlbgROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQDAQEBAwOeAVN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQIAAAAJAwAAAAYEAAAACMO+bmFtZcO+BgUAAAAIw75uYW1lw74GBgAAAALDvgkHAAAACQgAAAAEAwAAAJ4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAAC9QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2VbXQIAAAAICAkJAAAACgAAAAoAAAAEBwAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkKAAAAAQAAAAEAAAABCAAAAAcAAAAJCwAAAAAAAAAAAAAABwkAAAAAAQAAABAAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJDAAAAAkNAAAACQ4AAAAJDwAAAAkQAAAACREAAAAJEgAAAAkTAAAACRQAAAAJFQAAAA0GEQoAAAAEAAAABhYAAAAEbmFtZQ0DEQsAAAAAAAAAAQwAAAABAAAACRcAAAAGGAAAAANiaW4GGQAAAAzDvm5hbWXDvlxiaW4JBgAAAAkbAAAACRwAAAABDQAAAAEAAAAJHQAAAAYeAAAABWVuLXVzBh8AAAAOw75uYW1lw75cZW4tdXMJBgAAAAkhAAAACSIAAAABDgAAAAEAAAAJIwAAAAYkAAAACWZ1bmN0aW9ucwYlAAAAEsO+bmFtZcO+XGZ1bmN0aW9ucwkGAAAACScAAAAJKAAAAAEPAAAAAQAAAAkpAAAABioAAAAIaW50ZXJuYWwGKwAAABHDvm5hbWXDvlxpbnRlcm5hbAkGAAAACS0AAAAJLgAAAAEQAAAAAQAAAAkvAAAABjAAAAAFdGVzdHMGMQAAAA7Dvm5hbWXDvlx0ZXN0cwkGAAAACTMAAAAJNAAAAAERAAAAAQAAAAk1AAAABjYAAAADeG1sBjcAAAAMw75uYW1lw75ceG1sCQYAAAAJOQAAAAk6AAAABRIAAAAtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1GaWxlCQAAAAVWYWx1ZQlQbGFpblRleHQUQ29udGVudFBhcmFtZXRlckZsYXQWQ29udGVudFBhcmFtZXRlclNjcmlwdAROYW1lDFJlbGF0aXZlUGF0aApJZGVudGlmaWVyF0ZpbGVTeXN0ZW1QYXJhbWV0ZXJGbGF0GUZpbGVTeXN0ZW1QYXJhbWV0ZXJTY3JpcHQBAAMDAQEBAwMBf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0CAAAABjsAAABuIyBDaGFuZ2Vsb2cNCiMjIDEuMC4wICjDviFkeW5hbWljc2NyaXB0XzQ4NDk5MSHDvikNCiAtIE5ldzogU29tZSBTdHVmZg0KIC0gVXBkOiBNb2FyIFN0dWZmDQogLSBGaXg6IE11Y2ggU3R1ZmYBCTwAAAAJPQAAAAY+AAAADGNoYW5nZWxvZy5tZAY/AAAAFcO+bmFtZcO+XGNoYW5nZWxvZy5tZAkGAAAACUEAAAAJQgAAAAETAAAAEgAAAAZDAAAAjggjIFBTRk1vZHVsZSBndWlkYW5jZQ0KDQpUaGlzIGlzIGEgZmluaXNoZWQgbW9kdWxlIGxheW91dCBvcHRpbWl6ZWQgZm9yIGltcGxlbWVudGluZyB0aGUgUFNGcmFtZXdvcmsuDQoNCklmIHlvdSBkb24ndCBjYXJlIHRvIGRlYWwgd2l0aCB0aGUgZGV0YWlscywgdGhpcyBpcyB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIGdldCBzdGFydGVkIHNlZWluZyByZXN1bHRzOg0KDQogLSBBZGQgdGhlIGZ1bmN0aW9ucyB5b3Ugd2FudCB0byBwdWJsaXNoIHRvIGAvZnVuY3Rpb25zL2ANCiAtIFVwZGF0ZSB0aGUgYEZ1bmN0aW9uc1RvRXhwb3J0YCBub2RlIGluIHRoZSBtb2R1bGUgbWFuaWZlc3QgKMO+bmFtZcO+LnBzZDEpLiBBbGwgZnVuY3Rpb25zIHlvdSB3YW50IHRvIHB1Ymxpc2ggc2hvdWxkIGJlIGluIGEgbGlzdC4NCiAtIEFkZCBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIHRoZSB1c2VyIHNob3VsZCBub3Qgc2VlIHRvIGAvaW50ZXJuYWwvZnVuY3Rpb25zL2ANCiANCiAjIyBQYXRoIFdhcm5pbmcNCiANCiA+IElmIHlvdSB3YW50IHlvdXIgbW9kdWxlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBMaW51eCBhbmQgTWFjT1MsIGtlZXAgaW4gbWluZCB0aGF0IHRob3NlIE9TIGFyZSBjYXNlIHNlbnNpdGl2ZSBmb3IgcGF0aHMgYW5kIGZpbGVzLg0KIA0KIGBJbXBvcnQtTW9kdWxlRmlsZWAgaXMgcHJlY29uZmlndXJlZCB0byByZXNvbHZlIHRoZSBwYXRoIG9mIHRoZSBmaWxlcyBzcGVjaWZpZWQsIHNvIGl0IHdpbGwgcmVsaWFibHkgY29udmVydCB3ZWlyZCBwYXRoIG5vdGF0aW9ucyB0aGUgc3lzdGVtIGNhbid0IGhhbmRsZS4NCiBDb250ZW50IGltcG9ydGVkIHRocm91Z2ggdGhhdCBjb21tYW5kIHRodXMgbmVlZCBub3QgbWluZCB0aGUgcGF0aCBzZXBhcmF0b3IuDQogSWYgeW91IHdhbnQgdG8gbWFrZSBzdXJlIHlvdXIgY29kZSB0b28gd2lsbCBzdXJ2aXZlIE9TLXNwZWNpZmljIHBhdGggbm90YXRpb25zLCBnZXQgdXNlZCB0byB1c2luZyBgUmVzb2x2ZS1wYXRoYCBvciB0aGUgbW9yZSBwb3dlcmZ1bCBgUmVzb2x2ZS1QU0ZQYXRoYC4BCUQAAAAJRQAAAAZGAAAACXJlYWRtZS5tZAZHAAAAEsO+bmFtZcO+XHJlYWRtZS5tZAkGAAAACUkAAAAJSgAAAAEUAAAAEgAAAAZLAAAAphJAew0KCSMgU2NyaXB0IG1vZHVsZSBvciBiaW5hcnkgbW9kdWxlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFuaWZlc3QNCglSb290TW9kdWxlID0gJ8O+bmFtZcO+LnBzbTEnDQoJDQoJIyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIG1vZHVsZS4NCglNb2R1bGVWZXJzaW9uID0gJzEuMC4wJw0KCQ0KCSMgSUQgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIG1vZHVsZQ0KCUdVSUQgPSAnw74hZ3VpZCHDvicNCgkNCgkjIEF1dGhvciBvZiB0aGlzIG1vZHVsZQ0KCUF1dGhvciA9ICfDvmF1dGhvcsO+Jw0KCQ0KCSMgQ29tcGFueSBvciB2ZW5kb3Igb2YgdGhpcyBtb2R1bGUNCglDb21wYW55TmFtZSA9ICfDvmNvbXBhbnnDvicNCgkNCgkjIENvcHlyaWdodCBzdGF0ZW1lbnQgZm9yIHRoaXMgbW9kdWxlDQoJQ29weXJpZ2h0ID0gJ0NvcHlyaWdodCAoYykgw74heWVhciHDviDDvmF1dGhvcsO+Jw0KCQ0KCSMgRGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUNCglEZXNjcmlwdGlvbiA9ICfDvmRlc2NyaXB0aW9uw74nDQoJDQoJIyBNaW5pbXVtIHZlcnNpb24gb2YgdGhlIFdpbmRvd3MgUG93ZXJTaGVsbCBlbmdpbmUgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCglQb3dlclNoZWxsVmVyc2lvbiA9ICc1LjAnDQoJDQoJIyBNb2R1bGVzIHRoYXQgbXVzdCBiZSBpbXBvcnRlZCBpbnRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgcHJpb3IgdG8gaW1wb3J0aW5nDQoJIyB0aGlzIG1vZHVsZQ0KCVJlcXVpcmVkTW9kdWxlcyA9IEAoDQoJCUB7IE1vZHVsZU5hbWU9J1BTRnJhbWV3b3JrJzsgTW9kdWxlVmVyc2lvbj0nw74hcHNmcmFtZXdvcmshw74nIH0NCgkpDQoJDQoJIyBBc3NlbWJsaWVzIHRoYXQgbXVzdCBiZSBsb2FkZWQgcHJpb3IgdG8gaW1wb3J0aW5nIHRoaXMgbW9kdWxlDQoJIyBSZXF1aXJlZEFzc2VtYmxpZXMgPSBAKCdiaW5cw75uYW1lw74uZGxsJykNCgkNCgkjIFR5cGUgZmlsZXMgKC5wczF4bWwpIHRvIGJlIGxvYWRlZCB3aGVuIGltcG9ydGluZyB0aGlzIG1vZHVsZQ0KCSMgVHlwZXNUb1Byb2Nlc3MgPSBAKCd4bWxcw75uYW1lw74uVHlwZXMucHMxeG1sJykNCgkNCgkjIEZvcm1hdCBmaWxlcyAoLnBzMXhtbCkgdG8gYmUgbG9hZGVkIHdoZW4gaW1wb3J0aW5nIHRoaXMgbW9kdWxlDQoJIyBGb3JtYXRzVG9Qcm9jZXNzID0gQCgneG1sXMO+bmFtZcO+LkZvcm1hdC5wczF4bWwnKQ0KCQ0KCSMgRnVuY3Rpb25zIHRvIGV4cG9ydCBmcm9tIHRoaXMgbW9kdWxlDQoJRnVuY3Rpb25zVG9FeHBvcnQgPSAnJw0KCQ0KCSMgQ21kbGV0cyB0byBleHBvcnQgZnJvbSB0aGlzIG1vZHVsZQ0KCUNtZGxldHNUb0V4cG9ydCA9ICcnDQoJDQoJIyBWYXJpYWJsZXMgdG8gZXhwb3J0IGZyb20gdGhpcyBtb2R1bGUNCglWYXJpYWJsZXNUb0V4cG9ydCA9ICcnDQoJDQoJIyBBbGlhc2VzIHRvIGV4cG9ydCBmcm9tIHRoaXMgbW9kdWxlDQoJQWxpYXNlc1RvRXhwb3J0ID0gJycNCgkNCgkjIExpc3Qgb2YgYWxsIG1vZHVsZXMgcGFja2FnZWQgd2l0aCB0aGlzIG1vZHVsZQ0KCU1vZHVsZUxpc3QgPSBAKCkNCgkNCgkjIExpc3Qgb2YgYWxsIGZpbGVzIHBhY2thZ2VkIHdpdGggdGhpcyBtb2R1bGUNCglGaWxlTGlzdCA9IEAoKQ0KCQ0KCSMgUHJpdmF0ZSBkYXRhIHRvIHBhc3MgdG8gdGhlIG1vZHVsZSBzcGVjaWZpZWQgaW4gTW9kdWxlVG9Qcm9jZXNzLiBUaGlzIG1heSBhbHNvIGNvbnRhaW4gYSBQU0RhdGEgaGFzaHRhYmxlIHdpdGggYWRkaXRpb25hbCBtb2R1bGUgbWV0YWRhdGEgdXNlZCBieSBQb3dlclNoZWxsLg0KCVByaXZhdGVEYXRhID0gQHsNCgkJDQoJCSNTdXBwb3J0IGZvciBQb3dlclNoZWxsR2V0IGdhbGxlcmllcy4NCgkJUFNEYXRhID0gQHsNCgkJCQ0KCQkJIyBUYWdzIGFwcGxpZWQgdG8gdGhpcyBtb2R1bGUuIFRoZXNlIGhlbHAgd2l0aCBtb2R1bGUgZGlzY292ZXJ5IGluIG9ubGluZSBnYWxsZXJpZXMuDQoJCQkjIFRhZ3MgPSBAKCkNCgkJCQ0KCQkJIyBBIFVSTCB0byB0aGUgbGljZW5zZSBmb3IgdGhpcyBtb2R1bGUuDQoJCQkjIExpY2Vuc2VVcmkgPSAnJw0KCQkJDQoJCQkjIEEgVVJMIHRvIHRoZSBtYWluIHdlYnNpdGUgZm9yIHRoaXMgcHJvamVjdC4NCgkJCSMgUHJvamVjdFVyaSA9ICcnDQoJCQkNCgkJCSMgQSBVUkwgdG8gYW4gaWNvbiByZXByZXNlbnRpbmcgdGhpcyBtb2R1bGUuDQoJCQkjIEljb25VcmkgPSAnJw0KCQkJDQoJCQkjIFJlbGVhc2VOb3RlcyBvZiB0aGlzIG1vZHVsZQ0KCQkJIyBSZWxlYXNlTm90ZXMgPSAnJw0KCQkJDQoJCX0gIyBFbmQgb2YgUFNEYXRhIGhhc2h0YWJsZQ0KCQkNCgl9ICMgRW5kIG9mIFByaXZhdGVEYXRhIGhhc2h0YWJsZQ0KfQEJTAAAAAlNAAAABk4AAAANw75uYW1lw74ucHNkMQZPAAAAFsO+bmFtZcO+XMO+bmFtZcO+LnBzZDEJBgAAAAlRAAAACVIAAAABFQAAABIAAAAGUwAAANMYJHNjcmlwdDpNb2R1bGVSb290ID0gJFBTU2NyaXB0Um9vdA0KJHNjcmlwdDpNb2R1bGVWZXJzaW9uID0gKEltcG9ydC1Qb3dlclNoZWxsRGF0YUZpbGUgLVBhdGggIiQoJHNjcmlwdDpNb2R1bGVSb290KVzDvm5hbWXDvi5wc2QxIikuTW9kdWxlVmVyc2lvbg0KDQojIERldGVjdCB3aGV0aGVyIGF0IHNvbWUgbGV2ZWwgZG90c291cmNpbmcgd2FzIGVuZm9yY2VkDQokc2NyaXB0OmRvRG90U291cmNlID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSDDvm5hbWXDvi5JbXBvcnQuRG9Eb3RTb3VyY2UgLUZhbGxiYWNrICRmYWxzZQ0KaWYgKCTDvm5hbWXDvl9kb3Rzb3VyY2Vtb2R1bGUpIHsgJHNjcmlwdDpkb0RvdFNvdXJjZSA9ICR0cnVlIH0NCg0KPCMNCk5vdGUgb24gUmVzb2x2ZS1QYXRoOg0KQWxsIHBhdGhzIGFyZSBzZW50IHRocm91Z2ggUmVzb2x2ZS1QYXRoL1Jlc29sdmUtUFNGUGF0aCBpbiBvcmRlciB0byBjb252ZXJ0IHRoZW0gdG8gdGhlIGNvcnJlY3QgcGF0aCBzZXBhcmF0b3IuDQpUaGlzIGFsbG93cyBpZ25vcmluZyBwYXRoIHNlcGFyYXRvcnMgdGhyb3VnaG91dCB0aGUgaW1wb3J0IHNlcXVlbmNlLCB3aGljaCBjb3VsZCBvdGhlcndpc2UgY2F1c2UgdHJvdWJsZSBkZXBlbmRpbmcgb24gT1MuDQpSZXNvbHZlLVBhdGggY2FuIG9ubHkgYmUgdXNlZCBmb3IgcGF0aHMgdGhhdCBhbHJlYWR5IGV4aXN0LCBSZXNvbHZlLVBTRlBhdGggY2FuIGFjY2VwdCB0aGF0IHRoZSBsYXN0IGxlYWYgbXkgbm90IGV4aXN0Lg0KVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiB0ZXN0aW5nIGZvciBwYXRocy4NCiM+DQoNCiMgRGV0ZWN0IHdoZXRoZXIgYXQgc29tZSBsZXZlbCBsb2FkaW5nIGluZGl2aWR1YWwgbW9kdWxlIGZpbGVzLCByYXRoZXIgdGhhbiB0aGUgY29tcGlsZWQgbW9kdWxlIHdhcyBlbmZvcmNlZA0KJGltcG9ydEluZGl2aWR1YWxGaWxlcyA9IEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgw75uYW1lw74uSW1wb3J0LkluZGl2aWR1YWxGaWxlcyAtRmFsbGJhY2sgJGZhbHNlDQppZiAoJMO+bmFtZcO+X2ltcG9ydEluZGl2aWR1YWxGaWxlcykgeyAkaW1wb3J0SW5kaXZpZHVhbEZpbGVzID0gJHRydWUgfQ0KaWYgKFRlc3QtUGF0aCAoUmVzb2x2ZS1QU0ZQYXRoIC1QYXRoICIkKCRzY3JpcHQ6TW9kdWxlUm9vdClcLi5cLmdpdCIgLVNpbmdsZUl0ZW0gLU5ld0NoaWxkKSkgeyAkaW1wb3J0SW5kaXZpZHVhbEZpbGVzID0gJHRydWUgfQ0KaWYgKCI8d2FzIG5vdCBjb21waWxlZD4iIC1lcSAnPHdhcyBub3QgY29tcGlsZWQ+JykgeyAkaW1wb3J0SW5kaXZpZHVhbEZpbGVzID0gJHRydWUgfQ0KCQ0KZnVuY3Rpb24gSW1wb3J0LU1vZHVsZUZpbGUNCnsNCgk8Iw0KCQkuU1lOT1BTSVMNCgkJCUxvYWRzIGZpbGVzIGludG8gdGhlIG1vZHVsZSBvbiBtb2R1bGUgaW1wb3J0Lg0KCQkNCgkJLkRFU0NSSVBUSU9ODQoJCQlUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIGR1cmluZyBtb2R1bGUgaW5pdGlhbGl6YXRpb24uDQoJCQlJdCBzaG91bGQgYWx3YXlzIGJlIGRvdHNvdXJjZWQgaXRzZWxmLCBpbiBvcmRlciB0byBwcm9wZXIgZnVuY3Rpb24uDQoJCQkNCgkJCVRoaXMgcHJvdmlkZXMgYSBjZW50cmFsIGxvY2F0aW9uIHRvIHJlYWN0IHRvIGZpbGVzIGJlaW5nIGltcG9ydGVkLCBpZiBsYXRlciBkZXNpcmVkDQoJCQ0KCQkuUEFSQU1FVEVSIFBhdGgNCgkJCVRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGxvYWQNCgkJDQoJCS5FWEFNUExFDQoJCQlQUyBDOlw+IC4gSW1wb3J0LU1vZHVsZUZpbGUgLUZpbGUgJGZ1bmN0aW9uLkZ1bGxOYW1lDQoJDQoJCQlJbXBvcnRzIHRoZSBmaWxlIHN0b3JlZCBpbiAkZnVuY3Rpb24gYWNjb3JkaW5nIHRvIGltcG9ydCBwb2xpY3kNCgkjPg0KCVtDbWRsZXRCaW5kaW5nKCldDQoJUGFyYW0gKA0KCQlbc3RyaW5nXQ0KCQkkUGF0aA0KCSkNCgkNCgkkcmVzb2x2ZWRQYXRoID0gJEV4ZWN1dGlvbkNvbnRleHQuU2Vzc2lvblN0YXRlLlBhdGguR2V0UmVzb2x2ZWRQU1BhdGhGcm9tUFNQYXRoKCRQYXRoKS5Qcm92aWRlclBhdGgNCglpZiAoJGRvRG90U291cmNlKSB7IC4gJHJlc29sdmVkUGF0aCB9DQoJZWxzZSB7ICRFeGVjdXRpb25Db250ZXh0Lkludm9rZUNvbW1hbmQuSW52b2tlU2NyaXB0KCRmYWxzZSwgKFtzY3JpcHRibG9ja106OkNyZWF0ZShbaW8uZmlsZV06OlJlYWRBbGxUZXh0KCRyZXNvbHZlZFBhdGgpKSksICRudWxsLCAkbnVsbCkgfQ0KfQ0KDQojcmVnaW9uIExvYWQgaW5kaXZpZHVhbCBmaWxlcw0KaWYgKCRpbXBvcnRJbmRpdmlkdWFsRmlsZXMpDQp7DQoJIyBFeGVjdXRlIFByZWltcG9ydCBhY3Rpb25zDQoJZm9yZWFjaCAoJHBhdGggaW4gKCYgIiRNb2R1bGVSb290XGludGVybmFsXHNjcmlwdHNccHJlaW1wb3J0LnBzMSIpKSB7DQoJCS4gSW1wb3J0LU1vZHVsZUZpbGUgLVBhdGggJHBhdGgNCgl9DQoJDQoJIyBJbXBvcnQgYWxsIGludGVybmFsIGZ1bmN0aW9ucw0KCWZvcmVhY2ggKCRmdW5jdGlvbiBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcZnVuY3Rpb25zIiAtRmlsdGVyICIqLnBzMSIgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIElnbm9yZSkpDQoJew0KCQkuIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICRmdW5jdGlvbi5GdWxsTmFtZQ0KCX0NCgkNCgkjIEltcG9ydCBhbGwgcHVibGljIGZ1bmN0aW9ucw0KCWZvcmVhY2ggKCRmdW5jdGlvbiBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtRmlsdGVyICIqLnBzMSIgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIElnbm9yZSkpDQoJew0KCQkuIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICRmdW5jdGlvbi5GdWxsTmFtZQ0KCX0NCgkNCgkjIEV4ZWN1dGUgUG9zdGltcG9ydCBhY3Rpb25zDQoJZm9yZWFjaCAoJHBhdGggaW4gKCYgIiRNb2R1bGVSb290XGludGVybmFsXHNjcmlwdHNccG9zdGltcG9ydC5wczEiKSkgew0KCQkuIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICRwYXRoDQoJfQ0KCQ0KCSMgRW5kIGl0IGhlcmUsIGRvIG5vdCBsb2FkIGNvbXBpbGVkIGNvZGUgYmVsb3cNCglyZXR1cm4NCn0NCiNlbmRyZWdpb24gTG9hZCBpbmRpdmlkdWFsIGZpbGVzDQoNCiNyZWdpb24gTG9hZCBjb21waWxlZCBjb2RlDQoiPGNvbXBpbGUgY29kZSBpbnRvIGhlcmU+Ig0KI2VuZHJlZ2lvbiBMb2FkIGNvbXBpbGVkIGNvZGUBCVQAAAAJVQAAAAZWAAAADcO+bmFtZcO+LnBzbTEGVwAAABbDvm5hbWXDvlzDvm5hbWXDvi5wc20xCQYAAAAJWQAAAAlaAAAAARcAAAADAAAACVsAAAABAAAAAQAAAAEbAAAABwAAAAkLAAAAAAAAAAAAAAABHAAAAAcAAAAJCwAAAAAAAAAAAAAAAR0AAAADAAAACV0AAAACAAAAAgAAAAEhAAAABwAAAAkLAAAAAAAAAAAAAAABIgAAAAcAAAAJCwAAAAAAAAAAAAAAASMAAAADAAAACV8AAAABAAAAAQAAAAEnAAAABwAAAAkLAAAAAAAAAAAAAAABKAAAAAcAAAAJCwAAAAAAAAAAAAAAASkAAAADAAAACWEAAAAFAAAABQAAAAEtAAAABwAAAAkLAAAAAAAAAAAAAAABLgAAAAcAAAAJCwAAAAAAAAAAAAAAAS8AAAADAAAACWMAAAAEAAAABAAAAAEzAAAABwAAAAkLAAAAAAAAAAAAAAABNAAAAAcAAAAJCwAAAAAAAAAAAAAAATUAAAADAAAACWUAAAADAAAAAwAAAAE5AAAABwAAAAkLAAAAAAAAAAAAAAABOgAAAAcAAAAJCwAAAAAAAAAAAAAAATwAAAAHAAAACQsAAAAAAAAAAAAAAAE9AAAABwAAAAlnAAAAAQAAAAEAAAABQQAAAAcAAAAJCwAAAAAAAAAAAAAAAUIAAAAHAAAACQsAAAAAAAAAAAAAAAFEAAAABwAAAAlpAAAAAQAAAAEAAAABRQAAAAcAAAAJCwAAAAAAAAAAAAAAAUkAAAAHAAAACQsAAAAAAAAAAAAAAAFKAAAABwAAAAkLAAAAAAAAAAAAAAABTAAAAAcAAAAJawAAAAQAAAAEAAAAAU0AAAAHAAAACWwAAAADAAAAAwAAAAFRAAAABwAAAAltAAAAAQAAAAEAAAABUgAAAAcAAAAJCwAAAAAAAAAAAAAAAVQAAAAHAAAACW8AAAABAAAAAQAAAAFVAAAABwAAAAkLAAAAAAAAAAAAAAABWQAAAAcAAAAJcQAAAAEAAAABAAAAAVoAAAAHAAAACQsAAAAAAAAAAAAAAAdbAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACXMAAAANAwddAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACXQAAAAJdQAAAA0CB18AAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJdgAAAA0DB2EAAAAAAQAAAAgAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJdwAAAAl4AAAACXkAAAAJegAAAAl7AAAADQMHYwAAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAl8AAAACX0AAAAJfgAAAAl/AAAAB2UAAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJgAAAAAmBAAAACYIAAAAKEWcAAAAEAAAABoMAAAAUZHluYW1pY3NjcmlwdF80ODQ5OTENAxFpAAAABAAAAAaEAAAABG5hbWUNAxFrAAAABAAAAAaFAAAABG5hbWUGhgAAAAZhdXRob3IGhwAAAAdjb21wYW55BogAAAALZGVzY3JpcHRpb24RbAAAAAQAAAAGiQAAAARndWlkBooAAAAEeWVhcgaLAAAAC3BzZnJhbWV3b3JrChFtAAAABAAAAAaMAAAABG5hbWUNAxFvAAAABAAAAAaNAAAABG5hbWUNAxFxAAAABAAAAAaOAAAABG5hbWUNAwFzAAAAEgAAAAaPAAAA7gIjIGJpbiBmb2xkZXINCg0KVGhlIGJpbiBmb2xkZXIgZXhpc3RzIHRvIHN0b3JlIGJpbmFyeSBkYXRhLiBBbmQgc2NyaXB0cyByZWxhdGVkIHRvIHRoZSB0eXBlIHN5c3RlbS4NCg0KVGhpcyBtYXkgaW5jbHVkZSB5b3VyIG93biBDIy1iYXNlZCBsaWJyYXJ5LCB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgeW91IHdhbnQgdG8gaW5jbHVkZSAod2F0Y2ggdGhlIGxpY2Vuc2UhKSwgb3IgYSBzY3JpcHQgZGVjbGFyaW5nIHR5cGUgYWNjZWxlcmF0b3JzIChlZmZlY3RpdmVseSBhbGlhc2VzIGZvciAuTkVUIHR5cGVzKQ0KDQpGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBUeXBlIEFjY2VsZXJhdG9ycywgc2VlIHRoZSBoZWxwIG9uIFNldC1QU0ZUeXBlQWxpYXMBCZAAAAAJkQAAAAaSAAAACXJlYWRtZS5tZAaTAAAAFsO+bmFtZcO+XGJpblxyZWFkbWUubWQJBgAAAAmVAAAACZYAAAABdAAAABIAAAAGlwAAAKUBVE9QSUMNCglhYm91dF/Dvm5hbWXDvg0KCQ0KU0hPUlQgREVTQ1JJUFRJT04NCglFeHBsYWlucyBob3cgdG8gdXNlIHRoZSDDvm5hbWXDviBwb3dlcnNoZWxsIG1vZHVsZQ0KCQ0KTE9ORyBERVNDUklQVElPTg0KCTxJbnNlcnQgQ29udGVudCBoZXJlPg0KDQpLRVlXT1JEUw0KCcO+bmFtZcO+AQmYAAAACZkAAAAGmgAAABdhYm91dF/Dvm5hbWXDvi5oZWxwLnR4dAabAAAAJsO+bmFtZcO+XGVuLXVzXGFib3V0X8O+bmFtZcO+LmhlbHAudHh0CQYAAAAJnQAAAAmeAAAAAXUAAAASAAAABp8AAACdASMgVGhpcyBpcyB3aGVyZSB0aGUgc3RyaW5ncyBnbywgdGhhdCBhcmUgd3JpdHRlbiBieQ0KIyBXcml0ZS1QU0ZNZXNzYWdlLCBTdG9wLVBTRkZ1bmN0aW9uIG9yIHRoZSBQU0ZyYW1ld29yayB2YWxpZGF0aW9uIHNjcmlwdGJsb2Nrcw0KQHsNCgkna2V5JyA9ICdWYWx1ZScNCn0BCaAAAAAJoQAAAAaiAAAADHN0cmluZ3MucHNkMQajAAAAG8O+bmFtZcO+XGVuLXVzXHN0cmluZ3MucHNkMQkGAAAACaUAAAAJpgAAAAF2AAAAEgAAAAanAAAA0gEjIEZ1bmN0aW9ucw0KDQpUaGlzIGlzIHRoZSBmb2xkZXIgd2hlcmUgdGhlIGZ1bmN0aW9ucyBnby4NCg0KRGVwZW5kaW5nIG9uIHRoZSBjb21wbGV4aXR5IG9mIHRoZSBtb2R1bGUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN1YmRpdmlkZSB0aGVtIGludG8gc3ViZm9sZGVycy4NCg0KVGhlIG1vZHVsZSB3aWxsIHBpY2sgdXAgYWxsIC5wczEgZmlsZXMgcmVjdXJzaXZlbHkBCagAAAAJqQAAAAaqAAAACXJlYWRtZS5tZAarAAAAHMO+bmFtZcO+XGZ1bmN0aW9uc1xyZWFkbWUubWQJBgAAAAmtAAAACa4AAAABdwAAAAEAAAAJrwAAAAawAAAADmNvbmZpZ3VyYXRpb25zBrEAAAAgw75uYW1lw75caW50ZXJuYWxcY29uZmlndXJhdGlvbnMJBgAAAAmzAAAACbQAAAABeAAAAAEAAAAJtQAAAAa2AAAACWZ1bmN0aW9ucwa3AAAAG8O+bmFtZcO+XGludGVybmFsXGZ1bmN0aW9ucwkGAAAACbkAAAAJugAAAAF5AAAAAQAAAAm7AAAABrwAAAAMc2NyaXB0YmxvY2tzBr0AAAAew75uYW1lw75caW50ZXJuYWxcc2NyaXB0YmxvY2tzCQYAAAAJvwAAAAnAAAAAAXoAAAABAAAACcEAAAAGwgAAAAdzY3JpcHRzBsMAAAAZw75uYW1lw75caW50ZXJuYWxcc2NyaXB0cwkGAAAACcUAAAAJxgAAAAF7AAAAAQAAAAnHAAAABsgAAAAEdGVwcAbJAAAAFsO+bmFtZcO+XGludGVybmFsXHRlcHAJBgAAAAnLAAAACcwAAAABfAAAAAEAAAAJzQAAAAbOAAAACWZ1bmN0aW9ucwbPAAAAGMO+bmFtZcO+XHRlc3RzXGZ1bmN0aW9ucwkGAAAACdEAAAAJ0gAAAAF9AAAAAQAAAAnTAAAABtQAAAAHZ2VuZXJhbAbVAAAAFsO+bmFtZcO+XHRlc3RzXGdlbmVyYWwJBgAAAAnXAAAACdgAAAABfgAAABIAAAAG2QAAAKkbcGFyYW0gKA0KCSRUZXN0R2VuZXJhbCA9ICR0cnVlLA0KCQ0KCSRUZXN0RnVuY3Rpb25zID0gJHRydWUsDQoJDQoJW1ZhbGlkYXRlU2V0KCdOb25lJywgJ05vcm1hbCcsICdEZXRhaWxlZCcsICdEaWFnbm9zdGljJyldDQoJW0FsaWFzKCdTaG93JyldDQoJJE91dHB1dCA9ICJOb25lIiwNCgkNCgkkSW5jbHVkZSA9ICIqIiwNCgkNCgkkRXhjbHVkZSA9ICIiDQopDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiU3RhcnRpbmcgVGVzdHMiDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiSW1wb3J0aW5nIE1vZHVsZSINCg0KJGdsb2JhbDp0ZXN0cm9vdCA9ICRQU1NjcmlwdFJvb3QNCiRnbG9iYWw6X19wZXN0ZXJfZGF0YSA9IEB7IH0NCg0KUmVtb3ZlLU1vZHVsZSDDvm5hbWXDviAtRXJyb3JBY3Rpb24gSWdub3JlDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzZDEiDQpJbXBvcnQtTW9kdWxlICIkUFNTY3JpcHRSb290XC4uXMO+bmFtZcO+LnBzbTEiIC1Gb3JjZQ0KDQojIE5lZWQgdG8gaW1wb3J0IGV4cGxpY2l0bHkgc28gd2UgY2FuIHVzZSB0aGUgY29uZmlndXJhdGlvbiBjbGFzcw0KSW1wb3J0LU1vZHVsZSBQZXN0ZXINCg0Kw74hdGVzdGZvbGRlciHDvg0KDQokdG90YWxGYWlsZWQgPSAwDQokdG90YWxSdW4gPSAwDQoNCiR0ZXN0cmVzdWx0cyA9IEAoKQ0KJGNvbmZpZyA9IFtQZXN0ZXJDb25maWd1cmF0aW9uXTo6RGVmYXVsdA0Kw74hcGVzdGVyY29uZmlnIcO+DQoNCiNyZWdpb24gUnVuIEdlbmVyYWwgVGVzdHMNCmlmICgkVGVzdEdlbmVyYWwpDQp7DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJNb2R1bGVzIGltcG9ydGVkLCBwcm9jZWVkaW5nIHdpdGggZ2VuZXJhbCB0ZXN0cyINCglmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxnZW5lcmFsIiB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLlRlc3RzLnBzMSIpKQ0KCXsNCgkJaWYgKCRmaWxlLk5hbWUgLW5vdGxpa2UgJEluY2x1ZGUpIHsgY29udGludWUgfQ0KCQlpZiAoJGZpbGUuTmFtZSAtbGlrZSAkRXhjbHVkZSkgeyBjb250aW51ZSB9DQoNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nIDxjPSdlbSc+JCgkZmlsZS5OYW1lKTwvYz4iDQoJCSRjb25maWcuVGVzdFJlc3VsdC5PdXRwdXRQYXRoID0gSm9pbi1QYXRoICIkUFNTY3JpcHRSb290XC4uXC4uXFRlc3RSZXN1bHRzIiAiVEVTVC0kKCRmaWxlLkJhc2VOYW1lKS54bWwiDQoJCSRjb25maWcuUnVuLlBhdGggPSAkZmlsZS5GdWxsTmFtZQ0KCQkkY29uZmlnLlJ1bi5QYXNzVGhydSA9ICR0cnVlDQoJCSRjb25maWcuT3V0cHV0LlZlcmJvc2l0eSA9ICRPdXRwdXQNCiAgICAJJHJlc3VsdHMgPSBJbnZva2UtUGVzdGVyIC1Db25maWd1cmF0aW9uICRjb25maWcNCgkJZm9yZWFjaCAoJHJlc3VsdCBpbiAkcmVzdWx0cykNCgkJew0KCQkJJHRvdGFsUnVuICs9ICRyZXN1bHQuVG90YWxDb3VudA0KCQkJJHRvdGFsRmFpbGVkICs9ICRyZXN1bHQuRmFpbGVkQ291bnQNCgkJCSRyZXN1bHQuVGVzdHMgfCBXaGVyZS1PYmplY3QgUmVzdWx0IC1uZSAnUGFzc2VkJyB8IEZvckVhY2gtT2JqZWN0IHsNCgkJCQkkdGVzdHJlc3VsdHMgKz0gW3BzY3VzdG9tb2JqZWN0XUB7DQoJCQkJCUJsb2NrICAgID0gJF8uQmxvY2sNCgkJCQkJTmFtZQkgPSAiSXQgJCgkXy5OYW1lKSINCgkJCQkJUmVzdWx0ICAgPSAkXy5SZXN1bHQNCgkJCQkJTWVzc2FnZSAgPSAkXy5FcnJvclJlY29yZC5EaXNwbGF5RXJyb3JNZXNzYWdlDQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KI2VuZHJlZ2lvbiBSdW4gR2VuZXJhbCBUZXN0cw0KDQokZ2xvYmFsOl9fcGVzdGVyX2RhdGEuU2NyaXB0QW5hbHl6ZXIgfCBPdXQtSG9zdA0KDQojcmVnaW9uIFRlc3QgQ29tbWFuZHMNCmlmICgkVGVzdEZ1bmN0aW9ucykNCnsNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIlByb2NlZWRpbmcgd2l0aCBpbmRpdmlkdWFsIHRlc3RzIg0KCWZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtICIkUFNTY3JpcHRSb290XGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKlRlc3RzLnBzMSIpKQ0KCXsNCgkJaWYgKCRmaWxlLk5hbWUgLW5vdGxpa2UgJEluY2x1ZGUpIHsgY29udGludWUgfQ0KCQlpZiAoJGZpbGUuTmFtZSAtbGlrZSAkRXhjbHVkZSkgeyBjb250aW51ZSB9DQoJCQ0KCQlXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBTaWduaWZpY2FudCAtTWVzc2FnZSAiICBFeGVjdXRpbmcgJCgkZmlsZS5OYW1lKSINCgkJJGNvbmZpZy5UZXN0UmVzdWx0Lk91dHB1dFBhdGggPSBKb2luLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cLi5cVGVzdFJlc3VsdHMiICJURVNULSQoJGZpbGUuQmFzZU5hbWUpLnhtbCINCgkJJGNvbmZpZy5SdW4uUGF0aCA9ICRmaWxlLkZ1bGxOYW1lDQoJCSRjb25maWcuUnVuLlBhc3NUaHJ1ID0gJHRydWUNCgkJJGNvbmZpZy5PdXRwdXQuVmVyYm9zaXR5ID0gJE91dHB1dA0KICAgIAkkcmVzdWx0cyA9IEludm9rZS1QZXN0ZXIgLUNvbmZpZ3VyYXRpb24gJGNvbmZpZw0KCQlmb3JlYWNoICgkcmVzdWx0IGluICRyZXN1bHRzKQ0KCQl7DQoJCQkkdG90YWxSdW4gKz0gJHJlc3VsdC5Ub3RhbENvdW50DQoJCQkkdG90YWxGYWlsZWQgKz0gJHJlc3VsdC5GYWlsZWRDb3VudA0KCQkJJHJlc3VsdC5UZXN0cyB8IFdoZXJlLU9iamVjdCBSZXN1bHQgLW5lICdQYXNzZWQnIHwgRm9yRWFjaC1PYmplY3Qgew0KCQkJCSR0ZXN0cmVzdWx0cyArPSBbcHNjdXN0b21vYmplY3RdQHsNCgkJCQkJQmxvY2sgICAgPSAkXy5CbG9jaw0KCQkJCQlOYW1lCSA9ICJJdCAkKCRfLk5hbWUpIg0KCQkJCQlSZXN1bHQgICA9ICRfLlJlc3VsdA0KCQkJCQlNZXNzYWdlICA9ICRfLkVycm9yUmVjb3JkLkRpc3BsYXlFcnJvck1lc3NhZ2UNCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9DQojZW5kcmVnaW9uIFRlc3QgQ29tbWFuZHMNCg0KJHRlc3RyZXN1bHRzIHwgU29ydC1PYmplY3QgRGVzY3JpYmUsIENvbnRleHQsIE5hbWUsIFJlc3VsdCwgTWVzc2FnZSB8IEZvcm1hdC1MaXN0DQoNCmlmICgkdG90YWxGYWlsZWQgLWVxIDApIHsgV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgQ3JpdGljYWwgLU1lc3NhZ2UgIkFsbCA8Yz0nZW0nPiR0b3RhbFJ1bjwvYz4gdGVzdHMgZXhlY3V0ZWQgd2l0aG91dCBhIHNpbmdsZSBmYWlsdXJlISIgfQ0KZWxzZSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIENyaXRpY2FsIC1NZXNzYWdlICI8Yz0nZW0nPiR0b3RhbEZhaWxlZCB0ZXN0czwvYz4gb3V0IG9mIDxjPSdzdWInPiR0b3RhbFJ1bjwvYz4gdGVzdHMgZmFpbGVkISIgfQ0KDQppZiAoJHRvdGFsRmFpbGVkIC1ndCAwKQ0Kew0KCXRocm93ICIkdG90YWxGYWlsZWQgLyAkdG90YWxSdW4gdGVzdHMgZmFpbGVkISINCn0BCdoAAAAJ2wAAAAbcAAAACnBlc3Rlci5wczEG3QAAABnDvm5hbWXDvlx0ZXN0c1xwZXN0ZXIucHMxCQYAAAAJ3wAAAAngAAAAAX8AAAASAAAABuEAAACiByMgRGVzY3JpcHRpb24NCg0KVGhpcyBpcyB0aGUgZm9sZGVyLCB3aGVyZSBhbGwgdGhlIHRlc3RzIGdvLg0KDQpUaG9zZSBhcmUgc3ViZGl2aWRlZCBpbiB0d28gY2F0ZWdvcmllczoNCg0KIC0gR2VuZXJhbA0KIC0gRnVuY3Rpb24NCg0KIyMgR2VuZXJhbCBUZXN0cw0KDQpHZW5lcmFsIHRlc3RzIGFyZSBmdW5jdGlvbiBnZW5lcmljIGFuZCB0ZXN0IGZvciBnZW5lcmFsIHBvbGljaWVzLg0KDQpUaGVzZSB0ZXN0IHNjYW4gYW5zd2VyIHF1ZXN0aW9ucyBzdWNoIGFzOg0KDQogLSBJcyBteSBtb2R1bGUgZm9sbG93aW5nIG15IHN0eWxlIGd1aWRlcz8NCiAtIERvZXMgYW55IG9mIG15IHNjcmlwdHMgaGF2ZSBhIHN5bnRheCBlcnJvcj8NCiAtIERvIG15IHNjcmlwdHMgdXNlIGNvbW1hbmRzIEkgZG8gbm90IHdhbnQgdGhlbSB0byB1c2U/DQogLSBEbyBteSBjb21tYW5kcyBmb2xsb3cgYmVzdCBwcmFjdGljZXM/DQogLSBEbyBteSBjb21tYW5kcyBoYXZlIHByb3BlciBoZWxwPw0KDQpCYXNpY2FsbHksIHRoZXNlIGFsbG93IGEgZ2VuZXJhbCBtb2R1bGUgaGVhbHRoIGNoZWNrLg0KDQpUaGVzZSB0ZXN0cyBhcmUgYWxyZWFkeSBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZS4NCg0KIyMgRnVuY3Rpb24gVGVzdHMNCg0KQSBoZWFsdGh5IG1vZHVsZSBzaG91bGQgcHJvdmlkZSB1bml0IGFuZCBpbnRlZ3JhdGlvbiB0ZXN0cyBmb3IgdGhlIGNvbW1hbmRzICYgY29tcG9uZW50cyBpdCBzaGlwcy4NCk9ubHkgdGhlbiBjYW4gYmUgZ3VhcmFudGVlZCwgdGhhdCB0aGV5IHdpbGwgYWN0dWFsbHkgcGVyZm9ybSBhcyBwcm9taXNlZC4NCg0KSG93ZXZlciwgYXMgZWFjaCBzdWNoIHRlc3QgbXVzdCBiZSBzcGVjaWZpYyB0byB0aGUgZnVuY3Rpb24gaXQgdGVzdHMsIHRoZXJlIGNhbm5vdCBiZSBtdWNoIGluIHRoZSB3YXkgb2YgdGVtcGxhdGVzLgEJ4gAAAAnjAAAABuQAAAAJcmVhZG1lLm1kBuUAAAAYw75uYW1lw75cdGVzdHNccmVhZG1lLm1kCQYAAAAJ5wAAAAnoAAAAAYAAAAASAAAABukAAACsCyMgWE1MDQoNClRoaXMgaXMgdGhlIGZvbGRlciB3aGVyZSBwcm9qZWN0IFhNTCBmaWxlcyBnbywgbm90YWJseToNCg0KIC0gRm9ybWF0IFhNTA0KIC0gVHlwZSBFeHRlbnNpb24gWE1MDQoNCkV4dGVybmFsIGhlbHAgZmlsZXMgc2hvdWxkIF9ub3RfIGJlIHBsYWNlZCBpbiB0aGlzIGZvbGRlciENCg0KIyMgTm90ZXMgb24gRmlsZXMgYW5kIE5hbWluZw0KDQpUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgZm9ybWF0IGZpbGUgYW5kIG9uZSB0eXBlIGV4dGVuc2lvbiBmaWxlIHBlciBwcm9qZWN0LCBhcyBpbXBvcnRpbmcgdGhlbSBoYXMgYSBub3RhYmxlIGltcGFjdCBvbiBpbXBvcnQgdGltZXMuDQoNCiAtIFRoZSBGb3JtYXQgWE1MIHNob3VsZCBiZSBuYW1lZCBgw75uYW1lw74uRm9ybWF0LnBzMXhtbGANCiAtIFRoZSBUeXBlIEV4dGVuc2lvbiBYTUwgc2hvdWxkIGJlIG5hbWVkIGDDvm5hbWXDvi5UeXBlcy5wczF4bWxgDQoNCiMjIFRvb2xzDQoNCiMjIyBOZXctUFNNREZvcm1hdFRhYmxlRGVmaW5pdGlvbg0KDQpUaGlzIGZ1bmN0aW9uIHdpbGwgdGFrZSBhbiBpbnB1dCBvYmplY3QgYW5kIGdlbmVyYXRlIGZvcm1hdCB4bWwgZm9yIGFuIGF1dG8tc2l6ZWQgdGFibGUuDQoNCkl0IHByb3ZpZGVzIGEgc2ltcGxlIHdheSB0byBnZXQgc3RhcnRlZCB3aXRoIGZvcm1hdHMuDQoNCiMjIyBHZXQtUFNGVHlwZVNlcmlhbGl6YXRpb25EYXRhDQoNCmBgYA0KQyMgV2FybmluZyENClRoaXMgc2VjdGlvbiBpcyBvbmx5IGludGVyZXN0IGlmIHlvdSdyZSB1c2luZyBDIyB0b2dldGhlciB3aXRoIFBvd2VyU2hlbGwuDQpgYGANCg0KVGhpcyBmdW5jdGlvbiBnZW5lcmF0ZXMgdHlwZSBleHRlbnNpb24gWE1MIHRoYXQgYWxsb3dzIFBvd2VyU2hlbGwgdG8gY29udmVydCB0eXBlcyB3cml0dGVuIGluIEMjIHRvIGJlIHdyaXR0ZW4gdG8gZmlsZSBhbmQgcmVzdG9yZWQgZnJvbSBpdCB3aXRob3V0IGJlaW5nICdEZXNlcmlhbGl6ZWQnLiBBbHNvIHdvcmtzIGZvciBqb2JzIG9yIHJlbW90aW5nLCBpZiBib3RoIHNpZGVzIGhhdmUgdGhlIGBQU0ZyYW1ld29ya2AgbW9kdWxlIGFuZCB0eXBlIGV4dGVuc2lvbiBsb2FkZWQuDQoNCkluIG9yZGVyIGZvciBhIGNsYXNzIHRvIGJlIGVsaWdpYmxlIGZvciB0aGlzLCBpdCBuZWVkcyB0byBjb25mb3JtIHRvIHRoZSBmb2xsb3dpbmcgcnVsZXM6DQoNCiAtIEhhdmUgdGhlIGBbU2VyaWFsaXphYmxlXWAgYXR0cmlidXRlDQogLSBCZSBwdWJsaWMNCiAtIEhhdmUgYW4gZW1wdHkgY29uc3RydWN0b3INCiAtIEFsbG93IGFsbCBwdWJsaWMgcHJvcGVydGllcy9maWVsZHMgdG8gYmUgc2V0IChldmVuIGlmIHNldHRpbmcgaXQgZG9lc24ndCBkbyBhbnl0aGluZykgd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24uDQoNCmBgYA0Kbm9uLXB1YmxpYyBwcm9wZXJ0aWVzIGFuZCBmaWVsZHMgd2lsbCBiZSBsb3N0IGluIHRoaXMgcHJvY2VzcyENCmBgYAEJ6gAAAAnrAAAABuwAAAAJcmVhZG1lLm1kBu0AAAAWw75uYW1lw75ceG1sXHJlYWRtZS5tZAkGAAAACe8AAAAJ8AAAAAGBAAAAEgAAAAbxAAAA6AU8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtMTYiPz4NCjxDb25maWd1cmF0aW9uPg0KCTxWaWV3RGVmaW5pdGlvbnM+DQoJCTwhLS0gRm9vLkJhciAtLT4NCgkJPFZpZXc+DQoJCQk8TmFtZT5Gb28uQmFyPC9OYW1lPg0KCQkJPFZpZXdTZWxlY3RlZEJ5Pg0KCQkJCTxUeXBlTmFtZT5Gb28uQmFyPC9UeXBlTmFtZT4NCgkJCTwvVmlld1NlbGVjdGVkQnk+DQoJCQk8VGFibGVDb250cm9sPg0KCQkJCTxBdXRvU2l6ZS8+DQoJCQkJPFRhYmxlSGVhZGVycz4NCgkJCQkJPFRhYmxlQ29sdW1uSGVhZGVyLz4NCgkJCQkJPFRhYmxlQ29sdW1uSGVhZGVyLz4NCgkJCQk8L1RhYmxlSGVhZGVycz4NCgkJCQk8VGFibGVSb3dFbnRyaWVzPg0KCQkJCQk8VGFibGVSb3dFbnRyeT4NCgkJCQkJCTxUYWJsZUNvbHVtbkl0ZW1zPg0KCQkJCQkJCTxUYWJsZUNvbHVtbkl0ZW0+DQoJCQkJCQkJCTxQcm9wZXJ0eU5hbWU+Rm9vPC9Qcm9wZXJ0eU5hbWU+DQoJCQkJCQkJPC9UYWJsZUNvbHVtbkl0ZW0+DQoJCQkJCQkJPFRhYmxlQ29sdW1uSXRlbT4NCgkJCQkJCQkJPFByb3BlcnR5TmFtZT5CYXI8L1Byb3BlcnR5TmFtZT4NCgkJCQkJCQk8L1RhYmxlQ29sdW1uSXRlbT4NCgkJCQkJCTwvVGFibGVDb2x1bW5JdGVtcz4NCgkJCQkJPC9UYWJsZVJvd0VudHJ5Pg0KCQkJCTwvVGFibGVSb3dFbnRyaWVzPg0KCQkJPC9UYWJsZUNvbnRyb2w+DQoJCTwvVmlldz4NCgk8L1ZpZXdEZWZpbml0aW9ucz4NCjwvQ29uZmlndXJhdGlvbj4BCfIAAAAJ8wAAAAb0AAAAFsO+bmFtZcO+LkZvcm1hdC5wczF4bWwG9QAAACPDvm5hbWXDvlx4bWxcw75uYW1lw74uRm9ybWF0LnBzMXhtbAkGAAAACfcAAAAJ+AAAAAGCAAAAEgAAAAb5AAAA4Ac8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KPFR5cGVzPg0KICA8IS0tIEZvby5CYXIgLS0+DQogIDxUeXBlPg0KICAgIDxOYW1lPkRlc2VyaWFsaXplZC5Gb28uQmFyPC9OYW1lPg0KICAgIDxNZW1iZXJzPg0KICAgICAgPE1lbWJlclNldD4NCiAgICAgICAgPE5hbWU+UFNTdGFuZGFyZE1lbWJlcnM8L05hbWU+DQogICAgICAgIDxNZW1iZXJzPg0KICAgICAgICAgIDxOb3RlUHJvcGVydHk+DQogICAgICAgICAgICA8TmFtZT4NCiAgICAgICAgICAgICAgVGFyZ2V0VHlwZUZvckRlc2VyaWFsaXphdGlvbg0KICAgICAgICAgICAgPC9OYW1lPg0KICAgICAgICAgICAgPFZhbHVlPg0KICAgICAgICAgICAgICBGb28uQmFyDQogICAgICAgICAgICA8L1ZhbHVlPg0KICAgICAgICAgIDwvTm90ZVByb3BlcnR5Pg0KICAgICAgICA8L01lbWJlcnM+DQogICAgICA8L01lbWJlclNldD4NCiAgICA8L01lbWJlcnM+DQogIDwvVHlwZT4NCiAgPFR5cGU+DQogICAgPE5hbWU+Rm9vLkJhcjwvTmFtZT4NCiAgICA8TWVtYmVycz4NCiAgICAgIDxDb2RlUHJvcGVydHkgSXNIaWRkZW49InRydWUiPg0KICAgICAgICA8TmFtZT5TZXJpYWxpemF0aW9uRGF0YTwvTmFtZT4NCiAgICAgICAgPEdldENvZGVSZWZlcmVuY2U+DQogICAgICAgICAgPFR5cGVOYW1lPlBTRnJhbWV3b3JrLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblR5cGVDb252ZXJ0ZXI8L1R5cGVOYW1lPg0KICAgICAgICAgIDxNZXRob2ROYW1lPkdldFNlcmlhbGl6YXRpb25EYXRhPC9NZXRob2ROYW1lPg0KICAgICAgICA8L0dldENvZGVSZWZlcmVuY2U+DQogICAgICA8L0NvZGVQcm9wZXJ0eT4NCiAgICA8L01lbWJlcnM+DQogICAgPFR5cGVDb252ZXJ0ZXI+DQogICAgICA8VHlwZU5hbWU+UFNGcmFtZXdvcmsuU2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uVHlwZUNvbnZlcnRlcjwvVHlwZU5hbWU+DQogICAgPC9UeXBlQ29udmVydGVyPg0KICA8L1R5cGU+DQo8L1R5cGVzPgEJ+gAAAAn7AAAABvwAAAAVw75uYW1lw74uVHlwZXMucHMxeG1sBv0AAAAiw75uYW1lw75ceG1sXMO+bmFtZcO+LlR5cGVzLnBzMXhtbAkGAAAACf8AAAAJAAEAAAGQAAAABwAAAAkLAAAAAAAAAAAAAAABkQAAAAcAAAAJCwAAAAAAAAAAAAAAAZUAAAAHAAAACQsAAAAAAAAAAAAAAAGWAAAABwAAAAkLAAAAAAAAAAAAAAABmAAAAAcAAAAJAgEAAAEAAAABAAAAAZkAAAAHAAAACQsAAAAAAAAAAAAAAAGdAAAABwAAAAkEAQAAAQAAAAEAAAABngAAAAcAAAAJCwAAAAAAAAAAAAAAAaAAAAAHAAAACQsAAAAAAAAAAAAAAAGhAAAABwAAAAkLAAAAAAAAAAAAAAABpQAAAAcAAAAJCwAAAAAAAAAAAAAAAaYAAAAHAAAACQsAAAAAAAAAAAAAAAGoAAAABwAAAAkLAAAAAAAAAAAAAAABqQAAAAcAAAAJCwAAAAAAAAAAAAAAAa0AAAAHAAAACQsAAAAAAAAAAAAAAAGuAAAABwAAAAkLAAAAAAAAAAAAAAABrwAAAAMAAAAJBgEAAAIAAAACAAAAAbMAAAAHAAAACQsAAAAAAAAAAAAAAAG0AAAABwAAAAkLAAAAAAAAAAAAAAABtQAAAAMAAAAJCAEAAAEAAAABAAAAAbkAAAAHAAAACQsAAAAAAAAAAAAAAAG6AAAABwAAAAkLAAAAAAAAAAAAAAABuwAAAAMAAAAJCgEAAAEAAAABAAAAAb8AAAAHAAAACQsAAAAAAAAAAAAAAAHAAAAABwAAAAkLAAAAAAAAAAAAAAABwQAAAAMAAAAJDAEAAAQAAAAEAAAAAcUAAAAHAAAACQsAAAAAAAAAAAAAAAHGAAAABwAAAAkLAAAAAAAAAAAAAAABxwAAAAMAAAAJDgEAAAMAAAADAAAAAcsAAAAHAAAACQsAAAAAAAAAAAAAAAHMAAAABwAAAAkLAAAAAAAAAAAAAAABzQAAAAMAAAAJEAEAAAEAAAABAAAAAdEAAAAHAAAACQsAAAAAAAAAAAAAAAHSAAAABwAAAAkLAAAAAAAAAAAAAAAB0wAAAAMAAAAJEgEAAAgAAAAIAAAAAdcAAAAHAAAACQsAAAAAAAAAAAAAAAHYAAAABwAAAAkLAAAAAAAAAAAAAAAB2gAAAAcAAAAJFAEAAAEAAAABAAAAAdsAAAAHAAAACRUBAAACAAAAAgAAAAHfAAAABwAAAAkLAAAAAAAAAAAAAAAB4AAAAAcAAAAJCwAAAAAAAAAAAAAAAeIAAAAHAAAACQsAAAAAAAAAAAAAAAHjAAAABwAAAAkLAAAAAAAAAAAAAAAB5wAAAAcAAAAJCwAAAAAAAAAAAAAAAegAAAAHAAAACQsAAAAAAAAAAAAAAAHqAAAABwAAAAkXAQAAAQAAAAEAAAAB6wAAAAcAAAAJCwAAAAAAAAAAAAAAAe8AAAAHAAAACQsAAAAAAAAAAAAAAAHwAAAABwAAAAkLAAAAAAAAAAAAAAAB8gAAAAcAAAAJCwAAAAAAAAAAAAAAAfMAAAAHAAAACQsAAAAAAAAAAAAAAAH3AAAABwAAAAkZAQAAAQAAAAEAAAAB+AAAAAcAAAAJCwAAAAAAAAAAAAAAAfoAAAAHAAAACQsAAAAAAAAAAAAAAAH7AAAABwAAAAkLAAAAAAAAAAAAAAAB/wAAAAcAAAAJGwEAAAEAAAABAAAAAQABAAAHAAAACQsAAAAAAAAAAAAAABECAQAABAAAAAYdAQAABG5hbWUNAxEEAQAABAAAAAYeAQAABG5hbWUNAwcGAQAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACR8BAAAJIAEAAA0CBwgBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJIQEAAA0DBwoBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJIgEAAA0DBwwBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJIwEAAAkkAQAACSUBAAAJJgEAAAcOAQAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACScBAAAJKAEAAAkpAQAACgcQAQAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACSoBAAANAwcSAQAAAAEAAAAIAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACSsBAAAJLAEAAAktAQAACS4BAAAJLwEAAAkwAQAACTEBAAAJMgEAABEUAQAABAAAAAYzAQAABG5hbWUNAxEVAQAABAAAAAY0AQAACnRlc3Rmb2xkZXIGNQEAAAxwZXN0ZXJjb25maWcNAhEXAQAABAAAAAY2AQAABG5hbWUNAxEZAQAABAAAAAY3AQAABG5hbWUNAxEbAQAABAAAAAY4AQAABG5hbWUNAwEfAQAAEgAAAAY5AQAAwAk8Iw0KVGhpcyBpcyBhbiBleGFtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZQ0KDQpCeSBkZWZhdWx0LCBpdCBpcyBlbm91Z2ggdG8gaGF2ZSBhIHNpbmdsZSBvbmUgb2YgdGhlbSwNCmhvd2V2ZXIgaWYgeW91IGhhdmUgZW5vdWdoIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgdG8ganVzdGlmeSBoYXZpbmcgbXVsdGlwbGUgY29waWVzIG9mIGl0LA0KZmVlbCB0b3RhbGx5IGZyZWUgdG8gc3BsaXQgdGhlbSBpbnRvIG11bHRpcGxlIGZpbGVzLg0KIz4NCg0KPCMNCiMgRXhhbXBsZSBDb25maWd1cmF0aW9uDQpTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgJ8O+bmFtZcO+JyAtTmFtZSAnRXhhbXBsZS5TZXR0aW5nJyAtVmFsdWUgMTAgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gJ2ludGVnZXInIC1IYW5kbGVyIHsgfSAtRGVzY3JpcHRpb24gIkV4YW1wbGUgY29uZmlndXJhdGlvbiBzZXR0aW5nLiBZb3VyIG1vZHVsZSBjYW4gdGhlbiB1c2UgdGhlIHNldHRpbmcgdXNpbmcgJ0dldC1QU0ZDb25maWdWYWx1ZSciDQojPg0KDQpTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgJ8O+bmFtZcO+JyAtTmFtZSAnSW1wb3J0LkRvRG90U291cmNlJyAtVmFsdWUgJGZhbHNlIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICdib29sJyAtRGVzY3JpcHRpb24gIldoZXRoZXIgdGhlIG1vZHVsZSBmaWxlcyBzaG91bGQgYmUgZG90c291cmNlZCBvbiBpbXBvcnQuIEJ5IGRlZmF1bHQsIHRoZSBmaWxlcyBvZiB0aGlzIG1vZHVsZSBhcmUgcmVhZCBhcyBzdHJpbmcgdmFsdWUgYW5kIGludm9rZWQsIHdoaWNoIGlzIGZhc3RlciBidXQgd29yc2Ugb24gZGVidWdnaW5nLiINClNldC1QU0ZDb25maWcgLU1vZHVsZSAnw75uYW1lw74nIC1OYW1lICdJbXBvcnQuSW5kaXZpZHVhbEZpbGVzJyAtVmFsdWUgJGZhbHNlIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICdib29sJyAtRGVzY3JpcHRpb24gIldoZXRoZXIgdGhlIG1vZHVsZSBmaWxlcyBzaG91bGQgYmUgaW1wb3J0ZWQgaW5kaXZpZHVhbGx5LiBEdXJpbmcgdGhlIG1vZHVsZSBidWlsZCwgYWxsIG1vZHVsZSBjb2RlIGlzIGNvbXBpbGVkIGludG8gZmV3IGZpbGVzLCB3aGljaCBhcmUgaW1wb3J0ZWQgaW5zdGVhZCBieSBkZWZhdWx0LiBMb2FkaW5nIHRoZSBjb21waWxlZCB2ZXJzaW9ucyBpcyBmYXN0ZXIsIHVzaW5nIHRoZSBpbmRpdmlkdWFsIGZpbGVzIGlzIGVhc2llciBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nIG91dCBhZGp1c3RtZW50cy4iAQk6AQAACTsBAAAGPAEAABFjb25maWd1cmF0aW9uLnBzMQY9AQAAMsO+bmFtZcO+XGludGVybmFsXGNvbmZpZ3VyYXRpb25zXGNvbmZpZ3VyYXRpb24ucHMxCQYAAAAJPwEAAAlAAQAAASABAAASAAAABkEBAAD+AyMgQ29uZmlndXJhdGlvbnMNCg0KVGhyb3VnaCB0aGUgYFBTRnJhbWV3b3JrYCB5b3UgaGF2ZSBhIHNpbXBsZSBtZXRob2QgdGhhdCBhbGxvd3MgeW91IHRvIC4uLg0KDQogLSBQdWJsaXNoIHNldHRpbmdzDQogLSBXaXRoIG9uYm9hcmQgZG9jdW1lbnRhdGlvbg0KIC0gSW5wdXQgdmFsaWRhdGlvbg0KIC0gU2NyaXB0cyB0aGF0IHJ1biBvbiBjaGFuZ2Ugb2Ygc2V0dGluZ3MNCiAtIFRoYXQgY2FuIGJlIGRpc2NvdmVyZWQgYW5kIHVwZGF0ZWQgYnkgdGhlIHVzZXINCiAtIFRoYXQgY2FuIGJlIGFkbWluaXN0cmF0ZWQgYnkgcG9saWN5ICYgRFNDDQoNClRoZSBjb25maWd1cmF0aW9uIHN5c3RlbSBpcyBhIGJpdCB0b28gY29tcGxleCB0byBkZXNjcmliZSBpbiBhIGhlbHAgZmlsZSwgeW91IGNhbiBob3dldmVyIHZpc2l0IHVzIGF0IGh0dHA6Ly9wc2ZyYW1ld29yay5vcmcgZm9yIGRldGFpbGVkIGd1aWRhbmNlLg0KDQpBbiBleGFtcGxlIGNhbiBiZSBzZWVuIGluIHRoZSBhdHRhY2hlZCBwczEgZmlsZQEJQgEAAAlDAQAABkQBAAAJcmVhZG1lLm1kBkUBAAAqw75uYW1lw75caW50ZXJuYWxcY29uZmlndXJhdGlvbnNccmVhZG1lLm1kCQYAAAAJRwEAAAlIAQAAASEBAAASAAAABkkBAADbASMgRnVuY3Rpb25zDQoNClRoaXMgaXMgdGhlIGZvbGRlciB3aGVyZSB0aGUgaW50ZXJuYWwgZnVuY3Rpb25zIGdvLg0KDQpEZXBlbmRpbmcgb24gdGhlIGNvbXBsZXhpdHkgb2YgdGhlIG1vZHVsZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gc3ViZGl2aWRlIHRoZW0gaW50byBzdWJmb2xkZXJzLg0KDQpUaGUgbW9kdWxlIHdpbGwgcGljayB1cCBhbGwgLnBzMSBmaWxlcyByZWN1cnNpdmVseQEJSgEAAAlLAQAABkwBAAAJcmVhZG1lLm1kBk0BAAAlw75uYW1lw75caW50ZXJuYWxcZnVuY3Rpb25zXHJlYWRtZS5tZAkGAAAACU8BAAAJUAEAAAEiAQAAEgAAAAZRAQAAhAM8Iw0KU3RvcmVkIHNjcmlwdGJsb2NrcyBhcmUgYXZhaWxhYmxlIGluIFtQc2ZWYWxpZGF0ZVNjcmlwdCgpXSBhdHRyaWJ1dGVzLg0KVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8gY2VudHJhbGx5IHByb3ZpZGUgdGhlIHNhbWUgc2NyaXB0YmxvY2sgbXVsdGlwbGUgdGltZXMsDQp3aXRob3V0IGhhdmluZyB0byBtYWludGFpbiBpdCBpbiBzZXBhcmF0ZSBsb2NhdGlvbnMuDQoNCkl0IGFsc28gcHJldmVudHMgbGVuZ3RoeSB2YWxpZGF0aW9uIHNjcmlwdGJsb2NrcyBmcm9tIG1ha2luZyB5b3VyIHBhcmFtZXRlciBibG9jaw0KaGFyZCB0byByZWFkLg0KDQpTZXQtUFNGU2NyaXB0YmxvY2sgLU5hbWUgJ8O+bmFtZcO+LlNjcmlwdEJsb2NrTmFtZScgLVNjcmlwdGJsb2NrIHsNCgkNCn0NCiM+AQlSAQAACVMBAAAGVAEAABBzY3JpcHRibG9ja3MucHMxBlUBAAAvw75uYW1lw75caW50ZXJuYWxcc2NyaXB0YmxvY2tzXHNjcmlwdGJsb2Nrcy5wczEJBgAAAAlXAQAACVgBAAABIwEAABIAAAAGWQEAAPYJTmV3LVBTRkxpY2Vuc2UgLVByb2R1Y3QgJ8O+bmFtZcO+JyAtTWFudWZhY3R1cmVyICfDvmF1dGhvcsO+JyAtUHJvZHVjdFZlcnNpb24gJHNjcmlwdDpNb2R1bGVWZXJzaW9uIC1Qcm9kdWN0VHlwZSBNb2R1bGUgLU5hbWUgTUlUIC1WZXJzaW9uICIxLjAuMC4wIiAtRGF0ZSAoR2V0LURhdGUgIsO+IWRhdGUhw74iKSAtVGV4dCBAIg0KQ29weXJpZ2h0IChjKSDDviF5ZWFyIcO+IMO+YXV0aG9yw74NCg0KUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQ0Kb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwNCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMNCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwNCmNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcw0KZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCg0KVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsDQpjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLg0KDQpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUg0KSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksDQpGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUNCkFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVINCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sDQpPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRQ0KU09GVFdBUkUuDQoiQAEJWgEAAAlbAQAABlwBAAALbGljZW5zZS5wczEGXQEAACXDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzXGxpY2Vuc2UucHMxCQYAAAAJXwEAAAlgAQAAASQBAAASAAAABmEBAAC3BjwjDQpBZGQgYWxsIHRoaW5ncyB5b3Ugd2FudCB0byBydW4gYWZ0ZXIgaW1wb3J0aW5nIHRoZSBtYWluIGZ1bmN0aW9uIGNvZGUNCg0KV0FSTklORzogT05MWSBwcm92aWRlIHBhdGhzIHRvIGZpbGVzIQ0KDQpBZnRlciBidWlsZGluZyB0aGUgbW9kdWxlLCB0aGlzIGZpbGUgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQsIGFkZGluZyBhbnl0aGluZyBidXQgcGF0aHMgdG8gZmlsZXMgLi4uDQotIFdpbGwgbm90IHdvcmsgYWZ0ZXIgcHVibGlzaGluZw0KLSBDb3VsZCBicmVhayB0aGUgYnVpbGQgcHJvY2Vzcw0KIz4NCg0KJG1vZHVsZVJvb3QgPSBTcGxpdC1QYXRoIChTcGxpdC1QYXRoICRQU1NjcmlwdFJvb3QpDQoNCiMgTG9hZCBDb25maWd1cmF0aW9ucw0KKEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGludGVybmFsXGNvbmZpZ3VyYXRpb25zXCoucHMxIiAtRXJyb3JBY3Rpb24gSWdub3JlKS5GdWxsTmFtZQ0KDQojIExvYWQgU2NyaXB0YmxvY2tzDQooR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcaW50ZXJuYWxcc2NyaXB0YmxvY2tzXCoucHMxIiAtRXJyb3JBY3Rpb24gSWdub3JlKS5GdWxsTmFtZQ0KDQojIExvYWQgVGFiIEV4cGFuc2lvbg0KKEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGludGVybmFsXHRlcHBcKi50ZXBwLnBzMSIgLUVycm9yQWN0aW9uIElnbm9yZSkuRnVsbE5hbWUNCg0KIyBMb2FkIFRhYiBFeHBhbnNpb24gQXNzaWdubWVudA0KIiRtb2R1bGVSb290XGludGVybmFsXHRlcHBcYXNzaWdubWVudC5wczEiDQoNCiMgTG9hZCBMaWNlbnNlDQoiJG1vZHVsZVJvb3RcaW50ZXJuYWxcc2NyaXB0c1xsaWNlbnNlLnBzMSIBCWIBAAAJYwEAAAZkAQAADnBvc3RpbXBvcnQucHMxBmUBAAAow75uYW1lw75caW50ZXJuYWxcc2NyaXB0c1xwb3N0aW1wb3J0LnBzMQkGAAAACWcBAAAJaAEAAAElAQAAEgAAAAZpAQAAsAM8Iw0KQWRkIGFsbCB0aGluZ3MgeW91IHdhbnQgdG8gcnVuIGJlZm9yZSBpbXBvcnRpbmcgdGhlIG1haW4gZnVuY3Rpb24gY29kZS4NCg0KV0FSTklORzogT05MWSBwcm92aWRlIHBhdGhzIHRvIGZpbGVzIQ0KDQpBZnRlciBidWlsZGluZyB0aGUgbW9kdWxlLCB0aGlzIGZpbGUgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQsIGFkZGluZyBhbnl0aGluZyBidXQgcGF0aHMgdG8gZmlsZXMgLi4uDQotIFdpbGwgbm90IHdvcmsgYWZ0ZXIgcHVibGlzaGluZw0KLSBDb3VsZCBicmVhayB0aGUgYnVpbGQgcHJvY2Vzcw0KIz4NCg0KJG1vZHVsZVJvb3QgPSBTcGxpdC1QYXRoIChTcGxpdC1QYXRoICRQU1NjcmlwdFJvb3QpDQoNCiMgTG9hZCB0aGUgc3RyaW5ncyB1c2VkIGluIG1lc3NhZ2VzDQoiJG1vZHVsZVJvb3RcaW50ZXJuYWxcc2NyaXB0c1xzdHJpbmdzLnBzMSIBCWoBAAAJawEAAAZsAQAADXByZWltcG9ydC5wczEGbQEAACfDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzXHByZWltcG9ydC5wczEJBgAAAAlvAQAACXABAAABJgEAABIAAAAGcQEAALgDPCMNClRoaXMgZmlsZSBsb2FkcyB0aGUgc3RyaW5ncyBkb2N1bWVudHMgZnJvbSB0aGUgcmVzcGVjdGl2ZSBsYW5ndWFnZSBmb2xkZXJzLg0KVGhpcyBhbGxvd3MgbG9jYWxpemluZyBtZXNzYWdlcyBhbmQgZXJyb3JzLg0KTG9hZCBwc2QxIGxhbmd1YWdlIGZpbGVzIGZvciBlYWNoIGxhbmd1YWdlIHlvdSB3aXNoIHRvIHN1cHBvcnQuDQpQYXJ0aWFsIHRyYW5zbGF0aW9ucyBhcmUgYWNjZXB0YWJsZSAtIHdoZW4gbWlzc2luZyBhIGN1cnJlbnQgbGFuZ3VhZ2UgbWVzc2FnZSwNCml0IHdpbGwgZmFsbGJhY2sgdG8gRW5nbGlzaCBvciBhbm90aGVyIGF2YWlsYWJsZSBsYW5ndWFnZS4NCiM+DQpJbXBvcnQtUFNGTG9jYWxpemVkU3RyaW5nIC1QYXRoICIkKCRzY3JpcHQ6TW9kdWxlUm9vdClcZW4tdXNcKi5wc2QxIiAtTW9kdWxlICfDvm5hbWXDvicgLUxhbmd1YWdlICdlbi1VUycBCXIBAAAJcwEAAAZ0AQAAC3N0cmluZ3MucHMxBnUBAAAlw75uYW1lw75caW50ZXJuYWxcc2NyaXB0c1xzdHJpbmdzLnBzMQkGAAAACXcBAAAJeAEAAAEnAQAAEgAAAAZ5AQAAcTwjDQojIEV4YW1wbGU6DQpSZWdpc3Rlci1QU0ZUZXBwQXJndW1lbnRDb21wbGV0ZXIgLUNvbW1hbmQgR2V0LUFsY29ob2wgLVBhcmFtZXRlciBUeXBlIC1OYW1lIMO+bmFtZcO+LmFsY29ob2wNCiM+AQl6AQAACXsBAAAGfAEAAA5hc3NpZ25tZW50LnBzMQZ9AQAAJcO+bmFtZcO+XGludGVybmFsXHRlcHBcYXNzaWdubWVudC5wczEJBgAAAAl/AQAACYABAAABKAEAABIAAAAGgQEAAKMBPCMNCiMgRXhhbXBsZToNClJlZ2lzdGVyLVBTRlRlcHBTY3JpcHRibG9jayAtTmFtZSAiw75uYW1lw74uYWxjb2hvbCIgLVNjcmlwdEJsb2NrIHsgJ0JlZXInLCdNZWFkJywnV2hpc2tleScsJ1dpbmUnLCdWb2RrYScsJ1J1bSAoM3kpJywgJ1J1bSAoNXkpJywgJ1J1bSAoN3kpJyB9DQojPgEJggEAAAmDAQAABoQBAAAQZXhhbXBsZS50ZXBwLnBzMQaFAQAAJ8O+bmFtZcO+XGludGVybmFsXHRlcHBcZXhhbXBsZS50ZXBwLnBzMQkGAAAACYcBAAAJiAEAAAEpAQAAEgAAAAaJAQAAvgcjIFRhYiBFeHBhbnNpb24NCg0KIyMgRGVzY3JpcHRpb24NCg0KTW9kZXJuIFRhYiBFeHBhbnNpb24gd2FzIG9wZW5lZCB0byB1c2VycyB3aXRoIHRoZSBtb2R1bGUgYFRhYiBFeHBhbnNpb24gUGx1cyBQbHVzYCAoVEVQUCkuDQoNCkl0IGFsbG93cyB5b3UgdG8gZGVmaW5lLCB3aGF0IG9wdGlvbnMgYSB1c2VyIGlzIG9mZmVyZWQgd2hlbiB0YWJiaW5nIHRocm91Z2ggaW5wdXQgb3B0aW9ucy4gVGhpcyBjYW4gc2F2ZSBhIGxvdCBvZiB0aW1lIGZvciB0aGUgdXNlciBhbmQgaXMgY29uc2lkZXJlZCBhIGtleSBlbGVtZW50IGluIHVzZXIgZXhwZXJpZW5jZS4NCg0KVGhlIGBQU0ZyYW1ld29ya2Agb2ZmZXJzIGEgc2ltcGxpZmllZCB3YXkgb2Ygb2ZmZXJpbmcganVzdCB0aGlzLCBhcyB0aGUgdHdvIGV4YW1wbGUgZmlsZXMgc2hvdy4NCg0KIyMgQ29uY2VwdA0KDQpDdXN0b20gdGFiIGNvbXBsZXRpb24gaXMgZGVmaW5lZCBpbiB0d28gc3RlcHM6DQoNCiAtIERlZmluZSBhIHNjcmlwdGJsb2NrIHRoYXQgaXMgcnVuIHdoZW4gdGhlIHVzZXIgaGl0cyBgVEFCYCBhbmQgcHJvdmlkZXMgdGhlIHN0cmluZ3MgdGhhdCBhcmUgaGlzIG9wdGlvbnMuDQogLSBBc3NpZ24gdGhhdCBzY3JpcHRibG9jayB0byB0aGUgcGFyYW1ldGVyIG9mIGEgY29tbWFuZC4gWW91IGNhbiBhc3NpZ24gdGhlIHNhbWUgc2NyaXB0YmxvY2sgbXVsdGlwbGUgdGltZXMuDQoNCiMjIFN0cnVjdHVyZQ0KDQpJbXBvcnQgb3JkZXIgbWF0dGVycy4gSW4gb3JkZXIgdG8gbWFrZSB0aGluZ3Mgd29yayB3aXRoIHRoZSBkZWZhdWx0IHNjYWZmb2xkLCBmb2xsb3cgdGhvc2UgcnVsZXM6DQoNCiAtIEFsbCBzY3JpcHRmaWxlcyBfZGVmaW5pbmdfIGNvbXBsZXRpb24gc2NyaXB0YmxvY2tzIGxpa2UgdGhpczogYCoudGVwcC5wczFgDQogLSBQdXQgYWxsIHlvdXIgY29tcGxldGlvbiBhc3NpZ25tZW50cyBpbiBgYXNzaWdubWVudC5wczFgAQmKAQAACYsBAAAGjAEAAAlyZWFkbWUubWQGjQEAACDDvm5hbWXDvlxpbnRlcm5hbFx0ZXBwXHJlYWRtZS5tZAkGAAAACY8BAAAJkAEAAAEqAQAAEgAAAAaRAQAA1QEjIERlc2NyaXB0aW9uDQoNClRoaXMgaXMgd2hlcmUgdGhlIGZ1bmN0aW9uIHRlc3RzIGdvLg0KDQpNYWtlIHN1cmUgdG8gcHV0IHRoZW0gaW4gZm9sZGVycyByZWZsZWN0aW5nIHRoZSBhY3R1YWwgbW9kdWxlIHN0cnVjdHVyZS4NCg0KSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gaW50ZXJuYWwgYW5kIHB1YmxpYyBmdW5jdGlvbnMgaGVyZS4BCZIBAAAJkwEAAAaUAQAACXJlYWRtZS5tZAaVAQAAIsO+bmFtZcO+XHRlc3RzXGZ1bmN0aW9uc1xyZWFkbWUubWQJBgAAAAmXAQAACZgBAAABKwEAABIAAAAGmQEAAIIGIyBMaXN0IG9mIGZvcmJpZGRlbiBjb21tYW5kcw0KJGdsb2JhbDpCYW5uZWRDb21tYW5kcyA9IEAoDQoJJ1dyaXRlLUhvc3QnDQoJJ1dyaXRlLVZlcmJvc2UnDQoJJ1dyaXRlLVdhcm5pbmcnDQoJJ1dyaXRlLUVycm9yJw0KCSdXcml0ZS1PdXRwdXQnDQoJJ1dyaXRlLUluZm9ybWF0aW9uJw0KCSdXcml0ZS1EZWJ1ZycNCgkNCgkjIFVzZSBDSU0gaW5zdGVhZCB3aGVyZSBwb3NzaWJsZQ0KCSdHZXQtV21pT2JqZWN0Jw0KCSdJbnZva2UtV21pTWV0aG9kJw0KCSdSZWdpc3Rlci1XbWlFdmVudCcNCgknUmVtb3ZlLVdtaU9iamVjdCcNCgknU2V0LVdtaUluc3RhbmNlJw0KDQoJIyBVc2UgR2V0LVdpbkV2ZW50IGluc3RlYWQNCgknR2V0LUV2ZW50TG9nJw0KKQ0KDQo8Iw0KCUNvbnRhaW5zIGxpc3Qgb2YgZXhjZXB0aW9ucyBmb3IgYmFubmVkIGNtZGxldHMuDQoJSW5zZXJ0IHRoZSBmaWxlIG5hbWVzIG9mIGZpbGVzIHRoYXQgbWF5IGNvbnRhaW4gdGhlbS4NCgkNCglFeGFtcGxlOg0KCSJXcml0ZS1Ib3N0IiAgPSBAKCdXcml0ZS1QU0ZIb3N0Q29sb3IucHMxJywnV3JpdGUtUFNGTWVzc2FnZS5wczEnKQ0KIz4NCiRnbG9iYWw6TWF5Q29udGFpbkNvbW1hbmQgPSBAew0KCSJXcml0ZS1Ib3N0IiAgPSBAKCkNCgkiV3JpdGUtVmVyYm9zZSIgPSBAKCkNCgkiV3JpdGUtV2FybmluZyIgPSBAKCkNCgkiV3JpdGUtRXJyb3IiICA9IEAoKQ0KCSJXcml0ZS1PdXRwdXQiID0gQCgpDQoJIldyaXRlLUluZm9ybWF0aW9uIiA9IEAoKQ0KCSJXcml0ZS1EZWJ1ZyIgPSBAKCkNCn0BCZoBAAAJmwEAAAacAQAAHEZpbGVJbnRlZ3JpdHkuRXhjZXB0aW9ucy5wczEGnQEAADPDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXEZpbGVJbnRlZ3JpdHkuRXhjZXB0aW9ucy5wczEJBgAAAAmfAQAACaABAAABLAEAABIAAAAGoQEAAOAYJG1vZHVsZVJvb3QgPSAoUmVzb2x2ZS1QYXRoICIkZ2xvYmFsOnRlc3Ryb290XC4uIikuUGF0aA0KDQouICIkZ2xvYmFsOnRlc3Ryb290XGdlbmVyYWxcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMSINCg0KRGVzY3JpYmUgIlZlcmlmeWluZyBpbnRlZ3JpdHkgb2YgbW9kdWxlIGZpbGVzIiB7DQoJQmVmb3JlQWxsIHsNCgkJZnVuY3Rpb24gR2V0LUZpbGVFbmNvZGluZw0KCQl7DQoJCTwjDQoJCQkuU1lOT1BTSVMNCgkJCQlUZXN0cyBhIGZpbGUgZm9yIGVuY29kaW5nLg0KCQkJDQoJCQkuREVTQ1JJUFRJT04NCgkJCQlUZXN0cyBhIGZpbGUgZm9yIGVuY29kaW5nLg0KCQkJDQoJCQkuUEFSQU1FVEVSIFBhdGgNCgkJCQlUaGUgZmlsZSB0byB0ZXN0DQoJCSM+DQoJCQlbQ21kbGV0QmluZGluZygpXQ0KCQkJUGFyYW0gKA0KCQkJCVtQYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJFRydWUsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkVHJ1ZSldDQoJCQkJW0FsaWFzKCdGdWxsTmFtZScpXQ0KCQkJCVtzdHJpbmddDQoJCQkJJFBhdGgNCgkJCSkNCgkJCQ0KCQkJaWYgKCRQU1ZlcnNpb25UYWJsZS5QU1ZlcnNpb24uTWFqb3IgLWx0IDYpDQoJCQl7DQoJCQkJW2J5dGVbXV0kYnl0ZSA9IGdldC1jb250ZW50IC1FbmNvZGluZyBieXRlIC1SZWFkQ291bnQgNCAtVG90YWxDb3VudCA0IC1QYXRoICRQYXRoDQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJW2J5dGVbXV0kYnl0ZSA9IEdldC1Db250ZW50IC1Bc0J5dGVTdHJlYW0gLVJlYWRDb3VudCA0IC1Ub3RhbENvdW50IDQgLVBhdGggJFBhdGgNCgkJCX0NCgkJCQ0KCQkJaWYgKCRieXRlWzBdIC1lcSAweGVmIC1hbmQgJGJ5dGVbMV0gLWVxIDB4YmIgLWFuZCAkYnl0ZVsyXSAtZXEgMHhiZikgeyAnVVRGOCBCT00nIH0NCgkJCWVsc2VpZiAoJGJ5dGVbMF0gLWVxIDB4ZmUgLWFuZCAkYnl0ZVsxXSAtZXEgMHhmZikgeyAnVW5pY29kZScgfQ0KCQkJZWxzZWlmICgkYnl0ZVswXSAtZXEgMCAtYW5kICRieXRlWzFdIC1lcSAwIC1hbmQgJGJ5dGVbMl0gLWVxIDB4ZmUgLWFuZCAkYnl0ZVszXSAtZXEgMHhmZikgeyAnVVRGMzInIH0NCgkJCWVsc2VpZiAoJGJ5dGVbMF0gLWVxIDB4MmIgLWFuZCAkYnl0ZVsxXSAtZXEgMHgyZiAtYW5kICRieXRlWzJdIC1lcSAweDc2KSB7ICdVVEY3JyB9DQoJCQllbHNlIHsgJ1Vua25vd24nIH0NCgkJfQ0KCX0NCg0KCUNvbnRleHQgIlZhbGlkYXRpbmcgUFMxIFNjcmlwdCBmaWxlcyIgew0KCQkkYWxsRmlsZXMgPSBHZXQtQ2hpbGRJdGVtIC1QYXRoICRtb2R1bGVSb290IC1SZWN1cnNlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIioucHMxIiB8IFdoZXJlLU9iamVjdCBGdWxsTmFtZSAtTm90TGlrZSAiJG1vZHVsZVJvb3RcdGVzdHNcKiINCgkJDQoJCWZvcmVhY2ggKCRmaWxlIGluICRhbGxGaWxlcykNCgkJew0KCQkJJG5hbWUgPSAkZmlsZS5GdWxsTmFtZS5SZXBsYWNlKCIkbW9kdWxlUm9vdFwiLCAnJykNCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgVVRGOCBlbmNvZGluZyB3aXRoIEJ5dGUgT3JkZXIgTWFyayIgLVRlc3RDYXNlcyBAeyBmaWxlID0gJGZpbGUgfSB7DQoJCQkJR2V0LUZpbGVFbmNvZGluZyAtUGF0aCAkZmlsZS5GdWxsTmFtZSB8IFNob3VsZCAtQmUgJ1VURjggQk9NJw0KCQkJfQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBubyB0cmFpbGluZyBzcGFjZSIgLVRlc3RDYXNlcyBAeyBmaWxlID0gJGZpbGUgfSB7DQoJCQkJKCRmaWxlIHwgU2VsZWN0LVN0cmluZyAiXHMkIiB8IFdoZXJlLU9iamVjdCB7ICRfLkxpbmUuVHJpbSgpLkxlbmd0aCAtZ3QgMH0pLkxpbmVOdW1iZXIgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJCX0NCgkJCQ0KCQkJJHRva2VucyA9ICRudWxsDQoJCQkkcGFyc2VFcnJvcnMgPSAkbnVsbA0KCQkJJGFzdCA9IFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkxhbmd1YWdlLlBhcnNlcl06OlBhcnNlRmlsZSgkZmlsZS5GdWxsTmFtZSwgW3JlZl0kdG9rZW5zLCBbcmVmXSRwYXJzZUVycm9ycykNCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgbm8gc3ludGF4IGVycm9ycyIgLVRlc3RDYXNlcyBAeyBwYXJzZUVycm9ycyA9ICRwYXJzZUVycm9ycyB9IHsNCgkJCQkkcGFyc2VFcnJvcnMgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJCX0NCgkJCQ0KCQkJZm9yZWFjaCAoJGNvbW1hbmQgaW4gJGdsb2JhbDpCYW5uZWRDb21tYW5kcykNCgkJCXsNCgkJCQlpZiAoJGdsb2JhbDpNYXlDb250YWluQ29tbWFuZFsiJGNvbW1hbmQiXSAtbm90Y29udGFpbnMgJGZpbGUuTmFtZSkNCgkJCQl7DQoJCQkJCUl0ICJbJG5hbWVdIFNob3VsZCBub3QgdXNlICRjb21tYW5kIiAtVGVzdENhc2VzIEB7IHRva2VucyA9ICR0b2tlbnM7IGNvbW1hbmQgPSAkY29tbWFuZCB9IHsNCgkJCQkJCSR0b2tlbnMgfCBXaGVyZS1PYmplY3QgVGV4dCAtRVEgJGNvbW1hbmQgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCgkNCglDb250ZXh0ICJWYWxpZGF0aW5nIGhlbHAudHh0IGhlbHAgZmlsZXMiIHsNCgkJJGFsbEZpbGVzID0gR2V0LUNoaWxkSXRlbSAtUGF0aCAkbW9kdWxlUm9vdCAtUmVjdXJzZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLmhlbHAudHh0IiB8IFdoZXJlLU9iamVjdCBGdWxsTmFtZSAtTm90TGlrZSAiJG1vZHVsZVJvb3RcdGVzdHNcKiINCgkJDQoJCWZvcmVhY2ggKCRmaWxlIGluICRhbGxGaWxlcykNCgkJew0KCQkJJG5hbWUgPSAkZmlsZS5GdWxsTmFtZS5SZXBsYWNlKCIkbW9kdWxlUm9vdFwiLCAnJykNCgkJCQ0KCQkJSXQgIlskbmFtZV0gU2hvdWxkIGhhdmUgVVRGOCBlbmNvZGluZyIgLVRlc3RDYXNlcyBAeyBmaWxlID0gJGZpbGUgfSB7DQoJCQkJR2V0LUZpbGVFbmNvZGluZyAtUGF0aCAkZmlsZS5GdWxsTmFtZSB8IFNob3VsZCAtQmUgJ1VURjggQk9NJw0KCQkJfQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBubyB0cmFpbGluZyBzcGFjZSIgLVRlc3RDYXNlcyBAeyBmaWxlID0gJGZpbGUgfSB7DQoJCQkJKCRmaWxlIHwgU2VsZWN0LVN0cmluZyAiXHMkIiB8IFdoZXJlLU9iamVjdCB7ICRfLkxpbmUuVHJpbSgpLkxlbmd0aCAtZ3QgMCB9IHwgTWVhc3VyZS1PYmplY3QpLkNvdW50IHwgU2hvdWxkIC1CZSAwDQoJCQl9DQoJCX0NCgl9DQp9AQmiAQAACaMBAAAGpAEAABdGaWxlSW50ZWdyaXR5LlRlc3RzLnBzMQalAQAALsO+bmFtZcO+XHRlc3RzXGdlbmVyYWxcRmlsZUludGVncml0eS5UZXN0cy5wczEJBgAAAAmnAQAACagBAAABLQEAABIAAAAGqQEAAJ0FIyBMaXN0IG9mIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBpZ25vcmVkDQokZ2xvYmFsOkZ1bmN0aW9uSGVscFRlc3RFeGNlcHRpb25zID0gQCgNCiAgICANCikNCg0KPCMNCiAgTGlzdCBvZiBhcnJheWVkIGVudW1lcmF0aW9ucy4gVGhlc2UgbmVlZCB0byBiZSB0cmVhdGVkIGRpZmZlcmVudGx5LiBBZGQgZnVsbCBuYW1lLg0KICBFeGFtcGxlOg0KDQogICJTcWxjb2xsYWJvcmF0aXZlLkRiYXRvb2xzLkNvbm5lY3Rpb24uTWFuYWdlbWVudENvbm5lY3Rpb25UeXBlW10iDQojPg0KJGdsb2JhbDpIZWxwVGVzdEVudW1lcmF0ZWRBcnJheXMgPSBAKA0KCQ0KKQ0KDQo8Iw0KICBTb21lIHR5cGVzIG9uIHBhcmFtZXRlcnMganVzdCBmYWlsIHRoZWlyIHZhbGlkYXRpb24gbm8gbWF0dGVyIHdoYXQuDQogIEZvciB0aG9zZSBpdCBiZWNvbWVzIHBvc3NpYmxlIHRvIHNraXAgdGhlbSwgYnkgYWRkaW5nIHRoZW0gdG8gdGhpcyBoYXNodGFibGUuDQogIEFkZCBieSBmb2xsb3dpbmcgdGhpcyBjb252ZW50aW9uOiA8Y29tbWFuZCBuYW1lPiA9IEAoPGxpc3Qgb2YgcGFyYW1ldGVyIG5hbWVzPikNCiAgRXhhbXBsZToNCg0KICAiR2V0LURiYUNtT2JqZWN0IiAgICAgICA9IEAoIkRvTm90VXNlIikNCiM+DQokZ2xvYmFsOkhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGUgPSBAew0KICAgIA0KfQ0KAQmqAQAACasBAAAGrAEAABNIZWxwLkV4Y2VwdGlvbnMucHMxBq0BAAAqw75uYW1lw75cdGVzdHNcZ2VuZXJhbFxIZWxwLkV4Y2VwdGlvbnMucHMxCQYAAAAJrwEAAAmwAQAAAS4BAAASAAAABrEBAADONDwjDQogICAgLk5PVEVTDQogICAgICAgIFRoZSBvcmlnaW5hbCB0ZXN0IHRoaXMgaXMgYmFzZWQgdXBvbiB3YXMgd3JpdHRlbiBieSBKdW5lIEJsZW5kZXIuDQoJCUFmdGVyIHNldmVyYWwgcm91bmRzIG9mIG1vZGlmaWNhdGlvbnMgaXQgc3RhbmRzIG5vdyBhcyBpdCBpcywgYnV0IHRoZSBob25vciByZW1haW5zIGhlcnMuDQoNCgkJVGhhbmsgeW91IEp1bmUsIGZvciBhbGwgeW91IGhhdmUgZG9uZSENCg0KICAgIC5ERVNDUklQVElPTg0KCQlUaGlzIHRlc3QgZXZhbHVhdGVzIHRoZSBoZWxwIGZvciBhbGwgY29tbWFuZHMgaW4gYSBtb2R1bGUuDQoNCgkuUEFSQU1FVEVSIFNraXBUZXN0DQoJCURpc2FibGVzIHRoaXMgdGVzdC4NCgkNCgkuUEFSQU1FVEVSIENvbW1hbmRQYXRoDQoJCUxpc3Qgb2YgcGF0aHMgdW5kZXIgd2hpY2ggdGhlIHNjcmlwdCBmaWxlcyBhcmUgc3RvcmVkLg0KCQlUaGlzIHRlc3QgYXNzdW1lcyB0aGF0IGFsbCBmdW5jdGlvbnMgaGF2ZSB0aGVpciBvd24gZmlsZSB0aGF0IGlzIG5hbWVkIGFmdGVyIHRoZW1zZWx2ZXMuDQoJCVRoZXNlIHBhdGhzIGFyZSB1c2VkIHRvIHNlYXJjaCBmb3IgY29tbWFuZHMgdGhhdCBzaG91bGQgZXhpc3QgYW5kIGJlIHRlc3RlZC4NCgkJV2lsbCBzZWFyY2ggcmVjdXJzaXZlbHkgYW5kIGFjY2VwdHMgd2lsZGNhcmRzLCBtYWtlIHN1cmUgb25seSBmdW5jdGlvbnMgYXJlIGZvdW5kDQoNCgkuUEFSQU1FVEVSIE1vZHVsZU5hbWUNCgkJTmFtZSBvZiB0aGUgbW9kdWxlIHRvIGJlIHRlc3RlZC4NCgkJVGhlIG1vZHVsZSBtdXN0IGFscmVhZHkgYmUgaW1wb3J0ZWQNCg0KCS5QQVJBTUVURVIgRXhjZXB0aW9uc0ZpbGUNCgkJRmlsZSBpbiB3aGljaCBleGNlcHRpb25zIGFuZCBhZGp1c3RtZW50cyBhcmUgY29uZmlndXJlZC4NCgkJSW4gaXQgdGhlcmUgc2hvdWxkIGJlIHR3byBhcnJheXMgYW5kIGEgaGFzaHRhYmxlIGRlZmluZWQ6DQoJCQkkZ2xvYmFsOkZ1bmN0aW9uSGVscFRlc3RFeGNlcHRpb25zDQoJCQkkZ2xvYmFsOkhlbHBUZXN0RW51bWVyYXRlZEFycmF5cw0KCQkJJGdsb2JhbDpIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlDQoJCVRoZXNlIGNhbiBiZSB1c2VkIHRvIHR3ZWFrIHRoZSB0ZXN0cyBzbGlnaHRseSBpbiBjYXNlcyBvZiBuZWVkLg0KCQlTZWUgdGhlIGV4YW1wbGUgZmlsZSBmb3IgZXhwbGFuYXRpb25zIG9uIGVhY2ggb2YgdGhlc2UgdXNhZ2UgYW5kIGVmZmVjdC4NCiM+DQpbQ21kbGV0QmluZGluZygpXQ0KUGFyYW0gKA0KCVtzd2l0Y2hdDQoJJFNraXBUZXN0LA0KCQ0KCVtzdHJpbmdbXV0NCgkkQ29tbWFuZFBhdGggPSBAKCIkZ2xvYmFsOnRlc3Ryb290XC4uXGZ1bmN0aW9ucyIsICIkZ2xvYmFsOnRlc3Ryb290XC4uXGludGVybmFsXGZ1bmN0aW9ucyIpLA0KCQ0KCVtzdHJpbmddDQoJJE1vZHVsZU5hbWUgPSAiw75uYW1lw74iLA0KCQ0KCVtzdHJpbmddDQoJJEV4Y2VwdGlvbnNGaWxlID0gIiRnbG9iYWw6dGVzdHJvb3RcZ2VuZXJhbFxIZWxwLkV4Y2VwdGlvbnMucHMxIg0KKQ0KaWYgKCRTa2lwVGVzdCkgeyByZXR1cm4gfQ0KLiAkRXhjZXB0aW9uc0ZpbGUNCg0KJGluY2x1ZGVkTmFtZXMgPSAoR2V0LUNoaWxkSXRlbSAkQ29tbWFuZFBhdGggLVJlY3Vyc2UgLUZpbGUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiKS5CYXNlTmFtZQ0KJGNvbW1hbmRUeXBlcyA9IEAoJ0NtZGxldCcsICdGdW5jdGlvbicpDQppZiAoJFBTVmVyc2lvblRhYmxlLlBTRWRpdGlvbiAtZXEgJ0Rlc2t0b3AnICkgeyAkY29tbWFuZFR5cGVzICs9ICdXb3JrZmxvdycgfQ0KJGNvbW1hbmRzID0gR2V0LUNvbW1hbmQgLU1vZHVsZSAoR2V0LU1vZHVsZSAkTW9kdWxlTmFtZSkgLUNvbW1hbmRUeXBlICRjb21tYW5kVHlwZXMgfCBXaGVyZS1PYmplY3QgTmFtZSAtSW4gJGluY2x1ZGVkTmFtZXMNCg0KIyMgV2hlbiB0ZXN0aW5nIGhlbHAsIHJlbWVtYmVyIHRoYXQgaGVscCBpcyBjYWNoZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHNlc3Npb24uDQojIyBUbyB0ZXN0LCByZXN0YXJ0IHNlc3Npb24uDQoNCg0KZm9yZWFjaCAoJGNvbW1hbmQgaW4gJGNvbW1hbmRzKSB7DQogICAgJGNvbW1hbmROYW1lID0gJGNvbW1hbmQuTmFtZQ0KICAgIA0KICAgICMgU2tpcCBhbGwgZnVuY3Rpb25zIHRoYXQgYXJlIG9uIHRoZSBleGNsdXNpb25zIGxpc3QNCiAgICBpZiAoJGdsb2JhbDpGdW5jdGlvbkhlbHBUZXN0RXhjZXB0aW9ucyAtY29udGFpbnMgJGNvbW1hbmROYW1lKSB7IGNvbnRpbnVlIH0NCiAgICANCiAgICAjIFRoZSBtb2R1bGUtcXVhbGlmaWVkIGNvbW1hbmQgZmFpbHMgb24gTWljcm9zb2Z0LlBvd2VyU2hlbGwuQXJjaGl2ZSBjbWRsZXRzDQogICAgJEhlbHAgPSBHZXQtSGVscCAkY29tbWFuZE5hbWUgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUNCgkNCglEZXNjcmliZSAiVGVzdCBoZWxwIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgDQoJCSMgSWYgaGVscCBpcyBub3QgZm91bmQsIHN5bm9wc2lzIGluIGF1dG8tZ2VuZXJhdGVkIGhlbHAgaXMgdGhlIHN5bnRheCBkaWFncmFtDQoJCUl0ICJzaG91bGQgbm90IGJlIGF1dG8tZ2VuZXJhdGVkIiAtVGVzdENhc2VzIEB7IEhlbHAgPSAkSGVscCB9IHsNCgkJCSRIZWxwLlN5bm9wc2lzIHwgU2hvdWxkIC1Ob3QgLUJlTGlrZSAnKmBbYDxDb21tb25QYXJhbWV0ZXJzYD5gXSonDQoJCX0NCiAgICAgICAgDQoJCSMgU2hvdWxkIGJlIGEgZGVzY3JpcHRpb24gZm9yIGV2ZXJ5IGZ1bmN0aW9uDQoJCUl0ICJnZXRzIGRlc2NyaXB0aW9uIGZvciAkY29tbWFuZE5hbWUiIC1UZXN0Q2FzZXMgQHsgSGVscCA9ICRIZWxwIH0gew0KCQkJJEhlbHAuRGVzY3JpcHRpb24gfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQogICAgICAgIA0KCQkjIFNob3VsZCBiZSBhdCBsZWFzdCBvbmUgZXhhbXBsZQ0KCQlJdCAiZ2V0cyBleGFtcGxlIGNvZGUgZnJvbSAkY29tbWFuZE5hbWUiIC1UZXN0Q2FzZXMgQHsgSGVscCA9ICRIZWxwIH0gew0KCQkJKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxKS5Db2RlIHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCQ0KCQkjIFNob3VsZCBiZSBhdCBsZWFzdCBvbmUgZXhhbXBsZSBkZXNjcmlwdGlvbg0KCQlJdCAiZ2V0cyBleGFtcGxlIGhlbHAgZnJvbSAkY29tbWFuZE5hbWUiIC1UZXN0Q2FzZXMgQHsgSGVscCA9ICRIZWxwIH0gew0KCQkJKCRIZWxwLkV4YW1wbGVzLkV4YW1wbGUuUmVtYXJrcyB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEpLlRleHQgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQogICAgICAgIA0KICAgICAgICBDb250ZXh0ICJUZXN0IHBhcmFtZXRlciBoZWxwIGZvciAkY29tbWFuZE5hbWUiIHsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJGNvbW1vbiA9ICdEZWJ1ZycsICdFcnJvckFjdGlvbicsICdFcnJvclZhcmlhYmxlJywgJ0luZm9ybWF0aW9uQWN0aW9uJywgJ0luZm9ybWF0aW9uVmFyaWFibGUnLCAnT3V0QnVmZmVyJywgJ091dFZhcmlhYmxlJywgJ1BpcGVsaW5lVmFyaWFibGUnLCAnVmVyYm9zZScsICdXYXJuaW5nQWN0aW9uJywgJ1dhcm5pbmdWYXJpYWJsZScNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJHBhcmFtZXRlcnMgPSAkY29tbWFuZC5QYXJhbWV0ZXJTZXRzLlBhcmFtZXRlcnMgfCBTb3J0LU9iamVjdCAtUHJvcGVydHkgTmFtZSAtVW5pcXVlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLW5vdGluICRjb21tb24NCiAgICAgICAgICAgICRwYXJhbWV0ZXJOYW1lcyA9ICRwYXJhbWV0ZXJzLk5hbWUNCiAgICAgICAgICAgICRIZWxwUGFyYW1ldGVyTmFtZXMgPSAkSGVscC5QYXJhbWV0ZXJzLlBhcmFtZXRlci5OYW1lIHwgU29ydC1PYmplY3QgLVVuaXF1ZQ0KICAgICAgICAgICAgZm9yZWFjaCAoJHBhcmFtZXRlciBpbiAkcGFyYW1ldGVycykgew0KICAgICAgICAgICAgICAgICRwYXJhbWV0ZXJOYW1lID0gJHBhcmFtZXRlci5OYW1lDQogICAgICAgICAgICAgICAgJHBhcmFtZXRlckhlbHAgPSAkSGVscC5wYXJhbWV0ZXJzLnBhcmFtZXRlciB8IFdoZXJlLU9iamVjdCBOYW1lIC1FUSAkcGFyYW1ldGVyTmFtZQ0KCQkJDQoJCQkJIyBTaG91bGQgYmUgYSBkZXNjcmlwdGlvbiBmb3IgZXZlcnkgcGFyYW1ldGVyDQoJCQkJSXQgImdldHMgaGVscCBmb3IgcGFyYW1ldGVyOiAkcGFyYW1ldGVyTmFtZSA6IGluICRjb21tYW5kTmFtZSIgLVRlc3RDYXNlcyBAeyBwYXJhbWV0ZXJIZWxwID0gJHBhcmFtZXRlckhlbHAgfSB7DQoJCQkJCSRwYXJhbWV0ZXJIZWxwLkRlc2NyaXB0aW9uLlRleHQgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KCQkJCX0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkY29kZU1hbmRhdG9yeSA9ICRwYXJhbWV0ZXIuSXNNYW5kYXRvcnkudG9TdHJpbmcoKQ0KCQkJCUl0ICJoZWxwIGZvciAkcGFyYW1ldGVyTmFtZSBwYXJhbWV0ZXIgaW4gJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IE1hbmRhdG9yeSB2YWx1ZSIgLVRlc3RDYXNlcyBAeyBwYXJhbWV0ZXJIZWxwID0gJHBhcmFtZXRlckhlbHA7IGNvZGVNYW5kYXRvcnkgPSAkY29kZU1hbmRhdG9yeSB9IHsNCgkJCQkJJHBhcmFtZXRlckhlbHAuUmVxdWlyZWQgfCBTaG91bGQgLUJlICRjb2RlTWFuZGF0b3J5DQoJCQkJfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICgkSGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZVskY29tbWFuZE5hbWVdIC1jb250YWlucyAkcGFyYW1ldGVyTmFtZSkgeyBjb250aW51ZSB9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgJGNvZGVUeXBlID0gJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLk5hbWUNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBpZiAoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLklzRW51bSkgew0KICAgICAgICAgICAgICAgICAgICAjIEVudW1lcmF0aW9ucyBvZnRlbiBoYXZlIGlzc3VlcyB3aXRoIHRoZSB0eXBlbmFtZSBub3QgYmVpbmcgcmVsaWFibHkgYXZhaWxhYmxlDQogICAgICAgICAgICAgICAgICAgICRuYW1lcyA9ICRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZTo6R2V0TmFtZXMoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlKQ0KCQkJCQkJIyBQYXJhbWV0ZXIgdHlwZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBjb2RlDQoJCQkJCUl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiAtVGVzdENhc2VzIEB7IHBhcmFtZXRlckhlbHAgPSAkcGFyYW1ldGVySGVscDsgbmFtZXMgPSAkbmFtZXMgfSB7DQoJCQkJCQkkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIHwgU2hvdWxkIC1iZSAkbmFtZXMNCgkJCQkJfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlaWYgKCRwYXJhbWV0ZXIuUGFyYW1ldGVyVHlwZS5GdWxsTmFtZSAtaW4gJEhlbHBUZXN0RW51bWVyYXRlZEFycmF5cykgew0KICAgICAgICAgICAgICAgICAgICAjIEVudW1lcmF0aW9ucyBvZnRlbiBoYXZlIGlzc3VlcyB3aXRoIHRoZSB0eXBlbmFtZSBub3QgYmVpbmcgcmVsaWFibHkgYXZhaWxhYmxlDQogICAgICAgICAgICAgICAgICAgICRuYW1lcyA9IFtFbnVtXTo6R2V0TmFtZXMoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLkRlY2xhcmVkTWVtYmVyc1swXS5SZXR1cm5UeXBlKQ0KCQkJCQlJdCAiaGVscCBmb3IgJGNvbW1hbmROYW1lIGhhcyBjb3JyZWN0IHBhcmFtZXRlciB0eXBlIGZvciAkcGFyYW1ldGVyTmFtZSIgLVRlc3RDYXNlcyBAeyBwYXJhbWV0ZXJIZWxwID0gJHBhcmFtZXRlckhlbHA7IG5hbWVzID0gJG5hbWVzIH0gew0KCQkJCQkJJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWVHcm91cC5wYXJhbWV0ZXJWYWx1ZSB8IFNob3VsZCAtYmUgJG5hbWVzDQoJCQkJCX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICMgVG8gYXZvaWQgY2FsbGluZyBUcmltIG1ldGhvZCBvbiBhIG51bGwgb2JqZWN0Lg0KICAgICAgICAgICAgICAgICAgICAkaGVscFR5cGUgPSBpZiAoJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWUpIHsgJHBhcmFtZXRlckhlbHAucGFyYW1ldGVyVmFsdWUuVHJpbSgpIH0NCgkJCQkJIyBQYXJhbWV0ZXIgdHlwZSBpbiBIZWxwIHNob3VsZCBtYXRjaCBjb2RlDQoJCQkJCUl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiAtVGVzdENhc2VzIEB7IGhlbHBUeXBlID0gJGhlbHBUeXBlOyBjb2RlVHlwZSA9ICRjb2RlVHlwZSB9IHsNCgkJCQkJCSRoZWxwVHlwZSB8IFNob3VsZCAtYmUgJGNvZGVUeXBlDQoJCQkJCX0NCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBmb3JlYWNoICgkaGVscFBhcm0gaW4gJEhlbHBQYXJhbWV0ZXJOYW1lcykgew0KCQkJCSMgU2hvdWxkbid0IGZpbmQgZXh0cmEgcGFyYW1ldGVycyBpbiBoZWxwLg0KCQkJCUl0ICJmaW5kcyBoZWxwIHBhcmFtZXRlciBpbiBjb2RlOiAkaGVscFBhcm0iIC1UZXN0Q2FzZXMgQHsgaGVscFBhcm0gPSAkaGVscFBhcm07IHBhcmFtZXRlck5hbWVzID0gJHBhcmFtZXRlck5hbWVzIH0gew0KCQkJCQkkaGVscFBhcm0gLWluICRwYXJhbWV0ZXJOYW1lcyB8IFNob3VsZCAtQmUgJHRydWUNCgkJCQl9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9AQmyAQAACbMBAAAGtAEAAA5IZWxwLlRlc3RzLnBzMQa1AQAAJcO+bmFtZcO+XHRlc3RzXGdlbmVyYWxcSGVscC5UZXN0cy5wczEJBgAAAAm3AQAACbgBAAABLwEAABIAAAAGuQEAAMsVRGVzY3JpYmUgIlZhbGlkYXRpbmcgdGhlIG1vZHVsZSBtYW5pZmVzdCIgew0KCSRtb2R1bGVSb290ID0gKFJlc29sdmUtUGF0aCAiJGdsb2JhbDp0ZXN0cm9vdFwuLiIpLlBhdGgNCgkkbWFuaWZlc3QgPSAoKEdldC1Db250ZW50ICIkbW9kdWxlUm9vdFzDvm5hbWXDvi5wc2QxIikgLWpvaW4gImBuIikgfCBJbnZva2UtRXhwcmVzc2lvbg0KCUNvbnRleHQgIkJhc2ljIHJlc291cmNlcyB2YWxpZGF0aW9uIiB7DQoJCSRmaWxlcyA9IEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiDQoJCUl0ICJFeHBvcnRzIGFsbCBmdW5jdGlvbnMgaW4gdGhlIHB1YmxpYyBmb2xkZXIiIC1UZXN0Q2FzZXMgQHsgZmlsZXMgPSAkZmlsZXM7IG1hbmlmZXN0ID0gJG1hbmlmZXN0IH0gew0KCQkJDQoJCQkkZnVuY3Rpb25zID0gKENvbXBhcmUtT2JqZWN0IC1SZWZlcmVuY2VPYmplY3QgJGZpbGVzLkJhc2VOYW1lIC1EaWZmZXJlbmNlT2JqZWN0ICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFdoZXJlLU9iamVjdCBTaWRlSW5kaWNhdG9yIC1MaWtlICc8PScpLklucHV0T2JqZWN0DQoJCQkkZnVuY3Rpb25zIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCX0NCgkJSXQgIkV4cG9ydHMgbm8gZnVuY3Rpb24gdGhhdCBpc24ndCBhbHNvIHByZXNlbnQgaW4gdGhlIHB1YmxpYyBmb2xkZXIiIC1UZXN0Q2FzZXMgQHsgZmlsZXMgPSAkZmlsZXM7IG1hbmlmZXN0ID0gJG1hbmlmZXN0IH0gew0KCQkJJGZ1bmN0aW9ucyA9IChDb21wYXJlLU9iamVjdCAtUmVmZXJlbmNlT2JqZWN0ICRmaWxlcy5CYXNlTmFtZSAtRGlmZmVyZW5jZU9iamVjdCAkbWFuaWZlc3QuRnVuY3Rpb25zVG9FeHBvcnQgfCBXaGVyZS1PYmplY3QgU2lkZUluZGljYXRvciAtTGlrZSAnPT4nKS5JbnB1dE9iamVjdA0KCQkJJGZ1bmN0aW9ucyB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJCQ0KCQlJdCAiRXhwb3J0cyBub25lIG9mIGl0cyBpbnRlcm5hbCBmdW5jdGlvbnMiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBtYW5pZmVzdCA9ICRtYW5pZmVzdCB9IHsNCgkJCSRmaWxlcyA9IEdldC1DaGlsZEl0ZW0gIiRtb2R1bGVSb290XGludGVybmFsXGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbGUgLUZpbHRlciAiKi5wczEiDQoJCQkkZmlsZXMgfCBXaGVyZS1PYmplY3QgQmFzZU5hbWUgLUluICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJfQ0KCQ0KCUNvbnRleHQgIkluZGl2aWR1YWwgZmlsZSB2YWxpZGF0aW9uIiB7DQoJCUl0ICJUaGUgcm9vdCBtb2R1bGUgZmlsZSBleGlzdHMiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBtYW5pZmVzdCA9ICRtYW5pZmVzdCB9IHsNCgkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJCgkbWFuaWZlc3QuUm9vdE1vZHVsZSkiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkZm9ybWF0IGluICRtYW5pZmVzdC5Gb3JtYXRzVG9Qcm9jZXNzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJGZvcm1hdCBzaG91bGQgZXhpc3QiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBmb3JtYXQgPSAkZm9ybWF0IH0gew0KCQkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJGZvcm1hdCIgfCBTaG91bGQgLUJlICR0cnVlDQoJCQl9DQoJCX0NCgkJDQoJCWZvcmVhY2ggKCR0eXBlIGluICRtYW5pZmVzdC5UeXBlc1RvUHJvY2VzcykNCgkJew0KCQkJSXQgIlRoZSBmaWxlICR0eXBlIHNob3VsZCBleGlzdCIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IHR5cGUgPSAkdHlwZSB9IHsNCgkJCQlUZXN0LVBhdGggIiRtb2R1bGVSb290XCR0eXBlIiB8IFNob3VsZCAtQmUgJHRydWUNCgkJCX0NCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJGFzc2VtYmx5IGluICRtYW5pZmVzdC5SZXF1aXJlZEFzc2VtYmxpZXMpDQoJCXsNCiAgICAgICAgICAgIGlmICgkYXNzZW1ibHkgLWxpa2UgIiouZGxsIikgew0KICAgICAgICAgICAgICAgIEl0ICJUaGUgZmlsZSAkYXNzZW1ibHkgc2hvdWxkIGV4aXN0IiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgYXNzZW1ibHkgPSAkYXNzZW1ibHkgfSB7DQogICAgICAgICAgICAgICAgICAgIFRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJGFzc2VtYmx5IiB8IFNob3VsZCAtQmUgJHRydWUNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICBJdCAiVGhlIGZpbGUgJGFzc2VtYmx5IHNob3VsZCBsb2FkIGZyb20gdGhlIEdBQyIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IGFzc2VtYmx5ID0gJGFzc2VtYmx5IH0gew0KICAgICAgICAgICAgICAgICAgICB7IEFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgJGFzc2VtYmx5IH0gfCBTaG91bGQgLU5vdCAtVGhyb3cNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCgkJDQoJCWZvcmVhY2ggKCR0YWcgaW4gJG1hbmlmZXN0LlByaXZhdGVEYXRhLlBTRGF0YS5UYWdzKQ0KCQl7DQoJCQlJdCAiVGFncyBzaG91bGQgaGF2ZSBubyBzcGFjZXMgaW4gbmFtZSIgLVRlc3RDYXNlcyBAeyB0YWcgPSAkdGFnIH0gew0KCQkJCSR0YWcgLW1hdGNoICIgIiB8IFNob3VsZCAtQmUgJGZhbHNlDQoJCQl9DQoJCX0NCgl9DQp9AQm6AQAACbsBAAAGvAEAABJNYW5pZmVzdC5UZXN0cy5wczEGvQEAACnDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXE1hbmlmZXN0LlRlc3RzLnBzMQkGAAAACb8BAAAJwAEAAAEwAQAAEgAAAAbBAQAAlglbQ21kbGV0QmluZGluZygpXQ0KUGFyYW0gKA0KCVtzd2l0Y2hdDQoJJFNraXBUZXN0LA0KCQ0KCVtzdHJpbmdbXV0NCgkkQ29tbWFuZFBhdGggPSBAKCIkZ2xvYmFsOnRlc3Ryb290XC4uXGZ1bmN0aW9ucyIsICIkZ2xvYmFsOnRlc3Ryb290XC4uXGludGVybmFsXGZ1bmN0aW9ucyIpDQopDQoNCmlmICgkU2tpcFRlc3QpIHsgcmV0dXJuIH0NCg0KJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyID0gTmV3LU9iamVjdCBTeXN0ZW0uQ29sbGVjdGlvbnMuQXJyYXlMaXN0DQoNCkRlc2NyaWJlICdJbnZva2luZyBQU1NjcmlwdEFuYWx5emVyIGFnYWluc3QgY29tbWFuZGJhc2UnIHsNCgkkY29tbWFuZEZpbGVzID0gZm9yZWFjaCAoJHBhdGggaW4gJENvbW1hbmRQYXRoKSB7DQogICAgICAgIEdldC1DaGlsZEl0ZW0gLVBhdGggJHBhdGggLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiDQogICAgfQ0KCSRzY3JpcHRBbmFseXplclJ1bGVzID0gR2V0LVNjcmlwdEFuYWx5emVyUnVsZQ0KCQ0KCWZvcmVhY2ggKCRmaWxlIGluICRjb21tYW5kRmlsZXMpDQoJew0KCQlDb250ZXh0ICJBbmFseXppbmcgJCgkZmlsZS5CYXNlTmFtZSkiIHsNCgkJCSRhbmFseXNpcyA9IEludm9rZS1TY3JpcHRBbmFseXplciAtUGF0aCAkZmlsZS5GdWxsTmFtZSAtRXhjbHVkZVJ1bGUgUFNBdm9pZFRyYWlsaW5nV2hpdGVzcGFjZSwgUFNTaG91bGRQcm9jZXNzDQoJCQkNCgkJCWZvckVhY2ggKCRydWxlIGluICRzY3JpcHRBbmFseXplclJ1bGVzKQ0KCQkJew0KCQkJCUl0ICJTaG91bGQgcGFzcyAkcnVsZSIgLVRlc3RDYXNlcyBAeyBhbmFseXNpcyA9ICRhbmFseXNpczsgcnVsZSA9ICRydWxlIH0gew0KCQkJCQlJZiAoJGFuYWx5c2lzLlJ1bGVOYW1lIC1jb250YWlucyAkcnVsZSkNCgkJCQkJew0KCQkJCQkJJGFuYWx5c2lzIHwgV2hlcmUtT2JqZWN0IFJ1bGVOYW1lIC1FUSAkcnVsZSAtb3V0dmFyaWFibGUgZmFpbHVyZXMgfCBGb3JFYWNoLU9iamVjdCB7ICRudWxsID0gJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyLkFkZCgkXykgfQ0KCQkJCQkJDQoJCQkJCQkxIHwgU2hvdWxkIC1CZSAwDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkwIHwgU2hvdWxkIC1CZSAwDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCX0NCgl9DQp9AQnCAQAACcMBAAAGxAEAABpQU1NjcmlwdEFuYWx5emVyLlRlc3RzLnBzMQbFAQAAMcO+bmFtZcO+XHRlc3RzXGdlbmVyYWxcUFNTY3JpcHRBbmFseXplci5UZXN0cy5wczEJBgAAAAnHAQAACcgBAAABMQEAABIAAAAGyQEAAOYHJGV4Y2VwdGlvbnMgPSBAeyB9DQoNCjwjDQpBIGxpc3Qgb2YgZW50cmllcyB0aGF0IE1BWSBiZSBpbiB0aGUgbGFuZ3VhZ2UgZmlsZXMsIHdpdGhvdXQgY2F1c2luZyB0aGUgdGVzdHMgdG8gZmFpbC4NClRoaXMgaXMgY29tbW9ubHkgdXNlZCBpbiBtb2R1bGVzIHRoYXQgZ2VuZXJhdGUgbG9jYWxpemVkIG1lc3NhZ2VzIHN0cmFpZ2h0IGZyb20gQyMuDQpTcGVjaWZ5IHRoZSBmdWxsIGtleSBhcyBpdCBpcyB3cml0dGVuIGluIHRoZSBsYW5ndWFnZSBmaWxlcywgZG8gbm90IHByZXBlbmQgdGhlIG1vZHVsZW5hbWUsDQphcyB5b3Ugd291bGQgaGF2ZSB0byBpbiBDIyBjb2RlLg0KDQpFeGFtcGxlOg0KJGV4Y2VwdGlvbnNbJ0xlZ2FsU3VycGx1cyddID0gQCgNCiAgICAnRXhjZXB0aW9uLlN0cmVhbXMuRmFpbGVkQ3JlYXRlJw0KICAgICdFeGNlcHRpb24uU3RyZWFtcy5GYWlsZWREaXNwb3NlJw0KKQ0KIz4NCiRleGNlcHRpb25zWydMZWdhbFN1cnBsdXMnXSA9IEAoDQoNCikNCjwjDQpBIGxpc3Qgb2YgZW50cmllcyB0aGF0IE1BWSBiZSB1c2VkIHdpdGhvdXQgbmVlZGluZyB0byBoYXZlIHRleHQgZGVmaW5lZC4NClRoaXMgaXMgaW50ZW5kZWQgZm9yIG1vZHVsZXMgKHJlLSl1c2luZyBzdHJpbmdzIHByb3ZpZGVkIGJ5IGFub3RoZXIgbW9kdWxlDQojPg0KJGV4Y2VwdGlvbnNbJ05vVGV4dE5lZWRlZCddID0gQCgNCgknVmFsaWRhdGUuRlNQYXRoJw0KCSdWYWxpZGF0ZS5GU1BhdGguRmlsZScNCgknVmFsaWRhdGUuRlNQYXRoLkZpbGVPclBhcmVudCcNCgknVmFsaWRhdGUuRlNQYXRoLkZvbGRlcicNCgknVmFsaWRhdGUuUGF0aCcNCgknVmFsaWRhdGUuUGF0aC5Db250YWluZXInDQoJJ1ZhbGlkYXRlLlBhdGguTGVhZicNCgknVmFsaWRhdGUuVGltZVNwYW4uUG9zaXRpdmUnDQoJJ1ZhbGlkYXRlLlVyaS5BYnNvbHV0ZScNCgknVmFsaWRhdGUuVXJpLkFic29sdXRlLkZpbGUnDQoJJ1ZhbGlkYXRlLlVyaS5BYnNvbHV0ZS5IdHRwcycNCikNCg0KJGV4Y2VwdGlvbnMBCcoBAAAJywEAAAbMAQAAFnN0cmluZ3MuRXhjZXB0aW9ucy5wczEGzQEAAC3Dvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXHN0cmluZ3MuRXhjZXB0aW9ucy5wczEJBgAAAAnPAQAACdABAAABMgEAABIAAAAG0QEAAJcIPCMNCi5ERVNDUklQVElPTg0KICAgIFRoaXMgdGVzdCB2ZXJpZmllcywgdGhhdCBhbGwgc3RyaW5ncyB0aGF0IGhhdmUgYmVlbiB1c2VkLA0KICAgIGFyZSBsaXN0ZWQgaW4gdGhlIGxhbmd1YWdlIGZpbGVzIGFuZCB0aHVzIGhhdmUgYSBtZXNzYWdlIGJlaW5nIGRpc3BsYXllZC4NCg0KICAgIEl0IGFsc28gY2hlY2tzLCB3aGV0aGVyIHRoZSBsYW5ndWFnZSBmaWxlcyBoYXZlIG9ycGhhbmVkIGVudHJpZXMgdGhhdCBuZWVkIGNsZWFuaW5nIHVwLg0KIz4NCg0KDQoNCkRlc2NyaWJlICJUZXN0aW5nIGxvY2FsaXphdGlvbiBzdHJpbmdzIiB7DQoJJG1vZHVsZVJvb3QgPSAoR2V0LU1vZHVsZSDDvm5hbWXDvikuTW9kdWxlQmFzZQ0KCSRzdHJpbmdzUmVzdWx0cyA9IEV4cG9ydC1QU01EU3RyaW5nIC1Nb2R1bGVSb290ICRtb2R1bGVSb290DQoJJGV4Y2VwdGlvbnMgPSAmICIkZ2xvYmFsOnRlc3Ryb290XGdlbmVyYWxcc3RyaW5ncy5FeGNlcHRpb25zLnBzMSINCgkNCglmb3JlYWNoICgkc3RyaW5nRW50cnkgaW4gJHN0cmluZ3NSZXN1bHRzKSB7DQogICAgICAgIGlmICgkc3RyaW5nRW50cnkuU3RyaW5nIC1lcSAia2V5IikgeyBjb250aW51ZSB9ICMgU2tpcHBpbmcgdGhlIHRlbXBsYXRlIGRlZmF1bHQgZW50cnkNCgkJSXQgIlNob3VsZCBiZSB1c2VkICYgaGF2ZSB0ZXh0OiAkKCRzdHJpbmdFbnRyeS5TdHJpbmcpIiAtVGVzdENhc2VzIEB7IHN0cmluZ0VudHJ5ID0gJHN0cmluZ0VudHJ5OyBleGNlcHRpb25zID0gJGV4Y2VwdGlvbnMgfSB7DQogICAgICAgICAgICBpZiAoJGV4Y2VwdGlvbnMuTGVnYWxTdXJwbHVzIC1ub3Rjb250YWlucyAkc3RyaW5nRW50cnkuU3RyaW5nKSB7DQogICAgICAgICAgICAgICAgJHN0cmluZ0VudHJ5LlN1cnBsdXMgfCBTaG91bGQgLUJlRmFsc2UNCgkJCX0NCgkJCWlmICgkZXhjZXB0aW9ucy5Ob1RleHROZWVkZWQgLW5vdGNvbnRhaW5zICRzdHJpbmdFbnRyeS5TdHJpbmcpIHsNCgkJCQkkc3RyaW5nRW50cnkuVGV4dCB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCQl9DQogICAgICAgIH0NCiAgICB9DQp9AQnSAQAACdMBAAAG1AEAABFzdHJpbmdzLlRlc3RzLnBzMQbVAQAAKMO+bmFtZcO+XHRlc3RzXGdlbmVyYWxcc3RyaW5ncy5UZXN0cy5wczEJBgAAAAnXAQAACdgBAAABOgEAAAcAAAAJ2QEAAAEAAAABAAAAATsBAAAHAAAACQsAAAAAAAAAAAAAAAE/AQAABwAAAAkLAAAAAAAAAAAAAAABQAEAAAcAAAAJCwAAAAAAAAAAAAAAAUIBAAAHAAAACQsAAAAAAAAAAAAAAAFDAQAABwAAAAkLAAAAAAAAAAAAAAABRwEAAAcAAAAJCwAAAAAAAAAAAAAAAUgBAAAHAAAACQsAAAAAAAAAAAAAAAFKAQAABwAAAAkLAAAAAAAAAAAAAAABSwEAAAcAAAAJCwAAAAAAAAAAAAAAAU8BAAAHAAAACQsAAAAAAAAAAAAAAAFQAQAABwAAAAkLAAAAAAAAAAAAAAABUgEAAAcAAAAJ2wEAAAEAAAABAAAAAVMBAAAHAAAACQsAAAAAAAAAAAAAAAFXAQAABwAAAAkLAAAAAAAAAAAAAAABWAEAAAcAAAAJCwAAAAAAAAAAAAAAAVoBAAAHAAAACd0BAAACAAAAAgAAAAFbAQAABwAAAAneAQAAAgAAAAIAAAABXwEAAAcAAAAJCwAAAAAAAAAAAAAAAWABAAAHAAAACQsAAAAAAAAAAAAAAAFiAQAABwAAAAkLAAAAAAAAAAAAAAABYwEAAAcAAAAJCwAAAAAAAAAAAAAAAWcBAAAHAAAACQsAAAAAAAAAAAAAAAFoAQAABwAAAAkLAAAAAAAAAAAAAAABagEAAAcAAAAJCwAAAAAAAAAAAAAAAWsBAAAHAAAACQsAAAAAAAAAAAAAAAFvAQAABwAAAAkLAAAAAAAAAAAAAAABcAEAAAcAAAAJCwAAAAAAAAAAAAAAAXIBAAAHAAAACeABAAABAAAAAQAAAAFzAQAABwAAAAkLAAAAAAAAAAAAAAABdwEAAAcAAAAJCwAAAAAAAAAAAAAAAXgBAAAHAAAACQsAAAAAAAAAAAAAAAF6AQAABwAAAAniAQAAAQAAAAEAAAABewEAAAcAAAAJCwAAAAAAAAAAAAAAAX8BAAAHAAAACQsAAAAAAAAAAAAAAAGAAQAABwAAAAkLAAAAAAAAAAAAAAABggEAAAcAAAAJ5AEAAAEAAAABAAAAAYMBAAAHAAAACQsAAAAAAAAAAAAAAAGHAQAABwAAAAkLAAAAAAAAAAAAAAABiAEAAAcAAAAJCwAAAAAAAAAAAAAAAYoBAAAHAAAACQsAAAAAAAAAAAAAAAGLAQAABwAAAAkLAAAAAAAAAAAAAAABjwEAAAcAAAAJCwAAAAAAAAAAAAAAAZABAAAHAAAACQsAAAAAAAAAAAAAAAGSAQAABwAAAAkLAAAAAAAAAAAAAAABkwEAAAcAAAAJCwAAAAAAAAAAAAAAAZcBAAAHAAAACQsAAAAAAAAAAAAAAAGYAQAABwAAAAkLAAAAAAAAAAAAAAABmgEAAAcAAAAJCwAAAAAAAAAAAAAAAZsBAAAHAAAACQsAAAAAAAAAAAAAAAGfAQAABwAAAAkLAAAAAAAAAAAAAAABoAEAAAcAAAAJCwAAAAAAAAAAAAAAAaIBAAAHAAAACQsAAAAAAAAAAAAAAAGjAQAABwAAAAkLAAAAAAAAAAAAAAABpwEAAAcAAAAJCwAAAAAAAAAAAAAAAagBAAAHAAAACQsAAAAAAAAAAAAAAAGqAQAABwAAAAkLAAAAAAAAAAAAAAABqwEAAAcAAAAJCwAAAAAAAAAAAAAAAa8BAAAHAAAACQsAAAAAAAAAAAAAAAGwAQAABwAAAAkLAAAAAAAAAAAAAAABsgEAAAcAAAAJ5gEAAAEAAAABAAAAAbMBAAAHAAAACQsAAAAAAAAAAAAAAAG3AQAABwAAAAkLAAAAAAAAAAAAAAABuAEAAAcAAAAJCwAAAAAAAAAAAAAAAboBAAAHAAAACegBAAABAAAAAQAAAAG7AQAABwAAAAkLAAAAAAAAAAAAAAABvwEAAAcAAAAJCwAAAAAAAAAAAAAAAcABAAAHAAAACQsAAAAAAAAAAAAAAAHCAQAABwAAAAkLAAAAAAAAAAAAAAABwwEAAAcAAAAJCwAAAAAAAAAAAAAAAccBAAAHAAAACQsAAAAAAAAAAAAAAAHIAQAABwAAAAkLAAAAAAAAAAAAAAABygEAAAcAAAAJCwAAAAAAAAAAAAAAAcsBAAAHAAAACQsAAAAAAAAAAAAAAAHPAQAABwAAAAkLAAAAAAAAAAAAAAAB0AEAAAcAAAAJCwAAAAAAAAAAAAAAAdIBAAAHAAAACeoBAAABAAAAAQAAAAHTAQAABwAAAAkLAAAAAAAAAAAAAAAB1wEAAAcAAAAJCwAAAAAAAAAAAAAAAdgBAAAHAAAACQsAAAAAAAAAAAAAABHZAQAABAAAAAbsAQAABG5hbWUNAxHbAQAABAAAAAbtAQAABG5hbWUNAxHdAQAABAAAAAbuAQAABG5hbWUG7wEAAAZhdXRob3INAhHeAQAABAAAAAbwAQAABGRhdGUG8QEAAAR5ZWFyDQIR4AEAAAQAAAAG8gEAAARuYW1lDQMR4gEAAAQAAAAG8wEAAARuYW1lDQMR5AEAAAQAAAAG9AEAAARuYW1lDQMR5gEAAAQAAAAG9QEAAARuYW1lDQMR6AEAAAQAAAAG9gEAAARuYW1lDQMR6gEAAAQAAAAG9wEAAARuYW1lDQML</BA> </MS> </Obj> <Obj RefId="37"> <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"># Auto detect text files and perform LF normalization_x000D__x000A_* text=auto</S> <B N="PlainText">true</B> <Obj N="ContentParameterFlat" RefId="38"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="ContentParameterScript" RefId="39"> <TNRef RefId="2" /> <LST /> </Obj> <S N="Name">.gitattributes</S> <S N="RelativePath">.gitattributes</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="40"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="41"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAQiMgQXV0byBkZXRlY3QgdGV4dCBmaWxlcyBhbmQgcGVyZm9ybSBMRiBub3JtYWxpemF0aW9uDQoqIHRleHQ9YXV0bwEJBAAAAAkFAAAABgYAAAAOLmdpdGF0dHJpYnV0ZXMGBwAAAA4uZ2l0YXR0cmlidXRlcwYIAAAAAsO+CQkAAAAJCgAAAAQEAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQsAAAAAAAAAAAAAAAEFAAAABAAAAAkLAAAAAAAAAAAAAAABCQAAAAQAAAAJCwAAAAAAAAAAAAAAAQoAAAAEAAAACQsAAAAAAAAAAAAAABELAAAAAAAAAAs=</BA> </MS> </Obj> <Obj RefId="42"> <TNRef RefId="8" /> <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString> <Props> <S N="Value">_x000D__x000A_# ignore the settings folder and files for VSCode and PSS_x000D__x000A_.vscode/*_x000D__x000A_*.psproj_x000D__x000A_*TempPoint*_x000D__x000A__x000D__x000A_# Ignore staging info from Visual Studio_x000D__x000A_library/þnameþ/.vs/*_x000D__x000A_library/þnameþ/þnameþ/bin/*_x000D__x000A_library/þnameþ/þnameþ/obj/*_x000D__x000A__x000D__x000A_# ignore PowerShell Studio MetaData_x000D__x000A_þnameþ/þnameþ.psproj_x000D__x000A_þnameþ/þnameþ.psproj.bak_x000D__x000A_þnameþ/þnameþ.psprojs_x000D__x000A_þnameþ/þnameþ.psproj_x000D__x000A__x000D__x000A_# ignore the TestResults_x000D__x000A_TestResults/*_x000D__x000A__x000D__x000A_# ignore the publishing Directory_x000D__x000A_publish/*</S> <B N="PlainText">true</B> <Obj N="ContentParameterFlat" RefId="43"> <TNRef RefId="2" /> <LST> <S>name</S> </LST> </Obj> <Obj N="ContentParameterScript" RefId="44"> <TNRef RefId="2" /> <LST /> </Obj> <S N="Name">.gitignore</S> <S N="RelativePath">.gitignore</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="45"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="46"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAA0gMNCiMgaWdub3JlIHRoZSBzZXR0aW5ncyBmb2xkZXIgYW5kIGZpbGVzIGZvciBWU0NvZGUgYW5kIFBTUw0KLnZzY29kZS8qDQoqLnBzcHJvag0KKlRlbXBQb2ludCoNCg0KIyBJZ25vcmUgc3RhZ2luZyBpbmZvIGZyb20gVmlzdWFsIFN0dWRpbw0KbGlicmFyeS/Dvm5hbWXDvi8udnMvKg0KbGlicmFyeS/Dvm5hbWXDvi/Dvm5hbWXDvi9iaW4vKg0KbGlicmFyeS/Dvm5hbWXDvi/Dvm5hbWXDvi9vYmovKg0KDQojIGlnbm9yZSBQb3dlclNoZWxsIFN0dWRpbyBNZXRhRGF0YQ0Kw75uYW1lw74vw75uYW1lw74ucHNwcm9qDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2ouYmFrDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2pzDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2oNCg0KIyBpZ25vcmUgdGhlIFRlc3RSZXN1bHRzDQpUZXN0UmVzdWx0cy8qDQoNCiMgaWdub3JlIHRoZSBwdWJsaXNoaW5nIERpcmVjdG9yeQ0KcHVibGlzaC8qAQkEAAAACQUAAAAGBgAAAAouZ2l0aWdub3JlBgcAAAAKLmdpdGlnbm9yZQYIAAAAAsO+CQkAAAAJCgAAAAQEAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQsAAAABAAAAAQAAAAEFAAAABAAAAAkMAAAAAAAAAAAAAAABCQAAAAQAAAAJDAAAAAAAAAAAAAAAAQoAAAAEAAAACQwAAAAAAAAAAAAAABELAAAABAAAAAYNAAAABG5hbWUNAxEMAAAAAAAAAAs=</BA> </MS> </Obj> <Obj RefId="47"> <TNRef RefId="8" /> <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString> <Props> <S N="Value">pool:_x000D__x000A_ name: Hosted VS2017_x000D__x000A_steps:_x000D__x000A_- task: PowerShell@2_x000D__x000A_ displayName: Prerequisites_x000D__x000A_ inputs:_x000D__x000A_ targetType: filePath_x000D__x000A_ filePath: './build/vsts-prerequisites.ps1'_x000D__x000A__x000D__x000A_- task: PowerShell@2_x000D__x000A_ displayName: Validate_x000D__x000A_ inputs:_x000D__x000A_ targetType: filePath_x000D__x000A_ filePath: './build/vsts-validate.ps1'_x000D__x000A__x000D__x000A_- task: PublishTestResults@2_x000D__x000A_ displayName: 'Publish Test Results **/TEST-*.xml'_x000D__x000A_ inputs:_x000D__x000A_ testResultsFormat: NUnit_x000D__x000A_ condition: always()_x000D__x000A_</S> <B N="PlainText">true</B> <Obj N="ContentParameterFlat" RefId="48"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="ContentParameterScript" RefId="49"> <TNRef RefId="2" /> <LST /> </Obj> <S N="Name">azure-pipelines.yml</S> <S N="RelativePath">azure-pipelines.yml</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="50"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="51"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAxQNwb29sOg0KICBuYW1lOiBIb3N0ZWQgVlMyMDE3DQpzdGVwczoNCi0gdGFzazogUG93ZXJTaGVsbEAyDQogIGRpc3BsYXlOYW1lOiBQcmVyZXF1aXNpdGVzDQogIGlucHV0czoNCiAgICB0YXJnZXRUeXBlOiBmaWxlUGF0aA0KICAgIGZpbGVQYXRoOiAnLi9idWlsZC92c3RzLXByZXJlcXVpc2l0ZXMucHMxJw0KDQotIHRhc2s6IFBvd2VyU2hlbGxAMg0KICBkaXNwbGF5TmFtZTogVmFsaWRhdGUNCiAgaW5wdXRzOg0KICAgIHRhcmdldFR5cGU6IGZpbGVQYXRoDQogICAgZmlsZVBhdGg6ICcuL2J1aWxkL3ZzdHMtdmFsaWRhdGUucHMxJw0KDQotIHRhc2s6IFB1Ymxpc2hUZXN0UmVzdWx0c0AyDQogIGRpc3BsYXlOYW1lOiAnUHVibGlzaCBUZXN0IFJlc3VsdHMgKiovVEVTVC0qLnhtbCcNCiAgaW5wdXRzOg0KICAgIHRlc3RSZXN1bHRzRm9ybWF0OiBOVW5pdA0KICBjb25kaXRpb246IGFsd2F5cygpDQoBCQQAAAAJBQAAAAYGAAAAE2F6dXJlLXBpcGVsaW5lcy55bWwGBwAAABNhenVyZS1waXBlbGluZXMueW1sBggAAAACw74JCQAAAAkKAAAABAQAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCwAAAAAAAAAAAAAAAQUAAAAEAAAACQsAAAAAAAAAAAAAAAEJAAAABAAAAAkLAAAAAAAAAAAAAAABCgAAAAQAAAAJCwAAAAAAAAAAAAAAEQsAAAAAAAAACw==</BA> </MS> </Obj> <Obj RefId="52"> <TNRef RefId="8" /> <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString> <Props> <S N="Value"><#_x000D__x000A__x0009_.SYNOPSIS_x000D__x000A__x0009__x0009_Installs the þnameþ Module from github_x000D__x000A__x0009__x0009__x000D__x000A__x0009_.DESCRIPTION_x000D__x000A__x0009__x0009_This script installs the þnameþ Module from github._x000D__x000A__x0009__x0009__x000D__x000A__x0009__x0009_It does so by ..._x000D__x000A__x0009__x0009_- downloading the specified branch as zip to $env:TEMP_x000D__x000A__x0009__x0009_- Unpacking that zip file to a folder in $env:TEMP_x000D__x000A__x0009__x0009_- Moving that content to a module folder in either program files (default) or the user profile_x000D__x000A__x0009__x000D__x000A__x0009_.PARAMETER Branch_x000D__x000A__x0009__x0009_The branch to install. Installs master by default._x000D__x000A__x0009__x0009_Unknown branches will terminate the script in error._x000D__x000A__x0009__x000D__x000A__x0009_.PARAMETER UserMode_x000D__x000A__x0009__x0009_The downloaded module will be moved to the user profile, rather than program files._x000D__x000A__x0009__x0009__x000D__x000A__x0009_.PARAMETER Scope_x000D__x000A__x0009__x0009_By default, the downloaded module will be moved to program files._x000D__x000A__x0009__x0009_Setting this to 'CurrentUser' installs to the userprofile of the current user._x000D__x000A__x000D__x000A__x0009_.PARAMETER Force_x000D__x000A__x0009__x0009_The install script will overwrite an existing module._x000D__x000A_#>_x000D__x000A_[CmdletBinding()]_x000D__x000A_Param (_x000D__x000A__x0009_[string]_x000D__x000A__x0009_$Branch = "master",_x000D__x000A__x0009__x000D__x000A__x0009_[switch]_x000D__x000A__x0009_$UserMode,_x000D__x000A__x0009__x000D__x000A__x0009_[ValidateSet('AllUsers', 'CurrentUser')]_x000D__x000A__x0009_[string]_x000D__x000A__x0009_$Scope = "AllUsers",_x000D__x000A__x0009__x000D__x000A__x0009_[switch]_x000D__x000A__x0009_$Force_x000D__x000A_)_x000D__x000A__x000D__x000A_#region Configuration for cloning script_x000D__x000A_# Name of the module that is being cloned_x000D__x000A_$ModuleName = "þnameþ"_x000D__x000A__x000D__x000A_# Base path to the github repository_x000D__x000A_$BaseUrl = "https://github.com/<InsertUsernameHere>/þnameþ"_x000D__x000A__x000D__x000A_# If the module is in a subfolder of the cloned repository, specify relative path here. Empty string to skip._x000D__x000A_$SubFolder = "þnameþ"_x000D__x000A_#endregion Configuration for cloning script_x000D__x000A__x000D__x000A_#region Parameter Calculation_x000D__x000A_$doUserMode = $false_x000D__x000A_if ($UserMode) { $doUserMode = $true }_x000D__x000A_if ($install_CurrentUser) { $doUserMode = $true }_x000D__x000A_if ($Scope -eq 'CurrentUser') { $doUserMode = $true }_x000D__x000A__x000D__x000A_if ($install_Branch) { $Branch = $install_Branch }_x000D__x000A_#endregion Parameter Calculation_x000D__x000A__x000D__x000A_#region Utility Functions_x000D__x000A_function Compress-Archive_x000D__x000A_{_x000D__x000A__x0009_<#_x000D__x000A__x0009__x0009_.SYNOPSIS_x000D__x000A__x0009__x0009__x0009_Creates an archive, or zipped file, from specified files and folders._x000D__x000A__x000D__x000A__x0009__x0009_.DESCRIPTION_x000D__x000A__x0009__x0009__x0009_The Compress-Archive cmdlet creates a zipped (or compressed) archive file from one or more specified files or folders. An archive file allows multiple files to be packaged, and optionally compressed, into a single zipped file for easier distribution and storage. An archive file can be compressed by using the compression algorithm specified by the CompressionLevel parameter._x000D__x000A__x000D__x000A__x0009__x0009__x0009_Because Compress-Archive relies upon the Microsoft .NET Framework API System.IO.Compression.ZipArchive to compress files, the maximum file size that you can compress by using Compress-Archive is currently 2 GB. This is a limitation of the underlying API._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Path_x000D__x000A__x0009__x0009__x0009_Specifies the path or paths to the files that you want to add to the archive zipped file. This parameter can accept wildcard characters. Wildcard characters allow you to add all files in a folder to your zipped archive file. To specify multiple paths, and include files in multiple locations in your output zipped file, use commas to separate the paths._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER LiteralPath_x000D__x000A__x0009__x0009__x0009_Specifies the path or paths to the files that you want to add to the archive zipped file. Unlike the Path parameter, the value of LiteralPath is used exactly as it is typed. No characters are interpreted as wildcards. If the path includes escape characters, enclose each escape character in single quotation marks, to instruct Windows PowerShell not to interpret any characters as escape sequences. To specify multiple paths, and include files in multiple locations in your output zipped file, use commas to separate the paths._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER DestinationPath_x000D__x000A__x0009__x0009__x0009_Specifies the path to the archive output file. This parameter is required. The specified DestinationPath value should include the desired name of the output zipped file; it specifies either the absolute or relative path to the zipped file. If the file name specified in DestinationPath does not have a .zip file name extension, the cmdlet adds a .zip file name extension._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER CompressionLevel_x000D__x000A__x0009__x0009__x0009_Specifies how much compression to apply when you are creating the archive file. Faster compression requires less time to create the file, but can result in larger file sizes. The acceptable values for this parameter are:_x000D__x000A__x000D__x000A__x0009__x0009__x0009_- Fastest. Use the fastest compression method available to decrease processing time; this can result in larger file sizes._x000D__x000A__x0009__x0009__x0009_- NoCompression. Do not compress the source files._x000D__x000A__x0009__x0009__x0009_- Optimal. Processing time is dependent on file size._x000D__x000A__x000D__x000A__x0009__x0009__x0009_If this parameter is not specified, the command uses the default value, Optimal._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Update_x000D__x000A__x0009__x0009__x0009_Updates the specified archive by replacing older versions of files in the archive with newer versions of files that have the same names. You can also add this parameter to add files to an existing archive._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Force_x000D__x000A__x0009__x0009__x0009_@{Text=}_x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Confirm_x000D__x000A__x0009__x0009__x0009_Prompts you for confirmation before running the cmdlet._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER WhatIf_x000D__x000A__x0009__x0009__x0009_Shows what would happen if the cmdlet runs. The cmdlet is not run._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 1: Create an archive file_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\>Compress-Archive -LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd -CompressionLevel Optimal -DestinationPath C:\Archives\Draft.Zip_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command creates a new archive file, Draft.zip, by compressing two files, Draftdoc.docx and diagram2.vsd, specified by the LiteralPath parameter. The compression level specified for this operation is Optimal._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 2: Create an archive with wildcard characters_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\>Compress-Archive -Path C:\Reference\* -CompressionLevel Fastest -DestinationPath C:\Archives\Draft_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command creates a new archive file, Draft.zip, in the C:\Archives folder. Note that though the file name extension .zip was not added to the value of the DestinationPath parameter, Windows PowerShell appends this to the specified archive file name automatically. The new archive file contains every file in the C:\Reference folder, because a wildcard character was used in place of specific file names in the Path parameter. The specified compression level is Fastest, which might result in a larger output file, but compresses a large number of files faster._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 3: Update an existing archive file_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\>Compress-Archive -Path C:\Reference\* -Update -DestinationPath C:\Archives\Draft.Zip_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command updates an existing archive file, Draft.Zip, in the C:\Archives folder. The command is run to update Draft.Zip with newer versions of existing files that came from the C:\Reference folder, and also to add new files that have been added to C:\Reference since Draft.Zip was initially created._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 4: Create an archive from an entire folder_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\>Compress-Archive -Path C:\Reference -DestinationPath C:\Archives\Draft_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command creates an archive from an entire folder, C:\Reference. Note that though the file name extension .zip was not added to the value of the DestinationPath parameter, Windows PowerShell appends this to the specified archive file name automatically._x000D__x000A__x0009_#>_x000D__x000A__x0009_[CmdletBinding(DefaultParameterSetName = "Path", SupportsShouldProcess = $true, HelpUri = "http://go.microsoft.com/fwlink/?LinkID=393252")]_x000D__x000A__x0009_param_x000D__x000A__x0009_(_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, Position = 0, ParameterSetName = "Path", ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, Position = 0, ParameterSetName = "PathWithForce", ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, Position = 0, ParameterSetName = "PathWithUpdate", ValueFromPipeline = $true, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009_$Path,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (mandatory = $true, ParameterSetName = "LiteralPath", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, ParameterSetName = "LiteralPathWithForce", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[parameter (mandatory = $true, ParameterSetName = "LiteralPathWithUpdate", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[Alias("PSPath")]_x000D__x000A__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009_$LiteralPath,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (mandatory = $true,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Position = 1,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$DestinationPath,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (_x000D__x000A__x0009__x0009__x0009__x0009__x0009_mandatory = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[ValidateSet("Optimal", "NoCompression", "Fastest")]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$CompressionLevel = "Optimal",_x000D__x000A__x000D__x000A__x0009__x0009_[parameter(mandatory = $true, ParameterSetName = "PathWithUpdate", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[parameter(mandatory = $true, ParameterSetName = "LiteralPathWithUpdate", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[switch]_x000D__x000A__x0009__x0009_$Update = $false,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter(mandatory = $true, ParameterSetName = "PathWithForce", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[parameter(mandatory = $true, ParameterSetName = "LiteralPathWithForce", ValueFromPipeline = $false, ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[switch]_x000D__x000A__x0009__x0009_$Force = $false_x000D__x000A__x0009_)_x000D__x000A__x000D__x000A__x0009_BEGIN_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Add-Type -AssemblyName System.IO.Compression -ErrorAction Ignore_x000D__x000A__x0009__x0009_Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction Ignore_x000D__x000A__x000D__x000A__x0009__x0009_$zipFileExtension = ".zip"_x000D__x000A__x000D__x000A__x0009__x0009_$LocalizedData = ConvertFrom-StringData @'_x000D__x000A_PathNotFoundError=The path '{0}' either does not exist or is not a valid file system path._x000D__x000A_ExpandArchiveInValidDestinationPath=The path '{0}' is not a valid file system directory path._x000D__x000A_InvalidZipFileExtensionError={0} is not a supported archive file format. {1} is the only supported archive file format._x000D__x000A_ArchiveFileIsReadOnly=The attributes of the archive file {0} is set to 'ReadOnly' hence it cannot be updated. If you intend to update the existing archive file, remove the 'ReadOnly' attribute on the archive file else use -Force parameter to override and create a new archive file._x000D__x000A_ZipFileExistError=The archive file {0} already exists. Use the -Update parameter to update the existing archive file or use the -Force parameter to overwrite the existing archive file._x000D__x000A_DuplicatePathFoundError=The input to {0} parameter contains a duplicate path '{1}'. Provide a unique set of paths as input to {2} parameter._x000D__x000A_ArchiveFileIsEmpty=The archive file {0} is empty._x000D__x000A_CompressProgressBarText=The archive file '{0}' creation is in progress..._x000D__x000A_ExpandProgressBarText=The archive file '{0}' expansion is in progress..._x000D__x000A_AppendArchiveFileExtensionMessage=The archive file path '{0}' supplied to the DestinationPath patameter does not include .zip extension. Hence .zip is appended to the supplied DestinationPath path and the archive file would be created at '{1}'._x000D__x000A_AddItemtoArchiveFile=Adding '{0}'._x000D__x000A_CreateFileAtExpandedPath=Created '{0}'._x000D__x000A_InvalidArchiveFilePathError=The archive file path '{0}' specified as input to the {1} parameter is resolving to multiple file system paths. Provide a unique path to the {2} parameter where the archive file has to be created._x000D__x000A_InvalidExpandedDirPathError=The directory path '{0}' specified as input to the DestinationPath parameter is resolving to multiple file system paths. Provide a unique path to the Destination parameter where the archive file contents have to be expanded._x000D__x000A_FileExistsError=Failed to create file '{0}' while expanding the archive file '{1}' contents as the file '{2}' already exists. Use the -Force parameter if you want to overwrite the existing directory '{3}' contents when expanding the archive file._x000D__x000A_DeleteArchiveFile=The partially created archive file '{0}' is deleted as it is not usable._x000D__x000A_InvalidDestinationPath=The destination path '{0}' does not contain a valid archive file name._x000D__x000A_PreparingToCompressVerboseMessage=Preparing to compress..._x000D__x000A_PreparingToExpandVerboseMessage=Preparing to expand..._x000D__x000A_'@_x000D__x000A__x000D__x000A__x0009__x0009_#region Utility Functions_x000D__x000A__x0009__x0009_function GetResolvedPathHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isLiteralPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.PSCmdlet]_x000D__x000A__x0009__x0009__x0009__x0009_$callerPSCmdlet_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$resolvedPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($isLiteralPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentResolvedPaths = Resolve-Path -LiteralPath $currentPath -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentResolvedPaths = Resolve-Path -Path $currentPath -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_catch_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $currentPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$exception = New-Object System.InvalidOperationException $errorMessage, $_.Exception_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "ArchiveCmdletPathNotFound" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $currentPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$callerPSCmdlet.ThrowTerminatingError($errorRecord)_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentResolvedPath in $currentResolvedPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$resolvedPaths += $currentResolvedPath.ProviderPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$resolvedPaths_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function Add-CompressionAssemblies_x000D__x000A__x0009__x0009_{_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($PSEdition -eq "Desktop")_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_Add-Type -AssemblyName System.IO.Compression_x000D__x000A__x0009__x0009__x0009__x0009_Add-Type -AssemblyName System.IO.Compression.FileSystem_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function IsValidFileSystemPath_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$result = $true;_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_if (!([System.IO.File]::Exists($currentPath) -or [System.IO.Directory]::Exists($currentPath)))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $currentPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "PathNotFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $result;_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x000D__x000A__x0009__x0009_function ValidateDuplicateFileSystemPath_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$inputParameter,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$uniqueInputPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$currentInputPath = $currentPath.ToUpper()_x000D__x000A__x0009__x0009__x0009__x0009_if ($uniqueInputPaths.Contains($currentInputPath))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.DuplicatePathFoundError -f $inputParameter, $currentPath, $inputParameter)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "DuplicatePathFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$uniqueInputPaths += $currentInputPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressionLevelMapper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::Optimal_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# CompressionLevel format is already validated at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_switch ($compressionLevel.ToString())_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_"Fastest"_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::Fastest_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_"NoCompression"_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::NoCompression_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $compressionLevelFormat_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = 0_x000D__x000A__x0009__x0009__x0009_$sourceFilePaths = @()_x000D__x000A__x0009__x0009__x0009_$sourceDirPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $sourcePath)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$result = Test-Path -LiteralPath $currentPath -PathType Leaf_x000D__x000A__x0009__x0009__x0009__x0009_if ($result -eq $true)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$sourceFilePaths += $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$sourceDirPaths += $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# The Soure Path contains one or more directory (this directory can have files under it) and no files to be compressed._x000D__x000A__x0009__x0009__x0009_if ($sourceFilePaths.Count -eq 0 -and $sourceDirPaths.Count -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100/[double]$sourceDirPaths.Count_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentSourceDirPath in $sourceDirPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$count = CompressSingleDirHelper $currentSourceDirPath $destinationPath $compressionLevel $true $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight += $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# The Soure Path contains only files to be compressed._x000D__x000A__x0009__x0009__x0009_elseIf ($sourceFilePaths.Count -gt 0 -and $sourceDirPaths.Count -eq 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# $previousSegmentWeight is equal to 0 as there are no prior segments._x000D__x000A__x0009__x0009__x0009__x0009_# $currentSegmentWeight is set to 100 as all files have equal weightage._x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived = CompressFilesHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_# The Soure Path contains one or more files and one or more directories (this directory can have files under it) to be compressed._x000D__x000A__x0009__x0009__x0009_elseif ($sourceFilePaths.Count -gt 0 -and $sourceDirPaths.Count -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# each directory is considered as an individual segments & all the individual files are clubed in to a separate sgemnet._x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100/[double]($sourceDirPaths.Count + 1)_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentSourceDirPath in $sourceDirPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$count = CompressSingleDirHelper $currentSourceDirPath $destinationPath $compressionLevel $true $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight += $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$count = CompressFilesHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressFilesHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourceFilePaths,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = ZipArchiveHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $null $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressSingleDirHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$useParentDirAsRoot,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_[System.Collections.Generic.List[System.String]]$subDirFiles = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($useParentDirAsRoot)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirInfo = New-Object -TypeName System.IO.DirectoryInfo -ArgumentList $sourceDirPath_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirFullName = $sourceDirInfo.Parent.FullName_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# If the directory is present at the drive level the DirectoryInfo.Parent include '\' example: C:\_x000D__x000A__x0009__x0009__x0009__x0009_# On the other hand if the directory exists at a deper level then DirectoryInfo.Parent_x000D__x000A__x0009__x0009__x0009__x0009_# has just the path (without an ending '\'). example C:\source_x000D__x000A__x0009__x0009__x0009__x0009_if ($sourceDirFullName.Length -eq 3)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName + "\"_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirFullName = $sourceDirPath_x000D__x000A__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName + "\"_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$dirContents = Get-ChildItem -LiteralPath $sourceDirPath -Recurse_x000D__x000A__x0009__x0009__x0009_foreach ($currentContent in $dirContents)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$isContainer = $currentContent -is [System.IO.DirectoryInfo]_x000D__x000A__x0009__x0009__x0009__x0009_if (!$isContainer)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$subDirFiles.Add($currentContent.FullName)_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The currentContent points to a directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# We need to check if the directory is an empty directory, if so such a_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# directory has to be explictly added to the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# if there are no files in the directory the GetFiles() API returns an empty array._x000D__x000A__x0009__x0009__x0009__x0009__x0009_$files = $currentContent.GetFiles()_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($files.Count -eq 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$subDirFiles.Add($currentContent.FullName + "\")_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = ZipArchiveHelper $subDirFiles.ToArray() $destinationPath $compressionLevel $isUpdateMode $modifiedSourceDirFullName $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function ZipArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[System.Collections.Generic.List[System.String]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePaths,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = 0_x000D__x000A__x0009__x0009__x0009_$fileMode = [System.IO.FileMode]::Create_x000D__x000A__x0009__x0009__x0009_$result = Test-Path -LiteralPath $DestinationPath -PathType Leaf_x000D__x000A__x0009__x0009__x0009_if ($result -eq $true)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$fileMode = [System.IO.FileMode]::Open_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_Add-CompressionAssemblies_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# At this point we are sure that the archive file has write access._x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStreamArgs = @($destinationPath, $fileMode)_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Update, $false)_x000D__x000A__x0009__x0009__x0009__x0009_$zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount = 0_x000D__x000A__x0009__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.CompressProgressBarText -f $destinationPath)_x000D__x000A__x0009__x0009__x0009__x0009_$bufferSize = 4kb_x000D__x000A__x0009__x0009__x0009__x0009_$buffer = New-Object Byte[] $bufferSize_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentFilePath in $sourcePaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($modifiedSourceDirFullName -ne $null -and $modifiedSourceDirFullName.Length -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$index = $currentFilePath.IndexOf($modifiedSourceDirFullName, [System.StringComparison]::OrdinalIgnoreCase)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentFilePathSubString = $currentFilePath.Substring($index, $modifiedSourceDirFullName.Length)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$relativeFilePath = $currentFilePath.Replace($currentFilePathSubString, "").Trim()_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$relativeFilePath = [System.IO.Path]::GetFileName($currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# Update mode is selected._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# Check to see if archive file already contains one or more zip files in it._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($isUpdateMode -eq $true -and $zipArchive.Entries.Count -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated = $null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the file already exists in the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# If so replace it with new file from the input source._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# If the file does not exist in the archive file then default to_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# create mode and create the entry in the archive file._x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_foreach ($currentArchiveEntry in $zipArchive.Entries)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($currentArchiveEntry.FullName -eq $relativeFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated = $currentArchiveEntry_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_break_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_if ($entryToBeUpdated -ne $null)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated.Delete()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compression = CompressionLevelMapper $compressionLevel_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# If a directory needs to be added to an archive file,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# by convention the .Net API's expect the path of the diretcory_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# to end with '\' to detect the path as an directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if (!$relativeFilePath.EndsWith("\", [StringComparison]::OrdinalIgnoreCase))_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentFileStream = [System.IO.File]::Open($currentFilePath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_catch_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Failed to access the file. Write a non terminating error to the pipeline_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and move on with the remaining files._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$exception = $_.Exception_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($null -ne $_.Exception -and_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$null -ne $_.Exception.InnerException)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$exception = $_.Exception.InnerException_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "CompressArchiveUnauthorizedAccessError" $null ([System.Management.Automation.ErrorCategory]::PermissionDenied) $exception $currentFilePath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Error -ErrorRecord $errorRecord_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($null -ne $currentFileStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream = New-Object System.IO.BinaryReader $currentFileStream_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry = $zipArchive.CreateEntry($relativeFilePath, $compression)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Updating the File Creation time so that the same timestamp would be retained after expanding the compressed file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# At this point we are sure that Get-ChildItem would succeed._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry.LastWriteTime = (Get-Item -LiteralPath $currentFilePath).LastWriteTime_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream = New-Object System.IO.BinaryWriter $currentArchiveEntry.Open()_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_while ($numberOfBytesRead = $srcStream.Read($buffer, 0, $bufferSize))_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Write($buffer, 0, $numberOfBytesRead)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Flush()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $currentFileStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $srcStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $destStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry = $zipArchive.CreateEntry("$relativeFilePath", $compression)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($null -ne $addItemtoArchiveFileMessage)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addItemtoArchiveFileMessage_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentEntryCount += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ProgressBarHelper "Compress-Archive" $progressBarStatus $previousSegmentWeight $currentSegmentWeight $sourcePaths.Count $currentEntryCount_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $zipArchive)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$zipArchive.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $archiveFileStream)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Complete writing progress._x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity "Compress-Archive" -Completed_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# ValidateArchivePathHelper: This is a helper function used to validate the archive file_x000D__x000A_# path & its file format. The only supported archive file format is .zip_x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function ValidateArchivePathHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFile_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ([System.IO.File]::Exists($archiveFile))_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$extension = [system.IO.Path]::GetExtension($archiveFile)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Invalid file extension is specifed for the zip file._x000D__x000A__x0009__x0009__x0009__x0009_if ($extension -ne $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidZipFileExtensionError -f $extension, $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "NotSupportedArchiveFileExtension" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $extension_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $archiveFile)_x000D__x000A__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "PathNotFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $archiveFile_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# ExpandArchiveHelper: This is a helper function used to expand the archive file contents_x000D__x000A_# to the specified directory._x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function ExpandArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFile,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$expandedDir,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[ref]_x000D__x000A__x0009__x0009__x0009__x0009_$expandedItems,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$force,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isVerbose,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isConfirm_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_Add-CompressionAssemblies_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# The existance of archive file has already been validated by ValidateArchivePathHelper_x000D__x000A__x0009__x0009__x0009__x0009_# before calling this helper function._x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStreamArgs = @($archiveFile, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Read, $false)_x000D__x000A__x0009__x0009__x0009__x0009_$zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_if ($zipArchive.Entries.Count -eq 0)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileIsEmpty = ($LocalizedData.ArchiveFileIsEmpty -f $archiveFile)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Write-Verbose $archiveFileIsEmpty_x000D__x000A__x0009__x0009__x0009__x0009__x0009_return_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount = 0_x000D__x000A__x0009__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.ExpandProgressBarText -f $archiveFile)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# The archive entries can either be empty directories or files._x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentArchiveEntry in $zipArchive.Entries)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryPath = Join-Path -Path $expandedDir -ChildPath $currentArchiveEntry.FullName_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$extension = [system.IO.Path]::GetExtension($currentArchiveEntryPath)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The current archive entry is an empty directory_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The FullName of the Archive Entry representing a directory would end with a trailing '\'._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($extension -eq [string]::Empty -and_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryPath.EndsWith("\", [StringComparison]::OrdinalIgnoreCase))_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$pathExists = Test-Path -LiteralPath $currentArchiveEntryPath_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# The current archive entry expects an empty directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the existing directory is empty. If its not empty_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# then it means that user has added this directory by other means._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_if ($pathExists -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_New-Item $currentArchiveEntryPath -ItemType Directory -Confirm:$isConfirm | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (Test-Path -LiteralPath $currentArchiveEntryPath -PathType Container)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addEmptyDirectorytoExpandedPathMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentArchiveEntryPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addEmptyDirectorytoExpandedPathMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryFileInfo = New-Object -TypeName System.IO.FileInfo -ArgumentList $currentArchiveEntryPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$parentDirExists = Test-Path -LiteralPath $currentArchiveEntryFileInfo.DirectoryName -PathType Container_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# If the Parent directory of the current entry in the archive file does not exist, then create it._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($parentDirExists -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_New-Item $currentArchiveEntryFileInfo.DirectoryName -ItemType Directory -Confirm:$isConfirm | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (!(Test-Path -LiteralPath $currentArchiveEntryFileInfo.DirectoryName -PathType Container))_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# The directory referred by $currentArchiveEntryFileInfo.DirectoryName was not successfully created._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# This could be because the user has specified -Confirm paramter when Expand-Archive was invoked_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and authorization was not provided when confirmation was prompted. In such a scenario,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# we skip the current file in the archive and continue with the remaining archive file contents._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Continue_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryFileInfo.DirectoryName_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $false_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the file in to which the current archive entry contents_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# would be expanded already exists._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($currentArchiveEntryFileInfo.Exists)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($force)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Remove-Item -LiteralPath $currentArchiveEntryFileInfo.FullName -Force -ErrorVariable ev -Verbose:$isVerbose -Confirm:$isConfirm_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($ev -ne $null)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $true_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (Test-Path -LiteralPath $currentArchiveEntryFileInfo.FullName -PathType Leaf)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# The file referred by $currentArchiveEntryFileInfo.FullName was not successfully removed._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# This could be because the user has specified -Confirm paramter when Expand-Archive was invoked_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and authorization was not provided when confirmation was prompted. In such a scenario,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# we skip the current file in the archive and continue with the remaining archive file contents._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Continue_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Write non-terminating error to the pipeline._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.FileExistsError -f $currentArchiveEntryFileInfo.FullName, $archiveFile, $currentArchiveEntryFileInfo.FullName, $currentArchiveEntryFileInfo.FullName)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "ExpandArchiveFileExists" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidOperation) $null $currentArchiveEntryFileInfo.FullName_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Error -ErrorRecord $errorRecord_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $true_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (!$hasNonTerminatingError)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_[System.IO.Compression.ZipFileExtensions]::ExtractToFile($currentArchiveEntry, $currentArchiveEntryPath, $false)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Add the expanded file path to the $expandedItems array,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# to keep track of all the expanded files created while expanding the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# If user enters CTRL + C then at that point of time, all these expanded files_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# would be deleted as part of the clean up process._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryPath_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addFiletoExpandedPathMessage = ($LocalizedData.CreateFileAtExpandedPath -f $currentArchiveEntryPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addFiletoExpandedPathMessage_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $destStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $srcStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentEntryCount += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# $currentSegmentWeight is Set to 100 giving equal weightage to each file that is getting expanded._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# $previousSegmentWeight is set to 0 as there are no prior segments._x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ProgressBarHelper "Expand-Archive" $progressBarStatus $previousSegmentWeight $currentSegmentWeight $zipArchive.Entries.Count $currentEntryCount_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $zipArchive)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$zipArchive.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $archiveFileStream)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Complete writing progress._x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity "Expand-Archive" -Completed_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# ProgressBarHelper: This is a helper function used to display progress message._x000D__x000A_# This function is used by both Compress-Archive & Expand-Archive to display archive file_x000D__x000A_# creation/expansion progress._x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function ProgressBarHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$cmdletName,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$status,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[int]_x000D__x000A__x0009__x0009__x0009__x0009_$totalNumberofEntries,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[int]_x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($currentEntryCount -gt 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$totalNumberofEntries -gt 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight -ge 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$entryDefaultWeight = $currentSegmentWeight/[double]$totalNumberofEntries_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$percentComplete = $previousSegmentWeight + ($entryDefaultWeight * $currentEntryCount)_x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity $cmdletName -Status $status -PercentComplete $percentComplete_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# CSVHelper: This is a helper function used to append comma after each path specifid by_x000D__x000A_# the SourcePath array. This helper function is used to display all the user supplied paths_x000D__x000A_# in the WhatIf message._x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function CSVHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePath_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# SourcePath has already been validated by the calling funcation._x000D__x000A__x0009__x0009__x0009_if ($sourcePath.Count -gt 1)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat = "`n"_x000D__x000A__x0009__x0009__x0009__x0009_for ($currentIndex = 0; $currentIndex -lt $sourcePath.Count; $currentIndex++)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($currentIndex -eq $sourcePath.Count - 1)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat += $sourcePath[$currentIndex]_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat += $sourcePath[$currentIndex] + "`n"_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat = $sourcePath_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $sourcePathInCsvFormat_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# ThrowTerminatingErrorHelper: This is a helper function used to throw terminating error._x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function ThrowTerminatingErrorHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorId,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.ErrorCategory]_x000D__x000A__x0009__x0009__x0009__x0009_$errorCategory,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[object]_x000D__x000A__x0009__x0009__x0009__x0009_$targetObject,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[Exception]_x000D__x000A__x0009__x0009__x0009__x0009_$innerException_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($innerException -eq $null)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage, $innerException_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject_x000D__x000A__x0009__x0009__x0009_$PSCmdlet.ThrowTerminatingError($errorRecord)_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# CreateErrorRecordHelper: This is a helper function used to create an ErrorRecord_x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function CreateErrorRecordHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorId,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.ErrorCategory]_x000D__x000A__x0009__x0009__x0009__x0009_$errorCategory,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[Exception]_x000D__x000A__x0009__x0009__x0009__x0009_$exception,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[object]_x000D__x000A__x0009__x0009__x0009__x0009_$targetObject_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($null -eq $exception)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject_x000D__x000A__x0009__x0009__x0009_return $errorRecord_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_#endregion Utility Functions_x000D__x000A__x000D__x000A__x0009__x0009_$inputPaths = @()_x000D__x000A__x0009__x0009_$destinationParentDir = [system.IO.Path]::GetDirectoryName($DestinationPath)_x000D__x000A__x0009__x0009_if ($null -eq $destinationParentDir)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidDestinationPath -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidArchiveFilePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_if ($destinationParentDir -eq [string]::Empty)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$destinationParentDir = '.'_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_$achiveFileName = [system.IO.Path]::GetFileName($DestinationPath)_x000D__x000A__x0009__x0009_$destinationParentDir = GetResolvedPathHelper $destinationParentDir $false $PSCmdlet_x000D__x000A__x000D__x000A__x0009__x0009_if ($destinationParentDir.Count -gt 1)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidArchiveFilePathError -f $DestinationPath, "DestinationPath", "DestinationPath")_x000D__x000A__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidArchiveFilePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_IsValidFileSystemPath $destinationParentDir | Out-Null_x000D__x000A__x0009__x0009_$DestinationPath = Join-Path -Path $destinationParentDir -ChildPath $achiveFileName_x000D__x000A__x000D__x000A__x0009__x0009_# GetExtension API does not validate for the actual existance of the path._x000D__x000A__x0009__x0009_$extension = [system.IO.Path]::GetExtension($DestinationPath)_x000D__x000A__x000D__x000A__x0009__x0009_# If user does not specify .Zip extension, we append it._x000D__x000A__x0009__x0009_If ($extension -eq [string]::Empty)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$DestinationPathWithOutExtension = $DestinationPath_x000D__x000A__x0009__x0009__x0009_$DestinationPath = $DestinationPathWithOutExtension + $zipFileExtension_x000D__x000A__x0009__x0009__x0009_$appendArchiveFileExtensionMessage = ($LocalizedData.AppendArchiveFileExtensionMessage -f $DestinationPathWithOutExtension, $DestinationPath)_x000D__x000A__x0009__x0009__x0009_Write-Verbose $appendArchiveFileExtensionMessage_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_else_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_# Invalid file extension is specified for the zip file to be created._x000D__x000A__x0009__x0009__x0009_if ($extension -ne $zipFileExtension)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidZipFileExtensionError -f $extension, $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "NotSupportedArchiveFileExtension" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $extension_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_$archiveFileExist = Test-Path -LiteralPath $DestinationPath -PathType Leaf_x000D__x000A__x000D__x000A__x0009__x0009_if ($archiveFileExist -and ($Update -eq $false -and $Force -eq $false))_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$errorMessage = ($LocalizedData.ZipFileExistError -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009_ThrowTerminatingErrorHelper "ArchiveFileExists" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_# If archive file already exists and if -Update is specified, then we check to see_x000D__x000A__x0009__x0009_# if we have write access permission to update the existing archive file._x000D__x000A__x0009__x0009_if ($archiveFileExist -and $Update -eq $true)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$item = Get-Item -Path $DestinationPath_x000D__x000A__x0009__x0009__x0009_if ($item.Attributes.ToString().Contains("ReadOnly"))_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.ArchiveFileIsReadOnly -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "ArchiveFileIsReadOnly" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidOperation) $DestinationPath_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_$isWhatIf = $psboundparameters.ContainsKey("WhatIf")_x000D__x000A__x0009__x0009_if (!$isWhatIf)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$preparingToCompressVerboseMessage = ($LocalizedData.PreparingToCompressVerboseMessage)_x000D__x000A__x0009__x0009__x0009_Write-Verbose $preparingToCompressVerboseMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.CompressProgressBarText -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009_ProgressBarHelper "Compress-Archive" $progressBarStatus 0 100 100 1_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A__x0009_PROCESS_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_if ($PsCmdlet.ParameterSetName -eq "Path" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "PathWithForce" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "PathWithUpdate")_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$inputPaths += $Path_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_if ($PsCmdlet.ParameterSetName -eq "LiteralPath" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithForce" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithUpdate")_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$inputPaths += $LiteralPath_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A__x0009_END_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_# If archive file already exists and if -Force is specified, we delete the_x000D__x000A__x0009__x0009_# existing artchive file and create a brand new one._x000D__x000A__x0009__x0009_if (($PsCmdlet.ParameterSetName -eq "PathWithForce" -or_x000D__x000A__x0009__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithForce") -and $archiveFileExist)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_Remove-Item -Path $DestinationPath -Force -ErrorAction Stop_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_# Validate Source Path depeding on parameter set being used._x000D__x000A__x0009__x0009_# The specified source path conatins one or more files or directories that needs_x000D__x000A__x0009__x0009_# to be compressed._x000D__x000A__x0009__x0009_$isLiteralPathUsed = $false_x000D__x000A__x0009__x0009_if ($PsCmdlet.ParameterSetName -eq "LiteralPath" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithForce" -or_x000D__x000A__x0009__x0009__x0009_$PsCmdlet.ParameterSetName -eq "LiteralPathWithUpdate")_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$isLiteralPathUsed = $true_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_ValidateDuplicateFileSystemPath $PsCmdlet.ParameterSetName $inputPaths_x000D__x000A__x0009__x0009_$resolvedPaths = GetResolvedPathHelper $inputPaths $isLiteralPathUsed $PSCmdlet_x000D__x000A__x0009__x0009_IsValidFileSystemPath $resolvedPaths | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009_$sourcePath = $resolvedPaths;_x000D__x000A__x000D__x000A__x0009__x0009_# CSVHelper: This is a helper function used to append comma after each path specifid by_x000D__x000A__x0009__x0009_# the $sourcePath array. The comma saperated paths are displayed in the -WhatIf message._x000D__x000A__x0009__x0009_$sourcePathInCsvFormat = CSVHelper $sourcePath_x000D__x000A__x0009__x0009_if ($pscmdlet.ShouldProcess($sourcePathInCsvFormat))_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# StopProcessing is not avaliable in Script cmdlets. However the pipleline execution_x000D__x000A__x0009__x0009__x0009__x0009_# is terminated when ever 'CTRL + C' is entered by user to terminate the cmdlet execution._x000D__x000A__x0009__x0009__x0009__x0009_# The finally block is executed whenever pipleline is terminated._x000D__x000A__x0009__x0009__x0009__x0009_# $isArchiveFileProcessingComplete variable is used to track if 'CTRL + C' is entered by the_x000D__x000A__x0009__x0009__x0009__x0009_# user._x000D__x000A__x0009__x0009__x0009__x0009_$isArchiveFileProcessingComplete = $false_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived = CompressArchiveHelper $sourcePath $DestinationPath $CompressionLevel $Update_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$isArchiveFileProcessingComplete = $true_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# The $isArchiveFileProcessingComplete would be set to $false if user has typed 'CTRL + C' to_x000D__x000A__x0009__x0009__x0009__x0009_# terminate the cmdlet execution or if an unhandled exception is thrown._x000D__x000A__x0009__x0009__x0009__x0009_# $numberOfItemsArchived contains the count of number of files or directories add to the archive file._x000D__x000A__x0009__x0009__x0009__x0009_# If the newly created archive file is empty then we delete it as its not usable._x000D__x000A__x0009__x0009__x0009__x0009_if (($isArchiveFileProcessingComplete -eq $false) -or_x000D__x000A__x0009__x0009__x0009__x0009__x0009_($numberOfItemsArchived -eq 0))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$DeleteArchiveFileMessage = ($LocalizedData.DeleteArchiveFile -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Write-Verbose $DeleteArchiveFileMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# delete the partial archive file created._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if (Test-Path $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Remove-Item -LiteralPath $DestinationPath -Force -Recurse -ErrorAction SilentlyContinue_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A__x000D__x000A_function Expand-Archive_x000D__x000A_{_x000D__x000A__x0009_<#_x000D__x000A__x0009__x0009_.SYNOPSIS_x000D__x000A__x0009__x0009__x0009_Extracts files from a specified archive (zipped) file._x000D__x000A__x000D__x000A__x0009__x0009_.DESCRIPTION_x000D__x000A__x0009__x0009__x0009_The Expand-Archive cmdlet extracts files from a specified zipped archive file to a specified destination folder. An archive file allows multiple files to be packaged, and optionally compressed, into a single zipped file for easier distribution and storage._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Path_x000D__x000A__x0009__x0009__x0009_Specifies the path to the archive file._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER LiteralPath_x000D__x000A__x0009__x0009__x0009_Specifies the path to an archive file. Unlike the Path parameter, the value of LiteralPath is used exactly as it is typed. Wildcard characters are not supported. If the path includes escape characters, enclose each escape character in single quotation marks, to instruct Windows PowerShell not to interpret any characters as escape sequences._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER DestinationPath_x000D__x000A__x0009__x0009__x0009_Specifies the path to the folder in which you want the command to save extracted files. Enter the path to a folder, but do not specify a file name or file name extension. This parameter is required._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Force_x000D__x000A__x0009__x0009__x0009_Forces the command to run without asking for user confirmation._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER Confirm_x000D__x000A__x0009__x0009__x0009_Prompts you for confirmation before running the cmdlet._x000D__x000A__x000D__x000A__x0009__x0009_.PARAMETER WhatIf_x000D__x000A__x0009__x0009__x0009_Shows what would happen if the cmdlet runs. The cmdlet is not run._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 1: Extract the contents of an archive_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\>Expand-Archive -LiteralPath C:\Archives\Draft.Zip -DestinationPath C:\Reference_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command extracts the contents of an existing archive file, Draft.zip, into the folder specified by the DestinationPath parameter, C:\Reference._x000D__x000A__x000D__x000A__x0009__x0009_.EXAMPLE_x000D__x000A__x0009__x0009__x0009_Example 2: Extract the contents of an archive in the current folder_x000D__x000A__x000D__x000A__x0009__x0009__x0009_PS C:\>Expand-Archive -Path Draft.Zip -DestinationPath C:\Reference_x000D__x000A__x000D__x000A__x0009__x0009__x0009_This command extracts the contents of an existing archive file in the current folder, Draft.zip, into the folder specified by the DestinationPath parameter, C:\Reference._x000D__x000A__x0009_#>_x000D__x000A__x0009_[CmdletBinding(_x000D__x000A__x0009__x0009__x0009__x0009_ DefaultParameterSetName = "Path",_x000D__x000A__x0009__x0009__x0009__x0009_ SupportsShouldProcess = $true,_x000D__x000A__x0009__x0009__x0009__x0009_ HelpUri = "http://go.microsoft.com/fwlink/?LinkID=393253")]_x000D__x000A__x0009_param_x000D__x000A__x0009_(_x000D__x000A__x0009__x0009_[parameter (_x000D__x000A__x0009__x0009__x0009__x0009__x0009_mandatory = $true,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Position = 0,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ParameterSetName = "Path",_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $true,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$Path,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (_x000D__x000A__x0009__x0009__x0009__x0009__x0009_mandatory = $true,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ParameterSetName = "LiteralPath",_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $true)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[Alias("PSPath")]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$LiteralPath,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (mandatory = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Position = 1,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[ValidateNotNullOrEmpty()]_x000D__x000A__x0009__x0009_[string]_x000D__x000A__x0009__x0009_$DestinationPath,_x000D__x000A__x000D__x000A__x0009__x0009_[parameter (mandatory = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipeline = $false,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ValueFromPipelineByPropertyName = $false)]_x000D__x000A__x0009__x0009_[switch]_x000D__x000A__x0009__x0009_$Force_x000D__x000A__x0009_)_x000D__x000A__x000D__x000A__x0009_BEGIN_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Add-Type -AssemblyName System.IO.Compression -ErrorAction Ignore_x000D__x000A__x0009__x0009_Add-Type -AssemblyName System.IO.Compression.FileSystem -ErrorAction Ignore_x000D__x000A__x000D__x000A__x0009__x0009_$zipFileExtension = ".zip"_x000D__x000A__x000D__x000A__x0009__x0009_$LocalizedData = ConvertFrom-StringData @'_x000D__x000A_PathNotFoundError=The path '{0}' either does not exist or is not a valid file system path._x000D__x000A_ExpandArchiveInValidDestinationPath=The path '{0}' is not a valid file system directory path._x000D__x000A_InvalidZipFileExtensionError={0} is not a supported archive file format. {1} is the only supported archive file format._x000D__x000A_ArchiveFileIsReadOnly=The attributes of the archive file {0} is set to 'ReadOnly' hence it cannot be updated. If you intend to update the existing archive file, remove the 'ReadOnly' attribute on the archive file else use -Force parameter to override and create a new archive file._x000D__x000A_ZipFileExistError=The archive file {0} already exists. Use the -Update parameter to update the existing archive file or use the -Force parameter to overwrite the existing archive file._x000D__x000A_DuplicatePathFoundError=The input to {0} parameter contains a duplicate path '{1}'. Provide a unique set of paths as input to {2} parameter._x000D__x000A_ArchiveFileIsEmpty=The archive file {0} is empty._x000D__x000A_CompressProgressBarText=The archive file '{0}' creation is in progress..._x000D__x000A_ExpandProgressBarText=The archive file '{0}' expansion is in progress..._x000D__x000A_AppendArchiveFileExtensionMessage=The archive file path '{0}' supplied to the DestinationPath patameter does not include .zip extension. Hence .zip is appended to the supplied DestinationPath path and the archive file would be created at '{1}'._x000D__x000A_AddItemtoArchiveFile=Adding '{0}'._x000D__x000A_CreateFileAtExpandedPath=Created '{0}'._x000D__x000A_InvalidArchiveFilePathError=The archive file path '{0}' specified as input to the {1} parameter is resolving to multiple file system paths. Provide a unique path to the {2} parameter where the archive file has to be created._x000D__x000A_InvalidExpandedDirPathError=The directory path '{0}' specified as input to the DestinationPath parameter is resolving to multiple file system paths. Provide a unique path to the Destination parameter where the archive file contents have to be expanded._x000D__x000A_FileExistsError=Failed to create file '{0}' while expanding the archive file '{1}' contents as the file '{2}' already exists. Use the -Force parameter if you want to overwrite the existing directory '{3}' contents when expanding the archive file._x000D__x000A_DeleteArchiveFile=The partially created archive file '{0}' is deleted as it is not usable._x000D__x000A_InvalidDestinationPath=The destination path '{0}' does not contain a valid archive file name._x000D__x000A_PreparingToCompressVerboseMessage=Preparing to compress..._x000D__x000A_PreparingToExpandVerboseMessage=Preparing to expand..._x000D__x000A_'@_x000D__x000A__x000D__x000A__x0009__x0009_#region Utility Functions_x000D__x000A__x0009__x0009_function GetResolvedPathHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isLiteralPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.PSCmdlet]_x000D__x000A__x0009__x0009__x0009__x0009_$callerPSCmdlet_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$resolvedPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($isLiteralPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentResolvedPaths = Resolve-Path -LiteralPath $currentPath -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentResolvedPaths = Resolve-Path -Path $currentPath -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_catch_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $currentPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$exception = New-Object System.InvalidOperationException $errorMessage, $_.Exception_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "ArchiveCmdletPathNotFound" $null ([System.Management.Automation.ErrorCategory]::InvalidArgument) $exception $currentPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$callerPSCmdlet.ThrowTerminatingError($errorRecord)_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentResolvedPath in $currentResolvedPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$resolvedPaths += $currentResolvedPath.ProviderPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$resolvedPaths_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function Add-CompressionAssemblies_x000D__x000A__x0009__x0009_{_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($PSEdition -eq "Desktop")_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_Add-Type -AssemblyName System.IO.Compression_x000D__x000A__x0009__x0009__x0009__x0009_Add-Type -AssemblyName System.IO.Compression.FileSystem_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function IsValidFileSystemPath_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$result = $true;_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_if (!([System.IO.File]::Exists($currentPath) -or [System.IO.Directory]::Exists($currentPath)))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $currentPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "PathNotFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $result;_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x000D__x000A__x0009__x0009_function ValidateDuplicateFileSystemPath_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$inputParameter,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$path_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$uniqueInputPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# null and empty check are are already done on Path parameter at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $path)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$currentInputPath = $currentPath.ToUpper()_x000D__x000A__x0009__x0009__x0009__x0009_if ($uniqueInputPaths.Contains($currentInputPath))_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.DuplicatePathFoundError -f $inputParameter, $currentPath, $inputParameter)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "DuplicatePathFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$uniqueInputPaths += $currentInputPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressionLevelMapper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::Optimal_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# CompressionLevel format is already validated at the cmdlet layer._x000D__x000A__x0009__x0009__x0009_switch ($compressionLevel.ToString())_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_"Fastest"_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::Fastest_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_"NoCompression"_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compressionLevelFormat = [System.IO.Compression.CompressionLevel]::NoCompression_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $compressionLevelFormat_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = 0_x000D__x000A__x0009__x0009__x0009_$sourceFilePaths = @()_x000D__x000A__x0009__x0009__x0009_$sourceDirPaths = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_foreach ($currentPath in $sourcePath)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$result = Test-Path -LiteralPath $currentPath -PathType Leaf_x000D__x000A__x0009__x0009__x0009__x0009_if ($result -eq $true)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$sourceFilePaths += $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$sourceDirPaths += $currentPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# The Soure Path contains one or more directory (this directory can have files under it) and no files to be compressed._x000D__x000A__x0009__x0009__x0009_if ($sourceFilePaths.Count -eq 0 -and $sourceDirPaths.Count -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100/[double]$sourceDirPaths.Count_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentSourceDirPath in $sourceDirPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$count = CompressSingleDirHelper $currentSourceDirPath $destinationPath $compressionLevel $true $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight += $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# The Soure Path contains only files to be compressed._x000D__x000A__x0009__x0009__x0009_elseIf ($sourceFilePaths.Count -gt 0 -and $sourceDirPaths.Count -eq 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# $previousSegmentWeight is equal to 0 as there are no prior segments._x000D__x000A__x0009__x0009__x0009__x0009_# $currentSegmentWeight is set to 100 as all files have equal weightage._x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived = CompressFilesHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_# The Soure Path contains one or more files and one or more directories (this directory can have files under it) to be compressed._x000D__x000A__x0009__x0009__x0009_elseif ($sourceFilePaths.Count -gt 0 -and $sourceDirPaths.Count -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# each directory is considered as an individual segments & all the individual files are clubed in to a separate sgemnet._x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100/[double]($sourceDirPaths.Count + 1)_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentSourceDirPath in $sourceDirPaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$count = CompressSingleDirHelper $currentSourceDirPath $destinationPath $compressionLevel $true $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight += $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$count = CompressFilesHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x0009__x0009__x0009__x0009_$numberOfItemsArchived += $count_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressFilesHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourceFilePaths,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = ZipArchiveHelper $sourceFilePaths $destinationPath $compressionLevel $isUpdateMode $null $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function CompressSingleDirHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$useParentDirAsRoot,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_[System.Collections.Generic.List[System.String]]$subDirFiles = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($useParentDirAsRoot)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirInfo = New-Object -TypeName System.IO.DirectoryInfo -ArgumentList $sourceDirPath_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirFullName = $sourceDirInfo.Parent.FullName_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# If the directory is present at the drive level the DirectoryInfo.Parent include '\' example: C:\_x000D__x000A__x0009__x0009__x0009__x0009_# On the other hand if the directory exists at a deper level then DirectoryInfo.Parent_x000D__x000A__x0009__x0009__x0009__x0009_# has just the path (without an ending '\'). example C:\source_x000D__x000A__x0009__x0009__x0009__x0009_if ($sourceDirFullName.Length -eq 3)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName + "\"_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourceDirFullName = $sourceDirPath_x000D__x000A__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName = $sourceDirFullName + "\"_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$dirContents = Get-ChildItem -LiteralPath $sourceDirPath -Recurse_x000D__x000A__x0009__x0009__x0009_foreach ($currentContent in $dirContents)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$isContainer = $currentContent -is [System.IO.DirectoryInfo]_x000D__x000A__x0009__x0009__x0009__x0009_if (!$isContainer)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$subDirFiles.Add($currentContent.FullName)_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The currentContent points to a directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# We need to check if the directory is an empty directory, if so such a_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# directory has to be explictly added to the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# if there are no files in the directory the GetFiles() API returns an empty array._x000D__x000A__x0009__x0009__x0009__x0009__x0009_$files = $currentContent.GetFiles()_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($files.Count -eq 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$subDirFiles.Add($currentContent.FullName + "\")_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = ZipArchiveHelper $subDirFiles.ToArray() $destinationPath $compressionLevel $isUpdateMode $modifiedSourceDirFullName $previousSegmentWeight $currentSegmentWeight_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_function ZipArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[System.Collections.Generic.List[System.String]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePaths,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$destinationPath,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$compressionLevel,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[bool]_x000D__x000A__x0009__x0009__x0009__x0009_$isUpdateMode,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$modifiedSourceDirFullName,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$numberOfItemsArchived = 0_x000D__x000A__x0009__x0009__x0009_$fileMode = [System.IO.FileMode]::Create_x000D__x000A__x0009__x0009__x0009_$result = Test-Path -LiteralPath $DestinationPath -PathType Leaf_x000D__x000A__x0009__x0009__x0009_if ($result -eq $true)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$fileMode = [System.IO.FileMode]::Open_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_Add-CompressionAssemblies_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# At this point we are sure that the archive file has write access._x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStreamArgs = @($destinationPath, $fileMode)_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Update, $false)_x000D__x000A__x0009__x0009__x0009__x0009_$zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount = 0_x000D__x000A__x0009__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.CompressProgressBarText -f $destinationPath)_x000D__x000A__x0009__x0009__x0009__x0009_$bufferSize = 4kb_x000D__x000A__x0009__x0009__x0009__x0009_$buffer = New-Object Byte[] $bufferSize_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentFilePath in $sourcePaths)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($modifiedSourceDirFullName -ne $null -and $modifiedSourceDirFullName.Length -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$index = $currentFilePath.IndexOf($modifiedSourceDirFullName, [System.StringComparison]::OrdinalIgnoreCase)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentFilePathSubString = $currentFilePath.Substring($index, $modifiedSourceDirFullName.Length)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$relativeFilePath = $currentFilePath.Replace($currentFilePathSubString, "").Trim()_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$relativeFilePath = [System.IO.Path]::GetFileName($currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# Update mode is selected._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# Check to see if archive file already contains one or more zip files in it._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($isUpdateMode -eq $true -and $zipArchive.Entries.Count -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated = $null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the file already exists in the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# If so replace it with new file from the input source._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# If the file does not exist in the archive file then default to_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# create mode and create the entry in the archive file._x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_foreach ($currentArchiveEntry in $zipArchive.Entries)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($currentArchiveEntry.FullName -eq $relativeFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated = $currentArchiveEntry_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_break_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_if ($entryToBeUpdated -ne $null)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$entryToBeUpdated.Delete()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$compression = CompressionLevelMapper $compressionLevel_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# If a directory needs to be added to an archive file,_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# by convention the .Net API's expect the path of the diretcory_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# to end with '\' to detect the path as an directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if (!$relativeFilePath.EndsWith("\", [StringComparison]::OrdinalIgnoreCase))_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentFileStream = [System.IO.File]::Open($currentFilePath, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_catch_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Failed to access the file. Write a non terminating error to the pipeline_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and move on with the remaining files._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$exception = $_.Exception_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($null -ne $_.Exception -and_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$null -ne $_.Exception.InnerException)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$exception = $_.Exception.InnerException_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "CompressArchiveUnauthorizedAccessError" $null ([System.Management.Automation.ErrorCategory]::PermissionDenied) $exception $currentFilePath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Error -ErrorRecord $errorRecord_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($null -ne $currentFileStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream = New-Object System.IO.BinaryReader $currentFileStream_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry = $zipArchive.CreateEntry($relativeFilePath, $compression)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Updating the File Creation time so that the same timestamp would be retained after expanding the compressed file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# At this point we are sure that Get-ChildItem would succeed._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry.LastWriteTime = (Get-Item -LiteralPath $currentFilePath).LastWriteTime_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream = New-Object System.IO.BinaryWriter $currentArchiveEntry.Open()_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_while ($numberOfBytesRead = $srcStream.Read($buffer, 0, $bufferSize))_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Write($buffer, 0, $numberOfBytesRead)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Flush()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $currentFileStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $srcStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $destStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntry = $zipArchive.CreateEntry("$relativeFilePath", $compression)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$numberOfItemsArchived += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$addItemtoArchiveFileMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentFilePath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($null -ne $addItemtoArchiveFileMessage)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addItemtoArchiveFileMessage_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentEntryCount += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ProgressBarHelper "Compress-Archive" $progressBarStatus $previousSegmentWeight $currentSegmentWeight $sourcePaths.Count $currentEntryCount_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $zipArchive)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$zipArchive.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $archiveFileStream)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Complete writing progress._x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity "Compress-Archive" -Completed_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $numberOfItemsArchived_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# ValidateArchivePathHelper: This is a helper function used to validate the archive file_x000D__x000A_# path & its file format. The only supported archive file format is .zip_x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function ValidateArchivePathHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFile_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ([System.IO.File]::Exists($archiveFile))_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$extension = [system.IO.Path]::GetExtension($archiveFile)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Invalid file extension is specifed for the zip file._x000D__x000A__x0009__x0009__x0009__x0009_if ($extension -ne $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidZipFileExtensionError -f $extension, $zipFileExtension)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "NotSupportedArchiveFileExtension" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $extension_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.PathNotFoundError -f $archiveFile)_x000D__x000A__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "PathNotFound" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $archiveFile_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# ExpandArchiveHelper: This is a helper function used to expand the archive file contents_x000D__x000A_# to the specified directory._x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function ExpandArchiveHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFile,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$expandedDir,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[ref]_x000D__x000A__x0009__x0009__x0009__x0009_$expandedItems,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$force,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isVerbose,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[boolean]_x000D__x000A__x0009__x0009__x0009__x0009_$isConfirm_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_Add-CompressionAssemblies_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# The existance of archive file has already been validated by ValidateArchivePathHelper_x000D__x000A__x0009__x0009__x0009__x0009_# before calling this helper function._x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStreamArgs = @($archiveFile, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read)_x000D__x000A__x0009__x0009__x0009__x0009_$archiveFileStream = New-Object -TypeName System.IO.FileStream -ArgumentList $archiveFileStreamArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$zipArchiveArgs = @($archiveFileStream, [System.IO.Compression.ZipArchiveMode]::Read, $false)_x000D__x000A__x0009__x0009__x0009__x0009_$zipArchive = New-Object -TypeName System.IO.Compression.ZipArchive -ArgumentList $zipArchiveArgs_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_if ($zipArchive.Entries.Count -eq 0)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileIsEmpty = ($LocalizedData.ArchiveFileIsEmpty -f $archiveFile)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Write-Verbose $archiveFileIsEmpty_x000D__x000A__x0009__x0009__x0009__x0009__x0009_return_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount = 0_x000D__x000A__x0009__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.ExpandProgressBarText -f $archiveFile)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# The archive entries can either be empty directories or files._x000D__x000A__x0009__x0009__x0009__x0009_foreach ($currentArchiveEntry in $zipArchive.Entries)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryPath = Join-Path -Path $expandedDir -ChildPath $currentArchiveEntry.FullName_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$extension = [system.IO.Path]::GetExtension($currentArchiveEntryPath)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The current archive entry is an empty directory_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# The FullName of the Archive Entry representing a directory would end with a trailing '\'._x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($extension -eq [string]::Empty -and_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryPath.EndsWith("\", [StringComparison]::OrdinalIgnoreCase))_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$pathExists = Test-Path -LiteralPath $currentArchiveEntryPath_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# The current archive entry expects an empty directory._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the existing directory is empty. If its not empty_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# then it means that user has added this directory by other means._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_if ($pathExists -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_New-Item $currentArchiveEntryPath -ItemType Directory -Confirm:$isConfirm | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (Test-Path -LiteralPath $currentArchiveEntryPath -PathType Container)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addEmptyDirectorytoExpandedPathMessage = ($LocalizedData.AddItemtoArchiveFile -f $currentArchiveEntryPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addEmptyDirectorytoExpandedPathMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$currentArchiveEntryFileInfo = New-Object -TypeName System.IO.FileInfo -ArgumentList $currentArchiveEntryPath_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$parentDirExists = Test-Path -LiteralPath $currentArchiveEntryFileInfo.DirectoryName -PathType Container_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# If the Parent directory of the current entry in the archive file does not exist, then create it._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($parentDirExists -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_New-Item $currentArchiveEntryFileInfo.DirectoryName -ItemType Directory -Confirm:$isConfirm | Out-Null_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (!(Test-Path -LiteralPath $currentArchiveEntryFileInfo.DirectoryName -PathType Container))_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# The directory referred by $currentArchiveEntryFileInfo.DirectoryName was not successfully created._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# This could be because the user has specified -Confirm paramter when Expand-Archive was invoked_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and authorization was not provided when confirmation was prompted. In such a scenario,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# we skip the current file in the archive and continue with the remaining archive file contents._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Continue_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryFileInfo.DirectoryName_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $false_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Check if the file in to which the current archive entry contents_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# would be expanded already exists._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($currentArchiveEntryFileInfo.Exists)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($force)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Remove-Item -LiteralPath $currentArchiveEntryFileInfo.FullName -Force -ErrorVariable ev -Verbose:$isVerbose -Confirm:$isConfirm_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if ($ev -ne $null)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $true_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (Test-Path -LiteralPath $currentArchiveEntryFileInfo.FullName -PathType Leaf)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# The file referred by $currentArchiveEntryFileInfo.FullName was not successfully removed._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# This could be because the user has specified -Confirm paramter when Expand-Archive was invoked_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# and authorization was not provided when confirmation was prompted. In such a scenario,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# we skip the current file in the archive and continue with the remaining archive file contents._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Continue_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Write non-terminating error to the pipeline._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.FileExistsError -f $currentArchiveEntryFileInfo.FullName, $archiveFile, $currentArchiveEntryFileInfo.FullName, $currentArchiveEntryFileInfo.FullName)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$errorRecord = CreateErrorRecordHelper "ExpandArchiveFileExists" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidOperation) $null $currentArchiveEntryFileInfo.FullName_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Error -ErrorRecord $errorRecord_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$hasNonTerminatingError = $true_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_if (!$hasNonTerminatingError)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_[System.IO.Compression.ZipFileExtensions]::ExtractToFile($currentArchiveEntry, $currentArchiveEntryPath, $false)_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# Add the expanded file path to the $expandedItems array,_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# to keep track of all the expanded files created while expanding the archive file._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# If user enters CTRL + C then at that point of time, all these expanded files_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_# would be deleted as part of the clean up process._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems.Value += $currentArchiveEntryPath_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$addFiletoExpandedPathMessage = ($LocalizedData.CreateFileAtExpandedPath -f $currentArchiveEntryPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_Write-Verbose $addFiletoExpandedPathMessage_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $destStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$destStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_If ($null -ne $srcStream)_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009__x0009_$srcStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentEntryCount += 1_x000D__x000A__x0009__x0009__x0009__x0009__x0009_# $currentSegmentWeight is Set to 100 giving equal weightage to each file that is getting expanded._x000D__x000A__x0009__x0009__x0009__x0009__x0009_# $previousSegmentWeight is set to 0 as there are no prior segments._x000D__x000A__x0009__x0009__x0009__x0009__x0009_$previousSegmentWeight = 0_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$currentSegmentWeight = 100_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ProgressBarHelper "Expand-Archive" $progressBarStatus $previousSegmentWeight $currentSegmentWeight $zipArchive.Entries.Count $currentEntryCount_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $zipArchive)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$zipArchive.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_If ($null -ne $archiveFileStream)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFileStream.Dispose()_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# Complete writing progress._x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity "Expand-Archive" -Completed_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# ProgressBarHelper: This is a helper function used to display progress message._x000D__x000A_# This function is used by both Compress-Archive & Expand-Archive to display archive file_x000D__x000A_# creation/expansion progress._x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function ProgressBarHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$cmdletName,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$status,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[double]_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[int]_x000D__x000A__x0009__x0009__x0009__x0009_$totalNumberofEntries,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[int]_x000D__x000A__x0009__x0009__x0009__x0009_$currentEntryCount_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($currentEntryCount -gt 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$totalNumberofEntries -gt 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$previousSegmentWeight -ge 0 -and_x000D__x000A__x0009__x0009__x0009__x0009_$currentSegmentWeight -gt 0)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$entryDefaultWeight = $currentSegmentWeight/[double]$totalNumberofEntries_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$percentComplete = $previousSegmentWeight + ($entryDefaultWeight * $currentEntryCount)_x000D__x000A__x0009__x0009__x0009__x0009_Write-Progress -Activity $cmdletName -Status $status -PercentComplete $percentComplete_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# CSVHelper: This is a helper function used to append comma after each path specifid by_x000D__x000A_# the SourcePath array. This helper function is used to display all the user supplied paths_x000D__x000A_# in the WhatIf message._x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function CSVHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string[]]_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePath_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_# SourcePath has already been validated by the calling funcation._x000D__x000A__x0009__x0009__x0009_if ($sourcePath.Count -gt 1)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat = "`n"_x000D__x000A__x0009__x0009__x0009__x0009_for ($currentIndex = 0; $currentIndex -lt $sourcePath.Count; $currentIndex++)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($currentIndex -eq $sourcePath.Count - 1)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat += $sourcePath[$currentIndex]_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat += $sourcePath[$currentIndex] + "`n"_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$sourcePathInCsvFormat = $sourcePath_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_return $sourcePathInCsvFormat_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# ThrowTerminatingErrorHelper: This is a helper function used to throw terminating error._x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function ThrowTerminatingErrorHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorId,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.ErrorCategory]_x000D__x000A__x0009__x0009__x0009__x0009_$errorCategory,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[object]_x000D__x000A__x0009__x0009__x0009__x0009_$targetObject,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[Exception]_x000D__x000A__x0009__x0009__x0009__x0009_$innerException_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($innerException -eq $null)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage, $innerException_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject_x000D__x000A__x0009__x0009__x0009_$PSCmdlet.ThrowTerminatingError($errorRecord)_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A_<############################################################################################_x000D__x000A_# CreateErrorRecordHelper: This is a helper function used to create an ErrorRecord_x000D__x000A_############################################################################################>_x000D__x000A__x0009__x0009_function CreateErrorRecordHelper_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_param_x000D__x000A__x0009__x0009__x0009_(_x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorId,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[string]_x000D__x000A__x0009__x0009__x0009__x0009_$errorMessage,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[System.Management.Automation.ErrorCategory]_x000D__x000A__x0009__x0009__x0009__x0009_$errorCategory,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[Exception]_x000D__x000A__x0009__x0009__x0009__x0009_$exception,_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_[object]_x000D__x000A__x0009__x0009__x0009__x0009_$targetObject_x000D__x000A__x0009__x0009__x0009_)_x000D__x000A__x000D__x000A__x0009__x0009__x0009_if ($null -eq $exception)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$exception = New-Object System.IO.IOException $errorMessage_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$errorRecord = New-Object System.Management.Automation.ErrorRecord $exception, $errorId, $errorCategory, $targetObject_x000D__x000A__x0009__x0009__x0009_return $errorRecord_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_#endregion Utility Functions_x000D__x000A__x000D__x000A__x0009__x0009_$isVerbose = $psboundparameters.ContainsKey("Verbose")_x000D__x000A__x0009__x0009_$isConfirm = $psboundparameters.ContainsKey("Confirm")_x000D__x000A__x000D__x000A__x0009__x0009_$isDestinationPathProvided = $true_x000D__x000A__x0009__x0009_if ($DestinationPath -eq [string]::Empty)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$resolvedDestinationPath = $pwd_x000D__x000A__x0009__x0009__x0009_$isDestinationPathProvided = $false_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009__x0009_else_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$destinationPathExists = Test-Path -Path $DestinationPath -PathType Container_x000D__x000A__x0009__x0009__x0009_if ($destinationPathExists)_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$resolvedDestinationPath = GetResolvedPathHelper $DestinationPath $false $PSCmdlet_x000D__x000A__x0009__x0009__x0009__x0009_if ($resolvedDestinationPath.Count -gt 1)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidExpandedDirPathError -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidDestinationPath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# At this point we are sure that the provided path resolves to a valid single path._x000D__x000A__x0009__x0009__x0009__x0009_# Calling Resolve-Path again to get the underlying provider name._x000D__x000A__x0009__x0009__x0009__x0009_$suppliedDestinationPath = Resolve-Path -Path $DestinationPath_x000D__x000A__x0009__x0009__x0009__x0009_if ($suppliedDestinationPath.Provider.Name -ne "FileSystem")_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.ExpandArchiveInValidDestinationPath -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidDirectoryPath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_else_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$createdItem = New-Item -Path $DestinationPath -ItemType Directory -Confirm:$isConfirm -Verbose:$isVerbose -ErrorAction Stop_x000D__x000A__x0009__x0009__x0009__x0009_if ($createdItem -ne $null -and $createdItem.PSProvider.Name -ne "FileSystem")_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_Remove-Item "$DestinationPath" -Force -Recurse -ErrorAction SilentlyContinue_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.ExpandArchiveInValidDestinationPath -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidDirectoryPath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $DestinationPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$resolvedDestinationPath = GetResolvedPathHelper $DestinationPath $true $PSCmdlet_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_$isWhatIf = $psboundparameters.ContainsKey("WhatIf")_x000D__x000A__x0009__x0009_if (!$isWhatIf)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$preparingToExpandVerboseMessage = ($LocalizedData.PreparingToExpandVerboseMessage)_x000D__x000A__x0009__x0009__x0009_Write-Verbose $preparingToExpandVerboseMessage_x000D__x000A__x000D__x000A__x0009__x0009__x0009_$progressBarStatus = ($LocalizedData.ExpandProgressBarText -f $DestinationPath)_x000D__x000A__x0009__x0009__x0009_ProgressBarHelper "Expand-Archive" $progressBarStatus 0 100 100 1_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A__x0009_PROCESS_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_switch ($PsCmdlet.ParameterSetName)_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_"Path"_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$resolvedSourcePaths = GetResolvedPathHelper $Path $false $PSCmdlet_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_if ($resolvedSourcePaths.Count -gt 1)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidArchiveFilePathError -f $Path, $PsCmdlet.ParameterSetName, $PsCmdlet.ParameterSetName)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidArchiveFilePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $Path_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_"LiteralPath"_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_$resolvedSourcePaths = GetResolvedPathHelper $LiteralPath $true $PSCmdlet_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_if ($resolvedSourcePaths.Count -gt 1)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$errorMessage = ($LocalizedData.InvalidArchiveFilePathError -f $LiteralPath, $PsCmdlet.ParameterSetName, $PsCmdlet.ParameterSetName)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_ThrowTerminatingErrorHelper "InvalidArchiveFilePath" $errorMessage ([System.Management.Automation.ErrorCategory]::InvalidArgument) $LiteralPath_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009_ValidateArchivePathHelper $resolvedSourcePaths_x000D__x000A__x000D__x000A__x0009__x0009_if ($pscmdlet.ShouldProcess($resolvedSourcePaths))_x000D__x000A__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009_$expandedItems = @()_x000D__x000A__x000D__x000A__x0009__x0009__x0009_try_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# StopProcessing is not avaliable in Script cmdlets. However the pipleline execution_x000D__x000A__x0009__x0009__x0009__x0009_# is terminated when ever 'CTRL + C' is entered by user to terminate the cmdlet execution._x000D__x000A__x0009__x0009__x0009__x0009_# The finally block is executed whenever pipleline is terminated._x000D__x000A__x0009__x0009__x0009__x0009_# $isArchiveFileProcessingComplete variable is used to track if 'CTRL + C' is entered by the_x000D__x000A__x0009__x0009__x0009__x0009_# user._x000D__x000A__x0009__x0009__x0009__x0009_$isArchiveFileProcessingComplete = $false_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_# The User has not provided a destination path, hence we use '$pwd\ArchiveFileName' as the directory where the_x000D__x000A__x0009__x0009__x0009__x0009_# archive file contents would be expanded. If the path '$pwd\ArchiveFileName' already exists then we use the_x000D__x000A__x0009__x0009__x0009__x0009_# Windows default mechanism of appending a counter value at the end of the directory name where the contents_x000D__x000A__x0009__x0009__x0009__x0009_# would be expanded._x000D__x000A__x0009__x0009__x0009__x0009_if (!$isDestinationPathProvided)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$archiveFile = New-Object System.IO.FileInfo $resolvedSourcePaths_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$resolvedDestinationPath = Join-Path -Path $resolvedDestinationPath -ChildPath $archiveFile.BaseName_x000D__x000A__x0009__x0009__x0009__x0009__x0009_$destinationPathExists = Test-Path -LiteralPath $resolvedDestinationPath -PathType Container_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009__x0009_if (!$destinationPathExists)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_New-Item -Path $resolvedDestinationPath -ItemType Directory -Confirm:$isConfirm -Verbose:$isVerbose -ErrorAction Stop | Out-Null_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_ExpandArchiveHelper $resolvedSourcePaths $resolvedDestinationPath ([ref]$expandedItems) $Force $isVerbose $isConfirm_x000D__x000A__x000D__x000A__x0009__x0009__x0009__x0009_$isArchiveFileProcessingComplete = $true_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_finally_x000D__x000A__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009_# The $isArchiveFileProcessingComplete would be set to $false if user has typed 'CTRL + C' to_x000D__x000A__x0009__x0009__x0009__x0009_# terminate the cmdlet execution or if an unhandled exception is thrown._x000D__x000A__x0009__x0009__x0009__x0009_if ($isArchiveFileProcessingComplete -eq $false)_x000D__x000A__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009_if ($expandedItems.Count -gt 0)_x000D__x000A__x0009__x0009__x0009__x0009__x0009_{_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# delete the expanded file/directory as the archive_x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_# file was not completly expanded._x000D__x000A__x0009__x0009__x0009__x0009__x0009__x0009_$expandedItems | ForEach-Object { Remove-Item $_ -Force -Recurse }_x000D__x000A__x0009__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009__x0009_}_x000D__x000A__x0009__x0009_}_x000D__x000A__x0009_}_x000D__x000A_}_x000D__x000A__x000D__x000A_function Write-LocalMessage_x000D__x000A_{_x000D__x000A_ [CmdletBinding()]_x000D__x000A_ Param (_x000D__x000A_ [string]$Message_x000D__x000A_ )_x000D__x000A__x000D__x000A_ if (Test-Path function:Write-PSFMessage) { Write-PSFMessage -Level Important -Message $Message }_x000D__x000A_ else { Write-Host $Message }_x000D__x000A_}_x000D__x000A_#endregion Utility Functions_x000D__x000A__x000D__x000A_try_x000D__x000A_{_x000D__x000A__x0009_[System.Net.ServicePointManager]::SecurityProtocol = "Tls12"_x000D__x000A__x000D__x000A__x0009_Write-LocalMessage -Message "Downloading repository from '$($BaseUrl)/archive/$($Branch).zip'"_x000D__x000A__x0009_Invoke-WebRequest -Uri "$($BaseUrl)/archive/$($Branch).zip" -UseBasicParsing -OutFile "$($env:TEMP)\$($ModuleName).zip" -ErrorAction Stop_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Creating temporary project folder: '$($env:TEMP)\$($ModuleName)'"_x000D__x000A__x0009_$null = New-Item -Path $env:TEMP -Name $ModuleName -ItemType Directory -Force -ErrorAction Stop_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Extracting archive to '$($env:TEMP)\$($ModuleName)'"_x000D__x000A__x0009_Expand-Archive -Path "$($env:TEMP)\$($ModuleName).zip" -DestinationPath "$($env:TEMP)\$($ModuleName)" -ErrorAction Stop_x000D__x000A__x0009__x000D__x000A__x0009_$basePath = Get-ChildItem "$($env:TEMP)\$($ModuleName)\*" | Select-Object -First 1_x000D__x000A__x0009_if ($SubFolder) { $basePath = "$($basePath)\$($SubFolder)" }_x000D__x000A__x0009__x000D__x000A__x0009_# Only needed for PS v5+ but doesn't hurt anyway_x000D__x000A__x0009_$manifest = "$($basePath)\$($ModuleName).psd1"_x000D__x000A__x0009_$manifestData = Invoke-Expression ([System.IO.File]::ReadAllText($manifest))_x000D__x000A__x0009_$moduleVersion = $manifestData.ModuleVersion_x000D__x000A__x0009_Write-LocalMessage -Message "Download concluded: $($ModuleName) | Branch $($Branch) | Version $($moduleVersion)"_x000D__x000A__x0009__x000D__x000A__x0009_# Determine output path_x000D__x000A__x0009_$path = "$($env:ProgramFiles)\WindowsPowerShell\Modules\$($ModuleName)"_x000D__x000A__x0009_if ($doUserMode) { $path = "$(Split-Path $profile.CurrentUserAllHosts)\Modules\$($ModuleName)" }_x000D__x000A__x0009_if ($PSVersionTable.PSVersion.Major -ge 5) { $path += "\$moduleVersion" }_x000D__x000A__x0009__x000D__x000A__x0009_if ((Test-Path $path) -and (-not $Force))_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Write-LocalMessage -Message "Module already installed, interrupting installation"_x000D__x000A__x0009__x0009_return_x000D__x000A__x0009_}_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Creating folder: $($path)"_x000D__x000A__x0009_$null = New-Item -Path $path -ItemType Directory -Force -ErrorAction Stop_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Copying files to $($path)"_x000D__x000A__x0009_foreach ($file in (Get-ChildItem -Path $basePath))_x000D__x000A__x0009_{_x000D__x000A__x0009__x0009_Move-Item -Path $file.FullName -Destination $path -ErrorAction Stop_x000D__x000A__x0009_}_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Cleaning up temporary files"_x000D__x000A__x0009_Remove-Item -Path "$($env:TEMP)\$($ModuleName)" -Force -Recurse_x000D__x000A__x0009_Remove-Item -Path "$($env:TEMP)\$($ModuleName).zip" -Force_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Installation of the module $($ModuleName), Branch $($Branch), Version $($moduleVersion) completed successfully!"_x000D__x000A_}_x000D__x000A_catch_x000D__x000A_{_x000D__x000A__x0009_Write-LocalMessage -Message "Installation of the module $($ModuleName) failed!"_x000D__x000A__x0009__x000D__x000A__x0009_Write-LocalMessage -Message "Cleaning up temporary files"_x000D__x000A__x0009_Remove-Item -Path "$($env:TEMP)\$($ModuleName)" -Force -Recurse_x000D__x000A__x0009_Remove-Item -Path "$($env:TEMP)\$($ModuleName).zip" -Force_x000D__x000A__x0009__x000D__x000A__x0009_throw_x000D__x000A_}</S> <B N="PlainText">true</B> <Obj N="ContentParameterFlat" RefId="53"> <TNRef RefId="2" /> <LST> <S>name</S> </LST> </Obj> <Obj N="ContentParameterScript" RefId="54"> <TNRef RefId="2" /> <LST /> </Obj> <S N="Name">install.ps1</S> <S N="RelativePath">install.ps1</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="55"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="56"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAwKwFPCMNCgkuU1lOT1BTSVMNCgkJSW5zdGFsbHMgdGhlIMO+bmFtZcO+IE1vZHVsZSBmcm9tIGdpdGh1Yg0KCQkNCgkuREVTQ1JJUFRJT04NCgkJVGhpcyBzY3JpcHQgaW5zdGFsbHMgdGhlIMO+bmFtZcO+IE1vZHVsZSBmcm9tIGdpdGh1Yi4NCgkJDQoJCUl0IGRvZXMgc28gYnkgLi4uDQoJCS0gZG93bmxvYWRpbmcgdGhlIHNwZWNpZmllZCBicmFuY2ggYXMgemlwIHRvICRlbnY6VEVNUA0KCQktIFVucGFja2luZyB0aGF0IHppcCBmaWxlIHRvIGEgZm9sZGVyIGluICRlbnY6VEVNUA0KCQktIE1vdmluZyB0aGF0IGNvbnRlbnQgdG8gYSBtb2R1bGUgZm9sZGVyIGluIGVpdGhlciBwcm9ncmFtIGZpbGVzIChkZWZhdWx0KSBvciB0aGUgdXNlciBwcm9maWxlDQoJDQoJLlBBUkFNRVRFUiBCcmFuY2gNCgkJVGhlIGJyYW5jaCB0byBpbnN0YWxsLiBJbnN0YWxscyBtYXN0ZXIgYnkgZGVmYXVsdC4NCgkJVW5rbm93biBicmFuY2hlcyB3aWxsIHRlcm1pbmF0ZSB0aGUgc2NyaXB0IGluIGVycm9yLg0KCQ0KCS5QQVJBTUVURVIgVXNlck1vZGUNCgkJVGhlIGRvd25sb2FkZWQgbW9kdWxlIHdpbGwgYmUgbW92ZWQgdG8gdGhlIHVzZXIgcHJvZmlsZSwgcmF0aGVyIHRoYW4gcHJvZ3JhbSBmaWxlcy4NCgkJDQoJLlBBUkFNRVRFUiBTY29wZQ0KCQlCeSBkZWZhdWx0LCB0aGUgZG93bmxvYWRlZCBtb2R1bGUgd2lsbCBiZSBtb3ZlZCB0byBwcm9ncmFtIGZpbGVzLg0KCQlTZXR0aW5nIHRoaXMgdG8gJ0N1cnJlbnRVc2VyJyBpbnN0YWxscyB0byB0aGUgdXNlcnByb2ZpbGUgb2YgdGhlIGN1cnJlbnQgdXNlci4NCg0KCS5QQVJBTUVURVIgRm9yY2UNCgkJVGhlIGluc3RhbGwgc2NyaXB0IHdpbGwgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIG1vZHVsZS4NCiM+DQpbQ21kbGV0QmluZGluZygpXQ0KUGFyYW0gKA0KCVtzdHJpbmddDQoJJEJyYW5jaCA9ICJtYXN0ZXIiLA0KCQ0KCVtzd2l0Y2hdDQoJJFVzZXJNb2RlLA0KCQ0KCVtWYWxpZGF0ZVNldCgnQWxsVXNlcnMnLCAnQ3VycmVudFVzZXInKV0NCglbc3RyaW5nXQ0KCSRTY29wZSA9ICJBbGxVc2VycyIsDQoJDQoJW3N3aXRjaF0NCgkkRm9yY2UNCikNCg0KI3JlZ2lvbiBDb25maWd1cmF0aW9uIGZvciBjbG9uaW5nIHNjcmlwdA0KIyBOYW1lIG9mIHRoZSBtb2R1bGUgdGhhdCBpcyBiZWluZyBjbG9uZWQNCiRNb2R1bGVOYW1lID0gIsO+bmFtZcO+Ig0KDQojIEJhc2UgcGF0aCB0byB0aGUgZ2l0aHViIHJlcG9zaXRvcnkNCiRCYXNlVXJsID0gImh0dHBzOi8vZ2l0aHViLmNvbS88SW5zZXJ0VXNlcm5hbWVIZXJlPi/Dvm5hbWXDviINCg0KIyBJZiB0aGUgbW9kdWxlIGlzIGluIGEgc3ViZm9sZGVyIG9mIHRoZSBjbG9uZWQgcmVwb3NpdG9yeSwgc3BlY2lmeSByZWxhdGl2ZSBwYXRoIGhlcmUuIEVtcHR5IHN0cmluZyB0byBza2lwLg0KJFN1YkZvbGRlciA9ICLDvm5hbWXDviINCiNlbmRyZWdpb24gQ29uZmlndXJhdGlvbiBmb3IgY2xvbmluZyBzY3JpcHQNCg0KI3JlZ2lvbiBQYXJhbWV0ZXIgQ2FsY3VsYXRpb24NCiRkb1VzZXJNb2RlID0gJGZhbHNlDQppZiAoJFVzZXJNb2RlKSB7ICRkb1VzZXJNb2RlID0gJHRydWUgfQ0KaWYgKCRpbnN0YWxsX0N1cnJlbnRVc2VyKSB7ICRkb1VzZXJNb2RlID0gJHRydWUgfQ0KaWYgKCRTY29wZSAtZXEgJ0N1cnJlbnRVc2VyJykgeyAkZG9Vc2VyTW9kZSA9ICR0cnVlIH0NCg0KaWYgKCRpbnN0YWxsX0JyYW5jaCkgeyAkQnJhbmNoID0gJGluc3RhbGxfQnJhbmNoIH0NCiNlbmRyZWdpb24gUGFyYW1ldGVyIENhbGN1bGF0aW9uDQoNCiNyZWdpb24gVXRpbGl0eSBGdW5jdGlvbnMNCmZ1bmN0aW9uIENvbXByZXNzLUFyY2hpdmUNCnsNCgk8Iw0KCQkuU1lOT1BTSVMNCgkJCUNyZWF0ZXMgYW4gYXJjaGl2ZSwgb3IgemlwcGVkIGZpbGUsIGZyb20gc3BlY2lmaWVkIGZpbGVzIGFuZCBmb2xkZXJzLg0KDQoJCS5ERVNDUklQVElPTg0KCQkJVGhlIENvbXByZXNzLUFyY2hpdmUgY21kbGV0IGNyZWF0ZXMgYSB6aXBwZWQgKG9yIGNvbXByZXNzZWQpIGFyY2hpdmUgZmlsZSBmcm9tIG9uZSBvciBtb3JlIHNwZWNpZmllZCBmaWxlcyBvciBmb2xkZXJzLiBBbiBhcmNoaXZlIGZpbGUgYWxsb3dzIG11bHRpcGxlIGZpbGVzIHRvIGJlIHBhY2thZ2VkLCBhbmQgb3B0aW9uYWxseSBjb21wcmVzc2VkLCBpbnRvIGEgc2luZ2xlIHppcHBlZCBmaWxlIGZvciBlYXNpZXIgZGlzdHJpYnV0aW9uIGFuZCBzdG9yYWdlLiBBbiBhcmNoaXZlIGZpbGUgY2FuIGJlIGNvbXByZXNzZWQgYnkgdXNpbmcgdGhlIGNvbXByZXNzaW9uIGFsZ29yaXRobSBzcGVjaWZpZWQgYnkgdGhlIENvbXByZXNzaW9uTGV2ZWwgcGFyYW1ldGVyLg0KDQoJCQlCZWNhdXNlIENvbXByZXNzLUFyY2hpdmUgcmVsaWVzIHVwb24gdGhlIE1pY3Jvc29mdCAuTkVUIEZyYW1ld29yayBBUEkgU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmUgdG8gY29tcHJlc3MgZmlsZXMsIHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSB0aGF0IHlvdSBjYW4gY29tcHJlc3MgYnkgdXNpbmcgQ29tcHJlc3MtQXJjaGl2ZSBpcyBjdXJyZW50bHkgMiBHQi4gVGhpcyBpcyBhIGxpbWl0YXRpb24gb2YgdGhlIHVuZGVybHlpbmcgQVBJLg0KDQoJCS5QQVJBTUVURVIgUGF0aA0KCQkJU3BlY2lmaWVzIHRoZSBwYXRoIG9yIHBhdGhzIHRvIHRoZSBmaWxlcyB0aGF0IHlvdSB3YW50IHRvIGFkZCB0byB0aGUgYXJjaGl2ZSB6aXBwZWQgZmlsZS4gVGhpcyBwYXJhbWV0ZXIgY2FuIGFjY2VwdCB3aWxkY2FyZCBjaGFyYWN0ZXJzLiBXaWxkY2FyZCBjaGFyYWN0ZXJzIGFsbG93IHlvdSB0byBhZGQgYWxsIGZpbGVzIGluIGEgZm9sZGVyIHRvIHlvdXIgemlwcGVkIGFyY2hpdmUgZmlsZS4gVG8gc3BlY2lmeSBtdWx0aXBsZSBwYXRocywgYW5kIGluY2x1ZGUgZmlsZXMgaW4gbXVsdGlwbGUgbG9jYXRpb25zIGluIHlvdXIgb3V0cHV0IHppcHBlZCBmaWxlLCB1c2UgY29tbWFzIHRvIHNlcGFyYXRlIHRoZSBwYXRocy4NCg0KCQkuUEFSQU1FVEVSIExpdGVyYWxQYXRoDQoJCQlTcGVjaWZpZXMgdGhlIHBhdGggb3IgcGF0aHMgdG8gdGhlIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gYWRkIHRvIHRoZSBhcmNoaXZlIHppcHBlZCBmaWxlLiBVbmxpa2UgdGhlIFBhdGggcGFyYW1ldGVyLCB0aGUgdmFsdWUgb2YgTGl0ZXJhbFBhdGggaXMgdXNlZCBleGFjdGx5IGFzIGl0IGlzIHR5cGVkLiBObyBjaGFyYWN0ZXJzIGFyZSBpbnRlcnByZXRlZCBhcyB3aWxkY2FyZHMuIElmIHRoZSBwYXRoIGluY2x1ZGVzIGVzY2FwZSBjaGFyYWN0ZXJzLCBlbmNsb3NlIGVhY2ggZXNjYXBlIGNoYXJhY3RlciBpbiBzaW5nbGUgcXVvdGF0aW9uIG1hcmtzLCB0byBpbnN0cnVjdCBXaW5kb3dzIFBvd2VyU2hlbGwgbm90IHRvIGludGVycHJldCBhbnkgY2hhcmFjdGVycyBhcyBlc2NhcGUgc2VxdWVuY2VzLiBUbyBzcGVjaWZ5IG11bHRpcGxlIHBhdGhzLCBhbmQgaW5jbHVkZSBmaWxlcyBpbiBtdWx0aXBsZSBsb2NhdGlvbnMgaW4geW91ciBvdXRwdXQgemlwcGVkIGZpbGUsIHVzZSBjb21tYXMgdG8gc2VwYXJhdGUgdGhlIHBhdGhzLg0KDQoJCS5QQVJBTUVURVIgRGVzdGluYXRpb25QYXRoDQoJCQlTcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIGFyY2hpdmUgb3V0cHV0IGZpbGUuIFRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLiBUaGUgc3BlY2lmaWVkIERlc3RpbmF0aW9uUGF0aCB2YWx1ZSBzaG91bGQgaW5jbHVkZSB0aGUgZGVzaXJlZCBuYW1lIG9mIHRoZSBvdXRwdXQgemlwcGVkIGZpbGU7IGl0IHNwZWNpZmllcyBlaXRoZXIgdGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggdG8gdGhlIHppcHBlZCBmaWxlLiBJZiB0aGUgZmlsZSBuYW1lIHNwZWNpZmllZCBpbiBEZXN0aW5hdGlvblBhdGggZG9lcyBub3QgaGF2ZSBhIC56aXAgZmlsZSBuYW1lIGV4dGVuc2lvbiwgdGhlIGNtZGxldCBhZGRzIGEgLnppcCBmaWxlIG5hbWUgZXh0ZW5zaW9uLg0KDQoJCS5QQVJBTUVURVIgQ29tcHJlc3Npb25MZXZlbA0KCQkJU3BlY2lmaWVzIGhvdyBtdWNoIGNvbXByZXNzaW9uIHRvIGFwcGx5IHdoZW4geW91IGFyZSBjcmVhdGluZyB0aGUgYXJjaGl2ZSBmaWxlLiBGYXN0ZXIgY29tcHJlc3Npb24gcmVxdWlyZXMgbGVzcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZmlsZSwgYnV0IGNhbiByZXN1bHQgaW4gbGFyZ2VyIGZpbGUgc2l6ZXMuIFRoZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3IgdGhpcyBwYXJhbWV0ZXIgYXJlOg0KDQoJCQktIEZhc3Rlc3QuIFVzZSB0aGUgZmFzdGVzdCBjb21wcmVzc2lvbiBtZXRob2QgYXZhaWxhYmxlIHRvIGRlY3JlYXNlIHByb2Nlc3NpbmcgdGltZTsgdGhpcyBjYW4gcmVzdWx0IGluIGxhcmdlciBmaWxlIHNpemVzLg0KCQkJLSBOb0NvbXByZXNzaW9uLiBEbyBub3QgY29tcHJlc3MgdGhlIHNvdXJjZSBmaWxlcy4NCgkJCS0gT3B0aW1hbC4gUHJvY2Vzc2luZyB0aW1lIGlzIGRlcGVuZGVudCBvbiBmaWxlIHNpemUuDQoNCgkJCUlmIHRoaXMgcGFyYW1ldGVyIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBjb21tYW5kIHVzZXMgdGhlIGRlZmF1bHQgdmFsdWUsIE9wdGltYWwuDQoNCgkJLlBBUkFNRVRFUiBVcGRhdGUNCgkJCVVwZGF0ZXMgdGhlIHNwZWNpZmllZCBhcmNoaXZlIGJ5IHJlcGxhY2luZyBvbGRlciB2ZXJzaW9ucyBvZiBmaWxlcyBpbiB0aGUgYXJjaGl2ZSB3aXRoIG5ld2VyIHZlcnNpb25zIG9mIGZpbGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lcy4gWW91IGNhbiBhbHNvIGFkZCB0aGlzIHBhcmFtZXRlciB0byBhZGQgZmlsZXMgdG8gYW4gZXhpc3RpbmcgYXJjaGl2ZS4NCg0KCQkuUEFSQU1FVEVSIEZvcmNlDQoJCQlAe1RleHQ9fQ0KDQoJCS5QQVJBTUVURVIgQ29uZmlybQ0KCQkJUHJvbXB0cyB5b3UgZm9yIGNvbmZpcm1hdGlvbiBiZWZvcmUgcnVubmluZyB0aGUgY21kbGV0Lg0KDQoJCS5QQVJBTUVURVIgV2hhdElmDQoJCQlTaG93cyB3aGF0IHdvdWxkIGhhcHBlbiBpZiB0aGUgY21kbGV0IHJ1bnMuIFRoZSBjbWRsZXQgaXMgbm90IHJ1bi4NCg0KCQkuRVhBTVBMRQ0KCQkJRXhhbXBsZSAxOiBDcmVhdGUgYW4gYXJjaGl2ZSBmaWxlDQoNCgkJCVBTIEM6XD5Db21wcmVzcy1BcmNoaXZlIC1MaXRlcmFsUGF0aCBDOlxSZWZlcmVuY2VcRHJhZnRkb2MuZG9jeCwgQzpcUmVmZXJlbmNlXEltYWdlc1xkaWFncmFtMi52c2QgLUNvbXByZXNzaW9uTGV2ZWwgT3B0aW1hbCAtRGVzdGluYXRpb25QYXRoIEM6XEFyY2hpdmVzXERyYWZ0LlppcA0KDQoJCQlUaGlzIGNvbW1hbmQgY3JlYXRlcyBhIG5ldyBhcmNoaXZlIGZpbGUsIERyYWZ0LnppcCwgYnkgY29tcHJlc3NpbmcgdHdvIGZpbGVzLCBEcmFmdGRvYy5kb2N4IGFuZCBkaWFncmFtMi52c2QsIHNwZWNpZmllZCBieSB0aGUgTGl0ZXJhbFBhdGggcGFyYW1ldGVyLiBUaGUgY29tcHJlc3Npb24gbGV2ZWwgc3BlY2lmaWVkIGZvciB0aGlzIG9wZXJhdGlvbiBpcyBPcHRpbWFsLg0KDQoJCS5FWEFNUExFDQoJCQlFeGFtcGxlIDI6IENyZWF0ZSBhbiBhcmNoaXZlIHdpdGggd2lsZGNhcmQgY2hhcmFjdGVycw0KDQoJCQlQUyBDOlw+Q29tcHJlc3MtQXJjaGl2ZSAtUGF0aCBDOlxSZWZlcmVuY2VcKiAtQ29tcHJlc3Npb25MZXZlbCBGYXN0ZXN0IC1EZXN0aW5hdGlvblBhdGggQzpcQXJjaGl2ZXNcRHJhZnQNCg0KCQkJVGhpcyBjb21tYW5kIGNyZWF0ZXMgYSBuZXcgYXJjaGl2ZSBmaWxlLCBEcmFmdC56aXAsIGluIHRoZSBDOlxBcmNoaXZlcyBmb2xkZXIuIE5vdGUgdGhhdCB0aG91Z2ggdGhlIGZpbGUgbmFtZSBleHRlbnNpb24gLnppcCB3YXMgbm90IGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgRGVzdGluYXRpb25QYXRoIHBhcmFtZXRlciwgV2luZG93cyBQb3dlclNoZWxsIGFwcGVuZHMgdGhpcyB0byB0aGUgc3BlY2lmaWVkIGFyY2hpdmUgZmlsZSBuYW1lIGF1dG9tYXRpY2FsbHkuIFRoZSBuZXcgYXJjaGl2ZSBmaWxlIGNvbnRhaW5zIGV2ZXJ5IGZpbGUgaW4gdGhlIEM6XFJlZmVyZW5jZSBmb2xkZXIsIGJlY2F1c2UgYSB3aWxkY2FyZCBjaGFyYWN0ZXIgd2FzIHVzZWQgaW4gcGxhY2Ugb2Ygc3BlY2lmaWMgZmlsZSBuYW1lcyBpbiB0aGUgUGF0aCBwYXJhbWV0ZXIuIFRoZSBzcGVjaWZpZWQgY29tcHJlc3Npb24gbGV2ZWwgaXMgRmFzdGVzdCwgd2hpY2ggbWlnaHQgcmVzdWx0IGluIGEgbGFyZ2VyIG91dHB1dCBmaWxlLCBidXQgY29tcHJlc3NlcyBhIGxhcmdlIG51bWJlciBvZiBmaWxlcyBmYXN0ZXIuDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgMzogVXBkYXRlIGFuIGV4aXN0aW5nIGFyY2hpdmUgZmlsZQ0KDQoJCQlQUyBDOlw+Q29tcHJlc3MtQXJjaGl2ZSAtUGF0aCBDOlxSZWZlcmVuY2VcKiAtVXBkYXRlIC1EZXN0aW5hdGlvblBhdGggQzpcQXJjaGl2ZXNcRHJhZnQuWmlwDQoNCgkJCVRoaXMgY29tbWFuZCB1cGRhdGVzIGFuIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSwgRHJhZnQuWmlwLCBpbiB0aGUgQzpcQXJjaGl2ZXMgZm9sZGVyLiBUaGUgY29tbWFuZCBpcyBydW4gdG8gdXBkYXRlIERyYWZ0LlppcCB3aXRoIG5ld2VyIHZlcnNpb25zIG9mIGV4aXN0aW5nIGZpbGVzIHRoYXQgY2FtZSBmcm9tIHRoZSBDOlxSZWZlcmVuY2UgZm9sZGVyLCBhbmQgYWxzbyB0byBhZGQgbmV3IGZpbGVzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHRvIEM6XFJlZmVyZW5jZSBzaW5jZSBEcmFmdC5aaXAgd2FzIGluaXRpYWxseSBjcmVhdGVkLg0KDQoJCS5FWEFNUExFDQoJCQlFeGFtcGxlIDQ6IENyZWF0ZSBhbiBhcmNoaXZlIGZyb20gYW4gZW50aXJlIGZvbGRlcg0KDQoJCQlQUyBDOlw+Q29tcHJlc3MtQXJjaGl2ZSAtUGF0aCBDOlxSZWZlcmVuY2UgLURlc3RpbmF0aW9uUGF0aCBDOlxBcmNoaXZlc1xEcmFmdA0KDQoJCQlUaGlzIGNvbW1hbmQgY3JlYXRlcyBhbiBhcmNoaXZlIGZyb20gYW4gZW50aXJlIGZvbGRlciwgQzpcUmVmZXJlbmNlLiBOb3RlIHRoYXQgdGhvdWdoIHRoZSBmaWxlIG5hbWUgZXh0ZW5zaW9uIC56aXAgd2FzIG5vdCBhZGRlZCB0byB0aGUgdmFsdWUgb2YgdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIsIFdpbmRvd3MgUG93ZXJTaGVsbCBhcHBlbmRzIHRoaXMgdG8gdGhlIHNwZWNpZmllZCBhcmNoaXZlIGZpbGUgbmFtZSBhdXRvbWF0aWNhbGx5Lg0KCSM+DQoJW0NtZGxldEJpbmRpbmcoRGVmYXVsdFBhcmFtZXRlclNldE5hbWUgPSAiUGF0aCIsIFN1cHBvcnRzU2hvdWxkUHJvY2VzcyA9ICR0cnVlLCBIZWxwVXJpID0gImh0dHA6Ly9nby5taWNyb3NvZnQuY29tL2Z3bGluay8/TGlua0lEPTM5MzI1MiIpXQ0KCXBhcmFtDQoJKA0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkdHJ1ZSwgUG9zaXRpb24gPSAwLCBQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGgiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJHRydWUpXQ0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkdHJ1ZSwgUG9zaXRpb24gPSAwLCBQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGhXaXRoRm9yY2UiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJHRydWUpXQ0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkdHJ1ZSwgUG9zaXRpb24gPSAwLCBQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGhXaXRoVXBkYXRlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW1ZhbGlkYXRlTm90TnVsbE9yRW1wdHkoKV0NCgkJW3N0cmluZ1tdXQ0KCQkkUGF0aCwNCg0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJMaXRlcmFsUGF0aCIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJHRydWUpXQ0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJMaXRlcmFsUGF0aFdpdGhGb3JjZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJHRydWUpXQ0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJMaXRlcmFsUGF0aFdpdGhVcGRhdGUiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW1ZhbGlkYXRlTm90TnVsbE9yRW1wdHkoKV0NCgkJW0FsaWFzKCJQU1BhdGgiKV0NCgkJW3N0cmluZ1tdXQ0KCQkkTGl0ZXJhbFBhdGgsDQoNCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJHRydWUsDQoJCQkJCVBvc2l0aW9uID0gMSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbVmFsaWRhdGVOb3ROdWxsT3JFbXB0eSgpXQ0KCQlbc3RyaW5nXQ0KCQkkRGVzdGluYXRpb25QYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKA0KCQkJCQltYW5kYXRvcnkgPSAkZmFsc2UsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW1ZhbGlkYXRlU2V0KCJPcHRpbWFsIiwgIk5vQ29tcHJlc3Npb24iLCAiRmFzdGVzdCIpXQ0KCQlbc3RyaW5nXQ0KCQkkQ29tcHJlc3Npb25MZXZlbCA9ICJPcHRpbWFsIiwNCg0KCQlbcGFyYW1ldGVyKG1hbmRhdG9yeSA9ICR0cnVlLCBQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGhXaXRoVXBkYXRlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbcGFyYW1ldGVyKG1hbmRhdG9yeSA9ICR0cnVlLCBQYXJhbWV0ZXJTZXROYW1lID0gIkxpdGVyYWxQYXRoV2l0aFVwZGF0ZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW3N3aXRjaF0NCgkJJFVwZGF0ZSA9ICRmYWxzZSwNCg0KCQlbcGFyYW1ldGVyKG1hbmRhdG9yeSA9ICR0cnVlLCBQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGhXaXRoRm9yY2UiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtwYXJhbWV0ZXIobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGhXaXRoRm9yY2UiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtzd2l0Y2hdDQoJCSRGb3JjZSA9ICRmYWxzZQ0KCSkNCg0KCUJFR0lODQoJew0KCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbiAtRXJyb3JBY3Rpb24gSWdub3JlDQoJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0gLUVycm9yQWN0aW9uIElnbm9yZQ0KDQoJCSR6aXBGaWxlRXh0ZW5zaW9uID0gIi56aXAiDQoNCgkJJExvY2FsaXplZERhdGEgPSBDb252ZXJ0RnJvbS1TdHJpbmdEYXRhIEAnDQpQYXRoTm90Rm91bmRFcnJvcj1UaGUgcGF0aCAnezB9JyBlaXRoZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgdmFsaWQgZmlsZSBzeXN0ZW0gcGF0aC4NCkV4cGFuZEFyY2hpdmVJblZhbGlkRGVzdGluYXRpb25QYXRoPVRoZSBwYXRoICd7MH0nIGlzIG5vdCBhIHZhbGlkIGZpbGUgc3lzdGVtIGRpcmVjdG9yeSBwYXRoLg0KSW52YWxpZFppcEZpbGVFeHRlbnNpb25FcnJvcj17MH0gaXMgbm90IGEgc3VwcG9ydGVkIGFyY2hpdmUgZmlsZSBmb3JtYXQuIHsxfSBpcyB0aGUgb25seSBzdXBwb3J0ZWQgYXJjaGl2ZSBmaWxlIGZvcm1hdC4NCkFyY2hpdmVGaWxlSXNSZWFkT25seT1UaGUgYXR0cmlidXRlcyBvZiB0aGUgYXJjaGl2ZSBmaWxlIHswfSBpcyBzZXQgdG8gJ1JlYWRPbmx5JyBoZW5jZSBpdCBjYW5ub3QgYmUgdXBkYXRlZC4gSWYgeW91IGludGVuZCB0byB1cGRhdGUgdGhlIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSwgcmVtb3ZlIHRoZSAnUmVhZE9ubHknIGF0dHJpYnV0ZSBvbiB0aGUgYXJjaGl2ZSBmaWxlIGVsc2UgdXNlIC1Gb3JjZSBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYW5kIGNyZWF0ZSBhIG5ldyBhcmNoaXZlIGZpbGUuDQpaaXBGaWxlRXhpc3RFcnJvcj1UaGUgYXJjaGl2ZSBmaWxlIHswfSBhbHJlYWR5IGV4aXN0cy4gVXNlIHRoZSAtVXBkYXRlIHBhcmFtZXRlciB0byB1cGRhdGUgdGhlIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSBvciB1c2UgdGhlIC1Gb3JjZSBwYXJhbWV0ZXIgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUuDQpEdXBsaWNhdGVQYXRoRm91bmRFcnJvcj1UaGUgaW5wdXQgdG8gezB9IHBhcmFtZXRlciBjb250YWlucyBhIGR1cGxpY2F0ZSBwYXRoICd7MX0nLiBQcm92aWRlIGEgdW5pcXVlIHNldCBvZiBwYXRocyBhcyBpbnB1dCB0byB7Mn0gcGFyYW1ldGVyLg0KQXJjaGl2ZUZpbGVJc0VtcHR5PVRoZSBhcmNoaXZlIGZpbGUgezB9IGlzIGVtcHR5Lg0KQ29tcHJlc3NQcm9ncmVzc0JhclRleHQ9VGhlIGFyY2hpdmUgZmlsZSAnezB9JyBjcmVhdGlvbiBpcyBpbiBwcm9ncmVzcy4uLg0KRXhwYW5kUHJvZ3Jlc3NCYXJUZXh0PVRoZSBhcmNoaXZlIGZpbGUgJ3swfScgZXhwYW5zaW9uIGlzIGluIHByb2dyZXNzLi4uDQpBcHBlbmRBcmNoaXZlRmlsZUV4dGVuc2lvbk1lc3NhZ2U9VGhlIGFyY2hpdmUgZmlsZSBwYXRoICd7MH0nIHN1cHBsaWVkIHRvIHRoZSBEZXN0aW5hdGlvblBhdGggcGF0YW1ldGVyIGRvZXMgbm90IGluY2x1ZGUgLnppcCBleHRlbnNpb24uIEhlbmNlIC56aXAgaXMgYXBwZW5kZWQgdG8gdGhlIHN1cHBsaWVkIERlc3RpbmF0aW9uUGF0aCBwYXRoIGFuZCB0aGUgYXJjaGl2ZSBmaWxlIHdvdWxkIGJlIGNyZWF0ZWQgYXQgJ3sxfScuDQpBZGRJdGVtdG9BcmNoaXZlRmlsZT1BZGRpbmcgJ3swfScuDQpDcmVhdGVGaWxlQXRFeHBhbmRlZFBhdGg9Q3JlYXRlZCAnezB9Jy4NCkludmFsaWRBcmNoaXZlRmlsZVBhdGhFcnJvcj1UaGUgYXJjaGl2ZSBmaWxlIHBhdGggJ3swfScgc3BlY2lmaWVkIGFzIGlucHV0IHRvIHRoZSB7MX0gcGFyYW1ldGVyIGlzIHJlc29sdmluZyB0byBtdWx0aXBsZSBmaWxlIHN5c3RlbSBwYXRocy4gUHJvdmlkZSBhIHVuaXF1ZSBwYXRoIHRvIHRoZSB7Mn0gcGFyYW1ldGVyIHdoZXJlIHRoZSBhcmNoaXZlIGZpbGUgaGFzIHRvIGJlIGNyZWF0ZWQuDQpJbnZhbGlkRXhwYW5kZWREaXJQYXRoRXJyb3I9VGhlIGRpcmVjdG9yeSBwYXRoICd7MH0nIHNwZWNpZmllZCBhcyBpbnB1dCB0byB0aGUgRGVzdGluYXRpb25QYXRoIHBhcmFtZXRlciBpcyByZXNvbHZpbmcgdG8gbXVsdGlwbGUgZmlsZSBzeXN0ZW0gcGF0aHMuIFByb3ZpZGUgYSB1bmlxdWUgcGF0aCB0byB0aGUgRGVzdGluYXRpb24gcGFyYW1ldGVyIHdoZXJlIHRoZSBhcmNoaXZlIGZpbGUgY29udGVudHMgaGF2ZSB0byBiZSBleHBhbmRlZC4NCkZpbGVFeGlzdHNFcnJvcj1GYWlsZWQgdG8gY3JlYXRlIGZpbGUgJ3swfScgd2hpbGUgZXhwYW5kaW5nIHRoZSBhcmNoaXZlIGZpbGUgJ3sxfScgY29udGVudHMgYXMgdGhlIGZpbGUgJ3syfScgYWxyZWFkeSBleGlzdHMuIFVzZSB0aGUgLUZvcmNlIHBhcmFtZXRlciBpZiB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeSAnezN9JyBjb250ZW50cyB3aGVuIGV4cGFuZGluZyB0aGUgYXJjaGl2ZSBmaWxlLg0KRGVsZXRlQXJjaGl2ZUZpbGU9VGhlIHBhcnRpYWxseSBjcmVhdGVkIGFyY2hpdmUgZmlsZSAnezB9JyBpcyBkZWxldGVkIGFzIGl0IGlzIG5vdCB1c2FibGUuDQpJbnZhbGlkRGVzdGluYXRpb25QYXRoPVRoZSBkZXN0aW5hdGlvbiBwYXRoICd7MH0nIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBhcmNoaXZlIGZpbGUgbmFtZS4NClByZXBhcmluZ1RvQ29tcHJlc3NWZXJib3NlTWVzc2FnZT1QcmVwYXJpbmcgdG8gY29tcHJlc3MuLi4NClByZXBhcmluZ1RvRXhwYW5kVmVyYm9zZU1lc3NhZ2U9UHJlcGFyaW5nIHRvIGV4cGFuZC4uLg0KJ0ANCg0KCQkjcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQoJCWZ1bmN0aW9uIEdldFJlc29sdmVkUGF0aEhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aCwNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRpc0xpdGVyYWxQYXRoLA0KDQoJCQkJW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uUFNDbWRsZXRdDQoJCQkJJGNhbGxlclBTQ21kbGV0DQoJCQkpDQoNCgkJCSRyZXNvbHZlZFBhdGhzID0gQCgpDQoNCgkJCSMgbnVsbCBhbmQgZW1wdHkgY2hlY2sgYXJlIGFyZSBhbHJlYWR5IGRvbmUgb24gUGF0aCBwYXJhbWV0ZXIgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkcGF0aCkNCgkJCXsNCgkJCQl0cnkNCgkJCQl7DQoJCQkJCWlmICgkaXNMaXRlcmFsUGF0aCkNCgkJCQkJew0KCQkJCQkJJGN1cnJlbnRSZXNvbHZlZFBhdGhzID0gUmVzb2x2ZS1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudFBhdGggLUVycm9yQWN0aW9uIFN0b3ANCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRjdXJyZW50UmVzb2x2ZWRQYXRocyA9IFJlc29sdmUtUGF0aCAtUGF0aCAkY3VycmVudFBhdGggLUVycm9yQWN0aW9uIFN0b3ANCgkJCQkJfQ0KCQkJCX0NCgkJCQljYXRjaA0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QYXRoTm90Rm91bmRFcnJvciAtZiAkY3VycmVudFBhdGgpDQoJCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UsICRfLkV4Y2VwdGlvbg0KCQkJCQkkZXJyb3JSZWNvcmQgPSBDcmVhdGVFcnJvclJlY29yZEhlbHBlciAiQXJjaGl2ZUNtZGxldFBhdGhOb3RGb3VuZCIgJG51bGwgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRleGNlcHRpb24gJGN1cnJlbnRQYXRoDQoJCQkJCSRjYWxsZXJQU0NtZGxldC5UaHJvd1Rlcm1pbmF0aW5nRXJyb3IoJGVycm9yUmVjb3JkKQ0KCQkJCX0NCg0KCQkJCWZvcmVhY2ggKCRjdXJyZW50UmVzb2x2ZWRQYXRoIGluICRjdXJyZW50UmVzb2x2ZWRQYXRocykNCgkJCQl7DQoJCQkJCSRyZXNvbHZlZFBhdGhzICs9ICRjdXJyZW50UmVzb2x2ZWRQYXRoLlByb3ZpZGVyUGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJJHJlc29sdmVkUGF0aHMNCgkJfQ0KDQoJCWZ1bmN0aW9uIEFkZC1Db21wcmVzc2lvbkFzc2VtYmxpZXMNCgkJew0KDQoJCQlpZiAoJFBTRWRpdGlvbiAtZXEgIkRlc2t0b3AiKQ0KCQkJew0KCQkJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uDQoJCQkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uRmlsZVN5c3RlbQ0KCQkJfQ0KCQl9DQoNCgkJZnVuY3Rpb24gSXNWYWxpZEZpbGVTeXN0ZW1QYXRoDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRwYXRoDQoJCQkpDQoNCgkJCSRyZXN1bHQgPSAkdHJ1ZTsNCg0KCQkJIyBudWxsIGFuZCBlbXB0eSBjaGVjayBhcmUgYXJlIGFscmVhZHkgZG9uZSBvbiBQYXRoIHBhcmFtZXRlciBhdCB0aGUgY21kbGV0IGxheWVyLg0KCQkJZm9yZWFjaCAoJGN1cnJlbnRQYXRoIGluICRwYXRoKQ0KCQkJew0KCQkJCWlmICghKFtTeXN0ZW0uSU8uRmlsZV06OkV4aXN0cygkY3VycmVudFBhdGgpIC1vciBbU3lzdGVtLklPLkRpcmVjdG9yeV06OkV4aXN0cygkY3VycmVudFBhdGgpKSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGN1cnJlbnRQYXRoKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIlBhdGhOb3RGb3VuZCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGN1cnJlbnRQYXRoDQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gJHJlc3VsdDsNCgkJfQ0KDQoNCgkJZnVuY3Rpb24gVmFsaWRhdGVEdXBsaWNhdGVGaWxlU3lzdGVtUGF0aA0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGlucHV0UGFyYW1ldGVyLA0KDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRwYXRoDQoJCQkpDQoNCgkJCSR1bmlxdWVJbnB1dFBhdGhzID0gQCgpDQoNCgkJCSMgbnVsbCBhbmQgZW1wdHkgY2hlY2sgYXJlIGFyZSBhbHJlYWR5IGRvbmUgb24gUGF0aCBwYXJhbWV0ZXIgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkcGF0aCkNCgkJCXsNCgkJCQkkY3VycmVudElucHV0UGF0aCA9ICRjdXJyZW50UGF0aC5Ub1VwcGVyKCkNCgkJCQlpZiAoJHVuaXF1ZUlucHV0UGF0aHMuQ29udGFpbnMoJGN1cnJlbnRJbnB1dFBhdGgpKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5EdXBsaWNhdGVQYXRoRm91bmRFcnJvciAtZiAkaW5wdXRQYXJhbWV0ZXIsICRjdXJyZW50UGF0aCwgJGlucHV0UGFyYW1ldGVyKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkR1cGxpY2F0ZVBhdGhGb3VuZCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGN1cnJlbnRQYXRoDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSR1bmlxdWVJbnB1dFBhdGhzICs9ICRjdXJyZW50SW5wdXRQYXRoDQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3Npb25MZXZlbE1hcHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwNCgkJCSkNCg0KCQkJJGNvbXByZXNzaW9uTGV2ZWxGb3JtYXQgPSBbU3lzdGVtLklPLkNvbXByZXNzaW9uLkNvbXByZXNzaW9uTGV2ZWxdOjpPcHRpbWFsDQoNCgkJCSMgQ29tcHJlc3Npb25MZXZlbCBmb3JtYXQgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCXN3aXRjaCAoJGNvbXByZXNzaW9uTGV2ZWwuVG9TdHJpbmcoKSkNCgkJCXsNCgkJCQkiRmFzdGVzdCINCgkJCQl7DQoJCQkJCSRjb21wcmVzc2lvbkxldmVsRm9ybWF0ID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5Db21wcmVzc2lvbkxldmVsXTo6RmFzdGVzdA0KCQkJCX0NCgkJCQkiTm9Db21wcmVzc2lvbiINCgkJCQl7DQoJCQkJCSRjb21wcmVzc2lvbkxldmVsRm9ybWF0ID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5Db21wcmVzc2lvbkxldmVsXTo6Tm9Db21wcmVzc2lvbg0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICRjb21wcmVzc2lvbkxldmVsRm9ybWF0DQoJCX0NCg0KCQlmdW5jdGlvbiBDb21wcmVzc0FyY2hpdmVIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHNvdXJjZVBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRkZXN0aW5hdGlvblBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsLA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZQ0KCQkJKQ0KDQoJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gMA0KCQkJJHNvdXJjZUZpbGVQYXRocyA9IEAoKQ0KCQkJJHNvdXJjZURpclBhdGhzID0gQCgpDQoNCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkc291cmNlUGF0aCkNCgkJCXsNCgkJCQkkcmVzdWx0ID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudFBhdGggLVBhdGhUeXBlIExlYWYNCgkJCQlpZiAoJHJlc3VsdCAtZXEgJHRydWUpDQoJCQkJew0KCQkJCQkkc291cmNlRmlsZVBhdGhzICs9ICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkc291cmNlRGlyUGF0aHMgKz0gJGN1cnJlbnRQYXRoDQoJCQkJfQ0KCQkJfQ0KDQoJCQkjIFRoZSBTb3VyZSBQYXRoIGNvbnRhaW5zIG9uZSBvciBtb3JlIGRpcmVjdG9yeSAodGhpcyBkaXJlY3RvcnkgY2FuIGhhdmUgZmlsZXMgdW5kZXIgaXQpIGFuZCBubyBmaWxlcyB0byBiZSBjb21wcmVzc2VkLg0KCQkJaWYgKCRzb3VyY2VGaWxlUGF0aHMuQ291bnQgLWVxIDAgLWFuZCAkc291cmNlRGlyUGF0aHMuQ291bnQgLWd0IDApDQoJCQl7DQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwL1tkb3VibGVdJHNvdXJjZURpclBhdGhzLkNvdW50DQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCgkJCQlmb3JlYWNoICgkY3VycmVudFNvdXJjZURpclBhdGggaW4gJHNvdXJjZURpclBhdGhzKQ0KCQkJCXsNCgkJCQkJJGNvdW50ID0gQ29tcHJlc3NTaW5nbGVEaXJIZWxwZXIgJGN1cnJlbnRTb3VyY2VEaXJQYXRoICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJHRydWUgJGlzVXBkYXRlTW9kZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9ICRjb3VudA0KCQkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICs9ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCX0NCgkJCX0NCg0KCQkJIyBUaGUgU291cmUgUGF0aCBjb250YWlucyBvbmx5IGZpbGVzIHRvIGJlIGNvbXByZXNzZWQuDQoJCQllbHNlSWYgKCRzb3VyY2VGaWxlUGF0aHMuQ291bnQgLWd0IDAgLWFuZCAkc291cmNlRGlyUGF0aHMuQ291bnQgLWVxIDApDQoJCQl7DQoJCQkJIyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0IGlzIGVxdWFsIHRvIDAgYXMgdGhlcmUgYXJlIG5vIHByaW9yIHNlZ21lbnRzLg0KCQkJCSMgJGN1cnJlbnRTZWdtZW50V2VpZ2h0IGlzIHNldCB0byAxMDAgYXMgYWxsIGZpbGVzIGhhdmUgZXF1YWwgd2VpZ2h0YWdlLg0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwDQoNCgkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gQ29tcHJlc3NGaWxlc0hlbHBlciAkc291cmNlRmlsZVBhdGhzICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJGlzVXBkYXRlTW9kZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJfQ0KCQkJIyBUaGUgU291cmUgUGF0aCBjb250YWlucyBvbmUgb3IgbW9yZSBmaWxlcyBhbmQgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgKHRoaXMgZGlyZWN0b3J5IGNhbiBoYXZlIGZpbGVzIHVuZGVyIGl0KSB0byBiZSBjb21wcmVzc2VkLg0KCQkJZWxzZWlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1ndCAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1ndCAwKQ0KCQkJew0KCQkJCSMgZWFjaCBkaXJlY3RvcnkgaXMgY29uc2lkZXJlZCBhcyBhbiBpbmRpdmlkdWFsIHNlZ21lbnRzICYgYWxsIHRoZSBpbmRpdmlkdWFsIGZpbGVzIGFyZSBjbHViZWQgaW4gdG8gYSBzZXBhcmF0ZSBzZ2VtbmV0Lg0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMC9bZG91YmxlXSgkc291cmNlRGlyUGF0aHMuQ291bnQgKyAxKQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoNCgkJCQlmb3JlYWNoICgkY3VycmVudFNvdXJjZURpclBhdGggaW4gJHNvdXJjZURpclBhdGhzKQ0KCQkJCXsNCgkJCQkJJGNvdW50ID0gQ29tcHJlc3NTaW5nbGVEaXJIZWxwZXIgJGN1cnJlbnRTb3VyY2VEaXJQYXRoICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJHRydWUgJGlzVXBkYXRlTW9kZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9ICRjb3VudA0KCQkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICs9ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCX0NCg0KCQkJCSRjb3VudCA9IENvbXByZXNzRmlsZXNIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9ICRjb3VudA0KCQkJfQ0KDQoJCQlyZXR1cm4gJG51bWJlck9mSXRlbXNBcmNoaXZlZA0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3NGaWxlc0hlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkc291cmNlRmlsZVBhdGhzLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJKQ0KDQoJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gWmlwQXJjaGl2ZUhlbHBlciAkc291cmNlRmlsZVBhdGhzICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJGlzVXBkYXRlTW9kZSAkbnVsbCAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KDQoJCQlyZXR1cm4gJG51bWJlck9mSXRlbXNBcmNoaXZlZA0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3NTaW5nbGVEaXJIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRzb3VyY2VEaXJQYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSR1c2VQYXJlbnREaXJBc1Jvb3QsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RbU3lzdGVtLlN0cmluZ11dJHN1YkRpckZpbGVzID0gQCgpDQoNCgkJCWlmICgkdXNlUGFyZW50RGlyQXNSb290KQ0KCQkJew0KCQkJCSRzb3VyY2VEaXJJbmZvID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkRpcmVjdG9yeUluZm8gLUFyZ3VtZW50TGlzdCAkc291cmNlRGlyUGF0aA0KCQkJCSRzb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJJbmZvLlBhcmVudC5GdWxsTmFtZQ0KDQoJCQkJIyBJZiB0aGUgZGlyZWN0b3J5IGlzIHByZXNlbnQgYXQgdGhlIGRyaXZlIGxldmVsIHRoZSBEaXJlY3RvcnlJbmZvLlBhcmVudCBpbmNsdWRlICdcJyBleGFtcGxlOiBDOlwNCgkJCQkjIE9uIHRoZSBvdGhlciBoYW5kIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzIGF0IGEgZGVwZXIgbGV2ZWwgdGhlbiBEaXJlY3RvcnlJbmZvLlBhcmVudA0KCQkJCSMgaGFzIGp1c3QgdGhlIHBhdGggKHdpdGhvdXQgYW4gZW5kaW5nICdcJykuIGV4YW1wbGUgQzpcc291cmNlDQoJCQkJaWYgKCRzb3VyY2VEaXJGdWxsTmFtZS5MZW5ndGggLWVxIDMpDQoJCQkJew0KCQkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJGdWxsTmFtZQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJGdWxsTmFtZSArICJcIg0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkc291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyUGF0aA0KCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpckZ1bGxOYW1lICsgIlwiDQoJCQl9DQoNCgkJCSRkaXJDb250ZW50cyA9IEdldC1DaGlsZEl0ZW0gLUxpdGVyYWxQYXRoICRzb3VyY2VEaXJQYXRoIC1SZWN1cnNlDQoJCQlmb3JlYWNoICgkY3VycmVudENvbnRlbnQgaW4gJGRpckNvbnRlbnRzKQ0KCQkJew0KCQkJCSRpc0NvbnRhaW5lciA9ICRjdXJyZW50Q29udGVudCAtaXMgW1N5c3RlbS5JTy5EaXJlY3RvcnlJbmZvXQ0KCQkJCWlmICghJGlzQ29udGFpbmVyKQ0KCQkJCXsNCgkJCQkJJHN1YkRpckZpbGVzLkFkZCgkY3VycmVudENvbnRlbnQuRnVsbE5hbWUpDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSMgVGhlIGN1cnJlbnRDb250ZW50IHBvaW50cyB0byBhIGRpcmVjdG9yeS4NCgkJCQkJIyBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkaXJlY3RvcnkgaXMgYW4gZW1wdHkgZGlyZWN0b3J5LCBpZiBzbyBzdWNoIGENCgkJCQkJIyBkaXJlY3RvcnkgaGFzIHRvIGJlIGV4cGxpY3RseSBhZGRlZCB0byB0aGUgYXJjaGl2ZSBmaWxlLg0KCQkJCQkjIGlmIHRoZXJlIGFyZSBubyBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRoZSBHZXRGaWxlcygpIEFQSSByZXR1cm5zIGFuIGVtcHR5IGFycmF5Lg0KCQkJCQkkZmlsZXMgPSAkY3VycmVudENvbnRlbnQuR2V0RmlsZXMoKQ0KCQkJCQlpZiAoJGZpbGVzLkNvdW50IC1lcSAwKQ0KCQkJCQl7DQoJCQkJCQkkc3ViRGlyRmlsZXMuQWRkKCRjdXJyZW50Q29udGVudC5GdWxsTmFtZSArICJcIikNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IFppcEFyY2hpdmVIZWxwZXIgJHN1YkRpckZpbGVzLlRvQXJyYXkoKSAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIFppcEFyY2hpdmVIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdFtTeXN0ZW0uU3RyaW5nXV0NCgkJCQkkc291cmNlUGF0aHMsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRkZXN0aW5hdGlvblBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsLA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZSwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJKQ0KDQoJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gMA0KCQkJJGZpbGVNb2RlID0gW1N5c3RlbS5JTy5GaWxlTW9kZV06OkNyZWF0ZQ0KCQkJJHJlc3VsdCA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJERlc3RpbmF0aW9uUGF0aCAtUGF0aFR5cGUgTGVhZg0KCQkJaWYgKCRyZXN1bHQgLWVxICR0cnVlKQ0KCQkJew0KCQkJCSRmaWxlTW9kZSA9IFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuDQoJCQl9DQoNCgkJCUFkZC1Db21wcmVzc2lvbkFzc2VtYmxpZXMNCg0KCQkJdHJ5DQoJCQl7DQoJCQkJIyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgdGhlIGFyY2hpdmUgZmlsZSBoYXMgd3JpdGUgYWNjZXNzLg0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbUFyZ3MgPSBAKCRkZXN0aW5hdGlvblBhdGgsICRmaWxlTW9kZSkNCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uRmlsZVN0cmVhbSAtQXJndW1lbnRMaXN0ICRhcmNoaXZlRmlsZVN0cmVhbUFyZ3MNCg0KCQkJCSR6aXBBcmNoaXZlQXJncyA9IEAoJGFyY2hpdmVGaWxlU3RyZWFtLCBbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmVNb2RlXTo6VXBkYXRlLCAkZmFsc2UpDQoJCQkJJHppcEFyY2hpdmUgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZSAtQXJndW1lbnRMaXN0ICR6aXBBcmNoaXZlQXJncw0KDQoJCQkJJGN1cnJlbnRFbnRyeUNvdW50ID0gMA0KCQkJCSRwcm9ncmVzc0JhclN0YXR1cyA9ICgkTG9jYWxpemVkRGF0YS5Db21wcmVzc1Byb2dyZXNzQmFyVGV4dCAtZiAkZGVzdGluYXRpb25QYXRoKQ0KCQkJCSRidWZmZXJTaXplID0gNGtiDQoJCQkJJGJ1ZmZlciA9IE5ldy1PYmplY3QgQnl0ZVtdICRidWZmZXJTaXplDQoNCgkJCQlmb3JlYWNoICgkY3VycmVudEZpbGVQYXRoIGluICRzb3VyY2VQYXRocykNCgkJCQl7DQoJCQkJCWlmICgkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSAtbmUgJG51bGwgLWFuZCAkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZS5MZW5ndGggLWd0IDApDQoJCQkJCXsNCgkJCQkJCSRpbmRleCA9ICRjdXJyZW50RmlsZVBhdGguSW5kZXhPZigkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSwgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpDQoJCQkJCQkkY3VycmVudEZpbGVQYXRoU3ViU3RyaW5nID0gJGN1cnJlbnRGaWxlUGF0aC5TdWJzdHJpbmcoJGluZGV4LCAkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZS5MZW5ndGgpDQoJCQkJCQkkcmVsYXRpdmVGaWxlUGF0aCA9ICRjdXJyZW50RmlsZVBhdGguUmVwbGFjZSgkY3VycmVudEZpbGVQYXRoU3ViU3RyaW5nLCAiIikuVHJpbSgpDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkcmVsYXRpdmVGaWxlUGF0aCA9IFtTeXN0ZW0uSU8uUGF0aF06OkdldEZpbGVOYW1lKCRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCX0NCg0KCQkJCQkjIFVwZGF0ZSBtb2RlIGlzIHNlbGVjdGVkLg0KCQkJCQkjIENoZWNrIHRvIHNlZSBpZiBhcmNoaXZlIGZpbGUgYWxyZWFkeSBjb250YWlucyBvbmUgb3IgbW9yZSB6aXAgZmlsZXMgaW4gaXQuDQoJCQkJCWlmICgkaXNVcGRhdGVNb2RlIC1lcSAkdHJ1ZSAtYW5kICR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgLWd0IDApDQoJCQkJCXsNCgkJCQkJCSRlbnRyeVRvQmVVcGRhdGVkID0gJG51bGwNCg0KCQkJCQkJIyBDaGVjayBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZSBmaWxlLg0KCQkJCQkJIyBJZiBzbyByZXBsYWNlIGl0IHdpdGggbmV3IGZpbGUgZnJvbSB0aGUgaW5wdXQgc291cmNlLg0KCQkJCQkJIyBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYXJjaGl2ZSBmaWxlIHRoZW4gZGVmYXVsdCB0bw0KCQkJCQkJIyBjcmVhdGUgbW9kZSBhbmQgY3JlYXRlIHRoZSBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBmaWxlLg0KDQoJCQkJCQlmb3JlYWNoICgkY3VycmVudEFyY2hpdmVFbnRyeSBpbiAkemlwQXJjaGl2ZS5FbnRyaWVzKQ0KCQkJCQkJew0KCQkJCQkJCWlmICgkY3VycmVudEFyY2hpdmVFbnRyeS5GdWxsTmFtZSAtZXEgJHJlbGF0aXZlRmlsZVBhdGgpDQoJCQkJCQkJew0KCQkJCQkJCQkkZW50cnlUb0JlVXBkYXRlZCA9ICRjdXJyZW50QXJjaGl2ZUVudHJ5DQoJCQkJCQkJCWJyZWFrDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoJGVudHJ5VG9CZVVwZGF0ZWQgLW5lICRudWxsKQ0KCQkJCQkJew0KCQkJCQkJCSRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJCQkkZW50cnlUb0JlVXBkYXRlZC5EZWxldGUoKQ0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJJGNvbXByZXNzaW9uID0gQ29tcHJlc3Npb25MZXZlbE1hcHBlciAkY29tcHJlc3Npb25MZXZlbA0KDQoJCQkJCSMgSWYgYSBkaXJlY3RvcnkgbmVlZHMgdG8gYmUgYWRkZWQgdG8gYW4gYXJjaGl2ZSBmaWxlLA0KCQkJCQkjIGJ5IGNvbnZlbnRpb24gdGhlIC5OZXQgQVBJJ3MgZXhwZWN0IHRoZSBwYXRoIG9mIHRoZSBkaXJldGNvcnkNCgkJCQkJIyB0byBlbmQgd2l0aCAnXCcgdG8gZGV0ZWN0IHRoZSBwYXRoIGFzIGFuIGRpcmVjdG9yeS4NCgkJCQkJaWYgKCEkcmVsYXRpdmVGaWxlUGF0aC5FbmRzV2l0aCgiXCIsIFtTdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKQ0KCQkJCQl7DQoJCQkJCQl0cnkNCgkJCQkJCXsNCgkJCQkJCQl0cnkNCgkJCQkJCQl7DQoJCQkJCQkJCSRjdXJyZW50RmlsZVN0cmVhbSA9IFtTeXN0ZW0uSU8uRmlsZV06Ok9wZW4oJGN1cnJlbnRGaWxlUGF0aCwgW1N5c3RlbS5JTy5GaWxlTW9kZV06Ok9wZW4sIFtTeXN0ZW0uSU8uRmlsZUFjY2Vzc106OlJlYWQpDQoJCQkJCQkJfQ0KCQkJCQkJCWNhdGNoDQoJCQkJCQkJew0KCQkJCQkJCQkjIEZhaWxlZCB0byBhY2Nlc3MgdGhlIGZpbGUuIFdyaXRlIGEgbm9uIHRlcm1pbmF0aW5nIGVycm9yIHRvIHRoZSBwaXBlbGluZQ0KCQkJCQkJCQkjIGFuZCBtb3ZlIG9uIHdpdGggdGhlIHJlbWFpbmluZyBmaWxlcy4NCgkJCQkJCQkJJGV4Y2VwdGlvbiA9ICRfLkV4Y2VwdGlvbg0KCQkJCQkJCQlpZiAoJG51bGwgLW5lICRfLkV4Y2VwdGlvbiAtYW5kDQoJCQkJCQkJCQkkbnVsbCAtbmUgJF8uRXhjZXB0aW9uLklubmVyRXhjZXB0aW9uKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkkZXhjZXB0aW9uID0gJF8uRXhjZXB0aW9uLklubmVyRXhjZXB0aW9uDQoJCQkJCQkJCX0NCgkJCQkJCQkJJGVycm9yUmVjb3JkID0gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXIgIkNvbXByZXNzQXJjaGl2ZVVuYXV0aG9yaXplZEFjY2Vzc0Vycm9yIiAkbnVsbCAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OlBlcm1pc3Npb25EZW5pZWQpICRleGNlcHRpb24gJGN1cnJlbnRGaWxlUGF0aA0KCQkJCQkJCQlXcml0ZS1FcnJvciAtRXJyb3JSZWNvcmQgJGVycm9yUmVjb3JkDQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKCRudWxsIC1uZSAkY3VycmVudEZpbGVTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkc3JjU3RyZWFtID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uQmluYXJ5UmVhZGVyICRjdXJyZW50RmlsZVN0cmVhbQ0KDQoJCQkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5ID0gJHppcEFyY2hpdmUuQ3JlYXRlRW50cnkoJHJlbGF0aXZlRmlsZVBhdGgsICRjb21wcmVzc2lvbikNCg0KCQkJCQkJCQkjIFVwZGF0aW5nICB0aGUgRmlsZSBDcmVhdGlvbiB0aW1lIHNvIHRoYXQgdGhlIHNhbWUgdGltZXN0YW1wIHdvdWxkIGJlIHJldGFpbmVkIGFmdGVyIGV4cGFuZGluZyB0aGUgY29tcHJlc3NlZCBmaWxlLg0KCQkJCQkJCQkjIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCBHZXQtQ2hpbGRJdGVtIHdvdWxkIHN1Y2NlZWQuDQoJCQkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5Lkxhc3RXcml0ZVRpbWUgPSAoR2V0LUl0ZW0gLUxpdGVyYWxQYXRoICRjdXJyZW50RmlsZVBhdGgpLkxhc3RXcml0ZVRpbWUNCg0KCQkJCQkJCQkkZGVzdFN0cmVhbSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkJpbmFyeVdyaXRlciAkY3VycmVudEFyY2hpdmVFbnRyeS5PcGVuKCkNCg0KCQkJCQkJCQl3aGlsZSAoJG51bWJlck9mQnl0ZXNSZWFkID0gJHNyY1N0cmVhbS5SZWFkKCRidWZmZXIsIDAsICRidWZmZXJTaXplKSkNCgkJCQkJCQkJew0KCQkJCQkJCQkJJGRlc3RTdHJlYW0uV3JpdGUoJGJ1ZmZlciwgMCwgJG51bWJlck9mQnl0ZXNSZWFkKQ0KCQkJCQkJCQkJJGRlc3RTdHJlYW0uRmx1c2goKQ0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAxDQoJCQkJCQkJCSRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQlmaW5hbGx5DQoJCQkJCQl7DQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkY3VycmVudEZpbGVTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkY3VycmVudEZpbGVTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJHNyY1N0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRzcmNTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJGRlc3RTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkZGVzdFN0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeSA9ICR6aXBBcmNoaXZlLkNyZWF0ZUVudHJ5KCIkcmVsYXRpdmVGaWxlUGF0aCIsICRjb21wcmVzc2lvbikNCgkJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gMQ0KCQkJCQkJJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BZGRJdGVtdG9BcmNoaXZlRmlsZSAtZiAkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQl9DQoNCgkJCQkJaWYgKCRudWxsIC1uZSAkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlKQ0KCQkJCQl7DQoJCQkJCQlXcml0ZS1WZXJib3NlICRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UNCgkJCQkJfQ0KDQoJCQkJCSRjdXJyZW50RW50cnlDb3VudCArPSAxDQoJCQkJCVByb2dyZXNzQmFySGVscGVyICJDb21wcmVzcy1BcmNoaXZlIiAkcHJvZ3Jlc3NCYXJTdGF0dXMgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQgJHNvdXJjZVBhdGhzLkNvdW50ICAkY3VycmVudEVudHJ5Q291bnQNCgkJCQl9DQoJCQl9DQoJCQlmaW5hbGx5DQoJCQl7DQoJCQkJSWYgKCRudWxsIC1uZSAkemlwQXJjaGl2ZSkNCgkJCQl7DQoJCQkJCSR6aXBBcmNoaXZlLkRpc3Bvc2UoKQ0KCQkJCX0NCg0KCQkJCUlmICgkbnVsbCAtbmUgJGFyY2hpdmVGaWxlU3RyZWFtKQ0KCQkJCXsNCgkJCQkJJGFyY2hpdmVGaWxlU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCX0NCg0KCQkJCSMgQ29tcGxldGUgd3JpdGluZyBwcm9ncmVzcy4NCgkJCQlXcml0ZS1Qcm9ncmVzcyAtQWN0aXZpdHkgIkNvbXByZXNzLUFyY2hpdmUiIC1Db21wbGV0ZWQNCgkJCX0NCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgVmFsaWRhdGVBcmNoaXZlUGF0aEhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHZhbGlkYXRlIHRoZSBhcmNoaXZlIGZpbGUNCiMgcGF0aCAmIGl0cyBmaWxlIGZvcm1hdC4gVGhlIG9ubHkgc3VwcG9ydGVkIGFyY2hpdmUgZmlsZSBmb3JtYXQgaXMgLnppcA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIFZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRhcmNoaXZlRmlsZQ0KCQkJKQ0KDQoJCQlpZiAoW1N5c3RlbS5JTy5GaWxlXTo6RXhpc3RzKCRhcmNoaXZlRmlsZSkpDQoJCQl7DQoJCQkJJGV4dGVuc2lvbiA9IFtzeXN0ZW0uSU8uUGF0aF06OkdldEV4dGVuc2lvbigkYXJjaGl2ZUZpbGUpDQoNCgkJCQkjIEludmFsaWQgZmlsZSBleHRlbnNpb24gaXMgc3BlY2lmZWQgZm9yIHRoZSB6aXAgZmlsZS4NCgkJCQlpZiAoJGV4dGVuc2lvbiAtbmUgJHppcEZpbGVFeHRlbnNpb24pDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWRaaXBGaWxlRXh0ZW5zaW9uRXJyb3IgLWYgJGV4dGVuc2lvbiwgJHppcEZpbGVFeHRlbnNpb24pDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiTm90U3VwcG9ydGVkQXJjaGl2ZUZpbGVFeHRlbnNpb24iICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRleHRlbnNpb24NCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QYXRoTm90Rm91bmRFcnJvciAtZiAkYXJjaGl2ZUZpbGUpDQoJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJQYXRoTm90Rm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRhcmNoaXZlRmlsZQ0KCQkJfQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBFeHBhbmRBcmNoaXZlSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gZXhwYW5kIHRoZSBhcmNoaXZlIGZpbGUgY29udGVudHMNCiMgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gRXhwYW5kQXJjaGl2ZUhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGFyY2hpdmVGaWxlLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZXhwYW5kZWREaXIsDQoNCgkJCQlbcmVmXQ0KCQkJCSRleHBhbmRlZEl0ZW1zLA0KDQoJCQkJW2Jvb2xlYW5dDQoJCQkJJGZvcmNlLA0KDQoJCQkJW2Jvb2xlYW5dDQoJCQkJJGlzVmVyYm9zZSwNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRpc0NvbmZpcm0NCgkJCSkNCg0KCQkJQWRkLUNvbXByZXNzaW9uQXNzZW1ibGllcw0KDQoJCQl0cnkNCgkJCXsNCgkJCQkjIFRoZSBleGlzdGFuY2Ugb2YgYXJjaGl2ZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGJ5IFZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXINCgkJCQkjIGJlZm9yZSBjYWxsaW5nIHRoaXMgaGVscGVyIGZ1bmN0aW9uLg0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbUFyZ3MgPSBAKCRhcmNoaXZlRmlsZSwgW1N5c3RlbS5JTy5GaWxlTW9kZV06Ok9wZW4sIFtTeXN0ZW0uSU8uRmlsZUFjY2Vzc106OlJlYWQpDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVTdHJlYW0gLUFyZ3VtZW50TGlzdCAkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzDQoNCgkJCQkkemlwQXJjaGl2ZUFyZ3MgPSBAKCRhcmNoaXZlRmlsZVN0cmVhbSwgW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlTW9kZV06OlJlYWQsICRmYWxzZSkNCgkJCQkkemlwQXJjaGl2ZSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlIC1Bcmd1bWVudExpc3QgJHppcEFyY2hpdmVBcmdzDQoNCgkJCQlpZiAoJHppcEFyY2hpdmUuRW50cmllcy5Db3VudCAtZXEgMCkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZUlzRW1wdHkgPSAoJExvY2FsaXplZERhdGEuQXJjaGl2ZUZpbGVJc0VtcHR5IC1mICRhcmNoaXZlRmlsZSkNCgkJCQkJV3JpdGUtVmVyYm9zZSAkYXJjaGl2ZUZpbGVJc0VtcHR5DQoJCQkJCXJldHVybg0KCQkJCX0NCg0KCQkJCSRjdXJyZW50RW50cnlDb3VudCA9IDANCgkJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuRXhwYW5kUHJvZ3Jlc3NCYXJUZXh0IC1mICRhcmNoaXZlRmlsZSkNCg0KCQkJCSMgVGhlIGFyY2hpdmUgZW50cmllcyBjYW4gZWl0aGVyIGJlIGVtcHR5IGRpcmVjdG9yaWVzIG9yIGZpbGVzLg0KCQkJCWZvcmVhY2ggKCRjdXJyZW50QXJjaGl2ZUVudHJ5IGluICR6aXBBcmNoaXZlLkVudHJpZXMpDQoJCQkJew0KCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeVBhdGggPSBKb2luLVBhdGggLVBhdGggJGV4cGFuZGVkRGlyIC1DaGlsZFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnkuRnVsbE5hbWUNCgkJCQkJJGV4dGVuc2lvbiA9IFtzeXN0ZW0uSU8uUGF0aF06OkdldEV4dGVuc2lvbigkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgpDQoNCgkJCQkJIyBUaGUgY3VycmVudCBhcmNoaXZlIGVudHJ5IGlzIGFuIGVtcHR5IGRpcmVjdG9yeQ0KCQkJCQkjIFRoZSBGdWxsTmFtZSBvZiB0aGUgQXJjaGl2ZSBFbnRyeSByZXByZXNlbnRpbmcgYSBkaXJlY3Rvcnkgd291bGQgZW5kIHdpdGggYSB0cmFpbGluZyAnXCcuDQoJCQkJCWlmICgkZXh0ZW5zaW9uIC1lcSBbc3RyaW5nXTo6RW1wdHkgLWFuZA0KCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoLkVuZHNXaXRoKCJcIiwgW1N0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpDQoJCQkJCXsNCgkJCQkJCSRwYXRoRXhpc3RzID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCg0KCQkJCQkJIyBUaGUgY3VycmVudCBhcmNoaXZlIGVudHJ5IGV4cGVjdHMgYW4gZW1wdHkgZGlyZWN0b3J5Lg0KCQkJCQkJIyBDaGVjayBpZiB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5IGlzIGVtcHR5LiBJZiBpdHMgbm90IGVtcHR5DQoJCQkJCQkjIHRoZW4gaXQgbWVhbnMgdGhhdCB1c2VyIGhhcyBhZGRlZCB0aGlzIGRpcmVjdG9yeSBieSBvdGhlciBtZWFucy4NCgkJCQkJCWlmICgkcGF0aEV4aXN0cyAtZXEgJGZhbHNlKQ0KCQkJCQkJew0KCQkJCQkJCU5ldy1JdGVtICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Db25maXJtOiRpc0NvbmZpcm0gfCBPdXQtTnVsbA0KDQoJCQkJCQkJaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoIC1QYXRoVHlwZSBDb250YWluZXIpDQoJCQkJCQkJew0KCQkJCQkJCQkkYWRkRW1wdHlEaXJlY3Rvcnl0b0V4cGFuZGVkUGF0aE1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoKQ0KCQkJCQkJCQlXcml0ZS1WZXJib3NlICRhZGRFbXB0eURpcmVjdG9yeXRvRXhwYW5kZWRQYXRoTWVzc2FnZQ0KDQoJCQkJCQkJCSRleHBhbmRlZEl0ZW1zLlZhbHVlICs9ICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aA0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCXRyeQ0KCQkJCQkJew0KCQkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uRmlsZUluZm8gLUFyZ3VtZW50TGlzdCAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCgkJCQkJCQkkcGFyZW50RGlyRXhpc3RzID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUgLVBhdGhUeXBlIENvbnRhaW5lcg0KDQoJCQkJCQkJIyBJZiB0aGUgUGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuIGNyZWF0ZSBpdC4NCgkJCQkJCQlpZiAoJHBhcmVudERpckV4aXN0cyAtZXEgJGZhbHNlKQ0KCQkJCQkJCXsNCgkJCQkJCQkJTmV3LUl0ZW0gJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUNvbmZpcm06JGlzQ29uZmlybSB8IE91dC1OdWxsDQoNCgkJCQkJCQkJaWYgKCEoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUgLVBhdGhUeXBlIENvbnRhaW5lcikpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSMgVGhlIGRpcmVjdG9yeSByZWZlcnJlZCBieSAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUgd2FzIG5vdCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4NCgkJCQkJCQkJCSMgVGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgLUNvbmZpcm0gcGFyYW10ZXIgd2hlbiBFeHBhbmQtQXJjaGl2ZSB3YXMgaW52b2tlZA0KCQkJCQkJCQkJIyBhbmQgYXV0aG9yaXphdGlvbiB3YXMgbm90IHByb3ZpZGVkIHdoZW4gY29uZmlybWF0aW9uIHdhcyBwcm9tcHRlZC4gSW4gc3VjaCBhIHNjZW5hcmlvLA0KCQkJCQkJCQkJIyB3ZSBza2lwIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGFyY2hpdmUgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlbWFpbmluZyBhcmNoaXZlIGZpbGUgY29udGVudHMuDQoJCQkJCQkJCQlDb250aW51ZQ0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJJGV4cGFuZGVkSXRlbXMuVmFsdWUgKz0gJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lDQoJCQkJCQkJfQ0KDQoJCQkJCQkJJGhhc05vblRlcm1pbmF0aW5nRXJyb3IgPSAkZmFsc2UNCg0KCQkJCQkJCSMgQ2hlY2sgaWYgdGhlIGZpbGUgaW4gdG8gd2hpY2ggdGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBjb250ZW50cw0KCQkJCQkJCSMgd291bGQgYmUgZXhwYW5kZWQgYWxyZWFkeSBleGlzdHMuDQoJCQkJCQkJaWYgKCRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRXhpc3RzKQ0KCQkJCQkJCXsNCgkJCQkJCQkJaWYgKCRmb3JjZSkNCgkJCQkJCQkJew0KCQkJCQkJCQkJUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUgLUZvcmNlIC1FcnJvclZhcmlhYmxlIGV2IC1WZXJib3NlOiRpc1ZlcmJvc2UgLUNvbmZpcm06JGlzQ29uZmlybQ0KCQkJCQkJCQkJaWYgKCRldiAtbmUgJG51bGwpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJJGhhc05vblRlcm1pbmF0aW5nRXJyb3IgPSAkdHJ1ZQ0KCQkJCQkJCQkJfQ0KDQoJCQkJCQkJCQlpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lIC1QYXRoVHlwZSBMZWFmKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCSMgVGhlIGZpbGUgcmVmZXJyZWQgYnkgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSB3YXMgbm90IHN1Y2Nlc3NmdWxseSByZW1vdmVkLg0KCQkJCQkJCQkJCSMgVGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgLUNvbmZpcm0gcGFyYW10ZXIgd2hlbiBFeHBhbmQtQXJjaGl2ZSB3YXMgaW52b2tlZA0KCQkJCQkJCQkJCSMgYW5kIGF1dGhvcml6YXRpb24gd2FzIG5vdCBwcm92aWRlZCB3aGVuIGNvbmZpcm1hdGlvbiB3YXMgcHJvbXB0ZWQuIEluIHN1Y2ggYSBzY2VuYXJpbywNCgkJCQkJCQkJCQkjIHdlIHNraXAgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgYXJjaGl2ZSBhbmQgY29udGludWUgd2l0aCB0aGUgcmVtYWluaW5nIGFyY2hpdmUgZmlsZSBjb250ZW50cy4NCgkJCQkJCQkJCQlDb250aW51ZQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWVsc2UNCgkJCQkJCQkJew0KCQkJCQkJCQkJIyBXcml0ZSBub24tdGVybWluYXRpbmcgZXJyb3IgdG8gdGhlIHBpcGVsaW5lLg0KCQkJCQkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5GaWxlRXhpc3RzRXJyb3IgLWYgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSwgJGFyY2hpdmVGaWxlLCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lLCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lKQ0KCQkJCQkJCQkJJGVycm9yUmVjb3JkID0gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXIgIkV4cGFuZEFyY2hpdmVGaWxlRXhpc3RzIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZE9wZXJhdGlvbikgJG51bGwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZQ0KCQkJCQkJCQkJV3JpdGUtRXJyb3IgLUVycm9yUmVjb3JkICRlcnJvclJlY29yZA0KCQkJCQkJCQkJJGhhc05vblRlcm1pbmF0aW5nRXJyb3IgPSAkdHJ1ZQ0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKCEkaGFzTm9uVGVybWluYXRpbmdFcnJvcikNCgkJCQkJCQl7DQoJCQkJCQkJCVtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwRmlsZUV4dGVuc2lvbnNdOjpFeHRyYWN0VG9GaWxlKCRjdXJyZW50QXJjaGl2ZUVudHJ5LCAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgsICRmYWxzZSkNCg0KCQkJCQkJCQkjIEFkZCB0aGUgZXhwYW5kZWQgZmlsZSBwYXRoIHRvIHRoZSAkZXhwYW5kZWRJdGVtcyBhcnJheSwNCgkJCQkJCQkJIyB0byBrZWVwIHRyYWNrIG9mIGFsbCB0aGUgZXhwYW5kZWQgZmlsZXMgY3JlYXRlZCB3aGlsZSBleHBhbmRpbmcgdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJCQkJIyBJZiB1c2VyIGVudGVycyBDVFJMICsgQyB0aGVuIGF0IHRoYXQgcG9pbnQgb2YgdGltZSwgYWxsIHRoZXNlIGV4cGFuZGVkIGZpbGVzDQoJCQkJCQkJCSMgd291bGQgYmUgZGVsZXRlZCBhcyBwYXJ0IG9mIHRoZSBjbGVhbiB1cCBwcm9jZXNzLg0KCQkJCQkJCQkkZXhwYW5kZWRJdGVtcy5WYWx1ZSArPSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCg0KCQkJCQkJCQkkYWRkRmlsZXRvRXhwYW5kZWRQYXRoTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5DcmVhdGVGaWxlQXRFeHBhbmRlZFBhdGggLWYgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoKQ0KCQkJCQkJCQlXcml0ZS1WZXJib3NlICRhZGRGaWxldG9FeHBhbmRlZFBhdGhNZXNzYWdlDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJZmluYWxseQ0KCQkJCQkJew0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJGRlc3RTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkZGVzdFN0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoNCgkJCQkJCQlJZiAoJG51bGwgLW5lICRzcmNTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkc3JjU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCSRjdXJyZW50RW50cnlDb3VudCArPSAxDQoJCQkJCSMgJGN1cnJlbnRTZWdtZW50V2VpZ2h0IGlzIFNldCB0byAxMDAgZ2l2aW5nIGVxdWFsIHdlaWdodGFnZSB0byBlYWNoIGZpbGUgdGhhdCBpcyBnZXR0aW5nIGV4cGFuZGVkLg0KCQkJCQkjICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgaXMgc2V0IHRvIDAgYXMgdGhlcmUgYXJlIG5vIHByaW9yIHNlZ21lbnRzLg0KCQkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KCQkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDANCgkJCQkJUHJvZ3Jlc3NCYXJIZWxwZXIgIkV4cGFuZC1BcmNoaXZlIiAkcHJvZ3Jlc3NCYXJTdGF0dXMgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQgJHppcEFyY2hpdmUuRW50cmllcy5Db3VudCAgJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkJfQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCUlmICgkbnVsbCAtbmUgJHppcEFyY2hpdmUpDQoJCQkJew0KCQkJCQkkemlwQXJjaGl2ZS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQlJZiAoJG51bGwgLW5lICRhcmNoaXZlRmlsZVN0cmVhbSkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZVN0cmVhbS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQkjIENvbXBsZXRlIHdyaXRpbmcgcHJvZ3Jlc3MuDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICJFeHBhbmQtQXJjaGl2ZSIgLUNvbXBsZXRlZA0KCQkJfQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBQcm9ncmVzc0JhckhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgbWVzc2FnZS4NCiMgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGJvdGggQ29tcHJlc3MtQXJjaGl2ZSAmIEV4cGFuZC1BcmNoaXZlIHRvIGRpc3BsYXkgYXJjaGl2ZSBmaWxlDQojIGNyZWF0aW9uL2V4cGFuc2lvbiBwcm9ncmVzcy4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBQcm9ncmVzc0JhckhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGNtZGxldE5hbWUsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRzdGF0dXMsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCwNCg0KCQkJCVtpbnRdDQoJCQkJJHRvdGFsTnVtYmVyb2ZFbnRyaWVzLA0KDQoJCQkJW2ludF0NCgkJCQkkY3VycmVudEVudHJ5Q291bnQNCgkJCSkNCg0KCQkJaWYgKCRjdXJyZW50RW50cnlDb3VudCAtZ3QgMCAtYW5kDQoJCQkJJHRvdGFsTnVtYmVyb2ZFbnRyaWVzIC1ndCAwIC1hbmQNCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0IC1nZSAwIC1hbmQNCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgLWd0IDApDQoJCQl7DQoJCQkJJGVudHJ5RGVmYXVsdFdlaWdodCA9ICRjdXJyZW50U2VnbWVudFdlaWdodC9bZG91YmxlXSR0b3RhbE51bWJlcm9mRW50cmllcw0KDQoJCQkJJHBlcmNlbnRDb21wbGV0ZSA9ICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgKyAoJGVudHJ5RGVmYXVsdFdlaWdodCAqICRjdXJyZW50RW50cnlDb3VudCkNCgkJCQlXcml0ZS1Qcm9ncmVzcyAtQWN0aXZpdHkgJGNtZGxldE5hbWUgLVN0YXR1cyAkc3RhdHVzIC1QZXJjZW50Q29tcGxldGUgJHBlcmNlbnRDb21wbGV0ZQ0KCQkJfQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBDU1ZIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBhcHBlbmQgY29tbWEgYWZ0ZXIgZWFjaCBwYXRoIHNwZWNpZmlkIGJ5DQojIHRoZSBTb3VyY2VQYXRoIGFycmF5LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc3BsYXkgYWxsIHRoZSB1c2VyIHN1cHBsaWVkIHBhdGhzDQojIGluIHRoZSBXaGF0SWYgbWVzc2FnZS4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBDU1ZIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHNvdXJjZVBhdGgNCgkJCSkNCg0KCQkJIyBTb3VyY2VQYXRoIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGJ5IHRoZSBjYWxsaW5nIGZ1bmNhdGlvbi4NCgkJCWlmICgkc291cmNlUGF0aC5Db3VudCAtZ3QgMSkNCgkJCXsNCgkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ID0gImBuIg0KCQkJCWZvciAoJGN1cnJlbnRJbmRleCA9IDA7ICRjdXJyZW50SW5kZXggLWx0ICRzb3VyY2VQYXRoLkNvdW50OyAkY3VycmVudEluZGV4KyspDQoJCQkJew0KCQkJCQlpZiAoJGN1cnJlbnRJbmRleCAtZXEgJHNvdXJjZVBhdGguQ291bnQgLSAxKQ0KCQkJCQl7DQoJCQkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ICs9ICRzb3VyY2VQYXRoWyRjdXJyZW50SW5kZXhdDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ICs9ICRzb3VyY2VQYXRoWyRjdXJyZW50SW5kZXhdICsgImBuIg0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgPSAkc291cmNlUGF0aA0KCQkJfQ0KDQoJCQlyZXR1cm4gJHNvdXJjZVBhdGhJbkNzdkZvcm1hdA0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byB0aHJvdyB0ZXJtaW5hdGluZyBlcnJvci4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRlcnJvcklkLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JNZXNzYWdlLA0KDQoJCQkJW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV0NCgkJCQkkZXJyb3JDYXRlZ29yeSwNCg0KCQkJCVtvYmplY3RdDQoJCQkJJHRhcmdldE9iamVjdCwNCg0KCQkJCVtFeGNlcHRpb25dDQoJCQkJJGlubmVyRXhjZXB0aW9uDQoJCQkpDQoNCgkJCWlmICgkaW5uZXJFeGNlcHRpb24gLWVxICRudWxsKQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctb2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlDQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UsICRpbm5lckV4Y2VwdGlvbg0KCQkJfQ0KDQoJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZQ0KCQkJJGVycm9yUmVjb3JkID0gTmV3LU9iamVjdCBTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yUmVjb3JkICRleGNlcHRpb24sICRlcnJvcklkLCAkZXJyb3JDYXRlZ29yeSwgJHRhcmdldE9iamVjdA0KCQkJJFBTQ21kbGV0LlRocm93VGVybWluYXRpbmdFcnJvcigkZXJyb3JSZWNvcmQpDQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIENyZWF0ZUVycm9yUmVjb3JkSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGFuIEVycm9yUmVjb3JkDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRlcnJvcklkLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JNZXNzYWdlLA0KDQoJCQkJW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV0NCgkJCQkkZXJyb3JDYXRlZ29yeSwNCg0KCQkJCVtFeGNlcHRpb25dDQoJCQkJJGV4Y2VwdGlvbiwNCg0KCQkJCVtvYmplY3RdDQoJCQkJJHRhcmdldE9iamVjdA0KCQkJKQ0KDQoJCQlpZiAoJG51bGwgLWVxICRleGNlcHRpb24pDQoJCQl7DQoJCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UNCgkJCX0NCg0KCQkJJGVycm9yUmVjb3JkID0gTmV3LU9iamVjdCBTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yUmVjb3JkICRleGNlcHRpb24sICRlcnJvcklkLCAkZXJyb3JDYXRlZ29yeSwgJHRhcmdldE9iamVjdA0KCQkJcmV0dXJuICRlcnJvclJlY29yZA0KCQl9DQoJCSNlbmRyZWdpb24gVXRpbGl0eSBGdW5jdGlvbnMNCg0KCQkkaW5wdXRQYXRocyA9IEAoKQ0KCQkkZGVzdGluYXRpb25QYXJlbnREaXIgPSBbc3lzdGVtLklPLlBhdGhdOjpHZXREaXJlY3RvcnlOYW1lKCREZXN0aW5hdGlvblBhdGgpDQoJCWlmICgkbnVsbCAtZXEgJGRlc3RpbmF0aW9uUGFyZW50RGlyKQ0KCQl7DQoJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWREZXN0aW5hdGlvblBhdGggLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZEFyY2hpdmVGaWxlUGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJERlc3RpbmF0aW9uUGF0aA0KCQl9DQoNCgkJaWYgKCRkZXN0aW5hdGlvblBhcmVudERpciAtZXEgW3N0cmluZ106OkVtcHR5KQ0KCQl7DQoJCQkkZGVzdGluYXRpb25QYXJlbnREaXIgPSAnLicNCgkJfQ0KDQoJCSRhY2hpdmVGaWxlTmFtZSA9IFtzeXN0ZW0uSU8uUGF0aF06OkdldEZpbGVOYW1lKCREZXN0aW5hdGlvblBhdGgpDQoJCSRkZXN0aW5hdGlvblBhcmVudERpciA9IEdldFJlc29sdmVkUGF0aEhlbHBlciAkZGVzdGluYXRpb25QYXJlbnREaXIgJGZhbHNlICRQU0NtZGxldA0KDQoJCWlmICgkZGVzdGluYXRpb25QYXJlbnREaXIuQ291bnQgLWd0IDEpDQoJCXsNCgkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZEFyY2hpdmVGaWxlUGF0aEVycm9yIC1mICREZXN0aW5hdGlvblBhdGgsICJEZXN0aW5hdGlvblBhdGgiLCAiRGVzdGluYXRpb25QYXRoIikNCgkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZEFyY2hpdmVGaWxlUGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJERlc3RpbmF0aW9uUGF0aA0KCQl9DQoNCgkJSXNWYWxpZEZpbGVTeXN0ZW1QYXRoICRkZXN0aW5hdGlvblBhcmVudERpciB8IE91dC1OdWxsDQoJCSREZXN0aW5hdGlvblBhdGggPSBKb2luLVBhdGggLVBhdGggJGRlc3RpbmF0aW9uUGFyZW50RGlyIC1DaGlsZFBhdGggJGFjaGl2ZUZpbGVOYW1lDQoNCgkJIyBHZXRFeHRlbnNpb24gQVBJIGRvZXMgbm90IHZhbGlkYXRlIGZvciB0aGUgYWN0dWFsIGV4aXN0YW5jZSBvZiB0aGUgcGF0aC4NCgkJJGV4dGVuc2lvbiA9IFtzeXN0ZW0uSU8uUGF0aF06OkdldEV4dGVuc2lvbigkRGVzdGluYXRpb25QYXRoKQ0KDQoJCSMgSWYgdXNlciBkb2VzIG5vdCBzcGVjaWZ5IC5aaXAgZXh0ZW5zaW9uLCB3ZSBhcHBlbmQgaXQuDQoJCUlmICgkZXh0ZW5zaW9uIC1lcSBbc3RyaW5nXTo6RW1wdHkpDQoJCXsNCgkJCSREZXN0aW5hdGlvblBhdGhXaXRoT3V0RXh0ZW5zaW9uID0gJERlc3RpbmF0aW9uUGF0aA0KCQkJJERlc3RpbmF0aW9uUGF0aCA9ICREZXN0aW5hdGlvblBhdGhXaXRoT3V0RXh0ZW5zaW9uICsgJHppcEZpbGVFeHRlbnNpb24NCgkJCSRhcHBlbmRBcmNoaXZlRmlsZUV4dGVuc2lvbk1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQXBwZW5kQXJjaGl2ZUZpbGVFeHRlbnNpb25NZXNzYWdlIC1mICREZXN0aW5hdGlvblBhdGhXaXRoT3V0RXh0ZW5zaW9uLCAkRGVzdGluYXRpb25QYXRoKQ0KCQkJV3JpdGUtVmVyYm9zZSAkYXBwZW5kQXJjaGl2ZUZpbGVFeHRlbnNpb25NZXNzYWdlDQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkjIEludmFsaWQgZmlsZSBleHRlbnNpb24gaXMgc3BlY2lmaWVkIGZvciB0aGUgemlwIGZpbGUgdG8gYmUgY3JlYXRlZC4NCgkJCWlmICgkZXh0ZW5zaW9uIC1uZSAkemlwRmlsZUV4dGVuc2lvbikNCgkJCXsNCgkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWRaaXBGaWxlRXh0ZW5zaW9uRXJyb3IgLWYgJGV4dGVuc2lvbiwgJHppcEZpbGVFeHRlbnNpb24pDQoJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJOb3RTdXBwb3J0ZWRBcmNoaXZlRmlsZUV4dGVuc2lvbiIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGV4dGVuc2lvbg0KCQkJfQ0KCQl9DQoNCgkJJGFyY2hpdmVGaWxlRXhpc3QgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICREZXN0aW5hdGlvblBhdGggLVBhdGhUeXBlIExlYWYNCg0KCQlpZiAoJGFyY2hpdmVGaWxlRXhpc3QgLWFuZCAoJFVwZGF0ZSAtZXEgJGZhbHNlIC1hbmQgJEZvcmNlIC1lcSAkZmFsc2UpKQ0KCQl7DQoJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlppcEZpbGVFeGlzdEVycm9yIC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkFyY2hpdmVGaWxlRXhpc3RzIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkRGVzdGluYXRpb25QYXRoDQoJCX0NCg0KCQkjIElmIGFyY2hpdmUgZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaWYgLVVwZGF0ZSBpcyBzcGVjaWZpZWQsIHRoZW4gd2UgY2hlY2sgdG8gc2VlDQoJCSMgaWYgd2UgaGF2ZSB3cml0ZSBhY2Nlc3MgcGVybWlzc2lvbiB0byB1cGRhdGUgdGhlIGV4aXN0aW5nIGFyY2hpdmUgZmlsZS4NCgkJaWYgKCRhcmNoaXZlRmlsZUV4aXN0IC1hbmQgJFVwZGF0ZSAtZXEgJHRydWUpDQoJCXsNCgkJCSRpdGVtID0gR2V0LUl0ZW0gLVBhdGggJERlc3RpbmF0aW9uUGF0aA0KCQkJaWYgKCRpdGVtLkF0dHJpYnV0ZXMuVG9TdHJpbmcoKS5Db250YWlucygiUmVhZE9ubHkiKSkNCgkJCXsNCgkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFyY2hpdmVGaWxlSXNSZWFkT25seSAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiQXJjaGl2ZUZpbGVJc1JlYWRPbmx5IiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZE9wZXJhdGlvbikgJERlc3RpbmF0aW9uUGF0aA0KCQkJfQ0KCQl9DQoNCgkJJGlzV2hhdElmID0gJHBzYm91bmRwYXJhbWV0ZXJzLkNvbnRhaW5zS2V5KCJXaGF0SWYiKQ0KCQlpZiAoISRpc1doYXRJZikNCgkJew0KCQkJJHByZXBhcmluZ1RvQ29tcHJlc3NWZXJib3NlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QcmVwYXJpbmdUb0NvbXByZXNzVmVyYm9zZU1lc3NhZ2UpDQoJCQlXcml0ZS1WZXJib3NlICRwcmVwYXJpbmdUb0NvbXByZXNzVmVyYm9zZU1lc3NhZ2UNCg0KCQkJJHByb2dyZXNzQmFyU3RhdHVzID0gKCRMb2NhbGl6ZWREYXRhLkNvbXByZXNzUHJvZ3Jlc3NCYXJUZXh0IC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQlQcm9ncmVzc0JhckhlbHBlciAiQ29tcHJlc3MtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzIDAgMTAwIDEwMCAxDQoJCX0NCgl9DQoJUFJPQ0VTUw0KCXsNCgkJaWYgKCRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiUGF0aCIgLW9yDQoJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIlBhdGhXaXRoRm9yY2UiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJQYXRoV2l0aFVwZGF0ZSIpDQoJCXsNCgkJCSRpbnB1dFBhdGhzICs9ICRQYXRoDQoJCX0NCg0KCQlpZiAoJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aCIgLW9yDQoJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoV2l0aEZvcmNlIiAtb3INCgkJCSRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGhXaXRoVXBkYXRlIikNCgkJew0KCQkJJGlucHV0UGF0aHMgKz0gJExpdGVyYWxQYXRoDQoJCX0NCgl9DQoJRU5EDQoJew0KCQkjIElmIGFyY2hpdmUgZmlsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaWYgLUZvcmNlIGlzIHNwZWNpZmllZCwgd2UgZGVsZXRlIHRoZQ0KCQkjIGV4aXN0aW5nIGFydGNoaXZlIGZpbGUgYW5kIGNyZWF0ZSBhIGJyYW5kIG5ldyBvbmUuDQoJCWlmICgoJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJQYXRoV2l0aEZvcmNlIiAtb3INCgkJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoV2l0aEZvcmNlIikgLWFuZCAkYXJjaGl2ZUZpbGVFeGlzdCkNCgkJew0KCQkJUmVtb3ZlLUl0ZW0gLVBhdGggJERlc3RpbmF0aW9uUGF0aCAtRm9yY2UgLUVycm9yQWN0aW9uIFN0b3ANCgkJfQ0KDQoJCSMgVmFsaWRhdGUgU291cmNlIFBhdGggZGVwZWRpbmcgb24gcGFyYW1ldGVyIHNldCBiZWluZyB1c2VkLg0KCQkjIFRoZSBzcGVjaWZpZWQgc291cmNlIHBhdGggY29uYXRpbnMgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgdGhhdCBuZWVkcw0KCQkjIHRvIGJlIGNvbXByZXNzZWQuDQoJCSRpc0xpdGVyYWxQYXRoVXNlZCA9ICRmYWxzZQ0KCQlpZiAoJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aCIgLW9yDQoJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoV2l0aEZvcmNlIiAtb3INCgkJCSRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGhXaXRoVXBkYXRlIikNCgkJew0KCQkJJGlzTGl0ZXJhbFBhdGhVc2VkID0gJHRydWUNCgkJfQ0KDQoJCVZhbGlkYXRlRHVwbGljYXRlRmlsZVN5c3RlbVBhdGggJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgJGlucHV0UGF0aHMNCgkJJHJlc29sdmVkUGF0aHMgPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJGlucHV0UGF0aHMgJGlzTGl0ZXJhbFBhdGhVc2VkICRQU0NtZGxldA0KCQlJc1ZhbGlkRmlsZVN5c3RlbVBhdGggJHJlc29sdmVkUGF0aHMgfCBPdXQtTnVsbA0KDQoJCSRzb3VyY2VQYXRoID0gJHJlc29sdmVkUGF0aHM7DQoNCgkJIyBDU1ZIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBhcHBlbmQgY29tbWEgYWZ0ZXIgZWFjaCBwYXRoIHNwZWNpZmlkIGJ5DQoJCSMgdGhlICRzb3VyY2VQYXRoIGFycmF5LiBUaGUgY29tbWEgc2FwZXJhdGVkIHBhdGhzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIC1XaGF0SWYgbWVzc2FnZS4NCgkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCA9IENTVkhlbHBlciAkc291cmNlUGF0aA0KCQlpZiAoJHBzY21kbGV0LlNob3VsZFByb2Nlc3MoJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCkpDQoJCXsNCgkJCXRyeQ0KCQkJew0KCQkJCSMgU3RvcFByb2Nlc3NpbmcgaXMgbm90IGF2YWxpYWJsZSBpbiBTY3JpcHQgY21kbGV0cy4gSG93ZXZlciB0aGUgcGlwbGVsaW5lIGV4ZWN1dGlvbg0KCQkJCSMgaXMgdGVybWluYXRlZCB3aGVuIGV2ZXIgJ0NUUkwgKyBDJyBpcyBlbnRlcmVkIGJ5IHVzZXIgdG8gdGVybWluYXRlIHRoZSBjbWRsZXQgZXhlY3V0aW9uLg0KCQkJCSMgVGhlIGZpbmFsbHkgYmxvY2sgaXMgZXhlY3V0ZWQgd2hlbmV2ZXIgcGlwbGVsaW5lIGlzIHRlcm1pbmF0ZWQuDQoJCQkJIyAkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSB2YXJpYWJsZSBpcyB1c2VkIHRvIHRyYWNrIGlmICdDVFJMICsgQycgaXMgZW50ZXJlZCBieSB0aGUNCgkJCQkjIHVzZXIuDQoJCQkJJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgPSAkZmFsc2UNCg0KCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBDb21wcmVzc0FyY2hpdmVIZWxwZXIgJHNvdXJjZVBhdGggJERlc3RpbmF0aW9uUGF0aCAkQ29tcHJlc3Npb25MZXZlbCAkVXBkYXRlDQoNCgkJCQkkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSA9ICR0cnVlDQoJCQl9DQoJCQlmaW5hbGx5DQoJCQl7DQoJCQkJIyBUaGUgJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgd291bGQgYmUgc2V0IHRvICRmYWxzZSBpZiB1c2VyIGhhcyB0eXBlZCAnQ1RSTCArIEMnIHRvDQoJCQkJIyB0ZXJtaW5hdGUgdGhlIGNtZGxldCBleGVjdXRpb24gb3IgaWYgYW4gdW5oYW5kbGVkIGV4Y2VwdGlvbiBpcyB0aHJvd24uDQoJCQkJIyAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkIGNvbnRhaW5zIHRoZSBjb3VudCBvZiBudW1iZXIgb2YgZmlsZXMgb3IgZGlyZWN0b3JpZXMgYWRkIHRvIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJIyBJZiB0aGUgbmV3bHkgY3JlYXRlZCBhcmNoaXZlIGZpbGUgaXMgZW1wdHkgdGhlbiB3ZSBkZWxldGUgaXQgYXMgaXRzIG5vdCB1c2FibGUuDQoJCQkJaWYgKCgkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSAtZXEgJGZhbHNlKSAtb3INCgkJCQkJKCRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgLWVxIDApKQ0KCQkJCXsNCgkJCQkJJERlbGV0ZUFyY2hpdmVGaWxlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5EZWxldGVBcmNoaXZlRmlsZSAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJCQlXcml0ZS1WZXJib3NlICREZWxldGVBcmNoaXZlRmlsZU1lc3NhZ2UNCg0KCQkJCQkjIGRlbGV0ZSB0aGUgcGFydGlhbCBhcmNoaXZlIGZpbGUgY3JlYXRlZC4NCgkJCQkJaWYgKFRlc3QtUGF0aCAkRGVzdGluYXRpb25QYXRoKQ0KCQkJCQl7DQoJCQkJCQlSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJERlc3RpbmF0aW9uUGF0aCAtRm9yY2UgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIFNpbGVudGx5Q29udGludWUNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0NCg0KZnVuY3Rpb24gRXhwYW5kLUFyY2hpdmUNCnsNCgk8Iw0KCQkuU1lOT1BTSVMNCgkJCUV4dHJhY3RzIGZpbGVzIGZyb20gYSBzcGVjaWZpZWQgYXJjaGl2ZSAoemlwcGVkKSBmaWxlLg0KDQoJCS5ERVNDUklQVElPTg0KCQkJVGhlIEV4cGFuZC1BcmNoaXZlIGNtZGxldCBleHRyYWN0cyBmaWxlcyBmcm9tIGEgc3BlY2lmaWVkIHppcHBlZCBhcmNoaXZlIGZpbGUgdG8gYSBzcGVjaWZpZWQgZGVzdGluYXRpb24gZm9sZGVyLiBBbiBhcmNoaXZlIGZpbGUgYWxsb3dzIG11bHRpcGxlIGZpbGVzIHRvIGJlIHBhY2thZ2VkLCBhbmQgb3B0aW9uYWxseSBjb21wcmVzc2VkLCBpbnRvIGEgc2luZ2xlIHppcHBlZCBmaWxlIGZvciBlYXNpZXIgZGlzdHJpYnV0aW9uIGFuZCBzdG9yYWdlLg0KDQoJCS5QQVJBTUVURVIgUGF0aA0KCQkJU3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBhcmNoaXZlIGZpbGUuDQoNCgkJLlBBUkFNRVRFUiBMaXRlcmFsUGF0aA0KCQkJU3BlY2lmaWVzIHRoZSBwYXRoIHRvIGFuIGFyY2hpdmUgZmlsZS4gVW5saWtlIHRoZSBQYXRoIHBhcmFtZXRlciwgdGhlIHZhbHVlIG9mIExpdGVyYWxQYXRoIGlzIHVzZWQgZXhhY3RseSBhcyBpdCBpcyB0eXBlZC4gV2lsZGNhcmQgY2hhcmFjdGVycyBhcmUgbm90IHN1cHBvcnRlZC4gSWYgdGhlIHBhdGggaW5jbHVkZXMgZXNjYXBlIGNoYXJhY3RlcnMsIGVuY2xvc2UgZWFjaCBlc2NhcGUgY2hhcmFjdGVyIGluIHNpbmdsZSBxdW90YXRpb24gbWFya3MsIHRvIGluc3RydWN0IFdpbmRvd3MgUG93ZXJTaGVsbCBub3QgdG8gaW50ZXJwcmV0IGFueSBjaGFyYWN0ZXJzIGFzIGVzY2FwZSBzZXF1ZW5jZXMuDQoNCgkJLlBBUkFNRVRFUiBEZXN0aW5hdGlvblBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgZm9sZGVyIGluIHdoaWNoIHlvdSB3YW50IHRoZSBjb21tYW5kIHRvIHNhdmUgZXh0cmFjdGVkIGZpbGVzLiBFbnRlciB0aGUgcGF0aCB0byBhIGZvbGRlciwgYnV0IGRvIG5vdCBzcGVjaWZ5IGEgZmlsZSBuYW1lIG9yIGZpbGUgbmFtZSBleHRlbnNpb24uIFRoaXMgcGFyYW1ldGVyIGlzIHJlcXVpcmVkLg0KDQoJCS5QQVJBTUVURVIgRm9yY2UNCgkJCUZvcmNlcyB0aGUgY29tbWFuZCB0byBydW4gd2l0aG91dCBhc2tpbmcgZm9yIHVzZXIgY29uZmlybWF0aW9uLg0KDQoJCS5QQVJBTUVURVIgQ29uZmlybQ0KCQkJUHJvbXB0cyB5b3UgZm9yIGNvbmZpcm1hdGlvbiBiZWZvcmUgcnVubmluZyB0aGUgY21kbGV0Lg0KDQoJCS5QQVJBTUVURVIgV2hhdElmDQoJCQlTaG93cyB3aGF0IHdvdWxkIGhhcHBlbiBpZiB0aGUgY21kbGV0IHJ1bnMuIFRoZSBjbWRsZXQgaXMgbm90IHJ1bi4NCg0KCQkuRVhBTVBMRQ0KCQkJRXhhbXBsZSAxOiBFeHRyYWN0IHRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlDQoNCgkJCVBTIEM6XD5FeHBhbmQtQXJjaGl2ZSAtTGl0ZXJhbFBhdGggQzpcQXJjaGl2ZXNcRHJhZnQuWmlwIC1EZXN0aW5hdGlvblBhdGggQzpcUmVmZXJlbmNlDQoNCgkJCVRoaXMgY29tbWFuZCBleHRyYWN0cyB0aGUgY29udGVudHMgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLCBEcmFmdC56aXAsIGludG8gdGhlIGZvbGRlciBzcGVjaWZpZWQgYnkgdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIsIEM6XFJlZmVyZW5jZS4NCg0KCQkuRVhBTVBMRQ0KCQkJRXhhbXBsZSAyOiBFeHRyYWN0IHRoZSBjb250ZW50cyBvZiBhbiBhcmNoaXZlIGluIHRoZSBjdXJyZW50IGZvbGRlcg0KDQoJCQlQUyBDOlw+RXhwYW5kLUFyY2hpdmUgLVBhdGggRHJhZnQuWmlwIC1EZXN0aW5hdGlvblBhdGggQzpcUmVmZXJlbmNlDQoNCgkJCVRoaXMgY29tbWFuZCBleHRyYWN0cyB0aGUgY29udGVudHMgb2YgYW4gZXhpc3RpbmcgYXJjaGl2ZSBmaWxlIGluIHRoZSBjdXJyZW50IGZvbGRlciwgRHJhZnQuemlwLCBpbnRvIHRoZSBmb2xkZXIgc3BlY2lmaWVkIGJ5IHRoZSBEZXN0aW5hdGlvblBhdGggcGFyYW1ldGVyLCBDOlxSZWZlcmVuY2UuDQoJIz4NCglbQ21kbGV0QmluZGluZygNCgkJCQkgICBEZWZhdWx0UGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoIiwNCgkJCQkgICBTdXBwb3J0c1Nob3VsZFByb2Nlc3MgPSAkdHJ1ZSwNCgkJCQkgICBIZWxwVXJpID0gImh0dHA6Ly9nby5taWNyb3NvZnQuY29tL2Z3bGluay8/TGlua0lEPTM5MzI1MyIpXQ0KCXBhcmFtDQoJKA0KCQlbcGFyYW1ldGVyICgNCgkJCQkJbWFuZGF0b3J5ID0gJHRydWUsDQoJCQkJCVBvc2l0aW9uID0gMCwNCgkJCQkJUGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoIiwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmUgPSAkdHJ1ZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW1ZhbGlkYXRlTm90TnVsbE9yRW1wdHkoKV0NCgkJW3N0cmluZ10NCgkJJFBhdGgsDQoNCgkJW3BhcmFtZXRlciAoDQoJCQkJCW1hbmRhdG9yeSA9ICR0cnVlLA0KCQkJCQlQYXJhbWV0ZXJTZXROYW1lID0gIkxpdGVyYWxQYXRoIiwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICR0cnVlKV0NCgkJW1ZhbGlkYXRlTm90TnVsbE9yRW1wdHkoKV0NCgkJW0FsaWFzKCJQU1BhdGgiKV0NCgkJW3N0cmluZ10NCgkJJExpdGVyYWxQYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICRmYWxzZSwNCgkJCQkJUG9zaXRpb24gPSAxLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtzdHJpbmddDQoJCSREZXN0aW5hdGlvblBhdGgsDQoNCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJGZhbHNlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtzd2l0Y2hdDQoJCSRGb3JjZQ0KCSkNCg0KCUJFR0lODQoJew0KCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbiAtRXJyb3JBY3Rpb24gSWdub3JlDQoJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLkZpbGVTeXN0ZW0gLUVycm9yQWN0aW9uIElnbm9yZQ0KDQoJCSR6aXBGaWxlRXh0ZW5zaW9uID0gIi56aXAiDQoNCgkJJExvY2FsaXplZERhdGEgPSBDb252ZXJ0RnJvbS1TdHJpbmdEYXRhIEAnDQpQYXRoTm90Rm91bmRFcnJvcj1UaGUgcGF0aCAnezB9JyBlaXRoZXIgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgdmFsaWQgZmlsZSBzeXN0ZW0gcGF0aC4NCkV4cGFuZEFyY2hpdmVJblZhbGlkRGVzdGluYXRpb25QYXRoPVRoZSBwYXRoICd7MH0nIGlzIG5vdCBhIHZhbGlkIGZpbGUgc3lzdGVtIGRpcmVjdG9yeSBwYXRoLg0KSW52YWxpZFppcEZpbGVFeHRlbnNpb25FcnJvcj17MH0gaXMgbm90IGEgc3VwcG9ydGVkIGFyY2hpdmUgZmlsZSBmb3JtYXQuIHsxfSBpcyB0aGUgb25seSBzdXBwb3J0ZWQgYXJjaGl2ZSBmaWxlIGZvcm1hdC4NCkFyY2hpdmVGaWxlSXNSZWFkT25seT1UaGUgYXR0cmlidXRlcyBvZiB0aGUgYXJjaGl2ZSBmaWxlIHswfSBpcyBzZXQgdG8gJ1JlYWRPbmx5JyBoZW5jZSBpdCBjYW5ub3QgYmUgdXBkYXRlZC4gSWYgeW91IGludGVuZCB0byB1cGRhdGUgdGhlIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSwgcmVtb3ZlIHRoZSAnUmVhZE9ubHknIGF0dHJpYnV0ZSBvbiB0aGUgYXJjaGl2ZSBmaWxlIGVsc2UgdXNlIC1Gb3JjZSBwYXJhbWV0ZXIgdG8gb3ZlcnJpZGUgYW5kIGNyZWF0ZSBhIG5ldyBhcmNoaXZlIGZpbGUuDQpaaXBGaWxlRXhpc3RFcnJvcj1UaGUgYXJjaGl2ZSBmaWxlIHswfSBhbHJlYWR5IGV4aXN0cy4gVXNlIHRoZSAtVXBkYXRlIHBhcmFtZXRlciB0byB1cGRhdGUgdGhlIGV4aXN0aW5nIGFyY2hpdmUgZmlsZSBvciB1c2UgdGhlIC1Gb3JjZSBwYXJhbWV0ZXIgdG8gb3ZlcndyaXRlIHRoZSBleGlzdGluZyBhcmNoaXZlIGZpbGUuDQpEdXBsaWNhdGVQYXRoRm91bmRFcnJvcj1UaGUgaW5wdXQgdG8gezB9IHBhcmFtZXRlciBjb250YWlucyBhIGR1cGxpY2F0ZSBwYXRoICd7MX0nLiBQcm92aWRlIGEgdW5pcXVlIHNldCBvZiBwYXRocyBhcyBpbnB1dCB0byB7Mn0gcGFyYW1ldGVyLg0KQXJjaGl2ZUZpbGVJc0VtcHR5PVRoZSBhcmNoaXZlIGZpbGUgezB9IGlzIGVtcHR5Lg0KQ29tcHJlc3NQcm9ncmVzc0JhclRleHQ9VGhlIGFyY2hpdmUgZmlsZSAnezB9JyBjcmVhdGlvbiBpcyBpbiBwcm9ncmVzcy4uLg0KRXhwYW5kUHJvZ3Jlc3NCYXJUZXh0PVRoZSBhcmNoaXZlIGZpbGUgJ3swfScgZXhwYW5zaW9uIGlzIGluIHByb2dyZXNzLi4uDQpBcHBlbmRBcmNoaXZlRmlsZUV4dGVuc2lvbk1lc3NhZ2U9VGhlIGFyY2hpdmUgZmlsZSBwYXRoICd7MH0nIHN1cHBsaWVkIHRvIHRoZSBEZXN0aW5hdGlvblBhdGggcGF0YW1ldGVyIGRvZXMgbm90IGluY2x1ZGUgLnppcCBleHRlbnNpb24uIEhlbmNlIC56aXAgaXMgYXBwZW5kZWQgdG8gdGhlIHN1cHBsaWVkIERlc3RpbmF0aW9uUGF0aCBwYXRoIGFuZCB0aGUgYXJjaGl2ZSBmaWxlIHdvdWxkIGJlIGNyZWF0ZWQgYXQgJ3sxfScuDQpBZGRJdGVtdG9BcmNoaXZlRmlsZT1BZGRpbmcgJ3swfScuDQpDcmVhdGVGaWxlQXRFeHBhbmRlZFBhdGg9Q3JlYXRlZCAnezB9Jy4NCkludmFsaWRBcmNoaXZlRmlsZVBhdGhFcnJvcj1UaGUgYXJjaGl2ZSBmaWxlIHBhdGggJ3swfScgc3BlY2lmaWVkIGFzIGlucHV0IHRvIHRoZSB7MX0gcGFyYW1ldGVyIGlzIHJlc29sdmluZyB0byBtdWx0aXBsZSBmaWxlIHN5c3RlbSBwYXRocy4gUHJvdmlkZSBhIHVuaXF1ZSBwYXRoIHRvIHRoZSB7Mn0gcGFyYW1ldGVyIHdoZXJlIHRoZSBhcmNoaXZlIGZpbGUgaGFzIHRvIGJlIGNyZWF0ZWQuDQpJbnZhbGlkRXhwYW5kZWREaXJQYXRoRXJyb3I9VGhlIGRpcmVjdG9yeSBwYXRoICd7MH0nIHNwZWNpZmllZCBhcyBpbnB1dCB0byB0aGUgRGVzdGluYXRpb25QYXRoIHBhcmFtZXRlciBpcyByZXNvbHZpbmcgdG8gbXVsdGlwbGUgZmlsZSBzeXN0ZW0gcGF0aHMuIFByb3ZpZGUgYSB1bmlxdWUgcGF0aCB0byB0aGUgRGVzdGluYXRpb24gcGFyYW1ldGVyIHdoZXJlIHRoZSBhcmNoaXZlIGZpbGUgY29udGVudHMgaGF2ZSB0byBiZSBleHBhbmRlZC4NCkZpbGVFeGlzdHNFcnJvcj1GYWlsZWQgdG8gY3JlYXRlIGZpbGUgJ3swfScgd2hpbGUgZXhwYW5kaW5nIHRoZSBhcmNoaXZlIGZpbGUgJ3sxfScgY29udGVudHMgYXMgdGhlIGZpbGUgJ3syfScgYWxyZWFkeSBleGlzdHMuIFVzZSB0aGUgLUZvcmNlIHBhcmFtZXRlciBpZiB5b3Ugd2FudCB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGRpcmVjdG9yeSAnezN9JyBjb250ZW50cyB3aGVuIGV4cGFuZGluZyB0aGUgYXJjaGl2ZSBmaWxlLg0KRGVsZXRlQXJjaGl2ZUZpbGU9VGhlIHBhcnRpYWxseSBjcmVhdGVkIGFyY2hpdmUgZmlsZSAnezB9JyBpcyBkZWxldGVkIGFzIGl0IGlzIG5vdCB1c2FibGUuDQpJbnZhbGlkRGVzdGluYXRpb25QYXRoPVRoZSBkZXN0aW5hdGlvbiBwYXRoICd7MH0nIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBhcmNoaXZlIGZpbGUgbmFtZS4NClByZXBhcmluZ1RvQ29tcHJlc3NWZXJib3NlTWVzc2FnZT1QcmVwYXJpbmcgdG8gY29tcHJlc3MuLi4NClByZXBhcmluZ1RvRXhwYW5kVmVyYm9zZU1lc3NhZ2U9UHJlcGFyaW5nIHRvIGV4cGFuZC4uLg0KJ0ANCg0KCQkjcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQoJCWZ1bmN0aW9uIEdldFJlc29sdmVkUGF0aEhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkcGF0aCwNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRpc0xpdGVyYWxQYXRoLA0KDQoJCQkJW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uUFNDbWRsZXRdDQoJCQkJJGNhbGxlclBTQ21kbGV0DQoJCQkpDQoNCgkJCSRyZXNvbHZlZFBhdGhzID0gQCgpDQoNCgkJCSMgbnVsbCBhbmQgZW1wdHkgY2hlY2sgYXJlIGFyZSBhbHJlYWR5IGRvbmUgb24gUGF0aCBwYXJhbWV0ZXIgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkcGF0aCkNCgkJCXsNCgkJCQl0cnkNCgkJCQl7DQoJCQkJCWlmICgkaXNMaXRlcmFsUGF0aCkNCgkJCQkJew0KCQkJCQkJJGN1cnJlbnRSZXNvbHZlZFBhdGhzID0gUmVzb2x2ZS1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudFBhdGggLUVycm9yQWN0aW9uIFN0b3ANCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRjdXJyZW50UmVzb2x2ZWRQYXRocyA9IFJlc29sdmUtUGF0aCAtUGF0aCAkY3VycmVudFBhdGggLUVycm9yQWN0aW9uIFN0b3ANCgkJCQkJfQ0KCQkJCX0NCgkJCQljYXRjaA0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QYXRoTm90Rm91bmRFcnJvciAtZiAkY3VycmVudFBhdGgpDQoJCQkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UsICRfLkV4Y2VwdGlvbg0KCQkJCQkkZXJyb3JSZWNvcmQgPSBDcmVhdGVFcnJvclJlY29yZEhlbHBlciAiQXJjaGl2ZUNtZGxldFBhdGhOb3RGb3VuZCIgJG51bGwgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRleGNlcHRpb24gJGN1cnJlbnRQYXRoDQoJCQkJCSRjYWxsZXJQU0NtZGxldC5UaHJvd1Rlcm1pbmF0aW5nRXJyb3IoJGVycm9yUmVjb3JkKQ0KCQkJCX0NCg0KCQkJCWZvcmVhY2ggKCRjdXJyZW50UmVzb2x2ZWRQYXRoIGluICRjdXJyZW50UmVzb2x2ZWRQYXRocykNCgkJCQl7DQoJCQkJCSRyZXNvbHZlZFBhdGhzICs9ICRjdXJyZW50UmVzb2x2ZWRQYXRoLlByb3ZpZGVyUGF0aA0KCQkJCX0NCgkJCX0NCg0KCQkJJHJlc29sdmVkUGF0aHMNCgkJfQ0KDQoJCWZ1bmN0aW9uIEFkZC1Db21wcmVzc2lvbkFzc2VtYmxpZXMNCgkJew0KDQoJCQlpZiAoJFBTRWRpdGlvbiAtZXEgIkRlc2t0b3AiKQ0KCQkJew0KCQkJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uDQoJCQkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uRmlsZVN5c3RlbQ0KCQkJfQ0KCQl9DQoNCgkJZnVuY3Rpb24gSXNWYWxpZEZpbGVTeXN0ZW1QYXRoDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRwYXRoDQoJCQkpDQoNCgkJCSRyZXN1bHQgPSAkdHJ1ZTsNCg0KCQkJIyBudWxsIGFuZCBlbXB0eSBjaGVjayBhcmUgYXJlIGFscmVhZHkgZG9uZSBvbiBQYXRoIHBhcmFtZXRlciBhdCB0aGUgY21kbGV0IGxheWVyLg0KCQkJZm9yZWFjaCAoJGN1cnJlbnRQYXRoIGluICRwYXRoKQ0KCQkJew0KCQkJCWlmICghKFtTeXN0ZW0uSU8uRmlsZV06OkV4aXN0cygkY3VycmVudFBhdGgpIC1vciBbU3lzdGVtLklPLkRpcmVjdG9yeV06OkV4aXN0cygkY3VycmVudFBhdGgpKSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUGF0aE5vdEZvdW5kRXJyb3IgLWYgJGN1cnJlbnRQYXRoKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIlBhdGhOb3RGb3VuZCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGN1cnJlbnRQYXRoDQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gJHJlc3VsdDsNCgkJfQ0KDQoNCgkJZnVuY3Rpb24gVmFsaWRhdGVEdXBsaWNhdGVGaWxlU3lzdGVtUGF0aA0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGlucHV0UGFyYW1ldGVyLA0KDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRwYXRoDQoJCQkpDQoNCgkJCSR1bmlxdWVJbnB1dFBhdGhzID0gQCgpDQoNCgkJCSMgbnVsbCBhbmQgZW1wdHkgY2hlY2sgYXJlIGFyZSBhbHJlYWR5IGRvbmUgb24gUGF0aCBwYXJhbWV0ZXIgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkcGF0aCkNCgkJCXsNCgkJCQkkY3VycmVudElucHV0UGF0aCA9ICRjdXJyZW50UGF0aC5Ub1VwcGVyKCkNCgkJCQlpZiAoJHVuaXF1ZUlucHV0UGF0aHMuQ29udGFpbnMoJGN1cnJlbnRJbnB1dFBhdGgpKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5EdXBsaWNhdGVQYXRoRm91bmRFcnJvciAtZiAkaW5wdXRQYXJhbWV0ZXIsICRjdXJyZW50UGF0aCwgJGlucHV0UGFyYW1ldGVyKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkR1cGxpY2F0ZVBhdGhGb3VuZCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGN1cnJlbnRQYXRoDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSR1bmlxdWVJbnB1dFBhdGhzICs9ICRjdXJyZW50SW5wdXRQYXRoDQoJCQkJfQ0KCQkJfQ0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3Npb25MZXZlbE1hcHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwNCgkJCSkNCg0KCQkJJGNvbXByZXNzaW9uTGV2ZWxGb3JtYXQgPSBbU3lzdGVtLklPLkNvbXByZXNzaW9uLkNvbXByZXNzaW9uTGV2ZWxdOjpPcHRpbWFsDQoNCgkJCSMgQ29tcHJlc3Npb25MZXZlbCBmb3JtYXQgaXMgYWxyZWFkeSB2YWxpZGF0ZWQgYXQgdGhlIGNtZGxldCBsYXllci4NCgkJCXN3aXRjaCAoJGNvbXByZXNzaW9uTGV2ZWwuVG9TdHJpbmcoKSkNCgkJCXsNCgkJCQkiRmFzdGVzdCINCgkJCQl7DQoJCQkJCSRjb21wcmVzc2lvbkxldmVsRm9ybWF0ID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5Db21wcmVzc2lvbkxldmVsXTo6RmFzdGVzdA0KCQkJCX0NCgkJCQkiTm9Db21wcmVzc2lvbiINCgkJCQl7DQoJCQkJCSRjb21wcmVzc2lvbkxldmVsRm9ybWF0ID0gW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5Db21wcmVzc2lvbkxldmVsXTo6Tm9Db21wcmVzc2lvbg0KCQkJCX0NCgkJCX0NCg0KCQkJcmV0dXJuICRjb21wcmVzc2lvbkxldmVsRm9ybWF0DQoJCX0NCg0KCQlmdW5jdGlvbiBDb21wcmVzc0FyY2hpdmVIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHNvdXJjZVBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRkZXN0aW5hdGlvblBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsLA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZQ0KCQkJKQ0KDQoJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gMA0KCQkJJHNvdXJjZUZpbGVQYXRocyA9IEAoKQ0KCQkJJHNvdXJjZURpclBhdGhzID0gQCgpDQoNCgkJCWZvcmVhY2ggKCRjdXJyZW50UGF0aCBpbiAkc291cmNlUGF0aCkNCgkJCXsNCgkJCQkkcmVzdWx0ID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudFBhdGggLVBhdGhUeXBlIExlYWYNCgkJCQlpZiAoJHJlc3VsdCAtZXEgJHRydWUpDQoJCQkJew0KCQkJCQkkc291cmNlRmlsZVBhdGhzICs9ICRjdXJyZW50UGF0aA0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkc291cmNlRGlyUGF0aHMgKz0gJGN1cnJlbnRQYXRoDQoJCQkJfQ0KCQkJfQ0KDQoJCQkjIFRoZSBTb3VyZSBQYXRoIGNvbnRhaW5zIG9uZSBvciBtb3JlIGRpcmVjdG9yeSAodGhpcyBkaXJlY3RvcnkgY2FuIGhhdmUgZmlsZXMgdW5kZXIgaXQpIGFuZCBubyBmaWxlcyB0byBiZSBjb21wcmVzc2VkLg0KCQkJaWYgKCRzb3VyY2VGaWxlUGF0aHMuQ291bnQgLWVxIDAgLWFuZCAkc291cmNlRGlyUGF0aHMuQ291bnQgLWd0IDApDQoJCQl7DQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwL1tkb3VibGVdJHNvdXJjZURpclBhdGhzLkNvdW50DQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCgkJCQlmb3JlYWNoICgkY3VycmVudFNvdXJjZURpclBhdGggaW4gJHNvdXJjZURpclBhdGhzKQ0KCQkJCXsNCgkJCQkJJGNvdW50ID0gQ29tcHJlc3NTaW5nbGVEaXJIZWxwZXIgJGN1cnJlbnRTb3VyY2VEaXJQYXRoICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJHRydWUgJGlzVXBkYXRlTW9kZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9ICRjb3VudA0KCQkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICs9ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCX0NCgkJCX0NCg0KCQkJIyBUaGUgU291cmUgUGF0aCBjb250YWlucyBvbmx5IGZpbGVzIHRvIGJlIGNvbXByZXNzZWQuDQoJCQllbHNlSWYgKCRzb3VyY2VGaWxlUGF0aHMuQ291bnQgLWd0IDAgLWFuZCAkc291cmNlRGlyUGF0aHMuQ291bnQgLWVxIDApDQoJCQl7DQoJCQkJIyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0IGlzIGVxdWFsIHRvIDAgYXMgdGhlcmUgYXJlIG5vIHByaW9yIHNlZ21lbnRzLg0KCQkJCSMgJGN1cnJlbnRTZWdtZW50V2VpZ2h0IGlzIHNldCB0byAxMDAgYXMgYWxsIGZpbGVzIGhhdmUgZXF1YWwgd2VpZ2h0YWdlLg0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwDQoNCgkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gQ29tcHJlc3NGaWxlc0hlbHBlciAkc291cmNlRmlsZVBhdGhzICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJGlzVXBkYXRlTW9kZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJfQ0KCQkJIyBUaGUgU291cmUgUGF0aCBjb250YWlucyBvbmUgb3IgbW9yZSBmaWxlcyBhbmQgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgKHRoaXMgZGlyZWN0b3J5IGNhbiBoYXZlIGZpbGVzIHVuZGVyIGl0KSB0byBiZSBjb21wcmVzc2VkLg0KCQkJZWxzZWlmICgkc291cmNlRmlsZVBhdGhzLkNvdW50IC1ndCAwIC1hbmQgJHNvdXJjZURpclBhdGhzLkNvdW50IC1ndCAwKQ0KCQkJew0KCQkJCSMgZWFjaCBkaXJlY3RvcnkgaXMgY29uc2lkZXJlZCBhcyBhbiBpbmRpdmlkdWFsIHNlZ21lbnRzICYgYWxsIHRoZSBpbmRpdmlkdWFsIGZpbGVzIGFyZSBjbHViZWQgaW4gdG8gYSBzZXBhcmF0ZSBzZ2VtbmV0Lg0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMC9bZG91YmxlXSgkc291cmNlRGlyUGF0aHMuQ291bnQgKyAxKQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoNCgkJCQlmb3JlYWNoICgkY3VycmVudFNvdXJjZURpclBhdGggaW4gJHNvdXJjZURpclBhdGhzKQ0KCQkJCXsNCgkJCQkJJGNvdW50ID0gQ29tcHJlc3NTaW5nbGVEaXJIZWxwZXIgJGN1cnJlbnRTb3VyY2VEaXJQYXRoICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJHRydWUgJGlzVXBkYXRlTW9kZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9ICRjb3VudA0KCQkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICs9ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCX0NCg0KCQkJCSRjb3VudCA9IENvbXByZXNzRmlsZXNIZWxwZXIgJHNvdXJjZUZpbGVQYXRocyAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9ICRjb3VudA0KCQkJfQ0KDQoJCQlyZXR1cm4gJG51bWJlck9mSXRlbXNBcmNoaXZlZA0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3NGaWxlc0hlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkc291cmNlRmlsZVBhdGhzLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJKQ0KDQoJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gWmlwQXJjaGl2ZUhlbHBlciAkc291cmNlRmlsZVBhdGhzICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJGlzVXBkYXRlTW9kZSAkbnVsbCAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KDQoJCQlyZXR1cm4gJG51bWJlck9mSXRlbXNBcmNoaXZlZA0KCQl9DQoNCgkJZnVuY3Rpb24gQ29tcHJlc3NTaW5nbGVEaXJIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRzb3VyY2VEaXJQYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZGVzdGluYXRpb25QYXRoLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbCwNCg0KCQkJCVtib29sXQ0KCQkJCSR1c2VQYXJlbnREaXJBc1Jvb3QsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlLA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2RvdWJsZV0NCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQNCgkJCSkNCg0KCQkJW1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RbU3lzdGVtLlN0cmluZ11dJHN1YkRpckZpbGVzID0gQCgpDQoNCgkJCWlmICgkdXNlUGFyZW50RGlyQXNSb290KQ0KCQkJew0KCQkJCSRzb3VyY2VEaXJJbmZvID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkRpcmVjdG9yeUluZm8gLUFyZ3VtZW50TGlzdCAkc291cmNlRGlyUGF0aA0KCQkJCSRzb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJJbmZvLlBhcmVudC5GdWxsTmFtZQ0KDQoJCQkJIyBJZiB0aGUgZGlyZWN0b3J5IGlzIHByZXNlbnQgYXQgdGhlIGRyaXZlIGxldmVsIHRoZSBEaXJlY3RvcnlJbmZvLlBhcmVudCBpbmNsdWRlICdcJyBleGFtcGxlOiBDOlwNCgkJCQkjIE9uIHRoZSBvdGhlciBoYW5kIGlmIHRoZSBkaXJlY3RvcnkgZXhpc3RzIGF0IGEgZGVwZXIgbGV2ZWwgdGhlbiBEaXJlY3RvcnlJbmZvLlBhcmVudA0KCQkJCSMgaGFzIGp1c3QgdGhlIHBhdGggKHdpdGhvdXQgYW4gZW5kaW5nICdcJykuIGV4YW1wbGUgQzpcc291cmNlDQoJCQkJaWYgKCRzb3VyY2VEaXJGdWxsTmFtZS5MZW5ndGggLWVxIDMpDQoJCQkJew0KCQkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJGdWxsTmFtZQ0KCQkJCX0NCgkJCQllbHNlDQoJCQkJew0KCQkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJGdWxsTmFtZSArICJcIg0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkc291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyUGF0aA0KCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpckZ1bGxOYW1lICsgIlwiDQoJCQl9DQoNCgkJCSRkaXJDb250ZW50cyA9IEdldC1DaGlsZEl0ZW0gLUxpdGVyYWxQYXRoICRzb3VyY2VEaXJQYXRoIC1SZWN1cnNlDQoJCQlmb3JlYWNoICgkY3VycmVudENvbnRlbnQgaW4gJGRpckNvbnRlbnRzKQ0KCQkJew0KCQkJCSRpc0NvbnRhaW5lciA9ICRjdXJyZW50Q29udGVudCAtaXMgW1N5c3RlbS5JTy5EaXJlY3RvcnlJbmZvXQ0KCQkJCWlmICghJGlzQ29udGFpbmVyKQ0KCQkJCXsNCgkJCQkJJHN1YkRpckZpbGVzLkFkZCgkY3VycmVudENvbnRlbnQuRnVsbE5hbWUpDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSMgVGhlIGN1cnJlbnRDb250ZW50IHBvaW50cyB0byBhIGRpcmVjdG9yeS4NCgkJCQkJIyBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBkaXJlY3RvcnkgaXMgYW4gZW1wdHkgZGlyZWN0b3J5LCBpZiBzbyBzdWNoIGENCgkJCQkJIyBkaXJlY3RvcnkgaGFzIHRvIGJlIGV4cGxpY3RseSBhZGRlZCB0byB0aGUgYXJjaGl2ZSBmaWxlLg0KCQkJCQkjIGlmIHRoZXJlIGFyZSBubyBmaWxlcyBpbiB0aGUgZGlyZWN0b3J5IHRoZSBHZXRGaWxlcygpIEFQSSByZXR1cm5zIGFuIGVtcHR5IGFycmF5Lg0KCQkJCQkkZmlsZXMgPSAkY3VycmVudENvbnRlbnQuR2V0RmlsZXMoKQ0KCQkJCQlpZiAoJGZpbGVzLkNvdW50IC1lcSAwKQ0KCQkJCQl7DQoJCQkJCQkkc3ViRGlyRmlsZXMuQWRkKCRjdXJyZW50Q29udGVudC5GdWxsTmFtZSArICJcIikNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCg0KCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IFppcEFyY2hpdmVIZWxwZXIgJHN1YkRpckZpbGVzLlRvQXJyYXkoKSAkZGVzdGluYXRpb25QYXRoICRjb21wcmVzc2lvbkxldmVsICRpc1VwZGF0ZU1vZGUgJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQNCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQoJCWZ1bmN0aW9uIFppcEFyY2hpdmVIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdFtTeXN0ZW0uU3RyaW5nXV0NCgkJCQkkc291cmNlUGF0aHMsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRkZXN0aW5hdGlvblBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsLA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZSwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJKQ0KDQoJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gMA0KCQkJJGZpbGVNb2RlID0gW1N5c3RlbS5JTy5GaWxlTW9kZV06OkNyZWF0ZQ0KCQkJJHJlc3VsdCA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJERlc3RpbmF0aW9uUGF0aCAtUGF0aFR5cGUgTGVhZg0KCQkJaWYgKCRyZXN1bHQgLWVxICR0cnVlKQ0KCQkJew0KCQkJCSRmaWxlTW9kZSA9IFtTeXN0ZW0uSU8uRmlsZU1vZGVdOjpPcGVuDQoJCQl9DQoNCgkJCUFkZC1Db21wcmVzc2lvbkFzc2VtYmxpZXMNCg0KCQkJdHJ5DQoJCQl7DQoJCQkJIyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgdGhlIGFyY2hpdmUgZmlsZSBoYXMgd3JpdGUgYWNjZXNzLg0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbUFyZ3MgPSBAKCRkZXN0aW5hdGlvblBhdGgsICRmaWxlTW9kZSkNCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uRmlsZVN0cmVhbSAtQXJndW1lbnRMaXN0ICRhcmNoaXZlRmlsZVN0cmVhbUFyZ3MNCg0KCQkJCSR6aXBBcmNoaXZlQXJncyA9IEAoJGFyY2hpdmVGaWxlU3RyZWFtLCBbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmVNb2RlXTo6VXBkYXRlLCAkZmFsc2UpDQoJCQkJJHppcEFyY2hpdmUgPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZSAtQXJndW1lbnRMaXN0ICR6aXBBcmNoaXZlQXJncw0KDQoJCQkJJGN1cnJlbnRFbnRyeUNvdW50ID0gMA0KCQkJCSRwcm9ncmVzc0JhclN0YXR1cyA9ICgkTG9jYWxpemVkRGF0YS5Db21wcmVzc1Byb2dyZXNzQmFyVGV4dCAtZiAkZGVzdGluYXRpb25QYXRoKQ0KCQkJCSRidWZmZXJTaXplID0gNGtiDQoJCQkJJGJ1ZmZlciA9IE5ldy1PYmplY3QgQnl0ZVtdICRidWZmZXJTaXplDQoNCgkJCQlmb3JlYWNoICgkY3VycmVudEZpbGVQYXRoIGluICRzb3VyY2VQYXRocykNCgkJCQl7DQoJCQkJCWlmICgkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSAtbmUgJG51bGwgLWFuZCAkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZS5MZW5ndGggLWd0IDApDQoJCQkJCXsNCgkJCQkJCSRpbmRleCA9ICRjdXJyZW50RmlsZVBhdGguSW5kZXhPZigkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSwgW1N5c3RlbS5TdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpDQoJCQkJCQkkY3VycmVudEZpbGVQYXRoU3ViU3RyaW5nID0gJGN1cnJlbnRGaWxlUGF0aC5TdWJzdHJpbmcoJGluZGV4LCAkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZS5MZW5ndGgpDQoJCQkJCQkkcmVsYXRpdmVGaWxlUGF0aCA9ICRjdXJyZW50RmlsZVBhdGguUmVwbGFjZSgkY3VycmVudEZpbGVQYXRoU3ViU3RyaW5nLCAiIikuVHJpbSgpDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkcmVsYXRpdmVGaWxlUGF0aCA9IFtTeXN0ZW0uSU8uUGF0aF06OkdldEZpbGVOYW1lKCRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCX0NCg0KCQkJCQkjIFVwZGF0ZSBtb2RlIGlzIHNlbGVjdGVkLg0KCQkJCQkjIENoZWNrIHRvIHNlZSBpZiBhcmNoaXZlIGZpbGUgYWxyZWFkeSBjb250YWlucyBvbmUgb3IgbW9yZSB6aXAgZmlsZXMgaW4gaXQuDQoJCQkJCWlmICgkaXNVcGRhdGVNb2RlIC1lcSAkdHJ1ZSAtYW5kICR6aXBBcmNoaXZlLkVudHJpZXMuQ291bnQgLWd0IDApDQoJCQkJCXsNCgkJCQkJCSRlbnRyeVRvQmVVcGRhdGVkID0gJG51bGwNCg0KCQkJCQkJIyBDaGVjayBpZiB0aGUgZmlsZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgYXJjaGl2ZSBmaWxlLg0KCQkJCQkJIyBJZiBzbyByZXBsYWNlIGl0IHdpdGggbmV3IGZpbGUgZnJvbSB0aGUgaW5wdXQgc291cmNlLg0KCQkJCQkJIyBJZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB0aGUgYXJjaGl2ZSBmaWxlIHRoZW4gZGVmYXVsdCB0bw0KCQkJCQkJIyBjcmVhdGUgbW9kZSBhbmQgY3JlYXRlIHRoZSBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBmaWxlLg0KDQoJCQkJCQlmb3JlYWNoICgkY3VycmVudEFyY2hpdmVFbnRyeSBpbiAkemlwQXJjaGl2ZS5FbnRyaWVzKQ0KCQkJCQkJew0KCQkJCQkJCWlmICgkY3VycmVudEFyY2hpdmVFbnRyeS5GdWxsTmFtZSAtZXEgJHJlbGF0aXZlRmlsZVBhdGgpDQoJCQkJCQkJew0KCQkJCQkJCQkkZW50cnlUb0JlVXBkYXRlZCA9ICRjdXJyZW50QXJjaGl2ZUVudHJ5DQoJCQkJCQkJCWJyZWFrDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KDQoJCQkJCQlpZiAoJGVudHJ5VG9CZVVwZGF0ZWQgLW5lICRudWxsKQ0KCQkJCQkJew0KCQkJCQkJCSRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJCQkkZW50cnlUb0JlVXBkYXRlZC5EZWxldGUoKQ0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJJGNvbXByZXNzaW9uID0gQ29tcHJlc3Npb25MZXZlbE1hcHBlciAkY29tcHJlc3Npb25MZXZlbA0KDQoJCQkJCSMgSWYgYSBkaXJlY3RvcnkgbmVlZHMgdG8gYmUgYWRkZWQgdG8gYW4gYXJjaGl2ZSBmaWxlLA0KCQkJCQkjIGJ5IGNvbnZlbnRpb24gdGhlIC5OZXQgQVBJJ3MgZXhwZWN0IHRoZSBwYXRoIG9mIHRoZSBkaXJldGNvcnkNCgkJCQkJIyB0byBlbmQgd2l0aCAnXCcgdG8gZGV0ZWN0IHRoZSBwYXRoIGFzIGFuIGRpcmVjdG9yeS4NCgkJCQkJaWYgKCEkcmVsYXRpdmVGaWxlUGF0aC5FbmRzV2l0aCgiXCIsIFtTdHJpbmdDb21wYXJpc29uXTo6T3JkaW5hbElnbm9yZUNhc2UpKQ0KCQkJCQl7DQoJCQkJCQl0cnkNCgkJCQkJCXsNCgkJCQkJCQl0cnkNCgkJCQkJCQl7DQoJCQkJCQkJCSRjdXJyZW50RmlsZVN0cmVhbSA9IFtTeXN0ZW0uSU8uRmlsZV06Ok9wZW4oJGN1cnJlbnRGaWxlUGF0aCwgW1N5c3RlbS5JTy5GaWxlTW9kZV06Ok9wZW4sIFtTeXN0ZW0uSU8uRmlsZUFjY2Vzc106OlJlYWQpDQoJCQkJCQkJfQ0KCQkJCQkJCWNhdGNoDQoJCQkJCQkJew0KCQkJCQkJCQkjIEZhaWxlZCB0byBhY2Nlc3MgdGhlIGZpbGUuIFdyaXRlIGEgbm9uIHRlcm1pbmF0aW5nIGVycm9yIHRvIHRoZSBwaXBlbGluZQ0KCQkJCQkJCQkjIGFuZCBtb3ZlIG9uIHdpdGggdGhlIHJlbWFpbmluZyBmaWxlcy4NCgkJCQkJCQkJJGV4Y2VwdGlvbiA9ICRfLkV4Y2VwdGlvbg0KCQkJCQkJCQlpZiAoJG51bGwgLW5lICRfLkV4Y2VwdGlvbiAtYW5kDQoJCQkJCQkJCQkkbnVsbCAtbmUgJF8uRXhjZXB0aW9uLklubmVyRXhjZXB0aW9uKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkkZXhjZXB0aW9uID0gJF8uRXhjZXB0aW9uLklubmVyRXhjZXB0aW9uDQoJCQkJCQkJCX0NCgkJCQkJCQkJJGVycm9yUmVjb3JkID0gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXIgIkNvbXByZXNzQXJjaGl2ZVVuYXV0aG9yaXplZEFjY2Vzc0Vycm9yIiAkbnVsbCAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OlBlcm1pc3Npb25EZW5pZWQpICRleGNlcHRpb24gJGN1cnJlbnRGaWxlUGF0aA0KCQkJCQkJCQlXcml0ZS1FcnJvciAtRXJyb3JSZWNvcmQgJGVycm9yUmVjb3JkDQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKCRudWxsIC1uZSAkY3VycmVudEZpbGVTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkc3JjU3RyZWFtID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uQmluYXJ5UmVhZGVyICRjdXJyZW50RmlsZVN0cmVhbQ0KDQoJCQkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5ID0gJHppcEFyY2hpdmUuQ3JlYXRlRW50cnkoJHJlbGF0aXZlRmlsZVBhdGgsICRjb21wcmVzc2lvbikNCg0KCQkJCQkJCQkjIFVwZGF0aW5nICB0aGUgRmlsZSBDcmVhdGlvbiB0aW1lIHNvIHRoYXQgdGhlIHNhbWUgdGltZXN0YW1wIHdvdWxkIGJlIHJldGFpbmVkIGFmdGVyIGV4cGFuZGluZyB0aGUgY29tcHJlc3NlZCBmaWxlLg0KCQkJCQkJCQkjIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCBHZXQtQ2hpbGRJdGVtIHdvdWxkIHN1Y2NlZWQuDQoJCQkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5Lkxhc3RXcml0ZVRpbWUgPSAoR2V0LUl0ZW0gLUxpdGVyYWxQYXRoICRjdXJyZW50RmlsZVBhdGgpLkxhc3RXcml0ZVRpbWUNCg0KCQkJCQkJCQkkZGVzdFN0cmVhbSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkJpbmFyeVdyaXRlciAkY3VycmVudEFyY2hpdmVFbnRyeS5PcGVuKCkNCg0KCQkJCQkJCQl3aGlsZSAoJG51bWJlck9mQnl0ZXNSZWFkID0gJHNyY1N0cmVhbS5SZWFkKCRidWZmZXIsIDAsICRidWZmZXJTaXplKSkNCgkJCQkJCQkJew0KCQkJCQkJCQkJJGRlc3RTdHJlYW0uV3JpdGUoJGJ1ZmZlciwgMCwgJG51bWJlck9mQnl0ZXNSZWFkKQ0KCQkJCQkJCQkJJGRlc3RTdHJlYW0uRmx1c2goKQ0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAxDQoJCQkJCQkJCSRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQlmaW5hbGx5DQoJCQkJCQl7DQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkY3VycmVudEZpbGVTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkY3VycmVudEZpbGVTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJHNyY1N0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRzcmNTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJGRlc3RTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkZGVzdFN0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeSA9ICR6aXBBcmNoaXZlLkNyZWF0ZUVudHJ5KCIkcmVsYXRpdmVGaWxlUGF0aCIsICRjb21wcmVzc2lvbikNCgkJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gMQ0KCQkJCQkJJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BZGRJdGVtdG9BcmNoaXZlRmlsZSAtZiAkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQl9DQoNCgkJCQkJaWYgKCRudWxsIC1uZSAkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlKQ0KCQkJCQl7DQoJCQkJCQlXcml0ZS1WZXJib3NlICRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UNCgkJCQkJfQ0KDQoJCQkJCSRjdXJyZW50RW50cnlDb3VudCArPSAxDQoJCQkJCVByb2dyZXNzQmFySGVscGVyICJDb21wcmVzcy1BcmNoaXZlIiAkcHJvZ3Jlc3NCYXJTdGF0dXMgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQgJHNvdXJjZVBhdGhzLkNvdW50ICAkY3VycmVudEVudHJ5Q291bnQNCgkJCQl9DQoJCQl9DQoJCQlmaW5hbGx5DQoJCQl7DQoJCQkJSWYgKCRudWxsIC1uZSAkemlwQXJjaGl2ZSkNCgkJCQl7DQoJCQkJCSR6aXBBcmNoaXZlLkRpc3Bvc2UoKQ0KCQkJCX0NCg0KCQkJCUlmICgkbnVsbCAtbmUgJGFyY2hpdmVGaWxlU3RyZWFtKQ0KCQkJCXsNCgkJCQkJJGFyY2hpdmVGaWxlU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCX0NCg0KCQkJCSMgQ29tcGxldGUgd3JpdGluZyBwcm9ncmVzcy4NCgkJCQlXcml0ZS1Qcm9ncmVzcyAtQWN0aXZpdHkgIkNvbXByZXNzLUFyY2hpdmUiIC1Db21wbGV0ZWQNCgkJCX0NCg0KCQkJcmV0dXJuICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQNCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgVmFsaWRhdGVBcmNoaXZlUGF0aEhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHZhbGlkYXRlIHRoZSBhcmNoaXZlIGZpbGUNCiMgcGF0aCAmIGl0cyBmaWxlIGZvcm1hdC4gVGhlIG9ubHkgc3VwcG9ydGVkIGFyY2hpdmUgZmlsZSBmb3JtYXQgaXMgLnppcA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIFZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRhcmNoaXZlRmlsZQ0KCQkJKQ0KDQoJCQlpZiAoW1N5c3RlbS5JTy5GaWxlXTo6RXhpc3RzKCRhcmNoaXZlRmlsZSkpDQoJCQl7DQoJCQkJJGV4dGVuc2lvbiA9IFtzeXN0ZW0uSU8uUGF0aF06OkdldEV4dGVuc2lvbigkYXJjaGl2ZUZpbGUpDQoNCgkJCQkjIEludmFsaWQgZmlsZSBleHRlbnNpb24gaXMgc3BlY2lmZWQgZm9yIHRoZSB6aXAgZmlsZS4NCgkJCQlpZiAoJGV4dGVuc2lvbiAtbmUgJHppcEZpbGVFeHRlbnNpb24pDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWRaaXBGaWxlRXh0ZW5zaW9uRXJyb3IgLWYgJGV4dGVuc2lvbiwgJHppcEZpbGVFeHRlbnNpb24pDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiTm90U3VwcG9ydGVkQXJjaGl2ZUZpbGVFeHRlbnNpb24iICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRleHRlbnNpb24NCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QYXRoTm90Rm91bmRFcnJvciAtZiAkYXJjaGl2ZUZpbGUpDQoJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJQYXRoTm90Rm91bmQiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRhcmNoaXZlRmlsZQ0KCQkJfQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBFeHBhbmRBcmNoaXZlSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gZXhwYW5kIHRoZSBhcmNoaXZlIGZpbGUgY29udGVudHMNCiMgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gRXhwYW5kQXJjaGl2ZUhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGFyY2hpdmVGaWxlLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZXhwYW5kZWREaXIsDQoNCgkJCQlbcmVmXQ0KCQkJCSRleHBhbmRlZEl0ZW1zLA0KDQoJCQkJW2Jvb2xlYW5dDQoJCQkJJGZvcmNlLA0KDQoJCQkJW2Jvb2xlYW5dDQoJCQkJJGlzVmVyYm9zZSwNCg0KCQkJCVtib29sZWFuXQ0KCQkJCSRpc0NvbmZpcm0NCgkJCSkNCg0KCQkJQWRkLUNvbXByZXNzaW9uQXNzZW1ibGllcw0KDQoJCQl0cnkNCgkJCXsNCgkJCQkjIFRoZSBleGlzdGFuY2Ugb2YgYXJjaGl2ZSBmaWxlIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGJ5IFZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXINCgkJCQkjIGJlZm9yZSBjYWxsaW5nIHRoaXMgaGVscGVyIGZ1bmN0aW9uLg0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbUFyZ3MgPSBAKCRhcmNoaXZlRmlsZSwgW1N5c3RlbS5JTy5GaWxlTW9kZV06Ok9wZW4sIFtTeXN0ZW0uSU8uRmlsZUFjY2Vzc106OlJlYWQpDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkZpbGVTdHJlYW0gLUFyZ3VtZW50TGlzdCAkYXJjaGl2ZUZpbGVTdHJlYW1BcmdzDQoNCgkJCQkkemlwQXJjaGl2ZUFyZ3MgPSBAKCRhcmNoaXZlRmlsZVN0cmVhbSwgW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlTW9kZV06OlJlYWQsICRmYWxzZSkNCgkJCQkkemlwQXJjaGl2ZSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlIC1Bcmd1bWVudExpc3QgJHppcEFyY2hpdmVBcmdzDQoNCgkJCQlpZiAoJHppcEFyY2hpdmUuRW50cmllcy5Db3VudCAtZXEgMCkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZUlzRW1wdHkgPSAoJExvY2FsaXplZERhdGEuQXJjaGl2ZUZpbGVJc0VtcHR5IC1mICRhcmNoaXZlRmlsZSkNCgkJCQkJV3JpdGUtVmVyYm9zZSAkYXJjaGl2ZUZpbGVJc0VtcHR5DQoJCQkJCXJldHVybg0KCQkJCX0NCg0KCQkJCSRjdXJyZW50RW50cnlDb3VudCA9IDANCgkJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuRXhwYW5kUHJvZ3Jlc3NCYXJUZXh0IC1mICRhcmNoaXZlRmlsZSkNCg0KCQkJCSMgVGhlIGFyY2hpdmUgZW50cmllcyBjYW4gZWl0aGVyIGJlIGVtcHR5IGRpcmVjdG9yaWVzIG9yIGZpbGVzLg0KCQkJCWZvcmVhY2ggKCRjdXJyZW50QXJjaGl2ZUVudHJ5IGluICR6aXBBcmNoaXZlLkVudHJpZXMpDQoJCQkJew0KCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeVBhdGggPSBKb2luLVBhdGggLVBhdGggJGV4cGFuZGVkRGlyIC1DaGlsZFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnkuRnVsbE5hbWUNCgkJCQkJJGV4dGVuc2lvbiA9IFtzeXN0ZW0uSU8uUGF0aF06OkdldEV4dGVuc2lvbigkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgpDQoNCgkJCQkJIyBUaGUgY3VycmVudCBhcmNoaXZlIGVudHJ5IGlzIGFuIGVtcHR5IGRpcmVjdG9yeQ0KCQkJCQkjIFRoZSBGdWxsTmFtZSBvZiB0aGUgQXJjaGl2ZSBFbnRyeSByZXByZXNlbnRpbmcgYSBkaXJlY3Rvcnkgd291bGQgZW5kIHdpdGggYSB0cmFpbGluZyAnXCcuDQoJCQkJCWlmICgkZXh0ZW5zaW9uIC1lcSBbc3RyaW5nXTo6RW1wdHkgLWFuZA0KCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoLkVuZHNXaXRoKCJcIiwgW1N0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpDQoJCQkJCXsNCgkJCQkJCSRwYXRoRXhpc3RzID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCg0KCQkJCQkJIyBUaGUgY3VycmVudCBhcmNoaXZlIGVudHJ5IGV4cGVjdHMgYW4gZW1wdHkgZGlyZWN0b3J5Lg0KCQkJCQkJIyBDaGVjayBpZiB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5IGlzIGVtcHR5LiBJZiBpdHMgbm90IGVtcHR5DQoJCQkJCQkjIHRoZW4gaXQgbWVhbnMgdGhhdCB1c2VyIGhhcyBhZGRlZCB0aGlzIGRpcmVjdG9yeSBieSBvdGhlciBtZWFucy4NCgkJCQkJCWlmICgkcGF0aEV4aXN0cyAtZXEgJGZhbHNlKQ0KCQkJCQkJew0KCQkJCQkJCU5ldy1JdGVtICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Db25maXJtOiRpc0NvbmZpcm0gfCBPdXQtTnVsbA0KDQoJCQkJCQkJaWYgKFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoIC1QYXRoVHlwZSBDb250YWluZXIpDQoJCQkJCQkJew0KCQkJCQkJCQkkYWRkRW1wdHlEaXJlY3Rvcnl0b0V4cGFuZGVkUGF0aE1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQWRkSXRlbXRvQXJjaGl2ZUZpbGUgLWYgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoKQ0KCQkJCQkJCQlXcml0ZS1WZXJib3NlICRhZGRFbXB0eURpcmVjdG9yeXRvRXhwYW5kZWRQYXRoTWVzc2FnZQ0KDQoJCQkJCQkJCSRleHBhbmRlZEl0ZW1zLlZhbHVlICs9ICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aA0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCXRyeQ0KCQkJCQkJew0KCQkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uRmlsZUluZm8gLUFyZ3VtZW50TGlzdCAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCgkJCQkJCQkkcGFyZW50RGlyRXhpc3RzID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUgLVBhdGhUeXBlIENvbnRhaW5lcg0KDQoJCQkJCQkJIyBJZiB0aGUgUGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBlbnRyeSBpbiB0aGUgYXJjaGl2ZSBmaWxlIGRvZXMgbm90IGV4aXN0LCB0aGVuIGNyZWF0ZSBpdC4NCgkJCQkJCQlpZiAoJHBhcmVudERpckV4aXN0cyAtZXEgJGZhbHNlKQ0KCQkJCQkJCXsNCgkJCQkJCQkJTmV3LUl0ZW0gJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUNvbmZpcm06JGlzQ29uZmlybSB8IE91dC1OdWxsDQoNCgkJCQkJCQkJaWYgKCEoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUgLVBhdGhUeXBlIENvbnRhaW5lcikpDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSMgVGhlIGRpcmVjdG9yeSByZWZlcnJlZCBieSAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUgd2FzIG5vdCBzdWNjZXNzZnVsbHkgY3JlYXRlZC4NCgkJCQkJCQkJCSMgVGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgLUNvbmZpcm0gcGFyYW10ZXIgd2hlbiBFeHBhbmQtQXJjaGl2ZSB3YXMgaW52b2tlZA0KCQkJCQkJCQkJIyBhbmQgYXV0aG9yaXphdGlvbiB3YXMgbm90IHByb3ZpZGVkIHdoZW4gY29uZmlybWF0aW9uIHdhcyBwcm9tcHRlZC4gSW4gc3VjaCBhIHNjZW5hcmlvLA0KCQkJCQkJCQkJIyB3ZSBza2lwIHRoZSBjdXJyZW50IGZpbGUgaW4gdGhlIGFyY2hpdmUgYW5kIGNvbnRpbnVlIHdpdGggdGhlIHJlbWFpbmluZyBhcmNoaXZlIGZpbGUgY29udGVudHMuDQoJCQkJCQkJCQlDb250aW51ZQ0KCQkJCQkJCQl9DQoNCgkJCQkJCQkJJGV4cGFuZGVkSXRlbXMuVmFsdWUgKz0gJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5EaXJlY3RvcnlOYW1lDQoJCQkJCQkJfQ0KDQoJCQkJCQkJJGhhc05vblRlcm1pbmF0aW5nRXJyb3IgPSAkZmFsc2UNCg0KCQkJCQkJCSMgQ2hlY2sgaWYgdGhlIGZpbGUgaW4gdG8gd2hpY2ggdGhlIGN1cnJlbnQgYXJjaGl2ZSBlbnRyeSBjb250ZW50cw0KCQkJCQkJCSMgd291bGQgYmUgZXhwYW5kZWQgYWxyZWFkeSBleGlzdHMuDQoJCQkJCQkJaWYgKCRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRXhpc3RzKQ0KCQkJCQkJCXsNCgkJCQkJCQkJaWYgKCRmb3JjZSkNCgkJCQkJCQkJew0KCQkJCQkJCQkJUmVtb3ZlLUl0ZW0gLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUgLUZvcmNlIC1FcnJvclZhcmlhYmxlIGV2IC1WZXJib3NlOiRpc1ZlcmJvc2UgLUNvbmZpcm06JGlzQ29uZmlybQ0KCQkJCQkJCQkJaWYgKCRldiAtbmUgJG51bGwpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJJGhhc05vblRlcm1pbmF0aW5nRXJyb3IgPSAkdHJ1ZQ0KCQkJCQkJCQkJfQ0KDQoJCQkJCQkJCQlpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lIC1QYXRoVHlwZSBMZWFmKQ0KCQkJCQkJCQkJew0KCQkJCQkJCQkJCSMgVGhlIGZpbGUgcmVmZXJyZWQgYnkgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSB3YXMgbm90IHN1Y2Nlc3NmdWxseSByZW1vdmVkLg0KCQkJCQkJCQkJCSMgVGhpcyBjb3VsZCBiZSBiZWNhdXNlIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgLUNvbmZpcm0gcGFyYW10ZXIgd2hlbiBFeHBhbmQtQXJjaGl2ZSB3YXMgaW52b2tlZA0KCQkJCQkJCQkJCSMgYW5kIGF1dGhvcml6YXRpb24gd2FzIG5vdCBwcm92aWRlZCB3aGVuIGNvbmZpcm1hdGlvbiB3YXMgcHJvbXB0ZWQuIEluIHN1Y2ggYSBzY2VuYXJpbywNCgkJCQkJCQkJCQkjIHdlIHNraXAgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgYXJjaGl2ZSBhbmQgY29udGludWUgd2l0aCB0aGUgcmVtYWluaW5nIGFyY2hpdmUgZmlsZSBjb250ZW50cy4NCgkJCQkJCQkJCQlDb250aW51ZQ0KCQkJCQkJCQkJfQ0KCQkJCQkJCQl9DQoJCQkJCQkJCWVsc2UNCgkJCQkJCQkJew0KCQkJCQkJCQkJIyBXcml0ZSBub24tdGVybWluYXRpbmcgZXJyb3IgdG8gdGhlIHBpcGVsaW5lLg0KCQkJCQkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5GaWxlRXhpc3RzRXJyb3IgLWYgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSwgJGFyY2hpdmVGaWxlLCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lLCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lKQ0KCQkJCQkJCQkJJGVycm9yUmVjb3JkID0gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXIgIkV4cGFuZEFyY2hpdmVGaWxlRXhpc3RzIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZE9wZXJhdGlvbikgJG51bGwgJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZQ0KCQkJCQkJCQkJV3JpdGUtRXJyb3IgLUVycm9yUmVjb3JkICRlcnJvclJlY29yZA0KCQkJCQkJCQkJJGhhc05vblRlcm1pbmF0aW5nRXJyb3IgPSAkdHJ1ZQ0KCQkJCQkJCQl9DQoJCQkJCQkJfQ0KDQoJCQkJCQkJaWYgKCEkaGFzTm9uVGVybWluYXRpbmdFcnJvcikNCgkJCQkJCQl7DQoJCQkJCQkJCVtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwRmlsZUV4dGVuc2lvbnNdOjpFeHRyYWN0VG9GaWxlKCRjdXJyZW50QXJjaGl2ZUVudHJ5LCAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgsICRmYWxzZSkNCg0KCQkJCQkJCQkjIEFkZCB0aGUgZXhwYW5kZWQgZmlsZSBwYXRoIHRvIHRoZSAkZXhwYW5kZWRJdGVtcyBhcnJheSwNCgkJCQkJCQkJIyB0byBrZWVwIHRyYWNrIG9mIGFsbCB0aGUgZXhwYW5kZWQgZmlsZXMgY3JlYXRlZCB3aGlsZSBleHBhbmRpbmcgdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkJCQkJIyBJZiB1c2VyIGVudGVycyBDVFJMICsgQyB0aGVuIGF0IHRoYXQgcG9pbnQgb2YgdGltZSwgYWxsIHRoZXNlIGV4cGFuZGVkIGZpbGVzDQoJCQkJCQkJCSMgd291bGQgYmUgZGVsZXRlZCBhcyBwYXJ0IG9mIHRoZSBjbGVhbiB1cCBwcm9jZXNzLg0KCQkJCQkJCQkkZXhwYW5kZWRJdGVtcy5WYWx1ZSArPSAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgNCg0KCQkJCQkJCQkkYWRkRmlsZXRvRXhwYW5kZWRQYXRoTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5DcmVhdGVGaWxlQXRFeHBhbmRlZFBhdGggLWYgJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoKQ0KCQkJCQkJCQlXcml0ZS1WZXJib3NlICRhZGRGaWxldG9FeHBhbmRlZFBhdGhNZXNzYWdlDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQkJZmluYWxseQ0KCQkJCQkJew0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJGRlc3RTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkZGVzdFN0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoNCgkJCQkJCQlJZiAoJG51bGwgLW5lICRzcmNTdHJlYW0pDQoJCQkJCQkJew0KCQkJCQkJCQkkc3JjU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KDQoJCQkJCSRjdXJyZW50RW50cnlDb3VudCArPSAxDQoJCQkJCSMgJGN1cnJlbnRTZWdtZW50V2VpZ2h0IGlzIFNldCB0byAxMDAgZ2l2aW5nIGVxdWFsIHdlaWdodGFnZSB0byBlYWNoIGZpbGUgdGhhdCBpcyBnZXR0aW5nIGV4cGFuZGVkLg0KCQkJCQkjICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgaXMgc2V0IHRvIDAgYXMgdGhlcmUgYXJlIG5vIHByaW9yIHNlZ21lbnRzLg0KCQkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KCQkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDANCgkJCQkJUHJvZ3Jlc3NCYXJIZWxwZXIgIkV4cGFuZC1BcmNoaXZlIiAkcHJvZ3Jlc3NCYXJTdGF0dXMgJHByZXZpb3VzU2VnbWVudFdlaWdodCAkY3VycmVudFNlZ21lbnRXZWlnaHQgJHppcEFyY2hpdmUuRW50cmllcy5Db3VudCAgJGN1cnJlbnRFbnRyeUNvdW50DQoJCQkJfQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCUlmICgkbnVsbCAtbmUgJHppcEFyY2hpdmUpDQoJCQkJew0KCQkJCQkkemlwQXJjaGl2ZS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQlJZiAoJG51bGwgLW5lICRhcmNoaXZlRmlsZVN0cmVhbSkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZVN0cmVhbS5EaXNwb3NlKCkNCgkJCQl9DQoNCgkJCQkjIENvbXBsZXRlIHdyaXRpbmcgcHJvZ3Jlc3MuDQoJCQkJV3JpdGUtUHJvZ3Jlc3MgLUFjdGl2aXR5ICJFeHBhbmQtQXJjaGl2ZSIgLUNvbXBsZXRlZA0KCQkJfQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBQcm9ncmVzc0JhckhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGRpc3BsYXkgcHJvZ3Jlc3MgbWVzc2FnZS4NCiMgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IGJvdGggQ29tcHJlc3MtQXJjaGl2ZSAmIEV4cGFuZC1BcmNoaXZlIHRvIGRpc3BsYXkgYXJjaGl2ZSBmaWxlDQojIGNyZWF0aW9uL2V4cGFuc2lvbiBwcm9ncmVzcy4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBQcm9ncmVzc0JhckhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGNtZGxldE5hbWUsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRzdGF0dXMsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCwNCg0KCQkJCVtpbnRdDQoJCQkJJHRvdGFsTnVtYmVyb2ZFbnRyaWVzLA0KDQoJCQkJW2ludF0NCgkJCQkkY3VycmVudEVudHJ5Q291bnQNCgkJCSkNCg0KCQkJaWYgKCRjdXJyZW50RW50cnlDb3VudCAtZ3QgMCAtYW5kDQoJCQkJJHRvdGFsTnVtYmVyb2ZFbnRyaWVzIC1ndCAwIC1hbmQNCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0IC1nZSAwIC1hbmQNCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgLWd0IDApDQoJCQl7DQoJCQkJJGVudHJ5RGVmYXVsdFdlaWdodCA9ICRjdXJyZW50U2VnbWVudFdlaWdodC9bZG91YmxlXSR0b3RhbE51bWJlcm9mRW50cmllcw0KDQoJCQkJJHBlcmNlbnRDb21wbGV0ZSA9ICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgKyAoJGVudHJ5RGVmYXVsdFdlaWdodCAqICRjdXJyZW50RW50cnlDb3VudCkNCgkJCQlXcml0ZS1Qcm9ncmVzcyAtQWN0aXZpdHkgJGNtZGxldE5hbWUgLVN0YXR1cyAkc3RhdHVzIC1QZXJjZW50Q29tcGxldGUgJHBlcmNlbnRDb21wbGV0ZQ0KCQkJfQ0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBDU1ZIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBhcHBlbmQgY29tbWEgYWZ0ZXIgZWFjaCBwYXRoIHNwZWNpZmlkIGJ5DQojIHRoZSBTb3VyY2VQYXRoIGFycmF5LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc3BsYXkgYWxsIHRoZSB1c2VyIHN1cHBsaWVkIHBhdGhzDQojIGluIHRoZSBXaGF0SWYgbWVzc2FnZS4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBDU1ZIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHNvdXJjZVBhdGgNCgkJCSkNCg0KCQkJIyBTb3VyY2VQYXRoIGhhcyBhbHJlYWR5IGJlZW4gdmFsaWRhdGVkIGJ5IHRoZSBjYWxsaW5nIGZ1bmNhdGlvbi4NCgkJCWlmICgkc291cmNlUGF0aC5Db3VudCAtZ3QgMSkNCgkJCXsNCgkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ID0gImBuIg0KCQkJCWZvciAoJGN1cnJlbnRJbmRleCA9IDA7ICRjdXJyZW50SW5kZXggLWx0ICRzb3VyY2VQYXRoLkNvdW50OyAkY3VycmVudEluZGV4KyspDQoJCQkJew0KCQkJCQlpZiAoJGN1cnJlbnRJbmRleCAtZXEgJHNvdXJjZVBhdGguQ291bnQgLSAxKQ0KCQkJCQl7DQoJCQkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ICs9ICRzb3VyY2VQYXRoWyRjdXJyZW50SW5kZXhdDQoJCQkJCX0NCgkJCQkJZWxzZQ0KCQkJCQl7DQoJCQkJCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ICs9ICRzb3VyY2VQYXRoWyRjdXJyZW50SW5kZXhdICsgImBuIg0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgPSAkc291cmNlUGF0aA0KCQkJfQ0KDQoJCQlyZXR1cm4gJHNvdXJjZVBhdGhJbkNzdkZvcm1hdA0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byB0aHJvdyB0ZXJtaW5hdGluZyBlcnJvci4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRlcnJvcklkLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JNZXNzYWdlLA0KDQoJCQkJW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV0NCgkJCQkkZXJyb3JDYXRlZ29yeSwNCg0KCQkJCVtvYmplY3RdDQoJCQkJJHRhcmdldE9iamVjdCwNCg0KCQkJCVtFeGNlcHRpb25dDQoJCQkJJGlubmVyRXhjZXB0aW9uDQoJCQkpDQoNCgkJCWlmICgkaW5uZXJFeGNlcHRpb24gLWVxICRudWxsKQ0KCQkJew0KCQkJCSRleGNlcHRpb24gPSBOZXctb2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlDQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UsICRpbm5lckV4Y2VwdGlvbg0KCQkJfQ0KDQoJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZQ0KCQkJJGVycm9yUmVjb3JkID0gTmV3LU9iamVjdCBTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yUmVjb3JkICRleGNlcHRpb24sICRlcnJvcklkLCAkZXJyb3JDYXRlZ29yeSwgJHRhcmdldE9iamVjdA0KCQkJJFBTQ21kbGV0LlRocm93VGVybWluYXRpbmdFcnJvcigkZXJyb3JSZWNvcmQpDQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIENyZWF0ZUVycm9yUmVjb3JkSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gY3JlYXRlIGFuIEVycm9yUmVjb3JkDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXINCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nXQ0KCQkJCSRlcnJvcklkLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkZXJyb3JNZXNzYWdlLA0KDQoJCQkJW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV0NCgkJCQkkZXJyb3JDYXRlZ29yeSwNCg0KCQkJCVtFeGNlcHRpb25dDQoJCQkJJGV4Y2VwdGlvbiwNCg0KCQkJCVtvYmplY3RdDQoJCQkJJHRhcmdldE9iamVjdA0KCQkJKQ0KDQoJCQlpZiAoJG51bGwgLWVxICRleGNlcHRpb24pDQoJCQl7DQoJCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UNCgkJCX0NCg0KCQkJJGVycm9yUmVjb3JkID0gTmV3LU9iamVjdCBTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yUmVjb3JkICRleGNlcHRpb24sICRlcnJvcklkLCAkZXJyb3JDYXRlZ29yeSwgJHRhcmdldE9iamVjdA0KCQkJcmV0dXJuICRlcnJvclJlY29yZA0KCQl9DQoJCSNlbmRyZWdpb24gVXRpbGl0eSBGdW5jdGlvbnMNCg0KCQkkaXNWZXJib3NlID0gJHBzYm91bmRwYXJhbWV0ZXJzLkNvbnRhaW5zS2V5KCJWZXJib3NlIikNCgkJJGlzQ29uZmlybSA9ICRwc2JvdW5kcGFyYW1ldGVycy5Db250YWluc0tleSgiQ29uZmlybSIpDQoNCgkJJGlzRGVzdGluYXRpb25QYXRoUHJvdmlkZWQgPSAkdHJ1ZQ0KCQlpZiAoJERlc3RpbmF0aW9uUGF0aCAtZXEgW3N0cmluZ106OkVtcHR5KQ0KCQl7DQoJCQkkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggPSAkcHdkDQoJCQkkaXNEZXN0aW5hdGlvblBhdGhQcm92aWRlZCA9ICRmYWxzZQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJJGRlc3RpbmF0aW9uUGF0aEV4aXN0cyA9IFRlc3QtUGF0aCAtUGF0aCAkRGVzdGluYXRpb25QYXRoIC1QYXRoVHlwZSBDb250YWluZXINCgkJCWlmICgkZGVzdGluYXRpb25QYXRoRXhpc3RzKQ0KCQkJew0KCQkJCSRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCA9IEdldFJlc29sdmVkUGF0aEhlbHBlciAkRGVzdGluYXRpb25QYXRoICRmYWxzZSAkUFNDbWRsZXQNCgkJCQlpZiAoJHJlc29sdmVkRGVzdGluYXRpb25QYXRoLkNvdW50IC1ndCAxKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkRXhwYW5kZWREaXJQYXRoRXJyb3IgLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJJbnZhbGlkRGVzdGluYXRpb25QYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkRGVzdGluYXRpb25QYXRoDQoJCQkJfQ0KDQoJCQkJIyBBdCB0aGlzIHBvaW50IHdlIGFyZSBzdXJlIHRoYXQgdGhlIHByb3ZpZGVkIHBhdGggcmVzb2x2ZXMgdG8gYSB2YWxpZCBzaW5nbGUgcGF0aC4NCgkJCQkjIENhbGxpbmcgUmVzb2x2ZS1QYXRoIGFnYWluIHRvIGdldCB0aGUgdW5kZXJseWluZyBwcm92aWRlciBuYW1lLg0KCQkJCSRzdXBwbGllZERlc3RpbmF0aW9uUGF0aCA9IFJlc29sdmUtUGF0aCAtUGF0aCAkRGVzdGluYXRpb25QYXRoDQoJCQkJaWYgKCRzdXBwbGllZERlc3RpbmF0aW9uUGF0aC5Qcm92aWRlci5OYW1lIC1uZSAiRmlsZVN5c3RlbSIpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkV4cGFuZEFyY2hpdmVJblZhbGlkRGVzdGluYXRpb25QYXRoIC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZERpcmVjdG9yeVBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICREZXN0aW5hdGlvblBhdGgNCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJGNyZWF0ZWRJdGVtID0gTmV3LUl0ZW0gLVBhdGggJERlc3RpbmF0aW9uUGF0aCAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Db25maXJtOiRpc0NvbmZpcm0gLVZlcmJvc2U6JGlzVmVyYm9zZSAtRXJyb3JBY3Rpb24gU3RvcA0KCQkJCWlmICgkY3JlYXRlZEl0ZW0gLW5lICRudWxsIC1hbmQgJGNyZWF0ZWRJdGVtLlBTUHJvdmlkZXIuTmFtZSAtbmUgIkZpbGVTeXN0ZW0iKQ0KCQkJCXsNCgkJCQkJUmVtb3ZlLUl0ZW0gIiREZXN0aW5hdGlvblBhdGgiIC1Gb3JjZSAtUmVjdXJzZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQ0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkV4cGFuZEFyY2hpdmVJblZhbGlkRGVzdGluYXRpb25QYXRoIC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiSW52YWxpZERpcmVjdG9yeVBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICREZXN0aW5hdGlvblBhdGgNCgkJCQl9DQoNCgkJCQkkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJERlc3RpbmF0aW9uUGF0aCAkdHJ1ZSAkUFNDbWRsZXQNCgkJCX0NCgkJfQ0KDQoJCSRpc1doYXRJZiA9ICRwc2JvdW5kcGFyYW1ldGVycy5Db250YWluc0tleSgiV2hhdElmIikNCgkJaWYgKCEkaXNXaGF0SWYpDQoJCXsNCgkJCSRwcmVwYXJpbmdUb0V4cGFuZFZlcmJvc2VNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlByZXBhcmluZ1RvRXhwYW5kVmVyYm9zZU1lc3NhZ2UpDQoJCQlXcml0ZS1WZXJib3NlICRwcmVwYXJpbmdUb0V4cGFuZFZlcmJvc2VNZXNzYWdlDQoNCgkJCSRwcm9ncmVzc0JhclN0YXR1cyA9ICgkTG9jYWxpemVkRGF0YS5FeHBhbmRQcm9ncmVzc0JhclRleHQgLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCVByb2dyZXNzQmFySGVscGVyICJFeHBhbmQtQXJjaGl2ZSIgJHByb2dyZXNzQmFyU3RhdHVzIDAgMTAwIDEwMCAxDQoJCX0NCgl9DQoJUFJPQ0VTUw0KCXsNCgkJc3dpdGNoICgkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSkNCgkJew0KCQkJIlBhdGgiDQoJCQl7DQoJCQkJJHJlc29sdmVkU291cmNlUGF0aHMgPSBHZXRSZXNvbHZlZFBhdGhIZWxwZXIgJFBhdGggJGZhbHNlICRQU0NtZGxldA0KDQoJCQkJaWYgKCRyZXNvbHZlZFNvdXJjZVBhdGhzLkNvdW50IC1ndCAxKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkQXJjaGl2ZUZpbGVQYXRoRXJyb3IgLWYgJFBhdGgsICRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lLCAkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJJbnZhbGlkQXJjaGl2ZUZpbGVQYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkUGF0aA0KCQkJCX0NCgkJCX0NCgkJCSJMaXRlcmFsUGF0aCINCgkJCXsNCgkJCQkkcmVzb2x2ZWRTb3VyY2VQYXRocyA9IEdldFJlc29sdmVkUGF0aEhlbHBlciAkTGl0ZXJhbFBhdGggJHRydWUgJFBTQ21kbGV0DQoNCgkJCQlpZiAoJHJlc29sdmVkU291cmNlUGF0aHMuQ291bnQgLWd0IDEpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWRBcmNoaXZlRmlsZVBhdGhFcnJvciAtZiAkTGl0ZXJhbFBhdGgsICRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lLCAkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJJbnZhbGlkQXJjaGl2ZUZpbGVQYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkTGl0ZXJhbFBhdGgNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyICRyZXNvbHZlZFNvdXJjZVBhdGhzDQoNCgkJaWYgKCRwc2NtZGxldC5TaG91bGRQcm9jZXNzKCRyZXNvbHZlZFNvdXJjZVBhdGhzKSkNCgkJew0KCQkJJGV4cGFuZGVkSXRlbXMgPSBAKCkNCg0KCQkJdHJ5DQoJCQl7DQoJCQkJIyBTdG9wUHJvY2Vzc2luZyBpcyBub3QgYXZhbGlhYmxlIGluIFNjcmlwdCBjbWRsZXRzLiBIb3dldmVyIHRoZSBwaXBsZWxpbmUgZXhlY3V0aW9uDQoJCQkJIyBpcyB0ZXJtaW5hdGVkIHdoZW4gZXZlciAnQ1RSTCArIEMnIGlzIGVudGVyZWQgYnkgdXNlciB0byB0ZXJtaW5hdGUgdGhlIGNtZGxldCBleGVjdXRpb24uDQoJCQkJIyBUaGUgZmluYWxseSBibG9jayBpcyBleGVjdXRlZCB3aGVuZXZlciBwaXBsZWxpbmUgaXMgdGVybWluYXRlZC4NCgkJCQkjICRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlIHZhcmlhYmxlIGlzIHVzZWQgdG8gdHJhY2sgaWYgJ0NUUkwgKyBDJyBpcyBlbnRlcmVkIGJ5IHRoZQ0KCQkJCSMgdXNlci4NCgkJCQkkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSA9ICRmYWxzZQ0KDQoJCQkJIyBUaGUgVXNlciBoYXMgbm90IHByb3ZpZGVkIGEgZGVzdGluYXRpb24gcGF0aCwgaGVuY2Ugd2UgdXNlICckcHdkXEFyY2hpdmVGaWxlTmFtZScgYXMgdGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUNCgkJCQkjIGFyY2hpdmUgZmlsZSBjb250ZW50cyB3b3VsZCBiZSBleHBhbmRlZC4gSWYgdGhlIHBhdGggJyRwd2RcQXJjaGl2ZUZpbGVOYW1lJyBhbHJlYWR5IGV4aXN0cyB0aGVuIHdlIHVzZSB0aGUNCgkJCQkjIFdpbmRvd3MgZGVmYXVsdCBtZWNoYW5pc20gb2YgYXBwZW5kaW5nIGEgY291bnRlciB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBkaXJlY3RvcnkgbmFtZSB3aGVyZSB0aGUgY29udGVudHMNCgkJCQkjIHdvdWxkIGJlIGV4cGFuZGVkLg0KCQkJCWlmICghJGlzRGVzdGluYXRpb25QYXRoUHJvdmlkZWQpDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGUgPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5GaWxlSW5mbyAkcmVzb2x2ZWRTb3VyY2VQYXRocw0KCQkJCQkkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggPSBKb2luLVBhdGggLVBhdGggJHJlc29sdmVkRGVzdGluYXRpb25QYXRoIC1DaGlsZFBhdGggJGFyY2hpdmVGaWxlLkJhc2VOYW1lDQoJCQkJCSRkZXN0aW5hdGlvblBhdGhFeGlzdHMgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCAtUGF0aFR5cGUgQ29udGFpbmVyDQoNCgkJCQkJaWYgKCEkZGVzdGluYXRpb25QYXRoRXhpc3RzKQ0KCQkJCQl7DQoJCQkJCQlOZXctSXRlbSAtUGF0aCAkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIC1WZXJib3NlOiRpc1ZlcmJvc2UgLUVycm9yQWN0aW9uIFN0b3AgfCBPdXQtTnVsbA0KCQkJCQl9DQoJCQkJfQ0KDQoJCQkJRXhwYW5kQXJjaGl2ZUhlbHBlciAkcmVzb2x2ZWRTb3VyY2VQYXRocyAkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggKFtyZWZdJGV4cGFuZGVkSXRlbXMpICRGb3JjZSAkaXNWZXJib3NlICRpc0NvbmZpcm0NCg0KCQkJCSRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlID0gJHRydWUNCgkJCX0NCgkJCWZpbmFsbHkNCgkJCXsNCgkJCQkjIFRoZSAkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSB3b3VsZCBiZSBzZXQgdG8gJGZhbHNlIGlmIHVzZXIgaGFzIHR5cGVkICdDVFJMICsgQycgdG8NCgkJCQkjIHRlcm1pbmF0ZSB0aGUgY21kbGV0IGV4ZWN1dGlvbiBvciBpZiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGlzIHRocm93bi4NCgkJCQlpZiAoJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgLWVxICRmYWxzZSkNCgkJCQl7DQoJCQkJCWlmICgkZXhwYW5kZWRJdGVtcy5Db3VudCAtZ3QgMCkNCgkJCQkJew0KCQkJCQkJIyBkZWxldGUgdGhlIGV4cGFuZGVkIGZpbGUvZGlyZWN0b3J5IGFzIHRoZSBhcmNoaXZlDQoJCQkJCQkjIGZpbGUgd2FzIG5vdCBjb21wbGV0bHkgZXhwYW5kZWQuDQoJCQkJCQkkZXhwYW5kZWRJdGVtcyB8IEZvckVhY2gtT2JqZWN0IHsgUmVtb3ZlLUl0ZW0gJF8gLUZvcmNlIC1SZWN1cnNlIH0NCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0NCg0KZnVuY3Rpb24gV3JpdGUtTG9jYWxNZXNzYWdlDQp7DQogICAgW0NtZGxldEJpbmRpbmcoKV0NCiAgICBQYXJhbSAoDQogICAgICAgIFtzdHJpbmddJE1lc3NhZ2UNCiAgICApDQoNCiAgICBpZiAoVGVzdC1QYXRoIGZ1bmN0aW9uOldyaXRlLVBTRk1lc3NhZ2UpIHsgV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICRNZXNzYWdlIH0NCiAgICBlbHNlIHsgV3JpdGUtSG9zdCAkTWVzc2FnZSB9DQp9DQojZW5kcmVnaW9uIFV0aWxpdHkgRnVuY3Rpb25zDQoNCnRyeQ0Kew0KCVtTeXN0ZW0uTmV0LlNlcnZpY2VQb2ludE1hbmFnZXJdOjpTZWN1cml0eVByb3RvY29sID0gIlRsczEyIg0KDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJEb3dubG9hZGluZyByZXBvc2l0b3J5IGZyb20gJyQoJEJhc2VVcmwpL2FyY2hpdmUvJCgkQnJhbmNoKS56aXAnIg0KCUludm9rZS1XZWJSZXF1ZXN0IC1VcmkgIiQoJEJhc2VVcmwpL2FyY2hpdmUvJCgkQnJhbmNoKS56aXAiIC1Vc2VCYXNpY1BhcnNpbmcgLU91dEZpbGUgIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKS56aXAiIC1FcnJvckFjdGlvbiBTdG9wDQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDcmVhdGluZyB0ZW1wb3JhcnkgcHJvamVjdCBmb2xkZXI6ICckKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSknIg0KCSRudWxsID0gTmV3LUl0ZW0gLVBhdGggJGVudjpURU1QIC1OYW1lICRNb2R1bGVOYW1lIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUZvcmNlIC1FcnJvckFjdGlvbiBTdG9wDQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJFeHRyYWN0aW5nIGFyY2hpdmUgdG8gJyQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSciDQoJRXhwYW5kLUFyY2hpdmUgLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKS56aXAiIC1EZXN0aW5hdGlvblBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSIgLUVycm9yQWN0aW9uIFN0b3ANCgkNCgkkYmFzZVBhdGggPSBHZXQtQ2hpbGRJdGVtICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSlcKiIgfCBTZWxlY3QtT2JqZWN0IC1GaXJzdCAxDQoJaWYgKCRTdWJGb2xkZXIpIHsgJGJhc2VQYXRoID0gIiQoJGJhc2VQYXRoKVwkKCRTdWJGb2xkZXIpIiB9DQoJDQoJIyBPbmx5IG5lZWRlZCBmb3IgUFMgdjUrIGJ1dCBkb2Vzbid0IGh1cnQgYW55d2F5DQoJJG1hbmlmZXN0ID0gIiQoJGJhc2VQYXRoKVwkKCRNb2R1bGVOYW1lKS5wc2QxIg0KCSRtYW5pZmVzdERhdGEgPSBJbnZva2UtRXhwcmVzc2lvbiAoW1N5c3RlbS5JTy5GaWxlXTo6UmVhZEFsbFRleHQoJG1hbmlmZXN0KSkNCgkkbW9kdWxlVmVyc2lvbiA9ICRtYW5pZmVzdERhdGEuTW9kdWxlVmVyc2lvbg0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiRG93bmxvYWQgY29uY2x1ZGVkOiAkKCRNb2R1bGVOYW1lKSB8IEJyYW5jaCAkKCRCcmFuY2gpIHwgVmVyc2lvbiAkKCRtb2R1bGVWZXJzaW9uKSINCgkNCgkjIERldGVybWluZSBvdXRwdXQgcGF0aA0KCSRwYXRoID0gIiQoJGVudjpQcm9ncmFtRmlsZXMpXFdpbmRvd3NQb3dlclNoZWxsXE1vZHVsZXNcJCgkTW9kdWxlTmFtZSkiDQoJaWYgKCRkb1VzZXJNb2RlKSB7ICRwYXRoID0gIiQoU3BsaXQtUGF0aCAkcHJvZmlsZS5DdXJyZW50VXNlckFsbEhvc3RzKVxNb2R1bGVzXCQoJE1vZHVsZU5hbWUpIiB9DQoJaWYgKCRQU1ZlcnNpb25UYWJsZS5QU1ZlcnNpb24uTWFqb3IgLWdlIDUpIHsgJHBhdGggKz0gIlwkbW9kdWxlVmVyc2lvbiIgfQ0KCQ0KCWlmICgoVGVzdC1QYXRoICRwYXRoKSAtYW5kICgtbm90ICRGb3JjZSkpDQoJew0KCQlXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIk1vZHVsZSBhbHJlYWR5IGluc3RhbGxlZCwgaW50ZXJydXB0aW5nIGluc3RhbGxhdGlvbiINCgkJcmV0dXJuDQoJfQ0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiQ3JlYXRpbmcgZm9sZGVyOiAkKCRwYXRoKSINCgkkbnVsbCA9IE5ldy1JdGVtIC1QYXRoICRwYXRoIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUZvcmNlIC1FcnJvckFjdGlvbiBTdG9wDQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDb3B5aW5nIGZpbGVzIHRvICQoJHBhdGgpIg0KCWZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtIC1QYXRoICRiYXNlUGF0aCkpDQoJew0KCQlNb3ZlLUl0ZW0gLVBhdGggJGZpbGUuRnVsbE5hbWUgLURlc3RpbmF0aW9uICRwYXRoIC1FcnJvckFjdGlvbiBTdG9wDQoJfQ0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiQ2xlYW5pbmcgdXAgdGVtcG9yYXJ5IGZpbGVzIg0KCVJlbW92ZS1JdGVtIC1QYXRoICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkiIC1Gb3JjZSAtUmVjdXJzZQ0KCVJlbW92ZS1JdGVtIC1QYXRoICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkuemlwIiAtRm9yY2UNCgkNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkluc3RhbGxhdGlvbiBvZiB0aGUgbW9kdWxlICQoJE1vZHVsZU5hbWUpLCBCcmFuY2ggJCgkQnJhbmNoKSwgVmVyc2lvbiAkKCRtb2R1bGVWZXJzaW9uKSBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5ISINCn0NCmNhdGNoDQp7DQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJJbnN0YWxsYXRpb24gb2YgdGhlIG1vZHVsZSAkKCRNb2R1bGVOYW1lKSBmYWlsZWQhIg0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiQ2xlYW5pbmcgdXAgdGVtcG9yYXJ5IGZpbGVzIg0KCVJlbW92ZS1JdGVtIC1QYXRoICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkiIC1Gb3JjZSAtUmVjdXJzZQ0KCVJlbW92ZS1JdGVtIC1QYXRoICIkKCRlbnY6VEVNUClcJCgkTW9kdWxlTmFtZSkuemlwIiAtRm9yY2UNCgkNCgl0aHJvdw0KfQEJBAAAAAkFAAAABgYAAAALaW5zdGFsbC5wczEGBwAAAAtpbnN0YWxsLnBzMQYIAAAAAsO+CQkAAAAJCgAAAAQEAAAAf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgYAAAgICQsAAAABAAAAAQAAAAEFAAAABAAAAAkMAAAAAAAAAAAAAAABCQAAAAQAAAAJDAAAAAAAAAAAAAAAAQoAAAAEAAAACQwAAAAAAAAAAAAAABELAAAABAAAAAYNAAAABG5hbWUNAxEMAAAAAAAAAAs=</BA> </MS> </Obj> <Obj RefId="57"> <TNRef RefId="8" /> <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString> <Props> <S N="Value">MIT License_x000D__x000A__x000D__x000A_Copyright (c) þ!year!þ þauthorþ_x000D__x000A__x000D__x000A_Permission is hereby granted, free of charge, to any person obtaining a copy_x000D__x000A_of this software and associated documentation files (the "Software"), to deal_x000D__x000A_in the Software without restriction, including without limitation the rights_x000D__x000A_to use, copy, modify, merge, publish, distribute, sublicense, and/or sell_x000D__x000A_copies of the Software, and to permit persons to whom the Software is_x000D__x000A_furnished to do so, subject to the following conditions:_x000D__x000A__x000D__x000A_The above copyright notice and this permission notice shall be included in all_x000D__x000A_copies or substantial portions of the Software._x000D__x000A__x000D__x000A_THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR_x000D__x000A_IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,_x000D__x000A_FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE_x000D__x000A_AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER_x000D__x000A_LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,_x000D__x000A_OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE_x000D__x000A_SOFTWARE.</S> <B N="PlainText">true</B> <Obj N="ContentParameterFlat" RefId="58"> <TNRef RefId="2" /> <LST> <S>author</S> </LST> </Obj> <Obj N="ContentParameterScript" RefId="59"> <TNRef RefId="2" /> <LST> <S>year</S> </LST> </Obj> <S N="Name">LICENSE</S> <S N="RelativePath">LICENSE</S> <S N="Identifier">þ</S> <Obj N="FileSystemParameterFlat" RefId="60"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="61"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAxAhNSVQgTGljZW5zZQ0KDQpDb3B5cmlnaHQgKGMpIMO+IXllYXIhw74gw75hdXRob3LDvg0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KDQpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwNCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQoNClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFDQpTT0ZUV0FSRS4BCQQAAAAJBQAAAAYGAAAAB0xJQ0VOU0UGBwAAAAdMSUNFTlNFBggAAAACw74JCQAAAAkKAAAABAQAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJCwAAAAEAAAABAAAAAQUAAAAEAAAACQwAAAABAAAAAQAAAAEJAAAABAAAAAkNAAAAAAAAAAAAAAABCgAAAAQAAAAJDQAAAAAAAAAAAAAAEQsAAAAEAAAABg4AAAAGYXV0aG9yDQMRDAAAAAQAAAAGDwAAAAR5ZWFyDQMRDQAAAAAAAAAL</BA> </MS> </Obj> <Obj RefId="62"> <TNRef RefId="8" /> <ToString>PSModuleDevelopment.Template.TemplateItemFile</ToString> <Props> <S N="Value"># Description_x000D__x000A__x000D__x000A_Insert a useful description for the þnameþ project here._x000D__x000A__x000D__x000A_Remember, it's the first thing a visitor will see._x000D__x000A__x000D__x000A_# Project Setup Instructions_x000D__x000A_## Working with the layout_x000D__x000A__x000D__x000A_- Don't touch the psm1 file_x000D__x000A_- Place functions you export in `functions/` (can have subfolders)_x000D__x000A_- Place private/internal functions invisible to the user in `internal/functions` (can have subfolders)_x000D__x000A_- Don't add code directly to the `postimport.ps1` or `preimport.ps1`._x000D__x000A_ Those files are designed to import other files only._x000D__x000A_- When adding files & folders, make sure they are covered by either `postimport.ps1` or `preimport.ps1`._x000D__x000A_ This adds them to both the import and the build sequence._x000D__x000A__x000D__x000A_## Setting up CI/CD_x000D__x000A__x000D__x000A_> To create a PR validation pipeline, set up tasks like this:_x000D__x000A__x000D__x000A_- Install Prerequisites (PowerShell Task; VSTS-Prerequisites.ps1)_x000D__x000A_- Validate (PowerShell Task; VSTS-Validate.ps1)_x000D__x000A_- Publish Test Results (Publish Test Results; NUnit format; Run no matter what)_x000D__x000A__x000D__x000A_> To create a build/publish pipeline, set up tasks like this:_x000D__x000A__x000D__x000A_- Install Prerequisites (PowerShell Task; VSTS-Prerequisites.ps1)_x000D__x000A_- Validate (PowerShell Task; VSTS-Validate.ps1)_x000D__x000A_- Build (PowerShell Task; VSTS-Build.ps1)_x000D__x000A_- Publish Test Results (Publish Test Results; NUnit format; Run no matter what)_x000D__x000A_</S> <B N="PlainText">true</B> <Obj N="ContentParameterFlat" RefId="63"> <TNRef RefId="2" /> <LST> <S>name</S> </LST> </Obj> <Obj N="ContentParameterScript" RefId="64"> <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="65"> <TNRef RefId="2" /> <LST /> </Obj> <Obj N="FileSystemParameterScript" RefId="66"> <TNRef RefId="2" /> <LST /> </Obj> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAYDAAAAggojIERlc2NyaXB0aW9uDQoNCkluc2VydCBhIHVzZWZ1bCBkZXNjcmlwdGlvbiBmb3IgdGhlIMO+bmFtZcO+IHByb2plY3QgaGVyZS4NCg0KUmVtZW1iZXIsIGl0J3MgdGhlIGZpcnN0IHRoaW5nIGEgdmlzaXRvciB3aWxsIHNlZS4NCg0KIyBQcm9qZWN0IFNldHVwIEluc3RydWN0aW9ucw0KIyMgV29ya2luZyB3aXRoIHRoZSBsYXlvdXQNCg0KLSBEb24ndCB0b3VjaCB0aGUgcHNtMSBmaWxlDQotIFBsYWNlIGZ1bmN0aW9ucyB5b3UgZXhwb3J0IGluIGBmdW5jdGlvbnMvYCAoY2FuIGhhdmUgc3ViZm9sZGVycykNCi0gUGxhY2UgcHJpdmF0ZS9pbnRlcm5hbCBmdW5jdGlvbnMgaW52aXNpYmxlIHRvIHRoZSB1c2VyIGluIGBpbnRlcm5hbC9mdW5jdGlvbnNgIChjYW4gaGF2ZSBzdWJmb2xkZXJzKQ0KLSBEb24ndCBhZGQgY29kZSBkaXJlY3RseSB0byB0aGUgYHBvc3RpbXBvcnQucHMxYCBvciBgcHJlaW1wb3J0LnBzMWAuDQogIFRob3NlIGZpbGVzIGFyZSBkZXNpZ25lZCB0byBpbXBvcnQgb3RoZXIgZmlsZXMgb25seS4NCi0gV2hlbiBhZGRpbmcgZmlsZXMgJiBmb2xkZXJzLCBtYWtlIHN1cmUgdGhleSBhcmUgY292ZXJlZCBieSBlaXRoZXIgYHBvc3RpbXBvcnQucHMxYCBvciBgcHJlaW1wb3J0LnBzMWAuDQogIFRoaXMgYWRkcyB0aGVtIHRvIGJvdGggdGhlIGltcG9ydCBhbmQgdGhlIGJ1aWxkIHNlcXVlbmNlLg0KDQojIyBTZXR0aW5nIHVwIENJL0NEDQoNCj4gVG8gY3JlYXRlIGEgUFIgdmFsaWRhdGlvbiBwaXBlbGluZSwgc2V0IHVwIHRhc2tzIGxpa2UgdGhpczoNCg0KLSBJbnN0YWxsIFByZXJlcXVpc2l0ZXMgKFBvd2VyU2hlbGwgVGFzazsgVlNUUy1QcmVyZXF1aXNpdGVzLnBzMSkNCi0gVmFsaWRhdGUgKFBvd2VyU2hlbGwgVGFzazsgVlNUUy1WYWxpZGF0ZS5wczEpDQotIFB1Ymxpc2ggVGVzdCBSZXN1bHRzIChQdWJsaXNoIFRlc3QgUmVzdWx0czsgTlVuaXQgZm9ybWF0OyBSdW4gbm8gbWF0dGVyIHdoYXQpDQoNCj4gVG8gY3JlYXRlIGEgYnVpbGQvcHVibGlzaCBwaXBlbGluZSwgc2V0IHVwIHRhc2tzIGxpa2UgdGhpczoNCg0KLSBJbnN0YWxsIFByZXJlcXVpc2l0ZXMgKFBvd2VyU2hlbGwgVGFzazsgVlNUUy1QcmVyZXF1aXNpdGVzLnBzMSkNCi0gVmFsaWRhdGUgKFBvd2VyU2hlbGwgVGFzazsgVlNUUy1WYWxpZGF0ZS5wczEpDQotIEJ1aWxkIChQb3dlclNoZWxsIFRhc2s7IFZTVFMtQnVpbGQucHMxKQ0KLSBQdWJsaXNoIFRlc3QgUmVzdWx0cyAoUHVibGlzaCBUZXN0IFJlc3VsdHM7IE5Vbml0IGZvcm1hdDsgUnVuIG5vIG1hdHRlciB3aGF0KQ0KAQkEAAAACQUAAAAGBgAAAAlSRUFETUUubWQGBwAAAAlSRUFETUUubWQGCAAAAALDvgkJAAAACQoAAAAEBAAAAH9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAwAAAAZfaXRlbXMFX3NpemUIX3ZlcnNpb24GAAAICAkLAAAAAQAAAAEAAAABBQAAAAQAAAAJDAAAAAAAAAAAAAAAAQkAAAAEAAAACQwAAAAAAAAAAAAAAAEKAAAABAAAAAkMAAAAAAAAAAAAAAARCwAAAAQAAAAGDQAAAARuYW1lDQMRDAAAAAAAAAAL</BA> </MS> </Obj> </LST> </Obj> <I32 N="Generation">1</I32> </Props> <MS> <BA N="SerializationData">AAEAAAD/////AQAAAAAAAAAMAgAAAEpQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbAUBAAAAJVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGUMAAAABE5hbWUEVHlwZQdWZXJzaW9uC0Rlc2NyaXB0aW9uBkF1dGhvcglDcmVhdGVkT24EVGFncwpQYXJhbWV0ZXJzB1NjcmlwdHMLUGFyYW1ldGVyczIIQ2hpbGRyZW4KR2VuZXJhdGlvbgEEAwEBAAMDAwMDAClQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlVHlwZQIAAAAOU3lzdGVtLlZlcnNpb24Nf1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXYACU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXYgCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlci5QYXJhbWV0ZXJCYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dngFTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZSwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQgCAAAABgMAAAAKUFNGUHJvamVjdAX8////KVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVUeXBlAQAAAAd2YWx1ZV9fAAgCAAAAAQAAAAkFAAAABgYAAAArUG93ZXJTaGVsbCBGcmFtZXdvcmsgYmFzZWQgcHJvamVjdCBzY2FmZm9sZAYHAAAAEkZyaWVkcmljaCBXZWlubWFubgBAtHvaS9mICQgAAAAJCQAAAAkKAAAACQsAAAAJDAAAAAEAAAAEBQAAAA5TeXN0ZW0uVmVyc2lvbgQAAAAGX01ham9yBl9NaW5vcgZfQnVpbGQJX1JldmlzaW9uAAAAAAgICAgBAAAAAwAAAAMAAAD/////BAgAAAB/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXQMAAAAGX2l0ZW1zBV9zaXplCF92ZXJzaW9uBgAACAgJDQAAAAIAAAAAAAAAAQkAAAAIAAAACQ4AAAAEAAAABAAAAAQKAAAAgAJTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5EaWN0aW9uYXJ5YDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dBAAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplDUtleVZhbHVlUGFpcnMAAwADCBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyCIQCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dW10KAAAACQ8AAAARAAAACRAAAAAECwAAAIgCU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuRGljdGlvbmFyeWAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlci5QYXJhbWV0ZXJCYXNlLCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dAwAAAAdWZXJzaW9uCENvbXBhcmVyCEhhc2hTaXplAAMACBZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyCAAAAAAJDwAAAAAAAAAEDAAAAJ4BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV0DAAAABl9pdGVtcwVfc2l6ZQhfdmVyc2lvbgQAAC9QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2VbXQIAAAAICAkSAAAACwAAAAsAAAARDQAAAAIAAAAGEwAAAAZtb2R1bGUGFAAAAAtwc2ZyYW1ld29yaxEOAAAABAAAAAYVAAAABG5hbWUGFgAAAAZhdXRob3IGFwAAAAdjb21wYW55BhgAAAALZGVzY3JpcHRpb24EDwAAABZTeXN0ZW0uT3JkaW5hbENvbXBhcmVyAQAAAAtfaWdub3JlQ2FzZQABAQcQAAAAAAEAAAAKAAAAA4ICU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuS2V5VmFsdWVQYWlyYDJbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV0sW1BTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuUGFyYW1ldGVyU2NyaXB0LCBQU01vZHVsZURldmVsb3BtZW50LCBWZXJzaW9uPTIuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49bnVsbF1dBOf///+CAlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLktleVZhbHVlUGFpcmAyW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldLFtQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdCwgUFNNb2R1bGVEZXZlbG9wbWVudCwgVmVyc2lvbj0yLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPW51bGxdXQIAAAADa2V5BXZhbHVlAQQsUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5QYXJhbWV0ZXJTY3JpcHQCAAAABhoAAAAEeWVhcgkbAAAAAeT////n////Bh0AAAAFZ3VpZDIJHgAAAAHh////5////wYgAAAACnRlc3Rmb2xkZXIJIQAAAAHe////5////wYjAAAABGd1aWQJJAAAAAHb////5////wYmAAAABWd1aWQzCScAAAAB2P///+f///8GKQAAAAtwc2ZyYW1ld29yawkqAAAAAdX////n////BiwAAAAEZGF0ZQktAAAAAdL////n////Bi8AAAAMcGVzdGVyY29uZmlnCTAAAAABz////+f///8GMgAAAAVndWlkNAkzAAAAAcz////n////BjUAAAAUZHluYW1pY3NjcmlwdF80ODQ5OTEJNgAAAAcSAAAAAAEAAAAQAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACTcAAAAJOAAAAAk5AAAACToAAAAJOwAAAAk8AAAACT0AAAAJPgAAAAk/AAAACUAAAAAJQQAAAA0FDEIAAABfU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbiwgVmVyc2lvbj0zLjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPTMxYmYzODU2YWQzNjRlMzUFGwAAACxQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlBhcmFtZXRlclNjcmlwdAIAAAAETmFtZQtTY3JpcHRCbG9jawEEO1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uU2NyaXB0QmxvY2tTZXJpYWxpemF0aW9uSGVscGVyQgAAAAIAAAAJGgAAAAlEAAAAAR4AAAAbAAAACR0AAAAJRgAAAAEhAAAAGwAAAAkgAAAACUgAAAABJAAAABsAAAAJIwAAAAlKAAAAAScAAAAbAAAACSYAAAAJTAAAAAEqAAAAGwAAAAkpAAAACU4AAAABLQAAABsAAAAJLAAAAAlQAAAAATAAAAAbAAAACS8AAAAJUgAAAAEzAAAAGwAAAAkyAAAACVQAAAABNgAAABsAAAAJNQAAAAlWAAAABTcAAAAvUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1Gb2xkZXIGAAAACENoaWxkcmVuBE5hbWUMUmVsYXRpdmVQYXRoCklkZW50aWZpZXIXRmlsZVN5c3RlbVBhcmFtZXRlckZsYXQZRmlsZVN5c3RlbVBhcmFtZXRlclNjcmlwdAMBAQEDA54BU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tQU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UsIFBTTW9kdWxlRGV2ZWxvcG1lbnQsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1udWxsXV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAlXAAAABlgAAAAHLmdpdGh1YgZZAAAABy5naXRodWIGWgAAAALDvglbAAAACVwAAAABOAAAADcAAAAJXQAAAAZeAAAAE2F6RnVuY3Rpb25SZXNvdXJjZXMGXwAAABNhekZ1bmN0aW9uUmVzb3VyY2VzCVoAAAAJYQAAAAliAAAAATkAAAA3AAAACWMAAAAGZAAAAAVidWlsZAZlAAAABWJ1aWxkCVoAAAAJZwAAAAloAAAAAToAAAA3AAAACWkAAAAGagAAAAdsaWJyYXJ5BmsAAAAHbGlicmFyeQlaAAAACW0AAAAJbgAAAAE7AAAANwAAAAlvAAAABnAAAAAIw75uYW1lw74GcQAAAAjDvm5hbWXDvglaAAAACXMAAAAJdAAAAAU8AAAALVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtRmlsZQkAAAAFVmFsdWUJUGxhaW5UZXh0FENvbnRlbnRQYXJhbWV0ZXJGbGF0FkNvbnRlbnRQYXJhbWV0ZXJTY3JpcHQETmFtZQxSZWxhdGl2ZVBhdGgKSWRlbnRpZmllchdGaWxlU3lzdGVtUGFyYW1ldGVyRmxhdBlGaWxlU3lzdGVtUGFyYW1ldGVyU2NyaXB0AQADAwEBAQMDAX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1df1N5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpc3RgMVtbU3lzdGVtLlN0cmluZywgbXNjb3JsaWIsIFZlcnNpb249NC4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj1iNzdhNWM1NjE5MzRlMDg5XV1/U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdGAxW1tTeXN0ZW0uU3RyaW5nLCBtc2NvcmxpYiwgVmVyc2lvbj00LjAuMC4wLCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODldXX9TeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0YDFbW1N5c3RlbS5TdHJpbmcsIG1zY29ybGliLCBWZXJzaW9uPTQuMC4wLjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjc3YTVjNTYxOTM0ZTA4OV1dAgAAAAZ1AAAAQiMgQXV0byBkZXRlY3QgdGV4dCBmaWxlcyBhbmQgcGVyZm9ybSBMRiBub3JtYWxpemF0aW9uDQoqIHRleHQ9YXV0bwEJdgAAAAl3AAAABngAAAAOLmdpdGF0dHJpYnV0ZXMGeQAAAA4uZ2l0YXR0cmlidXRlcwlaAAAACXsAAAAJfAAAAAE9AAAAPAAAAAZ9AAAA0gMNCiMgaWdub3JlIHRoZSBzZXR0aW5ncyBmb2xkZXIgYW5kIGZpbGVzIGZvciBWU0NvZGUgYW5kIFBTUw0KLnZzY29kZS8qDQoqLnBzcHJvag0KKlRlbXBQb2ludCoNCg0KIyBJZ25vcmUgc3RhZ2luZyBpbmZvIGZyb20gVmlzdWFsIFN0dWRpbw0KbGlicmFyeS/Dvm5hbWXDvi8udnMvKg0KbGlicmFyeS/Dvm5hbWXDvi/Dvm5hbWXDvi9iaW4vKg0KbGlicmFyeS/Dvm5hbWXDvi/Dvm5hbWXDvi9vYmovKg0KDQojIGlnbm9yZSBQb3dlclNoZWxsIFN0dWRpbyBNZXRhRGF0YQ0Kw75uYW1lw74vw75uYW1lw74ucHNwcm9qDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2ouYmFrDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2pzDQrDvm5hbWXDvi/Dvm5hbWXDvi5wc3Byb2oNCg0KIyBpZ25vcmUgdGhlIFRlc3RSZXN1bHRzDQpUZXN0UmVzdWx0cy8qDQoNCiMgaWdub3JlIHRoZSBwdWJsaXNoaW5nIERpcmVjdG9yeQ0KcHVibGlzaC8qAQl+AAAACX8AAAAGgAAAAAouZ2l0aWdub3JlBoEAAAAKLmdpdGlnbm9yZQlaAAAACYMAAAAJhAAAAAE+AAAAPAAAAAaFAAAAxQNwb29sOg0KICBuYW1lOiBIb3N0ZWQgVlMyMDE3DQpzdGVwczoNCi0gdGFzazogUG93ZXJTaGVsbEAyDQogIGRpc3BsYXlOYW1lOiBQcmVyZXF1aXNpdGVzDQogIGlucHV0czoNCiAgICB0YXJnZXRUeXBlOiBmaWxlUGF0aA0KICAgIGZpbGVQYXRoOiAnLi9idWlsZC92c3RzLXByZXJlcXVpc2l0ZXMucHMxJw0KDQotIHRhc2s6IFBvd2VyU2hlbGxAMg0KICBkaXNwbGF5TmFtZTogVmFsaWRhdGUNCiAgaW5wdXRzOg0KICAgIHRhcmdldFR5cGU6IGZpbGVQYXRoDQogICAgZmlsZVBhdGg6ICcuL2J1aWxkL3ZzdHMtdmFsaWRhdGUucHMxJw0KDQotIHRhc2s6IFB1Ymxpc2hUZXN0UmVzdWx0c0AyDQogIGRpc3BsYXlOYW1lOiAnUHVibGlzaCBUZXN0IFJlc3VsdHMgKiovVEVTVC0qLnhtbCcNCiAgaW5wdXRzOg0KICAgIHRlc3RSZXN1bHRzRm9ybWF0OiBOVW5pdA0KICBjb25kaXRpb246IGFsd2F5cygpDQoBCYYAAAAJhwAAAAaIAAAAE2F6dXJlLXBpcGVsaW5lcy55bWwGiQAAABNhenVyZS1waXBlbGluZXMueW1sCVoAAAAJiwAAAAmMAAAAAT8AAAA8AAAABo0AAADArAU8Iw0KCS5TWU5PUFNJUw0KCQlJbnN0YWxscyB0aGUgw75uYW1lw74gTW9kdWxlIGZyb20gZ2l0aHViDQoJCQ0KCS5ERVNDUklQVElPTg0KCQlUaGlzIHNjcmlwdCBpbnN0YWxscyB0aGUgw75uYW1lw74gTW9kdWxlIGZyb20gZ2l0aHViLg0KCQkNCgkJSXQgZG9lcyBzbyBieSAuLi4NCgkJLSBkb3dubG9hZGluZyB0aGUgc3BlY2lmaWVkIGJyYW5jaCBhcyB6aXAgdG8gJGVudjpURU1QDQoJCS0gVW5wYWNraW5nIHRoYXQgemlwIGZpbGUgdG8gYSBmb2xkZXIgaW4gJGVudjpURU1QDQoJCS0gTW92aW5nIHRoYXQgY29udGVudCB0byBhIG1vZHVsZSBmb2xkZXIgaW4gZWl0aGVyIHByb2dyYW0gZmlsZXMgKGRlZmF1bHQpIG9yIHRoZSB1c2VyIHByb2ZpbGUNCgkNCgkuUEFSQU1FVEVSIEJyYW5jaA0KCQlUaGUgYnJhbmNoIHRvIGluc3RhbGwuIEluc3RhbGxzIG1hc3RlciBieSBkZWZhdWx0Lg0KCQlVbmtub3duIGJyYW5jaGVzIHdpbGwgdGVybWluYXRlIHRoZSBzY3JpcHQgaW4gZXJyb3IuDQoJDQoJLlBBUkFNRVRFUiBVc2VyTW9kZQ0KCQlUaGUgZG93bmxvYWRlZCBtb2R1bGUgd2lsbCBiZSBtb3ZlZCB0byB0aGUgdXNlciBwcm9maWxlLCByYXRoZXIgdGhhbiBwcm9ncmFtIGZpbGVzLg0KCQkNCgkuUEFSQU1FVEVSIFNjb3BlDQoJCUJ5IGRlZmF1bHQsIHRoZSBkb3dubG9hZGVkIG1vZHVsZSB3aWxsIGJlIG1vdmVkIHRvIHByb2dyYW0gZmlsZXMuDQoJCVNldHRpbmcgdGhpcyB0byAnQ3VycmVudFVzZXInIGluc3RhbGxzIHRvIHRoZSB1c2VycHJvZmlsZSBvZiB0aGUgY3VycmVudCB1c2VyLg0KDQoJLlBBUkFNRVRFUiBGb3JjZQ0KCQlUaGUgaW5zdGFsbCBzY3JpcHQgd2lsbCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgbW9kdWxlLg0KIz4NCltDbWRsZXRCaW5kaW5nKCldDQpQYXJhbSAoDQoJW3N0cmluZ10NCgkkQnJhbmNoID0gIm1hc3RlciIsDQoJDQoJW3N3aXRjaF0NCgkkVXNlck1vZGUsDQoJDQoJW1ZhbGlkYXRlU2V0KCdBbGxVc2VycycsICdDdXJyZW50VXNlcicpXQ0KCVtzdHJpbmddDQoJJFNjb3BlID0gIkFsbFVzZXJzIiwNCgkNCglbc3dpdGNoXQ0KCSRGb3JjZQ0KKQ0KDQojcmVnaW9uIENvbmZpZ3VyYXRpb24gZm9yIGNsb25pbmcgc2NyaXB0DQojIE5hbWUgb2YgdGhlIG1vZHVsZSB0aGF0IGlzIGJlaW5nIGNsb25lZA0KJE1vZHVsZU5hbWUgPSAiw75uYW1lw74iDQoNCiMgQmFzZSBwYXRoIHRvIHRoZSBnaXRodWIgcmVwb3NpdG9yeQ0KJEJhc2VVcmwgPSAiaHR0cHM6Ly9naXRodWIuY29tLzxJbnNlcnRVc2VybmFtZUhlcmU+L8O+bmFtZcO+Ig0KDQojIElmIHRoZSBtb2R1bGUgaXMgaW4gYSBzdWJmb2xkZXIgb2YgdGhlIGNsb25lZCByZXBvc2l0b3J5LCBzcGVjaWZ5IHJlbGF0aXZlIHBhdGggaGVyZS4gRW1wdHkgc3RyaW5nIHRvIHNraXAuDQokU3ViRm9sZGVyID0gIsO+bmFtZcO+Ig0KI2VuZHJlZ2lvbiBDb25maWd1cmF0aW9uIGZvciBjbG9uaW5nIHNjcmlwdA0KDQojcmVnaW9uIFBhcmFtZXRlciBDYWxjdWxhdGlvbg0KJGRvVXNlck1vZGUgPSAkZmFsc2UNCmlmICgkVXNlck1vZGUpIHsgJGRvVXNlck1vZGUgPSAkdHJ1ZSB9DQppZiAoJGluc3RhbGxfQ3VycmVudFVzZXIpIHsgJGRvVXNlck1vZGUgPSAkdHJ1ZSB9DQppZiAoJFNjb3BlIC1lcSAnQ3VycmVudFVzZXInKSB7ICRkb1VzZXJNb2RlID0gJHRydWUgfQ0KDQppZiAoJGluc3RhbGxfQnJhbmNoKSB7ICRCcmFuY2ggPSAkaW5zdGFsbF9CcmFuY2ggfQ0KI2VuZHJlZ2lvbiBQYXJhbWV0ZXIgQ2FsY3VsYXRpb24NCg0KI3JlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KZnVuY3Rpb24gQ29tcHJlc3MtQXJjaGl2ZQ0Kew0KCTwjDQoJCS5TWU5PUFNJUw0KCQkJQ3JlYXRlcyBhbiBhcmNoaXZlLCBvciB6aXBwZWQgZmlsZSwgZnJvbSBzcGVjaWZpZWQgZmlsZXMgYW5kIGZvbGRlcnMuDQoNCgkJLkRFU0NSSVBUSU9ODQoJCQlUaGUgQ29tcHJlc3MtQXJjaGl2ZSBjbWRsZXQgY3JlYXRlcyBhIHppcHBlZCAob3IgY29tcHJlc3NlZCkgYXJjaGl2ZSBmaWxlIGZyb20gb25lIG9yIG1vcmUgc3BlY2lmaWVkIGZpbGVzIG9yIGZvbGRlcnMuIEFuIGFyY2hpdmUgZmlsZSBhbGxvd3MgbXVsdGlwbGUgZmlsZXMgdG8gYmUgcGFja2FnZWQsIGFuZCBvcHRpb25hbGx5IGNvbXByZXNzZWQsIGludG8gYSBzaW5nbGUgemlwcGVkIGZpbGUgZm9yIGVhc2llciBkaXN0cmlidXRpb24gYW5kIHN0b3JhZ2UuIEFuIGFyY2hpdmUgZmlsZSBjYW4gYmUgY29tcHJlc3NlZCBieSB1c2luZyB0aGUgY29tcHJlc3Npb24gYWxnb3JpdGhtIHNwZWNpZmllZCBieSB0aGUgQ29tcHJlc3Npb25MZXZlbCBwYXJhbWV0ZXIuDQoNCgkJCUJlY2F1c2UgQ29tcHJlc3MtQXJjaGl2ZSByZWxpZXMgdXBvbiB0aGUgTWljcm9zb2Z0IC5ORVQgRnJhbWV3b3JrIEFQSSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZSB0byBjb21wcmVzcyBmaWxlcywgdGhlIG1heGltdW0gZmlsZSBzaXplIHRoYXQgeW91IGNhbiBjb21wcmVzcyBieSB1c2luZyBDb21wcmVzcy1BcmNoaXZlIGlzIGN1cnJlbnRseSAyIEdCLiBUaGlzIGlzIGEgbGltaXRhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBBUEkuDQoNCgkJLlBBUkFNRVRFUiBQYXRoDQoJCQlTcGVjaWZpZXMgdGhlIHBhdGggb3IgcGF0aHMgdG8gdGhlIGZpbGVzIHRoYXQgeW91IHdhbnQgdG8gYWRkIHRvIHRoZSBhcmNoaXZlIHppcHBlZCBmaWxlLiBUaGlzIHBhcmFtZXRlciBjYW4gYWNjZXB0IHdpbGRjYXJkIGNoYXJhY3RlcnMuIFdpbGRjYXJkIGNoYXJhY3RlcnMgYWxsb3cgeW91IHRvIGFkZCBhbGwgZmlsZXMgaW4gYSBmb2xkZXIgdG8geW91ciB6aXBwZWQgYXJjaGl2ZSBmaWxlLiBUbyBzcGVjaWZ5IG11bHRpcGxlIHBhdGhzLCBhbmQgaW5jbHVkZSBmaWxlcyBpbiBtdWx0aXBsZSBsb2NhdGlvbnMgaW4geW91ciBvdXRwdXQgemlwcGVkIGZpbGUsIHVzZSBjb21tYXMgdG8gc2VwYXJhdGUgdGhlIHBhdGhzLg0KDQoJCS5QQVJBTUVURVIgTGl0ZXJhbFBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCBvciBwYXRocyB0byB0aGUgZmlsZXMgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gdGhlIGFyY2hpdmUgemlwcGVkIGZpbGUuIFVubGlrZSB0aGUgUGF0aCBwYXJhbWV0ZXIsIHRoZSB2YWx1ZSBvZiBMaXRlcmFsUGF0aCBpcyB1c2VkIGV4YWN0bHkgYXMgaXQgaXMgdHlwZWQuIE5vIGNoYXJhY3RlcnMgYXJlIGludGVycHJldGVkIGFzIHdpbGRjYXJkcy4gSWYgdGhlIHBhdGggaW5jbHVkZXMgZXNjYXBlIGNoYXJhY3RlcnMsIGVuY2xvc2UgZWFjaCBlc2NhcGUgY2hhcmFjdGVyIGluIHNpbmdsZSBxdW90YXRpb24gbWFya3MsIHRvIGluc3RydWN0IFdpbmRvd3MgUG93ZXJTaGVsbCBub3QgdG8gaW50ZXJwcmV0IGFueSBjaGFyYWN0ZXJzIGFzIGVzY2FwZSBzZXF1ZW5jZXMuIFRvIHNwZWNpZnkgbXVsdGlwbGUgcGF0aHMsIGFuZCBpbmNsdWRlIGZpbGVzIGluIG11bHRpcGxlIGxvY2F0aW9ucyBpbiB5b3VyIG91dHB1dCB6aXBwZWQgZmlsZSwgdXNlIGNvbW1hcyB0byBzZXBhcmF0ZSB0aGUgcGF0aHMuDQoNCgkJLlBBUkFNRVRFUiBEZXN0aW5hdGlvblBhdGgNCgkJCVNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgYXJjaGl2ZSBvdXRwdXQgZmlsZS4gVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuIFRoZSBzcGVjaWZpZWQgRGVzdGluYXRpb25QYXRoIHZhbHVlIHNob3VsZCBpbmNsdWRlIHRoZSBkZXNpcmVkIG5hbWUgb2YgdGhlIG91dHB1dCB6aXBwZWQgZmlsZTsgaXQgc3BlY2lmaWVzIGVpdGhlciB0aGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgcGF0aCB0byB0aGUgemlwcGVkIGZpbGUuIElmIHRoZSBmaWxlIG5hbWUgc3BlY2lmaWVkIGluIERlc3RpbmF0aW9uUGF0aCBkb2VzIG5vdCBoYXZlIGEgLnppcCBmaWxlIG5hbWUgZXh0ZW5zaW9uLCB0aGUgY21kbGV0IGFkZHMgYSAuemlwIGZpbGUgbmFtZSBleHRlbnNpb24uDQoNCgkJLlBBUkFNRVRFUiBDb21wcmVzc2lvbkxldmVsDQoJCQlTcGVjaWZpZXMgaG93IG11Y2ggY29tcHJlc3Npb24gdG8gYXBwbHkgd2hlbiB5b3UgYXJlIGNyZWF0aW5nIHRoZSBhcmNoaXZlIGZpbGUuIEZhc3RlciBjb21wcmVzc2lvbiByZXF1aXJlcyBsZXNzIHRpbWUgdG8gY3JlYXRlIHRoZSBmaWxlLCBidXQgY2FuIHJlc3VsdCBpbiBsYXJnZXIgZmlsZSBzaXplcy4gVGhlIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGlzIHBhcmFtZXRlciBhcmU6DQoNCgkJCS0gRmFzdGVzdC4gVXNlIHRoZSBmYXN0ZXN0IGNvbXByZXNzaW9uIG1ldGhvZCBhdmFpbGFibGUgdG8gZGVjcmVhc2UgcHJvY2Vzc2luZyB0aW1lOyB0aGlzIGNhbiByZXN1bHQgaW4gbGFyZ2VyIGZpbGUgc2l6ZXMuDQoJCQktIE5vQ29tcHJlc3Npb24uIERvIG5vdCBjb21wcmVzcyB0aGUgc291cmNlIGZpbGVzLg0KCQkJLSBPcHRpbWFsLiBQcm9jZXNzaW5nIHRpbWUgaXMgZGVwZW5kZW50IG9uIGZpbGUgc2l6ZS4NCg0KCQkJSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlIGNvbW1hbmQgdXNlcyB0aGUgZGVmYXVsdCB2YWx1ZSwgT3B0aW1hbC4NCg0KCQkuUEFSQU1FVEVSIFVwZGF0ZQ0KCQkJVXBkYXRlcyB0aGUgc3BlY2lmaWVkIGFyY2hpdmUgYnkgcmVwbGFjaW5nIG9sZGVyIHZlcnNpb25zIG9mIGZpbGVzIGluIHRoZSBhcmNoaXZlIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgZmlsZXMgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWVzLiBZb3UgY2FuIGFsc28gYWRkIHRoaXMgcGFyYW1ldGVyIHRvIGFkZCBmaWxlcyB0byBhbiBleGlzdGluZyBhcmNoaXZlLg0KDQoJCS5QQVJBTUVURVIgRm9yY2UNCgkJCUB7VGV4dD19DQoNCgkJLlBBUkFNRVRFUiBDb25maXJtDQoJCQlQcm9tcHRzIHlvdSBmb3IgY29uZmlybWF0aW9uIGJlZm9yZSBydW5uaW5nIHRoZSBjbWRsZXQuDQoNCgkJLlBBUkFNRVRFUiBXaGF0SWYNCgkJCVNob3dzIHdoYXQgd291bGQgaGFwcGVuIGlmIHRoZSBjbWRsZXQgcnVucy4gVGhlIGNtZGxldCBpcyBub3QgcnVuLg0KDQoJCS5FWEFNUExFDQoJCQlFeGFtcGxlIDE6IENyZWF0ZSBhbiBhcmNoaXZlIGZpbGUNCg0KCQkJUFMgQzpcPkNvbXByZXNzLUFyY2hpdmUgLUxpdGVyYWxQYXRoIEM6XFJlZmVyZW5jZVxEcmFmdGRvYy5kb2N4LCBDOlxSZWZlcmVuY2VcSW1hZ2VzXGRpYWdyYW0yLnZzZCAtQ29tcHJlc3Npb25MZXZlbCBPcHRpbWFsIC1EZXN0aW5hdGlvblBhdGggQzpcQXJjaGl2ZXNcRHJhZnQuWmlwDQoNCgkJCVRoaXMgY29tbWFuZCBjcmVhdGVzIGEgbmV3IGFyY2hpdmUgZmlsZSwgRHJhZnQuemlwLCBieSBjb21wcmVzc2luZyB0d28gZmlsZXMsIERyYWZ0ZG9jLmRvY3ggYW5kIGRpYWdyYW0yLnZzZCwgc3BlY2lmaWVkIGJ5IHRoZSBMaXRlcmFsUGF0aCBwYXJhbWV0ZXIuIFRoZSBjb21wcmVzc2lvbiBsZXZlbCBzcGVjaWZpZWQgZm9yIHRoaXMgb3BlcmF0aW9uIGlzIE9wdGltYWwuDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgMjogQ3JlYXRlIGFuIGFyY2hpdmUgd2l0aCB3aWxkY2FyZCBjaGFyYWN0ZXJzDQoNCgkJCVBTIEM6XD5Db21wcmVzcy1BcmNoaXZlIC1QYXRoIEM6XFJlZmVyZW5jZVwqIC1Db21wcmVzc2lvbkxldmVsIEZhc3Rlc3QgLURlc3RpbmF0aW9uUGF0aCBDOlxBcmNoaXZlc1xEcmFmdA0KDQoJCQlUaGlzIGNvbW1hbmQgY3JlYXRlcyBhIG5ldyBhcmNoaXZlIGZpbGUsIERyYWZ0LnppcCwgaW4gdGhlIEM6XEFyY2hpdmVzIGZvbGRlci4gTm90ZSB0aGF0IHRob3VnaCB0aGUgZmlsZSBuYW1lIGV4dGVuc2lvbiAuemlwIHdhcyBub3QgYWRkZWQgdG8gdGhlIHZhbHVlIG9mIHRoZSBEZXN0aW5hdGlvblBhdGggcGFyYW1ldGVyLCBXaW5kb3dzIFBvd2VyU2hlbGwgYXBwZW5kcyB0aGlzIHRvIHRoZSBzcGVjaWZpZWQgYXJjaGl2ZSBmaWxlIG5hbWUgYXV0b21hdGljYWxseS4gVGhlIG5ldyBhcmNoaXZlIGZpbGUgY29udGFpbnMgZXZlcnkgZmlsZSBpbiB0aGUgQzpcUmVmZXJlbmNlIGZvbGRlciwgYmVjYXVzZSBhIHdpbGRjYXJkIGNoYXJhY3RlciB3YXMgdXNlZCBpbiBwbGFjZSBvZiBzcGVjaWZpYyBmaWxlIG5hbWVzIGluIHRoZSBQYXRoIHBhcmFtZXRlci4gVGhlIHNwZWNpZmllZCBjb21wcmVzc2lvbiBsZXZlbCBpcyBGYXN0ZXN0LCB3aGljaCBtaWdodCByZXN1bHQgaW4gYSBsYXJnZXIgb3V0cHV0IGZpbGUsIGJ1dCBjb21wcmVzc2VzIGEgbGFyZ2UgbnVtYmVyIG9mIGZpbGVzIGZhc3Rlci4NCg0KCQkuRVhBTVBMRQ0KCQkJRXhhbXBsZSAzOiBVcGRhdGUgYW4gZXhpc3RpbmcgYXJjaGl2ZSBmaWxlDQoNCgkJCVBTIEM6XD5Db21wcmVzcy1BcmNoaXZlIC1QYXRoIEM6XFJlZmVyZW5jZVwqIC1VcGRhdGUgLURlc3RpbmF0aW9uUGF0aCBDOlxBcmNoaXZlc1xEcmFmdC5aaXANCg0KCQkJVGhpcyBjb21tYW5kIHVwZGF0ZXMgYW4gZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLCBEcmFmdC5aaXAsIGluIHRoZSBDOlxBcmNoaXZlcyBmb2xkZXIuIFRoZSBjb21tYW5kIGlzIHJ1biB0byB1cGRhdGUgRHJhZnQuWmlwIHdpdGggbmV3ZXIgdmVyc2lvbnMgb2YgZXhpc3RpbmcgZmlsZXMgdGhhdCBjYW1lIGZyb20gdGhlIEM6XFJlZmVyZW5jZSBmb2xkZXIsIGFuZCBhbHNvIHRvIGFkZCBuZXcgZmlsZXMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdG8gQzpcUmVmZXJlbmNlIHNpbmNlIERyYWZ0LlppcCB3YXMgaW5pdGlhbGx5IGNyZWF0ZWQuDQoNCgkJLkVYQU1QTEUNCgkJCUV4YW1wbGUgNDogQ3JlYXRlIGFuIGFyY2hpdmUgZnJvbSBhbiBlbnRpcmUgZm9sZGVyDQoNCgkJCVBTIEM6XD5Db21wcmVzcy1BcmNoaXZlIC1QYXRoIEM6XFJlZmVyZW5jZSAtRGVzdGluYXRpb25QYXRoIEM6XEFyY2hpdmVzXERyYWZ0DQoNCgkJCVRoaXMgY29tbWFuZCBjcmVhdGVzIGFuIGFyY2hpdmUgZnJvbSBhbiBlbnRpcmUgZm9sZGVyLCBDOlxSZWZlcmVuY2UuIE5vdGUgdGhhdCB0aG91Z2ggdGhlIGZpbGUgbmFtZSBleHRlbnNpb24gLnppcCB3YXMgbm90IGFkZGVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgRGVzdGluYXRpb25QYXRoIHBhcmFtZXRlciwgV2luZG93cyBQb3dlclNoZWxsIGFwcGVuZHMgdGhpcyB0byB0aGUgc3BlY2lmaWVkIGFyY2hpdmUgZmlsZSBuYW1lIGF1dG9tYXRpY2FsbHkuDQoJIz4NCglbQ21kbGV0QmluZGluZyhEZWZhdWx0UGFyYW1ldGVyU2V0TmFtZSA9ICJQYXRoIiwgU3VwcG9ydHNTaG91bGRQcm9jZXNzID0gJHRydWUsIEhlbHBVcmkgPSAiaHR0cDovL2dvLm1pY3Jvc29mdC5jb20vZndsaW5rLz9MaW5rSUQ9MzkzMjUyIildDQoJcGFyYW0NCgkoDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICR0cnVlLCBQb3NpdGlvbiA9IDAsIFBhcmFtZXRlclNldE5hbWUgPSAiUGF0aCIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICR0cnVlLCBQb3NpdGlvbiA9IDAsIFBhcmFtZXRlclNldE5hbWUgPSAiUGF0aFdpdGhGb3JjZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJHRydWUsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICR0cnVlLCBQb3NpdGlvbiA9IDAsIFBhcmFtZXRlclNldE5hbWUgPSAiUGF0aFdpdGhVcGRhdGUiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJHRydWUpXQ0KCQlbVmFsaWRhdGVOb3ROdWxsT3JFbXB0eSgpXQ0KCQlbc3RyaW5nW11dDQoJCSRQYXRoLA0KDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICR0cnVlLCBQYXJhbWV0ZXJTZXROYW1lID0gIkxpdGVyYWxQYXRoIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICR0cnVlLCBQYXJhbWV0ZXJTZXROYW1lID0gIkxpdGVyYWxQYXRoV2l0aEZvcmNlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkdHJ1ZSldDQoJCVtwYXJhbWV0ZXIgKG1hbmRhdG9yeSA9ICR0cnVlLCBQYXJhbWV0ZXJTZXROYW1lID0gIkxpdGVyYWxQYXRoV2l0aFVwZGF0ZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJHRydWUpXQ0KCQlbVmFsaWRhdGVOb3ROdWxsT3JFbXB0eSgpXQ0KCQlbQWxpYXMoIlBTUGF0aCIpXQ0KCQlbc3RyaW5nW11dDQoJCSRMaXRlcmFsUGF0aCwNCg0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkdHJ1ZSwNCgkJCQkJUG9zaXRpb24gPSAxLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtWYWxpZGF0ZU5vdE51bGxPckVtcHR5KCldDQoJCVtzdHJpbmddDQoJCSREZXN0aW5hdGlvblBhdGgsDQoNCgkJW3BhcmFtZXRlciAoDQoJCQkJCW1hbmRhdG9yeSA9ICRmYWxzZSwNCgkJCQkJVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbVmFsaWRhdGVTZXQoIk9wdGltYWwiLCAiTm9Db21wcmVzc2lvbiIsICJGYXN0ZXN0IildDQoJCVtzdHJpbmddDQoJCSRDb21wcmVzc2lvbkxldmVsID0gIk9wdGltYWwiLA0KDQoJCVtwYXJhbWV0ZXIobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiUGF0aFdpdGhVcGRhdGUiLCBWYWx1ZUZyb21QaXBlbGluZSA9ICRmYWxzZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRmYWxzZSldDQoJCVtwYXJhbWV0ZXIobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGhXaXRoVXBkYXRlIiwgVmFsdWVGcm9tUGlwZWxpbmUgPSAkZmFsc2UsIFZhbHVlRnJvbVBpcGVsaW5lQnlQcm9wZXJ0eU5hbWUgPSAkZmFsc2UpXQ0KCQlbc3dpdGNoXQ0KCQkkVXBkYXRlID0gJGZhbHNlLA0KDQoJCVtwYXJhbWV0ZXIobWFuZGF0b3J5ID0gJHRydWUsIFBhcmFtZXRlclNldE5hbWUgPSAiUGF0aFdpdGhGb3JjZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW3BhcmFtZXRlcihtYW5kYXRvcnkgPSAkdHJ1ZSwgUGFyYW1ldGVyU2V0TmFtZSA9ICJMaXRlcmFsUGF0aFdpdGhGb3JjZSIsIFZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLCBWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW3N3aXRjaF0NCgkJJEZvcmNlID0gJGZhbHNlDQoJKQ0KDQoJQkVHSU4NCgl7DQoJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uIC1FcnJvckFjdGlvbiBJZ25vcmUNCgkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uRmlsZVN5c3RlbSAtRXJyb3JBY3Rpb24gSWdub3JlDQoNCgkJJHppcEZpbGVFeHRlbnNpb24gPSAiLnppcCINCg0KCQkkTG9jYWxpemVkRGF0YSA9IENvbnZlcnRGcm9tLVN0cmluZ0RhdGEgQCcNClBhdGhOb3RGb3VuZEVycm9yPVRoZSBwYXRoICd7MH0nIGVpdGhlciBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSB2YWxpZCBmaWxlIHN5c3RlbSBwYXRoLg0KRXhwYW5kQXJjaGl2ZUluVmFsaWREZXN0aW5hdGlvblBhdGg9VGhlIHBhdGggJ3swfScgaXMgbm90IGEgdmFsaWQgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IHBhdGguDQpJbnZhbGlkWmlwRmlsZUV4dGVuc2lvbkVycm9yPXswfSBpcyBub3QgYSBzdXBwb3J0ZWQgYXJjaGl2ZSBmaWxlIGZvcm1hdC4gezF9IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0Lg0KQXJjaGl2ZUZpbGVJc1JlYWRPbmx5PVRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBhcmNoaXZlIGZpbGUgezB9IGlzIHNldCB0byAnUmVhZE9ubHknIGhlbmNlIGl0IGNhbm5vdCBiZSB1cGRhdGVkLiBJZiB5b3UgaW50ZW5kIHRvIHVwZGF0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLCByZW1vdmUgdGhlICdSZWFkT25seScgYXR0cmlidXRlIG9uIHRoZSBhcmNoaXZlIGZpbGUgZWxzZSB1c2UgLUZvcmNlIHBhcmFtZXRlciB0byBvdmVycmlkZSBhbmQgY3JlYXRlIGEgbmV3IGFyY2hpdmUgZmlsZS4NClppcEZpbGVFeGlzdEVycm9yPVRoZSBhcmNoaXZlIGZpbGUgezB9IGFscmVhZHkgZXhpc3RzLiBVc2UgdGhlIC1VcGRhdGUgcGFyYW1ldGVyIHRvIHVwZGF0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlIG9yIHVzZSB0aGUgLUZvcmNlIHBhcmFtZXRlciB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGFyY2hpdmUgZmlsZS4NCkR1cGxpY2F0ZVBhdGhGb3VuZEVycm9yPVRoZSBpbnB1dCB0byB7MH0gcGFyYW1ldGVyIGNvbnRhaW5zIGEgZHVwbGljYXRlIHBhdGggJ3sxfScuIFByb3ZpZGUgYSB1bmlxdWUgc2V0IG9mIHBhdGhzIGFzIGlucHV0IHRvIHsyfSBwYXJhbWV0ZXIuDQpBcmNoaXZlRmlsZUlzRW1wdHk9VGhlIGFyY2hpdmUgZmlsZSB7MH0gaXMgZW1wdHkuDQpDb21wcmVzc1Byb2dyZXNzQmFyVGV4dD1UaGUgYXJjaGl2ZSBmaWxlICd7MH0nIGNyZWF0aW9uIGlzIGluIHByb2dyZXNzLi4uDQpFeHBhbmRQcm9ncmVzc0JhclRleHQ9VGhlIGFyY2hpdmUgZmlsZSAnezB9JyBleHBhbnNpb24gaXMgaW4gcHJvZ3Jlc3MuLi4NCkFwcGVuZEFyY2hpdmVGaWxlRXh0ZW5zaW9uTWVzc2FnZT1UaGUgYXJjaGl2ZSBmaWxlIHBhdGggJ3swfScgc3VwcGxpZWQgdG8gdGhlIERlc3RpbmF0aW9uUGF0aCBwYXRhbWV0ZXIgZG9lcyBub3QgaW5jbHVkZSAuemlwIGV4dGVuc2lvbi4gSGVuY2UgLnppcCBpcyBhcHBlbmRlZCB0byB0aGUgc3VwcGxpZWQgRGVzdGluYXRpb25QYXRoIHBhdGggYW5kIHRoZSBhcmNoaXZlIGZpbGUgd291bGQgYmUgY3JlYXRlZCBhdCAnezF9Jy4NCkFkZEl0ZW10b0FyY2hpdmVGaWxlPUFkZGluZyAnezB9Jy4NCkNyZWF0ZUZpbGVBdEV4cGFuZGVkUGF0aD1DcmVhdGVkICd7MH0nLg0KSW52YWxpZEFyY2hpdmVGaWxlUGF0aEVycm9yPVRoZSBhcmNoaXZlIGZpbGUgcGF0aCAnezB9JyBzcGVjaWZpZWQgYXMgaW5wdXQgdG8gdGhlIHsxfSBwYXJhbWV0ZXIgaXMgcmVzb2x2aW5nIHRvIG11bHRpcGxlIGZpbGUgc3lzdGVtIHBhdGhzLiBQcm92aWRlIGEgdW5pcXVlIHBhdGggdG8gdGhlIHsyfSBwYXJhbWV0ZXIgd2hlcmUgdGhlIGFyY2hpdmUgZmlsZSBoYXMgdG8gYmUgY3JlYXRlZC4NCkludmFsaWRFeHBhbmRlZERpclBhdGhFcnJvcj1UaGUgZGlyZWN0b3J5IHBhdGggJ3swfScgc3BlY2lmaWVkIGFzIGlucHV0IHRvIHRoZSBEZXN0aW5hdGlvblBhdGggcGFyYW1ldGVyIGlzIHJlc29sdmluZyB0byBtdWx0aXBsZSBmaWxlIHN5c3RlbSBwYXRocy4gUHJvdmlkZSBhIHVuaXF1ZSBwYXRoIHRvIHRoZSBEZXN0aW5hdGlvbiBwYXJhbWV0ZXIgd2hlcmUgdGhlIGFyY2hpdmUgZmlsZSBjb250ZW50cyBoYXZlIHRvIGJlIGV4cGFuZGVkLg0KRmlsZUV4aXN0c0Vycm9yPUZhaWxlZCB0byBjcmVhdGUgZmlsZSAnezB9JyB3aGlsZSBleHBhbmRpbmcgdGhlIGFyY2hpdmUgZmlsZSAnezF9JyBjb250ZW50cyBhcyB0aGUgZmlsZSAnezJ9JyBhbHJlYWR5IGV4aXN0cy4gVXNlIHRoZSAtRm9yY2UgcGFyYW1ldGVyIGlmIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5ICd7M30nIGNvbnRlbnRzIHdoZW4gZXhwYW5kaW5nIHRoZSBhcmNoaXZlIGZpbGUuDQpEZWxldGVBcmNoaXZlRmlsZT1UaGUgcGFydGlhbGx5IGNyZWF0ZWQgYXJjaGl2ZSBmaWxlICd7MH0nIGlzIGRlbGV0ZWQgYXMgaXQgaXMgbm90IHVzYWJsZS4NCkludmFsaWREZXN0aW5hdGlvblBhdGg9VGhlIGRlc3RpbmF0aW9uIHBhdGggJ3swfScgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGFyY2hpdmUgZmlsZSBuYW1lLg0KUHJlcGFyaW5nVG9Db21wcmVzc1ZlcmJvc2VNZXNzYWdlPVByZXBhcmluZyB0byBjb21wcmVzcy4uLg0KUHJlcGFyaW5nVG9FeHBhbmRWZXJib3NlTWVzc2FnZT1QcmVwYXJpbmcgdG8gZXhwYW5kLi4uDQonQA0KDQoJCSNyZWdpb24gVXRpbGl0eSBGdW5jdGlvbnMNCgkJZnVuY3Rpb24gR2V0UmVzb2x2ZWRQYXRoSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRwYXRoLA0KDQoJCQkJW2Jvb2xlYW5dDQoJCQkJJGlzTGl0ZXJhbFBhdGgsDQoNCgkJCQlbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5QU0NtZGxldF0NCgkJCQkkY2FsbGVyUFNDbWRsZXQNCgkJCSkNCg0KCQkJJHJlc29sdmVkUGF0aHMgPSBAKCkNCg0KCQkJIyBudWxsIGFuZCBlbXB0eSBjaGVjayBhcmUgYXJlIGFscmVhZHkgZG9uZSBvbiBQYXRoIHBhcmFtZXRlciBhdCB0aGUgY21kbGV0IGxheWVyLg0KCQkJZm9yZWFjaCAoJGN1cnJlbnRQYXRoIGluICRwYXRoKQ0KCQkJew0KCQkJCXRyeQ0KCQkJCXsNCgkJCQkJaWYgKCRpc0xpdGVyYWxQYXRoKQ0KCQkJCQl7DQoJCQkJCQkkY3VycmVudFJlc29sdmVkUGF0aHMgPSBSZXNvbHZlLVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50UGF0aCAtRXJyb3JBY3Rpb24gU3RvcA0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJGN1cnJlbnRSZXNvbHZlZFBhdGhzID0gUmVzb2x2ZS1QYXRoIC1QYXRoICRjdXJyZW50UGF0aCAtRXJyb3JBY3Rpb24gU3RvcA0KCQkJCQl9DQoJCQkJfQ0KCQkJCWNhdGNoDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlBhdGhOb3RGb3VuZEVycm9yIC1mICRjdXJyZW50UGF0aCkNCgkJCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gJGVycm9yTWVzc2FnZSwgJF8uRXhjZXB0aW9uDQoJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJBcmNoaXZlQ21kbGV0UGF0aE5vdEZvdW5kIiAkbnVsbCAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGV4Y2VwdGlvbiAkY3VycmVudFBhdGgNCgkJCQkJJGNhbGxlclBTQ21kbGV0LlRocm93VGVybWluYXRpbmdFcnJvcigkZXJyb3JSZWNvcmQpDQoJCQkJfQ0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRSZXNvbHZlZFBhdGggaW4gJGN1cnJlbnRSZXNvbHZlZFBhdGhzKQ0KCQkJCXsNCgkJCQkJJHJlc29sdmVkUGF0aHMgKz0gJGN1cnJlbnRSZXNvbHZlZFBhdGguUHJvdmlkZXJQYXRoDQoJCQkJfQ0KCQkJfQ0KDQoJCQkkcmVzb2x2ZWRQYXRocw0KCQl9DQoNCgkJZnVuY3Rpb24gQWRkLUNvbXByZXNzaW9uQXNzZW1ibGllcw0KCQl7DQoNCgkJCWlmICgkUFNFZGl0aW9uIC1lcSAiRGVza3RvcCIpDQoJCQl7DQoJCQkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24NCgkJCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5GaWxlU3lzdGVtDQoJCQl9DQoJCX0NCg0KCQlmdW5jdGlvbiBJc1ZhbGlkRmlsZVN5c3RlbVBhdGgNCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHBhdGgNCgkJCSkNCg0KCQkJJHJlc3VsdCA9ICR0cnVlOw0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJaWYgKCEoW1N5c3RlbS5JTy5GaWxlXTo6RXhpc3RzKCRjdXJyZW50UGF0aCkgLW9yIFtTeXN0ZW0uSU8uRGlyZWN0b3J5XTo6RXhpc3RzKCRjdXJyZW50UGF0aCkpKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QYXRoTm90Rm91bmRFcnJvciAtZiAkY3VycmVudFBhdGgpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiUGF0aE5vdEZvdW5kIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAkcmVzdWx0Ow0KCQl9DQoNCg0KCQlmdW5jdGlvbiBWYWxpZGF0ZUR1cGxpY2F0ZUZpbGVTeXN0ZW1QYXRoDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkaW5wdXRQYXJhbWV0ZXIsDQoNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHBhdGgNCgkJCSkNCg0KCQkJJHVuaXF1ZUlucHV0UGF0aHMgPSBAKCkNCg0KCQkJIyBudWxsIGFuZCBlbXB0eSBjaGVjayBhcmUgYXJlIGFscmVhZHkgZG9uZSBvbiBQYXRoIHBhcmFtZXRlciBhdCB0aGUgY21kbGV0IGxheWVyLg0KCQkJZm9yZWFjaCAoJGN1cnJlbnRQYXRoIGluICRwYXRoKQ0KCQkJew0KCQkJCSRjdXJyZW50SW5wdXRQYXRoID0gJGN1cnJlbnRQYXRoLlRvVXBwZXIoKQ0KCQkJCWlmICgkdW5pcXVlSW5wdXRQYXRocy5Db250YWlucygkY3VycmVudElucHV0UGF0aCkpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkR1cGxpY2F0ZVBhdGhGb3VuZEVycm9yIC1mICRpbnB1dFBhcmFtZXRlciwgJGN1cnJlbnRQYXRoLCAkaW5wdXRQYXJhbWV0ZXIpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiRHVwbGljYXRlUGF0aEZvdW5kIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHVuaXF1ZUlucHV0UGF0aHMgKz0gJGN1cnJlbnRJbnB1dFBhdGgNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlmdW5jdGlvbiBDb21wcmVzc2lvbkxldmVsTWFwcGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbA0KCQkJKQ0KDQoJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06Ok9wdGltYWwNCg0KCQkJIyBDb21wcmVzc2lvbkxldmVsIGZvcm1hdCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBhdCB0aGUgY21kbGV0IGxheWVyLg0KCQkJc3dpdGNoICgkY29tcHJlc3Npb25MZXZlbC5Ub1N0cmluZygpKQ0KCQkJew0KCQkJCSJGYXN0ZXN0Ig0KCQkJCXsNCgkJCQkJJGNvbXByZXNzaW9uTGV2ZWxGb3JtYXQgPSBbU3lzdGVtLklPLkNvbXByZXNzaW9uLkNvbXByZXNzaW9uTGV2ZWxdOjpGYXN0ZXN0DQoJCQkJfQ0KCQkJCSJOb0NvbXByZXNzaW9uIg0KCQkJCXsNCgkJCQkJJGNvbXByZXNzaW9uTGV2ZWxGb3JtYXQgPSBbU3lzdGVtLklPLkNvbXByZXNzaW9uLkNvbXByZXNzaW9uTGV2ZWxdOjpOb0NvbXByZXNzaW9uDQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gJGNvbXByZXNzaW9uTGV2ZWxGb3JtYXQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzQXJjaGl2ZUhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkc291cmNlUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlDQoJCQkpDQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSAwDQoJCQkkc291cmNlRmlsZVBhdGhzID0gQCgpDQoJCQkkc291cmNlRGlyUGF0aHMgPSBAKCkNCg0KCQkJZm9yZWFjaCAoJGN1cnJlbnRQYXRoIGluICRzb3VyY2VQYXRoKQ0KCQkJew0KCQkJCSRyZXN1bHQgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50UGF0aCAtUGF0aFR5cGUgTGVhZg0KCQkJCWlmICgkcmVzdWx0IC1lcSAkdHJ1ZSkNCgkJCQl7DQoJCQkJCSRzb3VyY2VGaWxlUGF0aHMgKz0gJGN1cnJlbnRQYXRoDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRzb3VyY2VEaXJQYXRocyArPSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQl9DQoNCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25lIG9yIG1vcmUgZGlyZWN0b3J5ICh0aGlzIGRpcmVjdG9yeSBjYW4gaGF2ZSBmaWxlcyB1bmRlciBpdCkgYW5kIG5vIGZpbGVzIHRvIGJlIGNvbXByZXNzZWQuDQoJCQlpZiAoJHNvdXJjZUZpbGVQYXRocy5Db3VudCAtZXEgMCAtYW5kICRzb3VyY2VEaXJQYXRocy5Db3VudCAtZ3QgMCkNCgkJCXsNCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDAvW2RvdWJsZV0kc291cmNlRGlyUGF0aHMuQ291bnQNCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KCQkJCWZvcmVhY2ggKCRjdXJyZW50U291cmNlRGlyUGF0aCBpbiAkc291cmNlRGlyUGF0aHMpDQoJCQkJew0KCQkJCQkkY291bnQgPSBDb21wcmVzc1NpbmdsZURpckhlbHBlciAkY3VycmVudFNvdXJjZURpclBhdGggJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkdHJ1ZSAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gJGNvdW50DQoJCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgKz0gJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJfQ0KCQkJfQ0KDQoJCQkjIFRoZSBTb3VyZSBQYXRoIGNvbnRhaW5zIG9ubHkgZmlsZXMgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWVsc2VJZiAoJHNvdXJjZUZpbGVQYXRocy5Db3VudCAtZ3QgMCAtYW5kICRzb3VyY2VEaXJQYXRocy5Db3VudCAtZXEgMCkNCgkJCXsNCgkJCQkjICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgaXMgZXF1YWwgdG8gMCBhcyB0aGVyZSBhcmUgbm8gcHJpb3Igc2VnbWVudHMuDQoJCQkJIyAkY3VycmVudFNlZ21lbnRXZWlnaHQgaXMgc2V0IHRvIDEwMCBhcyBhbGwgZmlsZXMgaGF2ZSBlcXVhbCB3ZWlnaHRhZ2UuDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDANCg0KCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBDb21wcmVzc0ZpbGVzSGVscGVyICRzb3VyY2VGaWxlUGF0aHMgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQl9DQoJCQkjIFRoZSBTb3VyZSBQYXRoIGNvbnRhaW5zIG9uZSBvciBtb3JlIGZpbGVzIGFuZCBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyAodGhpcyBkaXJlY3RvcnkgY2FuIGhhdmUgZmlsZXMgdW5kZXIgaXQpIHRvIGJlIGNvbXByZXNzZWQuDQoJCQllbHNlaWYgKCRzb3VyY2VGaWxlUGF0aHMuQ291bnQgLWd0IDAgLWFuZCAkc291cmNlRGlyUGF0aHMuQ291bnQgLWd0IDApDQoJCQl7DQoJCQkJIyBlYWNoIGRpcmVjdG9yeSBpcyBjb25zaWRlcmVkIGFzIGFuIGluZGl2aWR1YWwgc2VnbWVudHMgJiBhbGwgdGhlIGluZGl2aWR1YWwgZmlsZXMgYXJlIGNsdWJlZCBpbiB0byBhIHNlcGFyYXRlIHNnZW1uZXQuDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwL1tkb3VibGVdKCRzb3VyY2VEaXJQYXRocy5Db3VudCArIDEpDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCg0KCQkJCWZvcmVhY2ggKCRjdXJyZW50U291cmNlRGlyUGF0aCBpbiAkc291cmNlRGlyUGF0aHMpDQoJCQkJew0KCQkJCQkkY291bnQgPSBDb21wcmVzc1NpbmdsZURpckhlbHBlciAkY3VycmVudFNvdXJjZURpclBhdGggJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkdHJ1ZSAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gJGNvdW50DQoJCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgKz0gJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJfQ0KDQoJCQkJJGNvdW50ID0gQ29tcHJlc3NGaWxlc0hlbHBlciAkc291cmNlRmlsZVBhdGhzICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJGlzVXBkYXRlTW9kZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gJGNvdW50DQoJCQl9DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KCQlmdW5jdGlvbiBDb21wcmVzc0ZpbGVzSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VGaWxlUGF0aHMsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRkZXN0aW5hdGlvblBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsLA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZSwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkpDQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBaaXBBcmNoaXZlSGVscGVyICRzb3VyY2VGaWxlUGF0aHMgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRudWxsICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KCQlmdW5jdGlvbiBDb21wcmVzc1NpbmdsZURpckhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJHNvdXJjZURpclBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRkZXN0aW5hdGlvblBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsLA0KDQoJCQkJW2Jvb2xdDQoJCQkJJHVzZVBhcmVudERpckFzUm9vdCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJKQ0KDQoJCQlbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdFtTeXN0ZW0uU3RyaW5nXV0kc3ViRGlyRmlsZXMgPSBAKCkNCg0KCQkJaWYgKCR1c2VQYXJlbnREaXJBc1Jvb3QpDQoJCQl7DQoJCQkJJHNvdXJjZURpckluZm8gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyAtQXJndW1lbnRMaXN0ICRzb3VyY2VEaXJQYXRoDQoJCQkJJHNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpckluZm8uUGFyZW50LkZ1bGxOYW1lDQoNCgkJCQkjIElmIHRoZSBkaXJlY3RvcnkgaXMgcHJlc2VudCBhdCB0aGUgZHJpdmUgbGV2ZWwgdGhlIERpcmVjdG9yeUluZm8uUGFyZW50IGluY2x1ZGUgJ1wnIGV4YW1wbGU6IEM6XA0KCQkJCSMgT24gdGhlIG90aGVyIGhhbmQgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMgYXQgYSBkZXBlciBsZXZlbCB0aGVuIERpcmVjdG9yeUluZm8uUGFyZW50DQoJCQkJIyBoYXMganVzdCB0aGUgcGF0aCAod2l0aG91dCBhbiBlbmRpbmcgJ1wnKS4gZXhhbXBsZSBDOlxzb3VyY2UNCgkJCQlpZiAoJHNvdXJjZURpckZ1bGxOYW1lLkxlbmd0aCAtZXEgMykNCgkJCQl7DQoJCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpckZ1bGxOYW1lDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpckZ1bGxOYW1lICsgIlwiDQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRzb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJQYXRoDQoJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUgKyAiXCINCgkJCX0NCg0KCQkJJGRpckNvbnRlbnRzID0gR2V0LUNoaWxkSXRlbSAtTGl0ZXJhbFBhdGggJHNvdXJjZURpclBhdGggLVJlY3Vyc2UNCgkJCWZvcmVhY2ggKCRjdXJyZW50Q29udGVudCBpbiAkZGlyQ29udGVudHMpDQoJCQl7DQoJCQkJJGlzQ29udGFpbmVyID0gJGN1cnJlbnRDb250ZW50IC1pcyBbU3lzdGVtLklPLkRpcmVjdG9yeUluZm9dDQoJCQkJaWYgKCEkaXNDb250YWluZXIpDQoJCQkJew0KCQkJCQkkc3ViRGlyRmlsZXMuQWRkKCRjdXJyZW50Q29udGVudC5GdWxsTmFtZSkNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJIyBUaGUgY3VycmVudENvbnRlbnQgcG9pbnRzIHRvIGEgZGlyZWN0b3J5Lg0KCQkJCQkjIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBhbiBlbXB0eSBkaXJlY3RvcnksIGlmIHNvIHN1Y2ggYQ0KCQkJCQkjIGRpcmVjdG9yeSBoYXMgdG8gYmUgZXhwbGljdGx5IGFkZGVkIHRvIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJCSMgaWYgdGhlcmUgYXJlIG5vIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdGhlIEdldEZpbGVzKCkgQVBJIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuDQoJCQkJCSRmaWxlcyA9ICRjdXJyZW50Q29udGVudC5HZXRGaWxlcygpDQoJCQkJCWlmICgkZmlsZXMuQ291bnQgLWVxIDApDQoJCQkJCXsNCgkJCQkJCSRzdWJEaXJGaWxlcy5BZGQoJGN1cnJlbnRDb250ZW50LkZ1bGxOYW1lICsgIlwiKQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gWmlwQXJjaGl2ZUhlbHBlciAkc3ViRGlyRmlsZXMuVG9BcnJheSgpICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJGlzVXBkYXRlTW9kZSAkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KDQoJCQlyZXR1cm4gJG51bWJlck9mSXRlbXNBcmNoaXZlZA0KCQl9DQoNCgkJZnVuY3Rpb24gWmlwQXJjaGl2ZUhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W1N5c3RlbS5TdHJpbmddXQ0KCQkJCSRzb3VyY2VQYXRocywNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkpDQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSAwDQoJCQkkZmlsZU1vZGUgPSBbU3lzdGVtLklPLkZpbGVNb2RlXTo6Q3JlYXRlDQoJCQkkcmVzdWx0ID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkRGVzdGluYXRpb25QYXRoIC1QYXRoVHlwZSBMZWFmDQoJCQlpZiAoJHJlc3VsdCAtZXEgJHRydWUpDQoJCQl7DQoJCQkJJGZpbGVNb2RlID0gW1N5c3RlbS5JTy5GaWxlTW9kZV06Ok9wZW4NCgkJCX0NCg0KCQkJQWRkLUNvbXByZXNzaW9uQXNzZW1ibGllcw0KDQoJCQl0cnkNCgkJCXsNCgkJCQkjIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCB0aGUgYXJjaGl2ZSBmaWxlIGhhcyB3cml0ZSBhY2Nlc3MuDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtQXJncyA9IEAoJGRlc3RpbmF0aW9uUGF0aCwgJGZpbGVNb2RlKQ0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5GaWxlU3RyZWFtIC1Bcmd1bWVudExpc3QgJGFyY2hpdmVGaWxlU3RyZWFtQXJncw0KDQoJCQkJJHppcEFyY2hpdmVBcmdzID0gQCgkYXJjaGl2ZUZpbGVTdHJlYW0sIFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZU1vZGVdOjpVcGRhdGUsICRmYWxzZSkNCgkJCQkkemlwQXJjaGl2ZSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlIC1Bcmd1bWVudExpc3QgJHppcEFyY2hpdmVBcmdzDQoNCgkJCQkkY3VycmVudEVudHJ5Q291bnQgPSAwDQoJCQkJJHByb2dyZXNzQmFyU3RhdHVzID0gKCRMb2NhbGl6ZWREYXRhLkNvbXByZXNzUHJvZ3Jlc3NCYXJUZXh0IC1mICRkZXN0aW5hdGlvblBhdGgpDQoJCQkJJGJ1ZmZlclNpemUgPSA0a2INCgkJCQkkYnVmZmVyID0gTmV3LU9iamVjdCBCeXRlW10gJGJ1ZmZlclNpemUNCg0KCQkJCWZvcmVhY2ggKCRjdXJyZW50RmlsZVBhdGggaW4gJHNvdXJjZVBhdGhzKQ0KCQkJCXsNCgkJCQkJaWYgKCRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lIC1uZSAkbnVsbCAtYW5kICRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLkxlbmd0aCAtZ3QgMCkNCgkJCQkJew0KCQkJCQkJJGluZGV4ID0gJGN1cnJlbnRGaWxlUGF0aC5JbmRleE9mKCRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLCBbU3lzdGVtLlN0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkNCgkJCQkJCSRjdXJyZW50RmlsZVBhdGhTdWJTdHJpbmcgPSAkY3VycmVudEZpbGVQYXRoLlN1YnN0cmluZygkaW5kZXgsICRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLkxlbmd0aCkNCgkJCQkJCSRyZWxhdGl2ZUZpbGVQYXRoID0gJGN1cnJlbnRGaWxlUGF0aC5SZXBsYWNlKCRjdXJyZW50RmlsZVBhdGhTdWJTdHJpbmcsICIiKS5UcmltKCkNCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRyZWxhdGl2ZUZpbGVQYXRoID0gW1N5c3RlbS5JTy5QYXRoXTo6R2V0RmlsZU5hbWUoJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJfQ0KDQoJCQkJCSMgVXBkYXRlIG1vZGUgaXMgc2VsZWN0ZWQuDQoJCQkJCSMgQ2hlY2sgdG8gc2VlIGlmIGFyY2hpdmUgZmlsZSBhbHJlYWR5IGNvbnRhaW5zIG9uZSBvciBtb3JlIHppcCBmaWxlcyBpbiBpdC4NCgkJCQkJaWYgKCRpc1VwZGF0ZU1vZGUgLWVxICR0cnVlIC1hbmQgJHppcEFyY2hpdmUuRW50cmllcy5Db3VudCAtZ3QgMCkNCgkJCQkJew0KCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQgPSAkbnVsbA0KDQoJCQkJCQkjIENoZWNrIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJCQkjIElmIHNvIHJlcGxhY2UgaXQgd2l0aCBuZXcgZmlsZSBmcm9tIHRoZSBpbnB1dCBzb3VyY2UuDQoJCQkJCQkjIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhcmNoaXZlIGZpbGUgdGhlbiBkZWZhdWx0IHRvDQoJCQkJCQkjIGNyZWF0ZSBtb2RlIGFuZCBjcmVhdGUgdGhlIGVudHJ5IGluIHRoZSBhcmNoaXZlIGZpbGUuDQoNCgkJCQkJCWZvcmVhY2ggKCRjdXJyZW50QXJjaGl2ZUVudHJ5IGluICR6aXBBcmNoaXZlLkVudHJpZXMpDQoJCQkJCQl7DQoJCQkJCQkJaWYgKCRjdXJyZW50QXJjaGl2ZUVudHJ5LkZ1bGxOYW1lIC1lcSAkcmVsYXRpdmVGaWxlUGF0aCkNCgkJCQkJCQl7DQoJCQkJCQkJCSRlbnRyeVRvQmVVcGRhdGVkID0gJGN1cnJlbnRBcmNoaXZlRW50cnkNCgkJCQkJCQkJYnJlYWsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCWlmICgkZW50cnlUb0JlVXBkYXRlZCAtbmUgJG51bGwpDQoJCQkJCQl7DQoJCQkJCQkJJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BZGRJdGVtdG9BcmNoaXZlRmlsZSAtZiAkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQkJCSRlbnRyeVRvQmVVcGRhdGVkLkRlbGV0ZSgpDQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkkY29tcHJlc3Npb24gPSBDb21wcmVzc2lvbkxldmVsTWFwcGVyICRjb21wcmVzc2lvbkxldmVsDQoNCgkJCQkJIyBJZiBhIGRpcmVjdG9yeSBuZWVkcyB0byBiZSBhZGRlZCB0byBhbiBhcmNoaXZlIGZpbGUsDQoJCQkJCSMgYnkgY29udmVudGlvbiB0aGUgLk5ldCBBUEkncyBleHBlY3QgdGhlIHBhdGggb2YgdGhlIGRpcmV0Y29yeQ0KCQkJCQkjIHRvIGVuZCB3aXRoICdcJyB0byBkZXRlY3QgdGhlIHBhdGggYXMgYW4gZGlyZWN0b3J5Lg0KCQkJCQlpZiAoISRyZWxhdGl2ZUZpbGVQYXRoLkVuZHNXaXRoKCJcIiwgW1N0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpDQoJCQkJCXsNCgkJCQkJCXRyeQ0KCQkJCQkJew0KCQkJCQkJCXRyeQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGN1cnJlbnRGaWxlU3RyZWFtID0gW1N5c3RlbS5JTy5GaWxlXTo6T3BlbigkY3VycmVudEZpbGVQYXRoLCBbU3lzdGVtLklPLkZpbGVNb2RlXTo6T3BlbiwgW1N5c3RlbS5JTy5GaWxlQWNjZXNzXTo6UmVhZCkNCgkJCQkJCQl9DQoJCQkJCQkJY2F0Y2gNCgkJCQkJCQl7DQoJCQkJCQkJCSMgRmFpbGVkIHRvIGFjY2VzcyB0aGUgZmlsZS4gV3JpdGUgYSBub24gdGVybWluYXRpbmcgZXJyb3IgdG8gdGhlIHBpcGVsaW5lDQoJCQkJCQkJCSMgYW5kIG1vdmUgb24gd2l0aCB0aGUgcmVtYWluaW5nIGZpbGVzLg0KCQkJCQkJCQkkZXhjZXB0aW9uID0gJF8uRXhjZXB0aW9uDQoJCQkJCQkJCWlmICgkbnVsbCAtbmUgJF8uRXhjZXB0aW9uIC1hbmQNCgkJCQkJCQkJCSRudWxsIC1uZSAkXy5FeGNlcHRpb24uSW5uZXJFeGNlcHRpb24pDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSRleGNlcHRpb24gPSAkXy5FeGNlcHRpb24uSW5uZXJFeGNlcHRpb24NCgkJCQkJCQkJfQ0KCQkJCQkJCQkkZXJyb3JSZWNvcmQgPSBDcmVhdGVFcnJvclJlY29yZEhlbHBlciAiQ29tcHJlc3NBcmNoaXZlVW5hdXRob3JpemVkQWNjZXNzRXJyb3IiICRudWxsIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6UGVybWlzc2lvbkRlbmllZCkgJGV4Y2VwdGlvbiAkY3VycmVudEZpbGVQYXRoDQoJCQkJCQkJCVdyaXRlLUVycm9yIC1FcnJvclJlY29yZCAkZXJyb3JSZWNvcmQNCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAoJG51bGwgLW5lICRjdXJyZW50RmlsZVN0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRzcmNTdHJlYW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5CaW5hcnlSZWFkZXIgJGN1cnJlbnRGaWxlU3RyZWFtDQoNCgkJCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnkgPSAkemlwQXJjaGl2ZS5DcmVhdGVFbnRyeSgkcmVsYXRpdmVGaWxlUGF0aCwgJGNvbXByZXNzaW9uKQ0KDQoJCQkJCQkJCSMgVXBkYXRpbmcgIHRoZSBGaWxlIENyZWF0aW9uIHRpbWUgc28gdGhhdCB0aGUgc2FtZSB0aW1lc3RhbXAgd291bGQgYmUgcmV0YWluZWQgYWZ0ZXIgZXhwYW5kaW5nIHRoZSBjb21wcmVzc2VkIGZpbGUuDQoJCQkJCQkJCSMgQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IEdldC1DaGlsZEl0ZW0gd291bGQgc3VjY2VlZC4NCgkJCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnkuTGFzdFdyaXRlVGltZSA9IChHZXQtSXRlbSAtTGl0ZXJhbFBhdGggJGN1cnJlbnRGaWxlUGF0aCkuTGFzdFdyaXRlVGltZQ0KDQoJCQkJCQkJCSRkZXN0U3RyZWFtID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uQmluYXJ5V3JpdGVyICRjdXJyZW50QXJjaGl2ZUVudHJ5Lk9wZW4oKQ0KDQoJCQkJCQkJCXdoaWxlICgkbnVtYmVyT2ZCeXRlc1JlYWQgPSAkc3JjU3RyZWFtLlJlYWQoJGJ1ZmZlciwgMCwgJGJ1ZmZlclNpemUpKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkkZGVzdFN0cmVhbS5Xcml0ZSgkYnVmZmVyLCAwLCAkbnVtYmVyT2ZCeXRlc1JlYWQpDQoJCQkJCQkJCQkkZGVzdFN0cmVhbS5GbHVzaCgpDQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9IDENCgkJCQkJCQkJJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BZGRJdGVtdG9BcmNoaXZlRmlsZSAtZiAkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWZpbmFsbHkNCgkJCQkJCXsNCgkJCQkJCQlJZiAoJG51bGwgLW5lICRjdXJyZW50RmlsZVN0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRjdXJyZW50RmlsZVN0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkc3JjU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkZGVzdFN0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRkZXN0U3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5ID0gJHppcEFyY2hpdmUuQ3JlYXRlRW50cnkoIiRyZWxhdGl2ZUZpbGVQYXRoIiwgJGNvbXByZXNzaW9uKQ0KCQkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAxDQoJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCX0NCg0KCQkJCQlpZiAoJG51bGwgLW5lICRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UpDQoJCQkJCXsNCgkJCQkJCVdyaXRlLVZlcmJvc2UgJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZQ0KCQkJCQl9DQoNCgkJCQkJJGN1cnJlbnRFbnRyeUNvdW50ICs9IDENCgkJCQkJUHJvZ3Jlc3NCYXJIZWxwZXIgIkNvbXByZXNzLUFyY2hpdmUiICRwcm9ncmVzc0JhclN0YXR1cyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodCAkc291cmNlUGF0aHMuQ291bnQgICRjdXJyZW50RW50cnlDb3VudA0KCQkJCX0NCgkJCX0NCgkJCWZpbmFsbHkNCgkJCXsNCgkJCQlJZiAoJG51bGwgLW5lICR6aXBBcmNoaXZlKQ0KCQkJCXsNCgkJCQkJJHppcEFyY2hpdmUuRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJSWYgKCRudWxsIC1uZSAkYXJjaGl2ZUZpbGVTdHJlYW0pDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0uRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJIyBDb21wbGV0ZSB3cml0aW5nIHByb2dyZXNzLg0KCQkJCVdyaXRlLVByb2dyZXNzIC1BY3Rpdml0eSAiQ29tcHJlc3MtQXJjaGl2ZSIgLUNvbXBsZXRlZA0KCQkJfQ0KDQoJCQlyZXR1cm4gJG51bWJlck9mSXRlbXNBcmNoaXZlZA0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGFyY2hpdmUgZmlsZQ0KIyBwYXRoICYgaXRzIGZpbGUgZm9ybWF0LiBUaGUgb25seSBzdXBwb3J0ZWQgYXJjaGl2ZSBmaWxlIGZvcm1hdCBpcyAuemlwDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gVmFsaWRhdGVBcmNoaXZlUGF0aEhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGFyY2hpdmVGaWxlDQoJCQkpDQoNCgkJCWlmIChbU3lzdGVtLklPLkZpbGVdOjpFeGlzdHMoJGFyY2hpdmVGaWxlKSkNCgkJCXsNCgkJCQkkZXh0ZW5zaW9uID0gW3N5c3RlbS5JTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRhcmNoaXZlRmlsZSkNCg0KCQkJCSMgSW52YWxpZCBmaWxlIGV4dGVuc2lvbiBpcyBzcGVjaWZlZCBmb3IgdGhlIHppcCBmaWxlLg0KCQkJCWlmICgkZXh0ZW5zaW9uIC1uZSAkemlwRmlsZUV4dGVuc2lvbikNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZFppcEZpbGVFeHRlbnNpb25FcnJvciAtZiAkZXh0ZW5zaW9uLCAkemlwRmlsZUV4dGVuc2lvbikNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJOb3RTdXBwb3J0ZWRBcmNoaXZlRmlsZUV4dGVuc2lvbiIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGV4dGVuc2lvbg0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlBhdGhOb3RGb3VuZEVycm9yIC1mICRhcmNoaXZlRmlsZSkNCgkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIlBhdGhOb3RGb3VuZCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGFyY2hpdmVGaWxlDQoJCQl9DQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIEV4cGFuZEFyY2hpdmVIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBleHBhbmQgdGhlIGFyY2hpdmUgZmlsZSBjb250ZW50cw0KIyB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBFeHBhbmRBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkYXJjaGl2ZUZpbGUsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRleHBhbmRlZERpciwNCg0KCQkJCVtyZWZdDQoJCQkJJGV4cGFuZGVkSXRlbXMsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkZm9yY2UsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNWZXJib3NlLA0KDQoJCQkJW2Jvb2xlYW5dDQoJCQkJJGlzQ29uZmlybQ0KCQkJKQ0KDQoJCQlBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoNCgkJCXRyeQ0KCQkJew0KCQkJCSMgVGhlIGV4aXN0YW5jZSBvZiBhcmNoaXZlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYnkgVmFsaWRhdGVBcmNoaXZlUGF0aEhlbHBlcg0KCQkJCSMgYmVmb3JlIGNhbGxpbmcgdGhpcyBoZWxwZXIgZnVuY3Rpb24uDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtQXJncyA9IEAoJGFyY2hpdmVGaWxlLCBbU3lzdGVtLklPLkZpbGVNb2RlXTo6T3BlbiwgW1N5c3RlbS5JTy5GaWxlQWNjZXNzXTo6UmVhZCkNCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uRmlsZVN0cmVhbSAtQXJndW1lbnRMaXN0ICRhcmNoaXZlRmlsZVN0cmVhbUFyZ3MNCg0KCQkJCSR6aXBBcmNoaXZlQXJncyA9IEAoJGFyY2hpdmVGaWxlU3RyZWFtLCBbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmVNb2RlXTo6UmVhZCwgJGZhbHNlKQ0KCQkJCSR6aXBBcmNoaXZlID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmUgLUFyZ3VtZW50TGlzdCAkemlwQXJjaGl2ZUFyZ3MNCg0KCQkJCWlmICgkemlwQXJjaGl2ZS5FbnRyaWVzLkNvdW50IC1lcSAwKQ0KCQkJCXsNCgkJCQkJJGFyY2hpdmVGaWxlSXNFbXB0eSA9ICgkTG9jYWxpemVkRGF0YS5BcmNoaXZlRmlsZUlzRW1wdHkgLWYgJGFyY2hpdmVGaWxlKQ0KCQkJCQlXcml0ZS1WZXJib3NlICRhcmNoaXZlRmlsZUlzRW1wdHkNCgkJCQkJcmV0dXJuDQoJCQkJfQ0KDQoJCQkJJGN1cnJlbnRFbnRyeUNvdW50ID0gMA0KCQkJCSRwcm9ncmVzc0JhclN0YXR1cyA9ICgkTG9jYWxpemVkRGF0YS5FeHBhbmRQcm9ncmVzc0JhclRleHQgLWYgJGFyY2hpdmVGaWxlKQ0KDQoJCQkJIyBUaGUgYXJjaGl2ZSBlbnRyaWVzIGNhbiBlaXRoZXIgYmUgZW1wdHkgZGlyZWN0b3JpZXMgb3IgZmlsZXMuDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRBcmNoaXZlRW50cnkgaW4gJHppcEFyY2hpdmUuRW50cmllcykNCgkJCQl7DQoJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCA9IEpvaW4tUGF0aCAtUGF0aCAkZXhwYW5kZWREaXIgLUNoaWxkUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeS5GdWxsTmFtZQ0KCQkJCQkkZXh0ZW5zaW9uID0gW3N5c3RlbS5JTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCg0KCQkJCQkjIFRoZSBjdXJyZW50IGFyY2hpdmUgZW50cnkgaXMgYW4gZW1wdHkgZGlyZWN0b3J5DQoJCQkJCSMgVGhlIEZ1bGxOYW1lIG9mIHRoZSBBcmNoaXZlIEVudHJ5IHJlcHJlc2VudGluZyBhIGRpcmVjdG9yeSB3b3VsZCBlbmQgd2l0aCBhIHRyYWlsaW5nICdcJy4NCgkJCQkJaWYgKCRleHRlbnNpb24gLWVxIFtzdHJpbmddOjpFbXB0eSAtYW5kDQoJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeVBhdGguRW5kc1dpdGgoIlwiLCBbU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkNCgkJCQkJew0KCQkJCQkJJHBhdGhFeGlzdHMgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aA0KDQoJCQkJCQkjIFRoZSBjdXJyZW50IGFyY2hpdmUgZW50cnkgZXhwZWN0cyBhbiBlbXB0eSBkaXJlY3RvcnkuDQoJCQkJCQkjIENoZWNrIGlmIHRoZSBleGlzdGluZyBkaXJlY3RvcnkgaXMgZW1wdHkuIElmIGl0cyBub3QgZW1wdHkNCgkJCQkJCSMgdGhlbiBpdCBtZWFucyB0aGF0IHVzZXIgaGFzIGFkZGVkIHRoaXMgZGlyZWN0b3J5IGJ5IG90aGVyIG1lYW5zLg0KCQkJCQkJaWYgKCRwYXRoRXhpc3RzIC1lcSAkZmFsc2UpDQoJCQkJCQl7DQoJCQkJCQkJTmV3LUl0ZW0gJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUNvbmZpcm06JGlzQ29uZmlybSB8IE91dC1OdWxsDQoNCgkJCQkJCQlpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGggLVBhdGhUeXBlIENvbnRhaW5lcikNCgkJCQkJCQl7DQoJCQkJCQkJCSRhZGRFbXB0eURpcmVjdG9yeXRvRXhwYW5kZWRQYXRoTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BZGRJdGVtdG9BcmNoaXZlRmlsZSAtZiAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgpDQoJCQkJCQkJCVdyaXRlLVZlcmJvc2UgJGFkZEVtcHR5RGlyZWN0b3J5dG9FeHBhbmRlZFBhdGhNZXNzYWdlDQoNCgkJCQkJCQkJJGV4cGFuZGVkSXRlbXMuVmFsdWUgKz0gJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJdHJ5DQoJCQkJCQl7DQoJCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mbyA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5GaWxlSW5mbyAtQXJndW1lbnRMaXN0ICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aA0KCQkJCQkJCSRwYXJlbnREaXJFeGlzdHMgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSAtUGF0aFR5cGUgQ29udGFpbmVyDQoNCgkJCQkJCQkjIElmIHRoZSBQYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IGVudHJ5IGluIHRoZSBhcmNoaXZlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gY3JlYXRlIGl0Lg0KCQkJCQkJCWlmICgkcGFyZW50RGlyRXhpc3RzIC1lcSAkZmFsc2UpDQoJCQkJCQkJew0KCQkJCQkJCQlOZXctSXRlbSAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUgLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIHwgT3V0LU51bGwNCg0KCQkJCQkJCQlpZiAoIShUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSAtUGF0aFR5cGUgQ29udGFpbmVyKSkNCgkJCQkJCQkJew0KCQkJCQkJCQkJIyBUaGUgZGlyZWN0b3J5IHJlZmVycmVkIGJ5ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjcmVhdGVkLg0KCQkJCQkJCQkJIyBUaGlzIGNvdWxkIGJlIGJlY2F1c2UgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAtQ29uZmlybSBwYXJhbXRlciB3aGVuIEV4cGFuZC1BcmNoaXZlIHdhcyBpbnZva2VkDQoJCQkJCQkJCQkjIGFuZCBhdXRob3JpemF0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBjb25maXJtYXRpb24gd2FzIHByb21wdGVkLiBJbiBzdWNoIGEgc2NlbmFyaW8sDQoJCQkJCQkJCQkjIHdlIHNraXAgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgYXJjaGl2ZSBhbmQgY29udGludWUgd2l0aCB0aGUgcmVtYWluaW5nIGFyY2hpdmUgZmlsZSBjb250ZW50cy4NCgkJCQkJCQkJCUNvbnRpbnVlDQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkkZXhwYW5kZWRJdGVtcy5WYWx1ZSArPSAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUNCgkJCQkJCQl9DQoNCgkJCQkJCQkkaGFzTm9uVGVybWluYXRpbmdFcnJvciA9ICRmYWxzZQ0KDQoJCQkJCQkJIyBDaGVjayBpZiB0aGUgZmlsZSBpbiB0byB3aGljaCB0aGUgY3VycmVudCBhcmNoaXZlIGVudHJ5IGNvbnRlbnRzDQoJCQkJCQkJIyB3b3VsZCBiZSBleHBhbmRlZCBhbHJlYWR5IGV4aXN0cy4NCgkJCQkJCQlpZiAoJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5FeGlzdHMpDQoJCQkJCQkJew0KCQkJCQkJCQlpZiAoJGZvcmNlKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQlSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSAtRm9yY2UgLUVycm9yVmFyaWFibGUgZXYgLVZlcmJvc2U6JGlzVmVyYm9zZSAtQ29uZmlybTokaXNDb25maXJtDQoJCQkJCQkJCQlpZiAoJGV2IC1uZSAkbnVsbCkNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQkkaGFzTm9uVGVybWluYXRpbmdFcnJvciA9ICR0cnVlDQoJCQkJCQkJCQl9DQoNCgkJCQkJCQkJCWlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUgLVBhdGhUeXBlIExlYWYpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJIyBUaGUgZmlsZSByZWZlcnJlZCBieSAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuDQoJCQkJCQkJCQkJIyBUaGlzIGNvdWxkIGJlIGJlY2F1c2UgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAtQ29uZmlybSBwYXJhbXRlciB3aGVuIEV4cGFuZC1BcmNoaXZlIHdhcyBpbnZva2VkDQoJCQkJCQkJCQkJIyBhbmQgYXV0aG9yaXphdGlvbiB3YXMgbm90IHByb3ZpZGVkIHdoZW4gY29uZmlybWF0aW9uIHdhcyBwcm9tcHRlZC4gSW4gc3VjaCBhIHNjZW5hcmlvLA0KCQkJCQkJCQkJCSMgd2Ugc2tpcCB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBhcmNoaXZlIGFuZCBjb250aW51ZSB3aXRoIHRoZSByZW1haW5pbmcgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzLg0KCQkJCQkJCQkJCUNvbnRpbnVlDQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQkJZWxzZQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkjIFdyaXRlIG5vbi10ZXJtaW5hdGluZyBlcnJvciB0byB0aGUgcGlwZWxpbmUuDQoJCQkJCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkZpbGVFeGlzdHNFcnJvciAtZiAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lLCAkYXJjaGl2ZUZpbGUsICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUsICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUpDQoJCQkJCQkJCQkkZXJyb3JSZWNvcmQgPSBDcmVhdGVFcnJvclJlY29yZEhlbHBlciAiRXhwYW5kQXJjaGl2ZUZpbGVFeGlzdHMiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkT3BlcmF0aW9uKSAkbnVsbCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lDQoJCQkJCQkJCQlXcml0ZS1FcnJvciAtRXJyb3JSZWNvcmQgJGVycm9yUmVjb3JkDQoJCQkJCQkJCQkkaGFzTm9uVGVybWluYXRpbmdFcnJvciA9ICR0cnVlDQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAoISRoYXNOb25UZXJtaW5hdGluZ0Vycm9yKQ0KCQkJCQkJCXsNCgkJCQkJCQkJW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBGaWxlRXh0ZW5zaW9uc106OkV4dHJhY3RUb0ZpbGUoJGN1cnJlbnRBcmNoaXZlRW50cnksICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCwgJGZhbHNlKQ0KDQoJCQkJCQkJCSMgQWRkIHRoZSBleHBhbmRlZCBmaWxlIHBhdGggdG8gdGhlICRleHBhbmRlZEl0ZW1zIGFycmF5LA0KCQkJCQkJCQkjIHRvIGtlZXAgdHJhY2sgb2YgYWxsIHRoZSBleHBhbmRlZCBmaWxlcyBjcmVhdGVkIHdoaWxlIGV4cGFuZGluZyB0aGUgYXJjaGl2ZSBmaWxlLg0KCQkJCQkJCQkjIElmIHVzZXIgZW50ZXJzIENUUkwgKyBDIHRoZW4gYXQgdGhhdCBwb2ludCBvZiB0aW1lLCBhbGwgdGhlc2UgZXhwYW5kZWQgZmlsZXMNCgkJCQkJCQkJIyB3b3VsZCBiZSBkZWxldGVkIGFzIHBhcnQgb2YgdGhlIGNsZWFuIHVwIHByb2Nlc3MuDQoJCQkJCQkJCSRleHBhbmRlZEl0ZW1zLlZhbHVlICs9ICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aA0KDQoJCQkJCQkJCSRhZGRGaWxldG9FeHBhbmRlZFBhdGhNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkNyZWF0ZUZpbGVBdEV4cGFuZGVkUGF0aCAtZiAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgpDQoJCQkJCQkJCVdyaXRlLVZlcmJvc2UgJGFkZEZpbGV0b0V4cGFuZGVkUGF0aE1lc3NhZ2UNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQlmaW5hbGx5DQoJCQkJCQl7DQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkZGVzdFN0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRkZXN0U3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCg0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJHNyY1N0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRzcmNTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJJGN1cnJlbnRFbnRyeUNvdW50ICs9IDENCgkJCQkJIyAkY3VycmVudFNlZ21lbnRXZWlnaHQgaXMgU2V0IHRvIDEwMCBnaXZpbmcgZXF1YWwgd2VpZ2h0YWdlIHRvIGVhY2ggZmlsZSB0aGF0IGlzIGdldHRpbmcgZXhwYW5kZWQuDQoJCQkJCSMgJHByZXZpb3VzU2VnbWVudFdlaWdodCBpcyBzZXQgdG8gMCBhcyB0aGVyZSBhcmUgbm8gcHJpb3Igc2VnbWVudHMuDQoJCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoJCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMA0KCQkJCQlQcm9ncmVzc0JhckhlbHBlciAiRXhwYW5kLUFyY2hpdmUiICRwcm9ncmVzc0JhclN0YXR1cyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodCAkemlwQXJjaGl2ZS5FbnRyaWVzLkNvdW50ICAkY3VycmVudEVudHJ5Q291bnQNCgkJCQl9DQoJCQl9DQoJCQlmaW5hbGx5DQoJCQl7DQoJCQkJSWYgKCRudWxsIC1uZSAkemlwQXJjaGl2ZSkNCgkJCQl7DQoJCQkJCSR6aXBBcmNoaXZlLkRpc3Bvc2UoKQ0KCQkJCX0NCg0KCQkJCUlmICgkbnVsbCAtbmUgJGFyY2hpdmVGaWxlU3RyZWFtKQ0KCQkJCXsNCgkJCQkJJGFyY2hpdmVGaWxlU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCX0NCg0KCQkJCSMgQ29tcGxldGUgd3JpdGluZyBwcm9ncmVzcy4NCgkJCQlXcml0ZS1Qcm9ncmVzcyAtQWN0aXZpdHkgIkV4cGFuZC1BcmNoaXZlIiAtQ29tcGxldGVkDQoJCQl9DQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFByb2dyZXNzQmFySGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gZGlzcGxheSBwcm9ncmVzcyBtZXNzYWdlLg0KIyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYm90aCBDb21wcmVzcy1BcmNoaXZlICYgRXhwYW5kLUFyY2hpdmUgdG8gZGlzcGxheSBhcmNoaXZlIGZpbGUNCiMgY3JlYXRpb24vZXhwYW5zaW9uIHByb2dyZXNzLg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIFByb2dyZXNzQmFySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkY21kbGV0TmFtZSwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJHN0YXR1cywNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2ludF0NCgkJCQkkdG90YWxOdW1iZXJvZkVudHJpZXMsDQoNCgkJCQlbaW50XQ0KCQkJCSRjdXJyZW50RW50cnlDb3VudA0KCQkJKQ0KDQoJCQlpZiAoJGN1cnJlbnRFbnRyeUNvdW50IC1ndCAwIC1hbmQNCgkJCQkkdG90YWxOdW1iZXJvZkVudHJpZXMgLWd0IDAgLWFuZA0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgLWdlIDAgLWFuZA0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCAtZ3QgMCkNCgkJCXsNCgkJCQkkZW50cnlEZWZhdWx0V2VpZ2h0ID0gJGN1cnJlbnRTZWdtZW50V2VpZ2h0L1tkb3VibGVdJHRvdGFsTnVtYmVyb2ZFbnRyaWVzDQoNCgkJCQkkcGVyY2VudENvbXBsZXRlID0gJHByZXZpb3VzU2VnbWVudFdlaWdodCArICgkZW50cnlEZWZhdWx0V2VpZ2h0ICogJGN1cnJlbnRFbnRyeUNvdW50KQ0KCQkJCVdyaXRlLVByb2dyZXNzIC1BY3Rpdml0eSAkY21kbGV0TmFtZSAtU3RhdHVzICRzdGF0dXMgLVBlcmNlbnRDb21wbGV0ZSAkcGVyY2VudENvbXBsZXRlDQoJCQl9DQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIENTVkhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGFwcGVuZCBjb21tYSBhZnRlciBlYWNoIHBhdGggc3BlY2lmaWQgYnkNCiMgdGhlIFNvdXJjZVBhdGggYXJyYXkuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGlzcGxheSBhbGwgdGhlIHVzZXIgc3VwcGxpZWQgcGF0aHMNCiMgaW4gdGhlIFdoYXRJZiBtZXNzYWdlLg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIENTVkhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkc291cmNlUGF0aA0KCQkJKQ0KDQoJCQkjIFNvdXJjZVBhdGggaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlIGNhbGxpbmcgZnVuY2F0aW9uLg0KCQkJaWYgKCRzb3VyY2VQYXRoLkNvdW50IC1ndCAxKQ0KCQkJew0KCQkJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgPSAiYG4iDQoJCQkJZm9yICgkY3VycmVudEluZGV4ID0gMDsgJGN1cnJlbnRJbmRleCAtbHQgJHNvdXJjZVBhdGguQ291bnQ7ICRjdXJyZW50SW5kZXgrKykNCgkJCQl7DQoJCQkJCWlmICgkY3VycmVudEluZGV4IC1lcSAkc291cmNlUGF0aC5Db3VudCAtIDEpDQoJCQkJCXsNCgkJCQkJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgKz0gJHNvdXJjZVBhdGhbJGN1cnJlbnRJbmRleF0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgKz0gJHNvdXJjZVBhdGhbJGN1cnJlbnRJbmRleF0gKyAiYG4iDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCA9ICRzb3VyY2VQYXRoDQoJCQl9DQoNCgkJCXJldHVybiAkc291cmNlUGF0aEluQ3N2Rm9ybWF0DQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFRocm93VGVybWluYXRpbmdFcnJvckhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHRocm93IHRlcm1pbmF0aW5nIGVycm9yLg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIFRocm93VGVybWluYXRpbmdFcnJvckhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9ySWQsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRlcnJvck1lc3NhZ2UsDQoNCgkJCQlbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XQ0KCQkJCSRlcnJvckNhdGVnb3J5LA0KDQoJCQkJW29iamVjdF0NCgkJCQkkdGFyZ2V0T2JqZWN0LA0KDQoJCQkJW0V4Y2VwdGlvbl0NCgkJCQkkaW5uZXJFeGNlcHRpb24NCgkJCSkNCg0KCQkJaWYgKCRpbm5lckV4Y2VwdGlvbiAtZXEgJG51bGwpDQoJCQl7DQoJCQkJJGV4Y2VwdGlvbiA9IE5ldy1vYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZSwgJGlubmVyRXhjZXB0aW9uDQoJCQl9DQoNCgkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlDQoJCQkkZXJyb3JSZWNvcmQgPSBOZXctT2JqZWN0IFN5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JSZWNvcmQgJGV4Y2VwdGlvbiwgJGVycm9ySWQsICRlcnJvckNhdGVnb3J5LCAkdGFyZ2V0T2JqZWN0DQoJCQkkUFNDbWRsZXQuVGhyb3dUZXJtaW5hdGluZ0Vycm9yKCRlcnJvclJlY29yZCkNCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYW4gRXJyb3JSZWNvcmQNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBDcmVhdGVFcnJvclJlY29yZEhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9ySWQsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRlcnJvck1lc3NhZ2UsDQoNCgkJCQlbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XQ0KCQkJCSRlcnJvckNhdGVnb3J5LA0KDQoJCQkJW0V4Y2VwdGlvbl0NCgkJCQkkZXhjZXB0aW9uLA0KDQoJCQkJW29iamVjdF0NCgkJCQkkdGFyZ2V0T2JqZWN0DQoJCQkpDQoNCgkJCWlmICgkbnVsbCAtZXEgJGV4Y2VwdGlvbikNCgkJCXsNCgkJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZQ0KCQkJfQ0KDQoJCQkkZXJyb3JSZWNvcmQgPSBOZXctT2JqZWN0IFN5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JSZWNvcmQgJGV4Y2VwdGlvbiwgJGVycm9ySWQsICRlcnJvckNhdGVnb3J5LCAkdGFyZ2V0T2JqZWN0DQoJCQlyZXR1cm4gJGVycm9yUmVjb3JkDQoJCX0NCgkJI2VuZHJlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KDQoJCSRpbnB1dFBhdGhzID0gQCgpDQoJCSRkZXN0aW5hdGlvblBhcmVudERpciA9IFtzeXN0ZW0uSU8uUGF0aF06OkdldERpcmVjdG9yeU5hbWUoJERlc3RpbmF0aW9uUGF0aCkNCgkJaWYgKCRudWxsIC1lcSAkZGVzdGluYXRpb25QYXJlbnREaXIpDQoJCXsNCgkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZERlc3RpbmF0aW9uUGF0aCAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJJbnZhbGlkQXJjaGl2ZUZpbGVQYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkRGVzdGluYXRpb25QYXRoDQoJCX0NCg0KCQlpZiAoJGRlc3RpbmF0aW9uUGFyZW50RGlyIC1lcSBbc3RyaW5nXTo6RW1wdHkpDQoJCXsNCgkJCSRkZXN0aW5hdGlvblBhcmVudERpciA9ICcuJw0KCQl9DQoNCgkJJGFjaGl2ZUZpbGVOYW1lID0gW3N5c3RlbS5JTy5QYXRoXTo6R2V0RmlsZU5hbWUoJERlc3RpbmF0aW9uUGF0aCkNCgkJJGRlc3RpbmF0aW9uUGFyZW50RGlyID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICRkZXN0aW5hdGlvblBhcmVudERpciAkZmFsc2UgJFBTQ21kbGV0DQoNCgkJaWYgKCRkZXN0aW5hdGlvblBhcmVudERpci5Db3VudCAtZ3QgMSkNCgkJew0KCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5JbnZhbGlkQXJjaGl2ZUZpbGVQYXRoRXJyb3IgLWYgJERlc3RpbmF0aW9uUGF0aCwgIkRlc3RpbmF0aW9uUGF0aCIsICJEZXN0aW5hdGlvblBhdGgiKQ0KCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJJbnZhbGlkQXJjaGl2ZUZpbGVQYXRoIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkRGVzdGluYXRpb25QYXRoDQoJCX0NCg0KCQlJc1ZhbGlkRmlsZVN5c3RlbVBhdGggJGRlc3RpbmF0aW9uUGFyZW50RGlyIHwgT3V0LU51bGwNCgkJJERlc3RpbmF0aW9uUGF0aCA9IEpvaW4tUGF0aCAtUGF0aCAkZGVzdGluYXRpb25QYXJlbnREaXIgLUNoaWxkUGF0aCAkYWNoaXZlRmlsZU5hbWUNCg0KCQkjIEdldEV4dGVuc2lvbiBBUEkgZG9lcyBub3QgdmFsaWRhdGUgZm9yIHRoZSBhY3R1YWwgZXhpc3RhbmNlIG9mIHRoZSBwYXRoLg0KCQkkZXh0ZW5zaW9uID0gW3N5c3RlbS5JTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCREZXN0aW5hdGlvblBhdGgpDQoNCgkJIyBJZiB1c2VyIGRvZXMgbm90IHNwZWNpZnkgLlppcCBleHRlbnNpb24sIHdlIGFwcGVuZCBpdC4NCgkJSWYgKCRleHRlbnNpb24gLWVxIFtzdHJpbmddOjpFbXB0eSkNCgkJew0KCQkJJERlc3RpbmF0aW9uUGF0aFdpdGhPdXRFeHRlbnNpb24gPSAkRGVzdGluYXRpb25QYXRoDQoJCQkkRGVzdGluYXRpb25QYXRoID0gJERlc3RpbmF0aW9uUGF0aFdpdGhPdXRFeHRlbnNpb24gKyAkemlwRmlsZUV4dGVuc2lvbg0KCQkJJGFwcGVuZEFyY2hpdmVGaWxlRXh0ZW5zaW9uTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BcHBlbmRBcmNoaXZlRmlsZUV4dGVuc2lvbk1lc3NhZ2UgLWYgJERlc3RpbmF0aW9uUGF0aFdpdGhPdXRFeHRlbnNpb24sICREZXN0aW5hdGlvblBhdGgpDQoJCQlXcml0ZS1WZXJib3NlICRhcHBlbmRBcmNoaXZlRmlsZUV4dGVuc2lvbk1lc3NhZ2UNCgkJfQ0KCQllbHNlDQoJCXsNCgkJCSMgSW52YWxpZCBmaWxlIGV4dGVuc2lvbiBpcyBzcGVjaWZpZWQgZm9yIHRoZSB6aXAgZmlsZSB0byBiZSBjcmVhdGVkLg0KCQkJaWYgKCRleHRlbnNpb24gLW5lICR6aXBGaWxlRXh0ZW5zaW9uKQ0KCQkJew0KCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZFppcEZpbGVFeHRlbnNpb25FcnJvciAtZiAkZXh0ZW5zaW9uLCAkemlwRmlsZUV4dGVuc2lvbikNCgkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIk5vdFN1cHBvcnRlZEFyY2hpdmVGaWxlRXh0ZW5zaW9uIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkZXh0ZW5zaW9uDQoJCQl9DQoJCX0NCg0KCQkkYXJjaGl2ZUZpbGVFeGlzdCA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJERlc3RpbmF0aW9uUGF0aCAtUGF0aFR5cGUgTGVhZg0KDQoJCWlmICgkYXJjaGl2ZUZpbGVFeGlzdCAtYW5kICgkVXBkYXRlIC1lcSAkZmFsc2UgLWFuZCAkRm9yY2UgLWVxICRmYWxzZSkpDQoJCXsNCgkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuWmlwRmlsZUV4aXN0RXJyb3IgLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiQXJjaGl2ZUZpbGVFeGlzdHMiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICREZXN0aW5hdGlvblBhdGgNCgkJfQ0KDQoJCSMgSWYgYXJjaGl2ZSBmaWxlIGFscmVhZHkgZXhpc3RzIGFuZCBpZiAtVXBkYXRlIGlzIHNwZWNpZmllZCwgdGhlbiB3ZSBjaGVjayB0byBzZWUNCgkJIyBpZiB3ZSBoYXZlIHdyaXRlIGFjY2VzcyBwZXJtaXNzaW9uIHRvIHVwZGF0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLg0KCQlpZiAoJGFyY2hpdmVGaWxlRXhpc3QgLWFuZCAkVXBkYXRlIC1lcSAkdHJ1ZSkNCgkJew0KCQkJJGl0ZW0gPSBHZXQtSXRlbSAtUGF0aCAkRGVzdGluYXRpb25QYXRoDQoJCQlpZiAoJGl0ZW0uQXR0cmlidXRlcy5Ub1N0cmluZygpLkNvbnRhaW5zKCJSZWFkT25seSIpKQ0KCQkJew0KCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuQXJjaGl2ZUZpbGVJc1JlYWRPbmx5IC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJBcmNoaXZlRmlsZUlzUmVhZE9ubHkiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkT3BlcmF0aW9uKSAkRGVzdGluYXRpb25QYXRoDQoJCQl9DQoJCX0NCg0KCQkkaXNXaGF0SWYgPSAkcHNib3VuZHBhcmFtZXRlcnMuQ29udGFpbnNLZXkoIldoYXRJZiIpDQoJCWlmICghJGlzV2hhdElmKQ0KCQl7DQoJCQkkcHJlcGFyaW5nVG9Db21wcmVzc1ZlcmJvc2VNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlByZXBhcmluZ1RvQ29tcHJlc3NWZXJib3NlTWVzc2FnZSkNCgkJCVdyaXRlLVZlcmJvc2UgJHByZXBhcmluZ1RvQ29tcHJlc3NWZXJib3NlTWVzc2FnZQ0KDQoJCQkkcHJvZ3Jlc3NCYXJTdGF0dXMgPSAoJExvY2FsaXplZERhdGEuQ29tcHJlc3NQcm9ncmVzc0JhclRleHQgLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCVByb2dyZXNzQmFySGVscGVyICJDb21wcmVzcy1BcmNoaXZlIiAkcHJvZ3Jlc3NCYXJTdGF0dXMgMCAxMDAgMTAwIDENCgkJfQ0KCX0NCglQUk9DRVNTDQoJew0KCQlpZiAoJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJQYXRoIiAtb3INCgkJCSRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiUGF0aFdpdGhGb3JjZSIgLW9yDQoJCQkkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIlBhdGhXaXRoVXBkYXRlIikNCgkJew0KCQkJJGlucHV0UGF0aHMgKz0gJFBhdGgNCgkJfQ0KDQoJCWlmICgkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoIiAtb3INCgkJCSRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGhXaXRoRm9yY2UiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aFdpdGhVcGRhdGUiKQ0KCQl7DQoJCQkkaW5wdXRQYXRocyArPSAkTGl0ZXJhbFBhdGgNCgkJfQ0KCX0NCglFTkQNCgl7DQoJCSMgSWYgYXJjaGl2ZSBmaWxlIGFscmVhZHkgZXhpc3RzIGFuZCBpZiAtRm9yY2UgaXMgc3BlY2lmaWVkLCB3ZSBkZWxldGUgdGhlDQoJCSMgZXhpc3RpbmcgYXJ0Y2hpdmUgZmlsZSBhbmQgY3JlYXRlIGEgYnJhbmQgbmV3IG9uZS4NCgkJaWYgKCgkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIlBhdGhXaXRoRm9yY2UiIC1vcg0KCQkJCSRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGhXaXRoRm9yY2UiKSAtYW5kICRhcmNoaXZlRmlsZUV4aXN0KQ0KCQl7DQoJCQlSZW1vdmUtSXRlbSAtUGF0aCAkRGVzdGluYXRpb25QYXRoIC1Gb3JjZSAtRXJyb3JBY3Rpb24gU3RvcA0KCQl9DQoNCgkJIyBWYWxpZGF0ZSBTb3VyY2UgUGF0aCBkZXBlZGluZyBvbiBwYXJhbWV0ZXIgc2V0IGJlaW5nIHVzZWQuDQoJCSMgVGhlIHNwZWNpZmllZCBzb3VyY2UgcGF0aCBjb25hdGlucyBvbmUgb3IgbW9yZSBmaWxlcyBvciBkaXJlY3RvcmllcyB0aGF0IG5lZWRzDQoJCSMgdG8gYmUgY29tcHJlc3NlZC4NCgkJJGlzTGl0ZXJhbFBhdGhVc2VkID0gJGZhbHNlDQoJCWlmICgkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAtZXEgIkxpdGVyYWxQYXRoIiAtb3INCgkJCSRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lIC1lcSAiTGl0ZXJhbFBhdGhXaXRoRm9yY2UiIC1vcg0KCQkJJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUgLWVxICJMaXRlcmFsUGF0aFdpdGhVcGRhdGUiKQ0KCQl7DQoJCQkkaXNMaXRlcmFsUGF0aFVzZWQgPSAkdHJ1ZQ0KCQl9DQoNCgkJVmFsaWRhdGVEdXBsaWNhdGVGaWxlU3lzdGVtUGF0aCAkUHNDbWRsZXQuUGFyYW1ldGVyU2V0TmFtZSAkaW5wdXRQYXRocw0KCQkkcmVzb2x2ZWRQYXRocyA9IEdldFJlc29sdmVkUGF0aEhlbHBlciAkaW5wdXRQYXRocyAkaXNMaXRlcmFsUGF0aFVzZWQgJFBTQ21kbGV0DQoJCUlzVmFsaWRGaWxlU3lzdGVtUGF0aCAkcmVzb2x2ZWRQYXRocyB8IE91dC1OdWxsDQoNCgkJJHNvdXJjZVBhdGggPSAkcmVzb2x2ZWRQYXRoczsNCg0KCQkjIENTVkhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGFwcGVuZCBjb21tYSBhZnRlciBlYWNoIHBhdGggc3BlY2lmaWQgYnkNCgkJIyB0aGUgJHNvdXJjZVBhdGggYXJyYXkuIFRoZSBjb21tYSBzYXBlcmF0ZWQgcGF0aHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgLVdoYXRJZiBtZXNzYWdlLg0KCQkkc291cmNlUGF0aEluQ3N2Rm9ybWF0ID0gQ1NWSGVscGVyICRzb3VyY2VQYXRoDQoJCWlmICgkcHNjbWRsZXQuU2hvdWxkUHJvY2Vzcygkc291cmNlUGF0aEluQ3N2Rm9ybWF0KSkNCgkJew0KCQkJdHJ5DQoJCQl7DQoJCQkJIyBTdG9wUHJvY2Vzc2luZyBpcyBub3QgYXZhbGlhYmxlIGluIFNjcmlwdCBjbWRsZXRzLiBIb3dldmVyIHRoZSBwaXBsZWxpbmUgZXhlY3V0aW9uDQoJCQkJIyBpcyB0ZXJtaW5hdGVkIHdoZW4gZXZlciAnQ1RSTCArIEMnIGlzIGVudGVyZWQgYnkgdXNlciB0byB0ZXJtaW5hdGUgdGhlIGNtZGxldCBleGVjdXRpb24uDQoJCQkJIyBUaGUgZmluYWxseSBibG9jayBpcyBleGVjdXRlZCB3aGVuZXZlciBwaXBsZWxpbmUgaXMgdGVybWluYXRlZC4NCgkJCQkjICRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlIHZhcmlhYmxlIGlzIHVzZWQgdG8gdHJhY2sgaWYgJ0NUUkwgKyBDJyBpcyBlbnRlcmVkIGJ5IHRoZQ0KCQkJCSMgdXNlci4NCgkJCQkkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSA9ICRmYWxzZQ0KDQoJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCA9IENvbXByZXNzQXJjaGl2ZUhlbHBlciAkc291cmNlUGF0aCAkRGVzdGluYXRpb25QYXRoICRDb21wcmVzc2lvbkxldmVsICRVcGRhdGUNCg0KCQkJCSRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlID0gJHRydWUNCgkJCX0NCgkJCWZpbmFsbHkNCgkJCXsNCgkJCQkjIFRoZSAkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSB3b3VsZCBiZSBzZXQgdG8gJGZhbHNlIGlmIHVzZXIgaGFzIHR5cGVkICdDVFJMICsgQycgdG8NCgkJCQkjIHRlcm1pbmF0ZSB0aGUgY21kbGV0IGV4ZWN1dGlvbiBvciBpZiBhbiB1bmhhbmRsZWQgZXhjZXB0aW9uIGlzIHRocm93bi4NCgkJCQkjICRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgY29udGFpbnMgdGhlIGNvdW50IG9mIG51bWJlciBvZiBmaWxlcyBvciBkaXJlY3RvcmllcyBhZGQgdG8gdGhlIGFyY2hpdmUgZmlsZS4NCgkJCQkjIElmIHRoZSBuZXdseSBjcmVhdGVkIGFyY2hpdmUgZmlsZSBpcyBlbXB0eSB0aGVuIHdlIGRlbGV0ZSBpdCBhcyBpdHMgbm90IHVzYWJsZS4NCgkJCQlpZiAoKCRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlIC1lcSAkZmFsc2UpIC1vcg0KCQkJCQkoJG51bWJlck9mSXRlbXNBcmNoaXZlZCAtZXEgMCkpDQoJCQkJew0KCQkJCQkkRGVsZXRlQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkRlbGV0ZUFyY2hpdmVGaWxlIC1mICREZXN0aW5hdGlvblBhdGgpDQoJCQkJCVdyaXRlLVZlcmJvc2UgJERlbGV0ZUFyY2hpdmVGaWxlTWVzc2FnZQ0KDQoJCQkJCSMgZGVsZXRlIHRoZSBwYXJ0aWFsIGFyY2hpdmUgZmlsZSBjcmVhdGVkLg0KCQkJCQlpZiAoVGVzdC1QYXRoICREZXN0aW5hdGlvblBhdGgpDQoJCQkJCXsNCgkJCQkJCVJlbW92ZS1JdGVtIC1MaXRlcmFsUGF0aCAkRGVzdGluYXRpb25QYXRoIC1Gb3JjZSAtUmVjdXJzZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBFeHBhbmQtQXJjaGl2ZQ0Kew0KCTwjDQoJCS5TWU5PUFNJUw0KCQkJRXh0cmFjdHMgZmlsZXMgZnJvbSBhIHNwZWNpZmllZCBhcmNoaXZlICh6aXBwZWQpIGZpbGUuDQoNCgkJLkRFU0NSSVBUSU9ODQoJCQlUaGUgRXhwYW5kLUFyY2hpdmUgY21kbGV0IGV4dHJhY3RzIGZpbGVzIGZyb20gYSBzcGVjaWZpZWQgemlwcGVkIGFyY2hpdmUgZmlsZSB0byBhIHNwZWNpZmllZCBkZXN0aW5hdGlvbiBmb2xkZXIuIEFuIGFyY2hpdmUgZmlsZSBhbGxvd3MgbXVsdGlwbGUgZmlsZXMgdG8gYmUgcGFja2FnZWQsIGFuZCBvcHRpb25hbGx5IGNvbXByZXNzZWQsIGludG8gYSBzaW5nbGUgemlwcGVkIGZpbGUgZm9yIGVhc2llciBkaXN0cmlidXRpb24gYW5kIHN0b3JhZ2UuDQoNCgkJLlBBUkFNRVRFUiBQYXRoDQoJCQlTcGVjaWZpZXMgdGhlIHBhdGggdG8gdGhlIGFyY2hpdmUgZmlsZS4NCg0KCQkuUEFSQU1FVEVSIExpdGVyYWxQYXRoDQoJCQlTcGVjaWZpZXMgdGhlIHBhdGggdG8gYW4gYXJjaGl2ZSBmaWxlLiBVbmxpa2UgdGhlIFBhdGggcGFyYW1ldGVyLCB0aGUgdmFsdWUgb2YgTGl0ZXJhbFBhdGggaXMgdXNlZCBleGFjdGx5IGFzIGl0IGlzIHR5cGVkLiBXaWxkY2FyZCBjaGFyYWN0ZXJzIGFyZSBub3Qgc3VwcG9ydGVkLiBJZiB0aGUgcGF0aCBpbmNsdWRlcyBlc2NhcGUgY2hhcmFjdGVycywgZW5jbG9zZSBlYWNoIGVzY2FwZSBjaGFyYWN0ZXIgaW4gc2luZ2xlIHF1b3RhdGlvbiBtYXJrcywgdG8gaW5zdHJ1Y3QgV2luZG93cyBQb3dlclNoZWxsIG5vdCB0byBpbnRlcnByZXQgYW55IGNoYXJhY3RlcnMgYXMgZXNjYXBlIHNlcXVlbmNlcy4NCg0KCQkuUEFSQU1FVEVSIERlc3RpbmF0aW9uUGF0aA0KCQkJU3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBmb2xkZXIgaW4gd2hpY2ggeW91IHdhbnQgdGhlIGNvbW1hbmQgdG8gc2F2ZSBleHRyYWN0ZWQgZmlsZXMuIEVudGVyIHRoZSBwYXRoIHRvIGEgZm9sZGVyLCBidXQgZG8gbm90IHNwZWNpZnkgYSBmaWxlIG5hbWUgb3IgZmlsZSBuYW1lIGV4dGVuc2lvbi4gVGhpcyBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuDQoNCgkJLlBBUkFNRVRFUiBGb3JjZQ0KCQkJRm9yY2VzIHRoZSBjb21tYW5kIHRvIHJ1biB3aXRob3V0IGFza2luZyBmb3IgdXNlciBjb25maXJtYXRpb24uDQoNCgkJLlBBUkFNRVRFUiBDb25maXJtDQoJCQlQcm9tcHRzIHlvdSBmb3IgY29uZmlybWF0aW9uIGJlZm9yZSBydW5uaW5nIHRoZSBjbWRsZXQuDQoNCgkJLlBBUkFNRVRFUiBXaGF0SWYNCgkJCVNob3dzIHdoYXQgd291bGQgaGFwcGVuIGlmIHRoZSBjbWRsZXQgcnVucy4gVGhlIGNtZGxldCBpcyBub3QgcnVuLg0KDQoJCS5FWEFNUExFDQoJCQlFeGFtcGxlIDE6IEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUNCg0KCQkJUFMgQzpcPkV4cGFuZC1BcmNoaXZlIC1MaXRlcmFsUGF0aCBDOlxBcmNoaXZlc1xEcmFmdC5aaXAgLURlc3RpbmF0aW9uUGF0aCBDOlxSZWZlcmVuY2UNCg0KCQkJVGhpcyBjb21tYW5kIGV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhbiBleGlzdGluZyBhcmNoaXZlIGZpbGUsIERyYWZ0LnppcCwgaW50byB0aGUgZm9sZGVyIHNwZWNpZmllZCBieSB0aGUgRGVzdGluYXRpb25QYXRoIHBhcmFtZXRlciwgQzpcUmVmZXJlbmNlLg0KDQoJCS5FWEFNUExFDQoJCQlFeGFtcGxlIDI6IEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIGFuIGFyY2hpdmUgaW4gdGhlIGN1cnJlbnQgZm9sZGVyDQoNCgkJCVBTIEM6XD5FeHBhbmQtQXJjaGl2ZSAtUGF0aCBEcmFmdC5aaXAgLURlc3RpbmF0aW9uUGF0aCBDOlxSZWZlcmVuY2UNCg0KCQkJVGhpcyBjb21tYW5kIGV4dHJhY3RzIHRoZSBjb250ZW50cyBvZiBhbiBleGlzdGluZyBhcmNoaXZlIGZpbGUgaW4gdGhlIGN1cnJlbnQgZm9sZGVyLCBEcmFmdC56aXAsIGludG8gdGhlIGZvbGRlciBzcGVjaWZpZWQgYnkgdGhlIERlc3RpbmF0aW9uUGF0aCBwYXJhbWV0ZXIsIEM6XFJlZmVyZW5jZS4NCgkjPg0KCVtDbWRsZXRCaW5kaW5nKA0KCQkJCSAgIERlZmF1bHRQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGgiLA0KCQkJCSAgIFN1cHBvcnRzU2hvdWxkUHJvY2VzcyA9ICR0cnVlLA0KCQkJCSAgIEhlbHBVcmkgPSAiaHR0cDovL2dvLm1pY3Jvc29mdC5jb20vZndsaW5rLz9MaW5rSUQ9MzkzMjUzIildDQoJcGFyYW0NCgkoDQoJCVtwYXJhbWV0ZXIgKA0KCQkJCQltYW5kYXRvcnkgPSAkdHJ1ZSwNCgkJCQkJUG9zaXRpb24gPSAwLA0KCQkJCQlQYXJhbWV0ZXJTZXROYW1lID0gIlBhdGgiLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZSA9ICR0cnVlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJHRydWUpXQ0KCQlbVmFsaWRhdGVOb3ROdWxsT3JFbXB0eSgpXQ0KCQlbc3RyaW5nXQ0KCQkkUGF0aCwNCg0KCQlbcGFyYW1ldGVyICgNCgkJCQkJbWFuZGF0b3J5ID0gJHRydWUsDQoJCQkJCVBhcmFtZXRlclNldE5hbWUgPSAiTGl0ZXJhbFBhdGgiLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJHRydWUpXQ0KCQlbVmFsaWRhdGVOb3ROdWxsT3JFbXB0eSgpXQ0KCQlbQWxpYXMoIlBTUGF0aCIpXQ0KCQlbc3RyaW5nXQ0KCQkkTGl0ZXJhbFBhdGgsDQoNCgkJW3BhcmFtZXRlciAobWFuZGF0b3J5ID0gJGZhbHNlLA0KCQkJCQlQb3NpdGlvbiA9IDEsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW1ZhbGlkYXRlTm90TnVsbE9yRW1wdHkoKV0NCgkJW3N0cmluZ10NCgkJJERlc3RpbmF0aW9uUGF0aCwNCg0KCQlbcGFyYW1ldGVyIChtYW5kYXRvcnkgPSAkZmFsc2UsDQoJCQkJCVZhbHVlRnJvbVBpcGVsaW5lID0gJGZhbHNlLA0KCQkJCQlWYWx1ZUZyb21QaXBlbGluZUJ5UHJvcGVydHlOYW1lID0gJGZhbHNlKV0NCgkJW3N3aXRjaF0NCgkJJEZvcmNlDQoJKQ0KDQoJQkVHSU4NCgl7DQoJCUFkZC1UeXBlIC1Bc3NlbWJseU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uIC1FcnJvckFjdGlvbiBJZ25vcmUNCgkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24uRmlsZVN5c3RlbSAtRXJyb3JBY3Rpb24gSWdub3JlDQoNCgkJJHppcEZpbGVFeHRlbnNpb24gPSAiLnppcCINCg0KCQkkTG9jYWxpemVkRGF0YSA9IENvbnZlcnRGcm9tLVN0cmluZ0RhdGEgQCcNClBhdGhOb3RGb3VuZEVycm9yPVRoZSBwYXRoICd7MH0nIGVpdGhlciBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSB2YWxpZCBmaWxlIHN5c3RlbSBwYXRoLg0KRXhwYW5kQXJjaGl2ZUluVmFsaWREZXN0aW5hdGlvblBhdGg9VGhlIHBhdGggJ3swfScgaXMgbm90IGEgdmFsaWQgZmlsZSBzeXN0ZW0gZGlyZWN0b3J5IHBhdGguDQpJbnZhbGlkWmlwRmlsZUV4dGVuc2lvbkVycm9yPXswfSBpcyBub3QgYSBzdXBwb3J0ZWQgYXJjaGl2ZSBmaWxlIGZvcm1hdC4gezF9IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCBhcmNoaXZlIGZpbGUgZm9ybWF0Lg0KQXJjaGl2ZUZpbGVJc1JlYWRPbmx5PVRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBhcmNoaXZlIGZpbGUgezB9IGlzIHNldCB0byAnUmVhZE9ubHknIGhlbmNlIGl0IGNhbm5vdCBiZSB1cGRhdGVkLiBJZiB5b3UgaW50ZW5kIHRvIHVwZGF0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlLCByZW1vdmUgdGhlICdSZWFkT25seScgYXR0cmlidXRlIG9uIHRoZSBhcmNoaXZlIGZpbGUgZWxzZSB1c2UgLUZvcmNlIHBhcmFtZXRlciB0byBvdmVycmlkZSBhbmQgY3JlYXRlIGEgbmV3IGFyY2hpdmUgZmlsZS4NClppcEZpbGVFeGlzdEVycm9yPVRoZSBhcmNoaXZlIGZpbGUgezB9IGFscmVhZHkgZXhpc3RzLiBVc2UgdGhlIC1VcGRhdGUgcGFyYW1ldGVyIHRvIHVwZGF0ZSB0aGUgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlIG9yIHVzZSB0aGUgLUZvcmNlIHBhcmFtZXRlciB0byBvdmVyd3JpdGUgdGhlIGV4aXN0aW5nIGFyY2hpdmUgZmlsZS4NCkR1cGxpY2F0ZVBhdGhGb3VuZEVycm9yPVRoZSBpbnB1dCB0byB7MH0gcGFyYW1ldGVyIGNvbnRhaW5zIGEgZHVwbGljYXRlIHBhdGggJ3sxfScuIFByb3ZpZGUgYSB1bmlxdWUgc2V0IG9mIHBhdGhzIGFzIGlucHV0IHRvIHsyfSBwYXJhbWV0ZXIuDQpBcmNoaXZlRmlsZUlzRW1wdHk9VGhlIGFyY2hpdmUgZmlsZSB7MH0gaXMgZW1wdHkuDQpDb21wcmVzc1Byb2dyZXNzQmFyVGV4dD1UaGUgYXJjaGl2ZSBmaWxlICd7MH0nIGNyZWF0aW9uIGlzIGluIHByb2dyZXNzLi4uDQpFeHBhbmRQcm9ncmVzc0JhclRleHQ9VGhlIGFyY2hpdmUgZmlsZSAnezB9JyBleHBhbnNpb24gaXMgaW4gcHJvZ3Jlc3MuLi4NCkFwcGVuZEFyY2hpdmVGaWxlRXh0ZW5zaW9uTWVzc2FnZT1UaGUgYXJjaGl2ZSBmaWxlIHBhdGggJ3swfScgc3VwcGxpZWQgdG8gdGhlIERlc3RpbmF0aW9uUGF0aCBwYXRhbWV0ZXIgZG9lcyBub3QgaW5jbHVkZSAuemlwIGV4dGVuc2lvbi4gSGVuY2UgLnppcCBpcyBhcHBlbmRlZCB0byB0aGUgc3VwcGxpZWQgRGVzdGluYXRpb25QYXRoIHBhdGggYW5kIHRoZSBhcmNoaXZlIGZpbGUgd291bGQgYmUgY3JlYXRlZCBhdCAnezF9Jy4NCkFkZEl0ZW10b0FyY2hpdmVGaWxlPUFkZGluZyAnezB9Jy4NCkNyZWF0ZUZpbGVBdEV4cGFuZGVkUGF0aD1DcmVhdGVkICd7MH0nLg0KSW52YWxpZEFyY2hpdmVGaWxlUGF0aEVycm9yPVRoZSBhcmNoaXZlIGZpbGUgcGF0aCAnezB9JyBzcGVjaWZpZWQgYXMgaW5wdXQgdG8gdGhlIHsxfSBwYXJhbWV0ZXIgaXMgcmVzb2x2aW5nIHRvIG11bHRpcGxlIGZpbGUgc3lzdGVtIHBhdGhzLiBQcm92aWRlIGEgdW5pcXVlIHBhdGggdG8gdGhlIHsyfSBwYXJhbWV0ZXIgd2hlcmUgdGhlIGFyY2hpdmUgZmlsZSBoYXMgdG8gYmUgY3JlYXRlZC4NCkludmFsaWRFeHBhbmRlZERpclBhdGhFcnJvcj1UaGUgZGlyZWN0b3J5IHBhdGggJ3swfScgc3BlY2lmaWVkIGFzIGlucHV0IHRvIHRoZSBEZXN0aW5hdGlvblBhdGggcGFyYW1ldGVyIGlzIHJlc29sdmluZyB0byBtdWx0aXBsZSBmaWxlIHN5c3RlbSBwYXRocy4gUHJvdmlkZSBhIHVuaXF1ZSBwYXRoIHRvIHRoZSBEZXN0aW5hdGlvbiBwYXJhbWV0ZXIgd2hlcmUgdGhlIGFyY2hpdmUgZmlsZSBjb250ZW50cyBoYXZlIHRvIGJlIGV4cGFuZGVkLg0KRmlsZUV4aXN0c0Vycm9yPUZhaWxlZCB0byBjcmVhdGUgZmlsZSAnezB9JyB3aGlsZSBleHBhbmRpbmcgdGhlIGFyY2hpdmUgZmlsZSAnezF9JyBjb250ZW50cyBhcyB0aGUgZmlsZSAnezJ9JyBhbHJlYWR5IGV4aXN0cy4gVXNlIHRoZSAtRm9yY2UgcGFyYW1ldGVyIGlmIHlvdSB3YW50IHRvIG92ZXJ3cml0ZSB0aGUgZXhpc3RpbmcgZGlyZWN0b3J5ICd7M30nIGNvbnRlbnRzIHdoZW4gZXhwYW5kaW5nIHRoZSBhcmNoaXZlIGZpbGUuDQpEZWxldGVBcmNoaXZlRmlsZT1UaGUgcGFydGlhbGx5IGNyZWF0ZWQgYXJjaGl2ZSBmaWxlICd7MH0nIGlzIGRlbGV0ZWQgYXMgaXQgaXMgbm90IHVzYWJsZS4NCkludmFsaWREZXN0aW5hdGlvblBhdGg9VGhlIGRlc3RpbmF0aW9uIHBhdGggJ3swfScgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGFyY2hpdmUgZmlsZSBuYW1lLg0KUHJlcGFyaW5nVG9Db21wcmVzc1ZlcmJvc2VNZXNzYWdlPVByZXBhcmluZyB0byBjb21wcmVzcy4uLg0KUHJlcGFyaW5nVG9FeHBhbmRWZXJib3NlTWVzc2FnZT1QcmVwYXJpbmcgdG8gZXhwYW5kLi4uDQonQA0KDQoJCSNyZWdpb24gVXRpbGl0eSBGdW5jdGlvbnMNCgkJZnVuY3Rpb24gR2V0UmVzb2x2ZWRQYXRoSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRwYXRoLA0KDQoJCQkJW2Jvb2xlYW5dDQoJCQkJJGlzTGl0ZXJhbFBhdGgsDQoNCgkJCQlbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5QU0NtZGxldF0NCgkJCQkkY2FsbGVyUFNDbWRsZXQNCgkJCSkNCg0KCQkJJHJlc29sdmVkUGF0aHMgPSBAKCkNCg0KCQkJIyBudWxsIGFuZCBlbXB0eSBjaGVjayBhcmUgYXJlIGFscmVhZHkgZG9uZSBvbiBQYXRoIHBhcmFtZXRlciBhdCB0aGUgY21kbGV0IGxheWVyLg0KCQkJZm9yZWFjaCAoJGN1cnJlbnRQYXRoIGluICRwYXRoKQ0KCQkJew0KCQkJCXRyeQ0KCQkJCXsNCgkJCQkJaWYgKCRpc0xpdGVyYWxQYXRoKQ0KCQkJCQl7DQoJCQkJCQkkY3VycmVudFJlc29sdmVkUGF0aHMgPSBSZXNvbHZlLVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50UGF0aCAtRXJyb3JBY3Rpb24gU3RvcA0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJJGN1cnJlbnRSZXNvbHZlZFBhdGhzID0gUmVzb2x2ZS1QYXRoIC1QYXRoICRjdXJyZW50UGF0aCAtRXJyb3JBY3Rpb24gU3RvcA0KCQkJCQl9DQoJCQkJfQ0KCQkJCWNhdGNoDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlBhdGhOb3RGb3VuZEVycm9yIC1mICRjdXJyZW50UGF0aCkNCgkJCQkJJGV4Y2VwdGlvbiA9IE5ldy1PYmplY3QgU3lzdGVtLkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24gJGVycm9yTWVzc2FnZSwgJF8uRXhjZXB0aW9uDQoJCQkJCSRlcnJvclJlY29yZCA9IENyZWF0ZUVycm9yUmVjb3JkSGVscGVyICJBcmNoaXZlQ21kbGV0UGF0aE5vdEZvdW5kIiAkbnVsbCAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGV4Y2VwdGlvbiAkY3VycmVudFBhdGgNCgkJCQkJJGNhbGxlclBTQ21kbGV0LlRocm93VGVybWluYXRpbmdFcnJvcigkZXJyb3JSZWNvcmQpDQoJCQkJfQ0KDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRSZXNvbHZlZFBhdGggaW4gJGN1cnJlbnRSZXNvbHZlZFBhdGhzKQ0KCQkJCXsNCgkJCQkJJHJlc29sdmVkUGF0aHMgKz0gJGN1cnJlbnRSZXNvbHZlZFBhdGguUHJvdmlkZXJQYXRoDQoJCQkJfQ0KCQkJfQ0KDQoJCQkkcmVzb2x2ZWRQYXRocw0KCQl9DQoNCgkJZnVuY3Rpb24gQWRkLUNvbXByZXNzaW9uQXNzZW1ibGllcw0KCQl7DQoNCgkJCWlmICgkUFNFZGl0aW9uIC1lcSAiRGVza3RvcCIpDQoJCQl7DQoJCQkJQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSBTeXN0ZW0uSU8uQ29tcHJlc3Npb24NCgkJCQlBZGQtVHlwZSAtQXNzZW1ibHlOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5GaWxlU3lzdGVtDQoJCQl9DQoJCX0NCg0KCQlmdW5jdGlvbiBJc1ZhbGlkRmlsZVN5c3RlbVBhdGgNCgkJew0KCQkJcGFyYW0NCgkJCSgNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHBhdGgNCgkJCSkNCg0KCQkJJHJlc3VsdCA9ICR0cnVlOw0KDQoJCQkjIG51bGwgYW5kIGVtcHR5IGNoZWNrIGFyZSBhcmUgYWxyZWFkeSBkb25lIG9uIFBhdGggcGFyYW1ldGVyIGF0IHRoZSBjbWRsZXQgbGF5ZXIuDQoJCQlmb3JlYWNoICgkY3VycmVudFBhdGggaW4gJHBhdGgpDQoJCQl7DQoJCQkJaWYgKCEoW1N5c3RlbS5JTy5GaWxlXTo6RXhpc3RzKCRjdXJyZW50UGF0aCkgLW9yIFtTeXN0ZW0uSU8uRGlyZWN0b3J5XTo6RXhpc3RzKCRjdXJyZW50UGF0aCkpKQ0KCQkJCXsNCgkJCQkJJGVycm9yTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5QYXRoTm90Rm91bmRFcnJvciAtZiAkY3VycmVudFBhdGgpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiUGF0aE5vdEZvdW5kIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQl9DQoNCgkJCXJldHVybiAkcmVzdWx0Ow0KCQl9DQoNCg0KCQlmdW5jdGlvbiBWYWxpZGF0ZUR1cGxpY2F0ZUZpbGVTeXN0ZW1QYXRoDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkaW5wdXRQYXJhbWV0ZXIsDQoNCgkJCQlbc3RyaW5nW11dDQoJCQkJJHBhdGgNCgkJCSkNCg0KCQkJJHVuaXF1ZUlucHV0UGF0aHMgPSBAKCkNCg0KCQkJIyBudWxsIGFuZCBlbXB0eSBjaGVjayBhcmUgYXJlIGFscmVhZHkgZG9uZSBvbiBQYXRoIHBhcmFtZXRlciBhdCB0aGUgY21kbGV0IGxheWVyLg0KCQkJZm9yZWFjaCAoJGN1cnJlbnRQYXRoIGluICRwYXRoKQ0KCQkJew0KCQkJCSRjdXJyZW50SW5wdXRQYXRoID0gJGN1cnJlbnRQYXRoLlRvVXBwZXIoKQ0KCQkJCWlmICgkdW5pcXVlSW5wdXRQYXRocy5Db250YWlucygkY3VycmVudElucHV0UGF0aCkpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkR1cGxpY2F0ZVBhdGhGb3VuZEVycm9yIC1mICRpbnB1dFBhcmFtZXRlciwgJGN1cnJlbnRQYXRoLCAkaW5wdXRQYXJhbWV0ZXIpDQoJCQkJCVRocm93VGVybWluYXRpbmdFcnJvckhlbHBlciAiRHVwbGljYXRlUGF0aEZvdW5kIiAkZXJyb3JNZXNzYWdlIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6SW52YWxpZEFyZ3VtZW50KSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJJHVuaXF1ZUlucHV0UGF0aHMgKz0gJGN1cnJlbnRJbnB1dFBhdGgNCgkJCQl9DQoJCQl9DQoJCX0NCg0KCQlmdW5jdGlvbiBDb21wcmVzc2lvbkxldmVsTWFwcGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkY29tcHJlc3Npb25MZXZlbA0KCQkJKQ0KDQoJCQkkY29tcHJlc3Npb25MZXZlbEZvcm1hdCA9IFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uQ29tcHJlc3Npb25MZXZlbF06Ok9wdGltYWwNCg0KCQkJIyBDb21wcmVzc2lvbkxldmVsIGZvcm1hdCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBhdCB0aGUgY21kbGV0IGxheWVyLg0KCQkJc3dpdGNoICgkY29tcHJlc3Npb25MZXZlbC5Ub1N0cmluZygpKQ0KCQkJew0KCQkJCSJGYXN0ZXN0Ig0KCQkJCXsNCgkJCQkJJGNvbXByZXNzaW9uTGV2ZWxGb3JtYXQgPSBbU3lzdGVtLklPLkNvbXByZXNzaW9uLkNvbXByZXNzaW9uTGV2ZWxdOjpGYXN0ZXN0DQoJCQkJfQ0KCQkJCSJOb0NvbXByZXNzaW9uIg0KCQkJCXsNCgkJCQkJJGNvbXByZXNzaW9uTGV2ZWxGb3JtYXQgPSBbU3lzdGVtLklPLkNvbXByZXNzaW9uLkNvbXByZXNzaW9uTGV2ZWxdOjpOb0NvbXByZXNzaW9uDQoJCQkJfQ0KCQkJfQ0KDQoJCQlyZXR1cm4gJGNvbXByZXNzaW9uTGV2ZWxGb3JtYXQNCgkJfQ0KDQoJCWZ1bmN0aW9uIENvbXByZXNzQXJjaGl2ZUhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkc291cmNlUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlDQoJCQkpDQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSAwDQoJCQkkc291cmNlRmlsZVBhdGhzID0gQCgpDQoJCQkkc291cmNlRGlyUGF0aHMgPSBAKCkNCg0KCQkJZm9yZWFjaCAoJGN1cnJlbnRQYXRoIGluICRzb3VyY2VQYXRoKQ0KCQkJew0KCQkJCSRyZXN1bHQgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50UGF0aCAtUGF0aFR5cGUgTGVhZg0KCQkJCWlmICgkcmVzdWx0IC1lcSAkdHJ1ZSkNCgkJCQl7DQoJCQkJCSRzb3VyY2VGaWxlUGF0aHMgKz0gJGN1cnJlbnRQYXRoDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRzb3VyY2VEaXJQYXRocyArPSAkY3VycmVudFBhdGgNCgkJCQl9DQoJCQl9DQoNCgkJCSMgVGhlIFNvdXJlIFBhdGggY29udGFpbnMgb25lIG9yIG1vcmUgZGlyZWN0b3J5ICh0aGlzIGRpcmVjdG9yeSBjYW4gaGF2ZSBmaWxlcyB1bmRlciBpdCkgYW5kIG5vIGZpbGVzIHRvIGJlIGNvbXByZXNzZWQuDQoJCQlpZiAoJHNvdXJjZUZpbGVQYXRocy5Db3VudCAtZXEgMCAtYW5kICRzb3VyY2VEaXJQYXRocy5Db3VudCAtZ3QgMCkNCgkJCXsNCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDAvW2RvdWJsZV0kc291cmNlRGlyUGF0aHMuQ291bnQNCgkJCQkkcHJldmlvdXNTZWdtZW50V2VpZ2h0ID0gMA0KCQkJCWZvcmVhY2ggKCRjdXJyZW50U291cmNlRGlyUGF0aCBpbiAkc291cmNlRGlyUGF0aHMpDQoJCQkJew0KCQkJCQkkY291bnQgPSBDb21wcmVzc1NpbmdsZURpckhlbHBlciAkY3VycmVudFNvdXJjZURpclBhdGggJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkdHJ1ZSAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gJGNvdW50DQoJCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgKz0gJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJfQ0KCQkJfQ0KDQoJCQkjIFRoZSBTb3VyZSBQYXRoIGNvbnRhaW5zIG9ubHkgZmlsZXMgdG8gYmUgY29tcHJlc3NlZC4NCgkJCWVsc2VJZiAoJHNvdXJjZUZpbGVQYXRocy5Db3VudCAtZ3QgMCAtYW5kICRzb3VyY2VEaXJQYXRocy5Db3VudCAtZXEgMCkNCgkJCXsNCgkJCQkjICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgaXMgZXF1YWwgdG8gMCBhcyB0aGVyZSBhcmUgbm8gcHJpb3Igc2VnbWVudHMuDQoJCQkJIyAkY3VycmVudFNlZ21lbnRXZWlnaHQgaXMgc2V0IHRvIDEwMCBhcyBhbGwgZmlsZXMgaGF2ZSBlcXVhbCB3ZWlnaHRhZ2UuDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCgkJCQkkY3VycmVudFNlZ21lbnRXZWlnaHQgPSAxMDANCg0KCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBDb21wcmVzc0ZpbGVzSGVscGVyICRzb3VyY2VGaWxlUGF0aHMgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQl9DQoJCQkjIFRoZSBTb3VyZSBQYXRoIGNvbnRhaW5zIG9uZSBvciBtb3JlIGZpbGVzIGFuZCBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyAodGhpcyBkaXJlY3RvcnkgY2FuIGhhdmUgZmlsZXMgdW5kZXIgaXQpIHRvIGJlIGNvbXByZXNzZWQuDQoJCQllbHNlaWYgKCRzb3VyY2VGaWxlUGF0aHMuQ291bnQgLWd0IDAgLWFuZCAkc291cmNlRGlyUGF0aHMuQ291bnQgLWd0IDApDQoJCQl7DQoJCQkJIyBlYWNoIGRpcmVjdG9yeSBpcyBjb25zaWRlcmVkIGFzIGFuIGluZGl2aWR1YWwgc2VnbWVudHMgJiBhbGwgdGhlIGluZGl2aWR1YWwgZmlsZXMgYXJlIGNsdWJlZCBpbiB0byBhIHNlcGFyYXRlIHNnZW1uZXQuDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0ID0gMTAwL1tkb3VibGVdKCRzb3VyY2VEaXJQYXRocy5Db3VudCArIDEpDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCA9IDANCg0KCQkJCWZvcmVhY2ggKCRjdXJyZW50U291cmNlRGlyUGF0aCBpbiAkc291cmNlRGlyUGF0aHMpDQoJCQkJew0KCQkJCQkkY291bnQgPSBDb21wcmVzc1NpbmdsZURpckhlbHBlciAkY3VycmVudFNvdXJjZURpclBhdGggJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkdHJ1ZSAkaXNVcGRhdGVNb2RlICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gJGNvdW50DQoJCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgKz0gJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkJfQ0KDQoJCQkJJGNvdW50ID0gQ29tcHJlc3NGaWxlc0hlbHBlciAkc291cmNlRmlsZVBhdGhzICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJGlzVXBkYXRlTW9kZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgKz0gJGNvdW50DQoJCQl9DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KCQlmdW5jdGlvbiBDb21wcmVzc0ZpbGVzSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ1tdXQ0KCQkJCSRzb3VyY2VGaWxlUGF0aHMsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRkZXN0aW5hdGlvblBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsLA0KDQoJCQkJW2Jvb2xdDQoJCQkJJGlzVXBkYXRlTW9kZSwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkpDQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSBaaXBBcmNoaXZlSGVscGVyICRzb3VyY2VGaWxlUGF0aHMgJGRlc3RpbmF0aW9uUGF0aCAkY29tcHJlc3Npb25MZXZlbCAkaXNVcGRhdGVNb2RlICRudWxsICRwcmV2aW91c1NlZ21lbnRXZWlnaHQgJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoNCgkJCXJldHVybiAkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkDQoJCX0NCg0KCQlmdW5jdGlvbiBDb21wcmVzc1NpbmdsZURpckhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJHNvdXJjZURpclBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRkZXN0aW5hdGlvblBhdGgsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRjb21wcmVzc2lvbkxldmVsLA0KDQoJCQkJW2Jvb2xdDQoJCQkJJHVzZVBhcmVudERpckFzUm9vdCwNCg0KCQkJCVtib29sXQ0KCQkJCSRpc1VwZGF0ZU1vZGUsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQsDQoNCgkJCQlbZG91YmxlXQ0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodA0KCQkJKQ0KDQoJCQlbU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWMuTGlzdFtTeXN0ZW0uU3RyaW5nXV0kc3ViRGlyRmlsZXMgPSBAKCkNCg0KCQkJaWYgKCR1c2VQYXJlbnREaXJBc1Jvb3QpDQoJCQl7DQoJCQkJJHNvdXJjZURpckluZm8gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uRGlyZWN0b3J5SW5mbyAtQXJndW1lbnRMaXN0ICRzb3VyY2VEaXJQYXRoDQoJCQkJJHNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpckluZm8uUGFyZW50LkZ1bGxOYW1lDQoNCgkJCQkjIElmIHRoZSBkaXJlY3RvcnkgaXMgcHJlc2VudCBhdCB0aGUgZHJpdmUgbGV2ZWwgdGhlIERpcmVjdG9yeUluZm8uUGFyZW50IGluY2x1ZGUgJ1wnIGV4YW1wbGU6IEM6XA0KCQkJCSMgT24gdGhlIG90aGVyIGhhbmQgaWYgdGhlIGRpcmVjdG9yeSBleGlzdHMgYXQgYSBkZXBlciBsZXZlbCB0aGVuIERpcmVjdG9yeUluZm8uUGFyZW50DQoJCQkJIyBoYXMganVzdCB0aGUgcGF0aCAod2l0aG91dCBhbiBlbmRpbmcgJ1wnKS4gZXhhbXBsZSBDOlxzb3VyY2UNCgkJCQlpZiAoJHNvdXJjZURpckZ1bGxOYW1lLkxlbmd0aCAtZXEgMykNCgkJCQl7DQoJCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpckZ1bGxOYW1lDQoJCQkJfQ0KCQkJCWVsc2UNCgkJCQl7DQoJCQkJCSRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lID0gJHNvdXJjZURpckZ1bGxOYW1lICsgIlwiDQoJCQkJfQ0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCSRzb3VyY2VEaXJGdWxsTmFtZSA9ICRzb3VyY2VEaXJQYXRoDQoJCQkJJG1vZGlmaWVkU291cmNlRGlyRnVsbE5hbWUgPSAkc291cmNlRGlyRnVsbE5hbWUgKyAiXCINCgkJCX0NCg0KCQkJJGRpckNvbnRlbnRzID0gR2V0LUNoaWxkSXRlbSAtTGl0ZXJhbFBhdGggJHNvdXJjZURpclBhdGggLVJlY3Vyc2UNCgkJCWZvcmVhY2ggKCRjdXJyZW50Q29udGVudCBpbiAkZGlyQ29udGVudHMpDQoJCQl7DQoJCQkJJGlzQ29udGFpbmVyID0gJGN1cnJlbnRDb250ZW50IC1pcyBbU3lzdGVtLklPLkRpcmVjdG9yeUluZm9dDQoJCQkJaWYgKCEkaXNDb250YWluZXIpDQoJCQkJew0KCQkJCQkkc3ViRGlyRmlsZXMuQWRkKCRjdXJyZW50Q29udGVudC5GdWxsTmFtZSkNCgkJCQl9DQoJCQkJZWxzZQ0KCQkJCXsNCgkJCQkJIyBUaGUgY3VycmVudENvbnRlbnQgcG9pbnRzIHRvIGEgZGlyZWN0b3J5Lg0KCQkJCQkjIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBhbiBlbXB0eSBkaXJlY3RvcnksIGlmIHNvIHN1Y2ggYQ0KCQkJCQkjIGRpcmVjdG9yeSBoYXMgdG8gYmUgZXhwbGljdGx5IGFkZGVkIHRvIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJCSMgaWYgdGhlcmUgYXJlIG5vIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdGhlIEdldEZpbGVzKCkgQVBJIHJldHVybnMgYW4gZW1wdHkgYXJyYXkuDQoJCQkJCSRmaWxlcyA9ICRjdXJyZW50Q29udGVudC5HZXRGaWxlcygpDQoJCQkJCWlmICgkZmlsZXMuQ291bnQgLWVxIDApDQoJCQkJCXsNCgkJCQkJCSRzdWJEaXJGaWxlcy5BZGQoJGN1cnJlbnRDb250ZW50LkZ1bGxOYW1lICsgIlwiKQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KDQoJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkID0gWmlwQXJjaGl2ZUhlbHBlciAkc3ViRGlyRmlsZXMuVG9BcnJheSgpICRkZXN0aW5hdGlvblBhdGggJGNvbXByZXNzaW9uTGV2ZWwgJGlzVXBkYXRlTW9kZSAkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodA0KDQoJCQlyZXR1cm4gJG51bWJlck9mSXRlbXNBcmNoaXZlZA0KCQl9DQoNCgkJZnVuY3Rpb24gWmlwQXJjaGl2ZUhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5MaXN0W1N5c3RlbS5TdHJpbmddXQ0KCQkJCSRzb3VyY2VQYXRocywNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGRlc3RpbmF0aW9uUGF0aCwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJGNvbXByZXNzaW9uTGV2ZWwsDQoNCgkJCQlbYm9vbF0NCgkJCQkkaXNVcGRhdGVNb2RlLA0KDQoJCQkJW3N0cmluZ10NCgkJCQkkbW9kaWZpZWRTb3VyY2VEaXJGdWxsTmFtZSwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0DQoJCQkpDQoNCgkJCSRudW1iZXJPZkl0ZW1zQXJjaGl2ZWQgPSAwDQoJCQkkZmlsZU1vZGUgPSBbU3lzdGVtLklPLkZpbGVNb2RlXTo6Q3JlYXRlDQoJCQkkcmVzdWx0ID0gVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkRGVzdGluYXRpb25QYXRoIC1QYXRoVHlwZSBMZWFmDQoJCQlpZiAoJHJlc3VsdCAtZXEgJHRydWUpDQoJCQl7DQoJCQkJJGZpbGVNb2RlID0gW1N5c3RlbS5JTy5GaWxlTW9kZV06Ok9wZW4NCgkJCX0NCg0KCQkJQWRkLUNvbXByZXNzaW9uQXNzZW1ibGllcw0KDQoJCQl0cnkNCgkJCXsNCgkJCQkjIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCB0aGUgYXJjaGl2ZSBmaWxlIGhhcyB3cml0ZSBhY2Nlc3MuDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtQXJncyA9IEAoJGRlc3RpbmF0aW9uUGF0aCwgJGZpbGVNb2RlKQ0KCQkJCSRhcmNoaXZlRmlsZVN0cmVhbSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5GaWxlU3RyZWFtIC1Bcmd1bWVudExpc3QgJGFyY2hpdmVGaWxlU3RyZWFtQXJncw0KDQoJCQkJJHppcEFyY2hpdmVBcmdzID0gQCgkYXJjaGl2ZUZpbGVTdHJlYW0sIFtTeXN0ZW0uSU8uQ29tcHJlc3Npb24uWmlwQXJjaGl2ZU1vZGVdOjpVcGRhdGUsICRmYWxzZSkNCgkJCQkkemlwQXJjaGl2ZSA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBBcmNoaXZlIC1Bcmd1bWVudExpc3QgJHppcEFyY2hpdmVBcmdzDQoNCgkJCQkkY3VycmVudEVudHJ5Q291bnQgPSAwDQoJCQkJJHByb2dyZXNzQmFyU3RhdHVzID0gKCRMb2NhbGl6ZWREYXRhLkNvbXByZXNzUHJvZ3Jlc3NCYXJUZXh0IC1mICRkZXN0aW5hdGlvblBhdGgpDQoJCQkJJGJ1ZmZlclNpemUgPSA0a2INCgkJCQkkYnVmZmVyID0gTmV3LU9iamVjdCBCeXRlW10gJGJ1ZmZlclNpemUNCg0KCQkJCWZvcmVhY2ggKCRjdXJyZW50RmlsZVBhdGggaW4gJHNvdXJjZVBhdGhzKQ0KCQkJCXsNCgkJCQkJaWYgKCRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lIC1uZSAkbnVsbCAtYW5kICRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLkxlbmd0aCAtZ3QgMCkNCgkJCQkJew0KCQkJCQkJJGluZGV4ID0gJGN1cnJlbnRGaWxlUGF0aC5JbmRleE9mKCRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLCBbU3lzdGVtLlN0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkNCgkJCQkJCSRjdXJyZW50RmlsZVBhdGhTdWJTdHJpbmcgPSAkY3VycmVudEZpbGVQYXRoLlN1YnN0cmluZygkaW5kZXgsICRtb2RpZmllZFNvdXJjZURpckZ1bGxOYW1lLkxlbmd0aCkNCgkJCQkJCSRyZWxhdGl2ZUZpbGVQYXRoID0gJGN1cnJlbnRGaWxlUGF0aC5SZXBsYWNlKCRjdXJyZW50RmlsZVBhdGhTdWJTdHJpbmcsICIiKS5UcmltKCkNCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRyZWxhdGl2ZUZpbGVQYXRoID0gW1N5c3RlbS5JTy5QYXRoXTo6R2V0RmlsZU5hbWUoJGN1cnJlbnRGaWxlUGF0aCkNCgkJCQkJfQ0KDQoJCQkJCSMgVXBkYXRlIG1vZGUgaXMgc2VsZWN0ZWQuDQoJCQkJCSMgQ2hlY2sgdG8gc2VlIGlmIGFyY2hpdmUgZmlsZSBhbHJlYWR5IGNvbnRhaW5zIG9uZSBvciBtb3JlIHppcCBmaWxlcyBpbiBpdC4NCgkJCQkJaWYgKCRpc1VwZGF0ZU1vZGUgLWVxICR0cnVlIC1hbmQgJHppcEFyY2hpdmUuRW50cmllcy5Db3VudCAtZ3QgMCkNCgkJCQkJew0KCQkJCQkJJGVudHJ5VG9CZVVwZGF0ZWQgPSAkbnVsbA0KDQoJCQkJCQkjIENoZWNrIGlmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIGluIHRoZSBhcmNoaXZlIGZpbGUuDQoJCQkJCQkjIElmIHNvIHJlcGxhY2UgaXQgd2l0aCBuZXcgZmlsZSBmcm9tIHRoZSBpbnB1dCBzb3VyY2UuDQoJCQkJCQkjIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IGluIHRoZSBhcmNoaXZlIGZpbGUgdGhlbiBkZWZhdWx0IHRvDQoJCQkJCQkjIGNyZWF0ZSBtb2RlIGFuZCBjcmVhdGUgdGhlIGVudHJ5IGluIHRoZSBhcmNoaXZlIGZpbGUuDQoNCgkJCQkJCWZvcmVhY2ggKCRjdXJyZW50QXJjaGl2ZUVudHJ5IGluICR6aXBBcmNoaXZlLkVudHJpZXMpDQoJCQkJCQl7DQoJCQkJCQkJaWYgKCRjdXJyZW50QXJjaGl2ZUVudHJ5LkZ1bGxOYW1lIC1lcSAkcmVsYXRpdmVGaWxlUGF0aCkNCgkJCQkJCQl7DQoJCQkJCQkJCSRlbnRyeVRvQmVVcGRhdGVkID0gJGN1cnJlbnRBcmNoaXZlRW50cnkNCgkJCQkJCQkJYnJlYWsNCgkJCQkJCQl9DQoJCQkJCQl9DQoNCgkJCQkJCWlmICgkZW50cnlUb0JlVXBkYXRlZCAtbmUgJG51bGwpDQoJCQkJCQl7DQoJCQkJCQkJJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BZGRJdGVtdG9BcmNoaXZlRmlsZSAtZiAkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQkJCSRlbnRyeVRvQmVVcGRhdGVkLkRlbGV0ZSgpDQoJCQkJCQl9DQoJCQkJCX0NCg0KCQkJCQkkY29tcHJlc3Npb24gPSBDb21wcmVzc2lvbkxldmVsTWFwcGVyICRjb21wcmVzc2lvbkxldmVsDQoNCgkJCQkJIyBJZiBhIGRpcmVjdG9yeSBuZWVkcyB0byBiZSBhZGRlZCB0byBhbiBhcmNoaXZlIGZpbGUsDQoJCQkJCSMgYnkgY29udmVudGlvbiB0aGUgLk5ldCBBUEkncyBleHBlY3QgdGhlIHBhdGggb2YgdGhlIGRpcmV0Y29yeQ0KCQkJCQkjIHRvIGVuZCB3aXRoICdcJyB0byBkZXRlY3QgdGhlIHBhdGggYXMgYW4gZGlyZWN0b3J5Lg0KCQkJCQlpZiAoISRyZWxhdGl2ZUZpbGVQYXRoLkVuZHNXaXRoKCJcIiwgW1N0cmluZ0NvbXBhcmlzb25dOjpPcmRpbmFsSWdub3JlQ2FzZSkpDQoJCQkJCXsNCgkJCQkJCXRyeQ0KCQkJCQkJew0KCQkJCQkJCXRyeQ0KCQkJCQkJCXsNCgkJCQkJCQkJJGN1cnJlbnRGaWxlU3RyZWFtID0gW1N5c3RlbS5JTy5GaWxlXTo6T3BlbigkY3VycmVudEZpbGVQYXRoLCBbU3lzdGVtLklPLkZpbGVNb2RlXTo6T3BlbiwgW1N5c3RlbS5JTy5GaWxlQWNjZXNzXTo6UmVhZCkNCgkJCQkJCQl9DQoJCQkJCQkJY2F0Y2gNCgkJCQkJCQl7DQoJCQkJCQkJCSMgRmFpbGVkIHRvIGFjY2VzcyB0aGUgZmlsZS4gV3JpdGUgYSBub24gdGVybWluYXRpbmcgZXJyb3IgdG8gdGhlIHBpcGVsaW5lDQoJCQkJCQkJCSMgYW5kIG1vdmUgb24gd2l0aCB0aGUgcmVtYWluaW5nIGZpbGVzLg0KCQkJCQkJCQkkZXhjZXB0aW9uID0gJF8uRXhjZXB0aW9uDQoJCQkJCQkJCWlmICgkbnVsbCAtbmUgJF8uRXhjZXB0aW9uIC1hbmQNCgkJCQkJCQkJCSRudWxsIC1uZSAkXy5FeGNlcHRpb24uSW5uZXJFeGNlcHRpb24pDQoJCQkJCQkJCXsNCgkJCQkJCQkJCSRleGNlcHRpb24gPSAkXy5FeGNlcHRpb24uSW5uZXJFeGNlcHRpb24NCgkJCQkJCQkJfQ0KCQkJCQkJCQkkZXJyb3JSZWNvcmQgPSBDcmVhdGVFcnJvclJlY29yZEhlbHBlciAiQ29tcHJlc3NBcmNoaXZlVW5hdXRob3JpemVkQWNjZXNzRXJyb3IiICRudWxsIChbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XTo6UGVybWlzc2lvbkRlbmllZCkgJGV4Y2VwdGlvbiAkY3VycmVudEZpbGVQYXRoDQoJCQkJCQkJCVdyaXRlLUVycm9yIC1FcnJvclJlY29yZCAkZXJyb3JSZWNvcmQNCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAoJG51bGwgLW5lICRjdXJyZW50RmlsZVN0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRzcmNTdHJlYW0gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5CaW5hcnlSZWFkZXIgJGN1cnJlbnRGaWxlU3RyZWFtDQoNCgkJCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnkgPSAkemlwQXJjaGl2ZS5DcmVhdGVFbnRyeSgkcmVsYXRpdmVGaWxlUGF0aCwgJGNvbXByZXNzaW9uKQ0KDQoJCQkJCQkJCSMgVXBkYXRpbmcgIHRoZSBGaWxlIENyZWF0aW9uIHRpbWUgc28gdGhhdCB0aGUgc2FtZSB0aW1lc3RhbXAgd291bGQgYmUgcmV0YWluZWQgYWZ0ZXIgZXhwYW5kaW5nIHRoZSBjb21wcmVzc2VkIGZpbGUuDQoJCQkJCQkJCSMgQXQgdGhpcyBwb2ludCB3ZSBhcmUgc3VyZSB0aGF0IEdldC1DaGlsZEl0ZW0gd291bGQgc3VjY2VlZC4NCgkJCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnkuTGFzdFdyaXRlVGltZSA9IChHZXQtSXRlbSAtTGl0ZXJhbFBhdGggJGN1cnJlbnRGaWxlUGF0aCkuTGFzdFdyaXRlVGltZQ0KDQoJCQkJCQkJCSRkZXN0U3RyZWFtID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uQmluYXJ5V3JpdGVyICRjdXJyZW50QXJjaGl2ZUVudHJ5Lk9wZW4oKQ0KDQoJCQkJCQkJCXdoaWxlICgkbnVtYmVyT2ZCeXRlc1JlYWQgPSAkc3JjU3RyZWFtLlJlYWQoJGJ1ZmZlciwgMCwgJGJ1ZmZlclNpemUpKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkkZGVzdFN0cmVhbS5Xcml0ZSgkYnVmZmVyLCAwLCAkbnVtYmVyT2ZCeXRlc1JlYWQpDQoJCQkJCQkJCQkkZGVzdFN0cmVhbS5GbHVzaCgpDQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkkbnVtYmVyT2ZJdGVtc0FyY2hpdmVkICs9IDENCgkJCQkJCQkJJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BZGRJdGVtdG9BcmNoaXZlRmlsZSAtZiAkY3VycmVudEZpbGVQYXRoKQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJCWZpbmFsbHkNCgkJCQkJCXsNCgkJCQkJCQlJZiAoJG51bGwgLW5lICRjdXJyZW50RmlsZVN0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRjdXJyZW50RmlsZVN0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkc3JjU3RyZWFtKQ0KCQkJCQkJCXsNCgkJCQkJCQkJJHNyY1N0cmVhbS5EaXNwb3NlKCkNCgkJCQkJCQl9DQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkZGVzdFN0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRkZXN0U3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5ID0gJHppcEFyY2hpdmUuQ3JlYXRlRW50cnkoIiRyZWxhdGl2ZUZpbGVQYXRoIiwgJGNvbXByZXNzaW9uKQ0KCQkJCQkJJG51bWJlck9mSXRlbXNBcmNoaXZlZCArPSAxDQoJCQkJCQkkYWRkSXRlbXRvQXJjaGl2ZUZpbGVNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkFkZEl0ZW10b0FyY2hpdmVGaWxlIC1mICRjdXJyZW50RmlsZVBhdGgpDQoJCQkJCX0NCg0KCQkJCQlpZiAoJG51bGwgLW5lICRhZGRJdGVtdG9BcmNoaXZlRmlsZU1lc3NhZ2UpDQoJCQkJCXsNCgkJCQkJCVdyaXRlLVZlcmJvc2UgJGFkZEl0ZW10b0FyY2hpdmVGaWxlTWVzc2FnZQ0KCQkJCQl9DQoNCgkJCQkJJGN1cnJlbnRFbnRyeUNvdW50ICs9IDENCgkJCQkJUHJvZ3Jlc3NCYXJIZWxwZXIgIkNvbXByZXNzLUFyY2hpdmUiICRwcm9ncmVzc0JhclN0YXR1cyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodCAkc291cmNlUGF0aHMuQ291bnQgICRjdXJyZW50RW50cnlDb3VudA0KCQkJCX0NCgkJCX0NCgkJCWZpbmFsbHkNCgkJCXsNCgkJCQlJZiAoJG51bGwgLW5lICR6aXBBcmNoaXZlKQ0KCQkJCXsNCgkJCQkJJHppcEFyY2hpdmUuRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJSWYgKCRudWxsIC1uZSAkYXJjaGl2ZUZpbGVTdHJlYW0pDQoJCQkJew0KCQkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0uRGlzcG9zZSgpDQoJCQkJfQ0KDQoJCQkJIyBDb21wbGV0ZSB3cml0aW5nIHByb2dyZXNzLg0KCQkJCVdyaXRlLVByb2dyZXNzIC1BY3Rpdml0eSAiQ29tcHJlc3MtQXJjaGl2ZSIgLUNvbXBsZXRlZA0KCQkJfQ0KDQoJCQlyZXR1cm4gJG51bWJlck9mSXRlbXNBcmNoaXZlZA0KCQl9DQoNCjwjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyBWYWxpZGF0ZUFyY2hpdmVQYXRoSGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGFyY2hpdmUgZmlsZQ0KIyBwYXRoICYgaXRzIGZpbGUgZm9ybWF0LiBUaGUgb25seSBzdXBwb3J0ZWQgYXJjaGl2ZSBmaWxlIGZvcm1hdCBpcyAuemlwDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIz4NCgkJZnVuY3Rpb24gVmFsaWRhdGVBcmNoaXZlUGF0aEhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGFyY2hpdmVGaWxlDQoJCQkpDQoNCgkJCWlmIChbU3lzdGVtLklPLkZpbGVdOjpFeGlzdHMoJGFyY2hpdmVGaWxlKSkNCgkJCXsNCgkJCQkkZXh0ZW5zaW9uID0gW3N5c3RlbS5JTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRhcmNoaXZlRmlsZSkNCg0KCQkJCSMgSW52YWxpZCBmaWxlIGV4dGVuc2lvbiBpcyBzcGVjaWZlZCBmb3IgdGhlIHppcCBmaWxlLg0KCQkJCWlmICgkZXh0ZW5zaW9uIC1uZSAkemlwRmlsZUV4dGVuc2lvbikNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZFppcEZpbGVFeHRlbnNpb25FcnJvciAtZiAkZXh0ZW5zaW9uLCAkemlwRmlsZUV4dGVuc2lvbikNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJOb3RTdXBwb3J0ZWRBcmNoaXZlRmlsZUV4dGVuc2lvbiIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGV4dGVuc2lvbg0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLlBhdGhOb3RGb3VuZEVycm9yIC1mICRhcmNoaXZlRmlsZSkNCgkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIlBhdGhOb3RGb3VuZCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJGFyY2hpdmVGaWxlDQoJCQl9DQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIEV4cGFuZEFyY2hpdmVIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBleHBhbmQgdGhlIGFyY2hpdmUgZmlsZSBjb250ZW50cw0KIyB0byB0aGUgc3BlY2lmaWVkIGRpcmVjdG9yeS4NCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBFeHBhbmRBcmNoaXZlSGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkYXJjaGl2ZUZpbGUsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRleHBhbmRlZERpciwNCg0KCQkJCVtyZWZdDQoJCQkJJGV4cGFuZGVkSXRlbXMsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkZm9yY2UsDQoNCgkJCQlbYm9vbGVhbl0NCgkJCQkkaXNWZXJib3NlLA0KDQoJCQkJW2Jvb2xlYW5dDQoJCQkJJGlzQ29uZmlybQ0KCQkJKQ0KDQoJCQlBZGQtQ29tcHJlc3Npb25Bc3NlbWJsaWVzDQoNCgkJCXRyeQ0KCQkJew0KCQkJCSMgVGhlIGV4aXN0YW5jZSBvZiBhcmNoaXZlIGZpbGUgaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYnkgVmFsaWRhdGVBcmNoaXZlUGF0aEhlbHBlcg0KCQkJCSMgYmVmb3JlIGNhbGxpbmcgdGhpcyBoZWxwZXIgZnVuY3Rpb24uDQoJCQkJJGFyY2hpdmVGaWxlU3RyZWFtQXJncyA9IEAoJGFyY2hpdmVGaWxlLCBbU3lzdGVtLklPLkZpbGVNb2RlXTo6T3BlbiwgW1N5c3RlbS5JTy5GaWxlQWNjZXNzXTo6UmVhZCkNCgkJCQkkYXJjaGl2ZUZpbGVTdHJlYW0gPSBOZXctT2JqZWN0IC1UeXBlTmFtZSBTeXN0ZW0uSU8uRmlsZVN0cmVhbSAtQXJndW1lbnRMaXN0ICRhcmNoaXZlRmlsZVN0cmVhbUFyZ3MNCg0KCQkJCSR6aXBBcmNoaXZlQXJncyA9IEAoJGFyY2hpdmVGaWxlU3RyZWFtLCBbU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmVNb2RlXTo6UmVhZCwgJGZhbHNlKQ0KCQkJCSR6aXBBcmNoaXZlID0gTmV3LU9iamVjdCAtVHlwZU5hbWUgU3lzdGVtLklPLkNvbXByZXNzaW9uLlppcEFyY2hpdmUgLUFyZ3VtZW50TGlzdCAkemlwQXJjaGl2ZUFyZ3MNCg0KCQkJCWlmICgkemlwQXJjaGl2ZS5FbnRyaWVzLkNvdW50IC1lcSAwKQ0KCQkJCXsNCgkJCQkJJGFyY2hpdmVGaWxlSXNFbXB0eSA9ICgkTG9jYWxpemVkRGF0YS5BcmNoaXZlRmlsZUlzRW1wdHkgLWYgJGFyY2hpdmVGaWxlKQ0KCQkJCQlXcml0ZS1WZXJib3NlICRhcmNoaXZlRmlsZUlzRW1wdHkNCgkJCQkJcmV0dXJuDQoJCQkJfQ0KDQoJCQkJJGN1cnJlbnRFbnRyeUNvdW50ID0gMA0KCQkJCSRwcm9ncmVzc0JhclN0YXR1cyA9ICgkTG9jYWxpemVkRGF0YS5FeHBhbmRQcm9ncmVzc0JhclRleHQgLWYgJGFyY2hpdmVGaWxlKQ0KDQoJCQkJIyBUaGUgYXJjaGl2ZSBlbnRyaWVzIGNhbiBlaXRoZXIgYmUgZW1wdHkgZGlyZWN0b3JpZXMgb3IgZmlsZXMuDQoJCQkJZm9yZWFjaCAoJGN1cnJlbnRBcmNoaXZlRW50cnkgaW4gJHppcEFyY2hpdmUuRW50cmllcykNCgkJCQl7DQoJCQkJCSRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCA9IEpvaW4tUGF0aCAtUGF0aCAkZXhwYW5kZWREaXIgLUNoaWxkUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeS5GdWxsTmFtZQ0KCQkJCQkkZXh0ZW5zaW9uID0gW3N5c3RlbS5JTy5QYXRoXTo6R2V0RXh0ZW5zaW9uKCRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCkNCg0KCQkJCQkjIFRoZSBjdXJyZW50IGFyY2hpdmUgZW50cnkgaXMgYW4gZW1wdHkgZGlyZWN0b3J5DQoJCQkJCSMgVGhlIEZ1bGxOYW1lIG9mIHRoZSBBcmNoaXZlIEVudHJ5IHJlcHJlc2VudGluZyBhIGRpcmVjdG9yeSB3b3VsZCBlbmQgd2l0aCBhIHRyYWlsaW5nICdcJy4NCgkJCQkJaWYgKCRleHRlbnNpb24gLWVxIFtzdHJpbmddOjpFbXB0eSAtYW5kDQoJCQkJCQkkY3VycmVudEFyY2hpdmVFbnRyeVBhdGguRW5kc1dpdGgoIlwiLCBbU3RyaW5nQ29tcGFyaXNvbl06Ok9yZGluYWxJZ25vcmVDYXNlKSkNCgkJCQkJew0KCQkJCQkJJHBhdGhFeGlzdHMgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aA0KDQoJCQkJCQkjIFRoZSBjdXJyZW50IGFyY2hpdmUgZW50cnkgZXhwZWN0cyBhbiBlbXB0eSBkaXJlY3RvcnkuDQoJCQkJCQkjIENoZWNrIGlmIHRoZSBleGlzdGluZyBkaXJlY3RvcnkgaXMgZW1wdHkuIElmIGl0cyBub3QgZW1wdHkNCgkJCQkJCSMgdGhlbiBpdCBtZWFucyB0aGF0IHVzZXIgaGFzIGFkZGVkIHRoaXMgZGlyZWN0b3J5IGJ5IG90aGVyIG1lYW5zLg0KCQkJCQkJaWYgKCRwYXRoRXhpc3RzIC1lcSAkZmFsc2UpDQoJCQkJCQl7DQoJCQkJCQkJTmV3LUl0ZW0gJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUNvbmZpcm06JGlzQ29uZmlybSB8IE91dC1OdWxsDQoNCgkJCQkJCQlpZiAoVGVzdC1QYXRoIC1MaXRlcmFsUGF0aCAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGggLVBhdGhUeXBlIENvbnRhaW5lcikNCgkJCQkJCQl7DQoJCQkJCQkJCSRhZGRFbXB0eURpcmVjdG9yeXRvRXhwYW5kZWRQYXRoTWVzc2FnZSA9ICgkTG9jYWxpemVkRGF0YS5BZGRJdGVtdG9BcmNoaXZlRmlsZSAtZiAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgpDQoJCQkJCQkJCVdyaXRlLVZlcmJvc2UgJGFkZEVtcHR5RGlyZWN0b3J5dG9FeHBhbmRlZFBhdGhNZXNzYWdlDQoNCgkJCQkJCQkJJGV4cGFuZGVkSXRlbXMuVmFsdWUgKz0gJGN1cnJlbnRBcmNoaXZlRW50cnlQYXRoDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoJCQkJCWVsc2UNCgkJCQkJew0KCQkJCQkJdHJ5DQoJCQkJCQl7DQoJCQkJCQkJJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mbyA9IE5ldy1PYmplY3QgLVR5cGVOYW1lIFN5c3RlbS5JTy5GaWxlSW5mbyAtQXJndW1lbnRMaXN0ICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aA0KCQkJCQkJCSRwYXJlbnREaXJFeGlzdHMgPSBUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSAtUGF0aFR5cGUgQ29udGFpbmVyDQoNCgkJCQkJCQkjIElmIHRoZSBQYXJlbnQgZGlyZWN0b3J5IG9mIHRoZSBjdXJyZW50IGVudHJ5IGluIHRoZSBhcmNoaXZlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4gY3JlYXRlIGl0Lg0KCQkJCQkJCWlmICgkcGFyZW50RGlyRXhpc3RzIC1lcSAkZmFsc2UpDQoJCQkJCQkJew0KCQkJCQkJCQlOZXctSXRlbSAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUgLUl0ZW1UeXBlIERpcmVjdG9yeSAtQ29uZmlybTokaXNDb25maXJtIHwgT3V0LU51bGwNCg0KCQkJCQkJCQlpZiAoIShUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSAtUGF0aFR5cGUgQ29udGFpbmVyKSkNCgkJCQkJCQkJew0KCQkJCQkJCQkJIyBUaGUgZGlyZWN0b3J5IHJlZmVycmVkIGJ5ICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRGlyZWN0b3J5TmFtZSB3YXMgbm90IHN1Y2Nlc3NmdWxseSBjcmVhdGVkLg0KCQkJCQkJCQkJIyBUaGlzIGNvdWxkIGJlIGJlY2F1c2UgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAtQ29uZmlybSBwYXJhbXRlciB3aGVuIEV4cGFuZC1BcmNoaXZlIHdhcyBpbnZva2VkDQoJCQkJCQkJCQkjIGFuZCBhdXRob3JpemF0aW9uIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBjb25maXJtYXRpb24gd2FzIHByb21wdGVkLiBJbiBzdWNoIGEgc2NlbmFyaW8sDQoJCQkJCQkJCQkjIHdlIHNraXAgdGhlIGN1cnJlbnQgZmlsZSBpbiB0aGUgYXJjaGl2ZSBhbmQgY29udGludWUgd2l0aCB0aGUgcmVtYWluaW5nIGFyY2hpdmUgZmlsZSBjb250ZW50cy4NCgkJCQkJCQkJCUNvbnRpbnVlDQoJCQkJCQkJCX0NCg0KCQkJCQkJCQkkZXhwYW5kZWRJdGVtcy5WYWx1ZSArPSAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkRpcmVjdG9yeU5hbWUNCgkJCQkJCQl9DQoNCgkJCQkJCQkkaGFzTm9uVGVybWluYXRpbmdFcnJvciA9ICRmYWxzZQ0KDQoJCQkJCQkJIyBDaGVjayBpZiB0aGUgZmlsZSBpbiB0byB3aGljaCB0aGUgY3VycmVudCBhcmNoaXZlIGVudHJ5IGNvbnRlbnRzDQoJCQkJCQkJIyB3b3VsZCBiZSBleHBhbmRlZCBhbHJlYWR5IGV4aXN0cy4NCgkJCQkJCQlpZiAoJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5FeGlzdHMpDQoJCQkJCQkJew0KCQkJCQkJCQlpZiAoJGZvcmNlKQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQlSZW1vdmUtSXRlbSAtTGl0ZXJhbFBhdGggJGN1cnJlbnRBcmNoaXZlRW50cnlGaWxlSW5mby5GdWxsTmFtZSAtRm9yY2UgLUVycm9yVmFyaWFibGUgZXYgLVZlcmJvc2U6JGlzVmVyYm9zZSAtQ29uZmlybTokaXNDb25maXJtDQoJCQkJCQkJCQlpZiAoJGV2IC1uZSAkbnVsbCkNCgkJCQkJCQkJCXsNCgkJCQkJCQkJCQkkaGFzTm9uVGVybWluYXRpbmdFcnJvciA9ICR0cnVlDQoJCQkJCQkJCQl9DQoNCgkJCQkJCQkJCWlmIChUZXN0LVBhdGggLUxpdGVyYWxQYXRoICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUgLVBhdGhUeXBlIExlYWYpDQoJCQkJCQkJCQl7DQoJCQkJCQkJCQkJIyBUaGUgZmlsZSByZWZlcnJlZCBieSAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lIHdhcyBub3Qgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQuDQoJCQkJCQkJCQkJIyBUaGlzIGNvdWxkIGJlIGJlY2F1c2UgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAtQ29uZmlybSBwYXJhbXRlciB3aGVuIEV4cGFuZC1BcmNoaXZlIHdhcyBpbnZva2VkDQoJCQkJCQkJCQkJIyBhbmQgYXV0aG9yaXphdGlvbiB3YXMgbm90IHByb3ZpZGVkIHdoZW4gY29uZmlybWF0aW9uIHdhcyBwcm9tcHRlZC4gSW4gc3VjaCBhIHNjZW5hcmlvLA0KCQkJCQkJCQkJCSMgd2Ugc2tpcCB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBhcmNoaXZlIGFuZCBjb250aW51ZSB3aXRoIHRoZSByZW1haW5pbmcgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzLg0KCQkJCQkJCQkJCUNvbnRpbnVlDQoJCQkJCQkJCQl9DQoJCQkJCQkJCX0NCgkJCQkJCQkJZWxzZQ0KCQkJCQkJCQl7DQoJCQkJCQkJCQkjIFdyaXRlIG5vbi10ZXJtaW5hdGluZyBlcnJvciB0byB0aGUgcGlwZWxpbmUuDQoJCQkJCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkZpbGVFeGlzdHNFcnJvciAtZiAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lLCAkYXJjaGl2ZUZpbGUsICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUsICRjdXJyZW50QXJjaGl2ZUVudHJ5RmlsZUluZm8uRnVsbE5hbWUpDQoJCQkJCQkJCQkkZXJyb3JSZWNvcmQgPSBDcmVhdGVFcnJvclJlY29yZEhlbHBlciAiRXhwYW5kQXJjaGl2ZUZpbGVFeGlzdHMiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkT3BlcmF0aW9uKSAkbnVsbCAkY3VycmVudEFyY2hpdmVFbnRyeUZpbGVJbmZvLkZ1bGxOYW1lDQoJCQkJCQkJCQlXcml0ZS1FcnJvciAtRXJyb3JSZWNvcmQgJGVycm9yUmVjb3JkDQoJCQkJCQkJCQkkaGFzTm9uVGVybWluYXRpbmdFcnJvciA9ICR0cnVlDQoJCQkJCQkJCX0NCgkJCQkJCQl9DQoNCgkJCQkJCQlpZiAoISRoYXNOb25UZXJtaW5hdGluZ0Vycm9yKQ0KCQkJCQkJCXsNCgkJCQkJCQkJW1N5c3RlbS5JTy5Db21wcmVzc2lvbi5aaXBGaWxlRXh0ZW5zaW9uc106OkV4dHJhY3RUb0ZpbGUoJGN1cnJlbnRBcmNoaXZlRW50cnksICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aCwgJGZhbHNlKQ0KDQoJCQkJCQkJCSMgQWRkIHRoZSBleHBhbmRlZCBmaWxlIHBhdGggdG8gdGhlICRleHBhbmRlZEl0ZW1zIGFycmF5LA0KCQkJCQkJCQkjIHRvIGtlZXAgdHJhY2sgb2YgYWxsIHRoZSBleHBhbmRlZCBmaWxlcyBjcmVhdGVkIHdoaWxlIGV4cGFuZGluZyB0aGUgYXJjaGl2ZSBmaWxlLg0KCQkJCQkJCQkjIElmIHVzZXIgZW50ZXJzIENUUkwgKyBDIHRoZW4gYXQgdGhhdCBwb2ludCBvZiB0aW1lLCBhbGwgdGhlc2UgZXhwYW5kZWQgZmlsZXMNCgkJCQkJCQkJIyB3b3VsZCBiZSBkZWxldGVkIGFzIHBhcnQgb2YgdGhlIGNsZWFuIHVwIHByb2Nlc3MuDQoJCQkJCQkJCSRleHBhbmRlZEl0ZW1zLlZhbHVlICs9ICRjdXJyZW50QXJjaGl2ZUVudHJ5UGF0aA0KDQoJCQkJCQkJCSRhZGRGaWxldG9FeHBhbmRlZFBhdGhNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkNyZWF0ZUZpbGVBdEV4cGFuZGVkUGF0aCAtZiAkY3VycmVudEFyY2hpdmVFbnRyeVBhdGgpDQoJCQkJCQkJCVdyaXRlLVZlcmJvc2UgJGFkZEZpbGV0b0V4cGFuZGVkUGF0aE1lc3NhZ2UNCgkJCQkJCQl9DQoJCQkJCQl9DQoJCQkJCQlmaW5hbGx5DQoJCQkJCQl7DQoJCQkJCQkJSWYgKCRudWxsIC1uZSAkZGVzdFN0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRkZXN0U3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCQkJCX0NCg0KCQkJCQkJCUlmICgkbnVsbCAtbmUgJHNyY1N0cmVhbSkNCgkJCQkJCQl7DQoJCQkJCQkJCSRzcmNTdHJlYW0uRGlzcG9zZSgpDQoJCQkJCQkJfQ0KCQkJCQkJfQ0KCQkJCQl9DQoNCgkJCQkJJGN1cnJlbnRFbnRyeUNvdW50ICs9IDENCgkJCQkJIyAkY3VycmVudFNlZ21lbnRXZWlnaHQgaXMgU2V0IHRvIDEwMCBnaXZpbmcgZXF1YWwgd2VpZ2h0YWdlIHRvIGVhY2ggZmlsZSB0aGF0IGlzIGdldHRpbmcgZXhwYW5kZWQuDQoJCQkJCSMgJHByZXZpb3VzU2VnbWVudFdlaWdodCBpcyBzZXQgdG8gMCBhcyB0aGVyZSBhcmUgbm8gcHJpb3Igc2VnbWVudHMuDQoJCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgPSAwDQoJCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCA9IDEwMA0KCQkJCQlQcm9ncmVzc0JhckhlbHBlciAiRXhwYW5kLUFyY2hpdmUiICRwcm9ncmVzc0JhclN0YXR1cyAkcHJldmlvdXNTZWdtZW50V2VpZ2h0ICRjdXJyZW50U2VnbWVudFdlaWdodCAkemlwQXJjaGl2ZS5FbnRyaWVzLkNvdW50ICAkY3VycmVudEVudHJ5Q291bnQNCgkJCQl9DQoJCQl9DQoJCQlmaW5hbGx5DQoJCQl7DQoJCQkJSWYgKCRudWxsIC1uZSAkemlwQXJjaGl2ZSkNCgkJCQl7DQoJCQkJCSR6aXBBcmNoaXZlLkRpc3Bvc2UoKQ0KCQkJCX0NCg0KCQkJCUlmICgkbnVsbCAtbmUgJGFyY2hpdmVGaWxlU3RyZWFtKQ0KCQkJCXsNCgkJCQkJJGFyY2hpdmVGaWxlU3RyZWFtLkRpc3Bvc2UoKQ0KCQkJCX0NCg0KCQkJCSMgQ29tcGxldGUgd3JpdGluZyBwcm9ncmVzcy4NCgkJCQlXcml0ZS1Qcm9ncmVzcyAtQWN0aXZpdHkgIkV4cGFuZC1BcmNoaXZlIiAtQ29tcGxldGVkDQoJCQl9DQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFByb2dyZXNzQmFySGVscGVyOiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHVzZWQgdG8gZGlzcGxheSBwcm9ncmVzcyBtZXNzYWdlLg0KIyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgYm90aCBDb21wcmVzcy1BcmNoaXZlICYgRXhwYW5kLUFyY2hpdmUgdG8gZGlzcGxheSBhcmNoaXZlIGZpbGUNCiMgY3JlYXRpb24vZXhwYW5zaW9uIHByb2dyZXNzLg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIFByb2dyZXNzQmFySGVscGVyDQoJCXsNCgkJCXBhcmFtDQoJCQkoDQoJCQkJW3N0cmluZ10NCgkJCQkkY21kbGV0TmFtZSwNCg0KCQkJCVtzdHJpbmddDQoJCQkJJHN0YXR1cywNCg0KCQkJCVtkb3VibGVdDQoJCQkJJHByZXZpb3VzU2VnbWVudFdlaWdodCwNCg0KCQkJCVtkb3VibGVdDQoJCQkJJGN1cnJlbnRTZWdtZW50V2VpZ2h0LA0KDQoJCQkJW2ludF0NCgkJCQkkdG90YWxOdW1iZXJvZkVudHJpZXMsDQoNCgkJCQlbaW50XQ0KCQkJCSRjdXJyZW50RW50cnlDb3VudA0KCQkJKQ0KDQoJCQlpZiAoJGN1cnJlbnRFbnRyeUNvdW50IC1ndCAwIC1hbmQNCgkJCQkkdG90YWxOdW1iZXJvZkVudHJpZXMgLWd0IDAgLWFuZA0KCQkJCSRwcmV2aW91c1NlZ21lbnRXZWlnaHQgLWdlIDAgLWFuZA0KCQkJCSRjdXJyZW50U2VnbWVudFdlaWdodCAtZ3QgMCkNCgkJCXsNCgkJCQkkZW50cnlEZWZhdWx0V2VpZ2h0ID0gJGN1cnJlbnRTZWdtZW50V2VpZ2h0L1tkb3VibGVdJHRvdGFsTnVtYmVyb2ZFbnRyaWVzDQoNCgkJCQkkcGVyY2VudENvbXBsZXRlID0gJHByZXZpb3VzU2VnbWVudFdlaWdodCArICgkZW50cnlEZWZhdWx0V2VpZ2h0ICogJGN1cnJlbnRFbnRyeUNvdW50KQ0KCQkJCVdyaXRlLVByb2dyZXNzIC1BY3Rpdml0eSAkY21kbGV0TmFtZSAtU3RhdHVzICRzdGF0dXMgLVBlcmNlbnRDb21wbGV0ZSAkcGVyY2VudENvbXBsZXRlDQoJCQl9DQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIENTVkhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIGFwcGVuZCBjb21tYSBhZnRlciBlYWNoIHBhdGggc3BlY2lmaWQgYnkNCiMgdGhlIFNvdXJjZVBhdGggYXJyYXkuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGlzcGxheSBhbGwgdGhlIHVzZXIgc3VwcGxpZWQgcGF0aHMNCiMgaW4gdGhlIFdoYXRJZiBtZXNzYWdlLg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIENTVkhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmdbXV0NCgkJCQkkc291cmNlUGF0aA0KCQkJKQ0KDQoJCQkjIFNvdXJjZVBhdGggaGFzIGFscmVhZHkgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlIGNhbGxpbmcgZnVuY2F0aW9uLg0KCQkJaWYgKCRzb3VyY2VQYXRoLkNvdW50IC1ndCAxKQ0KCQkJew0KCQkJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgPSAiYG4iDQoJCQkJZm9yICgkY3VycmVudEluZGV4ID0gMDsgJGN1cnJlbnRJbmRleCAtbHQgJHNvdXJjZVBhdGguQ291bnQ7ICRjdXJyZW50SW5kZXgrKykNCgkJCQl7DQoJCQkJCWlmICgkY3VycmVudEluZGV4IC1lcSAkc291cmNlUGF0aC5Db3VudCAtIDEpDQoJCQkJCXsNCgkJCQkJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgKz0gJHNvdXJjZVBhdGhbJGN1cnJlbnRJbmRleF0NCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCSRzb3VyY2VQYXRoSW5Dc3ZGb3JtYXQgKz0gJHNvdXJjZVBhdGhbJGN1cnJlbnRJbmRleF0gKyAiYG4iDQoJCQkJCX0NCgkJCQl9DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJJHNvdXJjZVBhdGhJbkNzdkZvcm1hdCA9ICRzb3VyY2VQYXRoDQoJCQl9DQoNCgkJCXJldHVybiAkc291cmNlUGF0aEluQ3N2Rm9ybWF0DQoJCX0NCg0KPCMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIFRocm93VGVybWluYXRpbmdFcnJvckhlbHBlcjogVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB1c2VkIHRvIHRocm93IHRlcm1pbmF0aW5nIGVycm9yLg0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM+DQoJCWZ1bmN0aW9uIFRocm93VGVybWluYXRpbmdFcnJvckhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9ySWQsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRlcnJvck1lc3NhZ2UsDQoNCgkJCQlbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XQ0KCQkJCSRlcnJvckNhdGVnb3J5LA0KDQoJCQkJW29iamVjdF0NCgkJCQkkdGFyZ2V0T2JqZWN0LA0KDQoJCQkJW0V4Y2VwdGlvbl0NCgkJCQkkaW5uZXJFeGNlcHRpb24NCgkJCSkNCg0KCQkJaWYgKCRpbm5lckV4Y2VwdGlvbiAtZXEgJG51bGwpDQoJCQl7DQoJCQkJJGV4Y2VwdGlvbiA9IE5ldy1vYmplY3QgU3lzdGVtLklPLklPRXhjZXB0aW9uICRlcnJvck1lc3NhZ2UNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZSwgJGlubmVyRXhjZXB0aW9uDQoJCQl9DQoNCgkJCSRleGNlcHRpb24gPSBOZXctT2JqZWN0IFN5c3RlbS5JTy5JT0V4Y2VwdGlvbiAkZXJyb3JNZXNzYWdlDQoJCQkkZXJyb3JSZWNvcmQgPSBOZXctT2JqZWN0IFN5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JSZWNvcmQgJGV4Y2VwdGlvbiwgJGVycm9ySWQsICRlcnJvckNhdGVnb3J5LCAkdGFyZ2V0T2JqZWN0DQoJCQkkUFNDbWRsZXQuVGhyb3dUZXJtaW5hdGluZ0Vycm9yKCRlcnJvclJlY29yZCkNCgkJfQ0KDQo8IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCiMgQ3JlYXRlRXJyb3JSZWNvcmRIZWxwZXI6IFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBjcmVhdGUgYW4gRXJyb3JSZWNvcmQNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjPg0KCQlmdW5jdGlvbiBDcmVhdGVFcnJvclJlY29yZEhlbHBlcg0KCQl7DQoJCQlwYXJhbQ0KCQkJKA0KCQkJCVtzdHJpbmddDQoJCQkJJGVycm9ySWQsDQoNCgkJCQlbc3RyaW5nXQ0KCQkJCSRlcnJvck1lc3NhZ2UsDQoNCgkJCQlbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5FcnJvckNhdGVnb3J5XQ0KCQkJCSRlcnJvckNhdGVnb3J5LA0KDQoJCQkJW0V4Y2VwdGlvbl0NCgkJCQkkZXhjZXB0aW9uLA0KDQoJCQkJW29iamVjdF0NCgkJCQkkdGFyZ2V0T2JqZWN0DQoJCQkpDQoNCgkJCWlmICgkbnVsbCAtZXEgJGV4Y2VwdGlvbikNCgkJCXsNCgkJCQkkZXhjZXB0aW9uID0gTmV3LU9iamVjdCBTeXN0ZW0uSU8uSU9FeGNlcHRpb24gJGVycm9yTWVzc2FnZQ0KCQkJfQ0KDQoJCQkkZXJyb3JSZWNvcmQgPSBOZXctT2JqZWN0IFN5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JSZWNvcmQgJGV4Y2VwdGlvbiwgJGVycm9ySWQsICRlcnJvckNhdGVnb3J5LCAkdGFyZ2V0T2JqZWN0DQoJCQlyZXR1cm4gJGVycm9yUmVjb3JkDQoJCX0NCgkJI2VuZHJlZ2lvbiBVdGlsaXR5IEZ1bmN0aW9ucw0KDQoJCSRpc1ZlcmJvc2UgPSAkcHNib3VuZHBhcmFtZXRlcnMuQ29udGFpbnNLZXkoIlZlcmJvc2UiKQ0KCQkkaXNDb25maXJtID0gJHBzYm91bmRwYXJhbWV0ZXJzLkNvbnRhaW5zS2V5KCJDb25maXJtIikNCg0KCQkkaXNEZXN0aW5hdGlvblBhdGhQcm92aWRlZCA9ICR0cnVlDQoJCWlmICgkRGVzdGluYXRpb25QYXRoIC1lcSBbc3RyaW5nXTo6RW1wdHkpDQoJCXsNCgkJCSRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCA9ICRwd2QNCgkJCSRpc0Rlc3RpbmF0aW9uUGF0aFByb3ZpZGVkID0gJGZhbHNlDQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkkZGVzdGluYXRpb25QYXRoRXhpc3RzID0gVGVzdC1QYXRoIC1QYXRoICREZXN0aW5hdGlvblBhdGggLVBhdGhUeXBlIENvbnRhaW5lcg0KCQkJaWYgKCRkZXN0aW5hdGlvblBhdGhFeGlzdHMpDQoJCQl7DQoJCQkJJHJlc29sdmVkRGVzdGluYXRpb25QYXRoID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICREZXN0aW5hdGlvblBhdGggJGZhbHNlICRQU0NtZGxldA0KCQkJCWlmICgkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGguQ291bnQgLWd0IDEpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWRFeHBhbmRlZERpclBhdGhFcnJvciAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWREZXN0aW5hdGlvblBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICREZXN0aW5hdGlvblBhdGgNCgkJCQl9DQoNCgkJCQkjIEF0IHRoaXMgcG9pbnQgd2UgYXJlIHN1cmUgdGhhdCB0aGUgcHJvdmlkZWQgcGF0aCByZXNvbHZlcyB0byBhIHZhbGlkIHNpbmdsZSBwYXRoLg0KCQkJCSMgQ2FsbGluZyBSZXNvbHZlLVBhdGggYWdhaW4gdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIHByb3ZpZGVyIG5hbWUuDQoJCQkJJHN1cHBsaWVkRGVzdGluYXRpb25QYXRoID0gUmVzb2x2ZS1QYXRoIC1QYXRoICREZXN0aW5hdGlvblBhdGgNCgkJCQlpZiAoJHN1cHBsaWVkRGVzdGluYXRpb25QYXRoLlByb3ZpZGVyLk5hbWUgLW5lICJGaWxlU3lzdGVtIikNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRXhwYW5kQXJjaGl2ZUluVmFsaWREZXN0aW5hdGlvblBhdGggLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJJbnZhbGlkRGlyZWN0b3J5UGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJERlc3RpbmF0aW9uUGF0aA0KCQkJCX0NCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkkY3JlYXRlZEl0ZW0gPSBOZXctSXRlbSAtUGF0aCAkRGVzdGluYXRpb25QYXRoIC1JdGVtVHlwZSBEaXJlY3RvcnkgLUNvbmZpcm06JGlzQ29uZmlybSAtVmVyYm9zZTokaXNWZXJib3NlIC1FcnJvckFjdGlvbiBTdG9wDQoJCQkJaWYgKCRjcmVhdGVkSXRlbSAtbmUgJG51bGwgLWFuZCAkY3JlYXRlZEl0ZW0uUFNQcm92aWRlci5OYW1lIC1uZSAiRmlsZVN5c3RlbSIpDQoJCQkJew0KCQkJCQlSZW1vdmUtSXRlbSAiJERlc3RpbmF0aW9uUGF0aCIgLUZvcmNlIC1SZWN1cnNlIC1FcnJvckFjdGlvbiBTaWxlbnRseUNvbnRpbnVlDQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuRXhwYW5kQXJjaGl2ZUluVmFsaWREZXN0aW5hdGlvblBhdGggLWYgJERlc3RpbmF0aW9uUGF0aCkNCgkJCQkJVGhyb3dUZXJtaW5hdGluZ0Vycm9ySGVscGVyICJJbnZhbGlkRGlyZWN0b3J5UGF0aCIgJGVycm9yTWVzc2FnZSAoW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uRXJyb3JDYXRlZ29yeV06OkludmFsaWRBcmd1bWVudCkgJERlc3RpbmF0aW9uUGF0aA0KCQkJCX0NCg0KCQkJCSRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCA9IEdldFJlc29sdmVkUGF0aEhlbHBlciAkRGVzdGluYXRpb25QYXRoICR0cnVlICRQU0NtZGxldA0KCQkJfQ0KCQl9DQoNCgkJJGlzV2hhdElmID0gJHBzYm91bmRwYXJhbWV0ZXJzLkNvbnRhaW5zS2V5KCJXaGF0SWYiKQ0KCQlpZiAoISRpc1doYXRJZikNCgkJew0KCQkJJHByZXBhcmluZ1RvRXhwYW5kVmVyYm9zZU1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuUHJlcGFyaW5nVG9FeHBhbmRWZXJib3NlTWVzc2FnZSkNCgkJCVdyaXRlLVZlcmJvc2UgJHByZXBhcmluZ1RvRXhwYW5kVmVyYm9zZU1lc3NhZ2UNCg0KCQkJJHByb2dyZXNzQmFyU3RhdHVzID0gKCRMb2NhbGl6ZWREYXRhLkV4cGFuZFByb2dyZXNzQmFyVGV4dCAtZiAkRGVzdGluYXRpb25QYXRoKQ0KCQkJUHJvZ3Jlc3NCYXJIZWxwZXIgIkV4cGFuZC1BcmNoaXZlIiAkcHJvZ3Jlc3NCYXJTdGF0dXMgMCAxMDAgMTAwIDENCgkJfQ0KCX0NCglQUk9DRVNTDQoJew0KCQlzd2l0Y2ggKCRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lKQ0KCQl7DQoJCQkiUGF0aCINCgkJCXsNCgkJCQkkcmVzb2x2ZWRTb3VyY2VQYXRocyA9IEdldFJlc29sdmVkUGF0aEhlbHBlciAkUGF0aCAkZmFsc2UgJFBTQ21kbGV0DQoNCgkJCQlpZiAoJHJlc29sdmVkU291cmNlUGF0aHMuQ291bnQgLWd0IDEpDQoJCQkJew0KCQkJCQkkZXJyb3JNZXNzYWdlID0gKCRMb2NhbGl6ZWREYXRhLkludmFsaWRBcmNoaXZlRmlsZVBhdGhFcnJvciAtZiAkUGF0aCwgJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUsICRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWRBcmNoaXZlRmlsZVBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRQYXRoDQoJCQkJfQ0KCQkJfQ0KCQkJIkxpdGVyYWxQYXRoIg0KCQkJew0KCQkJCSRyZXNvbHZlZFNvdXJjZVBhdGhzID0gR2V0UmVzb2x2ZWRQYXRoSGVscGVyICRMaXRlcmFsUGF0aCAkdHJ1ZSAkUFNDbWRsZXQNCg0KCQkJCWlmICgkcmVzb2x2ZWRTb3VyY2VQYXRocy5Db3VudCAtZ3QgMSkNCgkJCQl7DQoJCQkJCSRlcnJvck1lc3NhZ2UgPSAoJExvY2FsaXplZERhdGEuSW52YWxpZEFyY2hpdmVGaWxlUGF0aEVycm9yIC1mICRMaXRlcmFsUGF0aCwgJFBzQ21kbGV0LlBhcmFtZXRlclNldE5hbWUsICRQc0NtZGxldC5QYXJhbWV0ZXJTZXROYW1lKQ0KCQkJCQlUaHJvd1Rlcm1pbmF0aW5nRXJyb3JIZWxwZXIgIkludmFsaWRBcmNoaXZlRmlsZVBhdGgiICRlcnJvck1lc3NhZ2UgKFtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLkVycm9yQ2F0ZWdvcnldOjpJbnZhbGlkQXJndW1lbnQpICRMaXRlcmFsUGF0aA0KCQkJCX0NCgkJCX0NCgkJfQ0KDQoJCVZhbGlkYXRlQXJjaGl2ZVBhdGhIZWxwZXIgJHJlc29sdmVkU291cmNlUGF0aHMNCg0KCQlpZiAoJHBzY21kbGV0LlNob3VsZFByb2Nlc3MoJHJlc29sdmVkU291cmNlUGF0aHMpKQ0KCQl7DQoJCQkkZXhwYW5kZWRJdGVtcyA9IEAoKQ0KDQoJCQl0cnkNCgkJCXsNCgkJCQkjIFN0b3BQcm9jZXNzaW5nIGlzIG5vdCBhdmFsaWFibGUgaW4gU2NyaXB0IGNtZGxldHMuIEhvd2V2ZXIgdGhlIHBpcGxlbGluZSBleGVjdXRpb24NCgkJCQkjIGlzIHRlcm1pbmF0ZWQgd2hlbiBldmVyICdDVFJMICsgQycgaXMgZW50ZXJlZCBieSB1c2VyIHRvIHRlcm1pbmF0ZSB0aGUgY21kbGV0IGV4ZWN1dGlvbi4NCgkJCQkjIFRoZSBmaW5hbGx5IGJsb2NrIGlzIGV4ZWN1dGVkIHdoZW5ldmVyIHBpcGxlbGluZSBpcyB0ZXJtaW5hdGVkLg0KCQkJCSMgJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgdmFyaWFibGUgaXMgdXNlZCB0byB0cmFjayBpZiAnQ1RSTCArIEMnIGlzIGVudGVyZWQgYnkgdGhlDQoJCQkJIyB1c2VyLg0KCQkJCSRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlID0gJGZhbHNlDQoNCgkJCQkjIFRoZSBVc2VyIGhhcyBub3QgcHJvdmlkZWQgYSBkZXN0aW5hdGlvbiBwYXRoLCBoZW5jZSB3ZSB1c2UgJyRwd2RcQXJjaGl2ZUZpbGVOYW1lJyBhcyB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZQ0KCQkJCSMgYXJjaGl2ZSBmaWxlIGNvbnRlbnRzIHdvdWxkIGJlIGV4cGFuZGVkLiBJZiB0aGUgcGF0aCAnJHB3ZFxBcmNoaXZlRmlsZU5hbWUnIGFscmVhZHkgZXhpc3RzIHRoZW4gd2UgdXNlIHRoZQ0KCQkJCSMgV2luZG93cyBkZWZhdWx0IG1lY2hhbmlzbSBvZiBhcHBlbmRpbmcgYSBjb3VudGVyIHZhbHVlIGF0IHRoZSBlbmQgb2YgdGhlIGRpcmVjdG9yeSBuYW1lIHdoZXJlIHRoZSBjb250ZW50cw0KCQkJCSMgd291bGQgYmUgZXhwYW5kZWQuDQoJCQkJaWYgKCEkaXNEZXN0aW5hdGlvblBhdGhQcm92aWRlZCkNCgkJCQl7DQoJCQkJCSRhcmNoaXZlRmlsZSA9IE5ldy1PYmplY3QgU3lzdGVtLklPLkZpbGVJbmZvICRyZXNvbHZlZFNvdXJjZVBhdGhzDQoJCQkJCSRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCA9IEpvaW4tUGF0aCAtUGF0aCAkcmVzb2x2ZWREZXN0aW5hdGlvblBhdGggLUNoaWxkUGF0aCAkYXJjaGl2ZUZpbGUuQmFzZU5hbWUNCgkJCQkJJGRlc3RpbmF0aW9uUGF0aEV4aXN0cyA9IFRlc3QtUGF0aCAtTGl0ZXJhbFBhdGggJHJlc29sdmVkRGVzdGluYXRpb25QYXRoIC1QYXRoVHlwZSBDb250YWluZXINCg0KCQkJCQlpZiAoISRkZXN0aW5hdGlvblBhdGhFeGlzdHMpDQoJCQkJCXsNCgkJCQkJCU5ldy1JdGVtIC1QYXRoICRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCAtSXRlbVR5cGUgRGlyZWN0b3J5IC1Db25maXJtOiRpc0NvbmZpcm0gLVZlcmJvc2U6JGlzVmVyYm9zZSAtRXJyb3JBY3Rpb24gU3RvcCB8IE91dC1OdWxsDQoJCQkJCX0NCgkJCQl9DQoNCgkJCQlFeHBhbmRBcmNoaXZlSGVscGVyICRyZXNvbHZlZFNvdXJjZVBhdGhzICRyZXNvbHZlZERlc3RpbmF0aW9uUGF0aCAoW3JlZl0kZXhwYW5kZWRJdGVtcykgJEZvcmNlICRpc1ZlcmJvc2UgJGlzQ29uZmlybQ0KDQoJCQkJJGlzQXJjaGl2ZUZpbGVQcm9jZXNzaW5nQ29tcGxldGUgPSAkdHJ1ZQ0KCQkJfQ0KCQkJZmluYWxseQ0KCQkJew0KCQkJCSMgVGhlICRpc0FyY2hpdmVGaWxlUHJvY2Vzc2luZ0NvbXBsZXRlIHdvdWxkIGJlIHNldCB0byAkZmFsc2UgaWYgdXNlciBoYXMgdHlwZWQgJ0NUUkwgKyBDJyB0bw0KCQkJCSMgdGVybWluYXRlIHRoZSBjbWRsZXQgZXhlY3V0aW9uIG9yIGlmIGFuIHVuaGFuZGxlZCBleGNlcHRpb24gaXMgdGhyb3duLg0KCQkJCWlmICgkaXNBcmNoaXZlRmlsZVByb2Nlc3NpbmdDb21wbGV0ZSAtZXEgJGZhbHNlKQ0KCQkJCXsNCgkJCQkJaWYgKCRleHBhbmRlZEl0ZW1zLkNvdW50IC1ndCAwKQ0KCQkJCQl7DQoJCQkJCQkjIGRlbGV0ZSB0aGUgZXhwYW5kZWQgZmlsZS9kaXJlY3RvcnkgYXMgdGhlIGFyY2hpdmUNCgkJCQkJCSMgZmlsZSB3YXMgbm90IGNvbXBsZXRseSBleHBhbmRlZC4NCgkJCQkJCSRleHBhbmRlZEl0ZW1zIHwgRm9yRWFjaC1PYmplY3QgeyBSZW1vdmUtSXRlbSAkXyAtRm9yY2UgLVJlY3Vyc2UgfQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KDQpmdW5jdGlvbiBXcml0ZS1Mb2NhbE1lc3NhZ2UNCnsNCiAgICBbQ21kbGV0QmluZGluZygpXQ0KICAgIFBhcmFtICgNCiAgICAgICAgW3N0cmluZ10kTWVzc2FnZQ0KICAgICkNCg0KICAgIGlmIChUZXN0LVBhdGggZnVuY3Rpb246V3JpdGUtUFNGTWVzc2FnZSkgeyBXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgJE1lc3NhZ2UgfQ0KICAgIGVsc2UgeyBXcml0ZS1Ib3N0ICRNZXNzYWdlIH0NCn0NCiNlbmRyZWdpb24gVXRpbGl0eSBGdW5jdGlvbnMNCg0KdHJ5DQp7DQoJW1N5c3RlbS5OZXQuU2VydmljZVBvaW50TWFuYWdlcl06OlNlY3VyaXR5UHJvdG9jb2wgPSAiVGxzMTIiDQoNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkRvd25sb2FkaW5nIHJlcG9zaXRvcnkgZnJvbSAnJCgkQmFzZVVybCkvYXJjaGl2ZS8kKCRCcmFuY2gpLnppcCciDQoJSW52b2tlLVdlYlJlcXVlc3QgLVVyaSAiJCgkQmFzZVVybCkvYXJjaGl2ZS8kKCRCcmFuY2gpLnppcCIgLVVzZUJhc2ljUGFyc2luZyAtT3V0RmlsZSAiJCgkZW52OlRFTVApXCQoJE1vZHVsZU5hbWUpLnppcCIgLUVycm9yQWN0aW9uIFN0b3ANCgkNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkNyZWF0aW5nIHRlbXBvcmFyeSBwcm9qZWN0IGZvbGRlcjogJyQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSciDQoJJG51bGwgPSBOZXctSXRlbSAtUGF0aCAkZW52OlRFTVAgLU5hbWUgJE1vZHVsZU5hbWUgLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UgLUVycm9yQWN0aW9uIFN0b3ANCgkNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkV4dHJhY3RpbmcgYXJjaGl2ZSB0byAnJCgkZW52OlRFTVApXCQoJE1vZHVsZU5hbWUpJyINCglFeHBhbmQtQXJjaGl2ZSAtUGF0aCAiJCgkZW52OlRFTVApXCQoJE1vZHVsZU5hbWUpLnppcCIgLURlc3RpbmF0aW9uUGF0aCAiJCgkZW52OlRFTVApXCQoJE1vZHVsZU5hbWUpIiAtRXJyb3JBY3Rpb24gU3RvcA0KCQ0KCSRiYXNlUGF0aCA9IEdldC1DaGlsZEl0ZW0gIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKVwqIiB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDENCglpZiAoJFN1YkZvbGRlcikgeyAkYmFzZVBhdGggPSAiJCgkYmFzZVBhdGgpXCQoJFN1YkZvbGRlcikiIH0NCgkNCgkjIE9ubHkgbmVlZGVkIGZvciBQUyB2NSsgYnV0IGRvZXNuJ3QgaHVydCBhbnl3YXkNCgkkbWFuaWZlc3QgPSAiJCgkYmFzZVBhdGgpXCQoJE1vZHVsZU5hbWUpLnBzZDEiDQoJJG1hbmlmZXN0RGF0YSA9IEludm9rZS1FeHByZXNzaW9uIChbU3lzdGVtLklPLkZpbGVdOjpSZWFkQWxsVGV4dCgkbWFuaWZlc3QpKQ0KCSRtb2R1bGVWZXJzaW9uID0gJG1hbmlmZXN0RGF0YS5Nb2R1bGVWZXJzaW9uDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJEb3dubG9hZCBjb25jbHVkZWQ6ICQoJE1vZHVsZU5hbWUpIHwgQnJhbmNoICQoJEJyYW5jaCkgfCBWZXJzaW9uICQoJG1vZHVsZVZlcnNpb24pIg0KCQ0KCSMgRGV0ZXJtaW5lIG91dHB1dCBwYXRoDQoJJHBhdGggPSAiJCgkZW52OlByb2dyYW1GaWxlcylcV2luZG93c1Bvd2VyU2hlbGxcTW9kdWxlc1wkKCRNb2R1bGVOYW1lKSINCglpZiAoJGRvVXNlck1vZGUpIHsgJHBhdGggPSAiJChTcGxpdC1QYXRoICRwcm9maWxlLkN1cnJlbnRVc2VyQWxsSG9zdHMpXE1vZHVsZXNcJCgkTW9kdWxlTmFtZSkiIH0NCglpZiAoJFBTVmVyc2lvblRhYmxlLlBTVmVyc2lvbi5NYWpvciAtZ2UgNSkgeyAkcGF0aCArPSAiXCRtb2R1bGVWZXJzaW9uIiB9DQoJDQoJaWYgKChUZXN0LVBhdGggJHBhdGgpIC1hbmQgKC1ub3QgJEZvcmNlKSkNCgl7DQoJCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiTW9kdWxlIGFscmVhZHkgaW5zdGFsbGVkLCBpbnRlcnJ1cHRpbmcgaW5zdGFsbGF0aW9uIg0KCQlyZXR1cm4NCgl9DQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDcmVhdGluZyBmb2xkZXI6ICQoJHBhdGgpIg0KCSRudWxsID0gTmV3LUl0ZW0gLVBhdGggJHBhdGggLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UgLUVycm9yQWN0aW9uIFN0b3ANCgkNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkNvcHlpbmcgZmlsZXMgdG8gJCgkcGF0aCkiDQoJZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gLVBhdGggJGJhc2VQYXRoKSkNCgl7DQoJCU1vdmUtSXRlbSAtUGF0aCAkZmlsZS5GdWxsTmFtZSAtRGVzdGluYXRpb24gJHBhdGggLUVycm9yQWN0aW9uIFN0b3ANCgl9DQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMiDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSIgLUZvcmNlIC1SZWN1cnNlDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKS56aXAiIC1Gb3JjZQ0KCQ0KCVdyaXRlLUxvY2FsTWVzc2FnZSAtTWVzc2FnZSAiSW5zdGFsbGF0aW9uIG9mIHRoZSBtb2R1bGUgJCgkTW9kdWxlTmFtZSksIEJyYW5jaCAkKCRCcmFuY2gpLCBWZXJzaW9uICQoJG1vZHVsZVZlcnNpb24pIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkhIg0KfQ0KY2F0Y2gNCnsNCglXcml0ZS1Mb2NhbE1lc3NhZ2UgLU1lc3NhZ2UgIkluc3RhbGxhdGlvbiBvZiB0aGUgbW9kdWxlICQoJE1vZHVsZU5hbWUpIGZhaWxlZCEiDQoJDQoJV3JpdGUtTG9jYWxNZXNzYWdlIC1NZXNzYWdlICJDbGVhbmluZyB1cCB0ZW1wb3JhcnkgZmlsZXMiDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKSIgLUZvcmNlIC1SZWN1cnNlDQoJUmVtb3ZlLUl0ZW0gLVBhdGggIiQoJGVudjpURU1QKVwkKCRNb2R1bGVOYW1lKS56aXAiIC1Gb3JjZQ0KCQ0KCXRocm93DQp9AQmOAAAACY8AAAAGkAAAAAtpbnN0YWxsLnBzMQaRAAAAC2luc3RhbGwucHMxCVoAAAAJkwAAAAmUAAAAAUAAAAA8AAAABpUAAADECE1JVCBMaWNlbnNlDQoNCkNvcHlyaWdodCAoYykgw74heWVhciHDviDDvmF1dGhvcsO+DQoNClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkNCm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsDQppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzDQp0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsDQpjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMNCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6DQoNClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbA0KY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4NCg0KVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1INCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLA0KRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFDQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSDQpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLA0KT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUNClNPRlRXQVJFLgEJlgAAAAmXAAAABpgAAAAHTElDRU5TRQaZAAAAB0xJQ0VOU0UJWgAAAAmbAAAACZwAAAABQQAAADwAAAAGnQAAAIIKIyBEZXNjcmlwdGlvbg0KDQpJbnNlcnQgYSB1c2VmdWwgZGVzY3JpcHRpb24gZm9yIHRoZSDDvm5hbWXDviBwcm9qZWN0IGhlcmUuDQoNClJlbWVtYmVyLCBpdCdzIHRoZSBmaXJzdCB0aGluZyBhIHZpc2l0b3Igd2lsbCBzZWUuDQoNCiMgUHJvamVjdCBTZXR1cCBJbnN0cnVjdGlvbnMNCiMjIFdvcmtpbmcgd2l0aCB0aGUgbGF5b3V0DQoNCi0gRG9uJ3QgdG91Y2ggdGhlIHBzbTEgZmlsZQ0KLSBQbGFjZSBmdW5jdGlvbnMgeW91IGV4cG9ydCBpbiBgZnVuY3Rpb25zL2AgKGNhbiBoYXZlIHN1YmZvbGRlcnMpDQotIFBsYWNlIHByaXZhdGUvaW50ZXJuYWwgZnVuY3Rpb25zIGludmlzaWJsZSB0byB0aGUgdXNlciBpbiBgaW50ZXJuYWwvZnVuY3Rpb25zYCAoY2FuIGhhdmUgc3ViZm9sZGVycykNCi0gRG9uJ3QgYWRkIGNvZGUgZGlyZWN0bHkgdG8gdGhlIGBwb3N0aW1wb3J0LnBzMWAgb3IgYHByZWltcG9ydC5wczFgLg0KICBUaG9zZSBmaWxlcyBhcmUgZGVzaWduZWQgdG8gaW1wb3J0IG90aGVyIGZpbGVzIG9ubHkuDQotIFdoZW4gYWRkaW5nIGZpbGVzICYgZm9sZGVycywgbWFrZSBzdXJlIHRoZXkgYXJlIGNvdmVyZWQgYnkgZWl0aGVyIGBwb3N0aW1wb3J0LnBzMWAgb3IgYHByZWltcG9ydC5wczFgLg0KICBUaGlzIGFkZHMgdGhlbSB0byBib3RoIHRoZSBpbXBvcnQgYW5kIHRoZSBidWlsZCBzZXF1ZW5jZS4NCg0KIyMgU2V0dGluZyB1cCBDSS9DRA0KDQo+IFRvIGNyZWF0ZSBhIFBSIHZhbGlkYXRpb24gcGlwZWxpbmUsIHNldCB1cCB0YXNrcyBsaWtlIHRoaXM6DQoNCi0gSW5zdGFsbCBQcmVyZXF1aXNpdGVzIChQb3dlclNoZWxsIFRhc2s7IFZTVFMtUHJlcmVxdWlzaXRlcy5wczEpDQotIFZhbGlkYXRlIChQb3dlclNoZWxsIFRhc2s7IFZTVFMtVmFsaWRhdGUucHMxKQ0KLSBQdWJsaXNoIFRlc3QgUmVzdWx0cyAoUHVibGlzaCBUZXN0IFJlc3VsdHM7IE5Vbml0IGZvcm1hdDsgUnVuIG5vIG1hdHRlciB3aGF0KQ0KDQo+IFRvIGNyZWF0ZSBhIGJ1aWxkL3B1Ymxpc2ggcGlwZWxpbmUsIHNldCB1cCB0YXNrcyBsaWtlIHRoaXM6DQoNCi0gSW5zdGFsbCBQcmVyZXF1aXNpdGVzIChQb3dlclNoZWxsIFRhc2s7IFZTVFMtUHJlcmVxdWlzaXRlcy5wczEpDQotIFZhbGlkYXRlIChQb3dlclNoZWxsIFRhc2s7IFZTVFMtVmFsaWRhdGUucHMxKQ0KLSBCdWlsZCAoUG93ZXJTaGVsbCBUYXNrOyBWU1RTLUJ1aWxkLnBzMSkNCi0gUHVibGlzaCBUZXN0IFJlc3VsdHMgKFB1Ymxpc2ggVGVzdCBSZXN1bHRzOyBOVW5pdCBmb3JtYXQ7IFJ1biBubyBtYXR0ZXIgd2hhdCkNCgEJngAAAAmfAAAABqAAAAAJUkVBRE1FLm1kBqEAAAAJUkVBRE1FLm1kCVoAAAAJowAAAAmkAAAABUQAAAA7U3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5TY3JpcHRCbG9ja1NlcmlhbGl6YXRpb25IZWxwZXIBAAAAClNjcmlwdFRleHQBQgAAAAalAAAAIA0KCQkJR2V0LURhdGUgLUZvcm1hdCAieXl5eSINCgkJAUYAAABEAAAABqYAAAA2DQoJCQlbU3lzdGVtLkd1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoKS5Ub1VwcGVyKCkNCgkJAUgAAABEAAAABqcAAAC0AQ0KCQkJQCcNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiQ3JlYXRpbmcgdGVzdCByZXN1bHQgZm9sZGVyIg0KJG51bGwgPSBOZXctSXRlbSAtUGF0aCAiJFBTU2NyaXB0Um9vdFwuLlwuLiIgLU5hbWUgVGVzdFJlc3VsdHMgLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UNCidADQoJCQFKAAAARAAAAAaoAAAALA0KCQkJW1N5c3RlbS5HdWlkXTo6TmV3R3VpZCgpLlRvU3RyaW5nKCkNCgkJAUwAAABEAAAABqkAAAA2DQoJCQlbU3lzdGVtLkd1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoKS5Ub1VwcGVyKCkNCgkJAU4AAABEAAAABqoAAAA0DQoJCQkoR2V0LU1vZHVsZSBQU0ZyYW1ld29yaykuVmVyc2lvbi5Ub1N0cmluZygpDQoJCQFQAAAARAAAAAarAAAAJg0KCQkJR2V0LURhdGUgLUZvcm1hdCAieXl5eS1NTS1kZCINCgkJAVIAAABEAAAABqwAAAAqDQonJGNvbmZpZy5UZXN0UmVzdWx0LkVuYWJsZWQgPSAkdHJ1ZScNCgkJAVQAAABEAAAABq0AAAA2DQoJCQlbU3lzdGVtLkd1aWRdOjpOZXdHdWlkKCkuVG9TdHJpbmcoKS5Ub1VwcGVyKCkNCgkJAVYAAABEAAAABq4AAAAfIEdldC1EYXRlIC1Gb3JtYXQgJ3l5eXktTU0tZGQnIAFXAAAADAAAAAmvAAAAAgAAAAIAAAABWwAAAAgAAAAJsAAAAAAAAAAAAAAAAVwAAAAIAAAACbAAAAAAAAAAAAAAAAFdAAAADAAAAAmxAAAACgAAAAoAAAABYQAAAAgAAAAJsAAAAAAAAAAAAAAAAWIAAAAIAAAACbAAAAAAAAAAAAAAAAFjAAAADAAAAAmzAAAABgAAAAYAAAABZwAAAAgAAAAJsAAAAAAAAAAAAAAAAWgAAAAIAAAACbAAAAAAAAAAAAAAAAFpAAAADAAAAAm1AAAAAQAAAAEAAAABbQAAAAgAAAAJsAAAAAAAAAAAAAAAAW4AAAAIAAAACbAAAAAAAAAAAAAAAAFvAAAADAAAAAm3AAAACgAAAAoAAAABcwAAAAgAAAAJuAAAAAEAAAABAAAAAXQAAAAIAAAACbAAAAAAAAAAAAAAAAF2AAAACAAAAAmwAAAAAAAAAAAAAAABdwAAAAgAAAAJsAAAAAAAAAAAAAAAAXsAAAAIAAAACbAAAAAAAAAAAAAAAAF8AAAACAAAAAmwAAAAAAAAAAAAAAABfgAAAAgAAAAJugAAAAEAAAABAAAAAX8AAAAIAAAACbAAAAAAAAAAAAAAAAGDAAAACAAAAAmwAAAAAAAAAAAAAAABhAAAAAgAAAAJsAAAAAAAAAAAAAAAAYYAAAAIAAAACbAAAAAAAAAAAAAAAAGHAAAACAAAAAmwAAAAAAAAAAAAAAABiwAAAAgAAAAJsAAAAAAAAAAAAAAAAYwAAAAIAAAACbAAAAAAAAAAAAAAAAGOAAAACAAAAAm8AAAAAQAAAAEAAAABjwAAAAgAAAAJsAAAAAAAAAAAAAAAAZMAAAAIAAAACbAAAAAAAAAAAAAAAAGUAAAACAAAAAmwAAAAAAAAAAAAAAABlgAAAAgAAAAJvgAAAAEAAAABAAAAAZcAAAAIAAAACb8AAAABAAAAAQAAAAGbAAAACAAAAAmwAAAAAAAAAAAAAAABnAAAAAgAAAAJsAAAAAAAAAAAAAAAAZ4AAAAIAAAACcEAAAABAAAAAQAAAAGfAAAACAAAAAmwAAAAAAAAAAAAAAABowAAAAgAAAAJsAAAAAAAAAAAAAAAAaQAAAAIAAAACbAAAAAAAAAAAAAAAAevAAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACcMAAAAJxAAAAA0CEbAAAAAAAAAAB7EAAAAAAQAAABAAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJxQAAAAnGAAAACccAAAAJyAAAAAnJAAAACcoAAAAJywAAAAnMAAAACc0AAAAJzgAAAA0GB7MAAAAAAQAAAAgAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJzwAAAAnQAAAACdEAAAAJ0gAAAAnTAAAACdQAAAANAge1AAAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACdUAAAANAwe3AAAAAAEAAAAQAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACdYAAAAJ1wAAAAnYAAAACdkAAAAJ2gAAAAnbAAAACdwAAAAJ3QAAAAneAAAACd8AAAANBhG4AAAABAAAAAbgAAAABG5hbWUNAxG6AAAABAAAAAbhAAAABG5hbWUNAxG8AAAABAAAAAbiAAAABG5hbWUNAxG+AAAABAAAAAbjAAAABmF1dGhvcg0DEb8AAAAEAAAABuQAAAAEeWVhcg0DEcEAAAAEAAAABuUAAAAEbmFtZQ0DAcMAAAA3AAAACeYAAAAG5wAAAAl3b3JrZmxvd3MG6AAAABEuZ2l0aHViXHdvcmtmbG93cwlaAAAACeoAAAAJ6wAAAAHEAAAAPAAAAAbsAAAA0wUjIFRoZXNlIGFyZSBzdXBwb3J0ZWQgZnVuZGluZyBtb2RlbCBwbGF0Zm9ybXMNCg0KZ2l0aHViOiAjIFJlcGxhY2Ugd2l0aCB1cCB0byA0IEdpdEh1YiBTcG9uc29ycy1lbmFibGVkIHVzZXJuYW1lcyBlLmcuLCBbdXNlcjEsIHVzZXIyXQ0KcGF0cmVvbjogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgUGF0cmVvbiB1c2VybmFtZQ0Kb3Blbl9jb2xsZWN0aXZlOiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBPcGVuIENvbGxlY3RpdmUgdXNlcm5hbWUNCmtvX2ZpOiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBLby1maSB1c2VybmFtZQ0KdGlkZWxpZnQ6ICMgUmVwbGFjZSB3aXRoIGEgc2luZ2xlIFRpZGVsaWZ0IHBsYXRmb3JtLW5hbWUvcGFja2FnZS1uYW1lIGUuZy4sIG5wbS9iYWJlbA0KY29tbXVuaXR5X2JyaWRnZTogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgQ29tbXVuaXR5IEJyaWRnZSBwcm9qZWN0LW5hbWUgZS5nLiwgY2xvdWQtZm91bmRyeQ0KbGliZXJhcGF5OiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBMaWJlcmFwYXkgdXNlcm5hbWUNCmlzc3VlaHVudDogIyBSZXBsYWNlIHdpdGggYSBzaW5nbGUgSXNzdWVIdW50IHVzZXJuYW1lDQpvdGVjaGllOiAjIFJlcGxhY2Ugd2l0aCBhIHNpbmdsZSBPdGVjaGllIHVzZXJuYW1lDQpjdXN0b206ICMgUmVwbGFjZSB3aXRoIHVwIHRvIDQgY3VzdG9tIHNwb25zb3JzaGlwIFVSTHMgZS5nLiwgWydsaW5rMScsICdsaW5rMiddDQoBCe0AAAAJ7gAAAAbvAAAAC0ZVTkRJTkcueW1sBvAAAAATLmdpdGh1YlxGVU5ESU5HLnltbAlaAAAACfIAAAAJ8wAAAAHFAAAANwAAAAn0AAAABvUAAAAMY2xpZW50TW9kdWxlBvYAAAAgYXpGdW5jdGlvblJlc291cmNlc1xjbGllbnRNb2R1bGUJWgAAAAn4AAAACfkAAAABxgAAADcAAAAJ+gAAAAb7AAAAEGZ1bmN0aW9uT3ZlcnJpZGUG/AAAACRhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGUJWgAAAAn+AAAACf8AAAABxwAAADcAAAAJAAEAAAYBAQAAEHByb2ZpbGVGdW5jdGlvbnMGAgEAACRhekZ1bmN0aW9uUmVzb3VyY2VzXHByb2ZpbGVGdW5jdGlvbnMJWgAAAAkEAQAACQUBAAAByAAAADwAAAAGBgEAAFd7DQogICAgInZlcnNpb24iOiAiMi4wIiwNCiAgICAibWFuYWdlZERlcGVuZGVuY3kiOiB7DQogICAgICAiRW5hYmxlZCI6IHRydWUNCiAgICB9DQogIH0BCQcBAAAJCAEAAAYJAQAADGhvc3QtYXouanNvbgYKAQAAIGF6RnVuY3Rpb25SZXNvdXJjZXNcaG9zdC1hei5qc29uCVoAAAAJDAEAAAkNAQAAAckAAAA8AAAABg4BAAAbew0KICAgICJ2ZXJzaW9uIjogICIyLjAiDQp9AQkPAQAACRABAAAGEQEAAAlob3N0Lmpzb24GEgEAAB1hekZ1bmN0aW9uUmVzb3VyY2VzXGhvc3QuanNvbglaAAAACRQBAAAJFQEAAAHKAAAAPAAAAAYWAQAAtQF7DQogICAgIklzRW5jcnlwdGVkIjogZmFsc2UsDQogICAgIlZhbHVlcyI6IHsNCiAgICAgICJGVU5DVElPTlNfV09SS0VSX1JVTlRJTUUiOiAicG93ZXJzaGVsbCIsDQogICAgICAiQXp1cmVXZWJKb2JzU3RvcmFnZSI6ICItLWNvbm5lY3Rpb24gc3RyaW5nIGZvciBzdG9yYWdlIGFjY291bnQtLS0iDQogICAgfQ0KICB9AQkXAQAACRgBAAAGGQEAABNsb2NhbC5zZXR0aW5ncy5qc29uBhoBAAAnYXpGdW5jdGlvblJlc291cmNlc1xsb2NhbC5zZXR0aW5ncy5qc29uCVoAAAAJHAEAAAkdAQAAAcsAAAA8AAAABh4BAACOAzwjDQpUaGlzIGlzIHRoZSBnbG9ibCBwcm9maWxlIGZpbGUgZm9yIHRoZSBBenVyZSBGdW5jdGlvbiBBcHAuDQpUaGlzIGZpbGUgd2lsbCBoYXZlIGJlZW4gZXhlY3V0ZWQgZmlyc3QsIGJlZm9yZSBhbnkgZnVuY3Rpb24gcnVucy4NClVzZSB0aGlzIHRvIGNyZWF0ZSBhIGNvbW1vbiBleGVjdXRpb24gZW52aXJvbm1lbnQsDQpidXQga2VlcCBpbiBtaW5kIHRoYXQgdGhlIHByb2ZpbGUgZXhlY3V0aW9uIHRpbWUgaXMgYWRkZWQgdG8gdGhlIGZ1bmN0aW9uIHN0YXJ0dXAgdGltZSBmb3IgQUxMIGZ1bmN0aW9ucy4NCiM+DQoNCmlmICgkZW52Ok1TSV9TRUNSRVQgLWFuZCAoR2V0LU1vZHVsZSAtTGlzdEF2YWlsYWJsZSBBei5BY2NvdW50cykpDQp7DQoJQ29ubmVjdC1BekFjY291bnQgLUlkZW50aXR5DQp9AQkfAQAACSABAAAGIQEAAAtwcm9maWxlLnBzMQYiAQAAH2F6RnVuY3Rpb25SZXNvdXJjZXNccHJvZmlsZS5wczEJWgAAAAkkAQAACSUBAAABzAAAADwAAAAGJgEAAIcEIyBBenVyZSBGdW5jdGlvbiBSZXNvdXJjZXMNCg0KVGhpcyBmb2xkZXIgaXMgdXNlZCB0byBzdG9yZSBBenVyZSBGdW5jdGlvbiBzcGVjaWZpYyBtZXRhIGRhdGEgYW5kIHJlc291cmNlcy4NCg0KVGhpcyBmb2xkZXIgaXMgYWxzbyB1c2VkIHRvIGFsbG93IHRoZSB1c2VyIHRvIGVhc2lseSBjcmVhdGUgYSBjdXN0b20gZnVuY3Rpb24tc3BlY2lmaWMgY29uZmlndXJhdGlvbiwgZm9yIGV4YW5tcGxlIGluIG9yZGVyIHRvIGNoYW5nZSB0aGUgdHJpZ2dlciBzZXR0aW5ncy4NCg0KVG8gc3BlY2lmeSBjdXN0b20sICdQZXIgRnVuY3Rpb24nIGNvbmZpZ3VyYXRpb24ganNvbiwganVzdCBwbGFjZSB0aGUgZGVzaXJlZCBjb25maWd1cmF0aW9uIGZpbGUgYXMgJ2Z1bmN0aW9ubmFtZS5qc29uJyBpbnRvIHRoaXMgZm9sZGVyIChpdCBkb2VzIG5vdCBtYXR0ZXIgaWYgaXQgaXMgdGhlIFBvd2VyU2hlbGwgZnVuY3Rpb24gbmFtZSBvciB0aGUgY29uZGVuc2VkIHZlcnNpb24gdXNlZCBmb3IgcHVibGlzaGluZyBvbiBBenVyZSkuAQknAQAACSgBAAAGKQEAAAlyZWFkbWUubWQGKgEAAB1hekZ1bmN0aW9uUmVzb3VyY2VzXHJlYWRtZS5tZAlaAAAACSwBAAAJLQEAAAHNAAAAPAAAAAYuAQAAEkB7DQoJQXogPSAnMS4qJw0KfQEJLwEAAAkwAQAABjEBAAARcmVxdWlyZW1lbnRzLnBzZDEGMgEAACVhekZ1bmN0aW9uUmVzb3VyY2VzXHJlcXVpcmVtZW50cy5wc2QxCVoAAAAJNAEAAAk1AQAAAc4AAAA8AAAABjYBAACHA3BhcmFtICgNCgkkUmVxdWVzdCwNCgkNCgkkVHJpZ2dlck1ldGFkYXRhDQopDQoNCiRwYXJhbWV0ZXJPYmplY3QgPSBDb252ZXJ0LUF6dXJlRnVuY3Rpb25QYXJhbWV0ZXIgLVJlcXVlc3QgJFJlcXVlc3QNCiRwYXJhbWV0ZXJzID0gJHBhcmFtZXRlck9iamVjdC5QYXJhbWV0ZXJzDQp0cnkgeyAkZGF0YSA9ICVmdW5jdGlvbm5hbWUlIEBwYXJhbWV0ZXJzIH0NCmNhdGNoDQp7DQoJV3JpdGUtQXp1cmVGdW5jdGlvbk91dHB1dCAtVmFsdWUgIkZhaWxlZCB0byBleGVjdXRlOiAkXyIgLVN0YXR1cyBJbnRlcm5hbFNlcnZlckVycm9yDQoJcmV0dXJuDQp9DQoNCldyaXRlLUF6dXJlRnVuY3Rpb25PdXRwdXQgLVZhbHVlICRkYXRhIC1TZXJpYWxpemU6JHBhcmFtZXRlck9iamVjdC5TZXJpYWxpemUBCTcBAAAJOAEAAAY5AQAAB3J1bi5wczEGOgEAABthekZ1bmN0aW9uUmVzb3VyY2VzXHJ1bi5wczEJWgAAAAk8AQAACT0BAAABzwAAADwAAAAGPgEAAKgHIyBTZXR0aW5nIHVwIHRoZSByZWxlYXNlIHBpcGVsaW5lOg0KDQojIyBQcmVsaW1pbmFyeQ0KDQpTZXR0aW5nIHVwIGEgcmVsZWFzZSBwaXBlbGluZSwgc2V0IHRoZSB0cmlnZ2VyIHRvIGRvIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gYWdhaW5zdCB0aGUgbWFzdGVyIGJyYW5jaCBvbmx5Lg0KSW4gU3RhZ2UgMSBzZXQgdXAgYSB0YXNrc2VxdWVuY2U6DQoNCiMjIDEpIFBvd2VyU2hlbGwgVGFzazogUHJlcmVxdWlzaXRlcw0KDQpIYXZlIGl0IGV4ZWN1dGUgYHZzdHMtcHJlcmVxdWlzaXRlcy5wczFgDQoNCiMjIDIpIFBvd2VyU2hlbGwgVGFzazogVmFsaWRhdGUNCg0KSGF2ZSBpdCBleGVjdXRlIGB2c3RzLXByZXJlcXVpc2l0ZXMucHMxYA0KDQojIyAzKSBQb3dlclNoZWxsIFRhc2s6IEJ1aWxkDQoNCkhhdmUgaXQgZXhlY3V0ZSBgdnN0cy1idWlsZC5wczFgLg0KVGhlIHRhc2sgcmVxdWlyZXMgdHdvIHBhcmFtZXRlcnM6DQoNCiAtIGAtTG9jYWxSZXBvYA0KIC0gYC1Xb3JraW5nRGlyZWN0b3J5ICQoU3lzdGVtLkRlZmF1bHRXb3JraW5nRGlyZWN0b3J5KS9f77+9bmFtZe+/vWANCg0KIyMgNCkgUHVibGlzaCBUZXN0IFJlc3VsdHMNCg0KQ29uZmlndXJlIHRhc2sgdG8gcGljayB1cCBudW5pdCB0eXBlIG9mIHRlc3RzIChyYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBqdW5pdCkuDQpDb25maWd1cmUgdGFzayB0byBleGVjdXRlLCBldmVuIGlmIHByZXZpb3VzIHN0ZXBzIGZhaWxlZCBvciB0aGUgdGFzayBzZXF1ZW5jZSB3YXMgY2FuY2VsbGVkLg0KDQojIyA1KSBQb3dlclNoZWxsIFRhc2s6IFBhY2thZ2UgRnVuY3Rpb24NCg0KSGF2ZSBpdCBleGVjdXRlIGB2c3RzLXBhY2thZ2VGdW5jdGlvbi5wczFgDQoNCiMjIDYpIEF6dXJlIEZ1bmN0aW9uIEFwcERlcGxveQ0KDQpDb25maWd1cmUgdG8gcHVibGlzaCB0byB0aGUgY29ycmVjdCBmdW5jdGlvbiBhcHAuAQk/AQAACUABAAAGQQEAABdBenVyZUZ1bmN0aW9uLnJlYWRtZS5tZAZCAQAAHWJ1aWxkXEF6dXJlRnVuY3Rpb24ucmVhZG1lLm1kCVoAAAAJRAEAAAlFAQAAAdAAAAA8AAAABkYBAADuIjwjDQpUaGlzIHNjcmlwdCBwdWJsaXNoZXMgdGhlIG1vZHVsZSB0byB0aGUgZ2FsbGVyeS4NCkl0IGV4cGVjdHMgYXMgaW5wdXQgYW4gQXBpS2V5IGF1dGhvcml6ZWQgdG8gcHVibGlzaCB0aGUgbW9kdWxlLg0KDQpJbnNlcnQgYW55IGJ1aWxkIHN0ZXBzIHlvdSBtYXkgbmVlZCB0byB0YWtlIGJlZm9yZSBwdWJsaXNoaW5nIGl0IGhlcmUuDQojPg0KcGFyYW0gKA0KCSRBcGlLZXksDQoJDQoJJFdvcmtpbmdEaXJlY3RvcnksDQoJDQoJJFJlcG9zaXRvcnkgPSAnUFNHYWxsZXJ5JywNCgkNCglbc3dpdGNoXQ0KCSRMb2NhbFJlcG8sDQoJDQoJW3N3aXRjaF0NCgkkU2tpcFB1Ymxpc2gsDQoJDQoJW3N3aXRjaF0NCgkkQXV0b1ZlcnNpb24NCikNCg0KI3JlZ2lvbiBIYW5kbGUgV29ya2luZyBEaXJlY3RvcnkgRGVmYXVsdHMNCmlmICgtbm90ICRXb3JraW5nRGlyZWN0b3J5KQ0Kew0KCWlmICgkZW52OlJFTEVBU0VfUFJJTUFSWUFSVElGQUNUU09VUkNFQUxJQVMpDQoJew0KCQkkV29ya2luZ0RpcmVjdG9yeSA9IEpvaW4tUGF0aCAtUGF0aCAkZW52OlNZU1RFTV9ERUZBVUxUV09SS0lOR0RJUkVDVE9SWSAtQ2hpbGRQYXRoICRlbnY6UkVMRUFTRV9QUklNQVJZQVJUSUZBQ1RTT1VSQ0VBTElBUw0KCX0NCgllbHNlIHsgJFdvcmtpbmdEaXJlY3RvcnkgPSAkZW52OlNZU1RFTV9ERUZBVUxUV09SS0lOR0RJUkVDVE9SWSB9DQp9DQppZiAoLW5vdCAkV29ya2luZ0RpcmVjdG9yeSkgeyAkV29ya2luZ0RpcmVjdG9yeSA9IFNwbGl0LVBhdGggJFBTU2NyaXB0Um9vdCB9DQojZW5kcmVnaW9uIEhhbmRsZSBXb3JraW5nIERpcmVjdG9yeSBEZWZhdWx0cw0KDQojIFByZXBhcmUgcHVibGlzaCBmb2xkZXINCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiQ3JlYXRpbmcgYW5kIHBvcHVsYXRpbmcgcHVibGlzaGluZyBkaXJlY3RvcnkiDQokcHVibGlzaERpciA9IE5ldy1JdGVtIC1QYXRoICRXb3JraW5nRGlyZWN0b3J5IC1OYW1lIHB1Ymxpc2ggLUl0ZW1UeXBlIERpcmVjdG9yeSAtRm9yY2UNCkNvcHktSXRlbSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcw75uYW1lw74iIC1EZXN0aW5hdGlvbiAkcHVibGlzaERpci5GdWxsTmFtZSAtUmVjdXJzZSAtRm9yY2UNCg0KI3JlZ2lvbiBHYXRoZXIgdGV4dCBkYXRhIHRvIGNvbXBpbGUNCiR0ZXh0ID0gQCgpDQokcHJvY2Vzc2VkID0gQCgpDQoNCiMgR2F0aGVyIFN0dWZmIHRvIHJ1biBiZWZvcmUNCmZvcmVhY2ggKCRmaWxlUGF0aCBpbiAoJiAiJCgkUFNTY3JpcHRSb290KVwuLlzDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzXHByZWltcG9ydC5wczEiKSkNCnsNCglpZiAoW3N0cmluZ106OklzTnVsbE9yV2hpdGVTcGFjZSgkZmlsZVBhdGgpKSB7IGNvbnRpbnVlIH0NCgkNCgkkaXRlbSA9IEdldC1JdGVtICRmaWxlUGF0aA0KCWlmICgkaXRlbS5QU0lzQ29udGFpbmVyKSB7IGNvbnRpbnVlIH0NCglpZiAoJGl0ZW0uRnVsbE5hbWUgLWluICRwcm9jZXNzZWQpIHsgY29udGludWUgfQ0KCSR0ZXh0ICs9IFtTeXN0ZW0uSU8uRmlsZV06OlJlYWRBbGxUZXh0KCRpdGVtLkZ1bGxOYW1lKQ0KCSRwcm9jZXNzZWQgKz0gJGl0ZW0uRnVsbE5hbWUNCn0NCg0KIyBHYXRoZXIgY29tbWFuZHMNCkdldC1DaGlsZEl0ZW0gLVBhdGggIiQoJHB1Ymxpc2hEaXIuRnVsbE5hbWUpXMO+bmFtZcO+XGludGVybmFsXGZ1bmN0aW9uc1wiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIioucHMxIiB8IEZvckVhY2gtT2JqZWN0IHsNCgkkdGV4dCArPSBbU3lzdGVtLklPLkZpbGVdOjpSZWFkQWxsVGV4dCgkXy5GdWxsTmFtZSkNCn0NCkdldC1DaGlsZEl0ZW0gLVBhdGggIiQoJHB1Ymxpc2hEaXIuRnVsbE5hbWUpXMO+bmFtZcO+XGZ1bmN0aW9uc1wiIC1SZWN1cnNlIC1GaWxlIC1GaWx0ZXIgIioucHMxIiB8IEZvckVhY2gtT2JqZWN0IHsNCgkkdGV4dCArPSBbU3lzdGVtLklPLkZpbGVdOjpSZWFkQWxsVGV4dCgkXy5GdWxsTmFtZSkNCn0NCg0KIyBHYXRoZXIgc3R1ZmYgdG8gcnVuIGFmdGVyd2FyZHMNCmZvcmVhY2ggKCRmaWxlUGF0aCBpbiAoJiAiJCgkUFNTY3JpcHRSb290KVwuLlzDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzXHBvc3RpbXBvcnQucHMxIikpDQp7DQoJaWYgKFtzdHJpbmddOjpJc051bGxPcldoaXRlU3BhY2UoJGZpbGVQYXRoKSkgeyBjb250aW51ZSB9DQoJDQoJJGl0ZW0gPSBHZXQtSXRlbSAkZmlsZVBhdGgNCglpZiAoJGl0ZW0uUFNJc0NvbnRhaW5lcikgeyBjb250aW51ZSB9DQoJaWYgKCRpdGVtLkZ1bGxOYW1lIC1pbiAkcHJvY2Vzc2VkKSB7IGNvbnRpbnVlIH0NCgkkdGV4dCArPSBbU3lzdGVtLklPLkZpbGVdOjpSZWFkQWxsVGV4dCgkaXRlbS5GdWxsTmFtZSkNCgkkcHJvY2Vzc2VkICs9ICRpdGVtLkZ1bGxOYW1lDQp9DQojZW5kcmVnaW9uIEdhdGhlciB0ZXh0IGRhdGEgdG8gY29tcGlsZQ0KDQojcmVnaW9uIFVwZGF0ZSB0aGUgcHNtMSBmaWxlDQokZmlsZURhdGEgPSBHZXQtQ29udGVudCAtUGF0aCAiJCgkcHVibGlzaERpci5GdWxsTmFtZSlcw75uYW1lw75cw75uYW1lw74ucHNtMSIgLVJhdw0KJGZpbGVEYXRhID0gJGZpbGVEYXRhLlJlcGxhY2UoJyI8d2FzIG5vdCBjb21waWxlZD4iJywgJyI8d2FzIGNvbXBpbGVkPiInKQ0KJGZpbGVEYXRhID0gJGZpbGVEYXRhLlJlcGxhY2UoJyI8Y29tcGlsZSBjb2RlIGludG8gaGVyZT4iJywgKCR0ZXh0IC1qb2luICJgbmBuIikpDQpbU3lzdGVtLklPLkZpbGVdOjpXcml0ZUFsbFRleHQoIiQoJHB1Ymxpc2hEaXIuRnVsbE5hbWUpXMO+bmFtZcO+XMO+bmFtZcO+LnBzbTEiLCAkZmlsZURhdGEsIFtTeXN0ZW0uVGV4dC5FbmNvZGluZ106OlVURjgpDQojZW5kcmVnaW9uIFVwZGF0ZSB0aGUgcHNtMSBmaWxlDQoNCiNyZWdpb24gVXBkYXRpbmcgdGhlIE1vZHVsZSBWZXJzaW9uDQppZiAoJEF1dG9WZXJzaW9uKQ0Kew0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiVXBkYXRpbmcgbW9kdWxlIHZlcnNpb24gbnVtYmVycy4iDQoJdHJ5IHsgW3ZlcnNpb25dJHJlbW90ZVZlcnNpb24gPSAoRmluZC1Nb2R1bGUgJ8O+bmFtZcO+JyAtUmVwb3NpdG9yeSAkUmVwb3NpdG9yeSAtRXJyb3JBY3Rpb24gU3RvcCkuVmVyc2lvbiB9DQoJY2F0Y2gNCgl7DQoJCVN0b3AtUFNGRnVuY3Rpb24gLU1lc3NhZ2UgIkZhaWxlZCB0byBhY2Nlc3MgJCgkUmVwb3NpdG9yeSkiIC1FbmFibGVFeGNlcHRpb24gJHRydWUgLUVycm9yUmVjb3JkICRfDQoJfQ0KCWlmICgtbm90ICRyZW1vdGVWZXJzaW9uKQ0KCXsNCgkJU3RvcC1QU0ZGdW5jdGlvbiAtTWVzc2FnZSAiQ291bGRuJ3QgZmluZCDDvm5hbWXDviBvbiByZXBvc2l0b3J5ICQoJFJlcG9zaXRvcnkpIiAtRW5hYmxlRXhjZXB0aW9uICR0cnVlDQoJfQ0KCSRuZXdCdWlsZE51bWJlciA9ICRyZW1vdGVWZXJzaW9uLkJ1aWxkICsgMQ0KCVt2ZXJzaW9uXSRsb2NhbFZlcnNpb24gPSAoSW1wb3J0LVBvd2VyU2hlbGxEYXRhRmlsZSAtUGF0aCAiJCgkcHVibGlzaERpci5GdWxsTmFtZSlcw75uYW1lw75cw75uYW1lw74ucHNkMSIpLk1vZHVsZVZlcnNpb24NCglVcGRhdGUtTW9kdWxlTWFuaWZlc3QgLVBhdGggIiQoJHB1Ymxpc2hEaXIuRnVsbE5hbWUpXMO+bmFtZcO+XMO+bmFtZcO+LnBzZDEiIC1Nb2R1bGVWZXJzaW9uICIkKCRsb2NhbFZlcnNpb24uTWFqb3IpLiQoJGxvY2FsVmVyc2lvbi5NaW5vcikuJCgkbmV3QnVpbGROdW1iZXIpIg0KfQ0KI2VuZHJlZ2lvbiBVcGRhdGluZyB0aGUgTW9kdWxlIFZlcnNpb24NCg0KI3JlZ2lvbiBQdWJsaXNoDQppZiAoJFNraXBQdWJsaXNoKSB7IHJldHVybiB9DQppZiAoJExvY2FsUmVwbykNCnsNCgkjIERlcGVuZGVuY2llcyBtdXN0IGdvIGZpcnN0DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJDcmVhdGluZyBOdWdldCBQYWNrYWdlIGZvciBtb2R1bGU6IFBTRnJhbWV3b3JrIg0KCU5ldy1QU01ETW9kdWxlTnVnZXRQYWNrYWdlIC1Nb2R1bGVQYXRoIChHZXQtTW9kdWxlIC1OYW1lIFBTRnJhbWV3b3JrKS5Nb2R1bGVCYXNlIC1QYWNrYWdlUGF0aCAuDQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJDcmVhdGluZyBOdWdldCBQYWNrYWdlIGZvciBtb2R1bGU6IMO+bmFtZcO+Ig0KCU5ldy1QU01ETW9kdWxlTnVnZXRQYWNrYWdlIC1Nb2R1bGVQYXRoICIkKCRwdWJsaXNoRGlyLkZ1bGxOYW1lKVzDvm5hbWXDviIgLVBhY2thZ2VQYXRoIC4NCn0NCmVsc2UNCnsNCgkjIFB1Ymxpc2ggdG8gR2FsbGVyeQ0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiUHVibGlzaGluZyB0aGUgw75uYW1lw74gbW9kdWxlIHRvICQoJFJlcG9zaXRvcnkpIg0KCVB1Ymxpc2gtTW9kdWxlIC1QYXRoICIkKCRwdWJsaXNoRGlyLkZ1bGxOYW1lKVzDvm5hbWXDviIgLU51R2V0QXBpS2V5ICRBcGlLZXkgLUZvcmNlIC1SZXBvc2l0b3J5ICRSZXBvc2l0b3J5DQp9DQojZW5kcmVnaW9uIFB1Ymxpc2gBCUcBAAAJSAEAAAZJAQAADnZzdHMtYnVpbGQucHMxBkoBAAAUYnVpbGRcdnN0cy1idWlsZC5wczEJWgAAAAlMAQAACU0BAAAB0QAAADwAAAAGTgEAALxBDQo8Iw0KCS5TWU5PUFNJUw0KCQlCdWlsZCBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgYSBjbGllbnQgbW9kdWxlIGZvciBSRVNUIEFQSSBlbmRwb2ludHMgb2YgYSBBenVyZSBQb3dlclNoZWxsIEZ1bmN0aW9ucyBwcm9qZWN0Lg0KCQ0KCS5ERVNDUklQVElPTg0KCQlCdWlsZCBzY3JpcHQgdGhhdCBnZW5lcmF0ZXMgYSBjbGllbnQgbW9kdWxlIGZvciBSRVNUIEFQSSBlbmRwb2ludHMgb2YgYSBBenVyZSBQb3dlclNoZWxsIEZ1bmN0aW9ucyBwcm9qZWN0Lg0KCQ0KCS5QQVJBTUVURVIgQXBpS2V5DQoJCVRoZSBBUEkga2V5IHRvIHVzZSB0byBwdWJsaXNoIHRoZSBtb2R1bGUgdG8gYSBOdWdldCBSZXBvc2l0b3J5DQoJDQoJLlBBUkFNRVRFUiBXb3JraW5nRGlyZWN0b3J5DQoJCVRoZSByb290IGZvbGRlciBmcm9tIHdoaWNoIHRvIGJ1aWxkIHRoZSBtb2R1bGUuDQoJDQoJLlBBUkFNRVRFUiBSZXBvc2l0b3J5DQoJCVRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5IHRvIHB1Ymxpc2ggdG8uDQoJCURlZmF1bHRzIHRvIFBTR2FsbGVyeS4NCgkNCgkuUEFSQU1FVEVSIExvY2FsUmVwbw0KCQlJbnN0ZWFkIG9mIHB1Ymxpc2hpbmcgdG8gYSBnYWxsZXJ5LCBkcm9wIGEgbnVnZXQgcGFja2FnZSBpbiB0aGUgcm9vdCBmb2xkZXIuDQoJCVRoaXMgcGFja2FnZSBjYW4gdGhlbiBiZSBwaWNrZWQgdXAgaW4gYSBsYXRlciBzdGVwIGZvciBwdWJsaXNoaW5nIHRvIEF6dXJlIEFydGlmYWN0cy4NCg0KCS5QQVJBTUVURVIgTW9kdWxlTmFtZQ0KCQlUaGUgbmFtZSB0byBnaXZlIHRvIHRoZSBjbGllbnQgbW9kdWxlLg0KCQlCeSBkZWZhdWx0LCB0aGUgY2xpZW50IG1vZHVsZSB3aWxsIGJlIG5hbWVkICc8TW9kdWxlTmFtZT4uQ2xpZW50Jy4NCgkNCgkuUEFSQU1FVEVSIEluY2x1ZGVGb3JtYXQNCgkJSW5jbHVkZSB0aGUgZm9ybWF0IHhtbCBvZiB0aGUgc291cmNlIG1vZHVsZSBmb3IgdGhlIGNsaWVudCBtb2R1bGUuDQoJDQoJLlBBUkFNRVRFUiBJbmNsdWRlVHlwZQ0KCQlJbmNsdWRlIHRoZSB0eXBlIGV4dGVuc2lvbiB4bWwgb2YgdGhlIHNvdXJjZSBtb2R1bGUgZm9yIHRoZSBjbGllbnQgbW9kdWxlLg0KCQ0KCS5QQVJBTUVURVIgSW5jbHVkZUFzc2VtYmx5DQoJCUluY2x1ZGUgdGhlIGJpbmFyaWVzIG9mIHRoZSBzb3VyY2UgbW9kdWxlIGZvciB0aGUgY2xpZW50IG1vZHVsZS4NCiM+DQpwYXJhbSAoDQoJJEFwaUtleSwNCgkNCgkkV29ya2luZ0RpcmVjdG9yeSwNCgkNCgkkUmVwb3NpdG9yeSA9ICdQU0dhbGxlcnknLA0KCQ0KCVtzd2l0Y2hdDQoJJExvY2FsUmVwbywNCgkNCgkkTW9kdWxlTmFtZSwNCgkNCglbc3dpdGNoXQ0KCSRJbmNsdWRlRm9ybWF0LA0KCQ0KCVtzd2l0Y2hdDQoJJEluY2x1ZGVUeXBlLA0KCQ0KCVtzd2l0Y2hdDQoJJEluY2x1ZGVBc3NlbWJseQ0KKQ0KDQojcmVnaW9uIEhhbmRsZSBXb3JraW5nIERpcmVjdG9yeSBEZWZhdWx0cw0KaWYgKC1ub3QgJFdvcmtpbmdEaXJlY3RvcnkpDQp7DQoJaWYgKCRlbnY6UkVMRUFTRV9QUklNQVJZQVJUSUZBQ1RTT1VSQ0VBTElBUykNCgl7DQoJCSRXb3JraW5nRGlyZWN0b3J5ID0gSm9pbi1QYXRoIC1QYXRoICRlbnY6U1lTVEVNX0RFRkFVTFRXT1JLSU5HRElSRUNUT1JZIC1DaGlsZFBhdGggJGVudjpSRUxFQVNFX1BSSU1BUllBUlRJRkFDVFNPVVJDRUFMSUFTDQoJfQ0KCWVsc2UgeyAkV29ya2luZ0RpcmVjdG9yeSA9ICRlbnY6U1lTVEVNX0RFRkFVTFRXT1JLSU5HRElSRUNUT1JZIH0NCn0NCiNlbmRyZWdpb24gSGFuZGxlIFdvcmtpbmcgRGlyZWN0b3J5IERlZmF1bHRzDQoNCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgJ1N0YXJ0aW5nIEJ1aWxkOiBDbGllbnQgTW9kdWxlJw0KJHBhcmVudE1vZHVsZSA9ICfDvm5hbWXDvicNCmlmICgtbm90ICRNb2R1bGVOYW1lKSB7ICRNb2R1bGVOYW1lID0gJ8O+bmFtZcO+LkNsaWVudCcgfQ0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAnQ3JlYXRpbmcgRm9sZGVyIFN0cnVjdHVyZScNCiR3b3JraW5nUm9vdCA9IE5ldy1JdGVtIC1QYXRoICRXb3JraW5nRGlyZWN0b3J5IC1OYW1lICRNb2R1bGVOYW1lIC1JdGVtVHlwZSBEaXJlY3RvcnkNCiRwdWJsaXNoUm9vdCA9IEpvaW4tUGF0aCAtUGF0aCAkV29ya2luZ0RpcmVjdG9yeSAtQ2hpbGRQYXRoICdwdWJsaXNoXMO+bmFtZcO+Jw0KQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxmdW5jdGlvbnMiIC1EZXN0aW5hdGlvbiAiJCgkd29ya2luZ1Jvb3QuRnVsbE5hbWUpXCIgLVJlY3Vyc2UNCkNvcHktSXRlbSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xjbGllbnRNb2R1bGVcaW50ZXJuYWwiIC1EZXN0aW5hdGlvbiAiJCgkd29ya2luZ1Jvb3QuRnVsbE5hbWUpXCIgLVJlY3Vyc2UNCkNvcHktSXRlbSAtUGF0aCAiJCgkcHVibGlzaFJvb3QpXGVuLXVzIiAtRGVzdGluYXRpb24gIiQoJHdvcmtpbmdSb290LkZ1bGxOYW1lKVwiIC1SZWN1cnNlDQokZnVuY3Rpb25Gb2xkZXIgPSBHZXQtSXRlbSAtUGF0aCAiJCgkd29ya2luZ1Jvb3QuRnVsbE5hbWUpXGZ1bmN0aW9ucyINCg0KI3JlZ2lvbiBDcmVhdGUgRnVuY3Rpb25zDQokZW5jb2RpbmcgPSBbUFNGRW5jb2RpbmddJ3V0ZjgnDQokZnVuY3Rpb25zVGV4dCA9IEdldC1Db250ZW50IC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxmdW5jdGlvbi5wczEiIC1SYXcNCg0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAnQ3JlYXRpbmcgRnVuY3Rpb25zJw0KZm9yZWFjaCAoJGZ1bmN0aW9uU291cmNlRmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAtUGF0aCAiJCgkcHVibGlzaFJvb3QpXGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbHRlciAnKi5wczEnKSkNCnsNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICIgIFByb2Nlc3NpbmcgZnVuY3Rpb246ICQoJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZSkiDQoJJGNvbmRlbnNlZE5hbWUgPSAkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lIC1yZXBsYWNlICctJywgJycNCgkNCgkjcmVnaW9uIExvYWQgT3ZlcnJpZGVzDQoJJG92ZXJyaWRlID0gQHsgfQ0KCWlmIChUZXN0LVBhdGggLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVwkKCRmdW5jdGlvblNvdXJjZUZpbGUuQmFzZU5hbWUpLnBzZDEiKQ0KCXsNCgkJJG92ZXJyaWRlID0gSW1wb3J0LVBvd2VyU2hlbGxEYXRhRmlsZSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZSkucHNkMSINCgl9DQoJaWYgKFRlc3QtUGF0aCAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGNvbmRlbnNlZE5hbWUpLnBzZDEiKQ0KCXsNCgkJJG92ZXJyaWRlID0gSW1wb3J0LVBvd2VyU2hlbGxEYXRhRmlsZSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGNvbmRlbnNlZE5hbWUpLnBzZDEiDQoJfQ0KCWlmICgkb3ZlcnJpZGUuTm9DbGllbnRGdW5jdGlvbikNCgl7DQoJCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIiAgICBPdmVycmlkZSAnTm9DbGllbnRGdW5jdGlvbicgZGV0ZWN0ZWQsIHNraXBwaW5nISINCgkJY29udGludWUNCgl9DQoJDQoJIyBJZiB0aGVyZSBpcyBhbiBkZWZpbml0aW9uIG92ZXJyaWRlLCB1c2UgaXQgYW5kIGNvbnRpbnVlDQoJaWYgKFRlc3QtUGF0aCAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZSkucHMxIikNCgl7DQoJCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIiAgICBPdmVycmlkZSBmdW5jdGlvbiBkZWZpbml0aW9uIGRldGVjdGVkLCB1c2luZyBvdmVycmlkZSINCgkJQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lKS5wczEiIC1EZXN0aW5hdGlvbiAkZnVuY3Rpb25Gb2xkZXIuRnVsbE5hbWUNCgkJY29udGludWUNCgl9DQoJDQoJIyBGaWd1cmUgb3V0IHRoZSBSZXN0IE1ldGhvZCB0byB1c2UNCgkkbWV0aG9kTmFtZSA9ICdQb3N0Jw0KCWlmICgkb3ZlcnJpZGUuUmVzdE1ldGhvZHMpDQoJew0KCQkkbWV0aG9kTmFtZSA9ICRvdmVycmlkZS5SZXN0TWV0aG9kcyB8IFdoZXJlLU9iamVjdCB7ICRfIC1uZSAnR2V0JyB9IHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMQ0KCX0NCgkNCgkjZW5kcmVnaW9uIExvYWQgT3ZlcnJpZGVzDQoJDQoJJGN1cnJlbnRGdW5jdGlvbnNUZXh0ID0gJGZ1bmN0aW9uc1RleHQgLXJlcGxhY2UgJyVmdW5jdGlvbm5hbWUlJywgJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZSAtcmVwbGFjZSAnJWNvbmRlbnNlZG5hbWUlJywgJGNvbmRlbnNlZE5hbWUgLXJlcGxhY2UgJyVtZXRob2QlJywgJG1ldGhvZE5hbWUNCgkNCgkkcGFyc2VkRnVuY3Rpb24gPSBSZWFkLVBTTURTY3JpcHQgLVBhdGggJGZ1bmN0aW9uU291cmNlRmlsZS5GdWxsTmFtZQ0KCSRmdW5jdGlvbkFzdCA9ICRwYXJzZWRGdW5jdGlvbi5Bc3QuRW5kQmxvY2suU3RhdGVtZW50cyB8IFdoZXJlLU9iamVjdCB7DQoJCSRfIC1pcyBbU3lzdGVtLk1hbmFnZW1lbnQuQXV0b21hdGlvbi5MYW5ndWFnZS5GdW5jdGlvbkRlZmluaXRpb25Bc3RdDQoJfSB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDENCgkNCgkkZW5kID0gJGZ1bmN0aW9uQXN0LkJvZHkuUGFyYW1CbG9jay5FeHRlbnQuRW5kT2ZmU2V0DQoJJHN0YXJ0ID0gJGZ1bmN0aW9uQXN0LkJvZHkuRXh0ZW50LlN0YXJ0T2ZmU2V0ICsgMQ0KCSRjdXJyZW50RnVuY3Rpb25zVGV4dCA9ICRjdXJyZW50RnVuY3Rpb25zVGV4dC5SZXBsYWNlKCclcGFyYW1ldGVyJScsICRmdW5jdGlvbkFzdC5Cb2R5LkV4dGVudC5UZXh0LlN1YlN0cmluZygxLCAoJGVuZCAtICRzdGFydCkpKQ0KCQ0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIiAgICBDcmVhdGluZyBmaWxlOiAkKCRmdW5jdGlvbkZvbGRlci5GdWxsTmFtZSlcJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLk5hbWUpIg0KCVtTeXN0ZW0uSU8uRmlsZV06OldyaXRlQWxsVGV4dCgiJCgkZnVuY3Rpb25Gb2xkZXIuRnVsbE5hbWUpXCQoJGZ1bmN0aW9uU291cmNlRmlsZS5OYW1lKSIsICRjdXJyZW50RnVuY3Rpb25zVGV4dCwgJGVuY29kaW5nKQ0KfQ0KJGZ1bmN0aW9uc1RvRXhwb3J0ID0gKEdldC1DaGlsZEl0ZW0gLVBhdGggJGZ1bmN0aW9uRm9sZGVyLkZ1bGxOYW1lIC1SZWN1cnNlIC1GaWx0ZXIgKi5wczEpLkJhc2VOYW1lIHwgU29ydC1PYmplY3QNCiNlbmRyZWdpb24gQ3JlYXRlIEZ1bmN0aW9ucw0KDQojcmVnaW9uIENyZWF0ZSBDb3JlIE1vZHVsZSBGaWxlcw0KIyBHZXQgTWFuaWZlc3Qgb2YgcHVibGlzaGVkIHZlcnNpb24sIGluIG9yZGVyIHRvIGNhdGNoIGJ1aWxkLXBoYXNlIGNoYW5nZXMgc3VjaCBhcyBtb2R1bGUgdmVyc2lvbi4NCiRvcmlnaW5hbE1hbmlmZXN0RGF0YSA9IEltcG9ydC1Qb3dlclNoZWxsRGF0YUZpbGUgLVBhdGggIiRwdWJsaXNoUm9vdFzDvm5hbWXDvi5wc2QxIg0KJHByZXJlcUhhc2ggPSBAew0KCU1vZHVsZU5hbWUgICAgPSAnUFNGcmFtZXdvcmsnDQoJTW9kdWxlVmVyc2lvbiA9IChHZXQtTW9kdWxlIFBTRnJhbWV3b3JrKS5WZXJzaW9uDQp9DQokcGFyYW1OZXdNb2R1bGVNYW5pZmVzdCA9IEB7DQoJUGF0aAkJCSAgPSAoJ3swfVx7MX0ucHNkMScgLWYgJHdvcmtpbmdSb290LkZ1bGxOYW1lLCAkTW9kdWxlTmFtZSkNCglGdW5jdGlvbnNUb0V4cG9ydCA9ICRmdW5jdGlvbnNUb0V4cG9ydA0KCUNvbXBhbnlOYW1lCSAgICAgID0gJG9yaWdpbmFsTWFuaWZlc3REYXRhLkNvbXBhbnlOYW1lDQoJQXV0aG9yCQkgICAgICA9ICRvcmlnaW5hbE1hbmlmZXN0RGF0YS5BdXRob3INCglEZXNjcmlwdGlvbgkgICAgICA9ICRvcmlnaW5hbE1hbmlmZXN0RGF0YS5EZXNjcmlwdGlvbg0KCU1vZHVsZVZlcnNpb24JICA9ICRvcmlnaW5hbE1hbmlmZXN0RGF0YS5Nb2R1bGVWZXJzaW9uDQoJUm9vdE1vZHVsZQkgICAgICA9ICgnezB9LnBzbTEnIC1mICRNb2R1bGVOYW1lKQ0KCUNvcHlyaWdodAkJICA9ICRvcmlnaW5hbE1hbmlmZXN0RGF0YS5Db3B5cmlnaHQNCglUeXBlc1RvUHJvY2VzcyAgICA9IEAoKQ0KCUZvcm1hdHNUb1Byb2Nlc3MgID0gQCgpDQoJUmVxdWlyZWRBc3NlbWJsaWVzID0gQCgpDQoJUmVxdWlyZWRNb2R1bGVzICAgPSBAKCRwcmVyZXFIYXNoKQ0KCUNvbXBhdGlibGVQU0VkaXRpb25zID0gJ0NvcmUnLCAnRGVza3RvcCcNCglQb3dlclNoZWxsVmVyc2lvbiA9ICc1LjEnDQp9DQoNCmlmICgkSW5jbHVkZUFzc2VtYmx5KSB7ICRwYXJhbU5ld01vZHVsZU1hbmlmZXN0LlJlcXVpcmVkQXNzZW1ibGllcyA9ICRvcmlnaW5hbE1hbmlmZXN0RGF0YS5SZXF1aXJlZEFzc2VtYmxpZXMgfQ0KaWYgKCRJbmNsdWRlRm9ybWF0KSB7ICRwYXJhbU5ld01vZHVsZU1hbmlmZXN0LkZvcm1hdHNUb1Byb2Nlc3MgPSAkb3JpZ2luYWxNYW5pZmVzdERhdGEuRm9ybWF0c1RvUHJvY2VzcyB9DQppZiAoJEluY2x1ZGVUeXBlKSB7ICRwYXJhbU5ld01vZHVsZU1hbmlmZXN0LlR5cGVzVG9Qcm9jZXNzID0gJG9yaWdpbmFsTWFuaWZlc3REYXRhLlR5cGVzVG9Qcm9jZXNzIH0NCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIkNyZWF0aW5nIE1vZHVsZSBNYW5pZmVzdCBmb3IgbW9kdWxlOiAkTW9kdWxlTmFtZSINCk5ldy1Nb2R1bGVNYW5pZmVzdCBAcGFyYW1OZXdNb2R1bGVNYW5pZmVzdA0KDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICJDb3B5aW5nIGFkZGl0aW9uYWwgbW9kdWxlIGZpbGVzIg0KQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxtb2R1bGVyb290LnBzbTEiIC1EZXN0aW5hdGlvbiAiJCgkd29ya2luZ1Jvb3QuRnVsbE5hbWUpXCQoJE1vZHVsZU5hbWUpLnBzbTEiDQpDb3B5LUl0ZW0gLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXExJQ0VOU0UiIC1EZXN0aW5hdGlvbiAiJCgkd29ya2luZ1Jvb3QuRnVsbE5hbWUpXCINCiNlbmRyZWdpb24gQ3JlYXRlIENvcmUgTW9kdWxlIEZpbGVzDQoNCiNyZWdpb24gVHJhbnNmZXIgQWRkaXRpb25hbCBDb250ZW50DQppZiAoJEluY2x1ZGVBc3NlbWJseSkNCnsNCglDb3B5LUl0ZW0gLVBhdGggIiRwdWJsaXNoUm9vdFxiaW4iIC1EZXN0aW5hdGlvbiAiJCgkd29ya2luZ1Jvb3QuRnVsbE5hbWUpXCIgLVJlY3Vyc2UNCn0NCmlmICgkSW5jbHVkZUZvcm1hdCAtb3IgJEluY2x1ZGVUeXBlKQ0Kew0KCUNvcHktSXRlbSAtUGF0aCAiJHB1Ymxpc2hSb290XHhtbCIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5nUm9vdC5GdWxsTmFtZSlcIiAtUmVjdXJzZQ0KfQ0KI2VuZHJlZ2lvbiBUcmFuc2ZlciBBZGRpdGlvbmFsIENvbnRlbnQNCg0KI3JlZ2lvbiBQdWJsaXNoDQppZiAoJExvY2FsUmVwbykNCnsNCgkjIERlcGVuZGVuY2llcyBtdXN0IGdvIGZpcnN0DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJDcmVhdGluZyBOdWdldCBQYWNrYWdlIGZvciBtb2R1bGU6IFBTRnJhbWV3b3JrIg0KCU5ldy1QU01ETW9kdWxlTnVnZXRQYWNrYWdlIC1Nb2R1bGVQYXRoIChHZXQtTW9kdWxlIC1OYW1lIFBTRnJhbWV3b3JrKS5Nb2R1bGVCYXNlIC1QYWNrYWdlUGF0aCAuIC1XYXJuaW5nQWN0aW9uIFNpbGVudGx5Q29udGludWUNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIkNyZWF0aW5nIE51Z2V0IFBhY2thZ2UgZm9yIG1vZHVsZTogw75uYW1lw74iDQoJTmV3LVBTTURNb2R1bGVOdWdldFBhY2thZ2UgLU1vZHVsZVBhdGggJHdvcmtpbmdSb290LkZ1bGxOYW1lIC1QYWNrYWdlUGF0aCAuIC1FbmFibGVFeGNlcHRpb24NCn0NCmVsc2UNCnsNCgkjIFB1Ymxpc2ggdG8gR2FsbGVyeQ0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiUHVibGlzaGluZyB0aGUgw75uYW1lw74gbW9kdWxlIHRvICQoJFJlcG9zaXRvcnkpIg0KCVB1Ymxpc2gtTW9kdWxlIC1QYXRoICR3b3JraW5nUm9vdC5GdWxsTmFtZSAtTnVHZXRBcGlLZXkgJEFwaUtleSAtRm9yY2UgLVJlcG9zaXRvcnkgJFJlcG9zaXRvcnkNCn0NCiNlbmRyZWdpb24gUHVibGlzaAEJTwEAAAlQAQAABlEBAAAjdnN0cy1jcmVhdGVGdW5jdGlvbkNsaWVudE1vZHVsZS5wczEGUgEAAClidWlsZFx2c3RzLWNyZWF0ZUZ1bmN0aW9uQ2xpZW50TW9kdWxlLnBzMQlaAAAACVQBAAAJVQEAAAHSAAAAPAAAAAZWAQAAmywNCjwjDQoJLlNZTk9QU0lTDQoJCVBhY2thZ2VzIGFuIEF6dXJlIEZ1bmN0aW9ucyBwcm9qZWN0LCByZWFkeSB0byByZWxlYXNlLg0KCQ0KCS5ERVNDUklQVElPTg0KCQlQYWNrYWdlcyBhbiBBenVyZSBGdW5jdGlvbnMgcHJvamVjdCwgcmVhZHkgdG8gcmVsZWFzZS4NCgkJU2hvdWxkIGJlIHBhcnQgb2YgdGhlIHJlbGVhc2UgcGlwZWxpbmUsIGFmdGVyIGVuc3VyaW5nIHZhbGlkYXRpb24uDQoNCgkJTG9vayBpbnRvIHRoZSAnQXp1cmVGdW5jdGlvblJlc3QnIHRlbXBsYXRlIGZvciBnZW5lcmF0aW5nIGZ1bmN0aW9ucyBmb3IgdGhlIG1vZHVsZSBpZiB5b3UgZG8uDQoJDQoJLlBBUkFNRVRFUiBXb3JraW5nRGlyZWN0b3J5DQoJCVRoZSByb290IGZvbGRlciB0byB3b3JrIGZyb20uDQoJDQoJLlBBUkFNRVRFUiBSZXBvc2l0b3J5DQoJCVRoZSBuYW1lIG9mIHRoZSByZXBvc2l0b3J5IHRvIHVzZSBmb3IgZ2F0aGVyaW5nIGRlcGVuZGVuY2llcyBmcm9tLg0KIz4NCnBhcmFtICgNCgkkV29ya2luZ0RpcmVjdG9yeSA9ICIkKCRlbnY6U1lTVEVNX0RFRkFVTFRXT1JLSU5HRElSRUNUT1JZKVxfw75uYW1lw74iLA0KCQ0KCSRSZXBvc2l0b3J5ID0gJ1BTR2FsbGVyeScsDQoNCglbc3dpdGNoXQ0KCSRJbmNsdWRlQVoNCikNCg0KJG1vZHVsZU5hbWUgPSAnw75uYW1lw74nDQoNCiMgUHJlcGFyZSBQYXRocw0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAiQ3JlYXRpbmcgd29ya2luZyBmb2xkZXJzIg0KJG1vZHVsZVJvb3QgPSBKb2luLVBhdGggLVBhdGggJFdvcmtpbmdEaXJlY3RvcnkgLUNoaWxkUGF0aCAncHVibGlzaCcNCiR3b3JraW5nUm9vdCA9IE5ldy1JdGVtIC1QYXRoICRXb3JraW5nRGlyZWN0b3J5IC1OYW1lICd3b3JraW5nJyAtSXRlbVR5cGUgRGlyZWN0b3J5DQokbW9kdWxlc0ZvbGRlciA9IE5ldy1JdGVtIC1QYXRoICR3b3JraW5nUm9vdC5GdWxsTmFtZSAtTmFtZSBNb2R1bGVzIC1JdGVtVHlwZSBEaXJlY3RvcnkNCg0KIyBGaWxsIG91dCB0aGUgbW9kdWxlcyBmb2xkZXINCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgIlRyYW5zZmVyaW5nIGJ1aWx0IG1vZHVsZSBkYXRhIGludG8gd29ya2luZyBkaXJlY3RvcnkiDQpDb3B5LUl0ZW0gLVBhdGggIiRtb2R1bGVSb290XCRtb2R1bGVOYW1lIiAtRGVzdGluYXRpb24gJG1vZHVsZXNGb2xkZXIuRnVsbE5hbWUgLVJlY3Vyc2UgLUZvcmNlDQpmb3JlYWNoICgkZGVwZW5kZW5jeSBpbiAoSW1wb3J0LVBvd2VyU2hlbGxEYXRhRmlsZSAtUGF0aCAiJG1vZHVsZVJvb3RcJG1vZHVsZU5hbWVcJG1vZHVsZU5hbWUucHNkMSIpLlJlcXVpcmVkTW9kdWxlcykNCnsNCgkkcGFyYW0gPSBAew0KCQlSZXBvc2l0b3J5ID0gJFJlcG9zaXRvcnkNCgkJTmFtZQkgICA9ICRkZXBlbmRlbmN5Lk1vZHVsZU5hbWUNCgkJUGF0aAkgICA9ICRtb2R1bGVzRm9sZGVyLkZ1bGxOYW1lDQoJfQ0KCWlmICgkZGVwZW5kZW5jeSAtaXMgW3N0cmluZ10pIHsgJHBhcmFtWydOYW1lJ10gPSAkZGVwZW5kZW5jeSB9DQoJaWYgKCRkZXBlbmRlbmN5LlJlcXVpcmVkVmVyc2lvbikNCgl7DQoJCSRwYXJhbVsnUmVxdWlyZWRWZXJzaW9uJ10gPSAkZGVwZW5kZW5jeS5SZXF1aXJlZFZlcnNpb24NCgl9DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAiUHJlcGFyaW5nIERlcGVuZGVuY3k6ICQoJHBhcmFtWydOYW1lJ10pIg0KCVNhdmUtTW9kdWxlIEBwYXJhbQ0KfQ0KDQojIEdlbmVyYXRlIGZ1bmN0aW9uIGNvbmZpZ3VyYXRpb24NCldyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEhvc3QgLU1lc3NhZ2UgJ0dlbmVyYXRpbmcgZnVuY3Rpb24gY29uZmlndXJhdGlvbicNCiRydW5UZW1wbGF0ZSA9IEdldC1Db250ZW50IC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXHJ1bi5wczEiIC1SYXcNCmZvcmVhY2ggKCRmdW5jdGlvblNvdXJjZUZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gLVBhdGggIiQoJG1vZHVsZVJvb3QpXCRtb2R1bGVOYW1lXGZ1bmN0aW9ucyIgLVJlY3Vyc2UgLUZpbHRlciAnKi5wczEnKSkNCnsNCglXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICIgIFByb2Nlc3NpbmcgZnVuY3Rpb246ICRmdW5jdGlvblNvdXJjZUZpbGUiDQoJJGNvbmRlbnNlZE5hbWUgPSAkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lIC1yZXBsYWNlICctJywgJycNCgkkZnVuY3Rpb25Gb2xkZXIgPSBOZXctSXRlbSAtUGF0aCAkd29ya2luZ1Jvb3QuRnVsbE5hbWUgLU5hbWUgJGNvbmRlbnNlZE5hbWUgLUl0ZW1UeXBlIERpcmVjdG9yeQ0KCQ0KCSNyZWdpb24gTG9hZCBPdmVycmlkZXMNCgkkb3ZlcnJpZGUgPSBAeyB9DQoJaWYgKFRlc3QtUGF0aCAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZSkucHNkMSIpDQoJew0KCQkkb3ZlcnJpZGUgPSBJbXBvcnQtUG93ZXJTaGVsbERhdGFGaWxlIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkZnVuY3Rpb25Tb3VyY2VGaWxlLkJhc2VOYW1lKS5wc2QxIg0KCX0NCglpZiAoVGVzdC1QYXRoIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkY29uZGVuc2VkTmFtZSkucHNkMSIpDQoJew0KCQkkb3ZlcnJpZGUgPSBJbXBvcnQtUG93ZXJTaGVsbERhdGFGaWxlIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkY29uZGVuc2VkTmFtZSkucHNkMSINCgl9DQoJI2VuZHJlZ2lvbiBMb2FkIE92ZXJyaWRlcw0KCQ0KCSNyZWdpb24gQ3JlYXRlIEZ1bmN0aW9uIENvbmZpZ3VyYXRpb24NCgkkcmVzdE1ldGhvZHMgPSAnZ2V0JywgJ3Bvc3QnDQoJaWYgKCRvdmVycmlkZS5SZXN0TWV0aG9kcykgeyAkcmVzdE1ldGhvZHMgPSAkb3ZlcnJpZGUuUmVzdE1ldGhvZHMgfQ0KCQ0KCVNldC1Db250ZW50IC1QYXRoICIkKCRmdW5jdGlvbkZvbGRlci5GdWxsTmFtZSlcZnVuY3Rpb24uanNvbiIgLVZhbHVlIEAiDQp7DQogICAgImJpbmRpbmdzIjogWw0KICAgICAgICB7DQogICAgICAgICJhdXRoTGV2ZWwiOiAiZnVuY3Rpb24iLA0KICAgICAgICAidHlwZSI6ICJodHRwVHJpZ2dlciIsDQogICAgICAgICJkaXJlY3Rpb24iOiAiaW4iLA0KICAgICAgICAibmFtZSI6ICJSZXF1ZXN0IiwNCiAgICAgICAgIm1ldGhvZHMiOiBbDQogICAgICAgICAgICAiJCgkcmVzdE1ldGhvZHMgLWpvaW4gImAiLA0KICAgICAgICAgICAgYCIiKSINCiAgICAgICAgXQ0KICAgICAgICB9LA0KICAgICAgICB7DQogICAgICAgICJ0eXBlIjogImh0dHAiLA0KICAgICAgICAiZGlyZWN0aW9uIjogIm91dCIsDQogICAgICAgICJuYW1lIjogIlJlc3BvbnNlIg0KICAgICAgICB9DQogICAgXSwNCiAgICAiZGlzYWJsZWQiOiBmYWxzZQ0KfQ0KIkANCgkjZW5kcmVnaW9uIENyZWF0ZSBGdW5jdGlvbiBDb25maWd1cmF0aW9uDQoJDQoJI3JlZ2lvbiBPdmVycmlkZSBGdW5jdGlvbiBDb25maWd1cmF0aW9uDQoJaWYgKFRlc3QtUGF0aCAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xmdW5jdGlvbk92ZXJyaWRlXCQoJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZSkuanNvbiIpDQoJew0KCQlDb3B5LUl0ZW0gLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVwkKCRmdW5jdGlvblNvdXJjZUZpbGUuQmFzZU5hbWUpLmpzb24iIC1EZXN0aW5hdGlvbiAiJCgkZnVuY3Rpb25Gb2xkZXIuRnVsbE5hbWUpXGZ1bmN0aW9uLmpzb24iIC1Gb3JjZQ0KCX0NCglpZiAoVGVzdC1QYXRoIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGZ1bmN0aW9uT3ZlcnJpZGVcJCgkY29uZGVuc2VkTmFtZSkuanNvbiIpDQoJew0KCQlDb3B5LUl0ZW0gLVBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVwkKCRjb25kZW5zZWROYW1lKS5qc29uIiAtRGVzdGluYXRpb24gIiQoJGZ1bmN0aW9uRm9sZGVyLkZ1bGxOYW1lKVxmdW5jdGlvbi5qc29uIiAtRm9yY2UNCgl9DQoJI2VuZHJlZ2lvbiBPdmVycmlkZSBGdW5jdGlvbiBDb25maWd1cmF0aW9uDQoJDQoJIyBHZW5lcmF0ZSB0aGUgcnVuLnBzMSBmaWxlDQoJJHJ1blRleHQgPSAkcnVuVGVtcGxhdGUgLXJlcGxhY2UgJyVmdW5jdGlvbm5hbWUlJywgJGZ1bmN0aW9uU291cmNlRmlsZS5CYXNlTmFtZQ0KCSRydW5UZXh0IHwgU2V0LUNvbnRlbnQgLVBhdGggIiQoJGZ1bmN0aW9uRm9sZGVyLkZ1bGxOYW1lKVxydW4ucHMxIiAtRW5jb2RpbmcgVVRGOA0KfQ0KDQojIFRyYW5zZmVyIGNvbW1vbiBmaWxlcw0KV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSG9zdCAtTWVzc2FnZSAiVHJhbnNmZXJpbmcgY29yZSBmdW5jdGlvbiBkYXRhIg0KaWYgKCRJbmNsdWRlQVopDQp7DQoJQ29weS1JdGVtIC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXGhvc3QtYXouanNvbiIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5ncm9vdC5GdWxsTmFtZSlcaG9zdC5qc29uIg0KCUNvcHktSXRlbSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xyZXF1aXJlbWVudHMucHNkMSIgLURlc3RpbmF0aW9uICIkKCR3b3JraW5ncm9vdC5GdWxsTmFtZSlcIg0KfQ0KZWxzZQ0Kew0KCUNvcHktSXRlbSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xob3N0Lmpzb24iIC1EZXN0aW5hdGlvbiAiJCgkd29ya2luZ3Jvb3QuRnVsbE5hbWUpXCINCn0NCkNvcHktSXRlbSAtUGF0aCAiJCgkV29ya2luZ0RpcmVjdG9yeSlcYXpGdW5jdGlvblJlc291cmNlc1xsb2NhbC5zZXR0aW5ncy5qc29uIiAtRGVzdGluYXRpb24gIiQoJHdvcmtpbmdyb290LkZ1bGxOYW1lKVwiDQoNCiMgQnVpbGQgdGhlIHByb2ZpbGUgZmlsZQ0KJHRleHQgPSBAKCkNCiR0ZXh0ICs9IEdldC1Db250ZW50IC1QYXRoICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXHByb2ZpbGUucHMxIiAtUmF3DQpmb3JlYWNoICgkZnVuY3Rpb25GaWxlIGluIChHZXQtQ2hpbGRJdGVtICIkKCRXb3JraW5nRGlyZWN0b3J5KVxhekZ1bmN0aW9uUmVzb3VyY2VzXHByb2ZpbGVGdW5jdGlvbnMiIC1SZWN1cnNlKSkNCnsNCgkkdGV4dCArPSBHZXQtQ29udGVudCAtUGF0aCAkZnVuY3Rpb25GaWxlLkZ1bGxOYW1lIC1SYXcNCn0NCiR0ZXh0IC1qb2luICJgbmBuIiB8IFNldC1Db250ZW50ICIkKCR3b3JraW5ncm9vdC5GdWxsTmFtZSlccHJvZmlsZS5wczEiDQoNCiMgWmlwIEl0DQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBIb3N0IC1NZXNzYWdlICJDcmVhdGluZyBmdW5jdGlvbiBhcmNoaXZlIGluICckKCRXb3JraW5nRGlyZWN0b3J5KVwkbW9kdWxlTmFtZS56aXAnIg0KQ29tcHJlc3MtQXJjaGl2ZSAtUGF0aCAiJCgkd29ya2luZ3Jvb3QuRnVsbE5hbWUpXCoiIC1EZXN0aW5hdGlvblBhdGggIiQoJFdvcmtpbmdEaXJlY3RvcnkpXCRtb2R1bGVOYW1lLnppcCIgLUZvcmNlAQlXAQAACVgBAAAGWQEAABh2c3RzLXBhY2thZ2VGdW5jdGlvbi5wczEGWgEAAB5idWlsZFx2c3RzLXBhY2thZ2VGdW5jdGlvbi5wczEJWgAAAAlcAQAACV0BAAAB0wAAADwAAAAGXgEAAKYGcGFyYW0gKA0KICAgIFtzdHJpbmddDQogICAgJFJlcG9zaXRvcnkgPSAnUFNHYWxsZXJ5Jw0KKQ0KDQokbW9kdWxlcyA9IEAoIlBlc3RlciIsICJQU0ZyYW1ld29yayIsICJQU01vZHVsZURldmVsb3BtZW50IiwgIlBTU2NyaXB0QW5hbHl6ZXIiKQ0KDQojIEF1dG9tYXRpY2FsbHkgYWRkIG1pc3NpbmcgZGVwZW5kZW5jaWVzDQokZGF0YSA9IEltcG9ydC1Qb3dlclNoZWxsRGF0YUZpbGUgLVBhdGggIiRQU1NjcmlwdFJvb3RcLi5cw75uYW1lw75cw75uYW1lw74ucHNkMSINCmZvcmVhY2ggKCRkZXBlbmRlbmN5IGluICRkYXRhLlJlcXVpcmVkTW9kdWxlcykgew0KICAgIGlmICgkZGVwZW5kZW5jeSAtaXMgW3N0cmluZ10pIHsNCiAgICAgICAgaWYgKCRtb2R1bGVzIC1jb250YWlucyAkZGVwZW5kZW5jeSkgeyBjb250aW51ZSB9DQogICAgICAgICRtb2R1bGVzICs9ICRkZXBlbmRlbmN5DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBpZiAoJG1vZHVsZXMgLWNvbnRhaW5zICRkZXBlbmRlbmN5Lk1vZHVsZU5hbWUpIHsgY29udGludWUgfQ0KICAgICAgICAkbW9kdWxlcyArPSAkZGVwZW5kZW5jeS5Nb2R1bGVOYW1lDQogICAgfQ0KfQ0KDQpmb3JlYWNoICgkbW9kdWxlIGluICRtb2R1bGVzKSB7DQogICAgV3JpdGUtSG9zdCAiSW5zdGFsbGluZyAkbW9kdWxlIiAtRm9yZWdyb3VuZENvbG9yIEN5YW4NCiAgICBJbnN0YWxsLU1vZHVsZSAkbW9kdWxlIC1Gb3JjZSAtU2tpcFB1Ymxpc2hlckNoZWNrIC1SZXBvc2l0b3J5ICRSZXBvc2l0b3J5DQogICAgSW1wb3J0LU1vZHVsZSAkbW9kdWxlIC1Gb3JjZSAtUGFzc1RocnUNCn0BCV8BAAAJYAEAAAZhAQAAFnZzdHMtcHJlcmVxdWlzaXRlcy5wczEGYgEAABxidWlsZFx2c3RzLXByZXJlcXVpc2l0ZXMucHMxCVoAAAAJZAEAAAllAQAAAdQAAAA8AAAABmYBAADKAiMgR3VpZGUgZm9yIGF2YWlsYWJsZSB2YXJpYWJsZXMgYW5kIHdvcmtpbmcgd2l0aCBzZWNyZXRzOg0KIyBodHRwczovL2RvY3MubWljcm9zb2Z0LmNvbS9lbi11cy92c3RzL2J1aWxkLXJlbGVhc2UvY29uY2VwdHMvZGVmaW5pdGlvbnMvYnVpbGQvdmFyaWFibGVzP3RhYnM9cG93ZXJzaGVsbA0KDQojIE5lZWRzIHRvIGVuc3VyZSB0aGluZ3MgYXJlIERvbmUgUmlnaHQgYW5kIG9ubHkgbGVnYWwgY29tbWl0cyB0byBtYXN0ZXIgZ2V0IGJ1aWx0DQoNCiMgUnVuIGludGVybmFsIHBlc3RlciB0ZXN0cw0KJiAiJFBTU2NyaXB0Um9vdFwuLlzDvm5hbWXDvlx0ZXN0c1xwZXN0ZXIucHMxIgEJZwEAAAloAQAABmkBAAARdnN0cy12YWxpZGF0ZS5wczEGagEAABdidWlsZFx2c3RzLXZhbGlkYXRlLnBzMQlaAAAACWwBAAAJbQEAAAHVAAAANwAAAAluAQAABm8BAAAIw75uYW1lw74GcAEAABBsaWJyYXJ5XMO+bmFtZcO+CVoAAAAJcgEAAAlzAQAAAdYAAAA3AAAACXQBAAAGdQEAAANiaW4GdgEAAAzDvm5hbWXDvlxiaW4JWgAAAAl4AQAACXkBAAAB1wAAADcAAAAJegEAAAZ7AQAABWVuLXVzBnwBAAAOw75uYW1lw75cZW4tdXMJWgAAAAl+AQAACX8BAAAB2AAAADcAAAAJgAEAAAaBAQAACWZ1bmN0aW9ucwaCAQAAEsO+bmFtZcO+XGZ1bmN0aW9ucwlaAAAACYQBAAAJhQEAAAHZAAAANwAAAAmGAQAABocBAAAIaW50ZXJuYWwGiAEAABHDvm5hbWXDvlxpbnRlcm5hbAlaAAAACYoBAAAJiwEAAAHaAAAANwAAAAmMAQAABo0BAAAFdGVzdHMGjgEAAA7Dvm5hbWXDvlx0ZXN0cwlaAAAACZABAAAJkQEAAAHbAAAANwAAAAmSAQAABpMBAAADeG1sBpQBAAAMw75uYW1lw75ceG1sCVoAAAAJlgEAAAmXAQAAAdwAAAA8AAAABpgBAABuIyBDaGFuZ2Vsb2cNCiMjIDEuMC4wICjDviFkeW5hbWljc2NyaXB0XzQ4NDk5MSHDvikNCiAtIE5ldzogU29tZSBTdHVmZg0KIC0gVXBkOiBNb2FyIFN0dWZmDQogLSBGaXg6IE11Y2ggU3R1ZmYBCZkBAAAJmgEAAAabAQAADGNoYW5nZWxvZy5tZAacAQAAFcO+bmFtZcO+XGNoYW5nZWxvZy5tZAlaAAAACZ4BAAAJnwEAAAHdAAAAPAAAAAagAQAAjggjIFBTRk1vZHVsZSBndWlkYW5jZQ0KDQpUaGlzIGlzIGEgZmluaXNoZWQgbW9kdWxlIGxheW91dCBvcHRpbWl6ZWQgZm9yIGltcGxlbWVudGluZyB0aGUgUFNGcmFtZXdvcmsuDQoNCklmIHlvdSBkb24ndCBjYXJlIHRvIGRlYWwgd2l0aCB0aGUgZGV0YWlscywgdGhpcyBpcyB3aGF0IHlvdSBuZWVkIHRvIGRvIHRvIGdldCBzdGFydGVkIHNlZWluZyByZXN1bHRzOg0KDQogLSBBZGQgdGhlIGZ1bmN0aW9ucyB5b3Ugd2FudCB0byBwdWJsaXNoIHRvIGAvZnVuY3Rpb25zL2ANCiAtIFVwZGF0ZSB0aGUgYEZ1bmN0aW9uc1RvRXhwb3J0YCBub2RlIGluIHRoZSBtb2R1bGUgbWFuaWZlc3QgKMO+bmFtZcO+LnBzZDEpLiBBbGwgZnVuY3Rpb25zIHlvdSB3YW50IHRvIHB1Ymxpc2ggc2hvdWxkIGJlIGluIGEgbGlzdC4NCiAtIEFkZCBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb25zIHRoZSB1c2VyIHNob3VsZCBub3Qgc2VlIHRvIGAvaW50ZXJuYWwvZnVuY3Rpb25zL2ANCiANCiAjIyBQYXRoIFdhcm5pbmcNCiANCiA+IElmIHlvdSB3YW50IHlvdXIgbW9kdWxlIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBMaW51eCBhbmQgTWFjT1MsIGtlZXAgaW4gbWluZCB0aGF0IHRob3NlIE9TIGFyZSBjYXNlIHNlbnNpdGl2ZSBmb3IgcGF0aHMgYW5kIGZpbGVzLg0KIA0KIGBJbXBvcnQtTW9kdWxlRmlsZWAgaXMgcHJlY29uZmlndXJlZCB0byByZXNvbHZlIHRoZSBwYXRoIG9mIHRoZSBmaWxlcyBzcGVjaWZpZWQsIHNvIGl0IHdpbGwgcmVsaWFibHkgY29udmVydCB3ZWlyZCBwYXRoIG5vdGF0aW9ucyB0aGUgc3lzdGVtIGNhbid0IGhhbmRsZS4NCiBDb250ZW50IGltcG9ydGVkIHRocm91Z2ggdGhhdCBjb21tYW5kIHRodXMgbmVlZCBub3QgbWluZCB0aGUgcGF0aCBzZXBhcmF0b3IuDQogSWYgeW91IHdhbnQgdG8gbWFrZSBzdXJlIHlvdXIgY29kZSB0b28gd2lsbCBzdXJ2aXZlIE9TLXNwZWNpZmljIHBhdGggbm90YXRpb25zLCBnZXQgdXNlZCB0byB1c2luZyBgUmVzb2x2ZS1wYXRoYCBvciB0aGUgbW9yZSBwb3dlcmZ1bCBgUmVzb2x2ZS1QU0ZQYXRoYC4BCaEBAAAJogEAAAajAQAACXJlYWRtZS5tZAakAQAAEsO+bmFtZcO+XHJlYWRtZS5tZAlaAAAACaYBAAAJpwEAAAHeAAAAPAAAAAaoAQAAphJAew0KCSMgU2NyaXB0IG1vZHVsZSBvciBiaW5hcnkgbW9kdWxlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWFuaWZlc3QNCglSb290TW9kdWxlID0gJ8O+bmFtZcO+LnBzbTEnDQoJDQoJIyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIG1vZHVsZS4NCglNb2R1bGVWZXJzaW9uID0gJzEuMC4wJw0KCQ0KCSMgSUQgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGlzIG1vZHVsZQ0KCUdVSUQgPSAnw74hZ3VpZCHDvicNCgkNCgkjIEF1dGhvciBvZiB0aGlzIG1vZHVsZQ0KCUF1dGhvciA9ICfDvmF1dGhvcsO+Jw0KCQ0KCSMgQ29tcGFueSBvciB2ZW5kb3Igb2YgdGhpcyBtb2R1bGUNCglDb21wYW55TmFtZSA9ICfDvmNvbXBhbnnDvicNCgkNCgkjIENvcHlyaWdodCBzdGF0ZW1lbnQgZm9yIHRoaXMgbW9kdWxlDQoJQ29weXJpZ2h0ID0gJ0NvcHlyaWdodCAoYykgw74heWVhciHDviDDvmF1dGhvcsO+Jw0KCQ0KCSMgRGVzY3JpcHRpb24gb2YgdGhlIGZ1bmN0aW9uYWxpdHkgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUNCglEZXNjcmlwdGlvbiA9ICfDvmRlc2NyaXB0aW9uw74nDQoJDQoJIyBNaW5pbXVtIHZlcnNpb24gb2YgdGhlIFdpbmRvd3MgUG93ZXJTaGVsbCBlbmdpbmUgcmVxdWlyZWQgYnkgdGhpcyBtb2R1bGUNCglQb3dlclNoZWxsVmVyc2lvbiA9ICc1LjAnDQoJDQoJIyBNb2R1bGVzIHRoYXQgbXVzdCBiZSBpbXBvcnRlZCBpbnRvIHRoZSBnbG9iYWwgZW52aXJvbm1lbnQgcHJpb3IgdG8gaW1wb3J0aW5nDQoJIyB0aGlzIG1vZHVsZQ0KCVJlcXVpcmVkTW9kdWxlcyA9IEAoDQoJCUB7IE1vZHVsZU5hbWU9J1BTRnJhbWV3b3JrJzsgTW9kdWxlVmVyc2lvbj0nw74hcHNmcmFtZXdvcmshw74nIH0NCgkpDQoJDQoJIyBBc3NlbWJsaWVzIHRoYXQgbXVzdCBiZSBsb2FkZWQgcHJpb3IgdG8gaW1wb3J0aW5nIHRoaXMgbW9kdWxlDQoJIyBSZXF1aXJlZEFzc2VtYmxpZXMgPSBAKCdiaW5cw75uYW1lw74uZGxsJykNCgkNCgkjIFR5cGUgZmlsZXMgKC5wczF4bWwpIHRvIGJlIGxvYWRlZCB3aGVuIGltcG9ydGluZyB0aGlzIG1vZHVsZQ0KCSMgVHlwZXNUb1Byb2Nlc3MgPSBAKCd4bWxcw75uYW1lw74uVHlwZXMucHMxeG1sJykNCgkNCgkjIEZvcm1hdCBmaWxlcyAoLnBzMXhtbCkgdG8gYmUgbG9hZGVkIHdoZW4gaW1wb3J0aW5nIHRoaXMgbW9kdWxlDQoJIyBGb3JtYXRzVG9Qcm9jZXNzID0gQCgneG1sXMO+bmFtZcO+LkZvcm1hdC5wczF4bWwnKQ0KCQ0KCSMgRnVuY3Rpb25zIHRvIGV4cG9ydCBmcm9tIHRoaXMgbW9kdWxlDQoJRnVuY3Rpb25zVG9FeHBvcnQgPSAnJw0KCQ0KCSMgQ21kbGV0cyB0byBleHBvcnQgZnJvbSB0aGlzIG1vZHVsZQ0KCUNtZGxldHNUb0V4cG9ydCA9ICcnDQoJDQoJIyBWYXJpYWJsZXMgdG8gZXhwb3J0IGZyb20gdGhpcyBtb2R1bGUNCglWYXJpYWJsZXNUb0V4cG9ydCA9ICcnDQoJDQoJIyBBbGlhc2VzIHRvIGV4cG9ydCBmcm9tIHRoaXMgbW9kdWxlDQoJQWxpYXNlc1RvRXhwb3J0ID0gJycNCgkNCgkjIExpc3Qgb2YgYWxsIG1vZHVsZXMgcGFja2FnZWQgd2l0aCB0aGlzIG1vZHVsZQ0KCU1vZHVsZUxpc3QgPSBAKCkNCgkNCgkjIExpc3Qgb2YgYWxsIGZpbGVzIHBhY2thZ2VkIHdpdGggdGhpcyBtb2R1bGUNCglGaWxlTGlzdCA9IEAoKQ0KCQ0KCSMgUHJpdmF0ZSBkYXRhIHRvIHBhc3MgdG8gdGhlIG1vZHVsZSBzcGVjaWZpZWQgaW4gTW9kdWxlVG9Qcm9jZXNzLiBUaGlzIG1heSBhbHNvIGNvbnRhaW4gYSBQU0RhdGEgaGFzaHRhYmxlIHdpdGggYWRkaXRpb25hbCBtb2R1bGUgbWV0YWRhdGEgdXNlZCBieSBQb3dlclNoZWxsLg0KCVByaXZhdGVEYXRhID0gQHsNCgkJDQoJCSNTdXBwb3J0IGZvciBQb3dlclNoZWxsR2V0IGdhbGxlcmllcy4NCgkJUFNEYXRhID0gQHsNCgkJCQ0KCQkJIyBUYWdzIGFwcGxpZWQgdG8gdGhpcyBtb2R1bGUuIFRoZXNlIGhlbHAgd2l0aCBtb2R1bGUgZGlzY292ZXJ5IGluIG9ubGluZSBnYWxsZXJpZXMuDQoJCQkjIFRhZ3MgPSBAKCkNCgkJCQ0KCQkJIyBBIFVSTCB0byB0aGUgbGljZW5zZSBmb3IgdGhpcyBtb2R1bGUuDQoJCQkjIExpY2Vuc2VVcmkgPSAnJw0KCQkJDQoJCQkjIEEgVVJMIHRvIHRoZSBtYWluIHdlYnNpdGUgZm9yIHRoaXMgcHJvamVjdC4NCgkJCSMgUHJvamVjdFVyaSA9ICcnDQoJCQkNCgkJCSMgQSBVUkwgdG8gYW4gaWNvbiByZXByZXNlbnRpbmcgdGhpcyBtb2R1bGUuDQoJCQkjIEljb25VcmkgPSAnJw0KCQkJDQoJCQkjIFJlbGVhc2VOb3RlcyBvZiB0aGlzIG1vZHVsZQ0KCQkJIyBSZWxlYXNlTm90ZXMgPSAnJw0KCQkJDQoJCX0gIyBFbmQgb2YgUFNEYXRhIGhhc2h0YWJsZQ0KCQkNCgl9ICMgRW5kIG9mIFByaXZhdGVEYXRhIGhhc2h0YWJsZQ0KfQEJqQEAAAmqAQAABqsBAAANw75uYW1lw74ucHNkMQasAQAAFsO+bmFtZcO+XMO+bmFtZcO+LnBzZDEJWgAAAAmuAQAACa8BAAAB3wAAADwAAAAGsAEAANMYJHNjcmlwdDpNb2R1bGVSb290ID0gJFBTU2NyaXB0Um9vdA0KJHNjcmlwdDpNb2R1bGVWZXJzaW9uID0gKEltcG9ydC1Qb3dlclNoZWxsRGF0YUZpbGUgLVBhdGggIiQoJHNjcmlwdDpNb2R1bGVSb290KVzDvm5hbWXDvi5wc2QxIikuTW9kdWxlVmVyc2lvbg0KDQojIERldGVjdCB3aGV0aGVyIGF0IHNvbWUgbGV2ZWwgZG90c291cmNpbmcgd2FzIGVuZm9yY2VkDQokc2NyaXB0OmRvRG90U291cmNlID0gR2V0LVBTRkNvbmZpZ1ZhbHVlIC1GdWxsTmFtZSDDvm5hbWXDvi5JbXBvcnQuRG9Eb3RTb3VyY2UgLUZhbGxiYWNrICRmYWxzZQ0KaWYgKCTDvm5hbWXDvl9kb3Rzb3VyY2Vtb2R1bGUpIHsgJHNjcmlwdDpkb0RvdFNvdXJjZSA9ICR0cnVlIH0NCg0KPCMNCk5vdGUgb24gUmVzb2x2ZS1QYXRoOg0KQWxsIHBhdGhzIGFyZSBzZW50IHRocm91Z2ggUmVzb2x2ZS1QYXRoL1Jlc29sdmUtUFNGUGF0aCBpbiBvcmRlciB0byBjb252ZXJ0IHRoZW0gdG8gdGhlIGNvcnJlY3QgcGF0aCBzZXBhcmF0b3IuDQpUaGlzIGFsbG93cyBpZ25vcmluZyBwYXRoIHNlcGFyYXRvcnMgdGhyb3VnaG91dCB0aGUgaW1wb3J0IHNlcXVlbmNlLCB3aGljaCBjb3VsZCBvdGhlcndpc2UgY2F1c2UgdHJvdWJsZSBkZXBlbmRpbmcgb24gT1MuDQpSZXNvbHZlLVBhdGggY2FuIG9ubHkgYmUgdXNlZCBmb3IgcGF0aHMgdGhhdCBhbHJlYWR5IGV4aXN0LCBSZXNvbHZlLVBTRlBhdGggY2FuIGFjY2VwdCB0aGF0IHRoZSBsYXN0IGxlYWYgbXkgbm90IGV4aXN0Lg0KVGhpcyBpcyBpbXBvcnRhbnQgd2hlbiB0ZXN0aW5nIGZvciBwYXRocy4NCiM+DQoNCiMgRGV0ZWN0IHdoZXRoZXIgYXQgc29tZSBsZXZlbCBsb2FkaW5nIGluZGl2aWR1YWwgbW9kdWxlIGZpbGVzLCByYXRoZXIgdGhhbiB0aGUgY29tcGlsZWQgbW9kdWxlIHdhcyBlbmZvcmNlZA0KJGltcG9ydEluZGl2aWR1YWxGaWxlcyA9IEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgw75uYW1lw74uSW1wb3J0LkluZGl2aWR1YWxGaWxlcyAtRmFsbGJhY2sgJGZhbHNlDQppZiAoJMO+bmFtZcO+X2ltcG9ydEluZGl2aWR1YWxGaWxlcykgeyAkaW1wb3J0SW5kaXZpZHVhbEZpbGVzID0gJHRydWUgfQ0KaWYgKFRlc3QtUGF0aCAoUmVzb2x2ZS1QU0ZQYXRoIC1QYXRoICIkKCRzY3JpcHQ6TW9kdWxlUm9vdClcLi5cLmdpdCIgLVNpbmdsZUl0ZW0gLU5ld0NoaWxkKSkgeyAkaW1wb3J0SW5kaXZpZHVhbEZpbGVzID0gJHRydWUgfQ0KaWYgKCI8d2FzIG5vdCBjb21waWxlZD4iIC1lcSAnPHdhcyBub3QgY29tcGlsZWQ+JykgeyAkaW1wb3J0SW5kaXZpZHVhbEZpbGVzID0gJHRydWUgfQ0KCQ0KZnVuY3Rpb24gSW1wb3J0LU1vZHVsZUZpbGUNCnsNCgk8Iw0KCQkuU1lOT1BTSVMNCgkJCUxvYWRzIGZpbGVzIGludG8gdGhlIG1vZHVsZSBvbiBtb2R1bGUgaW1wb3J0Lg0KCQkNCgkJLkRFU0NSSVBUSU9ODQoJCQlUaGlzIGhlbHBlciBmdW5jdGlvbiBpcyB1c2VkIGR1cmluZyBtb2R1bGUgaW5pdGlhbGl6YXRpb24uDQoJCQlJdCBzaG91bGQgYWx3YXlzIGJlIGRvdHNvdXJjZWQgaXRzZWxmLCBpbiBvcmRlciB0byBwcm9wZXIgZnVuY3Rpb24uDQoJCQkNCgkJCVRoaXMgcHJvdmlkZXMgYSBjZW50cmFsIGxvY2F0aW9uIHRvIHJlYWN0IHRvIGZpbGVzIGJlaW5nIGltcG9ydGVkLCBpZiBsYXRlciBkZXNpcmVkDQoJCQ0KCQkuUEFSQU1FVEVSIFBhdGgNCgkJCVRoZSBwYXRoIHRvIHRoZSBmaWxlIHRvIGxvYWQNCgkJDQoJCS5FWEFNUExFDQoJCQlQUyBDOlw+IC4gSW1wb3J0LU1vZHVsZUZpbGUgLUZpbGUgJGZ1bmN0aW9uLkZ1bGxOYW1lDQoJDQoJCQlJbXBvcnRzIHRoZSBmaWxlIHN0b3JlZCBpbiAkZnVuY3Rpb24gYWNjb3JkaW5nIHRvIGltcG9ydCBwb2xpY3kNCgkjPg0KCVtDbWRsZXRCaW5kaW5nKCldDQoJUGFyYW0gKA0KCQlbc3RyaW5nXQ0KCQkkUGF0aA0KCSkNCgkNCgkkcmVzb2x2ZWRQYXRoID0gJEV4ZWN1dGlvbkNvbnRleHQuU2Vzc2lvblN0YXRlLlBhdGguR2V0UmVzb2x2ZWRQU1BhdGhGcm9tUFNQYXRoKCRQYXRoKS5Qcm92aWRlclBhdGgNCglpZiAoJGRvRG90U291cmNlKSB7IC4gJHJlc29sdmVkUGF0aCB9DQoJZWxzZSB7ICRFeGVjdXRpb25Db250ZXh0Lkludm9rZUNvbW1hbmQuSW52b2tlU2NyaXB0KCRmYWxzZSwgKFtzY3JpcHRibG9ja106OkNyZWF0ZShbaW8uZmlsZV06OlJlYWRBbGxUZXh0KCRyZXNvbHZlZFBhdGgpKSksICRudWxsLCAkbnVsbCkgfQ0KfQ0KDQojcmVnaW9uIExvYWQgaW5kaXZpZHVhbCBmaWxlcw0KaWYgKCRpbXBvcnRJbmRpdmlkdWFsRmlsZXMpDQp7DQoJIyBFeGVjdXRlIFByZWltcG9ydCBhY3Rpb25zDQoJZm9yZWFjaCAoJHBhdGggaW4gKCYgIiRNb2R1bGVSb290XGludGVybmFsXHNjcmlwdHNccHJlaW1wb3J0LnBzMSIpKSB7DQoJCS4gSW1wb3J0LU1vZHVsZUZpbGUgLVBhdGggJHBhdGgNCgl9DQoJDQoJIyBJbXBvcnQgYWxsIGludGVybmFsIGZ1bmN0aW9ucw0KCWZvcmVhY2ggKCRmdW5jdGlvbiBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcaW50ZXJuYWxcZnVuY3Rpb25zIiAtRmlsdGVyICIqLnBzMSIgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIElnbm9yZSkpDQoJew0KCQkuIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICRmdW5jdGlvbi5GdWxsTmFtZQ0KCX0NCgkNCgkjIEltcG9ydCBhbGwgcHVibGljIGZ1bmN0aW9ucw0KCWZvcmVhY2ggKCRmdW5jdGlvbiBpbiAoR2V0LUNoaWxkSXRlbSAiJE1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtRmlsdGVyICIqLnBzMSIgLVJlY3Vyc2UgLUVycm9yQWN0aW9uIElnbm9yZSkpDQoJew0KCQkuIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICRmdW5jdGlvbi5GdWxsTmFtZQ0KCX0NCgkNCgkjIEV4ZWN1dGUgUG9zdGltcG9ydCBhY3Rpb25zDQoJZm9yZWFjaCAoJHBhdGggaW4gKCYgIiRNb2R1bGVSb290XGludGVybmFsXHNjcmlwdHNccG9zdGltcG9ydC5wczEiKSkgew0KCQkuIEltcG9ydC1Nb2R1bGVGaWxlIC1QYXRoICRwYXRoDQoJfQ0KCQ0KCSMgRW5kIGl0IGhlcmUsIGRvIG5vdCBsb2FkIGNvbXBpbGVkIGNvZGUgYmVsb3cNCglyZXR1cm4NCn0NCiNlbmRyZWdpb24gTG9hZCBpbmRpdmlkdWFsIGZpbGVzDQoNCiNyZWdpb24gTG9hZCBjb21waWxlZCBjb2RlDQoiPGNvbXBpbGUgY29kZSBpbnRvIGhlcmU+Ig0KI2VuZHJlZ2lvbiBMb2FkIGNvbXBpbGVkIGNvZGUBCbEBAAAJsgEAAAazAQAADcO+bmFtZcO+LnBzbTEGtAEAABbDvm5hbWXDvlzDvm5hbWXDvi5wc20xCVoAAAAJtgEAAAm3AQAAAeYAAAAMAAAACbgBAAACAAAAAgAAAAHqAAAACAAAAAmwAAAAAAAAAAAAAAAB6wAAAAgAAAAJsAAAAAAAAAAAAAAAAe0AAAAIAAAACbAAAAAAAAAAAAAAAAHuAAAACAAAAAmwAAAAAAAAAAAAAAAB8gAAAAgAAAAJsAAAAAAAAAAAAAAAAfMAAAAIAAAACbAAAAAAAAAAAAAAAAH0AAAADAAAAAm6AQAABAAAAAQAAAAB+AAAAAgAAAAJsAAAAAAAAAAAAAAAAfkAAAAIAAAACbAAAAAAAAAAAAAAAAH6AAAADAAAAAm8AQAAAwAAAAMAAAAB/gAAAAgAAAAJsAAAAAAAAAAAAAAAAf8AAAAIAAAACbAAAAAAAAAAAAAAAAEAAQAADAAAAAm+AQAAAgAAAAIAAAABBAEAAAgAAAAJsAAAAAAAAAAAAAAAAQUBAAAIAAAACbAAAAAAAAAAAAAAAAEHAQAACAAAAAmwAAAAAAAAAAAAAAABCAEAAAgAAAAJsAAAAAAAAAAAAAAAAQwBAAAIAAAACbAAAAAAAAAAAAAAAAENAQAACAAAAAmwAAAAAAAAAAAAAAABDwEAAAgAAAAJsAAAAAAAAAAAAAAAARABAAAIAAAACbAAAAAAAAAAAAAAAAEUAQAACAAAAAmwAAAAAAAAAAAAAAABFQEAAAgAAAAJsAAAAAAAAAAAAAAAARcBAAAIAAAACbAAAAAAAAAAAAAAAAEYAQAACAAAAAmwAAAAAAAAAAAAAAABHAEAAAgAAAAJsAAAAAAAAAAAAAAAAR0BAAAIAAAACbAAAAAAAAAAAAAAAAEfAQAACAAAAAmwAAAAAAAAAAAAAAABIAEAAAgAAAAJsAAAAAAAAAAAAAAAASQBAAAIAAAACbAAAAAAAAAAAAAAAAElAQAACAAAAAmwAAAAAAAAAAAAAAABJwEAAAgAAAAJsAAAAAAAAAAAAAAAASgBAAAIAAAACbAAAAAAAAAAAAAAAAEsAQAACAAAAAmwAAAAAAAAAAAAAAABLQEAAAgAAAAJsAAAAAAAAAAAAAAAAS8BAAAIAAAACbAAAAAAAAAAAAAAAAEwAQAACAAAAAmwAAAAAAAAAAAAAAABNAEAAAgAAAAJsAAAAAAAAAAAAAAAATUBAAAIAAAACbAAAAAAAAAAAAAAAAE3AQAACAAAAAmwAAAAAAAAAAAAAAABOAEAAAgAAAAJsAAAAAAAAAAAAAAAATwBAAAIAAAACbAAAAAAAAAAAAAAAAE9AQAACAAAAAmwAAAAAAAAAAAAAAABPwEAAAgAAAAJsAAAAAAAAAAAAAAAAUABAAAIAAAACbAAAAAAAAAAAAAAAAFEAQAACAAAAAmwAAAAAAAAAAAAAAABRQEAAAgAAAAJsAAAAAAAAAAAAAAAAUcBAAAIAAAACcABAAABAAAAAQAAAAFIAQAACAAAAAmwAAAAAAAAAAAAAAABTAEAAAgAAAAJsAAAAAAAAAAAAAAAAU0BAAAIAAAACbAAAAAAAAAAAAAAAAFPAQAACAAAAAnCAQAAAQAAAAEAAAABUAEAAAgAAAAJsAAAAAAAAAAAAAAAAVQBAAAIAAAACbAAAAAAAAAAAAAAAAFVAQAACAAAAAmwAAAAAAAAAAAAAAABVwEAAAgAAAAJxAEAAAEAAAABAAAAAVgBAAAIAAAACbAAAAAAAAAAAAAAAAFcAQAACAAAAAmwAAAAAAAAAAAAAAABXQEAAAgAAAAJsAAAAAAAAAAAAAAAAV8BAAAIAAAACcYBAAABAAAAAQAAAAFgAQAACAAAAAmwAAAAAAAAAAAAAAABZAEAAAgAAAAJsAAAAAAAAAAAAAAAAWUBAAAIAAAACbAAAAAAAAAAAAAAAAFnAQAACAAAAAnIAQAAAQAAAAEAAAABaAEAAAgAAAAJsAAAAAAAAAAAAAAAAWwBAAAIAAAACbAAAAAAAAAAAAAAAAFtAQAACAAAAAmwAAAAAAAAAAAAAAABbgEAAAwAAAAJygEAAAIAAAACAAAAAXIBAAAIAAAACcsBAAABAAAAAQAAAAFzAQAACAAAAAmwAAAAAAAAAAAAAAABdAEAAAwAAAAJzQEAAAEAAAABAAAAAXgBAAAIAAAACbAAAAAAAAAAAAAAAAF5AQAACAAAAAmwAAAAAAAAAAAAAAABegEAAAwAAAAJzwEAAAIAAAACAAAAAX4BAAAIAAAACbAAAAAAAAAAAAAAAAF/AQAACAAAAAmwAAAAAAAAAAAAAAABgAEAAAwAAAAJ0QEAAAEAAAABAAAAAYQBAAAIAAAACbAAAAAAAAAAAAAAAAGFAQAACAAAAAmwAAAAAAAAAAAAAAABhgEAAAwAAAAJ0wEAAAUAAAAFAAAAAYoBAAAIAAAACbAAAAAAAAAAAAAAAAGLAQAACAAAAAmwAAAAAAAAAAAAAAABjAEAAAwAAAAJ1QEAAAQAAAAEAAAAAZABAAAIAAAACbAAAAAAAAAAAAAAAAGRAQAACAAAAAmwAAAAAAAAAAAAAAABkgEAAAwAAAAJ1wEAAAMAAAADAAAAAZYBAAAIAAAACbAAAAAAAAAAAAAAAAGXAQAACAAAAAmwAAAAAAAAAAAAAAABmQEAAAgAAAAJsAAAAAAAAAAAAAAAAZoBAAAIAAAACdkBAAABAAAAAQAAAAGeAQAACAAAAAmwAAAAAAAAAAAAAAABnwEAAAgAAAAJsAAAAAAAAAAAAAAAAaEBAAAIAAAACdsBAAABAAAAAQAAAAGiAQAACAAAAAmwAAAAAAAAAAAAAAABpgEAAAgAAAAJsAAAAAAAAAAAAAAAAacBAAAIAAAACbAAAAAAAAAAAAAAAAGpAQAACAAAAAndAQAABAAAAAQAAAABqgEAAAgAAAAJ3gEAAAMAAAADAAAAAa4BAAAIAAAACd8BAAABAAAAAQAAAAGvAQAACAAAAAmwAAAAAAAAAAAAAAABsQEAAAgAAAAJ4QEAAAEAAAABAAAAAbIBAAAIAAAACbAAAAAAAAAAAAAAAAG2AQAACAAAAAnjAQAAAQAAAAEAAAABtwEAAAgAAAAJsAAAAAAAAAAAAAAAB7gBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJ5QEAAAnmAQAADQIHugEAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAnnAQAACegBAAAJ6QEAAAnqAQAAB7wBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJ6wEAAAnsAQAACe0BAAAKB74BAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJ7gEAAAnvAQAADQIRwAEAAAQAAAAG8AEAAARuYW1lDQMRwgEAAAQAAAAG8QEAAARuYW1lDQMRxAEAAAQAAAAG8gEAAARuYW1lDQMRxgEAAAQAAAAG8wEAAARuYW1lDQMRyAEAAAQAAAAG9AEAAARuYW1lDQMHygEAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAn1AQAACfYBAAANAhHLAQAABAAAAAb3AQAABG5hbWUNAwfNAQAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACfgBAAANAwfPAQAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACfkBAAAJ+gEAAA0CB9EBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJ+wEAAA0DB9MBAAAAAQAAAAgAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJ/AEAAAn9AQAACf4BAAAJ/wEAAAkAAgAADQMH1QEAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkBAgAACQICAAAJAwIAAAkEAgAAB9cBAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJBQIAAAkGAgAACQcCAAAKEdkBAAAEAAAACTUAAAANAxHbAQAABAAAAAYJAgAABG5hbWUNAxHdAQAABAAAAAYKAgAABG5hbWUGCwIAAAZhdXRob3IGDAIAAAdjb21wYW55Bg0CAAALZGVzY3JpcHRpb24R3gEAAAQAAAAGDgIAAARndWlkBg8CAAAEeWVhcgYQAgAAC3BzZnJhbWV3b3JrChHfAQAABAAAAAYRAgAABG5hbWUNAxHhAQAABAAAAAYSAgAABG5hbWUNAxHjAQAABAAAAAYTAgAABG5hbWUNAwHlAQAAPAAAAAYUAgAA3gNvbjoNCiAgcHVzaDoNCiAgICBicmFuY2hlczoNCiAgICAgIC0gbWFzdGVyDQoNCmpvYnM6DQogIGJ1aWxkOg0KDQogICAgcnVucy1vbjogd2luZG93cy0yMDE5DQoNCiAgICBzdGVwczoNCiAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjENCiAgICAtIG5hbWU6IEluc3RhbGwgUHJlcmVxdWlzaXRlcw0KICAgICAgcnVuOiAuXGJ1aWxkXHZzdHMtcHJlcmVxdWlzaXRlcy5wczENCiAgICAgIHNoZWxsOiBwb3dlcnNoZWxsDQogICAgLSBuYW1lOiBWYWxpZGF0ZQ0KICAgICAgcnVuOiAuXGJ1aWxkXHZzdHMtdmFsaWRhdGUucHMxDQogICAgICBzaGVsbDogcG93ZXJzaGVsbA0KICAgIC0gbmFtZTogQnVpbGQNCiAgICAgIHJ1bjogLlxidWlsZFx2c3RzLWJ1aWxkLnBzMSAtQXBpS2V5ICRlbnY6QVBJS0VZDQogICAgICBzaGVsbDogcG93ZXJzaGVsbA0KICAgICAgZW52Og0KICAgICAgICBBUElLRVk6ICR7eyBzZWNyZXRzLkFwaUtleSB9fQ0KAQkVAgAACRYCAAAGFwIAAAlidWlsZC55bWwGGAIAABsuZ2l0aHViXHdvcmtmbG93c1xidWlsZC55bWwJWgAAAAkaAgAACRsCAAAB5gEAADwAAAAGHAIAALICb246IFtwdWxsX3JlcXVlc3RdDQoNCmpvYnM6DQogIHZhbGlkYXRlOg0KDQogICAgcnVucy1vbjogd2luZG93cy0yMDE5DQoNCiAgICBzdGVwczoNCiAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjENCiAgICAtIG5hbWU6IEluc3RhbGwgUHJlcmVxdWlzaXRlcw0KICAgICAgcnVuOiAuXGJ1aWxkXHZzdHMtcHJlcmVxdWlzaXRlcy5wczENCiAgICAgIHNoZWxsOiBwb3dlcnNoZWxsDQogICAgLSBuYW1lOiBWYWxpZGF0ZQ0KICAgICAgcnVuOiAuXGJ1aWxkXHZzdHMtdmFsaWRhdGUucHMxDQogICAgICBzaGVsbDogcG93ZXJzaGVsbA0KAQkdAgAACR4CAAAGHwIAAAx2YWxpZGF0ZS55bWwGIAIAAB4uZ2l0aHViXHdvcmtmbG93c1x2YWxpZGF0ZS55bWwJWgAAAAkiAgAACSMCAAAB5wEAADcAAAAJJAIAAAYlAgAACWZ1bmN0aW9ucwYmAgAAKmF6RnVuY3Rpb25SZXNvdXJjZXNcY2xpZW50TW9kdWxlXGZ1bmN0aW9ucwlaAAAACSgCAAAJKQIAAAHoAQAANwAAAAkqAgAABisCAAAIaW50ZXJuYWwGLAIAAClhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxpbnRlcm5hbAlaAAAACS4CAAAJLwIAAAHpAQAAPAAAAAYwAgAAggJmdW5jdGlvbiAlZnVuY3Rpb25uYW1lJQ0Kew0KCSVwYXJhbWV0ZXIlDQoJDQoJcHJvY2Vzcw0KCXsNCgkJJGludm9rZVBhcmFtZXRlcnMgPSBHZXQtSW50ZXJuYWxDb25uZWN0aW9uRGF0YSAtTWV0aG9kICclbWV0aG9kJScgLVBhcmFtZXRlciAkUFNCb3VuZFBhcmFtZXRlcnMgLUZ1bmN0aW9uTmFtZSAnJWNvbmRlbnNlZG5hbWUlJw0KCQlJbnZva2UtUmVzdE1ldGhvZCBAaW52b2tlUGFyYW1ldGVycyB8IENvbnZlcnRGcm9tLVBTRkNsaXhtbA0KCX0NCn0BCTECAAAJMgIAAAYzAgAADGZ1bmN0aW9uLnBzMQY0AgAALWF6RnVuY3Rpb25SZXNvdXJjZXNcY2xpZW50TW9kdWxlXGZ1bmN0aW9uLnBzMQlaAAAACTYCAAAJNwIAAAHqAQAAPAAAAAY4AgAArAMkc2NyaXB0Ok1vZHVsZVJvb3QgPSAkUFNTY3JpcHRSb290DQoNCmZvcmVhY2ggKCRmaWxlIGluIChHZXQtQ2hpbGRJdGVtIC1QYXRoICIkc2NyaXB0Ok1vZHVsZVJvb3RcaW50ZXJuYWxcY29uZmlndXJhdGlvbnMiIC1SZWN1cnNlIC1GaWx0ZXIgJyoucHMxJykpDQp7DQoJLiAkZmlsZS5GdWxsTmFtZQ0KfQ0KZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gLVBhdGggIiRzY3JpcHQ6TW9kdWxlUm9vdFxpbnRlcm5hbFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWx0ZXIgJyoucHMxJykpDQp7DQoJLiAkZmlsZS5GdWxsTmFtZQ0KfQ0KZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gLVBhdGggIiRzY3JpcHQ6TW9kdWxlUm9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWx0ZXIgJyoucHMxJykpDQp7DQoJLiAkZmlsZS5GdWxsTmFtZQ0KfQEJOQIAAAk6AgAABjsCAAAPbW9kdWxlcm9vdC5wc20xBjwCAAAwYXpGdW5jdGlvblJlc291cmNlc1xjbGllbnRNb2R1bGVcbW9kdWxlcm9vdC5wc20xCVoAAAAJPgIAAAk/AgAAAesBAAA8AAAABkACAADlAnsNCiAgICAiYmluZGluZ3MiOiBbDQogICAgICAgIHsNCiAgICAgICAgImF1dGhMZXZlbCI6ICJmdW5jdGlvbiIsDQogICAgICAgICJ0eXBlIjogImh0dHBUcmlnZ2VyIiwNCiAgICAgICAgImRpcmVjdGlvbiI6ICJpbiIsDQogICAgICAgICJuYW1lIjogIlJlcXVlc3QiLA0KICAgICAgICAibWV0aG9kcyI6IFsNCiAgICAgICAgICAgICJkZWxldGUiDQogICAgICAgIF0NCiAgICAgICAgfSwNCiAgICAgICAgew0KICAgICAgICAidHlwZSI6ICJodHRwIiwNCiAgICAgICAgImRpcmVjdGlvbiI6ICJvdXQiLA0KICAgICAgICAibmFtZSI6ICJSZXNwb25zZSINCiAgICAgICAgfQ0KICAgIF0sDQogICAgImRpc2FibGVkIjogdHJ1ZQ0KfQEJQQIAAAlCAgAABkMCAAAQR2V0LUV4YW1wbGUuanNvbgZEAgAANWF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVxHZXQtRXhhbXBsZS5qc29uCVoAAAAJRgIAAAlHAgAAAewBAAA8AAAABkgCAAD5BmZ1bmN0aW9uIEdldC1FeGFtcGxlDQp7DQoJPCMNCgkJLk5PVEVTDQoJCQlUaGlzIGZpbGUgd2lsbCBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBhdXRvLWdlbmVyYXRlZCBDTElFTlQgTU9EVUxFIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9uLg0KCQkNCgkJCVVzaW5nIHRoZSB2c3RzLWNyZWF0ZUZ1bmN0aW9uQ2xpZW50TW9kdWxlLnBzMSB0YXNrIHNjcmlwdCwgeW91IGNhbiBhdXRvZ2VuZXJhdGUgYSBjbGllbnQgbW9kdWxlLg0KCQkJVGhhdCBtb2R1bGUgY2FuIGJlIHVzZWQgdG8gY29ubmVjdCB0byB0aGUgcHVibGlzaGVkIEF6dXJlIEZ1bmN0aW9uIE1vZHVsZS4NCgkJCUhvd2V2ZXIgc29tZXRpbWVzIHlvdSBtYXkgd2FudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBjbGllbnQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gY29tbWFuZCwNCgkJCWluIG9yZGVyIHRvIGJldHRlciBjdXN0b21pemUgdGhlIHdheSBpdCBiZWhhdmVzLg0KCQkNCgkJCUNyZWF0aW5nIGEgcHMxIGZpbGUgd2l0aCB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWMgZnVuY3Rpb24gaW4gdGhpcyBmb2xkZXIgd2lsbCB1c2UgdGhpcyBmaWxlLA0KCQkJcmF0aGVyIHRoYW4gY3JlYXRpbmcgYSBkZWZhdWx0IGNvcHkuDQoJCQ0KCQkJTk9URToNCgkJCVRoZXJlIHdpbGwgYmUgbm8gZnVydGhlciBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiENCgkJCUlmIHlvdSBsYXRlciB1cGRhdGUgdGhlIEF6dXJlIEZ1bmN0aW9uLCB5b3UgbmVlZCB0byBtYW51YWxseSB1cGRhdGUgdGhlIGNsaWVudCBmdW5jdGlvbiBhcyB3ZWxsLg0KCSM+DQoJW0NtZGxldEJpbmRpbmcoKV0NCglQYXJhbSAoDQoJDQoJKQ0KCQ0KCWJlZ2luDQoJew0KCQkNCgl9DQoJcHJvY2Vzcw0KCXsNCgkNCgl9DQoJZW5kDQoJew0KCQ0KCX0NCn0BCUkCAAAJSgIAAAZLAgAAD0dldC1FeGFtcGxlLnBzMQZMAgAANGF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVxHZXQtRXhhbXBsZS5wczEJWgAAAAlOAgAACU8CAAAB7QEAADwAAAAGUAIAAJoBQHsNCgkjIE92ZXJyaWRlIHRoZSByZXN0IG1ldGhvZHMgdXNlZCBmb3IgdGhlIEFQSSBlbmRwb2ludA0KCSMgUmVzdE1ldGhvZHMgPSAnZGVsZXRlJw0KCQ0KCSMgT3ZlcnJpZGUgaW5jbHVzaW9uIGludG8gY2xpZW50IG1vZHVsZQ0KCSMgTm9DbGllbnRGdW5jdGlvbg0KfQEJUQIAAAlSAgAABlMCAAAQR2V0LUV4YW1wbGUucHNkMQZUAgAANWF6RnVuY3Rpb25SZXNvdXJjZXNcZnVuY3Rpb25PdmVycmlkZVxHZXQtRXhhbXBsZS5wc2QxCVoAAAAJVgIAAAlXAgAAAe4BAAA8AAAABlgCAACqCmZ1bmN0aW9uIENvbnZlcnQtQXp1cmVGdW5jdGlvblBhcmFtZXRlcg0Kew0KPCMNCgkuU1lOT1BTSVMNCgkJRXh0cmFjdHMgdGhlIHBhcmFtZXRlcnMgcGFzc2VkIGludG8gdGhlIHJlc3QgbWV0aG9kLg0KCQ0KCS5ERVNDUklQVElPTg0KCQlFeHRyYWN0cyB0aGUgcGFyYW1ldGVycyBwYXNzZWQgaW50byB0aGUgcmVzdCBtZXRob2Qgb2YgYW4gQXp1cmUgRnVuY3Rpb24uDQoJCVJldHVybnMgYSBoYXNodGFibGUsIHNpbWlsYXIgdG8gd2hhdCB3b3VsZCBiZSBmb3VuZCBvbiBhICRQU0JvdW5kUGFyYW1ldGVycyB2YXJpYWJsZS4NCgkNCgkuUEFSQU1FVEVSIFJlcXVlc3QNCgkJVGhlIHJlcXVlc3QgdG8gcHJvY2Vzcw0KCQ0KCS5FWEFNUExFDQoJCVBTIEM6XD4gQ29udmVydC1BenVyZUZ1bmN0aW9uUGFyYW1ldGVyIC1SZXF1ZXN0ICRyZXF1ZXN0DQoJDQoJCUNvbnZlcnRzIHRoZSAkcmVxdWVzdCBvYmplY3QgaW50byBhIHJlZ3VsYXIgaGFzaHRhYmxlLg0KIz4NCglbT3V0cHV0VHlwZShbU3lzdGVtLkNvbGxlY3Rpb25zLkhhc2h0YWJsZV0pXQ0KCVtDbWRsZXRCaW5kaW5nKCldDQoJcGFyYW0gKA0KCQkkUmVxdWVzdA0KCSkNCgkNCgkkcGFyYW1ldGVyT2JqZWN0ID0gW3BzY3VzdG9tb2JqZWN0XUB7DQoJCVBhcmFtZXRlcnMgPSBAeyB9DQoJCVNlcmlhbGl6ZSA9ICRmYWxzZQ0KCX0NCgkNCglmb3JlYWNoICgka2V5IGluICRSZXF1ZXN0LlF1ZXJ5LktleXMpDQoJew0KCQkjIERvIE5PVCBpbmNsdWRlIHRoZSBhdXRoZW50aWNhdGlvbiBrZXkNCgkJaWYgKCRrZXkgLWVxICdjb2RlJykgeyBjb250aW51ZSB9DQoJCSRwYXJhbWV0ZXJPYmplY3QuUGFyYW1ldGVyc1ska2V5XSA9ICRSZXF1ZXN0LlF1ZXJ5LiRrZXkNCgl9DQoJZm9yZWFjaCAoJGtleSBpbiAkUmVxdWVzdC5Cb2R5LktleXMpDQoJew0KCQkkcGFyYW1ldGVyT2JqZWN0LlBhcmFtZXRlcnNbJGtleV0gPSAkUmVxdWVzdC5Cb2R5LiRrZXkNCgl9DQoJaWYgKCRwYXJhbWV0ZXJPYmplY3QuUGFyYW1ldGVycy5fX1BTU2VyaWFsaXplKQ0KCXsNCgkJJHBhcmFtZXRlck9iamVjdC5TZXJpYWxpemUgPSAkdHJ1ZQ0KCQkkbnVsbCA9ICRwYXJhbWV0ZXJPYmplY3QuUGFyYW1ldGVycy5SZW1vdmUoJ19fUFNTZXJpYWxpemUnKQ0KCX0NCglpZiAoJHBhcmFtZXRlck9iamVjdC5QYXJhbWV0ZXJzLl9fU2VyaWFsaXplZFBhcmFtZXRlcnMpDQoJew0KCQkkcGFyYW1ldGVyT2JqZWN0LlBhcmFtZXRlcnMgPSAkcGFyYW1ldGVyT2JqZWN0LlBhcmFtZXRlcnMuX19TZXJpYWxpemVkUGFyYW1ldGVycyB8IENvbnZlcnRGcm9tLVBTRkNsaXhtbA0KCX0NCgkNCgkkcGFyYW1ldGVyT2JqZWN0DQp9AQlZAgAACVoCAAAGWwIAACJDb252ZXJ0LUF6dXJlRnVuY3Rpb25QYXJhbWV0ZXIucHMxBlwCAABHYXpGdW5jdGlvblJlc291cmNlc1xwcm9maWxlRnVuY3Rpb25zXENvbnZlcnQtQXp1cmVGdW5jdGlvblBhcmFtZXRlci5wczEJWgAAAAleAgAACV8CAAAB7wEAADwAAAAGYAIAALQKZnVuY3Rpb24gV3JpdGUtQXp1cmVGdW5jdGlvbk91dHB1dA0Kew0KPCMNCgkuU1lOT1BTSVMNCgkJV3JpdGUgb3V0cHV0IGVxdWFsbHkgd2VsbCBmcm9tIEF6dXJlIEZ1bmN0aW9ucyBvciBsb2NhbGx5Lg0KCQ0KCS5ERVNDUklQVElPTg0KCQlXcml0ZSBvdXRwdXQgZXF1YWxseSB3ZWxsIGZyb20gQXp1cmUgRnVuY3Rpb25zIG9yIGxvY2FsbHkuDQoJCVdoZW4gY2FsbGluZyB0aGlzIGNvbW1hbmQsIGNhbGwgcmV0dXJuIHN0cmFpZ2h0IGFmdGVyIGl0Lg0KCQlVc2UgV3JpdGUtQXp1cmVGdW5jdGlvblN0YXR1cyBmaXJzdCBpZiBhbiBlcnJvciBzaG91bGQgYmUgcmV0dXJuZWQsIHRoZW4gc3BlY2lmeSBhbiBlcnJvciB0ZXh0IGhlcmUuDQoJDQoJLlBBUkFNRVRFUiBWYWx1ZQ0KCQlUaGUgdmFsdWUgZGF0YSB0byByZXR1cm4uDQoJCUVpdGhlciBhbiBlcnJvciBtZXNzYWdlDQoJDQoJLlBBUkFNRVRFUiBTZXJpYWxpemUNCgkJUmV0dXJuIHRoZSBvdXRwdXQgb2JqZWN0IGFzIGNvbXByZXNzZWQgY2xpeG1sIHN0cmluZy4NCgkJWW91IGNhbiB1c2UgQ29udmVydEZyb20tUFNGQ2xpeG1sIHRvIHJlc3RvcmUgdGhlIG9iamVjdCBvbiB0aGUgcmVjaXBpZW50LXNpZGUuDQoJDQoJLkVYQU1QTEUNCgkJUFMgQzpcPiBXcml0ZS1BenVyZUZ1bmN0aW9uT3V0cHV0IC1WYWx1ZSAkcmVzdWx0DQoJDQoJCVdyaXRlcyB0aGUgY29udGVudCBvZiAkcmVzdWx0IGFzIG91dHB1dC4NCgkNCgkuRVhBTVBMRQ0KCQlQUyBDOlw+IFdyaXRlLUF6dXJlRnVuY3Rpb25PdXRwdXQgLVZhbHVlICRyZXN1bHQgLVNlcmlhbGl6ZQ0KCQ0KCQlXcml0ZXMgdGhlIGNvbnRlbnQgb2YgJHJlc3VsdCBhcyBvdXRwdXQuDQoJCUlmIGNhbGxlZCBmcm9tIEF6dXJlIEZ1bmN0aW9ucywgaXQgd2lsbCBjb252ZXJ0IHRoZSBvdXRwdXQgYXMgY29tcHJlc3NlZCBjbGl4bWwgc3RyaW5nLg0KCQkNCiM+DQoJW0NtZGxldEJpbmRpbmcoKV0NCglwYXJhbSAoDQoJCVtQYXJhbWV0ZXIoTWFuZGF0b3J5ID0gJHRydWUpXQ0KCQkkVmFsdWUsDQoJCQ0KCQlbc3dpdGNoXQ0KCQkkU2VyaWFsaXplLA0KCQkNCgkJW1N5c3RlbS5OZXQuSHR0cFN0YXR1c0NvZGVdDQoJCSRTdGF0dXMgPSBbU3lzdGVtLk5ldC5IdHRwU3RhdHVzQ29kZV06Ok9LDQoJKQ0KCQ0KCWlmICgkU2VyaWFsaXplKQ0KCXsNCgkJJFZhbHVlID0gJFZhbHVlIHwgQ29udmVydFRvLVBTRkNsaXhtbA0KCX0NCgkNCglQdXNoLU91dHB1dEJpbmRpbmcgLU5hbWUgUmVzcG9uc2UgLVZhbHVlICgNCgkJW0h0dHBSZXNwb25zZUNvbnRleHRdQHsNCgkJCVN0YXR1c0NvZGUgPSAkU3RhdHVzDQoJCQlCb2R5CSAgID0gJFZhbHVlDQoJCX0NCgkpDQp9AQlhAgAACWICAAAGYwIAAB1Xcml0ZS1BenVyZUZ1bmN0aW9uT3V0cHV0LnBzMQZkAgAAQmF6RnVuY3Rpb25SZXNvdXJjZXNccHJvZmlsZUZ1bmN0aW9uc1xXcml0ZS1BenVyZUZ1bmN0aW9uT3V0cHV0LnBzMQlaAAAACWYCAAAJZwIAAAH1AQAANwAAAAloAgAABmkCAAAIw75uYW1lw74GagIAABlsaWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+CVoAAAAJbAIAAAltAgAAAfYBAAA8AAAABm4CAACxBw0KTWljcm9zb2Z0IFZpc3VhbCBTdHVkaW8gU29sdXRpb24gRmlsZSwgRm9ybWF0IFZlcnNpb24gMTIuMDANCiMgVmlzdWFsIFN0dWRpbyAxNQ0KVmlzdWFsU3R1ZGlvVmVyc2lvbiA9IDE1LjAuMjcxMzAuMjAxMA0KTWluaW11bVZpc3VhbFN0dWRpb1ZlcnNpb24gPSAxMC4wLjQwMjE5LjENClByb2plY3QoInvDviFndWlkMiHDvn0iKSA9ICLDvm5hbWXDviIsICLDvm5hbWXDvlzDvm5hbWXDvi5jc3Byb2oiLCAie8O+IWd1aWQ0IcO+fSINCkVuZFByb2plY3QNCkdsb2JhbA0KCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Db25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHByZVNvbHV0aW9uDQoJCURlYnVnfEFueSBDUFUgPSBEZWJ1Z3xBbnkgQ1BVDQoJCVJlbGVhc2V8QW55IENQVSA9IFJlbGVhc2V8QW55IENQVQ0KCUVuZEdsb2JhbFNlY3Rpb24NCglHbG9iYWxTZWN0aW9uKFByb2plY3RDb25maWd1cmF0aW9uUGxhdGZvcm1zKSA9IHBvc3RTb2x1dGlvbg0KCQl7w74hZ3VpZDQhw759LkRlYnVnfEFueSBDUFUuQWN0aXZlQ2ZnID0gRGVidWd8QW55IENQVQ0KCQl7w74hZ3VpZDQhw759LkRlYnVnfEFueSBDUFUuQnVpbGQuMCA9IERlYnVnfEFueSBDUFUNCgkJe8O+IWd1aWQ0IcO+fS5SZWxlYXNlfEFueSBDUFUuQWN0aXZlQ2ZnID0gUmVsZWFzZXxBbnkgQ1BVDQoJCXvDviFndWlkNCHDvn0uUmVsZWFzZXxBbnkgQ1BVLkJ1aWxkLjAgPSBSZWxlYXNlfEFueSBDUFUNCglFbmRHbG9iYWxTZWN0aW9uDQoJR2xvYmFsU2VjdGlvbihTb2x1dGlvblByb3BlcnRpZXMpID0gcHJlU29sdXRpb24NCgkJSGlkZVNvbHV0aW9uTm9kZSA9IEZBTFNFDQoJRW5kR2xvYmFsU2VjdGlvbg0KCUdsb2JhbFNlY3Rpb24oRXh0ZW5zaWJpbGl0eUdsb2JhbHMpID0gcG9zdFNvbHV0aW9uDQoJCVNvbHV0aW9uR3VpZCA9IHvDviFndWlkMyHDvn0NCglFbmRHbG9iYWxTZWN0aW9uDQpFbmRHbG9iYWwNCgEJbwIAAAlwAgAABnECAAAMw75uYW1lw74uc2xuBnICAAAdbGlicmFyeVzDvm5hbWXDvlzDvm5hbWXDvi5zbG4JWgAAAAl0AgAACXUCAAAB+AEAADwAAAAGdgIAAO4CIyBiaW4gZm9sZGVyDQoNClRoZSBiaW4gZm9sZGVyIGV4aXN0cyB0byBzdG9yZSBiaW5hcnkgZGF0YS4gQW5kIHNjcmlwdHMgcmVsYXRlZCB0byB0aGUgdHlwZSBzeXN0ZW0uDQoNClRoaXMgbWF5IGluY2x1ZGUgeW91ciBvd24gQyMtYmFzZWQgbGlicmFyeSwgdGhpcmQgcGFydHkgbGlicmFyaWVzIHlvdSB3YW50IHRvIGluY2x1ZGUgKHdhdGNoIHRoZSBsaWNlbnNlISksIG9yIGEgc2NyaXB0IGRlY2xhcmluZyB0eXBlIGFjY2VsZXJhdG9ycyAoZWZmZWN0aXZlbHkgYWxpYXNlcyBmb3IgLk5FVCB0eXBlcykNCg0KRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gVHlwZSBBY2NlbGVyYXRvcnMsIHNlZSB0aGUgaGVscCBvbiBTZXQtUFNGVHlwZUFsaWFzAQl3AgAACXgCAAAGeQIAAAlyZWFkbWUubWQGegIAABbDvm5hbWXDvlxiaW5ccmVhZG1lLm1kCVoAAAAJfAIAAAl9AgAAAfkBAAA8AAAABn4CAAClAVRPUElDDQoJYWJvdXRfw75uYW1lw74NCgkNClNIT1JUIERFU0NSSVBUSU9ODQoJRXhwbGFpbnMgaG93IHRvIHVzZSB0aGUgw75uYW1lw74gcG93ZXJzaGVsbCBtb2R1bGUNCgkNCkxPTkcgREVTQ1JJUFRJT04NCgk8SW5zZXJ0IENvbnRlbnQgaGVyZT4NCg0KS0VZV09SRFMNCgnDvm5hbWXDvgEJfwIAAAmAAgAABoECAAAXYWJvdXRfw75uYW1lw74uaGVscC50eHQGggIAACbDvm5hbWXDvlxlbi11c1xhYm91dF/Dvm5hbWXDvi5oZWxwLnR4dAlaAAAACYQCAAAJhQIAAAH6AQAAPAAAAAaGAgAAnQEjIFRoaXMgaXMgd2hlcmUgdGhlIHN0cmluZ3MgZ28sIHRoYXQgYXJlIHdyaXR0ZW4gYnkNCiMgV3JpdGUtUFNGTWVzc2FnZSwgU3RvcC1QU0ZGdW5jdGlvbiBvciB0aGUgUFNGcmFtZXdvcmsgdmFsaWRhdGlvbiBzY3JpcHRibG9ja3MNCkB7DQoJJ2tleScgPSAnVmFsdWUnDQp9AQmHAgAACYgCAAAGiQIAAAxzdHJpbmdzLnBzZDEGigIAABvDvm5hbWXDvlxlbi11c1xzdHJpbmdzLnBzZDEJWgAAAAmMAgAACY0CAAAB+wEAADwAAAAGjgIAANIBIyBGdW5jdGlvbnMNCg0KVGhpcyBpcyB0aGUgZm9sZGVyIHdoZXJlIHRoZSBmdW5jdGlvbnMgZ28uDQoNCkRlcGVuZGluZyBvbiB0aGUgY29tcGxleGl0eSBvZiB0aGUgbW9kdWxlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBzdWJkaXZpZGUgdGhlbSBpbnRvIHN1YmZvbGRlcnMuDQoNClRoZSBtb2R1bGUgd2lsbCBwaWNrIHVwIGFsbCAucHMxIGZpbGVzIHJlY3Vyc2l2ZWx5AQmPAgAACZACAAAGkQIAAAlyZWFkbWUubWQGkgIAABzDvm5hbWXDvlxmdW5jdGlvbnNccmVhZG1lLm1kCVoAAAAJlAIAAAmVAgAAAfwBAAA3AAAACZYCAAAGlwIAAA5jb25maWd1cmF0aW9ucwaYAgAAIMO+bmFtZcO+XGludGVybmFsXGNvbmZpZ3VyYXRpb25zCVoAAAAJmgIAAAmbAgAAAf0BAAA3AAAACZwCAAAGnQIAAAlmdW5jdGlvbnMGngIAABvDvm5hbWXDvlxpbnRlcm5hbFxmdW5jdGlvbnMJWgAAAAmgAgAACaECAAAB/gEAADcAAAAJogIAAAajAgAADHNjcmlwdGJsb2NrcwakAgAAHsO+bmFtZcO+XGludGVybmFsXHNjcmlwdGJsb2NrcwlaAAAACaYCAAAJpwIAAAH/AQAANwAAAAmoAgAABqkCAAAHc2NyaXB0cwaqAgAAGcO+bmFtZcO+XGludGVybmFsXHNjcmlwdHMJWgAAAAmsAgAACa0CAAABAAIAADcAAAAJrgIAAAavAgAABHRlcHAGsAIAABbDvm5hbWXDvlxpbnRlcm5hbFx0ZXBwCVoAAAAJsgIAAAmzAgAAAQECAAA3AAAACbQCAAAGtQIAAAlmdW5jdGlvbnMGtgIAABjDvm5hbWXDvlx0ZXN0c1xmdW5jdGlvbnMJWgAAAAm4AgAACbkCAAABAgIAADcAAAAJugIAAAa7AgAAB2dlbmVyYWwGvAIAABbDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsCVoAAAAJvgIAAAm/AgAAAQMCAAA8AAAABsACAACpG3BhcmFtICgNCgkkVGVzdEdlbmVyYWwgPSAkdHJ1ZSwNCgkNCgkkVGVzdEZ1bmN0aW9ucyA9ICR0cnVlLA0KCQ0KCVtWYWxpZGF0ZVNldCgnTm9uZScsICdOb3JtYWwnLCAnRGV0YWlsZWQnLCAnRGlhZ25vc3RpYycpXQ0KCVtBbGlhcygnU2hvdycpXQ0KCSRPdXRwdXQgPSAiTm9uZSIsDQoJDQoJJEluY2x1ZGUgPSAiKiIsDQoJDQoJJEV4Y2x1ZGUgPSAiIg0KKQ0KDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIlN0YXJ0aW5nIFRlc3RzIg0KDQpXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBJbXBvcnRhbnQgLU1lc3NhZ2UgIkltcG9ydGluZyBNb2R1bGUiDQoNCiRnbG9iYWw6dGVzdHJvb3QgPSAkUFNTY3JpcHRSb290DQokZ2xvYmFsOl9fcGVzdGVyX2RhdGEgPSBAeyB9DQoNClJlbW92ZS1Nb2R1bGUgw75uYW1lw74gLUVycm9yQWN0aW9uIElnbm9yZQ0KSW1wb3J0LU1vZHVsZSAiJFBTU2NyaXB0Um9vdFwuLlzDvm5hbWXDvi5wc2QxIg0KSW1wb3J0LU1vZHVsZSAiJFBTU2NyaXB0Um9vdFwuLlzDvm5hbWXDvi5wc20xIiAtRm9yY2UNCg0KIyBOZWVkIHRvIGltcG9ydCBleHBsaWNpdGx5IHNvIHdlIGNhbiB1c2UgdGhlIGNvbmZpZ3VyYXRpb24gY2xhc3MNCkltcG9ydC1Nb2R1bGUgUGVzdGVyDQoNCsO+IXRlc3Rmb2xkZXIhw74NCg0KJHRvdGFsRmFpbGVkID0gMA0KJHRvdGFsUnVuID0gMA0KDQokdGVzdHJlc3VsdHMgPSBAKCkNCiRjb25maWcgPSBbUGVzdGVyQ29uZmlndXJhdGlvbl06OkRlZmF1bHQNCsO+IXBlc3RlcmNvbmZpZyHDvg0KDQojcmVnaW9uIFJ1biBHZW5lcmFsIFRlc3RzDQppZiAoJFRlc3RHZW5lcmFsKQ0Kew0KCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIEltcG9ydGFudCAtTWVzc2FnZSAiTW9kdWxlcyBpbXBvcnRlZCwgcHJvY2VlZGluZyB3aXRoIGdlbmVyYWwgdGVzdHMiDQoJZm9yZWFjaCAoJGZpbGUgaW4gKEdldC1DaGlsZEl0ZW0gIiRQU1NjcmlwdFJvb3RcZ2VuZXJhbCIgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5UZXN0cy5wczEiKSkNCgl7DQoJCWlmICgkZmlsZS5OYW1lIC1ub3RsaWtlICRJbmNsdWRlKSB7IGNvbnRpbnVlIH0NCgkJaWYgKCRmaWxlLk5hbWUgLWxpa2UgJEV4Y2x1ZGUpIHsgY29udGludWUgfQ0KDQoJCVdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIFNpZ25pZmljYW50IC1NZXNzYWdlICIgIEV4ZWN1dGluZyA8Yz0nZW0nPiQoJGZpbGUuTmFtZSk8L2M+Ig0KCQkkY29uZmlnLlRlc3RSZXN1bHQuT3V0cHV0UGF0aCA9IEpvaW4tUGF0aCAiJFBTU2NyaXB0Um9vdFwuLlwuLlxUZXN0UmVzdWx0cyIgIlRFU1QtJCgkZmlsZS5CYXNlTmFtZSkueG1sIg0KCQkkY29uZmlnLlJ1bi5QYXRoID0gJGZpbGUuRnVsbE5hbWUNCgkJJGNvbmZpZy5SdW4uUGFzc1RocnUgPSAkdHJ1ZQ0KCQkkY29uZmlnLk91dHB1dC5WZXJib3NpdHkgPSAkT3V0cHV0DQogICAgCSRyZXN1bHRzID0gSW52b2tlLVBlc3RlciAtQ29uZmlndXJhdGlvbiAkY29uZmlnDQoJCWZvcmVhY2ggKCRyZXN1bHQgaW4gJHJlc3VsdHMpDQoJCXsNCgkJCSR0b3RhbFJ1biArPSAkcmVzdWx0LlRvdGFsQ291bnQNCgkJCSR0b3RhbEZhaWxlZCArPSAkcmVzdWx0LkZhaWxlZENvdW50DQoJCQkkcmVzdWx0LlRlc3RzIHwgV2hlcmUtT2JqZWN0IFJlc3VsdCAtbmUgJ1Bhc3NlZCcgfCBGb3JFYWNoLU9iamVjdCB7DQoJCQkJJHRlc3RyZXN1bHRzICs9IFtwc2N1c3RvbW9iamVjdF1Aew0KCQkJCQlCbG9jayAgICA9ICRfLkJsb2NrDQoJCQkJCU5hbWUJID0gIkl0ICQoJF8uTmFtZSkiDQoJCQkJCVJlc3VsdCAgID0gJF8uUmVzdWx0DQoJCQkJCU1lc3NhZ2UgID0gJF8uRXJyb3JSZWNvcmQuRGlzcGxheUVycm9yTWVzc2FnZQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0NCiNlbmRyZWdpb24gUnVuIEdlbmVyYWwgVGVzdHMNCg0KJGdsb2JhbDpfX3Blc3Rlcl9kYXRhLlNjcmlwdEFuYWx5emVyIHwgT3V0LUhvc3QNCg0KI3JlZ2lvbiBUZXN0IENvbW1hbmRzDQppZiAoJFRlc3RGdW5jdGlvbnMpDQp7DQoJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgSW1wb3J0YW50IC1NZXNzYWdlICJQcm9jZWVkaW5nIHdpdGggaW5kaXZpZHVhbCB0ZXN0cyINCglmb3JlYWNoICgkZmlsZSBpbiAoR2V0LUNoaWxkSXRlbSAiJFBTU2NyaXB0Um9vdFxmdW5jdGlvbnMiIC1SZWN1cnNlIC1GaWxlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIipUZXN0cy5wczEiKSkNCgl7DQoJCWlmICgkZmlsZS5OYW1lIC1ub3RsaWtlICRJbmNsdWRlKSB7IGNvbnRpbnVlIH0NCgkJaWYgKCRmaWxlLk5hbWUgLWxpa2UgJEV4Y2x1ZGUpIHsgY29udGludWUgfQ0KCQkNCgkJV3JpdGUtUFNGTWVzc2FnZSAtTGV2ZWwgU2lnbmlmaWNhbnQgLU1lc3NhZ2UgIiAgRXhlY3V0aW5nICQoJGZpbGUuTmFtZSkiDQoJCSRjb25maWcuVGVzdFJlc3VsdC5PdXRwdXRQYXRoID0gSm9pbi1QYXRoICIkUFNTY3JpcHRSb290XC4uXC4uXFRlc3RSZXN1bHRzIiAiVEVTVC0kKCRmaWxlLkJhc2VOYW1lKS54bWwiDQoJCSRjb25maWcuUnVuLlBhdGggPSAkZmlsZS5GdWxsTmFtZQ0KCQkkY29uZmlnLlJ1bi5QYXNzVGhydSA9ICR0cnVlDQoJCSRjb25maWcuT3V0cHV0LlZlcmJvc2l0eSA9ICRPdXRwdXQNCiAgICAJJHJlc3VsdHMgPSBJbnZva2UtUGVzdGVyIC1Db25maWd1cmF0aW9uICRjb25maWcNCgkJZm9yZWFjaCAoJHJlc3VsdCBpbiAkcmVzdWx0cykNCgkJew0KCQkJJHRvdGFsUnVuICs9ICRyZXN1bHQuVG90YWxDb3VudA0KCQkJJHRvdGFsRmFpbGVkICs9ICRyZXN1bHQuRmFpbGVkQ291bnQNCgkJCSRyZXN1bHQuVGVzdHMgfCBXaGVyZS1PYmplY3QgUmVzdWx0IC1uZSAnUGFzc2VkJyB8IEZvckVhY2gtT2JqZWN0IHsNCgkJCQkkdGVzdHJlc3VsdHMgKz0gW3BzY3VzdG9tb2JqZWN0XUB7DQoJCQkJCUJsb2NrICAgID0gJF8uQmxvY2sNCgkJCQkJTmFtZQkgPSAiSXQgJCgkXy5OYW1lKSINCgkJCQkJUmVzdWx0ICAgPSAkXy5SZXN1bHQNCgkJCQkJTWVzc2FnZSAgPSAkXy5FcnJvclJlY29yZC5EaXNwbGF5RXJyb3JNZXNzYWdlDQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KfQ0KI2VuZHJlZ2lvbiBUZXN0IENvbW1hbmRzDQoNCiR0ZXN0cmVzdWx0cyB8IFNvcnQtT2JqZWN0IERlc2NyaWJlLCBDb250ZXh0LCBOYW1lLCBSZXN1bHQsIE1lc3NhZ2UgfCBGb3JtYXQtTGlzdA0KDQppZiAoJHRvdGFsRmFpbGVkIC1lcSAwKSB7IFdyaXRlLVBTRk1lc3NhZ2UgLUxldmVsIENyaXRpY2FsIC1NZXNzYWdlICJBbGwgPGM9J2VtJz4kdG90YWxSdW48L2M+IHRlc3RzIGV4ZWN1dGVkIHdpdGhvdXQgYSBzaW5nbGUgZmFpbHVyZSEiIH0NCmVsc2UgeyBXcml0ZS1QU0ZNZXNzYWdlIC1MZXZlbCBDcml0aWNhbCAtTWVzc2FnZSAiPGM9J2VtJz4kdG90YWxGYWlsZWQgdGVzdHM8L2M+IG91dCBvZiA8Yz0nc3ViJz4kdG90YWxSdW48L2M+IHRlc3RzIGZhaWxlZCEiIH0NCg0KaWYgKCR0b3RhbEZhaWxlZCAtZ3QgMCkNCnsNCgl0aHJvdyAiJHRvdGFsRmFpbGVkIC8gJHRvdGFsUnVuIHRlc3RzIGZhaWxlZCEiDQp9AQnBAgAACcICAAAGwwIAAApwZXN0ZXIucHMxBsQCAAAZw75uYW1lw75cdGVzdHNccGVzdGVyLnBzMQlaAAAACcYCAAAJxwIAAAEEAgAAPAAAAAbIAgAAogcjIERlc2NyaXB0aW9uDQoNClRoaXMgaXMgdGhlIGZvbGRlciwgd2hlcmUgYWxsIHRoZSB0ZXN0cyBnby4NCg0KVGhvc2UgYXJlIHN1YmRpdmlkZWQgaW4gdHdvIGNhdGVnb3JpZXM6DQoNCiAtIEdlbmVyYWwNCiAtIEZ1bmN0aW9uDQoNCiMjIEdlbmVyYWwgVGVzdHMNCg0KR2VuZXJhbCB0ZXN0cyBhcmUgZnVuY3Rpb24gZ2VuZXJpYyBhbmQgdGVzdCBmb3IgZ2VuZXJhbCBwb2xpY2llcy4NCg0KVGhlc2UgdGVzdCBzY2FuIGFuc3dlciBxdWVzdGlvbnMgc3VjaCBhczoNCg0KIC0gSXMgbXkgbW9kdWxlIGZvbGxvd2luZyBteSBzdHlsZSBndWlkZXM/DQogLSBEb2VzIGFueSBvZiBteSBzY3JpcHRzIGhhdmUgYSBzeW50YXggZXJyb3I/DQogLSBEbyBteSBzY3JpcHRzIHVzZSBjb21tYW5kcyBJIGRvIG5vdCB3YW50IHRoZW0gdG8gdXNlPw0KIC0gRG8gbXkgY29tbWFuZHMgZm9sbG93IGJlc3QgcHJhY3RpY2VzPw0KIC0gRG8gbXkgY29tbWFuZHMgaGF2ZSBwcm9wZXIgaGVscD8NCg0KQmFzaWNhbGx5LCB0aGVzZSBhbGxvdyBhIGdlbmVyYWwgbW9kdWxlIGhlYWx0aCBjaGVjay4NCg0KVGhlc2UgdGVzdHMgYXJlIGFscmVhZHkgcHJvdmlkZWQgYXMgcGFydCBvZiB0aGUgdGVtcGxhdGUuDQoNCiMjIEZ1bmN0aW9uIFRlc3RzDQoNCkEgaGVhbHRoeSBtb2R1bGUgc2hvdWxkIHByb3ZpZGUgdW5pdCBhbmQgaW50ZWdyYXRpb24gdGVzdHMgZm9yIHRoZSBjb21tYW5kcyAmIGNvbXBvbmVudHMgaXQgc2hpcHMuDQpPbmx5IHRoZW4gY2FuIGJlIGd1YXJhbnRlZWQsIHRoYXQgdGhleSB3aWxsIGFjdHVhbGx5IHBlcmZvcm0gYXMgcHJvbWlzZWQuDQoNCkhvd2V2ZXIsIGFzIGVhY2ggc3VjaCB0ZXN0IG11c3QgYmUgc3BlY2lmaWMgdG8gdGhlIGZ1bmN0aW9uIGl0IHRlc3RzLCB0aGVyZSBjYW5ub3QgYmUgbXVjaCBpbiB0aGUgd2F5IG9mIHRlbXBsYXRlcy4BCckCAAAJygIAAAbLAgAACXJlYWRtZS5tZAbMAgAAGMO+bmFtZcO+XHRlc3RzXHJlYWRtZS5tZAlaAAAACc4CAAAJzwIAAAEFAgAAPAAAAAbQAgAArAsjIFhNTA0KDQpUaGlzIGlzIHRoZSBmb2xkZXIgd2hlcmUgcHJvamVjdCBYTUwgZmlsZXMgZ28sIG5vdGFibHk6DQoNCiAtIEZvcm1hdCBYTUwNCiAtIFR5cGUgRXh0ZW5zaW9uIFhNTA0KDQpFeHRlcm5hbCBoZWxwIGZpbGVzIHNob3VsZCBfbm90XyBiZSBwbGFjZWQgaW4gdGhpcyBmb2xkZXIhDQoNCiMjIE5vdGVzIG9uIEZpbGVzIGFuZCBOYW1pbmcNCg0KVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGZvcm1hdCBmaWxlIGFuZCBvbmUgdHlwZSBleHRlbnNpb24gZmlsZSBwZXIgcHJvamVjdCwgYXMgaW1wb3J0aW5nIHRoZW0gaGFzIGEgbm90YWJsZSBpbXBhY3Qgb24gaW1wb3J0IHRpbWVzLg0KDQogLSBUaGUgRm9ybWF0IFhNTCBzaG91bGQgYmUgbmFtZWQgYMO+bmFtZcO+LkZvcm1hdC5wczF4bWxgDQogLSBUaGUgVHlwZSBFeHRlbnNpb24gWE1MIHNob3VsZCBiZSBuYW1lZCBgw75uYW1lw74uVHlwZXMucHMxeG1sYA0KDQojIyBUb29scw0KDQojIyMgTmV3LVBTTURGb3JtYXRUYWJsZURlZmluaXRpb24NCg0KVGhpcyBmdW5jdGlvbiB3aWxsIHRha2UgYW4gaW5wdXQgb2JqZWN0IGFuZCBnZW5lcmF0ZSBmb3JtYXQgeG1sIGZvciBhbiBhdXRvLXNpemVkIHRhYmxlLg0KDQpJdCBwcm92aWRlcyBhIHNpbXBsZSB3YXkgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBmb3JtYXRzLg0KDQojIyMgR2V0LVBTRlR5cGVTZXJpYWxpemF0aW9uRGF0YQ0KDQpgYGANCkMjIFdhcm5pbmchDQpUaGlzIHNlY3Rpb24gaXMgb25seSBpbnRlcmVzdCBpZiB5b3UncmUgdXNpbmcgQyMgdG9nZXRoZXIgd2l0aCBQb3dlclNoZWxsLg0KYGBgDQoNClRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIHR5cGUgZXh0ZW5zaW9uIFhNTCB0aGF0IGFsbG93cyBQb3dlclNoZWxsIHRvIGNvbnZlcnQgdHlwZXMgd3JpdHRlbiBpbiBDIyB0byBiZSB3cml0dGVuIHRvIGZpbGUgYW5kIHJlc3RvcmVkIGZyb20gaXQgd2l0aG91dCBiZWluZyAnRGVzZXJpYWxpemVkJy4gQWxzbyB3b3JrcyBmb3Igam9icyBvciByZW1vdGluZywgaWYgYm90aCBzaWRlcyBoYXZlIHRoZSBgUFNGcmFtZXdvcmtgIG1vZHVsZSBhbmQgdHlwZSBleHRlbnNpb24gbG9hZGVkLg0KDQpJbiBvcmRlciBmb3IgYSBjbGFzcyB0byBiZSBlbGlnaWJsZSBmb3IgdGhpcywgaXQgbmVlZHMgdG8gY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIHJ1bGVzOg0KDQogLSBIYXZlIHRoZSBgW1NlcmlhbGl6YWJsZV1gIGF0dHJpYnV0ZQ0KIC0gQmUgcHVibGljDQogLSBIYXZlIGFuIGVtcHR5IGNvbnN0cnVjdG9yDQogLSBBbGxvdyBhbGwgcHVibGljIHByb3BlcnRpZXMvZmllbGRzIHRvIGJlIHNldCAoZXZlbiBpZiBzZXR0aW5nIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcpIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLg0KDQpgYGANCm5vbi1wdWJsaWMgcHJvcGVydGllcyBhbmQgZmllbGRzIHdpbGwgYmUgbG9zdCBpbiB0aGlzIHByb2Nlc3MhDQpgYGABCdECAAAJ0gIAAAbTAgAACXJlYWRtZS5tZAbUAgAAFsO+bmFtZcO+XHhtbFxyZWFkbWUubWQJWgAAAAnWAgAACdcCAAABBgIAADwAAAAG2AIAAOgFPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTE2Ij8+DQo8Q29uZmlndXJhdGlvbj4NCgk8Vmlld0RlZmluaXRpb25zPg0KCQk8IS0tIEZvby5CYXIgLS0+DQoJCTxWaWV3Pg0KCQkJPE5hbWU+Rm9vLkJhcjwvTmFtZT4NCgkJCTxWaWV3U2VsZWN0ZWRCeT4NCgkJCQk8VHlwZU5hbWU+Rm9vLkJhcjwvVHlwZU5hbWU+DQoJCQk8L1ZpZXdTZWxlY3RlZEJ5Pg0KCQkJPFRhYmxlQ29udHJvbD4NCgkJCQk8QXV0b1NpemUvPg0KCQkJCTxUYWJsZUhlYWRlcnM+DQoJCQkJCTxUYWJsZUNvbHVtbkhlYWRlci8+DQoJCQkJCTxUYWJsZUNvbHVtbkhlYWRlci8+DQoJCQkJPC9UYWJsZUhlYWRlcnM+DQoJCQkJPFRhYmxlUm93RW50cmllcz4NCgkJCQkJPFRhYmxlUm93RW50cnk+DQoJCQkJCQk8VGFibGVDb2x1bW5JdGVtcz4NCgkJCQkJCQk8VGFibGVDb2x1bW5JdGVtPg0KCQkJCQkJCQk8UHJvcGVydHlOYW1lPkZvbzwvUHJvcGVydHlOYW1lPg0KCQkJCQkJCTwvVGFibGVDb2x1bW5JdGVtPg0KCQkJCQkJCTxUYWJsZUNvbHVtbkl0ZW0+DQoJCQkJCQkJCTxQcm9wZXJ0eU5hbWU+QmFyPC9Qcm9wZXJ0eU5hbWU+DQoJCQkJCQkJPC9UYWJsZUNvbHVtbkl0ZW0+DQoJCQkJCQk8L1RhYmxlQ29sdW1uSXRlbXM+DQoJCQkJCTwvVGFibGVSb3dFbnRyeT4NCgkJCQk8L1RhYmxlUm93RW50cmllcz4NCgkJCTwvVGFibGVDb250cm9sPg0KCQk8L1ZpZXc+DQoJPC9WaWV3RGVmaW5pdGlvbnM+DQo8L0NvbmZpZ3VyYXRpb24+AQnZAgAACdoCAAAG2wIAABbDvm5hbWXDvi5Gb3JtYXQucHMxeG1sBtwCAAAjw75uYW1lw75ceG1sXMO+bmFtZcO+LkZvcm1hdC5wczF4bWwJWgAAAAneAgAACd8CAAABBwIAADwAAAAG4AIAAOAHPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjxUeXBlcz4NCiAgPCEtLSBGb28uQmFyIC0tPg0KICA8VHlwZT4NCiAgICA8TmFtZT5EZXNlcmlhbGl6ZWQuRm9vLkJhcjwvTmFtZT4NCiAgICA8TWVtYmVycz4NCiAgICAgIDxNZW1iZXJTZXQ+DQogICAgICAgIDxOYW1lPlBTU3RhbmRhcmRNZW1iZXJzPC9OYW1lPg0KICAgICAgICA8TWVtYmVycz4NCiAgICAgICAgICA8Tm90ZVByb3BlcnR5Pg0KICAgICAgICAgICAgPE5hbWU+DQogICAgICAgICAgICAgIFRhcmdldFR5cGVGb3JEZXNlcmlhbGl6YXRpb24NCiAgICAgICAgICAgIDwvTmFtZT4NCiAgICAgICAgICAgIDxWYWx1ZT4NCiAgICAgICAgICAgICAgRm9vLkJhcg0KICAgICAgICAgICAgPC9WYWx1ZT4NCiAgICAgICAgICA8L05vdGVQcm9wZXJ0eT4NCiAgICAgICAgPC9NZW1iZXJzPg0KICAgICAgPC9NZW1iZXJTZXQ+DQogICAgPC9NZW1iZXJzPg0KICA8L1R5cGU+DQogIDxUeXBlPg0KICAgIDxOYW1lPkZvby5CYXI8L05hbWU+DQogICAgPE1lbWJlcnM+DQogICAgICA8Q29kZVByb3BlcnR5IElzSGlkZGVuPSJ0cnVlIj4NCiAgICAgICAgPE5hbWU+U2VyaWFsaXphdGlvbkRhdGE8L05hbWU+DQogICAgICAgIDxHZXRDb2RlUmVmZXJlbmNlPg0KICAgICAgICAgIDxUeXBlTmFtZT5QU0ZyYW1ld29yay5TZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25UeXBlQ29udmVydGVyPC9UeXBlTmFtZT4NCiAgICAgICAgICA8TWV0aG9kTmFtZT5HZXRTZXJpYWxpemF0aW9uRGF0YTwvTWV0aG9kTmFtZT4NCiAgICAgICAgPC9HZXRDb2RlUmVmZXJlbmNlPg0KICAgICAgPC9Db2RlUHJvcGVydHk+DQogICAgPC9NZW1iZXJzPg0KICAgIDxUeXBlQ29udmVydGVyPg0KICAgICAgPFR5cGVOYW1lPlBTRnJhbWV3b3JrLlNlcmlhbGl6YXRpb24uU2VyaWFsaXphdGlvblR5cGVDb252ZXJ0ZXI8L1R5cGVOYW1lPg0KICAgIDwvVHlwZUNvbnZlcnRlcj4NCiAgPC9UeXBlPg0KPC9UeXBlcz4BCeECAAAJ4gIAAAbjAgAAFcO+bmFtZcO+LlR5cGVzLnBzMXhtbAbkAgAAIsO+bmFtZcO+XHhtbFzDvm5hbWXDvi5UeXBlcy5wczF4bWwJWgAAAAnmAgAACecCAAABFQIAAAgAAAAJsAAAAAAAAAAAAAAAARYCAAAIAAAACbAAAAAAAAAAAAAAAAEaAgAACAAAAAmwAAAAAAAAAAAAAAABGwIAAAgAAAAJsAAAAAAAAAAAAAAAAR0CAAAIAAAACbAAAAAAAAAAAAAAAAEeAgAACAAAAAmwAAAAAAAAAAAAAAABIgIAAAgAAAAJsAAAAAAAAAAAAAAAASMCAAAIAAAACbAAAAAAAAAAAAAAAAEkAgAADAAAAAnpAgAAAQAAAAEAAAABKAIAAAgAAAAJsAAAAAAAAAAAAAAAASkCAAAIAAAACbAAAAAAAAAAAAAAAAEqAgAADAAAAAnrAgAAAgAAAAIAAAABLgIAAAgAAAAJsAAAAAAAAAAAAAAAAS8CAAAIAAAACbAAAAAAAAAAAAAAAAExAgAACAAAAAmwAAAAAAAAAAAAAAABMgIAAAgAAAAJsAAAAAAAAAAAAAAAATYCAAAIAAAACbAAAAAAAAAAAAAAAAE3AgAACAAAAAmwAAAAAAAAAAAAAAABOQIAAAgAAAAJsAAAAAAAAAAAAAAAAToCAAAIAAAACbAAAAAAAAAAAAAAAAE+AgAACAAAAAmwAAAAAAAAAAAAAAABPwIAAAgAAAAJsAAAAAAAAAAAAAAAAUECAAAIAAAACbAAAAAAAAAAAAAAAAFCAgAACAAAAAmwAAAAAAAAAAAAAAABRgIAAAgAAAAJsAAAAAAAAAAAAAAAAUcCAAAIAAAACbAAAAAAAAAAAAAAAAFJAgAACAAAAAmwAAAAAAAAAAAAAAABSgIAAAgAAAAJsAAAAAAAAAAAAAAAAU4CAAAIAAAACbAAAAAAAAAAAAAAAAFPAgAACAAAAAmwAAAAAAAAAAAAAAABUQIAAAgAAAAJsAAAAAAAAAAAAAAAAVICAAAIAAAACbAAAAAAAAAAAAAAAAFWAgAACAAAAAmwAAAAAAAAAAAAAAABVwIAAAgAAAAJsAAAAAAAAAAAAAAAAVkCAAAIAAAACbAAAAAAAAAAAAAAAAFaAgAACAAAAAmwAAAAAAAAAAAAAAABXgIAAAgAAAAJsAAAAAAAAAAAAAAAAV8CAAAIAAAACbAAAAAAAAAAAAAAAAFhAgAACAAAAAmwAAAAAAAAAAAAAAABYgIAAAgAAAAJsAAAAAAAAAAAAAAAAWYCAAAIAAAACbAAAAAAAAAAAAAAAAFnAgAACAAAAAmwAAAAAAAAAAAAAAABaAIAAAwAAAAJ7QIAAAIAAAACAAAAAWwCAAAIAAAACe4CAAABAAAAAQAAAAFtAgAACAAAAAmwAAAAAAAAAAAAAAABbwIAAAgAAAAJ8AIAAAEAAAABAAAAAXACAAAIAAAACfECAAAHAAAABwAAAAF0AgAACAAAAAnyAgAAAQAAAAEAAAABdQIAAAgAAAAJsAAAAAAAAAAAAAAAAXcCAAAIAAAACbAAAAAAAAAAAAAAAAF4AgAACAAAAAmwAAAAAAAAAAAAAAABfAIAAAgAAAAJsAAAAAAAAAAAAAAAAX0CAAAIAAAACbAAAAAAAAAAAAAAAAF/AgAACAAAAAn0AgAAAQAAAAEAAAABgAIAAAgAAAAJsAAAAAAAAAAAAAAAAYQCAAAIAAAACfYCAAABAAAAAQAAAAGFAgAACAAAAAmwAAAAAAAAAAAAAAABhwIAAAgAAAAJsAAAAAAAAAAAAAAAAYgCAAAIAAAACbAAAAAAAAAAAAAAAAGMAgAACAAAAAmwAAAAAAAAAAAAAAABjQIAAAgAAAAJsAAAAAAAAAAAAAAAAY8CAAAIAAAACbAAAAAAAAAAAAAAAAGQAgAACAAAAAmwAAAAAAAAAAAAAAABlAIAAAgAAAAJsAAAAAAAAAAAAAAAAZUCAAAIAAAACbAAAAAAAAAAAAAAAAGWAgAADAAAAAn4AgAAAgAAAAIAAAABmgIAAAgAAAAJsAAAAAAAAAAAAAAAAZsCAAAIAAAACbAAAAAAAAAAAAAAAAGcAgAADAAAAAn6AgAAAQAAAAEAAAABoAIAAAgAAAAJsAAAAAAAAAAAAAAAAaECAAAIAAAACbAAAAAAAAAAAAAAAAGiAgAADAAAAAn8AgAAAQAAAAEAAAABpgIAAAgAAAAJsAAAAAAAAAAAAAAAAacCAAAIAAAACbAAAAAAAAAAAAAAAAGoAgAADAAAAAn+AgAABAAAAAQAAAABrAIAAAgAAAAJsAAAAAAAAAAAAAAAAa0CAAAIAAAACbAAAAAAAAAAAAAAAAGuAgAADAAAAAkAAwAAAwAAAAMAAAABsgIAAAgAAAAJsAAAAAAAAAAAAAAAAbMCAAAIAAAACbAAAAAAAAAAAAAAAAG0AgAADAAAAAkCAwAAAQAAAAEAAAABuAIAAAgAAAAJsAAAAAAAAAAAAAAAAbkCAAAIAAAACbAAAAAAAAAAAAAAAAG6AgAADAAAAAkEAwAACAAAAAgAAAABvgIAAAgAAAAJsAAAAAAAAAAAAAAAAb8CAAAIAAAACbAAAAAAAAAAAAAAAAHBAgAACAAAAAkGAwAAAQAAAAEAAAABwgIAAAgAAAAJBwMAAAIAAAACAAAAAcYCAAAIAAAACbAAAAAAAAAAAAAAAAHHAgAACAAAAAmwAAAAAAAAAAAAAAAByQIAAAgAAAAJsAAAAAAAAAAAAAAAAcoCAAAIAAAACbAAAAAAAAAAAAAAAAHOAgAACAAAAAmwAAAAAAAAAAAAAAABzwIAAAgAAAAJsAAAAAAAAAAAAAAAAdECAAAIAAAACQkDAAABAAAAAQAAAAHSAgAACAAAAAmwAAAAAAAAAAAAAAAB1gIAAAgAAAAJsAAAAAAAAAAAAAAAAdcCAAAIAAAACbAAAAAAAAAAAAAAAAHZAgAACAAAAAmwAAAAAAAAAAAAAAAB2gIAAAgAAAAJsAAAAAAAAAAAAAAAAd4CAAAIAAAACQsDAAABAAAAAQAAAAHfAgAACAAAAAmwAAAAAAAAAAAAAAAB4QIAAAgAAAAJsAAAAAAAAAAAAAAAAeICAAAIAAAACbAAAAAAAAAAAAAAAAHmAgAACAAAAAkNAwAAAQAAAAEAAAAB5wIAAAgAAAAJsAAAAAAAAAAAAAAAB+kCAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJDwMAAA0DB+sCAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJEAMAAAkRAwAADQIH7QIAAAABAAAABAAAAAQtUFNNb2R1bGVEZXZlbG9wbWVudC5UZW1wbGF0ZS5UZW1wbGF0ZUl0ZW1CYXNlAgAAAAkSAwAACRMDAAANAhHuAgAABAAAAAYUAwAABG5hbWUNAxHwAgAABAAAAAYVAwAABG5hbWUNAxHxAgAACAAAAAYWAwAABWd1aWQyBhcDAAAFZ3VpZDQGGAMAAAVndWlkNAYZAwAABWd1aWQ0BhoDAAAFZ3VpZDQGGwMAAAVndWlkNAYcAwAABWd1aWQzChHyAgAABAAAAAYdAwAABG5hbWUNAxH0AgAABAAAAAYeAwAABG5hbWUNAxH2AgAABAAAAAYfAwAABG5hbWUNAwf4AgAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACSADAAAJIQMAAA0CB/oCAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJIgMAAA0DB/wCAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJIwMAAA0DB/4CAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJJAMAAAklAwAACSYDAAAJJwMAAAcAAwAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACSgDAAAJKQMAAAkqAwAACgcCAwAAAAEAAAAEAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACSsDAAANAwcEAwAAAAEAAAAIAAAABC1QU01vZHVsZURldmVsb3BtZW50LlRlbXBsYXRlLlRlbXBsYXRlSXRlbUJhc2UCAAAACSwDAAAJLQMAAAkuAwAACS8DAAAJMAMAAAkxAwAACTIDAAAJMwMAABEGAwAABAAAAAY0AwAABG5hbWUNAxEHAwAABAAAAAY1AwAACnRlc3Rmb2xkZXIGNgMAAAxwZXN0ZXJjb25maWcNAhEJAwAABAAAAAY3AwAABG5hbWUNAxELAwAABAAAAAY4AwAABG5hbWUNAxENAwAABAAAAAY5AwAABG5hbWUNAwEPAwAAPAAAAAY6AwAAzg9mdW5jdGlvbiBDb25uZWN0LcO+bmFtZcO+DQp7DQo8Iw0KCS5TWU5PUFNJUw0KCQlDb25maWd1cmVzIHRoZSBjb25uZWN0aW9uIHRvIHRoZSDDvm5hbWXDviBBenVyZSBGdW5jdGlvbi4NCgkNCgkuREVTQ1JJUFRJT04NCgkJQ29uZmlndXJlcyB0aGUgY29ubmVjdGlvbiB0byB0aGUgw75uYW1lw74gQXp1cmUgRnVuY3Rpb24uDQoJDQoJLlBBUkFNRVRFUiBVcmkNCgkJVXJsIHRvIGNvbm5lY3QgdG8gdGhlIMO+bmFtZcO+IEF6dXJlIGZ1bmN0aW9uLg0KCQ0KCS5QQVJBTUVURVIgVW5wcm90ZWN0ZWRUb2tlbg0KCQlUaGUgdW5lbmNyeXB0ZWQgYWNjZXNzIHRva2VuIHRvIHRoZSDDvm5hbWXDviBBenVyZSBmdW5jdGlvbi4gT05MWSB1c2UgdGhpcyBmcm9tIHNlY3VyZSBsb2NhdGlvbnMgb3Igbm9uLXNlbnNpdGl2ZSBmdW5jdGlvbnMhDQoJDQoJLlBBUkFNRVRFUiBQcm90ZWN0ZWRUb2tlbg0KCQlBbiBlbmNyeXB0ZWQgYWNjZXNzIHRva2VuIHRvIHRoZSDDvm5hbWXDviBBenVyZSBmdW5jdGlvbi4gVXNlIHRoaXMgdG8gcGVyc2lzdCBhbiBhY2Nlc3MgdG9rZW4gaW4gYSB3YXkgb25seSB0aGUgY3VycmVudCB1c2VyIG9uIHRoZSBjdXJyZW50IHN5c3RlbSBjYW4gYWNjZXNzLg0KCQ0KCS5QQVJBTUVURVIgUmVnaXN0ZXINCgkJVXNpbmcgdGhpcyBjb21tYW5kLCB0aGUgbW9kdWxlIHdpbGwgcmVtZW1iZXIgdGhlIGNvbm5lY3Rpb24gc2V0dGluZ3MgcGVyc2lzdGVudGx5IGFjcm9zcyBQb3dlclNoZWxsIHNlc3Npb25zLg0KCQlDQVVUSU9OOiBXaGVuIHVzaW5nIHVuZW5jcnlwdGVkIHRva2VuIGRhdGEgKHN1Y2ggYXMgc3BlY2lmaWVkIHRocm91Z2ggdGhlIC1VbnByb3RlY3RlZFRva2VuIHBhcmFtZXRlciksIHRoZSBhdXRoZW50aWNhdGluZyB0b2tlbiB3aWxsIGJlIHN0b3JlZCBpbiBjbGVhci10ZXh0IQ0KCQ0KCS5FWEFNUExFDQoJCVBTIEM6XD4gQ29ubmVjdC3Dvm5hbWXDviAtVXJpICdodHRwczovL2RlbW9mdW5jdGlvbmFwcC5henVyZXdlYnNpdGVzLm5ldC9hcGkvJw0KCQ0KCQlFc3RhYmxpc2hlcyBhIGNvbm5lY3Rpb24gdG8gw75uYW1lw74NCiM+DQoJW0NtZGxldEJpbmRpbmcoKV0NCglwYXJhbSAoDQoJCVtzdHJpbmddDQoJCSRVcmksDQoJCQ0KCQlbc3RyaW5nXQ0KCQkkVW5wcm90ZWN0ZWRUb2tlbiwNCgkJDQoJCVtTeXN0ZW0uTWFuYWdlbWVudC5BdXRvbWF0aW9uLlBTQ3JlZGVudGlhbF0NCgkJJFByb3RlY3RlZFRva2VuLA0KCQkNCgkJW3N3aXRjaF0NCgkJJFJlZ2lzdGVyDQoJKQ0KCQ0KCXByb2Nlc3MNCgl7DQoJCWlmIChUZXN0LVBTRlBhcmFtZXRlckJpbmRpbmcgLVBhcmFtZXRlck5hbWUgVW5wcm90ZWN0ZWRUb2tlbikNCgkJew0KCQkJU2V0LVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5VbnByb3RlY3RlZFRva2VuJyAtVmFsdWUgJFVucHJvdGVjdGVkVG9rZW4NCgkJCWlmICgkUmVnaXN0ZXIpIHsgUmVnaXN0ZXItUFNGQ29uZmlnIC1Nb2R1bGUgJ8O+bmFtZcO+JyAtTmFtZSAnQ2xpZW50LlVucHJvdGVjdGVkVG9rZW4nIH0NCgkJfQ0KCQlpZiAoVGVzdC1QU0ZQYXJhbWV0ZXJCaW5kaW5nIC1QYXJhbWV0ZXJOYW1lIFVyaSkNCgkJew0KCQkJU2V0LVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5VcmknIC1WYWx1ZSAkVXJpDQoJCQlpZiAoJFJlZ2lzdGVyKSB7IFJlZ2lzdGVyLVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5VcmknIH0NCgkJfQ0KCQlpZiAoVGVzdC1QU0ZQYXJhbWV0ZXJCaW5kaW5nIC1QYXJhbWV0ZXJOYW1lIFByb3RlY3RlZFRva2VuKQ0KCQl7DQoJCQlTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgJ8O+bmFtZcO+JyAtTmFtZSAnQ2xpZW50LlByb3RlY3RlZFRva2VuJyAtVmFsdWUgJFByb3RlY3RlZFRva2VuDQoJCQlpZiAoJFJlZ2lzdGVyKSB7IFJlZ2lzdGVyLVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5Qcm90ZWN0ZWRUb2tlbicgfQ0KCQl9DQoJCQ0KCX0NCn0BCTsDAAAJPAMAAAY9AwAAFENvbm5lY3Qtw75uYW1lw74ucHMxBj4DAAA/YXpGdW5jdGlvblJlc291cmNlc1xjbGllbnRNb2R1bGVcZnVuY3Rpb25zXENvbm5lY3Qtw75uYW1lw74ucHMxCVoAAAAJQAMAAAlBAwAAARADAAA3AAAACUIDAAAGQwMAAA5jb25maWd1cmF0aW9ucwZEAwAAOGF6RnVuY3Rpb25SZXNvdXJjZXNcY2xpZW50TW9kdWxlXGludGVybmFsXGNvbmZpZ3VyYXRpb25zCVoAAAAJRgMAAAlHAwAAAREDAAA3AAAACUgDAAAGSQMAAAlmdW5jdGlvbnMGSgMAADNhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxpbnRlcm5hbFxmdW5jdGlvbnMJWgAAAAlMAwAACU0DAAABEgMAADwAAAAGTgMAAFJ1c2luZyBTeXN0ZW07DQoNCm5hbWVzcGFjZSDDvm5hbWXDvg0Kew0KICAgIHB1YmxpYyBjbGFzcyBDbGFzczENCiAgICB7DQogICAgfQ0KfQ0KAQlPAwAACVADAAAGUQMAAAlDbGFzczEuY3MGUgMAACNsaWJyYXJ5XMO+bmFtZcO+XMO+bmFtZcO+XENsYXNzMS5jcwlaAAAACVQDAAAJVQMAAAETAwAAPAAAAAZWAwAA0AU8UHJvamVjdCBTZGs9Ik1pY3Jvc29mdC5ORVQuU2RrIj4NCg0KICA8UHJvcGVydHlHcm91cD4NCiAgICA8VGFyZ2V0RnJhbWV3b3JrPm5ldDQuNS4yPC9UYXJnZXRGcmFtZXdvcms+DQogIDwvUHJvcGVydHlHcm91cD4NCg0KICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfEFueUNQVSciPg0KICAgIDxPdXRwdXRQYXRoPi4uXC4uXC4uXMO+bmFtZcO+XGJpbjwvT3V0cHV0UGF0aD4NCiAgICA8RG9jdW1lbnRhdGlvbkZpbGU+Li5cLi5cLi5cw75uYW1lw75cYmluXMO+bmFtZcO+LnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQogIDwvUHJvcGVydHlHcm91cD4NCg0KICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKFJlbGVhc2UpfCQoUGxhdGZvcm0pJz09J0RlYnVnfEFueUNQVSciPg0KICAgIDxPdXRwdXRQYXRoPi4uXC4uXC4uXMO+bmFtZcO+XGJpbjwvT3V0cHV0UGF0aD4NCiAgICA8RG9jdW1lbnRhdGlvbkZpbGU+Li5cLi5cLi5cw75uYW1lw75cYmluXMO+bmFtZcO+LnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+DQogIDwvUHJvcGVydHlHcm91cD4NCiAgDQogIDxQcm9wZXJ0eUdyb3VwPg0KICAgIDxBcHBlbmRUYXJnZXRGcmFtZXdvcmtUb091dHB1dFBhdGg+ZmFsc2U8L0FwcGVuZFRhcmdldEZyYW1ld29ya1RvT3V0cHV0UGF0aD4NCiAgPC9Qcm9wZXJ0eUdyb3VwPg0KDQo8L1Byb2plY3Q+DQoBCVcDAAAJWAMAAAZZAwAAD8O+bmFtZcO+LmNzcHJvagZaAwAAKWxpYnJhcnlcw75uYW1lw75cw75uYW1lw75cw75uYW1lw74uY3Nwcm9qCVoAAAAJXAMAAAldAwAAASADAAA8AAAABl4DAADACTwjDQpUaGlzIGlzIGFuIGV4YW1wbGUgY29uZmlndXJhdGlvbiBmaWxlDQoNCkJ5IGRlZmF1bHQsIGl0IGlzIGVub3VnaCB0byBoYXZlIGEgc2luZ2xlIG9uZSBvZiB0aGVtLA0KaG93ZXZlciBpZiB5b3UgaGF2ZSBlbm91Z2ggY29uZmlndXJhdGlvbiBzZXR0aW5ncyB0byBqdXN0aWZ5IGhhdmluZyBtdWx0aXBsZSBjb3BpZXMgb2YgaXQsDQpmZWVsIHRvdGFsbHkgZnJlZSB0byBzcGxpdCB0aGVtIGludG8gbXVsdGlwbGUgZmlsZXMuDQojPg0KDQo8Iw0KIyBFeGFtcGxlIENvbmZpZ3VyYXRpb24NClNldC1QU0ZDb25maWcgLU1vZHVsZSAnw75uYW1lw74nIC1OYW1lICdFeGFtcGxlLlNldHRpbmcnIC1WYWx1ZSAxMCAtSW5pdGlhbGl6ZSAtVmFsaWRhdGlvbiAnaW50ZWdlcicgLUhhbmRsZXIgeyB9IC1EZXNjcmlwdGlvbiAiRXhhbXBsZSBjb25maWd1cmF0aW9uIHNldHRpbmcuIFlvdXIgbW9kdWxlIGNhbiB0aGVuIHVzZSB0aGUgc2V0dGluZyB1c2luZyAnR2V0LVBTRkNvbmZpZ1ZhbHVlJyINCiM+DQoNClNldC1QU0ZDb25maWcgLU1vZHVsZSAnw75uYW1lw74nIC1OYW1lICdJbXBvcnQuRG9Eb3RTb3VyY2UnIC1WYWx1ZSAkZmFsc2UgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gJ2Jvb2wnIC1EZXNjcmlwdGlvbiAiV2hldGhlciB0aGUgbW9kdWxlIGZpbGVzIHNob3VsZCBiZSBkb3Rzb3VyY2VkIG9uIGltcG9ydC4gQnkgZGVmYXVsdCwgdGhlIGZpbGVzIG9mIHRoaXMgbW9kdWxlIGFyZSByZWFkIGFzIHN0cmluZyB2YWx1ZSBhbmQgaW52b2tlZCwgd2hpY2ggaXMgZmFzdGVyIGJ1dCB3b3JzZSBvbiBkZWJ1Z2dpbmcuIg0KU2V0LVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0ltcG9ydC5JbmRpdmlkdWFsRmlsZXMnIC1WYWx1ZSAkZmFsc2UgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gJ2Jvb2wnIC1EZXNjcmlwdGlvbiAiV2hldGhlciB0aGUgbW9kdWxlIGZpbGVzIHNob3VsZCBiZSBpbXBvcnRlZCBpbmRpdmlkdWFsbHkuIER1cmluZyB0aGUgbW9kdWxlIGJ1aWxkLCBhbGwgbW9kdWxlIGNvZGUgaXMgY29tcGlsZWQgaW50byBmZXcgZmlsZXMsIHdoaWNoIGFyZSBpbXBvcnRlZCBpbnN0ZWFkIGJ5IGRlZmF1bHQuIExvYWRpbmcgdGhlIGNvbXBpbGVkIHZlcnNpb25zIGlzIGZhc3RlciwgdXNpbmcgdGhlIGluZGl2aWR1YWwgZmlsZXMgaXMgZWFzaWVyIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3Rpbmcgb3V0IGFkanVzdG1lbnRzLiIBCV8DAAAJYAMAAAZhAwAAEWNvbmZpZ3VyYXRpb24ucHMxBmIDAAAyw75uYW1lw75caW50ZXJuYWxcY29uZmlndXJhdGlvbnNcY29uZmlndXJhdGlvbi5wczEJWgAAAAlkAwAACWUDAAABIQMAADwAAAAGZgMAAP4DIyBDb25maWd1cmF0aW9ucw0KDQpUaHJvdWdoIHRoZSBgUFNGcmFtZXdvcmtgIHlvdSBoYXZlIGEgc2ltcGxlIG1ldGhvZCB0aGF0IGFsbG93cyB5b3UgdG8gLi4uDQoNCiAtIFB1Ymxpc2ggc2V0dGluZ3MNCiAtIFdpdGggb25ib2FyZCBkb2N1bWVudGF0aW9uDQogLSBJbnB1dCB2YWxpZGF0aW9uDQogLSBTY3JpcHRzIHRoYXQgcnVuIG9uIGNoYW5nZSBvZiBzZXR0aW5ncw0KIC0gVGhhdCBjYW4gYmUgZGlzY292ZXJlZCBhbmQgdXBkYXRlZCBieSB0aGUgdXNlcg0KIC0gVGhhdCBjYW4gYmUgYWRtaW5pc3RyYXRlZCBieSBwb2xpY3kgJiBEU0MNCg0KVGhlIGNvbmZpZ3VyYXRpb24gc3lzdGVtIGlzIGEgYml0IHRvbyBjb21wbGV4IHRvIGRlc2NyaWJlIGluIGEgaGVscCBmaWxlLCB5b3UgY2FuIGhvd2V2ZXIgdmlzaXQgdXMgYXQgaHR0cDovL3BzZnJhbWV3b3JrLm9yZyBmb3IgZGV0YWlsZWQgZ3VpZGFuY2UuDQoNCkFuIGV4YW1wbGUgY2FuIGJlIHNlZW4gaW4gdGhlIGF0dGFjaGVkIHBzMSBmaWxlAQlnAwAACWgDAAAGaQMAAAlyZWFkbWUubWQGagMAACrDvm5hbWXDvlxpbnRlcm5hbFxjb25maWd1cmF0aW9uc1xyZWFkbWUubWQJWgAAAAlsAwAACW0DAAABIgMAADwAAAAGbgMAANsBIyBGdW5jdGlvbnMNCg0KVGhpcyBpcyB0aGUgZm9sZGVyIHdoZXJlIHRoZSBpbnRlcm5hbCBmdW5jdGlvbnMgZ28uDQoNCkRlcGVuZGluZyBvbiB0aGUgY29tcGxleGl0eSBvZiB0aGUgbW9kdWxlLCBpdCBpcyByZWNvbW1lbmRlZCB0byBzdWJkaXZpZGUgdGhlbSBpbnRvIHN1YmZvbGRlcnMuDQoNClRoZSBtb2R1bGUgd2lsbCBwaWNrIHVwIGFsbCAucHMxIGZpbGVzIHJlY3Vyc2l2ZWx5AQlvAwAACXADAAAGcQMAAAlyZWFkbWUubWQGcgMAACXDvm5hbWXDvlxpbnRlcm5hbFxmdW5jdGlvbnNccmVhZG1lLm1kCVoAAAAJdAMAAAl1AwAAASMDAAA8AAAABnYDAACEAzwjDQpTdG9yZWQgc2NyaXB0YmxvY2tzIGFyZSBhdmFpbGFibGUgaW4gW1BzZlZhbGlkYXRlU2NyaXB0KCldIGF0dHJpYnV0ZXMuDQpUaGlzIG1ha2VzIGl0IGVhc2llciB0byBjZW50cmFsbHkgcHJvdmlkZSB0aGUgc2FtZSBzY3JpcHRibG9jayBtdWx0aXBsZSB0aW1lcywNCndpdGhvdXQgaGF2aW5nIHRvIG1haW50YWluIGl0IGluIHNlcGFyYXRlIGxvY2F0aW9ucy4NCg0KSXQgYWxzbyBwcmV2ZW50cyBsZW5ndGh5IHZhbGlkYXRpb24gc2NyaXB0YmxvY2tzIGZyb20gbWFraW5nIHlvdXIgcGFyYW1ldGVyIGJsb2NrDQpoYXJkIHRvIHJlYWQuDQoNClNldC1QU0ZTY3JpcHRibG9jayAtTmFtZSAnw75uYW1lw74uU2NyaXB0QmxvY2tOYW1lJyAtU2NyaXB0YmxvY2sgew0KCQ0KfQ0KIz4BCXcDAAAJeAMAAAZ5AwAAEHNjcmlwdGJsb2Nrcy5wczEGegMAAC/Dvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRibG9ja3Ncc2NyaXB0YmxvY2tzLnBzMQlaAAAACXwDAAAJfQMAAAEkAwAAPAAAAAZ+AwAA9glOZXctUFNGTGljZW5zZSAtUHJvZHVjdCAnw75uYW1lw74nIC1NYW51ZmFjdHVyZXIgJ8O+YXV0aG9yw74nIC1Qcm9kdWN0VmVyc2lvbiAkc2NyaXB0Ok1vZHVsZVZlcnNpb24gLVByb2R1Y3RUeXBlIE1vZHVsZSAtTmFtZSBNSVQgLVZlcnNpb24gIjEuMC4wLjAiIC1EYXRlIChHZXQtRGF0ZSAiw74hZGF0ZSHDviIpIC1UZXh0IEAiDQpDb3B5cmlnaHQgKGMpIMO+IXllYXIhw74gw75hdXRob3LDvg0KDQpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5DQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbA0KaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cw0KdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbA0KY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzDQpmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOg0KDQpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwNCmNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuDQoNClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SDQpJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwNCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQ0KQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUg0KTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwNCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFDQpTT0ZUV0FSRS4NCiJAAQl/AwAACYADAAAGgQMAAAtsaWNlbnNlLnBzMQaCAwAAJcO+bmFtZcO+XGludGVybmFsXHNjcmlwdHNcbGljZW5zZS5wczEJWgAAAAmEAwAACYUDAAABJQMAADwAAAAGhgMAALcGPCMNCkFkZCBhbGwgdGhpbmdzIHlvdSB3YW50IHRvIHJ1biBhZnRlciBpbXBvcnRpbmcgdGhlIG1haW4gZnVuY3Rpb24gY29kZQ0KDQpXQVJOSU5HOiBPTkxZIHByb3ZpZGUgcGF0aHMgdG8gZmlsZXMhDQoNCkFmdGVyIGJ1aWxkaW5nIHRoZSBtb2R1bGUsIHRoaXMgZmlsZSB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZCwgYWRkaW5nIGFueXRoaW5nIGJ1dCBwYXRocyB0byBmaWxlcyAuLi4NCi0gV2lsbCBub3Qgd29yayBhZnRlciBwdWJsaXNoaW5nDQotIENvdWxkIGJyZWFrIHRoZSBidWlsZCBwcm9jZXNzDQojPg0KDQokbW9kdWxlUm9vdCA9IFNwbGl0LVBhdGggKFNwbGl0LVBhdGggJFBTU2NyaXB0Um9vdCkNCg0KIyBMb2FkIENvbmZpZ3VyYXRpb25zDQooR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcaW50ZXJuYWxcY29uZmlndXJhdGlvbnNcKi5wczEiIC1FcnJvckFjdGlvbiBJZ25vcmUpLkZ1bGxOYW1lDQoNCiMgTG9hZCBTY3JpcHRibG9ja3MNCihHZXQtQ2hpbGRJdGVtICIkbW9kdWxlUm9vdFxpbnRlcm5hbFxzY3JpcHRibG9ja3NcKi5wczEiIC1FcnJvckFjdGlvbiBJZ25vcmUpLkZ1bGxOYW1lDQoNCiMgTG9hZCBUYWIgRXhwYW5zaW9uDQooR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcaW50ZXJuYWxcdGVwcFwqLnRlcHAucHMxIiAtRXJyb3JBY3Rpb24gSWdub3JlKS5GdWxsTmFtZQ0KDQojIExvYWQgVGFiIEV4cGFuc2lvbiBBc3NpZ25tZW50DQoiJG1vZHVsZVJvb3RcaW50ZXJuYWxcdGVwcFxhc3NpZ25tZW50LnBzMSINCg0KIyBMb2FkIExpY2Vuc2UNCiIkbW9kdWxlUm9vdFxpbnRlcm5hbFxzY3JpcHRzXGxpY2Vuc2UucHMxIgEJhwMAAAmIAwAABokDAAAOcG9zdGltcG9ydC5wczEGigMAACjDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzXHBvc3RpbXBvcnQucHMxCVoAAAAJjAMAAAmNAwAAASYDAAA8AAAABo4DAACwAzwjDQpBZGQgYWxsIHRoaW5ncyB5b3Ugd2FudCB0byBydW4gYmVmb3JlIGltcG9ydGluZyB0aGUgbWFpbiBmdW5jdGlvbiBjb2RlLg0KDQpXQVJOSU5HOiBPTkxZIHByb3ZpZGUgcGF0aHMgdG8gZmlsZXMhDQoNCkFmdGVyIGJ1aWxkaW5nIHRoZSBtb2R1bGUsIHRoaXMgZmlsZSB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZCwgYWRkaW5nIGFueXRoaW5nIGJ1dCBwYXRocyB0byBmaWxlcyAuLi4NCi0gV2lsbCBub3Qgd29yayBhZnRlciBwdWJsaXNoaW5nDQotIENvdWxkIGJyZWFrIHRoZSBidWlsZCBwcm9jZXNzDQojPg0KDQokbW9kdWxlUm9vdCA9IFNwbGl0LVBhdGggKFNwbGl0LVBhdGggJFBTU2NyaXB0Um9vdCkNCg0KIyBMb2FkIHRoZSBzdHJpbmdzIHVzZWQgaW4gbWVzc2FnZXMNCiIkbW9kdWxlUm9vdFxpbnRlcm5hbFxzY3JpcHRzXHN0cmluZ3MucHMxIgEJjwMAAAmQAwAABpEDAAANcHJlaW1wb3J0LnBzMQaSAwAAJ8O+bmFtZcO+XGludGVybmFsXHNjcmlwdHNccHJlaW1wb3J0LnBzMQlaAAAACZQDAAAJlQMAAAEnAwAAPAAAAAaWAwAAuAM8Iw0KVGhpcyBmaWxlIGxvYWRzIHRoZSBzdHJpbmdzIGRvY3VtZW50cyBmcm9tIHRoZSByZXNwZWN0aXZlIGxhbmd1YWdlIGZvbGRlcnMuDQpUaGlzIGFsbG93cyBsb2NhbGl6aW5nIG1lc3NhZ2VzIGFuZCBlcnJvcnMuDQpMb2FkIHBzZDEgbGFuZ3VhZ2UgZmlsZXMgZm9yIGVhY2ggbGFuZ3VhZ2UgeW91IHdpc2ggdG8gc3VwcG9ydC4NClBhcnRpYWwgdHJhbnNsYXRpb25zIGFyZSBhY2NlcHRhYmxlIC0gd2hlbiBtaXNzaW5nIGEgY3VycmVudCBsYW5ndWFnZSBtZXNzYWdlLA0KaXQgd2lsbCBmYWxsYmFjayB0byBFbmdsaXNoIG9yIGFub3RoZXIgYXZhaWxhYmxlIGxhbmd1YWdlLg0KIz4NCkltcG9ydC1QU0ZMb2NhbGl6ZWRTdHJpbmcgLVBhdGggIiQoJHNjcmlwdDpNb2R1bGVSb290KVxlbi11c1wqLnBzZDEiIC1Nb2R1bGUgJ8O+bmFtZcO+JyAtTGFuZ3VhZ2UgJ2VuLVVTJwEJlwMAAAmYAwAABpkDAAALc3RyaW5ncy5wczEGmgMAACXDvm5hbWXDvlxpbnRlcm5hbFxzY3JpcHRzXHN0cmluZ3MucHMxCVoAAAAJnAMAAAmdAwAAASgDAAA8AAAABp4DAABxPCMNCiMgRXhhbXBsZToNClJlZ2lzdGVyLVBTRlRlcHBBcmd1bWVudENvbXBsZXRlciAtQ29tbWFuZCBHZXQtQWxjb2hvbCAtUGFyYW1ldGVyIFR5cGUgLU5hbWUgw75uYW1lw74uYWxjb2hvbA0KIz4BCZ8DAAAJoAMAAAahAwAADmFzc2lnbm1lbnQucHMxBqIDAAAlw75uYW1lw75caW50ZXJuYWxcdGVwcFxhc3NpZ25tZW50LnBzMQlaAAAACaQDAAAJpQMAAAEpAwAAPAAAAAamAwAAowE8Iw0KIyBFeGFtcGxlOg0KUmVnaXN0ZXItUFNGVGVwcFNjcmlwdGJsb2NrIC1OYW1lICLDvm5hbWXDvi5hbGNvaG9sIiAtU2NyaXB0QmxvY2sgeyAnQmVlcicsJ01lYWQnLCdXaGlza2V5JywnV2luZScsJ1ZvZGthJywnUnVtICgzeSknLCAnUnVtICg1eSknLCAnUnVtICg3eSknIH0NCiM+AQmnAwAACagDAAAGqQMAABBleGFtcGxlLnRlcHAucHMxBqoDAAAnw75uYW1lw75caW50ZXJuYWxcdGVwcFxleGFtcGxlLnRlcHAucHMxCVoAAAAJrAMAAAmtAwAAASoDAAA8AAAABq4DAAC+ByMgVGFiIEV4cGFuc2lvbg0KDQojIyBEZXNjcmlwdGlvbg0KDQpNb2Rlcm4gVGFiIEV4cGFuc2lvbiB3YXMgb3BlbmVkIHRvIHVzZXJzIHdpdGggdGhlIG1vZHVsZSBgVGFiIEV4cGFuc2lvbiBQbHVzIFBsdXNgIChURVBQKS4NCg0KSXQgYWxsb3dzIHlvdSB0byBkZWZpbmUsIHdoYXQgb3B0aW9ucyBhIHVzZXIgaXMgb2ZmZXJlZCB3aGVuIHRhYmJpbmcgdGhyb3VnaCBpbnB1dCBvcHRpb25zLiBUaGlzIGNhbiBzYXZlIGEgbG90IG9mIHRpbWUgZm9yIHRoZSB1c2VyIGFuZCBpcyBjb25zaWRlcmVkIGEga2V5IGVsZW1lbnQgaW4gdXNlciBleHBlcmllbmNlLg0KDQpUaGUgYFBTRnJhbWV3b3JrYCBvZmZlcnMgYSBzaW1wbGlmaWVkIHdheSBvZiBvZmZlcmluZyBqdXN0IHRoaXMsIGFzIHRoZSB0d28gZXhhbXBsZSBmaWxlcyBzaG93Lg0KDQojIyBDb25jZXB0DQoNCkN1c3RvbSB0YWIgY29tcGxldGlvbiBpcyBkZWZpbmVkIGluIHR3byBzdGVwczoNCg0KIC0gRGVmaW5lIGEgc2NyaXB0YmxvY2sgdGhhdCBpcyBydW4gd2hlbiB0aGUgdXNlciBoaXRzIGBUQUJgIGFuZCBwcm92aWRlcyB0aGUgc3RyaW5ncyB0aGF0IGFyZSBoaXMgb3B0aW9ucy4NCiAtIEFzc2lnbiB0aGF0IHNjcmlwdGJsb2NrIHRvIHRoZSBwYXJhbWV0ZXIgb2YgYSBjb21tYW5kLiBZb3UgY2FuIGFzc2lnbiB0aGUgc2FtZSBzY3JpcHRibG9jayBtdWx0aXBsZSB0aW1lcy4NCg0KIyMgU3RydWN0dXJlDQoNCkltcG9ydCBvcmRlciBtYXR0ZXJzLiBJbiBvcmRlciB0byBtYWtlIHRoaW5ncyB3b3JrIHdpdGggdGhlIGRlZmF1bHQgc2NhZmZvbGQsIGZvbGxvdyB0aG9zZSBydWxlczoNCg0KIC0gQWxsIHNjcmlwdGZpbGVzIF9kZWZpbmluZ18gY29tcGxldGlvbiBzY3JpcHRibG9ja3MgbGlrZSB0aGlzOiBgKi50ZXBwLnBzMWANCiAtIFB1dCBhbGwgeW91ciBjb21wbGV0aW9uIGFzc2lnbm1lbnRzIGluIGBhc3NpZ25tZW50LnBzMWABCa8DAAAJsAMAAAaxAwAACXJlYWRtZS5tZAayAwAAIMO+bmFtZcO+XGludGVybmFsXHRlcHBccmVhZG1lLm1kCVoAAAAJtAMAAAm1AwAAASsDAAA8AAAABrYDAADVASMgRGVzY3JpcHRpb24NCg0KVGhpcyBpcyB3aGVyZSB0aGUgZnVuY3Rpb24gdGVzdHMgZ28uDQoNCk1ha2Ugc3VyZSB0byBwdXQgdGhlbSBpbiBmb2xkZXJzIHJlZmxlY3RpbmcgdGhlIGFjdHVhbCBtb2R1bGUgc3RydWN0dXJlLg0KDQpJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBpbnRlcm5hbCBhbmQgcHVibGljIGZ1bmN0aW9ucyBoZXJlLgEJtwMAAAm4AwAABrkDAAAJcmVhZG1lLm1kBroDAAAiw75uYW1lw75cdGVzdHNcZnVuY3Rpb25zXHJlYWRtZS5tZAlaAAAACbwDAAAJvQMAAAEsAwAAPAAAAAa+AwAAggYjIExpc3Qgb2YgZm9yYmlkZGVuIGNvbW1hbmRzDQokZ2xvYmFsOkJhbm5lZENvbW1hbmRzID0gQCgNCgknV3JpdGUtSG9zdCcNCgknV3JpdGUtVmVyYm9zZScNCgknV3JpdGUtV2FybmluZycNCgknV3JpdGUtRXJyb3InDQoJJ1dyaXRlLU91dHB1dCcNCgknV3JpdGUtSW5mb3JtYXRpb24nDQoJJ1dyaXRlLURlYnVnJw0KCQ0KCSMgVXNlIENJTSBpbnN0ZWFkIHdoZXJlIHBvc3NpYmxlDQoJJ0dldC1XbWlPYmplY3QnDQoJJ0ludm9rZS1XbWlNZXRob2QnDQoJJ1JlZ2lzdGVyLVdtaUV2ZW50Jw0KCSdSZW1vdmUtV21pT2JqZWN0Jw0KCSdTZXQtV21pSW5zdGFuY2UnDQoNCgkjIFVzZSBHZXQtV2luRXZlbnQgaW5zdGVhZA0KCSdHZXQtRXZlbnRMb2cnDQopDQoNCjwjDQoJQ29udGFpbnMgbGlzdCBvZiBleGNlcHRpb25zIGZvciBiYW5uZWQgY21kbGV0cy4NCglJbnNlcnQgdGhlIGZpbGUgbmFtZXMgb2YgZmlsZXMgdGhhdCBtYXkgY29udGFpbiB0aGVtLg0KCQ0KCUV4YW1wbGU6DQoJIldyaXRlLUhvc3QiICA9IEAoJ1dyaXRlLVBTRkhvc3RDb2xvci5wczEnLCdXcml0ZS1QU0ZNZXNzYWdlLnBzMScpDQojPg0KJGdsb2JhbDpNYXlDb250YWluQ29tbWFuZCA9IEB7DQoJIldyaXRlLUhvc3QiICA9IEAoKQ0KCSJXcml0ZS1WZXJib3NlIiA9IEAoKQ0KCSJXcml0ZS1XYXJuaW5nIiA9IEAoKQ0KCSJXcml0ZS1FcnJvciIgID0gQCgpDQoJIldyaXRlLU91dHB1dCIgPSBAKCkNCgkiV3JpdGUtSW5mb3JtYXRpb24iID0gQCgpDQoJIldyaXRlLURlYnVnIiA9IEAoKQ0KfQEJvwMAAAnAAwAABsEDAAAcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMQbCAwAAM8O+bmFtZcO+XHRlc3RzXGdlbmVyYWxcRmlsZUludGVncml0eS5FeGNlcHRpb25zLnBzMQlaAAAACcQDAAAJxQMAAAEtAwAAPAAAAAbGAwAA4BgkbW9kdWxlUm9vdCA9IChSZXNvbHZlLVBhdGggIiRnbG9iYWw6dGVzdHJvb3RcLi4iKS5QYXRoDQoNCi4gIiRnbG9iYWw6dGVzdHJvb3RcZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LkV4Y2VwdGlvbnMucHMxIg0KDQpEZXNjcmliZSAiVmVyaWZ5aW5nIGludGVncml0eSBvZiBtb2R1bGUgZmlsZXMiIHsNCglCZWZvcmVBbGwgew0KCQlmdW5jdGlvbiBHZXQtRmlsZUVuY29kaW5nDQoJCXsNCgkJPCMNCgkJCS5TWU5PUFNJUw0KCQkJCVRlc3RzIGEgZmlsZSBmb3IgZW5jb2RpbmcuDQoJCQkNCgkJCS5ERVNDUklQVElPTg0KCQkJCVRlc3RzIGEgZmlsZSBmb3IgZW5jb2RpbmcuDQoJCQkNCgkJCS5QQVJBTUVURVIgUGF0aA0KCQkJCVRoZSBmaWxlIHRvIHRlc3QNCgkJIz4NCgkJCVtDbWRsZXRCaW5kaW5nKCldDQoJCQlQYXJhbSAoDQoJCQkJW1BhcmFtZXRlcihNYW5kYXRvcnkgPSAkVHJ1ZSwgVmFsdWVGcm9tUGlwZWxpbmVCeVByb3BlcnR5TmFtZSA9ICRUcnVlKV0NCgkJCQlbQWxpYXMoJ0Z1bGxOYW1lJyldDQoJCQkJW3N0cmluZ10NCgkJCQkkUGF0aA0KCQkJKQ0KCQkJDQoJCQlpZiAoJFBTVmVyc2lvblRhYmxlLlBTVmVyc2lvbi5NYWpvciAtbHQgNikNCgkJCXsNCgkJCQlbYnl0ZVtdXSRieXRlID0gZ2V0LWNvbnRlbnQgLUVuY29kaW5nIGJ5dGUgLVJlYWRDb3VudCA0IC1Ub3RhbENvdW50IDQgLVBhdGggJFBhdGgNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQlbYnl0ZVtdXSRieXRlID0gR2V0LUNvbnRlbnQgLUFzQnl0ZVN0cmVhbSAtUmVhZENvdW50IDQgLVRvdGFsQ291bnQgNCAtUGF0aCAkUGF0aA0KCQkJfQ0KCQkJDQoJCQlpZiAoJGJ5dGVbMF0gLWVxIDB4ZWYgLWFuZCAkYnl0ZVsxXSAtZXEgMHhiYiAtYW5kICRieXRlWzJdIC1lcSAweGJmKSB7ICdVVEY4IEJPTScgfQ0KCQkJZWxzZWlmICgkYnl0ZVswXSAtZXEgMHhmZSAtYW5kICRieXRlWzFdIC1lcSAweGZmKSB7ICdVbmljb2RlJyB9DQoJCQllbHNlaWYgKCRieXRlWzBdIC1lcSAwIC1hbmQgJGJ5dGVbMV0gLWVxIDAgLWFuZCAkYnl0ZVsyXSAtZXEgMHhmZSAtYW5kICRieXRlWzNdIC1lcSAweGZmKSB7ICdVVEYzMicgfQ0KCQkJZWxzZWlmICgkYnl0ZVswXSAtZXEgMHgyYiAtYW5kICRieXRlWzFdIC1lcSAweDJmIC1hbmQgJGJ5dGVbMl0gLWVxIDB4NzYpIHsgJ1VURjcnIH0NCgkJCWVsc2UgeyAnVW5rbm93bicgfQ0KCQl9DQoJfQ0KDQoJQ29udGV4dCAiVmFsaWRhdGluZyBQUzEgU2NyaXB0IGZpbGVzIiB7DQoJCSRhbGxGaWxlcyA9IEdldC1DaGlsZEl0ZW0gLVBhdGggJG1vZHVsZVJvb3QgLVJlY3Vyc2UgfCBXaGVyZS1PYmplY3QgTmFtZSAtbGlrZSAiKi5wczEiIHwgV2hlcmUtT2JqZWN0IEZ1bGxOYW1lIC1Ob3RMaWtlICIkbW9kdWxlUm9vdFx0ZXN0c1wqIg0KCQkNCgkJZm9yZWFjaCAoJGZpbGUgaW4gJGFsbEZpbGVzKQ0KCQl7DQoJCQkkbmFtZSA9ICRmaWxlLkZ1bGxOYW1lLlJlcGxhY2UoIiRtb2R1bGVSb290XCIsICcnKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBVVEY4IGVuY29kaW5nIHdpdGggQnl0ZSBPcmRlciBNYXJrIiAtVGVzdENhc2VzIEB7IGZpbGUgPSAkZmlsZSB9IHsNCgkJCQlHZXQtRmlsZUVuY29kaW5nIC1QYXRoICRmaWxlLkZ1bGxOYW1lIHwgU2hvdWxkIC1CZSAnVVRGOCBCT00nDQoJCQl9DQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHRyYWlsaW5nIHNwYWNlIiAtVGVzdENhc2VzIEB7IGZpbGUgPSAkZmlsZSB9IHsNCgkJCQkoJGZpbGUgfCBTZWxlY3QtU3RyaW5nICJccyQiIHwgV2hlcmUtT2JqZWN0IHsgJF8uTGluZS5UcmltKCkuTGVuZ3RoIC1ndCAwfSkuTGluZU51bWJlciB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQkJfQ0KCQkJDQoJCQkkdG9rZW5zID0gJG51bGwNCgkJCSRwYXJzZUVycm9ycyA9ICRudWxsDQoJCQkkYXN0ID0gW1N5c3RlbS5NYW5hZ2VtZW50LkF1dG9tYXRpb24uTGFuZ3VhZ2UuUGFyc2VyXTo6UGFyc2VGaWxlKCRmaWxlLkZ1bGxOYW1lLCBbcmVmXSR0b2tlbnMsIFtyZWZdJHBhcnNlRXJyb3JzKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBubyBzeW50YXggZXJyb3JzIiAtVGVzdENhc2VzIEB7IHBhcnNlRXJyb3JzID0gJHBhcnNlRXJyb3JzIH0gew0KCQkJCSRwYXJzZUVycm9ycyB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQkJfQ0KCQkJDQoJCQlmb3JlYWNoICgkY29tbWFuZCBpbiAkZ2xvYmFsOkJhbm5lZENvbW1hbmRzKQ0KCQkJew0KCQkJCWlmICgkZ2xvYmFsOk1heUNvbnRhaW5Db21tYW5kWyIkY29tbWFuZCJdIC1ub3Rjb250YWlucyAkZmlsZS5OYW1lKQ0KCQkJCXsNCgkJCQkJSXQgIlskbmFtZV0gU2hvdWxkIG5vdCB1c2UgJGNvbW1hbmQiIC1UZXN0Q2FzZXMgQHsgdG9rZW5zID0gJHRva2VuczsgY29tbWFuZCA9ICRjb21tYW5kIH0gew0KCQkJCQkJJHRva2VucyB8IFdoZXJlLU9iamVjdCBUZXh0IC1FUSAkY29tbWFuZCB8IFNob3VsZCAtQmVOdWxsT3JFbXB0eQ0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQl9DQoJfQ0KCQ0KCUNvbnRleHQgIlZhbGlkYXRpbmcgaGVscC50eHQgaGVscCBmaWxlcyIgew0KCQkkYWxsRmlsZXMgPSBHZXQtQ2hpbGRJdGVtIC1QYXRoICRtb2R1bGVSb290IC1SZWN1cnNlIHwgV2hlcmUtT2JqZWN0IE5hbWUgLWxpa2UgIiouaGVscC50eHQiIHwgV2hlcmUtT2JqZWN0IEZ1bGxOYW1lIC1Ob3RMaWtlICIkbW9kdWxlUm9vdFx0ZXN0c1wqIg0KCQkNCgkJZm9yZWFjaCAoJGZpbGUgaW4gJGFsbEZpbGVzKQ0KCQl7DQoJCQkkbmFtZSA9ICRmaWxlLkZ1bGxOYW1lLlJlcGxhY2UoIiRtb2R1bGVSb290XCIsICcnKQ0KCQkJDQoJCQlJdCAiWyRuYW1lXSBTaG91bGQgaGF2ZSBVVEY4IGVuY29kaW5nIiAtVGVzdENhc2VzIEB7IGZpbGUgPSAkZmlsZSB9IHsNCgkJCQlHZXQtRmlsZUVuY29kaW5nIC1QYXRoICRmaWxlLkZ1bGxOYW1lIHwgU2hvdWxkIC1CZSAnVVRGOCBCT00nDQoJCQl9DQoJCQkNCgkJCUl0ICJbJG5hbWVdIFNob3VsZCBoYXZlIG5vIHRyYWlsaW5nIHNwYWNlIiAtVGVzdENhc2VzIEB7IGZpbGUgPSAkZmlsZSB9IHsNCgkJCQkoJGZpbGUgfCBTZWxlY3QtU3RyaW5nICJccyQiIHwgV2hlcmUtT2JqZWN0IHsgJF8uTGluZS5UcmltKCkuTGVuZ3RoIC1ndCAwIH0gfCBNZWFzdXJlLU9iamVjdCkuQ291bnQgfCBTaG91bGQgLUJlIDANCgkJCX0NCgkJfQ0KCX0NCn0BCccDAAAJyAMAAAbJAwAAF0ZpbGVJbnRlZ3JpdHkuVGVzdHMucHMxBsoDAAAuw75uYW1lw75cdGVzdHNcZ2VuZXJhbFxGaWxlSW50ZWdyaXR5LlRlc3RzLnBzMQlaAAAACcwDAAAJzQMAAAEuAwAAPAAAAAbOAwAAnQUjIExpc3Qgb2YgZnVuY3Rpb25zIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQNCiRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMgPSBAKA0KICAgIA0KKQ0KDQo8Iw0KICBMaXN0IG9mIGFycmF5ZWQgZW51bWVyYXRpb25zLiBUaGVzZSBuZWVkIHRvIGJlIHRyZWF0ZWQgZGlmZmVyZW50bHkuIEFkZCBmdWxsIG5hbWUuDQogIEV4YW1wbGU6DQoNCiAgIlNxbGNvbGxhYm9yYXRpdmUuRGJhdG9vbHMuQ29ubmVjdGlvbi5NYW5hZ2VtZW50Q29ubmVjdGlvblR5cGVbXSINCiM+DQokZ2xvYmFsOkhlbHBUZXN0RW51bWVyYXRlZEFycmF5cyA9IEAoDQoJDQopDQoNCjwjDQogIFNvbWUgdHlwZXMgb24gcGFyYW1ldGVycyBqdXN0IGZhaWwgdGhlaXIgdmFsaWRhdGlvbiBubyBtYXR0ZXIgd2hhdC4NCiAgRm9yIHRob3NlIGl0IGJlY29tZXMgcG9zc2libGUgdG8gc2tpcCB0aGVtLCBieSBhZGRpbmcgdGhlbSB0byB0aGlzIGhhc2h0YWJsZS4NCiAgQWRkIGJ5IGZvbGxvd2luZyB0aGlzIGNvbnZlbnRpb246IDxjb21tYW5kIG5hbWU+ID0gQCg8bGlzdCBvZiBwYXJhbWV0ZXIgbmFtZXM+KQ0KICBFeGFtcGxlOg0KDQogICJHZXQtRGJhQ21PYmplY3QiICAgICAgID0gQCgiRG9Ob3RVc2UiKQ0KIz4NCiRnbG9iYWw6SGVscFRlc3RTa2lwUGFyYW1ldGVyVHlwZSA9IEB7DQogICAgDQp9DQoBCc8DAAAJ0AMAAAbRAwAAE0hlbHAuRXhjZXB0aW9ucy5wczEG0gMAACrDvm5hbWXDvlx0ZXN0c1xnZW5lcmFsXEhlbHAuRXhjZXB0aW9ucy5wczEJWgAAAAnUAwAACdUDAAABLwMAADwAAAAG1gMAAM40PCMNCiAgICAuTk9URVMNCiAgICAgICAgVGhlIG9yaWdpbmFsIHRlc3QgdGhpcyBpcyBiYXNlZCB1cG9uIHdhcyB3cml0dGVuIGJ5IEp1bmUgQmxlbmRlci4NCgkJQWZ0ZXIgc2V2ZXJhbCByb3VuZHMgb2YgbW9kaWZpY2F0aW9ucyBpdCBzdGFuZHMgbm93IGFzIGl0IGlzLCBidXQgdGhlIGhvbm9yIHJlbWFpbnMgaGVycy4NCg0KCQlUaGFuayB5b3UgSnVuZSwgZm9yIGFsbCB5b3UgaGF2ZSBkb25lIQ0KDQogICAgLkRFU0NSSVBUSU9ODQoJCVRoaXMgdGVzdCBldmFsdWF0ZXMgdGhlIGhlbHAgZm9yIGFsbCBjb21tYW5kcyBpbiBhIG1vZHVsZS4NCg0KCS5QQVJBTUVURVIgU2tpcFRlc3QNCgkJRGlzYWJsZXMgdGhpcyB0ZXN0Lg0KCQ0KCS5QQVJBTUVURVIgQ29tbWFuZFBhdGgNCgkJTGlzdCBvZiBwYXRocyB1bmRlciB3aGljaCB0aGUgc2NyaXB0IGZpbGVzIGFyZSBzdG9yZWQuDQoJCVRoaXMgdGVzdCBhc3N1bWVzIHRoYXQgYWxsIGZ1bmN0aW9ucyBoYXZlIHRoZWlyIG93biBmaWxlIHRoYXQgaXMgbmFtZWQgYWZ0ZXIgdGhlbXNlbHZlcy4NCgkJVGhlc2UgcGF0aHMgYXJlIHVzZWQgdG8gc2VhcmNoIGZvciBjb21tYW5kcyB0aGF0IHNob3VsZCBleGlzdCBhbmQgYmUgdGVzdGVkLg0KCQlXaWxsIHNlYXJjaCByZWN1cnNpdmVseSBhbmQgYWNjZXB0cyB3aWxkY2FyZHMsIG1ha2Ugc3VyZSBvbmx5IGZ1bmN0aW9ucyBhcmUgZm91bmQNCg0KCS5QQVJBTUVURVIgTW9kdWxlTmFtZQ0KCQlOYW1lIG9mIHRoZSBtb2R1bGUgdG8gYmUgdGVzdGVkLg0KCQlUaGUgbW9kdWxlIG11c3QgYWxyZWFkeSBiZSBpbXBvcnRlZA0KDQoJLlBBUkFNRVRFUiBFeGNlcHRpb25zRmlsZQ0KCQlGaWxlIGluIHdoaWNoIGV4Y2VwdGlvbnMgYW5kIGFkanVzdG1lbnRzIGFyZSBjb25maWd1cmVkLg0KCQlJbiBpdCB0aGVyZSBzaG91bGQgYmUgdHdvIGFycmF5cyBhbmQgYSBoYXNodGFibGUgZGVmaW5lZDoNCgkJCSRnbG9iYWw6RnVuY3Rpb25IZWxwVGVzdEV4Y2VwdGlvbnMNCgkJCSRnbG9iYWw6SGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzDQoJCQkkZ2xvYmFsOkhlbHBUZXN0U2tpcFBhcmFtZXRlclR5cGUNCgkJVGhlc2UgY2FuIGJlIHVzZWQgdG8gdHdlYWsgdGhlIHRlc3RzIHNsaWdodGx5IGluIGNhc2VzIG9mIG5lZWQuDQoJCVNlZSB0aGUgZXhhbXBsZSBmaWxlIGZvciBleHBsYW5hdGlvbnMgb24gZWFjaCBvZiB0aGVzZSB1c2FnZSBhbmQgZWZmZWN0Lg0KIz4NCltDbWRsZXRCaW5kaW5nKCldDQpQYXJhbSAoDQoJW3N3aXRjaF0NCgkkU2tpcFRlc3QsDQoJDQoJW3N0cmluZ1tdXQ0KCSRDb21tYW5kUGF0aCA9IEAoIiRnbG9iYWw6dGVzdHJvb3RcLi5cZnVuY3Rpb25zIiwgIiRnbG9iYWw6dGVzdHJvb3RcLi5caW50ZXJuYWxcZnVuY3Rpb25zIiksDQoJDQoJW3N0cmluZ10NCgkkTW9kdWxlTmFtZSA9ICLDvm5hbWXDviIsDQoJDQoJW3N0cmluZ10NCgkkRXhjZXB0aW9uc0ZpbGUgPSAiJGdsb2JhbDp0ZXN0cm9vdFxnZW5lcmFsXEhlbHAuRXhjZXB0aW9ucy5wczEiDQopDQppZiAoJFNraXBUZXN0KSB7IHJldHVybiB9DQouICRFeGNlcHRpb25zRmlsZQ0KDQokaW5jbHVkZWROYW1lcyA9IChHZXQtQ2hpbGRJdGVtICRDb21tYW5kUGF0aCAtUmVjdXJzZSAtRmlsZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSIpLkJhc2VOYW1lDQokY29tbWFuZFR5cGVzID0gQCgnQ21kbGV0JywgJ0Z1bmN0aW9uJykNCmlmICgkUFNWZXJzaW9uVGFibGUuUFNFZGl0aW9uIC1lcSAnRGVza3RvcCcgKSB7ICRjb21tYW5kVHlwZXMgKz0gJ1dvcmtmbG93JyB9DQokY29tbWFuZHMgPSBHZXQtQ29tbWFuZCAtTW9kdWxlIChHZXQtTW9kdWxlICRNb2R1bGVOYW1lKSAtQ29tbWFuZFR5cGUgJGNvbW1hbmRUeXBlcyB8IFdoZXJlLU9iamVjdCBOYW1lIC1JbiAkaW5jbHVkZWROYW1lcw0KDQojIyBXaGVuIHRlc3RpbmcgaGVscCwgcmVtZW1iZXIgdGhhdCBoZWxwIGlzIGNhY2hlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggc2Vzc2lvbi4NCiMjIFRvIHRlc3QsIHJlc3RhcnQgc2Vzc2lvbi4NCg0KDQpmb3JlYWNoICgkY29tbWFuZCBpbiAkY29tbWFuZHMpIHsNCiAgICAkY29tbWFuZE5hbWUgPSAkY29tbWFuZC5OYW1lDQogICAgDQogICAgIyBTa2lwIGFsbCBmdW5jdGlvbnMgdGhhdCBhcmUgb24gdGhlIGV4Y2x1c2lvbnMgbGlzdA0KICAgIGlmICgkZ2xvYmFsOkZ1bmN0aW9uSGVscFRlc3RFeGNlcHRpb25zIC1jb250YWlucyAkY29tbWFuZE5hbWUpIHsgY29udGludWUgfQ0KICAgIA0KICAgICMgVGhlIG1vZHVsZS1xdWFsaWZpZWQgY29tbWFuZCBmYWlscyBvbiBNaWNyb3NvZnQuUG93ZXJTaGVsbC5BcmNoaXZlIGNtZGxldHMNCiAgICAkSGVscCA9IEdldC1IZWxwICRjb21tYW5kTmFtZSAtRXJyb3JBY3Rpb24gU2lsZW50bHlDb250aW51ZQ0KCQ0KCURlc2NyaWJlICJUZXN0IGhlbHAgZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICANCgkJIyBJZiBoZWxwIGlzIG5vdCBmb3VuZCwgc3lub3BzaXMgaW4gYXV0by1nZW5lcmF0ZWQgaGVscCBpcyB0aGUgc3ludGF4IGRpYWdyYW0NCgkJSXQgInNob3VsZCBub3QgYmUgYXV0by1nZW5lcmF0ZWQiIC1UZXN0Q2FzZXMgQHsgSGVscCA9ICRIZWxwIH0gew0KCQkJJEhlbHAuU3lub3BzaXMgfCBTaG91bGQgLU5vdCAtQmVMaWtlICcqYFtgPENvbW1vblBhcmFtZXRlcnNgPmBdKicNCgkJfQ0KICAgICAgICANCgkJIyBTaG91bGQgYmUgYSBkZXNjcmlwdGlvbiBmb3IgZXZlcnkgZnVuY3Rpb24NCgkJSXQgImdldHMgZGVzY3JpcHRpb24gZm9yICRjb21tYW5kTmFtZSIgLVRlc3RDYXNlcyBAeyBIZWxwID0gJEhlbHAgfSB7DQoJCQkkSGVscC5EZXNjcmlwdGlvbiB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCX0NCiAgICAgICAgDQoJCSMgU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBleGFtcGxlDQoJCUl0ICJnZXRzIGV4YW1wbGUgY29kZSBmcm9tICRjb21tYW5kTmFtZSIgLVRlc3RDYXNlcyBAeyBIZWxwID0gJEhlbHAgfSB7DQoJCQkoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZSB8IFNlbGVjdC1PYmplY3QgLUZpcnN0IDEpLkNvZGUgfCBTaG91bGQgLU5vdCAtQmVOdWxsT3JFbXB0eQ0KCQl9DQoJDQoJCSMgU2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBleGFtcGxlIGRlc2NyaXB0aW9uDQoJCUl0ICJnZXRzIGV4YW1wbGUgaGVscCBmcm9tICRjb21tYW5kTmFtZSIgLVRlc3RDYXNlcyBAeyBIZWxwID0gJEhlbHAgfSB7DQoJCQkoJEhlbHAuRXhhbXBsZXMuRXhhbXBsZS5SZW1hcmtzIHwgU2VsZWN0LU9iamVjdCAtRmlyc3QgMSkuVGV4dCB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCX0NCiAgICAgICAgDQogICAgICAgIENvbnRleHQgIlRlc3QgcGFyYW1ldGVyIGhlbHAgZm9yICRjb21tYW5kTmFtZSIgew0KICAgICAgICAgICAgDQogICAgICAgICAgICAkY29tbW9uID0gJ0RlYnVnJywgJ0Vycm9yQWN0aW9uJywgJ0Vycm9yVmFyaWFibGUnLCAnSW5mb3JtYXRpb25BY3Rpb24nLCAnSW5mb3JtYXRpb25WYXJpYWJsZScsICdPdXRCdWZmZXInLCAnT3V0VmFyaWFibGUnLCAnUGlwZWxpbmVWYXJpYWJsZScsICdWZXJib3NlJywgJ1dhcm5pbmdBY3Rpb24nLCAnV2FybmluZ1ZhcmlhYmxlJw0KICAgICAgICAgICAgDQogICAgICAgICAgICAkcGFyYW1ldGVycyA9ICRjb21tYW5kLlBhcmFtZXRlclNldHMuUGFyYW1ldGVycyB8IFNvcnQtT2JqZWN0IC1Qcm9wZXJ0eSBOYW1lIC1VbmlxdWUgfCBXaGVyZS1PYmplY3QgTmFtZSAtbm90aW4gJGNvbW1vbg0KICAgICAgICAgICAgJHBhcmFtZXRlck5hbWVzID0gJHBhcmFtZXRlcnMuTmFtZQ0KICAgICAgICAgICAgJEhlbHBQYXJhbWV0ZXJOYW1lcyA9ICRIZWxwLlBhcmFtZXRlcnMuUGFyYW1ldGVyLk5hbWUgfCBTb3J0LU9iamVjdCAtVW5pcXVlDQogICAgICAgICAgICBmb3JlYWNoICgkcGFyYW1ldGVyIGluICRwYXJhbWV0ZXJzKSB7DQogICAgICAgICAgICAgICAgJHBhcmFtZXRlck5hbWUgPSAkcGFyYW1ldGVyLk5hbWUNCiAgICAgICAgICAgICAgICAkcGFyYW1ldGVySGVscCA9ICRIZWxwLnBhcmFtZXRlcnMucGFyYW1ldGVyIHwgV2hlcmUtT2JqZWN0IE5hbWUgLUVRICRwYXJhbWV0ZXJOYW1lDQoJCQkNCgkJCQkjIFNob3VsZCBiZSBhIGRlc2NyaXB0aW9uIGZvciBldmVyeSBwYXJhbWV0ZXINCgkJCQlJdCAiZ2V0cyBoZWxwIGZvciBwYXJhbWV0ZXI6ICRwYXJhbWV0ZXJOYW1lIDogaW4gJGNvbW1hbmROYW1lIiAtVGVzdENhc2VzIEB7IHBhcmFtZXRlckhlbHAgPSAkcGFyYW1ldGVySGVscCB9IHsNCgkJCQkJJHBhcmFtZXRlckhlbHAuRGVzY3JpcHRpb24uVGV4dCB8IFNob3VsZCAtTm90IC1CZU51bGxPckVtcHR5DQoJCQkJfQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRjb2RlTWFuZGF0b3J5ID0gJHBhcmFtZXRlci5Jc01hbmRhdG9yeS50b1N0cmluZygpDQoJCQkJSXQgImhlbHAgZm9yICRwYXJhbWV0ZXJOYW1lIHBhcmFtZXRlciBpbiAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgTWFuZGF0b3J5IHZhbHVlIiAtVGVzdENhc2VzIEB7IHBhcmFtZXRlckhlbHAgPSAkcGFyYW1ldGVySGVscDsgY29kZU1hbmRhdG9yeSA9ICRjb2RlTWFuZGF0b3J5IH0gew0KCQkJCQkkcGFyYW1ldGVySGVscC5SZXF1aXJlZCB8IFNob3VsZCAtQmUgJGNvZGVNYW5kYXRvcnkNCgkJCQl9DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCRIZWxwVGVzdFNraXBQYXJhbWV0ZXJUeXBlWyRjb21tYW5kTmFtZV0gLWNvbnRhaW5zICRwYXJhbWV0ZXJOYW1lKSB7IGNvbnRpbnVlIH0NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAkY29kZVR5cGUgPSAkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuTmFtZQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgIGlmICgkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuSXNFbnVtKSB7DQogICAgICAgICAgICAgICAgICAgICMgRW51bWVyYXRpb25zIG9mdGVuIGhhdmUgaXNzdWVzIHdpdGggdGhlIHR5cGVuYW1lIG5vdCBiZWluZyByZWxpYWJseSBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAgICAgJG5hbWVzID0gJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlOjpHZXROYW1lcygkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUpDQoJCQkJCQkjIFBhcmFtZXRlciB0eXBlIGluIEhlbHAgc2hvdWxkIG1hdGNoIGNvZGUNCgkJCQkJSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIC1UZXN0Q2FzZXMgQHsgcGFyYW1ldGVySGVscCA9ICRwYXJhbWV0ZXJIZWxwOyBuYW1lcyA9ICRuYW1lcyB9IHsNCgkJCQkJCSRwYXJhbWV0ZXJIZWxwLnBhcmFtZXRlclZhbHVlR3JvdXAucGFyYW1ldGVyVmFsdWUgfCBTaG91bGQgLWJlICRuYW1lcw0KCQkJCQl9DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGVsc2VpZiAoJHBhcmFtZXRlci5QYXJhbWV0ZXJUeXBlLkZ1bGxOYW1lIC1pbiAkSGVscFRlc3RFbnVtZXJhdGVkQXJyYXlzKSB7DQogICAgICAgICAgICAgICAgICAgICMgRW51bWVyYXRpb25zIG9mdGVuIGhhdmUgaXNzdWVzIHdpdGggdGhlIHR5cGVuYW1lIG5vdCBiZWluZyByZWxpYWJseSBhdmFpbGFibGUNCiAgICAgICAgICAgICAgICAgICAgJG5hbWVzID0gW0VudW1dOjpHZXROYW1lcygkcGFyYW1ldGVyLlBhcmFtZXRlclR5cGUuRGVjbGFyZWRNZW1iZXJzWzBdLlJldHVyblR5cGUpDQoJCQkJCUl0ICJoZWxwIGZvciAkY29tbWFuZE5hbWUgaGFzIGNvcnJlY3QgcGFyYW1ldGVyIHR5cGUgZm9yICRwYXJhbWV0ZXJOYW1lIiAtVGVzdENhc2VzIEB7IHBhcmFtZXRlckhlbHAgPSAkcGFyYW1ldGVySGVscDsgbmFtZXMgPSAkbmFtZXMgfSB7DQoJCQkJCQkkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZUdyb3VwLnBhcmFtZXRlclZhbHVlIHwgU2hvdWxkIC1iZSAkbmFtZXMNCgkJCQkJfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgIyBUbyBhdm9pZCBjYWxsaW5nIFRyaW0gbWV0aG9kIG9uIGEgbnVsbCBvYmplY3QuDQogICAgICAgICAgICAgICAgICAgICRoZWxwVHlwZSA9IGlmICgkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZSkgeyAkcGFyYW1ldGVySGVscC5wYXJhbWV0ZXJWYWx1ZS5UcmltKCkgfQ0KCQkJCQkjIFBhcmFtZXRlciB0eXBlIGluIEhlbHAgc2hvdWxkIG1hdGNoIGNvZGUNCgkJCQkJSXQgImhlbHAgZm9yICRjb21tYW5kTmFtZSBoYXMgY29ycmVjdCBwYXJhbWV0ZXIgdHlwZSBmb3IgJHBhcmFtZXRlck5hbWUiIC1UZXN0Q2FzZXMgQHsgaGVscFR5cGUgPSAkaGVscFR5cGU7IGNvZGVUeXBlID0gJGNvZGVUeXBlIH0gew0KCQkJCQkJJGhlbHBUeXBlIHwgU2hvdWxkIC1iZSAkY29kZVR5cGUNCgkJCQkJfQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZvcmVhY2ggKCRoZWxwUGFybSBpbiAkSGVscFBhcmFtZXRlck5hbWVzKSB7DQoJCQkJIyBTaG91bGRuJ3QgZmluZCBleHRyYSBwYXJhbWV0ZXJzIGluIGhlbHAuDQoJCQkJSXQgImZpbmRzIGhlbHAgcGFyYW1ldGVyIGluIGNvZGU6ICRoZWxwUGFybSIgLVRlc3RDYXNlcyBAeyBoZWxwUGFybSA9ICRoZWxwUGFybTsgcGFyYW1ldGVyTmFtZXMgPSAkcGFyYW1ldGVyTmFtZXMgfSB7DQoJCQkJCSRoZWxwUGFybSAtaW4gJHBhcmFtZXRlck5hbWVzIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQkJCX0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0BCdcDAAAJ2AMAAAbZAwAADkhlbHAuVGVzdHMucHMxBtoDAAAlw75uYW1lw75cdGVzdHNcZ2VuZXJhbFxIZWxwLlRlc3RzLnBzMQlaAAAACdwDAAAJ3QMAAAEwAwAAPAAAAAbeAwAAyxVEZXNjcmliZSAiVmFsaWRhdGluZyB0aGUgbW9kdWxlIG1hbmlmZXN0IiB7DQoJJG1vZHVsZVJvb3QgPSAoUmVzb2x2ZS1QYXRoICIkZ2xvYmFsOnRlc3Ryb290XC4uIikuUGF0aA0KCSRtYW5pZmVzdCA9ICgoR2V0LUNvbnRlbnQgIiRtb2R1bGVSb290XMO+bmFtZcO+LnBzZDEiKSAtam9pbiAiYG4iKSB8IEludm9rZS1FeHByZXNzaW9uDQoJQ29udGV4dCAiQmFzaWMgcmVzb3VyY2VzIHZhbGlkYXRpb24iIHsNCgkJJGZpbGVzID0gR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSINCgkJSXQgIkV4cG9ydHMgYWxsIGZ1bmN0aW9ucyBpbiB0aGUgcHVibGljIGZvbGRlciIgLVRlc3RDYXNlcyBAeyBmaWxlcyA9ICRmaWxlczsgbWFuaWZlc3QgPSAkbWFuaWZlc3QgfSB7DQoJCQkNCgkJCSRmdW5jdGlvbnMgPSAoQ29tcGFyZS1PYmplY3QgLVJlZmVyZW5jZU9iamVjdCAkZmlsZXMuQmFzZU5hbWUgLURpZmZlcmVuY2VPYmplY3QgJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0IHwgV2hlcmUtT2JqZWN0IFNpZGVJbmRpY2F0b3IgLUxpa2UgJzw9JykuSW5wdXRPYmplY3QNCgkJCSRmdW5jdGlvbnMgfCBTaG91bGQgLUJlTnVsbE9yRW1wdHkNCgkJfQ0KCQlJdCAiRXhwb3J0cyBubyBmdW5jdGlvbiB0aGF0IGlzbid0IGFsc28gcHJlc2VudCBpbiB0aGUgcHVibGljIGZvbGRlciIgLVRlc3RDYXNlcyBAeyBmaWxlcyA9ICRmaWxlczsgbWFuaWZlc3QgPSAkbWFuaWZlc3QgfSB7DQoJCQkkZnVuY3Rpb25zID0gKENvbXBhcmUtT2JqZWN0IC1SZWZlcmVuY2VPYmplY3QgJGZpbGVzLkJhc2VOYW1lIC1EaWZmZXJlbmNlT2JqZWN0ICRtYW5pZmVzdC5GdW5jdGlvbnNUb0V4cG9ydCB8IFdoZXJlLU9iamVjdCBTaWRlSW5kaWNhdG9yIC1MaWtlICc9PicpLklucHV0T2JqZWN0DQoJCQkkZnVuY3Rpb25zIHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCX0NCgkJDQoJCUl0ICJFeHBvcnRzIG5vbmUgb2YgaXRzIGludGVybmFsIGZ1bmN0aW9ucyIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IG1hbmlmZXN0ID0gJG1hbmlmZXN0IH0gew0KCQkJJGZpbGVzID0gR2V0LUNoaWxkSXRlbSAiJG1vZHVsZVJvb3RcaW50ZXJuYWxcZnVuY3Rpb25zIiAtUmVjdXJzZSAtRmlsZSAtRmlsdGVyICIqLnBzMSINCgkJCSRmaWxlcyB8IFdoZXJlLU9iamVjdCBCYXNlTmFtZSAtSW4gJG1hbmlmZXN0LkZ1bmN0aW9uc1RvRXhwb3J0IHwgU2hvdWxkIC1CZU51bGxPckVtcHR5DQoJCX0NCgl9DQoJDQoJQ29udGV4dCAiSW5kaXZpZHVhbCBmaWxlIHZhbGlkYXRpb24iIHsNCgkJSXQgIlRoZSByb290IG1vZHVsZSBmaWxlIGV4aXN0cyIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IG1hbmlmZXN0ID0gJG1hbmlmZXN0IH0gew0KCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkKCRtYW5pZmVzdC5Sb290TW9kdWxlKSIgfCBTaG91bGQgLUJlICR0cnVlDQoJCX0NCgkJDQoJCWZvcmVhY2ggKCRmb3JtYXQgaW4gJG1hbmlmZXN0LkZvcm1hdHNUb1Byb2Nlc3MpDQoJCXsNCgkJCUl0ICJUaGUgZmlsZSAkZm9ybWF0IHNob3VsZCBleGlzdCIgLVRlc3RDYXNlcyBAeyBtb2R1bGVSb290ID0gJG1vZHVsZVJvb3Q7IGZvcm1hdCA9ICRmb3JtYXQgfSB7DQoJCQkJVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkZm9ybWF0IiB8IFNob3VsZCAtQmUgJHRydWUNCgkJCX0NCgkJfQ0KCQkNCgkJZm9yZWFjaCAoJHR5cGUgaW4gJG1hbmlmZXN0LlR5cGVzVG9Qcm9jZXNzKQ0KCQl7DQoJCQlJdCAiVGhlIGZpbGUgJHR5cGUgc2hvdWxkIGV4aXN0IiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgdHlwZSA9ICR0eXBlIH0gew0KCQkJCVRlc3QtUGF0aCAiJG1vZHVsZVJvb3RcJHR5cGUiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KCQkJfQ0KCQl9DQoJCQ0KCQlmb3JlYWNoICgkYXNzZW1ibHkgaW4gJG1hbmlmZXN0LlJlcXVpcmVkQXNzZW1ibGllcykNCgkJew0KICAgICAgICAgICAgaWYgKCRhc3NlbWJseSAtbGlrZSAiKi5kbGwiKSB7DQogICAgICAgICAgICAgICAgSXQgIlRoZSBmaWxlICRhc3NlbWJseSBzaG91bGQgZXhpc3QiIC1UZXN0Q2FzZXMgQHsgbW9kdWxlUm9vdCA9ICRtb2R1bGVSb290OyBhc3NlbWJseSA9ICRhc3NlbWJseSB9IHsNCiAgICAgICAgICAgICAgICAgICAgVGVzdC1QYXRoICIkbW9kdWxlUm9vdFwkYXNzZW1ibHkiIHwgU2hvdWxkIC1CZSAkdHJ1ZQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIEl0ICJUaGUgZmlsZSAkYXNzZW1ibHkgc2hvdWxkIGxvYWQgZnJvbSB0aGUgR0FDIiAtVGVzdENhc2VzIEB7IG1vZHVsZVJvb3QgPSAkbW9kdWxlUm9vdDsgYXNzZW1ibHkgPSAkYXNzZW1ibHkgfSB7DQogICAgICAgICAgICAgICAgICAgIHsgQWRkLVR5cGUgLUFzc2VtYmx5TmFtZSAkYXNzZW1ibHkgfSB8IFNob3VsZCAtTm90IC1UaHJvdw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KCQkNCgkJZm9yZWFjaCAoJHRhZyBpbiAkbWFuaWZlc3QuUHJpdmF0ZURhdGEuUFNEYXRhLlRhZ3MpDQoJCXsNCgkJCUl0ICJUYWdzIHNob3VsZCBoYXZlIG5vIHNwYWNlcyBpbiBuYW1lIiAtVGVzdENhc2VzIEB7IHRhZyA9ICR0YWcgfSB7DQoJCQkJJHRhZyAtbWF0Y2ggIiAiIHwgU2hvdWxkIC1CZSAkZmFsc2UNCgkJCX0NCgkJfQ0KCX0NCn0BCd8DAAAJ4AMAAAbhAwAAEk1hbmlmZXN0LlRlc3RzLnBzMQbiAwAAKcO+bmFtZcO+XHRlc3RzXGdlbmVyYWxcTWFuaWZlc3QuVGVzdHMucHMxCVoAAAAJ5AMAAAnlAwAAATEDAAA8AAAABuYDAACWCVtDbWRsZXRCaW5kaW5nKCldDQpQYXJhbSAoDQoJW3N3aXRjaF0NCgkkU2tpcFRlc3QsDQoJDQoJW3N0cmluZ1tdXQ0KCSRDb21tYW5kUGF0aCA9IEAoIiRnbG9iYWw6dGVzdHJvb3RcLi5cZnVuY3Rpb25zIiwgIiRnbG9iYWw6dGVzdHJvb3RcLi5caW50ZXJuYWxcZnVuY3Rpb25zIikNCikNCg0KaWYgKCRTa2lwVGVzdCkgeyByZXR1cm4gfQ0KDQokZ2xvYmFsOl9fcGVzdGVyX2RhdGEuU2NyaXB0QW5hbHl6ZXIgPSBOZXctT2JqZWN0IFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QNCg0KRGVzY3JpYmUgJ0ludm9raW5nIFBTU2NyaXB0QW5hbHl6ZXIgYWdhaW5zdCBjb21tYW5kYmFzZScgew0KCSRjb21tYW5kRmlsZXMgPSBmb3JlYWNoICgkcGF0aCBpbiAkQ29tbWFuZFBhdGgpIHsNCiAgICAgICAgR2V0LUNoaWxkSXRlbSAtUGF0aCAkcGF0aCAtUmVjdXJzZSB8IFdoZXJlLU9iamVjdCBOYW1lIC1saWtlICIqLnBzMSINCiAgICB9DQoJJHNjcmlwdEFuYWx5emVyUnVsZXMgPSBHZXQtU2NyaXB0QW5hbHl6ZXJSdWxlDQoJDQoJZm9yZWFjaCAoJGZpbGUgaW4gJGNvbW1hbmRGaWxlcykNCgl7DQoJCUNvbnRleHQgIkFuYWx5emluZyAkKCRmaWxlLkJhc2VOYW1lKSIgew0KCQkJJGFuYWx5c2lzID0gSW52b2tlLVNjcmlwdEFuYWx5emVyIC1QYXRoICRmaWxlLkZ1bGxOYW1lIC1FeGNsdWRlUnVsZSBQU0F2b2lkVHJhaWxpbmdXaGl0ZXNwYWNlLCBQU1Nob3VsZFByb2Nlc3MNCgkJCQ0KCQkJZm9yRWFjaCAoJHJ1bGUgaW4gJHNjcmlwdEFuYWx5emVyUnVsZXMpDQoJCQl7DQoJCQkJSXQgIlNob3VsZCBwYXNzICRydWxlIiAtVGVzdENhc2VzIEB7IGFuYWx5c2lzID0gJGFuYWx5c2lzOyBydWxlID0gJHJ1bGUgfSB7DQoJCQkJCUlmICgkYW5hbHlzaXMuUnVsZU5hbWUgLWNvbnRhaW5zICRydWxlKQ0KCQkJCQl7DQoJCQkJCQkkYW5hbHlzaXMgfCBXaGVyZS1PYmplY3QgUnVsZU5hbWUgLUVRICRydWxlIC1vdXR2YXJpYWJsZSBmYWlsdXJlcyB8IEZvckVhY2gtT2JqZWN0IHsgJG51bGwgPSAkZ2xvYmFsOl9fcGVzdGVyX2RhdGEuU2NyaXB0QW5hbHl6ZXIuQWRkKCRfKSB9DQoJCQkJCQkNCgkJCQkJCTEgfCBTaG91bGQgLUJlIDANCgkJCQkJfQ0KCQkJCQllbHNlDQoJCQkJCXsNCgkJCQkJCTAgfCBTaG91bGQgLUJlIDANCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCX0NCn0BCecDAAAJ6AMAAAbpAwAAGlBTU2NyaXB0QW5hbHl6ZXIuVGVzdHMucHMxBuoDAAAxw75uYW1lw75cdGVzdHNcZ2VuZXJhbFxQU1NjcmlwdEFuYWx5emVyLlRlc3RzLnBzMQlaAAAACewDAAAJ7QMAAAEyAwAAPAAAAAbuAwAA5gckZXhjZXB0aW9ucyA9IEB7IH0NCg0KPCMNCkEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgTUFZIGJlIGluIHRoZSBsYW5ndWFnZSBmaWxlcywgd2l0aG91dCBjYXVzaW5nIHRoZSB0ZXN0cyB0byBmYWlsLg0KVGhpcyBpcyBjb21tb25seSB1c2VkIGluIG1vZHVsZXMgdGhhdCBnZW5lcmF0ZSBsb2NhbGl6ZWQgbWVzc2FnZXMgc3RyYWlnaHQgZnJvbSBDIy4NClNwZWNpZnkgdGhlIGZ1bGwga2V5IGFzIGl0IGlzIHdyaXR0ZW4gaW4gdGhlIGxhbmd1YWdlIGZpbGVzLCBkbyBub3QgcHJlcGVuZCB0aGUgbW9kdWxlbmFtZSwNCmFzIHlvdSB3b3VsZCBoYXZlIHRvIGluIEMjIGNvZGUuDQoNCkV4YW1wbGU6DQokZXhjZXB0aW9uc1snTGVnYWxTdXJwbHVzJ10gPSBAKA0KICAgICdFeGNlcHRpb24uU3RyZWFtcy5GYWlsZWRDcmVhdGUnDQogICAgJ0V4Y2VwdGlvbi5TdHJlYW1zLkZhaWxlZERpc3Bvc2UnDQopDQojPg0KJGV4Y2VwdGlvbnNbJ0xlZ2FsU3VycGx1cyddID0gQCgNCg0KKQ0KPCMNCkEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgTUFZIGJlIHVzZWQgd2l0aG91dCBuZWVkaW5nIHRvIGhhdmUgdGV4dCBkZWZpbmVkLg0KVGhpcyBpcyBpbnRlbmRlZCBmb3IgbW9kdWxlcyAocmUtKXVzaW5nIHN0cmluZ3MgcHJvdmlkZWQgYnkgYW5vdGhlciBtb2R1bGUNCiM+DQokZXhjZXB0aW9uc1snTm9UZXh0TmVlZGVkJ10gPSBAKA0KCSdWYWxpZGF0ZS5GU1BhdGgnDQoJJ1ZhbGlkYXRlLkZTUGF0aC5GaWxlJw0KCSdWYWxpZGF0ZS5GU1BhdGguRmlsZU9yUGFyZW50Jw0KCSdWYWxpZGF0ZS5GU1BhdGguRm9sZGVyJw0KCSdWYWxpZGF0ZS5QYXRoJw0KCSdWYWxpZGF0ZS5QYXRoLkNvbnRhaW5lcicNCgknVmFsaWRhdGUuUGF0aC5MZWFmJw0KCSdWYWxpZGF0ZS5UaW1lU3Bhbi5Qb3NpdGl2ZScNCgknVmFsaWRhdGUuVXJpLkFic29sdXRlJw0KCSdWYWxpZGF0ZS5VcmkuQWJzb2x1dGUuRmlsZScNCgknVmFsaWRhdGUuVXJpLkFic29sdXRlLkh0dHBzJw0KKQ0KDQokZXhjZXB0aW9ucwEJ7wMAAAnwAwAABvEDAAAWc3RyaW5ncy5FeGNlcHRpb25zLnBzMQbyAwAALcO+bmFtZcO+XHRlc3RzXGdlbmVyYWxcc3RyaW5ncy5FeGNlcHRpb25zLnBzMQlaAAAACfQDAAAJ9QMAAAEzAwAAPAAAAAb2AwAAlwg8Iw0KLkRFU0NSSVBUSU9ODQogICAgVGhpcyB0ZXN0IHZlcmlmaWVzLCB0aGF0IGFsbCBzdHJpbmdzIHRoYXQgaGF2ZSBiZWVuIHVzZWQsDQogICAgYXJlIGxpc3RlZCBpbiB0aGUgbGFuZ3VhZ2UgZmlsZXMgYW5kIHRodXMgaGF2ZSBhIG1lc3NhZ2UgYmVpbmcgZGlzcGxheWVkLg0KDQogICAgSXQgYWxzbyBjaGVja3MsIHdoZXRoZXIgdGhlIGxhbmd1YWdlIGZpbGVzIGhhdmUgb3JwaGFuZWQgZW50cmllcyB0aGF0IG5lZWQgY2xlYW5pbmcgdXAuDQojPg0KDQoNCg0KRGVzY3JpYmUgIlRlc3RpbmcgbG9jYWxpemF0aW9uIHN0cmluZ3MiIHsNCgkkbW9kdWxlUm9vdCA9IChHZXQtTW9kdWxlIMO+bmFtZcO+KS5Nb2R1bGVCYXNlDQoJJHN0cmluZ3NSZXN1bHRzID0gRXhwb3J0LVBTTURTdHJpbmcgLU1vZHVsZVJvb3QgJG1vZHVsZVJvb3QNCgkkZXhjZXB0aW9ucyA9ICYgIiRnbG9iYWw6dGVzdHJvb3RcZ2VuZXJhbFxzdHJpbmdzLkV4Y2VwdGlvbnMucHMxIg0KCQ0KCWZvcmVhY2ggKCRzdHJpbmdFbnRyeSBpbiAkc3RyaW5nc1Jlc3VsdHMpIHsNCiAgICAgICAgaWYgKCRzdHJpbmdFbnRyeS5TdHJpbmcgLWVxICJrZXkiKSB7IGNvbnRpbnVlIH0gIyBTa2lwcGluZyB0aGUgdGVtcGxhdGUgZGVmYXVsdCBlbnRyeQ0KCQlJdCAiU2hvdWxkIGJlIHVzZWQgJiBoYXZlIHRleHQ6ICQoJHN0cmluZ0VudHJ5LlN0cmluZykiIC1UZXN0Q2FzZXMgQHsgc3RyaW5nRW50cnkgPSAkc3RyaW5nRW50cnk7IGV4Y2VwdGlvbnMgPSAkZXhjZXB0aW9ucyB9IHsNCiAgICAgICAgICAgIGlmICgkZXhjZXB0aW9ucy5MZWdhbFN1cnBsdXMgLW5vdGNvbnRhaW5zICRzdHJpbmdFbnRyeS5TdHJpbmcpIHsNCiAgICAgICAgICAgICAgICAkc3RyaW5nRW50cnkuU3VycGx1cyB8IFNob3VsZCAtQmVGYWxzZQ0KCQkJfQ0KCQkJaWYgKCRleGNlcHRpb25zLk5vVGV4dE5lZWRlZCAtbm90Y29udGFpbnMgJHN0cmluZ0VudHJ5LlN0cmluZykgew0KCQkJCSRzdHJpbmdFbnRyeS5UZXh0IHwgU2hvdWxkIC1Ob3QgLUJlTnVsbE9yRW1wdHkNCgkJCX0NCiAgICAgICAgfQ0KICAgIH0NCn0BCfcDAAAJ+AMAAAb5AwAAEXN0cmluZ3MuVGVzdHMucHMxBvoDAAAow75uYW1lw75cdGVzdHNcZ2VuZXJhbFxzdHJpbmdzLlRlc3RzLnBzMQlaAAAACfwDAAAJ/QMAAAE7AwAACAAAAAn+AwAAAQAAAAEAAAABPAMAAAgAAAAJsAAAAAAAAAAAAAAAAUADAAAIAAAACQAEAAABAAAAAQAAAAFBAwAACAAAAAmwAAAAAAAAAAAAAAABQgMAAAwAAAAJAgQAAAEAAAABAAAAAUYDAAAIAAAACbAAAAAAAAAAAAAAAAFHAwAACAAAAAmwAAAAAAAAAAAAAAABSAMAAAwAAAAJBAQAAAEAAAABAAAAAUwDAAAIAAAACbAAAAAAAAAAAAAAAAFNAwAACAAAAAmwAAAAAAAAAAAAAAABTwMAAAgAAAAJBgQAAAEAAAABAAAAAVADAAAIAAAACbAAAAAAAAAAAAAAAAFUAwAACAAAAAmwAAAAAAAAAAAAAAABVQMAAAgAAAAJsAAAAAAAAAAAAAAAAVcDAAAIAAAACQgEAAABAAAAAQAAAAFYAwAACAAAAAmwAAAAAAAAAAAAAAABXAMAAAgAAAAJCgQAAAEAAAABAAAAAV0DAAAIAAAACbAAAAAAAAAAAAAAAAFfAwAACAAAAAkMBAAAAQAAAAEAAAABYAMAAAgAAAAJsAAAAAAAAAAAAAAAAWQDAAAIAAAACbAAAAAAAAAAAAAAAAFlAwAACAAAAAmwAAAAAAAAAAAAAAABZwMAAAgAAAAJsAAAAAAAAAAAAAAAAWgDAAAIAAAACbAAAAAAAAAAAAAAAAFsAwAACAAAAAmwAAAAAAAAAAAAAAABbQMAAAgAAAAJsAAAAAAAAAAAAAAAAW8DAAAIAAAACbAAAAAAAAAAAAAAAAFwAwAACAAAAAmwAAAAAAAAAAAAAAABdAMAAAgAAAAJsAAAAAAAAAAAAAAAAXUDAAAIAAAACbAAAAAAAAAAAAAAAAF3AwAACAAAAAkOBAAAAQAAAAEAAAABeAMAAAgAAAAJsAAAAAAAAAAAAAAAAXwDAAAIAAAACbAAAAAAAAAAAAAAAAF9AwAACAAAAAmwAAAAAAAAAAAAAAABfwMAAAgAAAAJEAQAAAIAAAACAAAAAYADAAAIAAAACREEAAACAAAAAgAAAAGEAwAACAAAAAmwAAAAAAAAAAAAAAABhQMAAAgAAAAJsAAAAAAAAAAAAAAAAYcDAAAIAAAACbAAAAAAAAAAAAAAAAGIAwAACAAAAAmwAAAAAAAAAAAAAAABjAMAAAgAAAAJsAAAAAAAAAAAAAAAAY0DAAAIAAAACbAAAAAAAAAAAAAAAAGPAwAACAAAAAmwAAAAAAAAAAAAAAABkAMAAAgAAAAJsAAAAAAAAAAAAAAAAZQDAAAIAAAACbAAAAAAAAAAAAAAAAGVAwAACAAAAAmwAAAAAAAAAAAAAAABlwMAAAgAAAAJEwQAAAEAAAABAAAAAZgDAAAIAAAACbAAAAAAAAAAAAAAAAGcAwAACAAAAAmwAAAAAAAAAAAAAAABnQMAAAgAAAAJsAAAAAAAAAAAAAAAAZ8DAAAIAAAACRUEAAABAAAAAQAAAAGgAwAACAAAAAmwAAAAAAAAAAAAAAABpAMAAAgAAAAJsAAAAAAAAAAAAAAAAaUDAAAIAAAACbAAAAAAAAAAAAAAAAGnAwAACAAAAAkXBAAAAQAAAAEAAAABqAMAAAgAAAAJsAAAAAAAAAAAAAAAAawDAAAIAAAACbAAAAAAAAAAAAAAAAGtAwAACAAAAAmwAAAAAAAAAAAAAAABrwMAAAgAAAAJsAAAAAAAAAAAAAAAAbADAAAIAAAACbAAAAAAAAAAAAAAAAG0AwAACAAAAAmwAAAAAAAAAAAAAAABtQMAAAgAAAAJsAAAAAAAAAAAAAAAAbcDAAAIAAAACbAAAAAAAAAAAAAAAAG4AwAACAAAAAmwAAAAAAAAAAAAAAABvAMAAAgAAAAJsAAAAAAAAAAAAAAAAb0DAAAIAAAACbAAAAAAAAAAAAAAAAG/AwAACAAAAAmwAAAAAAAAAAAAAAABwAMAAAgAAAAJsAAAAAAAAAAAAAAAAcQDAAAIAAAACbAAAAAAAAAAAAAAAAHFAwAACAAAAAmwAAAAAAAAAAAAAAABxwMAAAgAAAAJsAAAAAAAAAAAAAAAAcgDAAAIAAAACbAAAAAAAAAAAAAAAAHMAwAACAAAAAmwAAAAAAAAAAAAAAABzQMAAAgAAAAJsAAAAAAAAAAAAAAAAc8DAAAIAAAACbAAAAAAAAAAAAAAAAHQAwAACAAAAAmwAAAAAAAAAAAAAAAB1AMAAAgAAAAJsAAAAAAAAAAAAAAAAdUDAAAIAAAACbAAAAAAAAAAAAAAAAHXAwAACAAAAAkZBAAAAQAAAAEAAAAB2AMAAAgAAAAJsAAAAAAAAAAAAAAAAdwDAAAIAAAACbAAAAAAAAAAAAAAAAHdAwAACAAAAAmwAAAAAAAAAAAAAAAB3wMAAAgAAAAJGwQAAAEAAAABAAAAAeADAAAIAAAACbAAAAAAAAAAAAAAAAHkAwAACAAAAAmwAAAAAAAAAAAAAAAB5QMAAAgAAAAJsAAAAAAAAAAAAAAAAecDAAAIAAAACbAAAAAAAAAAAAAAAAHoAwAACAAAAAmwAAAAAAAAAAAAAAAB7AMAAAgAAAAJsAAAAAAAAAAAAAAAAe0DAAAIAAAACbAAAAAAAAAAAAAAAAHvAwAACAAAAAmwAAAAAAAAAAAAAAAB8AMAAAgAAAAJsAAAAAAAAAAAAAAAAfQDAAAIAAAACbAAAAAAAAAAAAAAAAH1AwAACAAAAAmwAAAAAAAAAAAAAAAB9wMAAAgAAAAJHQQAAAEAAAABAAAAAfgDAAAIAAAACbAAAAAAAAAAAAAAAAH8AwAACAAAAAmwAAAAAAAAAAAAAAAB/QMAAAgAAAAJsAAAAAAAAAAAAAAAEf4DAAAEAAAABh8EAAAEbmFtZQ0DEQAEAAAEAAAABiAEAAAEbmFtZQ0DBwIEAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJIQQAAA0DBwQEAAAAAQAAAAQAAAAELVBTTW9kdWxlRGV2ZWxvcG1lbnQuVGVtcGxhdGUuVGVtcGxhdGVJdGVtQmFzZQIAAAAJIgQAAA0DEQYEAAAEAAAABiMEAAAEbmFtZQ0DEQgEAAAEAAAABiQEAAAEbmFtZQ0DEQoEAAAEAAAABiUEAAAEbmFtZQ0DEQwEAAAEAAAABiYEAAAEbmFtZQ0DEQ4EAAAEAAAABicEAAAEbmFtZQ0DERAEAAAEAAAABigEAAAEbmFtZQYpBAAABmF1dGhvcg0CEREEAAAEAAAABioEAAAEZGF0ZQYrBAAABHllYXINAhETBAAABAAAAAYsBAAABG5hbWUNAxEVBAAABAAAAAYtBAAABG5hbWUNAxEXBAAABAAAAAYuBAAABG5hbWUNAxEZBAAABAAAAAYvBAAABG5hbWUNAxEbBAAABAAAAAYwBAAABG5hbWUNAxEdBAAABAAAAAYxBAAABG5hbWUNAwEhBAAAPAAAAAYyBAAAtwVTZXQtUFNGQ29uZmlnIC1Nb2R1bGUgJ8O+bmFtZcO+JyAtTmFtZSAnQ2xpZW50LlVyaScgLVZhbHVlICRudWxsIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICdzdHJpbmcnIC1EZXNjcmlwdGlvbiAiVXJsIHRvIGNvbm5lY3QgdG8gdGhlIMO+bmFtZcO+IEF6dXJlIGZ1bmN0aW9uIg0KU2V0LVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5VbnByb3RlY3RlZFRva2VuJyAtVmFsdWUgJycgLUluaXRpYWxpemUgLVZhbGlkYXRpb24gJ3N0cmluZycgLURlc2NyaXB0aW9uICJUaGUgdW5lbmNyeXB0ZWQgYWNjZXNzIHRva2VuIHRvIHRoZSDDvm5hbWXDviBBenVyZSBmdW5jdGlvbi4gT05MWSB1c2UgdGhpcyBmcm9tIHNlY3VyZSBsb2NhdGlvbnMgb3Igbm9uLXNlbnNpdGl2ZSBmdW5jdGlvbnMhIg0KU2V0LVBTRkNvbmZpZyAtTW9kdWxlICfDvm5hbWXDvicgLU5hbWUgJ0NsaWVudC5Qcm90ZWN0ZWRUb2tlbicgLVZhbHVlICRudWxsIC1Jbml0aWFsaXplIC1WYWxpZGF0aW9uICdjcmVkZW50aWFsJyAtRGVzY3JpcHRpb24gIkFuIGVuY3J5cHRlZCBhY2Nlc3MgdG9rZW4gdG8gdGhlIMO+bmFtZcO+IEF6dXJlIGZ1bmN0aW9uLiBVc2UgdGhpcyB0byBwZXJzaXN0IGFuIGFjY2VzcyB0b2tlbiBpbiBhIHdheSBvbmx5IHRoZSBjdXJyZW50IHVzZXIgb24gdGhlIGN1cnJlbnQgc3lzdGVtIGNhbiBhY2Nlc3MuIgEJMwQAAAk0BAAABjUEAAAOY29ubmVjdGlvbi5wczEGNgQAAEdhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxpbnRlcm5hbFxjb25maWd1cmF0aW9uc1xjb25uZWN0aW9uLnBzMQlaAAAACTgEAAAJOQQAAAEiBAAAPAAAAAY6BAAAiQ5mdW5jdGlvbiBHZXQtSW50ZXJuYWxDb25uZWN0aW9uRGF0YQ0Kew0KPCMNCgkuU1lOT1BTSVMNCgkJQ3JlYXRlcyBwYXJhbWV0ZXIgaGFzaHRhYmxlcyBmb3IgSW52b2tlLVJlc3RNZXRob2QgY2FsbHMuDQoJDQoJLkRFU0NSSVBUSU9ODQoJCUNyZWF0ZXMgcGFyYW1ldGVyIGhhc2h0YWJsZXMgZm9yIEludm9rZS1SZXN0TWV0aG9kIGNhbGxzLg0KCQlUaGlzIGlzIHRoZSBtYWluIGFic3RyYWN0aW9uIGxheWVyIGZvciBwdWJsaWMgZnVuY3Rpb25zLg0KCQ0KCS5QQVJBTUVURVIgTWV0aG9kDQoJCVRoZSBSZXN0IE1ldGhvZCB0byB1c2Ugd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uDQoJDQoJLlBBUkFNRVRFUiBQYXJhbWV0ZXJzDQoJCVRoZSBQU0JvdW5kUGFyYW1ldGVycyBvYmplY3QuIFdpbGwgYmUgcGFzc2VkIG9ubGluZSB1c2luZyBQb3dlclNoZWxsIFNlcmlhbGl6YXRpb24uDQoJDQoJLlBBUkFNRVRFUiBGdW5jdGlvbk5hbWUNCgkJVGhlIG5hbWUgb2YgdGhlIEF6dXJlIEZ1bmN0aW9uIHRvIGNhbGwuDQoJCVRoaXMgc2hvdWxkIGFsd2F5cyBiZSB0aGUgY29uZGVuc2VkIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLg0KIz4NCglbQ21kbGV0QmluZGluZygpXQ0KCXBhcmFtICgNCgkJW3N0cmluZ10NCgkJJE1ldGhvZCwNCgkJDQoJCSRQYXJhbWV0ZXJzLA0KCQkNCgkJW3N0cmluZ10NCgkJJEZ1bmN0aW9uTmFtZQ0KCSkNCgkNCglwcm9jZXNzDQoJew0KCQl0cnkgeyAkdXJpID0gJ3swfXsxfScgLWYgKEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgJ8O+bmFtZcO+LkNsaWVudC5VcmknIC1Ob3ROdWxsKSwgJEZ1bmN0aW9uTmFtZSB9DQoJCWNhdGNoIHsgJFBTQ21kbGV0LlRocm93VGVybWluYXRpbmdFcnJvcigkXykgfQ0KCQkkaGVhZGVyID0gQHsgfQ0KCQkNCgkJI3JlZ2lvbiBBdXRoZW50aWNhdGlvbg0KCQkkdW5wcm90ZWN0ZWRUb2tlbiA9IEdldC1QU0ZDb25maWdWYWx1ZSAtRnVsbE5hbWUgJ8O+bmFtZcO+LkNsaWVudC5VbnByb3RlY3RlZFRva2VuJw0KCQkkcHJvdGVjdGVkVG9rZW4gPSBHZXQtUFNGQ29uZmlnVmFsdWUgLUZ1bGxOYW1lICfDvm5hbWXDvi5DbGllbnQuUHJvdGVjdGVkVG9rZW4nDQoJCQ0KCQkkYXV0aGVudGljYXRpb25Eb25lID0gJGZhbHNlDQoJCWlmICgkcHJvdGVjdGVkVG9rZW4gLWFuZCAtbm90ICRhdXRoZW50aWNhdGlvbkRvbmUpDQoJCXsNCgkJCSR1cmkgKz0gJz9jb2RlPXswfScgLWYgJHByb3RlY3RlZFRva2VuLkdldE5ldHdvcmtDcmVkZW50aWFsKCkuUGFzc3dvcmQNCgkJCSRhdXRoZW50aWNhdGlvbkRvbmUgPSAkdHJ1ZQ0KCQl9DQoJCWlmICgkdW5wcm90ZWN0ZWRUb2tlbiAtYW5kIC1ub3QgJGF1dGhlbnRpY2F0aW9uRG9uZSkNCgkJew0KCQkJJHVyaSArPSAnP2NvZGU9ezB9JyAtZiAkdW5wcm90ZWN0ZWRUb2tlbg0KCQkJJGF1dGhlbnRpY2F0aW9uRG9uZSA9ICR0cnVlDQoJCX0NCgkJaWYgKC1ub3QgJGF1dGhlbnRpY2F0aW9uRG9uZSkNCgkJew0KCQkJdGhyb3cgIk5vIEF1dGhlbnRpY2F0aW9uIGNvbmZpZ3VyZWQhIg0KCQl9DQoJCSNlbmRyZWdpb24gQXV0aGVudGljYXRpb24NCgkJDQoJCQ0KCQlAew0KCQkJTWV0aG9kICA9ICRNZXRob2QNCgkJCVVyaQkgICAgPSAkdXJpDQoJCQlIZWFkZXJzID0gJGhlYWRlcg0KCQkJQm9keSAgICA9IChAew0KCQkJCV9fU2VyaWFsaXplZFBhcmFtZXRlcnMgPSAoJFBhcmFtZXRlcnMgfCBDb252ZXJ0VG8tUFNGSGFzaHRhYmxlIHwgQ29udmVydFRvLVBTRkNsaXhtbCkNCgkJCQlfX1BTU2VyaWFsaXplCQkgICA9ICR0cnVlDQoJCQl9IHwgQ29udmVydFRvLUpzb24pDQoJCX0NCgl9DQp9AQk7BAAACTwEAAAGPQQAAB5HZXQtSW50ZXJuYWxDb25uZWN0aW9uRGF0YS5wczEGPgQAAFJhekZ1bmN0aW9uUmVzb3VyY2VzXGNsaWVudE1vZHVsZVxpbnRlcm5hbFxmdW5jdGlvbnNcR2V0LUludGVybmFsQ29ubmVjdGlvbkRhdGEucHMxCVoAAAAJQAQAAAlBBAAAATMEAAAIAAAACUIEAAABAAAAAQAAAAE0BAAACAAAAAmwAAAAAAAAAAAAAAABOAQAAAgAAAAJsAAAAAAAAAAAAAAAATkEAAAIAAAACbAAAAAAAAAAAAAAAAE7BAAACAAAAAlEBAAAAQAAAAEAAAABPAQAAAgAAAAJsAAAAAAAAAAAAAAAAUAEAAAIAAAACbAAAAAAAAAAAAAAAAFBBAAACAAAAAmwAAAAAAAAAAAAAAARQgQAAAQAAAAGRgQAAARuYW1lDQMRRAQAAAQAAAAGRwQAAARuYW1lDQML</BA> </MS> </Obj> </Objs> |