CiAgIFsgWzFdQ29udGVudHMgXSBbIFsyXUMtS2VybWl0IF0gWyBbM11LZXJtaXQgSG9tZSBdCgogICAgICAgICAgICAgICAgIFN1cHBsZW1lbnQgdG8gVXNpbmcgQy1LZXJtaXQsIFNlY29uZCBFZGl0aW9uCgpGb3IgQy1LZXJtaXQgNy4wCgpBcyBvZiBDLUtlcm1pdCB2ZXJzaW9uOiAgNy4wLjE5NgpUaGlzIGZpbGUgbGFzdCB1cGRhdGVkOiAgOCBGZWJydWFyeSAyMDAwCgpBdXRob3JzOiBGcmFuayBkYSBDcnV6IGFuZCBDaHJpc3RpbmUgTS4gR2lhbm9uZQpBZGRyZXNzOiBUaGUgS2VybWl0IFByb2plY3QKICAgICAgICAgQ29sdW1iaWEgVW5pdmVyc2l0eQogICAgICAgICA2MTIgV2VzdCAxMTV0aCBTdHJlZXQKICAgICAgICAgTmV3IFlvcmsgTlkgMTAwMjUtNzc5OQogICAgICAgICBVU0EKRmF4OiAgICAgKzEgKDIxMikgNjYyLTY0NDIKRS1NYWlsOiAgWzRda2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1CldlYjogICAgIFs1XWh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC8KT3I6ICAgICAgWzZdaHR0cDovL3d3dy5rZXJtaXQtcHJvamVjdC5vcmcvCk9yOiAgICAgIFs3XWh0dHA6Ly93d3cuY29sdW1iaWEubnljLm55LnVzL2tlcm1pdC8KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICBOT1RJQ0VTCgogICBUaGlzIGRvY3VtZW50OgogICAgICAgICAgQ29weXJpZ2h0IKkgMTk5NywgMjAwMCwgRnJhbmsgZGEgQ3J1eiBhbmQgQ2hyaXN0aW5lIE0uIEdpYW5vbmUuCiAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgoKICAgS2VybWl0IDk1OgogICAgICAgICAgQ29weXJpZ2h0IKkgMTk5NSwgMjAwMCwgVHJ1c3RlZXMgb2YgQ29sdW1iaWEgVW5pdmVyc2l0eSBpbiB0aGUKICAgICAgICAgIENpdHkgb2YgTmV3IFlvcmsuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICBDLUtlcm1pdDoKICAgICAgICAgIENvcHlyaWdodCCpIDE5ODUsIDIwMDAsCiAgICAgICAgICBUcnVzdGVlcyBvZiBDb2x1bWJpYSBVbml2ZXJzaXR5IGluIHRoZSBDaXR5IG9mIE5ldyBZb3JrLiBBbGwKICAgICAgICAgIHJpZ2h0cyByZXNlcnZlZC4gU2VlIHRoZSBDLUtlcm1pdCBbOF1DT1BZSU5HLlRYVCBmaWxlIG9yIHRoZQogICAgICAgICAgY29weXJpZ2h0IHRleHQgaW4gdGhlIFs5XWNrY21haS5jIG1vZHVsZSBmb3IgZGlzY2xhaW1lciBhbmQKICAgICAgICAgIHBlcm1pc3Npb25zLgoKICAgV2hlbiBLZXJiZXJvcyhUTSkgYW5kL29yIFNSUChUTSkgKFNlY3VyZSBSZW1vdGUgUGFzc3dvcmQpIGFuZC9vciBTU0wKICAgICAgICAgIHByb3RvY29sIGFyZSBpbmNsdWRlZDoKICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTAsIE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCiAgICAgICAgICBUZWNobm9sb2d5LgogICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5MSwgMTk5MyBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mCiAgICAgICAgICBDYWxpZm9ybmlhLgogICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBieSBBVCZULgogICAgICAgICAgUG9ydGlvbnMgQ29weXJpZ2h0IKkgMTk5NywgU3RhbmZvcmQgVW5pdmVyc2l0eS4KICAgICAgICAgIFBvcnRpb25zIENvcHlyaWdodCCpIDE5OTUtMTk5NywgRXJpYyBZb3VuZwogICAgICAgICAgPGVheUBjcnlwdG9zb2Z0LmNvbT4uCgogICBGb3IgdGhlIGZ1bGwgdGV4dCBvZiB0aGUgdGhpcmQtcGFydHkgY29weXJpZ2h0IG5vdGljZXMsIHNlZQogICBbMTBdQXBwZW5kaXggVi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICBXSEFUIElTIElOIFRISVMgRklMRQoKICAgVGhpcyBmaWxlIGxpc3RzIGNoYW5nZXMgbWFkZSB0byBDLUtlcm1pdCBzaW5jZSB0aGUgc2Vjb25kIGVkaXRpb24gb2YKICAgdGhlIGJvb2sgWzExXVVzaW5nIEMtS2VybWl0IHdhcyBwdWJsaXNoZWQgYW5kIEMtS2VybWl0IDYuMCB3YXMKICAgcmVsZWFzZWQgaW4gTm92ZW1iZXIgMTk5Ni4gVXNlIHRoaXMgZmlsZSBhcyBhIHN1cHBsZW1lbnQgdG8gdGhlIHNlY29uZAogICBlZGl0aW9uIG9mIFVzaW5nIEMtS2VybWl0IHVudGlsIHRoZSB0aGlyZCBlZGl0aW9uIGlzIHB1Ymxpc2hlZCBzb21lCiAgIHRpbWUgaW4gMjAwMC4gSWYgdGhlICJtb3N0IHJlY2VudCB1cGRhdGUiIHNob3duIGFib3ZlIGlzIGxvbmcgYWdvLAogICBjb250YWN0IENvbHVtYmlhIFVuaXZlcnNpdHkgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbmV3ZXIgcmVsZWFzZS4KCiAgIEZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLCBhbHNvIHNlZSB0aGUgWzEyXUNLQ0JXUi5UWFQgKCJDLUtlcm1pdAogICBiZXdhcmUiKSBmaWxlIGZvciBoaW50cywgdGlwcywgdHJpY2tzLCByZXN0cmljdGlvbnMsIGZyZXF1ZW50bHkgYXNrZWQKICAgcXVlc3Rpb25zLCBldGMsIHBsdXMgdGhlIHN5c3RlbS1zcGVjaWZpYyAiYmV3YXJlIGZpbGUiLCBlLmcuCiAgIFsxM11DS1VCV1IuVFhUIGZvciBVTklYLCBbMTRdQ0tWQldSLlRYVCBmb3IgVk1TLCBldGMsIGFuZCBhbHNvIGFueQogICBzeXN0ZW0tc3BlY2lmaWMgdXBkYXRlIGZpbGVzIHN1Y2ggYXMgS0VSTUlUOTUuSFRNIGZvciBLZXJtaXQgOTUgKGluCiAgIHRoZSBET0NTXE1BTlVBTFwgc3ViZGlyZWN0b3J5IG9mIHlvdXIgSzk1IGRpcmVjdG9yeSkuCgogICAgIFRoaXMgV2ViLWJhc2VkIGNvcHkgb2YgdGhlIEMtS2VybWl0IDcuMCB1cGRhdGUgbm90ZXMgc3VwZXJzZWRlcyB0aGUKICAgICBwbGFpbi10ZXh0IENLRVJNSVQyLlRYVCBmaWxlLiBBbGwgY2hhbmdlcyBhZnRlciAxOSBKYW51YXJ5IDIwMDAKICAgICBhcHBlYXIgb25seSBoZXJlIGluIHRoZSBXZWIgdmVyc2lvbi4gSWYgeW91IG5lZWQgYW4gdXAtdG8tZGF0ZQogICAgIHBsYWluLXRleHQgY29weSwgdXNlIHlvdXIgV2ViIGJyb3dzZXIgdG8gc2F2ZSB0aGlzIHBhZ2UgYXMgcGxhaW4KICAgICB0ZXh0LiAKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICBBQk9VVCBGSUxFTkFNRVMKCiAgIEluIHRoaXMgZG9jdW1lbnQsIGZpbGVuYW1lcyBhcmUgZ2VuZXJhbGx5IHNob3duIGluIHVwcGVyY2FzZSwgYnV0IG9uCiAgIGZpbGUgc3lzdGVtcyB3aXRoIGNhc2Utc2Vuc2l0aXZlIG5hbWVzIHN1Y2ggYXMgVU5JWCwgT1MtOSwgYW5kIEFPUy9WUywKICAgbG93ZXJjYXNlIG5hbWVzIGFyZSB1c2VkOiBbMTVdY2t1YndyLnR4dCwgWzE2XWNrZXJtaXQ3MC50eHQsIGV0Yy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICBBRERJVElPTkFMIEZJTEVTCgogICBTZXZlcmFsIG90aGVyIGZpbGVzIGFjY29tcGFueSB0aGlzIG5ldyBLZXJtaXQgcmVsZWFzZToKCiAgIFNFQ1VSSVRZLlRYVAogICAgICAgICAgRGlzY3Vzc2lvbiBvZiBLZXJtaXQncyBuZXcgYXV0aGVudGljYXRpb24gYW5kIGVuY3J5cHRpb24KICAgICAgICAgIGZlYXR1cmVzOgoKICAgICAgICAgICsgWzE3XVBsYWluLXRleHQgdmVyc2lvbgogICAgICAgICAgKyBbMThdSFRNTCAoaHlwZXJ0ZXh0KSB2ZXJzaW9uCgogICBJS1NELlRYVAogICAgICAgICAgSG93IHRvIGluc3RhbGwgYW5kIG1hbmFnZSBhbiBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBEYWVtb24uCgogICAgICAgICAgKyBbMTldUGxhaW4tdGV4dCB2ZXJzaW9uCiAgICAgICAgICArIFsyMF1IVE1MIChoeXBlcnRleHQpIHZlcnNpb24KCiAgICAgICAgICBBbHNvIHNlZSBbMjFdY3Vpa3NkLmh0bSBmb3IgaW5zdHJ1Y3Rpb25zIGZvciB1c2UuCgogICBURUxORVQuVFhUCiAgICAgICAgICBBIHRob3JvdWdoIHByZXNlbnRhdGlvbiBvZiBLZXJtaXQncyBuZXcgYWR2YW5jZWQgVGVsbmV0CiAgICAgICAgICBmZWF0dXJlcyBhbmQgY29udHJvbHMuCgogICAgICAgICAgKyBbMjJdUGxhaW4tdGV4dCB2ZXJzaW9uCiAgICAgICAgICArIFsyM11IVE1MIChoeXBlcnRleHQpIHZlcnNpb24KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICBUSEUgTkVXIEMtS0VSTUlUIExJQ0VOU0UKCiAgIFRoZSBDLUtlcm1pdCBsaWNlbnNlIHdhcyByZXdyaXR0ZW4gZm9yIHZlcnNpb24gNy4wIHRvIGdyYW50IGF1dG9tYXRpYwogICBwZXJtaXNzaW9uIHRvIHBhY2thZ2VycyBvZiBmcmVlIG9wZXJhdGluZy1zeXN0ZW0gZGlzdHJpYnV0aW9ucyB0bwogICBpbmNsdWRlIEMtS2VybWl0IDcuMC4gRXhhbXBsZXMgaW5jbHVkZSBMaW51eCAoR05VL0xpbnV4KSwgRnJlZUJTRCwKICAgTmV0QlNELCBldGMuIFRoZSBuZXcgbGljZW5zZSBpcyBpbiB0aGUgWzI0XUNPUFlJTkcuVFhUIGZpbGUsIGFuZCBpcwogICBhbHNvIGRpc3BsYXllZCBieSBDLUtlcm1pdCBpdHNlbGYgd2hlbiB5b3UgZ2l2ZSB0aGUgVkVSU0lPTiBvcgogICBDT1BZUklHSFQgY29tbWFuZC4gVGhlIG5ldyBDLUtlcm1pdCBsaWNlbnNlIGRvZXMgbm90IGFwcGx5IHRvCiAgIFsyNV1LZXJtaXQgOTUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgQUNLTk9XTEVER01FTlRTCgogICBUaGFua3MgdG8gSmVmZiBBbHRtYW4sIHdobyBqb2luZWQgdGhlIEtlcm1pdCBQcm9qZWN0IGluIDE5OTUsIGZvciBtdWNoCiAgIG9mIHdoYXQgeW91IHNlZSBpbiBDLUtlcm1pdCA3LjAsIGVzcGVjaWFsbHkgaW4gdGhlIG5ldHdvcmtpbmcgYW5kCiAgIHNlY3VyaXR5IGFyZWFzLCBhbmQgaGlzIGtleSByb2xlIGluIGRlc2lnbmluZyBhbmQgaW1wbGVtZW50aW5nIHRoZQogICBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBEYWVtb24uIEFuZCBzcGVjaWFsIHRoYW5rcyB0byBMdWNhcyBIYXJ0IGZvcgogICBsb3RzIG9mIGhlbHAgd2l0aCB0aGUgVk1TIHZlcnNpb247IHRvIFBldGVyIEVpY2hob3JuIGZvciBjb250aW51b3VzCiAgIHRlc3Rpbmcgb24gdGhlIGZ1bGwgcmFuZ2Ugb2YgSFAtVVggdmVyc2lvbnMgYW5kIGZvciBhIGNvbnNvbGlkYXRlZCBzZXQKICAgb2YgSFAtVVggbWFrZWZpbGUgdGFyZ2V0czsgYW5kIHRvIENvbGluIEFsbGVuLCBNYXJrIEFsbGVuLCBSb2dlcgogICBBbGxlbiwgUmljIEFuZGVyc29uLCBXaWxsaWFtIEJhZGVyLCBNaXRjaCBCYWtlciwgTWl0Y2hlbGwgQmFzcywgTmVsc29uCiAgIEJlZWJlLCBHZXJyeSBCZWxhbmdlciwgSmVmZiBCZXJuc3RlbiwgTWFyayBCZXJyeW1hbiwgSm9obiBCaWdnLCBWb2xrZXIKICAgQm9yY2hlcnQsIEpvbmF0aGFuIEJvc3dlbGwsIFRpbSBCb3llciwgRnJlZGVyaWNrIEJydWNrbWFuLCBLZW5uZXRoCiAgIENvY2hyYW4sIEphcmVkIENyYXBvLCBCaWxsIERlbGFuZXksIElnb3IgU29icmFkbyBEZWxnYWRvLCBDbGFyZW5jZQogICBEb2xkLCBKb2UgRG91cG5paywgSm9obiBEdW5sYXAsIE1heCBFdmFydHMsIFBhdHJpY2sgRnJlbmNoLCBDYXJsCiAgIEZyaWVkYmVyZywgQ2FybCBGcmllbmQsIEhpcm9mdW1pIEZ1amlpLCBBbmRyZXcgR2FicmllbCwgR2FiZSBHYXJ6YSwKICAgQm95ZCBHZXJiZXIsIERhdmlkIEdlcmJlciwgR2VvcmdlIEdpbG1lciwgSHVudGVyIEdvYXRsZXksIERKIEhhZ2JlcmcsCiAgIEtldmluIEhhbmR5LCBBbmR5IEhhcnBlciwgUmFuZG9scGggSGVyYmVyLCBTdmVuIEhvbHN0cvZtLCBNaWNoYWwKICAgSmFlZ2VybWFubiwgR3JhaGFtIEplbmtpbnMsIERpY2sgSm9uZXMsIFRlcnJ5IEtlbm5lZHksIFJvYmVydCBEIEtleXMsCiAgIE5pY2sgS2lzc2ViZXJ0aCwgSWdvciBLb3ZhbGVua28sIERhdmlkIExhbmUsIEFkYW0gTGF1cmllLCBKZWZmCiAgIExpZWJlcm1hbm4sIEVyaWMgTG9udmljaywgSG9pIFdhbiBMb3VpcywgQXJ0aHVyIE1hcnNoLCBHcmVnb3JpZQogICBNYXJ0aW4sIFBldGVyIE1hdXpleSwgRHJhZ2FuIE1pbGljaWMsIFRvZGQgTWlsbGVyLCBDaHJpc3RpYW4gTW9uZHJ1cCwKICAgRGFuaWVsIE1vcmF0bywgRGF0IE5ndXllbiwgSGVyYiBQZXllcmwsIEplYW4tUGllcnJlIFJhZGxleSwgU3RldmUKICAgUmFuY2UsIFN0ZXBoZW4gUmllaG0sIE5pZ2VsIFJvbGVzLCBMYXJyeSBSb3Nlbm1hbiwgSmF5IFMgUm91bWFuLCBEYXZpZAogICBTYW5kZXJzb24sIEpvaG4gU2FudG9zLCBNaWNoYWVsIFNjaG1pdHosIFN0ZXZlbiBTY2h1bHR6LCBCb2IgU2hhaXIsCiAgIFJpY2hhcmQgU2h1Zm9yZCwgRnJlZCBTbWl0aCwgTWljaGFlbCBTb2tvbG92LCBKaW0gU3BhdGgsIFBldGVyIFN6ZWxsLAogICBUZWQgVCdzbywgQnJpYW4gVGlsbG1hbiwgTGludXMgVG9ydmFsZHMsIFBhdHJpY2sgVm9sa2VyZGluZywgTWFydGluCiAgIFZvcmzkbmRlciwgU3RldmUgV2FsdG9uLCBLZW4gV2VhdmVybGluZywgSm9obiBXZWVrbGV5LCBNYXJ0aW4KICAgV2hpdGFrZXIsIEppbSBXaGl0YnksIE1hdHQgV2lsbG1hbiwgSm9lbGxlbiBXaW5kc29yLCBGYXJyZWxsIFdvb2RzLAogICBhbmQgbWFueSBvdGhlcnMgZm9yIGJpbmFyaWVzLCBob3N0aW5nLCByZXZpZXdzLCBzdWdnZXN0aW9ucywgYWR2aWNlLAogICBidWcgcmVwb3J0cywgYW5kIGFsbCB0aGUgcmVzdCBvdmVyIHRoZSAzKyB5ZWFyIEMtS2VybWl0IDcuMAogICBkZXZlbG9wbWVudCBjeWNsZS4gVGhhbmtzIHRvIFJ1c3MgTmVsc29uIGFuZCB0aGUgYm9hcmQgb2YgdGhlIE9wZW4KICAgU29mdHdhcmUgSW5pdGlhdGl2ZSAoWzI2XWh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcpIGZvciB0aGVpcgogICBjb29wZXJhdGlvbiBpbiBkZXZlbG9waW5nIHRoZSBuZXcgQy1LZXJtaXQgbGljZW5zZSBhbmQgdG8gdGhlCiAgIHByb3ByaWV0b3JzIG9mIHRob3NlIGZyZWUgVU5JWCBkaXN0cmlidXRpb25zIHRoYXQgaGF2ZSBpbmNvcnBvcmF0ZWQKICAgQy1LZXJtaXQgNy4wIGZvciB0aGVpciBjb29wZXJhdGlvbiBhbmQgc3VwcG9ydCwgZXNwZWNpYWxseSBGcmVlQlNEJ3MKICAgSvZyZyBXdW5zY2guCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgTk9URSBUTyBLRVJNSVQgOTUgVVNFUlMKCiAgIEtlcm1pdCA5NSBhbmQgQy1LZXJtaXQgc2hhcmUgdGhlIHNhbWUgY29tbWFuZCBhbmQgc2NyaXB0aW5nIGxhbmd1YWdlLAogICB0aGUgc2FtZSBLZXJtaXQgZmlsZS10cmFuc2ZlciBwcm90b2NvbCBpbXBsZW1lbnRhdGlvbiwgYW5kIG11Y2ggZWxzZQogICBiZXNpZGVzLgoKICAgTGlrZSB0aGUgYm9vayBbMjddVXNpbmcgQy1LZXJtaXQsIHRoaXMgZmlsZSBjb25jZW50cmF0ZXMgb24gdGhlCiAgIGFzcGVjdHMgb2YgQy1LZXJtaXQgdGhhdCBhcmUgY29tbW9uIHRvIGFsbCB2ZXJzaW9uczogVU5JWCwgVk1TLAogICBXaW5kb3dzLCBPUy8yLCBWT1MsIEFPUy9WUywgZXRjLiBQbGVhc2UgcmVmZXIgdG8geW91ciBLZXJtaXQgOTUKICAgZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGVjaWZpYyB0byBLZXJtaXQgOTUuCgogICBDLUtlcm1pdCA3LjAgY29ycmVzcG9uZHMgdG8gS2VybWl0IDk1IDEuMS4xOS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICBDLUtFUk1JVCBWRVJTSU9OUyBBTkQgVkVSU0lPTiBOVU1CRVJTCgogICAiQy1LZXJtaXQiIHJlZmVycyB0byBhbGwgdGhlIG1hbnkgcHJvZ3JhbXMgdGhhdCBhcmUgY29tcGlsZWQgaW4gd2hvbGUKICAgb3IgaW4gcGFydCBmcm9tIGNvbW1vbiBDLWxhbmd1YWdlIHNvdXJjZSBjb2RlLCBjb21wcmlzaW5nOgoKICAgICAqIEEgS2VybWl0IGZpbGUgdHJhbnNmZXIgcHJvdG9jb2wgbW9kdWxlCiAgICAgKiBBIGNvbW1hbmQgcGFyc2VyIGFuZCBzY3JpcHQgZXhlY3V0aW9uIG1vZHVsZQogICAgICogQSBtb2RlbS1kaWFsaW5nIG1vZHVsZQogICAgICogQSBuZXR3b3JrIHN1cHBvcnQgbW9kdWxlCiAgICAgKiBBIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gbW9kdWxlLgoKICAgYW5kIHNldmVyYWwgb3RoZXJzLiBUaGVzZSAic3lzdGVtLWluZGVwZW5kZW50IiBtb2R1bGVzIGFyZSBjb21iaW5lZAogICB3aXRoIHN5c3RlbS1kZXBlbmRlbnQgbW9kdWxlcyBmb3IgZWFjaCBwbGF0Zm9ybSB0byBwcm92aWRlIHRoZQogICByZXF1aXJlZCBpbnB1dC9vdXRwdXQgZnVuY3Rpb25zLCBhbmQgYWxzbyBpbiBzb21lIGNhc2VzIG92ZXJsYWlkIHdpdGgKICAgYW4gYWx0ZXJuYXRpdmUgdXNlciBpbnRlcmZhY2UsIHN1Y2ggYXMgTWFjaW50b3NoIEtlcm1pdCdzCiAgIHBvaW50LWFuZC1jbGljayBpbnRlcmZhY2UsIGFuZCBpbiBzb21lIGNhc2VzIGFsc28gYSB0ZXJtaW5hbCBlbXVsYXRvciwKICAgYXMgS2VybWl0IDk1LgoKICAgVGhlIEMtS2VybWl0IHZlcnNpb24gbnVtYmVyIHN0YXJ0ZWQgYXMgMS4wLCAuLi4gMy4wLCA0LjAsIDQuMSBhbmQgdGhlbgogICAoYmVjYXVzZSBvZiBjb25mdXNpb24gYXQgdGhlIHRpbWUgd2l0aCBCZXJrZWxleSBVTklYIDQuMiksIDRCLCA0QywgYW5kCiAgIHNvIG9uLCB3aXRoIHRoZSBzcGVjaWZpYyBlZGl0IG51bWJlciBpbiBwYXJlbnRoZXNlcywgZm9yIGV4YW1wbGUKICAgNEUoMDcyKSBvciA1QSgxODgpLiBUaGlzIHNjaGVtZSB3YXMgdXNlZCB0aHJvdWdoIDVBKDE5MSksIGJ1dCBub3cgd2UKICAgaGF2ZSBnb25lIGJhY2sgdG8gdGhlIHRyYWRpdGlvbmFsIG51bWJlcmluZyBzY2hlbWUgd2l0aCBkZWNpbWFsCiAgIHBvaW50czogbWFqb3IubWlub3IuZWRpdDsgZm9yIGV4YW1wbGUgNy4wLjE5Ni4gSW50ZXJuYWwgdmVyc2lvbgogICBudW1iZXJzICh0aGUgXHYodmVyc2lvbikgdmFyaWFibGUpLCBob3dldmVyLCBhcmUgY29tcGF0aWJsZSBpbgogICBDLUtlcm1pdCA1QSB1cHdhcmRzLgoKICAgTWVhbndoaWxlLCBDLUtlcm1pdCBkZXJpdmF0aXZlcyBmb3Igc29tZSBwbGF0Zm9ybXMgKFdpbmRvd3MsCiAgIE1hY2ludG9zaCkgbWlnaHQgZ28gdGhyb3VnaCBzZXZlcmFsIHJlbGVhc2VzIHdoaWxlIEMtS2VybWl0IGl0c2VsZgogICByZW1haW5zIHRoZSBzYW1lLiBUaGVzZSB2ZXJzaW9ucyBoYXZlIHRoZWlyIG93biBwbGF0Zm9ybS1zcGVjaWZpYwogICB2ZXJzaW9uIG51bWJlcnMsIHN1Y2ggYXMgS2VybWl0IDk1IDEuMS4xLCAxLjEuMiwgYW5kIHNvIG9uLgoKICAgQy1LZXJtaXQgVmVyc2lvbiBIaXN0b3J5OgoKICAxLjAgICAgICAgMTk4MS0xOTgyICAgICAgICAgQ29tbWFuZC1saW5lIG9ubHksIDQuMiBCU0QgVU5JWCBvbmx5CiAgMi4wICAgICAgICgqKSAgICAgICAgICAgICAgICh3aG8gcmVtZW1iZXJzLi4uKQogIDMuMCAgICAgICBNYXkgMTk4NCAgICAgICAgICBDb21tYW5kLWxpbmUgb25seSwgc3VwcG9ydHMgc2V2ZXJhbCBwbGF0Zm9ybXMKICA0LjAtNC4xICAgRmViLUFwciAxOTg1ICgqKSAgRmlyc3QgaW50ZXJhY3RpdmUgYW5kIG1vZHVsYXIgdmVyc2lvbgogIDRDKDA1MCkgICBNYXkgMTk4NQogIDREKDA2MCkgICBBcHJpbCAxOTg2CiAgNEUoMDY2KSAgIEF1Z3VzdCAxOTg3ICAgICAgIExvbmcgcGFja2V0cwogIDRFKDA2OCkgICBKYW51YXJ5IDE5ODgKICA0RSgwNzIpICAgSmFudWFyeSAxOTg5CiAgNEYoMDk1KSAgIEF1Z3VzdCAxOTg5ICgqKSAgIEF0dHJpYnV0ZSBwYWNrZXRzCiAgNUEoMTg4KSAgIE5vdmVtYmVyIDE5OTIgICAgIFNjcmlwdGluZywgVENQL0lQLCBzbGlkaW5nIHdpbmRvd3MgKDEpCiAgNUEoMTg5KSAgIFNlcHRlbWJlciAxOTkzICAgIENvbnRyb2wtY2hhciB1bnByZWZpeGluZwogIDVBKDE5MCkgICBPY3RvYmVyIDE5OTQgICAgICBSZWNvdmVyeQogIDVBKDE5MSkgICBBcHJpbCAxOTk1ICAgICAgICBPUy8yIG9ubHkKICA2LjAuMTkyICAgU2VwdGVtYmVyIDE5OTYgICAgSW50ZWxsaWdlbnQgZGlhbGluZywgYXV0b2Rvd25sb2FkLCBsb3RzIG1vcmUgKDIpCiAgNi4xLjE5MyAgIDE5OTctOTggKCopICAgICAgIERldmVsb3BtZW50IG9ubHkKICA2LjEuMTk0ICAgSnVuZSAxOTk4ICAgICAgICAgSzk1IG9ubHkgLSBzd2l0Y2hlcywgZGlyZWN0b3J5IHJlY3Vyc2lvbiwgbW9yZQogIDcuMC4xOTUgICBBdWd1c3QgMTk5OSAgICAgICBJS1NEICsgbW9yZSAoQ1Ugb25seSBhcyBLOTUgMS4xLjE4LUNVKQogIDcuMC4xOTYgICAxIEphbnVhcnkgMjAwMCAgICBVbmljb2RlLCBsb3RzIG1vcmUKCiAgICgqKSBOZXZlciBmb3JtYWxseSByZWxlYXNlZCAoNC4wIHdhcyBhIHRvdGFsIHJld3JpdGUpCiAgICgxKSBVc2luZyBDLUtlcm1pdCwgMXN0IEVkaXRpb24KICAgKDIpIFVzaW5nIEMtS2VybWl0LCAybmQgRWRpdGlvbgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpDT05URU5UUwoKIEkuICBbMjhdQy1LRVJNSVQgRE9DVU1FTlRBVElPTgoKIElJLiBbMjldTkVXIEZFQVRVUkVTCgogICAgICgwKSBbMzBdSU5DT01QQVRJQklMSVRJRVMgV0lUSCBQUkVWSU9VUyBSRUxFQVNFUwogICAgICgxKSBbMzFdUFJPR1JBTSBBTkQgRklMRSBNQU5BR0VNRU5UIEFORCBDT01NQU5EUwogICAgICAgICAxLjAuICBbMzJdQnVnIGZpeGVzCiAgICAgICAgIDEuMS4gIFszM11Db21tYW5kIENvbnRpbnVhdGlvbgogICAgICAgICAxLjIuICBbMzRdRWRpdG9yIEludGVyZmFjZQogICAgICAgICAxLjMuICBbMzVdV2ViIEJyb3dzZXIgYW5kIEZUUCBJbnRlcmZhY2UKICAgICAgICAgMS40LiAgWzM2XUNvbW1hbmQgRWRpdGluZwogICAgICAgICAxLjUuICBbMzddQ29tbWFuZCBTd2l0Y2hlcwogICAgICAgICAgICAgICAxLjUuMS4gWzM4XUdlbmVyYWwgU3dpdGNoIFN5bnRheAogICAgICAgICAgICAgICAxLjUuMi4gWzM5XU9yZGVyIGFuZCBFZmZlY3Qgb2YgU3dpdGNoZXMKICAgICAgICAgICAgICAgMS41LjMuIFs0MF1EaXN0aW5ndWlzaGluZyBTd2l0Y2hlcyBmcm9tIE90aGVyIEZpZWxkcwogICAgICAgICAgICAgICAxLjUuNC4gWzQxXVN0YW5kYXJkIEZpbGUgU2VsZWN0aW9uIFN3aXRjaGVzCiAgICAgICAgICAgICAgIDEuNS41LiBbNDJdU2V0dGluZyBQcmVmZXJlbmNlcyBmb3IgRGlmZmVyZW50IENvbW1hbmRzCiAgICAgICAgIDEuNi4gIFs0M11EYXRlcyBhbmQgVGltZXMKICAgICAgICAgMS43LiAgWzQ0XVBhcnRpYWwgQ29tcGxldGlvbiBvZiBLZXl3b3JkcwogICAgICAgICAxLjguICBbNDVdQ29tbWFuZCBSZWNhbGwKICAgICAgICAgMS45LiAgWzQ2XUVYSVQgTWVzc2FnZXMKICAgICAgICAgMS4xMC4gWzQ3XU1hbmFnaW5nIEtleWJvYXJkIEludGVycnVwdGlvbnMKICAgICAgICAgMS4xMS4gWzQ4XVRhbWluZyB0aGUgV2lsZCBCYWNrc2xhc2ggLS0gUGFydCBEZXV4CiAgICAgICAgICAgICAgIDEuMTEuMS4gWzQ5XUJhY2tncm91bmQKICAgICAgICAgICAgICAgMS4xMS4yLiBbNTBdS2VybWl0J3MgUXVvdGluZyBSdWxlcwogICAgICAgICAgICAgICAxLjExLjMuIFs1MV1QYXNzaW5nIERPUyBGaWxlbmFtZXMgZnJvbSBLZXJtaXQgdG8gU2hlbGwgQ29tbWFuZHMKICAgICAgICAgICAgICAgMS4xMS40LiBbNTJdVXNpbmcgVmFyaWFibGVzIHRvIEhvbGQgRE9TIEZpbGVuYW1lcwogICAgICAgICAgICAgICAxLjExLjUuIFs1M11QYXNzaW5nIERPUyBGaWxlbmFtZXMgYXMgUGFyYW1ldGVycyB0byBNYWNyb3MKICAgICAgICAgICAgICAgMS4xMS42LiBbNTRdUGFzc2luZyBET1MgRmlsZSBOYW1lcyBmcm9tIE1hY3JvIFBhcmFtZXRlcnMgdG8gdGhlCkRPUyBTaGVsbAogICAgICAgICAgICAgICAxLjExLjcuIFs1NV1QYXNzaW5nIERPUyBGaWxlbmFtZXMgdG8gS2VybWl0IGZyb20gdGhlIFNoZWxsCiAgICAgICAgIDEuMTIuIFs1Nl1EZWJ1Z2dpbmcKICAgICAgICAgMS4xMy4gWzU3XUxvZ3MKICAgICAgICAgMS4xNC4gWzU4XUF1dG9tYXRpYyBGaWxlLVRyYW5zZmVyIFBhY2tldCBSZWNvZ25pdGlvbiBhdCB0aGUgQ29tbWFuZCBQcgpvbXB0CiAgICAgICAgIDEuMTUuIFs1OV1UaGUgVFlQRSBDb21tYW5kCiAgICAgICAgIDEuMTYuIFs2MF1UaGUgUkVTRVQgQ29tbWFuZAogICAgICAgICAxLjE3LiBbNjFdVGhlIENPUFkgYW5kIFJFTkFNRSBDb21tYW5kcwogICAgICAgICAxLjE4LiBbNjJdVGhlIE1BTlVBTCBDb21tYW5kCiAgICAgICAgIDEuMTkuIFs2M11TdHJpbmcgYW5kIEZpbGVuYW1lIE1hdGNoaW5nIFBhdHRlcm5zCiAgICAgICAgIDEuMjAuIFs2NF1NdWx0aXBsZSBDb21tYW5kcyBvbiBPbmUgTGluZQogICAgICAgICAxLjIxLiBbNjVdV2hhdCBEbyBJIEhhdmU/CiAgICAgICAgIDEuMjIuIFs2Nl1HZW5lcmFsaXplZCBGaWxlIElucHV0IGFuZCBPdXRwdXQKICAgICAgICAgICAgICAgMS4yMi4xLiBbNjddV2h5IEFub3RoZXIgSS9PIFN5c3RlbT8KICAgICAgICAgICAgICAgMS4yMi4yLiBbNjhdVGhlIEZJTEUgQ29tbWFuZAogICAgICAgICAgICAgICAxLjIyLjMuIFs2OV1GSUxFIENvbW1hbmQgRXhhbXBsZXMKICAgICAgICAgICAgICAgMS4yMi40LiBbNzBdQ2hhbm5lbCBOdW1iZXJzCiAgICAgICAgICAgICAgIDEuMjIuNS4gWzcxXUZJTEUgQ29tbWFuZCBFcnJvciBDb2RlcwogICAgICAgICAgICAgICAxLjIyLjYuIFs3Ml1GaWxlIEkvTyBWYXJpYWJsZXMKICAgICAgICAgICAgICAgMS4yMi43LiBbNzNdRmlsZSBJL08gRnVuY3Rpb25zCiAgICAgICAgICAgICAgIDEuMjIuOC4gWzc0XUZpbGUgSS9PIEZ1bmN0aW9uIEV4YW1wbGVzCiAgICAgICAgIDEuMjMuIFs3NV1UaGUgRVhFQyBDb21tYW5kCiAgICAgICAgIDEuMjQuIFs3Nl1HZXR0aW5nIEtleXdvcmQgTGlzdHMgd2l0aCAnPycKICAgICAoMikgWzc3XU1BS0lORyBBTkQgVVNJTkcgQ09OTkVDVElPTlMKICAgICAgICAgMi4wLiBbNzhdU0VUIExJTkUgYW5kIFNFVCBIT1NUIENvbW1hbmQgU3dpdGNoZXMKICAgICAgICAgMi4xLiBbNzldRGlhbGluZwogICAgICAgICAgICAgIDIuMS4xLiBbODBdVGhlIERpYWwgUmVzdWx0IE1lc3NhZ2UKICAgICAgICAgICAgICAyLjEuMi4gWzgxXUxvbmctRGlzdGFuY2UgRGlhbGluZyBDaGFuZ2VzCiAgICAgICAgICAgICAgMi4xLjMuIFs4Ml1Gb3JjaW5nIExvbmctRGlzdGFuY2UgRGlhbGluZwogICAgICAgICAgICAgIDIuMS40LiBbODNdRXhjaGFuZ2UtU3BlY2lmaWMgRGlhbGluZyBEZWNpc2lvbnMKICAgICAgICAgICAgICAyLjEuNS4gWzg0XUNhdXRpb25zIGFib3V0IENoZWFwZXN0LUZpcnN0IERpYWxpbmcKICAgICAgICAgICAgICAyLjEuNi4gWzg1XUJsaW5kIERpYWxpbmcgKERpYWxpbmcgd2l0aCBObyBEaWFsdG9uZSkKICAgICAgICAgICAgICAyLjEuNy4gWzg2XVRyaW1taW5nIHRoZSBEaWFsaW5nIERpYWxvZwogICAgICAgICAgICAgIDIuMS44LiBbODddQ29udHJvbGxpbmcgdGhlIERpYWxpbmcgU3BlZWQKICAgICAgICAgICAgICAyLjEuOS4gWzg4XVByZXRlc3RpbmcgUGhvbmUgTnVtYmVyIENvbnZlcnNpb25zCiAgICAgICAgICAgICAgMi4xLjEwLiBbODldR3JlYXRlciBDb250cm9sIG92ZXIgUGFydGlhbCBEaWFsaW5nCiAgICAgICAgICAgICAgMi4xLjExLiBbOTBdTmV3IERJQUwtcmVsYXRlZCBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucwogICAgICAgICAgICAgIDIuMS4xMi4gWzkxXUluY3JlYXNlZCBGbGV4aWJpbGl0eSBvZiBQQlggRGlhbGluZwogICAgICAgICAgICAgIDIuMS4xMy4gWzkyXVRoZSBESUFMIG1hY3JvIC0gTGFzdC1NaW51dGUgUGhvbmUgTnVtYmVyIENvbnZlcnNpb25zCiAgICAgICAgICAgICAgMi4xLjE0LiBbOTNdQXV0b21hdGljIFRvbmUvUHVsc2UgRGlhbGluZyBTZWxlY3Rpb24KICAgICAgICAgICAgICAyLjEuMTUuIFs5NF1EaWFsLU1vZGlmaWVyIFZhcmlhYmxlcwogICAgICAgICAgICAgIDIuMS4xNi4gWzk1XUdpdmluZyBNdWx0aXBsZSBOdW1iZXJzIHRvIHRoZSBESUFMIENvbW1hbmQKICAgICAgICAgMi4yLiBbOTZdTW9kZW1zCiAgICAgICAgICAgICAgMi4yLjEuIFs5N11OZXcgTW9kZW0gVHlwZXMKICAgICAgICAgICAgICAyLjIuMi4gWzk4XU5ldyBNb2RlbSBDb250cm9scwogICAgICAgICAyLjMuIFs5OV1URUxORVQgYW5kIFJMT0dJTgogICAgICAgICAgICAgIDIuMy4wLiBbMTAwXUJ1ZyBGaXhlcwogICAgICAgICAgICAgIDIuMy4xLiBbMTAxXVRlbG5ldCBCaW5hcnkgTW9kZSBCdWcgQWRqdXN0bWVudHMKICAgICAgICAgICAgICAyLjMuMi4gWzEwMl1WTVMgVUNYIFRlbG5ldCBQb3J0IEJ1ZyBBZGp1c3RtZW50CiAgICAgICAgICAgICAgMi4zLjMuIFsxMDNdVGVsbmV0IE5ldyBFbnZpcm9ubWVudCBPcHRpb24KICAgICAgICAgICAgICAyLjMuNC4gWzEwNF1UZWxuZXQgTG9jYXRpb24gT3B0aW9uCiAgICAgICAgICAgICAgMi4zLjUuIFsxMDVdQ29ubmVjdGluZyB0byBSYXcgVENQIFNvY2tldHMKICAgICAgICAgICAgICAyLjMuNi4gWzEwNl1JbmNvbWluZyBUQ1AgQ29ubmVjdGlvbnMKICAgICAgICAgMi40LiBbMTA3XVRoZSBFSUdIVEJJVCBDb21tYW5kCiAgICAgICAgIDIuNS4gWzEwOF1UaGUgU2VydmljZXMgRGlyZWN0b3J5CiAgICAgICAgIDIuNi4gWzEwOV1DbG9zaW5nIENvbm5lY3Rpb25zCiAgICAgICAgIDIuNy4gWzExMF1Vc2luZyBDLUtlcm1pdCB3aXRoIEV4dGVybmFsIENvbW11bmljYXRpb24gUHJvZ3JhbXMKICAgICAgICAgICAgICAyLjcuMC4gWzExMV1DLUtlcm1pdCBvdmVyIHRuMzI3MCBhbmQgdG41MjUwCiAgICAgICAgICAgICAgMi43LjEuIFsxMTJdQy1LZXJtaXQgb3ZlciBUZWxuZXQKICAgICAgICAgICAgICAyLjcuMi4gWzExM11DLUtlcm1pdCBvdmVyIFJsb2dpbgogICAgICAgICAgICAgIDIuNy4zLiBbMTE0XUMtS2VybWl0IG92ZXIgU2VyaWFsIENvbW11bmljYXRpb24gUHJvZ3JhbXMKICAgICAgICAgICAgICAyLjcuNC4gWzExNV1DLUtlcm1pdCBvdmVyIFNlY3VyZSBOZXR3b3JrIENsaWVudHMKICAgICAgICAgICAgICAyLjcuNC4xLiBbMTE2XVNTSAogICAgICAgICAgICAgIDIuNy40LjIuIFsxMTddU1NMCiAgICAgICAgICAgICAgMi43LjQuMy4gWzExOF1TUlAKICAgICAgICAgICAgICAyLjcuNC40LiBbMTE5XVNPQ0tTCiAgICAgICAgICAgICAgMi43LjQuNS4gWzEyMF1LZXJiZXJvcyBhbmQgU1JQCiAgICAgICAgIDIuOC4gWzEyMV1TY3JpcHRpbmcgTG9jYWwgUHJvZ3JhbXMKICAgICAgICAgMi45LiBbMTIyXVguMjUgTmV0d29ya2luZwogICAgICAgICAgICAgIDIuOS4xLiBbMTIzXUlCTSBBSVhMaW5rL1guMjUgTmV0d29yayBQcm92aWRlciBJbnRlcmZhY2UgZm9yIEFJWAogICAgICAgICAgICAgIDIuOS4yLiBbMTI0XUhQLVVYIFguMjUKICAgICAgICAgMi4xMC4gWzEyNV1BZGRpdGlvbmFsIFNlcmlhbCBQb3J0IENvbnRyb2xzCiAgICAgICAgIDIuMTEuIFsxMjZdR2V0dGluZyBBY2Nlc3MgdG8gdGhlIERpYWxvdXQgRGV2aWNlCiAgICAgICAgIDIuMTIuIFsxMjddVGhlIENvbm5lY3Rpb24gTG9nCiAgICAgICAgIDIuMTMuIFsxMjhdQXV0b21hdGljIENvbm5lY3Rpb24tU3BlY2lmaWMgRmxvdyBDb250cm9sIFNlbGVjdGlvbgogICAgICAgICAyLjE0LiBbMTI5XVRyYXBwaW5nIENvbm5lY3Rpb24gRXN0YWJsaXNobWVudCBhbmQgTG9zcwogICAgICAgICAyLjE1LiBbMTMwXUNvbnRhY3RpbmcgV2ViIFNlcnZlcnMgd2l0aCB0aGUgSFRUUCBDb21tYW5kCiAgICAgKDMpIFsxMzFdVEVSTUlOQUwgQ09OTkVDVElPTgogICAgICAgICAzLjEuIFsxMzJdQ09OTkVDVCBDb21tYW5kIFN3aXRjaGVzCiAgICAgICAgIDMuMi4gWzEzM11UcmlnZ2VycwogICAgICAgICAzLjMuIFsxMzRdVHJhbnNwYXJlbnQgUHJpbnRpbmcKICAgICAgICAgMy40LiBbMTM1XUJpbmFyeSBhbmQgVGV4dCBTZXNzaW9uIExvZ3MKICAgICAoNCkgWzEzNl1GSUxFIFRSQU5TRkVSIEFORCBNQU5BR0VNRU5UCiAgICAgICAgIDQuMC4gWzEzN11CdWcgRml4ZXMsIE1pbm9yIENoYW5nZXMsIGFuZCBDbGFyaWZpY2F0aW9ucwogICAgICAgICA0LjEuIFsxMzhdRmlsZS1UcmFuc2ZlciBGaWxlbmFtZSBUZW1wbGF0ZXMKICAgICAgICAgNC4xLjEuIFsxMzldVGVtcGxhdGVzIGluIHRoZSBBcy1OYW1lCiAgICAgICAgIDQuMS4yLiBbMTQwXVRlbXBsYXRlcyBvbiB0aGUgQ29tbWFuZCBMaW5lCiAgICAgICAgIDQuMS4zLiBbMTQxXVBvc3QtVHJhbnNmZXIgUmVuYW1pbmcKICAgICAgICAgNC4yLiBbMTQyXUZpbGUtVHJhbnNmZXIgUGlwZXMgYW5kIEZpbHRlcnMKICAgICAgICAgNC4yLjEuIFsxNDNdSW50cm9kdWN0aW9uCiAgICAgICAgIDQuMi4xLjEuIFsxNDRdVGVybWlub2xvZ3kKICAgICAgICAgNC4yLjEuMi4gWzE0NV1Ob3RhdGlvbgogICAgICAgICA0LjIuMS4zLiBbMTQ2XVNlY3VyaXR5CiAgICAgICAgIDQuMi4yLiBbMTQ3XUNvbW1hbmRzIGZvciBUcmFuc2ZlcnJpbmcgZnJvbSBhbmQgdG8gUGlwZXMKICAgICAgICAgNC4yLjIuMS4gWzE0OF1TZW5kaW5nIGZyb20gYSBDb21tYW5kCiAgICAgICAgIDQuMi4yLjIuIFsxNDldUmVjZWl2aW5nIHRvIGEgQ29tbWFuZAogICAgICAgICA0LjIuMy4gWzE1MF1Vc2luZyBGaWxlLVRyYW5zZmVyIEZpbHRlcnMKICAgICAgICAgNC4yLjMuMS4gWzE1MV1UaGUgU0VORCBGaWx0ZXIKICAgICAgICAgNC4yLjMuMi4gWzE1Ml1UaGUgUkVDRUlWRSBGaWx0ZXIKICAgICAgICAgNC4yLjQuIFsxNTNdSW1wbGljaXQgVXNlIG9mIFBpcGVzCiAgICAgICAgIDQuMi41LiBbMTU0XVN1Y2Nlc3MgYW5kIEZhaWx1cmUgb2YgUGlwZWQgQ29tbWFuZHMKICAgICAgICAgNC4yLjYuIFsxNTVdQ2F1dGlvbnMgYWJvdXQgVXNpbmcgUGlwZXMgdG8gVHJhbnNmZXIgRGlyZWN0b3J5IFRyZWVzCiAgICAgICAgIDQuMi43LiBbMTU2XVBpcGVzIGFuZCBFbmNyeXB0aW9uCiAgICAgICAgIDQuMi44LiBbMTU3XUNvbW1hbmRzIGFuZCBGdW5jdGlvbnMgUmVsYXRlZCB0byBQaXBlcwogICAgICAgICA0LjIuOC4xLiBbMTU4XVRoZSBPUEVOICFSRUFEIGFuZCBPUEVOICFXUklURSBDb21tYW5kcwogICAgICAgICA0LjIuOC4yLiBbMTU5XVRoZSBSRURJUkVDVCBDb21tYW5kCiAgICAgICAgIDQuMi44LjMuIFsxNjBdUmVjZWl2aW5nIE1haWwgYW5kIFByaW50IEpvYnMKICAgICAgICAgNC4yLjguNC4gWzE2MV1QaXBlLVJlbGF0ZWQgRnVuY3Rpb25zCiAgICAgICAgIDQuMy4gWzE2Ml1BdXRvbWF0aWMgUGVyLUZpbGUgVGV4dC9CaW5hcnkgTW9kZSBTd2l0Y2hpbmcKICAgICAgICAgNC4zLjEuIFsxNjNdRXhjZXB0aW9ucwogICAgICAgICA0LjMuMi4gWzE2NF1PdmVydmlldwogICAgICAgICA0LjMuMy4gWzE2NV1Db21tYW5kcwogICAgICAgICA0LjMuNC4gWzE2Nl1FeGFtcGxlcwogICAgICAgICA0LjQuIFsxNjddRmlsZSBQZXJtaXNzaW9ucwogICAgICAgICA0LjQuMS4gWzE2OF1XaGVuIEFUVFJJQlVURVMgUFJPVEVDVElPTiBpcyBPRkYKICAgICAgICAgNC40LjEuMS4gWzE2OV1Vbml4CiAgICAgICAgIDQuNC4xLjIuIFsxNzBdVk1TCiAgICAgICAgIDQuNC4yLiBbMTcxXVdoZW4gQVRUUklCVVRFUyBQUk9URUNUSU9OIGlzIE9OCiAgICAgICAgIDQuNC4yLjEuIFsxNzJdU3lzdGVtLVNwZWNpZmljIFBlcm1pc3Npb25zCiAgICAgICAgIDQuNC4yLjEuMS4gWzE3M11VTklYCiAgICAgICAgIDQuNC4yLjEuMi4gWzE3NF1WTVMKICAgICAgICAgNC40LjIuMi4gWzE3NV1TeXN0ZW0tSW5kZXBlbmRlbnQgUGVybWlzc2lvbnMKICAgICAgICAgNC41LiBbMTc2XUZpbGUgTWFuYWdlbWVudCBDb21tYW5kcwogICAgICAgICA0LjUuMS4gWzE3N11UaGUgRElSRUNUT1JZIENvbW1hbmQKICAgICAgICAgNC41LjIuIFsxNzhdVGhlIENEIGFuZCBCQUNLIENvbW1hbmRzCiAgICAgICAgIDQuNS4yLjEuIFsxNzldUGFyc2luZyBJbXByb3ZlbWVudHMKICAgICAgICAgNC41LjIuMi4gWzE4MF1UaGUgQ0RQQVRICiAgICAgICAgIDQuNS4zLiBbMTgxXUNyZWF0aW5nIGFuZCBSZW1vdmluZyBEaXJlY3RvcmllcwogICAgICAgICA0LjUuNC4gWzE4Ml1UaGUgREVMRVRFIGFuZCBQVVJHRSBDb21tYW5kcwogICAgICAgICA0LjYuIFsxODNdU3RhcnRpbmcgdGhlIFJlbW90ZSBLZXJtaXQgU2VydmVyIEF1dG9tYXRpY2FsbHkKICAgICAgICAgNC43LiBbMTg0XUZpbGUtVHJhbnNmZXIgQ29tbWFuZCBTd2l0Y2hlcwogICAgICAgICA0LjcuMS4gWzE4NV1TRU5EIENvbW1hbmQgU3dpdGNoZXMKICAgICAgICAgNC43LjIuIFsxODZdR0VUIENvbW1hbmQgU3dpdGNoZXMKICAgICAgICAgNC43LjMuIFsxODddUkVDRUlWRSBDb21tYW5kIFN3aXRjaGVzCiAgICAgICAgIDQuOC4gWzE4OF1NaW5vciBLZXJtaXQgUHJvdG9jb2wgSW1wcm92ZW1lbnRzCiAgICAgICAgIDQuOC4xLiBbMTg5XU11bHRpcGxlIEF0dHJpYnV0ZSBQYWNrZXRzCiAgICAgICAgIDQuOC4yLiBbMTkwXVZlcnkgU2hvcnQgUGFja2V0cwogICAgICAgICA0LjkuIFsxOTFdV2lsZGNhcmQgLyBGaWxlIEdyb3VwIEV4cGFuc2lvbgogICAgICAgICA0LjkuMS4gWzE5Ml1JbiBVTklYIEMtS2VybWl0CiAgICAgICAgIDQuOS4yLiBbMTkzXUluIEtlcm1pdCA5NQogICAgICAgICA0LjkuMy4gWzE5NF1JbiBWTVMsIEFPUy9WUywgT1MtOSwgVk9TLCBldGMuCiAgICAgICAgIDQuMTAuIFsxOTVdQWRkaXRpb25hbCBQYXRobmFtZSBDb250cm9scwogICAgICAgICA0LjExLiBbMTk2XVJlY3Vyc2l2ZSBTRU5EIGFuZCBHRVQ6IFRyYW5zZmVycmluZyBEaXJlY3RvcnkgVHJlZXMKICAgICAgICAgNC4xMS4xLiBbMTk3XUNvbW1hbmQtTGluZSBPcHRpb25zCiAgICAgICAgIDQuMTEuMi4gWzE5OF1UaGUgU0VORCAvUkVDVVJTSVZFIENvbW1hbmQKICAgICAgICAgNC4xMS4zLiBbMTk5XVRoZSBHRVQgL1JFQ1VSU0lWRSBDb21tYW5kCiAgICAgICAgIDQuMTEuNC4gWzIwMF1OZXcgYW5kIENoYW5nZWQgRmlsZSBGdW5jdGlvbnMKICAgICAgICAgNC4xMS41LiBbMjAxXU1vdmluZyBEaXJlY3RvcnkgVHJlZXMgQmV0d2VlbiBMaWtlIFN5c3RlbXMKICAgICAgICAgNC4xMS42LiBbMjAyXU1vdmluZyBEaXJlY3RvcnkgVHJlZXMgQmV0d2VlbiBVbmxpa2UgU3lzdGVtcwogICAgICAgICA0LjEyLiBbMjAzXVdoZXJlIERpZCBNeSBGaWxlIEdvPwogICAgICAgICA0LjEzLiBbMjA0XUZpbGUgT3V0cHV0IEJ1ZmZlciBDb250cm9sCiAgICAgICAgIDQuMTQuIFsyMDVdSW1wcm92ZWQgUmVzcG9uc2l2ZW5lc3MKICAgICAgICAgNC4xNS4gWzIwNl1Eb3VibGluZyBhbmQgSWdub3JpbmcgQ2hhcmFjdGVycyBmb3IgVHJhbnNwYXJlbmN5CiAgICAgICAgIDQuMTYuIFsyMDddTmV3IEZpbGUtVHJhbnNmZXIgRGlzcGxheSBGb3JtYXRzCiAgICAgICAgIDQuMTcuIFsyMDhdTmV3IFRyYW5zYWN0aW9uIExvZyBGb3JtYXRzCiAgICAgICAgIDQuMTcuMS4gWzIwOV1UaGUgQlJJRUYgRm9ybWF0CiAgICAgICAgIDQuMTcuMi4gWzIxMF1UaGUgRlRQIEZvcm1hdAogICAgICAgICA0LjE4LiBbMjExXVVucHJlZml4aW5nIE5VTAogICAgICAgICA0LjE5LiBbMjEyXUNsZWFyLUNoYW5uZWwgUHJvdG9jb2wKICAgICAgICAgNC4yMC4gWzIxM11TdHJlYW1pbmcgUHJvdG9jb2wKICAgICAgICAgNC4yMC4xLiBbMjE0XUNvbW1hbmRzIGZvciBTdHJlYW1pbmcKICAgICAgICAgNC4yMC4yLiBbMjE1XUV4YW1wbGVzIG9mIFN0cmVhbWluZwogICAgICAgICA0LjIwLjIuMS4gWzIxNl1TdHJlYW1pbmcgb24gU29ja2V0LXRvLVNvY2tldCBDb25uZWN0aW9ucwogICAgICAgICA0LjIwLjIuMi4gWzIxN11TdHJlYW1pbmcgb24gVGVsbmV0IENvbm5lY3Rpb25zCiAgICAgICAgIDQuMjAuMi4zLiBbMjE4XVN0cmVhbWluZyB3aXRoIExpbWl0ZWQgUGFja2V0IExlbmd0aAogICAgICAgICA0LjIwLjIuNC4gWzIxOV1TdHJlYW1pbmcgb24gRGlhbHVwIENvbm5lY3Rpb25zCiAgICAgICAgIDQuMjAuMi41LiBbMjIwXVN0cmVhbWluZyBvbiBYLjI1IENvbm5lY3Rpb25zCiAgICAgICAgIDQuMjAuMy4gWzIyMV1TdHJlYW1pbmcgLSBQcmVsaW1pbmFyeSBDb25jbHVzaW9ucwogICAgICAgICA0LjIxLiBbMjIyXVRoZSBUUkFOU01JVCBDb21tYW5kCiAgICAgICAgIDQuMjIuIFsyMjNdQ29waW5nIHdpdGggRmF1bHR5IEtlcm1pdCBJbXBsZW1lbnRhdGlvbnMKICAgICAgICAgNC4yMi4xLiBbMjI0XUZhaWx1cmUgdG8gQWNjZXB0IE1vZGVybiBOZWdvdGlhdGlvbiBTdHJpbmdzCiAgICAgICAgIDQuMjIuMi4gWzIyNV1GYWlsdXJlIHRvIE5lZ290aWF0ZSA4dGgtYml0IFByZWZpeGluZwogICAgICAgICA0LjIyLjMuIFsyMjZdQ29ycnVwdCBGaWxlcwogICAgICAgICA0LjIyLjQuIFsyMjddU3B1cmlvdXMgQ2FuY2VsbGF0aW9ucwogICAgICAgICA0LjIyLjUuIFsyMjhdU3B1cmlvdXMgUmVmdXNhbHMKICAgICAgICAgNC4yMi42LiBbMjI5XUZhaWx1cmVzIGR1cmluZyB0aGUgRGF0YSBUcmFuc2ZlciBQaGFzZQogICAgICAgICA0LjIyLjcuIFsyMzBdRnJhY3R1cmVkIEZpbGVuYW1lcwogICAgICAgICA0LjIyLjguIFsyMzFdQmFkIEZpbGUgRGF0ZXMKICAgICAgICAgNC4yMy4gWzIzMl1GaWxlIFRyYW5zZmVyIFJlY292ZXJ5CiAgICAgICAgIDQuMjQuIFsyMzNdRklMRSBDT0xMSVNJT04gVVBEQVRFIENsYXJpZmljYXRpb24KICAgICAgICAgNC4yNS4gWzIzNF1BdXRvZG93bmxvYWQgSW1wcm92ZW1lbnRzCiAgICAgKDUpIFsyMzVdQ0xJRU5UL1NFUlZFUgogICAgICAgICA1LjAuIFsyMzZdSGludHMKICAgICAgICAgNS4xLiBbMjM3XU5ldyBDb21tYW5kLUxpbmUgT3B0aW9ucwogICAgICAgICA1LjIuIFsyMzhdTmV3IENsaWVudCBDb21tYW5kcwogICAgICAgICA1LjMuIFsyMzldTmV3IFNlcnZlciBDYXBhYmlsaXRpZXMKICAgICAgICAgNS4zLjEuIFsyNDBdQ3JlYXRpbmcgYW5kIFJlbW92aW5nIERpcmVjdG9yaWVzCiAgICAgICAgIDUuMy4yLiBbMjQxXURpcmVjdG9yeSBMaXN0aW5ncwogICAgICAgICA1LjQuIFsyNDJdU3ludGF4IGZvciBSZW1vdGUgRmlsZW5hbWVzIHdpdGggRW1iZWRkZWQgU3BhY2VzCiAgICAgICAgIDUuNS4gWzI0M11BdXRvbWF0aWMgT3JpZW50YXRpb24gTWVzc2FnZXMgdXBvbiBEaXJlY3RvcnkgQ2hhbmdlCiAgICAgICAgIDUuNi4gWzI0NF1OZXcgU2VydmVyIENvbnRyb2xzCiAgICAgICAgIDUuNy4gWzI0NV1UaW1lb3V0cyBkdXJpbmcgUkVNT1RFIEhPU1QgQ29tbWFuZCBFeGVjdXRpb24KICAgICAoNikgWzI0Nl1JTlRFUk5BVElPTkFMIENIQVJBQ1RFUiBTRVRTCiAgICAgICAgIDYuMC4gWzI0N11JU08gODg1OS0xNSBMYXRpbiBBbHBoYWJldCA5CiAgICAgICAgIDYuMS4gWzI0OF1UaGUgSFAtUm9tYW44IENoYXJhY3RlciBTZXQKICAgICAgICAgNi4yLiBbMjQ5XUdyZWVrIENoYXJhY3RlciBTZXRzCiAgICAgICAgIDYuMy4gWzI1MF1BZGRpdGlvbmFsIExhdGluLTIgQ2hhcmFjdGVyIFNldHMKICAgICAgICAgNi40LiBbMjUxXUFkZGl0aW9uYWwgQ3lyaWxsaWMgQ2hhcmFjdGVyIFNldHMKICAgICAgICAgNi41LiBbMjUyXUF1dG9tYXRpYyBDaGFyYWN0ZXItU2V0IFN3aXRjaGluZwogICAgICAgICA2LjYuIFsyNTNdVW5pY29kZQogICAgICAgICA2LjYuMS4gWzI1NF1PdmVydmlldyBvZiBVbmljb2RlCiAgICAgICAgIDYuNi4yLiBbMjU1XVVDUyBCeXRlIE9yZGVyCiAgICAgICAgIDYuNi4yLiBbMjU2XVVDUyBUcmFuc2Zvcm1hdGlvbiBGb3JtYXRzCiAgICAgICAgIDYuNi4zLiBbMjU3XUNvbmZvcm1hbmNlIExldmVscwogICAgICAgICA2LjYuNC4gWzI1OF1SZWxhdGlvbnNoaXAgb2YgVW5pY29kZSB3aXRoIEtlcm1pdCdzIE90aGVyIENoYXJhY3RlciBTZXRzCiAgICAgICAgIDYuNi41LiBbMjU5XUtlcm1pdCdzIFVuaWNvZGUgRmVhdHVyZXMKICAgICAgICAgNi42LjUuMS4gWzI2MF1GaWxlIFRyYW5zZmVyCiAgICAgICAgIDYuNi41LjIuIFsyNjFdVGhlIFRSQU5TTEFURSBDb21tYW5kCiAgICAgICAgIDYuNi41LjMuIFsyNjJdVGVybWluYWwgQ29ubmVjdGlvbgogICAgICAgICA2LjYuNS40LiBbMjYzXVRoZSBUUkFOU01JVCBDb21tYW5kCiAgICAgICAgIDYuNi41LjUuIFsyNjRdU3VtbWFyeSBvZiBLZXJtaXQgVW5pY29kZSBDb21tYW5kcwogICAgICAgICA2LjcuIFsyNjVdQ2xpZW50L1NlcnZlciBDaGFyYWN0ZXItU2V0IFN3aXRjaGluZwogICAgICg3KSBbMjY2XVNDUklQVCBQUk9HUkFNTUlORwogICAgICAgICA3LjAuIFsyNjddQnVnIEZpeGVzCiAgICAgICAgIDcuMS4gWzI2OF1UaGUgSU5QVVQgQ29tbWFuZAogICAgICAgICA3LjEuMS4gWzI2OV1JTlBVVCBUaW1lb3V0cwogICAgICAgICA3LjEuMi4gWzI3MF1OZXcgSU5QVVQgQ29udHJvbHMKICAgICAgICAgNy4xLjMuIFsyNzFdSU5QVVQgd2l0aCBQYXR0ZXJuIE1hdGNoaW5nCiAgICAgICAgIDcuMS40LiBbMjcyXVRoZSBJTlBVVCBNYXRjaCBSZXN1bHQKICAgICAgICAgNy4yLiBbMjczXU5ldyBvciBJbXByb3ZlZCBCdWlsdC1JbiBWYXJpYWJsZXMKICAgICAgICAgNy4zLiBbMjc0XU5ldyBvciBJbXByb3ZlZCBCdWlsdC1JbiBGdW5jdGlvbnMKICAgICAgICAgNy40LiBbMjc1XU5ldyBJRiBDb25kaXRpb25zCiAgICAgICAgIDcuNS4gWzI3Nl1Vc2luZyBNb3JlIHRoYW4gVGVuIE1hY3JvIEFyZ3VtZW50cwogICAgICAgICA3LjYuIFsyNzddQ2xhcmlmaWNhdGlvbiBvZiBGdW5jdGlvbiBDYWxsIFN5bnRheAogICAgICAgICA3LjcuIFsyNzhdQXV0b2Rvd25sb2FkIGR1cmluZyBJTlBVVCBDb21tYW5kIEV4ZWN1dGlvbgogICAgICAgICA3LjguIFsyNzldQnVpbHQtaW4gSGVscCBmb3IgRnVuY3Rpb25zLgogICAgICAgICA3LjkuIFsyODBdVmFyaWFibGUgQXNzaWdubWVudHMKICAgICAgICAgNy45LjEuIFsyODFdQXNzaWdubWVudCBPcGVyYXRvcnMKICAgICAgICAgNy45LjIuIFsyODJdTmV3IEFzc2lnbm1lbnQgQ29tbWFuZHMKICAgICAgICAgNy4xMC4gWzI4M11BcnJheXMKICAgICAgICAgNy4xMC4xLiBbMjg0XUFycmF5IEluaXRpYWxpemVycwogICAgICAgICA3LjEwLjIuIFsyODVdVHVybmluZyBhIFN0cmluZyBpbnRvIGFuIEFycmF5IG9mIFdvcmRzCiAgICAgICAgIDcuMTAuMy4gWzI4Nl1BcnJheXMgb2YgRmlsZW5hbWVzCiAgICAgICAgIDcuMTAuNC4gWzI4N11BdXRvbWF0aWMgQXJyYXlzCiAgICAgICAgIDcuMTAuNS4gWzI4OF1Tb3J0aW5nIEFycmF5cwogICAgICAgICA3LjEwLjYuIFsyODldRGlzcGxheWluZyBBcnJheXMKICAgICAgICAgNy4xMC43LiBbMjkwXU90aGVyIEFycmF5IE9wZXJhdGlvbnMKICAgICAgICAgNy4xMC44LiBbMjkxXUhpbnRzIGZvciBVc2luZyBBcnJheXMKICAgICAgICAgNy4xMC45LiBbMjkyXURvLUl0LVlvdXJzZWxmIEFycmF5cwogICAgICAgICA3LjEwLjEwLiBbMjkzXUFzc29jaWF0aXZlIEFycmF5cwogICAgICAgICA3LjExLiBbMjk0XU9VVFBVVCBDb21tYW5kIEltcHJvdmVtZW50cwogICAgICAgICA3LjEyLiBbMjk1XUZ1bmN0aW9uIGFuZCBWYXJpYWJsZSBEaWFnbm9zdGljcwogICAgICAgICA3LjEzLiBbMjk2XVJldHVybiBWYWx1ZSBvZiBNYWNyb3MKICAgICAgICAgNy4xNC4gWzI5N11UaGUgQVNTRVJULCBGQUlMLCBhbmQgU1VDQ0VFRCBDb21tYW5kcy4KICAgICAgICAgNy4xNS4gWzI5OF1Vc2luZyBBbGFybXMKICAgICAgICAgNy4xNi4gWzI5OV1QYXNzaW5nIEFyZ3VtZW50cyB0byBDb21tYW5kIEZpbGVzCiAgICAgICAgIDcuMTcuIFszMDBdRGlhbG9ncyB3aXRoIFRpbWVkIFJlc3BvbnNlcwogICAgICAgICA3LjE4LiBbMzAxXUluY3JlYXNlZCBGbGV4aWJpbGl0eSBvZiBTV0lUQ0ggQ2FzZSBMYWJlbHMKICAgICAgICAgNy4xOS4gIlszMDJdS2VyYmFuZyIgU2NyaXB0cwogICAgICAgICA3LjIwLiBbMzAzXUlGIGFuZCBYSUYgU3RhdGVtZW50IFN5bnRheAogICAgICAgICA3LjIwLjEuIFszMDRdVGhlIElGL1hJRiBEaXN0aW5jdGlvbgogICAgICAgICA3LjIwLjIuIFszMDVdQm9vbGVhbiBFeHByZXNzaW9ucyAoVGhlIElGL1dISUxFIENvbmRpdGlvbikKICAgICAgICAgNy4yMS4gWzMwNl1TY3JlZW4gRm9ybWF0dGluZyBhbmQgQ3Vyc29yIENvbnRyb2wKICAgICAgICAgNy4yMi4gWzMwN11FdmFsdWF0aW5nIEFyaXRobWV0aWMgRXhwcmVzc2lvbnMKICAgICAgICAgNy4yMy4gWzMwOF1GbG9hdGluZy1Qb2ludCBBcml0aG1ldGljCiAgICAgICAgIDcuMjQuIFszMDldVHJhY2luZyBTY3JpcHQgRXhlY3V0aW9uCiAgICAgICAgIDcuMjUuIFszMTBdQ29tcGFjdCBTdWJzdHJpbmcgTm90YXRpb24KICAgICAgICAgNy4yNi4gWzMxMV1OZXcgV0FJVCBDb21tYW5kIE9wdGlvbnMKICAgICAgICAgNy4yNi4xLiBbMzEyXVdhaXRpbmcgZm9yIE1vZGVtIFNpZ25hbHMKICAgICAgICAgNy4yNi4yLiBbMzEzXVdhaXRpbmcgZm9yIEZpbGUgRXZlbnRzCiAgICAgICAgIDcuMjcuIFszMTRdUmVsYXhlZCBGT1IgYW5kIFNXSVRDSCBTeW50YXgKICAgICAoOCkgWzMxNV1VU0lORyBPVEhFUiBGSUxFIFRSQU5TRkVSIFBST1RPQ09MUwogICAgICg5KSBbMzE2XUNPTU1BTkQtTElORSBPUFRJT05TCiAgICAgICAgIDkuMC4gWzMxN11FeHRlbmRlZC1Gb3JtYXQgQ29tbWFuZC1MaW5lIE9wdGlvbnMKICAgICAgICAgOS4xLiBbMzE4XUNvbW1hbmQgTGluZSBQZXJzb25hbGl0aWVzCiAgICAgICAgIDkuMi4gWzMxOV1CdWlsdC1pbiBIZWxwIGZvciBDb21tYW5kIExpbmUgT3B0aW9ucwogICAgICAgICA5LjMuIFszMjBdTmV3IENvbW1hbmQtTGluZSBPcHRpb25zCiAgICAoMTApIFszMjFdQy1LRVJNSVQgQU5EIEctS0VSTUlUCgpJSUkuIFszMjJdQVBQRU5ESUNFUwoKSUlJLjEuIFszMjNdQ2hhcmFjdGVyIFNldCBUYWJsZXMKSUlJLjEuMS4gWzMyNF1UaGUgSGV3bGV0dCBQYWNrYXJkIFJvbWFuOCBDaGFyYWN0ZXIgU2V0CklJSS4xLjIuIFszMjVdR3JlZWsgQ2hhcmFjdGVyIFNldHMKSUlJLjEuMi4xLiBbMzI2XVRoZSBJU08gODg1OS03IExhdGluIC8gR3JlZWsgQWxwaGFiZXQKSUlJLjEuMi4yLiBbMzI3XVRoZSBFTE9UIDkyNyBDaGFyYWN0ZXIgU2V0CklJSS4xLjIuMy4gWzMyOF1QQyBDb2RlIFBhZ2UgODY5CklJSS4yLiBbMzI5XVVwZGF0ZWQgQ291bnRyeSBDb2RlcwoKSVYuIFszMzBdRVJSQVRBICYgQ09SUklHRU5EQTogQ29ycmVjdGlvbnMgdG8gIlVzaW5nIEMtS2VybWl0IiAybmQgRWRpdGlvbi4KVi4gWzMzMV1BRERJVElPTkFMIENPUFlSSUdIVCBOT1RJQ0VTCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkkuIEMtS0VSTUlUIERPQ1VNRU5UQVRJT04KCiAgIFRoZSB1c2VyIG1hbnVhbCBmb3IgQy1LZXJtaXQgaXM6CgogICAgIEZyYW5rIGRhIENydXogYW5kIENocmlzdGluZSBNLiBHaWFub25lLCBbMzMyXVVzaW5nIEMtS2VybWl0LCBTZWNvbmQKICAgICBFZGl0aW9uLCBEaWdpdGFsIFByZXNzIC8gQnV0dGVyd29ydGgtSGVpbmVtYW5uLCBXb2J1cm4sIE1BLCAxOTk3LAogICAgIDYyMiBwYWdlcywgSVNCTiAxLTU1NTU4LTE2NC0xLgoKICAgWzMzM11DTElDSyBIRVJFIGZvciByZXZpZXdzLgoKICAgVGhlIHByZXNlbnQgZG9jdW1lbnQgaXMgYSBzdXBwbGVtZW50IHRvIFVzaW5nIEMtS2VybWl0IDJuZCBFZCwgbm90IGEKICAgcmVwbGFjZW1lbnQgZm9yIGl0LgoKICAgVVMgc2luZ2xlLWNvcHkgcHJpY2U6ICQ1Mi45NTsgcXVhbnRpdHkgZGlzY291bnRzIGF2YWlsYWJsZS4gQXZhaWxhYmxlCiAgIGluIGJvb2tzdG9yZXMgb3IgZGlyZWN0bHkgZnJvbSBDb2x1bWJpYSBVbml2ZXJzaXR5OgoKICBUaGUgS2VybWl0IFByb2plY3QKICBDb2x1bWJpYSBVbml2ZXJzaXR5CiAgNjEyIFdlc3QgMTE1dGggU3RyZWV0CiAgTmV3IFlvcmsgTlkgIDEwMDI1LTc3OTkKICBVU0EKICBUZWxlcGhvbmU6ICsxICgyMTIpIDg1NC0zNzAzCiAgRmF4OiAgICAgICArMSAoMjEyKSA2NjItNjQ0MgoKICAgRG9tZXN0aWMgYW5kIG92ZXJzZWFzIG9yZGVycyBhY2NlcHRlZC4gUHJpY2U6IFVTICQ0NC45NSAoVVMsIENhbmFkYSwKICAgYW5kIE1leGljbykuIFNoaXBwaW5nOiAkNC4wMCB3aXRoaW4gdGhlIFVTQTsgJDE1LjAwIHRvIGFsbCBvdGhlcgogICBjb3VudHJpZXMuIE9yZGVycyBtYXkgYmUgcGFpZCBieSBNYXN0ZXJDYXJkIG9yIFZpc2EsIG9yIHByZXBhaWQgYnkKICAgY2hlY2sgaW4gVVMgZG9sbGFycy4gQWRkICQ2NSBiYW5rIGZlZSBmb3IgY2hlY2tzIG5vdCBkcmF3biBvbiBhIFVTCiAgIGJhbmsuIERvIG5vdCBpbmNsdWRlIHNhbGVzIHRheC4gSW5xdWlyZSBhYm91dCBxdWFudGl0eSBkaXNjb3VudHMuCgogICBZb3UgY2FuIGFsc28gb3JkZXIgYnkgcGhvbmUgZnJvbSB0aGUgcHVibGlzaGVyLCBEaWdpdGFsIFByZXNzIC8KICAgWzMzNF1CdXR0ZXJ3b3J0aC1IZWluZW1hbm4sIHdpdGggTWFzdGVyQ2FyZCwgVmlzYSwgb3IgQW1lcmljYW4KICAgRXhwcmVzczoKCiAgKzEgODAwIDM2Ni0yNjY1ICAgKFdvYnVybiwgTWFzc2FjaHVzZXR0cyBvZmZpY2UgZm9yIFVTQSAmIENhbmFkYSkKICArNDQgMTg2NSAzMTQ2MjcgICAoT3hmb3JkLCBFbmdsYW5kIGRpc3RyaWJ1dGlvbiBjZW50cmUgZm9yIFVLICYgRXVyb3BlKQogICs2MSAwMyA5MjQ1IDcxMTEgIChNZWxib3VybmUsIFZpYywgb2ZmaWNlIGZvciBBdXN0cmFsaWEgJiBOWikKICArNjUgMzU2LTE5NjggICAgICAoU2luZ2Fwb3JlIG9mZmljZSBmb3IgQXNpYSkKICArMjcgKDMxKSAyNjgzMTExICAoRHVyYmFuIG9mZmljZSBmb3IgU291dGggQWZyaWNhKQoKICAgQSBbMzM1XUdlcm1hbi1sYW5ndWFnZSBlZGl0aW9uIG9mIHRoZSBGaXJzdCBFZGl0aW9uIGlzIGFsc28gYXZhaWxhYmxlOgoKICAgICBGcmFuayBkYSBDcnV6IGFuZCBDaHJpc3RpbmUgTS4gR2lhbm9uZSwgQy1LZXJtaXQgLSBFaW5m/GhydW5nIHVuZAogICAgIFJlZmVyZW56LCBWZXJsYWcgSGVpbnogSGVpc2UsIEhhbm5vdmVyLCBHZXJtYW55ICgxOTk0KS4gSVNCTgogICAgIDMtODgyMjktMDIzLTQuIERldXRzY2ggdm9uIEdpc2JlcnQgVy4gU2Vsa2UuIFByaWNlOiBETSA4OCwwMC4KICAgICBWZXJsYWcgSGVpbnogSGVpc2UgR21iSCAmIENvLiBLRywgSGVsc3RvcmZlciBTdHJhc3NlIDcsIEQtMzA2MjUKICAgICBIYW5ub3Zlci4gVGVsLiArNDkgKDA1IDExKSA1MyA1Mi0wLCBGYXguICs0OSAoMDUgMTEpIDUzIDUyLTEgMjkuCgogICBUaGUgWzMzNl1LZXJtaXQgZmlsZSB0cmFuc2ZlciBwcm90b2NvbCBpcyBzcGVjaWZpZWQgaW46CgogICAgIEZyYW5rIGRhIENydXosIEtlcm1pdCwgQSBGaWxlIFRyYW5zZmVyIFByb3RvY29sLCBEaWdpdGFsIFByZXNzLAogICAgIEJlZGZvcmQsIE1BLCAxOTg3LCAzNzkgcGFnZXMsIElTQk4gMC05MzIzNzYtODgtNi4gVVMgc2luZ2xlLWNvcHkKICAgICBwcmljZTogJDM5Ljk1LiBBdmFpbGFiaWxpdHkgYXMgYWJvdmUuCgogICBOZXdzIGFuZCBhcnRpY2xlcyBhYm91dCBLZXJtaXQgc29mdHdhcmUgYW5kIHByb3RvY29sIGFyZSBwdWJsaXNoZWQKICAgcGVyaW9kaWNhbGx5IGluIHRoZSBqb3VybmFsLCBbMzM3XUtlcm1pdCBOZXdzLiBTdWJzY3JpcHRpb25zIGFyZSBmcmVlOwogICBjb250YWN0IENvbHVtYmlhIFVuaXZlcnNpdHkgYXQgdGhlIGFkZHJlc3MgYWJvdmUuCgogICBPbmxpbmUgbmV3cyBhYm91dCBLZXJtaXQgaXMgcHVibGlzaGVkIGluIHRoZQogICBbMzM4XWNvbXAucHJvdG9jb2xzLmtlcm1pdC5hbm5vdW5jZSBhbmQKICAgWzMzOV1jb21wLnByb3RvY29scy5rZXJtaXQubWlzYyBuZXdzZ3JvdXBzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpJSS4gTkVXIEZFQVRVUkVTCgogICBTdXBwb3J0IGZvciB0aGUgQmVsbCBMYWJzIFBsYW4gOSBvcGVyYXRpbmcgc3lzdGVtIHdhcyBhZGRlZCB0byB2ZXJzaW9uCiAgIDYuMCB0b28gbGF0ZSB0byBiZSBtZW50aW9uZWQgaW4gdGhlIGJvb2sgKGFsdGhvdWdoIGl0IGRvZXMgYXBwZWFyIG9uCiAgIHRoZSBjb3ZlcikuCgogICBTcGVjaWZpYyBjaGFuZ2VzIGFuZCBhZGRpdGlvbnMgYXJlIGdyb3VwZWQgdG9nZXRoZXIgYnkgbWFqb3IgdG9waWMsCiAgIHJvdWdobHkgY29ycmVzcG9uZGluZyB0byB0aGUgY2hhcHRlcnMgb2YgWzM0MF1Vc2luZyBDLUtlcm1pdC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAwLiBJTkNPTVBBVElCSUxJVElFUyBXSVRIIFBSRVZJT1VTIFJFTEVBU0VTCgogICAgMS4gQy1LZXJtaXQgNy4wIHVzZXMgRkFTVCBLZXJtaXQgcHJvdG9jb2wgc2V0dGluZ3MgYnkgZGVmYXVsdC4gVGhpcwogICAgICAgaW5jbHVkZXMgInVucHJlZml4aW5nIiBvZiBjZXJ0YWluIGNvbnRyb2wgY2hhcmFjdGVycy4gQmVjYXVzZSBvZgogICAgICAgdGhpcywgZmlsZSB0cmFuc2ZlcnMgdGhhdCB3b3JrZWQgd2l0aCBwcmV2aW91cyByZWxlYXNlcyBtaWdodCBub3QKICAgICAgIHdvcmsgaW4gdGhlIG5ldyByZWxlYXNlIChidXQgaXQgaXMgbW9yZSBsaWtlbHkgdGhhdCB0aGV5IHdpbGwKICAgICAgIHdvcmssIGFuZCBtdWNoIGZhc3RlcikuIElmIGEgdHJhbnNmZXIgZmFpbHMsIHlvdSdsbCBnZXQgYQogICAgICAgY29udGV4dC1zZW5zaXRpdmUgaGludCBzdWdnZXN0aW5nIHBvc3NpYmxlIGNhdXNlcyBhbmQgY3VyZXMuCiAgICAgICBVc3VhbGx5IFNFVCBQUkVGSVhJTkcgQUxMIGRvZXMgdGhlIHRyaWNrLgogICAgMi4gQy1LZXJtaXQgNy4wIHRyYW5zZmVycyBmaWxlcyBpbiBCSU5BUlkgbW9kZSBieSBkZWZhdWx0LiBUbyByZXN0b3JlCiAgICAgICB0aGUgcHJldmlvdXMgYmVoYXZpb3IsIHB1dCBTRVQgRklMRSBUWVBFIFRFWFQgaW4geW91ciBDLUtlcm1pdAogICAgICAgaW5pdGlhbGl6YXRpb24gZmlsZS4KICAgIDMuIE5vIG1hdHRlciB3aGV0aGVyIEZJTEUgVFlQRSBpcyBCSU5BUlkgb3IgVEVYVCBieSBkZWZhdWx0LCBDLUtlcm1pdAogICAgICAgNy4wIG5vdyBzd2l0Y2hlcyBiZXR3ZWVuIHRleHQgYW5kIGJpbmFyeSBtb2RlIGF1dG9tYXRpY2FsbHkgb24gYQogICAgICAgcGVyLWZpbGUgYmFzaXMgYWNjb3JkaW5nIHRvIHZhcmlvdXMgY3JpdGVyaWEsIGluY2x1ZGluZyAoYSkgd2hpY2gKICAgICAgIGtpbmQgb2YgcGxhdGZvcm0gaXMgb24gdGhlIG90aGVyIGVuZCBvZiB0aGUgY29ubmVjdGlvbiAoaWYga25vd24pLAogICAgICAgKGIpIHRoZSB2ZXJzaW9uIG9mIEtlcm1pdCBvbiB0aGUgb3RoZXIgZW5kLCBhbmQgKGMpIHRoZSBmaWxlJ3MKICAgICAgIG5hbWUgKHNlZSBbMzQxXVNlY3Rpb24gNCwgZXNwZWNpYWxseSBbMzQyXTQuMykuIFRvIGRpc2FibGUgdGhpcwogICAgICAgYXV0b21hdGljIHN3aXRjaGluZyBhbmQgcmVzdG9yZSB0aGUgZWFybGllciBiZWhhdmlvciwgcHV0IFNFVAogICAgICAgVFJBTlNGRVIgTU9ERSBNQU5VQUwgaW4geW91ciBDLUtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlLiBUbwogICAgICAgZGlzYWJsZSBhdXRvbWF0aWMgc3dpdGNoaW5nIGZvciBhIHBhcnRpY3VsYXIgdHJhbnNmZXIsIGluY2x1ZGUgYQogICAgICAgL1RFWFQgb3IgL0JJTkFSWSBzd2l0Y2ggd2l0aCB5b3VyIFNFTkQgb3IgR0VUIGNvbW1hbmQuCiAgICA0LiBUaGUgUkVTRU5EIGFuZCBSRUdFVCBjb21tYW5kcyBhdXRvbWF0aWNhbGx5IHN3aXRjaCB0byBiaW5hcnkgbW9kZTsKICAgICAgIHByZXZpb3VzbHkgaWYgUkVTRU5EIG9yIFJFR0VUIHdlcmUgYXR0ZW1wdGVkIHdoZW4gRklMRSBUWVBFIHdhcwogICAgICAgVEVYVCwgdGhlc2UgY29tbWFuZHMgd291bGQgZmFpbCBpbW1lZGlhdGVseSwgd2l0aCBhIG1lc3NhZ2UKICAgICAgIHRlbGxpbmcgeW91IHRoZXkgd29yayBvbmx5IHdoZW4gdGhlIEZJTEUgVFlQRSBpcyBCSU5BUlkuIE5vdyB0aGV5CiAgICAgICBzaW1wbHkgZG8gdGhpcyBmb3IgeW91LiBTZWUgWzM0M11TZWN0aW9uIDQuMjMgZm9yIGFkZGl0aW9uYWwKICAgICAgIChpbXBvcnRhbnQpIGluZm9ybWF0aW9uLgogICAgNS4gU0VUIFBSRUZJWElORyBDQVVUSU9VUyBhbmQgTUlOSU1BTCBub3cgYm90aCBwcmVmaXggbGluZWZlZWQgKDEwCiAgICAgICBhbmQgMTM4KSBpbiBjYXNlIHJsb2dpbiwgc3NoLCBvciBjdSBhcmUgImluIHRoZSBtaWRkbGUiLCBzaW5jZQogICAgICAgb3RoZXJ3aXNlIDxMRj5+IG1pZ2h0IGFwcGVhciBpbiBLZXJtaXQgcGFja2V0cywgYW5kIHRoaXMgd291bGQKICAgICAgIGNhdXNlIHJsb2dpbiwgc3NoLCBvciBjdSB0byBkaXNjb25uZWN0LCBzdXNwZW5kLGVzY2FwZSBiYWNrLCBvcgogICAgICAgb3RoZXJ3aXNlIHdyZWNrIHRoZSBmaWxlIHRyYW5zZmVyLiBYb24gYW5kIFhvZmYgYXJlIG5vdyBhbHdheXMKICAgICAgIHByZWZpeGVkIHRvbywgZXZlbiB3aGVuIFhvbi9Yb2ZmIGZsb3cgY29udHJvbCBpcyBub3QgaW4gZWZmZWN0LAogICAgICAgc2luY2UgdW5wcmVmaXhpbmcgdGhlbSBoYXMgcHJvdmVuIGRhbmdlcm91cyBvbiBUQ1AvSVAgY29ubmVjdGlvbnMuCiAgICA2LiBJbiBVTklYLCBWTVMsIFdpbmRvd3MsIGFuZCBPUy8yLCB0aGUgRElSRUNUT1JZIGNvbW1hbmQgaXMgYnVpbHQKICAgICAgIGludG8gQy1LZXJtaXQgaXRzZWxmIHJhdGhlciB0aGFuIGltcGxlbWVudGVkIGJ5IHJ1bm5pbmcgYW4KICAgICAgIGV4dGVybmFsIGNvbW1hbmQgb3IgcHJvZ3JhbS4gVGhlIGJ1aWx0LWluIGNvbW1hbmQgbWlnaHQgbm90IGJlaGF2ZQogICAgICAgdGhlIHdheSB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgZXh0ZXJuYWwgb25lIGRpZCwgYnV0IG1hbnkgb3B0aW9ucwogICAgICAgYXJlIGF2YWlsYWJsZSBmb3IgY3VzdG9taXphdGlvbi4gT2YgY291cnNlIHRoZSB1bmRlcmx5aW5nCiAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBjb21tYW5kIGNhbiBzdGlsbCBiZSBhY2Nlc3NlZCB3aXRoICIhIiwgIkAiLCBvcgogICAgICAgIlJVTiIgd2hlcmV2ZXIgdGhlIGluc3RhbGxhdGlvbiBkb2VzIG5vdCBmb3JiaWQuIEluIFVOSVgsIHRoZSAibHMiCiAgICAgICBjb21tYW5kIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBhcyAibHMiIGluIEMtS2VybWl0LiBTZWUKICAgICAgIFszNDRdU2VjdGlvbiA0LjUuMSBmb3IgZGV0YWlscy4KICAgIDcuIFNFTkQgPyBwcmludHMgYSBsaXN0IG9mIHN3aXRjaGVzIHJhdGhlciB0aGFuIGEgbGlzdCBvZiBmaWxlbmFtZXMuCiAgICAgICBJZiB5b3Ugd2FudCB0byBzZWUgYSBsaXN0IG9mIGZpbGVuYW1lcywgdXNlIGEgKHN5c3RlbS1kZXBlbmRlbnQpCiAgICAgICBjb25zdHJ1Y3Rpb24gc3VjaCBhcyBTRU5EIC4vPyAoZm9yIFVOSVgsIFdpbmRvd3MsIG9yIE9TLzIpLCBTRU5ECiAgICAgICBbXT8gKFZNUyksIGV0Yy4gU2VlIFszNDVdU2VjdGlvbnMgMS41IGFuZCBbMzQ2XTQuNy4xLgogICAgOC4gSW4gVU5JWCwgT1MtOSwgYW5kIEtlcm1pdCA5NSwgdGhlIHdpbGRjYXJkIGNoYXJhY3RlcnMgaW4gcHJldmlvdXMKICAgICAgIHZlcnNpb25zIHdlcmUgKiBhbmQgPy4gSW4gQy1LZXJtaXQgNy4wIHRoZXkgYXJlICosID8sIFssIF0sIHssIGFuZAogICAgICAgfSwgd2l0aCBkYXNoIHVzZWQgaW5zaWRlIFtdJ3MgdG8gZGVub3RlIHJhbmdlcyBhbmQgY29tbWEgdXNlZAogICAgICAgaW5zaWRlIHt9IHRvIHNlcGFyYXRlIGxpc3QgZWxlbWVudHMuIElmIHlvdSBuZWVkIHRvIGluY2x1ZGUgYW55IG9mCiAgICAgICB0aGVzZSBjaGFyYWN0ZXJzIGxpdGVyYWxseSBpbiBhIGZpbGVuYW1lLCBwcmVjZWRlIGVhY2ggb25lIHdpdGgKICAgICAgIGJhY2tzbGFzaCAoXCkuIFNlZSBbMzQ3XVNlY3Rpb24gNC45LgogICAgOS4gU0VUIFFVSUVUIHsgT04sIE9GRiB9IGlzIG5vdyBvbiB0aGUgY29tbWFuZCBzdGFjaywganVzdCBsaWtlIFNFVAogICAgICAgSU5QVVQgQ0FTRSwgU0VUIENPVU5ULCBTRVQgTUFDUk8gRVJST1IsIGV0YywgYXMgZGVzY3JpYmVkIG9uIHAuNDU4CiAgICAgICBvZiBbMzQ4XVVzaW5nIEMtS2VybWl0LCAybmQgRWRpdGlvbi4gVGhpcyBhbGxvd3MgYW55IG1hY3JvIG9yCiAgICAgICBjb21tYW5kIGZpbGUgdG8gU0VUIFFVSUVUIE9OIG9yIE9GRiB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IHNhdmluZwogICAgICAgYW5kIHJlc3RvcmluZyB0aGUgZ2xvYmFsIFFVSUVUIHZhbHVlLiBGb3IgZXhhbXBsZSwgdGhpcyBsZXRzIHlvdQogICAgICAgd3JpdGUgYSBzY3JpcHQgdGhhdCB0cmllcyBTRVQgTElORSBvbiBsb3RzIG9mIGRldmljZXMgdW50aWwgaXQKICAgICAgIGZpbmRzIG9uZSBmcmVlIHdpdGhvdXQgc3Bld2luZyBvdXQgbG9hZHMgb2YgZXJyb3IgbWVzc2FnZXMsIGFuZAogICAgICAgYWxzbyB3aXRob3V0IGRpc3R1cmJpbmcgdGhlIGdsb2JhbCBRVUlFVCBzZXR0aW5nLCB3aGF0ZXZlciBpdCB3YXMuCiAgIDEwLiBCZWNhdXNlIG9mIHRoZSBuZXcgIi4iIG9wZXJhdG9yICh3aGljaCBpbnRyb2R1Y2VzIGFzc2lnbm1lbnRzKSwKICAgICAgIG1hY3JvcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoICIuIiBjYW4gbm90IGJlIGludm9rZWQgImJ5IG5hbWUiLgogICAgICAgSG93ZXZlciwgdGhleSBzdGlsbCBjYW4gYmUgaW52b2tlZCB3aXRoIERPLgogICAxMS4gVGhlIHN5bnRheCBvZiB0aGUgRVZBTFVBVEUgY29tbWFuZCBoYXMgY2hhbmdlZC4gU2VlIFszNDldU2VjdGlvbgogICAgICAgNy45LjIuIFRvIHJlc3RvcmUgdGhlIHByZXZpb3VzIHN5bnRheCwgdXNlIFNFVCBFVkFMVUFURSBPTEQuCiAgIDEyLiBUaGUgXHYoZGlyZWN0b3J5KSB2YXJpYWJsZSBub3cgaW5jbHVkZXMgdGhlIHRyYWlsaW5nIGRpcmVjdG9yeQogICAgICAgc2VwYXJhdG9yOyBpbiBwcmV2aW91cyByZWxlYXNlcyBpdCBkaWQgbm90LiBUaGlzIGlzIHRvIGFsbG93CiAgICAgICBjb25zdHJ1Y3Rpb25zIHN1Y2ggYXM6CiAgY2QgXHYoZGlyKWRhdGEudG1wCiAgICAgICB0byB3b3JrIGFjcm9zcyBwbGF0Zm9ybXMgdGhhdCBtaWdodCBoYXZlIGRpZmZlcmVudCBkaXJlY3RvcnkKICAgICAgIG5vdGF0aW9uLCBzdWNoIGFzIFVOSVgsIFdpbmRvd3MsIGFuZCBWTVMuCiAgIDEzLiBQcmlvciB0byBDLUtlcm1pdCA3LjAsIHRoZSBGTE9XLUNPTlRST0wgc2V0dGluZyB3YXMgZ2xvYmFsIGFuZAogICAgICAgc3RpY2t5LiBJbiBDLUtlcm1pdCA3LjAsIHRoZXJlIGlzIGFuIGFycmF5IG9mIGRlZmF1bHQgZmxvdy1jb250cm9sCiAgICAgICB2YWx1ZXMgZm9yIGVhY2gga2luZCBvZiBjb25uZWN0aW9uLCB0aGF0IGFyZSBhcHBsaWVkIGF1dG9tYXRpY2FsbHkKICAgICAgIGF0IFNFVCBMSU5FL1BPUlQvSE9TVCB0aW1lLiBUaHVzIGEgU0VUIEZMT1cgY29tbWFuZCBnaXZlbiBiZWZvcmUKICAgICAgIFNFVCBMSU5FL1BPUlQvSE9TVCBpcyBsaWtlbHkgdG8gYmUgdW5kb25lLiBUaGVyZWZvcmUgU0VUIEZMT1cgY2FuCiAgICAgICBiZSBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIGRlc2lyZWQgZWZmZWN0IG9ubHkgaWYgZ2l2ZW4gYWZ0ZXIgdGhlCiAgICAgICBTRVQgTElORS9QT1JUL0hPU1QgY29tbWFuZC4KICAgMTQuIENoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gd29ya3MgZGlmZmVyZW50bHkgaW4gdGhlIFRSQU5TTUlUCiAgICAgICBjb21tYW5kIHdoZW4gKGEpIHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQgaXMgbm90IHRoZSBzYW1lIGFzIHRoZQogICAgICAgbG9jYWwgZW5kIG9mIHRoZSB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0LCBvciAoYikgd2hlbiB0aGUgdGVybWluYWwKICAgICAgIGNoYXJhY3Rlci1zZXQgaXMgVFJBTlNQQVJFTlQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS4gUFJPR1JBTSBBTkQgRklMRSBNQU5BR0VNRU5UIEFORCBDT01NQU5EUwoKICAxLjAuIEJ1ZyBGaXhlcwoKICAgVGhlIGZvbGxvd2luZyBwYXRjaGVzIHdlcmUgaXNzdWVkIHRvIGNvcnJlY3QgYnVncyBpbiBDLUtlcm1pdCA2LjAuCiAgIFRoZXNlIGFyZSBkZXNjcmliZWQgaW4gZGV0YWlsIGluIHRoZSA2LjAgUEFUQ0hFUyBmaWxlLiBBbGwgb2YgdGhlc2UKICAgZml4ZXMgaGF2ZSBiZWVuIGluY29ycG9yYXRlZCBpbiBDLUtlcm1pdCA2LjEgKG5ldmVyIHJlbGVhc2VkIGV4Y2VwdCBhcwogICBLOTUgMS4xLjE2LTE3KSBhbmQgNy4wLgoKIDAwMDEgICBBbGwgVU5JWCAgICAgICAgIEMtS2VybWl0IG1pc2hhbmRsZXMgdGltZXN0YW1wcyBvbiBmaWxlcyBiZWZvcmUgMTk3MAogMDAwMiAgIFNvbGFyaXMgMi41KysgICAgQ29tcGlsYXRpb24gZXJyb3Igb24gU29sYXJpcyAyLjUgd2l0aCBQcm8gQwogMDAwMyAgIEFsbCBWTVMgICAgICAgICAgQ0tFUk1JVC5JTkkgRml4IGZvciBWTVMKIDAwMDQgICBWTVMvVkFYL1VDWCAyLjAgIEMtS2VybWl0IDYuMCBjYW4ndCBURUxORVQgb24gVkFYL1ZNUyB3aXRoIFVDWCAyLjAKIDAwMDUgICBBbGwgICAgICAgICAgICAgIEMtS2VybWl0IE1pZ2h0IFNlbmQgUGFja2V0cyBPdXRzaWRlIFdpbmRvdwogMDAwNiAgIEFsbCAgICAgICAgICAgICAgTU9WRSBmcm9tIFNFTkQtTElTVCBkb2VzIG5vdCBkZWxldGUgb3JpZ2luYWwgZmlsZXMKIDAwMDcgICBTb2xhcmlzIDIuNSsrICAgIEhpZ2hlciBzZXJpYWwgc3BlZWRzIG9uIFNvbGFyaXMgMi41CiAwMDA4ICAgQWxsICAgICAgICAgICAgICBDLUtlcm1pdCBhcHBsaWNhdGlvbiBmaWxlIG5hbWUgY2FuJ3QgY29udGFpbiBzcGFjZXMKIDAwMDkgICBBVCZUIDczMDAgVU5JWFBDIHNldHVpZCBhbmQgaGFyZHdhcmUgZmxvdy1jb250cm9sIHByb2JsZW1zCiAwMDEwICAgTGludXggb24gQWxwaGEgICBQYXRjaCB0byBtYWtlIGNrdXRpby5jIGNvbXBpbGUgb24gTGludXgvQWxwaGEKIDAwMTEgICBPUy05LzY4MDAwIDIuNCAgIFBhdGNoIHRvIG1ha2UgY2s5Y29uLmMgY29tcGlsZSBvbiBPUy05LzY4MDAwIDIuNAogMDAxMiAgIE1XIENvaGVyZW50IDQuMiAgUGF0Y2hlcyBmb3Igc3VjY2Vzc2Z1bCBidWlsZCBvbiBDb2hlcmVudCA0LjIKIDAwMTMgICBTSU5JWC1ZIDUuNDMgICAgICJkZWxheSIgdmFyaWFibGUgY29uZmxpY3RzIHdpdGggPHN5cy9jbG9jay5oPgogMDAxNCAgIFZNUy9WQVgvQ01VLUlQICAgU3ViamVjdDogUGF0Y2hlcyBmb3IgVkFYL1ZNUyA1LnggKyBDTVUtSVAKIDAwMTUgICBBbGwgICAgICAgICAgICAgIFhFQ0hPIGRvZXNuJ3QgZmx1c2ggaXRzIG91dHB1dAogMDAxNiAgIFZNUyAgICAgICAgICAgICAgQ0QgYW5kIG90aGVyIGRpcmVjdG9yeSBvcGVyYXRpb25zIG1pZ2h0IG5vdCB3b3JrCiAwMDE3ICAgTGludXggMS4yLngrKyAgICBVc2Ugc3RhbmRhcmQgUE9TSVggaW50ZXJmYWNlIGZvciBoaWdoIHNlcmlhbCBzcGVlZHMKIDAwMTggICBVTklYICAgICAgICAgICAgIFNFVCBXSUxEQ0FSRC1FWFBBTlNJT04gU0hFTEwgZHVtcHMgY29yZQogMDAxOSAgIEFsbCAgICAgICAgICAgICAgSGF5ZXMgVi4zNCBtb2RlbSBpbml0IHN0cmluZyBwcm9ibGVtCiAwMDIwICAgQWxsICAgICAgICAgICAgICBSRUFEIGNvbW1hbmQgZG9lcyBub3QgZmFpbCBpZiBmaWxlIG5vdCBvcGVuCiAwMDIxICAgQWxsICAgICAgICAgICAgICBQcm9ibGVtcyB3aXRoIGxvbmcgZnVuY3Rpb24gYXJndW1lbnRzCiAwMDIyICAgQWxsICAgICAgICAgICAgICBDZXJ0YWluIFxmdW5jdGlvbigpcyBjYW4gbWlzYmVoYXZlCiAwMDIzICAgQWxsICAgICAgICAgICAgICBYIE1PRCAwIGNyYXNoZXMgcHJvZ3JhbQogMDAyNCAgIEFsbCAgICAgICAgICAgICAgSW50ZXJuYWwgYnVsbGV0cHJvb2ZpbmcgZm9yIGxvd2VyKCkgZnVuY3Rpb24KIDAwMjUgICBPcGVuQlNEICAgICAgICAgIFJlYWwgT3BlbkJTRCBzdXBwb3J0IGZvciBDLUtlcm1pdCA2LjAKIDAwMjYgICBBbGwgICAgICAgICAgICAgIEluY29ycmVjdCBjaGVja3MgZm9yIG1hY3JvL2NvbW1hbmQtZmlsZSBuZXN0aW5nIGRlcHRoCiAwMDI3ICAgQWxsICAgICAgICAgICAgICBBTlNXRVIgZG9lc24ndCBhdXRvbWF0aWNhbGx5IENPTk5FQ1QKIDAwMjggICBBbGwgICAgICAgICAgICAgIE92ZXJ6ZWFsb3VzIEVYSVQgd2FybmluZwogMDAyOSAgIEFsbCAgICAgICAgICAgICAgT1VUUFVUIGRvZXNuJ3QgZWNobyB3aGVuIERVUExFWCBpcyBIQUxGCiAwMDMwICAgQWxsICAgICAgICAgICAgICBNaW5vciBwcm9ibGVtcyB3aXRoIFJFTU9URSBESVJFQ1RPUlkvREVMRVRFL2V0YwogMDAzMSAgIEFsbCAgICAgICAgICAgICAgQ0hFQ0sgY29tbWFuZCBicm9rZW4KIDAwMzIgICBBbGwgICAgICAgICAgICAgIFByb2JsZW0gd2l0aCBTRVQgVFJBTlNNSVQgRUNITwogMDAzMyAgIFVOSVgsIFZNUywgZXRjICAgSEVMUCBTRVQgU0VSVkVSIHNheXMgdG9vIG11Y2gKIDAwMzQgICBBbGwgICAgICAgICAgICAgIFJFQUQgYW5kICFSRUFEIHRvbyBwaWNreSBhYm91dCBsaW5lIHRlcm1pbmF0b3JzCiAwMDM1ICAgQWxsICAgICAgICAgICAgICBFTkQgZnJvbSBpbnNpZGUgU1dJVENIIGRvZXNuJ3Qgd29yawogMDAzNiAgIEFsbCAgICAgICAgICAgICAgUHJvYmxlbSB0ZWxuZXR0aW5nIHRvIG11bHRpaG9tZWQgaG9zdHMKIDAwMzcgICBBbGwgICAgICAgICAgICAgIFJlZGlyZWN0aW9uIGZhaWx1cmVzIGluIFJFTU9URSB4eHggPiBmaWxlCgogICBSRURJUkVDVCB3YXMgbWlzc2luZyBpbiBtYW55IFVOSVggQy1LZXJtaXQgaW1wbGVtZW50YXRpb25zOyBpbiB2ZXJzaW9uCiAgIDcuMCwgaXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBpbiBhbGwgb2YgdGhlbS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAxLjEuIENvbW1hbmQgQ29udGludWF0aW9uCgogICBDb21tZW50cyB0aGF0IHN0YXJ0IHdpdGggIjsiIG9yICIjIiBjYW4gbm8gbG9uZ2VyIGJlIGNvbnRpbnVlZC4gSW46CgogIDsgdGhpcyBpcyBhIGNvbW1lbnQgLQogIGVjaG8gYmxhaAoKICAgdGhlIEVDSE8gY29tbWFuZCB3aWxsIGV4ZWN1dGUsIHJhdGhlciB0aGFuIGJlaW5nIHRha2VuIGFzIGEKICAgY29udGludWF0aW9uIG9mIHRoZSBwcmVjZWRpbmcgY29tbWVudCBsaW5lLiBUaGlzIGFsbG93cyBlYXN5CiAgICJjb21tZW50aW5nIG91dCIgb2YgY29tbWFuZHMgZnJvbSBtYWNybyBkZWZpbml0aW9ucy4KCiAgIEhvd2V2ZXIsIHRoZSB0ZXh0IG9mIHRoZSBDT01NRU5UIGNvbW1hbmQgY2FuIHN0aWxsIGJlIGNvbnRpbnVlZCBvbnRvCiAgIHN1YnNlcXVlbnQgbGluZXM6CgogIGNvbW1lbnQgdGhpcyBpcyBhIGNvbW1lbnQgLQogIGVjaG8gYmxhaAoKICAgQXMgb2YgdmVyc2lvbiA2LjAsIGJhY2tzbGFzaCBpcyBubyBsb25nZXIgYSB2YWxpZCBjb250aW51YXRpb24KICAgY2hhcmFjdGVyLiBPbmx5IGh5cGhlbiBzaG91bGQgYmUgdXNlZCBmb3IgY29tbWFuZCBjb250aW51YXRpb24uIFRoaXMKICAgaXMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBpc3N1ZSBjb21tYW5kcyBsaWtlICJjZCBhOlwiIG9uIERPUy1saWtlCiAgIHN5c3RlbXMuCgogICBBcyBvZiB2ZXJzaW9uIDcuMDoKCiAgICAgKiBZb3UgY2FuIHF1b3RlIGEgZmluYWwgZGFzaCB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgYSBjb250aW51YXRpb24KICAgICAgIGNoYXJhY3RlcjoKICBlY2hvIGZvb1wtCiAgICAgICBUaGlzIHByaW50cyAiZm9vLSIuIFRoZSBjb21tYW5kIGlzIG5vdCBjb250aW51ZWQuCiAgICAgKiBZb3UgY2FuIGVudGVyIGNvbW1hbmRzIHN1Y2ggYXM6CiAgZWNobyBmb28gLSA7IHRoaXMgaXMgYSBjb21tZW50CiAgICAgICBpbnRlcmFjdGl2ZWx5IGFuZCB0aGV5IGFyZSBwcm9wZXJseSB0cmVhdGVkIGFzIGNvbnRpbnVlZCBjb21tYW5kcy4KICAgICAgIFByZXZpb3VzbHkgdGhpcyB3b3JrZWQgb25seSBpbiBjb21tYW5kIGZpbGVzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEuMi4gRWRpdG9yIEludGVyZmFjZQoKICAgU0VUIEVESVRPUiBuYW1lIFsgb3B0aW9ucyBdCiAgICAgICAgICBMZXRzIHlvdSBzcGVjaWZ5IGEgdGV4dC1lZGl0aW5nIHByb2dyYW0uIFRoZSBuYW1lIGNhbiBiZSBhCiAgICAgICAgICBmdWxseSBzcGVjaWZpZWQgcGF0aG5hbWUgbGlrZSAvdXNyL2xvY2FsL2Jpbi9lbWFjczE5L2VtYWNzLCBvcgogICAgICAgICAgaXQgY2FuIGJlIHRoZSBuYW1lIG9mIGFueSBwcm9ncmFtIGluIHlvdXIgUEFUSCwgZS5nLiAic2V0CiAgICAgICAgICBlZGl0b3IgZW1hY3MiLiBJbiBWTVMsIGl0IG11c3QgYmUgYSBEQ0wgY29tbWFuZCBsaWtlICJlZGl0IiwKICAgICAgICAgICJlZGl0L3RwdSIsICJlbWFjcyIsIGV0Yy4gSWYgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgRURJVE9SIGlzCiAgICAgICAgICBkZWZpbmVkIHdoZW4gS2VybWl0IHN0YXJ0cywgaXRzIHZhbHVlIGlzIHRoZSBkZWZhdWx0IGVkaXRvci4KICAgICAgICAgIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IG9wdGlvbnMgdG8gYmUgaW5jbHVkZWQgb24gdGhlIGVkaXRvcgogICAgICAgICAgY29tbWFuZCBsaW5lLiBSZXR1cm5zIHRvIEtlcm1pdCB3aGVuIHRoZSBlZGl0b3IgZXhpdHMuCgogICBFRElUIFsgZmlsZW5hbWUgXQogICAgICAgICAgSWYgdGhlIEVESVQgY29tbWFuZCBpcyBnaXZlbiB3aXRob3V0IGEgZmlsZW5hbWUsIHRoZW4gaWYgYQogICAgICAgICAgcHJldmlvdXMgZmlsZW5hbWUgaGFkIGJlZW4gZ2l2ZW4gdG8gYW4gRURJVCBjb21tYW5kLCBpdCBpcwogICAgICAgICAgdXNlZDsgaWYgbm90LCB0aGUgZWRpdG9yIGlzIHN0YXJ0ZWQgd2l0aG91dCBhIGZpbGUuIElmIGEKICAgICAgICAgIGZpbGVuYW1lIGlzIGdpdmVuLCB0aGUgZWRpdG9yIGlzIHN0YXJ0ZWQgb24gdGhhdCBmaWxlLCBhbmQgdGhlCiAgICAgICAgICBmaWxlbmFtZSBpcyByZW1lbWJlcmVkIGZvciBzdWJzZXF1ZW50IEVESVQgY29tbWFuZHMuCgogICBTSE9XIEVESVRPUgogICAgICAgICAgRGlzcGxheXMgdGhlIGZ1bGwgcGF0aG5hbWUgb2YgeW91ciB0ZXh0IGVkaXRvciwgaWYgYW55LCBhbG9uZwogICAgICAgICAgd2l0aCBhbnkgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGFuZCB0aGUgZmlsZSBtb3N0IHJlY2VudGx5CiAgICAgICAgICBlZGl0ZWQgKGFuZCB0aGVyZWZvcmUgdGhlIGRlZmF1bHQgZmlsZW5hbWUgZm9yIHlvdXIgbmV4dCBFRElUCiAgICAgICAgICBjb21tYW5kKS4KCiAgIFJlbGF0ZWQgdmFyaWFibGVzOiBcdihlZGl0b3IpLCBcdihlZGl0b3B0cyksIFx2KGVkaXRmaWxlKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAxLjMuIFdlYiBCcm93c2VyIGFuZCBGVFAgSW50ZXJmYWNlCgogICBDLUtlcm1pdCBpbmNsdWRlcyBhbiBGVFAgY29tbWFuZCwgd2hpY2ggc2ltcGx5IHJ1bnMgdGhlIEZUUCBwcm9ncmFtOwogICBDLUtlcm1pdCBkb2VzIG5vdCBpbmNsdWRlIGFueSBidWlsdC1pbiBzdXBwb3J0IGZvciBJbnRlcm5ldCBGaWxlCiAgIFRyYW5zZmVyIFByb3RvY29sLCBub3IgYW55IG1ldGhvZCBmb3IgaW50ZXJhY3RpbmcgZGlyZWN0bHkgd2l0aCBhbiBGVFAKICAgc2VydmVyLiBJbiB2ZXJzaW9uIDcuMCwgaG93ZXZlciwgQy1LZXJtaXQgbGV0cyB5b3Ugc3BlY2lmeSB5b3VyIEZUUAogICBjbGllbnQ6CgogICBTRVQgRlRQLUNMSUVOVCBbIG5hbWUgWyBvcHRpb25zIF0gXQogICAgICAgICAgVGhlIG5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIEZUUCBleGVjdXRhYmxlLiBJbiBVTklYLCBXaW5kb3dzLAogICAgICAgICAgb3IgT1MvMiwgaXQgY2FuIGJlIHRoZSBmaWxlbmFtZSBvZiBhbnkgZXhlY3V0YWJsZSBwcm9ncmFtIGluCiAgICAgICAgICB5b3VyIFBBVEggKGUuZy4gImZ0cC5leGUiIGluIFdpbmRvd3MsICJmdHAiIGluIFVOSVgpOyBlbHNld2hlcmUKICAgICAgICAgIChvciBpZiB5b3UgZG8gbm90IGhhdmUgYSBQQVRIIGRlZmluaXRpb24pLCBpdCBtdXN0IGJlIHRoZSBmdWxseQogICAgICAgICAgc3BlY2lmaWVkIHBhdGhuYW1lIG9mIHRoZSBGVFAgcHJvZ3JhbS4gSWYgdGhlIG5hbWUgY29udGFpbnMgYW55CiAgICAgICAgICBzcGFjZXMsIGVuY2xvc2UgaXQgYnJhY2VzLiBJbmNsdWRlIGFueSBvcHRpb25zIGFmdGVyIHRoZQogICAgICAgICAgZmlsZW5hbWU7IHRoZXNlIGRlcGVuZCB0aGUgcGFydGljdWxhciBmdHAgY2xpZW50LgoKICAgVGhlIFdlYiBicm93c2VyIGludGVyZmFjZSBpcyBjb3ZlcmVkIGluIHRoZSBmb2xsb3dpbmcgc3Vic2VjdGlvbnMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAxLjMuMS4gSW52b2tpbmcgeW91ciBCcm93c2VyIGZyb20gQy1LZXJtaXQKCiAgIEJST1dTRSBbIHVybCBdCiAgICAgICAgICBTdGFydHMgeW91ciBwcmVmZXJyZWQgV2ViIGJyb3dzZXIgb24gdGhlIFVSTCwgaWYgb25lIGlzIGdpdmVuLAogICAgICAgICAgb3RoZXJ3aXNlIG9uIHRoZSBtb3N0IHJlY2VudGx5IGdpdmVuIFVSTCwgaWYgYW55LiBSZXR1cm5zIHRvCiAgICAgICAgICBLZXJtaXQgd2hlbiB0aGUgYnJvd3NlciBleGl0cy4KCiAgIFNFVCBCUk9XU0VSIFsgbmFtZSBbIG9wdGlvbnMgXSBdCiAgICAgICAgICBVc2UgdGhpcyBjb21tYW5kIHRvIHNwZWNpZnkgdGhlIG5hbWUgb2YgeW91ciBXZWIgYnJvd3NlcgogICAgICAgICAgcHJvZ3JhbSwgZm9yIGV4YW1wbGU6ICJzZXQgYnJvd3NlciBseW54Ii4gVGhlIG5hbWUgbXVzdCBiZSBpbgogICAgICAgICAgeW91ciBQQVRILCBvciBlbHNlIGl0IG11c3QgYmUgYSBmdWxseSBzcGVjaWZpZWQgZmlsZW5hbWU7IGluCiAgICAgICAgICBWTVMgaXQgbXVzdCBiZSBhIERDTCBjb21tYW5kLgoKICAgU0hPVyBCUk9XU0VSCiAgICAgICAgICBEaXNwbGF5cyB0aGUgY3VycmVudCBicm93c2VyLCBvcHRpb25zLCBhbmQgbW9zdCByZWNlbnQgVVJMLgoKICAgUmVsYXRlZCB2YXJpYWJsZXM6IFx2KGJyb3dzZXIpLCBcdihicm93c29wdHMpLCBcdihicm93c3VybCkuCgogICBBbHNvIHNlZSBbMzUwXVNlY3Rpb24gMi4xNTogQ29udGFjdGluZyBXZWIgU2VydmVycyB3aXRoIHRoZSBIVFRQCiAgIENvbW1hbmQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAxLjMuMi4gSW52b2tpbmcgQy1LZXJtaXQgZnJvbSB5b3VyIEJyb3dzZXIKCiAgIFRoZSBtZXRob2QgZm9yIGRvaW5nIHRoaXMgZGVwZW5kcywgb2YgY291cnNlLCBvbiB5b3VyIGJyb3dzZXIuIEhlcmUKICAgYXJlIHNvbWUgZXhhbXBsZXM6CgogICBOZXRzY2FwZSBvbiBVTklYIChYLWJhc2VkKQogICAgICAgICAgSW4gdGhlIE9wdGlvbnMtPkFwcGxpY2F0aW9ucyBzZWN0aW9uLCBzZXQgeW91ciBUZWxuZXQKICAgICAgICAgIGFwcGxpY2F0aW9uIHRvOgoKICB4dGVybSAtZSAvdXNyL2xvY2FsL2Jpbi9rZXJtaXQva2VybWl0IC1KICVoICVwCgogICAgICAgICAgKHJlcGxhY2UgIi91c3IvbG9jYWwvYmluL2tlcm1pdC9rZXJtaXQiIGJ5IEMtS2VybWl0J3MgYWN0dWFsCiAgICAgICAgICBwYXRobmFtZSkuIC1KIGlzIEMtS2VybWl0J3MgY29tbWFuZC1saW5lIG9wdGlvbiB0byAiYmUgbGlrZQogICAgICAgICAgVGVsbmV0IjsgJWggYW5kICVwIGFyZSBOZXRzY2FwZSBwbGFjZWhvbGRlcnMgZm9yIGhvc3RuYW1lIGFuZAogICAgICAgICAgcG9ydC4KCiAgIEx5bnggb24gVU5JWAogICAgICAgICAgQXMgZmFyIGFzIHdlIGtub3csIHRoaXMgY2FuIGJlIGRvbmUgb25seSBhdCBjb21waWxlIHRpbWUuIEFkZAogICAgICAgICAgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZSBMeW54IHVzZXJkZWZzLmggZmlsZSBiZWZvcmUgYnVpbGRpbmcKICAgICAgICAgIHRoZSBMeW54IGJpbmFyeToKCiAgI2RlZmluZSBURUxORVRfQ09NTUFORCAiL29wdC9iaW4va2VybWl0IC1KIgoKICAgICAgICAgIEFuZCB0aGVuIGFkZCBsaW5lcyBsaWtlIHRoZSBmb2xsb3dpbmcgdG8gdGhlIEx5bnguY2ZnIGZpbGU6CgogIERPV05MT0FERVI6S2VybWl0IGJpbmFyeSBkb3dubG9hZDovb3B0L2Jpbi9rZXJtaXQgLWkgLVYgLXMgJXMgLWEgJXM6VFJVRQogIERPV05MT0FERVI6S2VybWl0IHRleHQgZG93bmxvYWQ6L29wdC9iaW4va2VybWl0IC1zICVzIC1hICVzOlRSVUUKCiAgVVBMT0FERVI6S2VybWl0IGJpbmFyeSB1cGxvYWQ6L29wdC9iaW4va2VybWl0IC1pIC1yIC1hICVzOlRSVUUKICBVUExPQURFUjpLZXJtaXQgdGV4dCB1cGxvYWQ6L29wdC9iaW4va2VybWl0IC1yIC1hICVzOlRSVUUKICBVUExPQURFUjpLZXJtaXQgdGV4dCBnZXQ6L29wdC9iaW4va2VybWl0IC1nICVzOlRSVUUKICBVUExPQURFUjpLZXJtaXQgYmluYXJ5IGdldDovb3B0L2Jpbi9rZXJtaXQgLWlnICVzOlRSVUUKCiAgIEJ1dCBub25lIG9mIHRoZSBhYm92ZSBpcyBuZWNlc3NhcnkgaWYgeW91IG1ha2UgQy1LZXJtaXQgeW91ciBkZWZhdWx0CiAgIFRlbG5ldCBjbGllbnQsIHdoaWNoIHlvdSBjYW4gZG8gYnkgbWFraW5nIGEgc3ltbGluayBjYWxsZWQgJ3RlbG5ldCcgdG8KICAgdGhlIEMtS2VybWl0IDcuMCBiaW5hcnkuIFNlZSBbMzUxXVNlY3Rpb24gOS4xIGZvciBkZXRhaWxzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEuNC4gQ29tbWFuZCBFZGl0aW5nCgogICBDdHJsLVcgKCJXb3JkIGRlbGV0ZSIpIHdhcyBjaGFuZ2VkIGluIDcuMCB0byBkZWxldGUgYmFjayB0byB0aGUKICAgcHJldmlvdXMgbm9uLWFscGhhbnVtZXJpYywgcmF0aGVyIHRoYW4gYWxsIHRoZSB3YXkgYmFjayB0byB0aGUKICAgcHJldmlvdXMgc3BhY2UuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS41LiBDb21tYW5kIFN3aXRjaGVzCgogICBBcyBvZiB2ZXJzaW9uIDcuMCwgQy1LZXJtaXQncyBjb21tYW5kIHBhcnNlciBzdXBwb3J0cyBhIG5ldyB0eXBlIG9mCiAgIGZpZWxkLCBjYWxsZWQgYSAic3dpdGNoIi4gVGhpcyBpcyBhbiBvcHRpb25hbCBjb21tYW5kIG1vZGlmaWVyLgoKICAgIDEuNS4xLiBHZW5lcmFsIFN3aXRjaCBTeW50YXgKCiAgIEEgc3dpdGNoIGlzIGEga2V5d29yZCBiZWdpbm5pbmcgd2l0aCBhIHNsYXNoICgvKS4gSWYgaXQgdGFrZXMgYSB2YWx1ZSwKICAgdGhlbiB0aGUgdmFsdWUgaXMgYXBwZW5kZWQgdG8gaXQgKHdpdGggbm8gaW50ZXJ2ZW5pbmcgc3BhY2VzKSwKICAgc2VwYXJhdGVkIGJ5IGEgY29sb24gKDopIG9yIGVxdWFsIHNpZ24gKD0pLiBEZXBlbmRpbmcgb24gdGhlIHN3aXRjaCwKICAgdGhlIHZhbHVlIG1heSBiZSBhIG51bWJlciwgYSBrZXl3b3JkLCBhIGZpbGVuYW1lLCBhIGRhdGUvdGltZSwgZXRjLgogICBFeGFtcGxlczoKCiAgc2VuZCBvb2ZhLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTm8gc3dpdGNoZXMKICBzZW5kIC9iaW5hcnkgb29mYS56aXAgICAgICAgICAgICAgICAgICAgICAgOyBBIHN3aXRjaCB3aXRob3V0IGEgdmFsdWUKICBzZW5kIC9wcm90b2NvbDp6bW9kZW0gb29mYS56aXAgICAgICAgICAgICAgOyBBIHN3aXRjaCB3aXRoIGEgdmFsdWUgKDopCiAgc2VuZCAvcHJvdG9jb2w9em1vZGVtIG9vZmEuemlwICAgICAgICAgICAgIDsgQSBzd2l0Y2ggd2l0aCBhIHZhbHVlICg9KQogIHNlbmQgL3RleHQgL2RlbGV0ZSAvYXMtbmFtZTp4Lnggb29mYS50eHQgICA7IFNldmVyYWwgc3dpdGNoZXMKCiAgIExpa2Ugb3RoZXIgY29tbWFuZCBmaWVsZHMsIHN3aXRjaGVzIGFyZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciBmaWVsZHMsCiAgIGFuZCBmcm9tIGVhY2ggb3RoZXIsIGJ5IHdoaXRlc3BhY2UsIGFzIHNob3duIGluIHRoZSBleGFtcGxlcyBqdXN0CiAgIGFib3ZlLiBZb3UgY2FuIG5vdCBwdXQgdGhlbSB0b2dldGhlciBsaWtlIHNvOgoKICBzZW5kL3RleHQvZGVsZXRlL2FzLW5hbWU6eC54IG9vZmEudHh0CgogICAoYXMgeW91IG1pZ2h0IGRvIGluIFZNUyBvciBET1MsIG9yIGFzIHdlIG1pZ2h0IG9uY2UgaGF2ZSBkb25lIGluCiAgIFRPUFMtMTAgb3IgVE9QUzAtMjAsIG9yIFBJUCkuIFRoaXMgaXMgcHJpbWFyaWx5IGR1ZSB0byBhbWJpZ3VpdHkKICAgYmV0d2VlbiAiLyIgYXMgc3dpdGNoIGludHJvZHVjZXIgdmVyc3VzICIvIiBhcyBVTklYIGRpcmVjdG9yeQogICBzZXBhcmF0b3I7IGUuZy4gaW46CgogIHNlbmQgL2RlbGV0ZS9hcy1uYW1lOmZvby90ZXh0IG9vZmEudHh0CgogICBEb2VzICJmb28vdGV4dCIgbWVhbiB0aGUgZmlsZW5hbWUgaXMgImZvbyIgYW5kIHRoZSB0cmFuc2ZlciBpcyB0byBiZQogICBpbiB0ZXh0IG1vZGUsIG9yIGRvZXMgaXQgbWVhbiB0aGUgZmlsZW5hbWUgaXMgImZvby90ZXh0Ij8gVGhlcmVmb3JlIHdlCiAgIHJlcXVpcmUgd2hpdGVzcGFjZSBiZXR3ZWVuIHN3aXRjaGVzIHRvIHJlc29sdmUgdGhlIGFtYmlndWl0eS4gKFRoYXQncwogICBvbmx5IG9uZSBvZiBzZXZlcmFsIHBvc3NpYmxlIGFtYmlndWl0aWVzIC0tIGl0IGlzIGFsc28gY29uY2VpdmFibGUKICAgdGhhdCBhIGZpbGUgY2FsbGVkICJ0ZXh0IiBleGlzdHMgaW4gdGhlIHBhdGggIi9kZWxldGUvYXMtbmFtZTpmb28vIikuCgogICBJbiBnZW5lcmFsLCBpZiBhIHN3aXRjaCBjYW4gdGFrZSBhIHZhbHVlLCBidXQgeW91IG9taXQgaXQsIHRoZW4gZWl0aGVyCiAgIGEgcmVhc29uYWJsZSBkZWZhdWx0IHZhbHVlIGlzIHN1cHBsaWVkLCBvciBhbiBlcnJvciBtZXNzYWdlIGlzCiAgIHByaW50ZWQ6CgogIHNlbmQgL3ByaW50Oi1QbGFzZXJ3cml0ZXIgb29mYS50eHQgICAgICAgICA7IFZhbHVlIGluY2x1ZGVkID0gcHJpbnQgb3B0aW9ucwogIHNlbmQgL3ByaW50IG9vZmEudHh0ICAgICAgICAgICAgICAgICAgICAgICA7IFZhbHVlIG9taXR0ZWQsIE9LCiAgc2VuZCAvbWFpbDprZXJtaXRAY29sdW1iaWEuZWR1IG9vZmEudHh0ICAgIDsgVmFsdWUgaW5jbHVkZWQgPSBhZGRyZXNzCiAgc2VuZCAvbWFpbCBvb2ZhLnR4dCAgICAgICAgICAgICAgICAgICAgICAgIDsgTm90IE9LIC0gYWRkcmVzcyByZXF1aXJlZAogID9BZGRyZXNzIHJlcXVpcmVkCgogICBDb250ZXh0LXNlbnNpdGl2ZSBoZWxwICg/KSBhbmQgY29tcGxldGlvbiAoRXNjIG9yIFRhYikgYXJlIGF2YWlsYWJsZQogICBpbiB0aGUgbm9ybWFsIG1hbm5lcjoKCiAgQy1LZXJtaXQ+IHNlbmQgL3ByPyBTd2l0Y2gsIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogICAgL3ByaW50IC9wcm90b2NvbAogIEMtS2VybWl0PiBzZW5kIC9wcm88RVNDPnRvY29sOj8gIEZpbGUtdHJhbnNmZXIgcHJvdG9jb2wsCiAgIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogICAga2VybWl0ICAgeG1vZGVtICAgeW1vZGVtICAgeW1vZGVtLWcgICB6bW9kZW0KICBDLUtlcm1pdD4gc2VuZCAvcHJvdG9jb2w6azxUQUI+ZXJtaXQKCiAgIElmIGEgc3dpdGNoIHRha2VzIGEgdmFsdWUgYW5kIHlvdSB1c2UgY29tcGxldGlvbiBvbiBpdCwgYSBjb2xvbiAoOikgaXMKICAgcHJpbnRlZCBhdCB0aGUgZW5kIG9mIGl0cyBuYW1lIHRvIGluZGljYXRlIHRoaXMuIElmIGl0IGRvZXMgbm90IHRha2UgYQogICB2YWx1ZSwgYSBzcGFjZSBpcyBwcmludGVkLgoKICAgQWxzbywgaWYgeW91IHR5cGUgPyBpbiBhIHN3aXRjaCBmaWVsZCwgc3dpdGNoZXMgdGhhdCB0YWtlIHZhbHVlcyBhcmUKICAgc2hvd24gd2l0aCBhIHRyYWlsaW5nIGNvbG9uOyB0aG9zZSB0aGF0IGRvbid0IHRha2UgdmFsdWVzIGFyZSBzaG93bgogICB3aXRob3V0IG9uZS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDEuNS4yLiBPcmRlciBhbmQgRWZmZWN0IG9mIFN3aXRjaGVzCgogICBUaGUgb3JkZXIgb2Ygc3dpdGNoZXMgc2hvdWxkIG5vdCBtYXR0ZXIsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlCiAgIGV2YWx1YXRlZCBmcm9tIGxlZnQgdG8gcmlnaHQsIHNvIGlmIHlvdSBnaXZlIHR3byBzd2l0Y2hlcyB3aXRoCiAgIG9wcG9zaXRlIGVmZmVjdHMsIHRoZSByaWdodG1vc3Qgb25lIGlzIHVzZWQ6CgogIHNlbmQgL3RleHQgL2JpbmFyeSBvb2ZhLnppcCAgICAgICAgICAgICAgICA7IFNlbmRzIG9vZmEuemlwIGluIGJpbmFyeSBtb2RlLgoKICAgTGlrZSBvdGhlciBjb21tYW5kIGZpZWxkcywgc3dpdGNoZXMgaGF2ZSBubyBlZmZlY3Qgd2hhdHNvZXZlciB1bnRpbAogICB0aGUgY29tbWFuZCBpcyBlbnRlcmVkIChieSBwcmVzc2luZyB0aGUgUmV0dXJuIG9yIEVudGVyIGtleSkuIEV2ZW4KICAgdGhlbiwgc3dpdGNoZXMgYWZmZWN0IG9ubHkgdGhlIGNvbW1hbmQgd2l0aCB3aGljaCB0aGV5IGFyZSBpbmNsdWRlZDsKICAgdGhleSBkbyBub3QgaGF2ZSBnbG9iYWwgZWZmZWN0IG9yIHNpZGUgZWZmZWN0cy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDEuNS4zLiBEaXN0aW5ndWlzaGluZyBTd2l0Y2hlcyBmcm9tIE90aGVyIEZpZWxkcwoKICAgQWxsIHN3aXRjaGVzIGFyZSBvcHRpb25hbC4gQSBjb21tYW5kIHRoYXQgdXNlcyBzd2l0Y2hlcyBsZXRzIHlvdSBnaXZlCiAgIGFueSBudW1iZXIgb2YgdGhlbSwgaW5jbHVkaW5nIG5vbmUgYXQgYWxsLiBFeGFtcGxlOgoKICBzZW5kIC9iaW5hcnkgb29mYS56aXAKICBzZW5kIC9iaW4gL2RlbGV0ZSBvb2ZhLnppcAogIHNlbmQgL2JpbiAvYXMtbmFtZTptdXBlZW4uemlwIG9vZmEuemlwCiAgc2VuZCBvb2ZhLnppcAoKICAgQnV0IGhvdyBkb2VzIEtlcm1pdCBrbm93IHdoZW4gdGhlIGZpcnN0ICJub24tc3dpdGNoIiBpcyBnaXZlbj8gSXQgaGFzCiAgIGJlZW4gdG9sZCB0byBsb29rIGZvciBib3RoIGEgc3dpdGNoIGFuZCBmb3Igc29tZXRoaW5nIGVsc2UsIHRoZSBkYXRhCiAgIHR5cGUgb2YgdGhlIG5leHQgZmllbGQgKGZpbGVuYW1lLCBudW1iZXIsIGV0YykuIEluIG1vc3QgY2FzZXMsIHRoaXMKICAgd29ya3Mgd2VsbC4gQnV0IGNvbmZsaWN0cyBhcmUgbm90IGltcG9zc2libGUuIFN1cHBvc2UsIGZvciBleGFtcGxlLCBpbgogICBVTklYIHRoZXJlIHdhcyBhIGZpbGUgbmFtZWQgInRleHQiIGluIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LiBUaGUKICAgY29tbWFuZCB0byBzZW5kIGl0IHdvdWxkIGJlOgoKICBzZW5kIC90ZXh0CgogICBCdXQgQy1LZXJtaXQgd291bGQgdGhpbmsgdGhpcyB3YXMgdGhlICIvdGV4dCIgc3dpdGNoLiBUbyByZXNvbHZlIHRoZQogICBjb25mbGljdCwgdXNlIGJyYWNlczoKCiAgc2VuZCB7L3RleHR9CgogICBvciBvdGhlciBjaXJjdW1sb2N1dGlvbnMgc3VjaCBhcyAic2VuZCAvL3RleHQiLCAic2VuZCAvLi90ZXh0IiwgZXRjLgoKICAgVGhlIG9wcG9zaXRlIHByb2JsZW0gY2FuIG9jY3VyIGlmIHlvdSBnaXZlIGFuIGlsbGVnYWwgc3dpdGNoIHRoYXQKICAgaGFwcGVucyB0byBtYXRjaCBhIGRpcmVjdG9yeSBuYW1lLiBGb3IgZXhhbXBsZToKCiAgc2VuZCAvZiBvb2ZhLnR4dAoKICAgVGhlcmUgaXMgbm8gIi9mIiBzd2l0Y2ggKHRoZXJlIGFyZSBzZXZlcmFsIHN3aXRjaGVzIHRoYXQgYmVnaW4gd2l0aAogICAiL2YiLCBzbyAiL2YiIGlzIGFtYmlndW91cykuIE5vdyBzdXBwb3NlIHRoZXJlIGlzIGFuICJmIiBkaXJlY3RvcnkgaW4KICAgdGhlIHJvb3QgZGlyZWN0b3J5OyB0aGVuIHRoaXMgY29tbWFuZCB3b3VsZCBiZSBpbnRlcnByZXRlZCBhczoKCiAgICAgU2VuZCBhbGwgdGhlIGZpbGVzIGluIHRoZSAiL2YiIGRpcmVjdG9yeSwgZ2l2aW5nIGVhY2ggb25lIGFuCiAgICAgYXMtbmFtZSBvZiAib29mYS50eHQiLgoKICAgVGhpcyBjb3VsZCBiZSBhIG1pc3Rha2UsIG9yIGl0IGNvdWxkIGJlIGV4YWN0bHkgd2hhdCB5b3UgaW50ZW5kZWQ7CiAgIEMtS2VybWl0IGhhcyBubyB3YXkgb2YgdGVsbGluZyB0aGUgZGlmZmVyZW5jZS4gVG8gYXZvaWQgc2l0dWF0aW9ucwogICBsaWtlIHRoaXMsIHNwZWxsIHN3aXRjaGVzIG91dCBpbiBmdWxsIHVudGlsIHlvdSBhcmUgY29tZm9ydGFibGUgZW5vdWdoCiAgIHdpdGggdGhlbSB0byBrbm93IHRoZSBtaW5pbXVtIGFiYnJldmlhdGlvbiBmb3IgZWFjaCBvbmUuIEhpbnQ6IHVzZSA/CiAgIGFuZCBjb21wbGV0aW9uIHdoaWxlIHR5cGluZyBzd2l0Y2hlcyB0byBvYnRhaW4gdGhlIG5lY2Vzc2FyeSBmZWVkYmFjay4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDEuNS40LiBTdGFuZGFyZCBGaWxlIFNlbGVjdGlvbiBTd2l0Y2hlcwoKICAgVGhlIGZvbGxvd2luZyBzd2l0Y2hlcyBhcmUgdXNlZCBvbiBkaWZmZXJlbnQgZmlsZS1vcmllbnRlZCBjb21tYW5kcwogICAoc3VjaCBhcyBTRU5ELCBESVJFQ1RPUlksIERFTEVURSwgUFVSR0UpIHRvIHJlZmluZSB0aGUgc2VsZWN0aW9uIG9mCiAgIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHNwZWNpZmljYXRpb24uCgogICAvQUZURVI6ZGF0ZS10aW1lCiAgICAgICAgICBTZWxlY3Qgb25seSB0aG9zZSBmaWxlcyBoYXZpbmcgYSBkYXRlLXRpbWUgbGF0ZXIgdGhhbiB0aGUgb25lCiAgICAgICAgICBnaXZlbi4gU2VlIFszNTJdU2VjdGlvbiAxLjYgZm9yIGRhdGUtdGltZSBmb3JtYXRzLiBTeW5vbnltOgogICAgICAgICAgL1NJTkNFLgoKICAgL05PVC1BRlRFUjpkYXRlLXRpbWUKICAgICAgICAgIFNlbGVjdCBvbmx5IHRob3NlIGZpbGVzIGhhdmluZyBhIGRhdGUtdGltZSBub3QgbGF0ZXIgdGhhbiAoaS5lLgogICAgICAgICAgZWFybGllciBvciBlcXVhbCB0bykgdGhlIG9uZSBnaXZlbi4gU3lub255bTogL05PVC1TSU5DRS4KCiAgIC9CRUZPUkU6ZGF0ZS10aW1lCiAgICAgICAgICBTZWxlY3Qgb25seSB0aG9zZSBmaWxlcyBoYXZpbmcgYSBkYXRlLXRpbWUgZWFybGllciB0aGFuIHRoZSBvbmUKICAgICAgICAgIGdpdmVuLgoKICAgL05PVC1CRUZPUkU6ZGF0ZS10aW1lCiAgICAgICAgICBTZWxlY3Qgb25seSB0aG9zZSBmaWxlcyBoYXZpbmcgYSBkYXRlLXRpbWUgbm90IGVhcmxpZXIgdGhhbgogICAgICAgICAgKGkuZS4gbGF0ZXIgb3IgZXF1YWwgdG8pIHRoZSBvbmUgZ2l2ZW4uCgogICAvRE9URklMRVMKICAgICAgICAgIFVOSVggYW5kIE9TLTkgb25seTogVGhlIGZpbGVzcGVjIGlzIGFsbG93ZWQgdG8gbWF0Y2ggZmlsZXMKICAgICAgICAgIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggKGRvdCkgcGVyaW9kLiBOb3JtYWxseSB0aGVzZSBmaWxlcyBhcmUKICAgICAgICAgIG5vdCBzaG93bi4KCiAgIC9OT0RPVEZJTEVTCiAgICAgICAgICAoVU5JWCBhbmQgT1MtOSBvbmx5KSBEb24ndCBzaG93IGZpbGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGgKICAgICAgICAgIGRvdCAocGVyaW9kKS4gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YgL0RPVEZJTEVTLCBhbmQgaXMgdGhlCiAgICAgICAgICBkZWZhdWx0LiBOb3RlIHRoYXQgd2hlbiBhIGRpcmVjdG9yeSBuYW1lIHN0YXJ0cyB3aXRoIGEgcGVyaW9kLAogICAgICAgICAgdGhlIGRpcmVjdG9yeSBhbmQgKGluIHJlY3Vyc2l2ZSBvcGVyYXRpb25zKSBhbGwgaXRzCiAgICAgICAgICBzdWJkaXJlY3RvcmllcyBhcmUgc2tpcHBlZC4KCiAgIC9MQVJHRVItVEhBTjpudW1iZXIKICAgICAgICAgIE9ubHkgc2VsZWN0IGZpbGVzIGxhcmdlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCgogICAvU01BTExFUi1USEFOOm51bWJlcgogICAgICAgICAgT25seSBzZWxlY3QgZmlsZXMgc21hbGxlciB0aGFuIHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMuCgogICAvRVhDRVBUOnBhdHRlcm4KICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiwgd2hpY2gKICAgICAgICAgIGNhbiBiZSBhIHJlZ3VsYXIgZmlsZW5hbWUsIG9yIG1heSBjb250YWluICIqIiBhbmQvb3IgIj8iCiAgICAgICAgICBtZXRhY2hhcmFjdGVycyAod2lsZGNhcmRzKSwgYXJlIG5vdCB0byBiZSBzZWxlY3RlZC4gRXhhbXBsZToKCiAgc2VuZCAvZXhjZXB0OioubG9nICouKgoKICAgICAgICAgIHNlbmRzIGFsbCBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgZXhjZXB0IHRob3NlIHdpdGggYQogICAgICAgICAgZmlsZXR5cGUgb2YgIi5sb2ciLiBBbm90aGVyOgoKICBzZW5kIC9leGNlcHQ6Ki5+Kn4gKi4qCgogICAgICAgICAgc2VuZHMgYWxsIGZpbGVzIGV4Y2VwdCB0aGUgb25lcyB0aGF0IGxvb2sgbGlrZSBLZXJtaXQgb3IgRU1BQ1MKICAgICAgICAgIGJhY2t1cCBmaWxlcyAoc3VjaCBhcyAib29mYS50eHQufjE3fiIpIChvZiBjb3Vyc2UgeW91IGNhbiBhbHNvCiAgICAgICAgICB1c2UgdGhlIC9OT0JBQ0tVUCBzd2l0Y2ggZm9yIHRoaXMpLgoKICAgICAgICAgIFRoZSBwYXR0ZXJuIG1hdGNoZXIgaXMgdGhlIHNhbWUgb25lIHVzZWQgYnkgSUYgTUFUQ0ggc3RyaW5nCiAgICAgICAgICBwYXR0ZXJuIChbMzUzXVNlY3Rpb24gNy40KSwgc28geW91IGNhbiB0ZXN0IHlvdXIgcGF0dGVybnMgdXNpbmcKICAgICAgICAgIElGIE1BVENILiBJZiB5b3UgbmVlZCB0byBtYXRjaCBhIGxpdGVyYWwgKiBvciA/IChldGMpLCBwcmVjZWRlCiAgICAgICAgICBpdCBieSBhIGJhY2tzbGFzaCAoXCkuIElmIHRoZSBwYXR0ZXJuIGNvbnRhaW5zIGFueSBzcGFjZXMsIGl0CiAgICAgICAgICBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlczoKCiAgc2VuZCAvZXhjZXB0OntGb28gYmFyfSAqLioKCiAgICAgICAgICBUaGUgcGF0dGVybiBjYW4gYWxzbyBiZSBhIGxpc3Qgb2YgdXAgdG8gOCBwYXR0ZXJucy4gSW4gdGhpcwogICAgICAgICAgY2FzZSwgdGhlIGVudGlyZSBwYXR0ZXJuIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzLCBhbmQgZWFjaAogICAgICAgICAgc3ViLXBhdHRlcm4gbXVzdCBhbHNvIGJlIGVuY2xvc2VkIGluIGJyYWNlczsgdGhpcyBlbGltaW5hdGVzCiAgICAgICAgICB0aGUgbmVlZCBmb3IgZGVzaWduYXRpbmcgYSBzZXBhcmF0b3IgY2hhcmFjdGVyLCB3aGljaCBpcyBsaWtlbHkKICAgICAgICAgIHRvIGFsc28gYmUgYSBsZWdhbCBmaWxlbmFtZSBjaGFyYWN0ZXIgb24gc29tZSBwbGF0Zm9ybSBvcgogICAgICAgICAgb3RoZXIsIGFuZCB0aGVyZWZvcmUgYSBzb3VyY2Ugb2YgY29uZnVzaW9uLiBZb3UgbWF5IGluY2x1ZGUKICAgICAgICAgIHNwYWNlcyBiZXR3ZWVuIHRoZSBzdWJwYXR0ZXJucyBidXQgdGhleSBhcmUgbm90IG5lY2Vzc2FyeS4gVGhlCiAgICAgICAgICBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIGFyZSBlcXVpdmFsZW50OgoKICBzZW5kIC9leGNlcHQ6e3tjayoub30ge2NrKi5jfX0gY2sqLj8KICBzZW5kIC9leGNlcHQ6e3tjayoub317Y2sqLmN9fSBjayouPwoKICAgICAgICAgIElmIGEgcGF0dGVybiBpcyB0byBpbmNsdWRlIGEgbGl0ZXJhbCBicmFjZSBjaGFyYWN0ZXIsIHByZWNlZGUKICAgICAgICAgIGl0IHdpdGggIlwiLiBBbHNvIG5vdGUgdGhlIGFwcGFyZW50IGNvbmZsaWN0IG9mIHRoaXMgbGlzdAogICAgICAgICAgZm9ybWF0IGFuZCB0aGUgc3RyaW5nLWxpc3QgZm9ybWF0IGRlc2NyaWJlZCBpbiBbMzU0XVNlY3Rpb24KICAgICAgICAgIDQuOS4xLiBJbiBjYXNlIHlvdSB3YW50IHRvIGluY2x1ZGUgYSB3aWxkY2FyZCBzdHJpbmctbGlzdCB3aXRoCiAgICAgICAgICBicmFjZXMgb24gaXRzIG91dGVyIGVuZHMgYXMgYW4gL0VYQ0VQVDogYXJndW1lbnQsIGRvIGl0IGxpa2UKICAgICAgICAgIHRoaXM6CgogIHNlbmQgL2V4Y2VwdDp7e3tja3V1c3IuYyxja3V1czIuYyxja3V1czYuY319fSBja3V1cyouYwogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMS41LjUuIFNldHRpbmcgUHJlZmVyZW5jZXMgZm9yIERpZmZlcmVudCBDb21tYW5kcwoKICAgQ2VydGFpbiBvZnQtdXNlZCBjb21tYW5kcyBvZmZlciBsb3RzIG9mIHN3aXRjaGVzIGJlY2F1c2UgZGlmZmVyZW50CiAgIHBlb3BsZSBoYXZlIGRpZmZlcmVudCByZXF1aXJlbWVudHMgb3IgcHJlZmVyZW5jZXMuIEZvciBleGFtcGxlLCBzb21lCiAgIHBlb3BsZSB3YW50IHRvIGJlIGFibGUgdG8gZGVsZXRlIGZpbGVzIHdpdGhvdXQgaGF2aW5nIHRvIHdhdGNoIGEgbGlzdAogICBvZiB0aGUgZGVsZXRlZCBmaWxlcyBzY3JvbGwgcGFzdCwgd2hpbGUgb3RoZXJzIHdhbnQgdG8gYmUgcHJvbXB0ZWQgZm9yCiAgIHBlcm1pc3Npb24gdG8gZGVsZXRlIGVhY2ggZmlsZS4gRGlmZmVyZW50IHBlb3BsZSBwcmVmZXIgZGlmZmVyZW50CiAgIGRpcmVjdG9yeS1saXN0aW5nIHN0eWxlcy4gQW5kIHNvIG9uLiBTdWNoIGNvbW1hbmRzIGNhbiBiZSB0YWlsb3JlZAogICB3aXRoIHRoZSBTRVQgT1BUSU9OUyBjb21tYW5kOgoKICAgU0VUIE9QVElPTlMgY29tbWFuZCBbIHN3aXRjaCBbIHN3aXRjaCBbIC4uLiBdIF0gXQogICAgICAgICAgU2V0cyBlYWNoIHN3aXRjaCBhcyB0aGUgZGVmYXVsdCBmb3IgdGhlIGdpdmVuIGNvbW1hbmQsCiAgICAgICAgICByZXBsYWNpbmcgdGhlICJmYWN0b3J5IGRlZmF1bHQiLiBPZiBjb3Vyc2UgeW91IGNhbiBhbHNvCiAgICAgICAgICBvdmVycmlkZSBhbnkgZGVmYXVsdHMgZXN0YWJsaXNoZWQgYnkgdGhlIFNFVCBPUFRJT05TIGNvbW1hbmQgYnkKICAgICAgICAgIGluY2x1ZGluZyB0aGUgcmVsZXZhbnQgc3dpdGNoZXMgaW4gdGhlIGFmZmVjdGVkIGNvbW1hbmQgYW55CiAgICAgICAgICB0aW1lIHlvdSBpc3N1ZSBpdC4KCiAgIFNIT1cgT1BUSU9OUwogICAgICAgICAgTGlzdHMgdGhlIGNvbW1hbmRzIHRoYXQgYWxsb3dzIG9wdGlvbi1zZXR0aW5nLCBhbmQgdGhlIG9wdGlvbnMKICAgICAgICAgIGN1cnJlbnRseSBpbiBlZmZlY3QsIGlmIGFueSwgZm9yIGVhY2guIFN3aXRjaGVzIHRoYXQgaGF2ZQogICAgICAgICAgc3lub255bXMgYXJlIHNob3duIHVuZGVyIHRoZWlyIHByaW1hcnkgbmFtZTsgZm9yIGV4YW1wbGUuIC9MT0cKICAgICAgICAgIGFuZCAvVkVSQk9TRSBhcmUgc2hvd24gYXMgL0xJU1QuCgogICBDb21tYW5kcyBmb3Igd2hpY2ggb3B0aW9ucyBtYXkgYmUgc2V0IGluY2x1ZGUgRElSRUNUT1JZLCBERUxFVEUsCiAgIFBVUkdFLCBhbmQgVFlQRS4gRXhhbXBsZXM6CgogIFNFVCBPUFRJT05TIERJUkVDVE9SWSAvUEFHRSAvTk9CQUNLVVAgL0hFQURJTkcgL1NPUlQ6REFURSAvUkVWRVJTRQogIFNFVCBPUFRJT05TIERFTEVURSAvTElTVCAvTk9IRUFESU5HIC9OT1BBR0UgL05PQVNLIC9OT0RPVEZJTEVTCiAgU0VUIE9QVElPTlMgVFlQRSAvUEFHRQoKICAgTm90IG5lY2Vzc2FyaWx5IGFsbCBvZiBhIGNvbW1hbmQncyBzd2l0Y2hlcyBjYW4gYmUgc2V0IGFzIG9wdGlvbnMuIEZvcgogICBleGFtcGxlLCBmaWxlIHNlbGVjdGlvbiBzd2l0Y2hlcywgc2luY2UgdGhlc2Ugd291bGQgbm9ybWFsbHkgYmUKICAgZGlmZmVyZW50IGZvciBlYWNoIGNvbW1hbmQuCgogICBQdXQgdGhlIGRlc2lyZWQgU0VUIE9QVElPTlMgY29tbWFuZHMgaW4geW91ciBDLUtlcm1pdCBjdXN0b21pemF0aW9uCiAgIGZpbGUgZm9yIGVhY2ggY29tbWFuZCB3aG9zZSBkZWZhdWx0IHN3aXRjaGVzIHlvdSB3YW50IHRvIGNoYW5nZSBldmVyeQogICB0aW1lIHlvdSBydW4gQy1LZXJtaXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS42LiBEYXRlcyBhbmQgVGltZXMKCiAgIFNvbWUgY29tbWFuZHMgYW5kIHN3aXRjaGVzIHRha2UgZGF0ZS10aW1lIHZhbHVlcywgc3VjaCBhczoKCiAgc2VuZCAvYWZ0ZXI6ezgtRmViLTIwMDAgMTA6Mjg6MDF9CgogICBWYXJpb3VzIGRhdGUtdGltZSBmb3JtYXRzIGFyZSBhY2NlcHRhYmxlLiBUaGUgcnVsZXMgZm9yIHRoZSBkYXRlIGFyZToKCiAgICAgKiBUaGUgeWVhciBtdXN0IGhhdmUgNCBkaWdpdHMuCiAgICAgKiBJZiB0aGUgeWVhciBjb21lcyBmaXJzdCwgdGhlIHNlY29uZCBmaWVsZCBpcyB0aGUgbW9udGguCiAgICAgKiBUaGUgZGF5LCBtb250aCwgYW5kIHllYXIgbWF5IGJlIHNlcGFyYXRlZCBieSBzcGFjZXMsIC8sIC0sIG9yCiAgICAgICB1bmRlcnNjb3JlLgogICAgICogVGhlIG1vbnRoIG1heSBiZSBudW1lcmljICgxID0gSmFudWFyeSkgb3Igc3BlbGxlZCBvdXQgb3IKICAgICAgIGFiYnJldmlhdGVkIGluIEVuZ2xpc2guCgogICBJZiB0aGUgZGF0ZS10aW1lIHN0cmluZyBjb250YWlucyBhbnkgc3BhY2VzLCBpdCBtdXN0IGJlIGVuY2xvc2VkIGluCiAgIGJyYWNlcy4gRXhhbXBsZXMgb2YgbGVnYWwgZGF0ZXM6CgogICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcnByZXRhdGlvbjoKICAyMDAwLUZlYi04ICAgICAgICAgICAgICAgIDggRmVicnVhcnkgMjAwMAogIHsyMDAwIEZlYiA4fSAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCiAgMjAwMC9GZWIvOCAgICAgICAgICAgICAgICA4IEZlYnJ1YXJ5IDIwMDAKICAyMDAwX0ZlYl84ICAgICAgICAgICAgICAgIDggRmVicnVhcnkgMjAwMAogIDIwMDAtMi04ICAgICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCiAgMjAwMC0wMi0wOCAgICAgICAgICAgICAgICA4IEZlYnJ1YXJ5IDIwMDAKICA4LUZlYi0yMDAwICAgICAgICAgICAgICAgIDggRmVicnVhcnkgMjAwMAogIDA4LUZlYi0yMDAwICAgICAgICAgICAgICAgOCBGZWJydWFyeSAyMDAwCiAgMTIvMjUvMjAwMCAgICAgICAgICAgICAgICAyNSBEZWNlbWJlciAyMDAwCiAgMjUvMTIvMjAwMCAgICAgICAgICAgICAgICAyNSBEZWNlbWJlciAyMDAwCgogICBUaGUgbGFzdCB0d28gZXhhbXBsZXMgc2hvdyB0aGF0IHdoZW4gdGhlIHllYXIgY29tZXMgbGFzdCwgYW5kIHRoZQogICBtb250aCBpcyBnaXZlbiBudW1lcmljYWxseSwgdGhlIG9yZGVyIG9mIHRoZSBkYXkgYW5kIG1vbnRoIGRvZXNuJ3QKICAgbWF0dGVyIGFzIGxvbmcgYXMgdGhlIGRheSBpcyAxMyBvciBncmVhdGVyIChtbS9kZC95eXl5IGlzIGNvbW1vbmx5CiAgIHVzZWQgaW4gdGhlIFVTQSwgd2hlcmVhcyBkZC9tbS95eXl5IGlzIHRoZSBub3JtIGluIEV1cm9wZSkuIEhvd2V2ZXI6CgogIDA4LzAyLzIwMDAgICAgICAgICAgICAgICAgSXMgYW1iaWd1b3VzIGFuZCB0aGVyZWZvcmUgbm90IGFjY2VwdGVkLgoKICAgSWYgYSBkYXRlIGlzIGdpdmVuLCB0aGUgdGltZSBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gMDA6MDA6MDAuIElmCiAgIHRoZSB0aW1lIGlzIGdpdmVuIHdpdGggYSBkYXRlLCBpdCBtdXN0IGZvbGxvdyB0aGUgZGF0ZSwgc2VwYXJhdGVkIGJ5CiAgIHNwYWNlLCAvLCAtLCBvciB1bmRlcnNjb3JlLCBhbmQgd2l0aCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMKICAgc2VwYXJhdGVkIGJ5IGNvbG9uICg6KS4gRXhhbXBsZToKCiAgMjAwMC1GZWItOCAxMDoyODowMSAgICAgICBSZXByZXNlbnRzIDggRmVicnVhcnkgMjAwMCwgMTA6Mjg6MDFhbQoKICAgSWYgYSBkYXRlIGlzIG5vdCBnaXZlbiwgdGhlIGN1cnJlbnQgZGF0ZSBpcyB1c2VkIGFuZCBhIHRpbWUgaXMKICAgcmVxdWlyZWQuCgogICBUaW1lIGZvcm1hdCBpcyBoaDptbTpzcyBvciBoaDptbSBvciBoaCBpbiAyNC1ob3VyIGZvcm1hdCwgb3IgZm9sbG93ZWQKICAgYnkgImFtIiBvciAicG0iIChvciAiQU0iIG9yICJQTSIpIHRvIGluZGljYXRlIG1vcm5pbmcgb3IgYWZ0ZXJub29uLgogICBFeGFtcGxlcyBvZiB0aW1lcyB0aGF0IGFyZSBhY2NlcHRhYmxlOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwcmV0YXRpb246CiAgMzoyMzo1NiAgICAgICAgICAgICAgICAgICAgMzoyMzo1NmFtCiAgMzoyMzo1NmFtICAgICAgICAgICAgICAgICAgMzoyMzo1NmFtCiAgMzoyMzo1NnBtICAgICAgICAgICAgICAgICAgMzoyMzo1NnBtID0gMTU6MjM6NTYKIDE1OjIzOjU2ICAgICAgICAgICAgICAgICAgICAzOjIzOjU2cG0gPSAxNToyMzo1NgogIDM6MjNwbSAgICAgICAgICAgICAgICAgICAgIDM6MjM6MDBwbSA9IDE1OjIzOjAwCiAgMzoyM1BNICAgICAgICAgICAgICAgICAgICAgMzoyMzowMHBtID0gMTU6MjM6MDAKICAzcG0gICAgICAgICAgICAgICAgICAgICAgICAzOjAwOjAwcG0gPSAxNTowMDowMAoKICAgRXhhbXBsZXMgb2YgbGVnYWwgZGF0ZS10aW1lczoKCiAgc2VuZCAvYWZ0ZXI6ezggRmViIDIwMDAgMTA6Mjg6MDF9CiAgc2VuZCAvYWZ0ZXI6OF9GZWJfMjAwMF8xMDoyODowMQogIHNlbmQgL2FmdGVyOjgtRmViLTIwMDAvMTA6Mjg6MDEKICBzZW5kIC9hZnRlcjoyMDAwLzAyLzA4LzEwOjI4OjAxCiAgc2VuZCAvYWZ0ZXI6MjAwMC8wMi8wOF8xMDoyODowMQogIHNlbmQgL2FmdGVyOjIwMDAvMDIvMDhfMTA6Mjg6MDFhbQogIHNlbmQgL2FmdGVyOjIwMDAvMDIvMDhfMTA6Mjg6MDFwbQogIHNlbmQgL2FmdGVyOjIwMDAvMDIvMDhfMTA6MjhwbQogIHNlbmQgL2FmdGVyOjIwMDAvMDIvMDhfMTBwbQogIHNlbmQgL2FmdGVyOjEwOjAwOjAwcG0KICBzZW5kIC9hZnRlcjoxMDowMHBtCiAgc2VuZCAvYWZ0ZXI6MTBwbQogIHNlbmQgL2FmdGVyOjIyCgogICBGaW5hbGx5LCB0aGVyZSBpcyBhIHNwZWNpYWwgYWxsLW51bWVyaWMgZm9ybWF0IHlvdSBjYW4gdXNlOgoKICB5eXl5bW1kZCBoaDptbTpzcwoKICAgRm9yIGV4YW1wbGU6CgogIDIwMDAwMjA4IDEwOjI4OjAxCgogICBUaGlzIGlzIEtlcm1pdCdzIHN0YW5kYXJkIGRhdGUtdGltZSBmb3JtYXQgKGJhc2VkIG9uIElTTyA4NjAxKSwgYW5kIGlzCiAgIGFjY2VwdGVkIChhbW9uZyBvdGhlciBmb3JtYXRzKSBieSBhbnkgY29tbWFuZCBvciBzd2l0Y2ggdGhhdCByZXF1aXJlcwogICBhIGRhdGUtdGltZSwgYW5kIGlzIG91dHB1dCBieSBhbnkgZnVuY3Rpb24gd2hvc2UgcmVzdWx0IGlzIGEgY2FsZW5kYXIKICAgZGF0ZS10aW1lLgoKICAgVGhlcmUgYXJlIG5vIG9wdGlvbmFsIHBhcnRzIHRvIHRoaXMgZm9ybWF0IGFuZCBpdCBtdXN0IGJlIGV4YWN0bHkgMTcKICAgY2hhcmFjdGVycyBsb25nLCBwdW5jdHVhdGVkIGFzIHNob3duIChleGNlcHQgeW91IGNhbiBzdWJzdGl0dXRlCiAgIHVuZGVyc2NvcmUgZm9yIHNwYWNlIGluIGNvbnRleHRzIHdoZXJlIGEgc2luZ2xlICJ3b3JkIiBpcyByZXF1aXJlZCkuCiAgIFRoZSB0aW1lIGlzIGluIDI0LWhvdXIgZm9ybWF0ICgyMzowMDowMCBpcyAxMTowMHBtKS4gVGhpcyBpcyB0aGUKICAgZm9ybWF0IHJldHVybmVkIGJ5IFxmZGF0ZShmaWxlbmFtZSksIHNvIHlvdSBjYW4gYWxzbyB1c2UgY29uc3RydWN0aW9ucwogICBsaWtlIHRoaXM6CgogIHNlbmQgL2FmdGVyOlxmZGF0ZShvb2ZhLnR4dCkKCiAgIHdoaWNoIG1lYW5zICJhbGwgZmlsZXMgbmV3ZXIgdGhhbiBvb2ZhLnR4dCIuCgogICBCZXNpZGVzIGV4cGxpY2l0IGRhdGVzLCB5b3UgY2FuIGFsc28gdXNlIHRoZSBhbnkgb2YgdGhlIGZvbGxvd2luZwogICBzaG9ydGN1dHM6CgogICBUT0RBWQogICAgICAgICAgU3RhbmRzIGZvciB0aGUgY3VycmVudCBkYXRlIGF0IDAwOjAwOjAwLgoKICAgVE9EQVkgMTI6MzQ6NTYKICAgICAgICAgIFN0YW5kcyBmb3IgdGhlIGN1cnJlbnQgZGF0ZSBhdCB0aGUgZ2l2ZW4gdGltZS4KCiAgIFlFU1RFUkRBWQogICAgICAgICAgU3RhbmRzIGZvciB5ZXN0ZXJkYXkncyBkYXRlIGF0IDAwOjAwOjAwLiBBIHRpbWUgbWF5IGFsc28gYmUKICAgICAgICAgIGdpdmVuLgoKICAgVE9NT1JST1cKICAgICAgICAgIFN0YW5kcyBmb3IgdG9tb3Jyb3cncyBkYXRlIGF0IDAwOjAwOjAwLiBBIHRpbWUgbWF5IGFsc28gYmUKICAgICAgICAgIGdpdmVuLgoKICAgKyBudW1iZXIgeyBEQVlTLCBXRUVLUywgTU9OVEhTLCBZRUFSUyB9IFsgdGltZSBdCiAgICAgICAgICBJcyByZXBsYWNlZCBieSB0aGUgZnV0dXJlIGRhdGUgaW5kaWNhdGVkLCByZWxhdGl2ZSB0byB0aGUKICAgICAgICAgIGN1cnJlbnQgZGF0ZS4gSWYgdGhlIHRpbWUgaXMgb21pdHRlZCwgMDA6MDA6MDAgaXMgdXNlZC4KICAgICAgICAgIEV4YW1wbGVzOiArM2RheXMsICsyd2Vla3MsICsxeWVhciwgKzM3bW9udGhzLgoKICAgLSBudW1iZXIgeyBEQVlTLCBXRUVLUywgTU9OVEhTLCBZRUFSUyB9IFsgdGltZSBdCgogICAgICAgICAgSXMgcmVwbGFjZWQgYnkgdGhlIHBhc3QgZGF0ZSBpbmRpY2F0ZWQsIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50CiAgICAgICAgICBkYXRlLiBJZiB0aGUgdGltZSBpcyBvbWl0dGVkLCAwMDowMDowMCBpcyB1c2VkLgoKICAgVGhlIHRpbWUgY2FuIGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBkYXRlIHNob3J0Y3V0IGJ5IGFueSBvZiB0aGUgc2FtZQogICBzZXBhcmF0b3JzIHRoYXQgYXJlIGFsbG93ZWQgZm9yIGV4cGxpY2l0IGRhdGUtdGltZXM6IHNwYWNlLCBoeXBoZW4sCiAgIHNsYXNoLCBwZXJpb2QsIG9yIHVuZGVyc2NvcmUuIEluIHN3aXRjaGVzIGFuZCBvdGhlciBzcGFjZS1kZWxpbWl0ZWQKICAgZmllbGRzLCB1c2Ugbm9uLXNwYWNlcyB0byBzZXBhcmF0ZSBkYXRlL3RpbWUgZmllbGRzLCBvciBlbmNsb3NlIHRoZQogICBkYXRlLXRpbWUgaW4gYnJhY2VzLCBlLmcuOgoKICBwdXJnZSAvYmVmb3JlOi00ZGF5c18xMjowMDowMAogIHB1cmdlIC9iZWZvcmU6ey0gNCBkYXlzIDEyOjAwOjAwfQoKICAgT2YgY291cnNlIHlvdSBjYW4gYWxzbyB1c2UgdmFyaWFibGVzOgoKICBkZWZpbmUgXCVuIDQzCiAgcHVyZ2UgL2JlZm9yZTotXCVuZGF5c18xMjowMDowMAoKICAgU2hvcnRjdXQgbmFtZXMgY2FuIGJlIGFiYnJldmlhdGVkIHRvIGFueSBsZW5ndGggdGhhdCBzdGlsbAogICBkaXN0aW5ndWlzaGVzIHRoZW0gZnJvbSBhbnkgb3RoZXIgbmFtZSB0aGF0IGNhbiBhcHBlYXIgaW4gdGhlIHNhbWUKICAgY29udGV4dCwgZS5nLiAiVE9EIiBmb3IgdG9kYXksICJZIiBmb3IgeWVzdGVyZGF5LiBBbHNvLCB0aGUgc3BlY2lhbAogICBhYmJyZXZpYXRpb24gIndrcyIgaXMgYWNjZXB0ZWQgZm9yIFdFRUtTLCBhbmQgInlycyIgZm9yICJZRUFSUyIuCgogICAoVG8gc2VlIGhvdyB0byBzcGVjaWZ5IGRhdGVzIHJlbGF0aXZlIHRvIGEgc3BlY2lmaWMgZGF0ZSwgcmF0aGVyIHRoYW4KICAgdGhlIGN1cnJlbnQgb25lLCBzZWUgdGhlIFszNTVdXGZtamQoKSBmdW5jdGlvbiBkZXNjcmlwdGlvbiBiZWxvdy4pCgogICBZb3UgY2FuIGNoZWNrIGRhdGUgZm9ybWF0cyB3aXRoIHRoZSBEQVRFIGNvbW1hbmQuIERBVEUgYnkgaXRzZWxmCiAgIHByaW50cyB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lIGluIHN0YW5kYXJkIGZvcm1hdDogeXl5eW1tZGQKICAgaGg6bW06c3MuIERBVEUgZm9sbG93ZWQgYnkgYSBkYXRlIGFuZC9vciB0aW1lIChpbmNsdWRpbmcgc2hvcnRjdXRzKQogICBjb252ZXJ0cyBpdCB0byBzdGFuZGFyZCBmb3JtYXQgaWYgaXQgY2FuIHVuZGVyc3RhbmQgaXQsIG90aGVyd2lzZSBpdAogICBwcmludHMgYW4gZXJyb3IgbWVzc2FnZS4KCiAgIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZGVhbCB3aXRoIGRhdGVzIGFuZCB0aW1lczsgYW55CiAgIGZ1bmN0aW9uIGFyZ3VtZW50IGRlc2lnbmF0ZWQgYXMgImRhdGUtdGltZSIgY2FuIGJlIGluIGFueSBvZiB0aGUKICAgZm9ybWF0cyBkZXNjcmliZWQgYWJvdmUuCgogICBcdihkYXkpCiAgICAgICAgICBUaGUgZmlyc3QgdGhyZWUgbGV0dGVycyBvZiB0aGUgRW5nbGlzaCB3b3JkIGZvciB0aGUgY3VycmVudCBkYXkKICAgICAgICAgIG9mIHRoZSB3ZWVrLCBlLmcuICJXZWQiLgoKICAgXGZkYXkoZGF0ZS10aW1lKQogICAgICAgICAgVGhlIGZpcnN0IHRocmVlIGxldHRlcnMgb2YgdGhlIEVuZ2xpc2ggd29yZCBmb3IgZGF5IG9mIHRoZSB3ZWVrCiAgICAgICAgICBvZiB0aGUgZ2l2ZW4gZGF0ZS4gSWYgYSB0aW1lIGlzIGluY2x1ZGVkLCBpdCBpcyBpZ25vcmVkLgogICAgICAgICAgRXhhbXBsZTogXGZkYXkoOCBGZWIgMTk4OCkgPSAiTW9uIi4KCiAgIFx2KG5kYXkpCiAgICAgICAgICBUaGUgbnVtZXJpYyBkYXkgb2YgdGhlIHdlZWs6IDAgPSBTdW5kYXksIDEgPSBNb25kYXksIC4uLiwgNiA9CiAgICAgICAgICBTYXR1cmRheS4KCiAgIFxmbmRheShkYXRlLXRpbWUpCiAgICAgICAgICBUaGUgbnVtZXJpYyBkYXkgb2YgdGhlIHdlZWsgZm9yIHRoZSBnaXZlbiBkYXRlLiBJZiBhIHRpbWUgaXMKICAgICAgICAgIGluY2x1ZGVkLCBpdCBpcyBpZ25vcmVkLiBFeGFtcGxlOiBcZm5kYXkoOCBGZWIgMTk4OCkgPSAiMSIuCgogICBcdihkYXRlKQogICAgICAgICAgVGhlIGN1cnJlbnQgZGF0ZSBhcyBkZCBtbW0geXl5eSwgZS5nLiAiMDggRmViIDIwMDAiIChhcyBpbiB0aGlzCiAgICAgICAgICBleGFtcGxlLCBhIGxlYWRpbmcgemVybyBpcyBzdXBwbGllZCBmb3IgZGF5LW9mLW1vbnRoIGxlc3MgdGhhbgogICAgICAgICAgMTApLgoKICAgXHYobmRhdGUpCiAgICAgICAgICBUaGUgY3VycmVudCBkYXRlIGluIG51bWVyaWMgZm9ybWF0OiB5eXl5bW1kZCwgZS5nLiAiMjAwMDAyMDgiLgoKICAgXHYodGltZSkKICAgICAgICAgIFRoZSBjdXJyZW50IHRpbWUgYXMgaGg6bW06c3MsIGUuZy4gIjE1OjI3OjE0Ii4KCiAgIFxmdGltZSh0aW1lKQogICAgICAgICAgVGhlIGdpdmVuIGZyZWUtZm9ybWF0IGRhdGUgYW5kL29yIHRpbWUgKGUuZy4gIjNwbSIpIHJldHVybnMgdGhlCiAgICAgICAgICB0aW1lICh3aXRob3V0IHRoZSBkYXRlKSBjb252ZXJ0ZWQgdG8gaGg6bW06c3MgMjQtaG91ciBmb3JtYXQsCiAgICAgICAgICBlLmcuICIxNTowMDowMCIgKHRoZSBkYXRlLCBpZiBnaXZlbiwgaXMgaWdub3JlZCkuCgogICBcdihudGltZSkKICAgICAgICAgIFRoZSBjdXJyZW50IHRpbWUgYXMgc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgZS5nLiAiNTU2MzQiLgoKICAgXHYodGZ0aW1lKQogICAgICAgICAgVGhlIGVsYXBzZWQgdGltZSBvZiB0aGUgbW9zdCByZWNlbnQgZmlsZS10cmFuc2ZlciBvcGVyYXRpb24gaW4KICAgICAgICAgIHNlY29uZHMuCgogICBcdihpbnRpbWUpCiAgICAgICAgICBUaGUgZWxhcHNlZCB0aW1lIGZvciB0aGUgbW9zdCByZWNlbnQgSU5QVVQgY29tbWFuZCB0byBjb21wbGV0ZSwKICAgICAgICAgIGluIG1pbGxpc2Vjb25kcy4KCiAgIFxmbnRpbWUodGltZSkKICAgICAgICAgIFRoZSBnaXZlbiBmcmVlLWZvcm1hdCBkYXRlIGFuZC9vciB0aW1lIGlzIGNvbnZlcnRlZCB0byBzZWNvbmRzCiAgICAgICAgICBzaW5jZSBtaWRuaWdodCAodGhlIGRhdGUsIGlmIGdpdmVuLCBpcyBpZ25vcmVkKS4gVGhpcyBmdW5jdGlvbgogICAgICAgICAgcmVwbGFjZXMgXGZ0b2Qyc2VjcygpLCB3aGljaCBpcyBub3cgYSBzeW5vbnltIGZvciBcZm50aW1lKCkuCiAgICAgICAgICBVbmxpa2UgXGZ0b2Qyc2VjcygpLCBcZm50aW1lKCkgYWxsb3dzIGEgZGF0ZSB0byBiZSBpbmNsdWRlZCwKICAgICAgICAgIGFuZCBpdCBhbGxvd3MgdGhlIHRpbWUgdG8gYmUgaW4gZnJlZSBmb3JtYXQgKGxpa2UgM3BtKSwgYW5kIGl0CiAgICAgICAgICBhbGxvd3MgdGhlIGFtb3VudCBvZiB0aW1lIHRvIGJlIG1vcmUgdGhhbiAyNCBob3Vycy4gRS5nLgogICAgICAgICAgXGZudGltZSg0ODowMDowMCkgPSAxNzI4MDAuIEV4YW1wbGUgb2YgdXNlOgoKICBzZXQgYWxhcm0gXGZudGltZSg0ODowMDowMCkgOyBzZXQgYWxhcm0gNDggaG91cnMgZnJvbSBub3cuCgogICBcZm4ydGltZShzZWNvbmRzKQogICAgICAgICAgVGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzIGlzIGNvbnZlcnRlZCB0byBoaDptbTpzcyBmb3JtYXQuCgogICBcZmRhdGUoZmlsZW5hbWUpCiAgICAgICAgICBSZXR1cm5zIHRoZSBtb2RpZmljYXRpb24gZGF0ZS10aW1lIG9mIHRoZSBnaXZlbiBmaWxlIGluCiAgICAgICAgICBzdGFuZGFyZCBmb3JtYXQ6IHl5eXltbWRkIGhoOm1tOnNzLgoKICAgXGZjdnRkYXRlKGRhdGUtdGltZSkKICAgICAgICAgIENvbnZlcnRzIGEgZnJlZS1mb3JtYXQgZGF0ZSBhbmQvb3IgdGltZSB0byBLZXJtaXQgc3RhbmRhcmQKICAgICAgICAgIGZvcm1hdDogeXl5eW1tZGQgaGg6bW06c3MuIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm5zIHRoZQogICAgICAgICAgY3VycmVudCBkYXRlLXRpbWUgaW4gc3RhbmRhcmQgZm9ybWF0LiBJZiBhIGRhdGUgaXMgZ2l2ZW4gYnV0IG5vCiAgICAgICAgICB0aW1lLCB0aGUgY29udmVydGVkIGRhdGUgaXMgcmV0dXJuZWQgd2l0aG91dCBhIHRpbWUuIElmIGEgdGltZQogICAgICAgICAgaXMgZ2l2ZW4gd2l0aCBubyBkYXRlLCB0aGUgY3VycmVudCBkYXRlIGlzIHN1cHBsaWVkLiBFeGFtcGxlczoKCiAgXGZjdnRkYXRlKDQgSnVsIDIwMDAgMjoyMToxN3BtKSA9IDIwMDAwNzA0IDE0OjIxOjE3CiAgXGZjdnRkYXRlKCkgPSAyMDAwMDcwNCAxNDoyMToxNyAob24gNCBKdWwgMjAwMCBhdCAyOjIxOjE3cG0pLgogIFxmY3Z0ZCg0IEp1bCAyMDAwKSA9IDIwMDAwNzA0CiAgXGZjdnRkKDZwbSkgPSAyMDAwMDcwNCAxODowMDowMCAob24gNCBKdWwgMjAwMCBhdCA2OjAwcG0pLgoKICAgXGZkYXlvZnllYXIoZGF0ZS10aW1lKQogICBcZmRveShkYXRlLXRpbWUpCiAgICAgICAgICBDb252ZXJ0cyBhIGZyZWUtZm9ybWF0IGRhdGUgYW5kL29yIHRpbWUgdG8geXl5eWRkZCwgd2hlcmUgZGRkCiAgICAgICAgICBpcyB0aGUgMy1kaWdpdCBkYXkgb2YgdGhlIHllYXIsIGFuZCAxIEphbnVhcnkgaXMgRGF5IDEuIElmIGEKICAgICAgICAgIHRpbWUgaXMgaW5jbHVkZWQgd2l0aCB0aGUgZGF0ZSwgaXQgaXMgcmV0dXJuZWQgaW4gc3RhbmRhcmQKICAgICAgICAgIGZvcm1hdC4gSWYgYSBkYXRlIGlzIGluY2x1ZGVkIGJ1dCBubyB0aW1lLCB0aGUgZGF0ZSBpcyByZXR1cm5lZAogICAgICAgICAgd2l0aG91dCBhIHRpbWUuIElmIGEgdGltZSBpcyBnaXZlbiB3aXRoIG5vIGRhdGUsIHRoZSB0aW1lIGlzCiAgICAgICAgICBjb252ZXJ0ZWQgYW5kIHRoZSBjdXJyZW50IGRhdGUgaXMgc3VwcGxpZWQuIElmIG5vIGFyZ3VtZW50IGlzCiAgICAgICAgICBnaXZlbiwgdGhlIGN1cnJlbnQgZGF0ZS10aW1lIGlzIHJldHVybmVkLiBTeW5vbnltOiBcZmRveSgpLgogICAgICAgICAgRXhhbXBsZXM6CgogIFxmZGRheW9meWVhcig0IEp1bCAyMDAwIDI6MjE6MTdwbSkgPSAyMDAwMTg1IDE0OjIxOjE3CiAgXGZkb3koKSA9IDIwMDAxODUgMTQ6MjE6MTcgKG9uIDQgSnVsIDIwMDAgYXQgMjoyMToxN3BtKS4KICBcZmRveSg0IEp1bCAyMDAwKSA9IDIwMDAxODUKICBcZmRveSg2cG0pID0gMjAwMDE4NSAxODowMDowMCAob24gNCBKdWwgMjAwMCBhdCA2OjAwcG0pLgoKICAgTm90ZTogVGhlIHl5eXlkZGQgZGF5LW9mLXllYXIgZm9ybWF0IGlzIG9mdGVuIGVycm9uZW91c2x5IHJlZmVycmVkIHRvCiAgIGFzIGEgSnVsaWFuIGRhdGUuIEhvd2V2ZXIsIGEgdHJ1ZSBKdWxpYW4gZGF0ZSBpcyBhIHNpbXBsZSBjb3VudGluZwogICBudW1iZXIsIHRoZSBudW1iZXIgb2YgZGF5cyBzaW5jZSBhIGNlcnRhaW4gZml4ZWQgZGF5IGluIHRoZSBwYXN0LgogICBbMzU2XVNlZSBcZm1qZCgpIGJlbG93LgoKICAgXGZkb3kyZGF0ZShkYXRlLXRpbWUpCiAgICAgICAgICBDb252ZXJ0cyBhIGRhdGUgb3IgZGF0ZS10aW1lIGluIGRheS1vZi15ZWFyIGZvcm1hdCB0byBhCiAgICAgICAgICBzdGFuZGFyZCBmb3JtYXQgZGF0ZS4gQSB5eXl5ZGRkLWZvcm1hdCBkYXRlIG11c3QgYmUgc3VwcGxpZWQ7CiAgICAgICAgICB0aW1lIGlzIG9wdGlvbmFsLiBUaGUgZ2l2ZW4gZGF0ZSBpcyBjb252ZXJ0ZWQgdG8geXl5eW1tZGQKICAgICAgICAgIGZvcm1hdC4gSWYgYSB0aW1lIGlzIGdpdmVuLCBpdCBpcyBjb252ZXJ0ZWQgdG8gMjQtaG91ciBmb3JtYXQuCiAgICAgICAgICBFeGFtcGxlczoKCiAgXGZkb3kyZGF0ZSgyMDAwMTg1KSA9IDIwMDAwNzA0CiAgXGZkb3kyKDIwMDAxODUgM3BtKSA9IDIwMDAwNzA0IDE1OjAwOjAwCgogICBcZm1qZChkYXRlLXRpbWUpCiAgICAgICAgICBDb252ZXJ0cyBmcmVlLWZvcm1hdCBkYXRlIGFuZC9vciB0aW1lIHRvIGEgTW9kaWZpZWQgSnVsaWFuIERhdGUKICAgICAgICAgIChNSkQpLCB0aGUgbnVtYmVyIG9mIGRheXMgc2luY2UgMTcgTm92IDE4NTggMDA6MDA6MDAuIElmIGEgdGltZQogICAgICAgICAgaXMgZ2l2ZW4sIGl0IGlzIGlnbm9yZWQuIEV4YW1wbGVzOgoKICBcZm1qZCg0IEp1bCAyMDAwKSA9IDUwOTk4CiAgXGZtamQoMTcgTm92IDE4NTgpID0gMAogIFxmbWpkKDE2IE5vdiAxODU4KSA9IC0xCgogICBcZm1qZDJkYXRlKG1qZCkKICAgICAgICAgIENvbnZlcnRzIGFuIE1KRCAoaW50ZWdlcikgdG8gc3RhbmRhcmQgZGF0ZSBmb3JtYXQsIHl5eXltbWRkOgoKICBcZm1qZDIoNTA5OTgpID0gNCBKdWwgMTk5OAogIFxmbWpkMigwKSA9IDE3IE5vdiAxODU4CiAgXGZtamQyKC0xKSA9IDE2IE5vdiAxODU4CiAgXGZtamQyKC0zNjUpID0gMTcgTm92IDE4NTcKCiAgIE1KRHMgYXJlIG5vcm1hbCBpbnRlZ2VycyBhbmQsIHVubGlrZSBET1lzLCBtYXkgYmUgYWRkZWQsIHN1YnRyYWN0ZWQsCiAgIGV0Yywgd2l0aCBlYWNoIG90aGVyIG9yIHdpdGggb3RoZXIgaW50ZWdlcnMsIHRvIG9idGFpbiBtZWFuaW5nZnVsCiAgIHJlc3VsdHMuIEZvciBleGFtcGxlLCB0byBmaW5kIG91dCB0aGUgZGF0ZSAyMTIgZGF5cyBhZ286CgogIGVjaG8gXGZtamQyZGF0ZShcZm1qZCgpLTIxMikKCiAgIENvbnN0cnVjdGlvbnMgc3VjaCBhcyB0aGlzIGNhbiBiZSB1c2VkIGluIGFueSBjb21tYW5kIHdoZXJlIGEKICAgZGF0ZS10aW1lIGlzIHJlcXVpcmVkLCBlLmcuOgoKICBzZW5kIC9hZnRlcjpcZm1qZDJkYXRlKFxmbWpkKCktMjEyKQoKICAgdG8gc2VuZCBhbGwgZmlsZXMgdGhhdCBhcmUgbm90IG9sZGVyIHRoYW4gMjEyIGRheXMgKHRoaXMgaXMgZXF1aXZhbGVudAogICB0byAic2VuZCAvYWZ0ZXI6LTIxMmRheXMiKS4KCiAgIE1KRHMgYWxzbyBoYXZlIG90aGVyIHJlZ3VsYXJpdGllcyBub3QgZXhoaWJpdGVkIGJ5IG90aGVyIGRhdGUgZm9ybWF0cy4KICAgRm9yIGV4YW1wbGUsIFxmbW9kdWx1cyhcZm1qZChhbnktZGF0ZSksNykgZ2l2ZXMgdGhlIGRheSBvZiB0aGUgd2VlawogICBmb3IgYW55IGRhdGUgKHdoZXJlIDQ9U3VuLCA1PU1vbiwgLi4uLCAzPVNhdCkuIChIb3dldmVyLCBpdCBpcyBlYXNpZXIKICAgdG8gdXNlIFxmbmRheSgpIGZvciB0aGlzIHB1cnBvc2UsIGFuZCBpdCBnaXZlcyB0aGUgbW9yZSBjb252ZW50aW9uYWwKICAgcmVzdWx0IG9mIDA9U3VuLCAxPU1vbiwgLi4uLCA2PVNhdCkuCgogICBOb3RlIHRoYXQgaWYgTUpEcyBhcmUgdG8gYmUgY29tcGFyZWQsIHRoZXkgbXVzdCBiZSBjb21wYXJlZAogICBudW1lcmljYWxseSAoSUYgPCwgPSwgPikgYW5kIG5vdCBsZXhpY2FsbHkgKElGIExMVCwgRVFVQUwsIExHVCksCiAgIHdoZXJlYXMgRE9ZcyBtdXN0IGJlIGNvbXBhcmVkIGxleGljYWxseSBpZiB0aGV5IGluY2x1ZGUgYSB0aW1lICh3aGljaAogICBjb250YWlucyAiOiIgY2hhcmFjdGVycyk7IGhvd2V2ZXIsIGlmIERPWXMgZG8gbm90IGluY2x1ZGUgYSB0aW1lLCB0aGV5CiAgIG1heSBhbHNvIGJlIGNvbXBhcmVkIG51bWVyaWNhbGx5LgoKICAgSW4gYW55IGNhc2UsIGxleGljYWwgY29tcGFyaXNvbiBvZiBET1lzIGFsd2F5cyBwcm9kdWNlcyB0aGUKICAgYXBwcm9wcmlhdGUgcmVzdWx0LCBhcyBkb2VzIG51bWVyaWMgY29tcGFyaXNvbiBvZiBNSkRzLgoKICAgVGhlIHNhbWUgY29tbWVudHMgYXBwbHkgdG8gc29ydGluZy4gQWxzbyBub3RlIHRoYXQgRE9ZcyBhcmUgZml4ZWQKICAgbGVuZ3RoLCBidXQgTUpEcyBjYW4gdmFyeSBpbiBsZW5ndGguIEhvd2V2ZXIsIGFsbCBNSkRzIGJldHdlZW4gMyBBcHJpbAogICAxODg2IGFuZCAzMCBBdWcgMjEzMiBhcmUgNSBkZWNpbWFsIGRpZ2l0cyBsb25nLiAoTUpEcyBiZWNvbWUgNiBkaWdpdHMKICAgbG9uZyBvbiAzMSBBdWcgMjEzMiwgYW5kIDcgZGlnaXRzIGxvbmcgb24gMTMgT2N0IDQ1OTYpLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEuNy4gUGFydGlhbCBDb21wbGV0aW9uIG9mIEtleXdvcmRzCgogICBQYXJ0aWFsIGNvbXBsZXRpb24gb2Yga2V5d29yZHMgd2FzIGFkZGVkIGluIEMtS2VybWl0IDcuMC4gSW4gcHJpb3IKICAgdmVyc2lvbnMsIGlmIGNvbXBsZXRpb24gd2FzIGF0dGVtcHRlZCAoYnkgcHJlc3NpbmcgdGhlIEVzYyBvciBUYWIga2V5KQogICBvbiBhIHN0cmluZyB0aGF0IG1hdGNoZWQgZGlmZmVyZW50IGtleXdvcmRzLCB5b3UnZCBqdXN0IGdldCBhIGJlZXAuCiAgIE5vdyBLZXJtaXQgY29tcGxldGVzIHVwIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgd2hlcmUgdGhlIHBvc3NpYmx5CiAgIG1hdGNoaW5nIGtleXdvcmRzIGRpZmZlciBhbmQgdGhlbiBiZWVwcy4gRm9yIGV4YW1wbGU6CgogIEMtS2VybWl0PiBzZW5kIC9uPFRhYj4KCiAgIHdoaWNoIG1hdGNoZXMgL05PVC1CRUZPUkUgYW5kIC9OT1QtQUZURVIsIG5vdyBjb21wbGV0ZXMgdXAgdG8gdGhlCiAgIGRhc2g6CgogIEMtS2VybWl0PiBzZW5kIC9uPFRhYj5vdC08QmVlcD4KCiAgIFBhcnRpYWwgY29tcGxldGlvbiB3b3JrcyBmb3IgZmlsZW5hbWVzIHRvbyAoYXMgaXQgaGFzIGZvciBzb21lIHllYXJzKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAxLjguIENvbW1hbmQgUmVjYWxsCgogICBDLUtlcm1pdCBoYXMgaGFkIGEgY29tbWFuZCBoaXN0b3J5IGJ1ZmZlciBmb3Igc29tZSB0aW1lLCB3aGljaCBjb3VsZAogICBiZSBzY3JvbGxlZCBpbnRlcmFjdGl2ZWx5IHVzaW5nIGNvbnRyb2wgY2hhcmFjdGVycyBvciAoaW4gS2VybWl0IDk1CiAgIG9ubHkpIGFycm93IGtleXMuIFZlcnNpb24gNy4wIGFkZHMgYSBSRURPIGNvbW1hbmQgdGhhdCBhbGxvd3MgdGhlIG1vc3QKICAgcmVjZW50IGNvbW1hbmQgbWF0Y2hpbmcgYSBnaXZlbiBwYXR0ZXJuIHRvIGJlIHJlLWV4ZWN1dGVkOgoKICAgeyBSRURPLCBSUiwgXiB9IFsgcGF0dGVybiBdCiAgICAgICAgICBTZWFyY2ggdGhlIGNvbW1hbmQgaGlzdG9yeSBsaXN0IGZvciB0aGUgbW9zdCByZWNlbnQgY29tbWFuZAogICAgICAgICAgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLCBhbmQgaWYgb25lIGlzIGZvdW5kLCBleGVjdXRlIGl0CiAgICAgICAgICBhZ2Fpbi4KCiAgIFRoZSBwYXR0ZXJuIGNhbiBiZSBhIHNpbXBsZSBzdHJpbmcgKGxpa2UgInNlbmQiKSwgaW4gd2hpY2ggY2FzZSB0aGUKICAgbGFzdCBTRU5EIGNvbW1hbmQgaXMgcmUtZXhlY3V0ZWQuIE9yIGl0IGNhbiBjb250YWluIHdpbGRjYXJkCiAgIGNoYXJhY3RlcnMgIioiIGFuZC9vciAiPyIsIHdoaWNoIG1hdGNoIGFueSBzdHJpbmcgYW5kIGFueSBzaW5nbGUKICAgY2hhcmFjdGVyLCByZXNwZWN0aXZlbHkgKG5vdGUgdGhhdCAiPyIgbXVzdCBiZSBwcmVjZWRlZCBieSBiYWNrc2xhc2gKICAgdG8gb3ZlcnJpZGUgaXRzIG5vcm1hbCBmdW5jdGlvbiBvZiBnaXZpbmcgaGVscCksIGFuZCBpbiBtb3N0IEMtS2VybWl0CiAgIHZlcnNpb25zIG1heSBhbHNvIGluY2x1ZGUgW10gY2hhcmFjdGVyIGxpc3RzIGFuZCB7fSBzdHJpbmcgbGlzdHMgKHNlZQogICBbMzU3XVNlY3Rpb24gNC45KS4KCiAgIFRoZSBtYXRjaCB3b3JrcyBieSBhcHBlbmRpbmcgIioiIHRvIHRoZSBlbmQgb2YgdGhlIGdpdmVuIHBhdHRlcm4gKGlmCiAgIHlvdSBkaWRuJ3QgcHV0IG9uZSB0aGVyZSB5b3Vyc2VsZikuIFRodXMgInJlZG8gKm9vZmEiIGJlY29tZXMgInJlZG8KICAgKm9vZmEqIiBhbmQgdGhlcmVmb3JlIG1hdGNoZXMgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQgdGhhdCBjb250YWlucwogICAib29mYSIgYW55d2hlcmUgd2l0aGluIHRoZSBjb21tYW5kLiBJZiB5b3Ugd2FudCB0byBpbmhpYml0IHRoZQogICBhcHBsaWNhdGlvbiBvZiB0aGUgdHJhaWxpbmcgIioiLCBlLmcuIHRvIGZvcmNlIG1hdGNoaW5nIGEgc3RyaW5nIGF0CiAgIHRoZSBlbmQgb2YgYSBjb21tYW5kLCBlbmNsb3NlIHRoZSBwYXR0ZXJuIGluIGJyYWNlczoKCiAgcmVkbyB7Km9vZmF9CgogICBtYXRjaGVzIHRoZSBtb3N0IHJlY2VudCBjb21tYW5kIHRoYXQgZW5kcyB3aXRoICJvb2ZhIi4KCiAgIFJFRE8gY29tbWFuZHMgdGhlbXNlbHZlcyBhcmUgbm90IGVudGVyZWQgaW50byB0aGUgY29tbWFuZCBoaXN0b3J5CiAgIGxpc3QuIElmIG5vIHBhdHRlcm4gaXMgZ2l2ZW4sIHRoZSBwcmV2aW91cyAobm9uLVJFRE8pIGNvbW1hbmQgaXMKICAgcmUtZXhlY3V0ZWQuIFRoZSBSRURPbmUgY29tbWFuZCBpcyByZWluc2VydGVkIGF0IHRoZSBlbmQgb2YgdGhlCiAgIGNvbW1hbmQgaGlzdG9yeSBidWZmZXIsIHNvIHRoZSBjb21tYW5kIHNjcm9sbGJhY2sgY2hhcmFjdGVyIChDdHJsLVAsCiAgIEN0cmwtQiwgb3IgVXBhcnJvdykgY2FuIHJldHJpZXZlIGl0LgoKICAgRXhhbXBsZXM6CgogIEMtS2VybWl0PiBlY2hvIGZvbwogIGZvbwogIEMtS2VybWl0PiBzaG93IGFsYXJtCiAgKG5vIGFsYXJtIHNldCkKICBDLUtlcm1pdD4gZWNobyBibGFoCiAgYmxhaAogIEMtS2VybWl0PiByZWRvICAgICAgICAgIDsgTW9zdCByZWNlbnQgY29tbWFuZAogIGJsYWgKICBDLUtlcm1pdD4gcmVkbyBzICAgICAgICA7IE1vc3QgcmVjZW50IGNvbW1hbmQgc3RhcnRpbmcgd2l0aCAicyIKICAobm8gYWxhcm0gc2V0KQogIEMtS2VybWl0PiByZWRvIGVjaG8gZiAgIDsgTW9zdCByZWNlbnQgY29tbWFuZCBzdGFydGluZyB3aXRoICJlY2hvIGYiCiAgZm9vCiAgQy1LZXJtaXQ+IHJlZG8gKmZvbyAgICAgOyBNb3N0IHJlY2VudCBjb21tYW5kIHRoYXQgaGFzICJmb28iIGluIGl0CiAgZm9vCiAgQy1LZXJtaXQ+IDxDdHJsLVA+ICAgICAgOyBTY3JvbGwgYmFjawogIEMtS2VybWl0PiBlY2hvIGZvbyAgICAgIDsgVGhlIFJFRE9uZSBjb21tYW5kIGlzIHRoZXJlCiAgQy1LZXJtaXQ+IHJlZG8geypmb299ICAgOyBNb3N0IHJlY2VudCBjb21tYW5kIHRoYXQgZW5kcyB3aXRoICJmb28iCiAgZm9vCiAgQy1LZXJtaXQ+CgogICBTaW5jZSBSRURPLCBSRURJQUwsIGFuZCBSRURJUkVDVCBhbGwgc3RhcnQgdGhlIHNhbWUgd2F5LCBhbmQgUkVEIGlzCiAgIHRoZSBkZXNpZ25hdGVkIG5vbi11bmlxdWUgYWJicmV2aWF0aW9uIGZvciBSRURJQUwsIFJFRE8gbXVzdCBiZQogICBzcGVsbGVkIG91dCBpbiBmdWxsLiBGb3IgY29udmVuaWVuY2UsIFJSIGlzIGluY2x1ZGVkIGFzIGFuIGludmlzaWJsZQogICBlYXN5LXRvLXR5cGUgc3lub255bSBmb3IgUkVETy4gWW91IGNhbiBhbHNvIHVzZSB0aGUgIl4iIGNoYXJhY3RlciBmb3IKICAgdGhpczoKCiAgQy1LZXJtaXQ+IF4gICAgICAgICAgICAgOyBNb3N0IHJlY2VudCBjb21tYW5kCiAgQy1LZXJtaXQ+IF4gcyAgICAgICAgICAgOyBNb3N0IHJlY2VudCBjb21tYW5kIHN0YXJ0aW5nIHdpdGggInMiCiAgQy1LZXJtaXQ+IF5zICAgICAgICAgICAgOyBEaXR0byAoc3BhY2Ugbm90IHJlcXVpcmVkIGFmdGVyICJeIikuCiAgQy1LZXJtaXQ+IF4qZm9vICAgICAgICAgOyBNb3N0IHJlY2VudCBjb21tYW5kIHRoYXQgaGFzICJmb28iIGluIGl0LgogIEMtS2VybWl0PiBeeypmb299ICAgICAgIDsgTW9zdCByZWNlbnQgY29tbWFuZCBlbmRzIHdpdGggImZvbyIuCgogICBVbmxpa2UgdGhlIG1hbnVhbCBjb21tYW5kLWhpc3Rvcnktc2Nyb2xsaW5nIGtleXMsIHRoZSBSRURPIGNvbW1hbmQgY2FuCiAgIGJlIHVzZWQgaW4gYSBzY3JpcHQsIGJ1dCBpdCdzIG5vdCByZWNvbW1lbmRlZCAoc2luY2UgdGhlIGNvbW1hbmQgdG8gYmUKICAgUkVET25lIG1pZ2h0IG5vdCBiZSBmb3VuZCwgc28gaWYgdGhlIFJFRE8gY29tbWFuZCBmYWlscywgeW91IGNhbid0CiAgIHRlbGwgd2hldGhlciBpdCB3YXMgYmVjYXVzZSBSRURPIGZhaWxlZCB0byBmaW5kIHRoZSByZXF1ZXN0ZWQgY29tbWFuZCwKICAgb3IgYmVjYXVzZSB0aGUgY29tbWFuZCB3YXMgZm91bmQgYnV0IGl0IGZhaWxlZCkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS45LiBFWElUIE1lc3NhZ2VzCgogICBUaGUgRVhJVCBhbmQgUVVJVCBjb21tYW5kcyBub3cgYWNjZXB0IGFuIG9wdGlvbmFsIG1lc3NhZ2UgdG8gYmUKICAgcHJpbnRlZC4gVGhpcyBtYWtlcyB0aGUgc3ludGF4IG9mIEVYSVQgYW5kIFFVSVQganVzdCBsaWtlIEVORCBhbmQKICAgU1RPUDoKCiAgIHsgRVhJVCwgUVVJVCwgRU5ELCBTVE9QIH0gWyBzdGF0dXMtY29kZSBbIG1lc3NhZ2UgXSBdCgogICB3aGVyZSBzdGF0dXMtY29kZSBpcyBhIG51bWJlciAoMCBpbmRpY2F0aW5nIHN1Y2Nlc3MsIG5vbnplcm8KICAgaW5kaWNhdGluZyBmYWlsdXJlKS4gVGhpcyBpcyBoYW5keSBpbiBzY3JpcHRzIHRoYXQgYXJlIG5ldmVyIHN1cHBvc2VkCiAgIHRvIGVudGVyIGludGVyYWN0aXZlIG1vZGU6CgogIGRpYWwgNzY1NDMyMQogIGlmIGZhaWwgZXhpdCAxIENhbid0IG1ha2UgY29ubmVjdGlvbiAtIHRyeSBhZ2FpbiBsYXRlci4KCiAgIFByZXZpb3VzbHkgdGhpcyBjb3VsZCBvbmx5IGJlIGRvbmUgaW4gdHdvIHN0ZXBzOgoKICBkaWFsIDc2NTQzMjEKICB4aWYgZmFpbCB7IGVjaG8gQ2FuJ3QgbWFrZSBjb25uZWN0aW9uIC0gdHJ5IGFnYWluIGxhdGVyLCBleGl0IDEgfQoKICAgQSBzdGF0dXMgY29kZSBtdXN0IGJlIGluY2x1ZGVkIGluIG9yZGVyIHRvIHNwZWNpZnkgYSBtZXNzYWdlLiBJbiB0aGUKICAgY2FzZSBvZiBFWElUIGFuZCBRVUlULCB0aGUgZGVmYXVsdCBzdGF0dXMgY29kZSBpcyBjb250YWluZWQgaW4gdGhlCiAgIHZhcmlhYmxlIFx2KGV4aXRzdGF0dXMpLCBhbmQgaXMgc2V0IGF1dG9tYXRpY2FsbHkgYnkgdmFyaW91cyBldmVudHMKICAgKGZpbGUgdHJhbnNmZXIgZmFpbHVyZXMsIGV0YzsgaXQgY2FuIGFsc28gYmUgc2V0IGV4cGxpY2l0bHkgd2l0aCB0aGUKICAgU0VUIEVYSVQgU1RBVFVTIGNvbW1hbmQpLiBJZiB5b3Ugd2FudCB0byBnaXZlIGFuIEVYSVQgb3IgUVVJVCBjb21tYW5kCiAgIHdpdGggYSBtZXNzYWdlLCBidXQgd2l0aG91dCBjaGFuZ2luZyB0aGUgZXhpdCBzdGF0dXMgZnJvbSB3aGF0IGl0CiAgIG5vcm1hbGx5IHdvdWxkIGhhdmUgYmVlbiwgdXNlIHRoZSBcdihleGl0c3RhdHVzKSB2YXJpYWJsZSwgZS5nLjoKCiAgIGV4aXQgXHYoZXhpc3RhdHVzKSBHb29kYnllIGZyb20gXHYoY21kZmlsZSkuCgogICBUaGUgRVhJVCBzdGF0dXMgaXMgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbSBzaGVsbCBvciB3aGF0ZXZlciBvdGhlcgogICBwcm9jZXNzIGludm9rZWQgQy1LZXJtaXQsIGUuZy4gaW4gVU5JWDoKCiAgQy1LZXJtaXQ+IGV4aXQgOTcgYnllIGJ5ZQogIGJ5ZSBieWUKICAkIGVjaG8gJD8KICA5NwogICQKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAxLjEwLiBNYW5hZ2luZyBLZXlib2FyZCBJbnRlcnJ1cHRpb25zCgogICBXaGVuIEMtS2VybWl0IGlzIGluIGNvbW1hbmQgb3IgZmlsZS10cmFuc2ZlciBtb2RlIChhcyBvcHBvc2VkIHRvCiAgIENPTk5FQ1QgbW9kZSksIGl0IGNhbiBiZSBpbnRlcnJ1cHRlZCB3aXRoIEN0cmwtQy4gVmVyc2lvbiA3LjAgYWRkcyB0aGUKICAgYWJpbGl0eSB0byBkaXNhcm0gdGhlIEN0cmwtQyBpbnRlcnJ1cHQ6CgogICBTRVQgQ09NTUFORCBJTlRFUlJVUFQgeyBPTiwgT0ZGIH0KICAgICAgICAgIENPTU1BTkQgSU5URVJSVVBUIGlzIE9OIGJ5IGRlZmF1bHQsIG1lYW5pbmcgdGhlIEN0cmwtQyBjYW4gYmUKICAgICAgICAgIHVzZWQgdG8gaW50ZXJydXB0IGEgY29tbWFuZCBvciBhIGZpbGUgdHJhbnNmZXIgaW4gcHJvZ3Jlc3MuIFVzZQogICAgICAgICAgT0ZGIHRvIGRpc2FibGUgdGhlc2UgaW50ZXJydXB0aW9ucywgYW5kIHVzZSBpdCB3aXRoIGdyZWF0CiAgICAgICAgICBjYXV0aW9uIGZvciBvYnZpb3VzIHJlYXNvbnMuCgogICBTRVQgVFJBTlNGRVIgSU5URVJSVVBUIHsgT04sIE9GRiB9CiAgICAgICAgICBUaGlzIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUga2V5Ym9hcmQgaW50ZXJydXB0aW9uIG9mIGZpbGUKICAgICAgICAgIHRyYW5zZmVyIHdoZW4gQy1LZXJtaXQgaXMgaW4gbG9jYWwgbW9kZSwgb3IgdG8gcmUtZW5hYmxlIGl0CiAgICAgICAgICBhZnRlciBpdCBoYXMgYmVlbiBkaXNhYmxlZC4gVGhpcyBhcHBsaWVzIHRvIHRoZSBYLCBaLCBFLCBhbmQKICAgICAgICAgIHNpbWlsYXIga2V5cyBhcyB3ZWxsIGFzIHRvIHRoZSBzeXN0ZW0gaW50ZXJydXB0IGNoYXJhY3RlciwKICAgICAgICAgIHVzdWFsbHkgQ3RybC1DLiBUaGlzIGlzIGRpc3RpbmN0IGZyb20gU0VUIFRSQU5TRkVSCiAgICAgICAgICBDQU5DRUxMQVRJT04sIHdoaWNoIHRlbGxzIHdoZXRoZXIgcGFja2V0IG1vZGUgY2FuIGJlIGV4aXRlZCBieQogICAgICAgICAgc2VuZGluZyBhIHNwZWNpYWwgc2VxdWVuY2Ugb2YgY2hhcmFjdGVycy4KCiAgIFNldmVyYWwgb3RoZXIgY29tbWFuZHMgY2FuIGJlIGludGVycnVwdGVkIGJ5IHByZXNzaW5nIGFueSBrZXkgd2hpbGUKICAgdGhleSBhcmUgYWN0aXZlLiBWZXJzaW9uIDcuMCBhZGRzIHRoZSBhYmlsaXR5IHRvIGRpc2FibGUgdGhpcyBmb3JtIG9mCiAgIGludGVycnVwdGlvbiBhbHNvOgoKICAgU0VUIElOUFVUIENBTkNFTExBVElPTiB7IE9OLCBPRkYgfQogICAgICAgICAgV2hldGhlciBhbiBJTlBVVCBjb21tYW5kIGluIHByb2dyZXNzIGNhbiBiZSBpbnRlcnJ1cHRlZCBieQogICAgICAgICAgcHJlc3NpbmcgYSBrZXkuIE5vcm1hbGx5IE9OLiBTZXR0aW5nIElOUFVUIENBTkNFTExBVElPTiBPRkYKICAgICAgICAgIG1ha2VzIElOUFVUIGNvbW1hbmRzIHVuaW50ZXJydXB0aWJsZSBleGNlcHQgYnkgQ3RybC1DICh1bmxlc3MKICAgICAgICAgIENPTU1BTkQgSU5URVJSVVBUSU9OIGlzIGFsc28gT0ZGKS4KCiAgIFNFVCBTTEVFUCBDQU5DRUxMQVRJT04geyBPTiwgT0ZGIH0KICAgICAgICAgIFdoZXRoZXIgYSBTTEVFUCwgUEFVU0UsIG9yIFdBSVQgY29tbWFuZCBpbiBwcm9ncmVzcyBjYW4gYmUKICAgICAgICAgIGludGVycnVwdGVkIGJ5IHByZXNzaW5nIGEga2V5LiBOb3JtYWxseSBPTi4gU2V0dGluZyBTTEVFUAogICAgICAgICAgQ0FOQ0VMTEFUSU9OIE9GRiBtYWtlcyB0aGVzZSBjb21tYW5kcyB1bmludGVycnVwdGlibGUgZXhjZXB0IGJ5CiAgICAgICAgICBDdHJsLUMgKHVubGVzcyBDT01NQU5EIElOVEVSUlVQVElPTiBpcyBhbHNvIE9GRikuIFN5bm9ueW1zOiBTRVQKICAgICAgICAgIFBBVVNFIENBTkNFTExBVElPTiwgU0VUIFdBSVQgQ0FOQ0VMTEFUSU9OLgoKICAgU28gdG8gbWFrZSBjZXJ0YWluIGEgc2NyaXB0IGlzIG5vdCBpbnRlcnJ1cHRpYmxlIGJ5IHRoZSB1c2VyLCBpbmNsdWRlCiAgIHRoZXNlIGNvbW1hbmRzOgoKICBTRVQgVFJBTlNGRVIgSU5URVJSVVBUIE9GRgogIFNFVCBTTEVFUCBDQU5DRUxMQVRJT04gT0ZGCiAgU0VUIElOUFVUIENBTkNFTExBVElPTiBPRkYKICBTRVQgQ09NTUFORCBJTlRFUlJVUFRJT04gT0ZGCgogICBNYWtlIHN1cmUgdG8gdHVybiB0aGVtIGJhY2sgb24gYWZ0ZXJ3YXJkcyBpZiBpbnRlcnJ1cHRpb24gaXMgdG8gYmUKICAgcmUtZW5hYmxlZC4KCiAgIFdoZW4gYSBQQVVTRSwgU0xFRVAsIFdBSVQsIG9yIElOUFVUIGNvbW1hbmQgaXMgaW50ZXJydXB0ZWQgZnJvbSB0aGUKICAga2V5Ym9hcmQsIHRoZSBuZXcgdmFyaWFibGUgXHYoa2JjaGFyKSBjb250YWlucyBhIGNvcHkgb2YgdGhlIChmaXJzdCkKICAgY2hhcmFjdGVyIHRoYXQgd2FzIHR5cGVkIGFuZCBjYXVzZWQgdGhlIGludGVycnVwdGlvbiwgcHJvdmlkZWQgaXQgd2FzCiAgIG5vdCB0aGUgY29tbWFuZCBpbnRlcnJ1cHQgY2hhcmFjdGVyICh1c3VhbGx5IEN0cmwtQykuIElmIHRoZXNlCiAgIGNvbW1hbmRzIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseSBvciB0aW1lIG91dCB3aXRob3V0IGEga2V5Ym9hcmQKICAgaW50ZXJydXB0aW9uLCB0aGUgXHYoa2JjaGFyKSB2YXJpYWJsZSBpcyBlbXB0eS4KCiAgIFRoZSBcdihrYmNoYXIpIHZhcmlhYmxlIChsaWtlIGFueSBvdGhlciB2YXJpYWJsZSkgY2FuIGJlIHRlc3RlZCB3aXRoOgoKICBpZiBkZWZpbmVkIFx2KGtiY2hhcikgY29tbWFuZAoKICAgVGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgaWYgdGhlIHZhcmlhYmxlIGlzIG5vdCBlbXB0eS4KCiAgIFRoZSBcdihrYmNoYXIpIHZhcmlhYmxlIGNhbiBiZSByZXNldCB3aXRoIFdBSVQgMCAoUEFVU0UgMCwgU0xFRVAgMCwKICAgZXRjKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAxLjExLiBUYW1pbmcgVGhlIFdpbGQgQmFja3NsYXNoIC0tIFBhcnQgRGV1eAoKICAgWzM1OF1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkaXRpb24sIGNvbnRhaW5zIGEgYnJpZWYgc2VjdGlvbiwgIlRhbWluZwogICB0aGUgV2lsZCBCYWNrc2xhc2giLCBvbiBwYWdlIDQ4LCB3aGljaCBzdWJzZXF1ZW50IGV4cGVyaWVuY2UgaGFzIHNob3duCiAgIHRvIGJlIGluYWRlcXVhdGUgZm9yIEtlcm1pdCB1c2VycyBpbnRlbnQgb24gd3JpdGluZyBzY3JpcHRzIHRoYXQgZGVhbAogICB3aXRoIFdpbmRvd3MsIERPUywgYW5kIE9TLzIgZmlsZW5hbWVzLCBpbiB3aGljaCBiYWNrc2xhc2ggKFwpIGlzIHVzZWQKICAgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IuIFRoaXMgc2VjdGlvbiBmaWxscyBpbiB0aGUgYmxhbmtzLgoKICAgIDEuMTEuMS4gQmFja2dyb3VuZAoKICAgVGhlIEtlcm1pdCBjb21tYW5kIGxhbmd1YWdlIHNoYXJlcyBhIGNlcnRhaW4gdW5hdm9pZGFibGUgYnV0IGFubm95aW5nCiAgIGNoYXJhY3RlcmlzdGljIHdpdGggbW9zdCBvdGhlciBjb21tYW5kIGxhbmd1YWdlcyB0aGF0IGFyZSBjYXBhYmxlIG9mCiAgIHN0cmluZyByZXBsYWNlbWVudCwgbmFtZWx5IHRoZSBuZWNlc3NpdHkgdG8gInF1b3RlIiBjZXJ0YWluIGNoYXJhY3RlcnMKICAgd2hlbiB5b3Ugd2FudCB0aGVtIHRvIGJlIHRha2VuIGxpdGVyYWxseS4gVGhpcyBpcyBhIGNvbnNlcXVlbmNlIG9mIHRoZQogICBmYWN0cyB0aGF0OgoKICAgIDEuIE9uZSBvciBtb3JlIGNoYXJhY3RlcnMgbXVzdCBiZSBzZXQgYXNpZGUgdG8gZGVub3RlIHJlcGxhY2VtZW50LAogICAgICAgcmF0aGVyIHRoYW4gYWN0aW5nIGFzIGxpdGVyYWwgdGV4dC4KICAgIDIuIFdlIGhhdmUgb25seSA5NiBwcmludGFibGUgY2hhcmFjdGVycyB0byB3b3JrIHdpdGggaW4gQVNDSUksIHdoaWNoCiAgICAgICBpcyBzdGlsbCB0aGUgb25seSB1bml2ZXJzYWxseSBwb3J0YWJsZSBjaGFyYWN0ZXIgc2V0LgogICAgMy4gVGhlcmUgaXMgbm8gc2luZ2xlIHByaW50YWJsZSBjaGFyYWN0ZXIgdGhhdCBpcyB1bnVzZWQgZXZlcnl3aGVyZS4KICAgIDQuIFZhcmlhYmxlcyBhcmUgbm90IHJlc3RyaWN0ZWQgdG8gY2VydGFpbiBjb250ZXh0cywgYXMgdGhleSBhcmUgaW4KICAgICAgIGZvcm1hbCBwcm9ncmFtbWluZyBsYW5ndWFnZXMgbGlrZSBDIGFuZCBGb3J0cmFuLCBidXQgY2FuIGFwcGVhcgogICAgICAgYW55d2hlcmUgYXQgYWxsIHdpdGhpbiBhIGNvbW1hbmQsIGFuZCB0aGVyZWZvcmUgcmVxdWlyZSBzcGVjaWFsCiAgICAgICBzeW50YXguCgogICBUaHVzIHRoZXJlIGNhbiBiZSBjb25mbGljdHMuIFRvIGlsbHVzdHJhdGUsIHRoZSBzdGFuZGFyZCBVTklYIHNoZWxsCiAgIHVzZXMgZG9sbGFyIHNpZ24gKCQpIHRvIGludHJvZHVjZSB2YXJpYWJsZXMuIFNvIHRoZSBzaGVsbCBjb21tYW5kOgoKICBlY2hvICRURVJNCgogICBkaXNwbGF5cyB0aGUgdmFsdWUgb2YgdGhlIFRFUk0gdmFyaWFibGUsIGUuZy4gdnQzMjAuIEJ1dCBzdXBwb3NlIHlvdQogICB3YW50IHRvIGRpc3BsYXkgYSByZWFsIGRvbGxhciBzaWduOgoKICBlY2hvIFRoZSBwcmljZSBpcyAkMTAuMjAKCiAgIFRoaXMgY2F1c2VzIHRoZSBzaGVsbCB0byBldmFsdWF0ZSB0aGUgdmFyaWFibGUgIiQxIiwgd2hpY2ggbWlnaHQgb3IKICAgbWlnaHQgbm90IGV4aXN0LCBhbmQgc3Vic3RpdHV0ZSBpdHMgdmFsdWUsIGUuZy46CgogIFRoZSBwcmljZSBpcyAwLjIwCgogICAoaW4gdGhpcyBjYXNlIHRoZSAkMSB2YXJpYWJsZSBoYWQgbm8gdmFsdWUuKSBUaGlzIGlzIHByb2JhYmx5IG5vdCB3aGF0CiAgIHlvdSB3YW50ZWQuIFRvIGZvcmNlIHRoZSBkb2xsYXIgc2lnbiB0byBiZSB0YWtlbiBsaXRlcmFsbHksIHlvdSBtdXN0CiAgIGFwcGx5IGEgInF1b3RpbmcgcnVsZSIsIHN1Y2ggYXMgInByZWNlZGUgYSBjaGFyYWN0ZXIgYnkgYmFja3NsYXNoIChcKQogICB0byBmb3JjZSB0aGUgc2hlbGwgdG8gdGFrZSB0aGUgY2hhcmFjdGVyIGxpdGVyYWxseSI6CgogIGVjaG8gVGhlIHByaWNlIGlzIFwkMTAuMjAKICBUaGUgcHJpY2UgaXMgJDEwLjIwCgogICBCdXQgbm93IHN1cHBvc2UgeW91IHdhbnQgdGhlIGJhY2tzbGFzaCBBTkQgdGhlIGRvbGxhciBzaWduIHRvIGJlIHRha2VuCiAgIGxpdGVyYWxseToKCiAgZWNobyBUaGUgcHJpY2UgaXMgXFwkMTAuMjAKCiAgIFRoaXMgZG9lc24ndCB3b3JrLCBzaW5jZSB0aGUgZmlyc3QgYmFja3NsYXNoIHF1b3RlcyB0aGUgc2Vjb25kIG9uZSwKICAgdGhlcmVieSBsZWF2aW5nIHRoZSBkb2xsYXIgc2lnbiB1bnF1b3RlZCBhZ2FpbjoKCiAgVGhlIHByaWNlIGlzIFwwLjIwCgogICBRdW90aW5nIHRoZSBkb2xsYXIgc2lnbiByZXF1aXJlcyBhZGRpdGlvbiBvZiBhIHRoaXJkIGJhY2tzbGFzaDoKCiAgZWNobyBUaGUgcHJpY2UgaXMgXFxcJDEwLjIwCiAgVGhlIHByaWNlIGlzIFwkMTAuMjAKCiAgIFRoZSBmaXJzdCBiYWNrc2xhc2ggcXVvdGVzIHRoZSBzZWNvbmQgb25lLCBhbmQgdGhlIHRoaXJkIGJhY2tzbGFzaAogICBxdW90ZXMgdGhlIGRvbGxhciBzaWduLgoKICAgRXZlcnkgY29tbWFuZCBsYW5ndWFnZSAtLSBhbGwgVU5JWCBzaGVsbHMsIFZNUyBEQ0wsIERPUyBCYXRjaCwgQU9TL1ZTCiAgIENMSSwgZXRjIGV0YyAtLSBoYXMgc2ltaWxhciBydWxlcy4gVU5JWCBzaGVsbCBydWxlcyBhcmUgcHJvYmFibHkgdGhlCiAgIG1vc3QgY29tcGxpY2F0ZWQsIHNpbmNlIG1hbnkgcHJpbnRhYmxlIGNoYXJhY3RlcnMgLS0gbm90IGp1c3Qgb25lIC0tCiAgIGFyZSBzcGVjaWFsIHRoZXJlOiBkb2xsYXIgc2lnbiwgc2luZ2xlIHF1b3RlLCBkb3VibGUgcXVvdGUsIGJhY2tzbGFzaCwKICAgYXN0ZXJpc2ssIGFjY2VudCBncmF2ZSwgbnVtYmVyIHNpZ24sIGFtcGVyc2FuZCwgcXVlc3Rpb24gbWFyaywKICAgcGFyZW50aGVzZXMsIGJyYWNrZXRzLCBicmFjZXMsIGV0YyAtLSBwcmFjdGljYWxseSBldmVyeQogICBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlciBuZWVkcyBzb21lIGZvcm0gb2YgcXVvdGluZyBpZiBpdCBpcyB0byBiZQogICB0YWtlbiBsaXRlcmFsbHkuIEFuZCB0byBhZGQgdG8gdGhlIGNvbmZ1c2lvbiwgdGhlIFVOSVggc2hlbGwgb2ZmZXJzCiAgIG1hbnkgZm9ybXMgb2YgcXVvdGluZywgYW5kIG1hbnkgYWx0ZXJuYXRpdmUgVU5JWCBzaGVsbHMgYXJlIGF2YWlsYWJsZSwKICAgZWFjaCB1c2luZyBzbGlnaHRseSBkaWZmZXJlbnQgc3ludGF4LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMS4xMS4yLiBLZXJtaXQncyBRdW90aW5nIFJ1bGVzCgogICBLZXJtaXQncyBiYXNpYyBxdW90aW5nIHJ1bGVzIGFyZSBzaW1wbGUgYnkgY29tcGFyaXNvbiAodGhlcmUgYXJlLCBvZgogICBjb3Vyc2UsIGFkZGl0aW9uYWwgc3ludGF4IHJlcXVpcmVtZW50cyBmb3IgbWFjcm8gZGVmaW5pdGlvbnMsIGNvbW1hbmQKICAgYmxvY2tzLCBmdW5jdGlvbiBjYWxscywgZXRjLCBidXQgdGhleSBhcmUgbm90IHJlbGV2YW50IGhlcmUpLgoKICAgVGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGFyZSBzcGVjaWFsIGluIEtlcm1pdCBjb21tYW5kczoKCiAgIEJhY2tzbGFzaCAoXCkKICAgICAgICAgIEludHJvZHVjZXMgYSB2YXJpYWJsZSwgb3IgdGhlIG51bWVyaWMgcmVwcmVzZW50YXRpb24gb2YgYQogICAgICAgICAgc3BlY2lhbCBjaGFyYWN0ZXIsIG9yIGEgZnVuY3Rpb24sIG9yIG90aGVyIGl0ZW0gZm9yCiAgICAgICAgICBzdWJzdGl0dXRpb24uIElmIHRoZSBiYWNrc2xhc2ggaXMgZm9sbG93ZWQgYnkgYSBkaWdpdCBvciBieSBhbnkKICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKCiAgeCwgbywgZCwgbSwgcywgZiwgdiwgJCwgJSwgJiwgOiwgewoKICAgICAgICAgIHRoaXMgaW5kaWNhdGVzIGEgc3BlY2lhbCBzdWJzdGl0dXRpb24gaXRlbTsgb3RoZXJ3aXNlIHRoZQogICAgICAgICAgZm9sbG93aW5nIGNoYXJhY3RlciBpcyB0byBiZSB0YWtlbiBsaXRlcmFsbHkgKGV4Y2VwdGlvbnM6IFwgYXQKICAgICAgICAgIGVuZCBvZiBsaW5lIGlzIHRha2VuIGxpdGVyYWxseTsgXG4sIFxiLCBhbmQgXG4gYXJlIHNwZWNpYWwKICAgICAgICAgIGl0ZW1zIGluIHRoZSBPVVRQVVQgY29tbWFuZCBvbmx5KS4KCiAgIFNlbWljb2xvbiAoOykKICAgICAgICAgIChPbmx5IHdoZW4gYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUgb3IgcHJlY2VkZWQgYnkgYXQgbGVhc3QKICAgICAgICAgIG9uZSBzcGFjZSBvciB0YWIpIEludHJvZHVjZXMgYSBjb21tZW50LgoKICAgTnVtYmVyIHNpZ24gKCMpCiAgICAgICAgICAoT25seSB3aGVuIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIG9yIHByZWNlZGVkIGJ5IGF0IGxlYXN0CiAgICAgICAgICBvbmUgc3BhY2Ugb3IgdGFiKSBKdXN0IGxpa2Ugc2VtaWNvbG9uOyBpbnRyb2R1Y2VzIGEgY29tbWVudC4KCiAgIFF1ZXN0aW9uIG1hcmsgKD8pCiAgICAgICAgICAoT25seSBhdCB0aGUgY29tbWFuZCBwcm9tcHQgLSBub3QgaW4gY29tbWFuZCBmaWxlcyBvciBtYWNyb3MpCiAgICAgICAgICBSZXF1ZXN0cyBjb250ZXh0LXNlbnNpdGl2ZSBoZWxwLgoKICAgVG8gZm9yY2UgS2VybWl0IHRvIHRha2UgYW55IG9mIHRoZXNlIGNoYXJhY3RlcnMgbGl0ZXJhbGx5LCBzaW1wbHkKICAgcHJlY2VkZSBpdCBieSBhIGJhY2tzbGFzaCAoXCkuCgogICBTb3VuZHMgZWFzeSEgQW5kIGl0IGlzLCBleGNlcHQgd2hlbiBiYWNrc2xhc2ggYWxzbyBoYXMgYSBzcGVjaWFsCiAgIG1lYW5pbmcgdG8gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSwgYXMgaXQgZG9lcyBpbiBET1MsCiAgIFdpbmRvd3MsIGFuZCBPUy8yLCB3aGVyZSBpdCBzZXJ2ZXMgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IgaW4KICAgZmlsZW5hbWVzIHN1Y2ggYXM6CgogIEQ6XEs5NVxLRVlNQVBTXFJFQUQuTUUKCiAgIFVzaW5nIG91ciBydWxlLCB3ZSB3b3VsZCBuZWVkIHRvIHJlZmVyIHRvIHRoaXMgZmlsZSBpbiBLZXJtaXQgY29tbWFuZHMKICAgYXMgZm9sbG93czoKCiAgRDpcXEs5NVxcS0VZTUFQU1xcUkVBRC5NRQoKICAgQnV0IHRoaXMgd291bGQgbm90IGJlIG9idmlvdXMgdG8gbmV3IHVzZXJzIG9mIEtlcm1pdCBzb2Z0d2FyZSBvbiBET1MsCiAgIFdpbmRvd3MsIG9yIE9TLzIsIGFuZCBpdCB3b3VsZCBiZSBhbm5veWluZyB0byBzZWFzb25lZCBvbmVzLiBUaHVzCiAgIE1TLURPUyBLZXJtaXQgYW5kIEtlcm1pdCA5NSBnbyB0byByYXRoZXIgZXh0cmVtZSBsZW5ndGhzIHRvIGFsbG93IHRoZQogICBtb3JlIG5hdHVyYWwgbm90YXRpb24sIGFzIGluOgoKICBzZW5kIGQ6XGs5NVxrZXltYXBzXHJlYWQubWUKCiAgIFRoZSByZWFzb24gdGhpcyBpcyB0cmlja3kgaXMgdGhhdCB3ZSBhbHNvIG5lZWQgdG8gYWxsb3cgZm9yIHZhcmlhYmxlcwogICBhbmQgb3RoZXIgZXhwcmVzc2lvbnMgaW50cm9kdWNlZCBieSBiYWNrc2xhc2ggaW4gdGhlIHNhbWUgY29tbWFuZC4gRm9yCiAgIGV4YW1wbGUsIHN1cHBvc2UgXCVhIGlzIGEgdmFyaWFibGUgd2hvc2UgdmFsdWUgaXMgIm9vZmEiICh3aXRob3V0IHRoZQogICBxdW90ZXMpLiBXaGF0IGRvZXMgdGhlIGZvbGxvd2luZyBjb21tYW5kIGRvPwoKICBzZW5kIGQ6XCVhCgogICBEb2VzIGl0IHNlbmQgdGhlIGZpbGUgbmFtZWQgIm9vZmEiIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBvZiB0aGUgRDoKICAgZGlzaywgb3IgZG9lcyBpdCBzZW5kIGEgZmlsZSBuYW1lZCAiJWEiIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUKICAgRDogZGlzaz8gVGhpcyBpcyB0aGUga2luZCBvZiB0cm91YmxlIHdlIGdldCBpbnRvIHdoZW4gd2UgYXR0ZW1wdCB0bwogICBiZW5kIHRoZSBydWxlcyBpbiB0aGUgaW50ZXJlc3Qgb2YgdXNlciBmcmllbmRsaW5lc3MuIChUaGUgYW5zd2VyIGlzOgogICBpZiB0aGUgdmFyaWFibGUgXCVhIGhhcyBkZWZpbml0aW9uIHRoYXQgaXMgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcKICAgZmlsZSwgdGhhdCBmaWxlIGlzIHNlbnQ7IGlmIGEgZmlsZSBkOlwlYSBleGlzdHMsIGl0IGlzIHNlbnQ7IG90aGVyd2lzZQogICBpZiBib3RoIGNvbmRpdGlvbnMgYXJlIHRydWUsIHRoZSB2YXJpYWJsZSB0YWtlcyBwcmVjZWRlbmNlLCBhbmQgdGhlCiAgIGxpdGVyYWwgZmlsZW5hbWUgY2FuIGJlIGZvcmNlZCBieSBxdW90aW5nOiBcXCVhLikKCiAgIEluIEtlcm1pdCA5NSAoYnV0IG5vdCBNUy1ET1MgS2VybWl0KSwgd2UgYWxzbyBiZW5kIHRoZSBydWxlcyBhbm90aGVyCiAgIHdheSBieSBhbGxvd2luZyB5b3UgdG8gdXNlIGZvcndhcmQgc2xhc2ggKC8pIHJhdGhlciB0aGFuIGJhY2tzbGFzaCAoXCkKICAgYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3I6CgogIHNlbmQgZDovazk1L2tleW1hcHMvcmVhZC5tZQoKICAgVGhpcyBsb29rcyBtb3JlIG5hdHVyYWwgdG8gVU5JWCB1c2VycywgYW5kIGluIGZhY3QgaXMgcGVyZmVjdGx5CiAgIGFjY2VwdGFibGUgdG8gdGhlIFdpbmRvd3MgOTUvOTgvTlQgYW5kIE9TLzIgb3BlcmF0aW5nIHN5c3RlbXMgb24gdGhlCiAgIEFQSSBsZXZlbC4gQlVUICh0aGVyZSBpcyBhbHdheXMgYSAiYnV0IikgdGhlIE1pY3Jvc29mdCBzaGVsbCwKICAgQ09NTUFORC5DT00sIGZvciBXaW5kb3dzIDk1Lzk4IGFuZCBOVCBkb2VzIG5vdCBhbGxvdyB0aGlzIG5vdGF0aW9uLAogICBhbmQgdGhlcmVmb3JlIGl0IGNhbiBub3QgYmUgdXNlZCBpbiBhbnkgS2VybWl0IGNvbW1hbmQgLS0gc3VjaCBhcyBSVU4KICAgLS0gdGhhdCBpbnZva2VzIHRoZSBXaW5kb3dzIGNvbW1hbmQgc2hlbGwgQU5EIHlvdXIgY29tbWFuZCBzaGVsbCBpcwogICBDT01NQU5ELkNPTSBvciBhbnkgb3RoZXIgc2hlbGwgdGhhdCBkb2VzIG5vdCBhbGxvdyBmb3J3YXJkIHNsYXNoIGFzCiAgIGRpcmVjdG9yeSBzZXBhcmF0b3IgKHNvbWUgYWx0ZXJuYXRpdmUgc2hlbGxzIGRvIGFsbG93IHRoaXMpLgoKICAgICBOT1RFOiBUaGVyZSBleGlzdHMgYSB3aWRlIHZhcmlldHkgb2YgYWx0ZXJuYXRpdmUgc2hlbGxzIGZyb20gdGhpcmQKICAgICBwYXJ0aWVzIHRoYXQgZG8gbm90IGhhdmUgdGhpcyByZXN0cmljdGlvbi4gSWYgeW91IGFyZSB1c2luZyBhIHNoZWxsCiAgICAgdGhhdCBhY2NlcHRzIGZvcndhcmQgc2xhc2ggYXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yLCB5b3UgY2FuIHN0b3AKICAgICByZWFkaW5nIHJpZ2h0IG5vdyAtLSBVTkxFU1MgKHRoZXJlIGlzIGFsd2F5cyBhbiAidW5sZXNzIikgeW91IHdhbnQKICAgICB5b3VyIHNjcmlwdHMgdG8gYmUgcG9ydGFibGUgdG8gc3lzdGVtcyB0aGF0IGhhdmUgb3RoZXIgc2hlbGxzLiBBbHNvCiAgICAgbm90ZSB0aGF0IHNvbWUgV2luZG93cyBzaGVsbHMgbWlnaHQgYWN0dWFsbHkgUkVRVUlSRSBmb3J3YXJkCiAgICAgc2xhc2hlcyAoaW5zdGVhZCBvZiBiYWNrc2xhc2hlcykgYXMgZGlyZWN0b3J5IHNlcGFyYXRvcnM7IHdlIGRvIG5vdAogICAgIHRyZWF0IHRoaXMgc2l0dWF0aW9uIGJlbG93LCBidXQgdGhlIHRyZWF0bWVudCBpcyBvYnZpb3VzIC0tIHVzZQogICAgIHNsYXNoIHJhdGhlciBiYWNrc2xhc2ggYXMgdGhlIGRpcmVjdG9yeSBzZXBhcmF0b3IuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAxLjExLjMuIFBhc3NpbmcgRE9TIEZpbGVuYW1lcyBmcm9tIEtlcm1pdCB0byBTaGVsbCBDb21tYW5kcwoKICAgVGhlIGZvbGxvd2luZyBLZXJtaXQgY29tbWFuZHMgaW52b2tlIHRoZSBzeXN0ZW0gY29tbWFuZCBzaGVsbDoKCiAgUlVOIChhbmQgaXRzIHN5bm9ueW1zICEgYW5kIEApCiAgUkVESVJFQ1QKICBQSVBFCgogICBFYWNoIG9mIHRoZXNlIGNvbW1hbmRzIHRha2VzIGEgc2hlbGwgY29tbWFuZCBhcyBhbiBvcGVyYW5kLiBUaGVzZQogICBzaGVsbCBjb21tYW5kcyBhcmUgbm90LCBhbmQgY2FuIG5vdCBiZSwgcGFyc2VkIGJ5IEtlcm1pdCBzaW5jZSBLZXJtaXQKICAgZG9lcyBub3Qga25vdyB0aGUgc3ludGF4IG9mIHNoZWxsIGNvbW1hbmRzLCBhbmQgc28gY2FuJ3QgdGVsbCB0aGUKICAgZGlmZmVyZW5jZSBiZXR3ZWVuIGEga2V5d29yZCwgYSBmaWxlbmFtZSwgYSB2YXJpYWJsZSwgYSBzd2l0Y2gsIG9yCiAgIG90aGVyIGl0ZW0uIFRoZXJlZm9yZSB0aGUgcnVsZXMgY2FuIG5vdCBiZSBiZW50IHNpbmNlIEtlcm1pdCBkb2Vzbid0CiAgIGtub3cgd2hlcmUgb3IgaG93IHRvIGJlbmQgdGhlbS4gVG8gaWxsdXN0cmF0ZSAodXNpbmcgdGhlIHJlZ3VsYXIKICAgV2luZG93cyBzaGVsbCk6CgogIHJ1biBjOlxcd2luZG93c1xcY29tbWFuZFxcY2hrZHNrLmV4ZQoKICAgd29ya3MgT0ssIGJ1dDoKCiAgcnVuIGM6L3dpbmRvd3MvY29tbWFuZC9jaGtkc2suZXhlCgogICBpcyBub3QgYWNjZXB0ZWQgYnkgQ09NTUFORC5DT00uIEJ1dDoKCiAgcnVuIGM6XHdpbmRvd3NcY29tbWFuZFxjaGtkc2suZXhlCgogICByZXN1bHRzIGluIEtlcm1pdCBhcHBseWluZyBpdHMgcXVvdGluZyBydWxlcyBiZWZvcmUgc2VuZGluZyB0aGUgdGV4dAogICB0byB0aGUgc2hlbGwuIFNpbmNlICJ3IiBhbmQgImMiIGFyZSBub3QgaW4gdGhlIGxpc3Qgb2YgYmFja3NsYXNoLWl0ZW0KICAgY29kZXMsIHRoZSBiYWNrc2xhc2ggbWVhbnMgInRha2UgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgbGl0ZXJhbGx5Ii4KICAgVGh1cywgYnkgdGhlIHRpbWUgdGhpcyBmaWxlbmFtZSBnZXRzIHRvIHRoZSBXaW5kb3dzIHNoZWxsLCBpdCBoYXMKICAgYmVjb21lOgoKICBjOndpbmRvd3Njb21tYW5kY2hrZHNrLmV4ZQoKICAgd2hpY2ggaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IHdhbnRlZC4gKElmICJ3IiBhbmQgImMiIHdlcmUgaW4gdGhlCiAgIGxpc3QsIHRoZSByZXN1bHRzIGNvdWxkIGJlIGV2ZW4gc3RyYW5nZXIuKSBFdmVuIG1vcmUgY29uZnVzaW5nIGlzIHRoZQogICBjYXNlIHdoZXJlIGEgZGlyZWN0b3J5IG9yIGZpbGVuYW1lIHN0YXJ0cyB3aXRoIG9uZSBvciBtb3JlIGRpZ2l0czoKCiAgcnVuIGM6XDEyM1xsb3R1cy5leGUKCiAgIGluIHdoaWNoICJcMTIzIiBpcyB0aGUgS2VybWl0IG5vdGF0aW9uIGZvciBBU0NJSSBjaGFyYWN0ZXIgMTIzLCB3aGljaAogICBoYXBwZW5zIHRvIGJlIGxlZnQgYnJhY2UgKHspLCByZXN1bHRpbmcgaW4gImM6e2xvdHVzLmV4ZSIuCgogICBTbyB3aGVuIHBhc3NpbmcgZmlsZW5hbWVzIHRvIGEgV2luZG93cyBzaGVsbCwgYWx3YXlzIHVzZSBkb3VibGUKICAgYmFja3NsYXNoZXMgYXMgZGlyZWN0b3J5IHNlcGFyYXRvcnMsIHRvIGVuc3VyZSB0aGF0IHRoZSBzaGVsbCBnZXRzCiAgIHNpbmdsZSBiYWNrc2xhc2hlczoKCiAgcnVuIGM6XFx3aW5kb3dzXFxjb21tYW5kXFxjaGtkc2suZXhlCiAgcnVuIGM6XFwxMjNcXGxvdHVzLmV4ZQoKICAgU2ltaWxhciBwcm9ibGVtcyBtaWdodCBvY2N1ciB3aXRoIHRoZSBidWlsdC1pbiBFRElULCBCUk9XU0UsIGFuZCBGVFAKICAgY29tbWFuZHMuIFRoZXNlIGNvbW1hbmRzIHJlc3VsdCBpbiBLZXJtaXQgYnVpbGRpbmcgYSBzaGVsbCBjb21tYW5kCiAgIGludGVybmFsbHkgdG8gaW52b2tlIHRoZSBhc3NvY2lhdGVkIGhlbHBlciBwcm9ncmFtOyB0aGUgZm9ybSBvZiB0aGlzCiAgIGNvbW1hbmQgbWlnaHQgY29uZmxpY3Qgd2l0aCB0aGUgZm9ybSBkZW1hbmRlZCBieSBjZXJ0YWluIGFsdGVybmF0aXZlCiAgIHNoZWxscy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDEuMTEuNC4gVXNpbmcgVmFyaWFibGVzIHRvIEhvbGQgRE9TIEZpbGVuYW1lcwoKICAgTm93IHRvIHRoZSBuZXh0IGxldmVsLiBTdXBwb3NlIHlvdSB3YW50IHRvIHdyaXRlIGEgc2NyaXB0IGluIHdoaWNoCiAgIGZpbGVuYW1lcyBhcmUgcGFyYW1ldGVycywgYW5kIHRoZXJlZm9yZSBhcmUgc3RvcmVkIGluIHZhcmlhYmxlcy4KICAgRXhhbXBsZToKCiAgZGVmaW5lIFwlZiBjOlx3aW5kb3dzXGNvbW1hbmRcY2hrZHNrLmV4ZQogIC4uLgogIHJ1biBcJWYKCiAgIE9idmlvdXNseSB0aGlzIHdvbid0IHdvcmsgZm9yIHRoZSByZWFzb25zIGp1c3Qgbm90ZWQ7IHRoZSBSVU4gY29tbWFuZAogICByZXF1aXJlcyBkaXJlY3Rvcnkgc2VwYXJhdG9ycyBiZSBjb2RlZCBhcyBkb3VibGUgYmFja3NsYXNoZXM6CgogIGRlZmluZSBcJWYgYzpcXHdpbmRvd3NcXGNvbW1hbmRcXGNoa2Rzay5leGUKICAuLi4KICBydW4gXCVmCgogICBUaGlzIHdpbGwgd29yazsgbm8gc3VycHJpc2VzIGhlcmUuIEhvd2V2ZXIsIGlmIHlvdSBoYWQgdXNlZCBBU1NJR04KICAgcmF0aGVyIHRoYW4gREVGSU5FLCB5b3UgbWlnaHQgaGF2ZSBiZWVuIHN1cnByaXNlZCBhZnRlciBhbGw7IHJldmlldwogICBwYWdlcyAzNDgtMzQ5IG9mIFszNTldVXNpbmcgQy1LZXJtaXQgKDJuZCBFZCkgZm9yIHRoZSBkaWZmZXJlbmNlCiAgIGJldHdlZW4gREVGSU5FIGFuZCBBU1NJR04uCgogICBXZSBoYXZlIHNhaWQgdGhhdCBhbnkgS2VybWl0IDk1IG9yIE1TLURPUyBLZXJtaXQgY29tbWFuZCB0aGF0IHBhcnNlcwogICBmaWxlbmFtZXMgaXRzZWxmIC0tIFNFTkQsIGZvciBleGFtcGxlIC0tIGRvZXMgbm90IHJlcXVpcmUgZG91YmxlCiAgIGJhY2tzbGFzaGVzIHNpbmNlIGl0IGtub3dzIGl0IGlzIHBhcnNpbmcgYSBmaWxlbmFtZS4gU28gc2luY2UgdGhlCiAgIGZvbGxvd2luZyB3b3JrczoKCiAgc2VuZCBjOlx3aW5kb3dzXGNvbW1hbmRcY2hrZHNrLmV4ZQoKICAgU2hvdWxkIHRoZSBmb2xsb3dpbmcgYWxzbyB3b3JrPwoKICBkZWZpbmUgXCVmIGM6XHdpbmRvd3NcY29tbWFuZFxjaGtkc2suZXhlCiAgLi4uCiAgc2VuZCBcJWYKCiAgIEFuc3dlcjogTm8uIFdoeT8gQmVjYXVzZSBcJWYgaXMgZXZhbHVhdGVkICJyZWN1cnNpdmVseSIsIHRvIGFsbG93IGZvcgogICB0aGUgcG9zc2liaWxpdHkgdGhhdCBpdHMgZGVmaW5pdGlvbiBjb250YWlucyBmdXJ0aGVyIHZhcmlhYmxlCiAgIHJlZmVyZW5jZXMuIFRoaXMgaXMgdHJ1ZSBvZiBhbGwgImJhY2tzbGFzaC1wZXJjZW50LWxldHRlciIgKG9yIC1kaWdpdCkKICAgdmFyaWFibGVzLCBhbmQgYWxzbyBmb3IgYXJyYXkgcmVmZXJlbmNlcy4gU28gXCVmIGJlY29tZXMKICAgYzpcd2luZG93c1xjb21tYW5kXGNoa2Rzay5leGUsIHdoaWNoIGJlY29tZXMKICAgYzp3aW5kb3dzY29tbWFuZGNoa2Rzay5leGUuCgogICBUaGUgdHJpY2sgaGVyZSBpcyB0byB1c2UgdGhlICJvdGhlciIga2luZCBvZiB2YXJpYWJsZSwgdGhhdCBpcwogICBldmFsdWF0ZWQgb25seSAib25lIGxldmVsIGRlZXAiIHJhdGhlciB0aGFuIHJlY3Vyc2l2ZWx5OgoKICBkZWZpbmUgZmlsZW5hbWUgYzpcd2luZG93c1xjb21tYW5kXGNoa2Rzay5leGUKICAuLi4KICBzZW5kIFxtKGZpbGVuYW1lKQoKICAgU2ltaWxhcmx5IGlmIHlvdSB3YW50IHRvIHByb21wdCB0aGUgdXNlciBmb3IgYSBmaWxlbmFtZToKCiAgYXNrIGZpbGVuYW1lIHsgUGxlYXNlIHR5cGUgYSBmaWxlbmFtZTogfQogICBQbGVhc2UgdHlwZSBhIGZpbGVuYW1lOiBjOlx3aW5kb3dzXGNvbW1hbmRcY2hrZHNrLmV4ZQogIHNlbmQgXG0oZmlsZW5hbWUpCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAxLjExLjUuIFBhc3NpbmcgRE9TIEZpbGVuYW1lcyBhcyBQYXJhbWV0ZXJzIHRvIE1hY3JvcwoKICAgU3VwcG9zZSB5b3Ugd2FudCB0byBwYXNzIGEgRE9TIGZpbGVuYW1lIGNvbnRhaW5pbmcgYmFja3NsYXNoZXMgYXMgYQogICBwYXJhbWV0ZXIgdG8gYSBLZXJtaXQgbWFjcm8uIFRoaXMgcmFpc2VzIHR3byBpc3N1ZXM6CgogICAgMS4gUGFyYW1ldGVycyB0byBtYWNyb3MgYXJlICJqdXN0IHRleHQiIGFuZCBzbyBhcmUgZnVsbHkgZXZhbHVhdGVkCiAgICAgICBiZWZvcmUgdGhleSBhcmUgcGFzc2VkIHRvIHRoZSBtYWNyby4KICAgIDIuIE9uY2UgaW5zaWRlIHRoZSBtYWNybywgdGhlIGZvcm1hbCBwYXJhbWV0ZXJzIFwlMSwgXCUyLCAuLi4gXCU5IGFyZQogICAgICAgdGhlIHR5cGUgb2YgdmFyaWFibGUgdGhhdCBpcyBldmFsdWF0ZWQgcmVjdXJzaXZlbHkuCgogICBUaHVzIGEgRE9TIGZpbGVuYW1lIGlzIHJ1aW5lZCBvbmNlIGluIHRoZSBhY3Qgb2YgcGFyc2luZyB0aGUgbWFjcm8KICAgaW52b2NhdGlvbiwgYW5kIGFnYWluIHdoZW4gcmVmZXJyaW5nIHRvIGl0IGZyb20gd2l0aGluIHRoZSBtYWNyby4gVG8KICAgaWxsdXN0cmF0ZSwgc3VwcG9zZSAidGVzdCIgaXMgYSBtYWNyby4gVGhlbiBpbiB0aGUgaW52b2NhdGlvbjoKCiAgdGVzdCBjOlxteWRpclxibGFoLnR4dAoKICAgImM6bXlkaXJibGFoLnR4dCIgaXMgYXNzaWduZWQgdG8gXCUxLiBIb3dldmVyLCBpZiB3ZSBkb3VibGUgdGhlCiAgIGJhY2tzbGFzaGVzOgoKICB0ZXN0IGM6XFxteWRpclxcYmxhaC50eHQKCiAgICJjOlxteWRpclxibGFoLnR4dCIgaXMgYXNzaWduZWQgdG8gXCUxLiBCdXQgdGhlbiB3aGVuIHlvdSByZWZlciB0byBcJTEKICAgaW4gdGhlIG1hY3JvLCBpdCBpcyBldmFsdWF0ZWQgcmVjdXJzaXZlbHksIHJlc3VsdGluZyBpbgogICAiYzpteWRpcmJsYWgudHh0Ii4gVG8gaWxsdXN0cmF0ZToKCiAgZGVmaW5lIHRlc3QgZWNobyBcJTEKICB0ZXN0IGM6XG15ZGlyXGJsYWgudHh0CiAgYzpteWRpcmJsYWgudHh0CiAgdGVzdCBjOlxcbXlkaXJcXGJsYWgudHh0CiAgYzpteWRpcmJsYWgudHh0CiAgdGVzdCBjOlxcXFxteWRpclxcXFxibGFoLnR4dAogIGM6XG15ZGlyXGJsYWgudHh0CgogICBMZXQncyBhZGRyZXNzIGVhY2ggcGFydCBvZiB0aGUgcHJvYmxlbSBzZXBhcmF0ZWx5LiBGaXJzdCwgaW5zaWRlIHRoZQogICBtYWNyby4gWW91IGNhbiB1c2UgdGhlIFxmY29udGVudHMoKSBmdW5jdGlvbiB0byBmb3JjZSBhCiAgIGJhY2tzbGFzaC1wZXJjZW50IHZhcmlhYmxlIChzdWNoIGFzIGEgbWFjcm8gYXJndW1lbnQpIHRvIGJlIGV2YWx1YXRlZAogICBvbmUgbGV2ZWwgZGVlcCBpbnN0ZWFkIG9mIHJlY3Vyc2l2ZWx5LCBmb3IgZXhhbXBsZToKCiAgZGVmaW5lIHRlc3QgZWNobyB7IFRoZSBmaWxlbmFtZSBpcyAiXGZjb250ZW50cyhcJTEpIn0KCiAgdGVzdCBjOlxteWRpclxibGFoLnR4dCAgICAgICAgICAgICAgIDsgV2UgZG9uJ3QgZXhwZWN0IHRoaXMgdG8gd29yawogICBUaGUgZmlsZW5hbWUgaXMgImM6bXlkaXJibGFoLnR4dCIgICA7IGFuZCBpdCBkb2Vzbid0LgogIHRlc3QgYzpcXG15ZGlyXFxibGFoLnR4dCAgICAgICAgICAgICA7IEJ1dCB0aGlzIGRvZXMuLi4KICAgVGhlIGZpbGVuYW1lIGlzICJjOlxteWRpclxibGFoLnR4dCIKCiAgIFRodXMgaWYgdGhlIGZpbGVuYW1lIGFycml2ZXMgaW5zaWRlIHRoZSBtYWNybyB3aXRoIHNpbmdsZSBiYWNrc2xhc2hlcywKICAgdGhlIGJhY2tzbGFzaGVzIGFyZSBwcmVzZXJ2ZWQgaWYgeW91IGFsd2F5cyByZWZlciB0byB0aGUgcGFyYW1ldGVyCiAgIHRocm91Z2ggdGhlIFxmY29udGVudHMoKSBmdW5jdGlvbi4KCiAgIE5vdyBob3cgdG8gZW5zdXJlIHRoYXQgYmFja3NsYXNoZXMgYXJlIG5vdCBzdHJpcHBlZCBvciBtaXNpbnRlcnByZXRlZAogICB3aGVuIHBhc3NpbmcgYSBmaWxlbmFtZSB0byBhIG1hY3JvPyBUaGlzIGJyaW5ncyB1cyBiYWNrIHRvIHdoYXQgd2UKICAgbGVhcm5lZCBpbiBlYXJsaWVyIHNlY3Rpb25zOgoKICAgIDEuIElmIGl0IGlzIGEgbGl0ZXJhbCBmaWxlbmFtZSwgZWl0aGVyIGRvdWJsZSB0aGUgYmFja3NsYXNoZXMsIG9yIChpZgogICAgICAgdGhlIGZpbGVuYW1lIGlzIHRvIGJlIHVzZWQgb25seSB3aXRoaW4gS2VybWl0IGl0c2VsZiBhbmQgbm90CiAgICAgICBwYXNzZWQgdG8gYSBET1Mgc2hlbGwsIG9yIGl0IGlzIHRvIGJlIHBhc3NlZCB0byBhbiBhbHRlcm5hdGl2ZQogICAgICAgc2hlbGwgdGhhdCBhY2NlcHRzIGZvcndhcmQgc2xhc2ggYXMgYSBkaXJlY3Rvcnkgc2VwYXJhdG9yKSwgdXNlCiAgICAgICBmb3J3YXJkIHNsYXNoIGluc3RlYWQgb2YgYmFja3NsYXNoIGFzIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yLgogICAgMi4gSWYgaXQgaXMgYSB2YXJpYWJsZSB0aGF0IGNvbnRhaW5zIGEgZmlsZW5hbWUsIG1ha2Ugc3VyZSB5b3UgdXNlIGEKICAgICAgIG1hY3JvLXN0eWxlIHZhcmlhYmxlIG5hbWUsIHJhdGhlciB0aGFuIGEKICAgICAgIGJhY2tzbGFzaC1wZXJjZW50LWNoYXJhY3RlciBuYW1lLgoKICAgRXhhbXBsZXM6CgogIGRlZmluZSB0ZXN0IGVjaG8gXGZjb250ZW50cyhcJTEpCiAgZGVmaW5lIGZpbGVuYW1lIGM6XG15ZGlyXGJsYWgudHh0CgogIHRlc3QgYzpcXG15ZGlyXFxibGFoLnR4dCAgOyBMaXRlcmFsIGZpbGVuYW1lIHdpdGggZG91YmxlIGJhY2tzbGFzaGVzCiAgYzpcbXlkaXJcYmxhaC50eHQKCiAgdGVzdCBjOi9teWRpci9ibGFoLnR4dCAgICA7IExpdGVyYWwgZmlsZW5hbWUgd2l0aCBmb3J3YXJkIHNsYXNoZXMKICBjOi9teWRpci9ibGFoLnR4dAoKICB0ZXN0IFxtKGZpbGVuYW1lKSAgICAgICAgIDsgVmFyaWFibGUKICBjOlxteWRpclxibGFoLnR4dAoKICAgQnV0IHdoYXQgaWYgeW91IGRvbid0IGxpa2UgdGhlc2UgcnVsZXMgYW5kIHlvdSBzdGlsbCB3YW50IHRvIHBhc3MgYQogICBsaXRlcmFsIGZpbGVuYW1lIGNvbnRhaW5pbmcgc2luZ2xlIGJhY2tzbGFzaGVzIHRvIGEgbWFjcm8/IFRoaXMgaXMKICAgcG9zc2libGUgdG9vLCBidXQgYSBiaXQgdHJpY2t5OiB0dXJuIGNvbW1hbmQgcXVvdGluZyBvZmYgYmVmb3JlCiAgIGludm9raW5nIHRoZSBtYWNybywgYW5kIHRoZW4gdHVybiBpdCBiYWNrIG9uIGluc2lkZSB0aGUgbWFjcm8uCiAgIEV4YW1wbGU6CgogIGRlZmluZSB0ZXN0IHNldCBjb21tYW5kIHF1b3Rpbmcgb24sIGVjaG8gXGZjb250ZW50cyhcJTEpCgogIHNldCBjb21tYW5kIHF1b3Rpbmcgb2ZmCiAgdGVzdCBjOlxteWRpclxibGFoLnR4dAogIGM6XG15ZGlyXGJsYWgudHh0CgogICBVcG9uIHJldHVybiBmcm9tIHRoZSBtYWNybywgY29tbWFuZCBxdW90aW5nIGlzIGJhY2sgb24gKHNpbmNlIHRoZQogICBtYWNybyB0dXJuZWQgaXQgb24pLgoKICAgT2J2aW91c2x5IHRoaXMgdHJpY2sgY2FuIG5vdCBiZSB1c2VkIGlmIHRoZSBmaWxlbmFtZSBpcyBzdG9yZWQgaW4gYQogICB2YXJpYWJsZSwgc2luY2UgaXQgcHJldmVudHMgdGhlIHZhcmlhYmxlIGZyb20gYmVpbmcgZXZhbHVhdGVkLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMS4xMS42LiBQYXNzaW5nIERPUyBGaWxlIE5hbWVzIGZyb20gTWFjcm8gUGFyYW1ldGVycyB0byB0aGUgRE9TIFNoZWxsCgogICBOb3cgc3VwcG9zZSB5b3UgbmVlZCB0byBwYXNzIGEgRE9TIGZpbGVuYW1lIHRvIGEgbWFjcm8sIGFuZCB0aGUgbWFjcm8KICAgbmVlZHMgdG8gcGFzcyBpdCwgaW4gdHVybiwgdG8gdGhlIFdpbmRvd3Mgc2hlbGwgdmlhIChzYXkpIEtlcm1pdCdzIFJVTgogICBjb21tYW5kLiBUaGlzIHdvcmtzIHRvbzoKCiAgZGVmaW5lIHhydW4gcnVuIFxmY29udGVudHMoXCUxKQogIHhydW4gYzpcXHdpbmRvd3NcXGNvbW1hbmRcXGNoa2Rzay5leGUKCiAgIChvciB5b3UgY2FuIHVzZSB0aGUgU0VUIENPTU1BTkQgUVVPVElORyBPRkYgLyBPTiB0ZWNobmlxdWUgZGVzY3JpYmVkCiAgIGFib3ZlIHRvIGF2b2lkIHRoZSBkb3VibGUgYmFja3NsYXNoZXMuKSBCdXQuLgoKICB4cnVuIGM6L3dpbmRvd3MvY29tbWFuZC9jaGtkc2suZXhlCgogICBkb2VzIG5vdCB3b3JrIGlmIHRoZSBXaW5kb3dzIHNoZWxsIGRvZXMgbm90IHJlY29nbml6ZSAiLyIgYXMgYQogICBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBJZiB0aGVyZSBpcyBhIGNoYW5jZSB0aGF0IGEgZmlsZW5hbWUgbWlnaHQgYmUKICAgcGFzc2VkIHRvIHRoZSBtYWNybyBpbiB0aGlzIGZvcm0sIHRoZSBtYWNybyB3aWxsIG5lZWQgdG8gY29udmVydCBpdCB0bwogICBhIGZvcm0gYWNjZXB0YWJsZSB0byB0aGUgc2hlbGw6CgogIGRlZmluZSB4cnVuIHJ1biBcZnJlcGxhY2UoXGZjb250ZW50cyhcJTEpLC8sXFwpCgogICBIZXJlIHdlIHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIChpZiBhbnkpIG9mICIvIiBpbiB0aGUgYXJndW1lbnQgd2l0aAogICAiXCIgcHJpb3IgdG8gaXNzdWluZyB0aGUgUlVOIGNvbW1hbmQuIE9mIGNvdXJzZSwgaW4gb3JkZXIgdG8gc3BlY2lmeQogICAiXCIgYXMgYSBsaXRlcmFsIGNoYXJhY3RlciBpbiB0aGUgXGZyZXBsYWNlKCkgYXJndW1lbnQgbGlzdCwgd2UgaGF2ZQogICB0byBkb3VibGUgaXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAxLjExLjcuIFBhc3NpbmcgRE9TIEZpbGVuYW1lcyB0byBLZXJtaXQgZnJvbSB0aGUgU2hlbGwKCiAgIEFzIG5vdGVkIGluIHRoZSBtYW51YWwsIHRoZSBcJkBbXSBhcnJheSBjb250YWlucyBLZXJtaXQncyBjb21tYW5kLWxpbmUKICAgYXJndW1lbnRzLiBTdXBwb3NlIG9uZSBvZiB0aGVzZSBhcmd1bWVudHMsIHNheSBcJkBbM10sIGlzIGEgRE9TCiAgIGZpbGVuYW1lIHN1Y2ggYXMgQzpcRk9PXEJBUlxCQVpcT09GQS5UWFQuIChOb3RlOiBJbiBDLUtlcm1pdCA3LjAgYW5kCiAgIEs5NSAxLjEuMTggYW5kIGxhdGVyLCBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFmdGVyICI9IiBvciAiLS0iIGFyZQogICBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgdG9wLWxldmVsIFwlMS4uOSB2YXJpYWJsZXM7IHNlZSBbMzYwXVNlY3Rpb24KICAgNy41LikKCiAgIE9mIGNvdXJzZSB5b3UgY2FuIGVsaW1pbmF0ZSBhbnkgcHJvYmxlbXMgYnkgdXNpbmcgZm9yd2FyZCBzbGFzaGVzCiAgIHJhdGhlciB0aGFuIGJhY2tzbGFzaGVzIGluIHRoZSBmaWxlbmFtZSwgYnV0IHNvbWV0aW1lcyB0aGlzIGlzIG5vdAogICBwb3NzaWJsZSwgYXMgd2hlbiB0aGUgS2VybWl0IGNvbW1hbmQgbGluZSBpcyBiZWluZyBnZW5lcmF0ZWQgYnkKICAgYW5vdGhlciBwcm9ncmFtIHRoYW4gY2FuIG9ubHkgZ2VuZXJhdGUgIm5hdGl2ZSIgZm9ybWF0IERPUyBmaWxlbmFtZXMuCgogICBBcyBub3RlZCBpbiB0aGUgbWFudWFsLCAiXCV4IiB2YXJpYWJsZXMgYW5kIFwmeFtdIGFycmF5cyBhcmUgYWx3YXlzCiAgIGV2YWx1YXRlZCAiYWxsIHRoZSB3YXkiIChyZWN1cnNpdmVseSkuIElmIHRoZSBjb250ZW50cyBvZiBvbmUgb2YgdGhlc2UKICAgdmFyaWFibGVzIGNvbnRhaW5zIGJhY2tzbGFzaGVzLCB0aGlzIGNhdXNlcyBhbm90aGVyIGxldmVsIG9mCiAgIGV2YWx1YXRpb24uCgogICBUaGVyZSBpcyBhbm90aGVyIGtpbmQgb2YgdmFyaWFibGUsIHdoaWNoIGlzIGV2YWx1YXRlZCBvbmx5ICJvbmUgbGV2ZWwKICAgZGVlcCIuIFlvdSBjYW4gdXNlIHRoaXMgdG8gcHJldmVudCBpbnRlcnByZXRhdGlvbiBvZiB0aGUgYmFja3NsYXNoZXMKICAgaW4gdGhlIGZpbGVuYW1lcy4gRXhhbXBsZToKCiAgYXNzaWduIGZpbGVuYW1lIFxmY29udGVudHMoXCZAWzNdKSAgOyBUcmFuc2ZlciBjb250ZW50cwogIC4uLgogIHNlbmQgXG0oZmlsZW5hbWUpCgogICBPciwgbW9yZSBzaW1wbHk6CgogIHNlbmQgXGZjb250ZW50cyhcJkBbM10pCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS4xMi4gRGVidWdnaW5nCgogICBUaGUgZGVidWcgbG9nIGlzIHByb2R1Y2VkIHdoZW4geW91IGdpdmUgYSAibG9nIGRlYnVnIiBjb21tYW5kLiBUaGlzIGlzCiAgIG5vcm1hbGx5IGRvbmUgYXQgdGhlIHJlcXVlc3Qgb2YgdGhlIEtlcm1pdCBoZWxwIGRlc2ssIGZvciBmb3J3YXJkaW5nCiAgIHRvIHRoZSBLZXJtaXQgZGV2ZWxvcGVycyBmb3IgYW5hbHlzaXMgYXMgYSBsYXN0IHJlc29ydCBpbgogICB0cm91Ymxlc2hvb3RpbmcgcHJvYmxlbXMuIChMYXN0IHJlc29ydCBiZWNhdXNlIGl0IGNhbiBncm93IHF1aXRlIGh1Z2UKICAgaW4gYSB2ZXJ5IHNob3J0IHRpbWUuKSBJbiBjYXNlcyB3aGVyZSB0aW1pbmcgaW5mb3JtYXRpb24gaXMgY3JpdGljYWwKICAgdG8gdW5kZXJzdGFuZGluZyBhIHByb2JsZW0sIHlvdSBjYW4gdGVsbCBDLUtlcm1pdCB0byBwdXQgYSB0aW1lc3RhbXAKICAgb24gZWFjaCBkZWJ1ZyBsb2cgbGluZSBieSBnaXZpbmcgdGhlIGNvbW1hbmQ6CgogIFNFVCBERUJVRyBUSU1FU1RBTVAgT04KCiAgIEF0IGFueSB0aW1lIGJlZm9yZSBvciBhZnRlciBhY3RpdmF0aW5nIHRoZSBkZWJ1ZyBsb2cgKFNFVCBERUJVRwogICBUSU1FU1RBTVAgT0ZGIHR1cm5zIG9mZiB0aW1lc3RhbXBpbmcpLiBUaW1lc3RhbXBzIGNhbiBiZSB0dXJuZWQgb2ZmCiAgIGFuZCBvbiBhcyBkZXNpcmVkIHdoaWxlIGxvZ2dpbmcuIE9idmlvdXNseSwgdGhleSBpbmNyZWFzZSB0aGUgc2l6ZSBhbmQKICAgZ3Jvd3RoIHJhdGUgb2YgdGhlIGxvZyBzaWduaWZpY2FudGx5LCBhbmQgc28gc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgogICBUaW1lc3RhbXBzIGFyZSBvZiB0aGUgZm9ybSBoaDptbTpzcy54eHgsIHdoZXJlIC54eHggaXMgdGhvdXNhbmRzIG9mIGEKICAgc2Vjb25kIChidXQgaXMgaW5jbHVkZWQgb25seSBvbiBwbGF0Zm9ybXMgdGhhdCBpbmNsdWRlIHRoaXMgZmVhdHVyZSkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS4xMy4gTG9ncwoKICAgSW4gVU5JWCBDLUtlcm1pdCBhbmQgaW4gSy05NSwgeW91IGNhbiBub3cgZGlyZWN0IGFueSBsb2cgdG8gYSBwaXBlLgogICBUaGlzIG5vdCBvbmx5IGxldHMgeW91IHNlbmQgeW91ciBsb2dzIHRvIHBsYWNlcyBvdGhlciB0aGFuIGRpc2sgZmlsZXMsCiAgIGJ1dCBhbHNvIGxldHMgeW91IGN1c3RvbWl6ZSB0aGVtIHRvIGFueSBkZXNpcmVkIGRlZ3JlZS4KCiAgIExPRyB7IERFQlVHLCBQQUNLRVRTLCBTRVNTSU9OLCBUUkFOU0FDVElPTiwgQ09OTkVDVElPTiB9IHsgZmlsZSwgcGlwZQogICAgICAgICAgfSAuLi4KICAgICAgICAgIEEgInBpcGUiIGlzIHRoZSBuYW1lIG9mIGEgY29tbWFuZCwgcHJlY2VkZWQgYnkgYSB2ZXJ0aWNhbCBiYXIuCiAgICAgICAgICBJZiB0aGUgcGlwZSBjb250YWlucyBhbnkgc3BhY2VzLCBpdCBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcy4KCiAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgZm9yIFVOSVggKGFsd2F5cyByZW1lbWJlciB0aGUgaW1wb3J0YW5jZSBvZgogICBnZXR0aW5nIHRoZSBVTklYIHNoZWxsIHF1b3RpbmcgcnVsZXMgcmlnaHQpOgoKICAgTE9HIFRSQU5TQUNUSU9OUyB8bHByCiAgICAgICAgICBUaGlzIHNlbmRzIHRoZSB0cmFuc2FjdGlvbiBsb2cgdG8gdGhlIGRlZmF1bHQgVU5JWCBwcmludGVyLAogICAgICAgICAgcmF0aGVyIHRoYW4gdG8gYSBmaWxlICh1c2UgImxwIiByYXRoZXIgdGhhbiAibHByIiBpZgogICAgICAgICAgbmVjZXNzYXJ5KS4KCiAgIExPRyBUUkFOU0FDVElPTlMge3wgbXlmaWx0ZXIgPiB0LmxvZ30KICAgICAgICAgIEZvciB0aG9zZSB3aG8gZG9uJ3QgbGlrZSB0aGUgZm9ybWF0IG9mIHRoZSB0cmFuc2FjdGlvbiBsb2csIG9yCiAgICAgICAgICB3YW50IHRvIGV4dHJhY3QgY2VydGFpbiBpbmZvcm1hdGlvbiBmcm9tIGl0OyB3cml0ZSB5b3VyIG93bgogICAgICAgICAgb3V0cHV0IGZpbHRlci4KCiAgIExPRyBTRVNTSU9OIHt8IGxwciAtUGxhc2Vyd3JpdGVyfQogICAgICAgICAgVGhpcyBzZW5kcyB0aGUgc2Vzc2lvbiBsb2cgdG8gYSBzcGVjaWZpYyBVTklYIHByaW50ZXIsIHJhdGhlcgogICAgICAgICAgdGhhbiB0byBhIGZpbGUuIE5vdGUgdGhlIGJyYWNlcyBhcm91bmQgdGhlIHBpcGVsaW5lLiBUaGVzZSBhcmUKICAgICAgICAgIHJlcXVpcmVkIGJlY2F1c2UgaXQgY29udGFpbnMgc3BhY2VzLgoKICAgTE9HIERFQlVHIHt8IHRhaWwgLTEwMCA+IGRlYnVnLmxvZ30KICAgICAgICAgIFRoaXMgY2F1c2VzIHRoZSBkZWJ1ZyBsb2cgZmlsZSB0byBjb250YWluIG9ubHkgdGhlIGZpbmFsIDEwMAogICAgICAgICAgbGluZXMuIFN1cHBvc2UgQy1LZXJtaXQgY3Jhc2hlcyB1bmRlciBzb21lIHVucHJlZGljdGFibGUKICAgICAgICAgIGNpcmN1bXN0YW5jZXMsIGFuZCB5b3UgbmVlZCBhIGRlYnVnIGxvZyB0byBjYXRjaCBpdCBpbiB0aGUgYWN0LgogICAgICAgICAgQnV0IHRoZSBkZWJ1ZyBsb2cgY2FuIGdyb3cgdG8gaHVnZSBwcm9wb3J0aW9ucyB2ZXJ5IHF1aWNrbHksCiAgICAgICAgICBwb3NzaWJseSBmaWxsaW5nIHVwIHRoZSBkaXNrLiBQaXBpbmcgdGhlIGRlYnVnIGxvZyB0aHJvdWdoCiAgICAgICAgICAidGFpbCIgcmVzdWx0cyBpbiBrZWVwaW5nIG9ubHkgdGhlIGxhc3QgMTAwIGxpbmVzIChvciBvdGhlcgogICAgICAgICAgbnVtYmVyIG9mIHlvdXIgY2hvaWNlKS4KCiAgIExPRyBERUJVRyB7fCBncmVwICJeVEVMTkVUIiA+IGRlYnVnLmxvZ30KICAgICAgICAgIFRoaXMgb25lIHNob3dzIGhvdyB0byBsb2cgb25seSBUZWxuZXQgbmVnb3RpYXRpb25zLiBQaXBpbmcgdGhlCiAgICAgICAgICBkZWJ1ZyBsb2cgdGhyb3VnaCBncmVwIG9yIGVncmVwIGxldHMgeW91IGxvZyBvbmx5IHNwZWNpZmljCiAgICAgICAgICBpbmZvcm1hdGlvbiwgcmF0aGVyIHRoYW4gZXZlcnl0aGluZy4gIm1hbiBncmVwIiBmb3IgZnVydGhlcgogICAgICAgICAgaW5mby4KCiAgIExPRyBERUJVRyB7fCBnemlwIC1jID4gZGVidWcubG9nLmd6fQogICAgICAgICAgQ3JlYXRlcyBhIGZ1bGwgZGVidWcgbG9nLCBidXQgY29tcHJlc3NlZCBieSBnemlwIHRvIHNhdmUgc3BhY2UuCgogICBMT0cgUEFDS0VUUyB7fCB0ciAiXFwwMSIgIlgiIHwgY3V0IC1jOS0gPiBwYWNrZXQubG9nfQogICAgICAgICAgVGhpcyBvbmUgd3JpdGVzIHRoZSByZWd1bGFyIHBhY2tldCBsb2csIGJ1dCB0cmFuc2xhdGVzIHRoZQogICAgICAgICAgQ3RybC1BIHRoYXQgc3RhcnRzIGVhY2ggcGFja2V0IHRvIHRoZSBsZXR0ZXIgIlgiIGFuZCByZW1vdmVzCiAgICAgICAgICB0aGUgcy1ubi1ubi0gbm90YXRpb24gZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZS4gTm90ZSB0aGUKICAgICAgICAgIGRvdWJsZSBiYWNrc2xhc2ggKG5vcm1hbCBLZXJtaXQgcXVvdGluZyBydWxlcykuICJtYW4gdHIiIGFuZAogICAgICAgICAgIm1hbiBjdXQiIGZvciBmdXJ0aGVyIGluZm8uCgogICBTZWUgWzM2MV1TZWN0aW9uIDIuMTIgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRoZSBuZXcgY29ubmVjdGlvbiBsb2cuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS4xNC4gQXV0b21hdGljIEZpbGUtVHJhbnNmZXIgUGFja2V0IFJlY29nbml0aW9uIGF0IHRoZSBDb21tYW5kIFByb21wdAoKICAgQmVnaW5uaW5nIGluIHZlcnNpb24gNy4wLCBDLUtlcm1pdCBjYW4gcmVjb2duaXplIEtlcm1pdCAoYW5kIGluIHNvbWUKICAgY2FzZXMgYWxzbyBabW9kZW0pIGZpbGUtdHJhbnNmZXIgcGFja2V0cyB3aGlsZSBhdCBpdHMgY29tbWFuZCBwcm9tcHQuCiAgIFRoaXMgaXMgY29udmVuaWVudCAoZm9yIGV4YW1wbGUpLCBpZiB5b3UgZXNjYXBlZCBiYWNrIGZyb20gYSByZW1vdGUKICAgS2VybWl0IHByb2dyYW0gYW5kIHRvbGQgdGhlIGxvY2FsIEtlcm1pdCBwcm9ncmFtIHRvIHNlbmQgYSBmaWxlLCBidXQKICAgZm9yZ290IHRvIHRlbGwgdGhlIHJlbW90ZSBLZXJtaXQgcHJvZ3JhbSB0byByZWNlaXZlIGl0IChhbmQgdGhlIGxvY2FsCiAgIEtlcm1pdCBkaWQgbm90IGhhdmUgdGhlICJzZW5kIGEgS2VybWl0IHJlY2VpdmUgY29tbWFuZCIgZmVhdHVyZQogICBhdmFpbGFibGUpLiBUaGlzIGZlYXR1cmUgaXMgY29udHJvbGxlZCBieSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CgogICBTRVQgQ09NTUFORCBBVVRPRE9XTkxPQUQgeyBPTiwgT0ZGIH0KICAgICAgICAgIFdoZW4gT04sIHdoaWNoIGlzIHRoZSBkZWZhdWx0LCB0aGUgY29tbWFuZCBwYXJzZXIgcmVjb2duaXplcwogICAgICAgICAgS2VybWl0IHBhY2tldHMgd2hlbiBLZXJtaXQgaXMgaW4gcmVtb3RlIG1vZGUuIEFuIFMgcGFja2V0IG1ha2VzCiAgICAgICAgICBpdCBnbyBpbnRvIHJlY2VpdmUgbW9kZSwgYW4gSSBwYWNrZXQgbWFrZXMgaXQgZ28gaW50byBzZXJ2ZXIKICAgICAgICAgIG1vZGUuIFdoZW4gT0ZGLCBwYWNrZXQgcmVjb2duaXRpb24gaXMgZGlzYWJsZWQgYW5kIHRoZSBiZWhhdmlvcgogICAgICAgICAgd2hlbiBhIHBhY2tldCBpcyByZWNlaXZlZCBhdCB0aGUgY29tbWFuZCBwcm9tcHQgaXMgYXMgaXQgd2FzIGluCiAgICAgICAgICBDLUtlcm1pdCA2LjEgYW5kIGVhcmxpZXIgKG5hbWVseSB0byBwcmludCBhbiBlcnJvciBtZXNzYWdlKS4KCiAgIENPTU1BTkQgQVVUT0RPV05MT0FEIGlzIHRoZSBjb21tYW5kLW1vZGUgZXF1aXZhbGVudCBvZiBURVJNSU5BTAogICBBVVRPRE9XTkxPQUQsIHdoaWNoIGlzIGVmZmVjdGl2ZSBkdXJpbmcgQ09OTkVDVCBtb2RlLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEuMTUuIFRoZSBUWVBFIENvbW1hbmQKCiAgIFRoZSBUWVBFIGNvbW1hbmQgbm93IGFjY2VwdHMgYSBzZWxlY3Rpb24gb2Ygb3B0aW9uYWwgc3dpdGNoZXMKICAgKFszNjJdU2VjdGlvbiAxLjUpLCBhbmQgYWxzbyBzZXRzIHNldmVyYWwgdmFyaWFibGVzLgoKICAgU3ludGF4OiBUWVBFIFsgc3dpdGNoZXMuLi4gXSBmaWxlbmFtZQoKICAgVmFyaWFibGVzOgoKICAgXHYodHlfbG4pCiAgICAgICAgICBMaW5lIG51bWJlciBvZiBjdXJyZW50IGxpbmUgKGR1cmluZyBUWVBFIGNvbW1hbmQ7IHNlZSAvUFJFRklYKQoKICAgXHYodHlfbGMpCiAgICAgICAgICBMaW5lIGNvdW50IG9mIGZpbGUgbW9zdCByZWNlbnRseSBUWVBFZC4KCiAgIFx2KHR5X21jKQogICAgICAgICAgTWF0Y2ggY291bnQgb2YgZmlsZSBtb3N0IHJlY2VudGx5IFRZUEVkIChzZWUgL01BVENIKS4KCiAgIFN3aXRjaGVzOgoKICAgL1BBR0UKICAgICAgICAgIElmIC9QQUdFIGlzIGluY2x1ZGVkLCBLZXJtaXQgcGF1c2VzIGF0IHRoZSBlbmQgb2YgZWFjaAogICAgICAgICAgc2NyZWVuZnVsIGFuZCBpc3N1ZXMgYSAibW9yZT8iIHByb21wdC4gWW91IG1heSBwcmVzcyB0aGUgc3BhY2UKICAgICAgICAgIGJhciB0byB2aWV3IHRoZSBuZXh0IHBhZ2UgKHNjcmVlbmZ1bCksIG9yIHByZXNzICJxIiBvciAibiIgdG8KICAgICAgICAgIHJldHVybiB0byB0aGUgQy1LZXJtaXQgcHJvbXB0LiBJZiB0aGlzIHN3aXRjaCBpcyBnaXZlbiwgaXQKICAgICAgICAgIG92ZXJyaWRlcyB0aGUgQ09NTUFORCBNT1JFLVBST01QVElORyBzZXR0aW5nIGZvciB0aGlzIGNvbW1hbmQKICAgICAgICAgIG9ubHkuIElmIGl0IGlzIG5vdCBnaXZlbiwgcGFnaW5nIGlzIGFjY29yZGluZyB0byBDT01NQU5ECiAgICAgICAgICBNT1JFLVBST01QVElORy4KCiAgIC9OT1BBR0UKICAgICAgICAgIERvIG5vdCBwYXVzZSBhdCB0aGUgZW5kIG9mIGVhY2ggc2NyZWVuZnVsOyBzaG93IHRoZSB3aG9sZSBmaWxlCiAgICAgICAgICAob3IgYWxsIHNlbGVjdGVkIGxpbmVzKSBhdCBvbmNlLiBJZiB0aGlzIHN3aXRjaCBpcyBnaXZlbiwgaXQKICAgICAgICAgIG92ZXJyaWRlcyB0aGUgQ09NTUFORCBNT1JFLVBST01QVElORyBzZXR0aW5nIGZvciB0aGlzIGNvbW1hbmQKICAgICAgICAgIG9ubHkuIElmIGl0IGlzIG5vdCBnaXZlbiwgcGFnaW5nIGlzIGFjY29yZGluZyB0byBDT01NQU5ECiAgICAgICAgICBNT1JFLVBST01QVElORy4KCiAgIC9IRUFEWzpuXQogICAgICAgICAgT25seSBzaG93IHRoZSBmaXJzdCBuIGxpbmVzIG9mIHRoZSBmaWxlICh3aGVyZSBuIGlzIGEgbnVtYmVyKS4KICAgICAgICAgIElmIG4gaXMgb21pdHRlZCwgMTAgaXMgdXNlZC4KCiAgIC9UQUlMWzpuXQogICAgICAgICAgT25seSBzaG93IHRoZSBsYXN0IG4gbGluZXMgb2YgdGhlIGZpbGUgKHdoZXJlIG4gaXMgYSBudW1iZXIpLgogICAgICAgICAgSWYgbmlzIG9taXR0ZWQsIDEwIGlzIHVzZWQuIE5vdGU6IC9IRUFEIGFuZCAvVEFJTCBjYW4ndCBiZQogICAgICAgICAgY29tYmluZWQ7IGlmIHlvdSBnaXZlIGJvdGggc3dpdGNoZXMsIG9ubHkgdGhlIG1vc3QgcmVjZW50IG9uZQogICAgICAgICAgaXMgdXNlZC4KCiAgIC9NQVRDSDpwYXR0ZXJuCiAgICAgICAgICBPbmx5IHR5cGUgbGluZXMgZnJvbSB0aGUgZmlsZSB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuIChzZWUKICAgICAgICAgIFszNjNdU2VjdGlvbiA0LjkuMSBmb3IgcGF0dGVybiBub3RhdGlvbikuIFVOSVggdXNlcnMgZmFtaWxpYXIKICAgICAgICAgIHdpdGggZ3JlcCBzaG91bGQgbm90ZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2U6IHRoZXJlIGlzIG5vCiAgICAgICAgICBpbXBsaWVkICIqIiBhdCB0aGUgYmVnaW5uaW5nIGFuZCBlbmQgb2YgdGhlIHBhdHRlcm4uIFRodXM6CgogIFRZUEUgL01BVENIOmZvbyAgICBMaXN0cyBsaW5lcyB3aG9zZSBlbnRpcmUgY29udGVudHMgYXJlICJmb28iLgogIFRZUEUgL01BVENIOmZvbyogICBMaXN0cyBsaW5lcyB0aGF0IHN0YXJ0IHdpdGggImZvbyIuCiAgVFlQRSAvTUFUQ0g6KmZvbyAgIExpc3RzIGxpbmVzIHRoYXQgZW5kIHdpdGggImZvbyIuCiAgVFlQRSAvTUFUQ0g6KmZvbyogIExpc3RzIGxpbmVzIHRoYXQgaGF2ZSAiZm9vIiBhbnl3aGVyZSBpbiB0aGVtLgoKICAgICAgICAgIC9IRUFEIGFuZCAvVEFJTCBhcHBseSBhZnRlciAvTUFUQ0gsIHNvICJ0eXBlIC90YWlsOjIwCiAgICAgICAgICAvbWF0Y2g6eCoiIHNob3dzIHRoZSBsYXN0IDIwIGxpbmVzIGluIHRoZSBmaWxlIHRoYXQgc3RhcnQgd2l0aAogICAgICAgICAgIngiLgoKICAgL1BSRUZJWDpzdHJpbmcKICAgICAgICAgIFByaW50IHRoZSBnaXZlbiBzdHJpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUuIFRoZQogICAgICAgICAgc3RyaW5nIG1heSBiZSBhIGNvbnN0YW50LCBhIHZhcmlhYmxlLCBvciBhIHF1b3RlZCB2YXJpYWJsZS4gSWYKICAgICAgICAgIGl0J3MgYW4gdW5xdW90ZWQgdmFyaWFibGUsIGl0cyB2YWx1ZSBhdCB0aGUgdGltZSB0aGUgVFlQRQogICAgICAgICAgY29tbWFuZCB3YXMgZ2l2ZW4gaXMgdXNlZCBhcyBhIGNvbnN0YW50LiBJZiBpdCBpcyBhIHF1b3RlZAogICAgICAgICAgdmFyaWFibGUsIGl0IGlzIHJlLWV2YWx1YXRlZCBmb3IgZWFjaCBsaW5lOyBhIHVzZWZ1bCB2YXJpYWJsZQogICAgICAgICAgZm9yIHRoaXMgY29udGV4dCBpcyBcdih0eV9sbikgKHRoZSBsaW5lIG51bWJlciBvZiB0aGUgY3VycmVudAogICAgICAgICAgbGluZSBiZWluZyB0eXBlZCkuIElmIHRoZSBwcmVmaXggaXMgdG8gaW5jbHVkZSBzcGFjZXMsIGl0IG11c3QKICAgICAgICAgIGJlIGVuY2xvc2VkIGluIGJyYWNlcy4gRXhhbXBsZXM6CgogICAgICAgIHR5cGUgL3ByZWZpeDp7b29mYS50eHQ6IH0gL21hdGNoOip0aGluZyogb29mYS50eHQKICAgICAgICAgICAgICAgIFByaW50cyBhbGwgbGluZXMgaW4gb29mYS50eHQgdGhhdCBjb250YWluICJ0aGluZyIgd2l0aAogICAgICAgICAgICAgICAgdGhlIGZpbGVuYW1lIGl0c2VsZiBhcyB0aGUgcHJlZml4IChzaW1pbGFyIHRvIFVOSVggZ3JlcCkuCgogICAgICAgIHR5cGUgL3ByZWZpeDp7XHYodGltZSkuIH0gb29mYS50eHQKICAgICAgICAgICAgICAgIFByZWZpeGVzIGVhY2ggbGluZSBvZiBvb2ZhLnR4dCB3aXRoIHRoZSB0aW1lIGF0IHdoaWNoIHRoZQogICAgICAgICAgICAgICAgVFlQRSBjb21tYW5kIHdhcyBnaXZlbiAob25lIGJhY2tzbGFzaCkKCiAgICAgICAgdHlwZSAvcHJlZml4OntcXHYodGltZSkuIH0gb29mYS50eHQKICAgICAgICAgICAgICAgIFByZWZpeGVzIGVhY2ggbGluZSBvZiBvb2ZhLnR4dCB3aXRoIHRoZSB0aW1lIGF0IHdoaWNoCiAgICAgICAgICAgICAgICB0aGF0IGxpbmUgaXMgYmVpbmcgdHlwZWQgKHR3byBiYWNrc2xhc2hlcykuCgogICAgICAgIHR5cGUgL3ByZWZpeDp7XFx2KHR5X2xuKS4gfSBvb2ZhLnR4dAogICAgICAgICAgICAgICAgUHJlZml4ZXMgZWFjaCBsaW5lIG9mIG9vZmEudHh0IHdpdGggaXRzIGxpbmUgbnVtYmVyLgoKICAgICAgICB0eXBlIC9wcmVmaXg6e1xcZmxwYWQoXFx2KHR5X2xuKSw0KS4gfSBvb2ZhLnR4dAogICAgICAgICAgICAgICAgU2FtZSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSwgZXhjZXB0IHRoZSBsaW5lIG51bWJlciBpcwogICAgICAgICAgICAgICAgcmlnaHQtYWRqdXN0ZWQgaW4gYSA0LWNvbHVtbiBmaWVsZC4KCiAgIC9XSURUSFs6bl0KICAgICAgICAgIFRydW5jYXRlcyBlYWNoIGxpbmUgYXQgY29sdW1uIG4gKHdoaWNoIG11c3QgYmUgYSBudW1iZXIpIHByaW9yCiAgICAgICAgICB0byBwcmludGluZyBpdC4gVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgZm9yIGxvbmcgbGluZXMgd2hlbiB5b3UKICAgICAgICAgIGRvbid0IHdhbnQgdGhlbSB0byB3cmFwLiBJZiBuaXMgb21pdHRlZCwgeW91ciBjdXJyZW50IHNjcmVlbgogICAgICAgICAgd2lkdGggaXMgdXNlZC4KCiAgIC9DT1VOVAogICAgICAgICAgQ291bnRzIGxpbmVzIGFuZCAtLSBpZiAvTUFUQ0ggd2FzIGluY2x1ZGVkLCBtYXRjaGVzIC0tIGJ1dCBkb2VzCiAgICAgICAgICBub3QgcHJpbnQgYW55IGxpbmVzIGZyb20gdGhlIGZpbGUuIFRoZSBsaW5lIGFuZCBtYXRjaCBjb3VudCBpcwogICAgICAgICAgc2hvd24gYXQgdGhlIGVuZCwgYW5kIHRoZSB2YXJpYWJsZXMgXHYodHlfbGMpIGFuZCBcdih0eV9sbSkgYXJlCiAgICAgICAgICBzZXQgYWNjb3JkaW5nbHkuCgogICBTRVQgT1BUSU9OUyBUWVBFIHsgL1BBR0UsIC9OT1BBR0UsIC9XSURUSDpuIH0KICAgICAgICAgIFNldHMgdGhlIHBhZ2luZyBkZWZhdWx0IGZvciBUWVBFIGNvbW1hbmRzLCB3aGljaCBjYW4gYmUKICAgICAgICAgIG92ZXJyaWRkZW4gaW4gYW55IHBhcnRpY3VsYXIgVFlQRSBjb21tYW5kIGJ5IGluY2x1ZGluZyB0aGUKICAgICAgICAgIGRlc2lyZWQgc3dpdGNoLgoKICAgSWYgYSBUWVBFIGNvbW1hbmQgaXMgZ2l2ZW4gd2l0aCBubyBzd2l0Y2gsIGFuZCBubyBTRVQgT1BUSU9OUyBUWVBFCiAgIHNlbGVjdGlvbiBpcyBpbiBlZmZlY3QsIHBhZ2luZyBpcyBhY2NvcmRpbmcgdG8geW91ciBDT01NQU5ECiAgIE1PUkUtUFJPTVBUSU5HIHNldHRpbmcgKFNIT1cgQ09NTUFORCkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS4xNi4gVGhlIFJFU0VUIENvbW1hbmQKCiAgIFRoZSBSRVNFVCBjb21tYW5kLCBhZGRlZCBpbiA3LjAsIGNsb3NlcyBhbGwgb3BlbiBmaWxlcyBhbmQgbG9ncywgYnV0CiAgIGRvZXMgbm90IGFmZmVjdCB0aGUgb3BlbiBjb25uZWN0aW9uIChpZiBhbnkpLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEuMTcuIFRoZSBDT1BZIGFuZCBSRU5BTUUgQ29tbWFuZHMKCiAgIEFzIG9mIEMtS2VybWl0IDcuMCwgaW4gdGhlIFVOSVggdmVyc2lvbiBvbmx5LCB0aGUgQ09QWSBhbmQgUkVOQU1FCiAgIGNvbW1hbmRzIGFyZSBidWlsdCBpbiBhbmQgZG8gbm90IGNhbGwgdGhlIHVuZGVybHlpbmcgcGxhdGZvcm0ncyBDT1BZCiAgIG9yIFJFTkFNRSBjb21tYW5kLiBUaGlzIGFsbG93cyB0aGVtIHRvIHdvcmsgaW4gIk5PUFVTSCIgdmVyc2lvbnMgYW5kCiAgIG90aGVyIGNpcmN1bXN0YW5jZXMgd2hlcmUgaXQgY2FuJ3QgYWNjZXNzIHN5c3RlbSBjb21tYW5kcywgYW5kIGl0CiAgIGFsbG93cyBmaWxlIGNvcHlpbmcgYW5kIHJlbmFtaW5nIHRvIGJlIGRvbmUgcG9ydGFibHkgaW4gc2NyaXB0cy4gVGhlCiAgIGNoYXJhY3RlcmlzdGljcyBvZiB0aGUgYnVpbHQtaW4gQ09QWSBvciBSRU5BTUUgaW5jbHVkZToKICAgICAqIEl0IGZhaWxzIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBhIGRpcmVjdG9yeSBvciBpcyB3aWxkIG9yIGxhY2tzCiAgICAgICByZWFkIGFjY2Vzcy4KICAgICAqIEl0IGZhaWxzIGlmIHRoZSBzb3VyY2UgZmlsZSBpcyB0aGUgZGVzdGluYXRpb24gZmlsZS4KICAgICAqIEl0IGFsbG93cyB0aGUgZGVzdGluYXRpb24gZmlsZSB0byBiZSBhIGRpcmVjdG9yeSwgaW4gd2hpY2ggY2FzZQogICAgICAgdGhlIHNvdXJjZSBmaWxlIGlzIGNvcGllZCAob3IgcmVuYW1lZCkgaW50byBpdCB3aXRoIHRoZSBzYW1lIG5hbWUuCiAgICAgKiBJdCBvdmVyd3JpdGVzIGFuIGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUgaWYgaXRzIHBlcm1pc3Npb24KICAgICAgIGFsbG93cy4KICAgICAqIEl0IHNldHMgdGhlIG5ldyBmaWxlJ3MgcGVybWlzc2lvbiBhY2NvcmRpbmcgdG8gdW1hc2sgYnV0IGFsc28KICAgICAgIGNhcnJpZXMgZm9yd2FyZCB0aGUgc291cmNlIGZpbGUncyBleGVjdXRlIHBlcm1pc3Npb24gYml0cyBpZiB0aGUKICAgICAgIGRlc3RpbmF0aW9uIGZpbGUgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICogSXQgZmFpbHMgaWYgaW50ZXJydXB0ZWQgYnkgQ3RybC1DLgogICAgICogVXBvbiBlcnJvciwgaXQgcHJpbnRzIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UuCiAgICAgKiBJdCByZXR1cm5zIHN0YW5kYXJkaXplZCBlcnJvciBjb2RlcyB0aGF0IGNhbiBiZSB0ZXN0ZWQgYnkgSUYKICAgICAgIFNVQ0NFU1MgLyBGQUlMLgoKICAgVGhlc2UgY29tbWFuZHMgbm93IGFsc28gYWNjZXB0IHRoZSBmb2xsb3dpbmcgc3dpdGNoZXM6CgogIC9MSVNUICgvTE9HLCAvVkVSQk9TRSkgICAgPSBQcmludCAiZmlsZTEgPT4gZmlsZTIgKE9LKSIgKG9yIGVycm9yIG1lc3NhZ2UpLgogIC9OT0xJU1QgKC9OT0xPRywgL1FVSUVUKSAgPSBEb24ndCBwcmludCBhbnl0aGluZyAoZXhjZXB0IGVycm9yIG1lc3NhZ2VzKS4KCiAgIC9OT0xJU1QgaXMgdGhlIGRlZmF1bHQuCgogICBUaGUgc2FtZSBidWlsdC1pbiBjb2RlIGlzIHVzZWQgYnkgdGhlIFVOSVggQy1LZXJtaXQgc2VydmVyIHRvIGV4ZWN1dGUKICAgUkVNT1RFIENPUFkgY29tbWFuZHMgKGV4Y2VwdCBpbiB0aGlzIGNhc2Ugbm8gc3dpdGNoZXMgYXJlIGF2YWlsYWJsZSkuCgogICBUaGUgQ09QWSBjb21tYW5kIGFsc28gYWNjZXB0cyB0aGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgc3dpdGNoZXMuIFdoZW4KICAgYW55IG9mIHRoZXNlIGFyZSBnaXZlbiAoYW5kIHRoZXkgY2FuIGJlIHVzZWQgaW4gYW55IGNvbWJpbmF0aW9uIGV4Y2VwdAogICAvU1dBUCBhbmQgL0FQUEVORCksIHNvbWUgb2YgdGhlIGNoZWNrcyBsaXN0ZWQgYWJvdmUgYXJlIHJlbGF4ZWQsIGFuZAogICB0aHVzIGl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGdldCBpbnRvIHRyb3VibGUgaW4gY2VydGFpbiBjYXNlcywgZS5nLgogICB3aGVuIHRoZSBzb3VyY2UgYW5kIHRhcmdldCBmaWxlcyBhcmUgdGhlIHNhbWUgZmlsZToKCiAgL0FQUEVORCAgICAgICAgICAgICAgICAgICA9IEFwcGVuZCBzb3VyY2UgZmlsZSB0byBkZXN0aW5hdGlvbiBmaWxlLgogIC9TV0FQLUJZVEVTICAgICAgICAgICAgICAgPSBTd2FwIGJ5dGVzIChzZWUgWzM2NF1TZWN0aW9uIDYuNi41KS4KICAvRlJPTUI2NCAgICAgICAgICAgICAgICAgID0gRGVjb2RlIHRoZSBzb3VyY2UgZmlsZSBmcm9tIEJhc2U2NCBlbmNvZGluZy4KICAvVE9CNjQgICAgICAgICAgICAgICAgICAgID0gRW5jb2RlIHRoZSB0YXJnZXQgZmlsZSBpbiBCYXNlNjQuCgogICBCYXNlNjQgaXMgdGhlIGVuY29kaW5nIGNvbW1vbmx5IHVzZWQgZm9yIGVuY2xvc3VyZXMgaW4gSW50ZXJuZXQgZW1haWwuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS4xOC4gVGhlIE1BTlVBTCBDb21tYW5kCgogICBUaGUgTUFOVUFMIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBhcHByb3ByaWF0ZSBLZXJtaXQgbWFudWFsCiAgIG9yIG90aGVyIG1hbnVhbC4gVGhlIGdlbmVyYWwgc3ludGF4IGlzOgoKICAgTUFOVUFMIFsgc3RyaW5nIF0KICAgICAgICAgIElmIHRoZSBzdHJpbmcgaXMgb21pdHRlZCwgQy1LZXJtaXQgYXNrcyB0aGUgdW5kZXJseWluZyBzeXN0ZW0KICAgICAgICAgIHRvIGFjY2VzcyB0aGUgQy1LZXJtaXQgbWFudWFsIHVzaW5nIHdoYXRldmVyIG1ldGhvZCBpcwogICAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBzeXN0ZW0uCgogICBUaGUgc3BlY2lmaWMgYWN0aW9uIGRlcGVuZHMgb24gdGhlIHN5c3RlbS4gSW4gVU5JWCwgYSAibWFuIiBjb21tYW5kIGlzCiAgIGlzc3VlZDsgImtlcm1pdCIgaXMgdGhlIGRlZmF1bHQgYXJndW1lbnQgYnV0IG90aGVyIG1hbnVhbCB0b3BpY3MgbWF5CiAgIGJlIHNwZWNpZmllZC4gSWYgdGhlICJtYW4iIGNvbW1hbmQgYWxsb3dzIGluZGV4IG9yIHN0cmluZyBzZWFyY2hpbmcsCiAgIHRoZSBhcHByb3ByaWF0ZSBzeW50YXggbWF5IGJlIGluY2x1ZGVkLgoKICAgSW4gS2VybWl0IDk1LCB0aGUgTUFOVUFMIGNvbW1hbmQgYnJpbmdzIHVwIHRoZSBIVE1MIG9ubGluZSBLOTUgbWFudWFsLgoKICAgSW4gVk1TIGFuZCBlbHNld2hlcmUsICJtYW4iIGlzIHNpbXBseSB0cmFuc2xhdGVkIHRvICJoZWxwIiwgd2l0aCBhCiAgIGRlZmF1bHQgYXJndW1lbnQgb2YgImtlcm1pdCI7IG90aGVyIGFuZC9vciBhZGRpdGlvbmFsIGFyZ3VtZW50cyBtYXkgYmUKICAgaW5jbHVkZWQgYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBzeXN0ZW0ncyAiaGVscCIgY29tbWFuZC4KCiAgIENvcnJlY3Qgb3BlcmF0aW9uIG9mIHRoZSAibWFuIiBjb21tYW5kIGluIEMtS2VybWl0IGRlcGVuZHMgb24gdGhlCiAgIGFwcHJvcHJpYXRlIG1hbiBwYWdlIG9yIGhlbHAgdG9waWMgaGF2aW5nIGJlZW4gaW5zdGFsbGVkIGluIHRoZSByaWdodAogICBwbGFjZSB3aXRoIHRoZSByaWdodCBwZXJtaXNzaW9ucyBhbmQgZm9ybWF0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEuMTkuIFN0cmluZyBhbmQgRmlsZW5hbWUgTWF0Y2hpbmcgUGF0dGVybnMKCiAgIEEgcGF0dGVybiBpcyBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIHNwZWNpYWwgbm90YXRpb24gZm9yIG1hdGNoaW5nCiAgIGNsYXNzZXMgb3Igc2VxdWVuY2VzIG9mIGNoYXJhY3RlcnMuIEMtS2VybWl0IDcuMCAvIEs5NSAxLjEuMTkgc3VwcG9ydHMKICAgcGF0dGVybnMgaW4gc2V2ZXJhbCBwbGFjZXM6CgogICAgICogRmlsZW5hbWVzIChbMzY1XVNlY3Rpb24gNC45KQogICAgICogU1dJVENIIGNhc2UgbGFiZWxzIChbMzY2XVNlY3Rpb24gNy4xOCkKICAgICAqIFRoZSBuZXcgSUYgTUFUQ0ggc3RhdGVtZW50IChbMzY3XVNlY3Rpb24gNy40KQogICAgICogVFlQRSAvTUFUQ0ggKFszNjhdU2VjdGlvbiAxLjE1KQogICAgICogU0VUIEZJTEUgVEVYVC1QQVRURVJOUyBhbmQgQklOQVJZLVBBVFRFUk5TIChbMzY5XVNlY3Rpb24gNC4zKQogICAgICogVGhlIFxmc2VhcmNoKCkgYW5kIFxmYXJyYXlsb29rKCkgZnVuY3Rpb25zIChbMzcwXVNlY3Rpb25zIDcuMyBhbmQKICAgICAgIFszNzFdNy4xMC43KQogICAgICogVGhlIFxmcGF0dGVybigpIGZ1bmN0aW9uIHVzZWQgd2l0aCBbTSxSRV1JTlBVVCAoWzM3Ml1TZWN0aW9uIDcuMSkKCiAgIFBhdHRlcm5zIGFyZSBhbHNvIGNhbGxlZCB3aWxkY2FyZHMsIGVzcGVjaWFsbHkgd2hlbiB1c2VkIGZvciBmaWxlbmFtZQogICBtYXRjaGluZy4gQy1LZXJtaXQncyBwYXR0ZXJuIHN5bnRheCBpcyBleHBsYWluZWQgaW4gWzM3M11TZWN0aW9uCiAgIDQuOS4xLCBhbmQgYWxzbyBieSB0aGUgSEVMUCBXSUxEQ0FSRFMgY29tbWFuZC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAxLjIwLiBNdWx0aXBsZSBDb21tYW5kcyBvbiBPbmUgTGluZQoKICAgQXMgb2YgQy1LZXJtaXQgNy4wLCBjb21tYW5kcyBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBvbiBvbmUgbGluZSBieQogICBzZXBhcmF0aW5nIHRoZSBjb21tYW5kcyB3aXRoIGNvbW1hcyBhbmQgZW5jbG9zaW5nIHRoZSBsaXN0IGluIGJyYWNlcy4KICAgRm9yIGV4YW1wbGU6CgogIEMtS2VybWl0PiB7IGVjaG8gT25lLCBlY2hvIFR3bywgZWNobyBUaHJlZSB9CiAgQy1LZXJtaXQ+IGRvIHsgZWNobyBPbmUsIGVjaG8gVHdvLCBlY2hvIFRocmVlIH0KCiAgIENvbW1hbmQgbGlzdHMgY2FuIGJlIG5lc3RlZDoKCiAgWyBkbyBdIHsgZWNobyBPbmUsIGVjaG8gVHdvLCBpZiB0cnVlIHsgZWNobyBBLCBlY2hvIEJ9LCBlY2hvIFRocmVlIH0KCiAgIGFuZCB0aGUgRU5EIGNvbW1hbmQgd29ya3MgYXMgaXQgZG9lcyBpbiBtYWNyb3M6CgogIFsgZG8gXSB7IGVjaG8gT25lLCBlY2hvIFR3bywgaWYgdHJ1ZSBlbmQsIGVjaG8gVGhyZWUgfQoKICAgVGhlICJvbmUgbGluZSIgc3RyaWN0dXJlIGlzLCBvZiBjb3Vyc2UsIHBsaWFudCB0byBsaW5lLWNvbnRpbnVhdGlvbgogICBjb252ZW50aW9ucywgbmFtZWx5IHRoYXQgbGluZXMgZW5kaW5nIGluIGh5cGhlbiAoLSkgb3IgbGVmdCBicmFjZSAoeykKICAgYXJlIHRvIGJlIGNvbnRpbnVlZC4gVGh1cyB0aGUgZmlyc3QgZXhhbXBsZSBjYW4gYWxzbyBiZSByZW5kZXJlZDoKCiAgWyBkbyBdIHsKICAgICAgZWNobyBPbmUKICAgICAgZWNobyBUd28KICAgICAgZWNobyBUaHJlZQogIH0KCiAgICh0aGUgImRvIiBpcyBvcHRpb25hbCkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS4yMS4gV2hhdCBEbyBJIEhhdmU/CgogICBDLUtlcm1pdCBjYW4gYmUgYnVpbHQgZm9yIGh1bmRyZWRzIG9mIGRpZmZlcmVudCBwbGF0Zm9ybXMgd2l0aAogICBwcmFjdGljYWxseSBjb3VudGxlc3MgY29uZmlndXJhdGlvbiBvcHRpb25zLiBDZXJ0YWluIGNvbW1hbmRzIG1pZ2h0CiAgIG5vdCBiZSBhdmFpbGFibGUgaW4gY2VydGFpbiBjb25maWd1cmF0aW9ucywgZXRjLiBFdmVuIG9uIHRoZSBzYW1lCiAgIHBsYXRmb3JtLCBkaWZmZXJlbnQgYnVpbGRzIGFyZSBwb3NzaWJsZTogIm1heGltdW0gZnVuY3Rpb25hbGl0eSIsCiAgICJtaW5pbXVtIHNpemUiLCAibWF4aW11bSBwZXJmb3JtYW5jZSIsIGFuZCBzbyBvbi4gWW91IGNhbiBmaW5kIG91dCBhCiAgIGxvdCBhYm91dCB0aGUgY29uZmlndXJhdGlvbiBvZiB5b3VyIEMtS2VybWl0IHByb2dyYW0gd2l0aCB0aGUgU0hPVwogICBGRUFUVVJFUyBjb21tYW5kLiBPZiBjb3Vyc2UsIGEgbG90IG9mIHdoYXQgaXQgc2F5cywgZXNwZWNpYWxseSBpbiB0aGUKICAgYm90dG9tIHBhcnQsIG1pZ2h0IHNlZW0gbGlrZSBnaWJiZXJpc2gsIGJ1dCBjYW4gYmUgZGVjaXBoZXJlZCB3aXRoIGEKICAgUm9zZXR0YSBTdG9uZSAoc3VjaCBhcyB0aGUgQy1LZXJtaXQgc291cmNlIG9yIHRoZSBbMzc0XWNrY2NmZy50eHQKICAgZmlsZSkuIEluIGFueSBjYXNlLCB0aGUgb3V0cHV0IGZyb20gU0hPVyBGRUFUVVJFUyBtaWdodCBlYXNpbHkgZXhwbGFpbgogICB3aHkgc29tZSBleHBlY3RlZCBmZWF0dXJlIGlzIG1pc3NpbmcsIG9yIHNvbWUgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbgogICBleHBlY3RlZC4gSGVyZSdzIGEgc2FtcGxlIG9mIHRoZSBib3R0b20gc2VjdGlvbiBmb3IgdGhlIFN1bk9TIHZlcnNpb246CgpDLUtlcm1pdCA3LjAuMTk2LCAxIEphbiAyMDAwCgpNYWpvciBvcHRpb25hbCBmZWF0dXJlcyBpbmNsdWRlZDoKIE5ldHdvcmsgc3VwcG9ydCAodHlwZSBTSE9XIE5FVCBmb3IgZnVydGhlciBpbmZvKQogVGVsbmV0IEtlcm1pdCBPcHRpb24KIEhhcmR3YXJlIGZsb3cgY29udHJvbAogRXh0ZXJuYWwgWFlaTU9ERU0gcHJvdG9jb2wgc3VwcG9ydAogTGF0aW4tMSAoV2VzdCBFdXJvcGVhbikgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbgogTGF0aW4tMiAoRWFzdCBFdXJvcGVhbikgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbgogQ3lyaWxsaWMgKFJ1c3NpYW4sIFVrcmFpbmlhbiwgZXRjKSBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uCiBHcmVlayBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uCiBIZWJyZXcgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbgogSmFwYW5lc2UgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbgogVW5pY29kZSBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uCiBQc2V1ZG90ZXJtaW5hbCBjb250cm9sCiBSRURJUkVDVCBjb21tYW5kCiBSRVNFTkQgY29tbWFuZAogRnVsbHNjcmVlbiBmaWxlIHRyYW5zZmVyIGRpc3BsYXkKIENvbnRyb2wtY2hhcmFjdGVyIHVucHJlZml4aW5nCiBTdHJlYW1pbmcKIEF1dG9kb3dubG9hZAoKTWFqb3Igb3B0aW9uYWwgZmVhdHVyZXMgbm90IGluY2x1ZGVkOgogTm8gS2VyYmVyb3MoVE0pIGF1dGhlbnRpY2F0aW9uCiBObyBTUlAoVE0pIChTZWN1cmUgUmVtb3RlIFBhc3N3b3JkKSBwcm90b2NvbAogTm8gU2VjdXJlIFNvY2tldHMgTGF5ZXIgKFNTTCkgcHJvdG9jb2wKIE5vIFRyYW5zcG9ydCBMYXllciBTZWN1cml0eSAoVExTKSBwcm90b2NvbAogTm8gZW5jcnlwdGlvbgogTm8gWCBXaW5kb3dzIGZvcndhcmRpbmcKCkhvc3QgaW5mbzoKIE1hY2hpbmU6ICAgIHN1bjRtCiBNb2RlbDogICAgICAodW5rbm93bikKIE9TOiAgICAgICAgIFN1bk9TCiBPUyBSZWxlYXNlOiA0LjEuM19VMQogT1MgVmVyc2lvbjogNAoKVGFyZ2V0OiBzdW5vczQxZ3NjCkdDQyB2ZXJzaW9uOiAyLjcuMgpDb21waWxlZCBEZWMgMzEgMTk5OSAxMDozODo1NCwgb3B0aW9uczoKIF9fR05VQ19fIF9fU1REQ19fIF9QT1NJWF9KT0JfQ09OVFJPTCBfU0NfSk9CX0NPTlRST0wgQVJSQVlSRUZMRU49MTAyNCBCSUdCVUZPSwogQlJPV1NFUiBCU0Q0IENLX0FOU0lDIENLX0FQQyBDS19BVVRPREwgQ0tfQ1VSU0VTIENLX0ROU19TUlYgQ0tfRU5WSVJPTk1FTlQKIENLX0ZBU1QgQ0tfTE9HSU4gQ0tfTUtESVIgQ0tfTkFXUyBDS19QQ1RfQkFSIENLX1BFUk1TIENLX1JFQ0FMTCBDS19SVFNDVFMKIENLX1NQRUVEIENLX1RJTUVSUyBDS19UTVBESVIgQ0tfVFRHV1NJWiBDS19UVFlGRCBDS19XUkVGUkVTSCBDS0VYRUMKIENLRkxPQVQ9ZG91YmxlIENLR0hOTEhPU1QgY2ttYXhmaWxlcz02NCBDS01BWE9QRU49NjQgQ0tNQVhQQVRIPTEwMjMgQ0tSRUFMUEFUSAogQ0tSRUdFWCBDS1NZU0xPRyBDS1RVTklORyBDTURCTD0zMjc2MyBDTURERVA9NjQgQ09OR1NQRCBEQ01EQlVGIERJUkVOVCBEWU5BTUlDCiBGTkZMT0FUIEZPUkRFUFRIPTMyIEdGVElNRVIgSEFERFJMSVNUIEhEQlVVQ1AgSUZERUJVRyBJS1NfT1BUSU9OIElLU0RCCiBJS1NEQ09ORiBJTkJVRlNJWkU9MzI3NjggSU5QQlVGU0laPTQwOTYgTUFDX01BWD0xNjM4NCBNQUNMRVZFTD0xMjggTUFYRERJUj0zMgogTUFYRE5VTVM9NDA5NSBNQVhHRVRQQVRIPTEyOCBNQVhUQUtFPTU0IE1BWFdMRD0xMDI0MDAgTVNFTkRNQVg9MTAyNCBORVRDTUQKIE5FVENPTk4gTkVUUFRZIE5PS1ZFUkJTIE5PU0VUQlVGIE9CVUZTSVpFPTMyNzY4IFBBUlNFTlNFIFBBVFRFUk5TIFBJUEVTRU5ECiBSRU5BTUUgUkxPR0NPREUgU0FWRURVSUQgU0VMRUNUIFNJR19WIFNPTF9TT0NLRVQgc3BhcmMgU1RSRUFNSU5HIHN1biBTVU5PUzQKIFNZU1RJTUVIIFRDUFNPQ0tFVCBUSU1FSCBUTE9HIFROQ09ERSBUVExFQlVGIFRUU1BETElTVCBVSURCVUZMRU49MjU2IFVOSVgKIFVOUFJFRklYWkVSTyBVU0VfTFNUQVQgVVNFX01FTUNQWSBWTkFNTD00MDk2IFdIQVRBTUkgWEZSQ0FOIFpfTUFYQ0hBTj00Ngogel9tYXhjaGFuPTQ2IFpYUkVXSU5ECgogYnl0ZSBvcmRlcjogYmlnIGVuZGlhbgoKIHNpemVvZnM6IGludD00IGxvbmc9NCBzaG9ydD0yIGNoYXI9MSBjaGFyKj00IGZsb2F0PTQgZG91YmxlPTgKCiBmbG9hdGluZy1wb2ludDogcHJlY2lzaW9uPTE2IHJvdW5kaW5nPTEKCiAgIFdpdGhvdXQgZ29pbmcgaW50byBkZXRhaWwgYWJvdXQgd2hhdCBhbGwgdGhlIG5vdGF0aW9uIG1lYW5zLCBub3RpY2UgYQogICBjb3VwbGUgdGhpbmdzOgoKICAgICAqIFRoZSBPcHRpb25zIHNlY3Rpb24gc2hvd3Mgc3ltYm9scyAoIm1hY3JvcyIpIGluIGVmZmVjdCBkdXJpbmcKICAgICAgIGNvbXBpbGF0aW9uLCB0b2dldGhlciB3aXRoIHRoZWlyIHZhbHVlcyAoZm9yIHRob3NlIHRoYXQgaGF2ZQogICAgICAgdmFsdWVzKS4gVGhlIG9wdGlvbnMgYXJlIGxpc3RlZCBpbiBhbHBoYWJldGljYWwgb3JkZXIgdG8gbWFrZSBhbnkKICAgICAgIHBhcnRpY3VsYXIgb3B0aW9uIGVhc2llciB0byBmaW5kLgogICAgICogTUFYV0xEIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcyB0aGF0IGEgd2lsZGNhcmQgY2FuIGV4cGFuZAogICAgICAgdG8uCiAgICAgKiBBbnl0aGluZyBzdGFydGluZyB3aXRoICJOTyIgaXMgYSBmZWF0dXJlIChvciBzb21ldGhpbmcgb3RoZXIgdGhhbgogICAgICAgYSBmZWF0dXJlKSB0aGF0IGhhcyBiZWVuIGRlbGliZXJhdGVseSAiY29tcGlsZWQgb3V0Iiwgb3Igb21pdHRlZC4KICAgICAqIEltcG9ydGFudCBpdGVtcyBmb3Igc2NyaXB0IHdyaXRlcnMgaW5jbHVkZTogQ01EQkw9MzI3NjMgKHRoZSBzaXplCiAgICAgICBvZiB0aGUgY29tbWFuZCBidWZmZXIgYW5kIHRoZXJlZm9yZSB0aGUgbWF4aW11bSBsZW5ndGggZm9yIGEgbWFjcm8KICAgICAgIG9yIHZhcmlhYmxlIGRlZmluaXRpb247IENNRERFUD02NCAodGhlIGxpbWl0IG9uIHJlY3Vyc2lvbiBkZXB0aCk7CiAgICAgICBGT1JERVBUSD0zMiAodGhlIG5lc3RpbmcgbGltaXQgb24gRk9SIGxvb3BzKTsgSU5CVUZTSVpFPTMyNzY4ICh0aGUKICAgICAgIHNpemUgb2YgdGhlIElOUFVUIGNvbW1hbmQgY2lyY3VsYXIgYnVmZmVyKTsgTUFDX01BWD0xNjM4NCAodGhlCiAgICAgICBtYXhpbXVtIG51bWJlciBvZiBtYWNyb3MpLCBldGMuCgogICBTZWUgdGhlIFszNzVdY2tjY2ZnLnR4dCBmaWxlIGZvciBkZXRhaWxzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEuMjIuIEdlbmVyYWxpemVkIEZpbGUgSW5wdXQgYW5kIE91dHB1dAoKICAgQy1LZXJtaXQgNy4wIGFkZHMgYSBuZXcgZ2VuZXJhbGl6ZWQgSS9PIHN5c3RlbSBmb3Igc3RyZWFtIGZpbGVzLAogICBhdWdtZW50aW5nIChhbmQgdG8gc29tZSBleHRlbnQsIG92ZXJsYXBwaW5nIHdpdGgpIHRoZSBvbGRlciBPUEVOLAogICBSRUFELCBXUklURSwgYW5kIENMT1NFIGNvbW1hbmRzLiBJbiB0aGUgbmV3IGZpbGUgaS9vIHN5c3RlbSwgd2hpY2ggY2FuCiAgIGJlIHVzZWQgc2ltdWx0YW5lb3VzbHkgd2l0aCB0aGUgb2xkIG9uZSwgYWxsIGNvbW1hbmRzIGFyZSBncm91cGVkCiAgIHRvZ2V0aGVyIHVuZGVyIHRoZSBuZXcgRklMRSBrZXl3b3JkLCBhbmQgc29tZSByZWxhdGVkIGZ1bmN0aW9ucyBhbmQKICAgdmFyaWFibGVzIGFyZSBhZGRlZC4KCiAgICAxLjIyLjEuIFdoeSBBbm90aGVyIEkvTyBTeXN0ZW0/CgogICBUaGUgd2VsbC1rbm93biBMT0csIE9QRU4sIFJFQUQsIFdSSVRFLCBhbmQgQ0xPU0UgY29tbWFuZHMgaGF2ZSB0aGUKICAgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKCiAgICAxLiBPbmx5IG9uZSBSRUFEIGZpbGUgYW5kIG9uZSBXUklURSBmaWxlIGNhbiBiZSBvcGVuIGF0IGEgdGltZS4KICAgIDIuIFRoZSBSRUFEIGFuZCBXUklURSBjb21tYW5kcyBhcmUgc3RyaWN0bHkgbGluZSBvcmllbnRlZC4KICAgIDMuIFRoZXNlIGNvbW1hbmRzIGNhbiBub3QgYmUgdXNlZCB3aXRoIGJpbmFyeSBmaWxlcy4KICAgIDQuIFRoZXkgZG8gbm90IHN1cHBvcnQgcmVhZC93cml0ZSBhY2Nlc3Mgb3IgcmFuZG9tIGFjY2Vzcy4KICAgIDUuIFRoZSBzeW50YXggaXMgYSBiaXQgY291bnRlcmludHVpdGl2ZSBmb3IgcHJvZ3JhbW1lcnMuCgogICBUaGUgbmV3IGZpbGUgaS9vIHN5c3RlbSBhbGxvd3MgbXVsdGlwbGUgZmlsZXMgdG8gYmUgb3BlbiBhdCBvbmNlLCBpbgogICBhbnkgZGVzaXJlZCBjb21iaW5hdGlvbiBvZiBtb2RlcyAocmVhZC93cml0ZS9hcHBlbmQpIHN1cHBvcnRlZCBieSB0aGUKICAgb3BlcmF0aW5nIHN5c3RlbSwgZm9yIGxpbmUsIGJsb2NrIChyZWNvcmQpLCBvciBjaGFyYWN0ZXIgaS9vLCBmb3IKICAgc2VxdWVudGlhbCBvciByYW5kb20gYWNjZXNzLCB1c2luZyBjb25zaXN0ZW50IHN5bnRheCBhbmQgY29udmVudGlvbnMuCgogICBUaGUgbmV3IHN5c3RlbSwgaG93ZXZlciwgZG9lcyBub3QgcmVwbGFjZSB0aGUgb2xkIG9uZSwgc2luY2UgdGhlIG9sZAogICBzeXN0ZW0gc3RpbGwgbXVzdCBiZSB1c2VkIGZvcjoKCiAgICAxLiBUaGUgc2Vzc2lvbiwgcGFja2V0LCBkZWJ1ZywgdHJhbnNhY3Rpb24sIGFuZCBjb25uZWN0aW9uIGxvZ3MuCiAgICAyLiBSZWFkaW5nIGFuZCB3cml0aW5nIGNvbW1hbmRzIHJhdGhlciB0aGFuIGZpbGVzLgogICAgMy4gRXhpc3Rpbmcgc2NyaXB0cy4KCiAgIFRoZSBuZXcgc3lzdGVtIHdvcmtzIG9ubHkgd2l0aCByZWd1bGFyIGZpbGVzLCBub3Qgd2l0aCBjb21tYW5kcyBvcgogICBwaXBlcyBvciBtYWlsYm94ZXMgb3IgcHNldWRvdGVybWluYWxzLiBObyBzcGVjaWFsIHByb3Zpc2lvbnMgYXJlIG1hZGUKICAgaW4gdGhlIEZJTEUgY29tbWFuZHMgZm9yIGhhbmRsaW5nIGRldmljZXMgb3IgbmV0d29yayBjb25uZWN0aW9ucywgbm9yCiAgIGZvciBwcmV2ZW50aW5nIHlvdSBmcm9tIHRyeWluZyB0byBvcGVuIHRoZW07IGlmIHRoZSB1bmRlcmx5aW5nCiAgIG9wZXJhdGluZyBzeXN0ZW0gdHJlYXRzIHRoZW0gbGlrZSByZWd1bGFyIHN0cmVhbSBkaXNrIGZpbGVzLCB0aGUgRklMRQogICBjb21tYW5kcyAoZXhjZXB0LCBvZiBjb3Vyc2UgU0VFSywgUkVXSU5ELCBhbmQgQ09VTlQpIG1pZ2h0IHdvcmsgd2l0aAogICB0aGVtLiAoSW4gQyBwcm9ncmFtbWluZyB0ZXJtcywgdGhlIEZJTEUgY29tbWFuZHMgYXJlLCBhdCBwcmVzZW50LAogICBub3RoaW5nIG1vcmUgdGhhbiBhIGZyb250IGVuZCB0byBmb3BlbigpIC8gZnJlYWQoKSAvIGZ3cml0ZSgpIC8KICAgZmNsb3NlKCkgYW5kIGZyaWVuZHMsIHdoaWNoIGFyZSBhIHBvcnRhYmxlIEFQSSB0byBzZXF1ZW50aWFsIGZpbGVzLAogICBidXQgdGhpcyBtaWdodCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSBmb3IgcGxhdGZvcm1zIGxpa2UgVk1TIGFuZCBWT1MKICAgdGhhdCBoYXZlIG1vcmUgY29tcGxpY2F0ZWQgZmlsZSBzeXN0ZW1zLikKCiAgIERlZmluaXRpb25zOgoKICAgQ2hhbm5lbAogICAgICAgICAgQSBudW1iZXIgYXNzaWduZWQgdG8gYSBmaWxlIHdoZW4gaXQgaXMgb3BlbmVkLCBieSB3aGljaCBpdCBtdXN0CiAgICAgICAgICBiZSByZWZlcnJlZCB0byBpbiBhbGwgaW5wdXQvb3V0cHV0IG9wZXJhdGlvbnMuCgogICBSZWFkL1dyaXRlIFBvaW50ZXIKICAgICAgICAgIFRoZSBjdXJyZW50IHBvc2l0aW9uIGluIGFuIG9wZW4gZmlsZSwgZXhwcmVzc2VkIGFzIHRoZSAwLWJhc2VkCiAgICAgICAgICBieXRlIGNvdW50IGZyb20gdGhlIGJlZ2lubmluZy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDEuMjIuMi4gVGhlIEZJTEUgQ29tbWFuZAoKICAgRklMRSBrZXl3b3JkIFsgc3dpdGNoZXMgXSBjaGFubmVsIFsgZGF0YSBdCiAgICAgICAgICBUaGUga2V5d29yZCBzcGVjaWZpZXMgdGhlIGZ1bmN0aW9uOiBGSUxFIE9QRU4sIEZJTEUgUkVBRCwgRklMRQogICAgICAgICAgV1JJVEUsIEZJTEUgQ0xPU0UsIGV0Yy4gRm9yIGNvbnZlbmllbmNlIChhbmQgZm9yIGZhbWlsaWFyaXR5IHRvCiAgICAgICAgICBDIHByb2dyYW1tZXJzKSwgdGhlIHR3by13b3JkIEZJTEUgY29tbWFuZHMgY2FuIGJlIHNob3J0ZW5lZCB0bwogICAgICAgICAgdGhlIHNpbmdsZSB3b3JkcyBGT1BFTiwgRlJFQUQsIEZXUklURSwgRkNMT1NFLCBhbmQgc28gb24uCiAgICAgICAgICBTd2l0Y2hlcyBhcmUgb3B0aW9uYWwsIGFuZCBtb2RpZnkgb3IgYW1wbGlmeSB0aGUgcmVxdWVzdGVkIGZpbGUKICAgICAgICAgIGZ1bmN0aW9uLgoKICAgQXMgaW4gQywgRm9ydHJhbiwgYW5kIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcywgb3BlbiBmaWxlcyBhcmUKICAgcmVmZXJyZWQgdG8gYnkgImNoYW5uZWxzIiwgaW50ZWdlcnMgc3VjaCBhcyAwLCAxLCAyLCAzLCBhbmQgc28gb24uIEEKICAgY2hhbm5lbCBudW1iZXIgaXMgYXNzaWduZWQgd2hlbiB5b3Ugb3BlbiBhIGZpbGUuIFRoZSBudW1iZXIgb2YKICAgYXZhaWxhYmxlIGNoYW5uZWxzIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSwgYW5kIGNhbgogICBiZSBzZWVuIGluIHRoZSB2YXJpYWJsZToKCiAgXHYoZl9tYXgpCgogICBvciBieSBnaXZpbmcgdGhlIEZJTEUgTElTVCAoRkxJU1QpIGNvbW1hbmQuIENoYW5uZWxzIGFyZSBkaXNjdXNzZWQgaW4KICAgZ3JlYXRlciBkZXRhaWwgaW4gWzM3Nl1TZWN0aW9uIDEuMjIuNC4KCiAgIEZJTEUgY29tbWFuZCBlcnJvcnMgY2FuIGJlIGNhdWdodCB3aXRoIElGIEZBSUwgYWZ0ZXIgdGhlIEZJTEUgY29tbWFuZC4KICAgSW4gYWRkaXRpb24sIHRoZSBcdihmX2Vycm9yKSB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIGNvbXBsZXRpb24gY29kZSBvZgogICB0aGUgY29tbWFuZDogMCBpZiBubyBlcnJvciwgb3IgYSBuZWdhdGl2ZSBudW1iZXIgaWYgdGhlcmUgd2FzIGFuCiAgIGVycm9yLiBUaGUgZXJyb3IgY29kZXMgYXJlIGxpc3RlZCBpbiBbMzc3XVNlY3Rpb24gMS4yMi41LgoKICAgVGhlIGNvbW1hbmQgdG8gb3BlbiBhIGZpbGUgaXM6CgogICBGSUxFIE9QRU4gWyBzd2l0Y2hlcyBdIHZhcmlhYmxlIGZpbGVuYW1lCiAgICAgICAgICBPcGVucyBhIGZpbGUgZm9yIHRoZSB0eXBlIG9mIGFjY2VzcyBzcGVjaWZpZWQgYnkgdGhlIHN3aXRjaGVzLAogICAgICAgICAgb3IgZm9yIHJlYWQtb25seSBhY2Nlc3MgaWYgbm8gc3dpdGNoZXMgYXJlIGdpdmVuLiBVcG9uIHN1Y2Nlc3MsCiAgICAgICAgICBhIGNoYW5uZWwgbnVtYmVyIGlzIGFzc2lnbmVkIHRvIHRoaXMgZmlsZSBhbmQgc3RvcmVkIGluIHRoZQogICAgICAgICAgZ2l2ZW4gdmFyaWFibGUgc28geW91IGNhbiByZWZlciB0byB0aGUgb3BlbiBmaWxlIGluIHN1YnNlcXVlbnQKICAgICAgICAgIGkvbyBjb21tYW5kcy4gSWYgdGhlIGZpbGUgY2FuIG5vdCBiZSBvcGVuZWQsIHRoZSBGSUxFIE9QRU4KICAgICAgICAgIGNvbW1hbmQgZmFpbHMuIFN5bm9ueW06IEZPUEVOLgoKICAgVGhlIEZJTEUgT1BFTiBzd2l0Y2hlcyBhcmU6CgogICAvUkVBRAogICAgICAgICAgT3BlbiB0aGUgZmlsZSBmb3IgcmVhZCBhY2Nlc3MuIElmIG5vIHN3aXRjaGVzIGFyZSBnaXZlbiwgL1JFQUQKICAgICAgICAgIGlzIGFzc3VtZWQuIElmIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0IG9yIGNhbid0IGJlIG9wZW5lZCBmb3IKICAgICAgICAgIHJlYWQgYWNjZXNzLCB0aGUgRklMRSBPUEVOIGNvbW1hbmQgZmFpbHMuCgogICAvV1JJVEUKICAgICAgICAgIEFsbG93IHdyaXRpbmcuIElmIGEgZmlsZSBvZiB0aGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCBpcwogICAgICAgICAgb3ZlcndyaXR0ZW4gdW5sZXNzIC9SRUFEIG9yIC9BUFBFTkQgaXMgYWxzbyBpbmNsdWRlZC4gSWYgYSBmaWxlCiAgICAgICAgICBvZiB0aGUgZ2l2ZW4gbmFtZSBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4KCiAgIC9BUFBFTkQKICAgICAgICAgIEVxdWl2YWxlbnQgdG8gL1dSSVRFLCBleGNlcHQgdGhhdCBpZiB0aGUgZmlsZSBleGlzdHMsIGl0IGlzIG5vdAogICAgICAgICAgZGVzdHJveWVkLiBUaGUgcmVhZC93cml0ZSBwb2ludGVyIGlzIHNldCB0byB0aGUgZW5kIG9mIHRoZQogICAgICAgICAgZmlsZSwgc28gdW5sZXNzIHlvdSBjaGFuZ2UgaXQgd2l0aCBGSUxFIFNFRUsgb3IgUkVXSU5EIChzZWUKICAgICAgICAgIGJlbG93KSwgdGhlIGZpcnN0IEZJTEUgV1JJVEUgY29tbWFuZCBhZGRzIHRvIHRoZSBlbmQgb2YgdGhlCiAgICAgICAgICBmaWxlLCBwcmVzZXJ2aW5nIHdoYXQgd2FzIHRoZXJlIGFscmVhZHkuIElmIC9XUklURSBpcyBhbHNvCiAgICAgICAgICBnaXZlbiwgaXQgaXMgaWdub3JlZC4KCiAgIC9CSU5BUlkKICAgICAgICAgIE9wZW4gdGhlIGZpbGUgaW4gImJpbmFyeSIgbW9kZSwgcmF0aGVyIHRoYW4gdGV4dCBtb2RlLiBUaGlzCiAgICAgICAgICBzd2l0Y2ggaXMgbWVhbmluZ2xlc3MgKGJ1dCBzdGlsbCBjYW4gYmUgdXNlZCkgaW4gVU5JWC4gSW4gVk1TLAogICAgICAgICAgV2luZG93cywgYW5kIE9TLzIsIGl0IGluaGliaXRzIGVuZC1vZi1saW5lIHByb2Nlc3NpbmcgYW5kCiAgICAgICAgICBjb252ZXJzaW9uLCBhbmQgc28gc2hvdWxkIGJlIHVzZWQgZm9yIGJpbmFyeSBmaWxlcyBhbmQvb3IgZmlsZXMKICAgICAgICAgIHRoYXQgYXJlIHRvIGJlIGFjY2Vzc2VkIGluIHJlY29yZCBvciBjaGFyYWN0ZXIgbW9kZSByYXRoZXIgdGhhbgogICAgICAgICAgbGluZSBieSBsaW5lLgoKICAgVGhlIHZhcmlhYmxlIGZvciB0aGUgY2hhbm5lbCBudW1iZXIgY2FuIGJlIGFueSBraW5kIG9mIHZhcmlhYmxlOiB0aGUKICAgXCV4IGtpbmQsIGEgbWFjcm8gbmFtZSwgb3IgYW4gYXJyYXkgZWxlbWVudC4gQnV0IGl0IG11c3QgYmUgYQogICB2YXJpYWJsZSwgbm90IGEgbnVtYmVyIC0tIEMtS2VybWl0IGFzc2lnbnMgdGhlIGNoYW5uZWwgbnVtYmVyOyB5b3UKICAgY2FuJ3QgdGVsbCBpdCB3aGF0IG51bWJlciB0byB1c2UuCgogICBFeGFtcGxlOgoKICBGSUxFIE9QRU4gXCVjIG9vZmEudHh0ICAgICAgICAgICAgICAgICAgOyBPcGVuIG9vZmEudHh0IGZvciByZWFkaW5nLgogIElGIEZBSUwgZXhpdCAxIENhbid0IG9wZW4gb29mYS50eHQgICAgICA7IEFsd2F5cyBjaGVjayB0byBzZWUgaWYgaXQgd29ya2VkLgogIEVDSE8gb29mYS50eHQ6IGNoYW5uZWwgPSBcJWMKCiAgIElmIHRoZSBmaWxlIG9vZmEudHh0IGlzIG9wZW5lZCBzdWNjZXNzZnVsbHksIGEgY2hhbm5lbCBudW1iZXIgaXMKICAgYXNzaWduZWQgdG8gdGhlIHZhcmlhYmxlIFwlYy4gSGVyZSdzIGFub3RoZXIgZXhhbXBsZSB1c2luZyBhIG1hY3JvCiAgIG5hbWUgZm9yIHRoZSBjaGFubmVsIG51bWJlcjoKCiAgRklMRSBPUEVOIGNoYW5uZWwgb29mYS50eHQgICAgICAgICAgICAgIDsgT3BlbiBvb2ZhLnR4dCBmb3IgcmVhZGluZy4KICBJRiBTVUNDRVNTIEVDSE8gb29mYS50eHQ6IGNoYW5uZWwgPSBcbShjaGFubmVsKQoKICAgU3dpdGNoZXMgY2FuIGJlIGNvbWJpbmVkIHdoZW4gaXQgbWFrZXMgc2Vuc2UgYW5kIHRoZSB1bmRlcmx5aW5nCiAgIG9wZXJhdGluZyBzeXN0ZW0gYWxsb3dzIGl0LiBGb3IgZXhhbXBsZSwgdG8gb3BlbiBhIGZpbGUgaW4gYmluYXJ5IG1vZGUKICAgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgKHNvbWV0aW1lcyBjYWxsZWQgInVwZGF0ZSIpOgoKICBGSUxFIE9QRU4gL1JFQUQgL1dSSVRFIC9CSU5BUlkgXCVjIGJ1ZGdldC5kYgoKICAgU29tZSBjb21iaW5hdGlvbnMgbWlnaHQgYmUgYWxsb3dlZCwgb3RoZXJzIG5vdC4gRm9yIGV4YW1wbGUgL1JFQUQKICAgL0FQUEVORCB3aWxsIHVzdWFsbHkgbm90IGJlIGFsbG93ZWQuIC9XUklURSAvQVBQRU5EIGlzIHRyZWF0ZWQgYXMKICAgL0FQUEVORC4KCiAgIEEgbWFqb3IgYWR2YW50YWdlIG9mIHRoZSBuZXcgc3lzdGVtIG92ZXIgdGhlIG9sZGVyIG9uZSBpcyB0aGF0IHlvdSBjYW4KICAgaGF2ZSBtdWx0aXBsZSBmaWxlcyBvcGVuIGF0IG9uY2UuIFN1cHBvc2UsIGZvciBleGFtcGxlLCB0aGF0IHlvdSB3YW50CiAgIHRvIG9wZW4gYWxsIHRoZSBmaWxlcyBpbiBhIGNlcnRhaW4gZGlyZWN0b3J5IGF0IG9uY2U6CgogIC5cJW4gOj0gXGZmaWxlcygvdXNyL29sZ2EqLCZmKSAgICAgICAgICA7IEdldCBmaWxlIGxpc3QgaW50byBhcnJheS4KICBpZiAoID4gXCVuIFx2KGZfbWF4KSApIHsgICAgICAgICAgICAgICAgOyBNYWtlIHN1cmUgdGhlcmUgYXJlbid0IHRvbyBtYW55LgogICAgICBleGl0IDEge1x2KGRpcik6IFwlbiA9IFRvbyBtYW55IGZpbGVzfQogIH0KICBkZWNsYXJlIFwmY1tcJW5dICAgICAgICAgICAgICAgICAgICAgICAgOyBNYWtlIGFycmF5IGZvciBjaGFubmVsIG51bWJlcnMuCiAgZm9yIFwlaSAxIFwlbiAxIHsgICAgICAgICAgICAgICAgICAgICAgIDsgTG9vcCB0byBvcGVuIGV2ZXJ5IGZpbGUuLi4KICAgICAgZmlsZSBvcGVuIFwmY1tcJWldIFwmZltcJWldICAgICAgICAgOyBUcnkgdG8gb3BlbiB0aGlzIG9uZQogICAgICBpZiBmYWlsIGV4aXQgMSBPcGVuIGVycm9yOiBcJmZbXCVpXSA7IENoZWNrIGZvciBmYWlsdXJlCiAgfQoKICAgSWYgdGhpcyBsb29wIGNvbXBsZXRlcyBzdWNjZXNzZnVsbHksIHRoZSBcJmNbXSBhcnJheSB3aWxsIGNvbnRhaW4gXCVuCiAgIGNoYW5uZWwgbnVtYmVycyBvZiBvcGVuIGZpbGVzIGluIGVsZW1lbnRzIDEgdGhyb3VnaCBcJW4uCgogICBBbnkgZmlsZSB0aGF0IHlvdSBvcGVuIHdpdGggRklMRSBPUEVOIHN0YXlzIG9wZW4gdW50aWwgS2VybWl0IGV4aXRzLAogICBvciB5b3UgY2xvc2UgaXQgZXhwbGljaXRseS4gVGhlIGNvbW1hbmQgdG8gY2xvc2UgYSBmaWxlIGlzOgoKICAgRklMRSBDTE9TRSB7IEFMTCwgY2hhbm5lbCB9CiAgICAgICAgICBJZiBhIGNoYW5uZWwgbnVtYmVyIGlzIGdpdmVuIGFuZCB0aGUgY2hhbm5lbCByZWZlcnMgdG8gYW4gb3BlbgogICAgICAgICAgZmlsZSwgdGhlIGZpbGUgaXMgY2xvc2VkIGFuZCB0aGUgY2hhbm5lbCBpcyBmcmVlZCBmb3IgcmV1c2U7IGlmCiAgICAgICAgICB0aGUgY2hhbm5lbCBkb2VzIG5vdCByZWZlciB0byBhbiBvcGVuIGZpbGUsIGFuIGVycm9yIG1lc3NhZ2UgaXMKICAgICAgICAgIHByaW50ZWQgYW5kIHRoZSBjb21tYW5kIGZhaWxzLiBJZiBBTEwgaXMgc3BlY2lmaWVkIGluc3RlYWQgb2YgYQogICAgICAgICAgc3BlY2lmaWMgY2hhbm5lbCwgYWxsIGZpbGVzIG9wZW5lZCB3aXRoIEZJTEUgT1BFTiBhcmUgY2xvc2VkCiAgICAgICAgICBhbmQgaWYgYWxsIG9wZW4gZmlsZXMgd2VyZSBjbG9zZWQgc3VjY2Vzc2Z1bGx5IChldmVuIGlmIG5vCiAgICAgICAgICBmaWxlcyB3ZXJlIG9wZW4pLCB0aGUgY29tbWFuZCBzdWNjZWVkczsgaWYgYW55IG9wZW4gZmlsZSBjb3VsZAogICAgICAgICAgbm90IGJlIGNsb3NlZCwgdGhlIGNvbW1hbmQgZmFpbHM7IGhvd2V2ZXIsIGFsbCBvcGVuIGZpbGVzIHRoYXQKICAgICAgICAgIGNvdWxkIGJlIGNsb3NlZCBhcmUgc3RpbGwgY2xvc2VkLiBTeW5vbnltOiBGQ0xPU0UuCgogICBGSUxFIENMT1NFIG1pZ2h0IGZhaWwgYmVjYXVzZSwgZm9yIGV4YW1wbGUsIHRoZSBkaXNrIGZpbGxlZCB1cCBvciBhCiAgIHF1b3RhIHdhcyBleGNlZWRlZC4gRXhhbXBsZToKCiAgZm9wZW4gL3dyaXRlIFwlYyBuZXcudHh0ICAgICAgICAgICAgICAgIDsgT3BlbiBuZXcudHh0IGZvciB3cml0aW5nLgogIGlmIGZhaWwgZXhpdCAxICAgICAgICAgICAgICAgICAgICAgICAgICA7IENoZWNrIGZvciBlcnJvci4KICBmY2xvc2UgXCVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbG9zZSB0aGUgZmlsZSB3ZSBqdXN0IG9wZW5lZC4KCiAgIFRoaXMgY3JlYXRlcyBhIDAtbGVuZ3RoIGZpbGUgY2FsbGVkIG5ldy50eHQuCgogICBOb3RlIHRoYXQgRklMRSBPUEVOIC9XUklURSAod2l0aG91dCAvUkVBRCBvciAvQVBQRU5EKSBhbHdheXMgY3JlYXRlcyBhCiAgIG5ldyBmaWxlLCBhbmQgdGhlcmVmb3JlIGRlc3Ryb3lzIGFueSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSB0aGF0CiAgIG1pZ2h0IGFscmVhZHkgZXhpc3QgKGFzc3VtaW5nIHlvdSBoYXZlIHBlcm1pc3Npb24gdG8gZGVsZXRlIGl0KS4gVG8KICAgYXZvaWQgb3ZlcndyaXRpbmcgZXhpc3RpbmcgZmlsZXMsIHNpbXBseSBjaGVjayBmaXJzdDoKCiAgaWYgZXhpc3QgbmV3LnR4dCBleGl0IDEge0ZhdGFsIC0gbmV3LnR4dCBhbHJlYWR5IGV4aXN0c30KICBmb3BlbiAvd3JpdGUgXCVjIG5ldy50eHQKICBpZiBmYWlsIC4uLgoKICAgVGhlIG5leHQgdHdvIGNvbW1hbmRzIGdpdmUgaW5mb3JtYXRpb24gYWJvdXQgb3BlbiBmaWxlczoKCiAgIEZJTEUgU1RBVFVTIGNoYW5uZWwKICAgICAgICAgIFRlbGxzIHRoZSBuYW1lIG9mIHRoZSBmaWxlLCBpZiBhbnksIG9wZW4gb24gdGhlIGdpdmVuIGNoYW5uZWwKICAgICAgICAgIGFuZCB0aGUgc3dpdGNoZXMgaXQgd2FzIG9wZW5lZCB3aXRoLiBUaGUgcmVhZC93cml0ZSBwb2ludGVyIGlzCiAgICAgICAgICBhbHNvIHNob3duOyB0aGlzIGlzIHdoZXJlIHRoZSBuZXh0IHJlYWQgb3Igd3JpdGUgd2lsbCBvY2N1cjsKICAgICAgICAgICJbRU9GXSIgaXMgc2hvd24gaWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIG9wZW4gZmlsZSBpcwogICAgICAgICAgdGhlIGVuZCAtLSBpLmUuIHRoZSBuZXh0IHJlYWQgd2lsbCBmYWlsIGlmIHRoZSBmaWxlIHdhcyBvcGVuZWQKICAgICAgICAgIGluIC9SRUFEIG1vZGU7IHRoZSBuZXh0IHdyaXRlIHdpbGwgYWRkIG1hdGVyaWFsIHRvIHRoZSBlbmQuIFRoZQogICAgICAgICAgY3VycmVudCBsaW5lIG51bWJlciAoMC1iYXNlZCkgaXMgYWxzbyBzaG93biBpZiBrbm93bi4gVGhlIEZJTEUKICAgICAgICAgIFNUQVRVUyBjb21tYW5kIHN1Y2NlZWRzIGlmIHRoZSBjaGFubmVsIGlzIG9wZW4sIGFuZCBmYWlscyBpZgogICAgICAgICAgdGhlcmUgaXMgbm8gb3BlbiBmaWxlIG9uIHRoZSBnaXZlbiBjaGFubmVsLCBvciBpZiB0aGUgY2hhbm5lbAogICAgICAgICAgbnVtYmVyIGlzIGludmFsaWQgb3Igb3V0IG9mIHJhbmdlLiBTeW5vbnltOiBGU1RBVFVTLgoKICAgRklMRSBMSVNUCiAgICAgICAgICBMaXN0cyB0aGUgY2hhbm5lbCBudW1iZXIgYW5kIG5hbWUgb2YgZWFjaCBvcGVuIGZpbGUsIGFsb25nIHdpdGgKICAgICAgICAgIGl0cyBPUEVOIG1vZGVzIChSLCBXLCBBLCBCLCBSVywgZXRjKSBhbmQgaXRzIGN1cnJlbnQgcmVhZC93cml0ZQogICAgICAgICAgcG9pbnRlciBvciAiW0VPRl0iIGlmIGl0IGlzIGF0IHRoZSBlbmQuIEFsc28gdGVsbHMgdGhlIG51bWJlcgogICAgICAgICAgb2YgZmlsZXMgY3VycmVudGx5IG9wZW5lZCB3aXRoIEZJTEUgT1BFTiwgcGx1cyB0aGUgbWF4aW11bQogICAgICAgICAgbnVtYmVyIG9mIG9wZW4gZmlsZXMgYWxsb3dlZCBieSB0aGUgc3lzdGVtIGFuZCB0aGUgbWF4aW11bQogICAgICAgICAgbnVtYmVyIGFsbG93ZWQgZm9yIEZJTEUgT1BFTi4gU3lub255bTogRkxJU1QuCgogICBOZXh0IGNvbWUgdGhlIGNvbW1hbmRzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIGZpbGVzOgoKICAgRklMRSBSRUFEIFsgc3dpdGNoZXMgXSBjaGFubmVsIFsgdmFyaWFibGUgXQogICAgICAgICAgUmVhZHMgZGF0YSBmcm9tIHRoZSBmaWxlIG9uIHRoZSBnaXZlbiBjaGFubmVsIG51bWJlciBpbnRvIHRoZQogICAgICAgICAgdmFyaWFibGUsIGlmIG9uZSB3YXMgZ2l2ZW47IGlmIG5vIHZhcmlhYmxlIHdhcyBnaXZlbiwgdGhlCiAgICAgICAgICByZXN1bHQgaXMgcHJpbnRlZCBvbiB0aGUgc2NyZWVuLiBJTVBPUlRBTlQ6IFRoZSB2YXJpYWJsZSBzaG91bGQKICAgICAgICAgIG5vcm1hbGx5IGJlIGEgbWFjcm8gbmFtZSByYXRoZXIgdGhhbiBhIFwleCBvciBcJnhbXSB2YXJpYWJsZSBpZgogICAgICAgICAgeW91IHdhbnQgYmFja3NsYXNoIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGUgdG8gYmUgdGFrZW4gbGl0ZXJhbGx5CiAgICAgICAgICAoc2VlIHBwLjQwOC00MTIgb2YgWzM3OF1Vc2luZyBDLUtlcm1pdCBmb3IgYW4gZXhwbGFuYXRpb247IHlvdQogICAgICAgICAgY2FuIGFsc28gcmVhZCBpbnRvIGEgXCV4IG9yIFwmeFtdIHZhcmlhYmxlLCBidXQgdGhlbiB5b3UgbXVzdAogICAgICAgICAgcmVtZW1iZXIgdG8gcHJvdGVjdCBmdXR1cmUgcmVmZXJlbmNlcyB0byBieSBcZmNvbnRlbnRzKCkgaWYgeW91CiAgICAgICAgICBkb24ndCB3YW50IEMtS2VybWl0IHRvIHByb2Nlc3MgYW55IGJhY2tzbGFzaGVzIGl0IG1pZ2h0CiAgICAgICAgICBjb250YWluKS4gVGhlIGRlc2lyZWQgYW1vdW50IG9mIGRhdGEgKGFjY29yZGluZyB0byB0aGUKICAgICAgICAgIHN3aXRjaGVzKSBpcyByZWFkIGZyb20gdGhlIGZpbGUgYXQgdGhlIGN1cnJlbnQgcmVhZC93cml0ZQogICAgICAgICAgcG9pbnRlciwgYW5kIHVwb24gY29tcGxldGlvbiB0aGUgcmVhZC93cml0ZSBwb3NpdGlvbiBpcyB1cGRhdGVkCiAgICAgICAgICB0byBmaXJzdCBieXRlIGFmdGVyIHRoZSBkYXRhIHRoYXQgd2FzIHJlYWQsIG5vIG1hdHRlciB3aGF0CiAgICAgICAgICBzd2l0Y2hlcyB3ZXJlIGdpdmVuLiBTeW5vbnltOiBGUkVBRC4KCiAgIEZJTEUgV1JJVEUgWyBzd2l0Y2hlcyBdIGNoYW5uZWwgdGV4dAogICAgICAgICAgV3JpdGVzIHRoZSBnaXZlbiB0ZXh0IHRvIHRoZSBmaWxlIG9uIHRoZSBnaXZlbiBjaGFubmVsIG51bWJlci4KICAgICAgICAgIFRoZSB0ZXh0LCBvZiBjb3Vyc2UsIGNhbiBiZSBsaXRlcmFsIHRleHQgb3IgYSB2YXJpYWJsZSwgb3IgYW55CiAgICAgICAgICBjb21iaW5hdGlvbi4gSWYgdGhlIHRleHQgbWlnaHQgY29udGFpbiBsZWFkaW5nIG9yIHRyYWlsaW5nCiAgICAgICAgICBzcGFjZXMsIGl0IG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzIGlmIHlvdSB3YW50IHRvIHByZXNlcnZlCiAgICAgICAgICB0aGVtLiBTeW5vbnltOiBGV1JJVEUuCgogICBCZWZvcmUgcHJvY2VlZGluZywgYSBjYXV0aW9uIGFib3V0IHRoZSBOVUwgY2hhcmFjdGVyLiBDLUtlcm1pdCBpcyBzbwogICBuYW1lZCBiZWNhdXNlIGl0IGlzIGEgS2VybWl0IHByb2dyYW0gd3JpdHRlbiBpbiB0aGUgQyBsYW5ndWFnZS4gSW4gQywKICAgY2hhcmFjdGVyIHN0cmluZ3MgYXJlIHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2Ygbm9uLU5VTCBieXRlcwogICB0ZXJtaW5hdGVkIGJ5IGEgTlVMIGJ5dGUgKGEgYnl0ZSBpbiB3aGljaCBhbGwgYml0cyBhcmUgMCkuIFRodXMgYSBDCiAgIHN0cmluZyBjYW4gbm90IGNvbnRhaW4gTlVMIGJ5dGVzOyBpdCBhbHdheXMgZW5kcyB3aXRoIHRoZSBmaXJzdCBOVUwKICAgYnl0ZS4gQy1LZXJtaXQgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBhcyBDIHN0cmluZ3MgYW5kIHRoZXJlZm9yZQogICBjYW4ndCBjb250YWluIE5VTCBieXRlcyBlaXRoZXIsIHNvIHRoZSBGSUxFIFJFQUQgYW5kIEZJTEUgV1JJVEUKICAgY29tbWFuZHMgZG8gbm90IGhhbmRsZSBmaWxlcyBvciBzdHJpbmdzIHRoYXQgY29udGFpbiBOVUwgYnl0ZXMsIGV4Y2VwdAogICB3aGVuIHRoZSAvQ0hBUkFDVEVSIHN3aXRjaCBpcyBpbmNsdWRlZCB3aXRoIHRoZSBGSUxFIFJFQUQgb3IgV1JJVEUKICAgY29tbWFuZCwgb3Igd2hlbiAvTFBBRDowIG9yIC9SUEFEOjAgaXMgZ2l2ZW4gd2l0aCB0aGUgRklMRSBXUklURQogICBjb21tYW5kOyB0aGVzZSBzd2l0Y2hlcyBhcmUgZXhwbGFpbmVkIGJlbG93LgoKICAgQWxzbyBub3RlIHRoYXQgS2VybWl0IGNhbiBub3QgYmUgdXNlZCByZWFkIG9yIHdyaXRlIGJpbmFyeSBudW1iZXJzIGluCiAgIHRoZSBtYWNoaW5lJ3MgaW50ZXJuYWwgZm9ybWF0IChpbnRlZ2VyIG9yIGZsb2F0aW5nLXBvaW50KTsgaW4gZ2VuZXJhbCwKICAgbnVtYmVycyBjYW4gYmUgcHJvY2Vzc2VkIG9ubHkgd2hlbiByZXByZXNlbnRlZCBhcyBudW1lcmljIG9yCiAgIGZsb2F0aW5nLXBvaW50IHN0cmluZ3MuCgogICBGSUxFIFJFQUQgc3dpdGNoZXMgYXJlOgoKICAgL0xJTkUKICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGEgbGluZSBvZiB0ZXh0IGlzIHRvIGJlIHJlYWQuIEEgbGluZSBpcyBkZWZpbmVkCiAgICAgICAgICBhY2NvcmRpbmcgdG8gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbSdzIHRleHQtZmlsZQogICAgICAgICAgZm9ybWF0LiBGb3IgZXhhbXBsZSwgaW4gVU5JWCBhIGxpbmUgaXMgYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzCiAgICAgICAgICB1cCB0byBhbmQgaW5jbHVkaW5nIGEgbGluZWZlZWQsIG9yIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHdoaWNoCiAgICAgICAgICBldmVyIGNvbWVzIGZpcnN0LiBUaGUgbGluZSB0ZXJtaW5hdG9yIChpZiBhbnkpIGlzIHJlbW92ZWQKICAgICAgICAgIGJlZm9yZSBhc3NpZ25pbmcgdGhlIHRleHQgdG8gdGhlIHZhcmlhYmxlLiBJZiBubyBzd2l0Y2hlcyBhcmUKICAgICAgICAgIGluY2x1ZGVkIHdpdGggdGhlIEZJTEUgUkVBRCBjb21tYW5kLCAvTElORSBpcyBhc3N1bWVkLiBOb3JtYWxseQogICAgICAgICAgdGhpcyBzd2l0Y2ggc2hvdWxkIG5vdCBiZSB1c2VkIHdpdGggZmlsZXMgb3BlbmVkIGluIC9CSU5BUlkKICAgICAgICAgIG1vZGUgKGJ1dCBub3RoaW5nIHByZXZlbnRzIGl0IGVpdGhlcikuCgogICAvU0laRTpudW1iZXIKICAgICAgICAgIFNwZWNpZmllcyB0aGF0IHRoZSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgKGNoYXJhY3RlcnMpIGlzIHRvIGJlCiAgICAgICAgICByZWFkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBieXRlcyByZXR1cm5lZCB3aWxsIGJlIGxlc3MgaWYgdGhlCiAgICAgICAgICBlbmQgb2YgZmlsZSBpcyByZWFjaGVkIChvciBhIE5VTCBieXRlIGlzIGVuY291bnRlcmVkKS4gRm9yCiAgICAgICAgICBleGFtcGxlLCBpZiBhIGZpbGUgaXMgNTE0IGJ5dGVzIGxvbmcsIEZJTEUgUkVBRCAvU0laRTo1MTIKICAgICAgICAgIHJldHVybnMgNTEyIGJ5dGVzIHRoZSBmaXJzdCB0aW1lIGFuZCAyIGJ5dGVzIHRoZSBzZWNvbmQgdGltZS4KICAgICAgICAgIEZJTEUgUkVBRCAvU0laRSBwcm92aWRlcyBhIGtpbmQgb2YgInJlY29yZCBpL28iIGZvciBmaWxlcyB0aGF0CiAgICAgICAgICBkbyBub3QgbmVjZXNzYXJpbHkgY29udGFpbiBsaW5lcy4gVGhlIHJlc3VsdGluZyBibG9jayBvZgogICAgICAgICAgY2hhcmFjdGVycyBpcyBhc3NpZ25lZCB0byB0aGUgdmFyaWFibGUgd2l0aG91dCBhbnkgZWRpdGluZy4KICAgICAgICAgIFN5bm9ueW06IC9CTE9DSy4KCiAgIC9DSEFSQUNURVIKICAgICAgICAgIEVxdWl2YWxlbnQgdG8gL1NJWkU6MS4gSWYgRklMRSBSRUFEIC9DSEFSIHN1Y2NlZWRzIGJ1dCB0aGUKICAgICAgICAgIHZhcmlhYmxlIGlzIGVtcHR5LCB0aGlzIGluZGljYXRlcyBhIE5VTCBieXRlIHdhcyByZWFkLiBTeW5vbnltOgogICAgICAgICAgQllURS4KCiAgIEZJTEUgV1JJVEUgc3dpdGNoZXMgYXJlOgoKICAgL0xJTkUKICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGFuIGFwcHJvcHJpYXRlIGxpbmUgdGVybWluYXRvciBpcyB0byBiZSBhZGRlZCB0bwogICAgICAgICAgdGhlIGVuZCBvZiB0aGUgdGV4dC4gSWYgbm8gc3dpdGNoZXMgYXJlIGluY2x1ZGVkLCAvTElORSBpcwogICAgICAgICAgYXNzdW1lZC4KCiAgIC9TSVpFOm51bWJlcgogICAgICAgICAgU3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcyAoY2hhcmFjdGVycykgaXMgdG8gYmUKICAgICAgICAgIHdyaXR0ZW4uIElmIHRoZSBnaXZlbiB0ZXh0IGlzIGxvbmdlciB0aGFuIHRoZSByZXF1ZXN0ZWQgc2l6ZSwKICAgICAgICAgIGl0IGlzIHRydW5jYXRlZDsgaWYgaXMgc2hvcnRlciwgaXQgaXMgcGFkZGVkIGFjY29yZGluZyAvTFBBRAogICAgICAgICAgYW5kIC9SUEFEIHN3aXRjaGVzLiBTeW5vbnltOiAvQkxPQ0suCgogICAvTFBBRFs6dmFsdWVdCiAgICAgICAgICBJZiAvU0laRSB3YXMgZ2l2ZW4sIGJ1dCB0aGUgdGV4dCBpcyBzaG9ydGVyIHRoYW4gdGhlIHJlcXVlc3RlZAogICAgICAgICAgc2l6ZSwgdGhlIHRleHQgaXMgcGFkZGVkIG9uIHRoZSBsZWZ0IHdpdGggc3VmZmljaWVudCBjb3BpZXMgb2YKICAgICAgICAgIHRoZSBjaGFyYWN0ZXIgd2hvc2UgQVNDSUkgdmFsdWUgaXMgZ2l2ZW4gdG8gd3JpdGUgdGhlIGdpdmVuCiAgICAgICAgICBsZW5ndGguIElmIG5vIHZhbHVlIGlzIHNwZWNpZmllZCwgMzIgKHRoZSBjb2RlIGZvciBTcGFjZSkgaXMKICAgICAgICAgIHVzZWQuIFRoZSB2YWx1ZSBjYW4gYWxzbyBiZSAwIHRvIHdyaXRlIHRoZSBpbmRpY2F0ZWQgbnVtYmVyIG9mCiAgICAgICAgICBOVUwgYnl0ZXMuIElmIC9TSVpFIHdhcyBub3QgZ2l2ZW4sIHRoaXMgc3dpdGNoIGlzIGlnbm9yZWQuCgogICAvUlBBRFs6dmFsdWVdCiAgICAgICAgICBMaWtlIExQQUQsIGJ1dCBwYWRzIG9uIHRoZSByaWdodC4KCiAgIC9DSEFSQUNURVIKICAgICAgICAgIFNwZWNpZmllcyB0aGF0IG9uZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIHdyaXR0ZW4uIElmIHRoZSB0ZXh0IGlzCiAgICAgICAgICBlbXB0eSBvciBub3QgZ2l2ZW4sIGEgTlVMIGNoYXJhY3RlciBpcyB3cml0dGVuOyBvdGhlcndpc2UgdGhlCiAgICAgICAgICBmaXJzdCBjaGFyYWN0ZXIgb2YgdGV4dCBpcyBnaXZlbi4gU3lub255bTogL0JZVEUuCgogICAvU1RSSU5HCiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGUgdGV4dCBpcyB0byBiZSB3cml0dGVuIGFzLWlzLCB3aXRoIG5vCiAgICAgICAgICB0ZXJtaW5hdG9yIGFkZGVkLgoKICAgSGVyZSdzIGFuIGV4YW1wbGUgaW4gd2hpY2ggd2UgY29weSBhIHRleHQgZmlsZSBsaW5lIGJ5IGxpbmU6CgogIGZpbGUgb3BlbiAvcmVhZCBcJWMgb29mYS50eHQgICAgICAgICAgICA7IE9wZW4gaW5wdXQgZmlsZQogIGlmIGZhaWwgZXhpdCAxIENhbid0IG9wZW4gaW5wdXQgZmlsZSAgICA7IENoZWNrIHRoYXQgaXQncyBvcGVuCiAgZmlsZSBvcGVuIC93cml0ZSBcJWQgbmV3LnR4dCAgICAgICAgICAgIDsgT3BlbiBvdXRwdXQgZmlsZQogIGlmIGZhaWwgZXhpdCAxIENhbid0IG9wZW4gb3V0cHV0IGZpbGUgICA7IENoZWNrCiAgd2hpbGUgdHJ1ZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9vcCB0byBjb3B5IGxpbmVzCiAgICAgIGZpbGUgcmVhZCAvbGluZSBcJWMgbGluZSAgICAgICAgICAgIDsgUmVhZCBhIGxpbmUKICAgICAgaWYgZmFpbCBicmVhayAgICAgICAgICAgICAgICAgICAgICAgOyBBc3N1bWUgZmFpbHVyZSA9IGVuZCBvZiBmaWxlCiAgICAgIGZpbGUgd3JpdGUgL2xpbmUgXCVkIHtcbShsaW5lKX0gICAgIDsgV3JpdGUgdGhlIGxpbmUgdG8gb3V0cHV0IGZpbGUKICAgICAgaWYgZmFpbCBleGl0IDEgV3JpdGUgZmFpbHVyZSAgICAgICAgOyBGYWlsdXJlIGhlcmUgaXMgZmF0YWwKICB9CiAgZmlsZSBjbG9zZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xvc2UgdGhlIHR3byBmaWxlcwogIGZpbGUgY2xvc2UgXCVkCgogICBOb3RlIHRoYXQgc2luY2UgL0xJTkUgaXMgdGhlIGRlZmF1bHQgZm9yIGJvdGggRklMRSBSRUFEIGFuZCBGSUxFCiAgIFdSSVRFLCBpdCBjYW4gYmUgb21pdHRlZCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdoZXJlIHdlIGFsc28KICAgdXNlIHRoZSBzaG9ydCBuYW1lcyBmb3IgdGhlIEZJTEUgY29tbWFuZHMuCgogIGZvcGVuIC9yZWFkIFwlYyBvb2ZhLnR4dCAgICAgICAgICAgICAgICA7IE9wZW4gaW5wdXQgZmlsZQogIGlmIGZhaWwgZXhpdCAxIENhbid0IG9wZW4gaW5wdXQgZmlsZSAgICA7IENoZWNrIHRoYXQgaXQncyBvcGVuCiAgZm9wZW4gL3dyaXRlIFwlZCBuZXcudHh0ICAgICAgICAgICAgICAgIDsgT3BlbiBvdXRwdXQgZmlsZQogIGlmIGZhaWwgZXhpdCAxIENhbid0IG9wZW4gb3V0cHV0IGZpbGUgICA7IENoZWNrCiAgd2hpbGUgdHJ1ZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9vcCB0byBjb3B5IGxpbmVzCiAgICAgIGZyZWFkIFwlYyBsaW5lICAgICAgICAgICAgICAgICAgICAgIDsgUmVhZCBhIGxpbmUKICAgICAgaWYgZmFpbCBicmVhayAgICAgICAgICAgICAgICAgICAgICAgOyBBc3N1bWUgZmFpbHVyZSA9IGVuZCBvZiBmaWxlCiAgICAgIGZ3cml0ZSBcJWQge1xtKGxpbmUpfSAgICAgICAgICAgICAgIDsgV3JpdGUgdGhlIGxpbmUgdG8gb3V0cHV0IGZpbGUKICAgICAgaWYgZmFpbCBleGl0IDEgV3JpdGUgZmFpbHVyZSAgICAgICAgOyBGYWlsdXJlIGhlcmUgaXMgZmF0YWwKICB9CiAgZmNsb3NlIFwlYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xvc2UgdGhlIHR3byBmaWxlcwogIGZjbG9zZSBcJWQKCiAgIEhlcmUncyB0aGUgc2FtZSBleGFtcGxlIHVzaW5nICJyZWNvcmQgaS9vIiAodGhlIG9wZW4gYW5kIGNsb3NlCiAgIHNlcXVlbmNlcyBhcmUgYXJlIG9taXR0ZWQgc2luY2UgdGhleSBhcmUgdGhlIHNhbWUgYXMgYWJvdmUpLiBUaGUKICAgcmVzdWx0IGlzIHRoZSBzYW1lLCBidXQgZXhlY3V0aW9uIGlzIG11Y2ggZmFzdGVyOgoKICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb29wIHRvIGNvcHkgYmxvY2tzCiAgICAgIGZyZWFkIC9zaXplOjUxMiBcJWMgYmxvY2sgICAgICAgICAgIDsgUmVhZCBhIGJsb2NrIGludG8gXCVhCiAgICAgIGlmIGZhaWwgYnJlYWsgICAgICAgICAgICAgICAgICAgICAgIDsgQXNzdW1lIGZhaWx1cmUgPSBlbmQgb2YgZmlsZQogICAgICBmd3JpdGUgL3N0cmluZyBcJWQge1xtKGJsb2NrKX0gICAgICA7IFdyaXRlIHRoZSBibG9jayB0byBvdXRwdXQgZmlsZQogICAgICBpZiBmYWlsIGV4aXQgMSBXcml0ZSBmYWlsdXJlICAgICAgICA7IEZhaWx1cmUgaGVyZSBpcyBmYXRhbAogIH0KCiAgIEFsdGhvdWdoIHJlY29yZCBpL28gaXMgZmFzdGVyLCBpdCBzaG91bGQgbm90IGJlIHVzZWQgaW4gbGluZS1vcmllbnRlZAogICBhcHBsaWNhdGlvbnMsIHNpbmNlIGl0IHJldHVybnMgYXJiaXRyYXJ5IGNodW5rcyBvZiB0aGUgZmlsZSB0byB5b3VyCiAgIHNjcmlwdCwgcmF0aGVyIHRoYW4gbGluZXMuIEluIHRoaXMgZXhhbXBsZSwgRldSSVRFIC9TVFJJTkcgaXMgdXNlZAogICByYXRoZXIgdGhhbiBGV1JJVEUgL1NJWkU6NTEyIHRvIGF2b2lkIHRoZSBsYXN0IG91dHB1dCBibG9jayBiZWluZwogICBwYWRkZWQgYmV5b25kIHRoZSBvcmlnaW5hbCBmaWxlJ3MgbGVuZ3RoLgoKICAgQSBmaWxlIGNhbiBhbHNvIGJlIGNvcGllZCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLCBidXQgdGhpcyBpcyBtdWNoCiAgIHNsb3dlciB0aGFuIGxpbmUgaS9vIGFuZCBWRVJZIG11Y2ggc2xvd2VyIHRoYW4gYmxvY2sgaS9vOgoKICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb29wIHRvIGNvcHkgYmxvY2tzCiAgICAgIGZyZWFkIC9jaGFyIFwlYyBjICAgICAgICAgICAgICAgICAgIDsgUmVhZCBhIGNoYXJhY3RlciBpbnRvIGMKICAgICAgaWYgZmFpbCBicmVhayAgICAgICAgICAgICAgICAgICAgICAgOyBBc3N1bWUgZmFpbHVyZSA9IGVuZCBvZiBmaWxlCiAgICAgIGZ3cml0ZSAvY2hhciBcJWQge1xtKGMpfSAgICAgICAgICAgIDsgV3JpdGUgY2hhcmFjdGVyIHRvIG91dHB1dCBmaWxlCiAgICAgIGlmIGZhaWwgZXhpdCAxIFdyaXRlIGZhaWx1cmUgICAgICAgIDsgRmFpbHVyZSBpcyBmYXRhbAogIH0KCiAgIEFsdGhvdWdoIGNoYXJhY3RlciBpL28gaXMgc2xvdywgaXQgaXMgdGhlIG9ubHkgd2F5IHRvIHByb2Nlc3MgZmlsZXMKICAgdGhhdCBjb250YWluIE5VTCBjaGFyYWN0ZXJzIChpLmUuIGJ5dGVzIGNvbXBvc2VkIG9mIG9ubHkgemVybyBiaXRzKS4KICAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHdoZW4gImZyZWFkIC9jaGFyIFwlYyBjIiByZXR1cm5zIGEgTlVMLCB0aGUgYwogICB2YXJpYWJsZSBpcyBlbXB0eS4gQnV0IHNpbmNlIHRoZSBGUkVBRCAvQ0hBUiBjb21tYW5kIGRpZCBub3QgZmFpbCwgd2UKICAga25vdyB0aGUgcmVzdWx0IHdhcyByZWFsbHkgYSBOVUwuIEZXUklURSAvQ0hBUiwgd2hlbiBnaXZlbiBhbiBlbXB0eQogICB2YXJpYWJsZSAob3Igbm8gdmFyaWFibGUgYXQgYWxsKSB3cml0ZXMgYSBOVUwuIFRodXMgdGhlIGxvb3AgYWJvdmUKICAgd2lsbCBjb3B5IGFueSBmaWxlIGF0IGFsbCAodmVyeSBzbG93bHkpLiBJbiBub24tY29weWluZyBhcHBsaWNhdGlvbnMsCiAgIE5VTHMgYXJlIGRldGVjdGVkIGxpa2UgdGhpczoKCiAgZnJlYWQgL2NoYXIgXCVjIGMKICBpZiBmYWlsIChkbyBzb21ldGhpbmcpCiAgaWYgbm90IGRlZiBjIChhIE5VTCBieXRlIHdhcyByZWFkKQoKICAgRmluYWxseSBzb21lIGFkdmFuY2VkIGZpbGUgb3BlcmF0aW9uczoKCiAgIEZJTEUgRkxVU0ggY2hhbm5lbAogICAgICAgICAgRm9yIG91dHB1dCBmaWxlcyBvbmx5OiBjb21taXRzIGFsbCBwcmV2aW91cyB3cml0ZXMgdG8gZGlzaywgaW4KICAgICAgICAgIGNhc2UgdGhlIGNvbXB1dGVyIHdhcyBidWZmZXJpbmcgdGhlbS4gU3lub255bTogRkZMVVNILgoKICAgRklMRSBDT1VOVCBbIHsgL0JZVEVTLCAvTElORVMsIC9MSVNULCAvTk9MSVNUIH0gXSBjaGFubmVsCiAgICAgICAgICBCeSBkZWZhdWx0LCBvciBpZiB0aGUgL0JZVEVTIHN3aXRjaCBpcyBnaXZlbiwgY291bnRzIHRoZSBieXRlcwogICAgICAgICAgaW4gdGhlIGZpbGUsIGlmIGFueSwgb3BlbiBvbiB0aGUgZ2l2ZW4gY2hhbm5lbC4gSWYgdGhlIC9MSU5FUwogICAgICAgICAgc3dpdGNoIGlzIGdpdmVuLCBjb3VudHMgbGluZXMgaW4gdGhlIGZpbGUuIElmIHRoZSAvTElTVCBzd2l0Y2gKICAgICAgICAgIGlzIGdpdmVuLCB0aGUgcmVzdWx0IGlzIHByaW50ZWQuIElmIHRoZSAvTk9MSVNUIHN3aXRjaCBpcwogICAgICAgICAgZ2l2ZW4sIHRoZSByZXN1bHQgaXMgbm90IHByaW50ZWQuIC9RVUlFVCBpcyBhIHN5bm9ueW0gZm9yCiAgICAgICAgICAvTk9MSVNULiBJZiBuZWl0aGVyIC9MSVNUIG5vciAvTk9MSVNUIGlzIGdpdmVuLCB0aGUgcmVzdWx0IGlzCiAgICAgICAgICBwcmludGVkIGlmIHRoZSBjb21tYW5kIGlzIGdpdmVuIGF0IHRvcCBsZXZlbCwgaS5lLiBub3QgZnJvbSBhCiAgICAgICAgICBjb21tYW5kIGZpbGUgb3IgbWFjcm8uIEluIGFsbCBjYXNlcywgdGhlIHJlc3VsdCBvZiB0aGUgbW9zdAogICAgICAgICAgcmVjZW50IEZJTEUgQ09VTlQgY29tbWFuZCBpcyBzdG9yZWQgaW4gdGhlIHZhcmlhYmxlCiAgICAgICAgICBcdihmX2NvdW50KS4gTm90ZSB0aGF0IEZJTEUgQ09VTlQgL0xJTkUgd29ya3MgKGFuZCBjYW4gb25seQogICAgICAgICAgd29yaykgYnkgcmVhZGluZyB0aGUgZW50aXJlIGZpbGU7IGV4cGVjdCBpdCB0byB0YWtlIHNvbWUgdGltZQogICAgICAgICAgaWYgdGhlIGZpbGUgaXMgbGFyZ2UuIFN5bm9ueW06IEZDT1VOVC4KCiAgIEZJTEUgUkVXSU5EIGNoYW5uZWwKICAgICAgICAgIE1vdmVzIHRoZSByZWFkL3dyaXRlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS4KICAgICAgICAgIEVxdWl2YWxlbnQgdG8gRklMRSBTRUVLIGNoYW5uZWwgMC4gU3lub255bTogRlJFV0lORC4KCiAgIEZJTEUgU0VFSyBbIHN3aXRjaGVzIF0gY2hhbm5lbCB7IFt7KywtfV1udW1iZXIsIExBU1QsIEVPRiB9CiAgICAgICAgICBNb3ZlcyB0aGUgcmVhZC93cml0ZSBwb2ludGVyIGZvciB0aGUgZmlsZSBvbiB0aGlzIGNoYW5uZWwgdG8KICAgICAgICAgIHRoZSBnaXZlbiBwb3NpdGlvbiwgd2hpY2ggbWF5IGJlIGEgYnl0ZSAoY2hhcmFjdGVyKSBudW1iZXIgb3IgYQogICAgICAgICAgbGluZSBudW1iZXIsIGV4cHJlc3NlZCBpbiBlaXRoZXIgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdGVybXMuCiAgICAgICAgICBTd2l0Y2hlczoKCiAgICAgICAgL0JZVEUKICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgZ2l2ZW4gaXMgYSBieXRlIG51bWJlci4gU3lub255bTogL0NIQVJBQ1RFUi4KCiAgICAgICAgL0xJTkUKICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgZ2l2ZW4gaXMgYSBsaW5lIG51bWJlci4KCiAgICAgICAgL0FCU09MVVRFCiAgICAgICAgICAgICAgICBUaGUgbnVtYmVyIGdpdmVuIGlzIGFic29sdXRlLgoKICAgICAgICAvUkVMQVRJVkUKICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgZ2l2ZW4gaXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uCgogICAgICAgICAgQnkgZGVmYXVsdCwgb3IgaWYgdGhlIC9CWVRFIHN3aXRjaCBpcyBnaXZlbiwgdGhlIG51bWJlciBpcyBhCiAgICAgICAgICBieXRlIG51bWJlciAoMCA9IGZpcnN0IGJ5dGUpLiBJZiAvTElORSBpcyBnaXZlbiwgdGhlIG51bWJlciBpcwogICAgICAgICAgYSBsaW5lIG51bWJlciAoMCA9IGZpcnN0IGxpbmUpLiBFT0YgbWVhbnMgdG8gbW92ZSB0byB0aGUgZW5kIG9mCiAgICAgICAgICB0aGUgZmlsZS4gTEFTVCBtZWFucyB0byBtb3ZlIHRvIHRoZSBsYXN0IGxpbmUgb3IgY2hhcmFjdGVyIG9mCiAgICAgICAgICB0aGUgZmlsZSwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQncyBhIGxpbmUgb3IgY2hhcmFjdGVyIHNlZWsuCgogICAgICAgICAgSWYgbmVpdGhlciB0aGUgL1JFTEFUSVZFIG5vciB0aGUgL0FCU09MVVRFIHN3aXRjaCBpcyBnaXZlbiwKICAgICAgICAgIHRoZW4gaWYgYSBzaWduZWQgbnVtYmVyIGlzIGdpdmVuLCB0aGUgbW90aW9uIGlzIHJlbGF0aXZlIHRvIHRoZQogICAgICAgICAgY3VycmVudCBwb3NpdGlvbi4gQW4gZXhwcmVzc2lvbiB0aGF0IGV2YWx1YXRlcyB0byBhIG5lZ2F0aXZlCiAgICAgICAgICBudW1iZXIgaXMgbm90IGNvbnNpZGVyZWQgc2lnbmVkIGZvciB0aGlzIHB1cnBvc2U7IHRoYXQgaXMsIGEKICAgICAgICAgIHNpZ24gKCsgb3IgLSkgbXVzdCBiZSBpbmNsdWRlZCBhcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQogICAgICAgICAgbnVtYmVyIGluIHRoZSBjb21tYW5kIGl0c2VsZiB0byBmb3JjZSBhIHJlbGF0aXZlIHNlZWsgKGluIHRoZQogICAgICAgICAgYWJzZW5jZSBvZiAvUkVMQVRJVkUgb3IgL0FCU09MVVRFKS4KCiAgICAgICAgICBJZiB0aGUgbnVtYmVyIGhhcyBubyBzaWduLCBvciBpZiB0aGUgL0FCU09MVVRFIHN3aXRjaCBpcyBnaXZlbiwKICAgICAgICAgIHRoZSBudW1iZXIgcmVwcmVzZW50cyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gdGhlCiAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGZpbGUpLiBTdWJzZXF1ZW50IEZJTEUgUkVBRHMgb3IgV1JJVEVzIHdpbGwKICAgICAgICAgIHRha2UgcGxhY2UgYXQgdGhlIG5ldyBwb3NpdGlvbi4KCiAgICAgICAgICBJZiB0aGUgcmVhZC93cml0ZSBwb2ludGVyIGlzIHBsYWNlZCBhZnRlciB0aGUgZW5kIG9mIHRoZSBmaWxlLAogICAgICAgICAgYSBzdWJzZXF1ZW50IEZJTEUgUkVBRCB3aWxsIGZhaWwsIGJ1dCBhIEZJTEUgV1JJVEUgd2lsbCBzdWNjZWVkCiAgICAgICAgICAocG9zc2libHkgY3JlYXRpbmcgYSBmaWxlIHdpdGggImhvbGVzIikuIElmIGEgRklMRSBTRUVLIC9CWVRFCiAgICAgICAgICBjb21tYW5kIGlzIGdpdmVuLCB0aGUgY3VycmVudCBsaW5lIGJlY29tZXMgdW5rbm93biAodW5sZXNzIHRoZQogICAgICAgICAgcG9zaXRpb24gaXMgMCkgYW5kIHN1YnNlcXVlbnQgRklMRSBTRUVLIC9SRUxBVElWRSAvTElORQogICAgICAgICAgY29tbWFuZHMgd2lsbCBmYWlsIHVudGlsIHRoZSBuZXh0IG5vbi1yZWxhdGl2ZSBGSUxFIFNFRUsgL0xJTkUKICAgICAgICAgIGNvbW1hbmQgaXMgZ2l2ZW4uIFN5bm9ueW06IEZTRUVLLgoKICAgQW4gYWJzb2x1dGUgRklMRSBTRUVLIHRvIGEgbmVnYXRpdmUgcG9zaXRpb24gZmFpbHMgc2lsZW50bHksIGFzIGRvZXMgYQogICByZWxhdGl2ZSBzZWVrIHRvIGEgcG9zaXRpb24gYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCgogICBBIGNhdXRpb24gYWJvdXQgcmVsYXRpdmUgU0VFS3M6IHJlbWVtYmVyIHRoYXQgdGhlIG51bWJlciBpcyByZWxhdGl2ZQogICB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4gV2hlbmV2ZXIgeW91IHJlYWQgb3Igd3JpdGUsIHRoaXMgY2hhbmdlcyB0aGUKICAgcG9zaXRpb24uIEluIGVhY2ggb2YgdGhlIGZvbGxvd2luZyBleGFtcGxlcywgYXNzdW1lIHRoZSBmaWxlIG9wZW4gb24KICAgY2hhbm5lbCBcJWMgaXMgcG9zaXRpb25lZCBhdCBsaW5lIG4gKHRoZSBGUkVBRCB0YXJnZXQgdmFyaWFibGUgaXMKICAgb21pdHRlZCBmb3IgbGFjayBvZiBzcGFjZSk6CgogIHsgRlJFQUQgXCVjLCBGU0VFSyAvTElORSBcJWMgLTEsIEZSRUFEIFwlYyB9ICA8LS0gUmVhZHMgbGluZSBuIHR3aWNlCiAgeyBGUkVBRCBcJWMsIEZTRUVLIC9MSU5FIFwlYyArMCwgRlJFQUQgXCVjIH0gIDwtLSBSZWFkcyBsaW5lcyBuIGFuZCBuKzEKICB7IEZSRUFEIFwlYywgRlNFRUsgL0xJTkUgXCVjICsxLCBGUkVBRCBcJWMgfSAgPC0tIFJlYWRzIGxpbmVzIG4gYW5kIG4rMgogIHsgRlJFQUQgXCVjLCBGU0VFSyAvTElORSBcJWMgLTIsIEZSRUFEIFwlYyB9ICA8LS0gUmVhZHMgbGluZXMgbiBhbmQgbi0xCiAgeyBGUkVBRCBcJWMsIEZTRUVLIC9MSU5FIFwlYyAtMywgRlJFQUQgXCVjIH0gIDwtLSBSZWFkcyBsaW5lcyBuIGFuZCBuLTIKCiAgIEFub3RoZXIgY2F1dGlvbjogVXNpbmcgRlNFRUsgYW5kIEZSRUFEIC9TSVpFIHRvIHJlcGVhdGVkbHkgcmVhZCB0aGUKICAgc2FtZSBkaXNrIGJsb2NrIChlLmcuIHdoZW4gc2FtcGxpbmcgYSBkYXRhYmFzZSByZWNvcmQgdGhhdCBpcwogICBmcmVxdWVudGx5IHVwZGF0ZWQpIG1pZ2h0IG5vdCBnaXZlIHlvdSB1cGRhdGVkIGRpc2sgYmxvY2tzIGR1ZSB0byB0aGUKICAgaW50ZXJuYWwgYnVmZmVyaW5nIGFuZCBjYWNoaW5nIG9mIHRoZSBDIGxpYnJhcnkgKHRoaXMgcHJvYmFibHkgdmFyaWVzCiAgIGZyb20gb25lIHBsYXRmb3JtL2NvbXBpbGVyIGNvbWJpbmF0aW9uIHRvIGFub3RoZXIpLiBJZiBuZWNlc3NhcnkgeW91CiAgIGNhbiBmb3JjZSBhIGZyZXNoIGRpc2sgcmVhZCB3aXRoIGEgY2xvc2Uvb3BlbiBzZXF1ZW5jZToKCiAgRkNMT1MgXCVjCiAgRk9QRU4gXCVjIHNhbWVmaWxlbmFtZQogIEZTRUVLIFwlYyBzYW1lc3BvdAogIEZSRUFEIC9TSVpFOmhvd21hbnlieXRlcyBcJWMgdmFyaWFibGUKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDEuMjIuMy4gRklMRSBDb21tYW5kIEV4YW1wbGVzCgogICBUbyByZWFkIHRoZSBsYXN0IDEwIGxpbmVzIG9mIGEgdGV4dCBmaWxlIGludG8gYW4gYXJyYXk6CgogIGZvcGVuIC9yZWFkIFwlYyBvb2ZhLnR4dCAgICAgICAgICAgICAgICA7IE9wZW4gdGhlIGZpbGUKICBpZiBmYWlsIGV4aXQgMSBDYW4ndCBvcGVuIG9vZmEudHh0ICAgICAgOyBBbHdheXMgY2hlY2sgZm9yIGZhaWx1cmUKICBkY2wgXCZhWzEwXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBEZWNsYXJlIGEgMTAtZWxlbWVudCBhcnJheQogIGZjb3VudCAvbGluZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICA7IENvdW50IGxpbmVzIGluIHRoZSBmaWxlCiAgZnNlZWsgL2xpbmUgXCVjIFx2KGZfY291bnQpLTEwICAgICAgICAgIDsgU2VlayB0byAxMCBsaW5lcyBmcm9tIHRoZSBlbmQKICBpZiBmYWlsIGV4aXQgMSBDYW4ndCBzZWVrICAgICAgICAgICAgICAgOyBDaGVjayBmb3IgZmFpbHVyZQogIGZvciBcJWkgMSAxMCAxIHsgZnJlYWQgXCVjIFwmYVtcJWldIH0gICA7IFJlYWQgdGhlIGxhc3QgMTAgbGluZXMKICBmY2xvc2UgXCVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbG9zZSB0aGUgZmlsZQoKICAgTm90ZSB0aGF0IGJsYW5rIGxpbmVzIHNob3cgdXAgYXMgZW1wdHkgKHVuZGVmaW5lZCkgYXJyYXkgZWxlbWVudHMsIGZvcgogICBleGFtcGxlIGlmIHlvdSBnaXZlIGEgInNob3cgYXJyYXkgYSIgY29tbWFuZCBhdCB0aGlzIHBvaW50LiBUaGlzIGlzCiAgIG5vcm1hbC4gWW91IGNhbiBzdGlsbCB1c2UgdGhlc2UgZWxlbWVudHM7IGUuZy46CgogIGZvciBcJWkgMSAxMCAxIHsgZWNobyBcJWkuIFwmYVtcJWldIH0gICA7IERpc3BsYXkgdGhlIDEwIGxpbmVzCgogICBIZXJlIGlzIGhvdyB0byByZWFkIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIChhbHJlYWR5IG9wZW4gb24gY2hhbm5lbAogICBcJWMpOgoKICBmc2VlayAvbGluZSBcJWMgbGFzdCAgICAgICAgICAgICAgICAgICAgOyBTZWVrIGRpcmVjdGx5IHRvIGxhc3QgbGluZQoKICAgQWx0ZXJuYXRpdmVseToKCiAgZnNlZWsgL2xpbmUgXCVjIGVvZiAgICAgICAgICAgICAgICAgICAgIDsgU2VlayB0byBlbmQgb2YgZmlsZQogIGZzZWVrIC9saW5lIFwlYyAtMSAgICAgICAgICAgICAgICAgICAgICA7IFNlZWsgdG8gYmVnaW5uaW5nIG9mIGxhc3QgbGluZQoKICAgQWx0ZXJuYXRpdmVseToKCiAgZmNvdW50IC9saW5lIFwlYyAgICAgICAgICAgICAgICAgICAgICAgIDsgQ291bnQgdGhlIGZpbGUncyBsaW5lcwogIGZzZWVrIC9saW5lIFwlYyBcdihmX2NvdW50KS0xICAgICAgICAgICA7IFNlZWsgdG8gbGFzdCBsaW5lCiAgZnJlYWQgXCVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmVhZCBpdAoKICAgVG8gcmVhZCBldmVyeSBvdGhlciBsaW5lIGZyb20gdGhlIGZpbGUgKHVzaW5nIHJlbGF0aXZlIFNFRUspLCBza2lwcGluZwogICB0aGUgZmlyc3QgbGluZToKCiAgZm9wZW4gL3JlYWQgXCVjIG9vZmEudHh0ICAgICAgICAgICAgICAgIDsgT3BlbiB0aGUgZmlsZQogIHdoaWxlICggc3VjY2VzcyApIHsgICAgICAgICAgICAgICAgICAgICA7IExvb3AgdGhyb3VnaCBsaW5lcwogICAgICBmc2VlayAvbGluZSBcJWMgKzEgICAgICAgICAgICAgICAgICA7IFNraXAgYSBsaW5lCiAgICAgIGlmIHN1Y2Nlc3MgZnJlYWQgXCVjICAgICAgICAgICAgICAgIDsgUmVhZCAmIGRpc3BsYXkgYSBsaW5lCiAgfQogIGZjbG9zZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsb3NlIHRoZSBmaWxlCgogICBIZXJlIGlzIGhvdyB0byByZWFkIHRoZSBsaW5lcyBvZiBhIGZpbGUgaW4gcmV2ZXJzZSBvcmRlcjoKCiAgZm9wZW4gL3JlYWQgXCVjIG9vZmEudHh0ICAgICAgICAgICAgICAgIDsgT3BlbgogIGlmIGZhaWwgZXhpdCAxICAgICAgICAgICAgICAgICAgICAgICAgICA7IENoZWNrCiAgZnNlZWsgL2xpbmUgXCVjIGxhc3QgICAgICAgICAgICAgICAgICAgIDsgU2VlayB0byBsYXN0IGxpbmUKICB3aGlsZSBzdWNjZXNzIHsgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb29wCiAgICAgIGZyZWFkIFwlYyAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgUmVhZCBsaW5lCiAgICAgIGZzZWVrIC9saW5lIFwlYyAtMiAgICAgICAgICAgICAgICAgIDsgU2VlayBiYWNrd2FyZHMgdHdvIGxpbmVzCiAgfQogIGZjbG9zZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsb3NlIHRoZSBmaWxlCgogICBUaGUgbG9vcCB3b3JrcyBiZWNhdXNlIGEgcmVsYXRpdmUgU0VFSyBvdXRzaWRlIHRoZSBmaWxlIGZhaWxzLgoKICAgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB1c2UgYmxvY2sgaS9vIHRvIG1hbmFnZSByYW5kb20tYWNjZXNzIGZpbGVzCiAgIHdpdGggZml4ZWQtbGVuZ3RoIHJlY29yZHMgKGFzIGxvbmcgYXMgdGhleSBkb24ndCBjb250YWluIE5VTAogICBjaGFyYWN0ZXJzKS4gU3VwcG9zZSwgZm9yIGV4YW1wbGUsIHlvdSBoYXZlIGEgZmlsZSBvZiAiY2FyZCBpbWFnZSIKICAgcmVjb3JkcyB3aXRoIGZpeGVkLWZpZWxkIGluZm9ybWF0aW9uIGFib3V0IGN1c3RvbWVycywgc3VjaCBhczoKCiAgTmFtZTogICAgIENvbHVtbnMgIDEtMzIgIChjb2x1bW4gbnVtYmVycyBhcmUgMS1iYXNlZCkKICBBZGRyZXNzOiAgQ29sdW1ucyAzMy03MgogIEJhbGFuY2U6ICBDb2x1bW5zIDczLTgwCgogICBUaGUgcmVjb3JkcyBhcmUgaW5kZXhlZCBieSBjdXN0b21lciBudW1iZXIsIHN0YXJ0aW5nIHdpdGggMC4gVGhlcmUgYXJlCiAgIG5vIGxpbmUgdGVybWluYXRvcnMgc2VwYXJhdGluZyB0aGVtLiBUaGVyZWZvcmUgdGhlIHJlY29yZCBmb3IgY3VzdG9tZXIKICAgbnVtYmVyIG4gc3RhcnRzIGF0IHBvc2l0aW9uIG54IDgwIChcJW4qODApLgoKICAgTm93IHN1cHBvc2Ugd2UgcmVjZWl2ZWQgYSBwYXltZW50IGZyb20gY3VzdG9tZXIgbnVtYmVyIDE3MyBhbmQgd2FudCB0bwogICB1cGRhdGUgdGhlIGJhbGFuY2U6CgogIC5cJW4gPSAxNzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDdXN0b21lciAocmVjb3JkKSBudW1iZXIKICAuXCVhID0gMTIuNzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQW1vdW50CiAgZm9wZW4gL3JlYWQgL3dyaXRlIFwlYyBjdXN0b21lci5kYiAgICAgICA7IE9wZW4gdGhlIGZpbGUKICBpZiBmYWlsIHN0b3AgMSBPUEVOIEZBSUxFRDogXGZfZXJybXNnKCkgIDsgQ2hlY2sKICBmc2VlayAvYnl0ZSBcJWMgODAqXCVuICAgICAgICAgICAgICAgICAgIDsgU2VlayB0byByZWNvcmQKICBmcmVhZCAvc2l6ZTo4MCBcJWMgciAgICAgICAgICAgICAgICAgICAgIDsgUmVhZCB0aGUgcmVjb3JkCiAgaWYgZmFpbCBzdG9wIDEgUkVBRCBGQUlMRUQ6IFxmX2Vycm1zZygpICA7IENoZWNrIChJTVBPUlRBTlQpCiAgLlwlYiA6PSBcZnJpZ2h0KFxtKHIpLDgpICAgICAgICAgICAgICAgICA7IEV4dHJhY3QgdGhlIGJhbGFuY2UKICAuXCViIDo9IFxmZnBhZGQoXCViLFwlYSwyKSAgICAgICAgICAgICAgIDsgQWRkIHRoZSBuZXcgcGF5bWVudAogIGlmIGZhaWwgc3RvcCAxIEFSSVRITUVUSUMgRVJST1I6IFwlYi9cJWEgOyBDYXRjaCBiYWQgcmVjb3JkcwogIC5yIDo9IHtcZmxlZnQoXG0ociksNzIpXGZscGFkKFwlYiw4KX0gICAgOyBVcGRhdGUgdGhlIHJlY29yZAogIGZzZWVrIC9ieXRlIFwlYyA4MCpcJW4gICAgICAgICAgICAgICAgICAgOyBSZXBvc2l0aW9uIHRvIHNhbWUgc3BvdAogIGZ3cml0ZSAvc2l6ZTo4MCBcJWMge1xtKHIpfSAgICAgICAgICAgICAgOyBSZXBsYWNlIHRoZSByZWNvcmQKICBpZiBmYWlsIHN0b3AgMSBXUklURSBGQUlMRUQ6IFxmX2Vycm1zZygpIDsgQ2hlY2sKICBmY2xvc2UgXCVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgQ2xvc2UgdGhlIGZpbGUKCiAgIFJFTUVNQkVSOiBVc2luZyBGSUxFIFNFRUsgdG8gbW92ZSBiZXlvbmQgdGhlIGVuZCBvZiBmaWxlIGNhbiByZXN1bHQgaW4KICAgYSBmaWxlIHdpdGggaG9sZXMgd2hlbiB3cml0aW5nOyB3aGVuIHJlYWRpbmcsIGFuIGVuZC1vZi1maWxlIGVycm9yCiAgIHdpbGwgb2NjdXIgLS0gYmUgc3VyZSB0byBjaGVjayBmb3IgaXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAxLjIyLjQuIENoYW5uZWwgTnVtYmVycwoKICAgQy1LZXJtaXQncyBjaGFubmVsIG51bWJlcnMgYXJlIGludGVnZXJzIGZyb20gMCB0byBzb21lCiAgIHBsYXRmb3JtLWRlcGVuZGVudCBsaW1pdCwgc3VjaCBhcyA0NiBvciAxOTg1ICh0aGUgdmFsdWUgb2YgXHYoZl9tYXgpKS4KICAgVGhpcyBpcyB0aGUgbGltaXQgcGxhY2VkIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIG9uIHRoZSBudW1iZXIgb2YKICAgZmlsZXMgdGhhdCBtYXkgYmUgb3BlbmVkIGJ5IG9uZSBwcm9jZXNzIG9yIHVzZXIgb3Igam9iLCBtaW51cyB0aGUKICAgc3RhbmRhcmQgaW5wdXQsIG91dHB1dCwgYW5kIGVycm9yIGZpbGVzLCBhbmQgbWludXMgdGhlIG51bWJlciBvZiBmaWxlcwogICByZXNlcnZlZCBieSBDLUtlcm1pdCBmb3IgbG9ncywgT1BFTiBSRUFEIGFuZCBXUklURSwgYW5kIGZpbGUgdHJhbnNmZXIKICAgKGFuZCBtYXliZSBzb21lIGNvbW1hbmQgZmlsZXMgLS0gdGhlIFx2KGZfbWF4KSBudW1iZXIgY2FuJ3QgYmUgZXhhY3QpLgoKICAgQWx0aG91Z2ggeW91IG11c3QgaW5jbHVkZSBhIHZhcmlhYmxlIGluIHRoZSBGSUxFIE9QRU4gY29tbWFuZCwgdG8KICAgd2hpY2ggdGhlIGNoYW5uZWwgbnVtYmVyIGlzIGFzc2lnbmVkLCB5b3UgZG9uJ3QgaGF2ZSB0byB1c2UgYSB2YXJpYWJsZQogICBpbiB0aGUgb3RoZXIgRklMRSBjb21tYW5kcyBpZiB5b3Uga25vdyB3aGF0IHRoZSBudW1iZXIgaXMgLS0geW91IGNhbgogICBqdXN0IHB1dCB0aGUgbnVtYmVyLiBUaGlzIHNhdmVzIHlvdSBhIGZldyBrZXlzdHJva2VzIHdoZW4gdHlwaW5nCiAgIGNvbW1hbmRzIGF0IHRoZSBwcm9tcHQ6CgogIGZvcGVuIFwlYyBvb2ZhLnR4dAogIGZsaXN0CiAgMC4gL3Vzci9vbGdhLm9vZmEudHh0IChSKSAwCgogICBUaGlzIHRlbGxzIHRoZSBjaGFubmVsIG51bWJlciBpcyAwICh0aGUgbnVtYmVyIG9uIHRoZSBsZWZ0IGlzIHRoZQogICBjaGFubmVsIGZpbGUncyBjaGFubmVsIG51bWJlcikuIE9mIGNvdXJzZSB5b3UgY2FuIGFsc28gZmluZCBpdCBieQogICBlY2hvaW5nIHRoZSB2YXJpYWJsZToKCiAgZWNobyBcJWMKICAwCgogICBPciB3aXRoICJmc3RhdHVzIFwlYyIuIE5vdyB5b3UgY2FuIHR5cGUgY29tbWFuZHMgbGlrZToKCiAgZnJlYWQgMAoKICAgdG8gcmVhZCBhIGxpbmUgZnJvbSB0aGUgZmlsZS4gT2J2aW91c2x5LCBob3dldmVyLCB1c2luZyBkaWdpdHMgcmF0aGVyCiAgIHRoYW4gYSB2YXJpYWJsZSBmb3IgdGhlIGNoYW5uZWwgbnVtYmVyIHdvdWxkIGJlIHBvb3IgcHJhY3RpY2UgaW4gYQogICBzY3JpcHQuCgogICBJZiBpbiBjb21tYW5kcyBsaWtlOgoKICBmcmVhZCBcJWMgXCVhCgogICB5b3UgaGF2ZSB0cm91YmxlIHJlbWVtYmVyaW5nIHdoaWNoIHZhcmlhYmxlIGlzIHdoaWNoLCBub3RlIHRoYXQgdGhlCiAgIGNoYW5uZWwgbnVtYmVyIGlzLCBpbmRlZWQsIGEgbnVtYmVyLiBBbnl3aGVyZSBDLUtlcm1pdCBhY2NlcHRzIGEKICAgbnVtYmVyIGl0IGNhbiBhbHNvIGFjY2VwdCBhbiBleHByZXNzaW9uLCBzbyB5b3UgY2FuIHB1dCBwYXJlbnRoZXNlcwogICBhcm91bmQgdGhlIGNoYW5uZWwgbnVtYmVyIHRvIHJlbWluZCB5b3UgaXQncyB0aGUgY2hhbm5lbCBudW1iZXIgYW5kCiAgIG5vdCB0aGUgdmFyaWFibGUgaW50byB3aGljaCBkYXRhIGlzIHRvIGJlIHJlYWQ6CgogIGZyZWFkIChcJWMpIFwlYQoKICAgTm9ybWFsbHkgY2hhbm5lbCBudW1iZXJzIGFyZSBhc3NpZ25lZCBzZXF1ZW50aWFsbHkgYXMgMCwgMSwgMiwgLi4uIHVwCiAgIHRvIHRoZSBsaW1pdC4gSG93ZXZlciwgb25jZSB5b3Ugc3RhcnQgY2xvc2luZyBmaWxlcywgdGhlcmUgY2FuIGJlCiAgIGhvbGVzIGluIHRoZSBzZXF1ZW5jZS4gTmV3IGNoYW5uZWxzIGFyZSBhc3NpZ25lZCB0byBmaWxsIGluIHRoZSBob2xlcy4KICAgVGh1cyB5b3UgY2FuJ3QgZGVwZW5kIG9uIGNoYW5uZWwgbnVtYmVycyBiZWluZyBpbiBhbnkgcGFydGljdWxhcgogICBzZXF1ZW5jZS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDEuMjIuNS4gRklMRSBDb21tYW5kIEVycm9ycwoKICAgRWFjaCBGSUxFIGNvbW1hbmQgc2V0cyB0aGUgdmFyaWFibGUgXHYoZl9lcnJvcikgdG8gb25lIG9mIHRoZQogICBmb2xsb3dpbmcgdmFsdWVzOgoKICAgIDAgPSBObyBlcnJvcgogICAtMSA9IFN5c3RlbSBlcnJvcgogICAtMiA9IEF0dGVtcHQgdG8gcmVhZCBhZnRlciBlbmQgb2YgZmlsZQogICAtMyA9IENoYW5uZWwgbm90IG9wZW4KICAgLTQgPSBDaGFubmVsIG51bWJlciBvdXQgb2YgcmFuZ2UgKG5lZ2F0aXZlIG9yIHRvbyBsYXJnZSkKICAgLTUgPSBOdW1lcmljIGFyZ3VtZW50IChzaXplLCAuLi4pIG91dCBvZiByYW5nZQogICAtNiA9IEZpbGUgbm90IGZvdW5kCiAgIC03ID0gQmFkIG9yIG1pc3NpbmcgZmlsZW5hbWUKICAgLTggPSBUb28gbWFueSBmaWxlcyBhcmUgYWxyZWFkeSBvcGVuIChGSUxFIE9QRU4gb25seSkKICAgLTkgPSBGb3JiaWRkZW4gb3BlcmF0aW9uIChlLmcuIHdyaXRlIHRvIGEgcmVhZC1vbmx5IGZpbGUpCiAgLTEwID0gQWNjZXNzIGRlbmllZAogIC0xMSA9IElsbGVnYWwgY29tYmluYXRpb24gb2YgT1BFTiBtb2RlcyAoRklMRSBPUEVOIG9ubHkpCiAgLTEyID0gQnVmZmVyIG92ZXJmbG93CiAgLTEzID0gQ3VycmVudCBsaW5lIG51bWJlciB1bmtub3duIChmb3IgcmVsYXRpdmUgbGluZSBzZWVrcykKICAtMTQgdGhyb3VnaCAtOTg6IFJlc2VydmVkLgogIC05OSA9IFJlcXVlc3RlZCBvcGVyYXRpb24gbm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiBvZiBDLUtlcm1pdAogLTk5OSA9IFVua25vd24gZXJyb3IKCiAgIFdoZW4gXHYoZl9lcnJvcikgaXMgLTEsIHRoaXMgbWVhbnMgdGhlIEZJTEUgY29tbWFuZCBmYWlsZWQgYmVjYXVzZQogICBiZWNhdXNlIG9mIGEgc3lzdGVtIGVycm9yLCBpbiB3aGljaCBjYXNlIHlvdSBjYW4gZXhhbWluZSB0aGUgZm9sbG93aW5nCiAgIHZhcmlhYmxlczoKCiAgXHYoZXJybm8pICAgICA9IFN5c3RlbSBlcnJvciBudW1iZXIuCiAgXHYoZXJyc3RyaW5nKSA9IEVycm9yIG1lc3NhZ2UgY29ycmVzcG9uZGluZyB0byBcdihlcnJubykuCgogICBBIHNwZWNpYWwgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGZvciB0cmFuc2xhdGluZyB0aGUgXHYoZl9lcnJvcikgY29kZQogICB0byBhbiBlcnJvciBtZXNzYWdlIHN0cmluZzoKClxmX2Vycm1zZyhbY29kZV0pCiAgSWYgdGhlIGNvZGUgaXMgLTEsIHJldHVybnMgZXJyb3IgbWVzc2FnZSBvZiB0aGUgbW9zdCByZWNlbnQgc3lzdGVtCiAgZXJyb3I7IG90aGVyd2lzZSBpZiB0aGUgY29kZSBpcyBhIHZhbGlkIFx2KGZfZXJyb3IpIHZhbHVlLCB0aGUgYXNzb2NpYXRlZAogIG1lc3NhZ2UgaXMgcmV0dXJuZWQuICBJZiB0aGUgY29kZSBpcyBvbWl0dGVkLCB0aGUgc3RhdHVzIG1lc3NhZ2UKICBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IFx2KGZfZXJyb3IpIHZhbHVlIGlzIHJldHVybmVkLgoKICAgQSBGSUxFIGNvbW1hbmQgdGhhdCBmYWlscyBwcmludHMgdGhlIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKICAgYXV0b21hdGljYWxseSwgZXhjZXB0IHdoZW4gdGhlIGNvbW1hbmQgaXMgUkVBRCBvciBTRUVLIGFuZCB0aGUgZXJyb3IKICAgaXMgLTIgKGVuZCBvZiBmaWxlKTsgaW4gdGhhdCBjYXNlLCB0aGUgY29tbWFuZCBzdGlsbCBmYWlscywgYnV0IGRvZXMKICAgbm90IHByaW50IGEgbWVzc2FnZS4gVGhpcyBhbGxvd3MgY29uc3RydWN0aW9ucyBzdWNoIGFzOgoKICBmb3BlbiBcJWMgb29mYS50eHQKICB3aGlsZSBzdWNjZXNzIHsgZnJlYWQgXCVjIH0KICBmY2xvc2UgXCVjCgogICB0byB3b3JrIGFzIGV4cGVjdGVkLCBpLmUuIHdpdGhvdXQgYW4gYW5ub3lpbmcgbWVzc2FnZSB3aGVuIHRoZSBlbmQgb2YKICAgZmlsZSBpcyByZWFjaGVkLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMS4yMi42LiBGaWxlIEkvTyBWYXJpYWJsZXMKCiAgIFRoZSB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaWxlIGkvbyBwYWNrYWdlIGFyZToKCiAgIFx2KGZfY291bnQpCiAgICAgICAgICBSZXN1bHQgb2YgdGhlIG1vc3QgcmVjZW50IEZJTEUgQ09VTlQgKEZDT1VOVCkgY29tbWFuZC4KCiAgIFx2KGZfZXJyb3IpCiAgICAgICAgICBOdW1lcmljIGVycm9yIGNvZGUgb2YgbW9zdCByZWNlbnQgRklMRSBjb21tYW5kICgwID0gbm8gZXJyb3IpLgoKICAgXHYoZl9tYXgpCiAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBmaWxlcyBvcGVuIHNpbXVsdGFuZW91c2x5LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMS4yMi43LiBGaWxlIEkvTyBGdW5jdGlvbnMKCiAgIFNvbWUgb2YgdGhlIEZJTEUgY29tbWFuZHMgY2FuIGFsc28gYmUgaXNzdWVkIGFzIGZ1bmN0aW9uIGNhbGxzLCB3aGljaAogICBtYWtlcyBzY3JpcHQgd3JpdGluZyBhIGJpdCBtb3JlIGNvbnZlbmllbnQsIGVzcGVjaWFsbHkgZm9yIEMKICAgcHJvZ3JhbW1lcnMuIEFsc28sIHNldmVyYWwgZnVuY3Rpb25zIGFyZSBwcm92aWRlZCB0aGF0IGRvIG5vdCBoYXZlCiAgIGNvbW1hbmQgZXF1aXZhbGVudHMuIEVhY2ggb2YgdGhlc2UgZnVuY3Rpb25zIHRha2VzIGEgY2hhbm5lbCBudW1iZXIgYXMKICAgdGhlIGZpcnN0IGFyZ3VtZW50LiBUaGVzZSBmdW5jdGlvbnMgZG8gbm90IHdvcmsgZm9yIE9QRU4geyBSRUFELAogICAhUkVBRCwgV1JJVEUsICFXUklURSwgYW5kIEFQUEVORCB9IGZpbGVzLgoKICAgXGZfc3RhdHVzKGNoYW5uZWwpCiAgICAgICAgICBSZXR1cm5zIDAgaWYgdGhlIGNoYW5uZWwgaXMgbm90IG9wZW4sIG90aGVyd2lzZSBhIG51bWJlcgogICAgICAgICAgYmV0d2VlbiAxIGFuZCAxNSB3aGljaCBpcyB0aGUgc3VtIG9mIHRoZSBPUEVOIG1vZGVzOgoKICAxID0gL1JFQUQKICAyID0gL1dSSVRFCiAgNCA9IC9BUFBFTkQKICA4ID0gL0JJTkFSWQoKICAgVGhlIHJlbWFpbmluZyBmdW5jdGlvbnMgd29yayBvbmx5IGZvciBvcGVuIGNoYW5uZWxzLiBFYWNoIG9mIHRoZXNlCiAgIGZ1bmN0aW9ucyBjYW4gZmFpbCBmb3IgdGhlIGFwcGxpY2FibGUgcmVhc29ucyBsaXN0ZWQgaW4gWzM3OV1TZWN0aW9uCiAgIDEuMjIuNS4gRm9yIGluc3RydWN0aW9ucyBvbiBoYW5kbGluZyBmdW5jdGlvbiBlcnJvcnMsIHNlZSBbMzgwXVNlY3Rpb24KICAgNy4xMi4KCiAgIFxmX3BvcyhjaGFubmVsKQogICAgICAgICAgUmV0dXJucyB0aGUgZmlsZSdzIGN1cnJlbnQgcmVhZC93cml0ZSBwb2ludGVyICgwLWJhc2VkKS4gVGhlcmUKICAgICAgICAgIGlzIG5vIEZJTEUgY29tbWFuZCBlcXVpdmFsZW50LgoKICAgXGZfbGluZShjaGFubmVsKQogICAgICAgICAgUmV0dXJucyB0aGUgZmlsZSdzIGN1cnJlbnQgbGluZSBudW1iZXIgKDAtYmFzZWQpLCBpZiBrbm93biwKICAgICAgICAgIG90aGVyd2lzZSAtMS4gVGhlcmUgaXMgbm8gRklMRSBjb21tYW5kIGVxdWl2YWxlbnQuIFRoZSBsaW5lCiAgICAgICAgICBudW1iZXIgaXMga25vd24gYXMgbG9uZyBhcyBubyBjaGFyYWN0ZXIgb3IgYmxvY2sgaS9vIGhhcyBiZWVuCiAgICAgICAgICBkb25lIG9uIHRoZSBjaGFubmVsLgoKICAgXGZfaGFuZGxlKGNoYW5uZWwpCiAgICAgICAgICBSZXR1cm5zIHRoZSAiZmlsZSBoYW5kbGUiIG9mIHRoZSBmaWxlLiBUaGF0IGlzLCBpdCB0cmFuc2xhdGVzCiAgICAgICAgICB0aGUgcG9ydGFibGUgQy1LZXJtaXQgY2hhbm5lbCBudW1iZXIgaW50byBhIHN5c3RlbS1zcGVjaWZpYwogICAgICAgICAgZmlsZSBoYW5kbGUgb3IgbnVtYmVyIHRoYXQgY2FuIGJlIHBhc3NlZCB0byBvdGhlciBwcm9ncmFtcyBvbgogICAgICAgICAgdGhlIHNhbWUgcGxhdGZvcm0uIEluIFVOSVggdGhpcyBpcyBhIGZpbGUgZGVzY3JpcHRvci4gVGhlcmUgaXMKICAgICAgICAgIG5vIEZJTEUgY29tbWFuZCBlcXVpdmFsZW50LgoKICAgXGZfZW9mKGNoYW5uZWwpCiAgICAgICAgICBSZXR1cm5zIDEgaWYgdGhlIHJlYWQvd3JpdGUgcG9pbnRlciBvZiB0aGUgZmlsZSBvbiB0aGUgZ2l2ZW4KICAgICAgICAgIGNoYW5uZWwgaXMgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSwgMCBvdGhlcndpc2UuIENvbnZlbmllbnQgaW4KICAgICAgICAgIFdISUxFIHN0YXRlbWVudHMsIGUuZy46CgogICAgd2hpbGUgbm90IFxmX2VvZihcJWMpIHsgZnJlYWQgXCVjIH0KCiAgIFxmX2dldGNoYXIoY2hhbm5lbCkKICAgICAgICAgIEVxdWl2YWxlbnQgdG8gRlJFQUQgL0NIQVIuIFJldHVybnMgdGhlIGNoYXJhY3RlciBhY3R1YWxseSByZWFkLgogICAgICAgICAgSWYgXGZfZ2V0Y2hhcigpIGRvZXMgbm90IGZhaWwgYnV0IHRoZSByZXR1cm4gdmFsdWUgaXMgZW1wdHksCiAgICAgICAgICB0aGlzIG1lYW5zIGEgTlVMTCBjaGFyYWN0ZXIgd2FzIHJlYWQuCgogICBcZl9nZXRsaW5lKGNoYW5uZWwpCiAgICAgICAgICBFcXVpdmFsZW50IHRvIEZSRUFEIC9MSU5FLiBSZXR1cm5zIHRoZSBsaW5lIGFjdHVhbGx5IHJlYWQsIGJ1dAogICAgICAgICAgd2l0aCB0aGUgbGluZSB0ZXJtaW5hdG9yIHN0cmlwcGVkLiBJZiBcZl9nZXRsaW5lKCkgZG9lcyBub3QKICAgICAgICAgIGZhaWwgYnV0IHRoZSByZXR1cm4gdmFsdWUgaXMgZW1wdHksIHRoaXMgbm9ybWFsbHkgbWVhbnMgYW4KICAgICAgICAgIGVtcHR5IGxpbmUgd2FzIHJlYWQuCgogICBcZl9nZXRibG9jayhjaGFubmVsLG4pCiAgICAgICAgICBFcXVpdmFsZW50IHRvIEZSRUFEIC9TSVpFOm4uIFJldHVybnMgdGhlIGJsb2NrIG9mIGNoYXJhY3RlcnMKICAgICAgICAgIGFjdHVhbGx5IHJlYWQuIElmIHRoZSByZXR1cm5lZCBibG9jayBpcyBzbWFsbGVyIHRoYW4gbiwgaXQKICAgICAgICAgIGluZGljYXRlcyBlaXRoZXIgdGhhdCB0aGUgZW5kIG9mIGZpbGUgd2FzIHJlYWNoZWQgb3IgYSBOVUwKICAgICAgICAgIGNoYXJhY3RlciBpcyBpbiB0aGUgYmxvY2suCgogICBcZl9wdXRjaGFyKGNoYW5uZWwsYykKICAgICAgICAgIEVxdWl2YWxlbnQgdG8gRldSSVRFIC9DSEFSQUNURVIuIFdyaXRlcyB0aGUgY2hhcmFjdGVyIGMuIElmIGMKICAgICAgICAgIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyLCBvbmx5IHRoZSBmaXJzdCBpcyB3cml0dGVuLiBJZgogICAgICAgICAgYyBpcyBlbXB0eSBhIE5VTCBpcyB3cml0dGVuLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycwogICAgICAgICAgd3JpdHRlbiBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUgdXBvbiBmYWlsdXJlLgoKICAgXGZfcHV0bGluZShjaGFubmVsLHN0cmluZykKICAgICAgICAgIEVxdWl2YWxlbnQgdG8gRldSSVRFIC9MSU5FLiBXcml0ZXMgdGhlIHN0cmluZyBhbmQgYWRkcyB0aGUKICAgICAgICAgIGFwcHJvcHJpYXRlIGxpbmUgdGVybWluYXRpb24gY2hhcmFjdGVyIG9yIHNlcXVlbmNlLiBJZiB0aGUKICAgICAgICAgIHN0cmluZyBpcyBlbXB0eSBvciBvbWl0dGVkLCBhbiBlbXB0eSBsaW5lIGlzIHdyaXR0ZW4uIFJldHVybnMKICAgICAgICAgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUKICAgICAgICAgIGVycm9yIGNvZGUgdXBvbiBmYWlsdXJlLgoKICAgXGZfcHV0YmxvY2soY2hhbm5lbCxzdHJpbmcpCiAgICAgICAgICBFcXVpdmFsZW50IHRvIEZXUklURSAvU1RSSU5HLiBXcml0ZXMgdGhlIHN0cmluZyBhcyBnaXZlbi4gSWYKICAgICAgICAgIHRoZSBzdHJpbmcgaXMgZW1wdHkgb3Igb21pdHRlZCwgbm90aGluZyBpcyB3cml0dGVuLiBSZXR1cm5zIHRoZQogICAgICAgICAgbnVtYmVyIG9mIGNoYXJhY3RlcnMgd3JpdHRlbiBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yCiAgICAgICAgICBjb2RlIHVwb24gZmFpbHVyZS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDEuMjIuOC4gRmlsZSBJL08gRnVuY3Rpb24gRXhhbXBsZXMKCiAgZm9wZW4gL3JlYWQgXCVjIG9vZmEudHh0ICAgICAgICAgICAgOyBPcGVuIG91ciBmYXZvcml0ZSBmaWxlIGZvciByZWFkaW5nCiAgaWYgZmFpbHVyZSBleGl0IDEgICAgICAgICAgICAgICAgICAgOyBDaGVjayB0aGF0IGl0J3Mgb3BlbgogIHdoaWxlIG5vdCBcZl9lb2YoXCVjKSB7ICAgICAgICAgICAgIDsgTG9vcCB1bnRpbCBFT0YKICAgICAgLmxpbmUgOj0gXGZfZ2V0bGluZShcJWMpICAgICAgICA7IEdldCBhIGxpbmUKICAgICAgaWYgc3VjY2VzcyBlY2hvIHtcbShsaW5lKX0gICAgICA7IEVjaG8gaXQKICB9CiAgaWYgbm90IFxmX2VvZihcJWMpIHsgICAgICAgICAgICAgICAgOyBDaGVjayByZWFzb24gZm9yIGxvb3AgZXhpdAogICAgICBleGl0IDEgRmlsZSBFcnJvcjogXGZfZXJybXNnKCkgIDsgSWYgbm90IEVPRiBzYXkgc28uCiAgfQoKICBmcmV3aW5kIFwlYyAgICAgICAgICAgICAgICAgICAgICAgICA7IFJld2luZCB0aGUgZmlsZQogIHdoaWxlIG5vdCBcZl9lb2YoXCVjKSB7ICAgICAgICAgICAgIDsgU2FtZSB0aGluZyBidXQgd2l0aCBibG9jayBpL28KICAgICAgLmJsb2NrIDo9IFxmX2dldGJsb2NrKFwlYywyNTYpICA7IChtdWNoIGZhc3RlciB0aGFuIGxpbmUgaS9vKQogICAgICBpZiBzdWNjZXNzIHhlY2hvIHtcbShibG9jayl9CiAgfQoKICBmcmV3aW5kIFwlYyAgICAgICAgICAgICAgICAgICAgICAgICA7IFJld2luZCBhZ2FpbgogIHdoaWxlIG5vdCBcZl9lb2YoXCVjKSB7ICAgICAgICAgICAgIDsgU2FtZSBkZWFsIGJ1dCB3aXRoIGNoYXJhY3RlciBpL28KICAgICAgLmMgOj0gXGZfZ2V0Y2hhcihcJWMpICAgICAgICAgICA7IChtdWNoIHNsb3dlciB0aGFuIGxpbmUgaS9vKQogICAgICBpZiBzdWNjZXNzIHhlY2hvIHtcbShjKX0KICB9CiAgY2xvc2UgXCVjCgogICBUbyBjbG9zZSBhbGwgb3BlbiBmaWxlcyAoZXF1aXZhbGVudCB0byBGQ0xPU0UgQUxMKToKCiAgZm9yIFwlaSAwIFx2KGZfbWF4KS0xIDEgewogICAgICBpZiBcZl9zdGF0dXMoXCVpKSBmY2xvc2UgXCVpCiAgfQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEuMjMuIFRoZSBFWEVDIENvbW1hbmQKCiAgIFRoZSBFWEVDIGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9ubHkgaW4gVU5JWC4KCiAgIEVYRUMgWyAvUkVESVJFQ1QgXSBjb21tYW5kIFsgYXJnMSBbIGFyZzIgWyAuLi4gXSBdCiAgICAgICAgICBSdW5zIHRoZSBnaXZlbiBjb21tYW5kIHdpdGggdGhlIGFyZ3VtZW50cyBpbiBzdWNoIGEgd2F5IHRoYXQKICAgICAgICAgIHRoZSBjb21tYW5kIHJlcGxhY2VzIEMtS2VybWl0IGluIG1lbW9yeSwgYW5kIEMtS2VybWl0IGNlYXNlcyB0bwogICAgICAgICAgZXhlY3V0ZS4gRVhFQyBpcyBsaWtlIFJVTiwgZXhjZXB0IGluc3RlYWQgb2YgcmV0dXJuaW5nIHRvCiAgICAgICAgICBDLUtlcm1pdCB3aGVuIGZpbmlzaGVkLCB0aGUgY29tbWFuZCByZXR1cm5zIHRvIHdoYXRldmVyIHByb2Nlc3MKICAgICAgICAgIGludm9rZWQgS2VybWl0LgoKICAgSW4gdGhlIG5vcm1hbCBjYXNlLCBubyBmaWxlcyBhcmUgY2xvc2VkLCBzbyB0aGUgRVhFQydkIGNvbW1hbmQKICAgaW5oZXJpdHMgdGhlIG9wZW4gZmlsZXMsIHJlYWQvd3JpdGUgcG9pbnRlcnMsIHdvcmtpbmcgZGlyZWN0b3J5LAogICBwcm9jZXNzIElELCB1c2VyIElEICh1bmxlc3MgY29tbWFuZCBpcyBTVUlEKSwgZ3JvdXAgSUQgKHVubGVzcyBjb21tYW5kCiAgIGlzIFNHSUQpLCBncm91cHMsIGV0Yy4gKEluIFVOSVgsIHRoZSBFWEVDIGNvbW1hbmQgaXMgc2ltcGx5IGEgZnJvbnQKICAgZW5kIGZvciBleGVjdnAoKS4pCgogICBJZiB0aGUgL1JFRElSRUNUIHN3aXRjaCBpcyBpbmNsdWRlZCwgdGhlbiBpZiBhIGNvbm5lY3Rpb24gaXMgb3BlbiAoU0VUCiAgIExJTkUgb3IgU0VUIEhPU1QpLCBpdCBiZWNvbWVzIHRoZSBzdGFuZGFyZCBpbnB1dCBhbmQgb3V0cHV0IG9mIHRoZQogICBFWEVDJ2QgcHJvZ3JhbS4gSWYgbm8gY29ubmVjdGlvbiBpcyBvcGVuLCB0aGUgL1JFRElSRUNUIHN3aXRjaCBoYXMgbm8KICAgZWZmZWN0LiBGb3IgZXhhbXBsZSB0byB1c2UgQy1LZXJtaXQgZm9yIFBQUCBkaWFsaW5nIGluIExpbnV4OgoKICBzZXQgbW9kZW0gdHlwZSB1c3IgICAgICAgICAgOyBTcGVjaWZ5IHRoZSBraW5kIG9mIG1vZGVtIHlvdSBoYXZlCiAgc2V0IGxpbmUgL2Rldi90dHlTMSAgICAgICAgIDsgU3BlY2lmeSB0aGUgZGV2aWNlIGl0J3MgY29ubmVjdGVkIHRvCiAgc2V0IHNwZWVkIDU3NjAwICAgICAgICAgICAgIDsgYW5kIHRoZSBzcGVlZAogIHNldCBmbG93IHJ0cy9jdHMgICAgICAgICAgICA7IGFuZCBmbG93IGNvbnRyb2wuCiAgc2V0IGRpYWwgcmV0cmllcyAxMDAgICAgICAgIDsgVHJ5IHRoZSBkaWFsIHNlcXVlbmNlIHVwIHRvIDEwMCB0aW1lcy4KICBkaWFsIHt7OS0yMTItNTU1LTEyMTJ9ezktMjEyLTU1NS0xMjEzfXs5LTIxMi01NTUtMTIxNH17OS0yMTItNTU1LTEyMTV9fQogIGlmIGZhaWwgZXhpdCAxCiAgZm9yIFwlaSAxIDE2IDEgeyAgICAgICAgICAgIDsgVHJ5IHVwIHRvIDE2IHRpbWVzIHRvIGdldCBsb2dpbiBwcm9tcHQKICAgICAgaW5wdXQgMTAgTG9naW46ICAgICAgICAgOyBXYWl0IDEwIHNlYyBmb3IgaXQgdG8gYXBwZWFyCiAgICAgIGlmIHN1Y2Nlc3MgYnJlYWsgICAgICAgIDsgR290IGl0IC0gcHJvY2VlZC4uLgogICAgICBvdXRwdXQgXDEzICAgICAgICAgICAgICA7IFNlbmQgYSBjYXJyaWFnZSByZXR1cm4gYW5kIHRyeSBhZ2FpbgogIH0KICBpZiAoID4gXCVpIDE2ICkgc3RvcCAxIE5PIExPR0lOIFBST01QVAogIGxpbmVvdXQgXChteXVzZXJpZCkgICAgICAgICA7IFNlbmQgdXNlciBJRAogIGlucHV0IDMwIGFzc3dvcmQ6ICAgICAgICAgICA7IFdhaXQgZm9yIFBhc3N3b3JkIHByb21wdAogIGlmIGZhaWwgc3RvcCAxIE5PIFBBU1NXT1JEIFBST01QVAogIGxpbmVvdXQgXG0obXlwYXNzd29yZCkgICAgICA7IFNlbmQgdGhlIHBhc3N3b3JkLgogIGV4ZWMgL3JlZGlyZWN0IHBwcGQgICAgICAgICA7IFJlcGxhY2Ugb3Vyc2VsdmVzIHdpdGggcHBwZC4KCiAgIEluIHRoaXMgZXhhbXBsZSB3ZSBhc3N1bWUgdGhhdCB0aGUgc2NyaXB0IGhhcyBhbHJlYWR5IHNldCB1cCB0aGUKICAgbXl1c2VyaWQgYW5kIG15cGFzc3dvcmQgdmFyaWFibGVzIC0tIG5vcm1hbGx5IHRoZSBwYXNzd29yZCBzaG91bGQgYmUKICAgcHJvbXB0ZWQgZm9yLCByYXRoZXIgdGhhbiBzdG9yZWQgb24gZGlzay4gTm90aWNlIHRoZSBhZHZhbnRhZ2VzIG92ZXIKICAgdGhlIHdlbGwta25vd24gImNoYXQgc2NyaXB0IjoKICAgICAqIFlvdSBkb24ndCBoYXZlIHRvIGNvbnRyb2wgdGhlIG1vZGVtIGl0c2VsZiB3aXRoIEFUIGNvbW1hbmRzOwogICAgICAgS2VybWl0J3MgRElBTCBjb21tYW5kIGRvZXMgdGhpcyBmb3IgeW91LgogICAgICogWW91IGNhbiBoYXZlIEtlcm1pdCBhdXRvbWF0aWNhbGx5IHJlZGlhbCBhcyBtYW55IHRpbWVzIGFzIHlvdSB3YW50CiAgICAgICB1bnRpbCBpdCBnZXRzIGEgY29ubmVjdGlvbiAoaWYgdGhpcyBpcyBsZWdhbCBpbiB5b3VyIGNvdW50cnkpLgogICAgICogWW91IGNhbiBoYXZlIEtlcm1pdCBmZXRjaCB0aGUgbnVtYmVyIG9yIG51bWJlcnMgZnJvbSBhIGRpYWxpbmcKICAgICAgIGRpcmVjdG9yeS4KICAgICAqIFlvdSBjYW4gaGF2ZSBLZXJtaXQgY3ljbGUgdGhyb3VnaCBhIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyAodGhpcyBpcwogICAgICAgbmV3IGluIEMtS2VybWl0IDcuMDsgc2VlIFszODFdU2VjdGlvbiAyLjEuMTYpIHdpdGhvdXQgaGF2aW5nIHRvCiAgICAgICBlbnRlciB0aGUgbnVtYmVycyBpbiBhIGRpYWxpbmcgZGlyZWN0b3J5LgogICAgICogRGlhbGluZyBpcyBsb2NhdGlvbi1pbmRlcGVuZGVudDsgeW91IGNhbiB1c2UgdGhlIHNhbWUgc2NyaXB0IHRvCiAgICAgICBkaWFsIGZyb20gZGlmZmVyZW50IGFyZWFzIG9yIGNvdW50cmllcy4KICAgICAqIE9uY2UgdGhlIGNvbm5lY3Rpb24gaXMgbWFkZSwgdGhlIGZ1bGwgcG93ZXIgb2YgS2VybWl0J3Mgc2NyaXB0CiAgICAgICBsYW5ndWFnZSBpcyBhdmFpbGFibGUgdG8gbWFuYWdlIHRoZSBkaWFsb2cgd2l0aCB0aGUgdGVybWluYWwKICAgICAgIHNlcnZlciBvciBvdGhlciBkZXZpY2UgdGhhdCBhbnN3ZXJzIHRoZSBwaG9uZSBjYWxsLgoKICAgTk9URTogUFBQIGFuZCBTTElQIGRpYWxpbmcgYXJlIG5vdCBhdmFpbGFibGUgaW4gV2luZG93cyA5NS85OC9OVC8yMDAwLAogICB3aG9zZSBBUElzIGRvIG5vdCBwcm92aWRlIGEgbWV0aG9kIGZvciBhbiBhcHBsaWNhdGlvbiB0byBoYW5kIG92ZXIgYQogICBjb25uZWN0aW9uIHRvIHRoZSBQUFAgb3IgU0xJUCBkcml2ZXIuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMS4yNC4gR2V0dGluZyBLZXl3b3JkIExpc3RzIHdpdGggJz8nCgogICBTdXBwb3NlIHlvdSB0eXBlICJ0ZSIgYXQgdGhlIEMtS2VybWl0PiA2LjAgcHJvbXB0IGFuZCB0aGVuIEVzYyBvciBUYWIKICAgdG8gcmVxdWVzdCBrZXl3b3JkIGNvbXBsZXRpb24uIEtlcm1pdCBiZWVwcywgaW5kaWNhdGluZyB0aGF0IG1vcmUgdGhhbgogICBvbmUgY29tbWFuZCBzdGFydHMgd2l0aCAidGUiLiBCdXQgaWYgeW91IHR5cGUgJz8nIHRvIHNlZSB3aGF0IHRoZXkKICAgYXJlLCBLZXJtaXQgc2hvd3Mgb25seSAidGVsbmV0Ii4gU28gd2h5IHRoZSBiZWVwPyBCZWNhdXNlIG9mIGludmlzaWJsZQogICBrZXl3b3JkcyBsaWtlICJ0ZWxvcHQiLCAidGVybWluYWwiLCBhbmQgInRleHQiLiBMb3RzIG9mIGtleXdvcmRzIGFyZQogICBpbnZpc2libGUgYmVjYXVzZSB0aGV5IGFyZSBlaXRoZXIgc3lub255bXMgZm9yIG90aGVyIGtleXdvcmRzIG9yIGVsc2UKICAgZXNvdGVyaWMgb3B0aW9ucyB0byBiZSB1c2VkIG9ubHkgaW4gc3BlY2lhbCBjaXJjdW1zdGFuY2VzLCBzbyB3ZSBkb24ndAogICB3YW50IHRoZW0gY2x1dHRlcmluZyB1cCB0aGUgbWVudXMuCgogICBCdXQgdGhlbiB0aGVyZSBpcyBubyB3YXkgZm9yIHlvdSB0byBkaXNjb3ZlciB0aGVtLiBTbyBpbiBDLUtlcm1pdCA3LjAsCiAgIGlmIHlvdSB0eXBlICc/JyBBRlRFUiB0aGUgYmVnaW5uaW5nIG9mIGEga2V5d29yZCBmaWVsZCwgdGhlbiBpbnZpc2libGUKICAga2V5d29yZHMgYXJlIHNob3duIHRvbzoKCiAgQy1LZXJtaXQ+IHRlPEVzYz48QkVFUD4KICBDLUtlcm1pdD4gdGU/IENvbW1hbmQsIG9uZSBvZiB0aGUgZm9sbG93aW5nOgogICB0ZWxuZXQgICAgdGVsb3B0ICAgIHRlcm1pbmFsICB0ZXh0CiAgQy1LZXJtaXQ+dGUKCiAgIEJ1dCBpZiAnPycgaXMgdHlwZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZpZWxkLCBvbmx5IHZpc2libGUga2V5d29yZHMKICAgYXJlIHNob3duLCBhcyBiZWZvcmUgKHNvLCBpbiB0aGlzIGV4YW1wbGUsIGlmICc/JyBpcyB0eXBlZCBhdCB0aGUKICAgQy1LZXJtaXQ+IHByb21wdCwgInRlbG5ldCIgaXMgdGhlIG9ubHkgY29tbWFuZCBzaG93biB0aGF0IHN0YXJ0cyB3aXRoCiAgICJ0ZSIpLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDIuIE1BS0lORyBBTkQgVVNJTkcgQ09OTkVDVElPTlMgVGhlIFNFVCBMSU5FLCBTRVQgSE9TVCwgYW5kIFNFVCBQT1JUIChhCiAgc3lub255bSBmb3IgU0VUIExJTkUpIGNvbW1hbmRzIGhhdmUgbmV3IHN5bm9ueW1zLCBpbiB3aGljaCB0aGUgd29yZCBTRVQgaXMKICByZXBsYWNlZCBieSB0aGUgd29yZCBPUEVOOiBPUEVOIExJTkUsIGV0Yy4gVGhlcmUgaXMgbm8gbmV3IGZ1bmN0aW9uYWxpdHkKICBoZXJlLCBidXQgT1BFTiBpcyBhIGJldHRlciB2ZXJiLCBzaW5jZSBTRVQgZ2VuZXJhbGx5IHRha2VzIG5vIGFjdGlvbiwgd2hlcmVhcwogIHRoZXNlIGNvbW1hbmRzIGFjdHVhbGx5IHRyeSB0byBvcGVuIGEgY29ubmVjdGlvbi4gRnVydGhlcm1vcmUsIHRoZXJlIGlzIHRoZQogIHN5bW1ldHJ5IHdpdGggQ0xPU0UuCiAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMi4wLiBTRVQgTElORSBhbmQgU0VUIEhPU1QgQ29tbWFuZCBTd2l0Y2hlc1RoZSBTRVQgTElORSAoU0VUIFBPUlQpIGFuZCBTRVQKICBIT1NUIGNvbW1hbmRzIG5vdyBhbGxvdyBzd2l0Y2hlcyBiZWZvcmUgdGhlIGRldmljZSBvciBob3N0IG5hbWUsIGluIG1vc3QKICBjYXNlcywgYW5kIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgYWxzbyBhdCB0aGUgZW5kLiBUaGUgbmV3IHN5bnRheCBpcwogIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIHN5bnRheDsgdGh1cyBTRVQgTElORSwgU0VUIFBPUlQsIGFuZAogIFNFVCBIT1NUIGNvbW1hbmRzIGluIGNvbW1hbmQgZmlsZXMgd3JpdHRlbiBmb3IgQy1LZXJtaXQgNi4wIG9yIGVhcmxpZXIgc3RpbGwKICB3b3JrLiBUaGUgZXhwYW5kZWQgc3ludGF4IGlzOgoKICB7IE9QRU4sIFNFVCB9IHsgTElORSwgUE9SVCwgSE9TVCB9IFsgc3dpdGNoZXMgXSBkZXZpY2Utb3ItYWRkcmVzcyBbIHN3aXRjaGVzCiAgXQoKICBUaGUgZmlyc3QgZ3JvdXAgb2Ygc3dpdGNoZXMgaXM6CgogICAvTkVUV09SSy1UWVBFOntUQ1AvSVAsWC4yNSxQSVBFLFBUWS4uLn0KICAgICAgICAgIFdoZW4gbW9yZSB0aGFuIG9uZSBuZXR3b3JrIHR5cGUgaXMgYXZhaWxhYmxlLCB0aGlzIGxldHMgeW91CiAgICAgICAgICBzcGVjaWZ5IHRoZSB0eXBlIG9mIG5ldHdvcmsgdG8gdXNlIGZvciB0aGlzIGNvbm5lY3Rpb24gd2l0aG91dAogICAgICAgICAgYWZmZWN0aW5nIHlvdXIgZ2xvYmFsIFNFVCBORVRXT1JLIFRZUEUuIFNlZSBbMzgyXVNlY3Rpb24gMi43CiAgICAgICAgICBhYm91dCBwaXBlcyBhbmQgcHR5cy4KCiAgIC9VU0VSSUQ6W3N0cmluZ10KICAgICAgICAgIFRoaXMgc3dpdGNoIGlzIGVxdWl2YWxlbnQgdG8gU0VUIExPR0lOIFVTRVJJRC4gSWYgYSBzdHJpbmcgaXMKICAgICAgICAgIGdpdmVuLCBpdCBzZW50IHRvIGhvc3QgZHVyaW5nIFRlbG5ldCBuZWdvdGlhdGlvbnM7IGlmIHRoaXMKICAgICAgICAgIHN3aXRjaCBpcyBnaXZlbiBidXQgdGhlIHN0cmluZyBpcyBvbWl0dGVkLCBubyB1c2VyIElEIGlzIHNlbnQKICAgICAgICAgIHRvIHRoZSBob3N0LiBJZiB0aGlzIHN3aXRjaCBpcyBub3QgZ2l2ZW4sIHlvdXIgY3VycmVudCBMT0dJTgogICAgICAgICAgVVNFUklEIChcdih1c2VyaWQpIHZhbHVlKSwgaWYgYW55LCBpcyBzZW50LiBVbmxpa2UgbW9zdCBvdGhlcgogICAgICAgICAgc3dpdGNoZXMsIHRoaXMgb25lIGlzICJzdGlja3kiLCBzaW5jZSB0aGUgdmFsdWUgbXVzdCBwZXJzaXN0CiAgICAgICAgICB0aHJvdWdob3V0IHRoZSBzZXNzaW9uIGluIGNhc2UgdGhlIHNlcnZlciByZXF1ZXN0cyB0aGUgSUQKICAgICAgICAgIHN0cmluZyBhdCBhIGxhdGVyIHRpbWUuCgogICAvQ09OTkVDVAogICAgICAgICAgRW50ZXIgQ09OTkVDVCBtb2RlIGltbWVkaWF0ZWx5IGFuZCBhdXRvbWF0aWNhbGx5IGFmdGVyIHRoZQogICAgICAgICAgZGV2aWNlIG9yIGNvbm5lY3Rpb24gaXMgb3Blbi4gT24gc2VyaWFsIGRldmljZXMsIGhvd2V2ZXIsIHdoZW4KICAgICAgICAgIENBUlJJRVItV0FUQ0ggaXMgbm90IE9GRiwgd2FpdCB1cCB0byAxIHNlY29uZCBmb3IgdGhlIENhcnJpZXIKICAgICAgICAgIERldGVjdCBzaWduYWwgdG8gYXBwZWFyIGJlZm9yZSB0cnlpbmcgdG8gY29ubmVjdCwgdG8gZ2l2ZSB0aGUKICAgICAgICAgIGRldmljZSB0aW1lIHRvIHJlYWN0IERUUiwgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIG9mZiBwcmlvciB0bwogICAgICAgICAgb3BlbmluZyB0aGUgZGV2aWNlLgoKICAgL1NFUlZFUgogICAgICAgICAgRW50ZXIgc2VydmVyIG1vZGUgaW1tZWRpYXRlbHkgYW5kIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgdGhlCiAgICAgICAgICBkZXZpY2Ugb3IgY29ubmVjdGlvbiBpcyBvcGVuLiBUcmVhdG1lbnQgb2YgY2FycmllciBpcyB0aGUgc2FtZQogICAgICAgICAgYXMgZm9yIC9DT05ORUNULgoKICAgL1dBSVQKICAgL05PV0FJVAogICAgICAgICAgRm9yIFRlbG5ldCBjb25uZWN0aW9ucyBvbmx5OiBMaWtlIFNFVCBURUxORVQgV0FJVCB7IE9OLCBPRkYgfSwKICAgICAgICAgIGJ1dCBhcHBsaWVzIG9ubHkgdG8gdGhpcyBjb25uZWN0aW9uLCBhbmQgaW4gZmFjdCBhcHBsaWVzIG9ubHkKICAgICAgICAgIHdoZW4gT1BFTmluZyB0aGlzIGNvbm5lY3Rpb24gKHdoaWNoIGlzIHVzdWFsbHkgdGhlIG9ubHkgcGxhY2UKICAgICAgICAgIGl0IG1hdHRlcnMpLiBUeXBpY2FsbHkgeW91IHdvdWxkIHVzZSBURUxORVQgL05PV0FJVCB0byBtYWtlIGEKICAgICAgICAgIGNvbm5lY3Rpb24gdG8gYSBtaXNiZWhhdmluZyBUZWxuZXQgc2VydmVyIHRoYXQgZG9lcyBub3QgcmVwbHkKICAgICAgICAgIHRvIG5lZ290aWF0aW9ucyBhcyByZXF1aXJlZCBieSB0aGUgVGVsbmV0IHByb3RvY29sIGRlZmluaXRpb24uCgogICBOb3RlOiAvQ09OTkVDVCBhbmQgL1NFUlZFUiBzd2l0Y2hlcyBhcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUgUkxPR0lOCiAgIGFuZCBURUxORVQgY29tbWFuZHMsIHNpbmNlIHRoZXNlIGNvbW1hbmRzIGFscmVhZHkgaW5jbHVkZSBhbiBpbXBsaWNpdAogICAvQ09OTkVDVCBhbmQgcHJlY2x1ZGUgYXV0b21hdGljIGVudHJ5IGludG8gc2VydmVyIG1vZGUuCgogICBUaGUgL0NPTk5FQ1QgYW5kIC9TRVJWRVIgc3dpdGNoZXMgYXJlIGVzcGVjaWFsbHkgdXNlZnVsIHdpdGggInNldCBob3N0CiAgICoiIGNvbm5lY3Rpb25zLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2FudCB0byBzdGFydCBhIEtlcm1pdCBzZXJ2ZXIKICAgb24gc29ja2V0IDMwMDAgb2YgeW91ciBUQ1AgaG9zdC4gTm9ybWFsbHkgeW91IHdvdWxkIGhhdmUgdG8gZ2l2ZSB0aGUKICAgY29tbWFuZDoKCiAgc2V0IGhvc3QgKiAzMDAwCgogICBhbmQgdGhlbiB3YWl0IGZvciBhIGNvbm5lY3Rpb24gdG8gY29tZSBpbiwgYW5kIG9ubHkgdGhlbiBjb3VsZCB5b3UKICAgZ2l2ZSB0aGUgU0VSVkVSIGNvbW1hbmQgKG9yIGVsc2UgZGVmaW5lIGEgbWFjcm8gdG8gZG8gdGhpcywgYW5kIHRoZW4KICAgZXhlY3V0ZSB0aGUgbWFjcm8pLiBOb3cgeW91IGNhbiBkbyBpdCBpbiBvbmUgc3RlcDoKCiAgc2V0IGhvc3QgL3NlcnZlciAqIDMwMDAKCiAgIFRoaXMgdGVsbHMgQy1LZXJtaXQgdG8gd2FpdCBmb3IgdGhlIGNvbm5lY3Rpb24gYW5kIHRoZW4gZW50ZXIgc2VydmVyCiAgIG1vZGUgb25jZSBpdCBjb21lcyBpbiwgbm8gbWF0dGVyIGhvdyBsb25nIGl0IHRha2VzLiBTaW1pbGFybHksICJzZXQKICAgaG9zdCAvY29ubiAqIiBjYW4gYmUgdXNlZCB0byB3YWl0IGZvciBhICJjaGF0IiBjb25uZWN0aW9uIHRvIGNvbWUgaW4uCgogICBBbm90aGVyIHNldCBvZiBzd2l0Y2hlcyBpcyBhdmFpbGFibGUgaW4gVk1TIG9ubHksIGZvciB1c2Ugb25seSB3aXRoCiAgIFNFVCBMSU5FOgoKICAgL1NIQVJFCiAgICAgICAgICBBbGxvd3MgdGhlIFNFVCBMSU5FIGRldmljZSB0byBiZSBvcGVuZWQgaW4gc2hhcmVkIG1vZGUuCiAgICAgICAgICBOb3JtYWxseSBpdCBtYWtlcyBubyBzZW5zZSB0byBvcGVuIGEgc2VyaWFsIGRldmljZSBpbiBzaGFyZWQKICAgICAgICAgIG1vZGUsIGJ1dCBpdCdzIG5lY2Vzc2FyeSB3aGVuIEMtS2VybWl0IGlzIHJ1bm5pbmcgaW4gYW4KICAgICAgICAgIGVudmlyb25tZW50IHN1Y2ggYXMgREVDSW50YWN0LCB0aGF0IG9wZW5zIHlvdXIgam9iJ3MKICAgICAgICAgIGNvbnRyb2xsaW5nIHRlcm1pbmFsIGluIHN1Y2ggYSB3YXkgdGhhdCBDLUtlcm1pdCBjYW4ndCBvcGVuIGl0CiAgICAgICAgICB0b28sIHVubGVzcyBpdCBlbmFibGVzIFNIQVJFIHByaXZpbGVnZS4gTm90ZTogU0hBUkUgcHJpdmlsZWdlCiAgICAgICAgICBpcyByZXF1aXJlZC4KCiAgIC9OT1NIQVJFCiAgICAgICAgICBSZXF1aXJlcyB0aGF0IHRoZSBTRVQgTElORSBkZXZpY2Ugbm90IGJlIGluIHVzZSBieSBhbnkgb3RoZXIKICAgICAgICAgIHByb2Nlc3MgaW4gb3JkZXIgZm9yIGl0IHRvIGJlIHN1Y2Nlc3NmdWxseSBvcGVuZWQgYnkgQy1LZXJtaXQuCiAgICAgICAgICBJZiBuZWl0aGVyIC9TSEFSRSBub3IgL05PU0hBUkUgaXMgc3BlY2lmaWVkLCAvTk9TSEFSRSBpcyB1c2VkLgoKICAgVGhlIHNlY29uZCBncm91cCBvZiBzd2l0Y2hlcyBpczoKCiAgIC9OTy1URUxORVQtSU5JVAogICAgICAgICAgRG8gbm90IHNlbmQgaW5pdGlhbCBUZWxuZXQgbmVnb3RpYXRpb25zIGV2ZW4gaWYgdGhpcyBpcyBhCiAgICAgICAgICBUZWxuZXQgcG9ydC4KCiAgIC9SQVctU09DS0VUCiAgICAgICAgICBUaGlzIGlzIGEgY29ubmVjdGlvbiB0byBhIHJhdyBUQ1Agc29ja2V0IChbMzgzXVNlY3Rpb24gMi4zLjUpLgoKICAgL1JMT0dJTgogICAgICAgICAgVXNlIFJsb2dpbiBwcm90b2NvbCBldmVuIGlmIHRoaXMgaXMgbm90IGFuIFJsb2dpbiBwb3J0LgoKICAgL1RFTE5FVAogICAgICAgICAgU2VuZCBpbml0aWFsIFRlbG5ldCBuZWdvdGlhdGlvbnMgZXZlbiBpZiB0aGlzIGlzIG5vdCBhIFRlbG5ldAogICAgICAgICAgcG9ydC4KCiAgIEFzIG9mIEMtS2VybWl0IDcuMCBhbmQgSzk1IDEuMS4xOSwgdGhlIFRFTE5FVCBjb21tYW5kIGluY2x1ZGVzIGFuCiAgIGltcGxpY2l0IC9URUxORVQgc3dpdGNoLiBTbyBpZiB5b3UgVEVMTkVUIHRvIGEgbm9uLVRFTE5FVCBwb3J0LCBLZXJtaXQKICAgc2VuZHMgaW5pdGlhbCBUZWxuZXQgbmVnb3RpYXRpb25zLiBUaGlzIG1ha2VzIHNlbnNlLCBzaW5jZSB0aGF0J3Mgd2hhdAogICAidGVsbmV0IiBtZWFucy4KCiAgIElmIHlvdSB3YW50IHRvIG1ha2UgYSBjb25uZWN0aW9uIHRvIGEgbm9uLVRlbG5ldCBwb3J0IHdpdGhvdXQgc2VuZGluZwogICBpbml0aWFsIFRlbG5ldCBuZWdvdGlhdGlvbnMsIHVzZToKCiAgc2V0IGhvc3QgWyAvY29ubmVjdCBdIG5hbWUtb3ItYWRkcmVzcyBwb3J0CgogICBvcjoKCiAgdGVsbmV0IG5hbWUtb3ItYWRkcmVzcyBwb3J0IC9uby10ZWxuZXQtaW5pdAoKICAgQWRkaXRpb25hbCBzd2l0Y2hlcyBtaWdodCBiZSBhZGRlZCBpbiB0aGUgZnV0dXJlOyB0eXBlICJzZXQgaG9zdCA/IiBvcgogICAic2V0IGxpbmUgPyIgdG8gc2VlIGEgY3VycmVudCBsaXN0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDIuMS4gRGlhbGluZwoKICAgQXV0b21hdGljIHJlZGlhbGluZyBpcyBpbGxlZ2FsIG9yIHJlc3RyaWN0ZWQgaW4gbWFueSBjb3VudHJpZXMsIHNvCiAgIHVudGlsIEMtS2VybWl0IDcuMCwgaXQgd2FzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGkuZS4gdW50aWwgYSBTRVQgRElBTAogICBSRVRSSUVTIGNvbW1hbmQgd2FzIGdpdmVuLiBJbiBDLUtlcm1pdCA3LjAsIGlmIG5vIFNFVCBESUFMIFJFVFJJRVMKICAgY29tbWFuZCBoYXMgYmVlbiBnaXZlbiwgYSBkZWZhdWx0IGlzIHBpY2tlZCBkeW5hbWljYWxseSBhdCBESUFMIHRpbWUKICAgYmFzZWQgb24gdGhlIGNhbGxpbmcgY291bnRyeSBjb2RlLCBpZiBrbm93bi4gQXQgdGhpcyB3cml0aW5nLCB0aGUgb25seQogICBjb3VudHJ5IGNvZGUga25vd24gdG8gaGF2ZSBubyByZXN0cmljdGlvbnMgb24gYXV0b21hdGljIHJlZGlhbGluZyBpcwogICAxLiBTbyBpbiB0aGlzIGNhc2UgYSBsaW1pdCBvZiAxMCBpcyBjaG9zZW47IG90aGVyd2lzZSAxLiBJZiB5b3UgaGF2ZQogICBub3QgZ2l2ZW4gYW4gZXhwbGljaXQgU0VUIERJQUwgUkVUUklFUyBjb21tYW5kLCBTSE9XIERJQUwgc2hvd3MgdGhlCiAgIHZhbHVlIGFzICIoYXV0bykiLCBhbmQgdGhlbiB0aGUgdmFsdWUgYWN0dWFsbHkgdXNlZCBpcyBzaG93biB3aGVuIHlvdQogICBnaXZlIHRoZSBESUFMIGNvbW1hbmQuCgogICBBcyBvZiBDLUtlcm1pdCA3LjAsIGF1dG9tYXRpYyByZWRpYWxpbmcgaXMgYXV0b21hdGljYWxseSBjYW5jZWxlZCBpZgogICB0aGUgY2FsbCBjb3VsZCBub3QgYmUgcGxhY2VkIGJlY2F1c2Ugbm8gZGlhbHRvbmUgd2FzIGRldGVjdGVkLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4xLjEuIFRoZSBEaWFsIFJlc3VsdCBNZXNzYWdlCgogICBJZiBESUFMIERJU1BMQVkgaXMgbm90IE9OLCB0aGUgIkNhbGwgY29tcGxldGUiIG1lc3NhZ2Ugbm93IHNob3dzIHRoZQogICBtb2RlbSdzIGNhbGwgcmVzdWx0IG1lc3NhZ2UsIGZvciBleGFtcGxlOgoKICBEaWFsaW5nOiAuLi4KICBDYWxsIGNvbXBsZXRlOiAiQ09OTkVDVCAzMTIwMC9BUlEvVjMyL0xBUE0vVjQyQklTIgoKICAgVGhlIGV4YWN0IGZvcm1hdCBhbmQgY29udGVudHMgb2YgdGhpcyBtZXNzYWdlLCBvZiBjb3Vyc2UsIGRlcGVuZHMgb24KICAgdGhlIG1ha2UsIG1vZGVsLCBhbmQgY29uZmlndXJhdGlvbiBvZiB5b3VyIG1vZGVtLCBzbyB1c2UgeW91ciBtb2RlbQogICBtYW51YWwgdG8gaW50ZXJwcmV0IGl0LiBUaGUgY2FsbCByZXN1bHQgbWVzc2FnZSBpcyBhbHNvIGF2YWlsYWJsZSBpbgogICBDLUtlcm1pdCdzIFx2KGRpYWxyZXN1bHQpIHZhcmlhYmxlLgoKICBDLUtlcm1pdD4gZWNobyBcdihkaWFscmVzdWx0KQogIENPTk5FQ1QgMzEyMDAvQVJRL1YzMi9MQVBNL1Y0MkJJUwogIEMtS2VybWl0PiBlY2hvIFNwZWVkID0gXGZ3b3JkKFx2KGRpYWxyZXN1bHQpLDIpCiAgU3BlZWQgPSAzMTIwMAogIEMtS2VybWl0PgoKICAgU3VwcG9zZSB5b3VyIG1vZGVtIHJlcG9ydHMgdGhlIG1vZHVsYXRpb24gc3BlZWQgYXMgc2hvd24gYWJvdmUgYW5kIHlvdQogICB3YW50IHRvIGVuc3VyZSB5b3VyIGNhbGwgaXMgY29tcGxldGVkIGF0IChzYXkpIDI0MDAwIGJwcyBvciBtb3JlLiBZb3UKICAgY2FuIHVzZSBhIGxpdHRsZSBtYWNybyB0byBkbyB0aGUgam9iOgoKZGVmaW5lIEhTRElBTCB7ICAgICAgICAgICAgICAgIDsgSGlnaCBTcGVlZCBESUFMCiAgICBsb2NhbCBcJXMKICAgIGlmIDwgXHYoYXJnYykgMSBpZiBub3QgZGVmIFx2KGRpYWxudW1iZXIpIGVuZCAxIFVzYWdlOiBcJTAgbnVtYmVyCiAgICBzZXQgZGlhbCByZXRyaWVzIDEwMAogICAgc2V0IGRpYWwgaW50ZXJ2YWwgMQogICAgd2hpbGUgdHJ1ZSB7CiAgICAgICAgZGlhbCBcJSoKICAgICAgICBpZiBmYWlsIGVuZCAxIERJQUwgZmFpbGVkLgogICAgICAgIGFzZyBcJXMgXGZ3b3JkKFx2KGRpYWxyZXN1bHQpLDIpCiAgICAgICAgaWYgZGVmIFwlcyBpZiBudW1lcmljIFwlcyBpZiBub3QgPCBcJXMgMjQwMDAgYnJlYWsKICAgIH0KfQoKICAgKFNlZSBbMzg0XVNlY3Rpb24gNy41IGFib3V0IHRoZSBcJSogdmFyaWFibGUuKQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4xLjIuIExvbmctRGlzdGFuY2UgRGlhbGluZyBDaGFuZ2VzCgogICBEdWUgdG8gdGhlIGdsdXQgb2YgY2VsbCBwaG9uZXMsIHBhZ2VycywgZmF4IG1hY2hpbmVzLCBJU1BzLCBldGMsIGFyZWEKICAgY29kZXMgYW5kIGRpYWxpbmcgcnVsZXMgYXJlIGNoYW5naW5nIGFsbCB0aGUgdGltZS4gSW4gdGhlIE5vcnRoCiAgIEFtZXJpY2FuIE51bWJlcmluZyBQbGFuIChOQU5QKSBjb3VudHJpZXMgKFVTQSwgQ2FuYWRhLCBldGMpLCBhcmVhCiAgIGNvZGVzIGFyZSBzcGxpdCBvciBvdmVybGF5ZWQgd2l0aCBpbmNyZWFzaW5nIGZyZXF1ZW5jeSwgYW5kIDEwLSBhbmQKICAgMTEtZGlnaXQgZGlhbGluZyBpcyBncmFkdWFsbHkgYmVjb21pbmcgdGhlIG5vcm0gZm9yIGxvY2FsIGNhbGxzLgogICBDaGFuZ2VzIGFyZSBvY2N1cnJpbmcgSW4gRXVyb3BlLCB0b28sIHBhcnRseSBmb3IgdGhlc2UgcmVhc29ucyBhbmQKICAgcGFydGx5IGJlY2F1c2Ugb2Ygc29tZSBuZXcgRUMgcnVsZXMuCgogICBJbiBGcmFuY2UsIGVmZmVjdGl2ZSAxOCBPY3RvYmVyIDE5OTYsIGFsbCBjYWxscywgZXZlbiBsb2NhbCBvbmVzLCBtdXN0CiAgIGJlIGRpYWxlZCB3aXRoIGFuIGFyZWEgY29kZS4gRnJlbmNoIGFyZWEgY29kZXMgYXJlIHByZXNlbnRseSAxLWRpZ2l0CiAgIG51bWJlcnMsIDEtNiwgYW5kIHRoZSBsb25nLWRpc3RhbmNlIGRpYWxpbmcgcHJlZml4IGlzIDAuIEFsbCBjYWxscwogICB3aXRoaW4gRnJhbmNlIGFyZSBjb25zaWRlcmVkIGxvbmcgZGlzdGFuY2UgYW5kIGJlZ2luIHdpdGggMDEsIDAyLCAuLi4sCiAgIDA2LgoKICAgRWZmZWN0aXZlIDEgTWF5IDE5OTcsIGFsbCBjYWxscyB3aXRoaW4gdGhlIFVTIHN0YXRlIG9mIE1hcnlsYW5kLCBldmVuCiAgIGxvY2FsIG9uZXMsIG11c3QgYmUgZGlhbGVkIHdpdGggYW4gYXJlYSBjb2RlIGJ1dCB3aXRob3V0IHRoZQogICBsb25nLWRpc3RhbmNlIHByZWZpeCAtLSB0aGlzIGlzIHRoZSBub3cgd2lkZWx5LWtub3duIE5vcnRoIEFtZXJpY2FuCiAgIHBoZW5vbWVub24gb2YgInRlbiBkaWdpdCBkaWFsaW5nIi4gVGhlIHNhbWUgaXMgaGFwcGVuaW5nIGVsc2V3aGVyZSAtLQogICBtYW55IGNpdGllcyBpbiBGbG9yaWRhIGFkb3B0ZWQgMTAtZGlnaXQgZGlhbGluZyBpbiAxOTk4LgoKICAgSW4gSXRhbHkgYmVnaW5uaW5nIDE5IEp1bmUgMTk5OCwgYWxsIGNhbGxzIHRvIGZpeGVkIChhcyBvcHBvc2VkIHRvCiAgIG1vYmlsZSkgbnVtYmVycyBtdXN0IGJlIHByZWZpeGVkIGJ5IDAuIFdoZW4gY2FsbGluZyBpbnRvIEl0YWx5IGZyb20KICAgb3V0c2lkZSwgdGhlIDAgbXVzdCBmb2xsb3cgdGhlIGNvdW50cnkgY29kZSAoMzkpLiBDYWxscyB0byBjZWxsCiAgIHBob25lcywgaG93ZXZlciwgbXVzdCBiZSBwbGFjZWQgd2l0aG91dCB0aGUgMC4gVGhlbiBvbiAyOSBEZWNlbWJlcgogICAyMDAwLCB0aGUgMCB3aWxsIGJlY29tZSBhIDQgKGZvciBjYWxsaW5nIGZpeGVkIG51bWJlcnMpIGFuZCBhIHByZWZpeAogICBvZiAzIG11c3QgdXNlZCBmb3IgY2FsbGluZyBtb2JpbGUgcGhvbmVzLiBNb3JlIGluZm8gYXQ6CiAgIGh0dHA6Ly93d3cudGVsZWNvbWl0YWxpYS5pdC9ucG5uLy4KCiAgIEluIFNwYWluLCBlZmZlY3RpdmUgNCBBcHJpbCAxOTk4LCB3aXRoIGhhcmQgY3V0b3ZlciBvbiAxOCBKdWx5IDE5OTgsCiAgIGFsbCBjYWxscyB3aXRoaW4gdGhlIGNvdW50cnkgbXVzdCBiZSBkaWFsZWQgd2l0aCA5IGRpZ2l0cywgYW5kIGFsbAogICBjYWxscyBmcm9tIG91dHNpZGUgU3BhaW4gbXVzdCBhbHNvIGJlIGRpYWxlZCB3aXRoIDkgZGlnaXRzIChhZnRlciB0aGUKICAgY291bnRyeSBjb2RlLCAzNCkuIFRoZSBuZXcgOS1kaWdpdCBudW1iZXJzIGFsbCBiZWdpbiB3aXRoICI5Ii4gTW9yZQogICBpbmZvIGF0OiBbMzg1XWh0dHA6Ly93d3cudGVsZWZvbmljYS5lcy9jYW1iaW9kZW51bWVyYWNpb24vCgogICBTZXZlcmFsIG5ldyBkaWFsaW5nIGZlYXR1cmVzIGFuZCBjb21tYW5kcyBoYXZlIGJlZW4gYWRkZWQgaW4gdmVyc2lvbgogICA2LjEgYW5kIDcuMCB0byBhZGRyZXNzIHRoZXNlIGNoYW5nZXMuCgogICBDLUtlcm1pdCA2LjAgYW5kIEtlcm1pdCA5NSAxLjEuMTEgYW5kIGVhcmxpZXIgaGFuZGxlIHRoZSBGcmVuY2gKICAgc2l0dWF0aW9uIHZpYSBhIHJlYXNvbmFibGUgc3VidGVyZnVnZSAoc2V0dGluZyB0aGUgbG9jYWwgYXJlYSBjb2RlIHRvCiAgIGEgbm9uZXhpc3RlbnQgb25lKSwgYnV0IGRpZCBub3QgaGFuZGxlICJ0ZW4tZGlnaXQgZGlhbGluZyIgd2VsbCBhdAogICBhbGw7IHRoZSByZWNvbW1lbmRlZCB0ZWNobmlxdWUgd2FzIHRvIGNoYW5nZSB0aGUgbG9uZy1kaXN0YW5jZSBkaWFsaW5nCiAgIHByZWZpeCB0byBub3RoaW5nLCBidXQgdGhpcyBkZWZlYXRlZCBLZXJtaXQncyAibGlzdCBudW1iZXJzIGZvciBvbmUKICAgbmFtZSIgZmVhdHVyZSB3aGVuIHRoZSBudW1iZXJzIHdlcmUgaW4gZGlmZmVyZW50IGxvY2F0aW9ucy4gRm9yCiAgIGV4YW1wbGU6CgogIHNldCBkaWFsIGxkLXByZWZpeAogIGRpYWwgb25saW5lc2VydmljZQoKICAgd2hlcmUgIm9ubGluZXNlcnZpY2UiIGlzIGEgZGlhbGluZyBkaXJlY3RvcnkgZW50cnkgbmFtZSBjb3JyZXNwb25kaW5nCiAgIHRvIGVudHJpZXMgdGhhdCBhcmUgaW4gKHNheSkgTWFyeWxhbmQgYXMgd2VsbCBhcyBvdGhlciBzdGF0ZXMsIHdvdWxkCiAgIG5vdCBjb3JyZWN0bHkgZGlhbCB0aGUgbnVtYmVycyBub3QgaW4gTWFyeWxhbmQuCgogICBBIG5ldyBjb21tYW5kIGxldHMgeW91IHNwZWNpZnkgYSBsaXN0IG9mIGFyZWEgY29kZXMgdG8gYmUgY29uc2lkZXJlZAogICBsb2NhbCwgZXhjZXB0IHRoYXQgdGhlIGFyZWEgY29kZSBtdXN0IGJlIGRpYWxlZDoKCiAgIFNFVCBESUFMIExDLUFSRUEtQ09ERVMgWyBhcmVhY29kZSBbIGFyZWFjb2RlIFsgYXJlYWNvZGUgWyAuLi4gXSBdIF0gXQogICAgICAgICAgVGhlIGxpc3QgbWF5IGluY2x1ZGUgdXAgdG8gMzIgYXJlYSBjb2Rlcy4gSWYgYSBudW1iZXIgaXMgY2FsbGVkCiAgICAgICAgICB3aG9zZSBhcmVhIGNvZGUgaXMgaW4gdGhpcyBsaXN0LCBpdCBpcyBkaWFsZWQgV0lUSE9VVCB0aGUKICAgICAgICAgIGxvbmctZGlzdGFuY2UgcHJlZml4LCBidXQgV0lUSCB0aGUgYXJlYSBjb2RlLgoKICAgU28gaW4gTWFyeWxhbmQsIHdoaWNoIChsYXN0IHRpbWUgd2UgbG9va2VkKSBoYXMgdHdvIGFyZWEgY29kZXMsIDQxMAogICBhbmQgMzAxLCB0aGUgc2V0dXAgd291bGQgYmU6CgogIFNFVCBESUFMIExDLUFSRUEtQ09ERVMgNDEwIDMwMQoKICAgRXhhbXBsZToKCiAgU0VUIERJQUwgTEQtUFJFRklYIDEKICBTRVQgRElBTCBBUkVBLUNPREUgMzAxCiAgU0VUIERJQUwgTEMtQVJFQS1DT0RFUyA0MTAgMzAxIDwtLSBBcmVhIGNvZGVzIGluIDEwLWRpZ2l0IGRpYWxpbmcgcmVnaW9uCiAgRElBTCArMSAoMzAxKSA3NjUtNDMyMSAgICAgICAgIDwtLSBEaWFscyAzMDE3NjU0MzIxICAobG9jYWwgd2l0aCBhcmVhIGNvZGUpCiAgRElBTCArMSAoNDEwKSA3NjUtNDMyMSAgICAgICAgIDwtLSBEaWFscyA0MTA3NjU0MzIxICAobG9jYWwgd2l0aCBhcmVhIGNvZGUpCiAgRElBTCArMSAoMjEyKSA3NjUtNDMyMSAgICAgICAgIDwtLSBEaWFscyAxMjEyNzY1NDMyMSAobG9uZyBkaXN0YW5jZSkKCiAgIFRoZSBTRVQgRElBTCBMQy1BUkVBLUNPREVTIGNvbW1hbmQgZG9lcyBub3QgcmVwbGFjZSB0aGUgU0VUIERJQUwKICAgQVJFQS1DT0RFIGNvbW1hbmQuIFRoZSBsYXR0ZXIgc3BlY2lmaWVzIHRoZSBhcmVhIGNvZGUgeW91IGFyZSBkaWFsaW5nCiAgIGZyb20uIElmIHRoZSBjYWxsZWQgbnVtYmVyIGlzIGluIHRoZSBzYW1lIGFyZWEgY29kZSwgdGhlbiB0aGUgYXJlYQogICBjb2RlIGlzIGRpYWxlZCBpZiBpdCBpcyBhbHNvIGluIHRoZSBMQy1BUkVBLUNPREVTIGxpc3QsIGFuZCBpdCBpcyBub3QKICAgZGlhbGVkIG90aGVyd2lzZS4gU28gaWYgIjMwMSIgaGFkIG5vdCBhcHBlYXJlZCBpbiB0aGUgTEMtQVJFQS1DT0RFUwogICBsaXN0IGluIHRoZSBwcmV2aW91cyBleGFtcGxlOgoKICBTRVQgRElBTCBMRC1QUkVGSVggMQogIFNFVCBESUFMIEFSRUEtQ09ERSAzMDEKICBTRVQgRElBTCBMQy1BUkVBLUNPREVTIDQxMCAgICAgPC0tIEFyZWEgY29kZXMgaW4gMTAtZGlnaXQgZGlhbGluZyByZWdpb24KICBESUFMICsxICgzMDEpIDc2NS00MzIxICAgICAgICAgPC0tIERpYWxzIDc2NTQzMjEgICAgIChsb2NhbCkKICBESUFMICsxICg0MTApIDc2NS00MzIxICAgICAgICAgPC0tIERpYWxzIDQxMDc2NTQzMjEgIChsb2NhbCB3aXRoIGFyZWEgY29kZSkKICBESUFMICsxICgyMTIpIDc2NS00MzIxICAgICAgICAgPC0tIERpYWxzIDEyMTI3NjU0MzIxIChsb25nIGRpc3RhbmNlKQoKICAgVGhlIG5ldyBLZXJtaXQgdmVyc2lvbnMgYWxzbyBhZGQgYSBMb2NhbCBDYWxsIFByZWZpeCBhbmQgTG9jYWwgQ2FsbAogICBTdWZmaXgsIGluIGNhc2UgeW91IGhhdmUgYW55IG5lZWQgZm9yIGl0LiBUaGVzZSBhcmUgYWRkZWQgdG8gdGhlCiAgIGJlZ2lubmluZyBhbmQgb2YgbG9jYWwgcGhvbmUgbnVtYmVycyAoaS5lLiBudW1iZXJzIHRoYXQgYXJlIG5vdAogICBsb25nLWRpc3RhbmNlIG9yIGludGVybmF0aW9uYWwpLiBFeGFtcGxlczoKCiAgU0VUIERJQUwgTEQtUFJFRklYIDEKICBTRVQgRElBTCBMQy1QUkVGSVggOQogIFNFVCBESUFMIExDLVNVRkZJWCAqCiAgU0VUIERJQUwgTEMtQVJFQS1DT0RFUyA0MTAgICAgIDwtLSBBcmVhIGNvZGVzIGluIDEwLWRpZ2l0IGRpYWxpbmcgcmVnaW9uCiAgU0VUIERJQUwgQVJFQS1DT0RFIDMwMQogIERJQUwgKzEgKDMwMSkgNzY1LTQzMjEgICAgICAgICA8LS0gRGlhbHMgOTc2NTQzMjEqICAgICAobG9jYWwpCiAgRElBTCArMSAoNDEwKSA3NjUtNDMyMSAgICAgICAgIDwtLSBEaWFscyA5NDEwNzY1NDMyMSogIChsb2NhbCB3aXRoIGFyZWEgY29kZSkKICBESUFMICsxICgyMTIpIDc2NS00MzIxICAgICAgICAgPC0tIERpYWxzIDEyMTI3NjU0MzIxICAgKGxvbmcgZGlzdGFuY2UpCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAyLjEuMy4gRm9yY2luZyBMb25nLURpc3RhbmNlIERpYWxpbmcKCiAgIFN1cHBvc2UgYSBudW1iZXIgaXMgaW4geW91ciBjb3VudHJ5IGFuZCBhcmVhLCBidXQgZm9yIHNvbWUgcmVhc29uIHlvdQogICBuZWVkIHRvIGRpYWwgaXQgbG9uZy1kaXN0YW5jZSBhbnl3YXkgKGFzIGlzIGFsd2F5cyB0aGUgY2FzZSBpbgogICBGcmFuY2UpLiBUaGVyZSBoYXZlIGFsd2F5cyBiZWVuIHZhcmlvdXMgd2F5cyB0byBoYW5kbGUgdGhpczoKCiAgICAxLiBUZW1wb3JhcmlseSBzZXQgeW91ciBhcmVhIGNvZGUgdG8gYSBkaWZmZXJlbnQgKG9yIG5vbmV4aXN0ZW50IG9yCiAgICAgICBpbXBvc3NpYmxlKSBvbmUgKGJ1dCB0aGlzIHJlcXVpcmVkIGtub3dsZWRnZSBvZiB3aGljaCBhcmVhIGNvZGVzCiAgICAgICB3ZXJlIG5vbmV4aXN0ZW50IG9yIGltcG9zc2libGUgaW4gZWFjaCBjb3VudHJ5KS4KICAgIDIuIERpYWwgdGhlIG51bWJlciBsaXRlcmFsbHkgaW5zdGVhZCBvZiB1c2luZyB0aGUgcG9ydGFibGUgZm9ybWF0LAogICAgICAgYnV0IHRoaXMgZGVmZWF0cyB0aGUgcHVycG9zZSBvZiB0aGUgcG9ydGFibGUgZGlhbGluZyBkaXJlY3RvcnkuCgogICBOb3cgdGhlcmUgaXMgYWxzbyBhIG5ldyBjb21tYW5kIHRoYXQsIHZlcnkgc2ltcGx5LCBjYW4gZm9yY2UKICAgbG9uZy1kaXN0YW5jZSBkaWFsaW5nOgoKICAgU0VUIERJQUwgRk9SQ0UtTE9ORy1ESVNUQU5DRSB7IE9OLCBPRkYgfQogICAgICAgICAgSWYgYSBjYWxsIGlzIHBsYWNlZCB0byBhIHBvcnRhYmxlIHBob25lIG51bWJlciB3aXRoaW4gdGhlIHNhbWUKICAgICAgICAgIGNvdW50cnkgY29kZSBhcyB0aGUgY2FsbGluZyBudW1iZXIsIGl0IGlzIGRpYWxlZCB3aXRoIHRoZQogICAgICAgICAgbG9uZy1kaXN0YW5jZSBwcmVmaXggYW5kIHRoZSBhcmVhIGNvZGUgaWYgRk9SQ0UtTE9ORy1ESVNUQU5DRQogICAgICAgICAgaXMgT04uIElmIE9GRiwgdGhlIHJlZ3VsYXIgcnVsZXMgYW5kIHByb2NlZHVyZXMgYXBwbHkuCgogICBFeGFtcGxlIChGcmFuY2UpOgoKICBTRVQgRElBTCBDT1VOVFJZLUNPREUgMzMKICBTRVQgRElBTCBBUkVBLUNPREUgNgogIFNFVCBESUFMIEZPUkNFLUxPTkctRElTVEFOQ0UgT04KCiAgIChJbiBmYWN0LCBTRVQgRElBTCBDT1VOVFJZLUNPREUgMzMgYXV0b21hdGljYWxseSBzZXRzIERJQUwKICAgRk9SQ0UtTE9ORy1ESVNUQU5DRSBPTi4uLikKCiAgIEV4YW1wbGUgKFVTQSwgZm9yIGEgY2VydGFpbiB0eXBlIG9mIHJldmVyc2UtY2hhcmdlIGNhbGxpbmcgaW4gd2hpY2gKICAgdGhlIGNhbGxlZCBudW1iZXIgbXVzdCBhbHdheXMgYmUgZnVsbHkgc3BlY2lmaWVkKToKCiAgU0VUIERJQUwgUFJFRklYIDE4MDAyNjY2MzI4JCAgICAgOyAxLTgwMC1DT0xMRUNUCiAgU0VUIERJQUwgQ09VTlRSWS1DT0RFIDEKICBTRVQgRElBTCBBUkVBLUNPREUgMjEyCiAgU0VUIERJQUwgRk9SQ0UtTE9ORy1ESVNUQU5DRSBPTgoKICAgRXhhbXBsZSAoVG9yb250bywgd2hlcmUgY2FsbHMgdG8gZXhjaGFuZ2UgOTc2IHdpdGhpbiBhcmVhIGNvZGUgNDE2CiAgIG11c3QgYmUgZGlhbGVkIGFzIGxvbmcgZGlzdGFuY2UsIGV2ZW4gd2hlbiB5b3UgYXJlIGRpYWxpbmcgZnJvbSBhcmVhCiAgIGNvZGUgNDE2KToKCiAgU0VUIERJQUwgQ09VTlRSWS1DT0RFIDEKICBTRVQgRElBTCBBUkVBLUNPREUgNDE2CiAgU0VUIERJQUwgRk9SQ0UtTE9ORy1ESVNUQU5DRSBPTgogIERJQUwgKzEgKDQxNikgOTc2LXh4eHgKCiAgIElmIGRpYWxpbmcgbWV0aG9kcyB3ZXJlIGNvbnNpc3RlbnQgYW5kIHNlbnNpYmxlLCBvZiBjb3Vyc2UgaXQgd291bGQgYmUKICAgcG9zc2libGUgdG8gYWx3YXlzIGRpYWwgZXZlcnkgZG9tZXN0aWMgY2FsbCBhcyBpZiBpdCB3ZXJlIGxvbmcKICAgZGlzdGFuY2UuIEJ1dCBpbiBtYW55IGxvY2F0aW9ucyB0aGlzIGRvZXNuJ3Qgd29yayBvciBpZiBpdCBkb2VzLCBpdAogICBjb3N0cyBleHRyYS4gVGhlIGZvbGxvd2luZyBtYWNybyBjYW4gYmUgdXNlZCBmb3IgZGlhbGluZyBhbnkgZ2l2ZW4KICAgbnVtYmVyIHdpdGggZm9yY2VkIGxvbmctZGlzdGFuY2UgZm9ybWF0OgoKICBkZWZpbmUgTERJQUwgewogICAgICBsb2NhbCBcJXgKICAgICAgc2V0IGRpYWwgZm9yY2UtbG9uZy1kaXN0YW5jZSBvbgogICAgICBkaWFsIFwlKgogICAgICBhc2cgXCV4IFx2KHN1Y2Nlc3MpCiAgICAgIHNldCBkaWFsIGZvcmNlLWxvbmctZGlzdGFuY2Ugb2ZmCiAgICAgIGVuZCBcJXgKICB9CgogICAoU2VlIFszODZdU2VjdGlvbiA3LjUgYWJvdXQgdGhlIFwlKiB2YXJpYWJsZS4pCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAyLjEuNC4gRXhjaGFuZ2UtU3BlY2lmaWMgRGlhbGluZyBEZWNpc2lvbnMKCiAgIFRoaXMgYXBwbGllcyBtYWlubHkgdG8gdGhlIE5vcnRoIEFtZXJpY2FuIE51bWJlcmluZyBQbGFuIChOQU5QKS4gUmVmZXIKICAgdG8gdGhlIHNlY3Rpb24gIkFsdGVybmF0aXZlIG5vdGF0aW9ucyIgaW4gWzM4N11Vc2luZyBDLUtlcm1pdCAybmQKICAgRWRpdGlvbiwgcGFnZXMgMTA2LTEwNywgYW5kIHRoZSBzdG9yeSBhYm91dCBUb3JvbnRvIG9uIHBhZ2UgMTEwLiBVc2luZwogICB0aGUgbmV3IExDLUFSRUEtQ09ERVMgbGlzdCwgd2UgY2FuIGFkZHJlc3MgdGhlIHByb2JsZW0gYnkgdHJlYXRpbmcgdGhlCiAgIGV4Y2hhbmdlIGFzIHBhcnQgb2YgdGhlIGFyZWEgY29kZToKCiAgU0VUIERJQUwgTEQtUFJFRklYIDEKICBTRVQgRElBTCBBUkVBLUNPREUgNDE2CiAgU0VUIERJQUwgTEMtQVJFQS1DT0RFUyA5MDUyNzYKICBESUFMICsxIDQxNiA3NjUgNDMyMSAgICAgICAgICAgICAgIDwtLSA3NjU0MzIxICAgICAgKGxvY2FsKQogIERJQUwgKzEgOTA1IDI3NiA0MzIxICAgICAgICAgICAgICAgPC0tIDkwNTI3NjQzMjEgICAobG9jYWwgd2l0aCBhcmVhIGNvZGUpCiAgRElBTCArMSA5MDUgNTI4IDQzMjEgICAgICAgICAgICAgICA8LS0gMTkwNTUyODQzMjEgIChsb25nIGRpc3RhbmNlKQoKICAgVGhlIHNhbWUgdGVjaG5pcXVlIGNhbiBiZSB1c2VkIGluIE1hc3NhY2h1c2V0dHMgKHN0b3J5IGF0IHRvcCBvZiBwYWdlCiAgIDExMSkgYW5kIGluIGFueSBvdGhlciBwbGFjZSB3aGVyZSBkaWFsaW5nIHRvIHNvbWUgZXhjaGFuZ2VzIHdpdGhpbiBhCiAgIHBhcnRpY3VsYXIgYXJlYSBjb2RlIGlzIGxvY2FsLCBidXQgdG8gb3RoZXJzIGluIHRoZSBzYW1lIGFyZWEgY29kZSBpcwogICBsb25nIGRpc3RhbmNlLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4xLjUuIENhdXRpb25zIGFib3V0IENoZWFwZXN0LUZpcnN0IERpYWxpbmcKCiAgIEtlcm1pdCBkb2VzIG5vdCBtYWludGFpbiBhIGtub3dsZWRnZSBiYXNlIG9mIHRlbGVwaG9ueSBpbmZvcm1hdGlvbjsgaXQKICAgb25seSBwcm92aWRlcyB0aGUgdG9vbHMgdG8gbGV0IHlvdSBlbnRlciBhIHBob25lIG51bWJlciBpbiBhIHN0YW5kYXJkCiAgIGZvcm1hdCBhbmQgZGlhbCBpdCBjb3JyZWN0bHkgZnJvbSBhbnkgbG9jYXRpb24gaW4gbW9zdCBjYXNlcy4KCiAgIEluIHBhcnRpY3VsYXIsIEtlcm1pdCBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIHRoZSBjaGFyZ2luZyBtZXRob2QgZnJvbQogICB0aGUgZGlhbGluZyBtZXRob2QuIElmIGEgY2FsbCB0aGF0IGlzIERJQUxFRCBhcyBsb25nLWRpc3RhbmNlIChlLmcuCiAgIGZyb20gMjEyIHRvIDcxOCBpbiBjb3VudHJ5IGNvZGUgMSkgaXMgbm90IENIQVJHRUQgYXMgbG9uZyBkaXN0YW5jZSwgd2UKICAgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB0aGF0IHdpdGhvdXQga2VlcGluZyBhIG1hdHJpeCBvZiBjaGFyZ2luZwogICBpbmZvcm1hdGlvbiBmb3IgZXZlcnkgYXJlYS1jb2RlIGNvbWJpbmF0aW9uIHdpdGhpbiBldmVyeSBjb3VudHJ5LCBhbmQKICAgYW55IHN1Y2ggbWF0cml4IHdvdWxkIGJlIG9ic29sZXRlIGZpdmUgbWludXRlcyBhZnRlciBpdCB3YXMKICAgY29uc3RydWN0ZWQuIFRodXMsICJjaGVhcGVzdC1maXJzdCIgc29ydGluZyBpcyBvbmx5IGFzIHJlbGlhYmxlIGFzIG91cgogICBhc3N1bXB0aW9uIHRoYXQgdGhlIGNoYXJnaW5nIG1ldGhvZCBmb2xsb3dzIHRoZSBkaWFsaW5nIG1ldGhvZC4gQSBnb29kCiAgIGlsbHVzdHJhdGlvbiB3b3VsZCBiZSBjZXJ0YWluIG9ubGluZSBzZXJ2aWNlcyB0aGF0IGhhdmUgdG9sbC1mcmVlCiAgIGRpYWx1cCBudW1iZXJzIHdoaWNoIHRoZXkgY2hhcmdlIHlvdSBhIHByZW1pdW0gKGluIHlvdXIgb25saW5lIHNlcnZpY2UKICAgYmlsbCkgZm9yIHVzaW5nLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4xLjYuIEJsaW5kIERpYWxpbmcgKERpYWxpbmcgd2l0aCBObyBEaWFsdG9uZSkKCiAgIEMtS2VybWl0J3MgaW5pdCBzdHJpbmcgZm9yIEhheWVzLWxpa2UgbW9kZW1zIGdlbmVyYWxseSBpbmNsdWRlcyBhbiBYNAogICBjb21tYW5kIHRvIGVuYWJsZSBhcyBtYW55IHJlc3VsdCBjb2RlcyBhcyBwb3NzaWJsZSwgc28gdGhhdCBLZXJtaXQgY2FuCiAgIHJlYWN0IGFwcHJvcHJpYXRlbHkgdG8gZGlmZmVyZW50IGZhaWx1cmUgcmVhc29ucy4gT25lIG9mIHRoZSByZXN1bHQKICAgY29kZXMgdGhhdCBYNCBlbmFibGVzIGlzICJOTyBESUFMVE9ORSIuIEEgcGVyaGFwcyBub3Qgb2J2aW91cyBzaWRlCiAgIGVmZmVjdCBvZiBlbmFibGluZyB0aGlzIHJlc3VsdCBjb2RlIHRoYXQgdGhlIG1vZGVtIG11c3QgaGVhciBkaWFsdG9uZQogICBiZWZvcmUgaXQgd2lsbCBkaWFsLgoKICAgSXQgaXMgYmVjb21pbmcgaW5jcmVhc2luZ2x5IG5lY2Vzc2FyeSB0byBmb3JjZSBhIG1vZGVtIHRvIGRpYWwgZXZlbgogICB0aG91Z2ggaXQgZG9lcyBub3QgaGVhciBhIGRpYWx0b25lIG9uIHRoZSBwaG9uZSBsaW5lOyBmb3IgZXhhbXBsZSwKICAgd2l0aCBQQlhzIHRoYXQgaGF2ZSBzdHJhbmdlIGRpYWx0b25lcywgb3Igd2l0aCBwaG9uZSBzeXN0ZW1zIGluCiAgIGRpZmZlcmVudCBjb3VudHJpZXMsIG9yIHdpdGggSVNETiBwaG9uZXMsIGV0Yy4gVGhpcyBpcyBjYWxsZWQgImJsaW5kCiAgIGRpYWxpbmciLgoKICAgQy1LZXJtaXQgNy4wIGhhcyB0d28gbmV3IGNvbW1hbmRzIHRvIGNvcGUgd2l0aCB0aGlzIHNpdHVhdGlvbjoKCiAgIFNFVCBESUFMIElHTk9SRS1ESUFMVE9ORSB7IE9OLCBPRkYgfQogICAgICAgICAgT0ZGICh0aGUgZGVmYXVsdCkgbWVhbnMgdG8gdGVsbCB0aGUgbW9kZW0gdG8gd2FpdCBmb3IgZGlhbHRvbmUKICAgICAgICAgIGJlZm9yZSBkaWFsaW5nLiBPTiBtZWFucyB0byBlbmFibGUgImJsaW5kIGRpYWxpbmciLCBpLmUuIHRlbGwKICAgICAgICAgIHRoZSBtb2RlbSBOT1QgdG8gd2FpdCBmb3IgZGlhbHRvbmUgYmVmb3JlIGRpYWxpbmcuIEdlbmVyYWxseQogICAgICAgICAgdGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgc2VuZGluZyBBVFgzIHRvIHRoZSBtb2RlbSBqdXN0IHByaW9yIHRvCiAgICAgICAgICBkaWFsaW5nLiBTRVQgTU9ERU0gVFlQRSB4eHggYW5kIHRoZW4gU0hPVyBNT0RFTSBkaXNwbGF5cwogICAgICAgICAgS2VybWl0J3MgYnVpbHQtaW4gImlnbm9yZSBkaWFsdG9uZSIgY29tbWFuZC4KCiAgIFNFVCBESUFMIENPTU1BTkQgSUdOT1JFLURJQUxUT05FIHRleHQKICAgICAgICAgIFRoaXMgbGV0cyB5b3UgY2hhbmdlIHRoZSBidWlsdC1pbiBpZ25vcmUtZGlhbHRvbmUgY29tbWFuZCAoc3VjaAogICAgICAgICAgYXMgQVRYMykgdG8gd2hhdGV2ZXIgeW91IGNob29zZSwgaW4gY2FzZSB0aGUgYnVpbHQtaW4gb25lIGRvZXMKICAgICAgICAgIG5vdCB3b3JrLCBvciBhbm90aGVyIGNvbW1hbmQgd29ya3MgYmV0dGVyLgoKICAgTm90ZXM6CiAgICAxLiBUaGUgaWdub3JlLWRpYWx0b25lIGNvbW1hbmQgaXMgbm90IHNlbnQgdW5sZXNzIFNFVCBESUFMCiAgICAgICBJR05PUkUtRElBTFRPTkUgaXMgT04uCiAgICAyLiBUaGUgQVRYMyBjb21tYW5kIGdlbmVyYWxseSBkaXNhYmxlcyBub3Qgb25seSBOTyBESUFMVE9ORSwgYnV0IGFsc28KICAgICAgIEJVU1kuIFNvIHRoaXMgd2lsbCBwcmV2ZW50IEtlcm1pdCBmcm9tIGRldGVjdGluZyB3aGVuIHRoZSBsaW5lIGlzCiAgICAgICBidXN5LiBUaGlzIGlzIGEgcHJvcGVydHkgb2YgdGhlIG1vZGVtLCBub3Qgb2YgS2VybWl0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4xLjcuIFRyaW1taW5nIHRoZSBEaWFsaW5nIERpYWxvZwoKICAgVGhlIGNvbW1hbmQ6CgogIFNFVCBNT0RFTSBDT01NQU5EIGFjdGlvbiBbIGNvbW1hbmQgXQoKICAgaXMgdXNlZCB0byBvdmVycmlkZSBLZXJtaXQncyBidWlsdC1pbiBtb2RlbSBjb21tYW5kcyBmb3IgZWFjaCBhY3Rpb24sCiAgIGZvciBlYWNoIGtpbmQgb2YgbW9kZW0gaW4gaXRzIGludGVybmFsIGRhdGFiYXNlLiBJZiB5b3UgaW5jbHVkZSBhCiAgIGNvbW1hbmQsIHRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbiBvbmUuIElmIHlvdSBvbWl0IHRoZQogICBjb21tYW5kLCB0aGlzIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBidWlsdC1pbiBjb21tYW5kLgoKICAgSWYgeW91IHdhbnQgdG8gb21pdCB0aGUgY29tbWFuZCBhbHRvZ2V0aGVyLCBzbyBLZXJtaXQgZG9lc24ndCBzZW5kIHRoZQogICBjb21tYW5kIGF0IGFsbCwgb3Igd2FpdCBmb3IgYSByZXNwb25zZSwgdXNlOgoKICBTRVQgTU9ERU0gQ09NTUFORCBhY3Rpb24ge30KCiAgIFRoYXQgaXMsIHNwZWNpZnkgYSBwYWlyIG9mIGVtcHR5IGJyYWNlcyBhcyB0aGUgY29tbWFuZCwgZm9yIGV4YW1wbGU6CgogIFNFVCBNT0RFTSBDT01NQU5EIEVSUk9SLUNPUlJFQ1RJT04gT04ge30KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuMS44LiBDb250cm9sbGluZyB0aGUgRGlhbGluZyBTcGVlZAoKICAgVGhlIHJhdGUgYXQgd2hpY2ggY2hhcmFjdGVycyBhcmUgc2VudCB0byB0aGUgbW9kZW0gZHVyaW5nIGRpYWxpbmcgaXMKICAgbm9ybWFsbHkgY29udHJvbGxlZCBieSB0aGUgYnVpbHQtaW4gbW9kZW0gZGF0YWJhc2UuIFlvdSBtaWdodCB3YW50IHRvCiAgIG92ZXJyaWRlIHRoaXMgaWYgS2VybWl0IHNlZW1zIHRvIGJlIGRpYWxpbmcgdG9vIHNsb3dseSwgb3IgaXQgaXMKICAgc2VuZGluZyBjaGFyYWN0ZXJzIHRvIHRoZSBtb2RlbSBmYXN0ZXIgdGhhbiB0aGUgbW9kZW0gaGFuZGxlIHRoZW0uIEEKICAgbmV3IGNvbW1hbmQgd2FzIGFkZGVkIGZvciB0aGlzIGluIEMtS2VybWl0IDcuMDoKCiAgIFNFVCBESUFMIFBBQ0lORyBudW1iZXIKICAgICAgICAgIFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyAodGhvdXNhbmR0aHMgb2Ygc2Vjb25kcykKICAgICAgICAgIHRvIHBhdXNlIGJldHdlZW4gZWFjaCBjaGFyYWN0ZXIgd2hlbiBzZW5kaW5nIGNvbW1hbmRzIHRvIHRoZQogICAgICAgICAgbW9kZW0gZHVyaW5nIERJQUwgb3IgQU5TV0VSIGNvbW1hbmQgZXhlY3V0aW9uLiAwIG1lYW5zIG5vIHBhdXNlCiAgICAgICAgICBhdCBhbGwsIC0xICh0aGUgZGVmYXVsdCkgb3IgYW55IG90aGVyIG5lZ2F0aXZlIG51bWJlciBtZWFucyB0bwogICAgICAgICAgdXNlIHRoZSB2YWx1ZSBmcm9tIHRoZSBkYXRhYmFzZS4gQW55IG51bWJlciBncmVhdGVyIHRoYW4gMCBpcwogICAgICAgICAgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gcGF1c2UuCgogICBISU5UOiBZb3UgbWlnaHQgYWxzbyBuZWVkIHRvIGNvbnRyb2wgdGhlIHJhdGUgYXQgd2hpY2ggdGhlIG1vZGVtCiAgIGdlbmVyYXRlcyBUb3VjaCBUb25lcyBkdXJpbmcgZGlhbGluZywgZm9yIGV4YW1wbGUgd2hlbiBzZW5kaW5nIGEKICAgbnVtZXJpYyBwYWdlLiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gdGhpcy4gT25lIHdheSBpcyB0byBpbnNlcnQKICAgcGF1c2UgY2hhcmFjdGVycyBpbnRvIHRoZSBkaWFsaW5nIHN0cmluZy4gRm9yIG1vZGVtcyB0aGF0IHVzZSB0aGUgQVQKICAgY29tbWFuZCBzZXQsIHRoZSBwYXVzZSBjaGFyYWN0ZXIgaXMgY29tbWEgKCwpIGFuZCBjYXVzZXMgYSAyLXNlY29uZAogICBwYXVzZS4gT24gbW9zdCBtb2RlbXMsIHlvdSBjYW4gdXNlIHRoZSBTOCByZWdpc3RlciB0byBjaGFuZ2UgdGhlIHBhdXNlCiAgIGludGVydmFsIGNhdXNlZCBieSBjb21tYSBpbiB0aGUgZGlhbGluZyBzdHJpbmcuIFRoZSBvdGhlciB3YXkgaXMgdG8KICAgc2V0IHlvdXIgbW9kZW0ncyB0b25lIGdlbmVyYXRpb24gaW50ZXJ2YWwsIGlmIGl0IGhhcyBhIGNvbW1hbmQgZm9yCiAgIHRoYXQuIE1vc3QgQVQtY29tbWFuZC1zZXQgbW9kZW1zIHVzZSBTMTEgZm9yIHRoaXM7IHRoZSB2YWx1ZSBpcyBpbgogICBtaWxsaXNlY29uZHMuIEZvciBleGFtcGxlIG9uIFVTUiBtb2RlbXM6CgogIEFUUzExPTIwMAoKICAgc2VsZWN0cyBhbiBpbnRlcnZhbCBvZiAyMDAgbWlsbGlzZWNvbmRzIHRvIHNlcGFyYXRlIGVhY2ggZGlhbGluZyB0b25lLgoKICAgSGludDogVG8gYWRkIFMtUmVnaXN0ZXIgc2V0dGluZ3Mgb3Igb3RoZXIgY29tbWFuZHMgdG8geW91ciBkaWFsaW5nCiAgIHByb2NlZHVyZSwgdXNlIHRoZSBuZXcgU0VUIE1PREVNIENPTU1BTkQgUFJFRElBTC1JTklUIGNvbW1hbmQKICAgKFszODhdU2VjdGlvbiAyLjIuMikuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAyLjEuOS4gUHJldGVzdGluZyBQaG9uZSBOdW1iZXIgQ29udmVyc2lvbnMKCiAgIFRoZSBMT09LVVAgY29tbWFuZCBub3cgYWNjZXB0cyB0ZWxlcGhvbmUgbnVtYmVycyBhcyB3ZWxsIGFzCiAgIGRpcmVjdG9yeS1lbnRyeSBuYW1lcywgZm9yIGV4YW1wbGU6CgogIExPT0tVUCArMSAoMjEyKSA3NjU0MzIxCgogICBXaGVuIGdpdmVuIGEgcGhvbmUgbnVtYmVyLCBMT09LVVAgcHJpbnRzIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB0aGUKICAgcGhvbmUgbnVtYmVyIGZvciBkaWFsaW5nIHVuZGVyIHRoZSBjdXJyZW50IGRpYWxpbmcgcnVsZXMuIEZvciBleGFtcGxlLAogICBpZiBteSBjb3VudHJ5IGNvZGUgaXMgMSBhbmQgbXkgYXJlYSBjb2RlIGlzIDIxMiwgYW5kIEkgYW0gZGlhbGluZyBvdXQKICAgZnJvbSBhIFBCWCB3aG9zZSBvdXRzaWRlLWxpbmUgcHJlZml4IGlzICI5MywiOgoKICBDLUtlcm1pdD4gbG9va3VwICsxICgyMTIpIDc2NTQzMjEKICArMSAoMjEyKSA3NjU0MzIxID0+IDkzLDc2NTQzMjEKICBDLUtlcm1pdD4KCiAgIFlvdSBjYW4gYWxzbyB1c2UgdGhlIFxmZGlhbGNvbnZlcnQocGhvbmUtbnVtYmVyKSBmdW5jdGlvbgogICAoWzM4OV1TZWN0aW9uIDIuMS4xMSkgdG8gZG8gdGhpcyBwcm9ncmFtbWF0aWNhbGx5OgoKICBDLUtlcm1pdD4gZWNobyAiXGZkaWFsY29udmVydCgrMSAoMjEyKSA3NjU0MzIxKSIKICAiOTMsNzY1NDMyMSIKICBDLUtlcm1pdD4KCiAgIFNvIHRoZSBuZXcgTE9PS1VQIGJlaGF2ZXMgYXMgZm9sbG93czoKCiAgIExPT0tVUCBwb3J0YWJsZS1mb3JtYXQtcGhvbmUtbnVtYmVyCiAgICAgICAgICBEaXNwbGF5cyBob3cgdGhlIG51bWJlciB3b3VsZCBhY3R1YWxseSBiZSBkaWFsZWQgU2V0cyBGQUlMVVJFCiAgICAgICAgICBpZiB0aGVyZSB3YXMgYSBjb252ZXJzaW9uIGVycm9yLCBvdGhlcndpc2UgU1VDQ0VTUy4KCiAgIExPT0tVUCBsaXRlcmFsLWZvcm1hdC1waG9uZS1udW1iZXIKICAgICAgICAgIERpc3BsYXlzIHRoZSBzYW1lIGxpdGVyYWwtZm9ybWF0LXBob25lLW51bWJlciBBbHdheXMgc2V0cwogICAgICAgICAgU1VDQ0VTUy4KCiAgIExPT0tVUCBkaWFsaW5nLWRpcmVjdG9yeS1uYW1lCiAgICAgICAgICBEaXNwbGF5cyBhbGwgbWF0Y2hpbmcgZW50cmllcyBhbmQgY29udmVydHMgcG9ydGFibGUgcGhvbmUKICAgICAgICAgIG51bWJlcnMuIFNldHMgU1VDQ0VTUyBpZiBhdCBsZWFzdCBvbmUgZW50cnkgd2FzIGZvdW5kLAogICAgICAgICAgb3RoZXJ3aXNlIEZBSUxVUkUuCgogICBMT09LVVAgPWFueXRoaW5nCiAgICAgICAgICBEaXNwbGF5cyAiPWFueXRoaW5nIiBhbmQgc2V0cyBTVUNDRVNTLgoKICAgVGhlcmUgaXMsIGF0IHByZXNlbnQsIG5vIHByb2dyYW1tYXRpYyB3YXkgdG8gZmV0Y2ggbnVtYmVycyBmcm9tIHRoZQogICBkaWFsaW5nIGRpcmVjdG9yeS4gVGhpcyB3aWxsIGJlIGNvbnNpZGVyZWQgZm9yIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAyLjEuMTAuIEdyZWF0ZXIgQ29udHJvbCBvdmVyIFBhcnRpYWwgRGlhbGluZwoKICAgVGhlIGZvbGxvd2luZyBydWxlcyBub3cgYXBwbHkgdG8gcGFydGlhbCBkaWFsaW5nOgoKICAgICAqIFBob25lIG51bWJlciB0cmFuc2Zvcm1hdGlvbnMgYmFzZWQgb24gY291bnRyeSBhbmQgYXJlYSBjb2RlLAogICAgICAgYXBwbGljYXRpb24gb2YgcHJlZml4ZXMsIGV0YywgYXJlIHBlcmZvcm1lZCBvbmx5IG9uIHRoZSBmaXJzdAogICAgICAgUERJQUwuCiAgICAgKiBFYWNoIFBESUFMIGFyZ3VtZW50IGlzIGxvb2tlZCB1cCBpbiB0aGUgZGlhbGluZyBkaXJlY3RvcnksIHNvIGl0CiAgICAgICBpcyBwb3NzaWJsZSBoYXZlIGRpcmVjdG9yeSBlbnRyaWVzIGZvciBwaWVjZXMgb2YgcGhvbmUgbnVtYmVycyBvcgogICAgICAgb3RoZXIgaW5mb3JtYXRpb24uCiAgICAgKiBTdWZmaXhlcyBhcmUgbm90IGFwcGxpZWQgYXV0b21hdGljYWxseSwgc2luY2UgdGhlcmUgaXMgbm8gd2F5IGZvcgogICAgICAgQy1LZXJtaXQgdG8ga25vdyBpbiB3aGljaCBQRElBTCBzZWdtZW50IHlvdSB3YW50IHRoZW0gdG8gYmUKICAgICAgIGFwcGxpZWQuCgogICBIb3dldmVyLCB0aGUgc3VmZml4IHRoYXQgKndvdWxkKiBoYXZlIGJlZW4gYXBwbGllZCwgYmFzZWQgb24gdGhlCiAgIGRpYWxpbmcgcnVsZXMgdGhhdCB3ZXJlIGludm9rZWQgd2hlbiBwcm9jZXNzaW5nIHRoZSBmaXJzdCBQRElBTAogICBjb21tYW5kLCBpcyBzdG9yZWQgaW4gdGhlIHZhcmlhYmxlOgoKICBcdihkaWFsc3VmZml4KQoKICAgd2hpY2ggeW91IGNhbiBpbmNsdWRlIGluIGFueSBzdWJzZXF1ZW50IFBESUFMIG9yIERJQUwgY29tbWFuZHMuCgogICBFeGFtcGxlOgoKICBwZGlhbCB7XG0obXlfbG9uZ19kaXN0YW5jZV9wYWdlcl9udW1iZXJfcGFydF8xKX0KICBwZGlhbCB7XG0obXlfbG9uZ19kaXN0YW5jZV9wYWdlcl9udW1iZXJfcGFydF8yKX0KICBwZGlhbCB7XHYoZGlhbHN1ZmZpeCl9CiAgcGRpYWwge1xtKG15X2xvbmdfZGlzdGFuY2VfcGFnZXJfbnVtYmVyX3BhcnRfMyl9CiAgcGRpYWwge0BcbShudW1lcmljX3BhZ2VyX2NvZGUpI30KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuMS4xMS4gTmV3IERJQUwtcmVsYXRlZCBWYXJpYWJsZXMgYW5kIEZ1bmN0aW9ucwoKICAgXGZkaWFsY29udmVydChzKQogICAgICAgICAgcyBpcyBhIHBob25lIG51bWJlciBpbiBlaXRoZXIgbGl0ZXJhbCBvciBwb3J0YWJsZSBmb3JtYXQgKG5vdCBhCiAgICAgICAgICBkaWFsaW5nIGRpcmVjdG9yeSBlbnRyeSBuYW1lKS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRpYWwKICAgICAgICAgIHN0cmluZyB0aGF0IHdvdWxkIGFjdHVhbGx5IGJlIHVzZWQgYnkgdGhlIERJQUwgY29tbWFuZCB3aGVuCiAgICAgICAgICBkaWFsaW5nIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24sIGFmdGVyIHByb2Nlc3NpbmcgY291bnRyeQogICAgICAgICAgY29kZSwgYXJlYSBjb2RlLCBhbmQgb3RoZXIgU0VUIERJQUwgdmFsdWVzLCBhbmQgc2hvdWxkIGJlIHRoZQogICAgICAgICAgc2FtZSBhcyB0aGUgcmVzdWx0IG9mIExPT0tVUCB3aGVuIGdpdmVuIGEgdGVsZXBob25lIG51bWJlci4KCiAgIFx2KGRpYWxzdWZmaXgpCiAgICAgICAgICBDb250YWlucyB0aGUgc3VmZml4LCBpZiBhbnksIHRoYXQgd2FzIGFwcGxpZWQgaW4gdGhlIG1vc3QKICAgICAgICAgIHJlY2VudCBESUFMIGNvbW1hbmQsIG9yIHRoZSBzdWZmaXggdGhhdCB3b3VsZCBoYXZlIGJlZW4gYXBwbGllZAogICAgICAgICAgaW4gdGhlIG1vc3QgcmVjZW50IFBESUFMIGNvbW1hbmQuIFVzZSB0aGlzIHZhcmlhYmxlIHRvIHNlbmQgdGhlCiAgICAgICAgICBkaWFsIHN1ZmZpeCBhdCBhbnkgZGVzaXJlZCBwb2ludCBpbiBhIFBESUFMIHNlcXVlbmNlLgoKICAgXHYoZGlhbHR5cGUpCiAgICAgICAgICBBIG51bWJlciBpbmRpY2F0aW5nIHRoZSB0eXBlIG9mIGNhbGwgdGhhdCB3YXMgbW9zdCByZWNlbnRseQogICAgICAgICAgcGxhY2VkLiBDYW4gYmUgdXNlZCBhZnRlciBhIG5vcm1hbCBESUFMIGNvbW1hbmQsIG9yIGFmdGVyIHRoZQogICAgICAgICAgZmlyc3QgUERJQUwgY29tbWFuZCBpbiBhIFBESUFMIHNlcXVlbmNlLiBWYWx1ZXMgYXJlOgoKICAtMjogVW5rbm93biBiZWNhdXNlIFRBUEkgaGFuZGxlZCB0aGUgcGhvbmUgbnVtYmVyIHRyYW5zbGF0aW9uLgogIC0xOiBVbmtub3duIGJlY2F1c2Ugc29tZSBraW5kIG9mIGVycm9yIG9jY3VyZWQuCiAgIDA6IEludGVybmFsIHdpdGhpbiBQQlguCiAgIDE6IFRvbGwtZnJlZS4KICAgMjogTG9jYWwgd2l0aGluIGNhbGxpbmcgYXJlYS4KICAgMzogVW5rbm93biAoZS5nLiBiZWNhdXNlIGEgbGl0ZXJhbC1mb3JtYXQgcGhvbmUgbnVtYmVyIHdhcyBnaXZlbikuCiAgIDQ6IExvbmcgZGlzdGFuY2Ugd2l0aGluIGNvdW50cnkuCiAgIDU6IEludGVybmF0aW9uYWwKCiAgIFx2KGRpYWxjb3VudCkKICAgICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBESUFMIHJldHJ5IGNvdW50ZXIsIGZvciB1c2UgaW4gYSBESUFMCiAgICAgICAgICBtYWNybyAoWzM5MF1TZWN0aW9uIDIuMS4xMykuCgogICBcdihkJHB4KQogICAgICAgICAgUEJYIEV4Y2hhbmdlIChzZWUgWzM5MV1TZWN0aW9uIDIuMS4xMikuCgogICBPdGhlciBkaWFsLXJlbGF0ZWQgdmFyaWFibGVzLCBhbHJlYWR5IGRvY3VtZW50ZWQgaW4gWzM5Ml1Vc2luZwogICBDLUtlcm1pdCAob3Igb3RoZXIgc2VjdGlvbnMgb2YgdGhpcyBkb2N1bWVudCwgZS5nLiBbMzkzXVNlY3Rpb24KICAgMi4xLjEpLCBpbmNsdWRlIFx2KGRpYWxudW1iZXIpLCBcdihkaWFsc3RhdHVzKSwgZXRjLiBBIGNvbnZlbmllbnQgd2F5CiAgIHRvIGRpc3BsYXkgYWxsIG9mIHRoZW0gaXM6CgogIHNob3cgdmFyaWFibGUgZGlhbCAgOyBoaW50OiBhYmJyZXZpYXRlICJzaG8gdmFyIGRpYWwiCgogICBUaGlzIHNob3dzIHRoZSB2YWx1ZXMgb2YgYWxsIHRoZSB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aAogICAiZGlhbCIuIEFsc28gInNob3cgdmFyaWFibGUgZCQiICh0byBzaG93IHRoZSBcdihkJC4uLikgdmFyaWFibGVzKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuMS4xMi4gSW5jcmVhc2VkIEZsZXhpYmlsaXR5IG9mIFBCWCBEaWFsaW5nCgogICBSZWZlciB0byBbMzk0XVVzaW5nIEMtS2VybWl0LCAybmQgRWRpdGlvbiwgcGFnZXMgMTA3LTEwOC4gUmVjYWxsIHRoYXQKICAgdGhyZWUgY29tbWFuZHMgYXJlIG5lZWRlZCB0byBjb25maWd1cmUgQy1LZXJtaXQgZm9yIGRpYWxpbmcgZnJvbSBhCiAgIFBCWDoKCiAgU0VUIERJQUwgUEJYLUVYQ0hBTkdFIG51bWJlcgogIFNFVCBESUFMIFBCWC1JTlNJREUtUFJFRklYIG51bWJlcgogIFNFVCBESUFMIFBCWC1PVVRTSURFLVBSRUZJWCBudW1iZXIKCiAgIFVuZm9ydHVuYXRlbHksIHRoaXMgbW9kZWwgZG9lcyBub3QgYWNjb21tb2RhdGUgUEJYcyB0aGF0IGhhdmUgbW9yZQogICB0aGFuIG9uZSBleGNoYW5nZS4gRm9yIGV4YW1wbGUgb3VyIFBCWCBhdCBDb2x1bWJpYSBVbml2ZXJzaXR5ICh3aGljaAogICBtdXN0IGhhbmRsZSBtb3JlIHRoYW4gMTAsMDAwIHBob25lcykgaGFzIDg1My14eHh4IGFuZCA4NTQteHh4eAogICBleGNoYW5nZXMuCgogICBCZWdpbm5pbmcgaW4gQy1LZXJtaXQgNy4wLCB0aGUgU0VUIERJQUwgUEJYLUVYQ0hBTkdFIGNvbW1hbmQgYWNjZXB0cyBhCiAgIGxpc3Qgb2YgZXhjaGFuZ2VzLCBlLmcuOgoKICBTRVQgRElBTCBQQlgtRVhDSEFOR0UgODUzIDg1NAoKICAgKG11bHRpcGxlIGV4Y2hhbmdlcyBhcmUgc2VwYXJhdGVkIGJ5IHNwYWNlcywgbm90IGNvbW1hcykuCgogICBTbyBub3cgd2hlbiBkaWFsaW5nIGEgcG9ydGFibGUtZm9ybWF0IG51bWJlciB0aGF0IGhhcyB0aGUgc2FtZSBjb3VudHJ5CiAgIGFuZCBhcmVhIGNvZGVzIGFzIHRob3NlIG9mIHlvdXIgZGlhbGluZyBsb2NhdGlvbiwgQy1LZXJtaXQgY29tcGFyZXMKICAgdGhlIGV4Y2hhbmdlIG9mIHRoZSBkaWFsZWQgbnVtYmVyIHdpdGggZWFjaCBudW1iZXIgaW4gdGhlIFBCWCBFeGNoYW5nZQogICBsaXN0IChyYXRoZXIgdGhhbiB3aXRoIGEgc2luZ2xlIFBCWCBFeGNoYW5nZSBudW1iZXIsIGFzIGl0IGRpZAogICBmb3JtZXJseSkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBpcyBhbiBpbnRlcm5hbCBQQlggbnVtYmVyIG9yIGFuCiAgIGV4dGVybmFsIGNhbGwuIElmIGl0IGlzIGFuIGV4dGVybmFsIGNhbGwsIHRoZW4gdGhlIFBCWCBPdXRzaWRlIFByZWZpeAogICBpcyBhcHBsaWVkLCBhbmQgdGhlbiB0aGUgbm9ybWFsIGRpYWxpbmcgcnVsZXMgZm9yIGxvY2FsIG9yCiAgIGxvbmctZGlzdGFuY2UgY2FsbHMuCgogICBJZiBpdCBpcyBhbiBpbnNpZGUgY2FsbCwgdGhlIGV4Y2hhbmdlIGlzIHJlcGxhY2VkIGJ5IHRoZSBQQlggSW5zaWRlCiAgIFByZWZpeC4gQnV0IGlmIHRoZSBQQlggaGFzIG1vcmUgdGhhbiBvbmUgZXhjaGFuZ2UsIGEgc2luZ2xlIGZpeGVkIFBCWAogICBJbnNpZGUgUHJlZml4IGlzIHByb2JhYmx5IG5vdCBzdWZmaWNpZW50LiBGb3IgZXhhbXBsZSwgYXQgQ29sdW1iaWEKICAgVW5pdmVyc2l0eSwgd2UgbXVzdCBkaWFsIDMteHh4eCBmb3IgYW4gaW50ZXJuYWwgY2FsbCB0byA4NTMteHh4eCwgYnV0CiAgIDQteHh4eCBmb3IgYSBjYWxsIHRvIDg1NC14eHh4LiBUaGF0IGlzLCB0aGUgaW5zaWRlIHByZWZpeCBpcyB0aGUgZmluYWwKICAgZGlnaXQgb2YgdGhlIGV4Y2hhbmdlIHdlIGFyZSBkaWFsaW5nLiBGb3IgdGhpcyByZWFzb24sIEMtS2VybWl0IDcuMAogICBwcm92aWRlcyBhIG1ldGhvZCB0byBkZXRlcm1pbmUgdGhlIGluc2lkZSBwcmVmaXggZHluYW1pY2FsbHkgYXQKICAgZGlhbGluZyB0aW1lLCBjb25zaXN0aW5nIG9mIGEgbmV3IHZhcmlhYmxlIGFuZCBuZXcgc3ludGF4IGZvciB0aGUgU0VUCiAgIERJQUwgUEJYLUlOU0lERS1QUkVGSVggY29tbWFuZDoKCiAgIFx2KGQkcHgpCiAgICAgICAgICBUaGlzIHZhcmlhYmxlIGNvbnRhaW5zIHRoZSBleGNoYW5nZSB0aGF0IHdhcyBtYXRjaGVkIHdoZW4gYSBQQlgKICAgICAgICAgIGludGVybmFsIGNhbGwgd2FzIGRldGVjdGVkLiBGb3IgZXhhbXBsZSwgaWYgdGhlIFBCWCBleGNoYW5nZQogICAgICAgICAgbGlzdCBpcyAiODUzIDg1NCIgYW5kIGEgY2FsbCBpcyBwbGFjZWQgdG8gKzEgKDIxMikgODU0LTk5OTksCiAgICAgICAgICBcdihkJHB4KSBpcyBzZXQgdG8gODU0LgoKICAgU0VUIERJQUwgUEJYLUlOU0lERS1QUkVGSVggXGZ4eHgoLi4uKQogICAgICAgICAgSWYgdGhlIFBCWCBJbnNpZGUgUHJlZml4IGlzIGRlZmluZWQgdG8gYmUgYSBmdW5jdGlvbiwgaXRzCiAgICAgICAgICBldmFsdWF0aW9uIGlzIGRlZmVycmVkIHVudGlsIGRpYWxpbmcgdGltZS4gTm9ybWFsbHksIHRoaXMgd291bGQKICAgICAgICAgIGJlIGEgc3RyaW5nIGZ1bmN0aW9uIGhhdmluZyBcdihkJHB4KSBhcyBhbiBvcGVyYW5kLiBPZiBjb3Vyc2UsCiAgICAgICAgICB5b3UgY2FuIHN0aWxsIHNwZWNpZnkgYSBjb25zdGFudCBzdHJpbmcsIGFzIGJlZm9yZS4KCiAgIFNvIGdpdmVuIHRoZSBmb2xsb3dpbmcgc2V0dXA6CgogIFNFVCBESUFMIENPVU5UUlktQ09ERSAxCiAgU0VUIERJQUwgQVJFQS1DT0RFIDIxMgogIFNFVCBESUFMIFBCWC1PVVRTSURFLVBSRUZJWCA5MywKICBTRVQgRElBTCBQQlgtRVhDSEFOR0UgODUzIDg1NAogIFNFVCBESUFMIFBCWC1JTlNJREUtUFJFRklYIFxmcmlnaHQoXHYoZCRweCksMSkKCiAgIFRoZSBmb2xsb3dpbmcgbnVtYmVycyBnaXZlIHRoZSByZXN1bHRzIGluZGljYXRlZDoKCiBOdW1iZXIgICAgICAgICAgICAgICAgICAgUmVzdWx0CiAgKzEgKDIxMikgODU0LTk4NzYgICAgICAgIDQtOTg3NgogICsxICgyMTIpIDg1My0xMjM0ICAgICAgICAzLTEyMzQKICArMSAoMjEyKSA3NjUtNDMyMSAgICAgICAgOTMsNzY1LTQzMjEKICArMSAoMzMzKSA3NjUtNDMyMSAgICAgICAgOTMsMTMzMzc2NS00MzIxCgogICBGdXJ0aGVybW9yZSwgdGhlIEtfUEJYX1hDSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBtYXkgbm93IGJlIHNldCB0byBhCiAgIGxpc3Qgb2YgZXhjaGFuZ2VzIHRvIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZSBDLUtlcm1pdCdzIFBCWCBleGNoYW5nZQogICBsaXN0LCBmb3IgZXhhbXBsZSAoaW4gVU5JWCBrc2ggb3IgYmFzaCk6CgogIGV4cG9ydCBLX1BCWF9YQ0g9Ijg1MyA4NTQiCgogICAoUXVvdGVzIHJlcXVpcmVkIGJlY2F1c2Ugb2YgdGhlIHNwYWNlLikgT2YgY291cnNlLCB0aGlzIHZhcmlhYmxlIGNhbgogICBhbHNvIGJlIHNldCB0byBhIHNpbmdsZSBleGNoYW5nZSwgYXMgYmVmb3JlOgoKICBleHBvcnQgS19QQlhfWENIPTg1MwogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4xLjEzLiBUaGUgRElBTCBtYWNybyAtIExhc3QtTWludXRlIFBob25lIE51bWJlciBDb252ZXJzaW9ucwoKICAgQWZ0ZXIgYSBESUFMIG9yIExPT0tVUCBjb21tYW5kIGlzIGdpdmVuLCBhIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyBpcwogICBhc3NlbWJsZWQgZnJvbSB0aGUgZGlhbGluZyBkaXJlY3RvcnkgKGlmIGFueSksIHdpdGggYWxsCiAgIGxvY2F0aW9uLWRlcGVuZGVudCBjb252ZXJzaW9uIHJ1bGVzIGFwcGxpZWQgYXMgZGVzY3JpYmVkIGluIENoYXB0ZXIgNQogICBvZiBbMzk1XVVzaW5nIEMtS2VybWl0LgoKICAgSG93ZXZlciwgYWRkaXRpb25hbCBjb252ZXJzaW9ucyBtaWdodCBzdGlsbCBiZSByZXF1aXJlZCBhdCB0aGUgbGFzdAogICBtaW51dGUgYmFzZWQgb24gbG9jYWwgb3IgZXBoZW1lcmFsIGNvbmRpdGlvbnMuIFNvIHRoYXQgeW91IGNhbiBoYXZlCiAgIHRoZSBmaW5hbCB3b3JkIG9uIHRoZSBleGFjdCBmb3JtYXQgb2YgdGhlIGRpYWwgc3RyaW5nLCBDLUtlcm1pdCA3LjAKICAgbGV0cyB5b3UgcGFzcyB0aGUgY29udmVydGVkIHN0cmluZyB0aHJvdWdoIGEgbWFjcm8gb2YgeW91ciBvd24gZGVzaWduCiAgIGZvciBmaW5hbCBwcm9jZXNzaW5nIGJlZm9yZSBkaWFsaW5nLiBUaGUgcmVsZXZhbnQgY29tbWFuZCBpczoKCiAgIFNFVCBESUFMIE1BQ1JPIFsgbmFtZSBdCiAgICAgICAgICBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBtYWNybyB0byBiZSBydW4gb24gZWFjaCBwaG9uZSBudW1iZXIKICAgICAgICAgIGFmdGVyIGFsbCBidWlsdC1pbiBjb252ZXJzaW9ucyBoYXZlIGJlZW4gYXBwbGllZCwganVzdCBiZWZvcmUKICAgICAgICAgIHRoZSBudW1iZXIgaXMgZGlhbGVkLiBJZiBubyBuYW1lIGlzIGdpdmVuLCBubyBtYWNybyBpcyBydW4uIFRoZQogICAgICAgICAgcGhvbmUgbnVtYmVyLCBhcyBpdCB3b3VsZCBoYXZlIGJlZW4gZGlhbGVkIGlmIHRoZXJlIHdlcmUgbm8KICAgICAgICAgIGRpYWwgbWFjcm8sIGlzIHBhc3NlZCB0byB0aGUgbWFjcm8uCgogICBUaGUgZGlhbCBtYWNybyBjYW4gZG8gYW55dGhpbmcgYXQgYWxsIChleGNlcHQgc3RhcnQgYSBmaWxlIHRyYW5zZmVyKS4KICAgSG93ZXZlciwgdGhlIG5vcm1hbCB1c2UgZm9yIHRoZSBtYWNybyB3b3VsZCBiZSB0byBtb2RpZnkgdGhlIHBob25lCiAgIG51bWJlci4gRm9yIHRoaXMgcmVhc29uIHRoZSBwaG9uZSBudW1iZXIgaXMgcGFzc2VkIHRvIHRoZSBtYWNybyBhcwogICBhcmd1bWVudCBudW1iZXIgMSAoXCUxKS4gVG8gY2F1c2UgYSBtb2RpZmllZCBudW1iZXIgdG8gYmUgZGlhbGVkLCB0aGUKICAgbWFjcm8gc2hvdWxkIHRlcm1pbmF0ZSB3aXRoIGEgUkVUVVJOIHN0YXRlbWVudCBzcGVjaWZ5aW5nIGEgcmV0dXJuCiAgIHZhbHVlLiBUbyBsZWF2ZSB0aGUgbnVtYmVyIGFsb25lLCB0aGUgbWFjcm8gc2hvdWxkIHNpbXBseSBlbmQuCiAgIEV4YW1wbGU6CgogIGRlZmluZSB4eHggcmV0dXJuIDEwMTA4ODg5OTk5JFwlMQogIHNldCBkaWFsIG1hY3JvIHh4eAogIGRpYWwgeHl6Y29ycAoKICAgVGhpcyBkZWZpbmVzIGEgRElBTCBNQUNSTyBjYWxsZWQgeHh4LCB3aGljaCBwdXRzIGFuIGFjY2VzcyBjb2RlIG9uIHRoZQogICBmcm9udCBvZiB0aGUgbnVtYmVyLiBBbm90aGVyIGV4YW1wbGUgbWlnaHQgYmU6CgogIGRlZiB4eHggaWYgZXF1YWwgIlx2KG1vZGVtKSIgImhheWVzLTEyMDAiIHJldHVybiBcZnJlcGxhY2UoXCUxLCQseywsLCwsfSkKICBzZXQgZGlhbCBtYWNybyB4eHgKICBkaWFsIHh5emNvcnAKCiAgIHdoaWNoIHJlcGxhY2VzIGFueSBkb2xsYXItc2lnbiBpbiB0aGUgZGlhbCBzdHJpbmcgYnkgYSBzZXJpZXMgb2YgZml2ZQogICBjb21tYXMsIGUuZy4gYmVjYXVzZSB0aGlzIHBhcnRpY3VsYXIgbW9kZW0gZG9lcyBub3Qgc3VwcG9ydCB0aGUgIndhaXQKICAgZm9yIGJvbmciIGZlYXR1cmUgKHJlbWVtYmVyIHRoYXQgY29tbWFzIHRoYXQgYXJlIHRvIGJlIGluY2x1ZGVkCiAgIGxpdGVyYWxseSBpbiBmdW5jdGlvbiBhcmd1bWVudHMgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFjZXMgdG8KICAgZGlzdGluZ3Vpc2ggdGhlbSBmcm9tIHRoZSBjb21tYXMgdGhhdCBzZXBhcmF0ZSB0aGUgYXJndW1lbnRzKSBhbmQgd2hlbgogICB0aGUgSUYgY29uZGl0aW9uIGlzIG5vdCBzYXRpc2ZpZWQsIHRoZSBtYWNybyBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZSwKICAgYW5kIHNvIHRoZSBudW1iZXIgaXMgbm90IG1vZGlmaWVkLiBUaGVuIHdoZW4gYSBESUFMIGNvbW1hbmQgaXMgZ2l2ZW4KICAgcmVmZXJlbmNpbmcgYSBkaWFsaW5nIGRpcmVjdG9yeSBlbnRyeSwgInh5emNvcnAiLiBUaGUgbWFjcm8gaXMKICAgYXV0b21hdGljYWxseSBhcHBsaWVkIHRvIGVhY2ggbWF0Y2hpbmcgbnVtYmVyLgoKICAgTnVtZXJvdXMgZGlhbC0sIG1vZGVtLSwgY29tbXVuaWNhdGlvbnMtLCBhbmQgdGltZS1yZWxhdGVkIHZhcmlhYmxlcwogICBhcmUgYXZhaWxhYmxlIGZvciBkZWNpc2lvbiBtYWtpbmcgeW91ciBkaWFsIG1hY3JvLiBUeXBlIFNIT1cgVkFSSUFCTEVTCiAgIGZvciBhIGxpc3QuIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgaXMgdGhlIFx2KGRpYWxjb3VudCkgdmFyaWFibGUsCiAgIHdoaWNoIHRlbGxzIGhvdyBtYW55IHRpbWVzIHRoZSBESUFMIGNvbW1hbmQgZ29uZSB0aHJvdWdoIGl0cyByZXRyeQogICBsb29wOiAxIG9uIHRoZSBmaXJzdCB0cnksIDIgb24gdGhlIHNlY29uZCwgMyBvbiB0aGUgdGhpcmQsIGFuZCBzbyBvbiwKICAgYW5kIHRoZSBcdihkaWFscmVzdWx0KSBhbmQgXHYoZGlhbHN0YXR1cykgdmFyaWFibGVzLgoKICAgSGVyZSBhcmUgc29tZSBvdGhlciBhcHBsaWNhdGlvbnMgZm9yIHRoZSBESUFMIE1BQ1JPIChmcm9tIHVzZXJzKToKCiAgICAgKiBQaG9uZSBudW1iZXJzIGluIHRoZSBkaWFsaW5nIGRpcmVjdG9yeSBhcmUgZm9ybWF0dGVkIHdpdGggJy0nIGZvcgogICAgICAgcmVhZGFiaWxpdHksIGJ1dCBzb21lIG1vZGVtcyBkb24ndCBsaWtlIHRoZSBoeXBoZW5zLCBzbyB0aGUgRElBTAogICAgICAgbWFjcm8gaXMgdXNlZCB0byByZW1vdmUgdGhlbSBiZWZvcmUgZGlhbGluZzsgZS5nCiAgICAgICAwMDkwLTEyMy00NTYtNzgtOTkgYmVjb21lcyAwMDkwMTIzNDU2Nzg5OTogImRlZiB4eHggcmV0dXJuCiAgICAgICBcZnJlcGxhY2UoXCUxLC0pIi4KICAgICAqIFRvIHNldCBzb21lIHNwZWNpZmljIG1vZGVtIChvciBvdGhlcikgb3B0aW9ucyBkZXBlbmRpbmcgb24gdGhlCiAgICAgICBjYWxsZWQgY3VzdG9tZXIgb3IgdGVsZXBob25lIG51bWJlci4KICAgICAqIENob29zaW5nIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHByb3ZpZGVyIGJhc2VkIG9uIChlLmcuKSB0aW1lIG9mCiAgICAgICBkYXksIG9yIGN5Y2xpbmcgdGhyb3VnaCBhIGxpc3Qgb2YgcHJvdmlkZXJzIGluIGNhc2Ugc29tZSBwcm92aWRlcnMKICAgICAgIG1pZ2h0IGJlIGJ1c3kuCgogICBUbyBpbGx1c3RyYXRlIHRoZSBmaW5hbCBpdGVtLCBzdXBwb3NlIHlvdSBoYXZlIGEgY2hvaWNlIGFtb25nIG1hbnkKICAgcGhvbmUgc2VydmljZSBwcm92aWRlcnM7IHRoZSBwcm92aWRlciBpcyBjaG9zZW4gYnkgZGlhbGluZyBhbiBhY2Nlc3MKICAgY29kZSBiZWZvcmUgdGhlIG51bWJlci4gRGlmZmVyZW50IHByb3ZpZGVycyBtaWdodCBiZSBiZXR0ZXIgKGUuZy4KICAgY2hlYXBlcikgZm9yIGNlcnRhaW4gdGltZXMgb2YgZGF5IG9yIGRheXMgb2YgdGhlIHdlZWssIG9yIGZvciBkaWFsaW5nCiAgIGNlcnRhaW4gbG9jYXRpb25zOyB5b3UgY2FuIHVzZSB0aGUgRElBTCBtYWNybyB0byBhZGQgdGhlIGFjY2VzcyBmb3IKICAgdGhlIG1vc3QgZGVzaXJhYmxlIHByb3ZpZGVyLgoKICAgU2ltaWxhcmx5LCB3aGVuIHRoZSBzYW1lIG51bWJlciBtaWdodCBiZSByZWFjaGVkIHRocm91Z2ggbXVsdGlwbGUKICAgcHJvdmlkZXJzLCBpdCdzIHBvc3NpYmxlIHRoYXQgb25lIHByb3ZpZGVyIG1pZ2h0IG5vdCBiZSBhYmxlIHRvCiAgIGNvbXBsZXRlIHRoZSBjYWxsLCBidXQgYW5vdGhlciBvbmUgY2FuLiBJbiB0aGF0IGNhc2UsIHlvdSBjYW4gdXNlIHRoZQogICBESUFMIG1hY3JvIHRvIHN3aXRjaCBwcm92aWRlcnMgZWFjaCB0aW1lIHRocm91Z2ggdGhlIERJQUwgbG9vcCAtLQogICB0aGF0J3Mgd2hlcmUgdGhlIFx2KGRpYWxjb3VudCkgdmFyaWFibGUgY29tZXMgaW4gaGFuZHkuCgogICBUaGUgZm9sbG93aW5nIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZGVidWcgdGhlIERJQUwgbWFjcm86CgogICBTRVQgRElBTCBURVNUIHsgT04sIE9GRiB9CiAgICAgICAgICBOb3JtYWxseSBPRkYsIHNvIHRoZSBESUFMIGNvbW1hbmQgYWN0dWFsbHkgZGlhbHMuIFdoZW4gT04sIHRoZQogICAgICAgICAgRElBTCBjb21tYW5kIHBlcmZvcm1zIGFsbCBsb29rdXBzIGFuZCBudW1iZXIgY29udmVyc2lvbnMsIGFuZAogICAgICAgICAgdGhlbiBnb2VzIHRocm91Z2ggdGhlIG51bWJlciBsaXN0IGFuZCByZXRyeSBsb29wLCBidXQgaW5zdGVhZAogICAgICAgICAgb2YgYWN0dWFsbHkgZGlhbGluZywgbGlzdHMgdGhlIG51bWJlcnMgaXQgd291bGQgaGF2ZSBjYWxsZWQgaWYKICAgICAgICAgIG5vbmUgb2YgdGhlIERJQUwgYXR0ZW1wdHMgc3VjY2VlZGVkIChvciBtb3JlIHByZWNpc2VseSwgZXZlcnkKICAgICAgICAgIG51bWJlciB3YXMgYWx3YXlzIGJ1c3kpLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4xLjE0LiBBdXRvbWF0aWMgVG9uZS9QdWxzZSBEaWFsaW5nIFNlbGVjdGlvbgoKICAgU0VUIERJQUwgTUVUSE9EIHsgQVVUTywgREVGQVVMVCwgUFVMU0UsIFRPTkUgfQogICAgICAgICAgQ2hvb3NlcyB0aGUgZGlhbGluZyBtZXRob2QgZm9yIHN1YnNlcXVlbnQgY2FsbHMuCgogICBQcmlvciB0byB2ZXJzaW9uIDcuMCwgQy1LZXJtaXQncyBESUFMIE1FVEhPRCB3YXMgREVGQVVMVCBieSBkZWZhdWx0LAogICBtZWFuaW5nIGl0IGRvZXMgbm90IHNwZWNpZnkgYSBkaWFsaW5nIG1ldGhvZCB0byB0aGUgbW9kZW0sIGJ1dCByZWxpZXMKICAgb24gdGhlIG1vZGVtIHRvIGhhdmUgYW4gYXBwcm9wcmlhdGUgZGVmYXVsdCBkaWFsaW5nIG1ldGhvZCBzZXQuIFNvLAogICBmb3IgZXhhbXBsZSwgd2hlbiB1c2luZyBIYXllcyBjb21wYXRpYmxlIG1vZGVtcywgdGhlIGRpYWwgc3RyaW5nIHdvdWxkCiAgIGJlIHNvbWV0aGluZyBsaWtlIEFURDc2NTQzMjEsIHJhdGhlciB0aGFuIEFURFQ3NjU0MzIxIG9yIEFURFA3NjU0MzIxLgoKICAgSW4gQy1LZXJtaXQgNy4wIGFuZCBLOTUgMS4xLjE5LCB0aGUgZGlhbCBtZXRob2QgY2FuIGJlIHNldCBmcm9tIHRoZQogICBlbnZpcm9ubWVudCB2YXJpYWJsZToKCiAgS19ESUFMX01FVEhPRAoKICAgd2hlbiBLZXJtaXQgc3RhcnRzLiBUaGUgdmFsdWVzIGNhbiBiZSBUT05FLCBQVUxTRSwgb3IgREVGQVVMVCwgZS5nLgogICAoVU5JWCk6CgogIHNldCBLX0RJQUxfTUVUSE9EPVRPTkU7IGV4cG9ydCBLX0RJQUxfTUVUSE9ECgogICBJbiB0aGUgYWJzZW5jZSBvZiBhIEtfRElBTF9NRVRIT0QgZGVmaW5pdGlvbiwgdGhlIG5ldyBkZWZhdWx0IFNFVCBESUFMCiAgIE1FVEhPRCBpcyBBVVRPIHJhdGhlciB0aGFuIERFRkFVTFQuIFdoZW4gRElBTCBNRVRIT0QgaXMgQVVUTyBhbmQgdGhlCiAgIGxvY2FsIGNvdW50cnkgY29kZSBpcyBrbm93biwgdGhlbiBpZiB0b25lIGRpYWxpbmcgaXMgdW5pdmVyc2FsbHkKICAgYXZhaWxhYmxlIGluIHRoZSBjb3JyZXNwb25kaW5nIGFyZWEsIHRvbmUgZGlhbGluZyBpcyB1c2VkOyBpZiBkaWFsaW5nCiAgIGZyb20gYSBsb2NhdGlvbiB3aGVyZSBwdWxzZSBkaWFsaW5nIGlzIG1hbmRhdG9yeSwgcHVsc2UgZGlhbGluZyBpcwogICB1c2VkLgoKICAgVGhlICJ0b25lIGNvdW50cnkiIGFuZCAicHVsc2UgY291bnRyeSIgbGlzdHMgYXJlIHByZWxvYWRlZCBhY2NvcmRpbmcKICAgdG8gb3VyIGtub3dsZWRnZSBhdCB0aGUgdGltZSBvZiByZWxlYXNlLiBZb3UgY2FuIHNlZSB0aGVpciBjb250ZW50cyBpbgogICB0aGUgU0hPVyBESUFMIGxpc3RpbmcuIFlvdSBjYW4gY2hhbmdlIHRoZSBsaXN0cyB3aXRoOgoKICAgU0VUIERJQUwgVE9ORS1DT1VOVFJJRVMgWyBjYyBbIGNjIFsgLi4uIF0gXSBdCiAgICAgICAgICBSZXBsYWNlcyB0aGUgY3VycmVudCBUT05FLUNPVU5UUklFUyBsaXN0IHdpdGggdGhlIG9uZSBnaXZlbi4KICAgICAgICAgIEVhY2ggY2MgaXMgYSBjb3VudHJ5IGNvZGU7IHNlcGFyYXRlIHRoZW0gd2l0aCBzcGFjZXMgKG5vdAogICAgICAgICAgY29tbWFzKS4gRXhhbXBsZToKCiAgc2V0IGRpYWwgdG9uZS1jb3VudHJpZXMgMSAzNTggNDQgNDYgNDkKCiAgICAgICAgICBJZiBubyBjb3VudHJ5IGNvZGVzIGFyZSBnaXZlbiwgdGhlIGN1cnJlbnQgbGlzdCwgaWYgYW55LCBpcwogICAgICAgICAgcmVtb3ZlZCwgaW4gd2hpY2ggY2FzZSBTRVQgRElBTCBNRVRIT0QgQVVUTyBpcyBlcXVpdmFsZW50IHRvCiAgICAgICAgICBTRVQgRElBTCBNRVRIT0QgREVGQVVMVC4KCiAgIFNFVCBESUFMIFBVTFNFLUNPVU5UUklFUyBbIGNjIFsgY2MgWyAuLi4gXSBdIF0KICAgICAgICAgIFJlcGxhY2VzIHRoZSBjdXJyZW50IFBVTFNFLUNPVU5UUklFUyBsaXN0IHdpdGggdGhlIG9uZSBnaXZlLgogICAgICAgICAgU3ludGF4IGFuZCBvcGVyYXRpb24gaXMgbGlrZSBTRVQgRElBTCBUT05FLUNPVU5UUklFUy4KCiAgIElmIHRoZSBzYW1lIGNvdW50cnkgY29kZSBhcHBlYXJzIGluIGJvdGggbGlzdHMsIFB1bHNlIHRha2VzCiAgIHByZWNlZGVuY2UuCgogICBUaGUgU0VUIERJQUwgVE9ORS0gYW5kIFBVTFNFLUNPVU5UUklFUyBjb21tYW5kcyBwZXJmb3JtIG5vCiAgIHZlcmlmaWNhdGlvbiB3aGF0c29ldmVyIG9uIHRoZSBjYydzLCBzaW5jZSBhbG1vc3QgYW55IHN5bnRheCBtaWdodCBiZQogICBsZWdhbCBpbiBzb21lIHNldHRpbmdzLiBGdXJ0aGVybW9yZSwgdGhlcmUgaXMgbm8gZmFjaWxpdHkgdG8gZWRpdCB0aGUKICAgbGlzdHM7IHlvdSBjYW4gb25seSByZXBsYWNlIHRoZSB3aG9sZSBsaXN0LiBIb3dldmVyLCBzaW5jZSB0aGUgb25seQogICBwdXJwb3NlIG9mIHRoZXNlIGxpc3RzIGlzIHRvIGVzdGFibGlzaCBhIGJhc2lzIGZvciBwaWNraW5nIHRvbmUgb3IKICAgcHVsc2UgZGlhbGluZyBhdXRvbWF0aWNhbGx5LCBhbGwgeW91IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGVmZmVjdCBvZgogICB0aGUgbGlzdCBpcyB0byBzZXQgYSBzcGVjaWZpYyBkaWFsaW5nIG1ldGhvZCB3aXRoIFNFVCBESUFMIE1FVEhPRCBUT05FCiAgIG9yIFNFVCBESUFMIE1FVEhPRCBQVUxTRS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuMS4xNS4gRGlhbC1Nb2RpZmllciBWYXJpYWJsZXMKCiAgIEFzIG9mIEMtS2VybWl0IDcuMCwgZGlhbCBtb2RpZmllcnMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgZm9sbG93aW5nCiAgIHZhcmlhYmxlczoKCiBcdihkbV9scCkgTG9uZyBwYXVzZQogXHYoZG1fc3ApIFNob3J0IHBhdXNlCiBcdihkbV9wZCkgUHVsc2UgZGlhbAogXHYoZG1fdGQpIFRvbmUgZGlhbAogXHYoZG1fd2EpIFdhaXQgZm9yIGFuc3dlcgogXHYoZG1fd2QpIFdhaXQgZm9yIGRpYWx0b25lCiBcdihkbV9yYykgUmV0dXJuIHRvIGNvbW1hbmQgbW9kZQoKICAgWW91IGNhbiB1c2UgdGhlc2UgaW4geW91ciBkaWFsIHN0cmluZ3MgaW4gcGxhY2Ugb2YgaGFyZHdpcmVkIG1vZGlmaWVycwogICBsaWtlICJAIiwgIiwiLCBldGMsIGZvciBpbmNyZWFzZWQgcG9ydGFiaWxpdHkgb2Ygc2NyaXB0cy4gRXhhbXBsZToKCiAgQy1LZXJtaXQ+c2V0IG1vZGVtIHR5cGUgdXNyb2JvdGljcwogIEMtS2VybWl0PnNobyB2YXJpYWJsZXMgZG0KICAgXHYoZG1fbHApID0gLAogICBcdihkbV9zcCkgPSAvCiAgIFx2KGRtX3BkKSA9IFAKICAgXHYoZG1fdGQpID0gVAogICBcdihkbV93YSkgPSBACiAgIFx2KGRtX3dkKSA9IFcKICAgXHYoZG1fcmMpID0gOwogIEMtS2VybWl0PmV4aXQKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuMS4xNi4gR2l2aW5nIE11bHRpcGxlIE51bWJlcnMgdG8gdGhlIERJQUwgQ29tbWFuZAoKICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCB0aGUgb25seSB3YXkgdG8gZ2l2ZSBhIERJQUwgY29tbWFuZCBhIGxpc3Qgb2YKICAgcGhvbmUgbnVtYmVycyB0byB0cnkgdW50aWwgb25lIGFuc3dlcnMgd2FzIHRvIGNyZWF0ZSBhIGRpYWxpbmcKICAgZGlyZWN0b3J5IHRoYXQgaGFkIG11bHRpcGxlIGVudHJpZXMgdW5kZXIgdGhlIHNhbWUgbmFtZSwgYW5kIHRoZW4gdXNlCiAgIHRoYXQgZW50cnkgbmFtZSBpbiB0aGUgRElBTCBjb21tYW5kLiBOb3cgYSBsaXN0IG9mIG51bWJlcnMgY2FuIGJlCiAgIGdpdmVuIHRvIHRoZSBESUFMIGNvbW1hbmQgZGlyZWN0bHkgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CgogIGRpYWwge3tudW1iZXIxfXtudW1iZXIyfXtudW1iZXIzfS4uLn0KCiAgIFRoaXMgaXMgdGhlIHNhbWUgbGlzdCBmb3JtYXQgdXNlZCBieSBTRU5EIC9FWENFUFQ6IGFuZCBvdGhlciBjb21tYW5kcwogICB0aGF0IGFsbG93IGEgbGlzdCB3aGVyZSBub3JtYWxseSBhIHNpbmdsZSBpdGVtIGlzIGdpdmVuLiBSZXN0cmljdGlvbnMKICAgb24gdGhpcyBmb3JtIG9mIHRoZSBESUFMIGNvbW1hbmQgYXJlOgoKICAgICAqIFRoZSBmaXJzdCB0d28gYnJhY2VzIG11c3QgYmUgYWRqYWNlbnQ7IHNwYWNpbmcgaXMgb3B0aW9uYWwKICAgICAgIHRoZXJlYWZ0ZXIuCiAgICAgKiBFYWNoIG51bWJlciBtdXN0IGJlIGFuIGFjdHVhbCBudW1iZXIgdG8gZGlhbCwgbm90IGEgZGlhbGluZwogICAgICAgZGlyZWN0b3J5IGVudHJ5LgogICAgICogRGlhbGluZyBkaXJlY3RvcnkgZW50cmllcyBtYXkgbm90IGNvbnRhaW4gbnVtYmVyIGxpc3RzIGluIHRoaXMKICAgICAgIGZvcm1hdC4KCiAgIEluIGFsbCBvdGhlciByZXNwZWN0cywgdGhlIG51bWJlcnMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSBoYWQgYmVlbgogICBmZXRjaGVkIGZyb20gdGhlIGRpYWxpbmcgZGlyZWN0b3J5OyB0aGV5IGNhbiBiZSBpbiBsaXRlcmFsIG9yIHBvcnRhYmxlCiAgIGZvcm1hdCwgZXRjLiBFeGFtcGxlOgoKICBkaWFsIHt7NzY1NDMyMX0geysxICgyMTIpIDU1NTEyMTJ9IHsgMS0yMTItNTU1Njc4OSB9fQoKICAgVGhlIGxpc3QgY2FuIGJlIGFueSBsZW5ndGggYXQgYWxsLCB3aXRoaW4gcmVhc29uLgoKICAgVGhpcyBmZWF0dXJlIGlzIGVzcGVjaWFsbHkgaGFuZHkgZm9yIHVzZSB3aXRoIHRoZSBLOTUgRGlhbGVyLCBhbGxvd2luZwogICBhIGxpc3Qgb2YgcGhvbmUgbnVtYmVycyB0byBiZSBzcGVjaWZpZWQgaW4gdGhlIFRlbGVwaG9uZSBOdW1iZXIgYm94CiAgIHdpdGhvdXQgaGF2aW5nIHRvIHNldCB1cCBvciByZWZlcmVuY2UgYSBzZXBhcmF0ZSBkaWFsaW5nIGRpcmVjdG9yeS4KCiAgIFlvdSBjYW4gYWxzbyB1c2UgaXQgdG8gYWRkIGNvbW1vbmx5LWRpYWxlZCBzZXF1ZW5jZXMgYXMgdmFyaWFibGVzIGluCiAgIHlvdXIgQy1LZXJtaXQgY3VzdG9taXphdGlvbiBmaWxlLCBlLmcuOgoKICBkZWZpbmUgd29yayB7ezc2NTQzMjF9ezc2NTQzMjJ9ezc2NTQzMjN9fQoKICAgYW5kIHRoZW46CgogIGRpYWwge1xtKHdvcmspfQoKICAgKHRoZSB2YXJpYWJsZSBuYW1lIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzKS4KCiAgIE9yIG1vcmUgc2ltcGx5OgoKICBkZWZpbmUgd29yayBkaWFsIHt7NzY1NDMyMX17NzY1NDMyMn17NzY1NDMyM319CgogICBhbmQgdGhlbjoKCiAgd29yawogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDIuMi4gTW9kZW1zCgogICAgMi4yLjEuIE5ldyBNb2RlbSBUeXBlcwoKICAgU2luY2UgQy1LZXJtaXQgNi4wOgoKICBhdGxhcy1uZXdjb20tMzM2MDBpZnhDIEF0bGFzL05ld2NvbSAzMzYwMAogIGF0dC1rZWVwaW50b3VjaCAgICAgICAgQVQmVCBLZWVwaW5Ub3VjaCBQQ01DSUEgVi4zMmJpcyBDYXJkIE1vZGVtCiAgYXR0LTE5MDAtc3R1LWlpaSAgICAgICBBVCZUIFNlY3VyZSBEYXRhIFNUVS1JSUkgTW9kZWwgMTkwMAogIGF0dC0xOTEwLXN0dS1paWkgICAgICAgQVQmVCBTZWN1cmUgRGF0YSBTVFUtSUlJIE1vZGVsIDE5MTAKICBiZXN0ZGF0YSAgICAgICAgICAgICAgIEJlc3QgRGF0YQogIGNhcmRpbmFsICAgICAgICAgICAgICAgQ2FyZGluYWwgVi4zNCBNVlAyODhYIHNlcmllcy4KICBjb21wYXEgICAgICAgICAgICAgICAgIENvbXBhcSBEYXRhK0ZheCAoZS5nLiBpbiBQcmVzYXJpbykKICBmdWppdHN1ICAgICAgICAgICAgICAgIEZ1aml0c3UgRmF4L01vZGVtIEFkYXB0ZXIKICBnZW5lcmljLWhpZ2gtc3BlZWQgICAgIEFueSBtb2Rlcm4gZXJyb3ItY29ycmVjdGluZyBkYXRhLWNvbXByZXNzaW5nIG1vZGVtCiAgaXR1LXQtdjI1dGVyL3YyNTAgICAgICBJVFUtVCAoQ0NJVFQpIFYuMjV0ZXIgKFYuMjUwKSBzdGFuZGFyZCBjb21tYW5kIHNldAogIG1lZ2FoZXJ0ei1hdHQtdjM0ICAgICAgTWVnYWhlcnR6IEFUJlQgVi4zNAogIG1lZ2FoZXJ0ei14amFjayAgICAgICAgTWVnYWhlcnR6IFgtSmFjawogIG1vdG9yb2xhLWNvZGV4ICAgICAgICAgTW90b3JvbGEgQ29kZXggMzI2WCBTZXJpZXMKICBtb3Rvcm9sYS1tb250YW5hICAgICAgIE1vdG9yb2xhIE1vbnRhbmEKICBtdDU2MzR6cHggICAgICAgICAgICAgIE11bHRpdGVjaCBNVDU2MzRaUFgKICByb2Nrd2VsbC12OTAgICAgICAgICAgIFJvY2t3ZWxsIFYuOTAgNTZLCiAgcm9sbS0yNDRwYyAgICAgICAgICAgICBTaWVtZW5zL1JvbG0gMjQ0UEMgKEFUIGNvbW1hbmQgc2V0KQogIHJvbG0tNjAwLXNlcmllcyAgICAgICAgU2llbWVucy9Sb2xtIDYwMCBTZXJpZXMgKEFUIGNvbW1hbmQgc2V0KQogIHNwaXJpdC1paSAgICAgICAgICAgICAgUXVpY2tDb21tIFNwaXJpdCBJSQogIHN1cHJhc29uaWMgICAgICAgICAgICAgU3VwcmFTb25pYyBWMjg4KwogIHN1cHJhLWV4cHJlc3MtdjkwICAgICAgU3VwcmEgRXhwcmVzcyBWLjkwCgogICBPbmUgb2YgdGhlIG5ldyB0eXBlcywgImdlbmVyaWMtaGlnaC1zcGVlZCIgbmVlZHMgYSBiaXQgb2YgZXhwbGFuYXRpb24uCiAgIFRoaXMgdHlwZSB3YXMgYWRkZWQgdG8gZWFzaWx5IGhhbmRsZSBvdGhlciB0eXBlcyB0aGF0IGFyZSBub3QKICAgZXhwbGljaXRseSBjb3ZlcmVkLCB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlIGJvdGhlciBvZiBhZGRpbmcgYQogICBjb21wbGV0ZSB1c2VyLWRlZmluZWQgbW9kZW0gdHlwZS4gVGhpcyBvbmUgd29ya3MgZm9yIG1vZGVybiBtb2RlbXMKICAgdGhhdCB1c2UgdGhlIEFUIGNvbW1hbmQgc2V0LCBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCB0aGUgZGVmYXVsdAogICAoImZhY3RvcnkiKSBzZXR0aW5ncyBvZiB0aGUgbW9kZW0gKGEpIGFyZSBhcHByb3ByaWF0ZSBmb3IgS2VybWl0LCAoYikKICAgaW5jbHVkZSBlcnJvciBjb3JyZWN0aW9uLCBkYXRhIGNvbXByZXNzaW9uLCBhbmQgc3BlZWQgYnVmZmVyaW5nOyBhbmQKICAgKGMpIGFyZSByZWNhbGxhYmxlIHdpdGggdGhlIGNvbW1hbmQgQVQmRi4KCiAgIElmIHRoZSBjb21tYW5kIHRvIHJlY2FsbCB5b3VyIG1vZGVtJ3MgcHJvZmlsZSBpcyBub3QgQVQmRiwgdXNlIHRoZSBTRVQKICAgTU9ERU0gQ09NTUFORCBJTklULVNUUklORyBjb21tYW5kIHRvIHNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIG1vZGVtCiAgIGNvbW1hbmQuIFRoZSBkZWZhdWx0IGluaXQtc3RyaW5nIGlzIEFUJkZcMTMgKHRoYXQgaXMsIEFULCBhbXBlcnNhbmQsCiAgIEYsIGFuZCB0aGVuIGNhcnJpYWdlIHJldHVybik7IGEgc3VydmV5IG9mIGFib3V0IDIwIG1vZGVybiBtb2RlbSB0eXBlcwogICBzaG93cyB0aGV5IGFsbCBzdXBwb3J0IHRoaXMsIGJ1dCB0aGV5IG1pZ2h0IG1lYW4gZGlmZmVyZW50IHRoaW5ncyBieQogICBpdC4gRm9yIGV4YW1wbGUsIHRoZSBVU1IgU3BvcnRzdGVyIG9yIENvdXJpZXIgbmVlZHMgQVQmRjEgKG5vdCBBVCZGLAogICB3aGljaCBpcyBlcXVpdmFsZW50IHRvIEFUJkYwLCB3aGljaCByZWNhbGxzIGFuIGluYXBwcm9wcmlhdGUgcHJvZmlsZSksCiAgIHNvIGZvciBVU1IgbW9kZW1zOgoKICBzZXQgbW9kZW0gdHlwZSBnZW5lcmljLWhpZ2gtc3BlZWQKICBzZXQgbW9kZW0gY29tbWFuZCBpbml0IEFUJkYxXDEzCgogICBPZiBjb3Vyc2UsIFVTUiBtb2RlbXMgYWxyZWFkeSBoYXZlIHRoZWlyIG93biBidWlsdC1pbiBtb2RlbSB0eXBlLiBCdXQKICAgaWYgeW91IHVzZSB0aGlzIG9uZSBpbnN0ZWFkLCBpdCB3aWxsIGRpYWwgZmFzdGVyIGJlY2F1c2UgaXQgaGFzIGZld2VyCiAgIGNvbW1hbmRzIHRvIGdpdmUgdG8gdGhlIG1vZGVtOyBpbiB0aGF0IHNlbnNlICImRjEiIGlzIGxpa2UgYSBtYWNybwogICB0aGF0IGJ1bmRsZXMgbnVtZXJvdXMgY29tbWFuZHMgaW50byBhIHNpbmdsZSBvbmUuIFNlZSB5b3VyIG1vZGVtCiAgIG1hbnVhbCBmb3IgZGV0YWlscyBhYm91dCBmYWN0b3J5IHByb2ZpbGVzIGFuZCBjb21tYW5kcyB0byByZWNhbGwgdGhlbS4KCiAgIFdBUk5JTkc6IERvIG5vdCB1c2UgdGhlIGdlbmVyaWMtaGlnaC1zcGVlZCBtb2RlbSB0eXBlIGluIG9wZXJhdGluZwogICBzeXN0ZW1zIGxpa2UgVk1TIHdoZXJlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpcyBub3QgYXZhaWxhYmxlLCBhdAogICBsZWFzdCBub3QgdW5sZXNzIHlvdSBjaGFuZ2UgdGhlIGluaXQgc3RyaW5nIGZyb20gQVQmRlwxMyB0byBzb21ldGhpbmcKICAgZWxzZSB0aGF0IGVuYWJsZXMgbG9jYWwgWG9uL1hvZmYgb3Igb3RoZXIgYXBwcm9wcmlhdGUgdHlwZSBvZiBmbG93CiAgIGNvbnRyb2wuCgogICBBbHNvIHNlZSBbMzk2XVNlY3Rpb24gMi4xLjcgZm9yIGFkZGl0aW9uYWwgaGludHMgYWJvdXQgbWFraW5nIGRpYWxpbmcKICAgZ28gZmFzdGVyLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4yLjIuIE5ldyBNb2RlbSBDb250cm9scwoKICAgU0VUIE1PREVNIENBUEFCSUxJVElFUyBsaXN0CiAgICAgICAgICBJbiBDLUtlcm1pdCA3LjAsIHRoaXMgY29tbWFuZCBhdXRvbWF0aWNhbGx5IHR1cm5zIE1PREVNCiAgICAgICAgICBTUEVFRC1NQVRDSElORyBPRkYgaWYgU0IgKFNwZWVkIEJ1ZmZlcmluZykgaXMgaW4gdGhlIGxpc3QsIGFuZAogICAgICAgICAgdHVybnMgaXQgT04gaWYgU0IgaXMgYWJzZW50LgoKICAgU0VUIE1PREVNIENPTU1BTkQgUFJFRElBTC1JTklUIFsgdGV4dCBdCiAgICAgICAgICBDb21tYW5kcyB0byBiZSBzZW50IHRvIHRoZSBtb2RlbSBqdXN0IHByaW9yIHRvIGRpYWxpbmcuCiAgICAgICAgICBOb3JtYWxseSBub25lLgoKICAgU0VUIE1PREVNIFNQRUFLRVIgeyBPTiwgT0ZGIH0KICAgICAgICAgIERldGVybWluZXMgd2hldGhlciBtb2RlbSBzcGVha2VyIGlzIG9uIG9yIG9mZiB3aGlsZSBjYWxsIGlzCiAgICAgICAgICBiZWluZyBwbGFjZWQuIE9OIGJ5IGRlZmF1bHQuIE5vdGU6IFRoaXMgY29tbWFuZCBkb2VzIG5vdAogICAgICAgICAgcHJvdmlkZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIHdoZW4gdGhlIHNwZWFrZXIgaXMgb24gb3IKICAgICAgICAgIG9mZi4gTm9ybWFsbHksIE9OIG1lYW5zIHdoaWxlIHRoZSBjYWxsIGlzIGJlaW5nIHBsYWNlZCwgdW50aWwKICAgICAgICAgIHRoZSBwb2ludCBhdCB3aGljaCBjYXJyaWVyIGlzIHN1Y2Nlc3NmdWxseSBlc3RhYmxpc2hlZC4gSWYgeW91cgogICAgICAgICAgbW9kZW0gaGFzIGEgZGlmZmVyZW50IHNwZWFrZXIgb3B0aW9uIHRoYXQgeW91IHdhbnQgdG8gY2hvb3NlLAogICAgICAgICAgdGhlbiB1c2UgdGhlIFNFVCBNT0RFTSBDT01NQU5EIFNQRUFLRVIgT04gdGV4dCBjb21tYW5kIHRvCiAgICAgICAgICBzcGVjaWZ5IHRoaXMgb3B0aW9uLgoKICAgU0VUIE1PREVNIENPTU1BTkQgU1BFQUtFUiB7IE9OLCBPRkYgfSBbIHRleHQgXQogICAgICAgICAgU3BlY2lmeSBvciBvdmVycmlkZSB0aGUgY29tbWFuZHMgdG8gdHVybiB5b3VyIG1vZGVtJ3Mgc3BlYWtlcgogICAgICAgICAgb24gYW5kIG9mZi4KCiAgIFNFVCBNT0RFTSBWT0xVTUUgeyBMT1csIE1FRElVTSwgSElHSCB9CiAgICAgICAgICBXaGVuIE1PREVNIFNQRUFLRVIgaXMgb24sIHNlbGVjdCB2b2x1bWUuIE5vdGU6IEluIHNvbWUgbW9kZW1zLAogICAgICAgICAgZXNwZWNpYWxseSBpbnRlcm5hbCBvbmVzLCB0aGVzZSBjb21tYW5kcyBoYXZlIG5vIGVmZmVjdDsgdGhpcwogICAgICAgICAgaXMgYSBsaW1pdGF0aW9uIG9mIHRoZSBwYXJ0aWN1bGFyIG1vZGVtLCBub3Qgb2YgS2VybWl0LgoKICAgU0VUIE1PREVNIENPTU1BTkQgVk9MVU1FIHsgTE9XLCBNRURJVU0sIEhJR0ggfSBbIHRleHQgXQogICAgICAgICAgU3BlY2lmeSBvciBvdmVycmlkZSB0aGUgY29tbWFuZHMgdG8gc2V0IHlvdXIgbW9kZW0ncyBzcGVha2VyCiAgICAgICAgICB2b2x1bWUuCgogICBTRVQgTU9ERU0gQ09NTUFORCBJR05PUkUtRElBTFRPTkUgWyB0ZXh0IF0KICAgICAgICAgIFRoZSBjb21tYW5kIHRvIGVuYWJsZSBibGluZCBkaWFsaW5nIChbMzk3XVNlY3Rpb24gMi4xLjYpLgoKICAgU0VUIE1PREVNIEVTQ0FQRS1DSEFSQUNURVIgY29kZQogICAgICAgICAgSGFzIGJlZW4gYXVnbWVudGVkIHRvIGFsbG93IGNvZGVzIG9mIDAgb3IgbGVzczogPCAwIG1lYW5zIHRoZQogICAgICAgICAgZXNjYXBlIG1lY2hhbmlzbSBpcyBkaXNhYmxlZC4gPSAwIG1lYW5zIHRvIHVzZSAocmVzdG9yZSkgdGhlCiAgICAgICAgICBkZWZhdWx0IHZhbHVlIGZyb20gdGhlIG1vZGVtIGRhdGFiYXNlLiA+IDAgYW5kIDwgMTI4IGlzIGEKICAgICAgICAgIGxpdGVyYWwgdmFsdWUgdG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4gPiAxMjcKICAgICAgICAgIG1lYW5zIHRoZSBlc2NhcGUgbWVjaGFuaXNtIGlzIGRpc2FibGVkLiBUaGlzIGFmZmVjdHMgIm1vZGVtCiAgICAgICAgICBoYW5ndXAiLiBXaGVuIHRoZSBlc2NhcGUgbWVjaGFuaXNtIGlzIGRpc2FibGVkLCBidXQgU0VUIE1PREVNCiAgICAgICAgICBIQU5HVVAtTUVUSE9EIGlzIE1PREVNLUNPTU1BTkQsIGl0IHNlbmRzIHRoZSBoYW5ndXAgY29tbWFuZAogICAgICAgICAgaW1tZWRpYXRlbHksIHdpdGhvdXQgdGhlIDxwYXVzZT4rKys8cGF1c2U+IGJ1c2luZXNzIGZpcnN0LiBUaGlzCiAgICAgICAgICBpcyB1c2VmdWwgKGZvciBleGFtcGxlKSB3aGVuIHNlbmRpbmcgbG90cyBvZiBudW1lcmljIHBhZ2VzLCBhCiAgICAgICAgICBwcm9jZXNzIGluIHdoaWNoIG5ldmVyIHdlIGdvIG9ubGluZSwgYW5kIHNvIG5ldmVyIG5lZWQgdG8KICAgICAgICAgIGVzY2FwZSBiYWNrLiBFbGltaW5hdGluZyB0aGUgdW5uZWNlc3NhcnkgcGF1c2VzIGFuZCBlc2NhcGUKICAgICAgICAgIHNlcXVlbmNlIGFsbG93cyBhIGxvdCBtb3JlIHBhZ2VzIHRvIGJlIHNlbnQgcGVyIHVuaXQgdGltZS4KCiAgIFJlY2FsbCB0aGF0IEMtS2VybWl0IGNhbiBkaWFsIG1vZGVtcyB0byB3aGljaCBpdCBpcyBjb25uZWN0ZWQgdmlhCiAgIFRDUC9JUCAoVGVsbmV0IG9yIFJsb2dpbikgYXMgZGVzY3JpYmVkIG9uIHBhZ2UgMTI2IG9mIFszOThdVXNpbmcKICAgQy1LZXJtaXQsIDJuZCBFZC4gSW4gdGhpcyBjYXNlIHRoZSBNT0RFTSBIQU5HVVAtTUVUSE9EIHNob3VsZCBiZQogICBNT0RFTS1DT01NQU5ELCBzaW5jZSBSUy0yMzIgc2lnbmFscyBkb24ndCB3b3JrIG92ZXIgVENQL0lQCiAgIGNvbm5lY3Rpb25zLiBBcyBub3RlZCBpbiB0aGUgbWFudWFsLCBzdWNoIGNvbm5lY3Rpb25zIGFyZSBzZXQgdXAgYnkKICAgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKCiAgc2V0IGhvc3QgaG9zdCBbIHBvcnQgXQogIHNldCBtb2RlbSB0eXBlIG5hbWUKICBkaWFsIG51bWJlcgoKICAgQnV0IHRoaXMgY2FuIGNhdXNlIGNvbXBsaWNhdGlvbnMgd2hlbiB5b3UgdXNlIEtlcm1pdCB0byBzd2l0Y2ggYmV0d2VlbgogICBzZXJpYWwgYW5kIFRDUC9JUCBjb25uZWN0aW9ucy4gSW4gdGhlIGZvbGxvd2luZyBzZXF1ZW5jZToKCiAgc2V0IGhvc3QgbmFtZQogIHNldCBtb2RlbSB0eXBlIG5hbWUKICBzZXQgcG9ydCBuYW1lCgogICB0aGUgZmlyc3QgdHdvIGNvbW1hbmRzIG9iZXkgdGhlIHJ1bGVzIGZvciBkaWFsaW5nIG91dCBvdmVyIFRlbG5ldC4KICAgSG93ZXZlciwgdGhlIFNFVCBQT1JUIGNvbW1hbmQgcmVxdWlyZXMgdGhhdCBLZXJtaXQgY2xvc2UgaXRzIGN1cnJlbnQKICAgKFRlbG5ldCkgY29ubmVjdGlvbiBiZWZvcmUgaXQgY2FuIG9wZW4gdGhlIHNlcmlhbCBwb3J0IChzaW5jZSBLZXJtaXQKICAgY2FuIG9ubHkgaGF2ZSBvbmUgY29ubmVjdGlvbiBvcGVuIGF0IGEgdGltZSkuIEJ1dCBzaW5jZSBhIG1vZGVtIHR5cGUKICAgd2FzIHNldCBhZnRlciB0aGUgInNldCBob3N0IiBjb21tYW5kIHdhcyBnaXZlbiwgS2VybWl0IGFzc3VtZXMgaXQgaXMgYQogICBUZWxuZXQgZGlhbG91dCBjb25uZWN0aW9uIGFuZCBzbyBzZW5kcyB0aGUgbW9kZW0ncyBoYW5ndXAgc2VxdWVuY2UgaXMKICAgc2VudCB0byB0aGUgVGVsbmV0IGhvc3QuIFRvIGF2b2lkIHRoaXMsIGNsb3NlIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb24KICAgZXhwbGljaXRseSBiZWZvcmUgb3BlbmluZyB0aGUgc2VyaWFsIG9uZToKCiAgc2V0IGhvc3QgbmFtZQogIGNsb3NlCiAgc2V0IG1vZGVtIHR5cGUgbmFtZQogIHNldCBwb3J0IG5hbWUKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjMuIFRFTE5FVCBhbmQgUkxPR0lOCgogICBGb3IgYWRkaXRpb25hbCBiYWNrZ3JvdW5kLCBwbGVhc2UgYWxzbyByZWFkIHRoZSBbMzk5XVRFTE5FVC5UWFQgZmlsZSwKICAgYWxzbyBhdmFpbGFibGUgb24gdGhlIFdlYiBpbiBbNDAwXUhUTUwgZm9ybWF0LgoKICAgQ2F1dGlvbnM6CgogICAgICogSWYgbWFraW5nIGEgVGVsbmV0IGNvbm5lY3Rpb24gd2l0aCBDLUtlcm1pdCB0YWtlcyBhIHZlcnkgbG9uZwogICAgICAgdGltZSwgbGlrZSBvdmVyIGEgbWludXRlLCB3aGVyZWFzIHRoZSBzeXN0ZW0gVGVsbmV0IHByb2dyYW0gbWFrZXMKICAgICAgIHRoZSBzYW1lIGNvbm5lY3Rpb24gaW1tZWRpYXRlbHksIHRyeSBpbmNsdWRpbmcgdGhlIC9OT1dBSVQgc3dpdGNoOgogIEMtS2VybWl0PiB0ZWxuZXQgL25vd2FpdCBob3N0bmFtZQogICAgICAgU2VlIFs0MDFdVEVMTkVULlRYVCBvciBbNDAyXVRFTE5FVC5IVE0gZm9yIGRldGFpbHMuIElmIGl0IGFsc28KICAgICAgIHRha2VzIGEgdmVyeSBsb25nIHRpbWUgdG8gbWFrZSBhIFRlbG5ldCBjb25uZWN0aW9uIHdpdGggc3lzdGVtCiAgICAgICBUZWxuZXQsIHRoZW4gdGhlIGRlbGF5IGlzIG1vc3QgbGlrZWx5IGNhdXNlZCBieSByZXZlcnNlIEROUwogICAgICAgbG9va3VwcyB3aGVuIHlvdXIgaG9zdCBpcyBub3QgcHJvcGVybHkgcmVnaXN0ZXJlZCBpbiBETlMuCiAgICAgKiBXaGVuIHN1cHBseWluZyBudW1lcmljIElQIGFkZHJlc3NlcyB0byBDLUtlcm1pdCBvciB0byBhbnkgb3RoZXIKICAgICAgIGFwcGxpY2F0aW9uIChyZWd1bGFyIFRlbG5ldCwgUmxvZ2luLCBldGMpLCBkbyBub3QgaW5jbHVkZSBsZWFkaW5nCiAgICAgICAwJ3MgaW4gYW55IGZpZWxkcyB1bmxlc3MgeW91IGludGVuZCBmb3IgdGhvc2UgZmllbGRzIHRvIGJlCiAgICAgICBpbnRlcnByZXRlZCBhcyBvY3RhbCAob3IgaGV4KSBudW1iZXJzLiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlCiAgICAgICBJbnRlcm5ldCBhZGRyZXNzIGludGVycHJldGVyICh0aGUgc29ja2V0cyBsaWJyYXJ5IGluZXRfYWRkcigpCiAgICAgICByb3V0aW5lKSBpbmNsdWRlcyB0aGVzZSB3b3JkczoKCiAgICAgQWxsIG51bWJlcnMgc3VwcGxpZWQgYXMgInBhcnRzIiBpbiBhICIuIiBub3RhdGlvbiBtYXkgYmUgZGVjaW1hbCwKICAgICBvY3RhbCwgb3IgaGV4YWRlY2ltYWwsIGFzIHNwZWNpZmllZCBpbiB0aGUgQyBsYW5ndWFnZSAodGhhdCBpcywgYQogICAgIGxlYWRpbmcgMHggb3IgMFggaW1wbGllcyBoZXhhZGVjaW1hbDsgb3RoZXJ3aXNlLCBhIGxlYWRpbmcgMAogICAgIGltcGxpZXMgb2N0YWw7IG90aGVyd2lzZSwgdGhlIG51bWJlciBpcyBpbnRlcnByZXRlZCBhcyBkZWNpbWFsKS4KICAgICAgIFRvIGlsbHVzdHJhdGUsIDEyOC41OS4zOS4yIGFuZCAxMjguMDU5LjAzOS4wMDIgYXJlIG5vdCB0aGUgc2FtZQogICAgICAgaG9zdCEgRXZlbiB0aG91Z2ggbW9zdCBvZiB0aGUgZmllbGRzIGNvbnRhaW4gbm9uLW9jdGFsIGRpZ2l0cy4KICAgICAgIFVzaW5nIHN5c3RlbSBUZWxuZXQgKG5vdCBLZXJtaXQpOgogICQgdGVsbmV0IDEyOC4wNTkuMDM5LjAwMgogIFRyeWluZyAxMjguNDkuMzMuMiAuLi4KICAgICAgIE9mIGNvdXJzZSB0aGUgc2FtZSB0aGluZyBoYXBwZW5zIHdpdGggS2VybWl0IGJlY2F1c2UgaXQgdXNlcyAoYXMKICAgICAgIGl0IG11c3QpIHRoZSBzYW1lIHN5c3RlbSBzZXJ2aWNlIGZvciByZXNvbHZpbmcgbmV0d29yayBhZGRyZXNzZXMKICAgICAgIHRoYXQgVGVsbmV0LCBGVFAsIGFuZCBhbGwgb3RoZXIgVENQL0lQIGFwcGxpY2F0aW9ucyB1c2UuCiAgICAgKiBUaGUgUkxPR0lOIHNlY3Rpb24gb24gcGFnZSAxMjMgZG9lcyBub3QgbWFrZSBpdCBjbGVhciB0aGF0IHlvdSBjYW4KICAgICAgIHVzZSB0aGUgU0VUIFRFTE5FVCBURVJNSU5BTC1UWVBFIGNvbW1hbmQgdG8gZ292ZXJuIHRoZSB0ZXJtaW5hbAogICAgICAgdHlwZSB0aGF0IGlzIHJlcG9ydGVkIGJ5IEMtS2VybWl0IHRvIHRoZSBSTE9HSU4gc2VydmVyLgogICAgICogTm90ZSB0aGF0IHRoZSBTRVQgVENQIGNvbW1hbmRzIGRlc2NyaWJlZCBvbiBwYWdlcyAxMjItMTIzIG1pZ2h0IGJlCiAgICAgICBhYnNlbnQ7IHNvbWUgcGxhdGZvcm1zIHRoYXQgc3VwcG9ydCBUQ1AvSVAgZG8gbm90IHN1cHBvcnQgdGhlc2UKICAgICAgIHBhcnRpY3VsYXIgY29udHJvbHMuCgogICBOZXcgY29tbWFuZHM6CgogICBURUxPUFQgeyBBTywgQVlULCBCUkVBSywgQ0FOQ0VMLCBFQywgRUwsIEVPRiwgRU9SLCBHQSwgSVAsIERNQVJLLAogICAgICAgICAgRE8sIERPTlQsIE5PUCwgU0IsIFNFLCBTVVNQLCBXSUxMLCBXT05UIH0KICAgICAgICAgIFRoaXMgY29tbWFuZCB3YXMgYXZhaWxhYmxlIHByZXZpb3VzbHksIGJ1dCBzdXBwb3J0ZWQgb25seSBETywKICAgICAgICAgIERPTlQsIFdJTEwsIGFuZCBXT05ULiBOb3cgaXQgbGV0cyB5b3Ugc2VuZCBhbGwgdGhlIFRlbG5ldAogICAgICAgICAgcHJvdG9jb2wgY29tbWFuZHMuIE5vdGUgdGhhdCBjZXJ0YWluIGNvbW1hbmRzIGRvIG5vdCByZXF1aXJlIGEKICAgICAgICAgIHJlc3BvbnNlLCBhbmQgdGhlcmVmb3JlIGNhbiBiZSB1c2VkIGFzIG5vbmRlc3RydWN0aXZlICJwcm9iZXMiCiAgICAgICAgICB0byBzZWUgaWYgdGhlIFRlbG5ldCBzZXNzaW9uIGlzIHN0aWxsIG9wZW47IGUuZy46CgogIHNldCBob3N0IHh5emNvcnAuY29tCiAgLi4uCiAgdGVsb3B0IG5vcAogIGlmIGZhaWwgc3RvcCAxIENvbm5lY3Rpb24gbG9zdAoKICAgU0VUIFRDUCBBRERSRVNTIFsgaXAtYWRkcmVzcyBdCiAgICAgICAgICBTcGVjaWZpZXMgdGhlIElQIGFkZHJlc3Mgb2YgdGhlIGNvbXB1dGVyIHRoYXQgQy1LZXJtaXQgaXMKICAgICAgICAgIHJ1bm5pbmcgb24uIE5vcm1hbGx5IHRoaXMgaXMgbm90IG5lY2Vzc2FyeS4gVGhlIGV4Y2VwdGlvbiB3b3VsZAogICAgICAgICAgYmUgaWYgeW91ciBtYWNoaW5lIGhhcyBtdWx0aXBsZSBuZXR3b3JrIGFkYXB0ZXJzIChwaHlzaWNhbCBvcgogICAgICAgICAgdmlydHVhbCkgd2l0aCBhIGRpZmZlcmVudCBhZGRyZXNzIGZvciBlYWNoIGFkYXB0ZXIgQU5EIHlvdSB3YW50CiAgICAgICAgICBDLUtlcm1pdCB0byB1c2UgYSBzcGVjaWZpYyBhZGRyZXNzIHdoZW4gbWFraW5nIG91dGdvaW5nCiAgICAgICAgICBjb25uZWN0aW9ucyBvciBhY2NlcHRpbmcgaW5jb21pbmcgY29ubmVjdGlvbnMuCgogICBTRVQgVENQIEROUy1TRVJWSUNFLVJFQ09SRFMgeyBPTiwgT0ZGIH0KICAgICAgICAgIFRlbGxzIEMtS2VybWl0IHdoZXRoZXIgdG8gdHJ5IHRvIHVzZSBETlMgU1JWIHJlY29yZHMgdG8KICAgICAgICAgIGRldGVybWluZSB0aGUgaG9zdCBhbmQgcG9ydCBudW1iZXIgdXBvbiB3aGljaCB0byBmaW5kIGFuCiAgICAgICAgICBhZHZlcnRpc2VkIHNlcnZpY2UuIEZvciBleGFtcGxlLCBpZiBhIGhvc3Qgd2FudHMgcmVndWxhciBUZWxuZXQKICAgICAgICAgIGNvbm5lY3Rpb25zIHJlZGlyZWN0ZWQgdG8gc29tZSBwb3J0IG90aGVyIHRoYW4gMjMsIHRoaXMgZmVhdHVyZQogICAgICAgICAgYWxsb3dzIEMtS2VybWl0IHRvIGFzayB0aGUgaG9zdCB3aGljaCBwb3J0IGl0IHNob3VsZCB1c2UuIFNpbmNlCiAgICAgICAgICBub3QgYWxsIGRvbWFpbiBzZXJ2ZXJzIGFyZSBzZXQgdXAgdG8gYW5zd2VyIHN1Y2ggcmVxdWVzdHMsIHRoaXMKICAgICAgICAgIGZlYXR1cmUgaXMgT0ZGIGJ5IGRlZmF1bHQuCgogICBTRVQgVENQIFJFVkVSU0UtRE5TLUxPT0tVUCB7IE9OLCBPRkYsIEFVVE8gfQogICAgICAgICAgVGVsbHMgS2VybWl0IHdoZXRoZXIgdG8gcGVyZm9ybSBhIHJldmVyc2UgRE5TIGxvb2t1cCBvbiBUQ1AvSVAKICAgICAgICAgIGNvbm5lY3Rpb25zLiBUaGlzIGFsbG93cyBLZXJtaXQgdG8gZGV0ZXJtaW5lIHRoZSBhY3R1YWwKICAgICAgICAgIGhvc3RuYW1lIG9mIHRoZSBob3N0IGl0IGlzIGNvbm5lY3RlZCB0bywgd2hpY2ggaXMgdXNlZnVsIGZvcgogICAgICAgICAgY29ubmVjdGlvbnMgdG8gaG9zdCBwb29scywgYW5kIGlzIHJlcXVpcmVkIGZvciBLZXJiZXJvcwogICAgICAgICAgY29ubmVjdGlvbnMgdG8gaG9zdCBwb29scyBhbmQgZm9yIGluY29taW5nIGNvbm5lY3Rpb25zLiBJZiB0aGUKICAgICAgICAgIG90aGVyIGhvc3QgZG9lcyBub3QgaGF2ZSBhIEROUyBlbnRyeSwgdGhlIHJldmVyc2UgbG9va3VwIGNvdWxkCiAgICAgICAgICB0YWtlIGEgbG9uZyB0aW1lIChtaW51dGVzKSB0byBmYWlsLCBidXQgdGhlIGNvbm5lY3Rpb24gd2lsbAogICAgICAgICAgc3RpbGwgYmUgbWFkZS4gVHVybiB0aGlzIG9wdGlvbiBPRkYgZm9yIHNwZWVkaWVyIGNvbm5lY3Rpb25zIGlmCiAgICAgICAgICB5b3UgZG8gbm90IG5lZWQgdG8ga25vdyBleGFjdGx5IHdoaWNoIGhvc3QgeW91IGFyZSBjb25uZWN0ZWQgdG8KICAgICAgICAgIGFuZCB5b3UgYXJlIG5vdCB1c2luZyBLZXJiZXJvcy4gQVVUTywgdGhlIGRlZmF1bHQsIG1lYW5zIHRoZQogICAgICAgICAgbG9va3VwIGlzIGRvbmUgb24gaG9zdG5hbWVzLCBidXQgbm90IG9uIG51bWVyaWMgSVAgYWRkcmVzc2VzLgoKICAgU0VUIFRFTE5FVCBXQUlULUZPUi1ORUdPVElBVElPTlMgeyBPTiwgT0ZGIH0KICAgICAgICAgIEVhY2ggVGVsbmV0IG9wdGlvbiBtdXN0IGJlIGZ1bGx5IG5lZ290aWF0ZWQgZWl0aGVyIE9uIG9yIE9mZgogICAgICAgICAgYmVmb3JlIHRoZSBzZXNzaW9uIGNhbiBjb250aW51ZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHRydWUgd2l0aAogICAgICAgICAgb3B0aW9ucyB0aGF0IHJlcXVpcmUgc3ViLW5lZ290aWF0aW9ucyBzdWNoIGFzIEF1dGhlbnRpY2F0aW9uLAogICAgICAgICAgRW5jcnlwdGlvbiwgYW5kIEtlcm1pdDsgZm9yIHByb3BlciBzdXBwb3J0IG9mIHRoZXNlIG9wdGlvbnMKICAgICAgICAgIEtlcm1pdCBtdXN0IHdhaXQgZm9yIHRoZSBuZWdvdGlhdGlvbnMgdG8gY29tcGxldGUuIE9mIGNvdXJzZSwKICAgICAgICAgIEtlcm1pdCBoYXMgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciBhIHJlcGx5IGlzIGRlbGF5ZWQgb3Igbm90CiAgICAgICAgICBjb21pbmcgYXQgYWxsLCBhbmQgc28gd2lsbCB3YWl0IGEgbWludXRlIG9yIG1vcmUgZm9yIHJlcXVpcmVkCiAgICAgICAgICByZXBsaWVzIGJlZm9yZSBjb250aW51aW5nIHRoZSBzZXNzaW9uLiBJZiB5b3Uga25vdyB0aGF0CiAgICAgICAgICBLZXJtaXQncyBUZWxuZXQgcGFydG5lciB3aWxsIG5vdCBiZSBzZW5kaW5nIHRoZSByZXF1aXJlZAogICAgICAgICAgcmVwbGllcywgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gb2YgT0ZGIHRvIGF2b2lkIHRoZSBsb25nCiAgICAgICAgICB0aW1lb3V0cy4gT3IgeW91IGNhbiBpbnN0cnVjdCBLZXJtaXQgdG8gUkVGVVNFIHNwZWNpZmljIG9wdGlvbnMKICAgICAgICAgIHdpdGggdGhlIFNFVCBURUxPUFQgY29tbWFuZC4KCiAgIFNFVCBURUxPUFQgWyB7IC9DTElFTlQsIC9TRVJWRVIgfSBdIG9wdGlvbgogICAgICAgICAgeyBBQ0NFUFRFRCwgUkVGVVNFRCwgUkVRVUVTVEVELCBSRVFVSVJFRCB9CiAgICAgICAgICBbIHsgQUNDRVBURUQsIFJFRlVTRUQsIFJFUVVFU1RFRCwgUkVRVUlSRUQgfSBdCiAgICAgICAgICBTRVQgVEVMT1BUIGxldHMgeW91IHNwZWNpZnkgcG9saWN5IHJlcXVpcmVtZW50cyBmb3IgS2VybWl0J3MKICAgICAgICAgIGhhbmRsaW5nIG9mIFRlbG5ldCBvcHRpb24gbmVnb3RpYXRpb25zLiBTZXR0aW5nIGFuIG9wdGlvbiBpcwogICAgICAgICAgUkVRVUlSRUQgY2F1c2VzIEtlcm1pdCB0byBvZmZlciB0aGUgb3B0aW9uIHRvIHRoZSBwZWVyIGFuZAogICAgICAgICAgZGlzY29ubmVjdCBpZiB0aGUgb3B0aW9uIGlzIHJlZnVzZWQuIFJFUVVFU1RFRCBjYXVzZXMgS2VybWl0IHRvCiAgICAgICAgICBvZmZlciBhbiBvcHRpb24gdG8gdGhlIHBlZXIuIEFDQ0VQVEVEIHJlc3VsdHMgaW4gbm8gb2ZmZXIgYnV0CiAgICAgICAgICBLZXJtaXQgd2lsbCBhdHRlbXB0IHRvIG5lZ290aWF0ZSB0aGUgb3B0aW9uIGlmIGl0IGlzIHJlcXVlc3RlZC4KICAgICAgICAgIFJFRlVTRUQgaW5zdHJ1Y3RzIEtlcm1pdCB0byByZWZ1c2UgdGhlIG9wdGlvbiBpZiBpdCBpcwogICAgICAgICAgcmVxdWVzdGVkIGJ5IHRoZSBwZWVyLgoKICAgICAgICAgIFNvbWUgb3B0aW9ucyBhcmUgbmVnb3RpYXRlZCBpbiB0d28gZGlyZWN0aW9ucyBhbmQgYWNjZXB0CiAgICAgICAgICBzZXBhcmF0ZSBwb2xpY2llcyBmb3IgZWFjaCBkaXJlY3Rpb247IHRoZSBmaXJzdCBrZXl3b3JkIGFwcGxpZXMKICAgICAgICAgIHRvIEtlcm1pdCBpdHNlbGYsIHRoZSBzZWNvbmQgYXBwbGllcyB0byBLZXJtaXQncyBUZWxuZXQKICAgICAgICAgIHBhcnRuZXI7IGlmIHRoZSBzZWNvbmQga2V5d29yZCBpcyBvbWl0dGVkLCBhbiBhcHByb3ByaWF0ZQogICAgICAgICAgKG9wdGlvbi1zcGVjaWZpYykgZGVmYXVsdCBpcyBhcHBsaWVkLiBZb3UgY2FuIGFsc28gaW5jbHVkZSBhCiAgICAgICAgICAvQ0xJRU5UIG9yIC9TRVJWRVIgc3dpdGNoIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGdpdmVuCiAgICAgICAgICBwb2xpY2llcyBhcHBseSB3aGVuIEtlcm1pdCBpcyB0aGUgVGVsbmV0IGNsaWVudCBvciB0aGUgVGVsbmV0CiAgICAgICAgICBzZXJ2ZXI7IGlmIG5vIHN3aXRjaCBpcyBnaXZlbiwgdGhlIGNvbW1hbmQgYXBwbGllcyB0byB0aGUKICAgICAgICAgIGNsaWVudC4KCiAgICAgICAgICBOb3RlIHRoYXQgc29tZSBvZiBLZXJtaXQncyBUZWxuZXQgcGFydG5lcnMgZmFpbCB0byByZWZ1c2UKICAgICAgICAgIG9wdGlvbnMgdGhhdCB0aGV5IGRvIG5vdCByZWNvZ25pemUgYW5kIGluc3RlYWQgZG8gbm90IHJlc3BvbmQKICAgICAgICAgIGF0IGFsbC4gSW4gdGhpcyBjYXNlIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBTRVQgVEVMT1BUIHRvCiAgICAgICAgICBpbnN0cnVjdCBLZXJtaXQgdG8gUkVGVVNFIHRoZSBvcHRpb24gYmVmb3JlIGNvbm5lY3RpbmcgdG8gdGhlCiAgICAgICAgICBwcm9ibGVtIGhvc3QsIHRodXMgc2tpcHBpbmcgdGhlIHByb2JsZW1hdGljIG5lZ290aWF0aW9uLgoKICAgICAgICAgIFVzZSBTSE9XIFRFTE9QVCB0byB2aWV3IGN1cnJlbnQgVGVsbmV0IE9wdGlvbiBuZWdvdGlhdGlvbgogICAgICAgICAgc2V0dGluZ3MuIFNIT1cgVEVMTkVUIGRpc3BsYXlzIGN1cnJlbnQgVGVsbmV0IHNldHRpbmdzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi4zLjAuIEJ1ZyBGaXhlcwoKICAgSWYgInNldCBob3N0IG5vbmV4aXN0ZW50LWhvc3QiIHdhcyBnaXZlbiAoYW5kIGl0IHByb3Blcmx5IGZhaWxlZCksCiAgIGZvbGxvd2VkIGJ5IGNlcnRhaW4gY29tbWFuZHMgbGlrZSBTRU5ELCB0aGUgb3JpZ2luYWwgbGluZSBhbmQgbW9kZW0KICAgdHlwZSB3ZXJlIG5vdCByZXN0b3JlZCBhbmQgQy1LZXJtaXQgdGhvdWdodCB0aGF0IGl0IHN0aWxsIGhhZCBhCiAgIG5ldHdvcmsgaG9zdG5hbWU7IGZpeGVkIGluIDcuMC4KCiAgICAyLjMuMS4gVGVsbmV0IEJpbmFyeSBNb2RlIEJ1ZyBBZGp1c3RtZW50cwoKICAgU0VUIFRFTE5FVCBCVUcgQklOQVJZLU1FLU1FQU5TLVUtVE9PIHsgT04sIE9GRiB9IHdhcyBhZGRlZCB0byBlZGl0IDE5MgogICBhZnRlciB0aGUgYm9vayB3YXMgcHJpbnRlZC4gQWxzbyBTRVQgVEVMTkVUIEJVRyBCSU5BUlktVS1NRUFOUy1NRS1UT08uCiAgIFRoZSBkZWZhdWx0IGZvciBib3RoIGlzIE9GRi4gT04gc2hvdWxkIGJlIHVzZWQgd2hlbiBjb21tdW5pY2F0aW5nIHdpdGgKICAgYSBUZWxuZXQgcGFydG5lciAoY2xpZW50IG9yIHNlcnZlcikgdGhhdCBtaXN0YWtlbmx5IGJlbGlldmVzIHRoYXQKICAgdGVsbGluZyBDLUtlcm1pdCB0byBlbnRlciBUZWxuZXQgYmluYXJ5IG1vZGUgYWxzbyBtZWFucyB0aGF0IGl0LCB0b28sCiAgIGlzIGluIGJpbmFyeSBtb2RlLCBjb250cmFyeSB0byB0aGUgVGVsbmV0IHNwZWNpZmljYXRpb24sIHdoaWNoIHNheXMKICAgdGhhdCBiaW5hcnkgbW9kZSBtdXN0IGJlIG5lZ290aWF0ZWQgaW4gZWFjaCBkaXJlY3Rpb24gc2VwYXJhdGVseS4KCiAgICAyLjMuMi4gVk1TIFVDWCBUZWxuZXQgUG9ydCBCdWcgQWRqdXN0bWVudAoKICAgQSBuZXcgY29tbWFuZCwgU0VUIFRDUCBVQ1gtUE9SVC1CVUcsIHdhcyBhZGRlZCBmb3IgVk1TIHZlcnNpb25zIHdpdGgKICAgVUNYIChERUMgVENQL0lQKSwgYXBwbHlpbmcgb25seSB0byBlYXJseSB2ZXJzaW9ucyBvZiBVQ1gsIGxpa2UgMi4yIG9yCiAgIGVhcmxpZXIuIElmIHlvdSB0cnkgdG8gdXNlIFZNUyBDLUtlcm1pdCB0byBtYWtlIGEgVGVsbmV0IGNvbm5lY3Rpb24KICAgdXNpbmcgYSBwb3J0IG5hbWUgKGxpa2UgInRlbG5ldCIsIHdoaWNoIGlzIHVzZWQgYnkgZGVmYXVsdCksIHRoZQogICB1bmRlcmx5aW5nIFVDWCBnZXRzZXJ2YnluYW1lKCkgZnVuY3Rpb24gbWlnaHQgcmV0dXJuIHRoZSBzZXJ2aWNlCiAgIG51bWJlciB3aXRoIGl0cyBieXRlcyBzd2FwcGVkIGFuZCB0aGUgY29ubmVjdGlvbiB3aWxsIGZhaWwuIElmICJ0ZWxuZXQKICAgaG9zdG5hbWUgMjMiIHdvcmtzLCB0aGVuIHlvdXIgdmVyc2lvbiBvZiBVQ1ggaGFzIHRoaXMgYnVnIGFuZCB5b3UgY2FuCiAgIHB1dCAic2V0IHRjcCB1Y3gtcG9ydC1idWcgb24iIGluIHlvdXIgQ0tFUk1JVC5JTkkgZmlsZSB0byBnZXQgYXJvdW5kCiAgIGl0LgoKICAgIDIuMy4zLiBUZWxuZXQgTmV3IEVudmlyb25tZW50IE9wdGlvbgoKICAgVGhlIFRFTE5FVCBORVctRU5WSVJPTk1FTlQgb3B0aW9uIChbNDAzXVJGQyAxNTcyKSBpcyBzdXBwb3J0ZWQgYXMgNy4wLgogICBUaGlzIG9wdGlvbiBhbGxvd3MgdGhlIEMtS2VybWl0IFRlbG5ldCBjbGllbnQgdG8gc2VuZCBjZXJ0YWluCiAgIHdlbGwta25vd24gdmFyaWFibGVzIHRvIHRoZSBUZWxuZXQgc2VydmVyLCBpbmNsdWRpbmcgVVNFUiwgUFJJTlRFUiwKICAgRElTUExBWSwgYW5kIHNldmVyYWwgb3RoZXJzLiBUaGlzIGZlYXR1cmUgaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluCiAgIFdpbmRvd3MgYW5kIE9TLzIsIGRpc2FibGVkIGJ5IGRlZmF1bHQgZWxzZXdoZXJlLiBUaGUgY29tbWFuZCB0byBlbmFibGUKICAgYW5kIGRpc2FibGUgaXQgaXM6CgogIFNFVCBURUxORVQgRU5WSVJPTk1FTlQgeyBPTiwgT0ZGIH0KCiAgIFdoZW4gT04sIGFuZCB5b3UgVGVsbmV0IHRvIGFub3RoZXIgY29tcHV0ZXIsIHlvdSBtaWdodCAob3IgbWlnaHQgbm90KQogICBub3RpY2UgdGhhdCB0aGUgImxvZ2luOiIgb3IgIlVzZXJuYW1lOiIgcHJvbXB0IGRvZXMgbm90IGFwcGVhciAtLQogICB0aGF0J3MgYmVjYXVzZSB5b3VyIHVzZXJuYW1lIHdhcyBzZW50IGFoZWFkLCBpbiB3aGljaCBjYXNlIHRoZSByZW1vdGUKICAgc3lzdGVtIG1pZ2h0IHByb21wdCB5b3Ugb25seSBmb3IgeW91ciBwYXNzd29yZCAoc2ltaWxhciB0byBSbG9naW4pLgogICBVc2UgInNldCB0ZWxuZXQgZW52aXJvbm1lbnQgb2ZmIiB0byBkZWZlYXQgdGhpcyBmZWF0dXJlLCBwYXJ0aWN1bGFybHkKICAgaW4gc2NyaXB0cyB3aGVyZSB0aGUgZGlhbG9nIG11c3QgYmUgcHJlZGljdGFibGUuIFlvdSBjYW4gYWxzbyB1c2UgdGhpcwogICBjb21tYW5kIHRvIHNwZWNpZnkgb3Igb3ZlcnJpZGUgc3BlY2lmaWMgd2VsbC1rbm93biBlbnZpcm9ubWVudAogICB2YXJpYWJsZSB2YWx1ZXM6CgogU0VUIFRFTE5FVCBFTlZJUk9OTUVOVCB7IEFDQ1QsRElTUExBWSxKT0IsUFJJTlRFUixTWVNURU1UWVBFLFVTRVIgfSBbIHRleHQgXQoKICAgIDIuMy40LiBUZWxuZXQgTG9jYXRpb24gT3B0aW9uCgogICBUaGUgVEVMTkVUIExPQ0FUSU9OIG9wdGlvbiAoWzQwNF1SRkMgNzc5KSBpcyBzdXBwb3J0ZWQgaW4gNy4wLiBUaGlzCiAgIG9wdGlvbiBhbGxvd3MgdGhlIEMtS2VybWl0IFRlbG5ldCBjbGllbnQgdG8gc2VuZCBhIGxvY2F0aW9uIHN0cmluZyB0bwogICB0aGUgc2VydmVyIGlmIHRoZSBzZXJ2ZXIgaW5kaWNhdGVzIGl0cyB3aWxsaW5nbmVzcyB0byBhY2NlcHQgb25lLiBJZgogICBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCBMT0NBVElPTiBleGlzdHMgYXQgdGhlIHRpbWUgQy1LZXJtaXQKICAgc3RhcnRzLCBpdHMgdmFsdWUgaXMgdXNlZCBhcyB0aGUgbG9jYXRpb24gc3RyaW5nLiBJZiB5b3Ugd2FudCB0bwogICBjaGFuZ2UgaXQsIHVzZToKCiAgU0VUIFRFTE5FVCBMT0NBVElPTiB0ZXh0CgogICBJZiB5b3Ugb21pdCB0aGUgdGV4dCBmcm9tIHRoaXMgY29tbWFuZCwgdGhlIFRlbG5ldCBsb2NhdGlvbiBmZWF0dXJlIGlzCiAgIGRpc2FibGVkLgoKICAgU0VUIFRFTE5FVCBFTlZJUk9OTUVOVCBESVNQTEFZIGlzIHVzZWQgdG8gc2V0IHRoZSBESVNQTEFZIHZhcmlhYmxlCiAgIHRoYXQgaXMgc2VudCB0byB0aGUgaG9zdCwgYXMgd2VsbCBhcyB0aGUgdGhlIFhESVNQTEFZIGxvY2F0aW9uLgoKICAgIDIuMy41LiBDb25uZWN0aW5nIHRvIFJhdyBUQ1AgU29ja2V0cwoKICAgVGhlIFNFVCBIT1NUIGFuZCBURUxORVQgY29tbWFuZHMgbm93IGFjY2VwdCBhbiBvcHRpb25hbCBzd2l0Y2gsCiAgIC9SQVctU09DS0VULCBhdCB0aGUgZW5kLCBvbmx5IGlmIHlvdSBmaXJzdCBnaXZlIGEgaG9zdCBhbmQgYSBwb3J0LgogICBFeGFtcGxlOgoKICBzZXQgaG9zdCB4eXpjb3JwLmNvbSAyMyAvcmF3LXNvY2tldAogIHNldCBob3N0IDEyOC40OS4zOS4yOjIwMDAgL3Jhdy1zb2NrZXQKICB0ZWxuZXQgeHl6Y29ycC5jb20gMzAwMCAvcmF3CgogICBXaXRob3V0IHRoaXMgc3dpdGNoLCBDLUtlcm1pdCBiZWhhdmVzIGFzIGEgVGVsbmV0IGNsaWVudCB3aGVuIChhKSB0aGUKICAgcG9ydCBpcyAyMyBvciAxNjQ5LCBvciAoYikgdGhlIHBvcnQgaXMgbm90IDUxMyBhbmQgdGhlIHNlcnZlciBzZW50CiAgIHdoYXQgYXBwZWFyZWQgdG8gYmUgVGVsbmV0IG5lZ290aWF0aW9ucyAtLSB0aGF0IGlzLCBtZXNzYWdlcyBzdGFydGluZwogICB3aXRoIDB4RkYgKElBQykuIFdpdGggdGhpcyBzd2l0Y2gsIEtlcm1pdCBzaG91bGQgdHJlYXQgYWxsIGluY29taW5nCiAgIGJ5dGVzIGFzIHJhdyBkYXRhLCBhbmQgd2lsbCBub3QgZW5nYWdlIGluIGFueSBUZWxuZXQgbmVnb3RpYXRpb25zIG9yCiAgIE5WVCBDUkxGIG1hbmlwdWxhdGlvbnMuIFRoaXMgYWxsb3dzIHRyYW5zcGFyZW50IG9wZXJhdGlvbiB0aHJvdWdoCiAgIChlLmcuKSByYXcgVENQIHBvcnRzIG9uIENpc2NvIHRlcm1pbmFsIHNlcnZlcnMsIHRocm91Z2ggdGhlICdtb2RlbWQnCiAgIG1vZGVtIHNlcnZlciwgZXRjLgoKICAgIDIuMy42LiBJbmNvbWluZyBUQ1AgQ29ubmVjdGlvbnMKCiAgIEFjY29tcGxpc2hlZCB2aWEgU0VUIEhPU1QgKiBwb3J0LCB3ZXJlIGludHJvZHVjZWQgaW4gQy1LZXJtaXQgNi4wLCBidXQKICAgZm9yIFVOSVggb25seS4gSW4gVmVyc2lvbiA3LjAsIHRoZXkgYXJlIGFsc28gYXZhaWxhYmxlIGZvciBWTVMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMi40LiBUaGUgRUlHSFRCSVQgQ29tbWFuZAoKICAgRUlHSFRCSVQgaXMgc2ltcGx5IGEgc2hvcnRoYW5kIGZvcjogU0VUIFBBUklUWSBOT05FLCBTRVQgVEVSTUlOQUwKICAgQllURVNJWkUgOCwgU0VUIENPTU1BTkQgQllURVNJWkUgODsgdGhhdCBpcywgYSB3YXkgdG8gc2V0IHVwIGFuIDgtYml0CiAgIGNsZWFuIGNvbm5lY3Rpb24gaW4gYSBzaW5nbGUgY29tbWFuZC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjUuIFRoZSBTZXJ2aWNlcyBEaXJlY3RvcnkKCiAgIENoYXB0ZXIgNyBvZiBbNDA1XVVzaW5nIEMtS2VybWl0IGRvZXMgbm90IG1lbnRpb24gdGhlIFVMT0dJTiBtYWNybywKICAgd2hpY2ggaXMgdXNlZCBieSBvdXIgc2FtcGxlIHNlcnZpY2VzIGRpcmVjdG9yeSwgQ0tFUk1JVC5LTkQuIFVubGlrZQogICBVTklYTE9HSU4sIFZNU0xPR0lOLCBldGMsIHRoaXMgb25lIGlzIGZvciB1c2Ugd2l0aCBzeXN0ZW1zIHRoYXQKICAgcmVxdWlyZSBhIHVzZXIgSUQgYnV0IG5vIHBhc3N3b3JkLiBUaGVyZWZvcmUgaXQgZG9lc24ndCBwcm9tcHQgZm9yIGEKICAgcGFzc3dvcmQgb3Igd2FpdCBmb3IgYSBwYXNzd29yZCBwcm9tcHQgZnJvbSB0aGUgcmVtb3RlIHNlcnZpY2UuCgogICBJbiB2ZXJzaW9uIDcuMCwgdGhlIENBTEwgbWFjcm8gd2FzIGNoYW5nZWQgdG8gbm90IGV4ZWN1dGUgYSBTRVQgTU9ERU0KICAgVFlQRSBjb21tYW5kIGlmIHRoZSBnaXZlbiBtb2RlbSB0eXBlIHdhcyB0aGUgc2FtZSBhcyB0aGUgY3VycmVudCBvbmU7CiAgIG90aGVyd2lzZSB0aGUgbmV3IFNFVCBNT0RFTSBUWVBFIGNvbW1hbmQgd291bGQgb3ZlcndyaXRlIGFueQogICBjdXN0b21pemF0aW9ucyB0aGF0IHRoZSB1c2VyIGhhZCBtYWRlIHRvIHRoZSBtb2RlbSBzZXR0aW5ncy4gRGl0dG8gZm9yCiAgIFNFVCBMSU5FIC8gU0VUIFBPUlQgYW5kIFNFVCBTUEVFRC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjYuIENsb3NpbmcgQ29ubmVjdGlvbnMKCiAgIFVudGlsIHZlcnNpb24gNy4wLCB0aGVyZSB3YXMgbmV2ZXIgYW4gb2J2aW91cyBhbmQgZ2VuZXJhbCB3YXkgdG8gY2xvc2UKICAgYSBjb25uZWN0aW9uLiBJZiBhIHNlcmlhbCBjb25uZWN0aW9uIHdhcyBvcGVuLCBpdCBjb3VsZCBiZSBjbG9zZWQgYnkKICAgInNldCBsaW5lIiBvciAic2V0IHBvcnQiIChnaXZpbmcgbm8gZGV2aWNlIG5hbWUpOyBpZiBhIG5ldHdvcmsKICAgY29ubmVjdGlvbiB3YXMgb3BlbiwgaXQgY291bGQgYmUgY2xvc2VkIGJ5ICJzZXQgaG9zdCIgKG5vIGhvc3QgbmFtZSkuCgogICBJbiB2ZXJzaW9uIDcuMCwgYSBuZXcgY29tbWFuZCBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gaW4gYW4gb2J2aW91cyBhbmQKICAgc3RyYWlnaHRmb3J3YXJkIHdheSwgbm8gbWF0dGVyIHdoYXQgdGhlIGNvbm5lY3Rpb24gdHlwZToKCiAgQ0xPU0UgWyBDT05ORUNUSU9OIF0KCiAgIFRoZSBDTE9TRSBjb21tYW5kIHdhcyBhbHJlYWR5IHByZXNlbnQsIGFuZCByZXF1aXJlZCBhbiBvcGVyYW5kIHN1Y2ggYXMKICAgREVCVUctTE9HLCBXUklURS1GSUxFLCBldGMsIGFuZCBzbyBjb3VsZCBuZXZlciBiZSBnaXZlbiBieSBpdHNlbGYuIFRoZQogICBuZXcgQ09OTkVDVElPTiBvcGVyYW5kIGlzIG5vdyB0aGUgZGVmYXVsdCBvcGVyYW5kIGZvciBDTE9TRSwgc28gQ0xPU0UKICAgYnkgaXRzZWxmIGNsb3NlcyB0aGUgY29ubmVjdGlvbiwgaWYgb25lIGlzIG9wZW4sIGp1c3QgYXMgeW91IHdvdWxkCiAgIGV4cGVjdCwgZXNwZWNpYWxseSBpZiB5b3UgYXJlIGEgVGVsbmV0IG9yIEZ0cCB1c2VyLgoKICAgQWxzbyBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBuZXcgU0VUIENMT1NFLU9OLURJU0NPTk5FQ1QgY29tbWFuZCBpbgogICBbNDA2XVNlY3Rpb24gMi4xMC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjcuIFVzaW5nIEMtS2VybWl0IHdpdGggRXh0ZXJuYWwgQ29tbXVuaWNhdGlvbiBQcm9ncmFtcwoKICAgQy1LZXJtaXQgNy4wIGluY2x1ZGVzIGEgbmV3IGFiaWxpdHkgdG8gY3JlYXRlIGFuZCBjb25kdWN0IHNlc3Npb25zCiAgIHRocm91Z2ggb3RoZXIgY29tbXVuaWNhdGlvbnMgcHJvZ3JhbXMuIFR3byBtZXRob2RzIGFyZSBhdmFpbGFibGU6CgogICAgMS4gUHR5IChwc2V1ZG90ZXJtaW5hbCk6IFRoZSBleHRlcm5hbCBwcm9ncmFtIGlzIHJ1biBvbiBhCiAgICAgICAicHNldWRvdGVybWluYWwiLCB3aGljaCBpcyBjb250cm9sbGVkIGJ5IEtlcm1pdC4gVGhpcyBtZXRob2Qgd29ya3MKICAgICAgIHdpdGggcHJhY3RpY2FsbHkgYW55IGV4dGVybmFsIHByb2dyYW0sIGJ1dCBpdCBpcyBub3QgcG9ydGFibGUuIEF0CiAgICAgICB0aGlzIHdyaXRpbmcsIGl0IHdvcmtzIG9ubHkgb24gc29tZSAobm90IGFsbCkgVU5JWCB2ZXJzaW9ucywgYW5kCiAgICAgICBub3Qgb24gYW55IG5vbi1VTklYIHBsYXRmb3Jtcy4KICAgIDIuIFBpcGU6IFRoZSBleHRlcm5hbCBwcm9ncmFtJ3Mgc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dCBhcmUKICAgICAgIHJlZGlyZWN0ZWQgdGhyb3VnaCBhICJwaXBlIiBjb250cm9sbGVkIGJ5IEtlcm1pdC4gVGhpcyBtZXRob2QgaXMKICAgICAgIHJlbGF0aXZlbHkgcG9ydGFibGUgLS0gaXQgc2hvdWxkIHdvcmsgYWNyb3NzIGFsbCBVTklYIHZlcnNpb25zLAogICAgICAgYW5kIGl0IGFsc28gd29ya3MgaW4gV2luZG93cyBhbmQgT1MvMiAtLSBidXQgaXQgaXMgZWZmZWN0aXZlIG9ubHkKICAgICAgIHdoZW4gdGhlIGV4dGVybmFsIHByb2dyYW0gYWN0dWFsbHkgdXNlcyBzdGFuZGFyZCBpL28gKGFuZCBtYW55CiAgICAgICBkb24ndCkuCgogICBUaGUgdHdvIG1ldGhvZHMgYXJlIHN0YXJ0ZWQgZGlmZmVyZW50bHkgYnV0IGFyZSB1c2VkIHRoZSBzYW1lIHdheQogICB0aGVyZWFmdGVyLgoKICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBmZWF0dXJlIGlzIHRvIGxldCB5b3UgdXNlIEMtS2VybWl0IHNlcnZpY2VzIGxpa2UKICAgZmlsZSB0cmFuc2ZlciwgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiwgc2NyaXB0aW5nLCBhdXRvbWF0aWMKICAgZGlhbGluZywgZXRjLCBvbiBjb25uZWN0aW9ucyB0aGF0IEtlcm1pdCBjYW4ndCBvdGhlcndpc2UgbWFrZSBpdHNlbGYuCgogICBUaGlzIGZlYXR1cmUgaXMgdGhlIG9wcG9zaXRlIG9mIHRoZSBSRURJUkVDVCBmZWF0dXJlLCBpbiB3aGljaAogICBDLUtlcm1pdCBtYWtlcyB0aGUgY29ubmVjdGlvbiwgYW5kIHJlZGlyZWN0cyBhbiBleHRlcm5hbCAobG9jYWwpCiAgIGNvbW1hbmQgb3IgcHJvZ3JhbSBvdmVyIHRoaXMgY29ubmVjdGlvbi4gSW4gYSBwdHkgb3IgcGlwZSBjb25uZWN0aW9uLAogICBDLUtlcm1pdCBydW5zIGFuZCBjb250cm9scyBhIGxvY2FsIGNvbW1hbmQgb3IgcHJvZ3JhbSwgd2hpY2ggbWFrZXMgdGhlCiAgIGNvbm5lY3Rpb24uIChUaGUgc2FtZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gc2ltcGx5IHRvIGNvbnRyb2wgYSBsb2NhbAogICBwcm9ncmFtIHdpdGhvdXQgbWFraW5nIGEgY29ubmVjdGlvbjsgc2VlIFs0MDddU2VjdGlvbiAyLjguKQoKICAgVG8gZmluZCBvdXQgaWYgeW91ciB2ZXJzaW9uIG9mIEtlcm1pdCBpbmNsdWRlcyBQVFkgc3VwcG9ydCwgdHlwZSAic2hvdwogICBmZWF0dXJlcyIgYW5kIGxvb2sgZm9yIE5FVFBUWSBpbiB0aGUgYWxwaGFiZXRpY2FsIGxpc3Qgb2Ygb3B0aW9ucy4gRm9yCiAgIHBpcGVzLCBsb29rIGZvciBORVRDTUQuCgogICBUaGUgY29tbWFuZHMgYXJlOgoKICAgU0VUIE5FVFdPUksgVFlQRSBQVFkgb3IgU0VUIE5FVFdPUksgVFlQRSBQSVBFCiAgIFNFVCBIT1NUIGNvbW1hbmQKICAgICAgICAgIHdoZXJlIGNvbW1hbmQgaXMgYW55IGludGVyYWN0aXZlIGNvbW1hbmQuIElmIHRoZSBjb21tYW5kIGRvZXMKICAgICAgICAgIG5vdCB1c2Ugc3RhbmRhcmQgaS9vLCB5b3UgbXVzdCB1c2UgU0VUIE5FVFdPUksgVFlQRSBQVFkuCgogICBOb3RlczoKCiAgICAgKiBDT01NQU5EIGlzIGFuIGludmlzaWJsZSBzeW5vbnltIGZvciBQSVBFLgogICAgICogVGhlIGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMgYXJlIGNhc2Utc2Vuc2l0aXZlIGluIFVOSVguCgogICBUaGUgU0VUIE5FVFdPUksgVFlQRSwgU0VUIEhPU1Qgc2VxdWVuY2Ugc2V0cyB0aGUgZ2l2ZW4gbmV0d29yayB0eXBlCiAgIGZvciBhbGwgc3Vic2VxdWVudCBTRVQgSE9TVCBjb21tYW5kcyB1bnRpbCBhbm90aGVyIFNFVCBORVRXT1JLIFRZUEUKICAgY29tbWFuZCBpcyBnaXZlbiB0byBjaGFuZ2UgaXQuCgogICBZb3UgY2FuIGFsc28gdXNlIHRoZSBuZXcgL05FVFdPUkstVFlQRTpQVFkgb3IgL05FVFdPUkstVFlQRTpQSVBFIChvcgogICBzaW1wbHkgL1BJUEUgb3IgL1BUWSkgc3dpdGNoZXMgb24gdGhlIFNFVCBIT1NUIGNvbW1hbmQgaXRzZWxmOgoKICBTRVQgSE9TVCAvTkVUV09SSy1UWVBFOlBJUEUgY29tbWFuZCAgOyBUaGVzZSB0d28gYXJlIHRoZSBzYW1lCiAgU0VUIEhPU1QgL1BJUEUgY29tbWFuZAoKICBTRVQgSE9TVCAvTkVUV09SSy1UWVBFOlBUWSBjb21tYW5kICAgOyBEaXR0bwogIFNFVCBIT1NUIC9QVFkgY29tbWFuZAoKICAgVGhlc2UgYXJlIGxpa2UgU0VUIE5FVFdPUksgVFlQRSBmb2xsb3dlZCBieSBTRVQgSE9TVCwgZXhjZXB0IHRoZXkKICAgYXBwbHkgb25seSB0byB0aGUgY29ubmVjdGlvbiBiZWluZyBtYWRlIGFuZCBkbyBub3QgY2hhbmdlIHRoZSBnbG9iYWwKICAgbmV0d29yayB0eXBlIHNldHRpbmcgKHNlZSBbNDA4XVNlY3Rpb24gMS41IGFib3V0IHRoZSBkaWZmZXJlbmNlCiAgIGJldHdlZW4gc3dpdGNoZXMgYW5kIFNFVCBjb21tYW5kcykuCgogICBJbmNsdWRlIGFueSBjb21tYW5kLWxpbmUgb3B0aW9ucyB3aXRoIHRoZSBjb21tYW5kIHRoYXQgbWlnaHQgYmUKICAgbmVlZGVkLCBhcyBpbiB0aGlzIGV4YW1wbGUgd2hlcmUgQy1LZXJtaXQgdXNlcyBhbm90aGVyIGNvcHkgb2YgaXRzZWxmCiAgIGFzIHRoZSBjb21tdW5pY2F0aW9ucyBwcm9ncmFtOgoKICBTRVQgSE9TVCAvUElQRSAvQ09OTkVDVCBrZXJtaXQgLVlRSiB4eXpjb3JwLmNvbQoKICAgQXMgdXN1YWwsIGlmIHlvdSBpbmNsdWRlIHRoZSAvQ09OTkVDVCBzd2l0Y2gsIFNFVCBIT1NUIGVudGVycyBDT05ORUNUCiAgIG1vZGUgaW1tZWRpYXRlbHkgdXBvbiBzdWNjZXNzZnVsIGV4ZWN1dGlvbiBvZiB0aGUgZ2l2ZW4gY29tbWFuZC4KICAgVGhlcmVmb3JlIG5ldyBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIGFzIGEgc2hvcnRoYW5kIGZvciBTRVQgSE9TVAogICAvQ09OTkVDVCAvUFRZIGFuZCAvUElQRToKCiAgIFBUWSBbIGNvbW1hbmQgXQogICBQSVBFIFsgY29tbWFuZCBdCiAgICAgICAgICBUaGUgUFRZIGFuZCBQSVBFIGNvbW1hbmRzIHdvcmsgbGlrZSB0aGUgVEVMTkVUIGFuZCBSTE9HSU4KICAgICAgICAgIGNvbW1hbmRzOiB0aGV5IHNldCB1cCB0aGUgY29ubmVjdGlvbiAoaW4gdGhpcyBjYXNlLCB1c2luZyB0aGUKICAgICAgICAgIGdpdmVuIGNvbW1hbmQpIGFuZCB0aGVuIGVudGVyIENPTk5FQ1QgbW9kZSBhdXRvbWF0aWNhbGx5IChpZgogICAgICAgICAgdGhlIFBJUEUgb3IgUFRZIGNvbW1hbmQgaXMgZ2l2ZW4gd2l0aG91dCBhIGNvbW1hbmQsIGl0CiAgICAgICAgICBjb250aW51ZXMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZiBvbmUgaXMgYWN0aXZlOyBvdGhlcndpc2UgaXQKICAgICAgICAgIGdpdmVzIGFuIGVycm9yIG1lc3NhZ2UpLgoKICAgVGhlIFBJUEUgY29tbWFuZCBpcyBuYW1lZCBhZnRlciB0aGUgbWVjaGFuaXNtIGJ5IHdoaWNoIEMtS2VybWl0CiAgIGNvbW11bmljYXRlcyB3aXRoIHRoZSBjb21tYW5kOiBVTklYIHBpcGVzLiBDLUtlcm1pdCdzIGkvbyBpcyAicGlwZWQiCiAgIHRocm91Z2ggdGhlIGdpdmVuIGNvbW1hbmQuIEhlcmUgaXMgYSB0eXBpY2FsIGV4YW1wbGU6CgogIFBJUEUgcmxvZ2luIC04IHh5emNvcnAuY29tCgogICBUaGlzIGlzIGVxdWl2YWxlbnQgdG86CgogIFNFVCBIT1NUIC9QSVBFIHJsb2dpbiAtOCB4eXpjb3JwLmNvbQogIENPTk5FQ1QKCiAgIGFuZCB0bzoKCiAgU0VUIEhPU1QgL1BJUEUgL0NPTk5FQ1QgcmxvZ2luIC04IHh5emNvcnAuY29tCgogICBJTVBPUlRBTlQ6CiAgICAgICAgICBJZiB5b3UgYXJlIHdyaXRpbmcgYSBzY3JpcHQsIGRvIG5vdCB1c2UgdGhlIFBJUEUsIFBUWSwgVEVMTkVULAogICAgICAgICAgb3IgUkxPR0lOIGNvbW1hbmQgdW5sZXNzIHlvdSByZWFsbHkgd2FudCBDLUtlcm1pdCB0byBlbnRlcgogICAgICAgICAgQ09OTkVDVCBtb2RlIGF0IHRoYXQgcG9pbnQuIE5vcm1hbGx5IFNFVCBIT1NUIGlzIHVzZWQgaW4KICAgICAgICAgIHNjcmlwdHMgdG8gYWxsb3cgdGhlIGxvZ2luIGFuZCBvdGhlciBkaWFsb2dzIHRvIGJlIGNvbnRyb2xsZWQKICAgICAgICAgIGJ5IHRoZSBzY3JpcHQgaXRzZWxmLCByYXRoZXIgdGhhbiBieSBhbiBhY3RpdmVseSBwYXJ0aWNpcGF0aW5nCiAgICAgICAgICBodW1hbiBhdCB0aGUga2V5Ym9hcmQuCgogICBUaHJvdWdocHV0IG9mIHB0eSBhbmQgcGlwZSBjb25uZWN0aW9ucyBpcyBsaW1pdGVkIGJ5IHRoZSBwZXJmb3JtYW5jZQogICBvZiB0aGUgY2hvc2VuIGNvbW1hbmQgb3IgcHJvZ3JhbSBhbmQgYnkgdGhlIGludGVycHJvY2VzcyBjb21tdW5pY2F0aW9uCiAgIChJUEMpIG1ldGhvZCB1c2VkIGFuZC9vciBidWZmZXJpbmcgY2FwYWNpdHkgb2YgdGhlIHBpcGUgb3IgcHR5LCB3aGljaAogICBpbiB0dXJuIGRlcGVuZHMgb24gdGhlIHVuZGVybHlpbmcgb3BlcmF0aW5nIHN5c3RlbS4KCiAgIEluIG9uZSB0cmlhbCAob24gU3VuT1MgNC4xLjMpLCB3ZSBvYnNlcnZlZCBmaWxlIHRyYW5zZmVyIHJhdGVzIG92ZXIgYW4KICAgcmxvZ2luIGNvbm5lY3Rpb24gcHJvY2VlZGluZyBhdCAyMDBLY3BzIGZvciBkb3dubG9hZHMsIGJ1dCBvbmx5IDEwS2NwcwogICBmb3IgdXBsb2FkcyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uIHdpdGggdGhlIHNhbWUgc2V0dGluZ3MgKHNpbWlsYXIKICAgZGlzcGFyaXRpZXMgd2VyZSBub3RlZCBpbiBIUC1VWCkuIEV4YW1pbmF0aW9uIG9mIHRoZSBsb2dzIHJldmVhbGVkCiAgIHRoYXQgYSB3cml0ZSB0byB0aGUgcGlwZSBjb3VsZCB0YWtlIGFzIGxvbmcgYXMgNSBzZWNvbmRzLCB3aGVyZWFzCiAgIHJlYWRzIHdlcmUgcHJhY3RpY2FsbHkgaW5zdGFudGFuZW91cy4gT24gdGhlIG90aGVyIGhhbmQsIHVzaW5nIFRlbG5ldAogICBhcyB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSByYXRoZXIgdGhhbiBybG9naW4sIGRvd25sb2FkcyBhbmQgdXBsb2FkcyB3ZXJlCiAgIGJldHRlciBtYXRjaGVkIGF0IGFib3V0IDE3N0sgZWFjaC4KCiAgIE1vc3QgZXh0ZXJuYWwgY29tbXVuaWNhdGlvbiBwcm9ncmFtcywgbGlrZSBDLUtlcm1pdCBpdHNlbGYsIGhhdmUKICAgZXNjYXBlIGNoYXJhY3RlcnMgb3Igc2VxdWVuY2VzLiBOb3JtYWxseSB0aGVzZSBiZWdpbiB3aXRoIChvciBjb25zaXN0CiAgIGVudGlyZWx5IG9mKSBhIGNvbnRyb2wgY2hhcmFjdGVyLiBZb3UgbXVzdCBiZSBzdXJlIHRoYXQgdGhpcyBjb250cm9sCiAgIGNoYXJhY3RlciBpcyBub3QgInVucHJlZml4ZWQiIHdoZW4gdXBsb2FkaW5nIGZpbGVzLCBvdGhlcndpc2UgdGhlCiAgIGV4dGVybmFsIHByb2dyYW0gd2lsbCAiZXNjYXBlIGJhY2siIHRvIGl0cyBwcm9tcHQsIG9yIGNsb3NlIHRoZQogICBjb25uZWN0aW9uLCBvciB0YWtlIHNvbWUgb3RoZXIgdW53YW50ZWQgYWN0aW9uLiBXaGVuIGluIENPTk5FQ1QgbW9kZSwKICAgb2JzZXJ2ZSB0aGUgcHJvZ3JhbSdzIG5vcm1hbCBpbnRlcmFjdGlvbiBydWxlcy4gT2YgY291cnNlIEMtS2VybWl0J3MKICAgb3duIGVzY2FwZSBjaGFyYWN0ZXIgKG5vcm1hbGx5IEN0cmwtXCkgaXMgYWN0aXZlIHRvbywgdW5sZXNzIHlvdSBoYXZlCiAgIHRha2VuIHNvbWUgYWN0aW9uIHRvIGRpc2FibGUgaXQuCgogICBPbiBQVFkgY29ubmVjdGlvbnMsIHRoZSB1bmRlcmx5aW5nIFBUWSBkcml2ZXIgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUKICAgdHJhbnNwYXJlbnQgdG8gY29udHJvbCBjaGFyYWN0ZXJzIC0tIGZvciBleGFtcGxlLCBpdCBtaWdodCBleHBhbmQKICAgdGFicywgdHJhbnNsYXRlIGNhcnJpYWdlIHJldHVybnMsIGdlbmVyYXRlIHNpZ25hbHMgaWYgaXQgc2VlcyBhbgogICBpbnRlcnJ1cHQgY2hhcmFjdGVyLCBhbmQgc28gb24uIFNpbWlsYXIgdGhpbmdzIG1pZ2h0IGhhcHBlbiBvbiBhIFBJUEUKICAgY29ubmVjdGlvbi4gRm9yIHRoaXMgcmVhc29uLCBpZiB5b3UgcGxhbiB0byB0cmFuc2ZlciBmaWxlcyBvdmVyIGEgUFRZCiAgIG9yIFBJUEUgY29ubmVjdGlvbiwgdGVsbCB0aGUgZmlsZSBzZW5kZXIgdG86CgogICBTRVQgUFJFRklYSU5HIEFMTAogICAgICAgICAgVGhpcyBjYXVzZXMgYWxsIGNvbnRyb2wgY2hhcmFjdGVycyB0byBiZSBwcmVmaXhlZCBhbmQKICAgICAgICAgIHRyYW5zbWl0dGVkIGFzIHByaW50YWJsZSBBU0NJSSBjaGFyYWN0ZXJzLgoKICAgSWYgdGhlIGV4dGVybmFsIGNvbm5lY3Rpb24gcHJvZ3JhbSBpcyBub3QgOC1iaXQgY2xlYW4sIHlvdSBzaG91bGQKICAgYWxzbzoKCiAgIFNFVCBQQVJJVFkgU1BBQ0UKICAgICAgICAgIFRoaXMgY2F1c2VzIDgtYml0IGRhdGEgdG8gYmUgZW5jb2RlZCBpbiA3IGJpdHMgdXNpbmcgc2luZ2xlCiAgICAgICAgICBhbmQvb3IgbG9ja2luZyBzaGlmdHMuCgogICBBbmQgaWYgaXQgZG9lcyBub3QgbWFrZSBhIHJlbGlhYmxlIGNvbm5lY3Rpb24gKHN1Y2ggYXMgdGhvc2UgbWFkZSBieQogICBUZWxuZXQsIFJsb2dpbiwgU3NoLCBldGMpLCB5b3Ugc2hvdWxkOgoKICAgU0VUIFNUUkVBTUlORyBPRkYKICAgICAgICAgIFRoaXMgZm9yY2VzIEMtS2VybWl0IHRvIHRyZWF0IHRoZSBjb25uZWN0aW9uIGFzIHVucmVsaWFibGUgYW5kCiAgICAgICAgICB0byBlbmdhZ2UgaW4gaXRzIG5vcm1hbCBBQ0svTkFLIHByb3RvY29sIGZvciBlcnJvciBkZXRlY3Rpb24KICAgICAgICAgIGFuZCBjb3JyZWN0aW9uLCByYXRoZXIgdGhhbiAic3RyZWFtaW5nIiBpdHMgcGFja2V0cywgYXMgaXQKICAgICAgICAgIG5vcm1hbGx5IGRvZXMgb24gYSBuZXR3b3JrIGNvbm5lY3Rpb24gKFs0MDldU2VjdGlvbiA0LjIwKS4KCiAgIEluIHNvbWUgY2FzZXMsIGJ1ZmZlciBzaXplcyBtaWdodCBiZSByZXN0cmljdGVkLCBzbyB5b3UgbWlnaHQgYWxzbwogICBuZWVkIHRvIHJlZHVjZSB0aGUgS2VybWl0IHBhY2tldCBsZW5ndGggdG8gZml0OyB0aGlzIGlzIGEKICAgdHJpYWwtYW5kLWVycm9yIGFmZmFpci4gRm9yIGV4YW1wbGUsIGlmIHRyYW5zZmVycyBhbHdheXMgZmFpbCB3aXRoCiAgIDQwMDAtYnl0ZSBwYWNrZXRzLCB0cnkgMjAwMC4gSWYgdGhhdCBmYWlscyB0b28sIHRyeSAxMDAwLCBhbmQgc28gb24uCiAgIFRoZSBjb21tYW5kcyBhcmU6CgogICBTRVQgUkVDRUlWRSBQQUNLRVQtTEVOR1RIIG51bWJlcgogICAgICAgICAgVGhpcyB0ZWxscyB0aGUgZmlsZSByZWNlaXZlciB0byB0ZWxsIHRoZSBmaWxlIHNlbmRlciB0aGUKICAgICAgICAgIGxvbmdlc3QgcGFja2V0IGxlbmd0aCBpdCBjYW4gYWNjZXB0LgoKICAgU0VUIFNFTkQgUEFDS0VULUxFTkdUSCBudW1iZXIKICAgICAgICAgIFRoaXMgdGVsbHMgdGhlIGZpbGUgc2VuZGVyIG5vdCB0byBzZW5kIHBhY2tldHMgbG9uZ2VyIHRoYW4gdGhlCiAgICAgICAgICBnaXZlbiBsZW5ndGgsIGV2ZW4gaWYgdGhlIHJlY2VpdmVyIHNheXMgbG9uZ2VyIG9uZXMgYXJlIE9LLiBPZgogICAgICAgICAgY291cnNlLCBpZiB0aGUgcmVjZWl2ZXIncyBsZW5ndGggaXMgc2hvcnRlciwgdGhlIHNob3J0ZXIgbGVuZ3RoCiAgICAgICAgICBpcyB1c2VkLgoKICAgSWYgbm9uZSBvZiB0aGlzIHNlZW1zIHRvIGhlbHAsIHRyeSBmYWxsaW5nIGJhY2sgdG8gdGhlIGJhcmUgbWluaW11bSwKICAgbG93ZXN0LWNvbW1vbi1kZW5vbWluYXRvciBwcm90b2NvbCBzZXR0aW5nczoKCiAgIFJPQlVTVAogICAgICAgICAgTm8gc2xpZGluZyB3aW5kb3dzLCBubyBzdHJlYW1pbmcsIG5vIGNvbnRyb2wtY2hhcmFjdGVyCiAgICAgICAgICB1bnByZWZpeGluZywgcGFja2V0IGxlbmd0aCA5MC4KCiAgIEFuZCB0aGVuIHdvcmsgeW91ciB3YXkgYmFjayB1cCBieSB0cmlhbCBhbmQgZXJyb3IgdG8gZ2V0IGdyZWF0ZXIKICAgdGhyb3VnaHB1dC4KCiAgIE5vdGUgdGhhdCB3aGVuIHN0YXJ0aW5nIGEgUElQRSBjb25uZWN0aW9uLCBhbmQgdGhlIGNvbm5lY3Rpb24gcHJvZ3JhbQogICAoc3VjaCBhcyB0ZWxuZXQgb3IgcmxvZ2luKSBwcmludHMgc29tZSBncmVldGluZyBvciBpbmZvcm1hdGlvbgogICBtZXNzYWdlcyBiZWZvcmUgc3RhcnRpbmcgdGhlIGNvbm5lY3Rpb24sIHRoZXNlIGFyZSBxdWl0ZSBsaWtlbHkgdG8gYmUKICAgcHJpbnRlZCB3aXRoIGEgc3RhaXJzdGVwIGVmZmVjdCAobGluZWZlZWQgd2l0aG91dCBjYXJyaWFnZSByZXR1cm4pLgogICBUaGlzIGlzIGJlY2F1c2UgdGhlIHByb2dyYW0gaXMgbm90IGNvbm5lY3RlZCB3aXRoIHRoZSBVTklYIHRlcm1pbmFsCiAgIGRyaXZlcjsgdGhlcmUncyBub3QgbXVjaCBLZXJtaXQgY2FuIGRvIGFib3V0IGl0LiBPbmNlIHRoZSBjb25uZWN0aW9uCiAgIGlzIG1hZGUsIGV2ZXJ5dGhpbmcgc2hvdWxkIGdvIGJhY2sgdG8gbm9ybWFsLiBUaGlzIHNob3VsZG4ndCBoYXBwZW4gb24KICAgYSBQVFkgY29ubmVjdGlvbiBiZWNhdXNlIGEgUFRZIGlzLCBpbmRlZWQsIGEgdGVybWluYWwuCgogICBPbiBhIHNpbWlsYXIgbm90ZSwgc29tZSBjb25uZWN0aW9uIHByb2dyYW1zIChsaWtlIFNvbGFyaXMgMi41IHJsb2dpbikKICAgbWlnaHQgcHJpbnQgbG90cyBvZiBlcnJvciBtZXNzYWdlcyBsaWtlICJpb2N0bCBUSU9DR0VUUDogaW52YWxpZAogICBhcmd1bWVudCIgd2hlbiB1c2VkIHRocm91Z2ggYSBwaXBlLiBUaGV5IGFyZSBhbm5veWluZyBidXQgdXN1YWxseQogICBoYXJtbGVzcy4gSWYgeW91IHdhbnQgdG8gYXZvaWQgdGhlc2UgbWVzc2FnZXMsIGFuZCB5b3VyIHNoZWxsIGFsbG93cwogICByZWRpcmVjdGlvbiBvZiBzdGRlcnIsIHlvdSBjYW4gcmVkaXJlY3Qgc3RkZXJyIGluIHlvdXIgcGlwZSBjb21tYW5kLAogICBhcyBpbiB0aGlzIGV4YW1wbGUgd2hlcmUgdGhlIHVzZXIncyBzaGVsbCBpcyBiYXNoOgoKICBQSVBFIHJsb2dpbiB4eXpjb3JwLmNvbSAyPiAvZGV2L251bGwKCiAgIE9yIHVzZSBQVFkgcmF0aGVyIHRoYW4gUElQRSwgc2luY2UgUFRZIGlzIGF2YWlsYWJsZSBvbiBTb2xhcmlzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi43LjAuIEMtS2VybWl0IG92ZXIgdG4zMjcwIGFuZCB0bjUyNTAKCiAgIE5vdyB5b3UgY2FuIG1ha2UgYSBjb25uZWN0aW9uIGZyb20gQy1LZXJtaXQgImRpcmVjdGx5IiB0byBhbiBJQk0KICAgbWFpbmZyYW1lIGFuZCB0cmFuc2ZlciBmaWxlcyB3aXRoIGl0LCBhc3N1bWluZyBpdCBoYXMgS2VybWl0LTM3MAogICBpbnN0YWxsZWQuIEJlY2F1c2UgdG4zMjcwIGlzIG5laXRoZXIgOC1iaXQgY2xlYW4gbm9yIHRyYW5zcGFyZW50IHRvCiAgIGNvbnRyb2wgY2hhcmFjdGVycywgeW91IG11c3QgZ2l2ZSB0aGVzZSBjb21tYW5kczoKCiAgU0VUIFBSRUZJWElORyBBTEwgICA7IFByZWZpeCBhbGwgY29udHJvbCBjaGFyYWN0ZXJzCiAgU0VUIFBBUklUWSBTUEFDRSAgICA7IFRlbG5ldCBjb25uZWN0aW9ucyBhcmUgdXN1YWxseSBub3QgOC1iaXQgY2xlYW4KCiAgIGFuZCB0aGVuOgoKICBTRVQgSE9TVCAvUFRZIC9DT05ORUNUIHRuMzI3MCBhYmNjb3JwLmNvbQoKICAgb3Igc2ltcGx5OgoKICBwdHkgdG4zMjcwIGFiY2NvcnAuY29tCgogICBTRVQgSE9TVCAvUElQRSBkb2VzIG5vdCB3b3JrIGluIHRoaXMgY2FzZSwgYXQgbGVhc3Qgbm90IGZvciBmaWxlCiAgIHRyYW5zZmVyLiBGaWxlIHRyYW5zZmVyIGRvZXMgd29yaywgaG93ZXZlciwgd2l0aCBTRVQgSE9TVCAvUFRZLAogICBwcm92aWRlZCB5b3UgdXNlIHRoZSBkZWZhdWx0IHBhY2tldCBsZW5ndGggb2YgOTAgYnl0ZXM7IGFueXRoaW5nCiAgIGxvbmdlciBzZWVtcyB0byBraWxsIHRoZSBzZXNzaW9uLgoKICAgWW91IGNhbiBhbHNvIG1ha2UgY29ubmVjdGlvbnMgdG8gSUJNIEFTLzQwMCBjb21wdXRlcnMgaWYgeW91IGhhdmUgYQogICB0bjUyNTAgcHJvZ3JhbSBpbnN0YWxsZWQ6CgogIHB0eSB0bjUyNTAgaG9zdG5hbWUKCiAgIEluIHRoaXMgY2FzZSwgaG93ZXZlciwgZmlsZSB0cmFuc2ZlciBpcyBwcm9iYWJseSBub3QgaW4gdGhlIGNhcmRzCiAgIHNpbmNlIG5vYm9keSBoYXMgZXZlciBzdWNjZWVkZWQgaW4gd3JpdGluZyBhIEtlcm1pdCBwcm9ncmFtIGZvciB0aGUKICAgQVMvNDAwLiBIaW50OgoKICBkZWZpbmUgdG4zMjcwIHsKICAgICAgY2hlY2sgcHR5CiAgICAgIGlmIGZhaWwgZW5kIDEgU29ycnkgLSBubyBQVFkgc3VwcG9ydC4uLgogICAgICBwdHkgdG4zMjcwIFwlKgogIH0KCiAgIFNpbWlsYXJseSBmb3IgdG41MjUwLiBOb3RlIHRoYXQgQ0hFQ0sgUFRZIGFuZCBDSEVDSyBQSVBFIGNhbiBiZSB1c2VkCiAgIGluIG1hY3JvcyBhbmQgc2NyaXB0cyB0byB0ZXN0IHdoZXRoZXIgUFRZIG9yIFBJUEUgc3VwcG9ydCBpcwogICBhdmFpbGFibGUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAyLjcuMS4gQy1LZXJtaXQgb3ZlciBUZWxuZXQKCiAgIEFsdGhvdWdoIEMtS2VybWl0IGluY2x1ZGVzIGl0cyBvd24gVGVsbmV0IGltcGxlbWVudGF0aW9uLCB5b3UgbWlnaHQKICAgbmVlZCB0byB1c2UgYW4gZXh0ZXJuYWwgVGVsbmV0IHByb2dyYW0gdG8gbWFrZSBjZXJ0YWluIGNvbm5lY3Rpb25zOwogICBwZXJoYXBzIGJlY2F1c2UgaXQgaGFzIGFjY2VzcyBvciBzZWN1cml0eSBmZWF0dXJlcyBub3QgYXZhaWxhYmxlIGluCiAgIEMtS2VybWl0IGl0c2VsZi4gQXMgbm90ZWQgYWJvdmUsIHRoZSBvbmx5IHByZWNhdXRpb25zIG5lY2Vzc2FyeSBhcmUKICAgdXN1YWxseToKCiAgU0VUIFBSRUZJWElORyBBTEwgICA7IFByZWZpeCBhbGwgY29udHJvbCBjaGFyYWN0ZXJzCiAgU0VUIFBBUklUWSBTUEFDRSAgICA7IFRlbG5ldCBjb25uZWN0aW9ucyBtaWdodCBub3QgYmUgOC1iaXQgY2xlYW4KCiAgIGFuZCB0aGVuOgoKICBTRVQgSE9TVCAvUFRZIChvciAvUElQRSkgL0NPTk5FQ1QgdGVsbmV0IGFiY2NvcnAuY29tCgogICBvciwgZXF1aXZhbGVudGx5OgoKICBQVFkgKG9yIFBJUEUpIHRlbG5ldCBhYmNjb3JwLmNvbQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi43LjIuIEMtS2VybWl0IG92ZXIgUmxvZ2luCgogICBDLUtlcm1pdCBpbmNsdWRlcyBpdHMgb3duIFJsb2dpbiBjbGllbnQsIGJ1dCB0aGlzIGNhbiBub3JtYWxseSBiZSB1c2VkCiAgIG9ubHkgaWYgeW91IGFyZSByb290LCBzaW5jZSB0aGUgcmxvZ2luIFRDUCBwb3J0IGlzIHByaXZpbGVnZWQuIEJ1dAogICBwdHlzIGFuZCBwaXBlcyBsZXQgeW91IG1ha2UgcmxvZ2luIGNvbm5lY3Rpb25zIHdpdGggQy1LZXJtaXQgdGhyb3VnaAogICB5b3VyIGNvbXB1dGVyJ3MgZXh0ZXJuYWwgcmxvZ2luIHByb2dyYW0sIHdoaWNoIGlzIG5vcm1hbGx5IGluc3RhbGxlZAogICBhcyBhIHByaXZpbGVnZWQgcHJvZ3JhbToKCiAgU0VUIFBSRUZJWElORyBBTEwKCiAgIGFuZCB0aGVuOgoKICBTRVQgSE9TVCAvUFRZIChvciAvUElQRSkgL0NPTk5FQ1QgcmxvZ2luIC04IGFiY2NvcnAuY29tCgogICBvciwgZXF1aXZhbGVudGx5OgoKICBQVFkgKG9yIFBJUEUpIHJsb2dpbiAtOCBhYmNjb3JwLmNvbQoKICAgVGhlICItOCIgb3B0aW9uIHRvIHJsb2dpbiBlbmFibGVzIHRyYW5zbWlzc2lvbiBvZiA4LWJpdCBkYXRhLiBJZiB0aGlzCiAgIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gaW5jbHVkZSBTRVQgUEFSSVRZIFNQQUNFIGlmIHlvdSBpbnRlbmQgdG8KICAgdHJhbnNmZXIgZmlsZXMuCgogICBOb3RlIHRoYXQgdGhlIG5vcm1hbCBlc2NhcGUgc2VxdWVuY2UgZm9yIHJsb2dpbiBpcyBDYXJyaWFnZSBSZXR1cm4KICAgZm9sbG93ZWQgYnkgVGlsZGUgKH4pLCBidXQgb25seSB3aGVuIHRoZSB0aWxkZSBpcyBmb2xsb3dlZCBieSBjZXJ0YWluCiAgIG90aGVyIGNoYXJhY3RlcnM7IHRoZSBleGFjdCBiZWhhdmlvciBkZXBlbmRzIG9uIHlvdXIgcmxvZ2luIGNsaWVudCwgc28KICAgcmVhZCBpdHMgZG9jdW1lbnRhdGlvbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuNy4zLiBDLUtlcm1pdCBvdmVyIFNlcmlhbCBDb21tdW5pY2F0aW9uIFByb2dyYW1zCgogICBQdHlzIGFuZCBwaXBlcyBhbHNvIGxldCB5b3UgdXNlIHByb2dyYW1zIHRoYXQgbWFrZSBzZXJpYWwgY29ubmVjdGlvbnMsCiAgIHN1Y2ggYXMgY3Ugb3IgdGlwLiBGb3IgZXhhbXBsZSwgQy1LZXJtaXQgY2FuIGJlIHVzZWQgdGhyb3VnaCBjdSB0bwogICBtYWtlIGNvbm5lY3Rpb25zIHRoYXQgb3RoZXJ3aXNlIG1pZ2h0IG5vdCBiZSBhbGxvd2VkLCBlLmcuIGJlY2F1c2UKICAgQy1LZXJtaXQgaXMgbm90IGluc3RhbGxlZCB3aXRoIHRoZSByZXF1aXJlZCB3cml0ZSBwZXJtaXNzaW9ucyB0byB0aGUKICAgZGlhbG91dCBkZXZpY2UgYW5kIHRoZSBVVUNQIGxvY2tmaWxlIGRpcmVjdG9yeS4KCiAgIFN1cHBvc2UgeW91ciBVVUNQIERldmljZXMgZmlsZSBjb250YWlucyBhbiBlbnRyeSBmb3IgYSBzZXJpYWwgZGV2aWNlCiAgIHR0eTA0IHRvIGJlIHVzZWQgZm9yIGRpcmVjdCBjb25uZWN0aW9ucywgYnV0IHRoaXMgZGV2aWNlIGlzIHByb3RlY3RlZAogICBhZ2FpbnN0IHlvdSAoYW5kIEtlcm1pdCB3aGVuIHlvdSBydW4gaXQpLiBJbiB0aGlzIGNhc2UgeW91IGNhbjoKCiAgU0VUIENPTlRST0wgUFJFRklYIEFMTAogIFBUWSAob3IgUElQRSkgY3UgLWwgdHR5MDQKCiAgIChTaW1pbGFybHkgZm9yIGRpYWxvdXQgZGV2aWNlcywgZXhjZXB0IHRoZW4geW91IGFsc28gbmVlZCB0byBpbmNsdWRlCiAgIHRoZSBwaG9uZSBudW1iZXIgaW4gdGhlICJjdSIgY29tbWFuZC4pCgogICBBcyB3aXRoIG90aGVyIGNvbW11bmljYXRpb24gcHJvZ3JhbXMsIHdhdGNoIG91dCBmb3IgY3UncyBlc2NhcGUKICAgc2VxdWVuY2UsIHdoaWNoIGlzIHRoZSBzYW1lIGFzIHRoZSBybG9naW4gcHJvZ3JhbSdzOiBDYXJyaWFnZSBSZXR1cm4KICAgZm9sbG93ZWQgYnkgVGlsZGUgKGZvbGxvd2VkIGJ5IGFub3RoZXIgY2hhcmFjdGVyIHRvIHNwZWNpZnkgYW4gYWN0aW9uLAogICBsaWtlICIuIiBmb3IgY2xvc2luZyB0aGUgY29ubmVjdGlvbiBhbmQgZXhpdGluZyBmcm9tIGN1KS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuNy40LiBDLUtlcm1pdCBvdmVyIFNlY3VyZSBOZXR3b3JrIENsaWVudHMKCiAgICAgRElTQ0xBSU1FUjogVGhlcmUgYXJlIGxhd3MgaW4gdGhlIFVTQSBhbmQgb3RoZXIgY291bnRyaWVzIHJlZ2FyZGluZwogICAgIHVzZSwgaW1wb3J0LCBhbmQvb3IgZXhwb3J0IG9mIGVuY3J5cHRpb24gYW5kL29yIGRlY3J5cHRpb24gb3Igb3RoZXIKICAgICBmb3JtcyBvZiBzZWN1cml0eSBzb2Z0d2FyZSwgYWxnb3JpdGhtcywgdGVjaG5vbG9neSwgYW5kCiAgICAgaW50ZWxsZWN0dWFsIHByb3BlcnR5LiBUaGUgS2VybWl0IFByb2plY3QgYXR0ZW1wdHMgdG8gZm9sbG93IGFsbAogICAgIGtub3duIHN0YXR1dGVzLCBhbmQgbmVpdGhlciBpbnRlbmRzIG5vciBzdWdnZXN0cyB0aGF0IEtlcm1pdAogICAgIHNvZnR3YXJlIGNhbiBvciBzaG91bGQgYmUgdXNlZCBpbiBhbnkgd2F5LCBpbiBhbnkgbG9jYXRpb24sIHRoYXQKICAgICBjaXJjdW12ZW50cyBhbnkgcmVndWxhdGlvbnMsIGxhd3MsIHRyZWF0aWVzLCBjb3ZlbmFudHMsIG9yIG90aGVyCiAgICAgbGVnaXRpbWF0ZSBjYW5vbnMgb3IgaW5zdHJ1bWVudHMgb2YgbGF3LCBpbnRlcm5hdGlvbmFsIHJlbGF0aW9ucywKICAgICB0cmFkZSwgZXRoaWNzLCBvciBwcm9wcmlldHkuCgogICBGb3Igc2VjdXJlIGNvbm5lY3Rpb25zIG9yIGNvbm5lY3Rpb25zIHRocm91Z2ggZmlyZXdhbGxzLCBDLUtlcm1pdCA3LjAKICAgY2FuIGJlIGEgS2VyYmVyb3MsIFNSUCwgYW5kL29yIFNPQ0tTIGNsaWVudCB3aGVuIGJ1aWx0IHdpdGggdGhlCiAgIGFwcHJvcHJpYXRlIG9wdGlvbnMgYW5kIGxpYnJhcmllcy4gQnV0IG90aGVyIGFwcGxpY2F0aW9uLWxldmVsCiAgIHNlY3VyaXR5IGFjcm9ueW1zIGFuZCBtZXRob2RzIC0tIFNTSCwgU1NMLCBTUlAsIFRMUyAtLSBwb3AgdXAgYXQgYW4KICAgYWxhcm1pbmcgcmF0ZSBhbmQgYXJlIChhKSBpbXBvc3NpYmxlIHRvIGtlZXAgdXAgd2l0aCwgKGIpIHVzdWFsbHkKICAgbXV0dWFsbHkgaW5jb21wYXRpYmxlLCBhbmQgKGMpIGhhdmUgcmVzdHJpY3Rpb25zIG9uIGV4cG9ydCBvcgogICByZWRpc3RyaWJ1dGlvbiBhbmQgc28gY2Fubm90IGJlIGluY2x1ZGVkIGluIEMtS2VybWl0IGl0c2VsZi4KCiAgIEhvd2V2ZXIsIGlmIHlvdSBoYXZlIGEgc2VjdXJlIHRleHQtYmFzZWQgVGVsbmV0IChvciBvdGhlcikgY2xpZW50IHRoYXQKICAgZW1wbG95cyBvbmUgb2YgdGhlc2Ugc2VjdXJpdHkgbWV0aG9kcywgeW91IGNhbiB1c2UgQy1LZXJtaXQgInRocm91Z2giCiAgIGl0IHZpYSBhIHB0eSBvciBwaXBlLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi43LjQuMS4gU1NICgogICBDLUtlcm1pdCBkb2VzIG5vdCBhbmQgY2FuIG5vdCBpbmNvcnBvcmF0ZSBTU0ggZHVlIHRvIGxpY2Vuc2luZywKICAgcGF0ZW50LCBhbmQgVVNBIGV4cG9ydCBsYXcgcmVzdHJpY3Rpb25zLgoKICAgVGhlIFVOSVggU1NIIGNsaWVudCBkb2VzIG5vdCB1c2Ugc3RhbmRhcmQgaW5wdXQvb3V0cHV0LCBhbmQgdGhlcmVmb3JlCiAgIGNhbiBiZSB1c2VkIG9ubHkgYnkgS2VybWl0J3MgUFRZIGludGVyZmFjZSwgaWYgb25lIGlzIHByZXNlbnQuIFRoZQogICBjYXV0aW9ucyBhYm91dCBmaWxlIHRyYW5zZmVyLCBldGMsIGFyZSB0aGUgc2FtZSBhcyBmb3IgUmxvZ2luLgogICBFeGFtcGxlOgoKICBTRVQgUFJFRklYSU5HIEFMTAogIFBUWSBzc2ggWFlaQ09SUC5DT00KCiAgIE9yLCBmb3IgYSBzY3JpcHRlZCBzZXNzaW9uOgoKICBTRVQgUFJFRklYSU5HIEFMTAogIFNFVCBIT1NUIC9QVFkgc3NoIFhZWkNPUlAuQ09NCgogICBIaW50OgoKICBkZWZpbmUgc3NoIHsKICAgICAgY2hlY2sgcHR5CiAgICAgIGlmIGZhaWwgZW5kIDEgU29ycnkgLSBubyBQVFkgc3VwcG9ydC4uLgogICAgICBwdHkgc3NoIFwlKgogIH0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuNy40LjIuIFNTTAoKICAgU2VjdXJlIFNvY2tldHMgTGF5ZXIgKFNTTCkgaXMgYW5vdGhlciBUQ1AvSVAgc2VjdXJpdHkgb3ZlcmxheSwgdGhpcwogICBvbmUgZGVzaWduZWQgYnkgYW5kIGZvciBOZXRzY2FwZS4gQW4gU1NMIFRlbG5ldCBjbGllbnQgaXMgYXZhaWxhYmxlCiAgIGZvciBVTklYIGZyb20gdGhlIFVuaXZlcnNpdHkgb2YgUXVlZW5zbGFuZC4gTW9yZSBpbmZvIGF0OgoKICBbNDEwXWh0dHA6Ly93d3cucHN5LnVxLm96LmF1L35mdHAvQ3J5cHRvLwoKICAgSW50ZXJvcGVyYWJpbGl0eSB3aXRoIEMtS2VybWl0IGlzIHVua25vd24uIEMtS2VybWl0IGFsc28gaW5jbHVkZXMgaXRzCiAgIG93biBidWlsdC1pbiBTU0wvVExTIHN1cHBvcnQsIGJ1dCBpdCBpcyBub3QgZXhwb3J0YWJsZTsgWzQxMV1DTElDSwogICBIRVJFIGZpbGUgZm9yIGRldGFpbHMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAyLjcuNC4zLiBTUlAKCiAgIFNSUChUTSkgaXMgU3RhbmZvcmQgVW5pdmVyc2l0eSdzIFNlY3VyZSBSZW1vdGUgUGFzc3dvcmQgcHJvdG9jb2wuIEFuCiAgIFNSUCBUZWxuZXQgY2xpZW50IGlzIGF2YWlsYWJsZSBmcm9tIFN0YW5mb3JkOgoKICBbNDEyXWh0dHA6Ly9zcnAuc3RhbmZvcmQuZWR1L3NycC8KCiAgIFN0YW5mb3JkJ3MgU1JQIFRlbG5ldCBjbGllbnQgZm9yIFVOSVggaGFzIGJlZW4gdGVzdGVkIG9uIFN1bk9TIGFuZAogICB3b3JrcyBmaW5lIHdpdGggQy1LZXJtaXQsIGFzIGRlc2NyaWJlZCBpbiBbNDEzXVNlY3Rpb24gMi43LjEsIGUuZy4KCiAgU0VUIFBSRUZJWCBBTEwKICBQVFkgKG9yIFBJUEUpIHNycC10ZWxuZXQgeGVub24uc3RhbmZvcmQuZWR1CgogICBDLUtlcm1pdCBpdHNlbGYgY2FuIGJlIGJ1aWx0IGFzIGFuIFNSUCBUZWxuZXQgY2xpZW50IG9uIHN5c3RlbXMgdGhhdAogICBoYXZlIGxpYnNycC5hIGluc3RhbGxlZDsgdGhlIEMtS2VybWl0IHN1cHBvcnQgY29kZSwgaG93ZXZlciwgbWF5IG5vdAogICBiZSBleHBvcnRlZCBvdXRzaWRlIHRoZSBVU0Egb3IgQ2FuYWRhLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi43LjQuNC4gU09DS1MKCiAgIEMtS2VybWl0IGNhbiBiZSBidWlsdCBhcyBhIFNPQ0tTLWF3YXJlIGNsaWVudCBvbiBzeXN0ZW1zIHRoYXQgaGF2ZSBhCiAgIFNPQ0tTIGxpYnJhcnkuIFNlZSBzZWN0aW9uIDguMS4xIG9mIHRoZSBbNDE0XWNrY2NmZy50eHQgZmlsZS4KCiAgIEMtS2VybWl0IDcuMCBjYW4gYWxzbyBiZSBydW4gb3ZlciBTT0NLU2lmaWVkIFRlbG5ldCBvciBybG9naW4gY2xpZW50cwogICB3aXRoIFNFVCBORVRXT1JLIFRZUEUgQ09NTUFORC4gU3VwcG9zZSB0aGUgVGVsbmV0IHByb2dyYW0gb24geW91cgogICBzeXN0ZW0gaXMgU09DS1MgZW5hYmxlZCBidXQgQy1LZXJtaXQgaXMgbm90LiBNYWtlIEtlcm1pdCBjb25uZWN0aW9ucwogICBsaWtlIHRoaXM6CgogIFNFVCBQUkVGSVggQUxMCiAgUFRZIChvciBQSVBFKSB0ZWxuZXQgenp6LmNvbQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgMi43LjQuNS4gS2VyYmVyb3MKCiAgIFVOSVggQy1LZXJtaXQgY2FuIGJlIGJ1aWx0IHdpdGggTUlUIEtlcmJlcm9zIElWIG9yIFYgYXV0aGVudGljYXRpb24KICAgYW5kIGVuY3J5cHRpb24uIEluc3RydWN0aW9ucyBhcmUgYXZhaWxhYmxlIGluIGEgWzQxNV1zZXBhcmF0ZQogICBkb2N1bWVudC4gQWRkaXRpb25hbCBtb2R1bGVzIGFyZSByZXF1aXJlZCB0aGF0IGNhbiBub3QgYmUgZXhwb3J0ZWQKICAgZnJvbSB0aGUgVVNBIHRvIGFueSBjb3VudHJ5IGV4Y2VwdCBDYW5hZGEsIGJ5IFVTIGxhdy4KCiAgIElmIHlvdSBoYXZlIEtlcmJlcm9zIGluc3RhbGxlZCBidXQgeW91IGRvbid0IGhhdmUgYSBLZXJiZXJpemVkIHZlcnNpb24KICAgb2YgQy1LZXJtaXQsIHlvdSBjYW4gdXNlIGt0ZWxuZXQgYXMgQy1LZXJtaXQncyBleHRlcm5hbCBjb21tdW5pY2F0aW9ucwogICBwcm9ncmFtIHRvIG1ha2Ugc2VjdXJlIGNvbm5lY3Rpb25zIHdpdGhvdXQgZ2l2aW5nIHVwIEMtS2VybWl0J3MKICAgc2VydmljZXM6CgogIFNFVCBQUkVGSVggQUxMCiAgUFRZIChvciBQSVBFKSBrdGVsbmV0IGNpYS5nb3YKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjguIFNjcmlwdGluZyBMb2NhbCBQcm9ncmFtcwoKICAgSWYgeW91ciB2ZXJzaW9uIG9mIEtlcm1pdCBoYXMgUFRZIHN1cHBvcnQgYnVpbHQgaW4sIHRoZW4gYW55CiAgIHRleHQtYmFzZWQgcHJvZ3JhbSBjYW4gYmUgaW52b2tlZCB3aXRoIFNFVCBIT1NUIC9QVFkgb3IgZXF1aXZhbGVudAogICBjb21tYW5kIGFuZCBjb250cm9sbGVkIHVzaW5nIHRoZSBub3JtYWwgc2VxdWVuY2Ugb2YgT1VUUFVULCBJTlBVVCwgSUYKICAgU1VDQ0VTUyBjb21tYW5kcyAodGhpcyBpcyB0aGUgc2FtZSBzZXJ2aWNlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlCiAgICdleHBlY3QnIHByb2dyYW0sIGJ1dCBjb250cm9sbGVkIGJ5IHRoZSBLZXJtaXQgc2NyaXB0IGxhbmd1YWdlIHJhdGhlcgogICB0aGFuIFRjbCkuCgogICBXaGVuIFBUWSBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUsIHRoZW4gYW55IHByb2dyYW0gdGhhdCB1c2VzIHN0YW5kYXJkCiAgIGlucHV0IGFuZCBvdXRwdXQgY2FuIGJlIGludm9rZWQgd2l0aCBTRVQgSE9TVCAvUElQRS4KCiAgIEhlcmUncyBhbiBleGFtcGxlIGluIHdoaWNoIHdlIHN0YXJ0IGFuIGV4dGVybmFsIEtlcm1pdCBwcm9ncmFtLCB3YWl0CiAgIGZvciBpdHMgcHJvbXB0LCBnaXZlIGl0IGEgVkVSU0lPTiBjb21tYW5kLCBhbmQgdGhlbiBleHRyYWN0IHRoZQogICBudW1lcmljIHZlcnNpb24gbnVtYmVyIGZyb20gaXRzIHJlc3BvbnNlOgoKICBzZXQgaG9zdCAvcHR5IGtlcm1pdCAtWQogIGlmIGZhaWwgc3RvcCAxIHtDYW4ndCBzdGFydCBleHRlcm5hbCBjb21tYW5kfQogIGlucHV0IDEwIEMtS2VybWl0PgogIGlmIGZhaWwgc3RvcCAxIHtObyBDLUtlcm1pdD4gcHJvbXB0fQogIG91dHB1dCB2ZXJzaW9uXDEzCiAgaW5wdXQgMTAge051bWVyaWM6IH0KICBpZiBmYWlsIHN0b3AgMSB7Tm8gbWF0Y2ggZm9yICJOdW1lcmljOiJ9CiAgY2xlYXIgaW5wdXQKICBpbnB1dCAxMCBcMTAKICBlY2hvIFZFUlNJT04gPSAiXGZzdWJzdHIoXHYoaW5wdXQpLDEsNikiCiAgb3V0cHV0IGV4aXRcMTMKCiAgIFRoaXMgdGVjaG5pcXVlIGNvdWxkIGJlIHVzZWQgdG8gY29udHJvbCBhbnkgb3RoZXIgaW50ZXJhY3RpdmUgcHJvZ3JhbSwKICAgZXZlbiB0aG9zZSB0aGF0IGRvIHNjcmVlbiBmb3JtYXR0aW5nIChsaWtlIEVtYWNzIG9yIFZpKSwgaWYgeW91IGNhbgogICBmaWd1cmUgb3V0IHRoZSBzZXF1ZW5jZSBvZiBldmVudHMuIElmIHlvdXIgS2VybWl0IHByb2dyYW0gZG9lc24ndCBoYXZlCiAgIFBUWSBzdXBwb3J0LCB0aGVuIHRoZSBjb21tYW5kcyBhcmUgcmVzdHJpY3RlZCB0byB0aG9zZSB1c2luZyBzdGFuZGFyZAogICBpL28sIGluY2x1ZGluZyBjZXJ0YWluIHNoZWxscywgaW50ZXJhY3RpdmUgdGV4dC1tb2RlICJoYXJkY29weSIKICAgZWRpdG9ycyBsaWtlIGV4LCBhbmQgc28gb24uCgogICBJZiB5b3UgYXJlIHVzaW5nIHRoZSBQVFkgaW50ZXJmYWNlLCB5b3Ugc2hvdWxkIGJlIGF3YXJlIHRoYXQgaXQgcnVucwogICB0aGUgZ2l2ZW4gcHJvZ3JhbSBvciBjb21tYW5kIGRpcmVjdGx5IG9uIHRoZSBwdHksIHdpdGhvdXQgYW55CiAgIGludGVydmVuaW5nIHNoZWxsIHRvIGludGVycHJldCBtZXRhY2hhcmFjdGVycywgcmVkaXJlY3RvcnMsIGV0Yy4gSWYKICAgeW91IG5lZWQgdGhpcyBzb3J0IG9mIHRoaW5nLCBpbmNsdWRlIHRoZSBhcHByb3ByaWF0ZSBzaGVsbCBpbnZvY2F0aW9uCiAgIGFzIHBhcnQgb2YgeW91ciBjb21tYW5kOyBmb3IgZXhhbXBsZToKCiAgcHR5IGVjaG8gKgoKICAganVzdCBlY2hvZXMgIioiOyB3aGVyZWFzOgoKICBwdHkga3NoIC1jICJlY2hvICoiCgogICBlY2hvZXMgYWxsIHRoZSBmaWxlbmFtZXMgdGhhdCBrc2ggZmluZHMgbWF0Y2hpbmcgIioiLgoKICAgU2ltaWxhcmx5IGZvciByZWRpcmVjdGlvbjoKCiAgc2V0IGhvc3QgL3B0eSBrc2ggLWMgImNhdCA+IGZvbyIgIDsgTm90ZTogdXNlIHNoZWxsIHF1b3RpbmcgcnVsZXMgaGVyZQogIHNldCB0cmFuc21pdCBlb2YgXDQKICB0cmFuc21pdCBiYXIKCiAgIEFuZCBmb3IgdGhhdCBtYXR0ZXIsIGZvciBidWlsdC1pbiBzaGVsbCBjb21tYW5kczoKCiAgc2V0IGhvc3QgL3B0eSBrc2ggLWMgImZvciBpIGluICo7IGRvIGVjaG8gJGk7IGRvbmUiCgogICBUaGUgUElQRSBpbnRlcmZhY2UsIG9uIHRoZSBvdGhlciBoYW5kLCBpbnZva2VzIHRoZSBzaGVsbAogICBhdXRvbWF0aWNhbGx5LCBzbzoKCiAgcGlwZSBlY2hvICoKCiAgIHByaW50cyBmaWxlbmFtZXMsIG5vdCAiKiIuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMi45LiBYLjI1IE5ldHdvcmtpbmcKCiAgIFguMjUgbmV0d29ya2luZyBpcyBkb2N1bWVudGVkIGluIFs0MTZdVXNpbmcgQy1LZXJtaXQsIDJuZCBFZGl0aW9uLgogICBXaGVuIHRoZSBib29rIHdhcyBwdWJsaXNoZWQsIFguMjUgd2FzIGF2YWlsYWJsZSBvbmx5IGluIFN1bk9TLAogICBTb2xhcmlzLCBhbmQgU3RyYXR1cyBWT1MuIFVubGlrZSBUQ1AvSVAsIFguMjUgQVBJcyBhcmUgbm90CiAgIHN0YW5kYXJkaXplZDsgZWFjaCB2ZW5kb3IncyBYLjI1IGxpYnJhcmllcyBhbmQgc2VydmljZXMgKGlmIHRoZXkgaGF2ZQogICB0aGVtIGF0IGFsbCkgYXJlIHVuaXF1ZS4KCiAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgbmV3IGFkZGl0aW9ucy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDIuOS4xLiBJQk0gQUlYTGluay9YLjI1IE5ldHdvcmsgUHJvdmlkZXIgSW50ZXJmYWNlIGZvciBBSVgKCiAgIFN1cHBvcnQgZm9yIFguMjUgd2FzIGFkZGVkIHZpYSBJQk0ncyBOZXR3b3JrIFByb3ZpZGVyIEludGVyZmFjZSAoTlBJKSwKICAgQUlYTGluay9YLjI1IDEuMSwgdG8gdGhlIEFJWCA0LnggdmVyc2lvbiBvZiBDLUtlcm1pdCA3LjAuCiAgIFVuZm9ydHVuYXRlbHksIEFJWExpbmsvWC4yNSBpcyBhIHJhdGhlciBiYXJlLWJvbmVzIGZhY2lsaXR5LCBsYWNraW5nCiAgIGluIHBhcnRpY3VsYXIgYW55IGZvcm0gb2YgUEFEIHN1cHBvcnQgKFguMywgWC4yOCwgWC4yOSkuIFRodXMsIHRoZSBBSVgKICAgdmVyc2lvbiBvZiBDLUtlcm1pdCwgd2hlbiBidWlsdCB0byBpbmNsdWRlIFguMjUgbmV0d29ya2luZywgaGFzCiAgIG5laXRoZXIgYSBQQUQgY29tbWFuZCwgbm9yIGEgU0VUIFBBRCBjb21tYW5kLiBUaGUgc2FtZSBpcyB0cnVlIGZvciB0aGUKICAgdW5kZXJseWluZyBBSVggc3lzdGVtOiBubyBQQUQgc3VwcG9ydC4gVGh1cyBpdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZQogICBhbiBpbnRlcmFjdGl2ZSBzaGVsbCBzZXNzaW9uIG92ZXIgYW4gWC4yNSBjb25uZWN0aW9uIGludG8gYW4gQUlYCiAgIHN5c3RlbSAoYXMgZmFyIGFzIHdlIGtub3cpLCBldmVuIGZyb20gWC4yNS1jYXBhYmxlIEtlcm1pdCB2ZXJzaW9ucwogICAoc3VjaCBhcyBTb2xhcmlzIG9yIFZPUykgdGhhdCBkbyBpbmNsdWRlIFBBRCBzdXBwb3J0LgoKICAgVGh1cyB0aGUgWC4yNSBjYXBhYmlsaXRpZXMgaW4gQUlYIEMtS2VybWl0IGFyZSBsaW1pdGVkIHRvIHBlZXItdG8tcGVlcgogICBjb25uZWN0aW9ucywgZS5nLiBmcm9tIGEgQy1LZXJtaXQgY2xpZW50IHRvIGEgQy1LZXJtaXQgc2VydmVyLiBVbmxpa2UKICAgdGhlIFNvbGFyaXMsIFN1bk9TLCBhbmQgVk9TIHZlcnNpb25zLCB0aGUgQUlYIHZlcnNpb24gY2FuIGFjY2VwdAogICBpbmNvbWluZyBYLjI1IGNvbm5lY3Rpb25zOgoKICBzZXQgbmV0d29yayB0eXBlIHguMjUKICBpZiBmYWlsIHN0b3AgMSBTb3JyeSAtIG5vIFguMjUgc3VwcG9ydAogIDsgUHV0IGFueSBkZXNpcmVkIERJU0FCTEUgb3IgRU5BQkxFIG9yIFNFVCBjb21tYW5kcyBoZXJlLgogIHNldCBob3N0IC9zZXJ2ZXIgKgogIGlmIGZhaWwgc3RvcCAxIFguMjUgInNldCBob3N0ICoiIGZhaWxlZAoKICAgQW5kIHRoZW4gYWNjZXNzIGl0IGZyb20gdGhlIGNsaWVudCBhcyBmb2xsb3dzOgoKICBzZXQgbmV0d29yayB0eXBlIHguMjUKICBpZiBmYWlsIHN0b3AgMSBTb3JyeSAtIG5vIFguMjUgc3VwcG9ydAogIHNldCBob3N0IHh4eHh4eHggOyBTcGVjaWZ5IHRoZSBYLjI1L1guMTIxIGFkZHJlc3MKICBpZiBmYWlsIHN0b3AgMSBDYW4ndCBvcGVuIGNvbm5lY3Rpb24KCiAgIEFuZCBhdCB0aGlzIHBvaW50IHRoZSBjbGllbnQgY2FuIHVzZSB0aGUgZnVsbCByYW5nZSBvZiBjbGllbnQKICAgY29tbWFuZHM6IFNFTkQsIEdFVCwgUkVNT1RFIHh4eCwgRklOSVNILCBCWUUuCgogICBUaGUgQUlYIHZlcnNpb24gYWxzbyBhZGRzIHR3byBuZXcgdmFyaWFibGVzOgoKICAgXHYoeDI1bG9jYWxfbnVhKQogICAgICAgICAgVGhlIGxvY2FsIFguMjUgYWRkcmVzcy4KCiAgIFx2KHgyNXJlbW90ZV9udWEpCiAgICAgICAgICBUaGUgWC4yNSBhZGRyZXNzIG9mIHRoZSBob3N0IG9uIHRoZSBvdGhlciBlbmQgb2YgdGhlCiAgICAgICAgICBjb25uZWN0aW9uLgoKICAgQy1LZXJtaXQncyBBSVggWC4yNSBjbGllbnQgaGFzIG5vdCBiZWVuIHRlc3RlZCBhZ2FpbnN0IGFueXRoaW5nIG90aGVyCiAgIHRoYW4gYSBDLUtlcm1pdCBYLjI1IHNlcnZlciBvbiBBSVguIEl0IGlzIG5vdCBrbm93biBpZiBpdCB3aWxsCiAgIGludGVyb3BlcmF0ZSB3aXRoIEMtS2VybWl0IHNlcnZlcnMgb24gU29sYXJpcywgU3VuT1MsIG9yIFZPUy4KCiAgIFRvIG1ha2UgYW4gWC4yNSBjb25uZWN0aW9uIGZyb20gQUlYIEMtS2VybWl0LCB5b3UgbXVzdDoKCiAgc2V0IHgyNSBjYWxsLXVzZXItZGF0YSB4eHh4CgogICB3aGVyZSB4eHh4IGNhbiBiZSBhbnkgZXZlbi1sZW5ndGggc3RyaW5nIG9mIGhleGFkZWNpbWFsIGRpZ2l0cywgZS5nLgogICAxMjNBQkMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICAyLjkuMi4gSFAtVVggWC4yNQoKICAgQWx0aG91Z2ggQy1LZXJtaXQgcHJlc2VudGx5IGRvZXMgbm90IGluY2x1ZGUgYnVpbHQtaW4gc3VwcG9ydCBmb3IKICAgSFAtVVggWC4yNSwgaXQgY2FuIHN0aWxsIGJlIHVzZWQgdG8gbWFrZSBYLjI1IGNvbm5lY3Rpb25zIGFzIGZvbGxvd3M6CiAgIHN0YXJ0IEtlcm1pdCBhbmQgdGVsbCBpdCB0bzoKCiAgc2V0IHByZWZpeGluZyBhbGwKICBzZXQgcGFyaXR5IHNwYWNlCiAgcHR5IHBhZGVtIGFkZHJlc3MKCiAgIFRoaXMgc2hvdWxkIHdvcmsgaW4gSFAtVVggOS4wMCBhbmQgbGF0ZXIgKHNlZSBbNDE3XVNlY3Rpb24gMi43KS4gSWYKICAgeW91IGhhdmUgYW4gZWFybGllciBIUC1VWCB2ZXJzaW9uLCBvciB0aGUgUFRZIGludGVyZmFjZSBkb2Vzbid0IHdvcmsKICAgb3IgaXNuJ3QgYXZhaWxhYmxlLCB0cnk6CgogIHNldCBwcmVmaXhpbmcgYWxsCiAgc2V0IHBhcml0eSBzcGFjZQogIHBpcGUgcGFkZW0gYWRkcmVzcwoKICAgRmFpbGluZyB0aGF0LCB1c2UgS2VybWl0IHRvIHRlbG5ldCB0byBsb2NhbGhvc3QgYW5kIHRoZW4gYWZ0ZXIgbG9nZ2luZwogICBiYWNrIGluLCBzdGFydCBwYWRlbSBhcyB5b3Ugd291bGQgbm9ybWFsbHkgZG8gdG8gY29ubmVjdCBvdmVyIFguMjUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgMi4xMC4gQWRkaXRpb25hbCBTZXJpYWwgUG9ydCBDb250cm9scwoKICAgQy1LZXJtaXQgNy4wIGFkZHMgdGhlIGZvbGxvd2luZyBjb21tYW5kcyBmb3IgZ3JlYXRlciBjb250cm9sIG92ZXIKICAgc2VyaWFsIHBvcnRzLiBUaGVzZSBjb21tYW5kcyBhcmUgYXZhaWxhYmxlIG9ubHkgaW4gQy1LZXJtaXQgdmVyc2lvbnMKICAgd2hvc2UgdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtcyBwcm92aWRlIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZpY2VzCiAgIChzdWNoIGFzIFBPU0lYIGFuZCBVTklYIFN5c3RlbSBWKSwgYW5kIGV2ZW4gdGhlbiB0aGVpciBzdWNjZXNzZnVsCiAgIG9wZXJhdGlvbiBkZXBlbmRzIG9uIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHNwZWNpZmljIGRldmljZSBhbmQKICAgZHJpdmVyLgoKICAgU0VUIERJU0NPTk5FQ1QgeyBPTiwgT0ZGIH0KICAgICAgICAgIE9uIGEgU0VUIExJTkUgb3IgU0VUIFBPUlQgY29ubmVjdGlvbiB3aXRoIFNFVCBDQVJSSUVSIE9OIG9yCiAgICAgICAgICBBVVRPLCBpZiB0aGUgY2FycmllciBzaWduYWwgZHJvcHMgZHVyaW5nIHRoZSBjb25uZWN0aW9uLAogICAgICAgICAgaW5kaWNhdGluZyB0aGF0IHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGxvc3QsIGFuZCBDLUtlcm1pdAogICAgICAgICAgbm90aWNlcyBpdCwgdGhpcyBzZXR0aW5nIGdvdmVybnMgd2hhdCBoYXBwZW5zIG5leHQuIFdpdGggU0VUCiAgICAgICAgICBESVNDT05ORUNUIE9GRiwgd2hpY2ggaXMgY29uc2lzdGVudCB3aXRoIHByZXZpb3VzIGJlaGF2aW9yLCBhbmQKICAgICAgICAgIHRoZXJlZm9yZSB0aGUgZGVmYXVsdCwgQy1LZXJtaXQgY29udGludWVzIHRvIGtlZXAgdGhlIGRldmljZQogICAgICAgICAgb3BlbiBhbmQgYWxsb2NhdGVkLiBXaXRoIFNFVCBESVNDT05ORUNUIE9OLCBDLUtlcm1pdAogICAgICAgICAgYXV0b21hdGljYWxseSBjbG9zZXMgYW5kIHJlbGVhc2VzIHRoZSBkZXZpY2Ugd2hlbiBpdCBzZW5zZXMgYQogICAgICAgICAgY2FycmllciBvbi10by1vZmYgdHJhbnNpdGlvbiwgdGh1cyBhbGxvd2luZyBvdGhlcnMgdG8gdXNlIGl0LgogICAgICAgICAgSG93ZXZlciwgaXQgcmVtYWlucyB0aGUgZGVmYXVsdCBkZXZpY2UgZm9yIGkvbyAoRElBTCwgUkVESUFMLAogICAgICAgICAgSU5QVVQsIFNFTkQsIENPTk5FQ1QsIGV0YyksIHNvIGlmIGEgc3Vic2VxdWVudCBpL28gY29tbWFuZCBpcwogICAgICAgICAgZ2l2ZW4sIHRoZSBkZXZpY2UgaXMgcmVvcGVuZWQgaWYgaXQgaXMgc3RpbGwgYXZhaWxhYmxlLiBXaGVuIGl0CiAgICAgICAgICBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGNsb3NlZCBpbiB0aGlzIG1hbm5lciwgU0hPVwogICAgICAgICAgQ09NTVVOSUNBVElPTlMgcHV0cyAiKGNsb3NlZCkiIGFmdGVyIGl0cyBuYW1lLCBhbmQgaW4gVU5JWCwgdGhlCiAgICAgICAgICBsb2NrZmlsZSBkaXNhcHBlYXJzIC0tIGJvdGggZnJvbSBTSE9XIENPTU0gYW5kIGZyb20gdGhlCiAgICAgICAgICBsb2NrZmlsZSBkaXJlY3RvcnkgaXRzZWxmLiBTeW5vbnltOiBTRVQgQ0xPU0UtT04tRElTQ09OTkVDVC4KCiAgIFNFVCBFWElUIE9OLURJU0NPTk5FQ1QgeyBPTiwgT0ZGIH0KICAgICAgICAgIExpa2UgRElTQ09OTkVDVCwgYnV0IG1ha2VzIHRoZSBwcm9ncmFtIGV4aXQgaWYgYSBjb25uZWN0aW9uCiAgICAgICAgICBkcm9wcy4KCiAgIE5vdGUgdGhhdCBTRVQgQ0xPU0UtT04tRElTQ09OTkVDVCBhbmQgU0VUIEVYSVQgT04tRElTQ09OTkVDVCBhcHBseQogICBvbmx5IHRvIGNvbm5lY3Rpb25zIHRoYXQgZHJvcDsgdGhleSBkbyBub3QgYXBwbHkgdG8gY29ubmVjdGlvbnMgdGhhdAogICBjYW4ndCBiZSBtYWRlIGluIHRoZSBmaXJzdCBwbGFjZS4gRm9yIGV4YW1wbGUsIHRoZXkgaGF2ZSBubyBlZmZlY3QKICAgd2hlbiBhIFNFVCBMSU5FLCBTRVQgSE9TVCwgVEVMTkVULCBvciBESUFMIGNvbW1hbmQgZmFpbHMuCgogICBIQU5HVVAKICAgICAgICAgIElmIFtDTE9TRS1PTi1dRElTQ09OTkVDVCBpcyBPTiwgYW5kIHRoZSBIQU5HVVAgY29tbWFuZCBpcyBnaXZlbgogICAgICAgICAgb24gYSBzZXJpYWwgZGV2aWNlLCBhbmQgdGhlIGNhcnJpZXIgc2lnbmFsIGlzIG5vIGxvbmdlciBwcmVzZW50CiAgICAgICAgICBhZnRlciB0aGUgSEFOR1VQIGNvbW1hbmQsIHRoZSBkZXZpY2UgaXMgY2xvc2VkIGFuZCByZWxlYXNlZC4KCiAgIFNFVCBQQVJJVFkgSEFSRFdBUkUgeyBFVkVOLCBPREQgfQogICAgICAgICAgVW5saWtlIFNFVCBQQVJJVFkgeyBFVkVOLCBPREQsIE1BUkssIFNQQUNFIH0sIHdoaWNoIHNlbGVjdHMgNwogICAgICAgICAgZGF0YSBiaXRzIHBsdXMgdGhlIGluZGljYXRlZCBraW5kIG9mIHBhcml0eSAodG8gYmUgZG9uZSBpbgogICAgICAgICAgc29mdHdhcmUgYnkgS2VybWl0IGl0c2VsZiksIFNFVCBQQVJJVFkgSEFSRFdBUkUgc2VsZWN0cyA4IGRhdGEKICAgICAgICAgIGJpdHMgcGx1cyBldmVuIG9yIG9kZCBwYXJpdHksIHRvIGJlIGRvbmUgYnkgdGhlIHVuZGVybHlpbmcKICAgICAgICAgIGhhcmR3YXJlLCBvcGVyYXRpbmcgc3lzdGVtLCBvciBkZXZpY2UgZHJpdmVyLiBUaGlzIGNvbW1hbmQgaXMKICAgICAgICAgIGVmZmVjdGl2ZSBvbmx5IHdpdGggYSBTRVQgTElORSBvciBTRVQgUE9SVCBkZXZpY2UuIFRoYXQgaXMsIGl0CiAgICAgICAgICBoYXMgbm8gZWZmZWN0IGluIHJlbW90ZSBtb2RlLCBub3Igb24gbmV0d29yayBjb25uZWN0aW9ucy4gVGhlcmUKICAgICAgICAgIGlzIHByZXNlbnRseSBubyBtZXRob2QgZm9yIHNlbGVjdGluZyA4IGRhdGEgYml0cyBwbHVzIG1hcmsgb3IKICAgICAgICAgIHNwYWNlIHBhcml0eS4gSWYgaGFyZHdhcmUgcGFyaXR5IGlzIGluIGVmZmVjdCwgdGhlIHZhcmlhYmxlCiAgICAgICAgICBcdihod3Bhcml0eSkgaXMgc2V0IHRvICJldmVuIiBvciAib2RkIi4gTm90ZTogc29tZSBwbGF0Zm9ybXMKICAgICAgICAgIG1pZ2h0IGFsc28gc3VwcG9ydCBzZXR0aW5ncyBvZiBTUEFDRSwgTUFSSywgb3IgTk9ORS4KCiAgIFNFVCBTVE9QLUJJVFMgeyAxLCAyIH0KICAgICAgICAgIFRoaXMgdGVsbHMgdGhlIG51bWJlciBvZiAxLWJpdHMgdG8gaW5zZXJ0IGFmdGVyIGFuIG91dGJvdW5kCiAgICAgICAgICBjaGFyYWN0ZXIncyBkYXRhIGFuZCBwYXJpdHkgYml0cywgdG8gc2VwYXJhdGUgaXQgZnJvbSB0aGUgbmV4dAogICAgICAgICAgY2hhcmFjdGVyLiBOb3JtYWxseSAxLiBDaG9vc2luZyAyIHN0b3AgYml0cyBzaG91bGQgZG8gbm8gaGFybSwKICAgICAgICAgIGJ1dCB3aWxsIHNsb3cgZG93biBzZXJpYWwgdHJhbnNtaXNzaW9uIGJ5IGFwcHJveGltYXRlbHkgMTAKICAgICAgICAgIHBlcmNlbnQuIEhpc3RvcmljYWxseSwgMiBzdG9wIGJpdHMgd2VyZSB1c2VkIHdpdGggVGVsZXR5cGVzIChhdAogICAgICAgICAgMTEwIGJwcyBvciBiZWxvdykgZm9yIHByaW50LWhlYWQgcmVjb3ZlcnkgdGltZS4gVGhlcmUgaXMKICAgICAgICAgIHByZXNlbnRseSBubyBtZXRob2QgZm9yIGNob29zaW5nIGFueSBudW1iZXIgb2Ygc3RvcCBiaXRzCiAgICAgICAgICBiZXNpZGVzIDEgYW5kIDIuCgogICBTRVQgU0VSSUFMIFsgZHBzIF0KICAgICAgICAgIGRwcyBzdGFuZHMgZm9yIERhdGEtYml0cywgUGFyaXR5LCBTdG9wLWJpdHMuIFRoaXMgaXMgdGhlCiAgICAgICAgICBub3RhdGlvbiBmYW1pbGlhciB0byBtYW55IHBlb3BsZSBmb3Igc2VyaWFsIHBvcnQgY29uZmlndXJhdGlvbjoKICAgICAgICAgIDdFMSwgOE4xLCA3TzIsIGV0Yy4gVGhlIGRhdGEgYml0cyBudW1iZXIgYWxzbyBiZWNvbWVzIHRoZQogICAgICAgICAgVEVSTUlOQUwgQllURVNJWkUgc2V0dGluZy4gVGhlIHNlY29uZCBjaGFyYWN0ZXIgaXMgRSBmb3IgRXZlbiwKICAgICAgICAgIE8gZm9yIE9kZCwgTSBmb3IgTWFyaywgUyBmb3IgU3BhY2UsIG9yIE4gZm9yIE5vbmUuIFRoZSBsaXN0IG9mCiAgICAgICAgICBhdmFpbGFibGUgb3B0aW9ucyBkZXBlbmRzIG9uIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHNwZWNpZmljCiAgICAgICAgICBwbGF0Zm9ybS4gSWYgZHBzIGlzIG9taXR0ZWQsIDhOMSBpcyB1c2VkLiBUeXBlICJzZXQgc2VyaWFsID8iCiAgICAgICAgICBmb3IgYSBsaXN0IG9mIGF2YWlsYWJsZSBjaG9pY2VzLiBFeGFtcGxlczoKCiAgICAgICAgU0VUIFNFUklBTCA3RTEKICAgICAgICAgICAgICAgIEVxdWl2YWxlbnQgdG8gU0VUIFBBUklUWSBFVkVOLCBTRVQgU1RPUC1CSVRTIDEsIFNFVCBURVJNCiAgICAgICAgICAgICAgICBCWVRFIDcuCgogICAgICAgIFNFVCBTRVJJQUwgOE4xCiAgICAgICAgICAgICAgICBFcXVpdmFsZW50IHRvIFNFVCBQQVJJVFkgTk9ORSwgU0VUIFNUT1AtQklUUyAxLCBTRVQgVEVSTQogICAgICAgICAgICAgICAgQllURSA4LgoKICAgICAgICBTRVQgU0VSSUFMIDdFMgogICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0byBTRVQgUEFSSVRZIEVWRU4gYW5kIFNFVCBTVE9QLUJJVFMgMiwgU0VUCiAgICAgICAgICAgICAgICBURVJNIEJZVEUgNy4KCiAgICAgICAgU0VUIFNFUklBTCA4RTIKICAgICAgICAgICAgICAgIFNhbWUgYXMgU0VUIFBBUklUWSBIQVJEV0FSRSBFVkVOLCBTRVQgU1RPUC1CSVRTIDIsIFNFVAogICAgICAgICAgICAgICAgVEVSTSBCWVRFIDguCgogICAgICAgIFNFVCBTRVJJQUwKICAgICAgICAgICAgICAgIFNhbWUgYXMgU0VUIFBBUklUWSBOT05FIGFuZCBTRVQgU1RPUC1CSVRTIDEsIFNFVCBURVJNCiAgICAgICAgICAgICAgICBCWVRFIDguCgogICBOb3RlczoKCiAgICAgKiBUaGUgU0VUIFNFUklBTCB4eDIgb3B0aW9ucyBhcmUgYXZhaWxhYmxlIG9ubHkgaW4gS2VybWl0IHZlcnNpb25zCiAgICAgICB3aGVyZSB0aGUgU0VUIFBBUklUWSBIQVJEV0FSRSBjb21tYW5kIGlzIGFsc28gYXZhaWxhYmxlLiAoU0hPVwogICAgICAgRkVBVFVSRVMgaW5jbHVkZXMgIkhXUEFSSVRZIiBpbiBpdHMgb3B0aW9ucyBsaXN0LikKICAgICAqIFRoZSBTRVQgU0VSSUFMIDd4eCBhbmQgOE4xIG9wdGlvbnMgYWZmZWN0IHRoZSBzb2Z0d2FyZSBwYXJpdHkKICAgICAgIHNldHRpbmcsIGV2ZW4gZm9yIG5ldHdvcmsgY29ubmVjdGlvbnMuCiAgICAgKiBBcyBub3RlZCBpbiB0aGUgbWFudWFsLCBzZWxlY3RpbmcgOCBkYXRhIGJpdHMgZG9lcyBub3QgZ2l2ZSB5b3UKICAgICAgIDgtYml0IHRlcm1pbmFsIHNlc3Npb25zIGluIENPTk5FQ1QgbW9kZSB1bmxlc3MgeW91IGFsc28gU0VUCiAgICAgICBURVJNSU5BTCBCWVRFU0laRSA4LiBUaGUgZGVmYXVsdCB0ZXJtaW5hbCBieXRlc2l6ZSByZW1haW5zIDcsIHRvCiAgICAgICBwcm90ZWN0IGFnYWluc3QgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgcmVtb3RlIGhvc3QgaXMgZ2VuZXJhdGluZwogICAgICAgcGFyaXR5IGJ1dCB5b3UgZG9uJ3Qga25vdyBhYm91dCBpdC4gSWYgdGhlIHRlcm1pbmFsIGJ5dGVzaXplIHdhcyA4CiAgICAgICBieSBkZWZhdWx0IGFuZCB5b3UgQ09OTkVDVGVkIHRvIHN1Y2ggYSBob3N0LCB5b3Ugd291bGQgc2VlIG9ubHkKICAgICAgIGdhcmJhZ2Ugb24geW91ciBzY3JlZW4uCiAgICAgKiBJZiB5b3UgZG8gbm90IGdpdmUgYSBTRVQgU1RPUC1CSVRTIG9yIFNFVCBTRVQgU0VSSUFMIGNvbW1hbmQsCiAgICAgICBDLUtlcm1pdCBkb2VzIG5vdCBhdHRlbXB0IHRvIHNldCB0aGUgZGV2aWNlJ3Mgc3RvcCBiaXRzOyBpbnN0ZWFkLAogICAgICAgaXQgdXNlcyB3aGF0ZXZlciBzZXR0aW5nIHRoZSBkZXZpY2UgdXNlcyB3aGVuIG5vdCBnaXZlbiBleHBsaWNpdAogICAgICAgaW5zdHJ1Y3Rpb25zIGFib3V0IHN0b3AgYml0cy4KCiAgIFNIT1cgQ09NTVVOSUNBVElPTlMgZGlzcGxheXMgdGhlIGN1cnJlbnQgc2V0dGluZ3MuIFN0b3AgYml0cyBhbmQKICAgaGFyZHdhcmUgcGFyaXR5IGFyZSBzaG93biBvbmx5IGZvciBTRVQgUE9SVCAvIFNFVCBMSU5FIChzZXJpYWwpCiAgIGRldmljZXMsIHNpbmNlIHRoZXkgZG8gbm90IGFwcGx5IHRvIG5ldHdvcmsgY29ubmVjdGlvbnMgb3IgdG8gcmVtb3RlCiAgIG1vZGUuIFNUT1AtQklUUyBpcyBzaG93biBhcyAiKGRlZmF1bHQpIiBpZiB5b3UgaGF2ZSBub3QgZ2l2ZW4gYW4KICAgZXhwbGljaXQgU0VUIFNUT1AtQklUUyBvciBTRVQgU0VSSUFMIGNvbW1hbmQuCgogICBUaGUgXHYoc2VyaWFsKSB2YXJpYWJsZSBzaG93cyB0aGUgU0VUIFNFUklBTCBzZXR0aW5nICg4TjEsIDdFMSwgZXRjKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjExLiBHZXR0aW5nIEFjY2VzcyB0byB0aGUgRGlhbG91dCBEZXZpY2UKCiAgICAgVGhpcyBzZWN0aW9uIGlzIGZvciBVTklYIG9ubHk7IG5vdGUgdGhlIHNwZWNpYWwgd29yZHMgYWJvdXQgUU5YIGF0CiAgICAgdGhlIGVuZC4gQWxzbyBzZWUgWzQxOF1TZWN0aW9uIDIuMCBmb3IgU0VUIExJTkUgc3dpdGNoZXMsCiAgICAgcGFydGljdWxhcmx5IHRoZSAvU0hBUkUgc3dpdGNoIGZvciBWTVMgb25seS4KCiAgIEMtS2VybWl0IGRvZXMgaXRzIGJlc3QgdG8gb2JleSB0aGUgVVVDUCBsb2NrZmlsZSBjb252ZW50aW9ucyBvZiBlYWNoCiAgIHBsYXRmb3JtIChtYWNoaW5lLCBvcGVyYXRpbmcgc3lzdGVtLCBPUyB2ZXJzaW9uKSB3aGVyZSBpdCBydW5zLCBpZgogICB0aGF0IHBsYXRmb3JtIHVzZXMgVVVDUC4KCiAgIEJ1dCBzaW1wbHkgb2JleWluZyB0aGUgY29udmVudGlvbnMgaXMgb2Z0ZW4gbm90IGdvb2QgZW5vdWdoLCBkdWUgdG8KICAgdGhlIGluY3JlYXNpbmcgbGlrZWxpaG9vZCB0aGF0IGEgcGFydGljdWxhciBzZXJpYWwgZGV2aWNlIG1pZ2h0IGhhdmUKICAgbW9yZSB0aGFuIG9uZSBuYW1lIChlLmcuIC9kZXYvdHR5MDAgYW5kIC9kZXYvdGVybS8wMCBhcmUgdGhlIHNhbWUKICAgZGV2aWNlIGluIFVuaXh3YXJlIDc7IC9kZXYvY3VhIGFuZCAvZGV2L2N1ZmEgYXJlIHRoZSBzYW1lIGRldmljZSBpbgogICBOZVhUU1RFUCksIHBsdXMgdGhlIGluY3JlYXNpbmdseSB3aWRlc3ByZWFkIHVzZSBvZiBzeW1saW5rcyBmb3IgZGV2aWNlCiAgIG5hbWVzLCBzdWNoIGFzIC9kZXYvbW9kZW0uCgogICBDLUtlcm1pdCA3LjAgZ29lcyB0byBncmVhdGVyIGxlbmd0aHMgdGhhbiBwcmV2aW91cyB2ZXJzaW9ucyB0bwogICBzdWNjZXNzZnVsbHkgaW50ZXJsb2NrIHdpdGggb3RoZXIgY29tbXVuaWNhdGlvbnMgcHJvZ3JhbSAoYW5kIG90aGVyCiAgIGluc3RhbmNlcyBvZiBLZXJtaXQgaXRzZWxmKTsgZm9yIGV4YW1wbGUsIGJ5OgoKICAgICAqIENyZWF0aW9uIG9mIGR1YWwgbG9ja2ZpbGVzIHdoZW5ldmVyIGEgc3ltbGluayBpcyB1c2VkOyBvbmUgZm9yIHRoZQogICAgICAgbGluayBuYW1lIGFuZCBvbmUgZm9yIHRoZSByZWFsIG5hbWUuCiAgICAgKiBDcmVhdGlvbiBvZiBkdWFsIGxvY2tmaWxlcyBpbiBIUC1VWCBhY2NvcmRpbmcgdG8gSFAgcnVsZXMuCiAgICAgKiBDcmVhdGlvbiBvZiBkdWFsIHVwcGVyY2FzZS9sb3dlcmNhc2UgbG9ja2ZpbGUgbmFtZXMgaW4gU0NPCiAgICAgICBVTklYL09EVC9PU1I1LgogICAgICogVGhlIHVzZSBvZiB0dHlsb2NrKCkgaW4gdmVyc2lvbnMgb2YgQUlYIHdoZXJlIGl0IHdvcmtzLgogICAgICogVGhlIHVzZSwgd2hlcmV2ZXIgcG9zc2libGUsIG9mIGxvY2tmaWxlIG5hbWVzIGJhc2VkIG9uCiAgICAgICBpbm9kZS9tYWpvci9taW5vciBkZXZpY2UgbnVtYmVyIHJhdGhlciB0aGFuIGRldmljZSBuYW1lLgoKICAgU2VlIHRoZSBbNDE5XWNrdWlucy50eHQgYW5kIFs0MjBdY2t1YndyLnR4dCBmaWxlcyBmb3IgZGV0YWlscy4KCiAgIFFOWCBpcyBhbG1vc3QgdW5pcXVlIGFtb25nIFVOSVggdmFyaWV0aWVzIGluIGhhdmluZyBubyBVVUNQIHByb2dyYW1zCiAgIG5vciBVVUNQLW9yaWVudGVkIGRpYWxvdXQtZGV2aWNlIGxvY2tpbmcgY29udmVudGlvbnMuIFFOWCBkb2VzLAogICBob3dldmVyLCBhbGxvdyBhIHByb2dyYW0gdG8gZ2V0IHRoZSBkZXZpY2Ugb3BlbiBjb3VudC4gVGhpcyBjYW4gbm90IGJlCiAgIGEgcmVsaWFibGUgZm9ybSBvZiBsb2NraW5nIHVubGVzcyBhbGwgYXBwbGljYXRpb25zIGRvIGl0IChhbmQgdGhleQogICBkb24ndCksIHNvIGJ5IGRlZmF1bHQsIEtlcm1pdCB1c2VzIHRoaXMgaW5mb3JtYXRpb24gb25seSBmb3IgcHJpbnRpbmcKICAgYSB3YXJuaW5nIG1lc3NhZ2Ugc3VjaCBhczoKCiAgQy1LZXJtaXQ+c2V0IGxpbmUgL2Rldi9zZXIxCiAgV0FSTklORyAtICIvZGV2L3NlcjEiIGxvb2tzIGJ1c3kuLi4KCiAgIEhvd2V2ZXIsIGlmIHlvdSB3YW50IHRvIHVzZSBpdCBhcyBhIGxvY2ssIHlvdSBjYW4gZG8gc28gd2l0aDoKCiAgU0VUIFFOWC1QT1JULUxPQ0sgeyBPTiwgT0ZGIH0KCiAgIFFOWC1QT1JULUxPQ0sgaXMgT0ZGIGJ5IGRlZmF1bHQ7IGlmIHlvdSBzZXQgaW4gT04sIEMtS2VybWl0IGZhaWxzIHRvCiAgIG9wZW4gYW55IGRpYWxvdXQgZGV2aWNlIHdoZW4gaXRzIG9wZW4gY291bnQgaW5kaWNhdGVzIHRoYXQgYW5vdGhlcgogICBwcm9jZXNzIGhhcyBpdCBvcGVuLiBTSE9XIENPTU0gKGluIFFOWCBvbmx5KSBkaXNwbGF5cyB0aGUgc2V0dGluZywgYW5kCiAgIGlmIHlvdSBoYXZlIGEgcG9ydCBvcGVuLCBpdCBhbHNvIHNob3dzIHRoZSBjdXJyZW50IG9wZW4gY291bnQgKHdpdGgKICAgQy1LZXJtaXQncyBvd24gYWNjZXNzIGFsd2F5cyBjb3VudGluZyBhcyAxKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjEyLiBUaGUgQ29ubmVjdGlvbiBMb2cKCiAgIEMtS2VybWl0IDcuMCBhZGRzIHRoZSBhYmlsaXR5IHRvIGxvZyBjb25uZWN0aW9ucywgc28geW91IGNhbiBzZWUgd2hlcmUKICAgeW91J3ZlIGJlZW4gYW5kIGhhdmUgYSByZWNvcmQgb2YgY2FsbHMgeW91J3ZlIG1hZGUuIEEgY29ubmVjdGlvbiBpcwogICBkZWZpbmVkIGFzIGFueSBjb21tdW5pY2F0aW9ucyBzZXNzaW9uIHRoYXQgaXMgYmVndW4gYnkgU0VUIExJTkUsIFNFVAogICBQT1JULCBESUFMLCBTRVQgSE9TVCwgVEVMTkVULCBvciBSTE9HSU4uIENvbm5lY3Rpb25zIGFyZSBub3QgbG9nZ2VkCiAgIHVubGVzcyB5b3UgcmVxdWVzdCBpdDsgdGhlIGNvbW1hbmQgaXM6CgogICBMT0cgQ1ggWyBmaWxlbmFtZSBbIHsgTkVXLCBBUFBFTkQgfSBdIF0KICAgICAgICAgIEVuYWJsZXMgbG9nZ2luZyBvZiBjb25uZWN0aW9ucyBpbiB0aGUgZ2l2ZW4gZmlsZS4gSWYgdGhlCiAgICAgICAgICB0cmFpbGluZyB7IE5FVywgQVBQRU5EIH0ga2V5d29yZCBpcyBvbWl0dGVkLCB0aGUgZmlsZSBpcyBvcGVuZWQKICAgICAgICAgIGZvciBhcHBlbmRpbmc7IGkuZS4gbmV3IHJlY29yZHMgYXJlIHdyaXR0ZW4gdG8gdGhlIGVuZC4gSWYgTkVXCiAgICAgICAgICBpcyBzcGVjaWZpZWQsIGEgbmV3IGZpbGUgaXMgY3JlYXRlZDsgaWYgYSBmaWxlIG9mIHRoZSBzYW1lIG5hbWUKICAgICAgICAgIGFscmVhZHkgZXhpc3RlZCwgaXQgaXMgb3ZlcndyaXR0ZW4uIElmIHRoZSBmaWxlbmFtZSBpcyBvbWl0dGVkLAogICAgICAgICAgQ1guTE9HIGluIHlvdXIgaG9tZSAobG9naW4pIGRpcmVjdG9yeSBpcyB1c2VkIChub3RlOgogICAgICAgICAgdXBwZXJjYXNlKS4gVG8gYWNjZXB0IGFsbCBkZWZhdWx0cywganVzdCB1c2UgImxvZyBjb25uZWN0aW9ucyIKICAgICAgICAgIChvciAibCBjIiBmb3Igc2hvcnQpLiBTeW5vbnltOiBMT0cgQ09OTkVDVElPTlMuCgogICBDTE9TRSBDWC1MT0cKICAgICAgICAgIFRoaXMgY2xvc2VzIHRoZSBjb25uZWN0aW9uIGxvZyBpZiBpdCB3YXMgb3Blbi4gKE5vdGUsIHRoZSBDTE9TRQogICAgICAgICAgQ09OTkVDVElPTiBjb21tYW5kIGNsb3NlcyB0aGUgY29ubmVjdGlvbiBpdHNlbGYpLgoKICAgU0hPVyBDWAogICAgICAgICAgVGhpcyBzaG93cyB5b3VyIGN1cnJlbnQgY29ubmVjdGlvbiwgaWYgYW55LCBpbmNsdWRpbmcgdGhlCiAgICAgICAgICBlbGFwc2VkIHRpbWUgKHNpbmNlIHlvdSBvcGVuZWQgaXQpLiBTeW5vbnltOiBTSE9XIENPTk5FQ1RJT04uCgogICBcdihjeF90aW1lKQogICAgICAgICAgVGhpcyB2YXJpYWJsZSBzaG93cyB0aGUgZWxhcHNlZCB0aW1lIG9mIHlvdXIgY3VycmVudAogICAgICAgICAgY29ubmVjdGlvbiwgb3IgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBjb25uZWN0aW9uLCBvZiB5b3VyIG1vc3QKICAgICAgICAgIHJlY2VudCBjb25uZWN0aW9uLCBvZiBpZiB0aGVyZSBoYXZlIGJlZW4gbm8gY29ubmVjdGlvbnMsIDAuCgogICBUaGUgY29ubmVjdGlvbiBjb250YWlucyBvbmUgbGluZSBwZXIgY29ubmVjdGlvbiwgb2YgdGhlIGZvcm06CgogIHl5eXltbWRkIGhoOm1tOnNzIHVzZXJuYW1lIHBpZCBwPXYgWyBwPXYgWyAuLi4gXSBdCgogICB3aGVyZSB0aGUgdGltZXN0YW1wIChpbiBjb2x1bW5zIDEtMTgpIHNob3dzIHdoZW4gdGhlIGNvbm5lY3Rpb24gd2FzCiAgIG1hZGU7IHVzZXJuYW1lIGlzIHRoZSBsb2dpbiBpZGVudGl0eSBvZiB0aGUgcGVyc29uIHdobyBtYWRlIHRoZQogICBjb25uZWN0aW9uOyBwaWQgaXMgS2VybWl0J3MgcHJvY2VzcyBJRCB3aGVuIGl0IG1hZGUgdGhlIGNvbm5lY3Rpb24uCiAgIFRoZSBwJ3MgYXJlIHBhcmFtZXRlcnMgdGhhdCBkZXBlbmQgb24gdGhlIHR5cGUgb2YgY29ubmVjdGlvbiwgYW5kIHRoZQogICB2J3MgYXJlIHRoZWlyIHZhbHVlczoKCiAgVCA9IENvbm5lY3Rpb24gVHlwZSAoVENQLCBTRVJJQUwsIERJQUwsIERFQ05FVCwgZXRjKS4KICBIID0gVGhlIG5hbWUgb2YgdGhlIEhvc3QgZnJvbSB3aGljaCB0aGUgY29ubmVjdGlvbiB3YXMgbWFkZS4KICBOID0gRGVzdGluYXRpb24gcGhvbmUgTnVtYmVyIG9yIE5ldHdvcmsgaG9zdCBuYW1lIG9yIGFkZHJlc3MuCiAgRCA9IFNlcmlhbCBjb25uZWN0aW9ucyBvbmx5OiBEZXZpY2UgbmFtZS4KICBPID0gRGlhbGVkIGNhbGxzIG9ubHk6IE9yaWdpbmF0aW5nIGNvdW50cnkgY29kZSAmIGFyZWEgY29kZSBpZiBrbm93bi4KICBFID0gRWxhcHNlZCB0aW1lIGluIGhoOm1tOnNzIGZvcm1hdCAob3IgaGhoOm1tOnNzLCBldGMpLgoKICAgSWYgeW91IGFsd2F5cyB3YW50IHRvIGtlZXAgYSBjb25uZWN0aW9uIGxvZywgc2ltcGx5IGFkZDoKCiAgbG9nIGNvbm5lY3Rpb25zCgogICB0byB5b3VyIEMtS2VybWl0IGN1c3RvbWl6YXRpb24gZmlsZS4gTm90ZSwgaG93ZXZlciwgdGhhdCBpZiB5b3UgbWFrZSBhCiAgIGxvdCBvZiBjb25uZWN0aW9ucywgeW91ciBDWC5MT0cgd2lsbCBncm93IGFuZCBncm93LiBZb3UgY2FuIGhhbmRsZQogICB0aGlzIGJ5IGFkZGluZyBhICJsb2dyb3RhdGUiIHByb2NlZHVyZSBsaWtlIHRoZSBmb2xsb3dpbmcgdG8geW91cgogICBjdXN0b21pemF0aW9uIGZpbGUsIGJlZm9yZSB0aGUgImxvZyBjb25uZWN0aW9ucyIgY29tbWFuZDoKCiAgZGVmaW5lIExPR1JPVEFURSB7ICAgICAgICAgICAgICAgICAgICA7IERlZmluZSBMT0dST1RBVEUgbWFjcm8KICAgICAgbG9jYWwgXCVpIFwlbSBcJWQgXCVuIFwlZiBNQVgKICAgICAgZGVmIE1BWCA0ICAgICAgICAgICAgICAgICAgICAgICAgIDsgSG93IG1hbnkgbW9udGhzIHRvIGtlZXAKICAgICAgaWYgbm90IGRlZiBcJTEgLSAgICAgICAgICAgICAgICAgIDsgTm8gYXJndW1lbnQgZ2l2ZW4KICAgICAgICBlbmQgMSBcJTA6IE5vIGZpbGVuYW1lIGdpdmVuCiAgICAgIGlmIG5vdCA9IDEgXGZmaWxlcyhcJTEpIC0gICAgICAgICA7IEV4YWN0bHkgMSBmaWxlIG11c3QgbWF0Y2gKICAgICAgICBlbmQgMSBcJTA6IFwlMSAtIEZpbGUgbm90IGZvdW5kCiAgICAgIC5cJWQgOj0gXGZzdWJzdHIoXGZkYXRlKFwlMSksMSw2KSA7IEFyZyBPSyAtIGdldCBmaWxlIHllYXIgJiBtb250aAogICAgICBpZiA9IFwlZCAtICAgICAgICAgICAgICAgICAgICAgICAgOyBDb21wYXJlIGZpbGUgeWVhciAmIG1vbnRoCiAgICAgICAgXGZzdWJzdHIoXHYobmRhdGUpLDEsNikgLSAgICAgICA7IHdpdGggY3VycmVudCB5ZWFyICYgbW9udGgKICAgICAgICAgIGVuZCAwICAgICAgICAgICAgICAgICAgICAgICAgIDsgU2FtZSB5ZWFyICYgbW9udGggLSBkb25lCiAgICAgIHJlbmFtZSBcJTEgXCUxLlwlZCAgICAgICAgICAgICAgICA7IERpZmZlcmVudCAtIHJlbmFtZSBmaWxlCiAgICAgIC5cJW4gOj0gXGZmaWxlcyhcJTEuKikgICAgICAgICAgICA7IEhvdyBtYW55IG9sZCBmaWxlcwogICAgICBpZiA8IFwlbiBcbShNQVgpIGVuZCAwICAgICAgICAgICAgOyBOb3QgZW5vdWdoIHRvIHJvdGF0ZQogICAgICAuXCVtIDo9IFwlMS45OTk5OTkgICAgICAgICAgICAgICAgOyBJbml0aWFsIGNvbXBhcmUgc3RyaW5nCiAgICAgIGZvciBcJWkgMSBcJW4gMSB7ICAgICAgICAgICAgICAgICA7IExvb3AgdGhydSBvbGQgbG9ncwogICAgICAgICAuXCVmIDo9IFxmbmV4dGZpbGUoKSAgICAgICAgICAgOyBHZXQgbmV4dCBmaWxlIG5hbWUKICAgICAgICAgaWYgbGx0IFwlZiBcJW0gLlwlbSA6PSBcJWYgICAgIDsgSWYgdGhpcyBvbmUgb2xkZXIgcmVtZW1iZXIgaXQKICAgICAgfQogICAgICBkZWxldGUgXCVtICAgICAgICAgICAgICAgICAgICAgICAgOyBEZWxldGUgdGhlIG9sZGVzdCBvbmUKICB9CiAgbG9nIGNvbm5lY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICA7IE5vdyBvcGVuIHRoZSAocG9zc2libHkgbmV3KSBsb2cKICBsb2dyb3RhdGUgXHYoaG9tZSlDWC5MT0cgICAgICAgICAgICAgIDsgUnVuIHRoZSBMT0dST1RBVEUgbWFjcm8KCiAgIEFzIHlvdSBjYW4gc2VlLCB0aGlzIGNvbXBhcmVzIHRoZSB5eXl5bW0gcG9ydGlvbiBvZiB0aGUgbW9kaWZpY2F0aW9uCiAgIGRhdGUgKFxmZGF0ZSgpKSBvZiB0aGUgZ2l2ZW4gZmlsZSAoXCUxKSB3aXRoIHRoZSBjdXJyZW50IHl5eXltbS4gSWYKICAgdGhleSBkaWZmZXIsIHRoZSBjdXJyZW50IGZpbGUgaGFzIHRoZSB5eXl5bW0gc3VmZml4IChmcm9tIGl0cyBtb3N0CiAgIHJlY2VudCBtb2RpZmljYXRpb24gZGF0ZSkgYXBwZW5kZWQgdG8gaXRzIG5hbWUuIFRoZW4gd2Ugc2VhcmNoIHRocm91Z2gKICAgYWxsIG90aGVyIHN1Y2ggZmlsZXMsIGZpbmQgdGhlIG9sZGVzdCBvbmUsIGFuZCBkZWxldGUgaXQuIFRodXMgdGhlCiAgIGN1cnJlbnQgbG9nLCBwbHVzIHRoZSBsb2dzIGZyb20gdGhlIG1vc3QgcmVjZW50IGZvdXIgbW9udGhzLCBhcmUga2VwdC4KICAgVGhpcyBpcyBhbGwgZG9uZSBhdXRvbWF0aWNhbGx5IGV2ZXJ5IHRpbWUgeW91IHN0YXJ0IEMtS2VybWl0LgoKICAgT24gbXVsdGl1c2VyIHN5c3RlbXMsIGl0IGlzIHBvc3NpYmxlIHRvIGtlZXAgYSBzaW5nbGUsIHNoYXJlZCwKICAgc3lzdGVtLXdpZGUgY29ubmVjdGlvbiBsb2csIGJ1dCB0aGlzIGlzIG5vdCByZWNvbW1lbmRlZCBzaW5jZSAoYSkgaXQKICAgcmVxdWlyZXMgeW91IGtlZXAgYSBwdWJsaWNseSB3cml0ZS1hY2Nlc3NpYmxlIGxvZ2ZpbGUgKGEgZ2xhcmluZwogICB0YXJnZXQgZm9yIG1pc2NoaWVmKSwgYW5kIChiKSBpdCB3b3VsZCByZXF1aXJlIGVhY2ggdXNlciB0byBsb2cgdG8KICAgdGhhdCBmaWxlIGFuZCBub3QgZGlzYWJsZSBsb2dnaW5nLiBBIGJldHRlciBtZXRob2QgZm9yIGxvZ2dpbmcKICAgY29ubmVjdGlvbnMsIGluIFVOSVggYXQgbGVhc3QsIGlzIHN5c2xvZ2dpbmcgKHNlZSBbNDIxXWNrdWlucy50eHQKICAgU2VjdGlvbiAxNSBhbmQgWzQyMl1TZWN0aW9uIDQuMiBvZiB0aGUgWzQyM11JS1NEIEFkbWluaXN0cmF0aW9uIEd1aWRlCiAgIGZvciBkZXRhaWxzKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjEzLiBBdXRvbWF0aWMgQ29ubmVjdGlvbi1TcGVjaWZpYyBGbG93IENvbnRyb2wgU2VsZWN0aW9uCgogICBCZWdpbm5pbmcgaW4gQy1LZXJtaXQgNy4wLCB0aGUgYXBwcm9wcmlhdGUgZmxvdy1jb250cm9sIG1ldGhvZCBmb3IKICAgZWFjaCBjb25uZWN0aW9uIHR5cGUgaXMga2VwdCBpbiBhIHRhYmxlLCBmb3IgZXhhbXBsZToKCiAgUmVtb3RlOiAgICAgICAgICAgTk9ORQogIE1vZGVtOiAgICAgICAgICAgIFJUUy9DVFMKICBEaXJlY3QtU2VyaWFsOiAgICBOT05FCiAgVENQSVA6ICAgICAgICAgICAgTk9ORQoKICAgVGhlIHNpemUgb2YgdGhlIHRhYmxlIGFuZCB2YWx1ZXMgZm9yIGVhY2ggY29ubmVjdGlvbiB0eXBlIGNhbiB2YXJ5CiAgIGZyb20gcGxhdGZvcm0gdG8gcGxhdGZvcm0uIFR5cGUgInNldCBmbG93ID8iIGZvciBhIGxpc3Qgb2YgYXZhaWxhYmxlCiAgIGZsb3ctY29udHJvbCB0eXBlcy4KCiAgIFRoZSB0YWJsZSBpcyB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBraW5kIG9mIGZsb3cKICAgY29udHJvbCB3aGVuZXZlciB5b3UgbWFrZSBhIGNvbm5lY3Rpb24uIFlvdSBjYW4gZGlzcGxheSB0aGUgdGFibGUKICAgd2l0aDoKCiAgU0hPVyBGTE9XLUNPTlRST0wKCiAgIFRoZSBkZWZhdWx0cyBhcmUgYXMgZm9sbG93czoKCiAgIFJlbW90ZToKICAgICAgICAgIE5PTkUgb3IgWE9OL1hPRkYuIFRoaXMgaXMgYmVjYXVzZSBDLUtlcm1pdCBpcyBub3QgYWxsb3dlZCB0bwogICAgICAgICAgZmluZCBvdXQgd2hhdCB0eXBlIG9mIGNvbm5lY3Rpb24gdGhlIGluY29taW5nIHVzZXIgaGFzICgqKS4gTm8KICAgICAgICAgIGtpbmQgb2YgZmxvdyBjb250cm9sIHdpbGwgd29yayBvbiBldmVyeSBraW5kIG9mIGNvbm5lY3Rpb24sCiAgICAgICAgICBpbmNsdWRpbmcgKHVuZXhwZWN0ZWRseSkgS0VFUCwgd2hpY2ggd2Ugd291bGQgaGF2ZSBsaWtlZCB0bwogICAgICAgICAgdXNlLCBidXQgbm90IHR1cm5pbmcgb2ZmIGZsb3cgY29udHJvbCBhdCB0aGUgcmVtb3RlIGVuZCBkdXJpbmcKICAgICAgICAgIGZpbGUgdHJhbnNmZXIgb24gVENQL0lQIGNvbm5lY3Rpb25zIGlzIGZhdGFsIHRvIHRoZSB0cmFuc2ZlcgogICAgICAgICAgKGV4Y2VwdCBpbiBWTVMgYW5kIEhQLVVYLCB3aGVyZSBpdCBtdXN0IGJlIHNldCB0byBYb24vWG9mZiEpCiAgICAgICAgICBUaGVyZWZvcmUgaWYgeW91IGFyZSBkaWFsaW5nIGluIHRvIGEgc2VyaWFsIHBvcnQgb24gYSBzZXJ2ZXIKICAgICAgICAgIChVTklYIG9yIFZNUykgd2hlcmUgQy1LZXJtaXQgaXMgcnVubmluZywgeW91IHdpbGwgbmVlZCB0byB0ZWxsCiAgICAgICAgICBDLUtlcm1pdCB0byAic2V0IGZsb3cga2VlcCIgYmVmb3JlIHRyYW5zZmVycmluZyBmaWxlcyAoYXNzdW1pbmcKICAgICAgICAgIHRoZSBtb2RlbSBhbmQgcG9ydCBhcmUgY29uZmlndXJlZCBjb3JyZWN0bHkgYnkgdGhlIHN5c3RlbQogICAgICAgICAgYWRtaW5pc3RyYXRvcjsgb3RoZXJ3aXNlIHlvdSdsbCBuZWVkIHRvIGdpdmUgYSBzcGVjaWZpYyBraW5kIG9mCiAgICAgICAgICBmbG93IGNvbnRyb2wsIGUuZy4gInNldCBmbG93IHhvbi94b2ZmIiksIHNvIGluIHRoaXMgY2FzZQogICAgICAgICAgQy1LZXJtaXQgd2lsbCBub3QgZGlzYWJsZSBmbG93IGNvbnRyb2wsIGFzIGl0IG11c3QgZG8gd2hlbiB5b3UKICAgICAgICAgIGFyZSBjb21pbmcgdmlhIFRlbG5ldCAoZGlyZWN0bHkgb3IgdGhyb3VnaCBhIHRlcm1pbmFsIHNlcnZlciwKICAgICAgICAgIGV4Y2VwdCBvbiBWTVMgYW5kIEhQLVVYKS4KCiAgIE1vZGVtOgogICAgICAgICAgVGhpcyBhcHBsaWVzIHdoZW4geW91IGRpYWwgb3V0IHdpdGggYSBtb2RlbS4gSW4gdGhpcyBjYXNlLCB0aGUKICAgICAgICAgIE1PREVNIEZMT1ctQ09OVFJPTCBzZXR0aW5nIHRha2VzIGFmZmVjdCBhZnRlciB0aGUgU0VUIEZMT1cKICAgICAgICAgIHNldHRpbmcsIHNvIGl0IGNhbiBwaWNrIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGZsb3cgY29udHJvbCBmb3IKICAgICAgICAgIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgcGFydGljdWxhciBtb2RlbSBhbmQgdGhlCiAgICAgICAgICBjb21wdXRlci9wb3J0L2RyaXZlciB0aGF0IGlzIGRpYWxpbmcuCgogICBEaXJlY3QtU2VyaWFsOgogICAgICAgICAgVGhlIGRlZmF1bHQgaGVyZSBpcyBOT05FIGJlY2F1c2UgQy1LZXJtaXQgaGFzIG5vIHdheSBvZiBrbm93aW5nCiAgICAgICAgICB3aGF0IGtpbmQgb2YgZmxvdyBjb250cm9sLCBpZiBhbnksIGlzIG9yIGNhbiBiZSBkb25lIGJ5IHRoZQogICAgICAgICAgZGV2aWNlIGF0IHRoZSBvdGhlciBlbmQgb2YgdGhlIGNvbm5lY3Rpb24uIFJUUy9DVFMgd291bGQgYmUgYQogICAgICAgICAgYmFkIGNob2ljZSBoZXJlLCBiZWNhdXNlIGlmIHRoZSBDVFMgc2lnbmFsIGlzIG5vdCBhc3NlcnRlZCwgdGhlCiAgICAgICAgICBjb25uZWN0aW9uIHdpbGwgaGFuZy4gQW5kIHNpbmNlIGRpcmVjdCBjb25uZWN0aW9ucyBhcmUgb2Z0ZW4KICAgICAgICAgIG1hZGUgd2l0aCAzLXdpcmUgY2FibGVzLCB0aGVyZSBpcyBhIGdvb2QgY2hhbmNlIHRoZSBDVFMgc2lnbmFsCiAgICAgICAgICB3aWxsIG5vdCBiZSByZWNlaXZlZC4KCiAgIFRDUElQOgogICAgICAgICAgTk9ORSwgc2luY2UgVENQIGFuZCBJUCBwcm92aWRlIHRoZWlyIG93biBmbG93IGNvbnRyb2wKICAgICAgICAgIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9uLCBleGNlcHQgaW4gVk1TLCB3aGVyZSBYb24vWG9mZgogICAgICAgICAgaXMgdGhlIGRlZmF1bHQgZHVlIHRvIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIFZNUyBUQ1AvSVAKICAgICAgICAgIHByb2R1Y3RzLgoKICAgT3RoZXIgbmV0d29ya3M6CiAgICAgICAgICBOT05FLCBzaW5jZSBuZXR3b3JrcyBzaG91bGQgcHJvdmlkZSB0aGVpciBmbG93IGNvbnRyb2wKICAgICAgICAgIHRyYW5zcGFyZW50bHkgdG8gdGhlIGFwcGxpY2F0aW9uLgoKICAgKCopIFRoaXMgaXMgcG9zc2libHkgdGhlIHdvcnN0IGZlYXR1cmUgb2YgVU5JWCwgVk1TLCBhbmQgb3RoZXIKICAgcGxhdGZvcm1zIHdoZXJlIEMtS2VybWl0IHJ1bnMuIElmIEMtS2VybWl0IHdhcyBhYmxlIHRvIGFzayB0aGUKICAgb3BlcmF0aW5nIHN5c3RlbSB3aGF0IGtpbmQgb2YgY29ubmVjdGlvbiBpdCBoYWQgdG8gdGhlIHVzZXIsIGl0IGNvdWxkCiAgIHNldCB1cCBtYW55IHRoaW5ncyBmb3IgeW91IGF1dG9tYXRpY2FsbHkuCgogICBZb3UgY2FuIG1vZGlmeSB0aGUgZGVmYXVsdC1mbG93LWNvbnRyb2wgdGFibGUgd2l0aDoKCiAgU0VUIEZMT1ctQ09OVFJPTCAveHh4IHsgTk9ORSwgS0VFUCwgUlRTL0NUUywgWE9OL1hPRkYsIC4uLiB9CgogICB3aGVyZSAieHh4IiBpcyB0aGUgY29ubmVjdGlvbiB0eXBlLCBlLmcuCgogIFNFVCBGTE9XIC9SRU1PVEUgTk9ORQogIFNFVCBGTE9XIC9ESVJFQ1QgUlRTL0NUUwoKICAgSWYgeW91IGxlYXZlIG91dCB0aGUgc3dpdGNoLCBTRVQgRkxPVyB3b3JrcyBhcyBiZWZvcmUsIGNob29zaW5nIHRoZQogICBmbG93IGNvbnRyb2wgbWV0aG9kIHRvIGJlIHVzZWQgb24gdGhlIGN1cnJlbnQgY29ubmVjdGlvbjoKCiAgU0VUIEZMT1cgWE9OL1hPRkYKCiAgIFRodXMsIHdoZW5ldmVyIHlvdSBtYWtlIGEgY29ubmVjdGlvbiB3aXRoIFNFVCBQT1JULCBTRVQgTElORSwgRElBTCwKICAgU0VUIEhPU1QsIFRFTE5FVCwgUkxPR0lOLCBldGMsIGFuIGFwcHJvcHJpYXRlIGZvcm0gb2YgZmxvdyBjb250cm9sIGlzCiAgIHNlbGVjdGVkIGF1dG9tYXRpY2FsbHkuIFlvdSBjYW4gb3ZlcnJpZGUgdGhlIGF1dG9tYXRpYyBzZWxlY3Rpb24gd2l0aAogICBhIHN1YnNlcXVlbnQgU0VUIEZMT1cgY29tbWFuZCwgc3VjaCBhcyBTRVQgRkxPVyBOT05FIChubyBzd2l0Y2gKICAgaW5jbHVkZWQpLgoKICAgVGhlIGZsb3cgY29udHJvbCBpcyBjaGFuZ2VkIGF1dG9tYXRpY2FsbHkgdG9vIHdoZW4geW91IGdpdmUgYSBTRVQKICAgTU9ERU0gVFlQRSBjb21tYW5kLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gKHNheQogICBMaW51eCkgc3VwcG9ydHMgaGFyZHdhcmUgZmxvdyBjb250cm9sIChSVFMvQ1RTKS4gTm93IHN1cHBvc2UgeW91IGdpdmUKICAgdGhlIGZvbGxvd2luZyBjb21tYW5kczoKCiAgc2V0IGxpbmUgL2Rldi90dHlTMiAgICA7IEF1dG9tYXRpY2FsbHkgc2V0cyBmbG93IHRvIE5PTkUKICBzZXQgbW9kZW0gdHlwZSB1c3IgICAgIDsgQXV0b21hdGljYWxseSBzZXRzIGZsb3cgdG8gUlRTL0NUUwogIHNldCBtb2RlbSB0eXBlIHJvbG0gICAgOyBEb2Vzbid0IHN1cHBvcnQgUlRTL0NUUyBzbyBub3cgZmxvdyBpcyBYT04vWE9GRgoKICAgSU1QT1JUQU5UOiBUaGlzIG5ldyBmZWF0dXJlIHRlbmRzIHRvIG1ha2UgdGhlIG9yZGVyIG9mIFNFVCBMSU5FL0hPU1QKICAgYW5kIFNFVCBGTE9XIGNvbW1hbmRzIG1hdHRlciwgd2hlcmUgaXQgZGlkbid0IGJlZm9yZS4gRm9yIGV4YW1wbGUsIGluCiAgIFZNUzoKCiAgU0VUIEZMT1cgS0VFUAogIFNFVCBMSU5FIFRUQTA6CgogICB0aGUgU0VUIExJTkUgdW5kb2VzIHRoZSBTRVQgRkxPVyBLRUVQIGNvbW1hbmQ7IHRoZSBzZXF1ZW5jZSBub3cgbXVzdAogICBiZToKCiAgU0VUIEZMT1cgL0RJUkVDVCBLRUVQCiAgU0VUIExJTkUgVFRBMDoKCiAgIG9yOgoKICBTRVQgTElORSBUVEEwOgogIFNFVCBGTE9XIEtFRVAKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjE0LiBUcmFwcGluZyBDb25uZWN0aW9uIEVzdGFibGlzaG1lbnQgYW5kIExvc3MKCiAgIElmIHlvdSBkZWZpbmUgYSBtYWNybyBjYWxsZWQgT05fT1BFTiwgaXQgaXMgZXhlY3V0ZWQgYW55IHRpbWUgdGhhdCBhCiAgIFNFVCBMSU5FLCBTRVQgUE9SVCwgU0VUIEhPU1QsIFRFTE5FVCwgUkxPR0lOIG9yIHNpbWlsYXIgY29tbWFuZAogICBzdWNjZWVkcyBpbiBvcGVuaW5nIGEgY29ubmVjdGlvbi4gVGhlIGFyZ3VtZW50IGlzIHRoZSBob3N0IG9yIGRldmljZQogICBuYW1lIChhcyBzaG93biBieSBTSE9XIENPTU1VTklDQVRJT05TLCBhbmQgdGhlIHNhbWUgYXMgXHYobGluZSkpLiBUaGlzCiAgIG1hY3JvIGNhbiBiZSB1c2VkIGZvciBhbGwgc29ydHMgb2YgdGhpbmdzLCBsaWtlIGF1dG9tYXRpY2FsbHkgc2V0dGluZwogICBjb25uZWN0aW9uLSBvciBob3N0LXNwZWNpZmljIHBhcmFtZXRlcnMgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBvcGVuZWQuCiAgIEV4YW1wbGU6CgogIGRlZiBPTl9PUEVOIHsKICAgICAgc3dpdGNoIFwlMSB7CiAgICAgICAgOmFiY2NvcnAuY29tLCBzZXQgcmVsaWFibGUgb2ZmLCBicmVhawogICAgICAgIDp4eXpjb3JwLmNvbSwgc2V0IHJlY2VpdmUgcGFja2V0LWxlbmd0aCAxMDAwLCBicmVhawogICAgICAgIGV0YyBldGMuLi4KICAgICAgfQogIH0KCiAgIElmIHlvdSBkZWZpbmUgYSBtYWNybyBjYWxsZWQgT05fQ0xPU0UsIGl0IHdpbGwgYmUgZXhlY3V0ZWQgYW55IHRpbWUKICAgdGhhdCBhIFNFVCBMSU5FLCBTRVQgUE9SVCwgU0VUIEhPU1QsIFRFTE5FVCwgUkxPR0lOIG9yIGFueSBvdGhlciBraW5kCiAgIG9mIGNvbm5lY3Rpb24gdGhhdCBDLUtlcm1pdCBoYXMgbWFkZSBpcyBjbG9zZWQsIGVpdGhlciBieSB0aGUgcmVtb3RlCiAgIG9yIGJ5IGEgbG9jYWwgQ0xPU0UsIEhBTkdVUCwgb3IgRVhJVCBjb21tYW5kIG9yIG90aGVyIGxvY2FsIGFjdGlvbiwKICAgc3VjaCBhcyB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gaXMgb3BlbmVkIGJlZm9yZSBhbiBvbGQgb25lIHdhcwogICBleHBsaWNpdGx5IGNsb3NlZC4KCiAgIEFzIHNvb24gYXMgQy1LZXJtaXQgbm90aWNlcyB0aGUgY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQsIHRoZQogICBPTl9DTE9TRSBtYWNybyBpcyBpbnZva2VkIGF0IChhKSB0aGUgdG9wIG9mIHRoZSBjb21tYW5kIHBhcnNpbmcgbG9vcCwKICAgb3IgKGIpIHdoZW4gYSBjb25uZWN0aW9uIGlzIGNsb3NlZCBpbXBsaWNpdGx5IGJ5IGEgY29tbWFuZCBzdWNoIGFzIFNFVAogICBMSU5FIHRoYXQgY2xvc2VzIGFueSBvcGVuIGNvbm5lY3Rpb24gcHJpb3IgdG8gbWFraW5nIGEgbmV3IGNvbm5lY3Rpb24sCiAgIG9yIChjKSB3aGVuIEMtS2VybWl0IGNsb3NlcyBhbiBvcGVuIGNvbm5lY3Rpb24gaW4gdGhlIGFjdCBvZiBleGl0aW5nLgoKICAgVGhlIE9OX0NMT1NFIG1hY3JvIHdhcyBpbnNwaXJlZCBieSB0aGUgbmV2ZXJlbmRpbmcgcXVlc3QgdG8gdW5pdGUKICAgS2VybWl0IGFuZCBTU0guIEluIHRoaXMgY2FzZSB1c2luZyB0aGUgInR1bm5lbCIgbWVjaGFuaXNtOgoKICBkZWYgVFVOTkVMIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgXCUxID0gaG9zdCB0byB0dW5uZWwgdG8KICAgICAgbG9jYWwgXCVwCiAgICAgIGlmIG5vdCBkZWYgXCUxIHN0b3AgMQogICAgICBhc3NpZ24gdHVubmVsaG9zdCBcJTEgICAgICAgICAgICAgICAgICAgOyBNYWtlIGdsb2JhbCBjb3B5CiAgICAgIHVuZGVmIG9uX2Nsb3NlCiAgICAgIHNldCBtYWNybyBlcnJvciBvZmYKICAgICAgY2xvc2UgY29ubmVjdGlvbiAgICAgICAgICAgICAgICAgICAgICAgIDsgSWdub3JlIGFueSBlcnJvcgogICAgICBvcGVuICFyZWFkIHR1bm5lbCBzdGFydCBcJTEKICAgICAgcmVhZCBcJXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgR2V0IHBvcnQgbnVtYmVyCiAgICAgIGlmIGZhaWwgc3RvcCAxIFR1bm5lbCBmYWlsdXJlOiBcJTEKICAgICAgY2xvc2UgcmVhZAogICAgICBpZiBmYWlsIHN0b3AgMSBUdW5uZWwgZmFpbHVyZTogXCUxICAgICAgOyBTZWUgWzQyNF1TZWN0aW9uIDQuMi44LjEKICAgICAgYXNzaWduIG9uX2Nsb3NlIHsgICAgICAgICAgICAgICAgICAgICAgIDsgU2V0IHVwIGNsb3NlIGhhbmRsZXIKICAgICAgICAgIGVjaG8gQ2xvc2luZyB0dW5uZWw6IFxtKHR1bm5lbGhvc3QpCiAgICAgICAgICAhdHVubmVsIHN0b3AgXG0odHVubmVsaG9zdCkKICAgICAgICAgIHVuZGVmIG9uX2Nsb3NlCiAgICAgIH0KICAgICAgc2V0IGhvc3QgbG9jYWxob3N0OlwlcCAvdGVsbmV0CiAgICAgIGlmIHN1Y2Nlc3MgZW5kIDAKICAgICAgdW5kZWYgb25fY2xvc2UKICAgICAgc3RvcCAxIENvbm5lY3Rpb24gZmFpbHVyZTogXCUxCiAgfQoKICAgSW4gdGhpcyBjYXNlLCB3aGVuIHRoZSBjb25uZWN0aW9uIHN0b3BzLCB3ZSBhbHNvIG5lZWQgdG8gc2h1dCBkb3duIHRoZQogICB0dW5uZWwsIGV2ZW4gaWYgaXQgaXMgYXQgYSBsYXRlciB0aW1lIGFmdGVyIFRVTk5FTCBoYXMgZmluaXNoZWQKICAgZXhlY3V0aW5nLiBUaGlzIHdheSB3ZSBjYW4gZXNjYXBlIGJhY2ssIHJlY29ubmVjdCwgdHJhbnNmZXIgZmlsZXMsIGFuZAogICBzbyBvbiB1bnRpbCB0aGUgY29ubmVjdGlvbiBpcyBicm9rZW4gYnkgbG9nZ2luZyBvdXQgZnJvbSB0aGUgcmVtb3RlLAogICBvciBieSBleHBsaWNpdGx5IGNsb3NpbmcgaXQsIG9yIGJ5IEVYSVRpbmcgZnJvbSBDLUtlcm1pdCwgYXQgd2hpY2gKICAgdGltZSB0aGUgdHVubmVsIGlzIHNodXQgZG93bi4KCiAgIFdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCBubyBtYXR0ZXIgaG93LCB0aGUgT05fQ0xPU0UgbWFjcm8KICAgZXhlY3V0ZXMgYW5kIHRoZW4gdW5kZWZpbmVzIChkZXN0cm95cykgaXRzZWxmLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvCiAgIGJlIGNsb3NpbmcgdHVubmVscyBpbiB0aGUgZnV0dXJlIHdoZW4gd2UgY2xvc2Ugc3Vic2VxdWVudCBjb25uZWN0aW9ucy4KCiAgIE90aGVyIHN1Y2ggdHJpY2tzIGNhbiBiZSBpbWFnaW5lZCwgaW5jbHVkaW5nIGVuZGluZyBPTl9DTE9TRSB3aXRoIGEKICAgU1RPUCBjb21tYW5kIHRvIGZvcmNlIHRoZSBjb21tYW5kIHN0YWNrIHRvIGJlIHBlZWxlZCBhbGwgdGhlIHdheSBiYWNrCiAgIHRvIHRoZSB0b3AsIGZvciBleGFtcGxlIGluIGEgZGVlcGx5IG5lc3RlZCBzY3JpcHQgdGhhdCBkZXBlbmRzIG9uIHRoZQogICBjb25uZWN0aW9uIGJlaW5nIG9wZW46CgogIGRlZiBvbl9jbG9zZSB7IHN0b3AgMSBDT05ORUNUSU9OIExPU1QgfQoKICAgV2hlbiBDLUtlcm1pdCBpbnZva2VzIHRoZSBPTl9DTE9TRSBtYWNybywgaXQgc3VwcGxpZXMgb25lIGFyZ3VtZW50CiAgIChcJTEpOiB0aGUgcmVhc29uIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQgYXMgYSBudW1iZXIsIG9uZSBvZiB0aGUKICAgZm9sbG93aW5nOgoKICAyIC0gRmF0YWwgZmFpbHVyZSB0byBuZWdvdGlhdGUgYSByZXF1aXJlZCBpdGVtIG9uIGEgbmV0d29yayBjb25uZWN0aW9uLgogIDEgLSBDbG9zZWQgYnkgQy1LZXJtaXQgY29tbWFuZC4KICAwIC0gQWxsIG90aGVycyAobm9ybWFsbHkgY2xvc2VkIGJ5IHJlbW90ZSkuCgogICB3aGljaCBtYXkgYmUgdXNlZCBmb3IgYW55IHB1cnBvc2U7IGZvciBleGFtcGxlLCB0byBhZGQgYSBjb21tZW50IHRvCiAgIHRoZSBjb25uZWN0aW9uIGxvZzoKCiAgZGVmIG9uX2Nsb3NlIHsKICAgICAgbG9jYWwgXCVtCiAgICAgIGlmIG5vdCBvcGVuIGN4IGVuZCAwCiAgICAgIHN3aXRjaCBcJTEgewogICAgICAgIDowLCAuXCVtID0gQ2xvc2VkIGJ5IHJlbW90ZSwgYnJlYWsKICAgICAgICA6MSwgLlwlbSA9IENsb3NlZCBieSBtZSwgYnJlYWsKICAgICAgICA6MiwgLlwlbSA9IE5ldHdvcmsgcHJvdG9jb2wgbmVnb3RpYXRpb24gZmFpbHVyZSwgYnJlYWsKICAgICAgfQogICAgICBpZiBkZWYgXCVtIHdyaXRlbG4gY3ggeyMgXCVtfQogIH0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAyLjE1LiBDb250YWN0aW5nIFdlYiBTZXJ2ZXJzIHdpdGggdGhlIEhUVFAgQ29tbWFuZAoKICAgQy1LZXJtaXQgNy4wIChhdCB0aGlzIHdyaXRpbmcsIHRoZSBVTklYIHZlcnNpb24gb25seSkgc3VwcG9ydHMgZGlyZWN0CiAgIGNvbnRhY3QgYW5kIGludGVyYWN0aW9uIHdpdGggV2ViIHNlcnZlcnMgdmlhIEhUVFAgMS4wIHByb3RvY29sLiBUbwogICBtYWtlIGEgY29ubmVjdGlvbiwgdXNlIEtlcm1pdCdzIG5vcm1hbCBtZXRob2QgZm9yIG1ha2luZyBhIFRDUC9JUAogICBjb25uZWN0aW9uLCBidXQgc3BlY2lmeSB0aGUgSFRUUCBwb3J0OgoKICBTRVQgSE9TVCBob3N0IGh0dHAgWyBzd2l0Y2hlcyBdCgogICB3aGVyZSBob3N0IGlzIHRoZSBJUCBob3N0bmFtZSBvciBhZGRyZXNzLCBhbmQgaHR0cCBpcyB0aGUgbmFtZSBvZiB0aGUKICAgVENQIHBvcnQgZm9yIHRoZSBXZWIgc2VydmVyLiBSZWxldmFudCBzd2l0Y2hlcyBpbmNsdWRlOgoKICAgL1JBVwogICAgICAgICAgVHJlYXQgdGhlIGNvbm5lY3Rpb24gYXMgYSB0cmFuc3BhcmVudCBiaW5hcnkgcGlwZS4gVGhpcyBzd2l0Y2gKICAgICAgICAgIG1heSBiZSByZXF1aXJlZCBpZiBhIHBvcnQgb3RoZXIgdGhhbiAnaHR0cCcgaXMgdXNlZC4KCiAgIC9TU0wKICAgICAgICAgIE1ha2UgYW4gc2VjdXJlIHByaXZhdGUgY29ubmVjdGlvbiB3aXRoIFNTTCAob25seSBpZiBTU0wgc3VwcG9ydAogICAgICAgICAgaXMgaW5jbHVkZWQgaW4geW91ciB2ZXJzaW9uIG9mIEtlcm1pdCkuIEluIHRoaXMgY2FzZSB0aGUgcG9ydAogICAgICAgICAgbmFtZSBtaWdodCBuZWVkIHRvIGJlIGh0dHBzIHJhdGhlciB0aGFuIGh0dHAsIGUuZy4gInNldCBob3N0CiAgICAgICAgICBzZWN1cmVzZXJ2ZXIueHl4Y29ycC5jb20gaHR0cHMgL3NzbCIuCgogICAvVExTCiAgICAgICAgICBNYWtlIGFuIHNlY3VyZSBwcml2YXRlIGNvbm5lY3Rpb24gd2l0aCBUTFMgKG9ubHkgaWYgVExTIHN1cHBvcnQKICAgICAgICAgIGlzIGluY2x1ZGVkIGluIHlvdXIgdmVyc2lvbiBvZiBLZXJtaXQpLiBJbiB0aGlzIGNhc2UgdGhlIHBvcnQKICAgICAgICAgIG5hbWUgd291bGQgYmUgaHR0cHMgcmF0aGVyIHRoYW4gaHR0cC4KCiAgIFRoZW4geW91IGNhbiBpc3N1ZSBhbiBIVFRQIGNvbW1hbmQuIEluIG1vc3QgY2FzZXMsIHRoZSBzZXJ2ZXIgY2xvc2VzCiAgIHRoZSBjb25uZWN0aW9uIHdoZW4gdGhlIGNvbW1hbmQgaXMgY29tcGxldGUuIEV4YW1wbGU6CgogIFNFVCBIT1NUIHd3dy5jb2x1bWJpYS5lZHUgaHR0cAogIElGIEZBSUwgRVhJVCAxIENhbid0IGNvbnRhY3Qgc2VydmVyCiAgSFRUUCBHRVQga2VybWl0L2luZGV4Lmh0bWwKCiAgIEF0IHRoaXMgcG9pbnQgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCBzaW5jZSB0aGF0J3MgaG93IEhUVFAgMS4wCiAgIHdvcmtzLiBJZiB5b3Ugd2FudCB0byBwZXJmb3JtIGFkZGl0aW9uYWwgb3BlcmF0aW9ucywgeW91IG11c3QKICAgZXN0YWJsaXNoIGEgbmV3IGNvbm5lY3Rpb24gd2l0aCBhbm90aGVyIFNFVCBIT1NUIGNvbW1hbmQuCgogICBUaGUgSFRUUCBjb21tYW5kIGFjdHMgYXMgYSBjbGllbnQgdG8gdGhlIFdlYiBzZXJ2ZXIsIGV4Y2VwdCBpbnN0ZWFkIG9mCiAgIGRpc3BsYXlpbmcgdGhlIHJlc3VsdHMgbGlrZSBhIFdlYiBicm93c2VyIHdvdWxkLCBpdCBzdG9yZXMgdGhlbS4gQW55CiAgIEhUVFAgY29tbWFuZCBjYW4gKGJ1dCBuZWVkIG5vdCkgaW5jbHVkZSBhbnkgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcKICAgc3dpdGNoZXM6CgogICAvQUdFTlQ6dXNlci1hZ2VudAogICAgICAgICAgSWRlbnRpZmllcyB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXI7ICJDLUtlcm1pdCIgb3IgIktlcm1pdC05NSIKICAgICAgICAgIGJ5IGRlZmF1bHQuCgogICAvSEVBREVSOmhlYWRlci1saW5lCiAgICAgICAgICBVc2VkIGZvciBzcGVjaWZ5aW5nIGFueSBvcHRpb25hbCBoZWFkZXJzLiBBIGxpc3Qgb2YgaGVhZGVycyBpcwogICAgICAgICAgcHJvdmlkZWQgdXNpbmcgYnJhY2VzIGZvciBncm91cGluZzoKCiAgL0hFQURFUjp7e3RhZzp2YWx1ZX17dGFnOnZhbHVlfS4uLn0KCiAgICAgICAgICBGb3IgYSBsaXN0aW5nIG9mIHZhbGlkIHRhZyB2YWx1ZSBhbmQgdmFsdWUgZm9ybWF0cyBzZWUgWzQyNV1SRkMKICAgICAgICAgIDE5NDU6IEh5cGVydGV4dCBUcmFuc2ZlciBQcm90b2NvbCAtLSBIVFRQLzEuMC4gQSBtYXhpbXVtIG9mCiAgICAgICAgICBlaWdodCBoZWFkZXJzIG1heSBiZSBzcGVjaWZpZWQuCgogICAvVVNFUjpuYW1lCiAgICAgICAgICBJbiBjYXNlIGEgcGFnZSByZXF1aXJlcyBhIHVzZXJuYW1lIGZvciBhY2Nlc3MuCgogICAvUEFTU1dPUkQ6cGFzc3dvcmQKICAgICAgICAgIEluIGNhc2UgYSBwYWdlIHJlcXVpcmVzIGEgcGFzc3dvcmQgZm9yIGFjY2Vzcy4KCiAgIC9BUlJBWTphcnJheW5hbWUKICAgICAgICAgIFRlbGxzIEtlcm1pdCB0byBzdG9yZSB0aGUgcmVzcG9uc2UgaGVhZGVycyBpbiB0aGUgZ2l2ZW4gYXJyYXksCiAgICAgICAgICBvbmUgbGluZSBwZXIgZWxlbWVudC4gVGhlIGFycmF5IG5lZWQgbm90IGJlIGRlY2xhcmVkIGluCiAgICAgICAgICBhZHZhbmNlLiBFeGFtcGxlOgoKICBDLUtlcm1pdD8gaHR0cCAvYXJyYXk6YyBnZXQga2VybWl0L2luZGV4Lmh0bWwKICBDLUtlcm1pdD8gc2hvdyBhcnJheSBjCiAgRGltZW5zaW9uID0gOQogIDEuIERhdGU6IEZyaSwgMjYgTm92IDE5OTkgMjM6MTI6MjIgR01UCiAgMi4gU2VydmVyOiBBcGFjaGUvMS4zLjQgKFVuaXgpCiAgMy4gTGFzdC1Nb2RpZmllZDogTW9uLCAwNiBTZXAgMTk5OSAyMjozNTo1OCBHTVQKICA0LiBFVGFnOiAiYmMwNDktZjcyLTM3ZDQ0MWNlIgogIDUuIEFjY2VwdC1SYW5nZXM6IGJ5dGVzCiAgNi4gQ29udGVudC1MZW5ndGg6IDM5NTQKICA3LiBDb25uZWN0aW9uOiBjbG9zZQogIDguIENvbnRlbnQtVHlwZTogdGV4dC9odG1sCgogICBBcyB5b3UgY2FuIHNlZSwgdGhlIGhlYWRlciBsaW5lcyBhcmUgbGlrZSBNSU1FIGUtbWFpbCBoZWFkZXIgbGluZXM6CiAgIGlkZW50aWZpZXIsIGNvbG9uLCB2YWx1ZS4gVGhlIC9BUlJBWSBzd2l0Y2ggaXMgdGhlIG9ubHkgbWV0aG9kCiAgIGF2YWlsYWJsZSB0byBhIHNjcmlwdCB0byBwcm9jZXNzIHRoZSBzZXJ2ZXIgcmVzcG9uc2VzIGZvciBhIFBPU1Qgb3IKICAgUFVUIGNvbW1hbmQuCgogICBUaGUgSFRUUCBjb21tYW5kcyBhcmU6CgogICBIVFRQIFsgc3dpdGNoZXMgXSBHRVQgcmVtb3RlLWZpbGVuYW1lIFsgbG9jYWwtZmlsZW5hbWUgXQogICAgICAgICAgUmV0cmlldmVzIHRoZSBuYW1lZCBmaWxlLiBJZiBhIGxvY2FsLWZpbGVuYW1lIGlzIGdpdmVuLCB0aGUKICAgICAgICAgIGZpbGUgaXMgc3RvcmVkIGxvY2FsbHkgdW5kZXIgdGhhdCBuYW1lOyBvdGhlcndpc2UgaXQgaXMgc3RvcmVkCiAgICAgICAgICB3aXRoIGl0cyBvd24gbmFtZS4KCiAgIEhUVFAgWyBzd2l0Y2hlcyBdIEhFQUQgcmVtb3RlLWZpbGVuYW1lIGxvY2FsLWZpbGVuYW1lCiAgICAgICAgICBMaWtlIEdFVCBleGNlcHQgd2l0aG91dCBhY3R1YWxseSBnZXR0aW5nIHRoZSBmaWxlOyBpbnN0ZWFkIGl0CiAgICAgICAgICBnZXRzIG9ubHkgdGhlIGhlYWRlcnMsIHN0b3JpbmcgdGhlbSBpbnRvIHRoZSBnaXZlbiBmaWxlLCB3aG9zZQogICAgICAgICAgbmFtZSBtdXN0IGJlIGdpdmVuLCBvbmUgbGluZSBwZXIgaGVhZGVyIGl0ZW0sIGFzIHNob3duIGFib3ZlIGluCiAgICAgICAgICB0aGUgL0FSUkFZOiBzd2l0Y2ggZGVzY3JpcHRpb24uCgogICBIVFRQIFsgc3dpdGNoZXMgXSBJTkRFWCByZW1vdGUtZGlyZWN0b3J5IFsgbG9jYWwtZmlsZW5hbWUgXQogICAgICAgICAgUmV0cmlldmVzIHRoZSBmaWxlIGxpc3RpbmcgZm9yIHRoZSBnaXZlbiBzZXJ2ZXIgZGlyZWN0b3J5LgogICAgICAgICAgTk9URTogVGhpcyBjb21tYW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgbW9zdCBXZWIgc2VydmVycy4KCiAgIEhUVFAgWyBzd2l0Y2hlcyBdIFBPU1QgWyAvTUlNRS1UWVBFOnR5cGUgXSBsb2NhbC1maWxlIHJlbW90ZS1maWxlCiAgICAgICAgICBVc2VkIHRvIHNlbmQgYSByZXNwb25zZSBhcyBpZiBpdCB3ZXJlIHNlbnQgZnJvbSBhIGZvcm0uIFRoZQogICAgICAgICAgZGF0YSB0byBiZSBwb3N0ZWQgbXVzdCBiZSByZWFkIGZyb20gYSBmaWxlLgoKICAgSFRUUCBbIHN3aXRjaGVzIF0gUFVUIFsgL01JTUUtVFlQRTp0eXBlIF0gbG9jYWwtZmlsZSByZW1vdGUtZmlsZQogICAgICAgICAgVXBsb2FkcyBhIGxvY2FsIGZpbGUgdG8gYSBzZXJ2ZXIgZmlsZS4KCiAgIEhUVFAgWyBzd2l0Y2hlcyBdIERFTEVURSByZW1vdGUtZmlsZW5hbWUKICAgICAgICAgIEluc3RydWN0cyB0aGUgc2VydmVyIHRvIGRlbGV0ZSB0aGUgc3BlY2lmaWVkIGZpbGVuYW1lLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuIFRFUk1JTkFMIENPTk5FQ1RJT04KCiAgMy4xLiBDT05ORUNUIENvbW1hbmQgU3dpdGNoZXMKCiAgIFRoZSBmb2xsb3dpbmcgc3dpdGNoZXMgKHNlZSBbNDI2XVNlY3Rpb24gMS41KSB3ZXJlIGFkZGVkIHRvIHRoZQogICBDT05ORUNUIGNvbW1hbmQgaW4gNy4wOgoKICAgL1FVSUVUTFkKICAgICAgICAgIERvbid0IHByaW50IHRoZSAiQ29ubmVjdGluZyB0by4uLiIgb3IgIkJhY2sgYXQuLi4iIG1lc3NhZ2VzLiBDUQogICAgICAgICAgaXMgYW4gaW52aXNpYmxlIGNvbW1hbmQgc3lub255bSBmb3IgQ09OTkVDVCAvUVVJRVRMWS4KCiAgIC9UUklHR0VSOnN0cmluZwogICAgICAgICAgU3BlY2lmeSBhIHRyaWdnZXIgb3IgdHJpZ2dlcnMgKFs0MjddU2VjdGlvbiAzLjIpIGVmZmVjdGl2ZSBmb3IKICAgICAgICAgIHRoaXMgQ09OTkVDVCBjb21tYW5kIG9ubHksIHRlbXBvcmFyaWx5IG92ZXJyaWRpbmcgYW55IGN1cnJlbnQKICAgICAgICAgIFNFVCBURVJNSU5BTCBUUklHR0VSIHZhbHVlcyAoWzQyOF1TZWN0aW9uIDMuMikuCgogICBOb3RlOiBPdGhlciBzd2l0Y2hlcyBtaWdodCBhbHNvIGJlIGF2YWlsYWJsZTsgdHlwZSAiY29ubmVjdCA/IiBmb3IgYQogICBsaXN0LCAiaGVscCBjb25uZWN0IiBmb3IgYSBkZXNjcmlwdGlvbiBvZiBlYWNoLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuMi4gVHJpZ2dlcnMKCiAgIFRyaWdnZXJzIHdlcmUgYWRkZWQgZm9yIFVOSVgsIFZNUywgQU9TL1ZTLCBhbmQgSzk1IGluIEMtS2VybWl0IDcuMC4KCiAgIFNFVCBURVJNSU5BTCBUUklHR0VSIHN0cmluZwogICAgICAgICAgVGVsbHMgQy1LZXJtaXQgdG8gbG9vayBmb3IgdGhlIGdpdmVuIHN0cmluZyBkdXJpbmcgYWxsCiAgICAgICAgICBzdWJzZXF1ZW50IENPTk5FQ1Qgc2Vzc2lvbnMsIGFuZCBpZiBzZWVuLCB0byByZXR1cm4gdG8gY29tbWFuZAogICAgICAgICAgbW9kZSBhdXRvbWF0aWNhbGx5LCBhcyBpZiB5b3UgaGFkIGVzY2FwZWQgYmFjayBtYW51YWxseS4gSWYgdGhlCiAgICAgICAgICBzdHJpbmcgaW5jbHVkZXMgYW55IHNwYWNlcywgeW91IG11c3QgZW5jbG9zZSBpdCBpbiBicmFjZXMuCiAgICAgICAgICBFeGFtcGxlOgoKICBzZXQgdGVybWluYWwgdHJpZ2dlciB7Tk8gQ0FSUklFUn0KCiAgIENvbXBhcmlzb25zIGFyZSBtYWRlIGFmdGVyIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24uCgogICBJZiBhIHN0cmluZyBpcyB0byBpbmNsdWRlIGEgbGl0ZXJhbCBicmFjZSBjaGFyYWN0ZXIsIHByZWNlZGUgaXQgd2l0aCBhCiAgIGJhY2tzbGFzaDoKCiAgOyBNeSBtb2RlbSBhbHdheXMgbWFrZXMgdGhpcyBub2lzZSB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGxvc3Q6CiAgc2V0IHRlcm1pbmFsIHRyaWdnZXIgfHx8cHBwXHtce1x7XHtVVVVVVVVVCgogICBJZiB5b3Ugd2FudCBLZXJtaXQgdG8gbG9vayBmb3IgbW9yZSB0aGFuIG9uZSBzdHJpbmcgc2ltdWx0YW5lb3VzbHksCiAgIHVzZSB0aGUgZm9sbG93aW5nIHN5bnRheDoKCiAgc2V0IHRlcm1pbmFsIHRyaWdnZXIge3tzdHJpbmcxfXtzdHJpbmcyfS4uLntzdHJpbmdufX0KCiAgIEluIHRoaXMgY2FzZSwgQy1LZXJtaXQgd2lsbCByZXR1cm4gdG8gY29tbWFuZCBtb2RlIGF1dG9tYXRpY2FsbHkgaWYKICAgYW55IG9mIHRoZSBnaXZlbiBzdHJpbmdzIGlzIGVuY291bnRlcmVkLiBVcCB0byA4IHN0cmluZ3MgbWF5IGJlCiAgIHNwZWNpZmllZC4KCiAgIElmIHRoZSBtb3N0IHJlY2VudCByZXR1cm4gdG8gY29tbWFuZCBtb2RlIHdhcyBjYXVzZWQgYnkgYSB0cmlnZ2VyLCB0aGUKICAgbmV3IHZhcmlhYmxlLCBcdih0cmlnZ2VyKSwgc2hvd3MgdGhlIHRyaWdnZXIgdmFsdWU7IG90aGVyd2lzZQogICBcdih0cmlnZ2VyKSBpcyBlbXB0eS4KCiAgIFRoZSBTSE9XIFRSSUdHRVIgY29tbWFuZCBkaXNwbGF5cyB0aGUgU0VUIFRFUk1JTkFMIFRSSUdHRVIgdmFsdWVzIGFzCiAgIHdlbGwgYXMgdGhlIFx2KHRyaWdnZXIpIHZhbHVlLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuMy4gVHJhbnNwYXJlbnQgUHJpbnRpbmcKCiAgIEFzIG5vdGVkIGluIHRoZSBtYW51YWwsIEMtS2VybWl0J3MgQ09OTkVDVCBjb21tYW5kIG9uIFVOSVggaXMgbm90IGEKICAgdGVybWluYWwgZW11bGF0b3IsIGJ1dCByYXRoZXIgYSAic2VtaXRyYW5zcGFyZW50IHBpcGUiIGJldHdlZW4gdGhlCiAgIHRlcm1pbmFsIG9yIGVtdWxhdG9yIHlvdSBhcmUgdXNpbmcgdG8gYWNjZXNzIEMtS2VybWl0LCBhbmQgdGhlIHJlbW90ZQogICBob3N0IHRvIHdoaWNoIEMtS2VybWl0IGlzIGNvbm5lY3RlZC4gVGhlICJzZW1pdHJhbnNwYXJlbnQiIHF1YWxpZmllcgogICBpcyBiZWNhdXNlIG9mIGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24gYXMgd2VsbCBhcyBzZXZlcmFsIGFjdGlvbnMKICAgdGFrZW4gYnkgdGhlIGVtdWxhdG9yIGluIHJlc3BvbnNlIHRvIHRoZSBjaGFyYWN0ZXJzIG9yIHN0cmluZ3MgdGhhdAogICBwYXNzIHRocm91Z2ggaXQsIHN1Y2ggYXMgQVBDcywgS2VybWl0IHBhY2tldHMgKGF1dG9kb3dubG9hZCksCiAgIHRyaWdnZXJzLCBldGMuCgogICBUaGUgVU5JWCB2ZXJzaW9uIG9mIEMtS2VybWl0IDcuMCBhZGRzIGFub3RoZXIgc3VjaCBhY3Rpb246IFRyYW5zcGFyZW50CiAgIHByaW50aW5nLCBhbHNvIGNhbGxlZCBDb250cm9sbGVyIHByaW50aW5nIChhcyBkaXN0aW5jdCBmcm9tIEF1dG9wcmludAogICBvciBsaW5lIG9yIHNjcmVlbiBwcmludCkuIEl0IGlzIGludGVuZGVkIG1haW5seSBmb3IgdXNlIG9uIFVOSVgKICAgd29ya3N0YXRpb24gY29uc29sZXMgKGFzIG9wcG9zZWQgdG8gcmVtb3RlIGxvZ2lucyksIGJ1dCB3aXRoIHNvbWUgY2FyZQogICBjYW4gYWxzbyBiZSB1c2VkIHdoZW4gYWNjZXNzaW5nIEMtS2VybWl0IHJlbW90ZWx5LgoKICAgVHJhbnNwYXJlbnQgcHJpbnRpbmcgaXMgcmVsYXRlZCB0byBBUEMgYnkgc2hhcmluZyBDLUtlcm1pdCdzIGJ1aWx0LWluCiAgIEFOU0kgZXNjYXBlLXNlcXVlbmNlIHBhcnNlciB0byBkZXRlY3QgInByaW50ZXIgb24iIGFuZCAicHJpbnRlciBvZmYiCiAgIHNlcXVlbmNlcyBmcm9tIHRoZSBob3N0LiBXaGVuIHRoZSBwcmludGVyLW9uIHNlcXVlbmNlIGlzIHJlY2VpdmVkLCBhbGwKICAgc3Vic2VxdWVudCBhcnJpdmluZyBjaGFyYWN0ZXJzIC0tIGluY2x1ZGluZyBOVUwsIGNvbnRyb2wgY2hhcmFjdGVycywKICAgYW5kIGVzY2FwZSBzZXF1ZW5jZXMgLS0gYXJlIHNlbnQgdG8gdGhlIFNFVCBQUklOVEVSIGRldmljZSBpbnN0ZWFkIG9mCiAgIHRvIHlvdXIgc2NyZWVuIHVudGlsIHRoZSBwcmludGVyLW9mZiBzZXF1ZW5jZSBpcyByZWNlaXZlZCwgb3IgeW91CiAgIGVzY2FwZSBiYWNrLCB3aGljaGV2ZXIgaGFwcGVucyBmaXJzdC4gVGhlc2UgYnl0ZXMgYXJlIG5vdCB0cmFuc2xhdGVkCiAgIG9yIG1vZGlmaWVkIG9yIGZpbHRlcmVkIGluIGFueSB3YXkgYnkgS2VybWl0IChleGNlcHQgZm9yIHBvc3NpYmx5CiAgIHN0cmlwcGluZyBvZiB0aGUgOHRoIGJpdCwgYXMgbm90ZWQgYmVsb3cpLCBidXQgaWYgZmlsdGVyaW5nIG9yCiAgIHRyYW5zbGF0aW9uIGlzIGRlc2lyZWQsIHRoaXMgY2FuIGJlIGFjY29tcGxpc2hlZCBieSB5b3VyIFNFVCBQUklOVEVSCiAgIHNlbGVjdGlvbiAoZS5nLiBieSBjaG9vc2luZyBhIHBpcGVsaW5lIG9mIGZpbHRlcnMpLgoKICAgQnkgZGVmYXVsdCwgeW91ciBTRVQgUFJJTlRFUiBkZXZpY2UgaXMgeW91ciBkZWZhdWx0IFVOSVggcHJpbnRlciwgYnV0CiAgIGl0IGNhbiBhbHNvIGJlIGEgZmlsZSwgYSBjb21tYW5kLCBvciB0aGUgbnVsbCBkZXZpY2UgKHdoaWNoIGNhdXNlcyBhbGwKICAgcHJpbnRlciBtYXRlcmlhbCB0byBiZSBkaXNjYXJkZWQpLiBTZWUgWzQyOV1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkLiwKICAgcC40MSBmb3IgZGV0YWlscy4KCiAgIFRyYW5zcGFyZW50IHByaW50aW5nIGlzIGNvbnRyb2xsZWQgYnkgdGhlIGNvbW1hbmQ6CgogICBTRVQgVEVSTUlOQUwgUFJJTlQgeyBPTiwgT0ZGIH0KICAgICAgICAgIFdoZW4gT04sIHRyYW5zcGFyZW50LXByaW50IHNlcXVlbmNlcyBhcmUgb2JleWVkLCBhbmQgcHJpbnRpbmcKICAgICAgICAgIG9jY3VycyBvbiB0aGUgc3lzdGVtIHdoZXJlIEMtS2VybWl0IGlzIHJ1bm5pbmcuIFdoZW4gT0ZGLAogICAgICAgICAgdHJhbnNwYXJlbnQgcHJpbnQgc2VxdWVuY2VzIGFyZSBpZ25vcmVkIGFuZCBwYXNzZWQgdGhyb3VnaCB0bwogICAgICAgICAgeW91ciBhY3R1YWwgdGVybWluYWwgb3IgZW11bGF0b3IsIGFsb25nIHdpdGggdGhlIGRhdGEgdGhleQogICAgICAgICAgZW5jbG9zZS4gT0ZGIGlzIHRoZSBkZWZhdWx0LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIKICAgICAgICAgIEMtS2VybWl0IHJlbGVhc2VzLiBBcyBub3RlZCBpbiB0aGUgbWFudWFsLCB3aGVuIHRoZSBjdXJyZW50IFNFVAogICAgICAgICAgUFJJTlRFUiBkZXZpY2UgaXMgYSBmaWxlLCB0cmFuc3BhcmVudC1wcmludCBtYXRlcmlhbCBpcwogICAgICAgICAgYXBwZW5kZWQgdG8gaXQ7IHRoZSBmaWxlIGlzIG5vdCBvdmVyd3JpdHRlbi4KCiAgIFNFVCBURVJNSU5BTCBCWVRFU0laRSB7IDcsIDggfQogICBTRVQgUEFSSVRZIHsgRVZFTiwgT0RELCBNQVJLLCBTUEFDRSwgTk9ORSB9CiAgICAgICAgICBJZiB0aGUgdGVybWluYWwgYnl0ZXNpemUgaXMgNywgb3IgUEFSSVRZIGlzIG5vdCBOT05FLCB0aGUgOHRoCiAgICAgICAgICBiaXQgb2YgZWFjaCBieXRlIGlzIHN0cmlwcGVkIHByaW9yIHRvIHByaW50aW5nLgoKICAgVGhlIHRyYW5zcGFyZW50LXByaW50IGVzY2FwZSBzZXF1ZW5jZXMgYXJlOgoKICAgPEVTQz5bNWkKICAgICAgICAgIFByaW50ZXIgT24uIFNlbmQgYWxsIHN1YnNlcXVlbnQgaW5jb21pbmcgYnl0ZXMgdG8gdGhlIHByaW50ZXIKICAgICAgICAgIHdpdGhvdXQgYW55IGtpbmQgb2YgZmlsdGVyaW5nLCB0cmFuc2xhdGlvbiwgb3IgYWx0ZXJhdGlvbi4KICAgICAgICAgIE5vdGU6IDxFU0M+IHN0YW5kcyBmb3IgQVNDSUkgY2hhcmFjdGVyIG51bWJlciAyNyAoZGVjaW1hbCksCiAgICAgICAgICBFc2NhcGUuCgogICA8RVNDPls0aQogICAgICAgICAgUHJpbnRlciBPZmYuIFJlc3VtZSBkaXNwbGF5aW5nIGluY29taW5nIGJ5dGVzIG9uIHRoZSBzY3JlZW4uCgogICBUaGVzZSBhcmUgdGhlIHNhbWUgc2VxdWVuY2VzIHVzZWQgYnkgREVDIFZUMTAwIGFuZCBoaWdoZXIgdGVybWluYWxzCiAgIGFuZCBvdGhlciBBTlNJIFgzLjY0IGFuZCBJU08gNjQyOSBjb21wYXRpYmxlIHRlcm1pbmFscy4gVGhlcmUgaXMgbm8KICAgcHJvdmlzaW9uIGZvciBzZWxlY3Rpbmcgb3RoZXIgcHJpbnRlci1jb250cm9sIHNlcXVlbmNlcy4KCiAgIFJlc3RyaWN0aW9uczoKCiAgICAxLiBZb3UgbXVzdCBTRVQgVEVSTSBUUkFOU1BBUkVOVC1QUklOVCBPTiBiZWZvcmUgeW91IGNhbiB1c2UgdGhpcwogICAgICAgZmVhdHVyZS4KICAgIDIuIE9ubHkgdGhlIDctYml0IGZvcm1zIG9mIHRoZSBlc2NhcGUgc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQuIFRoZQogICAgICAgOC1iaXQgQ1NJIEMxIGNvbnRyb2wgaXMgbm90IHJlY29nbml6ZWQuCiAgICAzLiBBdXRvcHJpbnQgaXMgbm90IHN1cHBvcnRlZCwgc2luY2UgdGhpcyByZXF1aXJlcyBhIGZ1bGwtZmxlZGdlZAogICAgICAgdGVybWluYWwgZW11bGF0b3Igd2l0aCBkaXJlY3QgYWNjZXNzIHRvIHRoZSBzY3JlZW4uCiAgICA0LiBUaGUgc3RhcnQtcHJpbnQgYW5kIHN0b3AtcHJpbnQgc2VxdWVuY2VzIHBhc3MgdGhyb3VnaCB0byB0aGUKICAgICAgIHNjcmVlbiAodGhlcmUgaXMgbm8gd2F5IHRvIGF2b2lkIHRoaXMgd2l0aG91dCBjYXVzaW5nIHVuYWNjZXB0YWJsZQogICAgICAgZGVsYXlzIG9yIGRlYWRsb2NrcyBpbiBDT05ORUNUIG1vZGUpLiBUaHVzIGlmIHlvdXIgdGVybWluYWwgb3IKICAgICAgIGVtdWxhdG9yIGFsc28gc3VwcG9ydHMgdHJhbnNwYXJlbnQgcHJpbnRpbmcgdmlhIHRoZXNlIHNhbWUKICAgICAgIHNlcXVlbmNlcywgYW4gZW1wdHkgZmlsZSB3aWxsIGJlIHNlbnQgdG8gaXRzIHByaW50ZXIuIE5vcm1hbGx5CiAgICAgICB0aGlzIGhhcyBubyBlZmZlY3QuCgogICBQb2ludCAoNCkgaXMgc2ltaWxhciB0byB0aGUgc2l0dWF0aW9uIHdpdGggYXV0b2Rvd25sb2FkIGFuZCBBUEMgLS0KICAgd2hlbiB5b3UgaGF2ZSBzZXZlcmFsIEtlcm1pdCBjbGllbnRzIGluIGEgY2hhaW4sIHlvdSBzaG91bGQgdGFrZSBjYXJlCiAgIHRoYXQgdGhlc2UgZmVhdHVyZXMgYXJlIGVuYWJsZWQgaW4gb25seSBvbmUgb2YgdGhlbS4KCiAgIEV4YW1wbGUgMToKCiAgc2V0IHByaW50ZXIge3xscHIgLVBsYXNlcn0gIDsgU3BlY2lmeSB0aGUgcHJpbnRlciAoaWYgbm90IGRlZmF1bHQpLgogIHNldCB0ZXJtIHByaW50IG9uICAgICAgICAgICA7IEVuYWJsZSB0cmFuc3BhcmVudCBwcmludGluZy4KICBzZXQgdGVybSBieXRlIDggICAgICAgICAgICAgOyBFbmFibGUgOC1iaXQgY2hhcmFjdGVycy4KICBjb25uZWN0ICAgICAgICAgICAgICAgICAgICAgOyBFbnRlciBDT05ORUNUIG1vZGUuCgogICBFeGFtcGxlIDI6CgogIHNldCBwcmludGVyIC9ob21lL3VzZXJzL29sZ2EvcHJpbnRlci5sb2cgIDsgU2VuZCBwcmludGVyIG1hdGVyaWFsIHRvIGEgZmlsZS4KCiAgIEV4YW1wbGUgMzoKCiAgc2V0IHByaW50ZXIge3wgZ3JlcCAtdiBeUmVjZWl2ZWQgfCBscHJ9ICAgOyBGaWx0ZXIgb3V0IHNvbWUgbGluZXMKCiAgIFRoZW4gdXNlICJwY3ByaW50IiBvciAidnRwcmludCIgY29tbWFuZHMgb24gdGhlIGhvc3QgdG8gaW5pdGlhdGUKICAgdHJhbnNwYXJlbnQgcHJpbnQgb3BlcmF0aW9ucy4gU2VlIFs0MzBdVXNpbmcgQy1LZXJtaXQsIDJuZCBFZC4sIHAuNDA2CiAgIGZvciBkZXRhaWxzLgoKICAgSGVyZSBpcyBhIHNhbXBsZSAicGNwcmludCIgc2hlbGwgc2NyaXB0IGZvciBVTklYOgoKICAjIS9iaW4vc2gKICBlY2hvIC1uICc8RVNDPls1aScKICBpZiBbICQjIC1lcSAwIF07IHRoZW4KICAgIGNhdAogIGVsc2UKICAgIGNhdCAkKgogIGZpCiAgZWNobyAtbiAnPEZGPjxFU0M+WzRpJwogICMgKGVuZCkKCiAgIChSZXBsYWNlICI8RVNDPiIgYnkgdGhlIGFjdHVhbCBBU0NJSSBFc2NhcGUgY2hhcmFjdGVyIGFuZCAiPEZGPiIgYnkKICAgdGhlIEFTQ0lJIEZvcm1mZWVkIGNoYXJhY3RlcikuCgogICBJZiB5b3UgYWx3YXlzIHdhbnQgdHJhbnNwYXJlbnQgcHJpbnRpbmcgZW5hYmxlZCwgcHV0ICJzZXQgdGVybSBwcmludAogICBvbiIgaW4geW91ciBDLUtlcm1pdCBjdXN0b21pemF0aW9uIGZpbGUgKH4vLm15a2VybXJjIGluIFVOSVgpLiBUaGUKICAgInNldCB0ZXJtIGJ5dGVzaXplIiBzZWxlY3Rpb24sIGhvd2V2ZXIsIGlzIGEgcHJvcGVydHkgb2YgZWFjaCBzZXBhcmF0ZQogICBjb25uZWN0aW9uLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDMuNC4gQmluYXJ5IGFuZCBUZXh0IFNlc3Npb24gTG9ncwoKICAgQy1LZXJtaXQgNy4wIGNvcnJlY3RzIGFuIG92ZXJzaWdodCBpbiBlYXJsaWVyIHJlbGVhc2VzLCBpbiB3aGljaAogICBiaW5hcnkgc2Vzc2lvbiBsb2dzIChTRVQgU0VTU0lPTi1MT0cgQklOQVJZKSB0cmFuc2xhdGVkIGNoYXJhY3RlciBzZXRzCiAgIGFuZCBwZXJmb3JtZWQgdmFyaW91cyBmb3JtYXR0aW5nIHRyYW5zZm9ybWF0aW9ucyAoZS5nLiAibmV3bGluZSBtb2RlIikKICAgYmVmb3JlIHdyaXRpbmcgY2hhcmFjdGVycyB0byB0aGUgc2Vzc2lvbiBsb2cuIEluIEMtS2VybWl0IDcuMCwKICAgYmluYXJ5LW1vZGUgc2Vzc2lvbiBsb2dnaW5nIHdyaXRlcyBjaGFyYWN0ZXJzIGFzIHRoZXkgY29tZSBpbiwgYmVmb3JlCiAgIGFueXRoaW5nIChvdGhlciB0aGF0IHBhcml0eS1iaXQgc3RyaXBwaW5nKSBpcyBkb25lIHRvIHRoZW0uIFRleHQtbW9kZQogICBzZXNzaW9uIGxvZ2dpbmcgcmVjb3JkcyB0aGUgY2hhcmFjdGVycyBhZnRlciBwcm9jZXNzaW5nLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuIEZJTEUgVFJBTlNGRVIKCiAgIEV2ZXJ5IGZpbGUgaXMgdHJhbnNmZXJyZWQgZWl0aGVyIGluIHRleHQgbW9kZSAod2hpY2ggaW1wbGllcwogICByZWNvcmQtZm9ybWF0IGFuZCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uKSBvciBiaW5hcnkgbW9kZSAoaW4gd2hpY2gKICAgZWFjaCBieXRlIGlzIHNlbnQgbGl0ZXJhbGx5IHdpdGhvdXQgYW55IGtpbmQgb2YgY29udmVyc2lvbikuIFRoZSBtb2RlCiAgIGluIHdoaWNoIGEgZmlsZSBpcyB0cmFuc2ZlcnJlZCBpcyBjb250cm9sbGVkIGJ5IChhKSB0aGUgZGVmYXVsdCBtb2RlLAogICBpbiB0aGUgYWJzZW5jZSBvZiBhbnkgb3RoZXIgaW5kaWNhdGlvbnM7IChiKSB0aGUgU0VUIEZJTEUgVFlQRQogICBjb21tYW5kOyAoYykgdmFyaW91cyBhdXRvbWF0aWMgbWVjaGFuaXNtcyBiYXNlZCBvbiBjbGllbnQvc2VydmVyCiAgIG5lZ290aWF0aW9ucywgZGlyZWN0b3J5IGluZm9ybWF0aW9uIG9yIGZpbGVuYW1lIHBhdHRlcm5zLCBldGMuCgogICBUaGUgZGVmYXVsdCBGSUxFIFRZUEUgd2FzIGNoYW5nZWQgZnJvbSBURVhUIHRvIEJJTkFSWSBpbiBDLUtlcm1pdCA3LjAKICAgYmVjYXVzZToKCiAgICAgKiBUcmFuc2ZlcnJpbmcgYSB0ZXh0IGZpbGUgaW4gYmluYXJ5IG1vZGUgZG9lcyBsZXNzIGRhbWFnZSB0aGFuCiAgICAgICB0cmFuc2ZlcnJpbmcgYSBiaW5hcnkgZmlsZSBpbiB0ZXh0IG1vZGUuCiAgICAgKiBPbmx5IGJpbmFyeS1tb2RlIHRyYW5zZmVycyBjYW4gYmUgcmVjb3ZlcmVkIGZyb20gdGhlIHBvaW50IG9mCiAgICAgICBmYWlsdXJlLgogICAgICogVGhlIGF1dG9tYXRpYyB0cmFuc2Zlci1tb2RlIG1lY2hhbmlzbXMgc3dpdGNoIHRvIHRleHQgbW9kZSBvbiBhCiAgICAgICBwZXItZmlsZSBiYXNpcyBhbnl3YXksIHNvIG9ubHkgdGhvc2UgZmlsZXMgdGhhdCBhcmUgbm90IGNvdmVyZWQgYnkKICAgICAgIHRoZSBhdXRvbWF0aWMgbWVjaGFuaXNtcyBhcmUgYWZmZWN0ZWQuCiAgICAgKiBBbGwgZmlsZSB0cmFuc2ZlcnMgb24gdGhlIFdlYiBhcmUgZG9uZSBpbiBiaW5hcnkgbW9kZSwgc28gcGVvcGxlCiAgICAgICBhcmUgYWNjdXN0b21lZCB0byBpdCBhbmQgZXhwZWN0IGl0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuMC4gQlVHIEZJWEVTLCBNSU5PUiBDSEFOR0VTLCBBTkQgQ0xBUklGSUNBVElPTlMKCiAgICA0LjAuMC4gRmlsZW5hbWVzIHdpdGggU3BhY2VzCgogICBGaWxlbmFtZXMgdGhhdCBjb250YWluIHNwYWNlcyBhcmUgYSBtYWpvciBudWlzYW5jZSB0byBhIHByb2dyYW0gbGlrZQogICBLZXJtaXQsIHdob3NlIGNvbW1hbmQgbGFuZ3VhZ2UgaXMgbGluZS0gYW5kIHdvcmQtb3JpZW50ZWQsIGluIHdoaWNoCiAgIHdvcmRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2VzIGFuZCBhIGZpbGVuYW1lIGlzIGFzc3VtZWQgdG8gYmUgYQogICAid29yZCIuIEluIGdlbmVyYWwgKHVubGVzcyBub3RlZCBvdGhlcndpc2UgaW4gdGhlIGRlc2NyaXB0aW9uIG9mIGEKICAgcGFydGljdWxhciBjb21tYW5kKSwgdGhlcmUgaXMgb25seSBvbmUgd2F5IHRvIHJlZmVyIHRvIHN1Y2ggZmlsZXMgaW4KICAgS2VybWl0IGNvbW1hbmRzLCBhbmQgdGhhdCBpcyB0byBlbmNsb3NlIHRoZSBuYW1lIGluIGJyYWNlczoKCiAgc2VuZCB7dGhpcyBmaWxlfQoKICAgVGVsbHMgS2VybWl0IHRvIHNlbmQgdGhlIGZpbGUgd2hvc2UgbmFtZSBpcyAidGhpcyBmaWxlIiAodHdvIHdvcmRzLCBubwogICBxdW90ZXMpLiBPZiBjb3Vyc2UsIHZhcmlvdXMgY2lyY3VtbG9jdXRpb25zIGFyZSBhbHNvIHBvc3NpYmxlLCBzdWNoCiAgIGFzOgoKICBkZWZpbmUgXCVhIHRoaXMgZmlsZQogIHNlbmQgXCVhCgogICBCVVQsIHBlcmhhcHMgY29udHJhcnkgdG8gZXhwZWN0YXRpb24sIHlvdSBjYW4ndCB1c2UgIlwzMiIgdG8gcmVwcmVzZW50CiAgIHRoZSBzcGFjZToKCiAgc2VuZCB0aGlzXDMyZmlsZQoKICAgZG9lcyBub3Qgd29yay4gV2h5PyBCZWNhdXNlIHRoZSBLZXJtaXQgcGFyc2VyLCB3aGljaCBtdXN0IHdvcmsgb24gbWFueQogICBvcGVyYXRpbmcgc3lzdGVtcyBpbmNsdWRpbmcgV2luZG93cywgaGFzIG5vIHdheSBvZiBrbm93aW5nIHdoYXQgeW91CiAgIG1lYW4gYnkgInRoaXNcMzJmaWxlIi4gRG8geW91IG1lYW4gYSBmaWxlIHdob3NlIG5hbWUgaXMgInRoaXMgZmlsZSIgaW4KICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5PyBPciBkbyB5b3UgbWVhbiBhIGZpbGUgd2hvc2UgbmFtZSBpcyAiMzJmaWxlIiBpbgogICB0aGUgInRoaXMiIHN1YmRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCBkaXJlY3Rvcnk/IEd1ZXNzaW5nIHdvbid0IGRvCiAgIGhlcmU7IEtlcm1pdCBtdXN0IGJlaGF2ZSBjb25zaXN0ZW50bHkgYW5kIGRldGVybWluaXN0aWNhbGx5IGluIGFsbAogICBjYXNlcyBvbiBhbGwgcGxhdGZvcm1zLgoKICAgTm90ZSB0aGF0IHlvdSBjYW4ndCB1c2UgRXNjIG9yIFRhYiB3aXRoaW4gey4uLn0gZm9yIGZpbGVuYW1lCiAgIGNvbXBsZXRpb24sIG9yIHF1ZXN0aW9uIG1hcmsgdG8gZ2V0IGEgZmlsZW5hbWUgbGlzdC4gSG93ZXZlciwgeW91IGNhbgogICBpbmNsdWRlIHdpbGRjYXJkczsgZm9yIGV4YW1wbGU6CgogIHNlbmQgeyogKn0KCiAgIHNlbmRzIGFsbCBmaWxlcyB3aG9zZSBuYW1lIGNvbnRhaW5zIGEgc3BhY2UuCgogICBBbGwgdGhpbmdzIGNvbnNpZGVyZWQsIGl0IGlzIGJlc3QgdG8gYXZvaWQgc3BhY2VzIGluIGZpbGUgYW5kCiAgIGRpcmVjdG9yeSBuYW1lcyBpZiB5b3UgY2FuLiBBbHNvIHNlZSBbNDMxXVNlY3Rpb24gNS40IG9uIHRoaXMgdG9waWMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjAuMS4gUGFja2V0IG91dCBvZiBXaW5kb3cKCiAgIEMtS2VybWl0IDYuMCBjb3VsZCBzZW5kIHBhY2tldHMgIm91dCBvZiB3aW5kb3ciIGlmIHRoZSB3aW5kb3cgc2l6ZSB3YXMKICAgZ3JlYXRlciB0aGFuIDEgYW5kIEFDS3MgaGFkIGFycml2ZWQgb3V0IG9mIG9yZGVyLiBGaXhlZCBpbiA2LjEuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjAuMi4gTU9WRSBhZnRlciBBREQgU0VORC1MSVNUCgogICBBREQgU0VORC1MSVNUIGZvbGxvd2VkIGJ5IE1PVkUgZGlkIG5vdCBkZWxldGUgb3JpZ2luYWwgZmlsZXM7IGZpeGVkIGluCiAgIDYuMS4gQ2FycmllciBsb3NzIHdhcyBub3QgZGV0ZWN0ZWQgZHVyaW5nIHRyYW5zZmVyOyBpbiA3LjAgQy1LZXJtaXQKICAgY2hlY2tzIGZvciB0aGlzIChidXQgcmVzdWx0cyBjYW4gbm90IGJlIGd1YXJhbnRlZWQpLiBJbiBhbnkgY2FzZSwgdGhlCiAgIHByb3RvY29sIHdpbGwgZXZlbnR1YWxseSB0aW1lIG91dCBpZiB0aGUgY29ubmVjdGlvbiBpcyBsb3N0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4wLjMuIEdFVCBhbmQgUkVDRUlWRSBBcy1OYW1lcwoKICAgSW4gNUEoMTkwKSB0aHJvdWdoIDYuMC4xOTIsIHRoZSBHRVQgYW5kIFJFQ0VJVkUgYXMtbmFtZSBkaWQgbm90CiAgIHByb3Blcmx5IG92ZXJyaWRlIHRoZSBSRUNFSVZFIFBBVEhOQU1FUyBzZXR0aW5nLiBJbiA3LjAgaXQgZG9lcy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMC40LiBOZXcgQnJpZWYgU3RhdGlzdGljcyBMaXN0aW5nCgogICBWZXJzaW9uIDcuMCBhZGRzIGEgL0JSSUVGIHN3aXRjaCB0byB0aGUgU1RBVElTVElDUyBjb21tYW5kLCB0byBkaXNwbGF5CiAgIGEgc2hvcnQgZmlsZS10cmFuc2ZlciBzdGF0aXN0aWNzIHJlcG9ydC4gL0JSSUVGIGlzIG5vdyB0aGUgZGVmYXVsdC4KICAgVXNlIC9WRVJCT1NFIHRvIHNlZSB0aGUgZnVsbCBkaXNwbGF5LCB3aGljaCBpcyBhYm91dCAyNSBsaW5lcyBsb25nLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4wLjUuIEltcHJvdmVkIEZBU1QgQ29tbWFuZAoKICAgVGhlIHByZWluc3RhbGxlZCBkZWZpbml0aW9uIG9mIHRoZSBGQVNUIG1hY3JvIGRpZCBub3QgdGFrZSBlbm91Z2gKICAgZmFjdG9ycyBpbnRvIGFjY291bnQuIE5vdyBpdCBzZXRzIHBhY2tldCBsZW5ndGhzIGFuZCB3aW5kb3cgc2l6ZXMKICAgYXBwcm9wcmlhdGUgdG8gdGhlIGNvbmZpZ3VyYXRpb24uIEZ1cnRoZXJtb3JlLCBpbiBJUklYIG9ubHksIGl0IG1pZ2h0CiAgIHJlc3RyaWN0IHRoZSBTRU5EIHBhY2tldCBsZW5ndGggdG8gNDAwMCwgdG8gd29yayBhcm91bmQgYSBidWcgaW4gdGhlCiAgIElSSVggVGVsbmV0IHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBJUklYIHZlcnNpb24gKHNlZQogICBbNDMyXWNrdWJ3ci50eHQsIElSSVggc2VjdGlvbikuIFRvIHNlZSB0aGUgYnVpbHQtaW4gZGVmaW5pdGlvbiBvZiB0aGUKICAgRkFTVCBtYWNybywgdHlwZSAic2hvdyBtYWNybyBmYXN0Ii4gVG8gY2hhbmdlIGl0LCBzaW1wbHkgZGVmaW5lIGl0IHRvCiAgIGJlIHdoYXRldmVyIHlvdSB3YW50IC0tIGl0J3MganVzdCBhIG1hY3JvLCBsaWtlIGFueSBvdGhlci4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMC42LiBUaGUgU0VUIFNFTkQgQkFDS1VQIENvbW1hbmQKCiAgIFZlcnNpb24gNy4wIGFkZHMgU0VUIFNFTkQgQkFDS1VQIHsgT04sIE9GRiB9LiBUaGlzIHRlbGxzIHdoZXRoZXIKICAgYmFja3VwIGZpbGVzIHNob3VsZCBiZSBzZW50LiBCYWNrdXAgZmlsZXMgYXJlIHRoZSBvbmVzIGNyZWF0ZWQgYnkKICAgS2VybWl0IChhbmQgRU1BQ1MsIGFuZCBwb3NzaWJseSBvdGhlciBhcHBsaWNhdGlvbnMpIHRvIHByZXNlcnZlIG9sZAogICBjb3BpZXMgb2YgZmlsZXMgd2hlbiBjcmVhdGluZyBuZXcgb25lcyB3aXRoIHRoZSBzYW1lIG5hbWUuIEtlcm1pdCBkb2VzCiAgIHRoaXMgd2hlbiByZWNlaXZpbmcgYSBmaWxlIGFuZCBpdHMgRklMRSBDT0xMSVNJT04gc2V0dGluZyBpcyBCQUNLVVAKICAgKG9yIFJFTkFNRSwgaW4gd2hpY2ggY2FzZSBpdCB0aGUgbmV3IGZpbGUgZ2V0cyB0aGUgYmFja3VwIG5hbWUpLiBPbgogICBtb3N0IHBsYXRmb3JtcywgdGhlIGJhY2t1cCBuYW1lIGlzIGZvcm1lZCBieSBhZGRpbmc6CgogIC5+bn4KCiAgIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGVuYW1lLCB3aGVyZSAibiIgaXMgYSBudW1iZXIuIEZvciBleGFtcGxlLCBpZiB0aGUKICAgb3JpZ2luYWwgZmlsZSBpcyBvb2ZhLnR4dCwgYSBiYWNrdXAgZmlsZSBtaWdodCBiZSBjYWxsZWQ6CgogIG9vZmEudHh0Ln4xfgoKICAgKG9yIG9vZmEudHh0Ln4yfiwgZXRjKS4gSWYgeW91IFNFVCBTRU5EIEJBQ0tVUCBPRkYsIHRoaXMgdGVsbHMgS2VybWl0CiAgIG5vdCB0byBzZW5kIGZpbGVzIHRoYXQgaGF2ZSBiYWNrdXAgbmFtZXMuIE5vcm1hbGx5LCBTRVQgU0VORCBCQUNLVVAgaXMKICAgT04gKGFzIHNob3duIGJ5IFNIT1cgUFJPVE9DT0wpLCBhbmQgYmFja3VwIGZpbGVzIGFyZSBzZW50IGlmIHRoZWlyCiAgIG5hbWVzIG1hdGNoIHRoZSBTRU5EIGZpbGUgc3BlY2lmaWNhdGlvbi4KCiAgIEFsc28gc2VlIFBVUkdFLCBTRVQgRklMRSBDT0xMSVNJT04sIFNFTkQgL05PQkFDS1VQLCBESVJFQ1RPUlkKICAgL1tOT11CQUNLVVAuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjAuNy4gVGhlIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfSBWRVJTSU9OLU5VTUJFUlMgQ29tbWFuZAoKICAgVk1TIE9ubHkuIE5vcm1hbGx5IHdoZW4gc2VuZGluZyBmaWxlcywgVk1TIEMtS2VybWl0IHN0cmlwcyB0aGUgdmVyc2lvbgogICBudW1iZXIuIEZvciBleGFtcGxlLCBpZiB0aGUgZmlsZSBpcyBGT08uQkFSOzM0LCB0aGUgbmFtZSBpcyBzZW50IGFzCiAgIEZPTy5CQVIgKHdpdGhvdXQgdGhlICI7MzQiKS4gSWYgeW91IHdhbnQgdG8ga2VlcCB2ZXJzaW9uIG51bWJlcnMgb24KICAgd2hlbiBzZW5kaW5nIGZpbGVzLCB1c2UgU0VUIFNFTkQgVkVSU0lPTi1OVU1CRVJTIE9OLiBUaGUgZWZmZWN0CiAgIGRlcGVuZHMgb24gdGhlIHJlY2VpdmVyLgoKICAgTm9ybWFsbHkgd2hlbiByZWNlaXZpbmcgZmlsZXMsIGFuZCBhbiBpbmNvbWluZyBmaWxlbmFtZSBpbmNsdWRlcyBhCiAgIFZNUy1zdHlsZSB2ZXJzaW9uIG51bWJlciAoc3VjaCBhcyBGT08uQkFSOzM0KSBWTVMgQy1LZXJtaXQgc3RyaXBzIGl0CiAgIGJlZm9yZSB0cnlpbmcgdG8gY3JlYXRlIHRoZSBuZXcgZmlsZTsgdGhpcyB3YXkgdGhlIG5ldyBmaWxlIHJlY2VpdmVzCiAgIHRoZSBuZXh0IGhpZ2hlc3QgdmVyc2lvbiBudW1iZXIgaW4gdGhlIGN1c3RvbWFyeSBtYW5uZXIgZm9yIFZNUy4gSWYKICAgeW91IHdhbnQgdmVyc2lvbiBudW1iZXJzIG9uIGluY29taW5nIGZpbGVuYW1lcyB0byBiZSB1c2VkIGluIGNyZWF0aW5nCiAgIHRoZSBuZXcgZmlsZXMsIHVzZSBTRVQgUkVDRUlWRSBWRVJTSU9OLU5VTUJFUlMgT04uCgogICBOb3JtYWxseSB0aGVzZSBjb21tYW5kcyB3b3VsZCBiZSBlZmZlY3RpdmUgb25seSB3aGVuIFZNUyBDLUtlcm1pdCBpcwogICBleGNoYW5naW5nIGZpbGVzIHdpdGggYSBub24tVk1TIEtlcm1pdCBwcm9ncmFtLCBzaW5jZSBWTVMtdG8tVk1TCiAgIHRyYW5zZmVycyB1c2UgbGFiZWxlZCBtb2RlIHVubGVzcyB5b3UgaGF2ZSBnb25lIG91dCBvZiB5b3VyIHdheSB0bwogICBkZWZlYXQgaXQuCgogICBFeGFtcGxlOiBZb3Ugd2FudCB0byBzZW5kIGFsbCB2ZXJzaW9ucyBvZiBhbGwgZmlsZXMgaW4gdGhlIGN1cnJlbnQKICAgZGlyZWN0b3J5IGZyb20gYSBWTVMgQy1LZXJtaXQgY2xpZW50IHRvIGEgVU5JWCBDLUtlcm1pdCBzZXJ2ZXIuIFVzZToKCiAgc2V0IHNlbmQgdmVyc2lvbi1udW1iZXJzIG9uCiAgc2VuZCAqLio7KgoKICAgVGhlIHJlc3VsdGluZyBVbml4IGZpbGVzIHdpbGwgaGF2ZSBWTVMtc3R5bGUgdmVyc2lvbiBudW1iZXJzIGFzIHBhcnQKICAgb2YgdGhlaXIgbmFtZSwgZm9yIGV4YW1wbGUgImZvby5iYXI7MSIsICJmb28uYmFyOzIiLCBldGMuCgogICBOb3cgc3VwcG9zZSB5b3Ugd2FudCB0byBzZW5kIHRoZXNlIGZpbGVzIGZyb20gVW5peCB0byBhbm90aGVyIFZNUwogICBzeXN0ZW0gYW5kIHByZXNlcnZlIHRoZSB2ZXJzaW9uIG51bWJlcnMuIEFnYWluIHdlIGhhdmUgYSBVbml4IEMtS2VybWl0CiAgIHNlcnZlciBhbmQgVk1TIEMtS2VybWl0IGNsaWVudC4gR2l2ZSB0aGVzZSBjb21tYW5kcyB0byB0aGUgY2xpZW50OgoKICBzZXQgcmVjZWl2ZSB2ZXJzaW9uLW51bWJlcnMgb24KICBnZXQgKgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4wLjguIFRoZSBTRVQgeyBTRU5ELCBSRUNFSVZFIH0geyBNT1ZFLVRPLCBSRU5BTUUtVE8gfSBDb21tYW5kcwoKICAgVGhlc2UgY29tbWFuZHMgYXJlIHBlcnNpc3RlbnQgZ2xvYmFsIHZlcnNpb25zIG9mIHRoZSAvTU9WRS1UTzogYW5kCiAgIC9SRU5BTUUtVE86IHN3aXRjaGVzIG9mIHRoZSBTRU5ELCBHRVQsIGFuZCBSRUNFSVZFIGNvbW1hbmRzLiBUaGV5CiAgIHNob3VsZCBub3JtYWxseSBiZSB1c2VkIG9ubHkgd2hlbiBzZXR0aW5nIHVwIGEgZGVkaWNhdGVkCiAgIHRyYW5zYWN0aW9uLXByb2Nlc3NpbmcgYXBwbGljYXRpb24sIGluIHdoaWNoIGVhY2ggZmlsZSBpcyB0byBiZSBtb3ZlZAogICBvciByZW5hbWVkIGltbWVkaWF0ZWx5IGFmdGVyLCBhbmQgb25seSBpZiwgaXQgaXMgdHJhbnNmZXJyZWQKICAgc3VjY2Vzc2Z1bGx5LCBzbyB0aGF0IChmb3IgZXhhbXBsZSkgYW4gaW5kZXBlbmRlbnQsIGNvbmN1cnJlbnQgcHJvY2VzcwogICBjYW4gbm90aWNlIHdoZW4gbmV3IGZpbGVzIGFwcGVhciBhbmQgcHJvY2VzcyB0aGVtIGltbWVkaWF0ZWx5IHdpdGhvdXQKICAgaGF2aW5nIHRvIGd1ZXNzIHdoZXRoZXIgdGhleSBhcmUgY29tcGxldGUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjAuOS4gU0VUIEZJTEUgSU5DT01QTEVURSBBVVRPCgogICBTRVQgRklMRSBJTkNPTVBMRVRFIHsgS0VFUCwgRElTQ0FSRCB9LCB3aGljaCB0ZWxscyB3aGV0aGVyIHRvIGtlZXAgb3IKICAgZGlzY2FyZCBpbmNvbXBsZXRlbHkgcmVjZWl2ZWQgZmlsZXMsIGhhcyBhIG5ldyBvcHRpb24sIEFVVE8sIHdoaWNoIGlzCiAgIGFsc28gdGhlIGRlZmF1bHQuIEl0IG1lYW5zIEtFRVAgdGhlIGluY29tcGxldGUgZmlsZSBpZiB0aGUgdHJhbnNmZXIgaXMKICAgaW4gYmluYXJ5IG1vZGUsIG90aGVyd2lzZSBESVNDQVJEIGl0LiBUaGlzIHJlZHVjZXMgdGhlIGNoYW5jZXMgdGhhdCBhCiAgIHN1YnNlcXVlbnQgcmVjb3Zlcnkgb3BlcmF0aW9uIChSRVNFTkQsIFJFR0VULCBldGMpIGNvdWxkIHByb2R1Y2UgYQogICBjb3JydXB0IGZpbGUsIHNpbmNlIHJlY292ZXJ5IHdvcmtzIG9ubHkgZm9yIGJpbmFyeS1tb2RlIHRyYW5zZmVycy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA0LjEuIEZJTEUtVFJBTlNGRVIgRklMRU5BTUUgVEVNUExBVEVTCgogICBGaWxlLXRyYW5zZmVyIGZpbGVuYW1lIHRlbXBsYXRlcyBhbGxvdyBmaWxlcyB0byBiZSByZW5hbWVkCiAgIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGZpbGUgc2VuZGVyLCB0aGUgcmVjZWl2ZXIsIG9yIGJvdGgsIGR1cmluZwogICB0cmFuc2ZlciBvZiBncm91cHMgb2YgZmlsZXMuCgogICAgNC4xLjEuIFRlbXBsYXRlcyBpbiB0aGUgQXMtTmFtZQoKICAgUHJpb3IgdG8gQy1LZXJtaXQgNi4xIGFuZCBLZXJtaXQgOTUgMS4xLjEyIHRoZSBvbmx5IG9wdGlvbnMgdGhhdCBjb3VsZAogICBiZSB1c2VkIHRvIGFmZmVjdCB0aGUgbmFtZXMgb2YgZmlsZXMgYmVpbmcgdHJhbnNmZXJyZWQgd2VyZSBTRVQKICAgRklMRU5BTUVTIHsgTElURVJBTCwgQ09OVkVSVEVEIH0gYW5kIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfSBQQVRITkFNRVMgewogICBPTiwgT0ZGIH0sIHBsdXMgdGhlICJhcy1uYW1lIiBmZWF0dXJlIG9mIHRoZSBTRU5EIChNT1ZFLCBldGMpIGFuZAogICBSRUNFSVZFIGNvbW1hbmRzLgoKICAgUHJldmlvdXNseSwgdGhlIGFzLW5hbWUgY291bGQgYmUgdXNlZCBvbmx5IGZvciBhIHNpbmdsZSBmaWxlLiBGb3IKICAgZXhhbXBsZToKCiAgU0VORCBGT08gQkFSCgogICB3b3VsZCBzZW5kIHRoZSBmaWxlIEZPTyB1bmRlciB0aGUgbmFtZSBCQVIsIGJ1dDoKCiAgU0VORCAqLlRYVCBhbnl0aGluZwoKICAgd2FzIG5vdCBhbGxvd2VkLCBzaW5jZSBpdCB3b3VsZCBnaXZlIHRoZSBzYW1lIG5hbWUgdG8gZWFjaCBmaWxlIHRoYXQKICAgd2FzIHNlbnQuIFdoZW4gcmVjZWl2aW5nOgoKICBSRUNFSVZFIEZPTwoKICAgd291bGQgcmVuYW1lIHRoZSBmaXJzdCBpbmNvbWluZyBmaWxlIHRvIEZPTyBiZWZvcmUgc3RvcmluZyBpdCBvbiB0aGUKICAgZGlzaywgYnV0IHN1YnNlcXVlbnQgZmlsZXMgd291bGQgbm90IGJlIHJlbmFtZWQgdG8gRk9PLCBzaW5jZSB0aGlzCiAgIHdvdWxkIHJlc3VsdCBpbiBvdmVyd3JpdGluZyB0aGUgc2FtZSBmaWxlIHJlcGVhdGVkbHkuIEluc3RlYWQsIHRoZXkKICAgd2VyZSBzdG9yZWQgdW5kZXIgdGhlIG5hbWVzIHRoZXkgYXJyaXZlZCB3aXRoLgoKICAgQmVnaW5uaW5nIGluIEMtS2VybWl0IDYuMSBhbmQgS2VybWl0IDk1IDEuMS4xMiwgaXQgaXMgcG9zc2libGUgdG8KICAgc3BlY2lmeSBhcy1uYW1lcyBpbiBTRU5ELCBSRUNFSVZFLCBhbmQgcmVsYXRlZCBjb21tYW5kcyBldmVuIGZvciBmaWxlCiAgIGdyb3Vwcy4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgYnkgdXNpbmcgcmVwbGFjZW1lbnQgdmFyaWFibGVzIGluIHRoZQogICBhcy1uYW1lLCBhbG9uZyB3aXRoIG9wdGlvbmFsIG1hdGVyaWFsIHN1Y2ggY2hhcmFjdGVyLXN0cmluZyBmdW5jdGlvbnMKICAgYW5kL29yIGNvbnN0YW50IHN0cmluZ3MuIEFuIGFzLW5hbWUgY29udGFpbmluZyByZXBsYWNlbWVudCB2YXJpYWJsZXMKICAgaXMgY2FsbGVkIGEgZmlsZW5hbWUgdGVtcGxhdGUuCgogICBUaGUga2V5IHRvIGZpbGVuYW1lIHRlbXBsYXRlcyBpcyB0aGUgbmV3IHZhcmlhYmxlOgoKICBcdihmaWxlbmFtZSkKCiAgIER1cmluZyBmaWxlIHRyYW5zZmVyIGl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBuYW1lIG9mIGVhY2ggZmlsZSBjdXJyZW50bHkKICAgYmVpbmcgdHJhbnNmZXJyZWQgKGFmdGVyIHRyYW5zZmVyLCBpdCBpcyB0aGUgbmFtZSBvZiB0aGUgbGFzdCBmaWxlCiAgIHRyYW5zZmVycmVkKS4KCiAgIFNvLCBmb3IgZXhhbXBsZToKCiAgc2VuZCAqLnR4dCBcdihmaWxlbmFtZSkubmV3CgogICBzZW5kcyBlYWNoIGZpbGUgd2l0aCBpdHMgb3duIG5hbWUsIGJ1dCB3aXRoICIubmV3IiBhcHBlbmRlZCB0byBpdC4gT2YKICAgY291cnNlIGlmIHRoZSBuYW1lIGFscmVhZHkgY29udGFpbnMgcGVyaW9kcywgdGhpcyBjb3VsZCBjb25mdXNlIHRoZQogICBmaWxlIHJlY2VpdmVyLCBzbyB5b3UgY2FuIGFsc28gYWNoaWV2ZSBmYW5jaWVyIGVmZmVjdHMgd2l0aAogICBjb25zdHJ1Y3Rpb25zIGxpa2U6CgogIHNlbmQgKi50eHQgXGZyZXBsYWNlKFx2KGZpbGVuYW1lKSwuLF8pLm5ldwoKICAgd2hpY2ggcmVwbGFjZXMgYWxsIHBlcmlvZHMgaW4gdGhlIG9yaWdpbmFsIGZpbGVuYW1lIGJ5IHVuZGVyc2NvcmVzLAogICBhbmQgdGhlbiBhcHBlbmRzICIubmV3IiB0byB0aGUgcmVzdWx0LiBTbywgZm9yIGV4YW1wbGUsIG9vZmEudHh0IHdvdWxkCiAgIGJlIHNlbnQgYXMgb29mYV90eHQubmV3LgoKICAgQW5vdGhlciBuZXcgdmFyaWFibGUgdGhhdCBpcyB1c2VmdWwgaW4gdGhpcyByZWdhcmQgaXMgXHYoZmlsZW51bWJlciksCiAgIHdoaWNoIGlzIHRoZSBvcmRpbmFsIG51bWJlciBvZiB0aGUgY3VycmVudCBmaWxlIGluIHRoZSBmaWxlIGdyb3VwLCBzbwogICB5b3UgY2FuIGFsc286CgogIHNlbmQgKi50eHQgRklMRVxmbHBhZChcdihmaWxlbnVtKSwyLDApCgogICByZXN1bHRpbmcgaW4gYSBzZXJpZXMgb2YgZmlsZXMgY2FsbGVkIEZJTEUwMCwgRklMRTAxLCBGSUxFMDIsIGV0Yy4gKEF0CiAgIHRoZSBlbmQgb2YgdGhlIHRyYW5zZmVyLCBcdihmaWxlbnVtKSB0ZWxscyB0aGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQKICAgd2VyZSB0cmFuc2ZlcnJlZCkuCgogICBJZiB5b3Ugc3BlY2lmeSBhIGNvbnN0YW50IGFzLW5hbWUgd2hlbiBzZW5kaW5nIGEgZmlsZSBncm91cDoKCiAgc2VuZCAqLnR4dCB0aGlzbmFtZW9ubHkKCiAgIEtlcm1pdCBjb21wbGFpbnMgYW5kIGFza3MgeW91IHRvIGluY2x1ZGUgcmVwbGFjZW1lbnQgdmFyaWFibGVzIGluIHRoZQogICBhcy1uYW1lLiBZb3Ugc2hvdWxkIGdlbmVyYWxseSB1c2UgXHYoZmlsZW5hbWUpIG9yIFx2KGZpbGVudW1iZXIpIGZvcgogICB0aGlzIHB1cnBvc2UsIHNpbmNlIG90aGVyIHZhcmlhYmxlcyAod2l0aCB0aGUgcG9zc2libGUgZXhjZXB0aW9uIG9mCiAgIGRhdGUvdGltZSByZWxhdGVkIHZhcmlhYmxlcykgZG8gbm90IGNoYW5nZSBmcm9tIG9uZSBmaWxlIHRvIHRoZSBuZXh0LgogICBCdXQgS2VybWl0IGFjY2VwdHMgYW55IGFzLW5hbWUgYXQgYWxsIHRoYXQgY29udGFpbnMgYW55IGtpbmQgb2YKICAgdmFyaWFibGVzIGZvciBmaWxlIGdyb3VwLCBldmVuIGlmIHRoZSB2YXJpYWJsZSB3aWxsIG5vdCBjaGFuZ2UuIFNvOgoKICBzZW5kICoudHh0IFwlYQoKICAgaXMgYWNjZXB0ZWQsIGJ1dCBhbGwgZmlsZXMgYXJlIHNlbnQgd2l0aCB0aGUgc2FtZSBuYW1lICh0aGUgdmFsdWUgb2YKICAgXCVhLCBpZiBpdCBoYXMgb25lIGFuZCBpdCBpcyBjb25zdGFudCkuIElmIHRoZSB2YXJpYWJsZSBoYXMgbm8gdmFsdWUKICAgYXQgYWxsLCB0aGUgZmlsZXMgYXJlIHNlbnQgdW5kZXIgdGhlaXIgb3duIG5hbWVzLgoKICAgT2YgY291cnNlLCB0aGUgdmFsdWUgb2YgXCVhIGluIHRoZSBwcmV2aW91cyBleGFtcGxlIG5lZWQgbm90IGJlCiAgIGNvbnN0YW50OgoKICBkZWZpbmUgXCVhIEZJTEVcZmxwYWQoXHYoZmlsZW51bSksMiwwKV9hdF9cdih0aW1lKQogIHNlbmQgKi50eHQgXCVhCgogICBUaGUgUkVDRUlWRSBjb21tYW5kLCB3aGVuIGdpdmVuIHdpdGhvdXQgYW4gYXMtbmFtZSwgYmVoYXZlcyBhcyBhbHdheXMsCiAgIHN0b3JpbmcgYWxsIGluY29taW5nIGZpbGVzIHVuZGVyIHRoZSBuYW1lcyB0aGV5IGFycml2ZSB3aXRoLCBzdWJqZWN0CiAgIHRvIFNFVCBGSUxFIE5BTUUgYW5kIFNFVCBSRUNFSVZFIFBBVEhOQU1FUyBtb2RpZmljYXRpb25zIChbNDMzXVNlY3Rpb24KICAgNC4xMCkuCgogICBIb3dldmVyLCB3aGVuIGFuIGFzLW5hbWUgaXMgZ2l2ZW4gaW4gdGhlIFJFQ0VJVkUgY29tbWFuZCwgaXQgaXMKICAgYXBwbGllZCB0byBhbGwgaW5jb21pbmcgZmlsZXMgcmF0aGVyIHRoYW4gdG8ganVzdCB0aGUgZmlyc3QuIElmIGl0CiAgIGRvZXMgbm90IGNvbnRhaW4gcmVwbGFjZW1lbnQgdmFyaWFibGVzLCB0aGVuIHRoZSBjdXJyZW50IEZJTEUKICAgQ09MTElTSU9OIHNldHRpbmcgZ292ZXJucyB0aGUgcmVzdWx0LiBGb3IgZXhhbXBsZToKCiAgcmVjZWl2ZSBmb28KCiAgIHdpbGwgcmVzdWx0IGluIGluY29taW5nIGZpbGVzIG5hbWVkIGZvbywgZm9vLn4xfiwgZm9vLn4yfiwgYW5kIHNvIG9uLAogICB3aXRoIHRoZSBkZWZhdWx0IEZJTEUgQ09MTElTSU9OIHNldHRpbmcgb2YgQkFDS1VQLiBJZiBpdCBkb2VzIGNvbnRhaW4KICAgcmVwbGFjZW1lbnQgdmFyaWFibGVzLCBvZiBjb3Vyc2UgdGhleSBhcmUgdXNlZC4KCiAgIFdoZW4gcmVjZWl2aW5nIGZpbGVzLCB0aGUgXHYoZmlsZW5hbWUpIHZhcmlhYmxlIHJlZmVycyB0byB0aGUgbmFtZQogICB0aGF0IHdhcyByZWNlaXZlZCBpbiB0aGUgaW5jb21pbmcgZmlsZS1oZWFkZXIgcGFja2V0LCBCRUZPUkUgYW55CiAgIHByb2Nlc3NpbmcgYnkgU0VUIEZJTEUgTkFNRVMgb3IgU0VUIFJFQ0VJVkUgUEFUSE5BTUVTLiBTaW5jZSB0aGUKICAgZmlsZW5hbWVzIGluIGZpbGUtaGVhZGVyIHBhY2tldHMgYXJlIHVzdWFsbHkgaW4gdXBwZXJjYXNlLCB5b3Ugd291bGQKICAgbmVlZCB0byBjb252ZXJ0IHRoZW0gZXhwbGljaXRseSBpZiB5b3Ugd2FudCB0aGVtIGluIGxvd2VyY2FzZSwgZS5nLjoKCiAgcmVjZWl2ZSBcZmxvd2VyKFx2KGZpbGVuYW1lKSkubmV3CiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjEuMi4gVGVtcGxhdGVzIG9uIHRoZSBDb21tYW5kIExpbmUKCiAgIE9uIHRoZSBjb21tYW5kLWxpbmUsIHVzZSB0ZW1wbGF0ZXMgYXMgc2hvd24gYWJvdmUgYXMgdGhlIC1hIG9wdGlvbgogICBhcmd1bWVudCwgYmVhcmluZyBpbiBtaW5kIHRoZSBwcm9wZW5zaXR5IG9mIFVOSVggYW5kIHBlcmhhcHMgb3RoZXIKICAgc2hlbGxzIHRvIHRyZWF0IGJhY2tzbGFzaCBhcyBhIHNoZWxsIGVzY2FwZSBjaGFyYWN0ZXIuIFNvIGluIFVOSVggKGZvcgogICBleGFtcGxlKToKCiAga2VybWl0IC1zIG9vZmEuKiAtYSB4LlxcdihmaWxlbnVtKQoKICAgQnkgdGhlIHdheSwgdGhpcyByZXByZXNlbnRzIGEgY2hhbmdlIGZyb20gNi4wIGFuZCBlYXJsaWVyIHJlbGVhc2VzIGluCiAgIHdoaWNoIHRoZSBhcy1uYW1lICgtYSBhcmd1bWVudCBvciBvdGhlcndpc2UpIHdhcyBub3QgZXZhbHVhdGVkIGJ5IHRoZQogICBjb21tYW5kIHBhcnNlci4gVGh1cywgZm9yIGV4YW1wbGUsIGluIFZNUyAod2hlcmUgdGhlIHNoZWxsIGRvZXMgbm90CiAgIGNhcmUgYWJvdXQgYmFja3NsYXNoZXMpLCBpdCB3YXMgcG9zc2libGUgdG86CgogIGtlcm1pdCAtcyBvb2ZhLnR4dCAtYSBjOlx0bXBcb29mYS50eHQKCiAgIE5vdyBiYWNrc2xhc2hlcyBpbiB0aGUgYXMtbmFtZSBtdXN0IGJlIHF1b3RlZCBub3Qgb25seSBmb3IgdGhlIHNoZWxsCiAgIChpZiBuZWNlc3NhcnkpIGJ1dCBhbHNvIGZvciBLZXJtaXQgaXRzZWxmOgoKICBrZXJtaXQgLXMgb29mYS50eHQgLWEgYzpcXHRtcFxcb29mYS50eHQgICAgICA7IEtlcm1pdCBvbmx5CiAga2VybWl0IC1zIG9vZmEudHh0IC1hIGM6XFxcXHRtcFxcXFxvb2ZhLnR4dCAgOyBTaGVsbCBhbmQgS2VybWl0CgogICBZb3UgY2FuIGFsc28gdXNlIHRoZSBcZmxpdGVyYWwoKSBmdW5jdGlvbiBmb3IgdGhpczoKCiAga2VybWl0IC1zIG9vZmEudHh0IC1hIFxmbGl0ZXJhbChjOlx0bXBcb29mYS50eHQpICAgICAgOyBLZXJtaXQgb25seQogIGtlcm1pdCAtcyBvb2ZhLnR4dCAtYSBcXGZsaXRlcmFsKGM6XFx0bXBcXG9vZmEudHh0KSAgIDsgU2hlbGwgYW5kIEtlcm1pdAogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4xLjMuIFBvc3QtVHJhbnNmZXIgUmVuYW1pbmcKCiAgIEZpbGVuYW1lIHRlbXBsYXRlcyBhcmUgbm93IGFsc28gdXNlZnVsIGluIFNFVCB7IFNFTkQsIFJFQ0VJVkUgfQogICBSRU5BTUUtVE8gYW5kIGluIHRoZSAvUkVOQU1FLVRPOiBzd2l0Y2gsIHRoYXQgY2FuIGJlIGdpdmVuIHRvIHRoZQogICBTRU5ELCBHRVQsIG9yIFJFQ0VJVkUgY29tbWFuZHM7IHRoaXMgaXMgc2ltaWxhciB0byBhbiBhcy1uYW1lLCBidXQgaXMKICAgZWZmZWN0aXZlIG9uIGEgcGVyLWZpbGUgYmFzaXMgaWYgYW5kIG9ubHkgaWYgdGhlIGZpbGUgd2FzIHRyYW5zZmVycmVkCiAgIHN1Y2Nlc3NmdWxseS4KCiAgIE1PVkUtVE8gYW5kIFJFTkFNRS1UTyBhZGRyZXNzIGEgcmVxdWlyZW1lbnQgY29tbW9ubHkgc3RhdGVkIGZvcgogICB0cmFuc2FjdGlvbiBwcm9jZXNzaW5nIGFuZCBzaW1pbGFyIHN5c3RlbXMuIFN1cHBvc2UsIGZvciBleGFtcGxlLCBhCiAgIGNlbnRyYWwgc3lzdGVtICJYIiBhY2NlcHRzIGNvbm5lY3Rpb25zIGZyb20gbXVsdGlwbGUgY2xpZW50cwogICBzaW11bHRhbmVvdXNseTsgYSBwcm9jZXNzIG9uIFggd2FpdHMgZm9yIGEgZmlsZSB0byBhcHBlYXIgYW5kIHRoZW4KICAgcHJvY2Vzc2VzIHRoZSBmaWxlLiBUaGlzIHByb2Nlc3MgbXVzdCBoYXZlIGEgd2F5IG9mIGtub3dpbmcgd2hlbiB0aGUKICAgZmlsZSBoYXMgYmVlbiBjb21wbGV0ZWx5IGFuZCBzdWNjZXNzZnVsbHkgdHJhbnNmZXJyZWQgYmVmb3JlIGl0IHN0YXJ0cwogICB0byBwcm9jZXNzIGl0LiBUaGlzIGNhbiBiZSBhY2NvbXBsaXNoZWQgZWFzaWx5IHVzaW5nIEMtS2VybWl0J3MgU0VUIHsKICAgU0VORCwgUkVDRUlWRSB9IHsgTU9WRS1UTywgUkVOQU1FLVRPIH0gY29tbWFuZCBvciAvTU9WRS1UTzogb3IKICAgL1JFTkFNRS1UTzogc3dpdGNoZXMsIGRlc2NyaWJlZCBpbiBbNDM0XVNlY3Rpb25zIDQuNy4xIHRocm91Z2gKICAgWzQzNV00LjcuMy4KCiAgIEhlcmUncyBhbiBleGFtcGxlIGZvciB0aGUgY2xpZW50IHNpZGUsIGluIHdoaWNoIGZpbGVzIHRvIGJlIHNlbnQgYXJlCiAgIHBsYWNlZCBpbiBhIGNlcnRhaW4gZGlyZWN0b3J5ICgvdXNyL29sZ2EvdG9zZW5kIGluIHRoaXMgZXhhbXBsZSkgYnkKICAgYW5vdGhlciBwcm9jZXNzIHdoZW4gdGhleSBhcmUgcmVhZHkgdG8gZ28uIFRoaXMgbWlnaHQgYmUgaW4gYSBob3NwaXRhbAogICBvciBiaWcgZG9jdG9yJ3Mgb2ZmaWNlLCB3aGVyZSBtZWRpY2FsIGluc3VyYW5jZSBjbGFpbXMgYXJlIGVudGVyZWQgYXQKICAgYSBudW1iZXIgb2Ygd29ya3N0YXRpb25zLCBhbmQgdGhlbiBkZXBvc2l0ZWQgaW4gdGhlICJ0b3NlbmQiCiAgIGRpcmVjdG9yeSwgZnJvbSB3aGljaCB0aGV5IGFyZSBzZW50IHRvIGEgY2xhaW1zIGNsZWFyaW5naG91c2UuIFdlCiAgIGFzc3VtZSB0aGUgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG1hZGUgYW5kIGEgS2VybWl0IHNlcnZlciBpcyBvbiB0aGUKICAgb3RoZXIgZW5kLgoKICBsb2NhbCBzcmNkaXIgZmluZGlyICAgICAgICAgICAgICA7IERlY2xhcmUgbG9jYWwgKGF1dG9tYXRpYykgdmFyaWFibGVzCiAgYXNzaWduIHNyY2RpciAvdXNyL29sZ2EvdG9zZW5kICAgOyBMb2NhbCBzb3VyY2UgZGlyZWN0b3J5IChmaWxlcyB0byBzZW5kKQogIGFzc2lnbiBmaW5kaXIgL3Vzci9vbGdhL3NlbnQgICAgIDsgV2hlcmUgdG8gbW92ZSBmaWxlcyBhZnRlciB0aGV5IGFyZSBzZW50CiAgbG9nIHRyYW5zYWN0aW9ucyAgICAgICAgICAgICAgICAgOyBLZWVwIGEgbG9nIG9mIHRyYW5zZmVycwogIGNkIFxtKHNyY2RpcikgICAgICAgICAgICAgICAgICAgIDsgQ2hhbmdlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5CiAgd2hpbGUgdHJ1ZSB7ICAgICAgICAgICAgICAgICAgICAgOyBMb29wIGZvcmV2ZXIuLi4KICAgICAgc2VuZCAvbW92ZS10bzpcbShmaW5kaXIpICogICA7IFNlbmQgYWxsIGZpbGVzCiAgICAgIHNsZWVwIDYwICAgICAgICAgICAgICAgICAgICAgOyBTbGVlcCBhIG1pbnV0ZQogIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgR28gYmFjayBhbmQgZG8gaXQgYWdhaW4KCiAgIE5vdGUgaG93IHNpbXBsZSB0aGlzIGlzLiBPbmNlIGVhY2ggZmlsZSBpcyBzZW50LCBpdCBpcyBtb3ZlZCBzbyBpdAogICB3b24ndCBiZSBzZW50IGFnYWluICh5b3UgY291bGQgYWxzbyB1c2UgU0VORCAvUkVOQU1FLVRPOiBvciBldmVuIFNFTkQKICAgL0RFTEVURSkuIElmIGEgdHJhbnNmZXIgZmFpbHMsIHRoZSBmaWxlIGlzIG5vdCBtb3ZlZCBhbmQgc28gd2UgdHJ5CiAgIGFnYWluIHRvIHNlbmQgaXQgbmV4dCB0aW1lIGFyb3VuZC4gSWYgdGhlcmUgYXJlIG5vIGZpbGVzIHRvIHNlbmQsIHRoZQogICBTRU5EIGNvbW1hbmQgZG9lcyBub3RoaW5nIGJ1dCBhIG1lc3NhZ2UgaXMgcHJpbnRlZDsgeW91IGNhbiBhdm9pZCB0aGUKICAgbWVzc2FnZSBieSBjaGVja2luZyBmaXJzdCB0byBzZWUgaWYgYW55IGZpbGVzIGFyZSBpbiB0aGUgZGlyZWN0b3J5OgoKICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICA7IExvb3AgZm9yZXZlci4uLgogICAgICBpZiA+IFxmZmlsZXMoKikgMCAtICAgICAgICAgIDsgSWYgdGhlcmUgYXJlIGFueSBmaWxlcwogICAgICAgIHNlbmQgL21vdmUtdG86XG0oZmluZGlyKSAqIDsgc2VuZCB0aGVtLgogICAgICBzbGVlcCA2MCAgICAgICAgICAgICAgICAgICAgIDsgU2xlZXAgYSBtaW51dGUuCiAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBHbyBiYWNrIGFuZCBkbyBpdCBhZ2Fpbi4KCiAgIEl0J3MgZXZlbiBzaW1wbGVyIG9uIHRoZSBzZXJ2ZXIgc2lkZSAoaGVyZSBhZ2FpbiB3ZSBhc3N1bWUgdGhlCiAgIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBwbGFjZSk6CgogIGxvY2FsIHJjdmRpciBmaW5kaXIgICAgICAgICAgICAgIDsgRGVjbGFyZSBsb2NhbCAoYXV0b21hdGljKSB2YXJpYWJsZXMKICBhc3NpZ24gcmN2ZGlyIC91c3IvaXZhbi90bXAgICAgICA7IFRlbXBvcmFyeSByZWNlaXZpbmcgZGlyZWN0b3J5CiAgYXNzaWduIGZpbmRpciAvdXNyL2l2YW4vbmV3ICAgICAgOyBXaGVyZSB0byBtb3ZlIGZpbGVzIGFmdGVyIHJlY2VwdGlvbgogIGxvZyB0cmFuc2FjdGlvbnMgICAgICAgICAgICAgICAgIDsgS2VlcCBhIGxvZyBvZiB0cmFuc2ZlcnMKICBjZCBcbShyY3ZkaXIpICAgICAgICAgICAgICAgICAgICA7IENoYW5nZSB0byB0aGUgc291cmNlIGRpcmVjdG9yeQogIHNldCByZWNlaXZlIG1vdmUtdG8gXG0oZmluZGlyKSAgIDsgRGVjbGFyZSBtb3ZlLXRvIGRpcmVjdG9yeS4KICBzZXJ2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEVudGVyIHNlcnZlciBtb2RlLgoKICAgQSBzZXBhcmF0ZSBwcm9jZXNzIChlLmcuIHRoZSBtZWRpY2FsIGNsYWltLWZvcm0gZGVjb2RlcikgY2FuIGxvb2sgZm9yCiAgIGZpbGVzIGFwcGVhcmluZyBpbiB0aGUgL3Vzci9pdmFuL25ldyBkaXJlY3RvcnkgYW5kIHByb2Nlc3MgdGhlbSB3aXRoCiAgIGV2ZXJ5IGNvbmZpZGVuY2UgdGhhdCB0aGV5IGhhdmUgYmVlbiBjb21wbGV0ZWx5IHJlY2VpdmVkLgoKICAgTm90ZSB0aGF0IHRoZSB1c2Ugb2YgTU9WRS1UTyBjYW4gcmVzdWx0IGluIG1vdmVkIGZpbGVzIG92ZXJ3cml0aW5nIG9uZQogICBhbm90aGVyICh0aGUgYXBwbGljYXRpb24gd291bGQgbm9ybWFsbHkgYXZvaWQgdGhpcyBieSBhc3NpZ25pbmcgZWFjaAogICB0cmFuc2FjdGlvbiBhIHVuaXF1ZSwgZS5nLiBiYXNlZCBvbiBjdXN0b21lciBudW1iZXIgYW5kIGNsYWltIG51bWJlcikuCiAgIEJ1dCBpZiBmaWxlbmFtZSBjb2xsaXNpb25zIGFyZSBhIHBvc3NpYmlsaXR5IGluIHlvdXIgYXBwbGljYXRpb24sCiAgIFJFTkFNRS1UTyBtaWdodCBiZSBhIGJldHRlciBjaG9pY2U7IHlvdSBjYW4gdXNlIGFueSB2YXJpYWJsZXMgeW91IGxpa2UKICAgaW4gdGhlIHRlbXBsYXRlIHRvIGVuc3VyZSB1bmlxdWVuZXNzIG9mIHRoZSBSRU5BTUUtVE8gZmlsZW5hbWU7IGZvcgogICBleGFtcGxlOgoKICBTRVQgUkVDRUlWRSBSRU5BTUUtVE8gXHYoZmlsZW5hbWUpX1x2KG5kYXRlKV9cdihudGltZSlfXHYodXNlcmlkKV9cdihwaWQpCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4yLiBGSUxFLVRSQU5TRkVSIFBJUEVTIEFORCBGSUxURVJTCgogICAgNC4yLjEuIElOVFJPRFVDVElPTgoKICAgQmVnaW5uaW5nIGluIEMtS2VybWl0IDYuMSBhbmQgS2VybWl0IDk1IDEuMS4xMiwgaXQgaXMgcG9zc2libGUgdG8gc2VuZAogICBmcm9tIGEgY29tbWFuZCwgb3IgInBpcGUiLCBhcyB3ZWxsIGFzIGZyb20gYSBmaWxlLCBhbmQgdG8gcmVjZWl2ZSB0byBhCiAgIHBpcGUgb3IgY29tbWFuZC4gSW4gYSB0eXBpY2FsIGV4YW1wbGUsIHdlIG1pZ2h0IHdhbnQgdG8gdHJhbnNmZXIgYW4KICAgZW50aXJlIGRpcmVjdG9yeSB0cmVlIGZyb20gb25lIFVOSVggc3lzdGVtIHRvIGFub3RoZXIgKGJ1dCB3aXRob3V0CiAgIHVzaW5nIHRoZSBtZXRob2RzIGRlc2NyaWJlZCBpbiBbNDM2XVNlY3Rpb25zIDQuMyAsIFs0MzddNC4xMCwKICAgWzQzOF00LjExLCBhbmQgWzQzOV00LjE1KS4gV2UgY291bGQgZG8gdGhpcyBpbiBtdWx0aXBsZSBzdGVwcyBhcwogICBmb2xsb3dzOgoKICAxLiBDcmVhdGUgYSB0YXIgYXJjaGl2ZSBvZiB0aGUgZGVzaXJlZCBkaXJlY3RvcnkgdHJlZQogIDIuIENvbXByZXNzIHRoZSB0YXIgYXJjaGl2ZQogIDMuIFRyYW5zZmVyIGl0IGluIGJpbmFyeSBtb2RlIHRvIHRoZSBvdGhlciBjb21wdXRlcgogIDQuIERlY29tcHJlc3MgaXQKICA1LiBFeHRyYWN0IHRoZSBkaXJlY3RvcnkgdHJlZSBmcm9tIHRoZSB0YXIgYXJjaGl2ZQoKICAgQnV0IHRoaXMgaXMgaW5jb252ZW5pZW50IGFuZCBpdCByZXF1aXJlcyBhIHRlbXBvcmFyeSBmaWxlLCB3aGljaCBtaWdodAogICBiZSBsYXJnZXIgdGhhbiB3ZSBoYXZlIHJvb20gZm9yLgoKICAgVGhlIG5ldyBwaXBlLXRyYW5zZmVyIGZlYXR1cmUgbGV0cyB5b3UgZG8gc3VjaCB0aGluZ3MgaW4gYSBzaW5nbGUKICAgc3RlcCwgYW5kIHdpdGhvdXQgaW50ZXJtZWRpYXRlIGZpbGVzLgoKICAgQWRkaXRpb25hbCBuZXcgZmVhdHVyZXMsIGFsc28gZGlzY3Vzc2VkIGhlcmUsIGxldCB5b3Ugc3BlY2lmeSBwcmUtIGFuZAogICBwb3N0LSBwcm9jZXNzaW5nIGZpbHRlcnMgZm9yIG91dGJvdW5kIGFuZCBpbmNvbWluZyBmaWxlcywgYW5kIGdpdmUgeW91CiAgIGEgd2F5IHRvIGluc2VydCB0aGUgb3V0cHV0IGZyb20gc2hlbGwgb3Igc3lzdGVtIGNvbW1hbmRzIGludG8gQy1LZXJtaXQKICAgY29tbWFuZHMuCgogICBUaGUgZmlsZS10cmFuc2ZlciByZWxhdGVkIGZlYXR1cmVzIGFyZSBhdmFpbGFibGUgb25seSB3aXRoIEtlcm1pdAogICBwcm90b2NvbCwgbm90IHdpdGggYW55IGV4dGVybmFsIHByb3RvY29scywgbm9yIHdpdGggSzk1J3MgYnVpbHQtaW4KICAgWFlaTU9ERU0gcHJvdG9jb2xzIChiZWNhdXNlIFhZWk1PREVNIHJlY292ZXJzIGZyb20gdHJhbnNtaXNzaW9uIGVycm9ycwogICBieSByZXdpbmRpbmcgdGhlIHNvdXJjZSBmaWxlLCBhbmQgeW91IGNhbid0IHJld2luZCBhIHBpcGUpLgoKICAgVGhpcyBzZWN0aW9uIGJlZ2lucyBieSBkaXNjdXNzaW5nIHRoZSBzaW1wbGUgYW5kIHN0cmFpZ2h0Zm9yd2FyZCB1c2UKICAgb2YgdGhlc2UgZmVhdHVyZXMgaW4gVU5JWCwgaW4gd2hpY2ggcGlwZXMgYW5kIGlucHV0L291dHB1dCByZWRpcmVjdGlvbgogICBhcmUgYSBmdW5kYW1lbnRhbCBjb21wb25lbnQgYW5kIHRoZXJlZm9yZSAianVzdCB3b3JrIiwgYW5kIHRoZW4gZ29lcwogICBvbiB0byBkaXNjdXNzIHRoZWlyIG9wZXJhdGlvbiBpbiBXaW5kb3dzIGFuZCBPUy8yLCB3aGVyZSBtYXR0ZXJzIGFyZQogICBtdWNoIG1vcmUgY29tcGxpY2F0ZWQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIuMS4xLiBURVJNSU5PTE9HWQoKICAgU3RhbmRhcmQgSW5wdXQKICAgICAgICAgIFRoaXMgaXMgYSBwcmVjaXNlIHRlY2huaWNhbCB0ZXJtIGRlbm90aW5nIHRoZSBub3JtYWwgc291cmNlIG9mCiAgICAgICAgICBpbnB1dCBmb3IgYSBjb21tYW5kIG9yIHByb2dyYW0sIHdoaWNoIGlzIHRoZSBrZXlib2FyZCBvZiB5b3VyCiAgICAgICAgICB0ZXJtaW5hbCBieSBkZWZhdWx0LCBidXQgd2hpY2ggY2FuIGJlIHJlZGlyZWN0ZWQgdG8gYSBmaWxlIG9yCiAgICAgICAgICBwaXBlLgoKICAgU3RkaW4KICAgICAgICAgIEFiYnJldmlhdGlvbiBmb3IgU3RhbmRhcmQgSW5wdXQuCgogICBTdGFuZGFyZCBPdXRwdXQKICAgICAgICAgIEEgcHJlY2lzZSB0ZWNobmljYWwgdGVybSBkZW5vdGluZyB0aGUgbm9ybWFsIGRlc3RpbmF0aW9uIGZvcgogICAgICAgICAgb3V0cHV0IGZyb20gYSBjb21tYW5kIG9yIHByb2dyYW0sIHdoaWNoIGlzIHlvdXIgdGVybWluYWwgc2NyZWVuCiAgICAgICAgICBieSBkZWZhdWx0LCBidXQgd2hpY2ggY2FuIGJlIHJlZGlyZWN0ZWQgdG8gYSBmaWxlLgoKICAgU3Rkb3V0CiAgICAgICAgICBBYmJyZXZpYXRpb24gZm9yIFN0YW5kYXJkIE91dHB1dC4KCiAgIFN0ZGlvCiAgICAgICAgICBBYmJyZXZpYXRpb24gZm9yIFN0YW5kYXJkIElucHV0IC8gU3RhbmRhcmQgT3V0cHV0LgoKICAgSS9PCiAgICAgICAgICBBYmJyZXZpYXRpb24gZm9yIElucHV0IC8gT3V0cHV0LgoKICAgU2hlbGwKICAgICAgICAgIFRleHQtYmFzZWQgc3lzdGVtIGNvbW1hbmQgcHJvY2Vzc29yLCBzdWNoIGFzIHRoZSBVTklYIHNoZWxsLAogICAgICAgICAgRE9TIENPTU1BTkQuQ09NLCBldGMuCgogICBQaXBlCiAgICAgICAgICBBIG1lY2hhbmlzbSBieSB3aGljaCB0aGUgc3RhbmRhcmQgb3V0cHV0IG9mIG9uZSBwcm9ncmFtIGlzIHNlbnQKICAgICAgICAgIHRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiBhbm90aGVyLgoKICAgUGlwZWxpbmUKICAgICAgICAgIEEgc2VyaWVzIG9mIHByb2dyYW1zIGNvbm5lY3RlZCBieSBwaXBlcy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMi4xLjIuIE5PVEFUSU9OCgogICBJbiBjb21tYW5kIGRlc2NyaXB0aW9ucywgImNvbW1hbmQiIGlzIHJlcGxhY2VkIGJ5IGEgc2hlbGwgb3Igc3lzdGVtCiAgIGNvbW1hbmQgb3IgcGlwZWxpbmUuIFRoZSBjb21tYW5kIG5hbWVzIHNwZWNpZmllZCBpbiB0aGVzZSBjb21tYW5kcyBhcmUKICAgaW50ZXJwcmV0ZWQgYnkgeW91ciBzaGVsbCwganVzdCBhcyBpZiB5b3Ugd2VyZSB0eXBpbmcgdGhlbSBhdCB0aGUKICAgc2hlbGwgcHJvbXB0LCBhbmQgc28gaWYgdGhleSBhcmUgaW4geW91ciBQQVRILCB0aGV5IHdpbGwgYmUgZm91bmQgaW4KICAgdGhlIGV4cGVjdGVkIG1hbm5lci4gVGhlcmVmb3JlIHlvdSBkb24ndCBoYXZlIHRvIHNwZWNpZnkgY29tcGxldGUKICAgcGF0aG5hbWVzIGZvciBjb21tYW5kcyB0aGF0IGFyZSBwcm9ncmFtcyAoYnV0IGl0IHNob3VsZG4ndCBodXJ0IGlmIHlvdQogICBkbykuCgogICBUaGUgbm9ybWFsIG5vdGF0aW9uIGZvciBJL08gcmVkaXJlY3Rpb24gaXMgYXMgZm9sbG93czoKCiAgPCAgUmVhZCBTdGRpbiBmcm9tIHRoZSBnaXZlbiBmaWxlLgogID4gIFNlbmQgU3Rkb3V0IHRvIHRoZSBnaXZlbiBmaWxlLgogIHwgIFNlbmQgU3Rkb3V0IGZyb20gdGhlIGNvbW1hbmQgb24gdGhlIGxlZnQgdG8gdGhlIGNvbW1hbmQgb24gdGhlIHJpZ2h0LgoKICAgRXhhbXBsZXM6CgogICBzb3J0IDwgZm9vID4gYmFyCiAgICAgICAgICBTb3J0cyB0aGUgbGluZXMgaW4gZmlsZSAiZm9vIiBhbmQgd3JpdGVzIHRoZSByZXN1bHRzIHRvIGZpbGUKICAgICAgICAgICJiYXIiCgogICBncmVwIC1jICJzb21lIHRleHQiICoudHh0IHwgZ3JlcCAtdiAiOjAiIHwgc29ydCB8IHByIC0zIHwgbHByCiAgICAgICAgICBUaGlzIGlzIGEgY29tbWFuZCBwaXBlbGluZSBjb21wb3NlZCBvZiA1IGNvbW1hbmRzOgoKICAgZ3JlcCAtYyAic29tZSB0ZXh0IiAqLnR4dAogICAgICAgICAgTG9va3MgaW4gYWxsIGZpbGVzIHdob3NlIG5hbWVzIGVuZCB3aXRoICIudHh0IiBmb3IgdGhlIHN0cmluZwogICAgICAgICAgInNvbWUgdGV4dCIgYW5kIHdyaXRlcyB0byBTdGRvdXQgdGhlIG5hbWVzIG9mIGVhY2ggZmlsZQogICAgICAgICAgZm9sbG93ZWQgYnkgYSBjb2xvbiBhbmQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBpbiBlYWNoLgoKICAgZ3JlcCAtdiAiOjAiCiAgICAgICAgICBQcmludHMgdG8gU3Rkb3V0IHRoZSBsaW5lcyBmcm9tIFN0ZGluIHRoYXQgZG8gTk9UIGNvbnRhaW4gdGhlCiAgICAgICAgICBzdHJpbmcgIjowIiwgaW4gdGhpcyBjYXNlLCBpdCByZW1vdmVzIHRoZSBuYW1lcyBvZiBmaWxlcyB0aGF0CiAgICAgICAgICBkbyBub3QgY29udGFpbiAic29tZSB0ZXh0Ii4KCiAgIHNvcnQKICAgICAgICAgIFNvcnRzIHRoZSBsaW5lcyBmcm9tIFN0ZGluIGFscGhhYmV0aWNhbGx5IHRvIFN0ZG91dC4KCiAgIHByIC0zCiAgICAgICAgICBBcnJhbmdlcyB0aGUgbGluZXMgZnJvbSBTdGRpbiBpbiB0aHJlZSBjb2x1bW5zLgoKICAgbHByCiAgICAgICAgICBQcmludHMgaXRzIFN0ZGluIG9uIHRoZSBkZWZhdWx0IHByaW50ZXIuCgogICBOb3RlIHRoYXQgdGhlIEtlcm1pdCBmZWF0dXJlcyBkZXNjcmliZWQgaGVyZSB3b3JrIG9ubHkgd2l0aCBjb21tYW5kcwogICB0aGF0IHVzZSBTdGRpby4gSWYgeW91IGF0dGVtcHQgdG8gdXNlIHRoZW0gd2l0aCBjb21tYW5kcyB3aG9zZSBpbnB1dAogICBhbmQgb3V0cHV0IGNhbiBub3QgYmUgcmVkaXJlY3RlZCwgS2VybWl0IHdpbGwgbW9zdCBsaWtlbHkgZ2V0IHN0dWNrLgogICBLZXJtaXQgaGFzIG5vIHdheSBvZiB0ZWxsaW5nIGhvdyBhbiBleHRlcm5hbCBjb21tYW5kIHdvcmtzLCBub3Igd2hhdAogICB0aGUgc3ludGF4IG9mIHRoZSBzaGVsbCBpcywgc28gaXQncyB1cCB0byB5b3UgdG8gbWFrZSBzdXJlIHlvdSB1c2UKICAgdGhlc2UgZmVhdHVyZXMgb25seSB3aXRoIHJlZGlyZWN0YWJsZSBjb21tYW5kcy4KCiAgIFRoZSBxdW90aW5nIHJ1bGVzIG9mIHlvdXIgc2hlbGwgYXBwbHkgdG8gdGhlIGNvbW1hbmQuIFRodXMgaW4gVU5JWCwKICAgd2hlcmUgQy1LZXJtaXQgdHJpZXMgdG8gdXNlIHlvdXIgcHJlZmVycmVkIHNoZWxsIGZvciBydW5uaW5nIGNvbW1hbmRzLAogICBzaGVsbCAibWV0YWNoYXJhY3RlcnMiIHdpdGhpbiBjb21tYW5kcyBtdXN0IGJlIGVzY2FwZWQgaWYgdGhleSBhcmUgdG8KICAgYmUgdGFrZW4gbGl0ZXJhbGx5LCB1c2luZyB0aGUgbWV0aG9kcyBub3JtYWwgZm9yIHlvdXIgc2hlbGwuIEZvcgogICBleGFtcGxlLCB0aGUgVU5JWCB0ciAodHJhbnNsYXRlKSBjb21tYW5kIG11c3QgaGF2ZSBpdHMgYXJndW1lbnRzIGluCiAgIHF1b3RlczoKCiAgdHIgIlthLXpdIiAiW0EtWl0iCgogICBvdGhlcndpc2UgdGhlIHNoZWxsIGlzIGxpa2VseSB0byByZXBsYWNlIHRoZW0gYnkgYWxsIGZpbGVuYW1lcyB0aGF0CiAgIG1hdGNoLCB3aGljaCBpcyBwcm9iYWJseSBub3Qgd2hhdCB5b3Ugd2FudC4gVGhpcyBpcyBhbHNvIHRydWUgd2hlbgogICB1c2luZyB5b3VyIHNoZWxsIGRpcmVjdGx5LCBhbmQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBLZXJtaXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIuMS4zLiBTRUNVUklUWQoKICAgU29tZSBzaXRlcyBtaWdodCBub3Qgd2lzaCB0byBhbGxvdyBhY2Nlc3MgdG8gc3lzdGVtIGNvbW1hbmRzIG9yCiAgIGV4dGVybmFsIHByb2dyYW1zIGZyb20gd2l0aGluIEtlcm1pdC4gU3VjaCBhY2Nlc3MsIGluY2x1ZGluZyBhbGwgdGhlCiAgIGZlYXR1cmVzIGRlc2NyaWJlZCBoZXJlLCBjYW4gYmUgZGlzYWJsZWQgaW4gdmFyaW91cyB3YXlzOgoKICAgIDEuIFdoZW4gYnVpbGRpbmcgZnJvbSBzb3VyY2UgY29kZSwgaW5jbHVkZSAtRE5PUFVTSCBhbW9uZyB0aGUgQ0ZMQUdTLgogICAgMi4gQXQgcnVudGltZSwgZ2l2ZSB0aGUgTk9QVVNIIGNvbW1hbmQuCiAgICAzLiBGb3Igc2VydmVyIG1vZGUsIGdpdmUgdGhlIERJU0FCTEUgSE9TVCBjb21tYW5kLgogICAgNC4gSW1wbGljaXQgdXNlIG9mIHBpcGVzIGNhbiBiZSBkaXNhYmxlZCBhcyBkZXNjcmliZWQgaW4gWzQ0MF1TZWN0aW9uCiAgICAgICA0LjIuNC4KCiAgIE5vdGU6IDMgYW5kIDQgYXJlIG5vdCBuZWNlc3NhcnkgaWYgeW91IGhhdmUgZG9uZSAxIG9yIDIuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIuMi4gQ29tbWFuZHMgZm9yIFRyYW5zZmVycmluZyBmcm9tIGFuZCB0byBQaXBlcwoKICAgU0VORCAvQ09NTUFORCBzZW5kcyBkYXRhIGZyb20gYSBjb21tYW5kIG9yIGNvbW1hbmQgcGlwZWxpbmUsIGFuZAogICBSRUNFSVZFIC9DT01NRU5UIHdyaXRlcyBkYXRhIHRvIGEgY29tbWFuZCBvciBwaXBlbGluZS4gVGhlIEdFVAogICAvQ09NTUFORCBjb21tYW5kIGFza3MgYSBzZXJ2ZXIgdG8gc2VuZCBtYXRlcmlhbCwgYW5kIHRoZW4gd3JpdGVzIHRoZQogICBpbmNvbWluZyBtYXRlcmlhbCB0byBhIGNvbW1hbmQgb3IgcGlwZWxpbmUuIFRoZXNlIGZlYXR1cmVzLCBhbG9uZyB3aXRoCiAgIHN3aXRjaGVzIChsaWtlICIvQ09NTUFORCIsIGRlc2NyaWJlZCBpbiBbNDQxXVNlY3Rpb24gNC43KSBhcmUgbmV3IHRvCiAgIEMtS2VybWl0IDYuMS4gVGhlIGZvbGxvd2luZyBzeW5vbnltcyBhcmUgYWxzbyBwcm92aWRlZDoKCiAgQ1NFTkQgICAgPSBTRU5EIC9DT01NQU5ECiAgQ1JFQ0VJVkUgPSBSRUNFSVZFIC9DT01NQU5ECiAgQ0dFVCAgICAgPSBHRVQgL0NPTU1BTkQKCiAgIE5vbmUgb2YgdGhlc2UgY29tbWFuZHMgY2FuIGJlIHVzZWQgaWYgYSBTRU5EIG9yIFJFQ0VJVkUgRklMVEVSCiAgIChyZXNwZWN0aXZlbHksIFs0NDJdU2VjdGlvbiA0LjIuMykgaXMgaW4gZWZmZWN0LCBvciBpZiBhIE5PUFVTSAogICBjb21tYW5kIChbNDQzXVNlY3Rpb24gNC4yLjEuMykgaGFzIGJlZW4gZ2l2ZW4sIG9yIGlmIHRoZSBjdXJyZW50CiAgIHByb3RvY29sIGlzIG5vdCBLZXJtaXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIuMi4xLiBTZW5kaW5nIGZyb20gYSBDb21tYW5kCgogICBTRU5EIC9DT01NQU5EIGNvbW1hbmQgWyBhcy1uYW1lIF0KICAgU0VORCAvQVMtTkFNRTphcy1uYW1lIC9DT01NQU5EIGNvbW1hbmQKICAgQ1NFTkQgY29tbWFuZCBbIGFzLW5hbWUgXQogICAgICAgICAgVGhlc2UgdGhyZWUgZm9ybXMgYXJlIHRoZSBzYW1lLiBUaGV5IHdvcmsgbGlrZSB0aGUgU0VORAogICAgICAgICAgY29tbWFuZCwgYnV0IGluc3RlYWQgb2Ygc2VuZGluZyBhIGZpbGUsIGl0IHNlbmRzIHRoZSBzdGFuZGFyZAogICAgICAgICAgb3V0cHV0IG9mIHRoZSBnaXZlbiBjb21tYW5kLCBlaXRoZXIgdW5kZXIgdGhlIGNvbW1hbmQncyBvd24KICAgICAgICAgIG5hbWUsIG9yIGVsc2Ugd2l0aCB0aGUgZ2l2ZW4gYXMtbmFtZS4gSWYgdGhlIGNvbW1hbmQgY29udGFpbnMKICAgICAgICAgIHNwYWNlcywgaXQgbXVzdCBiZSBlbmNsb3NlZCBpbiBicmFjZXMuIEJyYWNlcyBzaG91bGQgYWxzbyBiZQogICAgICAgICAgdXNlZCBmb3IgdGhlIGFzLW5hbWUgaWYgaXQgY29udGFpbnMgc3BhY2VzLiBJZiBicmFjZXMgYXJlCiAgICAgICAgICBpbmNsdWRlZCBhcm91bmQgZWl0aGVyIHRoZSBjb21tYW5kIG9yIHRoZSBhcy1uYW1lLCB0aGV5IGFyZQogICAgICAgICAgcmVtb3ZlZCBhZnRlciBwYXJzaW5nIGJ1dCBiZWZvcmUgdXNlLiBBcyB3aXRoIFNFTkQsIHRoZQogICAgICAgICAgdHJhbnNmZXIgaXMgaW4gdGV4dCBvciBiaW5hcnkgbW9kZSBhY2NvcmRpbmcgdGhlIGN1cnJlbnQgRklMRQogICAgICAgICAgVFlQRSBzZXR0aW5nLCB1bmxlc3MgeW91IG92ZXJyaWRlIHRoZSBnbG9iYWwgdHJhbnNmZXIgbW9kZSBieQogICAgICAgICAgaW5jbHVkaW5nIGEgL1RFWFQgb3IgL0JJTkFSWSBzd2l0Y2guIFRoZSBjb21tYW5kIG11c3QgcmVxdWlyZQogICAgICAgICAgbm8gaW5wdXQuCgogICBXaGVuIHNlbmRpbmcgZnJvbSBhIGNvbW1hbmQgb3IgcGlwZWxpbmUsIEMtS2VybWl0IGhhcyBubyB3YXkgb2YKICAga25vd2luZyBpbiBhZHZhbmNlIGhvdyBtdWNoIGRhdGEgd2lsbCBiZSBzZW50LCBhbmQgc28gaXQgY2FuIG5vdCBzZW5kCiAgIHRoZSBzaXplIHRvIHRoZSBvdGhlciBLZXJtaXQgaW4gdGhlIEF0dHJpYnV0ZSBwYWNrZXQsIGFuZCBzbyB0aGUKICAgcmVjZWl2aW5nIEtlcm1pdCBoYXMgbm8gd2F5IG9mIGRpc3BsYXlpbmcgInBlcmNlbnQgZG9uZSIgb3IgYSBwcm9ncmVzcwogICBiYXIgKHRoZXJtb21ldGVyKS4KCiAgIEV4YW1wbGVzIHRoYXQgbWFrZSBzZW5zZSBpbiB0ZXh0IG1vZGUgKGlsbHVzdHJhdGVkIGJ5IGNvbW1vbiBVTklYCiAgIGNvbW1hbmRzKToKCiAgIFNFTkQgL0NPTU1BTkQgZmluZ2VyCiAgIENTRU5EIGZpbmdlcgogICAgICAgICAgc2VuZHMgdGhlIGN1cnJlbnQgImZpbmdlciIgbGlzdGluZyAod2hvJ3MgbG9nZ2VkIGluKSB1bmRlciB0aGUKICAgICAgICAgIG5hbWUgImZpbmdlciIuIFRoZSB0d28gZm9ybXMgInNlbmQgL2NvbW1hbmQiIGFuZCAiY3NlbmQiIGFyZQogICAgICAgICAgZXF1aXZhbGVudDsgd2Ugd29uJ3QgYm90aGVyIHNob3dpbmcgdGhlbSBib3RoIGluIHRoZSByZXN0IG9mCiAgICAgICAgICB0aGUgZXhhbXBsZXMuCgogICBTRU5EIC9DT01NQU5EOntmaW5nZXJ9CiAgIENTRU5EIHtmaW5nZXJ9CiAgICAgICAgICBTYW1lIGFzIHByZXZpb3VzIGV4YW1wbGUgKGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tICJ7ZmluZ2VyfSIpLgoKICAgU0VORCAvQ09NTUFORDp7IGZpbmdlciB9CiAgIENTRU5EIHsgZmluZ2VyIH0KICAgICAgICAgIFNhbWUgYXMgcHJldmlvdXMgZXhhbXBsZSwgYnV0IG5vdGUgdGhhdCB0aGUgc3BhY2VzIGFyZSBrZXB0LgogICAgICAgICAgVGhpcyBkb2VzIG5vdCBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tIHJ1bm5pbmcgdGhlICJmaW5nZXIiCiAgICAgICAgICBwcm9ncmFtLCBidXQgaXRzIG91dHB1dCBpcyBzZW50IHVuZGVyIHRoZSBuYW1lICIgZmluZ2VyICIgKHdpdGgKICAgICAgICAgIGEgbGVhZGluZyBhbmQgdHJhaWxpbmcgc3BhY2UpLgoKICAgU0VORCAvQ09NTUFORDpmaW5nZXIgL0FTLU5BTUU6dXNlcmxpc3QKICAgQ1NFTkQgZmluZ2VyIHVzZXJsaXN0CiAgICAgICAgICBzZW5kcyB0aGUgY3VycmVudCBmaW5nZXIgbGlzdGluZyB1bmRlciB0aGUgbmFtZSAidXNlcmxpc3QiLgoKICAgU0VORCAvQ09NTUFORDp7ZmluZ2VyIHwgc29ydCAtcn0gL0FTLU5BTUU6dXNlcmxpc3QKICAgQ1NFTkQge2ZpbmdlciB8IHNvcnQgLXJ9IHVzZXJsaXN0CiAgICAgICAgICBzZW5kcyB0aGUgY3VycmVudCBmaW5nZXIgbGlzdGluZywgc29ydGVkIGluIHJldmVyc2Ugb3JkZXIsCiAgICAgICAgICB1bmRlciB0aGUgbmFtZSAidXNlcmxpc3QiLiBUaGUgYnJhY2VzIGFyZSBuZWVkZWQgdG8gZGlzdGluZ3Vpc2gKICAgICAgICAgIHRoZSBjb21tYW5kIGZyb20gdGhlIGFzLW5hbWUuCgogICBTRU5EIC9DT01NQU5EOntmaW5nZXIgfCBzb3J0IC1yfSAvQVMtTkFNRTp7dXNlcmxpc3R9CiAgIENTRU5EIHtmaW5nZXIgfCBzb3J0IC1yfSB7dXNlcmxpc3R9CiAgICAgICAgICBTYW1lIGFzIHByZXZpb3VzIGV4YW1wbGUgKGJyYWNlcyBhcmUgcmVtb3ZlZCBmcm9tCiAgICAgICAgICAie3VzZXJsaXN0fSIpLgoKICAgU0VORCAvQ09NTUFORDp7ZmluZ2VyIHwgc29ydCAtcn0KICAgICAgICAgIC9BUy1OQU1FOntcZnJlcGxhY2UoXHYoZmlsZW5hbWUpLFwzMixfKX0KCiAgIENTRU5EIHtmaW5nZXIgfCBzb3J0IC1yfSB7XGZyZXBsYWNlKFx2KGZpbGVuYW1lKSxcMzIsXyl9CiAgICAgICAgICBMaWtlIHRoZSBwcmV2aW91cyBleGFtcGxlLCBidXQgc2VuZHMgdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZAogICAgICAgICAgdW5kZXIgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQsIGJ1dCB3aXRoIGFsbCBzcGFjZXMgKFwzMikKICAgICAgICAgIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmVzLCBzbyB0aGUgYXMtbmFtZSBpcyAiZmluZ2VyX3xfc29ydF8tciIuCgogICBFeGFtcGxlcyB0aGF0IG1ha2Ugc2Vuc2UgaW4gYmluYXJ5IG1vZGUgKHRocmVlIGVxdWl2YWxlbnQgZm9ybXMgYXJlCiAgIHNob3duKToKCiAgIFNFTkQgL0NPTU1BTkQgL0JJTkFSWSB7dGFyIGNmIC0gLiB8IGd6aXAgLWN9IG15ZGlyLnRhci5negogICBTRU5EIC9DT01NQU5EIC9CSU5BUlkgL0FTLU5BTUU6bXlkaXIudGFyLmd6IHt0YXIgY2YgLSAuIHwgZ3ppcCAtY30KICAgQ1NFTkQgL0JJTkFSWSB7dGFyIGNmIC0gLiB8IGd6aXAgLWN9IG15ZGlyLnRhci5negogICAgICAgICAgTWFrZXMgYSB0YXIgYXJjaGl2ZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnksIGNvbXByZXNzZXMgaXQKICAgICAgICAgIHdpdGggdGhlIEdOVSBnemlwIHByb2dyYW0sIGFuZCBzZW5kcyBpdCBhcyAibXlkaXIudGFyLmd6Ii4gVGhlCiAgICAgICAgICBvdGhlciBLZXJtaXQgY2FuLCBvZiBjb3Vyc2UsIGp1c3Qgc3RvcmUgaXQgYXMgYSBmaWxlLCBvciBpdCBjYW4KICAgICAgICAgIHVzZSBDUkVDRUlWRSB0byB1bmNvbXByZXNzIGFuZCBkZWFyY2hpdmUgaXQgYXMgcGFydCBvZiB0aGUKICAgICAgICAgIHRyYW5zZmVyIHByb2Nlc3MuCgogICBXaGVuIHVzaW5nIGEgInBpcGVsaW5lIiBvZiBjb21tYW5kcyBpbiB0aGUgY29tbWFuZCBmaWVsZCwgb2J2aW91c2x5LAogICB0aGUgZmlyc3QgY29tbWFuZCBtdXN0IG5vdCByZXF1aXJlIGFueSBpbnB1dCwgYW5kIHRoZSBsYXN0IGNvbW1hbmQKICAgc2hvdWxkIHByb2R1Y2Ugc29tZSBvdXRwdXQsIGFuZCBhbGwgaW50ZXJtZWRpYXRlIGNvbW1hbmRzIHNob3VsZCBnZXQKICAgc29tZSBpbnB1dCBhbmQgcHJvZHVjZSBzb21lIG91dHB1dC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMi4yLjIuIFJlY2VpdmluZyB0byBhIENvbW1hbmQKCiAgIFJFQ0VJVkUgL0NPTU1BTkQgY29tbWFuZAogICBDUkVDRUlWRSBjb21tYW5kCiAgICAgICAgICBUaGlzIGlzIGxpa2UgUkVDRUlWRSwgZXhjZXB0IGluY29taW5nIG1hdGVyaWFsIGlzIHdyaXR0ZW4gdG8KICAgICAgICAgIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiB0aGUgZ2l2ZW4gY29tbWFuZCwgaW4gdGV4dCBvciBiaW5hcnkgbW9kZQogICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBub3JtYWwgcnVsZXMgZm9yIGZpbGUgcmVjZXB0aW9uLiBCZSBzdXJlIHRvCiAgICAgICAgICBpbmNsdWRlIGEgcmVkaXJlY3RvciB0byBhIGZpbGUgKGlmIHRoZSBjb21tYW5kIG5vcm1hbGx5IHdyaXRlcwogICAgICAgICAgdG8gc3RhbmRhcmQgb3V0cHV0KSwgb3IgdGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCB3b24ndCBnbwogICAgICAgICAgYW55d2hlcmUuIFRoZSBjb21tYW5kIG1heSBjb250YWluIHNwYWNlczsgYnJhY2VzIGFyZSBub3QKICAgICAgICAgIG5lZWRlZCwgYnV0IHRoZXkgYXJlIHJlbW92ZWQgaWYgdXNlZC4KCiAgIFdBUk5JTkc6IEMtS2VybWl0IGhhcyBubyB3YXkgb2Yga25vd2luZyBhbnl0aGluZyBhYm91dCB0aGUgY29tbWFuZCwgb3IKICAgZXZlbiB3aGV0aGVyIGl0IGlzIGEgY29tbWFuZC4gVGh1cyB0aGlzIGNvbW1hbmQgd2lsbCBhbHdheXMgY2F1c2UKICAgQy1LZXJtaXQgdG8gZW50ZXIgcHJvdG9jb2wgbW9kZSwgYXMgbG9uZyBhcyBzb21lIHRleHQgaXMgc3BlY2lmaWVkIGluCiAgIHRoZSBjb21tYW5kIGZpZWxkLiBIb3dldmVyLCBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEKICAgY29tbWFuZCwgdGhlIHRyYW5zZmVyIHdpbGwgZXZlbnR1YWxseSBmYWlsIHdpdGggYSBtZXNzYWdlIHN1Y2ggYXMKICAgIkVycm9yIHdyaXRpbmcgZGF0YSIgb3IgIkZhaWx1cmUgdG8gY2xvc2UgZmlsZSIuCgogICBFeGFtcGxlcyBmb3IgdGV4dCBtb2RlIChpbiBVTklYKToKCiAgIFJFQ0VJVkUgL0NPTU1BTkQgc29ydCAtciA+IHJldmVyc2UudHh0CiAgIENSRUNFSVZFIHNvcnQgLXIgPiByZXZlcnNlLnR4dAogICAgICAgICAgVGhlIHRleHQgdGhhdCBpcyByZWNlaXZlZCBpcyBzb3J0ZWQgaW4gcmV2ZXJzZSBvcmRlciBhbmQgc3RvcmVkCiAgICAgICAgICBpbiB0aGUgZmlsZSAicmV2ZXJzZS50eHQiLiBUaGUgdHdvIGZvcm1zIHNob3duIGFyZSBlcXVpdmFsZW50LgoKICAgUkVDRUlWRSAvQ09NTUFORCB7c29ydCAtciA+IHJldmVyc2UudHh0fQogICBDUkVDRUlWRSB7c29ydCAtciA+IHJldmVyc2UudHh0fQogICAgICAgICAgVGhlIHNhbWUgYXMgdGhlIHByZXZpb3VzIGV4YW1wbGU7IGlmIGJyYWNlcyBhcmUgaW5jbHVkZWQsIHRoZXkKICAgICAgICAgIGFyZSBzaW1wbHkgcmVtb3ZlZC4KCiAgIFJFQ0VJVkUgL0NPTU1BTkQge3NvcnQgLXIgPiBcZmxvd2VyKFx2KGZpbGVuYW1lKSkucmV2ZXJzZX0KICAgQ1JFQ0VJVkUge3NvcnQgLXIgPiBcZmxvd2VyKFx2KGZpbGVuYW1lKSkucmV2ZXJzZX0KICAgICAgICAgIFNhbWUgYnV0IHN0b3JlcyByZXN1bHQgdW5kZXIgdGhlIGluY29taW5nIGZpbGVuYW1lLCBsb3dlcmNhc2VkLAogICAgICAgICAgYW5kIHdpdGggIi5yZXZlcnNlIiBhcHBlbmRlZCB0byBpdC4KCiAgIFJFQ0VJVkUgL0NPTU1BTkQgc29ydAogICBDUkVDRUlWRSBzb3J0CiAgICAgICAgICBEb2VzIG5vdGhpbmcgdXNlZnVsLCBzaW5jZSB0aGUgb3V0cHV0IG9mIHNvcnQgaGFzIG5vd2hlcmUgdG8KICAgICAgICAgIGdvLgoKICAgUkVDRUlWRSAvQ09NTUFORCBzb3J0IC1yIHwgcHIgLTMgfCBscHIgLVBsYXNlcmpldAogICBDUkVDRUlWRSBzb3J0IC1yIHwgcHIgLTMgfCBscHIgLVBsYXNlcmpldAogICAgICAgICAgVGhlIHRleHQgdGhhdCBpcyByZWNlaXZlZCBpcyBzb3J0ZWQgaW4gcmV2ZXJzZSBvcmRlciwgYXJyYW5nZWQKICAgICAgICAgIGludG8gdGhyZWUgY29sdW1ucywgYW5kIHNlbnQgdG8gdGhlICJsYXNlcmpldCIgcHJpbnRlci4KCiAgIEV4YW1wbGVzIGZvciBiaW5hcnkgbW9kZToKCiAgIFJFQ0VJVkUgL0NPTU1BTkQ6e2d1bnppcCAtYyB8IHRhciB4ZiAtfQogICBDUkVDRUlWRSB7Z3VuemlwIC1jIHwgdGFyIHhmIC19CiAgICAgICAgICBBc3N1bWluZyB0aGUgZGF0YSB0aGF0IGlzIHJlY2VpdmVkIGlzIGEgY29tcHJlc3NlZCB0YXIgYXJjaGl2ZSwKICAgICAgICAgIHVuY29tcHJlc3NlcyB0aGUgYXJjaGl2ZSBhbmQgcGFzc2VzIGl0IHRvIHRhciBmb3IgZXh0cmFjdGlvbi4KICAgICAgICAgIEluIHRoaXMgY2FzZSB0aGUgYnJhY2VzIGFyZSBuZWVkZWQgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGZpbmFsCiAgICAgICAgICAiLSIgd291bGQgYmUgdGFrZW4gYXMgYSBjb21tYW5kIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIgKHNlZQogICAgICAgICAgWzQ0NF1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkaXRpb24sIHAuMzMpLgoKICAgR0VUIC9DT01NQU5EIHJlbW90ZS1maWxlIGNvbW1hbmQKICAgR0VUIC9DT01NQU5EIC9BUy1OQU1FOmNvbW1hbmQgcmVtb3RlLWZpbGUKICAgQ0dFVCByZW1vdGUtZmlsZSBjb21tYW5kCiAgICAgICAgICBUaGlzIGNvbW1hbmQgdGVsbHMgdGhlIEtlcm1pdCBjbGllbnQgdG8gc2VuZCBhIEdFVCByZXF1ZXN0IGZvcgogICAgICAgICAgdGhlIGdpdmVuIHJlbW90ZSBmaWxlIHRvIGEgS2VybWl0IHNlcnZlci4gVW5saWtlIEdFVCwgaG93ZXZlciwKICAgICAgICAgIHRoZSBpbmNvbWluZyBtYXRlcmlhbCBpcyB3cml0dGVuIHRvIGEgY29tbWFuZCwgcmF0aGVyIHRoYW4gdG8gYQogICAgICAgICAgZmlsZS4gSWYgdGhlIHJlbW90ZS1maWxlIG9yIHRoZSBjb21tYW5kIGNvbnRhaW4gc3BhY2VzLCB0aGV5CiAgICAgICAgICBtdXN0IGJlIGVuY2xvc2VkIGluIGJyYWNlcy4gVGhlIHNhbWUgY2F1dGlvbnMgYWJvdXQgdGhlIGNvbW1hbmQKICAgICAgICAgIGFwcGx5IGFzIGZvciBDUkVDRUlWRS4KCiAgIEV4YW1wbGVzIChmb3IgVU5JWCk6CgogICBHRVQgL0NPTU1BTkQgb29mYS50eHQgc29ydCAtciA+IG9vZmEubmV3CiAgIEdFVCAvQ09NTUFORCB7b29mYS50eHR9IHtzb3J0IC1yID4gb29mYS5uZXd9CiAgIENHRVQgb29mYS50eHQgc29ydCAtciA+IG9vZmEubmV3CiAgIENHRVQge29vZmEudHh0fSB7c29ydCAtciA+IG9vZmEubmV3fQogICAgICAgICAgVGhlc2UgZm91ciBhcmUgZXF1aXZhbGVudC4gRWFjaCBvZiB0aGVtIHJlcXVlc3RzIHRoZSBzZXJ2ZXIgdG8KICAgICAgICAgIHNlbmQgaXRzICJvb2ZhLnR4dCIgZmlsZSwgYW5kIGFzIGl0IGFycml2ZXMsIGl0IGlzIHNvcnRlZCBpbgogICAgICAgICAgcmV2ZXJzZSBvcmRlciBhbmQgd3JpdHRlbiB0byAib29mYS5uZXciLgoKICAgR0VUIC9DT01NQU5EIHtwcm9maWxlIGV4ZWMgYX0gbHByCiAgIEdFVCAvQ09NTUFORCB7cHJvZmlsZSBleGVjIGF9IHtscHJ9CiAgIEdFVCAvQ09NTUFORCAvQVMtTkFNRTpscHIge3Byb2ZpbGUgZXhlYyBhfQogICBHRVQgL0NPTU1BTkQgL0FTLU5BTUU6e2xwcn0ge3Byb2ZpbGUgZXhlYyBhfQogICBHRVQgL0NPTU1BTkQgL0FTOmxwciB7cHJvZmlsZSBleGVjIGF9CiAgIENHRVQge3Byb2ZpbGUgZXhlYyBhfSBscHIKICAgQ0dFVCB7cHJvZmlsZSBleGVjIGF9IHtscHJ9CiAgICAgICAgICBIZXJlIHRoZSByZW1vdGUgZmlsZW5hbWUgY29udGFpbnMgc3BhY2VzIHNvIGl0IE1VU1QgYmUgZW5jbG9zZWQKICAgICAgICAgIGluIGJyYWNlcy4gQXMgaXQgYXJyaXZlcyBpdCBpcyBzZW50IHRvIHRoZSBscHIgcHJvZ3JhbSBmb3IKICAgICAgICAgIHByaW50aW5nLiBCcmFjZXMgYXJlIG9wdGlvbmFsIGFyb3VuZCAibHByIiBzaW5jZSBpdCBjb250YWlucyBubwogICAgICAgICAgc3BhY2VzLgoKICAgR0VUIC9DT01NQU5EICoudHh0IHtjYXQgPj4gbmV3LnR4dH0KICAgR0VUIC9BUy1OQU1FOntjYXQgPj4gbmV3LnR4dH0gL0NPTU1BTkQgKi50eHQKICAgQ0dFVCAqLnR4dCB7Y2F0ID4+IG5ldy50eHR9CiAgICAgICAgICBUaGlzIGdldHMgYWxsIHRoZSAiLnR4dCIgZmlsZXMgZnJvbSB0aGUgc2VydmVyIGFuZCBjb25jYXRlbmF0ZXMKICAgICAgICAgIHRoZW0gYWxsIGludG8gYSBzaW5nbGUgIm5ldy50eHQiIGZpbGUgb24gdGhlIGNsaWVudC4KCiAgIEdFVCAvQ09NTUFORCAqLnR4dCB7ZWNobyBcdihmaWxlbmFtZSk+Pm5ldy50eHQ7Y2F0Pj5uZXcudHh0fQogICBDR0VUICoudHh0IHtlY2hvIFx2KGZpbGVuYW1lKT4+bmV3LnR4dDtjYXQ+Pm5ldy50eHR9CiAgICAgICAgICBBcyBhYm92ZSwgYnV0IGluc2VydHMgZWFjaCBmaWxlJ3MgbmFtZSBiZWZvcmUgaXRzIGNvbnRlbnRzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yLjMuIFVzaW5nIEZpbGUtVHJhbnNmZXIgRmlsdGVycwoKICAgVGhlIGNvbW1hbmRzIGRlc2NyaWJlZCBpbiBbNDQ1XVNlY3Rpb24gNC4yLjIgbGV0IHlvdSBzZW5kIHRoZSBvdXRwdXQKICAgb2YgYSBjb21tYW5kLCBvciByZWNlaXZlIGRhdGEgaW50byBhIGNvbW1hbmQuIEJ1dCB3aGF0IGlmIHlvdSB3YW50IHRvCiAgIHNwZWNpZnkgcHJlcHJvY2Vzc2luZyBmb3IgZmlsZXMgdGhhdCB5b3Ugc2VuZCwgb3IgcG9zdHByb2Nlc3Npbmcgb2YKICAgZmlsZXMgdGhhdCB5b3UgcmVjZWl2ZSwgZXZlbiB3aGVuIG11bHRpcGxlIGZpbGVzIGFyZSBpbnZvbHZlZD8gRm9yCiAgIHRoaXMgeW91IG5lZWQgYSB3YXkgdG8gc3BlY2lmeSBzZW5kIGFuZCByZWNlaXZlIGZpbHRlcnMuIFRoZSBjb21tYW5kcwogICBhcmUgU0VUIFNFTkQgRklMVEVSIGFuZCBTRVQgUkVDRUlWRSBGSUxURVI7IFNIT1cgUFJPVE9DT0wgZGlzcGxheXMgdGhlCiAgIGN1cnJlbnQgc2V0dGluZ3MuCgogICAgNC4yLjMuMS4gVGhlIFNFTkQgRmlsdGVyCgogICBTRVQgU0VORCBGSUxURVIgWyBjb21tYW5kIF0KICAgICAgICAgIFRoaXMgY29tbWFuZCBzcGVjaWZpZXMgYSBjb21tYW5kIHRvIGJlIHJ1biBvbiBhbnkgZmlsZSB0aGF0IHlvdQogICAgICAgICAgU0VORCAob3IgTU9WRSwgTVNFTkQsIGV0YykuIEl0IGFsc28gYXBwbGllcyB0byBmaWxlcyBzZW50IHdoZW4KICAgICAgICAgIGluIHNlcnZlciBtb2RlLCBpbiByZXNwb25zZSB0byBHRVQgY29tbWFuZHMsIGJ1dCBub3QgdG8gdGhlCiAgICAgICAgICByZXN1bHRzIG9mIFJFTU9URSBjb21tYW5kcyBsaWtlIFJFTU9URSBESVJFQ1RPUlksIFJFTU9URSBUWVBFLAogICAgICAgICAgUkVNT1RFIEhPU1QsIGV0Yy4gVGhlIGNvbW1hbmQgbWF5IGJlLCBidXQgbmVlZCBub3QgYmUsIGVuY2xvc2VkCiAgICAgICAgICBpbiBicmFjZXM7IGlmIGl0IGlzLCB0aGUgYnJhY2VzIGFyZSBzdHJpcHBlZCBiZWZvcmUgdXNlLiBUaGUKICAgICAgICAgIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgaXMgc2VudCwgcmF0aGVyIHRoYW4gdGhlIGZpbGUgaXRzZWxmLgogICAgICAgICAgVGhlIGN1cnJlbnQgRklMRSBUWVBFIHNldHRpbmcgKFRFWFQgb3IgQklOQVJZKSBhcHBsaWVzIHRvIHRoZQogICAgICAgICAgb3V0cHV0IG9mIHRoZSBjb21tYW5kLiBUaGUgY29tbWFuZCBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lCiAgICAgICAgICBpbnN0YW5jZSBvZiBcdihmaWxlbmFtZSksIGZvciB3aGljaCB0aGUgbmFtZSBvZiB0aGUgYWN0dWFsIGZpbGUKICAgICAgICAgIGlzIHN1YnN0aXR1dGVkLiBJZiB0aGUgY29tbWFuZCBpcyBvbWl0dGVkLCB0aGUgc2VuZCBmaWx0ZXIgaXMKICAgICAgICAgIHJlbW92ZWQgYW5kIGZpbGVzIGFyZSBzZW50IGluIHRoZSBub3JtYWwgbWFubmVyLgoKICAgVGhlIFNFVCBTRU5EIEZJTFRFUiBzZXRzIHVwIGEgImdsb2JhbCIgZmlsdGVyIC0tIHRoYXQgaXMsIG9uZSB0aGF0CiAgIGFwcGxpZXMgdG8gYWxsIHN1YnNlcXVlbnQgZmlsZS1zZW5kaW5nIGNvbW1hbmRzIHVudGlsIHlvdSBjaGFuZ2Ugb3IKICAgcmVtb3ZlIGl0LiBZb3UgY2FuIGFsc28gc3BlY2lmeSBhICJsb2NhbCIgZmlsdGVyIHRvIGJlIHVzZWQgaW4gYQogICBzcGVjaWZpYyBmaWxlLXNlbmRpbmcgY29tbWFuZCBieSB1c2luZyB0aGUgL0ZJTFRFUiBzd2l0Y2ggKHNlZQogICBbNDQ2XVNlY3Rpb24gMS41KTsgZm9yIGV4YW1wbGU6CgogIFNFTkQgL0ZJTFRFUjpjb21tYW5kIFsgb3RoZXItc3dpdGNoZXMgXSBmaWxlbmFtZQoKICAgQmVzaWRlcyBcdihmaWxlbmFtZSksIHlvdSBjYW4gaW5jbHVkZSBhbnkgb3RoZXIgc2NyaXB0IHByb2dyYW1taW5nCiAgIG5vdGF0aW9uIGluIHRoZSBzZW5kIGZpbHRlcjogdmFyaWFibGUgbmFtZXMsIGFycmF5IHJlZmVyZW5jZXMsIGNhbGxzCiAgIHRvIGJ1aWx0LWluIHN0cmluZyBvciBvdGhlciBmdW5jdGlvbnMsIGFuZCBzbyBvbi4gVGhlc2UgYXJlIGV2YWx1YXRlZAogICBkdXJpbmcgZmlsZSB0cmFuc2ZlciwgTk9UIGR1cmluZyBwYXJzaW5nLCBhbmQgdGhleSBhcmUgZXZhbHVhdGVkCiAgIHNlcGFyYXRlbHkgZm9yIGVhY2ggZmlsZS4KCiAgIFdoZW4gdGhlIFNFTkQgb3IgTU9WRSAoU0VORCAvREVMRVRFKSBjb21tYW5kIGlzIHVzZWQgd2l0aCBhIHNlbmQKICAgZmlsdGVyLCB0aGUgb3V0cHV0IGZyb20gdGhlIGZpbHRlciBpcyBzZW50IHVuZGVyIHRoZSBmaWxlJ3Mgb3JpZ2luYWwKICAgbmFtZSB1bmxlc3MgeW91IHNwZWNpZnkgYW4gImFzLW5hbWUiIG9yIHRlbXBsYXRlLiBUaGUgQXR0cmlidXRlIHBhY2tldAogICAoaWYgYW55KSBjb250YWlucyB0aGUgb3JpZ2luYWwgZmlsZSdzIGF0dHJpYnV0ZXMgKHNpemUsIGNyZWF0aW9uIGRhdGUsCiAgIGV0YykuIFNvIChmb3IgZXhhbXBsZSkgaWYgdGhlIGZpbHRlciBjaGFuZ2VzIHRoZSBmaWxlJ3Mgc2l6ZSwgdGhlCiAgIHByb2dyZXNzIHRoZXJtb21ldGVyIG1pZ2h0IGJlIHdyb25nLiAoV2UgY2FuJ3Qgc2VuZCB0aGUgc2l6ZSBvZiB0aGUKICAgb3V0cHV0IGZyb20gdGhlIGZpbHRlciwgYmVjYXVzZSBpdCBpcyBub3Qga25vd24gdW50aWwgdGhlIHRyYW5zZmVyIGlzCiAgIGZpbmlzaGVkLikgSWYgeW91IHByZWZlciB0aGF0IHRoZSBzaXplIG5vdCBiZSBzZW50LCB1c2UgInNldAogICBhdHRyaWJ1dGVzIHNpemUgb2ZmIi4KCiAgIFlvdSBjYW4gbm90IHVzZSBzZW5kIGZpbHRlcnMgd2l0aCBSRVNFTkQgKFNFTkQgL1JFQ09WRVIpIG9yIFBTRU5ECiAgIChTRU5EIC9TVEFSVCkuCgogICBFeGFtcGxlcyBmb3IgdGV4dCBtb2RlOgoKICAgU0VUIFNFTkQgRklMVEVSIHNvcnQgLXIgXHYoZmlsZW5hbWUpIDsgQnJhY2VzIG1heSBiZSBvbWl0dGVkCiAgIFNFVCBTRU5EIEZJTFRFUiB7c29ydCAtciBcdihmaWxlbmFtZSl9IDsgQnJhY2VzIG1heSBiZSBpbmNsdWRlZAogICBTRU5EICoudHh0CiAgICAgICAgICBUaGlzIHNlbmRzIGV2ZXJ5IGZpbGUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdob3NlIG5hbWUgZW5kcwogICAgICAgICAgd2l0aCAiLnR4dCIgdW5kZXIgaXRzIG93biBuYW1lLCBidXQgd2l0aCBpdHMgbGluZXMgc29ydGVkIGluCiAgICAgICAgICByZXZlcnNlIG9yZGVyLgoKICAgU0VORCAvRklMVEVSOntzb3J0IC1yIFx2KGZpbGVuYW1lKX0gKi50eHQKICAgICAgICAgIFNhbWUgYXMgYWJvdmUsIGJ1dCB0aGUgZmlsdGVyIGFwcGxpZXMgb25seSB0byB0aGlzIFNFTkQKICAgICAgICAgIGNvbW1hbmQuIEJyYWNlcyBhcmUgcmVxdWlyZWQgaW4gdGhpcyBjYXNlLgoKICAgU0VUIFNFTkQgRklMVEVSIHtzb3J0IC1yIFx2KGZpbGVuYW1lKX0KICAgU0VORCBvb2ZhLnR4dCByZXZlcnNlLnR4dAogICAgICAgICAgU2VuZHMgdGhlIG9vZmEudHh0IGZpbGUgd2l0aCBpdHMgbGluZXMgc29ydGVkIGluIHJldmVyc2Ugb3JkZXIKICAgICAgICAgIHVuZGVyIHRoZSBuYW1lICJyZXZlcnNlLnR4dCIuCgogICBTRVQgU0VORCBGSUxURVIge3NvcnQgLXIgXHYoZmlsZW5hbWUpfQogICBTRU5EIG9vZmEuKiBcdihmaWxlbmFtZSkucmV2ZXJzZQogICAgICAgICAgU2VuZHMgYWxsIHRoZSBvb2ZhLiogZmlsZXMgd2l0aCB0aGVpciBsaW5lcyBzb3J0ZWQgaW4gcmV2ZXJzZQogICAgICAgICAgb3JkZXI7IGVhY2ggZmlsZSBpcyBzZW50IHVuZGVyIGl0cyBvd24gbmFtZSBidXQgd2l0aCAiLnJldmVyc2UiCiAgICAgICAgICBhcHBlbmRlZCB0byBpdC4KCiAgIFNFVCBTRU5EIEZJTFRFUiB7dHIgIlthLXpdIiAiW0EtWl0iIDwgXHYoZmlsZW5hbWUpfQogICBTRU5EICoudHh0CiAgICAgICAgICBTZW5kcyBhbGwgIi50eHQiIGZpbGVzIHVuZGVyIHRoZWlyIG93biBuYW1lcywgYnV0IHVwcGVyY2FzaW5nCiAgICAgICAgICB0aGVpciBjb250ZW50cy4KCiAgIE5vdGUgdGhhdCB0aGUgU0VORCBGSUxURVIgYXBwbGllcyBub3Qgb25seSB0byBmaWxlcyB0aGF0IGFyZSBzZW50IHdpdGgKICAgU0VORCwgTU9WRSwgTVNFTkQsIGV0YywgYnV0IGFsc28gdG8gZmlsZXMgc2VudCBieSB0aGUgQy1LZXJtaXQgc2VydmVyCiAgIGluIHJlc3BvbnNlIHRvIEdFVCByZXF1ZXN0cy4KCiAgIEV4YW1wbGVzIGZvciBiaW5hcnkgbW9kZToKCiAgIFNFVCBTRU5EIEZJTFRFUiB7Z3ppcCAtYyBcdihmaWxlbmFtZSl9CiAgIFNFTkQgL0JJTkFSWSBvb2ZhLnR4dCBvb2ZhLnR4dC5negogICAgICAgICAgU2VuZHMgdGhlIG9vZmEudHh0IGZpbGUsIGNvbXByZXNzZWQgYnkgZ3ppcCwgYXMgb29mYS50eHQuZ3ouCgogICBTRU5EIC9CSU5BUlkgL0ZJTFRFUjp7Z3ppcCAtYyBcdihmaWxlbmFtZSl9IG9vZmEudHh0IG9vZmEudHh0Lmd6CiAgICAgICAgICBBcyBhYm92ZSwgYnV0IHRoZSBmaWx0ZXIgYXBwbGllcyBvbmx5IHRvIHRoaXMgU0VORCBjb21tYW5kLgoKICAgU0VUIFNFTkQgRklMVEVSIHtnemlwIC1jIFx2KGZpbGVuYW1lKX0KICAgU0VORCAvQklOQVJZIG9vZmEuKiBcZnVwcGVyKFxyZXBsYWNlKFx2KGZpbGVuYW1lKSwuLF8pKS5HWgogICAgICAgICAgU2VuZHMgYWxsIHRoZSBvb2ZhLiogZmlsZXMsIGNvbXByZXNzZWQgYnkgZ3ppcCwgZWFjaCB1bmRlciBpdHMKICAgICAgICAgIG93biBuYW1lLCBidXQgd2l0aCB0aGUgbmFtZSB1cHBlcmNhc2VkLCBhbGwgcGVyaW9kcyB3aXRoaW4gdGhlCiAgICAgICAgICBuYW1lIGNvbnZlcnRlZCB0byB1bmRlcnNjb3JlcywgYW5kICIuR1oiIGFwcGVuZGVkIHRvIGl0LiBTbywKICAgICAgICAgIGZvciBleGFtcGxlLCAib29mYS50eHQiIGlzIHNlbnQgYXMgIk9PRkFfVFhULkdaIi4KCiAgIEluIHRoZSBnemlwIGV4YW1wbGVzLCBub3RlIHRoYXQgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgaXMgc2VudCBpcwogICBub3JtYWxseSBsZXNzIHRoYW4gdGhlIG9yaWdpbmFsIGZpbGUgc2l6ZSBiZWNhdXNlIGd6aXAgY29tcHJlc3NlcyB0aGUKICAgZmlsZS4gQnV0IEtlcm1pdCBzZW5kcyB0aGUgb3JpZ2luYWwgZmlsZSBzaXplIGFoZWFkIGluIHRoZSBhdHRyaWJ1dGUKICAgcGFja2V0IGFueXdheSAodW5sZXNzIHlvdSB0ZWxsIGl0IG5vdCB0b28pLiBUaHVzIHRoZSB0cmFuc2ZlciB3aWxsCiAgIHByb2JhYmx5IGFwcGVhciB0byB0ZXJtaW5hdGUgZWFybHksIGUuZy4gd2hlbiB0aGUgcmVjZWl2ZXIncwogICBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgdGhlcm1vbWV0ZXIgaXMgb25seSBhdCA0MCUuIElmIHRoaXMgYW5ub3lzIHlvdSwKICAgdGVsbCBLZXJtaXQgdG8gInNldCBhdHRyaWJ1dGUgbGVuZ3RoIG9mZiIuIE9uIHRoZSBvdGhlciBoYW5kLCB5b3UgY2FuCiAgIHVzZSB0aGUgZmluYWwgcG9zaXRpb24gb2YgdGhlIHRoZXJtb21ldGVyIGFzIGEgbWVhc3VyZSBvZiB0aGUKICAgZWZmZWN0aXZlbmVzcyBvZiBjb21wcmVzc2lvbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMi4zLjIuIFRoZSBSRUNFSVZFIEZpbHRlcgoKICAgU0VUIFJFQ0VJVkUgRklMVEVSIFsgY29tbWFuZCBdCiAgICAgICAgICBUaGlzIGNvbW1hbmQgc3BlY2lmaWVzIHRoYXQgdGhlIGdpdmVuIGNvbW1hbmQgd2lsbCBiZSBydW4gb24KICAgICAgICAgIGFueSBmaWxlIHRoYXQgaXMgcmVjZWl2ZWQgYmVmb3JlIGl0IGlzIHdyaXR0ZW4gdG8gZGlzay4gVGhlCiAgICAgICAgICBjb21tYW5kIG1heSBiZSwgYnV0IG5lZWQgbm90IGJlLCBlbmNsb3NlZCBpbiBicmFjZXM7IGlmIGl0IGlzCiAgICAgICAgICB0aGUgYnJhY2VzIGFyZSBzdHJpcHBlZCBiZWZvcmUgdXNlLiBUaGUgZm9sbG93aW5nIHR3byBjb21tYW5kcwogICAgICAgICAgYXJlIGVxdWl2YWxlbnQ6CgogIFNFVCBSRUNFSVZFIEZJTFRFUiBzb3J0IC1yID4gXHYoZmlsZW5hbWUpCiAgU0VUIFJFQ0VJVkUgRklMVEVSIHtzb3J0IC1yID4gXHYoZmlsZW5hbWUpfQoKICAgVGhlIFJFQ0VJVkUgZmlsdGVyIGNvbW1hbmQgbWF5IGNvbnRhaW4gYSAiXHYoZmlsZW5hbWUpIiBzZXF1ZW5jZSB0byBiZQogICByZXBsYWNlZCBieSB0aGUgaW5jb21pbmcgZmlsZW5hbWUgZnJvbSB0aGUgZmlsZSBoZWFkZXIgcGFja2V0LCBidXQgaXQKICAgaXMgbm90IHJlcXVpcmVkLiBIb3dldmVyIHlvdSBtdXN0IHVzZSBpdCB3aGVuZXZlciB5b3VyIGZpbHRlciB3b3VsZAogICBub3JtYWxseSB3cml0ZSB0byBTdGRvdXQsIG90aGVyd2lzZSBpdHMgb3V0cHV0IHdpbGwgYmUgbG9zdC4KCiAgIFRoZSBSRUNFSVZFIGZpbHRlciBjb21tYW5kIG1heSBjb250YWluIG9uZSBvciBtb3JlICJcdihmaWxlbmFtZSkiCiAgIHNlcXVlbmNlIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSBpbmNvbWluZyBmaWxlbmFtZSBmcm9tIHRoZSBmaWxlIGhlYWRlcgogICBwYWNrZXQsIGJ1dCBpdCBpcyBub3QgcmVxdWlyZWQuIEhvd2V2ZXIgeW91IG11c3QgdXNlIGl0IHdoZW5ldmVyIHlvdXIKICAgZmlsdGVyIHdvdWxkIG5vcm1hbGx5IHdyaXRlIHRvIFN0ZG91dCwgb3RoZXJ3aXNlIGl0cyBvdXRwdXQgd2lsbCBiZQogICBsb3N0LgoKICAgUkVDRUlWRSAvRklMVEVSOmNvbW1hbmQgYW5kIEdFVCAvRklMVEVSOmNvbW1hbmQgY2FuIGFsc28gYmUgdXNlZCB0bwogICBzcGVjaWZ5IGEgZmlsdGVyIHRvIGJlIHVzZWQgZm9yIG9ubHkgb25lIGZpbGUtdHJhbnNmZXIgb3BlcmF0aW9uLgoKICAgVU5JWCBleGFtcGxlcyBmb3IgdGV4dCBtb2RlOgoKICAgU0VUIFJFQ0VJVkUgRklMVEVSIGxwcgogICBSRUNFSVZFCiAgICAgICAgICBBbGwgdGhlIGZpbGVzIHRoYXQgYXJlIHJlY2VpdmVkIGFyZSBzZW50IHRvIHRoZSBkZWZhdWx0IFVOSVgKICAgICAgICAgIHByaW50IHNwb29sZXIuCgogICBSRUNFSVZFIC9GSUxURVI6bHByCiAgICAgICAgICBTYW1lIGFzIGFib3ZlLCBleGNlcHQgdGhlIGxwciBmaWx0ZXIgaXMgdXNlZCBvbmx5IHdpdGggdGhpcwogICAgICAgICAgUkVDRUlWRSBjb21tYW5kLgoKICAgUkVDRUlWRSBscHIKICAgICAgICAgIFRoaXMgaXMgcHJvYmFibHkgbm90IHdoYXQgeW91IHdhbnQ7IGl0IGNyZWF0ZXMgYSBmaWxlIGNhbGxlZAogICAgICAgICAgbHByLgoKICAgU0VUIFJFQ0VJVkUgRklMVEVSIHtzb3J0IC1yID4gXHYoZmlsZW5hbWUpfQogICBSRUNFSVZFCiAgICAgICAgICBTdG9yZXMgZWFjaCBpbmNvbWluZyBmaWxlIHdpdGggaXRzIGxpbmVzIHNvcnRlZCBpbiByZXZlcnNlCiAgICAgICAgICBvcmRlciwgdW5kZXIgaXRzIG93biBuYW1lLgoKICAgUkVDRUlWRSAvRklMVEVSOntzb3J0IC1yID4gXHYoZmlsZW5hbWUpfQogICAgICAgICAgQXMgYWJvdmUsIGJ1dCB0aGUgZmlsdGVyIGlzIHVzZWQgb25seSBmb3IgdGhpcyBSRUNFSVZFIGNvbW1hbmQuCgogICBTRVQgUkVDRUlWRSBGSUxURVIgc29ydCAtciA+IFx2KGZpbGVuYW1lKQogICBSRUNFSVZFIHJldmVyc2UudHh0CiAgICAgICAgICBTdG9yZXMgZWFjaCBpbmNvbWluZyBmaWxlIHdpdGggaXRzIGxpbmVzIHNvcnRlZCBpbiByZXZlcnNlCiAgICAgICAgICBvcmRlciwgdW5kZXIgdGhlIG5hbWUgInJldmVyc2UudHh0Ii4gVGhlIGFjdHVhbCByZXN1bHQgZGVwZW5kcwogICAgICAgICAgb24gdGhlIEZJTEUgQ09MTElTSU9OIHNldHRpbmcuIElmIGl0IGlzIE9WRVJXUklURSBhbmQgbXVsdGlwbGUKICAgICAgICAgIGZpbGVzIGFycml2ZSwgdGhlbiBlYWNoIGluY29taW5nIGZpbGUgZGVzdHJveXMgdGhlIHByZXZpb3VzCiAgICAgICAgICBvbmUuIElmIGl0IGlzIEJBQ0tVUCAodGhlIGRlZmF1bHQpLCBmaWxlbmFtZSBjb25mbGljdHMgYXJlCiAgICAgICAgICByZXNvbHZlIGJ5IGFkZGluZyAidmVyc2lvbiBudW1iZXJzIiB0byB0aGUgZmlsZW5hbWVzOgogICAgICAgICAgcmV2ZXJzZS50eHQsIHJldmVyc2UudHh0Ln4xfiwgcmV2ZXJzZS50eHQufjJ+LCBldGMuCgogICBTRVQgUkVDRUlWRSBGSUxURVIgc29ydCAtciA+IFx2KGZpbGVuYW1lKQogICBSRUNFSVZFIFx2KGZpbGVuYW1lKS5yZXZlcnNlCiAgICAgICAgICBTdG9yZXMgZWFjaCBpbmNvbWluZyBmaWxlIHdpdGggaXRzIGxpbmVzIHNvcnRlZCBpbiByZXZlcnNlCiAgICAgICAgICBvcmRlciwgdW5kZXIgdGhlIG5hbWUgaXQgYXJyaXZlZCB3aXRoLCBidXQgd2l0aCAiLnJldmVyc2UiCiAgICAgICAgICBhcHBlbmRlZCB0byBpdC4KCiAgIFNFVCBSRUNFSVZFIEZJTFRFUiBzb3J0IC1yID4gXHYoZmlsZW5hbWUpCiAgIFJFQ0VJVkUgXGZsb3dlcihcdihmaWxlbmFtZSkpLnJldmVyc2UKICAgICAgICAgIExpa2UgdGhlIHByZXZpb3VzIGV4YW1wbGUsIGJ1dCBlbnN1cmVzIHRoYXQgdGhlIGZpbGVuYW1lIGlzCiAgICAgICAgICBsb3dlcmNhc2UuCgogICAgICAgICAgRXhhbXBsZXMgZm9yIGJpbmFyeSBtb2RlOgoKICAgU0VUIFJFQ0VJVkUgRklMVEVSIGd1bnppcCAtYyA+IFx2KGZpbGVuYW1lKQogICBSRUNFSVZFCiAgICAgICAgICBUaGlzIHJlY2VpdmVzIG9uZSBvciBtb3JlIHByZXN1bWFibHkgY29tcHJlc3NlZCBmaWxlIGFuZAogICAgICAgICAgdW5jb21wcmVzc2VzIGVhY2ggb25lIGludG8gYSBmaWxlIGhhdmluZyB0aGUgc2FtZSBuYW1lIGl0IHdhcwogICAgICAgICAgc2VudCB3aXRoLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGZpbGUgaXMgc2VudCB3aXRoIHRoZSBuYW1lCiAgICAgICAgICBPT0ZBLlRYVC5HWiwgaXQgaXMgc3RvcmVkIHdpdGggdGhhdCBuYW1lLCBldmVuIGFmdGVyCiAgICAgICAgICBkZWNvbXByZXNzaW9uLgoKICAgU0VUIFJFQ0VJVkUgRklMVEVSIGd1bnppcCAtYyA+IFx2KGZpbGVuYW1lKQogICBSRUNFSVZFIFxmbG93ZXIoXGZzdWJzdHJpbmcoXHYoZmlsZW5hbWUpLDEsXGZsZW5ndGgoXHYoZmlsZW5hbWUpKS0zKSkKICAgICAgICAgIExpa2UgdGhlIHByZXZpb3VzIGV4YW1wbGUsIGJ1dCB0aGUgcmVzdWx0aW5nIGZpbGVuYW1lIGhhcyBpdHMKICAgICAgICAgIHJpZ2h0bW9zdCB0aHJlZSBjaGFyYWN0ZXJzIHJlbW92ZWQgZnJvbSBpdCBhbmQgdGhlIHJlbWFpbmRlciBpcwogICAgICAgICAgbG93ZXJjYXNlZC4gU28gaWYgdGhlIGluY29taW5nIGZpbGVuYW1lIGlzIE9PRkEuVFhULkdaLCBpdCBpcwogICAgICAgICAgc3RvcmVkIGFzIG9vZmEudHh0IGFmdGVyIGRlY29tcHJlc3Npb24uCgogICBPZiBjb3Vyc2UgeW91IGRvbid0IHdhbnQgdG8gdHlwZSBzdWNoIGxvbmcgaGlkZW91cyBjb21tYW5kcywgc28gd2UKICAgaGF2ZSBhbHNvIGludHJvZHVjZWQgc2V2ZXJhbCBuZXcgZnVuY3Rpb25zOgoKICAgXGZzdHJpcHgoc3RyaW5nWyxjaGFyYWN0ZXJdKQogICAgICAgICAgVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZSByaWdodG1vc3Qgc2VnbWVudCBvZiB0aGUgc3RyaW5nIHRoYXQKICAgICAgICAgIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBjaGFyYWN0ZXIuIElmIG5vIGNoYXJhY3RlciBpcyBnaXZlbiwKICAgICAgICAgIHBlcmlvZCAoLikgaXMgdXNlZC4gVGh1cyBpdCBpcyBtb3N0IGNvbnZlbmllbnRseSB1c2VkIGZvcgogICAgICAgICAgc3RyaXBwaW5nIHRoZSBleHRlbnNpb24gZnJvbSBhIGZpbGVuYW1lIChvciB0aGUgZGVjaW1hbCBwb3J0aW9uCiAgICAgICAgICBmcm9tIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIHdyaXR0ZW4gaW4gVVMvVUsgc3R5bGUpLiBFeGFtcGxlczoKCiAgIFxmc3RyaXB4KE9PRkEuVFhULkdaKSAgICAgICAgICAgICA9PiBPT0ZBLlRYVAogICBcZnN0cmlweChPT0ZBLlRYVC5HWiwuKSAgICAgICAgICAgPT4gT09GQS5UWFQKICAgXGZzdHJpcHgoT09GQS5UWFQuR1osWCkgICAgICAgICAgID0+IE9PRkEuVAogICBcZnN0cmlweChcZnN0cmlweChPT0ZBLlRYVC5HWikpICAgPT4gT09GQQogICBcZnN0cmlweCgkMTAwLjAwKSAgICAgICAgICAgICAgICAgPT4gJDEwMAoKICAgXGZzdHJpcG4oc3RyaW5nLG51bWJlcikKICAgICAgICAgIFJlbW92ZXMgdGhlIHJpZ2h0bW9zdCBudW1iZXIgY2hhcmFjdGVycyBmcm9tIHRoZSBzdHJpbmcuCiAgICAgICAgICBFeGFtcGxlczoKCiAgIFxmc3RyaXBuKE9PRkEuVFhULkdaKSAgICAgICAgICAgICA9PiBPT0ZBLlRYVC5HWgogICBcZnN0cmlwbihPT0ZBLlRYVC5HWiwzKSAgICAgICAgICAgPT4gT09GQS5UWFQKICAgXGZzdHJpcG4oT09GQS5UWFQuR1osNykgICAgICAgICAgID0+IE9PRkEKCiAgIFxmc3RyaXBiKHN0cmluZ1ssYzFbLGMyXV0pCiAgICAgICAgICBTdHJpcHMgZW5jbG9zaW5nIG1hdGNoaW5nIGJyYWNlcywgYnJhY2tldHMsIHBhcmVudGhlc2VzLCBvcgogICAgICAgICAgcXVvdGVzIGZyb20gdGhlIHN0cmluZy4gVGhlIHNlY29uZCBhcmd1bWVudCwgYzEsIHNwZWNpZmllcwogICAgICAgICAgd2hpY2gga2luZCBvZiBlbmNsb3N1cmUgdG8gbG9vayBmb3I7IGlmIG5vdCBzcGVjaWZpZWQsIGFueQogICAgICAgICAgZW5jbG9zaW5nICgpLCBbXSwgPD4sIHt9LCAiIiwgJycsIG9yIGAnIGFyZSByZW1vdmVkLiBJZiBjMSBpcwogICAgICAgICAgc3BlY2lmaWVkIGFuZCBjMiBpcyBub3QsIHRoZW4gaWYgYzEgaXMgYW4gb3BlbmluZyBicmFjZSwKICAgICAgICAgIGJyYWNrZXQsIG9yIHBhcmVudGhlc2lzLCB0aGUgbWF0Y2hpbmcgY2xvc2luZyBvbmUgaXMgc3VwcGxpZWQKICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYXMgYzIuIElmIGJvdGggYzEgYW5kIGMyIGFyZSBzcGVjaWZpZWQsIHRoZW4gdG8KICAgICAgICAgIGJlIHN0cmlwcGVkIHRoZSBzdHJpbmcgbXVzdCBiZWdpbiB3aXRoIGMxIGFuZCBlbmQgd2l0aCBjMi4gSWYKICAgICAgICAgIHRoZSBzdHJpbmcgaXMgbm90IGVuY2xvc2VkIGluIHRoZSBpbmRpY2F0ZWQgbWFubmVyLCB0aGUgcmVzdWx0CiAgICAgICAgICBpcyB0aGUgb3JpZ2luYWwgc3RyaW5nLiBFeGFtcGxlczoKCiAgIFxmc3RyaXBiKCJhYmMiKSAgICAgICAgICAgICAgICAgICA9PiBhYmMKICAgXGZzdHJpcGIoW2FiY10pICAgICAgICAgICAgICAgICAgID0+IGFiYwogICBcZnN0cmlwYihbYWJjKSAgICAgICAgICAgICAgICAgICAgPT4gW2FiYwogICBcZnN0cmlwYig8YWJjPikgICAgICAgICAgICAgICAgICAgPT4gYWJjCiAgIFxmc3RyaXBiKDxhYmM+LFspICAgICAgICAgICAgICAgICA9PiA8YWJjPgogICBcZnN0cmlwYigoYWJjKSkgICAgICAgICAgICAgICAgICAgPT4gYWJjCiAgIFxmc3RyaXBiKChhYmMpLFspICAgICAgICAgICAgICAgICA9PiAoYWJjKQogICBcZnN0cmlwYigoYWJjKSx7KH0pICAgICAgICAgICAgICAgPT4gYWJjCiAgIFxmc3RyaXBiKCthYmMrKSAgICAgICAgICAgICAgICAgICA9PiArYWJjKwogICBcZnN0cmlwYigrYWJjKywrKSAgICAgICAgICAgICAgICAgPT4gYWJjCiAgIFxmc3RyaXBiKCthYmMrLCssXikgICAgICAgICAgICAgICA9PiArYWJjKwogICBcZnN0cmlwYigrYWJjXiwrLF4pICAgICAgICAgICAgICAgPT4gYWJjCiAgIFxmc3RyaXBiKCdhYmMnKSAgICAgICAgICAgICAgICAgICA9PiBhYmMKICAgXGZzdHJpcGIoYGFiYycpICAgICAgICAgICAgICAgICAgID0+IGFiYwogICBcZnN0cmlwYihgYGFiYycnKSAgICAgICAgICAgICAgICAgPT4gYGFiYycKICAgXGZzdHJpcGIoXGZzdHJpcGIoYGBhYmMnJykpICAgICAgID0+IGFiYwoKICAgICAgICAgIE5vdGljZSB0aGUgc3BlY2lhbCBzeW50YXggcmVxdWlyZWQgZm9yIGluY2x1ZGluZyBhIGxpdGVyYWwKICAgICAgICAgIHBhcmVudGhlc2lzIGluIHRoZSBhcmd1bWVudCBsaXN0LiBBcyB0aGUgbGFzdCB0d28gZXhhbXBsZXMKICAgICAgICAgIGlsbHVzdHJhdGUsIFxmc3RyaXBiKCkgc3RyaXBzIG9ubHkgb25lIGxldmVsIGF0IGF0IGEgdGltZTsKICAgICAgICAgIG5lc3RpbmcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSBzbWFsbCBmaXhlZCBudW1iZXIgb2YgbGV2ZWxzOwogICAgICAgICAgbG9vcHMgY2FuIGJlIHVzZWQgdG8gc3RyaXAgbGFyZ2VyIG9yIGluZGV0ZXJtaW5hdGUgbnVtYmVycyBvZgogICAgICAgICAgbGV2ZWxzLgoKICAgXGZsb3Aoc3RyaW5nWyxjaGFyXSkKICAgICAgICAgIFJlbW92ZXMgdGhlIGxlZnRtb3N0IHNlZ21lbnQgb2YgdGhlIHN0cmluZyB0aGF0IGVuZHMgd2l0aCB0aGUKICAgICAgICAgIGdpdmVuIGNoYXJhY3Rlci4gSWYgbm8gY2hhcmFjdGVyIGlzIGdpdmVuLCBwZXJpb2QgKC4pIGlzIHVzZWQuCiAgICAgICAgICBFeGFtcGxlczoKCiAgXGZsb3AoT09GQS5UWFQuR1opICAgICAgICAgICAgICAgPT4gVFhULkdaCiAgXGZsb3AoT09GQS5UWFQuR1osLikgICAgICAgICAgICAgPT4gVFhULkdaCiAgXGZsb3AoT09GQS5UWFQuR1osWCkgICAgICAgICAgICAgPT4gVC5HWgoKICAgICAgICAgIFRvIHJlbW92ZSB0aGUgbGVmdG1vc3QgbnVtYmVyIGNoYXJhY3RlcnMsIGp1c3QgdXNlCiAgICAgICAgICBcZnN1YnN0cmluZyhzLG51bWJlcisxKS4gVG8gcmV0dXJuIHRoZSByaWdodG1vc3QgbnVtYmVyCiAgICAgICAgICBjaGFyYWN0ZXJzLCB1c2UgXGZyaWdodChzLG51bWJlcikuCgogICBTbyB0aGUgaGlkZW91cyBleGFtcGxlOgoKICByZWNlaXZlIFxmbG93ZXIoXGZzdWJzdHJpbmcoXHYoZmlsZW5hbWUpLDEsXGZsZW5ndGgoXHYoZmlsZW5hbWUpKS0zKSkKCiAgIGNhbiBub3cgYmUgd3JpdHRlbiBhczoKCiAgcmVjZWl2ZSBcZmxvd2VyKFxmc3RyaXB4KFx2KGZpbGVuYW1lKSkpCgogICBUaGF0IGlzLCB0aGUgZmlsZW5hbWUgc3RyaXBwZWQgb2YgaXRzIGV4dGVuc2lvbiBhbmQgdGhlbiBsb3dlcmNhc2VkLgogICBUaGlzIGlzIG5vdCBvbmx5IHNob3J0ZXIgYW5kIGxlc3MgaGlkZW91cywgYnV0IGFsc28gZG9lcyBub3QgZGVwZW5kIG9uCiAgIHRoZSBsZW5ndGggb2YgdGhlIGV4dGVuc2lvbiBiZWluZyAzLgoKICAgTm90ZSB0aGF0IHdoZW4gYSByZWNlaXZlIGZpbHRlciBpcyBpbiBlZmZlY3QsIHRoaXMgb3ZlcnJpZGVzIHlvdXIgRklMRQogICBDT0xMSVNJT04gc2V0dGluZywgc2luY2UgS2VybWl0IGhhcyBubyB3YXkgb2Yga25vd2luZyB3aGF0IHRoZSBmaW5hbAogICBkZXN0aW5hdGlvbiBmaWxlbmFtZSB3aWxsIGJlIChiZWNhdXNlIGl0IGRvZXMgbm90IGtub3csIGFuZCBjYW4gbm90IGJlCiAgIGV4cGVjdGVkIHRvIGtub3csIHRoZSBzeW50YXggb2YgZXZlcnkgdmVyc2lvbiBvZiBldmVyeSBjb21tYW5kIHNoZWxsCiAgIG9uIGV2ZXJ5IHBsYXRmb3JtIG9uIHRoZSBwbGFuZXQpLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yLjQuIEltcGxpY2l0IFVzZSBvZiBQaXBlcwoKICAgSWYgeW91IHdpc2gsIEMtS2VybWl0IGNhbiBhbHNvIGV4YW1pbmUgaW5jb21pbmcgZmlsZW5hbWVzIHRvIHNlZSBpZgogICB0aGV5IHN0YXJ0IHdpdGggIiEiLCBhbmQgaWYgc28sIHRoZSBzdWJzZXF1ZW50IHRleHQgaXMgdHJlYXRlZCBhcyBhCiAgIGNvbW1hbmQgdG8gcmVhZCBmcm9tIG9yIHdyaXRlIHRvLiBGb3IgZXhhbXBsZSwgaWYgYSBLZXJtaXQgY2xpZW50IGlzCiAgIGdpdmVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKCiAgZ2V0IHshZmluZ2VyIHwgc29ydH0KCiAgIHRoZSBzZXJ2ZXIgb24gdGhlIG90aGVyIGVuZCwgaWYgaXQgc3VwcG9ydHMgdGhpcyBmZWF0dXJlLCB3aWxsIHJ1biB0aGUKICAgImZpbmdlciIgcHJvZ3JhbSwgcGlwZSBpdHMgc3RhbmRhcmQgb3V0cHV0IHRvIHRoZSAic29ydCIgcHJvZ3JhbSwgYW5kCiAgIHNlbmQgc29ydCdzIHN0YW5kYXJkIG91dHB1dCBiYWNrIHRvIHlvdS4gU2ltaWxhcmx5LCBpZiB5b3U6CgogIHNlbmQgb29mYS50eHQgIXNvcnQgLXIgPiBvb2ZhLm5ldwoKICAgb3IsIGVxdWl2YWxlbnRseToKCiAgc2VuZCBvb2ZhLnR4dCB7IXNvcnQgLXIgPiBvb2ZhLm5ld30KCiAgIG9yOgoKICBzZW5kIC9hcy1uYW1lOnshc29ydCAtciA+IG9vZmEubmV3fSBvb2ZhLnR4dAoKICAgdGhpcyBoYXMgdGhlIHJlY2VpdmVyIHNlbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBpbmNvbWluZyBvb2ZhLnR4dCBmaWxlCiAgIHRvIHRoZSBzb3J0IHByb2dyYW0sIHdoaWNoIHNvcnRzIHRoZSB0ZXh0IGluIHJldmVyc2Ugb3JkZXIgYW5kIHN0b3JlcwogICB0aGUgcmVzdWx0IGluIG9vZmEubmV3LgoKICAgVGhpcyB1c2Ugb2YgdGhlIGV4Y2xhbWF0aW9uIG1hcmsgc2hvdWxkIGJlIGZhbWlsaWFyIHRvIFVOSVggdXNlcnMgYXMKICAgdGhlICJiYW5nIiBmZWF0dXJlIHRoYXQgbGV0cyB5b3UgcnVuIGFuIGV4dGVybmFsIGFwcGxpY2F0aW9uIG9yCiAgIGNvbW1hbmQgZnJvbSB3aXRoaW4gYW5vdGhlciBhcHBsaWNhdGlvbi4KCiAgIEtlcm1pdCdzICJiYW5nIiBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIHNpbmNlIGl0IGlzIG5vdAogICB1bmhlYXJkIGZvciBmaWxlbmFtZXMgdG8gYWN0dWFsbHkgYmVnaW4gd2l0aCAiISIuIFNvIGlmIHlvdSB3YW50IHRvCiAgIHVzZSB0aGlzIGZlYXR1cmUsIHlvdSBtdXN0IGVuYWJsZSBpdCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKCiAgIFNFVCBUUkFOU0ZFUiBQSVBFUyB7IE9OLCBPRkYgfQogICAgICAgICAgT04gZW5hYmxlcyB0aGUgcmVjb2duaXRpb24gb2YgIiEiIG5vdGF0aW9uIGluIGluY29taW5nCiAgICAgICAgICBmaWxlbmFtZXMgZHVyaW5nIGZpbGUgdHJhbnNmZXIgYXMgYW4gaW5kaWNhdG9yIHRoYXQgdGhlCiAgICAgICAgICByZW1haW5pbmcgdGV4dCBpcyB0aGUgbmFtZSBvZiBhIGNvbW1hbmQuIE9GRiwgdGhlIGRlZmF1bHQsCiAgICAgICAgICBkaXNhYmxlcyB0aGlzIGZlYXR1cmUgYW5kIHVzZXMgdGhlIHRleHQgYXMgYSBmaWxlbmFtZSBpbiB0aGUKICAgICAgICAgIG5vcm1hbCBmYXNoaW9uLiBUaGlzIGNvbW1hbmQgZG9lcyBOT1QgYWZmZWN0IFNFTkQgL0NPTU1BTkQsIEdFVAogICAgICAgICAgL0NPTU1BTkQsIENTRU5ELCBldGMuCgogICBTbyB1c2luZyBhIGNvbWJpbmF0aW9uIG9mIENTRU5EIChTRU5EIC9DT01NQU5EKSBhbmQgdGhlICJiYW5nIgogICBmZWF0dXJlLCB5b3UgY2FuIHRyYW5zZmVyIGEgZGlyZWN0b3J5IHRyZWUgYWxsIGluIG9uZSBjb21tYW5kCiAgIChhc3N1bWluZyB0aGUgcmVtb3RlIEtlcm1pdCBzdXBwb3J0cyBwaXBlIHRyYW5zZmVycyBhbmQgaGFzIHRoZW0KICAgZW5hYmxlZCk6CgogIENTRU5EIHt0YXIgY2YgLSAuIHwgZ3ppcCAtY30geyFndW56aXAgLWMgfCB0YXIgeGYgLX0KCiAgIG9yOgoKICBTRU5EIC9DT01NQU5EOnt0YXIgY2YgLSAuIHwgZ3ppcCAtY30gL2FzOnshZ3VuemlwIC1jIHwgdGFyIHhmIC19CgogICBQYXkgY2xvc2UgYXR0ZW50aW9uIHRvIHRoZSBzeW50YXguIEJyYWNlcyBhcmUgbmVlZGVkIGFyb3VuZCB0aGUKICAgY29tbWFuZCBiZWNhdXNlIGl0IGNvbnRhaW5zIHNwYWNlczsgYnJhY2VzIGFyZSBuZWVkZWQgYXJvdW5kIHRoZQogICBhcy1uYW1lIGJlY2F1c2UgaXQgZW5kcyB3aXRoICItIi4gVGhlIGFzLW5hbWUgbXVzdCBiZWdpbiB3aXRoICIhIiBvcgogICByZWNlaXZpbmcgS2VybWl0IHdpbGwgbm90IHJlY29nbml6ZSBpdCBhcyBhIGNvbW1hbmQuIFRoZSBDU0VORCBjb21tYW5kCiAgIG11c3QgTk9UIGJlZ2luIHdpdGggIiEiIHVubGVzcyB5b3UgYXJlIHJ1bm5pbmcgYSBjb21tYW5kIHdob3NlIG5hbWUKICAgcmVhbGx5IGRvZXMgc3RhcnQgdGhhdCBjaGFyYWN0ZXIuCgogICBTaW1pbGFybHksIHlvdSBoYXZlIGEgS2VybWl0IHNlcnZlciBzZW5kIGEgZGlyZWN0b3J5IHRyZWUgdG8gYmUKICAgdW5wYWNrZWQgb24gdGhlIGNsaWVudCBlbmQ6CgogIENHRVQgeyF0YXIgY2YgLSAuIHwgZ3ppcCAtY30ge2d1bnppcCAtYyB8IHRhciB4ZiAtfQoKICAgb3I6CgogIEdFVCAvQ09NTUFORCB7IXRhciBjZiAtIC4gfCBnemlwIC1jfSAvYXM6e2d1bnppcCAtYyB8IHRhciB4ZiAtfQoKICAgTm90aWNlIGhvdywgaW4gdGhpcyBjYXNlLCB0aGUgYmFuZyBpcyByZXF1aXJlZCBpbiB0aGUgcmVtb3RlIGNvbW1hbmQsCiAgIHRvIGRpc3Rpbmd1aXNoIGl0IGZyb20gYSBmaWxlbmFtZSwgYnV0IG5vdCBpbiB0aGUgbG9jYWwgY29tbWFuZCwgc2luY2UKICAgYnkgZGVmaW5pdGlvbiBvZiBDR0VUIChvciBHRVQgL0NPTU1BTkQpLCBpdCBpcyBrbm93biB0byBiZSBhIGNvbW1hbmQuCgogICBTRU5EIGFuZCBSRUNFSVZFIEZJTFRFUnMgc3VwZXJzZWRlIHRoZSBiYW5nIGZlYXR1cmUuIEZvciBleGFtcGxlLCBpZiBhCiAgIGZpbGUgYXJyaXZlcyB1bmRlciB0aGUgbmFtZSAiIWd1bnppcCAtYyB8IHRhciB4ZiAtIiwgYnV0IHRoZSByZWNlaXZpbmcKICAgS2VybWl0IGFsc28gaGFzIGJlZW4gZ2l2ZW4gYSBjb21tYW5kIGxpa2U6CgogIHNldCByZWNlaXZlIGZpbHRlciBzb3J0IC1yID4gXHYoZmlsZW5hbWUpCgogICB0aGVuIHRoZSBpbmNvbWluZyBkYXRhIHdpbGwgYmUgc29ydGVkIHJhdGhlciB0aGFuIGd1bnppcHBlZC4KCiAgIEZpbmFsbHksIGlmIFNFVCBUUkFOU0ZFUiBQSVBFUyBpcyBPTiAoYW5kIGluIHRoaXMgY2FzZSwgdGhpcyBtdXN0IGJlCiAgIGRvbmUgaW4geW91ciBDLUtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlKSwgeW91IGNhbiBzZW5kIGZyb20gYSBwaXBlCiAgIG9uIHRoZSBDLUtlcm1pdCBjb21tYW5kIGxpbmU6CgogIGtlcm1pdCAtcyAiIWZpbmdlciB8IHNvcnQgLXIiIC1hIHVzZXJsaXN0CgogICBJbiB0aGlzIGNhc2UgdGhlICJmaWxlbmFtZSIgY29udGFpbnMgc3BhY2VzIGFuZCBzbyBtdXN0IGJlIHF1b3RpbmcKICAgdXNpbmcgeW91ciBzaGVsbCdzIHF1b3RpbmcgcnVsZXMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIuNS4gU3VjY2VzcyBhbmQgRmFpbHVyZSBvZiBQaXBlZCBDb21tYW5kcwoKICAgQ29tbWFuZHMgb3IgcHJvZ3JhbXMgc3RhcnRlZCBieSBLZXJtaXQgYXMgYSByZXN1bHQgb2YgQ1NFTkQgb3IKICAgQ1JFQ0VJVkUgY29tbWFuZHMsIENHRVQsIFNFTkQgL0NPTU1BTkQsIFJFRElSRUNUIGNvbW1hbmRzIChzZWUKICAgWzQ0N11TZWN0aW9uIDQuMi44LjIpLCBpbXBsaWNpdCB1c2Ugb2YgcGlwZXMsIFJVTiBjb21tYW5kcywgYW5kIHNvCiAgIGZvcnRoLCBzaG91bGQgcmV0dXJuIHRoZWlyIGV4aXQgc3RhdHVzIGNvZGVzIHRvIHRoZSBLZXJtaXQgY29tbWFuZAogICB0aGF0IGNhdXNlZCB0aGVtIHRvIGJlIHJ1biwgYW5kIHRoZXJlZm9yZSBJRiBTVUNDRVNTIGFuZCBJRiBGQUlMVVJFCiAgIHRlc3RzIGFmdGVyIHRoZXNlIGNvbW1hbmRzIHNob3VsZCB3b3JrIGFzIGV4cGVjdGVkLiBGb3IgZXhhbXBsZToKCiAgQ1NFTkQgYmxhaCA8IGZpbGVuYW1lCgogICBzaG91bGQgZmFpbCBpZiB0aGVyZSBpcyBubyBjb21tYW5kIGNhbGxlZCAiYmxhaCIgb3IgaWYgdGhlcmUgaXMgbm8KICAgZmlsZSBjYWxsZWQgImZpbGVuYW1lIi4gSG93ZXZlciwgdGhpcyBpcyBub3QgZm9vbHByb29mIGFuZCBzb21ldGltZXMKICAgQy1LZXJtaXQgbWlnaHQgdGhpbmsgYSBjb21tYW5kIHN1Y2NlZWRlZCB3aGVuIGl0IGZhaWxlZCwgb3IgdmljZQogICB2ZXJzYS4gVGhpcyBpcyBtb3N0IGxpa2VseSB0byBoYXBwZW4gd2hlbiB0aGUgaGlnaGx5IHN5c3RlbS1kZXBlbmRlbnQKICAgbWV0aG9kcyB0aGF0IEtlcm1pdCBtdXN0IHVzZSB0byBkZXRlcm1pbmUgYSBjb21tYW5kJ3MgZXhpdCBzdGF0dXMgY29kZQogICBkbyBub3Qgc3VwcGx5IHRoZSByaWdodCBpbmZvcm1hdGlvbi4KCiAgIEl0IGNhbiBhbHNvIGhhcHBlbiBiZWNhdXNlIHNvbWUgY29tbWFuZHMgbWlnaHQgZGVmaW5lIHN1Y2Nlc3MgYW5kCiAgIGZhaWx1cmUgZGlmZmVyZW50bHkgZnJvbSB3aGF0IHlvdSBleHBlY3QsIG9yIGJlY2F1c2UgeW91IGFyZSB1c2luZyBhCiAgIHBpcGVsaW5lIGNvbXBvc2VkIG9mIG1hbnkgY29tbWFuZHMsIGFuZCBvbmUgb2YgdGhlbSBmYWlscyB0byBwYXNzCiAgIGZhaWxpbmcgZXhpdCBzdGF0dXMgY29kZXMgdXAgdGhlIGNoYWluLiBUaGUgbW9zdCBsaWtlbHkgY3VscHJpdCBpcyB0aGUKICAgc2hlbGwgaXRzZWxmLCB3aGljaCBpbiBtb3N0IGNhc2VzIG11c3QgYmUgaW50ZXJwb3NlZCBiZXR3ZWVuIEtlcm1pdAogICBhbmQgYW55IGV4dGVybmFsIHByb2dyYW0gdG8gYmUgcnVuLgoKICAgSW4gYW55IGNhc2UsIHlvdSBjYW4gZXhhbWluZSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIHRvIGZpbmQgb3V0IHRoZQogICBleGl0IHN0YXR1cyBjb2RlIHJldHVybmVkIHRvIEtlcm1pdCBieSB0aGUgcHJvY2VzcyBtb3N0IHJlY2VudGx5IHJ1bgogICBieSBhbnkgY29tbWFuZCB0aGF0IHJ1bnMgZXh0ZXJuYWwgY29tbWFuZHMgb3IgcHJvZ3JhbXMsIGluY2x1ZGluZwogICBDU0VORCwgQ1JFQ0VJVkUsIFJFRElSRUNULCBSVU4sIGV0YzoKCiAgXHYocGV4aXRzdGF0KQoKICAgSW4gVU5JWCwgV2luZG93cyBhbmQgT1MvMiwgdGhlIHZhbHVlIHNob3VsZCBiZSAtMiBpZiBubyBjb21tYW5kIGhhcwogICBiZWVuIHJ1biB5ZXQsIDAgaWYgdGhlIG1vc3QgcmVjZW50IGNvbW1hbmQgc3VjY2VlZGVkLCAtMSwgLTMsIG9yIC00IGlmCiAgIHRoZXJlIHdhcyBhbiBpbnRlcm5hbCBlcnJvciwgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIHJldHVybmVkIGJ5IHRoZQogICBjb21tYW5kIGl0c2VsZiBpZiB0aGUgY29tbWFuZCBmYWlsZWQuIElmIHRoZSBudW1iZXIgaXMgaW4gdGhlIHJhbmdlCiAgIDEtMTI3LCB0aGlzIGlzIHRoZSBwcm9ncmFtJ3MgZXhpdCBzdGF0dXMgY29kZS4gSWYgaXQgaXMgMTI4IG9yCiAgIGdyZWF0ZXIsIHRoaXMgaXMgc3VwcG9zZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29tbWFuZCBvciBwcm9ncmFtIHdhcwogICBpbnRlcnJ1cHRlZCBvciB0ZXJtaW5hdGVkIGZyb20gb3V0c2lkZSBpdHNlbGYuCgogICBJbiBXaW5kb3dzIDk1IGFuZCA5OCwgdGhlIHJldHVybiB2YWx1ZXMgb2YgdGhlIGRlZmF1bHQgc2hlbGwgYXJlCiAgIHVucmVsaWFibGU7IHZhcmlvdXMgdGhpcmQtcGFydHkgc2hlbGxzIGNhbiBiZSB1c2VkIHRvIHdvcmsgYXJvdW5kIHRoaXMKICAgZGVmaWNpZW5jeS4KCiAgIEluIFZNUywgaXQgaXMgdGhlIGFjdHVhbCBleGl0IHN0YXR1cyBjb2RlIG9mIHRoZSBjb21tYW5kIHRoYXQgd2FzIHJ1bi4KICAgVGhpcyBpcyBhbiBvZGQgbnVtYmVyIGlmIHRoZSBjb21tYW5kIHN1Y2NlZWRlZCwgYW5kIGFuIGV2ZW4gbnVtYmVyIGlmCiAgIGl0IGZhaWxlZC4gWW91IGNhbiBzZWUgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZSBhcyBmb2xsb3dzOgoKICBydW4gd3JpdGUgc3lzJG91dHB1dCBmJG1lc3NhZ2UoXHYocGV4aXRzdGF0KSkKCiAgIE9yLCBtb3JlIGNvbnZlbmllbnRseSwgdXNlIHRoZSBuZXcgS2VybWl0IGZ1bmN0aW9uOgoKICBlY2hvIFxmZXJyc3RyaW5nKFx2KHBleGl0c3RhdCkpCgogICB3aGljaCBjb252ZXJ0cyBhIHN5c3RlbSBlcnJvciBjb2RlIChudW1iZXIpIHRvIHRoZSBjb3JyZXNwb25kaW5nCiAgIG1lc3NhZ2UuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIuNi4gQ2F1dGlvbnMgYWJvdXQgVXNpbmcgUGlwZXMgdG8gVHJhbnNmZXIgRGlyZWN0b3J5IFRyZWVzCgogICBBbHRob3VnaCB1dGlsaXRpZXMgc3VjaCBhcyB0YXIgYW5kIHppcC91bnppcCBtaWdodCBiZSBhdmFpbGFibGUgb24KICAgZGlmZmVyZW50IHBsYXRmb3JtcyAoc3VjaCBhcyBVTklYIGFuZCBXaW5kb3dzKSwgdGhpcyBkb2VzIG5vdAogICBuZWNlc3NhcmlseSBtZWFuIHlvdSBjYW4gdXNlIHRoZW0gc3VjY2Vzc2Z1bGx5IHRvIHRyYW5zZmVyIGRpcmVjdG9yeQogICB0cmVlcyBiZXR3ZWVuIHVubGlrZSBwbGF0Zm9ybXMuIEZvciBleGFtcGxlOgoKICBDU0VORCB7dGFyIGNmIC0gLiB8IGd6aXAgLWN9IHshZ3VuemlwIC1jIHwgdGFyIHhmIC19CgogICB3aGVuIHVzZWQgZnJvbSBVTklYIHRvIFdpbmRvd3Mgd2lsbCBoYXZlIHNhdGlzZmFjdG9yeSByZXN1bHRzIGZvcgogICBiaW5hcnkgZmlsZXMsIGJ1dCBub3QgZm9yIHRleHQgZmlsZXMuIFVOSVggdGV4dCBmaWxlcyBoYXZlIGxpbmVzCiAgIGVuZGluZyB3aXRoIExpbmVmZWVkIChMRikgb25seSwgd2hlcmVhcyBXaW5kb3dzIHRleHQgZmlsZXMgaGF2ZSBsaW5lcwogICBlbmRpbmcgaW4gQ2FycmlhZ2UgUmV0dXJuIGFuZCBMaW5lZmVlZCAoQ1JMRikuIFRodXMgYW55IHRleHQgZmlsZXMKICAgdGhhdCB3ZXJlIGluIHRoZSBhcmNoaXZlIGZvcm1lZCBieSB0aGUgZmlyc3QgdGFyIGNvbW1hbmQgd2lsbCBiZQogICB1bnBhY2tlZCBieSB0aGUgc2Vjb25kIHRhciBjb21tYW5kIGluIHRoZWlyIG9yaWdpbmFsIGZvcm0sIGFuZCB3aWxsCiAgIGRpc3BsYXkgYW5kIHByaW50IGluY29ycmVjdGx5IGluIFdpbmRvd3MgKGV4Y2VwdCBpbiBhcHBsaWNhdGlvbnMgdGhhdAogICBoYXZlIGJlZW4gZXhwbGljaXRseSBjb2RlZCB0byBoYW5kbGUgVU5JWC1mb3JtYXQgdGV4dCBmaWxlcykuIE9uIHRoZQogICBvdGhlciBoYW5kIGlmIHlvdSB0b2xkIGd6aXAgdG8gdXNlICJ0ZXh0IG1vZGUiIHRvIGRvIHJlY29yZCBmb3JtYXQKICAgY29udmVyc2lvbiAoYXNzdW1pbmcgdGhlcmUgd2FzIGEgd2F5IHRvIHRlbGwgaXQsIGFzIHRoZXJlIGlzIHdpdGggbW9zdAogICAiemlwIiBwcm9ncmFtcyksIHRoaXMgd291bGQgZGVzdHJveSBhbnkgYmluYXJ5IGZpbGVzIGluIHRoZSBhcmNoaXZlLgoKICAgRnVydGhlcm1vcmUsIGlmIHRoZSBhcmNoaXZlIGNvbnRhaW5zIHRleHQgZmlsZXMgdGhhdCBhcmUgd3JpdHRlbiBpbgogICBsYW5ndWFnZXMgb3RoZXIgdGhhbiBFbmdsaXNoLCB0aGUgInNwZWNpYWwiIChhY2NlbnRlZCBhbmQvb3IKICAgbm9uLVJvbWFuKSBjaGFyYWN0ZXJzIGFyZSBOT1QgdHJhbnNsYXRlZCwgYW5kIGFyZSB0aGVyZWZvcmUgbGlrZWx5CiAgIHNob3cgdXAgYXMgZ2liYmVyaXNoIG9uIHRoZSB0YXJnZXQgc3lzdGVtLiBGb3IgZXhhbXBsZSwgV2VzdCBFdXJvcGVhbgogICBsYW5ndWFnZXMgYXJlIHVzdWFsbHkgZW5jb2RlZCBpbiBJU08gTGF0aW4gQWxwaGFiZXQgMSBpbiBVTklYLCBidXQgaW4KICAgUEMgY29kZSBwYWdlIDg1MCBvbiB0aGUgUEMuIENhcGl0YWwgQSB3aXRoIGFjdXRlIGFjY2VudCBpcyBjb2RlIHBvaW50CiAgIDE5MyAoZGVjaW1hbCkgTGF0aW4tMSwgYnV0IDE4MSBpbiBDUDg1MC4gU28gQS1hY3V0ZSBpbiB0aGUgVU5JWCBmaWxlCiAgIGJlY29tZXMgTWlkZGxlIEJveCBCb3R0b20gb24gdGhlIFBDLCBhbmQgc2ltaWxhcmx5IGZvciBhbGwgdGhlIG90aGVyCiAgIHNwZWNpYWwgY2hhcmFjdGVycywgYW5kIGZvciBhbGwgb3RoZXIgbGFuZ3VhZ2VzIC0tIEdyZWVrLCBSdXNzaWFuLAogICBIZWJyZXcsIEphcGFuZXNlLCBldGMuCgogICBTbyB3aGVuIHRyYW5zZmVycmluZyB0ZXh0IGZpbGVzIGJldHdlZW4gdW5saWtlIHBsYXRmb3JtcywgeW91IHNob3VsZAogICB1c2UgZGlyZWN0IEtlcm1pdCBmaWxlIHRyYW5zZmVycyBzbyBLZXJtaXQgY2FuIGFwcGx5IHRoZSBuZWVkZWQKICAgcmVjb3JkLWZvcm1hdCBhbmQgY2hhcmFjdGVyLXNldCB0cmFuc2Zvcm1hdGlvbnMuIFVzZSBwaXBlbGluZXMKICAgY29udGFpbmluZyBhcmNoaXZlcnMgbGlrZSB0YXIgb3IgemlwIG9ubHkgaWYgYWxsIHRoZSBmaWxlcyBhcmUgYmluYXJ5CiAgIG9yIHRoZSB0d28gc3lzdGVtcyB1c2UgdGhlIHNhbWUgcmVjb3JkIGZvcm1hdCBhbmQgY2hhcmFjdGVyIHNldCBmb3IKICAgdGV4dCBmaWxlcy4KCiAgIEFsc28gc2VlIFs0NDhdU2VjdGlvbnMgNC4zLCBbNDQ5XTQuMTAsIFs0NTBdNC4xMSwgYW5kIFs0NTFdNC4xNSBmb3IKICAgaG93IHRvIHRyYW5zZmVyIGRpcmVjdG9yeSB0cmVlcyBiZXR3ZWVuIGJvdGggbGlrZSBhbmQgdW5saWtlIHN5c3RlbXMKICAgZGlyZWN0bHkgd2l0aCBLZXJtaXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIuNy4gUGlwZXMgYW5kIEVuY3J5cHRpb24KCiAgIE9mIGNvdXJzZSBwaXBlbGluZXMgY291bGQgYmUgdXNlZCBmb3IgZW5jcnlwdGVkIGZpbGUgdHJhbnNmZXJzLAogICBhc3N1bWluZyBwcm9wZXIgcHJlY2F1dGlvbnMgY291bGQgYmUgdGFrZW4gY29uY2VybmluZyB0aGUgdHJhbnNtaXNzaW9uCiAgIG9mIHRoZSBrZXkuIEJ1dCB0aGVyZSBpcyByYXJlbHkgYSBnb29kIHdheSB0byBkbyB0aGlzLiBUbyBpbGx1c3RyYXRlCiAgIHVzaW5nIFVOSVggY3J5cHQ6CgogIGNzZW5kIHtjcnlwdCBrZXkgPCBmaWxlbmFtZX0geyFjcnlwdCBrZXkgPiBmaWxlbmFtZX0KCiAgIE9yLCBtb3JlIGFtYml0aW91c2x5OgoKICBjc2VuZCB7dGFyIGNmIC0gLiB8IGd6aXAgLWMgfCBjcnlwdCBrZXl9IHshY3J5cHQga2V5IHwgZ3VuemlwIC1jIHwgdGFyIHhmIC19CgogICB0cmFuc21pdHMgdGhlIGtleSBpbiB0aGUgZmlsZSBoZWFkZXIgcGFja2V0IGFzIHBhcnQgb2YgdGhlCiAgIChjbGVhci10ZXh0KSByZW1vdGUgY29tbWFuZCwgZGVmZWF0aW5nIHRoZSBlbnRpcmUgcHVycG9zZSBvZgogICBlbmNyeXB0aW5nIHRoZSBmaWxlIGRhdGEuCgogICBCdXQgaWYgeW91IGFyZSBjb25uZWN0ZWQgaW4gdGVybWluYWwgbW9kZSB0byB0aGUgcmVtb3RlIGNvbXB1dGVyIGFuZAogICB0eXBlOgoKICBjcmVjZWl2ZSB7Y3J5cHQga2V5ID4gZmlsZW5hbWV9CgogICBhdCB0aGUgcmVtb3RlIEtlcm1pdCBwcm9tcHQsIHlvdSBoYXZlIGFsc28gdHJhbnNtaXR0ZWQgdGhlIGtleSBpbgogICBjbGVhciB0ZXh0IG92ZXIgdGhlIGNvbW11bmljYXRpb25zIGxpbmsuCgogICBBdCBwcmVzZW50LCB0aGUgb25seSBzZWN1cmUgd2F5IHRvIHVzZSBDU0VORCBhbmQgQ1JFQ0VJVkUgd2l0aCBhbgogICBlbmNyeXB0aW9uIGZpbHRlciBpcyB0byBoYXZlIGEgaHVtYW4gb3BlcmF0b3IgYXQgYm90aCBlbmRzLCBzbyB0aGUga2V5CiAgIGRvZXMgbm90IGhhdmUgdG8gYmUgdHJhbnNtaXR0ZWQuCgogICBUaGVvcmV0aWNhbGx5IGl0IHdvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBQR1Agc29mdHdhcmUgKFByZXR0eSBHb29kCiAgIFByaXZhY3ksIGJ5IFBoaWwgWmltbWVybWFuLCBQaGlsJ3MgUHJldHR5IEdvb2QgU29mdHdhcmUpIHRvIGF2b2lkIGtleQogICB0cmFuc21pc3Npb24gKHNpbmNlIFBHUCB1c2VzIHNlcGFyYXRlIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXkgYW5kICJsZXRzCiAgIHlvdSBjb21tdW5pY2F0ZSBzZWN1cmVseSB3aXRoIHBlb3BsZSB5b3UndmUgbmV2ZXIgbWV0LCB3aXRoIG5vIHNlY3VyZQogICBjaGFubmVscyBuZWVkZWQgZm9yIHByaW9yIGV4Y2hhbmdlIG9mIGtleXMiKSwgYnV0IHRoZSBzcGVjaWZpYyBtZXRob2QKICAgaGFzIHlldCB0byBiZSB3b3JrZWQgb3V0LgoKICAgICBISU5UOiBTZWUgdGhlIFBHUCBVc2VyJ3MgR3VpZGUsIGUuZy4gYXQ6CiAgICAgWzQ1Ml1odHRwOi8vd3d3LnRlbHN0cmEuY29tLmF1L2RvY3MvUEdQLwogICAgIEVzcGVjaWFsbHkgdGhlIHRvcGljICJVc2luZyBQR1AgYXMgYSBVTklYLVN0eWxlIEZpbHRlciI6CiAgICAgWzQ1M11odHRwOi8vd3d3LnRlbHN0cmEuY29tLmF1L2RvY3MvUEdQL3BncGRvYzIvcGdwZG9jMl8xNy5odG1sCgogICBJbiBhbnkgY2FzZSwgYmV0dGVyIGFuZCBtb3JlIGNvbnZlbmllbnQgc2VjdXJpdHkgb3B0aW9ucyBhcmUgbm93CiAgIGF2YWlsYWJsZTogS2VyYmVyb3MgYXV0aGVudGljYXRpb24gYW5kIGVuY3J5cHRpb24gKFs0NTRdQ0xJQ0sgSEVSRSBmb3IKICAgZGV0YWlscykgYW5kIHRoZSBuZXcgYWJpbGl0eSB0byBydW4gQy1LZXJtaXQgInRob3VnaCIgb3RoZXIKICAgY29tbXVuaWNhdGlvbiBwcm9ncmFtcywgZGVzY3JpYmVkIGluIFs0NTVdU2VjdGlvbiAyLjcuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIuOC4gQ29tbWFuZHMgYW5kIEZ1bmN0aW9ucyBSZWxhdGVkIHRvIFBpcGVzCgogICAgNC4yLjguMS4gVGhlIE9QRU4gIVJFQUQgYW5kIE9QRU4gIVdSSVRFIENvbW1hbmRzCgogICBUaGVzZSBhcmUgZGVzY3JpYmVkIGluIFs0NTZdVXNpbmcgQy1LZXJtaXQsIGFuZCBhcmUgZ2VuZXJhbGx5IHVzZWZ1bAogICB3aXRoIHJlYWRpbmcgb3V0cHV0IGZyb20gY29tbWFuZHMgdGhhdCBwcm9kdWNlIG1vcmUgdGhhbiBvbmUgbGluZSBvbgogICB0aGVpciBzdGFuZGFyZCBvdXRwdXQsIG9yIHdyaXRpbmcgbXVsdGlwbGUgbGluZXMgaW50byBjb21tYW5kcyB0aGF0CiAgIGFjY2VwdCB0aGVtIG9uIHRoZWlyIHN0YW5kYXJkIGlucHV0LgoKICAgSW4gQy1LZXJtaXQgNy4wIENMT1NFICFSRUFEIGlzIGFjY2VwdGVkIGFzIGEgc3lub255bSBmb3IgQ0xPU0UgUkVBRCwKICAgYW5kIENMT1NFICFXUklURSBmb3IgQ0xPU0UgV1JJVEUuCgogICBUZXN0aW5nIHRoZSBzdWNjZXNzIGFuZCBmYWlsdXJlIG9mIHRoZXNlIGNvbW1hbmRzLCBob3dldmVyLCBjYW4gYmUgYQogICBiaXQgdHJpY2t5LiBDb25zaWRlcjoKCiAgb3BlbiAhcmVhZCBsYWxhc2tqZnNsZGtmanNsZGtmagoKICAgKHdoZXJlICJsYWxhc2tqZnNsZGtmanNsZGtmaiIgaXMgbmVpdGhlciBhIHZhbGlkIGNvbW1hbmQgbm9yIHRoZSBuYW1lCiAgIG9mIGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdCBjYW4gYmUgcnVuKS4gT1BFTiAhUkVBRCwgaW4gVU5JWCBhdCBsZWFzdCwKICAgdHJhbnNsYXRlcyB0aGlzIGludG8gZXhlY2woc2hlbGxwYXRoLHNoZWxsbmFtZSwiLWMiLGNvbW1hbmQpLiBUaGlzCiAgIG1lYW5zIGl0IHN0YXJ0cyB5b3VyIHByZWZlcnJlZCBzaGVsbCAoZS5nLiBmcm9tIHRoZSBTSEVMTCBlbnZpcm9ubWVudAogICB2YXJpYWJsZSkgYW5kIGFza3MgaXQgdG8gZXhlY3V0ZSB0aGUgZ2l2ZW4gY29tbWFuZC4gSXQgbXVzdCBiZSB0aGlzCiAgIHdheSwgYmVjYXVzZSB5b3VyIGNvbW1hbmQgY2FuIGJlIGEgZWl0aGVyIGFuIGludGVybmFsIHNoZWxsIGNvbW1hbmQKICAgKHdoaWNoIG9ubHkgeW91ciBzaGVsbCBjYW4gZXhlY3V0ZSkgb3IgYW4gZXh0ZXJuYWwgY29tbWFuZCwgd2hpY2ggb25seQogICB5b3VyIHNoZWxsIGtub3dzIGhvdyB0byBmaW5kIChpdCBrbm93cyB5b3VyIFBBVEggYW5kIGludGVycHJldHMsIGV0YykuCiAgIFRoZXJlZm9yZSB1bmxlc3MgT1BFTiAhUkVBRCBjYW4ndCBzdGFydCB5b3VyIHNoZWxsLCBpdCBhbHdheXMKICAgc3VjY2VlZHMuCgogICBDb250aW51aW5nIHdpdGggdGhlIG5vbmV4aXN0ZW50LWNvbW1hbmQgZXhhbXBsZToKCiAgQy1LZXJtaXQ+IG9wZW4gIXJlYWQgbGFsYXNramZzbGRrZmpzbGRrZmoKICBDLUtlcm1pdD4gc3RhdHVzCiAgIFNVQ0NFU1MKICBDLUtlcm1pdD4gcmVhZCBsaW5lCiAgQy1LZXJtaXQ+IHN0YXR1cwogICBTVUNDRVNTCiAgQy1LZXJtaXQ+IGVjaG8gIlxtKGxpbmUpIgogICJiYXNoOiBsYWxhc2tqZnNsZGtmanNsZGtmajogY29tbWFuZCBub3QgZm91bmQiCiAgQy1LZXJtaXQ+IGNsb3NlIHJlYWQKICBDLUtlcm1pdD4gc3RhdHVzCiAgIEZBSUxVUkUKICBDLUtlcm1pdD4KCiAgIEluIG90aGVyIHdvcmRzLCB0aGUgZmFpbHVyZSBjYW4gbm90IGJlIGRldGVjdGVkIG9uIE9QRU4sIHNpbmNlIHRoZQogICBPUEVOIGNvbW1hbmQgc3VjY2VlZHMgaWYgaXQgY2FuIHN0YXJ0IHlvdXIgc2hlbGwuIEl0IGNhbid0IGJlIGRldGVjdGVkCiAgIG9uIFJFQUQsIHNpbmNlIGFsbCB0aGlzIGRvZXMgaXMgcmVhZCBvdXRwdXQgZnJvbSB0aGUgc2hlbGwsIHdoaWNoIGluCiAgIHRoaXMgY2FzZSBoYXBwZW5zIHRvIGJlIGFuIGVycm9yIG1lc3NhZ2UuIEhvd2V2ZXIsIGZhaWx1cmUgSVMgZGV0ZWN0ZWQKICAgdXBvbiBjbG9zZSwgc2luY2UgdGhpcyBpcyB0aGUgb2NjYXNpb24gdXBvbiB3aGljaCB0aGUgc2hlbGwgZ2l2ZXMKICAgS2VybWl0IGl0cyBleGl0IHN0YXR1cyBjb2RlLgoKICAgRm9yIGFuIGlsbHVzdHJhdGlvbiBvZiB0aGlzIHNpdHVhdGlvbiwgc2VlIFs0NTddU2VjdGlvbiAyLjE0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yLjguMi4gVGhlIFJFRElSRUNUIENvbW1hbmQKCiAgIEEgc2Vjb25kIG1ldGhvZCBvZiBJL08gcmVkaXJlY3Rpb24gaXMgb2ZmZXJlZCBieSB0aGUgUkVESVJFQ1QgY29tbWFuZC4KICAgVGhpcyBpcyBhIHJhdGhlciBhZHZhbmNlZCBhbmQgdHJpY2t5IGZlYXR1cmUgdGhhdCBpcyBwcmVzZW50bHkKICAgc3VwcG9ydGVkIG9ubHkgaW4gVU5JWCBDLUtlcm1pdCwgaW4gT1MtOSBDLUtlcm1pdCwgYW5kIGluIEtlcm1pdCA5NS4KICAgU3ludGF4OgoKICAgUkVESVJFQ1QgY29tbWFuZAogICAgICAgICAgUnVucyB0aGUgZ2l2ZW4gY29tbWFuZCwgc2VuZGluZyBpdHMgc3RhbmRhcmQgb3V0cHV0IHRvIHRoZQogICAgICAgICAgY3VycmVudCBjb21tdW5pY2F0aW9ucyBjaGFubmVsIChTRVQgTElORSwgU0VUIFBPUlQsIG9yIFNFVCBIT1NUCiAgICAgICAgICBjb25uZWN0aW9uKSwgYW5kIHJlYWRpbmcgaXRzIHN0YW5kYXJkIGlucHV0IGZyb20gdGhlIHNhbWUKICAgICAgICAgIGNvbm5lY3Rpb24uIFdvcmtzIG9ubHkgaW4gbG9jYWwgbW9kZSAtLSBpLmUuIGEgY29ubmVjdGlvbiBpcwogICAgICAgICAgcmVxdWlyZWQgLS0gYW5kIHRoZW4gb25seSBpZiB0aGUgZ2l2ZW4gY29tbWFuZCB1c2VzIFN0YW5kYXJkCiAgICAgICAgICBJL08uCgogICBFeGFtcGxlOgoKICByZWRpcmVjdCBmaW5nZXIKCiAgIHJ1bnMgdGhlIGxvY2FsICJmaW5nZXIiIGNvbW1hbmQgYW5kIHNlbmRzIGl0cyBvdXRwdXQgb3ZlciB0aGUKICAgY29ubmVjdGlvbiBhcyBwbGFpbiB0ZXh0LCB3aGVyZSBwcmVzdW1hYmx5IHRoZXJlIGlzIGEgcHJvY2VzcyBzZXQgdXAKICAgdG8gcmVhZCBpdC4gQW5vdGhlciBleGFtcGxlOgoKICByZWRpcmVjdCBmaW5nZXIgfCBzb3J0IC1yCgogICBzaG93cyB0aGUgdXNlIG9mIGEgcGlwZWxpbmUuCgogICBOb3RlOiBSRURJUkVDVCBkaWZmZXJzIGZyb20gQ1NFTkQvQ1JFQ0VJVkUgaW4gdHdvIGltcG9ydGFudCB3YXlzOiAoMSkKICAgaXQgZG9lcyBub3QgdXNlIHRoZSBLZXJtaXQgcHJvdG9jb2wsIGFuZCAoMikgaXQgdXNlcyBhIGJpZGlyZWN0aW9uYWwKICAgcGlwZSByYXRoZXIgdGhhbiBhIG9uZS13YXkgcGlwZS4KCiAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGUgUkVESVJFQ1QgY29tbWFuZCBpcyB0byBydW4gZXh0ZXJuYWwgcHJvdG9jb2xzLAogICBzdWNoIGFzIHN6L3J6IGluIFVOSVggZm9yIFpNT0RFTSwgd2hlbiB0aGV5IHdvcmsgb3ZlciBTdGFuZGFyZCBJL08oKikuCiAgIEV4YW1wbGU6CgogIHNldCBob3N0IHh5emNvcnAuY29tCiAgKGxvZ2luLCBldGMpCiAgcmVkaXJlY3Qgc3ogb29mYS56aXAKCiAgIGxldHMgeW91IG1ha2UgYSBUZWxuZXQgY29ubmVjdGlvbiB3aXRoIEMtS2VybWl0IGFuZCB0aGVuIGRvIGEgWk1PREVNCiAgIHRyYW5zZmVyIG92ZXIgaXQuIFpNT0RFTSBwcm90b2NvbCBtZXNzYWdlcyBnbyBib3RoIHdheXMgb3ZlciB0aGUgc2FtZQogICBjb25uZWN0aW9uIHNpbXVsdGFuZW91c2x5LgoKICAgSXQgaXMgcG9zc2libGUgdG8gdXNlIEMtS2VybWl0IG9uIFVOSVggYXMgeW91ciBQUFAgZGlhbGVyIGFuZCB0aGVuIHRvCiAgIFJFRElSRUNUIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBQUFAgc29mdHdhcmUsIGJ1dCBDLUtlcm1pdCA3LjAgb2ZmZXJzIGEKICAgYmV0dGVyIGFwcHJvYWNoIHRvIFBQUCBkaWFsaW5nIGluIGl0cyBuZXcgRVhFQyBjb21tYW5kIChbNDU4XVNlY3Rpb24KICAgMS4yMykuCgogICBJbiB0aGVvcnksIHlvdSBjYW4gYWxzbyByZWRpcmVjdCBhbiBpbnRlcmFjdGl2ZSBwcm9jZXNzLiBGb3IgZXhhbXBsZSwKICAgc3VwcG9zZSB5b3UgdGVsbCBLZXJtaXQgOTUgdG8gd2FpdCBmb3IgYW4gaW5jb21pbmcgVENQL0lQIGNvbm5lY3Rpb246CgogIHNldCBob3N0ICogMzAwMAoKICAgYW5kIHRoZW4gdGVsbCBDLUtlcm1pdCBvbiBVTklYIHRvOgoKICBzZXQgaG9zdCBrZXJtaXQ5NWhvc3RuYW1lIDMwMDAKICByZWRpcmVjdCBrc2gKCiAgIGFuZCB0aGVuIHRlbGwgS2VybWl0IDk1IHRvIENPTk5FQ1Q6IG5vdyB5b3UgYXJlIHRhbGtpbmcgdG8gdGhlIFVOSVgKICAgSy1zaGVsbDsgeW91IGNhbiBnaXZlIGNvbW1hbmRzIChwd2QsIGxzLCBldGMpIGFuZCBzZWUgdGhlIHJlc3VsdHMuIEluCiAgIHByYWN0aWNlLCB0aGUgSy1zaGVsbCdzIHRlcm1pbmFsIG1vZGVzIGFyZSBtZXNzZWQgdXAgYmVjYXVzZSAoYSkgaXQgaXMKICAgbm90IGdvaW5nIHRocm91Z2ggdGhlIFVuaXggdGVybWluYWwgZHJpdmVyLCBhbmQgKGIpIGl0IGlzICJzbWFydCIgYW5kCiAgIGtub3dzIGl0IGlzIGJlaW5nIHJlZGlyZWN0ZWQsIGFuZCBzbyBhY3RzIGluIGEgZGVjaWRlZGx5IGluaG9zcGl0YWJsZQogICBtYW5uZXIgKG90aGVyIGFwcGxpY2F0aW9ucyBsaWtlIEVNQUNTLCB2aSwgZXRjLCBzaW1wbHkgcmVmdXNlIHRvIHJ1bgogICBpZiB0aGVpciBzdGFuZGFyZCBpL28gaGFzIGJlZW4gcmVkaXJlY3RlZCkuCgogICAgICgqKSBUaGUgcHVibGljbHktZGlzdHJpYnV0ZWQgc3ovcnogcHJvZ3JhbXMgZG8gbm90IHdvcmsgYXMgY2xpZW50cy4KICAgICBIb3dldmVyLCBPbWVuIFRlY2hub2xvZ3kgZG9lcyBvZmZlciBhbiB1cC10by1kYXRlIHJlZGlyZWN0YWJsZQogICAgIGNsaWVudCBYWVpNT0RFTSBwcm9ncmFtIGNhbGxlZCBjcnpzei4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMi44LjMuIFJlY2VpdmluZyBNYWlsIGFuZCBQcmludCBKb2JzCgogICBBcyBvZiA3LjAsIGFuZCBpbiBVTklYIG9ubHksIGZpbGVzIHRoYXQgYXJlIHNlbnQgdG8gQy1LZXJtaXQgYXMgbWFpbAogICAod2hlbiB0aGUgb3RoZXIgS2VybWl0IHVzZXMgYSBNQUlMIG9yIFNFTkQgL01BSUwgY29tbWFuZCkgb3IgdG8gYmUKICAgcHJpbnRlZCAodmlhIFJFTU9URSBQUklOVCBvciBTRU5EIC9QUklOVCkgYXJlIG5vdyBwaXBlZCBkaXJlY3RseSB0bwogICB0aGUgbWFpbCBvciBwcmludCBwcm9ncmFtLCByYXRoZXIgdGhhbiB3cml0dGVuIHRvIHRlbXBvcmFyeSBmaWxlcyBhbmQKICAgdGhlbiBtYWlsZWQgb3IgcHJpbnRlZCBhbmQgdGhlbiBkZWxldGVkLiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlcyBvZgogICAoYSkgbm90IHJlcXVpcmluZyBhIHRlbXBvcmFyeSBmaWxlLCBhbmQgKGIpIGFsbG93aW5nIG1haWwgdG8gaGF2ZSBhCiAgIHByb3BlciBzdWJqZWN0IGluIHBsYWNlIG9mIHRoZSBmaWxlbmFtZS4gVGVtcG9yYXJ5IGZpbGVzIHdlcmUgYmFkIG5vdAogICBvbmx5IGJlY2F1c2UgdGhleSByZXF1aXJlZCAoYSkgc3BhY2UsIGFuZCAoYikgd3JpdGVhYmlsaXR5IG9mIHRoZQogICBjdXJyZW50IGRpcmVjdG9yeSwgYnV0IGFsc28gYmVjYXVzZSB1c2luZyB0aGVtIGNvdWxkIHJlc3VsdCBpbiB3aXBpbmcKICAgb3V0IGFuIGV4aXN0aW5nIGZpbGUuIFNlZSBbNDU5XVNlY3Rpb24gNC43IGZvciBtb3JlIGFib3V0IFNFTkQgL01BSUwKICAgYW5kIFNFTkQgL1BSSU5ULgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yLjguNC4gUGlwZS1SZWxhdGVkIEZ1bmN0aW9ucwoKICAgVGhlIFxmY29tbWFuZChjb21tYW5kKSBmdW5jdGlvbiBydW5zIHRoZSBnaXZlbiBzaGVsbCBvciBzeXN0ZW0gY29tbWFuZAogICBhbmQgcmV0dXJucyB0aGUgY29tbWFuZCdzIHN0YW5kYXJkIG91dHB1dCBhcyBpdHMgdmFsdWUgKHdpdGggYW55CiAgIG5ld2xpbmUgY2hhcmFjdGVycyBzdHJpcHBlZCBmcm9tIHRoZSBlbmQpLCB1bmxlc3MgdGhlIHJlc3VsdCBpcyB0b28KICAgbG9uZywgaW4gd2hpY2ggY2FzZSBpdCByZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcuIFRoZSBtYXhpbXVtIGxlbmd0aAogICBmb3IgdGhlIHJlc3VsdCBpcyBhdCBsZWFzdCAxMDIyIGJ5dGVzLCBhbmQgaXQgbWlnaHQgYmUgbG9uZ2VyIG9uIHNvbWUKICAgcGxhdGZvcm1zLiBFeGFtcGxlcyAoVU5JWCk6CgogIEMtS2VybWl0PiBlY2hvICJcZmNvbW1hbmQoZGF0ZSkiCiAgIkZyaSBBcHIgMTggMTM6MzE6NDIgMTk5NyIKICBDLUtlcm1pdD4gZWNobyAiXGZjb21tYW5kKGZpbmdlciB8IHdjIC1sKSIgOyBob3cgbWFueSB1c2VycyBsb2dnZWQgaW4/CiAgIiAgICAgIDgzIgogIEMtS2VybWl0PiBldmFsdWF0ZSBcZmNvbW1hbmQoZmluZ2VyIHwgd2MgLWwpICogMgogIDE2NgogIEMtS2VybWl0PiBlY2hvIFdlbGNvbWUgdG8gXGZjb21tYW5kKHR0eSkgb24gXGZjb21tYW5kKGRhdGUpCiAgV2VsY29tZSB0byAvZGV2L3R0eXJlIG9uIEZyaSBBcHIgMTggMTM6MzE6NDIgMTk5NwogIEMtS2VybWl0PiBlY2hvICJcZmNvbW1hbmQobHMgb29mYS4qKSIKICAib29mYS5jCiAgb29mYS5oCiAgb29mYS5vIgogIEMtS2VybWl0PiBjZCAvZGlyZWN0b3J5LXdpdGgtdGhvdXNhbmRzLW9mLWZpbGVzCiAgQy1LZXJtaXQ+IGVjaG8gIlxmY29tbWFuZChscyAtbCkiIDsgVGhpcyB3b3VsZCBiZSB0b28gbG9uZwogICIiCiAgQy1LZXJtaXQ+CgogICBJZiBhIGNvbW1hbmQncyBvdXRwdXQgd291bGQgYmUgdG9vIGxvbmcsIHlvdSBjYW4gdXNlIHRoZSBvdGhlciwgbW9yZQogICBsYWJvcmlvdXMgbWV0aG9kIG9mIHJlYWRpbmcgZnJvbSBhIGNvbW1hbmQ6IE9QRU4gIVJFQUQgY29tbWFuZCwgUkVBRAogICBlYWNoIGxpbmUsIENMT1NFICFSRUFELgoKICAgVGhlIFxmcmF3Y29tbWFuZChjb21tYW5kKSBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gXGZjb21tYW5kKGNvbW1hbmQpLAogICBleGNlcHQgaXQgZG9lcyBub3QgcmVtb3ZlIHRyYWlsaW5nIG5ld2xpbmUgY2hhcmFjdGVyczoKCiAgQy1LZXJtaXQ+IGVjaG8gIlxmcmF3Y29tbWFuZChkYXRlKSIKICAiRnJpIEFwciAxOCAxMzozMTo0MiAxOTk3CiAgIgogIEMtS2VybWl0PiBlY2hvICJcZnJhd2NvbW1hbmQobHMgb29mYS4qKSIKICAib29mYS5jCiAgb29mYS5oCiAgb29mYS5vCiAgIgogIEMtS2VybWl0PgoKICAgVXNlIFxmcmF3Y29tbWFuZCgpIGlmIHlvdSB3YW50IHRvIHJldGFpbiB0aGUgZmluYWwgbGluZSB0ZXJtaW5hdG9ycywKICAgb3IgaWYgdGhlIGNvbW1hbmQncyBvdXRwdXQgaXMgImJpbmFyeSIuIEJ1dCByZW1lbWJlciB0aGF0IGlmIHRoZQogICByZXN1bHQgb2YgdGhpcyAob3IgYW55IG90aGVyKSBmdW5jdGlvbiBjb250YWlucyBhbnkgTlVMIChBU0NJSSBjb2RlIDApCiAgIGNoYXJhY3RlcnMsIHRoZSBmaXJzdCBOVUwgd2lsbCB0ZXJtaW5hdGUgdGhlIHJlc3VsdCBzdHJpbmcgYmVjYXVzZQogICB0aGlzIGlzIGhvdyBDIHN0cmluZ3Mgd29yayAoaXQncyAiQy1LZXJtaXQiLCByZW1lbWJlcj8pLgoKICAgVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VmdWwgbm90IG9ubHkgbG9jYWxseSwgYnV0IGFsc28gaW4gdGhlCiAgIGNsaWVudC9zZXJ2ZXIgYXJlbmEuIElmIHlvdSBuZWVkIHRvIGdldCB0aGUgcmVzdWx0cyBmcm9tIGEgc3lzdGVtCiAgIGNvbW1hbmQgb24gdGhlIHNlcnZlciBlbmQgaW50byBhIHZhcmlhYmxlIG9uIHRoZSBjbGllbnQgZW5kLCBqdXN0IGRvOgoKICBbIHJlbW90ZSBdIHF1ZXJ5IGtlcm1pdCBjb21tYW5kKGRhdGUpCgogICBUaGUgcmVzdWx0IGlzIGluIHRoZSBsb2NhbCBcdihxdWVyeSkgdmFyaWFibGU7IHNlZSBbNDYwXVVzaW5nCiAgIEMtS2VybWl0LCAybmQgRWQuLCBwcC4zNTktMzYwIGZvciBkZXRhaWxzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuMy4gQXV0b21hdGljIFBlci1GaWxlIFRleHQvQmluYXJ5IE1vZGUgU3dpdGNoaW5nCgogICBXaGVuIHRyYW5zZmVycmluZyBmaWxlcyBiZXR3ZWVuIGxpa2Ugc3lzdGVtcyAoZS5nLiBVTklYLXRvLVVOSVgpLAogICBiaW5hcnkgbW9kZSBjYW4gYmUgdXNlZCBmb3IgYWxsIGZpbGVzIHVubGVzcyBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uCiAgIGlzIG5lZWRlZCwgYW5kIGluIGZhY3QgS2VybWl0IHByb2dyYW1zIG9mIHJlY2VudCB2aW50YWdlIHJlY29nbml6ZQogICBlYWNoIG90aGVycycgcGxhdGZvcm1zIGFuZCBzd2l0Y2ggdG8gYmluYXJ5IG1vZGUgYXV0b21hdGljYWxseSB3aGVuIGl0CiAgIGlzIGFwcHJvcHJpYXRlIChlLmcuIERPUyB0byBPUy8yLCBvciBVTklYIHRvIFVOSVgpLiAoRXhjZXB0aW9uOgogICBMQUJFTEVEIG1vZGUgaXMgY2hvc2VuIGZvciBWTVMtdG8tVk1TIGFuZCBPUy8yLXRvLU9TLzIgdHJhbnNmZXJzIHNvCiAgIGNvbXBsZXggZmlsZSBmb3JtYXRzIGNhbiBiZSBwcmVzZXJ2ZWQuKQoKICAgT24gYSBjbGllbnQvc2VydmVyIGNvbm5lY3Rpb24gYmV0d2VlbiBsaWtlIHN5c3RlbXMsIHRoZSB0cmFuc2ZlciBtb2RlCiAgIGlzIGN1cnJlbnRseSBkZXRlcm1pbmVkIGJ5IHRoZSBmaWxlIHNlbmRlciwgcmF0aGVyIHRoYW4gYWx3YXlzIGJ5IHRoZQogICBjbGllbnQuIElmIHRoZSBjbGllbnQgaXMgc2VuZGluZywgaXQgY29udHJvbHMgdGhlIHRyYW5zZmVyIG1vZGUuIElmIGEKICAgR0VUIGNvbW1hbmQgaXMgc2VudCB0byB0aGUgc2VydmVyLCB0aGUgc2VydmVyIHNlbmRzIGFsbCBmaWxlcyBpbgogICBiaW5hcnkgbW9kZSBpZiBpdHMgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCBpcyBUUkFOU1BBUkVOVDsgb3RoZXJ3aXNlIGl0CiAgIHVzZXMgdGV4dCBtb2RlIGZvciB0ZXh0IGZpbGVzIChhY2NvcmRpbmcgdG8gaXRzIHRleHQtcGF0dGVybiBsaXN0KSBhbmQKICAgYmluYXJ5IG1vZGUgZm9yIGJpbmFyeSBmaWxlcy4gT2YgY291cnNlLCB0aGUgY2xpZW50IGNhbiBjb250cm9sIHRoZQogICBzZXJ2ZXIncyB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IHdpdGggdGhlIFJFTU9URSBTRVQgVFJBTlNGRVIKICAgQ0hBUkFDVEVSLVNFVCBjb21tYW5kLgoKICAgV2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMgYmV0d2VlbiB1bmxpa2Ugc3lzdGVtcywgaG93ZXZlciwgKGUuZy4KICAgVU5JWC10by1ET1MpLCBzb21lIGZpbGVzIChzdWNoIGFzIGV4ZWN1dGFibGUgcHJvZ3JhbSBpbWFnZXMpIG11c3QgYmUKICAgdHJhbnNmZXJyZWQgaW4gYmluYXJ5IG1vZGUgYnV0IG90aGVycyAoc3VjaCBhcyBwbGFpbi10ZXh0IGZpbGVzKSBtdXN0CiAgIGJlIHRyYW5zZmVycmVkIGluIHRleHQgbW9kZSBzbyB0aGVpciByZWNvcmQgZm9ybWF0IGFuZCBjaGFyYWN0ZXIgc2V0cwogICBjYW4gYmUgYXBwcm9wcmlhdGVseSBjb252ZXJ0ZWQuIElmIGEgYmluYXJ5IGZpbGUgaXMgdHJhbnNmZXJyZWQgaW4KICAgdGV4dCBtb2RlLCBpdCBpcyBydWluZWQuIElmIGEgdGV4dCBmaWxlIGlzIHRyYW5zZmVycmVkIGluIGJpbmFyeSBtb2RlLAogICB0aGVuIGF0IHRoZSB2ZXJ5IGxlYXN0LCBpdHMgZm9ybWF0IGNhbiBiZSBpbmNvcnJlY3Q7IGF0IHdvcnN0IGl0IGlzCiAgIGFsc28gY29ycnVwdGVkIGJlY2F1c2UgaXRzIGNoYXJhY3RlciBzZXQgd2FzIG5vdCBjb252ZXJ0ZWQgKGluIGV4dHJlbWUKICAgY2FzZXMgdGhlIGNvcnJ1cHRpb24gaXMgdG90YWwsIGUuZy4gYmVjYXVzZSBvbmUgc3lzdGVtIGlzIEFTQ0lJLWJhc2VkCiAgIGFuZCB0aGUgb3RoZXIgRUJDRElDKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMy4xLiBFeGNlcHRpb25zCgogICBWTVMgQy1LZXJtaXQsIHdoZW4gc2VuZGluZyBmaWxlcyB0byBhIG5vbi1WTVMgc3lzdGVtLCBzd2l0Y2hlcyB0byB0ZXh0CiAgIG9yIGJpbmFyeSBtb2RlIGF1dG9tYXRpY2FsbHkgZm9yIGVhY2ggZmlsZSwgYmFzZWQgb24gdGhlIHJlY29yZCBmb3JtYXQKICAgaW4gdGhlIGZpbGUncyBkaXJlY3RvcnkgZW50cnk7IHRodXMgdGhlIG1lY2hhbmlzbXMgZGVzY3JpYmVkIGluIHRoaXMKICAgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gVk1TIEMtS2VybWl0LCB5ZXQgdGhlIGVmZmVjdCBpcyB0aGUgc2FtZToKICAgYXV0b21hdGljIHRleHQvYmluYXJ5IG1vZGUgc3dpdGNoaW5nIHdoZW4gVk1TIEMtS2VybWl0IGlzIHNlbmRpbmcKICAgZmlsZXMuIFNlZSB0aGUgVk1TIEFwcGVuZGl4IG9mIFs0NjFdVXNpbmcgQy1LZXJtaXQgZm9yIGRldGFpbHMuCgogICBLZXJtaXQgdmVyc2lvbnMgdGhhdCBzdXBwb3J0IExBQkVMRUQgb3IgSU1BR0UgdHJhbnNmZXIgbW9kZSBhcmUKICAgbGlrZXdpc2Ugbm90IGFmZmVjdGVkIGJ5IHRoaXMgZmVhdHVyZSB3aGVuIG9uZSBvZiB0aG9zZSBtb2RlcyBpcwogICBzZWxlY3RlZCAobm9ybWFsbHkgdXNlZCBvbmx5IHdoZW4gdHJhbnNmZXJyaW5nIGJldHdlZW4gbGlrZSBzeXN0ZW1zKS4KCiAgIEtlcm1pdCB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgZmlsZS10cmFuc2ZlciBwaXBlcyBhbmQgZmlsdGVycyBhcmUgbm90CiAgIGFmZmVjdGVkIGJ5IHRoaXMgZmVhdHVyZSB3aGVuIHBpcGVzIG9yIGZpbHRlcnMgYXJlIHVzZWQsIHNpbmNlIHRoZQogICBvdXRwdXQgb2YgYSBwaXBlIG9yIGZpbHRlciAoc3VjaCBhcyBnemlwKSBpcyBsaWtlbHkgdG8gcmVxdWlyZQogICB0cmFuc2ZlciBpbiBhIGRpZmZlcmVudCBtb2RlIHRoYW4gdGhlIG9yaWdpbmFsIGZpbGUuCgogICBGaW5hbGx5LCBTRU5EIC9URVhUIG9yIFNFTkQgL0JJTkFSWSB3aWxsIGZvcmNlIGZpbGVzIHRvIGJlIHNlbnQgaW4gdGhlCiAgIGluZGljYXRlZCBtb2RlLCBvdmVycmlkaW5nIGFsbCBhdXRvbWF0aWMgdHJhbnNmZXItbW9kZS1jaG9vc2luZwogICBtZWNoYW5pc21zLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4zLjIuIE92ZXJ2aWV3CgogICBTdXBwb3NlIHlvdSBnaXZlIEMtS2VybWl0IGEgY29tbWFuZCBsaWtlOgoKICBTRU5EICouKgoKICAgQW5kIHN1cHBvc2UgdGhlIHBhdHRlcm4gKi4qIG1hdGNoZXMgYSBtaXh0dXJlIG9mIHRleHQgZmlsZXMgKHN1Y2ggYXMKICAgcHJvZ3JhbSBzb3VyY2UgY29kZSkgYW5kIGJpbmFyeSBmaWxlcyAoc3VjaCBvcyBvYmplY3QgbW9kdWxlcyBvcgogICBleGVjdXRhYmxlIHByb2dyYW1zKS4KCiAgIEMtS2VybWl0IDYuMCBhbmQgZWFybGllciAoZXhjZXB0IG9uIFZNUykgc2VuZCBhbGwgZmlsZXMgaW4gdGhlIHNhbWUKICAgbW9kZTogd2hhdGV2ZXIgeW91IHNhaWQgaW4geW91ciBtb3N0IHJlY2VudCBTRVQgRklMRSBUWVBFIGNvbW1hbmQsIG9yCiAgIGVsc2Ugd2hhdGV2ZXIgbW9kZSB3YXMgY2hvc2VuIGF1dG9tYXRpY2FsbHkgYWNjb3JkaW5nIHRvIHRoZSBydWxlcyBvbgogICBwYWdlIDIzNiBvZiBVc2luZyBDLUtlcm1pdCwgMm5kIEVkLgoKICAgQnV0IHdoZW4gdGV4dCBhbmQgYmluYXJ5IGZpbGVzIGFyZSBtaXhlZCBpbiB0aGUgc2FtZSBncm91cCwgYW5kIHRoZQogICBmaWxlcyBhcmUgYmVpbmcgdHJhbnNmZXJyZWQgdG8gYW4gdW5saWtlIHN5c3RlbSAoZS5nLiBVTklYIHRvIElCTQogICBNYWluZnJhbWUpLCB0aGlzIHJlc3VsdHMgaW4gY29ycnVwdGlvbiBvZiBlaXRoZXIgYWxsIHRoZSB0ZXh0IGZpbGVzIG9yCiAgIGFsbCB0aGUgYmluYXJ5IGZpbGVzLgoKICAgU3RyZWFtLW9yaWVudGVkIGZpbGUgc3lzdGVtcyBzdWNoIGFzIGluIFVOSVggYW5kIERPUyBkbyBub3QgcmVjb3JkIGFueQogICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSB0byB0ZWxsIHVzIHdoZXRoZXIgdGhlIGZpbGUgc2hvdWxkIGJlCiAgIHRyYW5zZmVycmVkIGluIGJpbmFyeSBvciB0ZXh0IG1vZGUsIG1ha2luZyBpdCBpbXBvc3NpYmxlIHRvIHNlbGVjdCB0aGUKICAgdHJhbnNmZXIgbW9kZSBmb3IgZWFjaCBmaWxlIGluIGEgZ3JvdXAgYXV0b21hdGljYWxseSB3aXRoIGFueQogICBjZXJ0YWludHkuCgogICBIb3dldmVyLCB3ZSBjYW4gdXNlIHNvbWUgZmFpcmx5LXdlbGwgZXN0YWJsaXNoZWQgZmlsZSBuYW1pbmcKICAgY29udmVudGlvbnMgZm9yIHRoaXMgcHVycG9zZS4gQy1LZXJtaXQgNy4wIGxldHMgeW91IHByb3ZpZGUgbGlzdHMgb2YKICAgZmlsZW5hbWUgcGF0dGVybnMgdGhhdCBhcmUgdXNlZCB0byBzZXBhcmF0ZWx5IGRldGVybWluZSB0aGUgZmlsZSB0eXBlCiAgIGZvciBlYWNoIGluZGl2aWR1YWwgZmlsZSBiZWluZyB0cmFuc2ZlcmVkLiBBIHBhdHRlcm4gaXMgYSBzdHJpbmcsCiAgIHBvc3NpYmx5IGNvbnRhaW5pbmcgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyAiKiIgKGFzdGVyaXNrLCB3aGljaAogICBtYXRjaGVzIGFueSBzdHJpbmcgb2YgemVybyBvZiBtb3JlIGNoYXJhY3RlcnMpIGFuZC9vciAiPyIgKHF1ZXN0aW9uCiAgIG1hcmssIHdoaWNoIG1hdGNoZXMgYW55IHNpbmdsZSBjaGFyYWN0ZXIpLiBGb3IgZXhhbXBsZSAiYSpiIiBtYXRjaGVzCiAgIGFsbCBmaWxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoICJhIiBhbmQgZW5kIHdpdGggImIiLCBzdWNoIGFzICJhYiIsCiAgICJhcmIiLCAiYWJhYmFiYWJhYiIsIGV0YywgYnV0IG5vdCAiYWJiYSIuIEFuZCAiYT9iIiBtYXRjaGVzIGFueSBmaWxlCiAgIHdob3NlIG5hbWUgc3RhcnRzIHdpdGggImEiLCBlbmRzIHdpdGggImIiLCBhbmQgaXMgZXhhY3RseSAzIGNoYXJhY3RlcnMKICAgbG9uZy4KCiAgICAgTk9URTogV2hlbiB0eXBpbmcgY29tbWFuZHMgYXQgdGhlIEMtS2VybWl0IHByb21wdCwgeW91IG11c3QgcHJlZml4CiAgICAgIj8iIHdpdGggXCB0byBvdmVycmlkZSBpdHMgbm9ybWFsIGZ1bmN0aW9uIG9mIGdpdmluZyBoZWxwLgoKICAgKEFsc28gc2VlIFs0NjJdU2VjdGlvbiA0LjkgZm9yIGFkZGl0aW9uYWwgcGF0dGVybi1tYXRjaGluZyBub3RhdGlvbnMKICAgdGhhdCBtaWdodCBiZSBhdmFpbGFibGUgaW4geW91ciB2ZXJzaW9uIG9mIEMtS2VybWl0LikKCiAgIFdoZW4geW91IGhhdmUgc3BlY2lmaWVkIGZpbGVuYW1lIHJlY29nbml0aW9uIHBhdHRlcm5zLCBDLUtlcm1pdCBjYW4KICAgdHJhbnNmZXIgdGhlIG9uZXMgd2hvc2UgbmFtZXMgbWF0Y2ggYW55IG9mIHRoZSBiaW5hcnktbW9kZSBwYXR0ZXJucyBpbgogICBiaW5hcnkgbW9kZSwgYW5kIHRob3NlIHdpdGggbmFtZXMgdGhhdCBtYXRjaCBhbnkgb2YgdGhlIHRleHQtbW9kZQogICBwYXR0ZXJucyBpbiB0ZXh0IG1vZGUsIGFuZCB0aG9zZSB3aG9zZSBuYW1lcyBtYXRjaCBuZWl0aGVyIGluIHRoZQogICBwcmV2YWlsaW5nIG1vZGUgeW91IGhhdmUgY2hvc2VuLCBvciB0aGF0IHdhcyBjaG9zZW4gYXV0b21hdGljYWxseSB2aWEKICAgcGVlciByZWNvZ25pdGlvbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMy4zLiBDb21tYW5kcwoKICAgU0VUIEZJTEUgUEFUVEVSTlMgeyBPTiwgT0ZGLCBBVVRPIH0KICAgICAgICAgIFRoaXMgdGVsbHMgS2VybWl0IHdoZXRoZXIgdG8gZG8gcGVyLWZpbGUgZmlsZW5hbWUKICAgICAgICAgIHBhdHRlcm4tbWF0Y2hpbmcgdG8gZGV0ZXJtaW5lIHRleHQgb3IgYmluYXJ5IG1vZGUuIFRoZSBub3JtYWwKICAgICAgICAgIGFuZCBkZWZhdWx0IHNldHRpbmcgaXMgQVVUTywgd2hpY2ggbWVhbnMgdG8gdXNlIHBhdHRlcm4gbGlzdHMKICAgICAgICAgIHRvIHN3aXRjaCB0cmFuc2ZlciBtb2RlIG9ubHkgd2hlbiBpdCBpcyBjZXJ0YWluIHRoYXQgdGhlIG90aGVyCiAgICAgICAgICBLZXJtaXQgcHJvZ3JhbSBzdXBwb3J0cyBhdXRvbWF0aWMgbm90aWZpY2F0aW9uIG9mIHRyYW5zZmVyIG1vZGUKICAgICAgICAgICh2aWEgQXR0cmlidXRlIHBhY2tldHMpIG9uIGEgcGVyLWZpbGUgYmFzaXMgKHRoaXMgaW5mb3JtYXRpb24KICAgICAgICAgIGlzIG9idGFpbmVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHByb3RvY29sIHN0YXJ0dXAgbmVnb3RpYXRpb24pLgogICAgICAgICAgT04gbWVhbnMgdG8gYWx3YXlzIGRldGVybWluZSB0aGUgdHJhbnNmZXIgbW9kZSBmcm9tIHRoZQogICAgICAgICAgZmlsZW5hbWUgYW5kIHBhdHRlcm4gbGlzdCB3aGVuIHNlbmRpbmcgZmlsZXMuIFVzZSBPRkYgdG8KICAgICAgICAgIGRpc2FibGUgdGhpcyBmZWF0dXJlICh3aXRob3V0IHJlc2V0dGluZyB5b3VyIHBhdHRlcm4gbGlzdHMpLgogICAgICAgICAgQWxzbyBub3RlIHRoYXQgaWYgeW91IGhhdmUgc2VsZWN0ZWQgTEFCRUxFRCBmaWxlIHRyYW5zZmVyIChTRVQKICAgICAgICAgIEZJTEUgVFlQRSBMQUJFTEVEKSwgdGhpcyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKICAgICAgICAgIGZpbGVuYW1lLW1hdGNoaW5nIHBhdHRlcm5zIGFuZCBhbGwgZmlsZXMgYXJlIHNlbnQgaW4gbGFiZWxlZAogICAgICAgICAgbW9kZS4KCiAgIFNFVCBUUkFOU0ZFUiBNT0RFIE1BTlVBTAogICAgICAgICAgRGlzYWJsZXMgdGhlIHVzZSBvZiBmaWxlbmFtZSBwYXR0ZXJucywgbm8gbWF0dGVyIHdoYXQgdGhlIEZJTEUKICAgICAgICAgIFBBVFRFUk5TIHNldHRpbmcuCgogICBSRU1PVEUgU0VUIFRSQU5TRkVSIE1PREUgTUFOVUFMCiAgICAgICAgICBDbGllbnQgY29tbWFuZCB0byBkaXNhYmxlIGF1dG9tYXRpYyB0cmFuc2ZlciBtb2RlLCBhbmQKICAgICAgICAgIHRoZXJlZm9yZSBhbHNvIGZpbGVuYW1lIHBhdHRlcm5zLCBpbiB0aGUgc2VydmVyLiBTeW5vbnltOgogICAgICAgICAgUkVNT1RFIFNFVCBYRkVSIE1PREUgTUFOVUFMLgoKICAgeyBHRVQsIFNFTkQsIGV0YyB9IHsgL0JJTkFSWSwgL1RFWFQgfQogICAgICAgICAgSW5jbHVkaW5nIGEgL0JJTkFSWSBvciAvVEVYVCAob3IsIHdoZXJlIHN1cHBvcnRlZCwgL0lNQUdFIG9yCiAgICAgICAgICAvTEFCRUxFRCkgc3dpdGNoIHdpdGggYSBmaWxlLXRyYW5zZmVyIGNvbW1hbmQgY2hhbmdlcyB0aGUKICAgICAgICAgIHRyYW5zZmVyIG1vZGUgdG8gbWFudWFsIGZvciB0aGF0IGNvbW1hbmQgb25seSwgYW5kIHRoZXJlZm9yZQogICAgICAgICAgZGlzYWJsZXMgcGF0dGVybnMgdGhhdCB0aGF0IGNvbW1hbmQuCgogICBTRVQgRklMRSBCSU5BUlktUEFUVEVSTlMgWyBwYXR0ZXJuIFsgcGF0dGVybiBbIHBhdHRlcm4gLi4uIF0gXSBdCiAgICAgICAgICBBIGxpc3Qgb2YgemVybyBvciBtb3JlIHBhdHRlcm5zLCBzZXBhcmF0ZWQgYnkgc3BhY2VzIChub3QKICAgICAgICAgIGNvbW1hcykuIExldHRlcnMgaW4gYSBwYXR0ZXJuIGFyZSBjYXNlLXNlbnNpdGl2ZSBpZiB0aGUKICAgICAgICAgIHVuZGVybHlpbmcgZmlsZW5hbWVzIGFyZSBjYXNlIHNlbnNpdGl2ZSAoYXMgaW4gVU5JWCksIGFuZAogICAgICAgICAgY2FzZS1pbnNlbnNpdGl2ZSBvdGhlcndpc2UgKGFzIGluIFdpbmRvd3MpLiBJZiBhIGZpbGUncyBuYW1lIGlzCiAgICAgICAgICBtYXRjaGVkIGJ5IGFueSBwYXR0ZXJuIGluIHRoZSBsaXN0IGFuZCBTRVQgRklMRSBQQVRURVJOUyBpcyBPTiwKICAgICAgICAgIHRoZSBmaWxlIGlzIHNlbnQgaW4gYmluYXJ5IG1vZGUuIEV4YW1wbGVzOgoKICBTRVQgRklMRSBCSU5BUlktUEFUVEVSTlMgKi5neiAqLlogKi50YXIgKi56aXAgKi5vICouc28gKi5hICoub3V0IDsgVU5JWAogIFNFVCBGSUxFIEJJTkFSWS1QQVRURVJOUyAqLkVYRSAqLlpJUCAqLk9CSiAqLkNPTSA7IERPUyBvciBPUy8yIG9yIFdpbmRvd3MKCiAgICAgICAgICBJZiBhIHBhdHRlcm4gY29udGFpbnMgc3BhY2VzLCBlbmNsb3NlIGl0IGluIGJyYWNlcy4KCiAgIFNFVCBGSUxFIFRFWFQtUEFUVEVSTlMgWyBwYXR0ZXJuIFsgcGF0dGVybiBbIHBhdHRlcm4gLi4uIF0gXSBdCiAgICAgICAgICBMaWtlIFNFVCBGSUxFIEJJTkFSWS1QQVRURVJOUywgYnV0IHRoZSBwYXR0ZXJucyBjaG9vc2UgdGV4dAogICAgICAgICAgZmlsZXMgcmF0aGVyIHRoYW4gYmluYXJ5IG9uZXMuIEV4YW1wbGVzOgoKICBTRVQgRklMRSBURVhULVBBVFRFUk5TICouVFhUICouS1NDICouSFRNKiAqLkJBVCA7IERPUywgV2luZG93cywgT1MvMgoKICAgQUREIEJJTkFSWS1QQVRURVJOUyBbIHBhdHRlcm4gWyBwYXR0ZXJuIFsgcGF0dGVybiAuLi4gXSBdIF0KICAgICAgICAgIEFkZHMgb25lIG9yIG1vcmUgcGF0dGVybnMgdG8gdGhlIEJJTkFSWS1QQVRURVJOIGxpc3QuCgogICBBREQgVEVYVC1QQVRURVJOUyBbIHBhdHRlcm4gWyBwYXR0ZXJuIFsgcGF0dGVybiAuLi4gXSBdIF0KICAgICAgICAgIEFkZHMgb25lIG9yIG1vcmUgcGF0dGVybnMgdG8gdGhlIFRFWFQtUEFUVEVSTiBsaXN0LgoKICAgUkVNT1ZFIEJJTkFSWS1QQVRURVJOUyBbIHBhdHRlcm4gWyBwYXR0ZXJuIFsgcGF0dGVybiAuLi4gXSBdIF0KICAgICAgICAgIFJlbW92ZXMgb25lIG9yIG1vcmUgcGF0dGVybnMgZnJvbSB0aGUgQklOQVJZLVBBVFRFUk4gbGlzdC4gVGhlCiAgICAgICAgICBnaXZlbiBwYXR0ZXJucyBhcmUgbWF0Y2hlZCB3aXRoIHRoZSBvbmVzIGluIHRoZSBCSU5BUlktUEFUVEVSTlMKICAgICAgICAgIGxpc3Qgd2l0aCBjYXNlIHNlbnNpdGl2aXR5IGlmIHRoZSB1bmRlcmx5aW5nIGZpbGUgc3lzdGVtIGhhcwogICAgICAgICAgY2FzZS1zZW5zaXRpdmUgbmFtZXMgKGFzIGRvIFVOSVggYW5kIE9TLTkpLCBvdGhlcndpc2Ugd2l0aCBjYXNlCiAgICAgICAgICBpbmRlcGVuZGVuY2UuCgogICBSRU1PVkUgVEVYVC1QQVRURVJOUyBbIHBhdHRlcm4gWyBwYXR0ZXJuIFsgcGF0dGVybiAuLi4gXSBdIF0KICAgICAgICAgIFJlbW92ZXMgb25lIG9yIG1vcmUgcGF0dGVybnMgZnJvbSB0aGUgVEVYVC1QQVRURVJOIGxpc3QuCgogICBTSE9XIFBBVFRFUk5TCiAgICAgICAgICBEaXNwbGF5cyB0aGUgY3VycmVudCBwYXR0ZXJuIHNlbGVjdGlvbnMuCgogICBXaGVuZXZlciB5b3UgZ2l2ZSBhIFNFVCBGSUxFIEJJTkFSWS1QQVRURVJOUyBvciBTRVQgRklMRSBURVhULVBBVFRFUk5TCiAgIGNvbW1hbmQsIHRoZSBwcmV2aW91cyBsaXN0IGlzIHJlcGxhY2VkLiBJZiB5b3UgZ2l2ZSBvbmUgb2YgdGhlc2UKICAgY29tbWFuZHMgd2l0aG91dCBhIHBhdHRlcm4gbGlzdCwgdGhlIHByZXZpb3VzIGxpc3QgaXMgcmVtb3ZlZC4KCiAgIFdoZW4gcGF0dGVybnMgYXJlIGFjdGl2ZSBhbmQgZmlsZXMgYXJlIGJlaW5nIHNlbnQsIHRleHQgcGF0dGVybnMgKGlmCiAgIGFueSkgYXJlIGFwcGxpZWQgZmlyc3QgKGJ1dCBvbmx5IGlmIG5vdCBSRVNFTkRpbmcgYW5kIG5vdCBzZW5kaW5nIGluCiAgIExBQkVMRUQgbW9kZSksIHRoZW4gYmluYXJ5IHBhdHRlcm5zLCBzbyBpZiB0aGUgc2FtZSBwYXR0ZXJuIGFwcGVhcnMgaW4KICAgYm90aCBsaXN0cywgYmluYXJ5IG1vZGUgaXMgY2hvc2VuLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4zLjQuIEV4YW1wbGVzCgogICBIZXJlJ3MgYW4gZXhhbXBsZSB0aGF0IG1pZ2h0IGJlIHVzZWQgd2hlbiBzZW5kaW5nIGZpbGVzIGZyb20gVU5JWDoKCiAgc2V0IGZpbGUgdHlwZSBiaW5hcnkKICBzZXQgZmlsZSB0ZXh0LXBhdHRlcm5zICouYyAqLmggKi53ICoudHh0IG1ha2VmaWxlCiAgc2V0IGZpbGUgYmluYXJ5LXBhdHRlcm5zICoubwogIG1zZW5kIG1ha2VmaWxlIHdlcm1pdCB3YXJ0IGNrKi5bY3dob10gY2sqLnR4dAoKICAgTm90ZSB0aGF0ICJ3ZXJtaXQiIGFuZCAid2FydCIgZG8gbm90IG1hdGNoIGFueSBwYXR0ZXJucyBzbyB0aGV5IGFyZQogICBzZW50IGluIHRoZSBwcmV2YWlsaW5nIG1vZGUsIHdoaWNoIGlzIGJpbmFyeS4gQWxzbyBub3RlIHRoZSB1c2Ugb2YKICAgIm1ha2VmaWxlIiBhcyBhIHBhdHRlcm4gdGhhdCBkb2VzIG5vdCBjb250YWluIGFueSB3aWxkY2FyZCBjaGFyYWN0ZXJzCiAgICh0aGVyZSBpcyBubyBvdGhlciBjb252ZW50aW9uIHRvIGRpc3Rpbmd1aXNoIGFtb25nICJ3ZXJtaXQiIGFuZAogICAid2FydCIsIHdoaWNoIGFyZSBiaW5hcnkgZXhlY3V0YWJsZXMsIGFuZCAibWFrZWZpbGUiLCB3aGljaCBpcyBhIHRleHQKICAgZmlsZSwgcHVyZWx5IGJ5IHRoZWlyIG5hbWVzKS4KCiAgIE1vc3QgQy1LZXJtaXQgaW1wbGVtZW50YXRpb25zIGhhdmUgYSBkZWZhdWx0IHBhdHRlcm4gbGlzdCBidWlsdCBpbiwKICAgd2hpY2ggaW5jbHVkZXMgcGF0dGVybnMgdGhhdCBhcmUgYWxtb3N0IGNlcnRhaW4gdG8gc3VjY2VlZCBpbiBwaWNraW5nCiAgIHRoZSByaWdodCB0cmFuc2ZlciBtb2RlLiBPdGhlcnMgYXJlIG9taXR0ZWQgZHVlIHRvIGFtYmlndWl0eS4gRm9yCiAgIGV4YW1wbGUgIi5obHAiLCBhbmQgIi5pbmkiIGFyZSBnZW5lcmFsbHkgYmluYXJ5IHR5cGVzIGluIFdpbmRvd3MgYnV0CiAgIHRleHQgdHlwZXMgZXZlcnl3aGVyZSBlbHNlLgoKICAgICBOT1RFOiAiLmRvYyIsIHVzZWQgZm9yIGRlY2FkZXMgdG8gZGVub3RlIHBsYWluLXRleHQgZG9jdW1lbnRhdGlvbgogICAgIGZpbGVzLCBub3cgbW9yZSBvZnRlbiB0aGFuIG5vdCBkZW5vdGVzIGEgTWljcm9zb2Z0IFdvcmQgRG9jdW1lbnQsCiAgICAgc28gIi5kb2MiIGlzIG5vdyBjb25zaWRlcmVkIGEgYmluYXJ5IHR5cGUgc2luY2UgaXQgZG9lcyBsZXNzIGhhcm0KICAgICB0byB0cmFuc2ZlciBhIHBsYWluLXRleHQgZG9jdW1lbnQgaW4gYmluYXJ5IG1vZGUgdGhhbiBpdCBkb2VzIHRvCiAgICAgdHJhbnNmZXIgYW4gTVMgV29yZCBmaWxlIGluIHRleHQgbW9kZSAoZXhjZXB0IHdoZW4gSUJNIG1haW5mcmFtZXMKICAgICBhcmUgaW52b2x2ZWQhKQoKICAgICBBTk9USEVSIE5PVEU6ICIuY29tIiBmaWxlcyBhcmUgYmluYXJ5IGluIERPUy1saWtlIG9wZXJhdGluZwogICAgIHN5c3RlbXMsIGJ1dCB0aGV5IGFyZSB0ZXh0IChEQ0wgY29tbWFuZCBwcm9jZWR1cmVzKSBpbiBWTVMuIFZNUwogICAgIEMtS2VybWl0IHNlbmRzIC5DT00gZmlsZXMgaW4gdGV4dCBtb2RlOyBLOTUgc2VuZHMgdGhlbSBpbiBiaW5hcnkKICAgICBtb2RlLiBJZiB5b3UgZG93bmxvYWQgYSAuQ09NIGZpbGUgZnJvbSBWTVMgdG8gRE9TIG9yIFdpbmRvd3MsIGFuZAogICAgIHRoZW4gdXBsb2FkIGl0IHRvIGFub3RoZXIgVk1TIHN5c3RlbSwgYmUgc3VyZSB0byB1c2UgU0VORCAvVEVYVCB0bwogICAgIHByZXNlcnZlIGl0cyB0ZXh0bmVzcy4KCiAgIFlvdSBjYW4gc2VlIHRoZSBkZWZhdWx0IHBhdHRlcm4gbGlzdCBieSBzdGFydGluZyBDLUtlcm1pdCB3aXRob3V0IGl0cwogICBpbml0aWFsaXphdGlvbiBmaWxlIChlLmcuICJrZXJtaXQgLVkiKSBhbmQgdXNpbmcgdGhlIFNIT1cgUEFUVEVSTlMKICAgY29tbWFuZC4gSWYgeW91IHdpbGwgYmUgZGVwZW5kaW5nIG9uIHRoaXMgZmVhdHVyZSwgYmUgc3VyZSB0byBleGFtaW5lCiAgIHRoZSBsaXN0IGNhcmVmdWxseSBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbnMgdGhhdCB5b3UgdXNlLgoKICAgVGhlIGRlZmF1bHQgcGF0dGVybiBsaXN0IGRvZXMgbm90IHRha2UgImJhY2t1cCBmaWxlcyIgaW50byBhY2NvdW50CiAgIGJlY2F1c2UgKGEpIHBlb3BsZSB1c3VhbGx5IGRvbid0IHdhbnQgdG8gdHJhbnNmZXIgdGhlbTsgYW5kIChiKSBpdAogICB3b3VsZCBtYWtlIHRoZSBwYXR0ZXJuIGxpc3RzIG1vcmUgdGhhbiB0d2ljZSBhcyBsb25nLiBGb3IgZXhhbXBsZSwgd2UKICAgd291bGQgbmVlZCB0byBpbmNsdWRlIGJvdGggKi50eHQgYW5kICoudHh0Ln5bMC05XSp+IGZvciAiLnR4dCIgZmlsZXMsCiAgIGFuZCBzaW1pbGFybHkgZm9yIGFsbCB0aGUgb3RoZXJzLiBJbnN0ZWFkLCB5b3UgY2FuIHVzZSBTRU5EIC9OT0JBQ0tVUAogICAob3IgU0VUIFNFTkQgQkFDS1VQIE9GRikgdG8gc2tpcCBvdmVyIGFsbCBiYWNrdXAgZmlsZXMuCgogICBQdXQgeW91ciBtb3N0IGNvbW1vbmx5LXVzZWQgc2FmZSBwYXR0ZXJuIGRlY2xhcmF0aW9ucyBpbiB5b3VyIEMtS2VybWl0CiAgIGN1c3RvbWl6YXRpb24gZmlsZSAoY2tlcm1vZC5pbmksIC5teWtlcm1yYywgazk1Y3VzdG9tLmluaSwgZXRjKS4KCiAgIEFzIG5vdGVkLCBTRVQgRklMRSBQQVRURVJOUyBpcyBPTiBieSBkZWZhdWx0LiBTb21ldGltZXMsIGhvd2V2ZXIsIGl0CiAgIGlzIGRlc2lyYWJsZSwgb3IgbmVjZXNzYXJ5LCB0byBmb3JjZSBmaWxlcyB0byBiZSBzZW50IGluIGEgcGFydGljdWxhcgogICBtb2RlLCBhbmQgb2Z0ZW4gdGhpcyBtdXN0IGJlIGRvbmUgZnJvbSB0aGUgY29tbWFuZCBsaW5lIChlLmcuIHdoZW4KICAgdXNpbmcgS2VybWl0IGFzIGEgZG93bmxvYWQgaGVscGVyIGluIGEgV2ViIGJyb3dzZXIgbGlrZSBMeW54KS4gVGhlIC1WCiAgIGNvbW1hbmQtbGluZSBvcHRpb25zIGlzIGVxdWl2YWxlbnQgdG8gU0VUIEZJTEUgUEFUVEVSTlMgT0ZGIGFuZCBTRVQKICAgVFJBTlNGRVIgTU9ERSBNQU5VQUwuIEV4YW1wbGU6CgogIGtlcm1pdCAtVmlzIG9vZmEudHh0CgogICBmb3JjZXMgb29mYS50eHQgdG8gYmUgc2VudCBpbiBiaW5hcnkgbW9kZSwgZXZlbiB0aG91Z2ggIi50eHQiIG1pZ2h0CiAgIG1hdGNoIGEgdGV4dCBwYXR0ZXJuLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuNC4gRmlsZSBQZXJtaXNzaW9ucwoKICAgIlBlcm1pc3Npb25zIiByZWZlcnMgdG8gYSBjb2RlIGFzc29jaWF0ZWQgd2l0aCBhIGZpbGUgdGhhdCBzcGVjaWZpZXMKICAgd2hvIGlzIGFsbG93ZWQgdG8gYWNjZXNzIGl0LCBhbmQgaW4gd2hhdCBtYW5uZXIuIEZvciBleGFtcGxlLCB0aGUKICAgb3duZXIsIHRoZSBtZW1iZXJzIG9mIG9uZSBvciBtb3JlIGdyb3VwcywgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yLAogICBhbmQgZXZlcnlib2R5IGVsc2UsIG1pZ2h0IGJlIGFsbG93ZWQgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgUmVhZCwKICAgV3JpdGUsIEFwcGVuZCwgRXhlY3V0ZSwgb3IgTGlzdGluZyBhY2Nlc3MuCgogICBUaGUgcGVybWlzc2lvbiBjb2RlIGdvZXMgYnkgZGlmZmVyZW50IG5hbWVzIG9uIGRpZmZlcmVudCBwbGF0Zm9ybXMuIEluCiAgIFVOSVgsIGl0IG1pZ2h0IGJlIGNhbGxlZCB0aGUgZmlsZW1vZGUuIEluIFZNUywgaXQgaXMgY2FsbGVkIHRoZSBmaWxlCiAgIHByb3RlY3Rpb24gKG9yIHByb3RlY3Rpb24gbWFzaykuCgogICBUaGUgY29tbWVudHMgaW4gdGhpcyBzZWN0aW9uIHByZXNlbnRseSBhcHBseSBvbmx5IHRvIHRoZSBVTklYIGFuZCBWTVMKICAgdmVyc2lvbnMgb2YgQy1LZXJtaXQsIHRvIHdoaWNoIHRoZXNlIGZlYXR1cmVzIHdlcmUgYWRkZWQgaW4gdmVyc2lvbgogICA3LjA7IHRoZSBET1MsIFdpbmRvd3MsIGFuZCBPUy8yIGZpbGUgc3lzdGVtcyBlbWJvZHkgbm8gbm90aW9ucyBvZgogICBwcm90ZWN0aW9uLCBhbmQgc28gTVMtRE9TIEtlcm1pdCBhbmQgS2VybWl0IDk1IGRvIG5vdCBzZW5kIGZpbGUKICAgcGVybWlzc2lvbnMsIGFuZCBpZ25vcmUgdGhlbSB3aGVuIHJlY2VpdmVkLgoKICAgVGhlIHBlcm1pc3Npb25zIGZvciBhIHJlY2VpdmVkIGZpbGUgYXJlIGRldGVybWluZWQgYnkgYSBjb21iaW5hdGlvbiBvZgogICB0aGUgZmlsZSB0cmFuc2ZlciBtb2RlIChWTVMtdG8tVk1TIHRyYW5zZmVycyBvbmx5KSwgd2hldGhlciBhIGZpbGUgb2YKICAgdGhlIHNhbWUgbmFtZSBleGlzdHMgYWxyZWFkeSwgd2hldGhlciBwZXJtaXNzaW9ucyBvZiB0aGUgZmlsZSBhcmUKICAgcmVjZWl2ZWQgaW4gdGhlIGZpbGUgYXR0cmlidXRlIHBhY2tldCwgYW5kIHRoZSBzZXR0aW5nIG9mIEFUVFJJQlVURVMKICAgUFJPVEVDVElPTi4KCiAgIFRoZSBkZWZhdWx0IGZvciBBVFRSSUJVVEVTIFBST1RFQ1RJT04gaXMgT04uIElmIG5vIGF0dHJpYnV0ZXMgYXJlCiAgIHJlY2VpdmVkLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGlmIGF0dHJpYnV0ZXMgUFJPVEVDVElPTiB3ZXJlIE9GRi4KCiAgIEZvciBWTVMtdG8tVk1TIHRyYW5zZmVycywgdGhlIGRlZmF1bHQgTEFCRUxFRCBtb2RlIHNpbXBseSBjb3BpZXMgdGhlCiAgIHByb3RlY3Rpb24gY29kZSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuNC4xLiBXaGVuIEFUVFJJQlVURVMgUFJPVEVDVElPTiBpcyBPRkYKCiAgIElmIG5vIGZpbGUgb2YgdGhlIHNhbWUgbmFtZSBleGlzdHMsIHN5c3RlbSBkZWZhdWx0cyBkZXRlcm1pbmUgdGhlCiAgIHBlcm1pc3Npb25zIG9mIHRoZSBuZXcgZmlsZS4gT3RoZXJ3aXNlLCB0aGUgYWN0aW9ucyB0YWtlbiBkZXBlbmQgb24KICAgdGhlIGN1cnJlbnQgRklMRSBDT0xMSVNJT04gc2V0dGluZzogQkFDS1VQLCBPVkVSV1JJVEUsIFJFTkFNRSwgZXRjLCBhcwogICBkb2N1bWVudGVkIGluIFs0NjNdVXNpbmcgQy1LZXJtaXQuIEJ1dCBub3cgdGhlIG5ldyBmaWxlIChpZiBpdCBpcwogICBjcmVhdGVkIGF0IGFsbCkgYXV0b21hdGljYWxseSBpbmhlcml0cyB0aGUgcGVybWlzc2lvbnMgKG1vZGUgYml0cykgb2YKICAgdGhlIGV4aXN0aW5nIGZpbGUgaW4gYSB3YXkgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHBsYXRmb3JtLgoKICAgIDQuNC4xLjEuIFVuaXgKCiAgIEFsbCBtb2RlIGJpdHMgYXJlIGluaGVyaXRlZCBleGNlcHQgdGhlIGRpcmVjdG9yeSBiaXQsIHNpbmNlIHRoZQogICBpbmNvbWluZyBmaWxlIGNhbiBub3QgcG9zc2libHkgYmUgYSBkaXJlY3RvcnkuIChJbiBhbnkgY2FzZSwgaXQgaXMgbm90CiAgIHBvc3NpYmxlIHRvIHJlY2VpdmUgYSBmaWxlIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYW4gZXhpc3RpbmcKICAgZGlyZWN0b3J5IHVubGVzcyBGSUxFIENPTExJU0lPTiBpcyBzZXQgdG8gUkVOQU1FKS4KCiAgICA0LjQuMS4yLiBWTVMKCiAgIEZpbGVzIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBmaWxlLCB0cmFuc2ZlcnJlZCBpbiBtb2RlcwogICBvdGhlciB0aGFuIExBQkVMRUQgYmV0d2VlbiBWTVMgc3lzdGVtcywgaW5oZXJpdCB0aGUgcHJvdGVjdGlvbiBvZiB0aGUKICAgcHJpb3IgdmVyc2lvbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuNC4yIFdoZW4gQVRUUklCVVRFUyBQUk9URUNUSU9OIGlzIE9OCgogICBGaWxlIHBlcm1pc3Npb25zIGNhbiBiZSBjb252ZXllZCBhcyBwYXJ0IG9mIHRoZSBmaWxlIHRyYW5zZmVyIHByb2Nlc3MsCiAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgS2VybWl0IHByb3RvY29sIGRlZmluaXRpb24uIElmIHRoZSBmaWxlIHNlbmRlcgogICBwdXRzIHN5c3RlbS1kZXBlbmRlbnQgYW5kL29yIHN5c3RlbS1pbmRlcGVuZGVudCB2ZXJzaW9ucyBvZiB0aGUgZmlsZQogICBwcm90ZWN0aW9uIChwZXJtaXNzaW9ucykgaW50byB0aGUgQXR0cmlidXRlIChBKSBwYWNrZXQsIHRoZSBmaWxlCiAgIHJlY2VpdmVyIGNhbiBzZXQgdGhlIG5ldyBmaWxlJ3MgcGVybWlzc2lvbnMgZnJvbSB0aGVtLiBPdGhlcndpc2UsIHRoZQogICBwZXJtaXNzaW9ucyBhcmUgc2V0IHRoZSBzYW1lIGFzIGZvciBBVFRSSUJVVEVTIFBST1RFQ1RJT04gT0ZGLgoKICAgV2hlbiB0aGUgaW5jb21pbmcgQSBwYWNrZXQgY29udGFpbnMgc3lzdGVtLWRlcGVuZGVudCBwZXJtaXNzaW9ucywgdGhlCiAgIGZpbGUgcmVjZWl2ZXIgY2hlY2tzIHRvIHNlZSBpZiB0aGUgc2VuZGVyIGhhcyB0aGUgc2FtZSBzeXN0ZW0gSUQgKGUuZy4KICAgYm90aCB0aGUgc2VuZGluZyBhbmQgcmVjZWl2aW5nIHN5c3RlbXMgYXJlIFVOSVgsIG9yIGJvdGggYXJlIFZNUyk7IGlmCiAgIHNvLCBpdCBkZWNvZGVzIGFuZCB1c2VzIHRoZSBzeXN0ZW0tZGVwZW5kZW50IHBlcm1pc3Npb25zOyBvdGhlcndpc2UgaXQKICAgdXNlcyB0aGUgZ2VuZXJpYyBvbmVzIChpZiBhbnkpIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIG93bmVyIGZpZWxkLAogICBzZXR0aW5nIHRoZSBvdGhlciBmaWVsZHMgYXBwcm9wcmlhdGVseSBhcyBkZXNjcmliZWQgaW4gdGhlIGZvbGxvd2luZwogICBzZWN0aW9ucy4KCiAgIFNldHRpbmcgdGhlIGluY29taW5nIGZpbGUncyBwcm90ZWN0aW9uIGZyb20gdGhlIEEgcGFja2V0IGlzIGNvbnRyb2xsZWQKICAgYnkgU0VUIEFUVFJJQlVURVMgUFJPVEVDVElPTiAob3IgUEVSTUlTU0lPTiksIHdoaWNoIGlzIE9OIGJ5IGRlZmF1bHQsCiAgIGFuZCBpdHMgc3RhdHVzIGlzIGRpc3BsYXllZCBieSBTSE9XIEFUVFJJQlVURVMuCgogICBUaGUgbWFpbiBiZW5lZml0IG9mIHRoaXMgZmVhdHVyZSBpcyB0byBub3QgaGF2ZSB0byAiY2htb2QgK3giIGFuCiAgIGV4ZWN1dGFibGUgZmlsZSBhZnRlciB0cmFuc2ZlciBmcm9tIFVOSVggdG8gVU5JWC4gSXRzIGNyb3NzLXBsYXRmb3JtCiAgIGJlbmVmaXRzIGFyZSBsZXNzIGV2aWRlbnQsIHBlcmhhcHMgdG8gcmV0YWluIHRoZSBzdGF0dXMgb2YgdGhlIFVuaXgKICAgJ3gnIGJpdCBvbiBhIFZNUyBzeXN0ZW0sIGZvciBzdWJzZXF1ZW50IHRyYW5zZmVyIGJhY2sgdG8gYSBVbml4CiAgIHN5c3RlbS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuNC4yLjEuIFN5c3RlbS1TcGVjaWZpYyBQZXJtaXNzaW9ucwoKICAgU3lzdGVtLXNwZWNpZmljIGZpbGUgcGVybWlzc2lvbnMgYXJlIHVzZWQgd2hlbiB0aGUgdHdvIEtlcm1pdCBwcm9ncmFtcwogICByZWNvZ25pemUgZWFjaCBvdGhlciBhcyBydW5uaW5nIG9uIHRoZSBzYW1lIHR5cGUgb2Ygc3lzdGVtLiBGb3IKICAgZXhhbXBsZSwgYm90aCBhcmUgcnVubmluZyB1bmRlciBzb21lIGZvcm0gb2YgVU5JWCAoaXQgZG9lc24ndCBtYXR0ZXIKICAgd2hpY2ggVU5JWCB2YXJpYXRpb24gLS0gSFAtVVgsIFNvbGFyaXMsIEFJWCwgZXRjIC0tIGFsbCB1c2UgdGhlIHNhbWUKICAgc2NoZW1lIGZvciBmaWxlIHBlcm1pc3Npb25zKTsgb3IgYm90aCBhcmUgcnVubmluZyB1bmRlciBWTVMgKGV2ZW4gaWYKICAgb25lIGlzIG9uIGFuIEFscGhhIGFuZCB0aGUgb3RoZXIgb24gYSBWQVgsIGFuZC9vciBvbmUgaXMgb2xkIGFuZCB0aGUKICAgb3RoZXIgaXMgbmV3KS4KCiAgICA0LjQuMi4xLjEuIFVOSVgKCiAgIFVOSVggc3VwcG9ydHMgdGhyZWUgY2F0ZWdvcmllcyBvZiB1c2VycywgRmlsZSBPd25lciwgR3JvdXAsIGFuZCBXb3JsZCwKICAgYW5kIHRocmVlIHR5cGVzIG9mIGZpbGUgYWNjZXNzIHBlcm1pc3Npb246IFJlYWQsIFdyaXRlLCBhbmQgRXhlY3V0ZS4KICAgVGh1cywgYSBVTklYIGZpbGUncyBwZXJtaXNzaW9ucyBhcmUgZXhwcmVzc2VkIGluIDkgYml0cy4KCiAgIFRoZSBzeXN0ZW0tZGVwZW5kZW50IHBlcm1pc3Npb24gc3RyaW5nIGZvciBVTklYIGlzIGEgMy1kaWdpdCBvY3RhbAogICBzdHJpbmcsIHRoZSBsb3ctb3JkZXIgOSBiaXRzIG9mIHRoZSBzdF9tb2RlIG1lbWJlciBvZiB0aGUgc3RhdCBzdHJ1Y3Q7CiAgIHdlIGRlbGliZXJhdGVseSBjaG9wIG9mZiB0aGUgImZpbGUgZm9ybWF0IiBiaXRzIGJlY2F1c2UgdGhleSBhcmUgbm90CiAgIHBlcm1pc3Npb25zLCBub3IgZG8gd2UgY29udmV5IHRoZSBzZXR1aWQvc2V0Z2lkIGJpdHMsIGxvY2sgYml0LCBzdGlja3kKICAgYml0LCBldGMuCgogICAgNC40LjIuMS4yLiBWTVMKCiAgIFZNUyBzdXBwb3J0cyBmb3VyIGNhdGVnb3JpZXMgb2YgdXNlcnMsIFN5c3RlbSwgRmlsZSBPd25lciwgR3JvdXAsIGFuZAogICBXb3JsZCwgYW5kIGZvdXIgdHlwZXMgb2YgZmlsZSBhY2Nlc3MgcGVybWlzc2lvbjogUmVhZCwgV3JpdGUsIEV4ZWN1dGUsCiAgIGFuZCBEZWxldGUuIFRodXMsIGEgVk1TIGZpbGUncyBwZXJtaXNzaW9ucyBhcmUgZXhwcmVzc2VkIGluIDE2IGJpdHMuCgogICBUaGUgc3lzdGVtLWRlcGVuZGVudCBwcm90ZWN0aW9uIHN0cmluZyBmb3IgVk1TIGlzIGEgNC1kaWdpdAogICBoZXhhZGVjaW1hbCBzdHJpbmcsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGludGVybmFsLWZvcm1hdCBwcm90ZWN0aW9uCiAgIHdvcmQgb2YgdGhlIGZpbGUgKFJXRUQgZm9yIGVhY2ggb2YgV29ybGQsR3JvdXAsT3duZXIsU3lzdGVtKS4gQSBuZXcKICAgZmlsZSBub3JtYWxseSBnZXRzIGFsbCAxNiBwcm90ZWN0aW9uIGJpdHMgZnJvbSB0aGUgb3JpZ2luYWwgZmlsZSBvZgogICB0aGUgc2FtZSBuYW1lLgoKICAgTm90ZTogVk1TLXRvLVZNUyB0cmFuc2ZlcnMgdGFrZSBwbGFjZSBpbiBMQUJFTEVEIG1vZGUgd2hlbiB0aGUgdHdvCiAgIEMtS2VybWl0cyByZWNvZ25pemUgZWFjaCBvdGhlcidzIHBsYXRmb3JtIGFzIFZNUyAodW5sZXNzIHlvdSBoYXZlCiAgIGRpc2FibGVkIExBQkVMRUQtbW9kZSB0cmFuc2ZlcnMpLiBJbiB0aGlzIGNhc2UsIGFsbCBvZiBhIGZpbGUncwogICBhdHRyaWJ1dGVzIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIHRyYW5zZmVyIGFuZCB0aGUgcHJvdGVjdGlvbiBtYXNrIChhbmQKICAgb3RoZXIgaW5mb3JtYXRpb24pIGlzIHRha2VuIGZyb20gdGhlIGZpbGUncyBpbnRlcm5hbCBpbmZvcm1hdGlvbiwgYW5kCiAgIHRoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGFueSBpbmZvcm1hdGlvbiBpbiB0aGUgQXR0cmlidXRlIHBhY2tldHMuCiAgIFlvdSBjYW4gZGVmZWF0IHRoZSBhdXRvbWF0aWMgc3dpdGNoaW5nIGludG8gTEFCRUxFRCBtb2RlIChpZiB5b3Ugd2FudAogICB0bykgd2l0aCBTRVQgVFJBTlNGRVIgTU9ERSBNQU5VQUwuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjQuMi4yLiBTeXN0ZW0tSW5kZXBlbmRlbnQgUGVybWlzc2lvbnMKCiAgIFRoZSBzeXN0ZW0taW5kZXBlbmRlbnQgKCJnZW5lcmljIikgcHJvdGVjdGlvbiBpcyB1c2VkIHdoZW4gdGhlIHN5c3RlbQogICBJRHMgb2YgdGhlIHR3byBLZXJtaXQgcHJvZ3JhbXMgZG8gbm90IGFncmVlIChlLmcuIG9uZSBpcyBVTklYLCB0aGUKICAgb3RoZXIgaXMgVk1TKS4gVGhlIGdlbmVyaWMgcHJvdGVjdGlvbiBhdHRyaWJ1dGUgaW5jbHVkZXMgdGhlIGZvbGxvd2luZwogICBwZXJtaXNzaW9ucyAobm90IGFsbCBhcmUgYXBwbGljYWJsZSB0byBldmVyeSBmaWxlIHN5c3RlbSk6IFJlYWQsCiAgIFdyaXRlLCBBcHBlbmQsIEV4ZWN1dGUsIERlbGV0ZSwgU2VhcmNoLiBUaGUgZ2VuZXJpYyBwZXJtaXNzaW9ucyBhcmUKICAgZGVyaXZlZCBmcm9tIHRoZSBvd25lciBwZXJtaXNzaW9ucyBvZiB0aGUgc291cmNlIGZpbGUsIHRodXMsIGEgVW5peAogICAndycgcGVybWlzc2lvbiBiZWNvbWVzIFZNUyBXcml0ZSxEZWxldGUuCgogICBUaGUgT3duZXIgZmllbGQgb2YgdGhlIG5ldyBmaWxlJ3MgcGVybWlzc2lvbnMgaXMgc2V0IGZyb20gdGhlIGluY29taW5nCiAgIGdlbmVyaWMgcHJvdGVjdGlvbiBhdHRyaWJ1dGUuCgogICBJbiBVTklYLCB0aGUgR3JvdXAgYW5kIFdvcmxkIHBlcm1pc3Npb25zIGFyZSBzZXQgYWNjb3JkaW5nIHRvIHlvdXIKICAgdW1hc2ssIGV4Y2VwdCB0aGF0IGV4ZWN1dGUgcGVybWlzc2lvbiBpcyBOT1Qgc2V0IGluIHRoZXNlIGZpZWxkcyBpZiBpdAogICB3YXMgbm90IGFsc28gc2V0IGluIHRoZSBnZW5lcmljIHByb3RlY3Rpb24gKGFuZCBjb25zZXF1ZW50bHksIGlzIHNldAogICBpbiB0aGUgT3duZXIgZmllbGQpLgoKICAgSW4gVk1TLCB0aGUgU3lzdGVtLCBHcm91cCwgYW5kIFdvcmxkIHBlcm1pc3Npb25zIGFyZSBzZXQgYWNjb3JkaW5nIHRvCiAgIHRoZSBwcm9jZXNzIGRlZmF1bHQgZmlsZSBwZXJtaXNzaW9uIChhcyBzaG93biBpbiBWTVMgYnkgU0hPVwogICBQUk9URUNUSU9OKSwgZXhjZXB0IHRoYXQgbm8gcGVybWlzc2lvbnMgYXJlIGFsbG93ZWQgaW4gdGhlc2UgZmllbGRzCiAgIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJpYyBwZXJtaXNzaW9ucy4KCiAgIE5vdGUgdGhhdCB0aGUgVk1TIGFuZCBVTklYIGludGVycHJldGF0aW9ucyBvZiBFeGVjdXRlIHBlcm1pc3Npb24gYXJlCiAgIG5vdCBpZGVudGljYWwuIEluIFVOSVgsIGEgZmlsZSAoYmluYXJ5IGV4ZWN1dGFibGUsIHNoZWxsIHNjcmlwdCwgZXRjKQogICBtYXkgbm90IGJlIGV4ZWN1dGVkIHVubGVzcyBpdCBoYXMgRXhlY3V0ZSBwZXJtaXNzaW9uLCBhbmQgbm9ybWFsbHkKICAgZmlsZXMgdGhhdCBhcmUgbm90IGludGVuZGVkIGZvciBleGVjdXRpb24gZG8gbm90IGhhdmUgRXhlY3V0ZQogICBwZXJtaXNzaW9uLiBJbiBWTVMsIFJlYWQgcGVybWlzc2lvbiBpbXBsaWNpdGx5IHN1cHBsaWVzIEV4ZWN1dGUKICAgY2FwYWJpbGl0eS4gR2VuZXJhbGx5IGZpbGVzIHRoYXQgaGF2ZSBSZWFkIHBlcm1pc3Npb24gYWxzbyBoYXZlCiAgIGV4cGxpY2l0IEV4ZWN1dGUgcGVybWlzc2lvbiwgYnV0IGZpbGVzIChiaW5hcnkgZXhlY3V0YWJsZXMsIERDTAogICBjb21tYW5kIHByb2NlZHVyZXMpIHRoYXQgaGF2ZSBSZWFkIHBlcm1pc3Npb24gYW5kIG5vdCBFeGVjdXRlCiAgIHBlcm1pc3Npb24gY2FuIHN0aWxsIGJlIGV4ZWN1dGVkLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuNS4gRmlsZSBNYW5hZ2VtZW50IENvbW1hbmRzCgogICAgNC41LjEuIFRoZSBESVJFQ1RPUlkgQ29tbWFuZAoKICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCB0aGUgRElSRUNUT1JZIGNvbW1hbmQgYWx3YXlzIHJhbiBhbiBleHRlcm5hbAogICBzeXN0ZW0gY29tbWFuZCAoc3VjaCBhcyAibHMiIG9uIFVOSVgpIG9yIHByb2dyYW0gdG8gcHJvZHVjdCB0aGUKICAgZGlyZWN0b3J5IGxpc3RpbmcuIFRoaXMgaGFkIGNlcnRhaW4gYWR2YW50YWdlcywgbW9zdGx5IHRoYXQgeW91IGNvdWxkCiAgIGluY2x1ZGUgc3lzdGVtLWRlcGVuZGVudCBvcHRpb25zIGZvciBjdXN0b21pemVkIGxpc3RpbmdzLCBlLmcuIG9uCiAgIFVOSVg6CgogIGRpciAtbHQgYyogfCBtb3JlCgogICBvciBpbiBWTVM6CgogIGRpcmVjdG9yeSAvc2l6ZS9kYXRlL3Byb3RlY3Rpb24vZXhjZXB0PSoub2JqIG9vZmEuKjswCgogICBUaGlzIGFwcHJvYWNoLCBob3dldmVyLCBjYXJyaWVzIHNvbWUgZGlzYWR2YW50YWdlczogQy1LZXJtaXQgY2FuJ3QKICAgcmV0dXJuIFNVQ0NFU1Mgb3IgRkFJTFVSRSBzdGF0dXMgZm9yIChlLmcuKSAiZGlyIGZvbyIgYWNjb3JkaW5nIHRvCiAgIHdoZXRoZXIgdGhlIGZpbGUgImZvbyIgZXhpc3RzOyBhbmQgaXQgcnVucyBhbiBpbmZlcmlvciBwcm9jZXNzLCB3aGljaAogICBtaWdodCBiZSBhIHByb2JsZW0gaW4gc29tZSBlbnZpcm9ubWVudHMgZm9yIHJlc291cmNlIGFuZC9vciBzZWN1cml0eQogICByZWFzb25zLCBhbmQgd29uJ3Qgd29yayBhdCBhbGwgaW4gYSAibm9wdXNoIiBlbnZpcm9ubWVudCAoZS5nLiBvbmUgaW4KICAgd2hpY2ggQy1LZXJtaXQgaXMgY29uZmlndXJlZCB0byBmb3JiaWQgYWNjZXNzIHRvIGV4dGVyaW9yIGNvbW1hbmRzIGFuZAogICBwcm9ncmFtcywgZS5nLiBpbiBhIFZNUyAiY2FwdGl2ZSBhY2NvdW50IikuCgogICBJbiBDLUtlcm1pdCA3LjAgb24gVk1TIGFuZCBVTklYLCBhbmQgaW4gSzk1IDEuMS4xOSBhbmQgbGF0ZXIsIHRoZQogICBESVJFQ1RPUlkgY29tbWFuZCBpcyBpbnRlcm5hbCB0byBLZXJtaXQuIEl0IGNhbiBiZSBydW4gaW4gYSAibm9wdXNoIgogICBlbnZpcm9ubWVudCBhbmQgcmV0dXJucyBTVUNDRVNTIG9yIEZBSUxVUkUgc3RhdHVzIGFwcHJvcHJpYXRlbHkuIEluCiAgIFVOSVggaXQgcHJpbnRzIGFsbCBkYXRlcyBhbmQgdGltZXMgaW4gYSBjb25zaXN0ZW50IHdheSAodW5saWtlIGxzKS4gSW4KICAgVk1TIGl0IHByaW50cyBwcmVjaXNlIGZpbGUgc2l6ZXMsIHJhdGhlciB0aGFuICJibG9ja3MiLiBJdCBvZmZlcnMKICAgc2V2ZXJhbCBmb3JtYXR0aW5nIGFuZCBvdGhlciBvcHRpb25zLCBidXQgaXQgaXMgbm90IG5lY2Vzc2FyaWx5IG1vcmUKICAgZmxleGlibGUgdGhhbiB0aGUgY29ycmVzcG9uZGluZyBleHRlcm5hbCBjb21tYW5kcyBvciBwcm9ncmFtcyAodGhlCiAgIFVOSVggImxzIiBwcm9ncmFtLCB0aGUgVk1TICJkaXJlY3RvcnkiIGNvbW1hbmQpLiBUaGUgc3ludGF4IGlzOgoKICAgRElSRUNUT1JZIFsgc3dpdGNoIFsgc3dpdGNoIFsgLi4uIF0gXSBdIFsgZmlsZXNwZWMgXQoKICAgSWYgbm8gZmlsZXNwZWMgaXMgZ2l2ZW4sIGFsbCBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXJlCiAgIGxpc3RlZC4KCiAgIE9wdGlvbmFsIHN3aXRjaGVzIGluY2x1ZGUgYWxsIHRoZSBzdGFuZGFyZCBmaWxlLXNlbGVjdGlvbiBzd2l0Y2hlcwogICBwcmVzZW50ZWQgaW4gWzQ2NF1TZWN0aW9uIDEuNS40LCBwbHVzOgoKICAgL0FMTAogICAgICAgICAgU2hvdyBib3RoIHJlZ3VsYXIgZmlsZXMgYW5kIGRpcmVjdG9yaWVzOyB0aGlzIGlzIHRoZSBkZWZhdWx0LgoKICAgL0FSUkFZOngKICAgICAgICAgIEluc3RlYWQgb2YgZGlzcGxheWluZyBhIGRpcmVjdG9yeSBsaXN0aW5nLCBwdXQgdGhlIGZpbGVzIHRoYXQKICAgICAgICAgIHdvdWxkIGhhdmUgYmVlbiBzaG93biAoYmFzZWQgb24gdGhlIGZpbGVzcGVjIGFuZCBvdGhlcgogICAgICAgICAgc2VsZWN0aW9uIHN3aXRjaGVzKSBpbiB0aGUgZ2l2ZW4gYXJyYXkuIFRoZSBhcnJheSBuZWVkIG5vdCAoYW5kCiAgICAgICAgICBzaG91bGQgbm90KSBiZSBwcmVkZWNsYXJlZDsgaWYgdGhlIGFycmF5IGFscmVhZHkgZXhpc3RzLCBpdCBpcwogICAgICAgICAgZGVzdHJveWVkIGFuZCByZXVzZWQuIFRoZSBhcnJheSBuYW1lIGNhbiBiZSBhIHNpbmdsZSBsZXR0ZXIsCiAgICAgICAgICBsaWtlICJhIiwgb3IgYW55IGZ1bGxlciBmb3JtLCBzdWNoIGFzICImYSIsICJcJmEiLCAiXCZhW10iLAogICAgICAgICAgZXRjLiBJZiB0aGUgL0FSUkFZIHN3aXRjaCBpcyBpbmNsdWRlZCwgdGhlIGZvbGxvd2luZyBvdGhlcgogICAgICAgICAgc3dpdGNoZXMgYXJlIGlnbm9yZWQ6IC9CUklFRiwgL1ZFUkJPU0UsIC9IRUFESU5HLCAvUEFHRSwKICAgICAgICAgIC9FTkdMSVNIREFURSwgL0lTT0RBVEUsIC9YRkVSTU9ERSwgL01FU1NBR0UsIC9TT1JULCAvUkVWRVJTRSwKICAgICAgICAgIC9BU0NFTkRJTkcuIEluIG90aGVyIHdvcmRzLCBvbmx5IGZpbGUgc2VsZWN0aW9uIHN3aXRjaGVzIGFyZQogICAgICAgICAgbWVhbmluZ2Z1bCB3aXRoIC9BUlJBWTogL0ZJTEVTLCAvRElSRUNUT1JJRVMsIC9BTEwsIC9ET1RGSUxFUywKICAgICAgICAgIC9OT0JBQ0tVUCwgL1JFQ1VSU0lWRSwgL1NNQUxMRVIsIC9MQVJHRVIsIC9BRlRFUiwgL0JFRk9SRSwKICAgICAgICAgIC9FWENFUFQsIGV0Yy4gVGhlIHJlc3VsdGluZyBhcnJheSBoYXMgdGhlIG51bWJlciBvZiBmaWxlcyAobikKICAgICAgICAgIGFzIGl0cyAwdGggZWxlbWVudCwgYW5kIHRoZSBmaWxlbmFtZXMgaW4gZWxlbWVudHMgMSB0aHJvdWdoIG4KICAgICAgICAgIEV4YW1wbGU6CgogIGRpciAvYXJyYXk6JmEgL2ZpbGVzIC9ub2JhY2t1cCAvYWZ0ZXI6MTk5OTAxMDEgL2xhcmdlcjoxMDAwMCBbYWJdKgogIHNob3cgYXJyYXkgJmEKCiAgIC9GSUxFUwogICAgICAgICAgT25seSBzaG93IHJlZ3VsYXIgZmlsZXMuCgogICAvRElSRUNUT1JJRVMKICAgICAgICAgIE9ubHkgc2hvdyBkaXJlY3Rvcmllcy4KCiAgIC9CQUNLVVAKICAgICAgICAgIEluIFVOSVgsIE9TLTksIEstOTUsIGFuZCBvdGhlciB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgU0VUIEZJTEUKICAgICAgICAgIENPTExJU0lPTiBCQUNLVVAgYW5kIGNyZWF0ZSBiYWNrdXAgZmlsZXMgYnkgYXBwZW5kaW5nIC5+bn4gdG8KICAgICAgICAgIHRoZSBmaWxlbmFtZSAod2hlcmUgIm4iIGlzIGEgbnVtYmVyKSwgL0JBQ0tVUCBtZWFucyB0byBpbmNsdWRlCiAgICAgICAgICB0aGVzZSBmaWxlcyBpbiBkaXJlY3RvcnkgbGlzdGluZ3MuIFRoaXMgaXMgdGhlIGRlZmF1bHQuCgogICAvTk9CQUNLVVAKICAgICAgICAgIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIC9CQUNLVVA6IHRoYXQgaXMsIGRvIG5vdCBpbmNsdWRlIGJhY2t1cAogICAgICAgICAgZmlsZXMgaW4gdGhlIGxpc3RpbmcuCgogICAvQlJJRUYKICAgICAgICAgIExpc3QgZmlsZW5hbWVzIG9ubHk7IHVzZSBhIGNvbXBhY3QgZm9ybWF0LCBhcyBtYW55IGZpbGVuYW1lcyBhcwogICAgICAgICAgd2lsbCBmaXQgYWNyb3NzIHRoZSBzY3JlZW4gKGJhc2VkIG9uIHRoZSBsb25nZXN0IG5hbWUpLiBBIGJyaWVmCiAgICAgICAgICBsaXN0aW5nIGlzIGFsd2F5cyBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkuCgogICAvVkVSQk9TRQogICAgICAgICAgTGlzdCBvbmUgZmlsZSBwZXIgbGluZSwgYW5kIGluY2x1ZGUgZGF0ZSwgc2l6ZSwgYW5kIChpbiBVTklYCiAgICAgICAgICBvbmx5KSBwZXJtaXNzaW9ucyBvZiBlYWNoIGZpbGUuIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIC9CUklFRiwKICAgICAgICAgIGFuZCBpcyB0aGUgZGVmYXVsdC4KCiAgIC9QQUdFCiAgICAgICAgICBQYXVzZSBhdCB0aGUgZW5kIG9mIGVhY2ggc2NyZWVuZnVsIGFuZCBnaXZlIGEgIm1vcmU/IiBwcm9tcHQsCiAgICAgICAgICBldmVuIGlmIFNFVCBDT01NQU5EIE1PUkUtUFJPTVBUSU5HIGlzIE9GRi4KCiAgIC9OT1BBR0UKICAgICAgICAgIERvbid0IHBhdXNlIGF0IHRoZSBlbmQgb2YgZWFjaCBzY3JlZW5mdWwgYW5kIGdpdmUgYSAibW9yZT8iCiAgICAgICAgICBwcm9tcHQsIGV2ZW4gaWYgU0VUIENPTU1BTkQgTU9SRS1QUk9NUFRJTkcgaXMgT04uIElmIG5laXRoZXIKICAgICAgICAgIC9QQUdFIG9yIC9OT1BBR0UgaXMgZ2l2ZW4sIHBhZ2luZyBpcyBhY2NvcmRpbmcgdG8gdGhlCiAgICAgICAgICBwcmV2YWlsaW5nIENPTU1BTkQgTU9SRS1QUk9NUFRJTkcgc2V0dGluZyAod2hpY2ggY2FuIGJlCiAgICAgICAgICBkaXNwbGF5ZWQgd2l0aCBTSE9XIENPTU1BTkQpLgoKICAgL0VOR0xJU0hEQVRFCiAgICAgICAgICBTaG93IGRhdGVzIGluIGRkLW1tbS15eXl5IGZvcm1hdDsgbW1tIGlzIHRoZSBmaXJzdCB0aHJlZQogICAgICAgICAgbGV0dGVycyBvZiB0aGUgRW5nbGlzaCBtb250aCBuYW1lLgoKICAgL0lTT0RBVEUKICAgICAgICAgIFNob3cgZGF0ZXMgaW4geXl5eS1tbS1kZCBmb3JtYXQ7IG1tIGlzIHRoZSBtb250aCBudW1iZXIsIDEtMTIuCiAgICAgICAgICBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZiAvRU5HTElTSERBVEUsIGFuZCBpcyB0aGUgZGVmYXVsdC4KCiAgIC9IRUFESU5HUwogICAgICAgICAgUHJpbnQgYSBoZWFkaW5nIGJlZm9yZSB0aGUgbGlzdGluZyBhbmQgYSBzdW1tYXJ5IGF0IHRoZSBlbmQuCgogICAvTk9IRUFESU5HUwogICAgICAgICAgRG9uJ3QgcHJpbnQgYSBoZWFkaW5nIGJlZm9yZSB0aGUgbGlzdGluZyBvciBhIHN1bW1hcnkgYXQgdGhlCiAgICAgICAgICBlbmQuIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIC9IRUFESU5HUywgYW5kIGlzIHRoZSBkZWZhdWx0LgoKICAgL1hGRVJNT0RFCiAgICAgICAgICBPbmx5IGluIEtlcm1pdCBwcm9ncmFtcyB0aGF0IHN1cHBvcnQgU0VUIEZJTEUgUEFUVEVSTlMuIElmIHRoaXMKICAgICAgICAgIHN3aXRjaCBpcyBpbmNsdWRlZCwgYW5kIHRoZSBmaWxlbmFtZSBtYXRjaGVzIGFueSBGSUxFCiAgICAgICAgICBCSU5BUlktUEFUVEVSTiAoWzQ2NV1TZWN0aW9uIDQuMyksICIoQikiIGlzIHByaW50ZWQgYWZ0ZXIgdGhlCiAgICAgICAgICBmaWxlbmFtZTsgb3RoZXJ3aXNlLCBpZiBpdCBtYXRjaGVzIGEgRklMRSBURVhULVBBVFRFUk4sICIoVCkiCiAgICAgICAgICBpcyBwcmludGVkLgoKICAgL05PWEZFUk1PREUKICAgICAgICAgIERvbid0IGRpc3BsYXkgdHJhbnNmZXItbW9kZSBpbmRpY2F0b3JzLiBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZgogICAgICAgICAgL1hGRVJNT0RFIGFuZCBpcyB0aGUgZGVmYXVsdC4KCiAgIC9SRUNVUlNJVkUKICAgICAgICAgIFNob3cgZmlsZXMgbm90IG9ubHkgaW4gdGhlIGdpdmVuIGRpcmVjdG9yeSwgYnV0IGFsc28gaW4gaXRzCiAgICAgICAgICBzdWJkaXJlY3RvcmllcyAoaWYgYW55KSwgdGhlaXIgc3ViZGlyZWN0b3JpZXMsIGV0Yy4KCiAgIC9OT1JFQ1VSU0lWRQogICAgICAgICAgRG9uJ3Qgc2hvdyBmaWxlcyBpbiBzdWJkaXJlY3Rvcmllcy4gVGhpcyBpcyB0aGUgb3Bwb3NpdGUgb2YKICAgICAgICAgIC9SRUNVUlNJVkUsIGFuZCBpcyB0aGUgZGVmYXVsdC4KCiAgIC9NRVNTQUdFOnRleHQKICAgICAgICAgIFRoaXMgbGV0cyB5b3Ugc3BlY2lmeSBhIHNob3J0IHRleHQgc3RyaW5nIHRvIGJlIGFwcGVuZGVkIHRvIHRoZQogICAgICAgICAgZW5kIG9mIGVhY2ggZGlyZWN0b3J5IGxpc3RpbmcgbGluZSAoYSBzcGFjZSBpcyBzdXBwbGllZAogICAgICAgICAgYXV0b21hdGljYWxseSkuIElmIHRoZSB0ZXh0IGNvbnRhaW5zIGFueSBzcGFjZXMsIGVuY2xvc2UgaXQgaW4KICAgICAgICAgIGJyYWNlcywgZS5nLiAvTUVTU0FHRTp7dHdvIHdvcmRzfS4KCiAgIC9OT01FU1NBR0UKICAgICAgICAgIERvbid0IGFwcGVuZCBhbnkgbWVzc2FnZSB0byB0aGUgZW5kIG9mIGVhY2ggZGlyZWN0b3J5IGxpc3RpbmcKICAgICAgICAgIGxpbmUgKGRlZmF1bHQpLgoKICAgL1NPUlQ6W3tOQU1FLFNJWkUsREFURX1dCiAgICAgICAgICBTb3J0IHRoZSBsaXN0aW5nIGJ5IG5hbWUsIHNpemUsIG9yIGRhdGUuIElmIHRoZSAvU09SVCBzd2l0Y2ggaXMKICAgICAgICAgIGdpdmVuIGJ1dCB0aGUgInNvcnQtYnkiIGtleXdvcmQgaXMgb21pdHRlZCwgdGhlIGxpc3RpbmcgaXMKICAgICAgICAgIHNvcnRlZCBieSBuYW1lLiAvU09SVDpOQU1FIC9BU0NFTkRJTkcgKGFscGhhYmV0aWMgc29ydCBieSBuYW1lKQogICAgICAgICAgaXMgdGhlIGRlZmF1bHQuCgogICAvTk9TT1JUCiAgICAgICAgICBEb24ndCBzb3J0IHRoZSBsaXN0aW5nLiBGaWxlcyBhcmUgbGlzdGVkIGluIHdoYXRldmVyIG9yZGVyIHRoZXkKICAgICAgICAgIGFyZSBzdXBwbGllZCBieSB0aGUgb3BlcmF0aW5nIHN5c3RlbSwgZS5nLiBpbm9kZSBvcmRlciBpbiBVTklYLgoKICAgL1JFVkVSU0UKICAgICAgICAgIElmIHRoZSAvU09SVCBzd2l0Y2ggaXMgZ2l2ZW4sIHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBzb3J0LgogICAgICAgICAgU3lub255bTogL0RFU0NFTkRJTkcuCgogICAvQVNDRU5ESU5HCiAgICAgICAgICBJZiB0aGUgL1NPUlQgc3dpdGNoIGlzIGdpdmVuLCBzb3J0IHRoZSBsaXN0aW5nIGluIG5vcm1hbCBvcmRlci4KICAgICAgICAgIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIC9SRVZFUlNFIGFuZCBpcyB0aGUgZGVmYXVsdC4KCiAgIE5vdGUgdGhhdCBtb3N0IG9mIHRoZSBESVJFQ1RPUlktc3BlY2lmaWMgc3dpdGNoZXMgY29tZSBpbiBwYWlycywgaW4KICAgd2hpY2ggb25lIG1lbWJlciBvZiBhIHBhaXIgKGUuZy4gL05PSEVBRElOR1MpIGlzIHRoZSBvcHBvc2l0ZSBvZiB0aGUKICAgb3RoZXIgKGUuZy4gL0hFQURJTkdTKS4KCiAgIElmIHlvdSBhbHdheXMgd2FudCB0byB1c2UgY2VydGFpbiBvcHRpb25zLCB5b3UgY2FuIHNldCB0aGVtIHdpdGggdGhlCiAgIFNFVCBPUFRJT05TIERJUkVDVE9SWSBjb21tYW5kIChbNDY2XVNlY3Rpb24gMS41LjUpLiBVc2UgU0hPVyBPUFRJT05TCiAgIHRvIGxpc3QgdGhlIG9wdGlvbnMgY3VycmVudGx5IGluIGVmZmVjdC4gVG8gbWFrZSB0aGUgZGVzaXJlZCBvcHRpb25zCiAgIGFwcGx5IGV2ZXJ5IHRpbWUgeW91IHJ1biBDLUtlcm1pdCwgcHV0IGEgU0VUIE9QVElPTlMgRElSRUNUT1JZIGNvbW1hbmQKICAgaW4geW91ciBDLUtlcm1pdCBjdXN0b21pemF0aW9uIGZpbGUsIHNwZWNpZnlpbmcgdGhlIGRlc2lyZWQgb3B0aW9ucy4KICAgT3B0aW9ucyBzZXQgaW4gdGhpcyBtYW5uZXIgYXBwbHkgdG8gZXZlcnkgc3Vic2VxdWVudCBESVJFQ1RPUlkKICAgY29tbWFuZC4gT2YgY291cnNlLCBpZiB5b3UgaW5jbHVkZSBzd2l0Y2hlcyBpbiBhIERJUkVDVE9SWSBjb21tYW5kLAogICB0aGVzZSBvdmVycmlkZSBhbnkgZGVmYXVsdHMsIGJ1aWx0LWluIG9yIGN1c3RvbS4gRXhhbXBsZToKCiAgRElSRUNUT1JZICAgICAgICAgICAgOyBVc2UgImZhY3RvcnkgZGVmYXVsdHMiCiAgU0VUIE9QVElPTlMgRElSRUNUT1JZIC9TT1JUOlNJWkUgL1JFVkVSU0UgL0hFQURJTkdTICA7IEN1c3RvbWl6ZSBkZWZhdWx0cwogIERJUkVDVE9SWSAgICAgICAgICAgIDsgVXNlIGN1c3RvbWl6ZWQgZGVmYXVsdHMKICBESVIgL1NPUlQ6TkFNRSAgICAgICA7IE92ZXJyaWRlIGN1c3RvbWl6ZWQgZGVmYXVsdCBTT1JUIGtleQogIFNFVCBPUFQgRElSIC9SRUNVUlMgIDsgQWRkIC9SRUNVUlNJVkUgdG8gY3VzdG9taXplZCBkZWZhdWx0cwogIERJUiAvQVNDRU5EICAgICAgICAgIDsgT3ZlcnJpZGUgY3VzdG9taXplZCBkZWZhdWx0IFNPUlQgb3JkZXIKCiAgIE5vdGVzOgoKICAgICAqIE9ubHkgYSBzaW5nbGUgc29ydCBrZXkgaXMgc3VwcG9ydGVkOyB0aGVyZSBpcyBwcmVzZW50bHkgbm8gd2F5IHRvCiAgICAgICBoYXZlIG11bHRpcGxlIHNvcnQga2V5cy4KICAgICAqIElmIHRoZSAvQlJJRUYgc3dpdGNoIGlzIGdpdmVuLCBhbGwgb3RoZXIgc3dpdGNoZXMgKGV4Y2VwdAogICAgICAgL1tOT11SRUNVUlNJVkUsIC9bTk9dRE9URklMRVMsIC9ESVJFQ1RPUklFUywgL0ZJTEVTLCBhbmQgL0FMTCkgYXJlCiAgICAgICBpZ25vcmVkLgogICAgICogL1NPUlQ6YW55dGhpbmcgZ2l2ZXMgaW5jb3JyZWN0IHJlc3VsdHMgaWYgYW55IGZpbGVzIGhhdmUgbGVuZ3RocwogICAgICAgZ3JlYXRlciB0aGFuIDEwIGRpZ2l0cyAoaS5lLiB0aGF0IGFyZSBtb3JlIHRoYW4gOTk5OTk5OTk5OSBieXRlcwogICAgICAgbG9uZywgaS5lLiBpZiB0aGV5IGFyZSAxMEdCIG9yIG1vcmUgaW4gc2l6ZSkgYmVjYXVzZSB0aGUgb3ZlcmxvbmcKICAgICAgIGxlbmd0aCBmaWVsZCBjYXVzZXMgdGhlIGRhdGUgYW5kIG5hbWUgZmllbGRzIHRvIGJlIG1pc2FsaWduZWQuCiAgICAgKiAvU09SVDpOQU1FIGlzIHJlZHVuZGFudCBpbiBWTVMgc2luY2UgVk1TIHJldHVybnMgZmlsZW5hbWVzIGluCiAgICAgICBhbHBoYWJldGljIG9yZGVyIGFueXdheS4KICAgICAqIC9TT1JUOk5BTUUgaWdub3JlcyBhbHBoYWJldGljIGNhc2Ugb24gcGxhdGZvcm1zIHdoZXJlIGNhc2UgZG9lcwogICAgICAgbm90IG1hdHRlciBpbiBmaWxlbmFtZXMsIGJ1dCB0aGlzIHdvcmtzIG9ubHkgZm9yIHVuYWNjZW50ZWQgUm9tYW4KICAgICAgIGxldHRlcnMgQS1aLgogICAgICogL1NPUlQ6TkFNRSBpcyBjdXJyZW50bHkgYmFzZWQgb24gY29kZSB2YWx1ZXMsIGFuZCBzbyB3b3JrcyBmaW5lCiAgICAgICBmb3IgQVNDSUksIGJ1dCB3aWxsIHByb2JhYmx5IHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzIGZvciBmaWxlcwogICAgICAgd2l0aCBub24tQVNDSUkgb3IgOC1iaXQgY2hhcmFjdGVycyBpbiB0aGVpciBuYW1lcy4gKExvY2FsZS1iYXNlZAogICAgICAgc29ydGluZyByYWlzZXMgcmF0aGVyIHNpZ25pZmljYW50IGlzc3VlcyBvZiBwb3J0YWJpbGl0eSwgc2l6ZSwKICAgICAgIHBlcmZvcm1hbmNlLCBldGMuKQogICAgICogL1NPUlQ6REFURSB3b3JrcyByaWdodCBvbmx5IGZvciBJU08tZm9ybWF0IGRhdGVzLCBub3QgRW5nbGlzaAogICAgICAgb25lcy4KICAgICAqIC9TT1JUOlNJWkUgc29ydHMgdGhlIHNpemUgZmllbGQgbGV4aWNhbGx5LiBPbiBzb21lIHBsYXRmb3JtcyAoZS5nLgogICAgICAgV2luZG93cyksIHRoZSBzaXplIG9mIGEgZGlyZWN0b3J5IGZpbGUgaXMgbGlzdGVkIGFzICI8RElSPiIgcmF0aGVyCiAgICAgICB0aGFuIGFzIGEgbnVtYmVyOyBpbiB0aGlzIGNhc2UsIHRoZSAiPERJUj4iIGZpbGVzIGFyZSBnYXRoZXJlZCBhdAogICAgICAgdGhlIGVuZCAob3IgYmVnaW5uaW5nLCBkZXBlbmRpbmcgb24gdGhlIHNvcnQgb3JkZXIpIG9mIHRoZQogICAgICAgbGlzdGluZy4KICAgICAqIC9SRUNVUlNJVkUgaXMgYWNjZXB0ZWQgYnV0IGlnbm9yZWQgaW4gQU9TL1ZTLiBVc2UgdGhlIG5vcm1hbAogICAgICAgc3lzdGVtLXNwZWNpZmljIGZpbGVzcGVjIG5vdGF0aW9uLCBlLmcuICJkaXIgIy50eHQiLgogICAgICogL1JFQ1VSU0lWRSBoYXMgbm8gYWZmZWN0IHdoZW4gYSBmdWxsLCBhYnNvbHV0ZSBwYXRobmFtZSBpcyBnaXZlbjsKICAgICAgIGUuZy4gImRpciAvcmVjdXJzaXZlIC90bXAvZm9vIiAod2hlcmUgImZvbyIgaXMgYSByZWd1bGFyIGZpbGUpCiAgICAgICBvbmx5IHNob3dzIHRoZSAiL3RtcC9mb28iIGZpbGUuIElmIHlvdSB3YW50IHRvIHNlZSBhbGwgImZvbyIgZmlsZXMKICAgICAgIGluIHRoZSAvdG1wIHRyZWUsIGRvICJjZCAvdG1wIiBhbmQgdGhlbiAiZGlyIC9yZWN1cnNpdmUgZm9vIi4KICAgICAqIElmIGEgZmlsZSBzaXplIG9mIC0xIGlzIHNob3duLCBvciBkYXRlLXRpbWUgb2YgMDAwMC0wMC0wMAogICAgICAgMDA6MDA6MDAsIHRoaXMgbWVhbnMgdGhlIGZpbGUgd2FzIGxvY2F0ZWQsIGJ1dCBhY2Nlc3MgdG8KICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlIHdhcyBkZW5pZWQgdG8gQy1LZXJtaXQuCiAgICAgKiBJbiBWTVMsIGlmIEZPTy5ESVI7MSBpcyBhIGRpcmVjdG9yeSB3aXRoaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeSwKICAgICAgICJkaXJlY3RvcnkgZm9vIiBhbmQgImRpcmVjdG9yeSBbLmZvb10iIGxpc3QgdGhlIGZpbGVzIGluIHRoZQogICAgICAgWy5GT09dIHN1YmRpcmVjdG9yeSwgYnV0ICJkaXJlY3RvcnkgZm9vLmRpciIgbGlzdHMgdGhlIGRpcmVjdG9yeQogICAgICAgZmlsZSBpdHNlbGY7IHNpbWlsYXJseSBmb3IgIiouZGlyIiB2ZXJzdXMgIlsuKl0iLCBldGMuCiAgICAgKiBJbiBVTklYLCBpZiAiZm9vIiBpcyBhIGRpcmVjdG9yeSB3aXRoaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeSwKICAgICAgICJkaXJlY3RvcnkgZm9vIiBsaXN0cyB0aGUgZmlsZXMgaW4gdGhlIGZvbyBkaXJlY3RvcnkuIElmIHlvdSB3YW50CiAgICAgICB0byBsaXN0IHRoZSBmb28gZGlyZWN0b3J5IGZpbGUgaXRzZWxmLCBwdXQgYW4gYXN0ZXJpc2sgYXQgdGhlIGVuZDoKICAgICAgICJkaXIgZm9vKiIuCgogICBIaW50OiBIb3cgdG8gZmluZCB0aGUgYmlnZ2VzdCBmaWxlcyBpbiBhIGRpcmVjdG9yeSB0cmVlOgoKICBjZCB4eHggOyAocm9vdCBvZiB0cmVlKQogIGRpcmVjdG9yeSAvc29ydDpzaXplIC9yZWN1cnNpdmUgL3JldmVyc2UgL2RvdGZpbGVzIC9wYWdlCgogICBBbm90aGVyIGhpbnQ6IElmIHlvdSBvZnRlbiB1c2Ugc2V2ZXJhbCBkaWZmZXJlbnQgZGlyZWN0b3J5LWxpc3RpbmcKICAgZm9ybWF0cywgZGVmaW5lIG1hY3JvIHNob3J0Y3V0cyBmb3IgdGhlbToKCiAgREVGSU5FIFdEIERJUkVDVE9SWSAvU09SVDpEQVRFIC9SRVZFUlNFIFwlKiAgOyBSZXZlcnNlIGNocm9ub2xvZ2ljYWwgb3JkZXIKICBERUZJTkUgU0QgRElSRUNUT1JZIC9TT1JUOlNJWkUgL1JFVkVSU0UgXCUqICA7IFJldmVyc2Ugb3JkZXIgb2Ygc2l6ZQogIERFRklORSBORCBESVJFQ1RPUlkgL1NPUlQ6TkFNRSAvQVNDRU5EIFwlKiAgIDsgQWxwaGFiZXRpY2FsIGJ5IG5hbWUKICBERUZJTkUgREwgRElSIC9ESVIgL1NPUlQ6TkFNRSAvQVNDRU5EIFwlKiAgICA7IEFscGhhYmV0aWNhbCBkaXJlY3RvcnkgbGlzdAoKICAgUHV0IHRoZXNlIGRlZmluaXRpb25zIGluIHlvdXIgQy1LZXJtaXQgY3VzdG9taXphdGlvbiBmaWxlLiBOb3RlIHRoYXQKICAgIlwlKiIgKFs0NjddU2VjdGlvbiA3LjUpIGluIHRoZXNlIGRlZmluaXRpb25zIGxldHMgeW91IGluY2x1ZGUgb3RoZXIKICAgc3dpdGNoZXMgaW4geW91ciBtYWNybyBpbnZvY2F0aW9ucywgZS5nLjoKCiAgd2QgL2hlYWRpbmdzICoudHh0CgogICBPZiBjb3Vyc2UgeW91IGNhbiBzdGlsbCBhY2Nlc3MgeW91ciBleHRlcm5hbCBkaXJlY3RvcnkgbGlzdGluZyBwcm9ncmFtCiAgIGJ5IHVzaW5nIFJVTiBvciAiISIsIGUuZy4gaW4gVk1TOgoKICBydW4gZGlyZWN0b3J5IC9zaXplL2RhdGUvcHJvdGVjdGlvbi9leGNlcHQ9Ki5vYmogb29mYS4qOzAKCiAgIG9yOgoKICAhZGlyIC9zaXplL2RhdGUvcHJvdC9leGM9Ki5vYmogb29mYS4qOzAKCiAgIEluIFVOSVgsIHVzZSAiIWxzIiBvciBqdXN0ICJscyIgKHdoaWNoIGlzIGEgc3BlY2lhbCBzeW5vbnltIGZvcgogICAiIWxzIikuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjUuMi4gVGhlIENEIGFuZCBCQUNLIENvbW1hbmRzCgogICBJbiBDLUtlcm1pdCA3LjAsIHRoZSBDRCBjb21tYW5kIGhhcyBhIG5ldyBmcmllbmQsIHRoZSBCQUNLIGNvbW1hbmQuCiAgIEJBQ0sgbWVhbnMgIkNEIHRvIG15IHByZXZpb3VzIGN1cnJlbnQgZGlyZWN0b3J5Ii4gQSBzZWNvbmQgQkFDSyBicmluZ3MKICAgeW91IGJhY2sgdG8gd2hlcmUgeW91IHdlcmUgYmVmb3JlIHRoZSBmaXJzdCBvbmU7IHRodXMgc3VjY2Vzc2l2ZSBCQUNLCiAgIGNvbW1hbmRzIHN3aXRjaCBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHR3byBkaXJlY3Rvcmllcy4KCiAgICA0LjUuMi4xLiBQYXJzaW5nIEltcHJvdmVtZW50cwoKICAgVGhlIENEIGNvbW1hbmQsIGFzIHdlbGwgYXMgb3RoZXIgY29tbWFuZHMgdGhhdCBwYXJzZSBhIGRpcmVjdG9yeSBuYW1lLAogICB3ZXJlIGNoYW5nZWQgaW4gNy4wIHRvIHByb3ZpZGUgYWxsIHRoZSBleHBlY3RlZCBmdW5jdGlvbnM6IGNvbXBsZXRpb24KICAgb24gVGFiIG9yIEVzYywgZGlyZWN0b3J5LW5hbWUgbGlzdHMgb24gPywgZXRjLiBPdGhlciBhZmZlY3RlZCBjb21tYW5kcwogICBpbmNsdWRlIFNFVCBTRVJWRVIgR0VULVBBVEgsIFNFVCBURU1QLURJUkVDVE9SWSwgU0VUIEZJTEUKICAgRE9XTkxPQUQtRElSRUNUT1JZLCBhbmQgU1BBQ0UuIENEIGFuZCBSRU1PVEUgQ0QgYWxzbyBub3cgd29yayB3aXRoCiAgIGxvZ2ljYWwgbmFtZXMuCgogICBJbiBWTVMsIHRoZSBzaXR1YXRpb24gaXMgYSBiaXQgY29tcGxpY2F0ZWQgc2luY2UgYSBkaXJlY3RvcnkgbmFtZSBjYW4KICAgbG9vayBsaWtlICJERVY6IiwgIltGT08uQkFSXSIsICJERVY6W0ZPTy5CQVJdIiwgIltGT09dQkFSLkRJUjsxIiwgZXRjLgogICBDb21wbGV0aW9uIGFuZCA/LWhlbHAgbWlnaHQgbm90IGFsd2F5cyB3b3JrLCBidXQgdGhleSBkbyBpbiBtYW55CiAgIGNhc2VzLiBFeGFtcGxlczoKCiAgY2QgPyAgICAgICAgICAgTGlzdHMgYWxsIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeQogIGNkIFtdPyAgICAgICAgIERpdHRvCiAgY2Qgaz8gICAgICAgICAgRGl0dG8sIGJ1dCBvbmx5IHRob3NlIHN0YXJ0aW5nIHdpdGggSwogIGNkIFtmb29dPyAgICAgIExpc3RzIGFsbCBzdWJkaXJlY3RvcmllcyBvZiB0aGUgW0ZPT10gZGlyZWN0b3J5CiAgY2QgWy1dPyAgICAgICAgTGlzdHMgYWxsIHN1YmRpcmVjdG9yaWVzIG9mIHRoZSBzdXBlcmlvciBkaXJlY3RvcnkKICBjZCBbLS1dPyAgICAgICBMaXN0cyBhbGwgc3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSAyIGxldmVscyB1cAogIGNkIFsuLi5dPyAgICAgIExpc3RzIGFsbCBkaXJlY3RvcmllcyBiZWxvdyB0aGUgY3VycmVudCBvbmUKICBjZCBbZm9vLj8gICAgICBEb2VzIG5vdCB3b3JrLgoKICAgQy1LZXJtaXQgYWxsb3dzIGFsbCBvZiB0aGUgZm9sbG93aW5nIGluIFZNUzoKCiAgY2QgYmFyICAgICAgICAgQ0QgdG8gc3ViZGlyZWN0b3J5IEJBUiBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkKICBjZCAuYmFyICAgICAgICBEaXR0bwogIGNkIFsuYmFyXSAgICAgIERpdHRvCiAgY2QgYmFyLmRpciAgICAgZXRjLi4uCiAgY2QgYmFyLmRpcjsKICBjZCBiYXIuZGlyOzEKICBjZCBbZm9vLmJhcl0KICBjZCBiYXIuYmF6ICAgICBUaGlzIGNhbiBnbyBtb3JlIHRoYW4gMSBsZXZlbCBkZWVwLi4uCiAgY2QgZGlyOiAgICAgICAgKHdoZXJlIGxvZ2ljYWwgbmFtZSBESVIgaXMgZGVmaW5lZCBhcyBbRk9PLkJBUl0pCgogICBBcyB3ZWxsIGFzIHRoZSBmb2xsb3dpbmc6CgogIGNkIC4uICAgICAgICAgIEdvIHVwIG9uZSBsZXZlbCBhcyBpbiBVTklYCiAgY2QgLiAgICAgICAgICAgVGhlIGN1cnJlbnQgZGlyZWN0b3J5CiAgY2QgICAgICAgICAgICAgTXkgbG9naW4gZGlyZWN0b3J5CgogICBOb3RlIHRoYXQgImNkIC0iIChnbyB1cCBvbmUgbGV2ZWwpIGRvZXMgbm90IHdvcmsgYXMgZXhwZWN0ZWQsIGJlY2F1c2UKICAgIi0iIGlzIEtlcm1pdCdzIGNvbW1hbmQgY29udGludWF0aW9uIGNoYXJhY3Rlci4gSG93ZXZlciwgImNkIFstXSIsIGFuZAogICAiCiAgIGNkIHstfSIgaGF2ZSB0aGUgZGVzaXJlZCBlZmZlY3QgKGFuZCBzbyBkb2VzICJjZCAuLiIsIHdoaWNoIGlzIGVhc2llcgogICB0byB0eXBlKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuNS4yLjIuIFRoZSBDRFBBVEgKCiAgIFRoZSBDRCBjb21tYW5kIGluIHRoZSBVTklYLCBXaW5kb3dzLCBPUy8yLCBhbmQgVk1TIHZlcnNpb25zIG9mCiAgIEMtS2VybWl0LCBhcyBvZiB2ZXJzaW9uIDYuMSAvIDEuMS4xMiwgc2VhcmNoZXMgdGhlIENEUEFUSCBmb3IgdGhlCiAgIGdpdmVuIGRpcmVjdG9yeSwgaWYgaXQgaXMgbm90IGFic29sdXRlIGFuZCBpZiBhIENEUEFUSCBlbnZpcm9ubWVudAogICB2YXJpYWJsZSBpcyBkZWZpbmVkLiBFeGFtcGxlIChpbiBVTklYIGtzaCBvciBiYXNoKToKCiAgJCBleHBvcnQgQ0RQQVRIPSRIT01FOiRIT01FL2tlcm1pdDovdG1wCgogICBOb3cgaWYgeW91IGdpdmUgYSAiY2QgeHh4IiBjb21tYW5kLCBubyBtYXR0ZXIgd2hhdCB5b3VyIGN1cnJlbnQKICAgZGlyZWN0b3J5IGlzLCBpZiB0aGUgInh4eCIgZGlyZWN0b3J5IGlzIG5vdCBhIHN1YmRpcmVjdG9yeSBvZiB5b3VyCiAgIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGVuIHRoZSB4eHggc3ViZGlyZWN0b3J5IG9mIHlvdXIgaG9tZSBkaXJlY3RvcnkgaXMKICAgdXNlZCBvciBpZiB0aGF0IGRvZXMgbm90IGV4aXN0LCB0aGVuIHRoZSB4eHggc3ViZGlyZWN0b3J5IG9mIHRoZQogICBrZXJtaXQgc3ViZGlyZWN0b3J5IG9mIHlvdXIgaG9tZSBkaXJlY3RvcnkgaXMgdXNlZCBvciBpZiB0aGF0IGRvZXMgbm90CiAgIGV4aXN0LCB0aGVuIC90bXAveHh4IGlzIHVzZWQuIFRoaXMgaXMgaG93IHRoZSBrc2ggImNkIiBjb21tYW5kIHdvcmtzLAogICBhbmQgbm93IHRoZSBDLUtlcm1pdCBDRCBjb21tYW5kIHdvcmtzIHRoZSBzYW1lIHdheS4KCiAgIEluIFZNUywgeW91IGNhbiBkZWZpbmUgQ0RQQVRIIHRvIGJlIGEgbGlzdCBvZiBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4KICAgYWN0dWFsIGRpcmVjdG9yeSBkZWxpbWl0ZXJzLCBhbmQvb3IgbG9naWNhbCBuYW1lcyByZXByZXNlbnRpbmcKICAgZGlyZWN0b3JpZXMsIHVzaW5nIGNvbW1hcyB0byBzZXBhcmF0ZSB0aGVtLCBlLmcuOgoKICAkIGRlZmluZSBjZHBhdGggW0hPTUVdLFtTT01FT1RIRVJESVJdLFtIT01FLk1JU0NdCiAgJCBkZWZpbmUgY2RwYXRoIFNZUyRMT0dJTjosRElTSzE6W0hPTUVdLERJU0syOltTQ1JBVENILklWQU5dCgogICBFeGFtcGxlOgoKICAkIGRlZmluZSBjZHBhdGggU1lTJExPR0lOOixbSVZBTl0sW09MQUZdLFtPTEdBLk1JU0NdCiAgJCBrZXJtaXQKICBESVNLMTpbT0xHQV0gQy1LZXJtaXQ+IGNkIGJsYWgKCiAgIHRyaWVzIHRoZSBCTEFIIHN1YmRpcmVjdG9yeSBvZiB0aGUgdXNlcidzIGxvZ2luIGRpcmVjdG9yeSwgdGhlbgogICBbT0xHQS5CTEFIXSwgW0lWQU4uQkxBSF0sIFtPTEFGLkJMQUhdLCBhbmQgW09MR0EuTUlTQy5CTEFIXSwgaW4gdGhhdAogICBvcmRlciwgdXNpbmcgdGhlIGZpcnN0IG9uZSBpdCBmaW5kcywgZmFpbGluZyBpZiBpdCBmaW5kcyBub25lLgoKICAgSW4gQy1LZXJtaXQgNy4wLCB5b3UgbWF5IGFsc28gc2V0IHRoZSBDRFBBVEggZnJvbSB0aGUgS2VybWl0IHByb21wdDoKCiAgIFNFVCBDRCBQQVRIIHBhdGgKICAgICAgICAgIEFsbG93cyB0aGUgQ0QgUEFUSCB0byBiZSBzZXQgZnJvbSB3aXRoaW4gQy1LZXJtaXQuCgogICBTSE9XIENEIHNob3dzIHRoZSBDRCBwYXRoIGFuZCBhbGwgb3RoZXIgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIENECiAgIGNvbW1hbmQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjUuMi4zLiBDRCBNZXNzYWdlcwoKICAgV2hlbmV2ZXIgeW91IGNoYW5nZSBkaXJlY3RvcnksIHlvdSBjYW4gaGF2ZSBDLUtlcm1pdCBkaXNwbGF5IGEgIlJlYWQKICAgTWUiIGZpbGUgZnJvbSB0aGUgbmV3IGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LiBUaGUgY29tbWFuZHMgYXJlOgoKICAgU0VUIENEIE1FU1NBR0UgeyBPTiwgT0ZGLCBGSUxFIGxpc3QgfQogICAgICAgICAgT04gZW5hYmxlcyB0aGlzIGZlYXR1cmU7IE9GRiAodGhlIGRlZmF1bHQpIGRpc2FibGVzIGl0LiBGaWxlCiAgICAgICAgICBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSAiUmVhZCBNZSIgZmlsZS4gQSBsaXN0IG9mCiAgICAgICAgICBuYW1lcyB0byBsb29rIGZvciBjYW4gYmUgZ2l2ZW4gaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CgogIHt7bmFtZTF9e25hbWUyfXtuYW1lM317Li4ufX0KCiAgICAgICAgICBlLmcuOgoKICBTRVQgU0VSVkVSIENELU1FU1NBR0UgRklMRSB7ey4vLnJlYWRtZX17UkVBRE1FLlRYVH17UkVBRC5NRX19CgogICAgICAgICAgVGhlIGRlZmF1bHQgbGlzdCBvZiBDRC1tZXNzYWdlIGZpbGVzIGlzIHN5c3RlbSBkZXBlbmRlbnQuCgogICBTSE9XIENEIHNob3dzIHlvdXIgY3VycmVudCBkaXJlY3RvcnksIHByZXZpb3VzIGRpcmVjdG9yeSwgQ0QgcGF0aCwgYW5kCiAgIENEIG1lc3NhZ2UgaW5mby4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuNS4zLiBDcmVhdGluZyBhbmQgUmVtb3ZpbmcgRGlyZWN0b3JpZXMKCiAgIFRoZSBNS0RJUiBjb21tYW5kIG5vdyBhbGxvd3MgeW91IHRvIGNyZWF0ZSBtdWx0aXBsZSBkaXJlY3RvcmllcyBhdAogICBvbmNlOgoKICBDLUtlcm1pdD4gbWtkaXIgYS9iL2MvZAoKICAgY3JlYXRlcyB0aGUgZGlyZWN0b3J5IGEgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IChpZiBpdCBkb2Vzbid0IGV4aXN0CiAgIGFscmVhZHkpLCBhbmQgdGhlbiBjcmVhdGVzIHN1YmRpcmVjdG9yeSBiIGluIHRoZSBhIGRpcmVjdG9yeSAoaWYgaXQKICAgZGlkbid0IGV4aXN0IGFscmVhZHkpLCBhbmQgc28gb24uCgogICBJZiB5b3UgdXNlIE1LRElSIHRvIHRyeSB0byBjcmVhdGUgYSBkaXJlY3RvcnkgdGhhdCBhbHJlYWR5IGV4aXN0cywKICAgQy1LZXJtaXQgd2lsbCBwcmludCBhIHdhcm5pbmcgKCI/RGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzIiksIGJ1dCB0aGUKICAgTUtESVIgY29tbWFuZCB3aWxsIHN0aWxsIHN1Y2NlZWQuIElmIHlvdSB3YW50IHRvIGF2b2lkIHRoZSB3YXJuaW5nCiAgIG1lc3NhZ2UsIHVzZSBJRiBESVJFQ1RPUlkgZmlyc3QgdG8gY2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBhbHJlYWR5CiAgIGV4aXN0cy4KCiAgIFRoZSBSTURJUiBjb21tYW5kLCBob3dldmVyLCB3aWxsIG5vdCByZW1vdmUgbW9yZSB0aGFuIG9uZSBkaXJlY3RvcnksCiAgIG5vciB3aWxsIGl0IHJlbW92ZSBhIGRpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGFueSBmaWxlcy4gKFRoZXJlIGlzLCBhcwogICB5ZXQsIG5vIFJNRElSIC9SRUNVUlNJVkUgY29tbWFuZCwgYWx0aG91Z2ggb25lIG1pZ2h0IGJlIGFkZGVkIGxhdGVyLikKCiAgIEluIFZNUywgdGhlc2UgY29tbWFuZHMgKGxpa2UgQ0QpIGFyZSBtb3JlIGZvcmdpdmluZyBvZiB5b3VyIHN5bnRheAogICB0aGFuIGlzIHRoZSBEQ0wgY29tbWFuZCBzaGVsbDsgIm1rZGlyIG9vZmEiIGlzIGVxdWl2YWxlbnQgdG8gIm1rZGlyCiAgIFsub29mYV0iIGFuZCBzbyBvbi4gQWxzbyBpbiBWTVMsIHlvdSdsbCBmaW5kIHRoYXQgQy1LZXJtaXQncyBSTURJUgogICBjb21tYW5kIGlzIGVhc2llciB0aGFuIGRlbGV0aW5nIGEgZGlyZWN0b3J5IGluIERDTCwgc2luY2UgaXQKICAgYXV0b21hdGljYWxseSBmaXJzdCBnaXZlcyBpdCBvd25lciBkZWxldGUgcGVybWlzc2lvbiBpZiB5b3UgYXJlIHRoZQogICBvd25lci4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuNS40LiBUaGUgREVMRVRFIGFuZCBQVVJHRSBDb21tYW5kcwoKICAgVGhlIERFTEVURSBjb21tYW5kIG5vdyBvZmZlcnMgYSBzZWxlY3Rpb24gb2Ygc3dpdGNoZXMsIGFuZCBoYXMgYSBuZXcKICAgY29tcGFuaW9uLCB0aGUgUFVSR0UgY29tbWFuZC4gRmlyc3QsIERFTEVURToKCiAgIERFTEVURSBbIHN3aXRjaGVzLi4uIF0gZmlsZXNwZWMKICAgICAgICAgIERlbGV0ZXMgdGhlIGZpbGUgb3IgZmlsZXMgdGhhdCBtYXRjaCB0aGUgZmlsZXNwZWMsIHdoaWNoIG1heQogICAgICAgICAgY29udGFpbiB3aWxkY2FyZHMgKFs0NjhdU2VjdGlvbiA0LjkpLgoKICAgT3B0aW9uYWwgc3dpdGNoZXMgaW5jbHVkZSB0aGUgc3RhbmRhcmQgZmlsZS1zZWxlY3Rpb24gc3dpdGNoZXMKICAgcHJlc2VudGVkIGluIFs0NjldU2VjdGlvbiAxLjUuNCwgcGx1czoKCiAgIC9BU0sKICAgICAgICAgIEJlZm9yZSBkZWxldGluZyBlYWNoIGZpbGUsIGFzayBwZXJtaXNzaW9uIGludGVyYWN0aXZlbHkuCiAgICAgICAgICBBbnN3ZXJzIGFyZSBZZXMgb3IgT0sgKGRlbGV0ZSB0aGUgZmlsZSksIE5vIChkb24ndCBkZWxldGUgaXQpLAogICAgICAgICAgb3IgUXVpdCAoc3RvcCBleGVjdXRpbmcgdGhlIERFTEVURSBjb21tYW5kKS4KCiAgIC9OT0FTSwogICAgICAgICAgRG9uJ3QgYXNrIHBlcm1pc3Npb24gdG8gZGVsZXRlIGVhY2ggZmlsZS4KCiAgIC9MSVNUCiAgICAgICAgICBMaXN0IGVhY2ggZmlsZSBhbmQgc2hvdyB3aGV0aGVyIGl0IHdhcyBkZWxldGVkLiBTeW5vbnltczogL0xPRywKICAgICAgICAgIC9WRVJCT1NFLgoKICAgL05PTElTVAogICAgICAgICAgRG9uJ3QgbGlzdCBmaWxlcyB3aGlsZSBkZWxldGluZyB0aGVtLiBTeW5vbnltczogL05PTE9HLCAvUVVJRVQuCgogICAvSEVBRElORwogICAgICAgICAgUHJpbnQgYSBoZWFkaW5nIGFuZCBzdW1tYXJ5IGxpbmUuCgogICAvTk9IRUFESU5HCiAgICAgICAgICBEb24ndCBwcmludCBhIGhlYWRpbmcgYW5kIHN1bW1hcnkgbGluZS4KCiAgIC9QQUdFCiAgICAgICAgICBXaGVuIGxpc3RpbmcsIHBhdXNlIGF0IHRoZSBlbmQgb2YgZWFjaCBzY3JlZW5mdWwgYW5kIGdpdmUgdGhlCiAgICAgICAgICAiTW9yZT8iIHByb21wdC4gSWYgeW91IHJlcGx5ICJuIiAobm8pLCB0aGUgREVMRVRFIGNvbW1hbmQKICAgICAgICAgIHRlcm1pbmF0ZXMuCgogICAvU0lNVUxBVEUKICAgICAgICAgIERvIGV2ZXJ5dGhpbmcgaW1wbGllZCBieSB0aGUgZ2l2ZW4gc3dpdGNoZXMgYW5kIGZpbGVzcGVjLAogICAgICAgICAgZXhjZXB0IGRvIG5vdCBhY3R1YWxseSBkZWxldGUgYW55IGZpbGVzLiBUaGlzIGxldHMgeW91IHByZXZpZXcKICAgICAgICAgIHdoaWNoIGZpbGVzIHdvdWxkIGJlIGRlbGV0ZWQ7IGltcGxpZXMgL0xJU1QuCgogICBOb3cgdGhlIFBVUkdFIGNvbW1hbmQ6CgogICBQVVJHRSBbIHN3aXRjaGVzLi4uIF0gWyBmaWxlc3BlYyBdCiAgICAgICAgICAoVk1TIG9ubHkpIFJ1bnMgdGhlIERDTCBQVVJHRSBjb21tYW5kLiBTd2l0Y2hlcyBhbmQgZmlsZXNwZWMsCiAgICAgICAgICBpZiBhbnksIGFyZSBwYXNzZWQgZGlyZWN0bHkgdG8gRENMIHdpdGhvdXQgcGFyc2luZyBvcgogICAgICAgICAgdmVyaWZpY2F0aW9uLiBEZWxldGVzIGV4Y2VzcyB2ZXJzaW9ucyBvZiB0aGUgZ2l2ZW4gKG9yIGFsbCkKICAgICAgICAgIGZpbGVzLiBUaGUgcmVzdCBvZiB0aGlzIHNlY3Rpb24gZG9lcyBub3QgYXBwbHkgdG8gVk1TLgoKICAgUFVSR0UgWyBzd2l0Y2hlcy4uLiBdIFsgZmlsZXNwZWMgXQogICAgICAgICAgKFVOSVggb25seSkgRGVsZXRlcyAiYmFja3VwIGZpbGVzIiB0aGF0IG1hdGNoIHRoZSBmaWxlc3BlYywKICAgICAgICAgIHdoaWNoIG1heSBjb250YWluIHdpbGRjYXJkcyAoWzQ3MF1TZWN0aW9uIDQuOSkuIElmIG5vIGZpbGVzcGVjCiAgICAgICAgICBpcyBnaXZlbiwgYWxsIGJhY2t1cCBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXJlCiAgICAgICAgICBzZWxlY3RlZCAoc3ViamVjdCB0byBtb2RpZmljYXRpb24gYnkgYW55IHN3aXRjaGVzKS4gRG8gbm90CiAgICAgICAgICBpbmNsdWRlIGJhY2t1cCBub3RhdGlvbiBpbiB0aGUgZmlsZXNwZWMuCgogICBFeHBsYW5hdGlvbjoKCiAgIFRvIGF2b2lkIGRlc3Ryb3lpbmcgcHJlZXhpc3RpbmcgZmlsZXMgd2hlbiBhIG5ldyBmaWxlIGFycml2ZXMgdGhhdCBoYXMKICAgdGhlIHNhbWUgbmFtZSwgQy1LZXJtaXQgYmFja3MgdXAgdGhlIG9sZCBmaWxlIGJ5IGFwcGVuZGluZyBhICJiYWNrdXAKICAgbnVtYmVyIiB0byBpdHMgbmFtZS4gSW4gVU5JWCwgdGhlIGJhY2t1cCBzdWZmaXggY29uc2lzdHMgb2YgYSBwZXJpb2QsCiAgIGEgdGlsZGUsIGEgbnVtYmVyLCBhbmQgYW5vdGhlciB0aWxkZS4gRm9yIGV4YW1wbGUsIGlmIGEgZmlsZSBjYWxsZWQKICAgb29mYS50eHQgZXhpc3RzIGFuZCBhIG5ldyBvb2ZhLnR4dCBmaWxlIGFycml2ZXMsIHRoZSBvcmlnaW5hbCBpcwogICByZW5hbWVkIHRvIG9vZmEudHh0Ln4xfi4gSWYgYW5vdGhlciBvb2ZhLnR4dCBmaWxlIGFycml2ZXMsIHRoZQogICBleGlzdGluZyBvbmUgaXMgcmVuYW1lZCB0byBvb2ZhLnR4dC5+Mn4uIEFuZCBzbyBvbi4gVGhpcyBzeXN0ZW0gaXMKICAgY29tcGF0aWJsZSB3aXRoIHRoZSBvbmUgdXNlZCBieSBFTUFDUy4gVGh1cyBvdmVyIHRpbWUsIGlmIHlvdSByZWNlaXZlCiAgIGEgbG90IG9mIGZpbGVzIHdpdGggQy1LZXJtaXQgb3IgZWRpdCB0aGVtIHdpdGggRU1BQ1MsIGJhY2t1cCBmaWxlcyBjYW4KICAgYnVpbGQgdXAuIFRoZSBuZXcgUFVSR0UgY29tbWFuZCBsZXRzIHlvdSBjbGVhbiBvdXQgYWNjdW11bGF0ZWQgYmFja3VwCiAgIGZpbGVzOgoKICAgT3B0aW9uYWwgc3dpdGNoZXMgaW5jbHVkZSB0aGUgc3RhbmRhcmQgZmlsZS1zZWxlY3Rpb24gc3dpdGNoZXMKICAgcHJlc2VudGVkIGluIFs0NzFdU2VjdGlvbiAxLjUuNCwgcGx1cyBhbGwgdGhlIHN3aXRjaGVzIGxpc3RlZCBhYm92ZQogICBmb3IgdGhlIERFTEVURSBjb21tYW5kLCBwbHVzOgoKICAgL0tFRVA6bgogICAgICAgICAgUmV0YWlucyB0aGUgbiBtb3N0IHJlY2VudCAoaGlnaGVzdC1udW1iZXJlZCkgYmFja3VwIGZpbGVzIGZvcgogICAgICAgICAgZWFjaCBmaWxlLiBGb3IgZXhhbXBsZSwgaWYgb29mYS50eHQsIG9vZmEudHh0Ln4xfiwKICAgICAgICAgIG9vZmEudHh0Ln4yfiwgb29mYS50eHQufjEwfiwgb29mYS50eHQufjEyfiwgYW5kIG9vZmEudHh0Ln4xMDB+CiAgICAgICAgICBleGlzdCwgInB1cmdlIC9rZWVwOjIgb29mYS50eHQiIGRlbGV0ZXMgb29mYS50eHQufjF+LAogICAgICAgICAgb29mYS50eHQufjJ+LCBhbmQgb29mYS50eHQufjEwfiwgYW5kIGtlZXBzIG9vZmEudHh0LAogICAgICAgICAgb29mYS50eHQufjEyfiwgYW5kIG9vZmEudHh0Ln4xMDB+LiBJZiAvS0VFUCBpcyBnaXZlbiB3aXRob3V0IGEKICAgICAgICAgIG51bWJlciwgb25lICh0aGUgaGlnaGVzdCBudW1iZXJlZCkgYmFja3VwIGZpbGUgaXMga2VwdC4KCiAgIENBVVRJT046IFRoZSBQVVJHRSBjb21tYW5kIHNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiAqLn4qfiBmaWxlcyB0cnVseQogICBhcmUgYmFja3VwIGZpbGVzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBFTUFDUywgYW5kIGl0IGlzIHRoZSBERUZBVUxUCiAgIGZvciBDLUtlcm1pdC4gSG93ZXZlciwgaWYgQy1LZXJtaXQncyBGSUxFIENPTExJU0lPTiBoYXMgYmVlbiBzZXQgdG8KICAgUkVOQU1FLCBuZXdseSByZWNlaXZlZCBmaWxlcyB3aWxsIGxvb2sgbGlrZSBiYWNrdXAgZmlsZXMuIEluIHRoYXQKICAgY2FzZSwgZG9uJ3QgdXNlIHRoZSBQVVJHRSBjb21tYW5kIG9yIHlvdSdsbCBiZSByZW1vdmluZyBuZXcgZmlsZXMKICAgcmF0aGVyIHRoYW4gb2xkIG9uZXMuIChVc2UgU0hPVyBGSUxFIHRvIGZpbmQgdGhlIEZJTEUgQ09MTElTSU9OCiAgIHNldHRpbmcuKQoKICAgVGhlIFBVUkdFIGNvbW1hbmQgaXMgcHJlc2VudGx5IGF2YWlsYWJsZSBvbmx5IGluIFVOSVguIFRoZSBjb21tYW5kCiAgIHN1Y2NlZWRzIGlmIGl0IGRlbGV0ZWQgYW55IGZpbGVzLCBvciBpZiBpdCBkZWxldGVkIG5vIGZpbGVzIGJ1dCB0aGVyZQogICB3ZXJlIG5vIGVycm9ycy4gSXQgZmFpbHMgaWYgaXQgZGVsZXRlZCBubyBmaWxlcyBhbmQgdGhlcmUgd2VyZSBlcnJvcnMKICAgKGkuZS4gZGVsZXRpb24gd2FzIGF0dGVtcHRlZCBidXQgZmFpbGVkKS4gSW4gVk1TLCBiYWNrdXAgZmlsZSB2ZXJzaW9ucwogICBhcmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBPUywgYW5kIGEgUFVSR0UgY29tbWFuZCBjYW4gYmUgdXNlZAogICBhdCB0aGUgVk1TIHByb21wdCB0byBjbGVhbiB0aGVtIHVwLgoKICAgSWYgeW91IHdhbnQgY2VydGFpbiBzd2l0Y2hlcyB0byBiZSBzdXBwbGllZCBhdXRvbWF0aWNhbGx5IHdpdGggZWFjaAogICBERUxFVEUgb3IgUFVSR0UgY29tbWFuZCwgeW91IGNhbiBzZXQgdGhlbSB3aXRoIFNFVCBPUFRJT05TCiAgIChbNDcyXVNlY3Rpb24gMS41LjUpIGFuZCB5b3UgY2FuIGRpc3BsYXkgYW55IHN1Y2ggc2V0dGluZ3Mgd2l0aCBTSE9XCiAgIE9QVElPTlMuIE9mIGNvdXJzZSB5b3UgY2FuIG92ZXJyaWRlIHRoZW0gb24gYSBwZXItY29tbWFuZCBiYXNpcyBieQogICBpbmNsdWRpbmcgc3dpdGNoZXMgaW4geW91ciBQVVJHRSBvciBERUxFVEUgY29tbWFuZC4KCiAgIEFsc28gc2VlIFNFVCBGSUxFIENPTExJU0lPTiwgU0hPVyBGSUxFLCBTRU5EIC9OT0JBQ0tVUCwgU0VUIFNFTkQKICAgQkFDS1VQLCBhbmQgRElSRUNUT1JZIC9bTk9dQkFDS1VQLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuNi4gU3RhcnRpbmcgdGhlIFJlbW90ZSBLZXJtaXQgU2VydmVyIEF1dG9tYXRpY2FsbHkKCiAgIEFzIG5vdGVkIG9uIHBhZ2VzIDI3NS0yNzYgb2YgWzQ3M11Vc2luZyBDLUtlcm1pdCAybmQgZWRpdGlvbiwgeW91IGNhbgogICBoYXZlIEtlcm1pdCBzZW5kICJrZXJtaXQgcmVjZWl2ZSIgY29tbWFuZHMgYXV0b21hdGljYWxseSB3aGVuIGl0IGlzIGluCiAgIGxvY2FsIG1vZGUgYW5kIHlvdSBnaXZlIGEgU0VORCBvciBzaW1pbGFyIGNvbW1hbmQsIHRvIHN0YXJ0IHRoZSByZW1vdGUKICAgS2VybWl0IHJlY2VpdmVyIGluIGNhc2UgaXQgaXMgbm90IGFscmVhZHkgc3RhcnRlZC4gVGhlICJrZXJtaXQKICAgcmVjZWl2ZSIgY29tbWFuZHMgYXJlIHNwZWNpZmllZCBieToKCiAgU0VUIFBST1RPQ09MIEtFUk1JVCBiaW5hcnktcmVjZWl2ZS1jb21tYW5kIHRleHQtcmVjZWl2ZS1jb21tYW5kCgogICBBcyBvZiB2ZXJzaW9uIDcuMCwgYSBLZXJtaXQgcHJvdG9jb2wgb3B0aW9uIGhhcyBiZWVuIGFkZGVkIHRvIHNlbmQgYQogICBzdHJpbmcgdG8gdGhlIGhvc3QgaW4gYWR2YW5jZSBvZiBhbnkgS2VybWl0IHBhY2tldHMgd2hlbiB5b3UgZ2l2ZSBhCiAgIEdFVC1jbGFzcyBvciBSRU1PVEUgY29tbWFuZC4gVGhpcyB3aWxsIHN3aXRjaCB0aGUgcmVtb3RlIEMtS2VybWl0IGludG8KICAgdGhlIGFwcHJvcHJpYXRlIG1vZGUgb3IsIGlmIHRoZSByZW1vdGUgc3lzdGVtIGlzIGF0IGEgc3lzdGVtIGNvbW1hbmQKICAgKHNoZWxsKSBwcm9tcHQsIGV4ZWN1dGUgdGhlIHN0cmluZyBvbiB0aGUgcmVtb3RlIHN5c3RlbS4gVGhlIG5ldwogICBzeW50YXggb2YgdGhlIFNFVCBQUk9UT0NPTCBLRVJNSVQgY29tbWFuZCBpczoKCiAgU0VUIFBST1RPQ09MIEtFUk1JVCBbIHMxIFsgczIgWyBzMyBdIF0gXQoKICAgd2hlcmU6CgogICAgICAgRGVmYXVsdCAgICAgICAgIE1lYW5pbmcKICBzMSAge2tlcm1pdCAtaXJ9ICAgICBSZW1vdGUgImtlcm1pdCByZWNlaXZlIGluIGJpbmFyeSBtb2RlIiBjb21tYW5kLgogIHMyICB7a2VybWl0IC1yfSAgICAgIFJlbW90ZSAia2VybWl0IHJlY2VpdmUgaW4gdGV4dCBtb2RlIiBjb21tYW5kLgogIHMzICB7a2VybWl0IC14fSAgICAgIFJlbW90ZSAic3RhcnQga2VybWl0IHNlcnZlciIgY29tbWFuZC4KCiAgIE5PVEU6IElmIHRoZSByZW1vdGUgS2VybWl0IGlzIDYuMCwgdGhlIGZvbGxvd2luZyBhcmUgcmVjb21tZW5kZWQgZm9yCiAgIGZhc3Qgc3RhcnR1cCBhbmQgaGlnaC1wZXJmb3JtYW5jZSBmaWxlIHRyYW5zZmVyIChzZWUgQXBwZW5kaXggSSBpbgogICBbNDc0XVVzaW5nIEMtS2VybWl0LCBzZWNvbmQgRWRpdGlvbiwgZm9yIGNvbW1hbmQtbGluZSBvcHRpb25zKToKCiAgczEgICBrZXJtaXQgLVlRaXIgICAoS2VybWl0IHJlY2VpdmUgYmluYXJ5LCBza2lwIGluaXQgZmlsZSwgZmFzdC4pCiAgczIgICBrZXJtaXQgLVlRVHIgICAoS2VybWl0IHJlY2VpdmUgdGV4dCwgc2tpcCBpbml0IGZpbGUsIGZhc3QuKQogIHMzICAga2VybWl0IC1ZUXggICAgKEtlcm1pdCBzZXJ2ZXIsIHNraXAgaW5pdCBmaWxlLCBmYXN0LikKCiAgIElmIHRoZSByZW1vdGUgaXMgQy1LZXJtaXQgNy4wIG9yIGxhdGVyLCBjaGFuZ2UgdGhlIC14IG9wdGlvbiAoZW50ZXIKICAgc2VydmVyIG1vZGUpIHRvIC1PICh1cHBlcmNhc2UgbGV0dGVyIE8pLCB3aGljaCBtZWFucyAiZW50ZXIgc2VydmVyCiAgIG1vZGUgZm9yIE9uZSB0cmFuc2FjdGlvbiBvbmx5KTsgdGhpcyB3YXksIGl0IGlzIG5vdCBzdHVjayBpbiBzZXJ2ZXIKICAgYWZ0ZXIgdGhlIHRyYW5zZmVyLiBBbHNvIG5vdGUgdGhhdCB0aGUgUSBpcyByZWR1bmRhbnQgaW4gdmVyc2lvbiA3LjAsCiAgIHNpbmNlIGZhc3QgS2VybWl0IHByb3RvY29sIHNldHRpbmdzIGFyZSBub3cgdGhlIGRlZmF1bHQuCgogICBOb3RlIHRoYXQgaW4gY2FzZSB0aGUgQy1LZXJtaXQgZXhlY3V0YWJsZSBpcyBjYWxsZWQgIndlcm1pdCIgb3IKICAgImNrZXJtaXQiIHlvdSBjYW4gY2hhbmdlICJrZXJtaXQiIGluIHRoZSBzdHJpbmdzIGFib3ZlIHRvICJ3ZXJtaXQiIG9yCiAgICJja2VybWl0IiBhbmQgQy1LZXJtaXQgNy4wIG9yIGxhdGVyIHdpbGwgcmVjb2duaXplIHRoZXNlIGFzIHN5bm9ueW1zCiAgIGZvciAia2VybWl0IiwgaW4gY2FzZSBpdCBpcyBhdCBpdHMgY29tbWFuZCBwcm9tcHQgd2hlbiBvbmUgb2YgdGhlc2UKICAgc3RyaW5ncyBpcyBzZW50IHRvIGl0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuNy4gRmlsZS1UcmFuc2ZlciBDb21tYW5kIFN3aXRjaGVzCgogICBPdmVyIHRoZSB5ZWFycywgdmFyaW91cyBuZXcgbWV0aG9kcyBvZiB0cmFuc2ZlcnJpbmcgYSBmaWxlIGhhdmUKICAgYWNjdW11bGF0ZWQsIHVudGlsIHdlIGhhZCwgaW4gYWRkaXRpb24gdG8gdGhlIFNFTkQgY29tbWFuZCwgYWxzbyBNT1ZFCiAgIChzZW5kIGFuZCB0aGVuIGRlbGV0ZSksIE1BSUwgKHNlbmQgYXMgZW1haWwpLCBSRU1PVEUgUFJJTlQgKHNlbmQgdG8gYmUKICAgcHJpbnRlZCksIENTRU5EIChzZW5kIHRoZSBvdXRwdXQgb2YgYSBjb21tYW5kKSwgUFNFTkQgKHNlbmQgYSBwYXJ0IG9mCiAgIGEgZmlsZSksIEJTRU5EIChzZW5kIGluIGJpbmFyeSBtb2RlKSwgUkVTRU5EIChyZXN1bWUgYW4gaW50ZXJydXB0ZWQKICAgU0VORCksIGV0YyBldGMuIFNpbWlsYXJseTogR0VULCBSRUdFVCwgQ0dFVCwgUkVUUklFVkUsIGFuZCBzbyBvbi4KCiAgIE5vdCBvbmx5IGlzIGl0IGNvbmZ1c2luZyB0byBoYXZlIGRpZmZlcmVudCBuYW1lcyBmb3IgdGhlc2UgY29tbWFuZHMsCiAgIG1hbnkgb2Ygd2hpY2ggYXJlIG5vdCByZWFsIHdvcmRzLCBidXQgdGhpcyBhbHNvIGRvZXMgbm90IGFsbG93IGFsbAogICBjb21iaW5hdGlvbnMsIGxpa2UgInNlbmQgYSBmaWxlIGFzIG1haWwsIHRoZW4gZGVsZXRlIGl0Ii4KCiAgIEluIEMtS2VybWl0IDcuMCwgdGhlIFNFTkQsIEdFVCwgYW5kIFJFQ0VJVkUgY29tbWFuZHMgd2VyZSByZXN0cnVjdHVyZWQKICAgdG8gYWNjZXB0IG1vZGlmaWVyIHN3aXRjaGVzIChzd2l0Y2hlcyBhcmUgZXhwbGFpbmVkIGluIFs0NzVdU2VjdGlvbgogICAxLjUpLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC43LjEuIFNFTkQgQ29tbWFuZCBTd2l0Y2hlcwoKICAgV2l0aG91dCBzd2l0Y2hlcywgdGhlIFNFTkQgY29tbWFuZCBzdGlsbCB3b3JrcyBleGFjdGx5IGFzIGJlZm9yZToKCiAgc2VuZCBvb2ZhLnR4dCAgICAgIDsgc2VuZCBhIHNpbmdsZSBmaWxlCiAgc2VuZCBvb2ZhLiogICAgICAgIDsgc2VuZCBtdWx0aXBsZSBmaWxlcwogIHNlbmQgb29mYS50eHQgeC54ICA7IHNlbmQgb29mYS50eHQgYXMgeC54ICh0ZWxsIHJlY2VpdmVyIGl0cyBuYW1lIGlzIHgueCkKICBzZW5kICAgICAgICAgICAgICAgOyBzZW5kIGZyb20gU0VORC1MSVNUCgogICBCdXQgbm93IHRoZSBmb2xsb3dpbmcgbW9kaWZpZXIgc3dpdGNoZXMgbWF5IGJlIGluY2x1ZGVkIGJldHdlZW4gInNlbmQiCiAgIGFuZCB0aGUgZmlsZW5hbWUuIFplcm8sIG9uZSwgdHdvLCBvciBtb3JlIHN3aXRjaGVzIG1heSBiZSBpbmNsdWRlZCBpbgogICBhbnkgY29tYmluYXRpb24gdGhhdCBtYWtlcyBzZW5zZS4gU3dpdGNoIG5hbWVzIChzdWNoIGFzIC9CSU5BUlkpIGNhbgogICBiZSBhYmJyZXZpYXRlZCwganVzdCBsaWtlIGFueSBvdGhlciBrZXl3b3Jkcy4gTW9zdCBvZiB0aGVzZSBzd2l0Y2hlcwogICB3b3JrIG9ubHkgd2hlbiB1c2luZyBLZXJtaXQgcHJvdG9jb2wgKC9URVhUIGFuZCAvQklOQVJZIGFyZSB0aGUKICAgZXhjZXB0aW9ucykuCgogICAvQUZURVI6ZGF0ZS10aW1lCiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIChvciwgaW4gVk1TLCBjcmVhdGVkKQogICAgICAgICAgYWZ0ZXIgdGhlIGdpdmVuIGRhdGUtdGltZSAoc2VlIFs0NzZdU2VjdGlvbiAxLjYpIGFyZSB0byBiZQogICAgICAgICAgc2VudC4gRXhhbXBsZXM6CgogIHNlbmQgL3RleHQgL2FmdGVyOnsyLUZlYi0xOTk3IDEwOjI4OjMwfSAqLnR4dAogIHNlbmQgL3RleHQgL2FmdGVyOlxmZGF0ZShvb2ZhLnR4dCkgKi50eHQKCiAgICAgICAgICBTeW5vbnltOiAvU0lOQ0UuCgogICAvQVJSQVk6YXJyYXluYW1lCiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBpbnN0ZWFkIG9mIHNlbmRpbmcgYSBmaWxlLCBDLUtlcm1pdCBpcyB0byBzZW5kCiAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIGdpdmVuIGFycmF5LiBTaW5jZSBhbiBhcnJheSBkb2VzIG5vdCBoYXZlIGEKICAgICAgICAgIGZpbGVuYW1lLCB5b3Ugc2hvdWxkIGluY2x1ZGUgYW4gL0FTLU5BTUUgc3dpdGNoIHRvIHNwZWNpZnkgdGhlCiAgICAgICAgICBuYW1lIHVuZGVyIHdoaWNoIHRoZSBhcnJheSBpcyB0byBiZSBzZW50IChpZiB5b3UgZG8gbm90LCB0aGUKICAgICAgICAgIG5hbWUgIl9hcnJheV94XyIgaXMgdXNlZCwgd2hlcmUgJ3gnIGlzIHJlcGxhY2VkIGJ5IHRoZSBhcnJheQogICAgICAgICAgZGVzaWduYXRvcikuIFNlZSBbNDc3XXNlY3Rpb24gNy4xMCBmb3IgYXJyYXktbmFtZSBzeW50YXguIEFzCiAgICAgICAgICBub3RlZCBpbiB0aGF0IHNlY3Rpb24sIHlvdSBjYW4gYWxzbyBpbmNsdWRlIGEgcmFuZ2UgdG8gaGF2ZSBhCiAgICAgICAgICBzZWdtZW50IG9mIHRoZSBhcnJheSBzZW50LCByYXRoZXIgdGhhbiB0aGUgd2hvbGUgdGhpbmc7IGZvcgogICAgICAgICAgZXhhbXBsZTogInNlbmQgL2FycmF5OiZhWzEwMDoxOTldIi4gSXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQKICAgICAgICAgIHRoYXQgeW91IGFjY29tcGFueSB0aGUgL0FSUkFZIHN3aXRjaCB3aXRoIGEgL1RFWFQgb3IgL0JJTkFSWQogICAgICAgICAgc3dpdGNoIHRvIGZvcmNlIHRoZSBkZXNpcmVkIHRyYW5zZmVyIG1vZGUsIHNpbmNlIG90aGVyd2lzZSB0aGUKICAgICAgICAgIHZhcmlvdXMgYXV0b21hdGljIG1lY2hhbmlzbXMgbWlnaHQgc3dpdGNoIHRvIGJpbmFyeSBtb2RlIHdoZW4KICAgICAgICAgIHlvdSByZWFsbHkgd2FudGVkIHRleHQsIG9yIHZpY2UgdmVyc2EuIEluIHRleHQgbW9kZSBhIGxpbmUKICAgICAgICAgIHRlcm1pbmF0b3IgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiBlYWNoIGFycmF5IGVsZW1lbnQsIGJ1dCBub3QKICAgICAgICAgIGluIGJpbmFyeSBtb2RlLiBGb3IgZGV0YWlscyBhbmQgZXhhbXBsZXMgc2VlIFs0NzhdU2VjdGlvbgogICAgICAgICAgNy4xMC4xMS4KCiAgIC9BUy1OQU1FOnRleHQKICAgICAgICAgIFNwZWNpZmllcyAidGV4dCIgYXMgdGhlIG5hbWUgdG8gc2VuZCB0aGUgZmlsZSB1bmRlci4gWW91IGNhbgogICAgICAgICAgYWxzbyBzdGlsbCBzcGVjaWZ5IHRoZSBhcy1uYW1lIGFzIHRoZSBzZWNvbmQgZmlsZW5hbWUgb24gdGhlCiAgICAgICAgICBTRU5EIGNvbW1hbmQgbGluZS4gVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgYXJlIGVxdWl2YWxlbnQ6CgogIHNlbmQgb29mYS50eHQgb29mYS5uZXcKICBzZW5kIC9hczpvb2ZhLm5ldyBvb2ZhLnR4dAoKICAgL0JFRk9SRTpkYXRlLXRpbWUKICAgICAgICAgIFNwZWNpZmllcyB0aGF0IG9ubHkgdGhvc2UgZmlsZXMgbW9kaWZpZWQgKG9yLCBpbiBWTVMsIGNyZWF0ZWQpCiAgICAgICAgICBiZWZvcmUgdGhlIGdpdmVuIGRhdGUtdGltZSAoWzQ3OV1TZWN0aW9uIDEuNikgYXJlIHRvIGJlIHNlbnQuCgogICAvQklOQVJZCiAgICAgICAgICBQZXJmb3JtcyB0aGlzIHRyYW5zZmVyIGluIGJpbmFyeSBtb2RlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZQogICAgICAgICAgZ2xvYmFsIHRyYW5zZmVyIG1vZGUsIG92ZXJyaWRpbmcgbm90IG9ubHkgdGhlIEZJTEUgVFlQRSBhbmQKICAgICAgICAgIFRSQU5TRkVSIE1PREUgc2V0dGluZ3MsIGJ1dCBhbHNvIHRoZSBGSUxFIFBBVFRFUk4gc2V0dGluZywgYnV0CiAgICAgICAgICBmb3IgdGhpcyBTRU5EIGNvbW1hbmQgb25seS4gSW4gb3RoZXIgd29yZHMsIFNFTkQgL0JJTkFSWSBtZWFucwogICAgICAgICAgd2hhdCBpdCBzYXlzOiBzZW5kIHRoZSBmaWxlIGluIGJpbmFyeSBtb2RlLCByZWdhcmRsZXNzIG9mIGFueQogICAgICAgICAgb3RoZXIgc2V0dGluZ3MuIEV4YW1wbGU6CgogIHNldCBmaWxlIHR5cGUgdGV4dCAgICAgIDsgU2V0IGdsb2JhbCB0cmFuc2ZlciBtb2RlIHRvIHRleHQKICBzZW5kIC9iaW5hcnkgb29mYS56aXAgICA7IFNlbmQgYSBmaWxlIGluIGJpbmFyeQogIHNlbmQgb29mYS50eHQgICAgICAgICAgIDsgVGhpcyBvbmUgaXMgc2VudCBpbiB0ZXh0IG1vZGUKCiAgIC9DT01NQU5ECiAgICAgICAgICBTRU5EIC9DT01NQU5EIGlzIGVxdWl2YWxlbnQgdG8gQ1NFTkQgKFs0ODBdU2VjdGlvbiA0LjIuMikgLS0gaXQKICAgICAgICAgIHNheXMgdG8gc2VuZCB0aGUgb3V0cHV0IGZyb20gYSBjb21tYW5kLCByYXRoZXIgdGhhbiB0aGUKICAgICAgICAgIGNvbnRlbnRzIG9mIGEgZmlsZS4gVGhlIGZpcnN0ICJmaWxlbmFtZSIgb24gdGhlIFNFTkQgY29tbWFuZAogICAgICAgICAgbGluZSBpcyBpbnRlcnByZXRlZCBhcyB0aGUgbmFtZSBvZiBhIGNvbW1hbmQ7IHRoZSBzZWNvbmQgKGlmCiAgICAgICAgICBhbnkpIGlzIHRoZSBhcy1uYW1lLiBFeGFtcGxlczoKCiAgc2VuZCAvY29tbWFuZCB7Z3JlcCBTdW5kYXkgb29mYS50eHR9IHN1bmRheS50eHQKICBzZW5kIC9hcy1uYW1lOnN1bmRheS50eHQgL2NvbW1hbmQge2dyZXAgU3VuZGF5IG9vZmEudHh0fQogIHNlbmQgL2JpbiAvY29tbWFuZCB7dGFyIGNmIC0gLiB8IGd6aXAgLWN9IHshZ3VuemlwIC1jIHwgdGFyIHhmIC19CgogICAvREVMRVRFCiAgICAgICAgICBEZWxldGVzIHRoZSBmaWxlIChvciBlYWNoIGZpbGUgaW4gdGhlIGdyb3VwKSBhZnRlciBpdCBoYXMgYmVlbgogICAgICAgICAgc2VudCBzdWNjZXNzZnVsbHkgKGJ1dCBkb2VzIG5vdCBkZWxldGUgaXQgaWYgaXQgd2FzIG5vdCBzZW50CiAgICAgICAgICBzdWNjZXNzZnVsbHkpLiBTRU5EIC9ERUxFVEUgaXMgZXF1aXZhbGVudCB0byBNT1ZFLiBIYXMgbm8KICAgICAgICAgIGVmZmVjdCB3aGVuIHVzZWQgd2l0aCAvQ09NTUFORC4gRXhhbXBsZToKCiAgc2VuZCAvZGVsZXRlICoubG9nCgogICAvRE9URklMRVMKICAgICAgICAgIChVTklYIGFuZCBPUy05IG9ubHkpIE5vcm1hbGx5IGZpbGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGggIi4iCiAgICAgICAgICBhcmUgc2tpcHBlZCB3aGVuIG1hdGNoaW5nIHdpbGRjYXJkcyB0aGF0IGRvIG5vdCBhbHNvIGJlZ2luZwogICAgICAgICAgd2l0aCAiLiIuIEluY2x1ZGUgL0RPVEZJTEVTIHRvIGZvcmNlIHRoZXNlIGZpbGVzIHRvIGJlIGluY2x1ZGVkCiAgICAgICAgICB0b28uCgogICAvUkVDVVJTSVZFCiAgICAgICAgICBEZXNjZW5kIHRoZSB0aHJvdWdoIHRoZSBkaXJlY3RvcnkgdHJlZSB3aGVuIGxvY2F0aW5nIGZpbGVzIHRvCiAgICAgICAgICBzZW5kLiBBdXRvbWF0aWNhbGx5IHNldHMgL1BBVEhOQU1FUzpSRUxBVElWRS4gRXhwbGFpbmVkIGluCiAgICAgICAgICBbNDgxXVNlY3Rpb24gNC4xMSAuCgogICAvRVhDRVBUOnBhdHRlcm4KICAgICAgICAgIFNlZSBbNDgyXVNlY3Rpb24gMS41LjQuCgogICAvTk9CQUNLVVAKICAgICAgICAgIFRoaXMgbWVhbnMgdG8gc2tpcCBiYWNrdXAgZmlsZXMgd2hlbiBzZW5kaW5nLCBldmVuIGlmIHRoZXkKICAgICAgICAgIG1hdGNoIHRoZSBTRU5EIGZpbGUgc3BlY2lmaWNhdGlvbi4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHVzaW5nCiAgICAgICAgICBTRU5EIC9FWENFUFQgYW5kIGluY2x1ZGluZyAqLn5bMC05XSp+IGluIHRoZSBleGNlcHRpb24gbGlzdCAob3IKICAgICAgICAgICoufip+IGlmIEtlcm1pdCB3YXMgYnVpbHQgd2l0aG91dCBwYXR0ZXJuLW1hdGNoaW5nIHN1cHBvcnQ7IHNlZQogICAgICAgICAgWzQ4M11TZWN0aW9uIDQuOS4xKS4gSW5jbHVkaW5nIHRoaXMgc3dpdGNoIGlzIGVxdWl2YWxlbnQgdG8KICAgICAgICAgIGdpdmluZyBTRVQgU0VORCBCQUNLVVAgT0ZGIChbNDg0XVNlY3Rpb24gNC4wLjYpIHByaW9yIHRvIFNFTkQsCiAgICAgICAgICBleGNlcHQgaXRzIGVmZmVjdCBpcyBsb2NhbCB0byB0aGUgU0VORCBjb21tYW5kIHdpdGggd2hpY2ggaXQKICAgICAgICAgIHdhcyBnaXZlbi4KCiAgIC9OT0RPVEZJTEVTCiAgICAgICAgICBUaGUgb3Bwb3NpdGUgb2YgL0RPVEZJTEVTIChxLnYuKQoKICAgL0ZJTEVOQU1FUzp7Q09OVkVSVEVELExJVEVSQUx9CiAgICAgICAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgZ2xvYmFsIFNFVCBGSUxFIE5BTUVTCiAgICAgICAgICBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuCgogICAvRklMVEVSOmNvbW1hbmQKICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIGEgZmlsdGVyIHRvIHBhc3MgdGhlIGZpbGUgdGhyb3VnaCBiZWZvcmUgc2VuZGluZwogICAgICAgICAgaXQuIFNlZSB0aGUgWzQ4NV1zZWN0aW9uIG9uIGZpbGUtdHJhbnNmZXIgcGlwZXMgYW5kIGZpbHRlcnMuCiAgICAgICAgICBUaGUgL0ZJTFRFUiBzd2l0Y2ggYXBwbGllcyBvbmx5IHRvIHRoZSBmaWxlLXRyYW5zZmVyIGNvbW1hbmQgaXQKICAgICAgICAgIGlzIGdpdmVuIHdpdGg7IGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgZ2xvYmFsIFNFTkQgRklMVEVSCiAgICAgICAgICBzZXR0aW5nLCBpZiBhbnkuCgogICAvSU1BR0UKICAgICAgICAgIFZNUzogU2VuZHMgaW4gaW1hZ2UgbW9kZS4gTm9uLVZNUzogc2FtZSBhcyAvQklOQVJZLgoKICAgL0xBQkVMRUQKICAgICAgICAgIFZNUyBhbmQgT1MvMiBvbmx5OiBTZW5kcyBpbiBsYWJlbGVkIG1vZGUuCgogICAvTEFSR0VSLVRIQU46bnVtYmVyCiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIHRoYXQgYXJlIGxvbmdlciB0aGFuIHRoZSBnaXZlbgogICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGFyZSB0byBiZSBzZW50LgoKICAgL0xJU1RGSUxFOmZpbGVuYW1lCiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCB0aGUgZmlsZXMgdG8gYmUgc2VudCBhcmUgbGlzdGVkIGluIGEgZmlsZSB3aXRoCiAgICAgICAgICB0aGUgZ2l2ZW4gZmlsZW5hbWUuIFRoZSBmaWxlIGNvbnRhaW5zIG9uZSBmaWxlbmFtZSBwZXIgbGluZS4KICAgICAgICAgIFRoZXNlIGZpbGVuYW1lcyBhcmUgbm90IGNoZWNrZWQgaW4gYW55IHdheTsgZWFjaCBmaWxlbmFtZSBpcwogICAgICAgICAgdGFrZW4gYW5kIGRvZXMgbm90IHVzZSBvciBkZXBlbmQgb24gYW55IEtlcm1pdC1zcGVjaWZpYyBzeW50YXguCiAgICAgICAgICBJbiBwYXJ0aWN1bGFyLCBiYWNrc2xhc2hlcyBhcmUgbm90IHRyZWF0ZWQgc3BlY2lhbGx5LCBsZWFkaW5nCiAgICAgICAgICBhbmQgdHJhaWxpbmcgc3BhY2VzIGFyZSBub3Qgc3RyaXBwZWQsIGV0Yy4gSG93ZXZlciwgaWYgYQogICAgICAgICAgZmlsZW5hbWUgY29udGFpbnMgd2lsZGNhcmRzLCB0aGV5IGFyZSBleHBhbmRlZC4gRXhhbXBsZTogSWYgYQogICAgICAgICAgZmlsZSBuYW1lZCBmaWxlcy50eHQgY29udGFpbnMgdGhlIGZvbGxvd2luZyBsaW5lczoKCiAgYmxhaC50eHQKICBvb2ZhKgogIHgueAoKICAgICAgICAgIChidXQgd2l0aG91dCBsZWFkaW5nIG9yIHRyYWlsaW5nIHNwYWNlcyksIHRoZW4gdGhlIEMtS2VybWl0CiAgICAgICAgICBjb21tYW5kICJzZW5kIC9saXN0ZmlsZTpmaWxlcy50eHQiIHdpbGwgc2VuZCB0aGUgZmlsZXMKICAgICAgICAgIGJsYWgudHh0LCB4LngsIGFuZCBhbGwgZmlsZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCAib29mYSIsCiAgICAgICAgICBhc3N1bWluZyB0aGUgZmlsZXMgZXhpc3QgYW5kIGFyZSByZWFkYWJsZS4gVGhlIC9MSVNURklMRQogICAgICAgICAgc3dpdGNoLCBjYW4sIG9mIGNvdXJzZSwgYmUgdXNlZCB3aXRoIG90aGVyIHN3aXRjaGVzIHdoZW4gaXQKICAgICAgICAgIG1ha2VzIHNlbnNlLCBmb3IgZXhhbXBsZSwgL0VYQ0VQVCwgL0JJTkFSWSwgL0FGVEVSLCAvU01BTExFUiwKICAgICAgICAgIC9NT1ZFLVRPLCAvREVMRVRFLCAvQVMtTkFNRSB3aXRoIGEgdGVtcGxhdGUsIGV0Yy4KCiAgIC9NQUlMOmFkZHJlc3MKICAgICAgICAgIFNlbmRzIHRoZSBmaWxlIGFzIGUtbWFpbCB0byB0aGUgZ2l2ZW4gYWRkcmVzcyBvciBhZGRyZXNzZXMuCiAgICAgICAgICAic2VuZCAvbWFpbDphZGRyZXNzIGZpbGVuYW1lIiBpcyBlcXVpdmFsZW50IHRvICJtYWlsIGZpbGVuYW1lCiAgICAgICAgICBhZGRyZXNzIi4gWW91IGNhbiBpbmNsdWRlIG11bHRpcGxlIGFkZHJlc3NlcyBzZXBhcmF0ZWQgYnkKICAgICAgICAgIGNvbW1hcy4gRXhhbXBsZXM6CgogIHNlbmQgL21haWw6a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1IHBhY2tldC5sb2cKICBzZW5kIC9tYWlsOmNtZyxmZGMsanJkIG9vZmEudHh0CgogICAgICAgICAgQXMgd2l0aCBhbnkgc3dpdGNoIGFyZ3VtZW50LCBpZiB0aGUgYWRkcmVzcyBvciBhZGRyZXNzIGxpc3QKICAgICAgICAgIGNvbnRhaW5zIGFueSBzcGFjZXMsIHlvdSBtdXN0IGVuY2xvc2UgaXQgaW4gYnJhY2VzLiBUaGUgZm9ybWF0CiAgICAgICAgICBvZiB0aGUgYWRkcmVzc2VzIG11c3QgYWdyZWUgd2l0aCB0aGF0IHVuZGVyc3Rvb2QgYnkgdGhlCiAgICAgICAgICBtYWlsLXNlbmRpbmcgcHJvZ3JhbSBvbiB0aGUgcmVjZWl2ZXIncyBjb21wdXRlci4KCiAgIC9NT1ZFLVRPOmRpcmVjdG9yeS1uYW1lCiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhZnRlciBlYWNoIChvciB0aGUgb25seSkgc291cmNlIGZpbGUgaXMgc2VudAogICAgICAgICAgc3VjY2Vzc2Z1bGx5LCBhbmQgT05MWSBpZiBpdCBpcyBzZW50IHN1Y2Nlc3NmdWxseSwgaXQgc2hvdWxkIGJlCiAgICAgICAgICBtb3ZlZCB0byB0aGUgbmFtZWQgZGlyZWN0b3J5LiBJZiB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbnMKICAgICAgICAgIHNwYWNlcywgZW5jbG9zZSBpdCBpbiBicmFjZXMuIElmIHRoZSBkaXJlY3RvcnkgZG9lcyBub3QgZXhpc3QsCiAgICAgICAgICBpdCBpcyBjcmVhdGVkIGlmIHBvc3NpYmxlOyBpZiBpdCBjYW4ndCBiZSBjcmVhdGVkLCB0aGUgY29tbWFuZAogICAgICAgICAgZmFpbHMgYW5kIGFuIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZC4gRXhhbXBsZToKCiAgc2VuZCAvdGV4dCAvbW92ZS10bzovdXNlcnMvb2xnYS9iYWNrdXAvICoudHh0CgogICAvTk9ULUFGVEVSOmRhdGUtdGltZQogICAgICAgICAgU3BlY2lmaWVzIHRoYXQgb25seSB0aG9zZSBmaWxlcyBtb2RpZmllZCBhdCBvciBiZWZvcmUgdGhlIGdpdmVuCiAgICAgICAgICBkYXRlIGFuZCB0aW1lIGFyZSB0byBiZSBzZW50LgoKICAgL05PVC1CRUZPUkU6ZGF0ZS10aW1lCiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIG1vZGlmaWVkIGF0IG9yIGFmdGVyIHRoZSBnaXZlbgogICAgICAgICAgZGF0ZSBhbmQgdGltZSBhcmUgdG8gYmUgc2VudC4KCiAgIC9QQVRITkFNRVM6e09GRixBQlNPTFVURSxSRUxBVElWRX0KICAgICAgICAgIFVzZSB0aGlzIHN3aXRjaCB0byBvdmVycmlkZSB0aGUgY3VycmVudCBnbG9iYWwgU0VUIFNFTkQKICAgICAgICAgIFBBVEhOQU1FUyBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuIC9QQVRITkFNRVM6QUJTT0xVVEUKICAgICAgICAgIG9yIFJFTEFUSVZFIGFsc28gc2V0cyAvRklMRU5BTUVTOkxJVEVSQUwgKGFsc28gZm9yIHRoaXMKICAgICAgICAgIHRyYW5zZmVyIG9ubHkpIHNpbmNlIHBhdGhuYW1lcyBhcmUgbm90IHNlbnQgb3RoZXJ3aXNlLgoKICAgL1JFTkFNRS1UTzp0ZXh0CiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBhZnRlciB0aGUgKG9yIGVhY2gpIHNvdXJjZSBmaWxlIGlzIHNlbnQKICAgICAgICAgIHN1Y2Nlc3NmdWxseSwgYW5kIE9OTFkgaWYgaXQgaXMgc2VudCBzdWNjZXNzZnVsbHksIGl0IHNob3VsZCBiZQogICAgICAgICAgcmVuYW1lZCB0byB0aGUgbmFtZSBnaXZlbi4gSWYgdGhlIG5hbWUgY29udGFpbnMgc3BhY2VzLCBlbmNsb3NlCiAgICAgICAgICBpdCBpbiBicmFjZXMuIElmIGEgZmlsZSBncm91cCBpcyBiZWluZyBzZW50LCB0aGVuIHRoZSAidGV4dCIKICAgICAgICAgIG11c3QgY29udGFpbiBhIHZhcmlhYmxlIHJlZmVyZW5jZSBzdWNoIGFzIFx2KGZpbGVuYW1lKSAoc2VlCiAgICAgICAgICBbNDg2XVNlY3Rpb24gNC4xKS4gRXhhbXBsZToKCiAgc2VuZCAvcmVuYW1lLXRvOm9rX1x2KGZpbGVuYW1lKSAqLioKCiAgICAgICAgICBUaGlzIHNlbmRzIGVhY2ggZmlsZSBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIGlmIGl0IHdhcwogICAgICAgICAgc2VudCBzdWNjZXNzZnVsbHksIGNoYW5nZXMgaXRzIG5hbWUgdG8gYmVnaW4gd2l0aCAib2tfIi4KCiAgIC9TTUFMTEVSLVRIQU46bnVtYmVyCiAgICAgICAgICBTcGVjaWZpZXMgdGhhdCBvbmx5IHRob3NlIGZpbGVzIHRoYXQgYXJlIHNtYWxsZXIgdGhhbiB0aGUgZ2l2ZW4KICAgICAgICAgIG51bWJlciBvZiBieXRlcyBhcmUgdG8gYmUgc2VudC4KCiAgIC9TVUJKRUNUOnRleHQKICAgICAgICAgIFN1YmplY3QgZm9yIGVtYWlsLiBBY3R1YWxseSwgdGhpcyBpcyBqdXN0IGEgc3lub255bSBmb3IKICAgICAgICAgIC9BUy1OQU1FLiBJZiB0aGUgdGV4dCBpbmNsdWRlcyBzcGFjZXMsIHlvdSBtdXN0IGVuY2xvc2UgaXQgaW4KICAgICAgICAgIGJyYWNlcy4gSWYgeW91IGRvbid0IHNwZWNpZnkgYSBzdWJqZWN0IChvciBhcy1uYW1lKSwgdGhlIG5hbWUKICAgICAgICAgIG9mIHRoZSBmaWxlIGlzIHVzZWQgYXMgdGhlIHN1YmplY3QuIEV4YW1wbGU6CgogIHNlbmQgL21haWw6a2VybWl0LXN1cHBvcnRAY29sdW1iaWEuZWR1IC9zdWJqOntBcyByZXF1ZXN0ZWR9IHBhY2tldC5sb2cKCiAgIC9QUklOVDpvcHRpb25zCiAgICAgICAgICBTZW5kcyB0aGUgZmlsZSB0byBiZSBwcmludGVkLCBvcHRpb25hbGx5IHNwZWNpZnlpbmcgb3B0aW9ucyBmb3IKICAgICAgICAgIHRoZSBwcmludGVyLiBFcXVpdmFsZW50IHRvIFJFTU9URSBQUklOVCBmaWxlbmFtZSBvcHRpb25zLgogICAgICAgICAgRXhhbXBsZXM6CgogIHNlbmQgL3ByaW50IG9vZmEudHh0ICAgICAgICAgICAgICA7IE5vIG9wdGlvbnMuCiAgc2VuZCAvcHJpbnQ6L2NvcGllcz0zIG9vZmEudHh0ICAgIDsgIi9jb3BpZXM9MyIgaXMgYSBWTVMgUFJJTlQgc3dpdGNoLgogIHNlbmQgL3ByaW50Oi0jMyBvb2ZhLnR4dCAgICAgICAgICA7ICItIzMiIGlzIGEgVU5JWCBscHIgc3dpdGNoLgoKICAgL1BST1RPQ09MOm5hbWUKICAgICAgICAgIFVzZXMgdGhlIGdpdmVuIHByb3RvY29sIHRvIHNlbmQgdGhlIGZpbGUgKEtlcm1pdCwgWm1vZGVtLCBldGMpCiAgICAgICAgICBmb3IgdGhpcyB0cmFuc2ZlciB3aXRob3V0IGNoYW5naW5nIGdsb2JhbCBwcm90b2NvbC4gT25seQogICAgICAgICAgYXZhaWxhYmxlIGluIEtlcm1pdCA5NSwgVU5JWCwgYW5kIE9TLTkuIEV4YW1wbGU6CgogIHNldCBwcm90b2NvbCBrZXJtaXQgICAgICAgICAgICAgICA7IFNldCBnbG9iYWwgcHJvdG9jb2wKICBzZW5kIC9wcm90bzp6bW9kZW0gL2JpbiBvb2ZhLnppcCAgOyBTZW5kIGp1c3QgdGhpcyBmaWxlIHdpdGggWm1vZGVtCiAgc2VuZCBvb2ZhLnR4dCAgICAgICAgICAgICAgICAgICAgIDsgVGhpcyBmaWxlIGlzIHNlbnQgd2l0aCBLZXJtaXQKCiAgIC9RVUlFVAogICAgICAgICAgV2hlbiBzZW5kaW5nIGluIGxvY2FsIG1vZGUsIHRoaXMgc3VwcHJlc3NlcyB0aGUgZmlsZS10cmFuc2ZlcgogICAgICAgICAgZGlzcGxheS4KCiAgIC9SRUNPVkVSCiAgICAgICAgICBVc2VkIHRvIHJlY292ZXIgZnJvbSBhIHByZXZpb3VzbHkgaW50ZXJydXB0ZWQgdHJhbnNmZXI7IFNFTkQKICAgICAgICAgIC9SRUNPVkVSIGlzIGVxdWl2YWxlbnQgdG8gUkVTRU5ELiBSZWNvdmVyeSBvbmx5IHdvcmtzIGluIGJpbmFyeQogICAgICAgICAgbW9kZTsgU0VORCAvUkVDT1ZFUiBhbmQgUkVTRU5EIGluY2x1ZGUgYW4gaW1wbGllZCAvQklOQVJZCiAgICAgICAgICBzd2l0Y2guIEV2ZW4gdGhlbiwgcmVjb3Zlcnkgd2lsbCBzdWNjZXNzZnVsIG9ubHkgaWYgKGEpIHRoZQogICAgICAgICAgb3JpZ2luYWwgKGludGVycnVwdGVkKSB0cmFuc2ZlciB3YXMgYWxzbyBpbiBiaW5hcnkgbW9kZSwgb3IgKGIpCiAgICAgICAgICBpZiBpdCB3YXMgaW4gdGV4dCBtb2RlLCB0aGUgdHdvIEtlcm1pdCBwcm9ncmFtcyBydW4gb24KICAgICAgICAgIHBsYXRmb3JtcyB3aGVyZSB0ZXh0LW1vZGUgdHJhbnNmZXJzIGFyZSBub3QgbGVuZ3RoLWNoYW5naW5nLgoKICAgL1NUQVJUSU5HOm51bWJlcgogICAgICAgICAgU3RhcnRzIHNlbmRpbmcgdGhlIGZpbGUgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBwb3NpdGlvbi4gU0VORAogICAgICAgICAgL1NUQVJUSU5HOm4gZmlsZW5hbWUgaXMgZXF1aXZhbGVudCB0byBQU0VORCBmaWxlbmFtZSBuLgoKICAgL1RFWFQKICAgICAgICAgIFBlcmZvcm1zIHRoaXMgdHJhbnNmZXIgaW4gdGV4dCBtb2RlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZQogICAgICAgICAgZ2xvYmFsIHRyYW5zZmVyIG1vZGUsIG92ZXJyaWRpbmcgbm90IG9ubHkgdGhlIEZJTEUgVFlQRSBhbmQKICAgICAgICAgIFRSQU5TRkVSIE1PREUgc2V0dGluZ3MsIGJ1dCBhbHNvIHRoZSBGSUxFIFBBVFRFUk4gc2V0dGluZywgZm9yCiAgICAgICAgICB0aGlzIFNFTkQgY29tbWFuZCBvbmx5LiBJbiBvdGhlciB3b3JkcywgU0VORCAvVEVYVCByZWFsbHkgc2VuZAogICAgICAgICAgdGhlIGZpbGUgaW4gdGV4dCBtb2RlLCByZWdhcmRsZXNzIG9mIGFueSBvdGhlciBzZXR0aW5ncyBvcgogICAgICAgICAgbmVnb3RpYXRpb25zLgoKICAgQWJvdXQgbWFpbC4uLiBSZWZlciB0byBbNDg3XVNlY3Rpb24gNC43LjEuIFRoZSBzYW1lIHJ1bGVzIGFwcGx5IGFzIGZvcgogICBmaWxlIHRyYW5zZmVyLiBJZiB5b3UgYXJlIG1haWxpbmcgbXVsdGlwbGUgZmlsZXMsIHlvdSBjYW4ndCB1c2UgYW4KICAgYXMtbmFtZSAoaW4gdGhpcyBjYXNlLCBhIHN1YmplY3QpIHVubGVzcyBpdCBjb250YWlucyByZXBsYWNlbWVudAogICB2YXJpYWJsZXMgbGlrZSBcdihmaWxlbnVtKS4gRm9yIGV4YW1wbGUsIGlmIHlvdToKCiAgc2VuZCAvbWFpbDpzb21lYm9keUB4eXouY29tICoudHh0CgogICBUaGVuIGVhY2ggZmlsZSB3aWxsIGFycml2ZSBhcyBhIHNlcGFyYXRlIGVtYWlsIG1lc3NhZ2Ugd2l0aCBpdHMgbmFtZQogICBhcyB0aGUgc3ViamVjdC4gQnV0IGlmIHlvdToKCiAgc2VuZCAvbWFpbDpzb21lYm9keUB4eXouY29tIC9zdWJqZWN0OntIZXJlIGlzIGEgZmlsZX0gKi50eHQKCiAgIFRoZW4gZWFjaCBmaWxlIG1lc3NhZ2Ugd2lsbCBoYXZlIHRoZSBzYW1lIHN1YmplY3QsIHdoaWNoIGlzIHByb2JhYmx5CiAgIG5vdCB3aGF0IHlvdSB3YW50LiBZb3UgY2FuIGdldCBhcm91bmQgdGhpcyB3aXRoIGNvbnN0cnVjdGlvbnMgbGlrZToKCiAgc2VuZCAvbWFpbDpzb21lYm9keUB4eXouY29tIC9zdWJqZWN0OntIZXJlIGlzIFx2KGZpbGVuYW1lKX0gKi50eHQKCiAgIHdoaWNoIGVtYmVkIHRoZSBmaWxlbmFtZSBpbiB0aGUgc3ViamVjdC4KCiAgIFRoZSBNT1ZFLCBDU0VORCwgTUFJTCwgYW5kIFJFU0VORCBjb21tYW5kcyBub3cgYWxzbyBhY2NlcHQgdGhlIHNhbWUKICAgc3dpdGNoZXMuIEFuZCB0aGUgc3dpdGNoZXMgYXJlIGFsc28gb3BlcmF0aXZlIHdoZW4gc2VuZGluZyBmcm9tIGEKICAgU0VORC1MSVNUIChzZWUgWzQ4OF1Vc2luZyBDLUtlcm1pdCwgMm5kIEVkLCBwcC4xOTEtMTkyKSwgc28sIGZvcgogICBleGFtcGxlLCBpdCBpcyBub3cgcG9zc2libGUgdG8gU0VORCAvUFJJTlQgb3IgU0VORCAvTUFJTCBmcm9tIGEKICAgU0VORC1MSVNULgoKICAgVGhlIE1TRU5EIGFuZCBNTU9WRSBjb21tYW5kcyBhbHNvIHRha2Ugc3dpdGNoZXMsIGJ1dCBub3QgYWxsIG9mIHRoZW0uCiAgIFdpdGggdGhlc2UgY29tbWFuZHMsIHdoaWNoIHRha2UgYW4gYXJiaXRyYXJ5IGxpc3Qgb2YgZmlsZXNwZWNzLCB5b3UKICAgY2FuIHVzZSAvQklOQVJZLCAvREVMRVRFLCAvTUFJTCwgL1BSSU5ULCAvUFJPVE9DT0wsIC9RVUlFVCwgL1JFQ09WRVIsCiAgIGFuZCAvVEVYVCAoYW5kIC9JTUFHRSBvciAvTEFCRUxFRCwgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybSkuIE1NT1ZFCiAgIGlzIGVxdWl2YWxlbnQgdG8gTVNFTkQgL0RFTEVURS4gKElmIHlvdSB3YW50IHRvIHNlbmQgYSBncm91cCBvZiBmaWxlcywKICAgYnV0IGluIG1peGVkIHRyYW5zZmVyIG1vZGVzIHdpdGggcGVyLWZpbGUgYXMtbmFtZXMsIHVzZSBBREQgU0VORC1MSVNUCiAgIGFuZCB0aGVuIFNFTkQuKQoKICAgVGhlIE1TRU5EL01NT1ZFIHN3aXRjaGVzIGNvbWUgYmVmb3JlIHRoZSBmaWxlbmFtZXMsIGFuZCBhcHBseSB0byBhbGwKICAgb2YgdGhlbToKCiAgbXNlbmQgL3ByaW50IC90ZXh0ICoubG9nIG9vZmEudHh0IC9ldGMvbW90ZAoKICAgSWYgeW91IHR5cGUgYW55IG9mIHRoZXNlIGNvbW1hbmRzIChTRU5ELCBDU0VORCwgTVNFTkQsIGV0YykgZm9sbG93ZWQKICAgYnkgYSBxdWVzdGlvbiBtYXJrICg/KSwgeW91IHdpbGwgc2VlIGEgbGlzdCBvZiB0aGUgc3dpdGNoZXMgeW91IGNhbgogICB1c2UuIElmIHlvdSB3YW50IHRvIHNlZSBhIGxpc3Qgb2YgZmlsZW5hbWVzLCB5b3UnbGwgbmVlZCB0byB0eXBlCiAgIHNvbWV0aGluZyBsaWtlICJzZW5kIC4vPyIgKFVOSVgsIE9TLzIsIFdpbmRvd3MsIGV0YyksIG9yICJzZW5kIFtdPyIKICAgKFZNUyksIGV0Yy4gT2YgY291cnNlLCB5b3UgY2FuIGFsc28gdHlwZSBwaWVjZXMgb2YgYSBmaWxlbmFtZQogICAoYW55dGhpbmcgdGhhdCBkb2VzIG5vdCBzdGFydCB3aXRoICIvIikgYW5kIHRoZW4gIj8iIHRvIGdldCBhIGxpc3Qgb2YKICAgZmlsZW5hbWVzIHRoYXQgc3RhcnQgdGhhdCB3YXk7IGUuZy4gInNlbmQgeC4/IiBzdGlsbCB3b3JrcyBhcyBiZWZvcmUuCgogICBJbiBVTklYLCB3aGVyZSAiLyIgaXMgYWxzbyB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciwgdGhlcmUgaXMgdXN1YWxseQogICBubyBhbWJpZ3VpdHkgYmV0d2VlbiBhIGZ1bGx5LXNwZWNpZmllZCBwYXRobmFtZSBhbmQgYSBzd2l0Y2gsIGV4Y2VwdAogICB3aGVuIGEgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3RvcnkgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYSBzd2l0Y2ggKGFzCiAgIG5vdGVkIGluIFs0ODldU2VjdGlvbiAxLjUpOgoKICBzZW5kIC9ldGMvbW90ZCAgICAgICAgICAgICAgICAgICAgICAgIDsgV29ya3MgYXMgZXhwZWN0ZWQKICBzZW5kIC9jb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgIDsgPz8/CgogICBUaGUgc2Vjb25kIGV4YW1wbGUgaW50ZXJwcmV0cyAiL2NvbW1hbmQiIGFzIGEgc3dpdGNoLCBub3QgYSBmaWxlbmFtZS4KICAgVG8gc2VuZCBhIGZpbGUgYWN0dWFsbHkgY2FsbGVkICJjb21tYW5kIiBpbiB0aGUgcm9vdCBkaXJlY3RvcnksIHVzZToKCiAgc2VuZCB7L2NvbW1hbmR9CgogICBvciBvdGhlciBzeXN0ZW0tZGVwZW5kZW50IGZvcm1zIHN1Y2ggYXMgLy9jb21tYW5kLCAvLi9jb21tYW5kLAogICBjOi9jb21tYW5kLCBldGMsIG9yIGNkIHRvIC8gYW5kIHRoZW4gInNlbmQgY29tbWFuZCIuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjcuMi4gR0VUIENvbW1hbmQgU3dpdGNoZXMKCiAgIFdpdGhvdXQgc3dpdGNoZXMsIHRoZSBHRVQgY29tbWFuZCBzdGlsbCB3b3JrcyBhYm91dCB0aGUgc2FtZSBhcwogICBiZWZvcmU6CgogIGdldCBvb2ZhLnR4dCAgICAgICAgICAgICAgICAgICAgICAgICAgOyBHRVQgYSBzaW5nbGUgZmlsZQogIGdldCBvb2ZhLiogICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBHRVQgbXVsdGlwbGUgZmlsZXMKCiAgIEhvd2V2ZXIsIHRoZSBtZWNoYW5pc20gZm9yIGluY2x1ZGluZyBhbiAiYXMtbmFtZSIgaGFzIGNoYW5nZWQuCiAgIFByZXZpb3VzbHksIGluIG9yZGVyIHRvIGluY2x1ZGUgYW4gYXMtbmFtZSwgeW91IHdlcmUgcmVxdWlyZWQgdG8gdXNlCiAgIHRoZSAibXVsdGlsaW5lIiBmb3JtIG9mIEdFVDoKCiAgZ2V0CiAgcmVtb3RlLWZpbGVzcGVjCiAgbG9jYWwtbmFtZQoKICAgVGhpcyB3YXMgYmVjYXVzZSB0aGUgcmVtb3RlIGZpbGVzcGVjIG1pZ2h0IGNvbnRhaW4gc3BhY2VzLCBhbmQgc28KICAgdGhlcmUgd291bGQgYmUgbm8gZ29vZCB3YXkgb2YgdGVsbGluZyB3aGVyZSBpdCBlbmRlZCBhbmQgd2hlcmUgdGhlCiAgIGxvY2FsIG5hbWUgYmVnYW4sIGUuZzoKCiAgZ2V0IHByb2ZpbGUgZXhlYyBhIGZvbwoKICAgQnV0IG5vdyBzaW5jZSB3ZSBjYW4gdXNlIHticmFjZXN9IGZvciBncm91cGluZywgd2UgZG9uJ3QgbmVlZCB0aGUKICAgbXVsdGlsaW5lIEdFVCBmb3JtIGFueSBtb3JlLCBhbmQgaW4gZmFjdCwgc3VwcG9ydCBmb3IgaXQgaGFzIGJlZW4KICAgcmVtb3ZlZC4gSWYgeW91IGdpdmUgYSBHRVQgY29tbWFuZCBieSBpdHNlbGYgb24gYSBsaW5lLCBpdCBmYWlscyBhbmQKICAgYW4gZXJyb3IgbWVzc2FnZSBpcyBwcmludGVkLiBUaGUgbmV3IGZvcm0gaXM6CgogICBHRVQgWyBzd2l0Y2hlcy4uLiBdIHJlbW90ZS1uYW1lIFsgbG9jYWwtbmFtZSBdCiAgICAgICAgICBBc2sgdGhlIHNlcnZlciB0byBzZW5kIHRoZSBmaWxlIHdob3NlIG5hbWUgaXMgcmVtb3RlLW5hbWUuIElmCiAgICAgICAgICB0aGUgb3B0aW9uYWwgbG9jYWwtbmFtZSBpcyBnaXZlbiwgc3RvcmUgaXQgbG9jYWxseSB1bmRlciB0aGlzCiAgICAgICAgICBuYW1lLiBJZiB0aGUgcmVtb3RlLW5hbWUgb3IgbG9jYWwtbmFtZSBjb250YWlucyBzcGFjZXMsIHRoZXkKICAgICAgICAgIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzOgoKICBnZXQge3Byb2ZpbGUgZXhlYyBhfSBmb28KICBnZXQgb29mYS50eHQge34vTXkgRmlsZXMvT29mYSB0ZXh0fQoKICAgSWYgeW91IHdhbnQgdG8gZ2l2ZSBhIGxpc3Qgb2YgcmVtb3RlIGZpbGUgc3BlY2lmaWNhdGlvbnMsIHVzZSB0aGUgTUdFVAogICBjb21tYW5kOgoKICAgTUdFVCBbIHN3aXRjaGVzLi4uIF0gcmVtb3RlLW5hbWUgWyByZW1vdGUtbmFtZSBbIHJlbW90ZS1uYW1lIC4uLiBdIF0KICAgICAgICAgIEFzayB0aGUgc2VydmVyIHRvIHNlbmQgdGhlIGZpbGVzIHdob3NlIG5hbWVzIGFyZSBnaXZlbi4KCiAgIE5vdyB5b3UgY2FuIGFsc28gaW5jbHVkZSBtb2RpZmllciBzd2l0Y2hlcyBiZXR3ZWVuIEdFVCBvciBNR0VUIGFuZCB0aGUKICAgcmVtb3RlLW5hbWU7IG1vc3Qgb2YgdGhlIHNhbWUgc3dpdGNoZXMgYXMgU0VORDoKCiAgIC9BUy1OQU1FOnRleHQKICAgICAgICAgIFNwZWNpZmllcyAidGV4dCIgYXMgdGhlIG5hbWUgdG8gc3RvcmUgdGhlIGluY29taW5nIGZpbGUgdW5kZXIuCiAgICAgICAgICAoVGhpcyBzd2l0Y2ggaXMgbm90IGF2YWlsYWJsZSBmb3IgTUdFVC4pIFlvdSBjYW4gYWxzbyBzdGlsbAogICAgICAgICAgc3BlY2lmeSB0aGUgYXMtbmFtZSBhcyB0aGUgc2Vjb25kIGZpbGVuYW1lIG9uIHRoZSBHRVQgY29tbWFuZAogICAgICAgICAgbGluZS4gVGhlIGZvbGxvd2luZyB0d28gY29tbWFuZHMgYXJlIGVxdWl2YWxlbnQ6CgogIGdldCBvb2ZhLnR4dCBvb2ZhLm5ldwogIGdldCAvYXM6b29mYS5uZXcgb29mYS50eHQKCiAgIC9CSU5BUlkKICAgICAgICAgIFRlbGxzIHRoZSBzZXJ2ZXIgdG8gc2VuZCB0aGUgZ2l2ZW4gZmlsZShzKSBpbiBiaW5hcnkgbW9kZQogICAgICAgICAgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGdsb2JhbCB0cmFuc2ZlciBtb2RlLiBFeGFtcGxlOgoKICBzZXQgZmlsZSB0eXBlIHRleHQgICAgICA7IFNldCBnbG9iYWwgdHJhbnNmZXIgbW9kZSB0byB0ZXh0CiAgZ2V0IC9iaW5hcnkgb29mYS56aXAgICAgOyBnZXQgYSBmaWxlIGluIGJpbmFyeSBtb2RlCiAgZ2V0IG9vZmEudHh0ICAgICAgICAgICAgOyBUaGlzIG9uZSBpcyB0cmFuc2ZlcnJlZCBpbiB0ZXh0IG1vZGUKCiAgICAgICAgICBPciwgcGVyaGFwcyBtb3JlIHRvIHRoZSBwb2ludDoKCiAgZ2V0IC9iaW5hcnkgZm9vLnR4dCAgICAgOyB3aGVyZSAiKi50eHQiIGlzIGEgdGV4dC1wYXR0ZXJuCgogICAgICAgICAgVGhpcyBoYXMgdGhlIGV4cGVjdGVkIGVmZmVjdCBvbmx5IGlmIHRoZSBzZXJ2ZXIgaXMgQy1LZXJtaXQgNy4wCiAgICAgICAgICBvciBsYXRlciBvciBLOTUgMS4xLjE5IG9yIGxhdGVyLgoKICAgL0NPTU1BTkQKICAgICAgICAgIEdFVCAvQ09NTUFORCBpcyBlcXVpdmFsZW50IHRvIENHRVQgKFs0OTBdU2VjdGlvbiA0LjIuMikgLS0gaXQKICAgICAgICAgIHNheXMgdG8gcmVjZWl2ZSB0aGUgZmlsZSBpbnRvIHRoZSBzdGFuZGFyZCBpbnB1dCBvZiBhIGNvbW1hbmQsCiAgICAgICAgICByYXRoZXIgdGhhbiBzYXZpbmcgaXQgb24gZGlzay4gVGhlIC9BUy1OQU1FIG9yIHRoZSBzZWNvbmQKICAgICAgICAgICJmaWxlbmFtZSIgb24gdGhlIEdFVCBjb21tYW5kIGxpbmUgaXMgaW50ZXJwcmV0ZWQgYXMgdGhlIG5hbWUKICAgICAgICAgIG9mIGEgY29tbWFuZC4gRXhhbXBsZXM6CgogIGdldCAvY29tbWFuZCBzdW5kYXkudHh0IHtncmVwIFN1bmRheSBvb2ZhLnR4dH0KICBnZXQgL2NvbW1hbmQgL2FzLW5hbWU6e2dyZXAgU3VuZGF5IG9vZmEudHh0fSBzdW5kYXkudHh0CiAgZ2V0IC9iaW4gL2NvbW1hbmQgeyFndW56aXAgLWMgfCB0YXIgeGYgLX0ge3RhciBjZiAtIC4gfCBnemlwIC1jfQoKICAgL0RFTEVURQogICAgICAgICAgQXNrcyB0aGUgS2VybWl0IHNlcnZlciB0byBkZWxldGUgdGhlIGZpbGUgKG9yIGVhY2ggZmlsZSBpbiB0aGUKICAgICAgICAgIGdyb3VwKSBhZnRlciBpdCBoYXMgYmVlbiB0cmFuc2ZlcnJlZCBzdWNjZXNzZnVsbHkgKGJ1dCBub3QgdG8KICAgICAgICAgIGRlbGV0ZSBpdCBpZiBpdCB3YXMgbm90IHNlbnQgc3VjY2Vzc2Z1bGx5KS4gR0VUIC9ERUxFVEUgaXMKICAgICAgICAgIGVxdWl2YWxlbnQgdG8gUkVUUklFVkUuIEV4YW1wbGU6CgogIGdldCAvZGVsZXRlICoubG9nCgogICAvRVhDRVBUOnBhdHRlcm4KICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiwgd2hpY2gKICAgICAgICAgIGNhbiBiZSBhIHJlZ3VsYXIgZmlsZW5hbWUsIG9yIG1heSBjb250YWluICIqIiBhbmQvb3IgIj8iCiAgICAgICAgICBtZXRhY2hhcmFjdGVycywgYXJlIHRvIGJlIHJlZnVzZWQgdXBvbiBhcnJpdmFsLiBUbyBzcGVjaWZ5CiAgICAgICAgICBtdWx0aXBsZSBwYXR0ZXJucyAodXAgdG8gOCksIHVzZSBvdXRlciBicmFjZXMgYXJvdW5kIHRoZSBncm91cCwKICAgICAgICAgIGFuZCBpbm5lciBicmFjZXMgYXJvdW5kIGVhY2ggcGF0dGVybjoKCiAgL0VYQ0VQVDp7e3BhdHRlcm4xfXtwYXR0ZXJuMn0uLi59CgogICAgICAgICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBTRU5EIC9FWENFUFQgaW4gWzQ5MV1TZWN0aW9uIDQuNy4xIGZvcgogICAgICAgICAgZXhhbXBsZXMsIGV0Yy4gUmVmdXNhbCBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgdGhlIEF0dHJpYnV0ZQogICAgICAgICAgUmVqZWN0aW9uIG1lY2hhbmlzbSAocmVhc29uICJuYW1lIiksIHdoaWNoIHdvcmtzIG9ubHkgd2hlbgogICAgICAgICAgQXR0cmlidXRlIHBhY2tldHMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBuZWdvdGlhdGVkLgoKICAgL0ZJTEVOQU1FUzp7Q09OVkVSVEVELExJVEVSQUx9CiAgICAgICAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgZ2xvYmFsIFNFVCBGSUxFIE5BTUVTCiAgICAgICAgICBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuCgogICAvRklMVEVSOmNvbW1hbmQKICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIGEgZmlsdGVyIHRvIHBhc3MgdGhlIGluY29taW5nIGZpbGUgdGhyb3VnaAogICAgICAgICAgYmVmb3JlIHdyaXRpbmcgdG8gZGlzay4gU2VlIHRoZSBbNDkyXXNlY3Rpb24gb24gZmlsZS10cmFuc2ZlcgogICAgICAgICAgcGlwZXMgYW5kIGZpbHRlcnMuIFRoZSAvRklMVEVSIHN3aXRjaCBhcHBsaWVzIG9ubHkgdG8gdGhlCiAgICAgICAgICBmaWxlLXRyYW5zZmVyIGNvbW1hbmQgaXQgaXMgZ2l2ZW4gd2l0aDsgaXQgZG9lcyBub3QgYWZmZWN0IHRoZQogICAgICAgICAgZ2xvYmFsIFJFQ0VJVkUgRklMVEVSIHNldHRpbmcsIGlmIGFueS4KCiAgIC9JTUFHRQogICAgICAgICAgVk1TOiBUcmFuc2ZlciBpbiBpbWFnZSBtb2RlLiBOb24tVk1TOiBzYW1lIGFzIC9CSU5BUlkuCgogICAvTEFCRUxFRAogICAgICAgICAgVk1TIGFuZCBPUy8yIG9ubHk6IFNwZWNpZmllcyBsYWJlbGVkIHRyYW5zZmVyIG1vZGUuCgogICAvTU9WRS1UTzpkaXJlY3RvcnkKICAgICAgICAgIFRoaXMgdGVsbHMgQy1LZXJtaXQgdG8gbW92ZSBlYWNoIGZpbGUgdGhhdCBpcyBzdWNjZXNzZnVsbHkKICAgICAgICAgIHJlY2VpdmVkIHRvIHRoZSBnaXZlbiBkaXJlY3RvcnkuIEZpbGVzIHRoYXQgYXJlIG5vdAogICAgICAgICAgc3VjY2Vzc2Z1bGx5IHJlY2VpdmVkIGFyZSBub3QgbW92ZWQuIEJ5IGRlZmF1bHQsIGZpbGVzIGFyZSBub3QKICAgICAgICAgIG1vdmVkLgoKICAgL1BBVEhOQU1FUzp7T0ZGLEFCU09MVVRFLFJFTEFUSVZFLEFVVE99CiAgICAgICAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgZ2xvYmFsIFNFVCBSRUNFSVZFCiAgICAgICAgICBQQVRITkFNRVMgc2V0dGluZyBmb3IgdGhpcyB0cmFuc2ZlciBvbmx5LiAvUEFUSE5BTUVTOkFCU09MVVRFCiAgICAgICAgICBvciBSRUxBVElWRSBhbHNvIHNldHMgL0ZJTEVOQU1FUzpMSVRFUkFMIChhbHNvIGZvciB0aGlzCiAgICAgICAgICB0cmFuc2ZlciBvbmx5KSBzaW5jZSBpbmNvbWluZyBwYXRobmFtZXMgd291bGQgbm90IGJlIHRyZWF0ZWQgYXMKICAgICAgICAgIHBhdGhuYW1lcyBvdGhlcndpc2UuIFNlZSBbNDkzXVNlY3Rpb24gNC4xMC4KCiAgIC9RVUlFVAogICAgICAgICAgV2hlbiBzZW5kaW5nIGluIGxvY2FsIG1vZGUsIHRoaXMgc3VwcHJlc3NlcyB0aGUgZmlsZS10cmFuc2ZlcgogICAgICAgICAgZGlzcGxheS4KCiAgIC9SRUNPVkVSCiAgICAgICAgICBVc2VkIHRvIHJlY292ZXIgZnJvbSBhIHByZXZpb3VzbHkgaW50ZXJydXB0ZWQgdHJhbnNmZXI7IEdFVAogICAgICAgICAgL1JFQ09WRVIgaXMgZXF1aXZhbGVudCB0byBSRUdFVC4gUmVjb3Zlcnkgb25seSB3b3JrcyBpbiBiaW5hcnkKICAgICAgICAgIG1vZGU7IFNFTkQgL1JFQ09WRVIgYW5kIFJFU0VORCBpbmNsdWRlIGFuIGltcGxpZWQgL0JJTkFSWQogICAgICAgICAgc3dpdGNoLiBFdmVuIHRoZW4sIHJlY292ZXJ5IHdpbGwgc3VjY2Vzc2Z1bCBvbmx5IGlmIChhKSB0aGUKICAgICAgICAgIG9yaWdpbmFsIChpbnRlcnJ1cHRlZCkgdHJhbnNmZXIgd2FzIGFsc28gaW4gYmluYXJ5IG1vZGUsIG9yIChiKQogICAgICAgICAgaWYgaXQgd2FzIGluIHRleHQgbW9kZSwgdGhlIHR3byBLZXJtaXQgcHJvZ3JhbXMgcnVuIG9uCiAgICAgICAgICBwbGF0Zm9ybXMgd2hlcmUgdGV4dC1tb2RlIHRyYW5zZmVycyBhcmUgbm90IGxlbmd0aC1jaGFuZ2luZy4KCiAgIC9SRUNVUlNJVkUKICAgICAgICAgIFRlbGxzIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgR0VUIGZpbGUgc3BlY2lmaWNhdGlvbiBhcHBsaWVzCiAgICAgICAgICByZWN1cnNpdmVseS4gVGhpcyBzd2l0Y2ggYWxzbyBhdXRvbWF0aWNhbGx5IHNldHMKICAgICAgICAgIC9QQVRITkFNRVM6UkVMQVRJVkUgaW4gYm90aCB0aGUgc2VydmVyIEFORCB0aGUgY2xpZW50LiBXaGVuCiAgICAgICAgICB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggL0RFTEVURSwgdGhpcyAibW92ZXMiIGEgZGlyZWN0b3J5IHRyZWUKICAgICAgICAgIGZyb20gdGhlIHNlcnZlcidzIGNvbXB1dGVyIHRvIHRoZSBjbGllbnQncyBjb21wdXRlciAoZXhjZXB0CiAgICAgICAgICB0aGF0IG9ubHkgcmVndWxhciBmaWxlcyBhcmUgZGVsZXRlZCBmcm9tIHRoZSBzZXJ2ZXIncyBjb21wdXRlciwKICAgICAgICAgIG5vdCBkaXJlY3RvcmllczsgdGh1cyB0aGUgb3JpZ2luYWwgZGlyZWN0b3JpZXMgd2lsbCBiZSBsZWZ0LAogICAgICAgICAgYnV0IHdpbGwgY29udGFpbiBubyBmaWxlcykuIE5vdGUgdGhhdCBhbGwgc2VydmVycyB0aGF0IHN1cHBvcnQKICAgICAgICAgIC9SRUNVUlNJVkUgZG8gbm90IG5lY2Vzc2FyaWx5IGRvIHNvIGluIGNvbWJpbmF0aW9uIHdpdGggb3RoZXIKICAgICAgICAgIHN3aXRjaGVzLCBzdWNoIGFzIC9SRUNPVkVSLiAoU2VydmVycyB0aGF0IGRvIGluY2x1ZGUgQy1LZXJtaXQKICAgICAgICAgIDcuMCBhbmQgbGF0ZXIsIEs5NSAxLjEuMTkgYW5kIGxhdGVyLikKCiAgIC9SRU5BTUUtVE86c3RyaW5nCiAgICAgICAgICBUaGlzIHRlbGxzIEMtS2VybWl0IHRvIHJlbmFtZSBlYWNoIGZpbGUgdGhhdCBpcyBzdWNjZXNzZnVsbHkKICAgICAgICAgIHJlY2VpdmVkIHRvIHRoZSBnaXZlbiBzdHJpbmcuIEZpbGVzIHRoYXQgYXJlIG5vdCBzdWNjZXNzZnVsbHkKICAgICAgICAgIHJlY2VpdmVkIGFyZSBub3QgcmVuYW1lZC4gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIG5vdCByZW5hbWVkLgogICAgICAgICAgVGhlIHN0cmluZyBjYW4gYmUgYSBsaXRlcmFsIHN0cmluZywgd2hpY2ggaXMgYXBwcm9wcmlhdGUgd2hlbgogICAgICAgICAgb25seSBvbmUgZmlsZSBpcyBiZWluZyByZWNlaXZlZCwgb3IgaXQgY2FuIGNvbnRhaW4gb25lIG9yIG1vcmUKICAgICAgICAgIHZhcmlhYmxlcyB0aGF0IGFyZSB0byBiZSBldmFsdWF0ZWQgYXQgdGhlIHRpbWUgZWFjaCBmaWxlIGlzCiAgICAgICAgICByZWNlaXZlZCwgc3VjaCBhcyBcdihmaWxlbmFtZSksIFx2KGZpbGVudW1iZXIpLCBcdihudGltZSksCiAgICAgICAgICBcdihwaWQpLCBcdih1c2VyKSwgZXRjLiBXQVJOSU5HOiBpZiB5b3UgZ2l2ZSBhIGxpdGVyYWwgc3RyaW5nCiAgICAgICAgICBhbmQgbW9yZSB0aGFuIG9uZSBmaWxlIGFycml2ZXMsIGVhY2ggaW5jb21pbmcgZmlsZSB3aWxsIGJlCiAgICAgICAgICBnaXZlbiB0aGUgc2FtZSBuYW1lIChidXQgU0VUIEZJTEUgQ09MTElTSU9OIEJBQ0tVUCBvciBSRU5BTUUKICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGtlZXAgdGhlIGluY29taW5nIGZpbGVzIGZyb20gb3ZlcndyaXRpbmcgZWFjaAogICAgICAgICAgb3RoZXIpLgoKICAgL1RFWFQKICAgICAgICAgIFRlbGxzIHRoZSBzZXJ2ZXIgdG8gcGVyZm9ybSB0aGlzIHRyYW5zZmVyIGluIHRleHQgbW9kZSB3aXRob3V0CiAgICAgICAgICBhZmZlY3RpbmcgaXRzIGdsb2JhbCB0cmFuc2ZlciBtb2RlLiBTZWUgL0JJTkFSWSBmb3IgYWRkaXRpb25hbAogICAgICAgICAgaW5mby4KCiAgIFRoZSAvTUFJTCBhbmQgL1BSSU5UIG9wdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgKGFzIHRoZXkgYXJlIGZvciBTRU5EKSwKICAgYnV0IHlvdSBjYW4gdXNlIC9DT01NQU5EIHRvIGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0LCBhcyBpbiB0aGVzZSBVTklYCiAgIGV4YW1wbGVzOgoKICBnZXQgL2NvbW1hbmQgb29mYS50eHQge21haWwga2VybWl0QGNvbHVtYmlhLmVkdX0KICBnZXQgL2NvbW1hbmQgb29mYS50eHQgbHByCgogICBJbiBPUy8yIG9yIFdpbmRvd3MsIHlvdSBjYW4gR0VUIGFuZCBwcmludCBsaWtlIHRoaXM6CgogIGdldCBvb2ZhLnR4dCBwcm4KCiAgIFRoZSBDR0VULCBSRUdFVCwgUkVUUklFVkUgY29tbWFuZHMgYWxzbyBhY2NlcHQgdGhlIHNhbWUgc3dpdGNoZXMgYXMKICAgR0VULiBDR0VUIGF1dG9tYXRpY2FsbHkgc2V0cyAvQ09NTUFORDsgUkVHRVQgYXV0b21hdGljYWxseSBzZXRzCiAgIC9SRUNPVkVSIGFuZCAvQklOQVJZLCBhbmQgUkVUUklFVkUgYXV0b21hdGljYWxseSBzZXRzIC9ERUxFVEUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjcuMy4gUkVDRUlWRSBDb21tYW5kIFN3aXRjaGVzCgogICBXaXRob3V0IHN3aXRjaGVzLCB0aGUgUkVDRUlWRSBjb21tYW5kIHN0aWxsIHdvcmtzIGFzIGJlZm9yZToKCiAgcmVjZWl2ZSAgICAgICAgICAgIDsgUmVjZWl2ZXMgZmlsZXMgdW5kZXIgdGhlaXIgb3duIG5hbWVzCiAgcmVjZWl2ZSAvdG1wICAgICAgIDsgRGl0dG8sIGJ1dCBpbnRvIHRoZSAvdG1wIGRpcmVjdG9yeQogIHIgICAgICAgICAgICAgICAgICA7IFNhbWUgYXMgInJlY2VpdmUiCiAgcmVjZWl2ZSBmb28udHh0ICAgIDsgUmVjZWl2ZXMgYSBmaWxlIGFuZCByZW5hbWVzIHRvIGZvby50eHQKCiAgIE5vdyB5b3UgY2FuIGFsc28gaW5jbHVkZSBtb2RpZmllciBzd2l0Y2hlcyBtYXkgYmUgaW5jbHVkZWQgYmV0d2VlbgogICAicmVjZWl2ZSIgYW5kIHRoZSBhcy1uYW1lOyBtb3N0IG9mIHRoZSBzYW1lIHN3aXRjaGVzIGFzIEdFVDoKCiAgIC9BUy1OQU1FOnRleHQKICAgICAgICAgIFNwZWNpZmllcyAidGV4dCIgYXMgdGhlIG5hbWUgdG8gc3RvcmUgdGhlIGluY29taW5nIGZpbGUgdW5kZXIuCiAgICAgICAgICBZb3UgY2FuIGFsc28gc3RpbGwgc3BlY2lmeSB0aGUgYXMtbmFtZSBhcyBhIGZpbGVuYW1lIG9uIHRoZQogICAgICAgICAgY29tbWFuZCBsaW5lLiBUaGUgZm9sbG93aW5nIHR3byBjb21tYW5kcyBhcmUgZXF1aXZhbGVudDoKCiAgciBvb2ZhLm5ldwogIHIgL2FzOm9vZmEubmV3CgogICAvQklOQVJZCiAgICAgICAgICBQZXJmb3JtcyB0aGlzIHRyYW5zZmVyIGluIGJpbmFyeSBtb2RlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZQogICAgICAgICAgZ2xvYmFsIHRyYW5zZmVyIG1vZGUuIE5PVEU6IFRoaXMgZG9lcyBub3Qgb3ZlcnJpZGUgdGhlIGluY29taW5nCiAgICAgICAgICBmaWxldHlwZSAoYXMgaXQgZG9lcyB3aXRoIEdFVCksIHNvIHRoaXMgc3dpdGNoIGlzIHVzZWZ1bCBvbmx5CiAgICAgICAgICBpZiBBVFRSSUJVVEUgVFlQRSBpcyBPRkYsIG9yIGlmIHRoZSBvdGhlciBLZXJtaXQgZG9lcyBub3Qgc2VuZAogICAgICAgICAgYSBUWVBFICh0ZXh0IG9yIGJpbmFyeSkgYXR0cmlidXRlLiBJbiBhbnkgY2FzZSwgaXQgaGFzIG5vCiAgICAgICAgICBhZmZlY3Qgd2hhdHNvZXZlciBvbiB0aGUgZmlsZSBzZW5kZXIuCgogICAvQ09NTUFORAogICAgICAgICAgUkVDRUlWRSAvQ09NTUFORCBpcyBlcXVpdmFsZW50IHRvIENSRUNFSVZFIChbNDk0XVNlY3Rpb24gNC4yLjIpCiAgICAgICAgICAtLSBpdCBzYXlzIHRvIHJlY2VpdmUgdGhlIGZpbGUgaW50byB0aGUgc3RhbmRhcmQgaW5wdXQgb2YgYQogICAgICAgICAgY29tbWFuZCwgcmF0aGVyIHRoYW4gc2F2aW5nIGl0IG9uIGRpc2suIFRoZSAvQVMtTkFNRSBvciB0aGUKICAgICAgICAgICJmaWxlbmFtZSIgb24gdGhlIFJFQ0VJVkUgY29tbWFuZCBsaW5lIGlzIGludGVycHJldGVkIGFzIHRoZQogICAgICAgICAgbmFtZSBvZiBhIGNvbW1hbmQuCgogIHIgL2NvbW1hbmQge2dyZXAgU3VuZGF5IG9vZmEudHh0fQogIHIgL2NvbW1hbmQgL2FzLW5hbWU6e2dyZXAgU3VuZGF5IG9vZmEudHh0fQogIHIgL2JpbiAvY29tbWFuZCB7dGFyIGNmIC0gLiB8IGd6aXAgLWN9CgogICAvRVhDRVBUOnBhdHRlcm4KICAgICAgICAgIFNwZWNpZmllcyB0aGF0IGFueSBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCB0aGUgcGF0dGVybiwgd2hpY2gKICAgICAgICAgIGNhbiBiZSBhIHJlZ3VsYXIgZmlsZW5hbWUsIG9yIG1heSBjb250YWluICIqIiBhbmQvb3IgIj8iCiAgICAgICAgICBtZXRhY2hhcmFjdGVycywgYXJlIHRvIGJlIHJlZnVzZWQgdXBvbiBhcnJpdmFsLiBUbyBzcGVjaWZ5CiAgICAgICAgICBtdWx0aXBsZSBwYXR0ZXJucyAodXAgdG8gOCksIHVzZSBvdXRlciBicmFjZXMgYXJvdW5kIHRoZSBncm91cCwKICAgICAgICAgIGFuZCBpbm5lciBicmFjZXMgYXJvdW5kIGVhY2ggcGF0dGVybjoKCiAgL0VYQ0VQVDp7e3BhdHRlcm4xfXtwYXR0ZXJuMn0uLi59CgogICAgICAgICAgU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBTRU5EIC9FWENFUFQgaW4gWzQ5NV1TZWN0aW9uIDQuNy4xIGZvcgogICAgICAgICAgZXhhbXBsZXMsIGV0Yy4gUmVmdXNhbCBpcyBhY2NvbXBsaXNoZWQgdXNpbmcgdGhlIEF0dHJpYnV0ZQogICAgICAgICAgUmVqZWN0aW9uIG1lY2hhbmlzbSAocmVhc29uICJuYW1lIiksIHdoaWNoIHdvcmtzIG9ubHkgd2hlbgogICAgICAgICAgQXR0cmlidXRlIHBhY2tldHMgaGF2ZSBiZWVuIHN1Y2Nlc3NmdWxseSBuZWdvdGlhdGVkLgoKICAgL0ZJTEVOQU1FUzp7Q09OVkVSVEVELExJVEVSQUx9CiAgICAgICAgICBVc2UgdGhpcyBzd2l0Y2ggdG8gb3ZlcnJpZGUgdGhlIGN1cnJlbnQgZ2xvYmFsIFNFVCBGSUxFIE5BTUVTCiAgICAgICAgICBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuCgogICAvRklMVEVSOmNvbW1hbmQKICAgICAgICAgIFRoaXMgc3BlY2lmaWVzIGEgZmlsdGVyIHRvIHBhc3MgdGhlIGluY29taW5nIGZpbGUgdGhyb3VnaAogICAgICAgICAgYmVmb3JlIHdyaXRpbmcgdG8gZGlzay4gU2VlIHRoZSBbNDk2XXNlY3Rpb24gb24gZmlsZS10cmFuc2ZlcgogICAgICAgICAgcGlwZXMgYW5kIGZpbHRlcnMuIFRoZSAvRklMVEVSIHN3aXRjaCBhcHBsaWVzIG9ubHkgdG8gdGhlCiAgICAgICAgICBmaWxlLXRyYW5zZmVyIGNvbW1hbmQgaXQgaXMgZ2l2ZW4gd2l0aDsgaXQgZG9lcyBub3QgYWZmZWN0IHRoZQogICAgICAgICAgZ2xvYmFsIFJFQ0VJVkUgRklMVEVSIHNldHRpbmcsIGlmIGFueS4KCiAgIC9JTUFHRQogICAgICAgICAgVk1TOiBUcmFuc2ZlciBpbiBpbWFnZSBtb2RlLiBOb24tVk1TOiBzYW1lIGFzIC9CSU5BUlkuIFNlZQogICAgICAgICAgY29tbWVudHMgdW5kZXIgUkVDRUlWRSAvQklOQVJZLgoKICAgL0xBQkVMRUQKICAgICAgICAgIFZNUyBhbmQgT1MvMiBvbmx5OiBTcGVjaWZpZXMgbGFiZWxlZCB0cmFuc2ZlciBtb2RlLiBTZWUKICAgICAgICAgIGNvbW1lbnRzIHVuZGVyIFJFQ0VJVkUgL0JJTkFSWS4KCiAgIC9NT1ZFLVRPOmRpcmVjdG9yeQogICAgICAgICAgVGhpcyB0ZWxscyBDLUtlcm1pdCB0byBtb3ZlIGVhY2ggZmlsZSB0aGF0IGlzIHN1Y2Nlc3NmdWxseQogICAgICAgICAgcmVjZWl2ZWQgdG8gdGhlIGdpdmVuIGRpcmVjdG9yeS4gRmlsZXMgdGhhdCBhcmUgbm90CiAgICAgICAgICBzdWNjZXNzZnVsbHkgcmVjZWl2ZWQgYXJlIG5vdCBtb3ZlZC4gQnkgZGVmYXVsdCwgZmlsZXMgYXJlIG5vdAogICAgICAgICAgbW92ZWQuCgogICAvUEFUSE5BTUVTOntBQlNPTFVURSxSRUxBVElWRSxPRkYsQVVUT30KICAgICAgICAgIFVzZSB0aGlzIHN3aXRjaCB0byBvdmVycmlkZSB0aGUgY3VycmVudCBnbG9iYWwgU0VUIFJFQ0VJVkUKICAgICAgICAgIFBBVEhOQU1FUyBzZXR0aW5nIGZvciB0aGlzIHRyYW5zZmVyIG9ubHkuIFNlZSBbNDk3XVNlY3Rpb24KICAgICAgICAgIDQuMTAuCgogICAvUkVDVVJTSVZFCiAgICAgICAgICBXaGVuIHVzZWQgd2l0aCB0aGUgUkVDRUlWRSBjb21tYW5kLCAvUkVDVVJTSVZFIGlzIHNpbXBseSBhCiAgICAgICAgICBzeW5vbnltIGZvciAvUEFUSE5BTUVTOlJFTEFUSVZFLgoKICAgL1JFTkFNRS1UTzpzdHJpbmcKICAgICAgICAgIFRoaXMgdGVsbHMgQy1LZXJtaXQgdG8gcmVuYW1lIGVhY2ggZmlsZSB0aGF0IGlzIHN1Y2Nlc3NmdWxseQogICAgICAgICAgcmVjZWl2ZWQgdG8gdGhlIGdpdmVuIHN0cmluZy4gRmlsZXMgdGhhdCBhcmUgbm90IHN1Y2Nlc3NmdWxseQogICAgICAgICAgcmVjZWl2ZWQgYXJlIG5vdCByZW5hbWVkLiBCeSBkZWZhdWx0LCBmaWxlcyBhcmUgbm90IHJlbmFtZWQuCiAgICAgICAgICBUaGUgc3RyaW5nIGNhbiBiZSBhIGxpdGVyYWwgc3RyaW5nLCB3aGljaCBpcyBhcHByb3ByaWF0ZSB3aGVuCiAgICAgICAgICBvbmx5IG9uZSBmaWxlIGlzIGJlaW5nIHJlY2VpdmVkLCBvciBpdCBjYW4gY29udGFpbiBvbmUgb3IgbW9yZQogICAgICAgICAgdmFyaWFibGVzIHRoYXQgYXJlIHRvIGJlIGV2YWx1YXRlZCBhdCB0aGUgdGltZSBlYWNoIGZpbGUgaXMKICAgICAgICAgIHJlY2VpdmVkLCBzdWNoIGFzIFx2KGZpbGVuYW1lKSwgXHYoZmlsZW51bWJlciksIFx2KG50aW1lKSwKICAgICAgICAgIFx2KHBpZCksIFx2KHVzZXIpLCBldGMuIFdBUk5JTkc6IGlmIHlvdSBnaXZlIGEgbGl0ZXJhbCBzdHJpbmcKICAgICAgICAgIGFuZCBtb3JlIHRoYW4gb25lIGZpbGUgYXJyaXZlcywgZWFjaCBpbmNvbWluZyBmaWxlIHdpbGwgYmUKICAgICAgICAgIGdpdmVuIHRoZSBzYW1lIG5hbWUgKGJ1dCBTRVQgRklMRSBDT0xMSVNJT04gQkFDS1VQIG9yIFJFTkFNRQogICAgICAgICAgY2FuIGJlIHVzZWQgdG8ga2VlcCB0aGUgaW5jb21pbmcgZmlsZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoCiAgICAgICAgICBvdGhlcikuCgogICAvUVVJRVQKICAgICAgICAgIFdoZW4gcmVjZWl2aW5nIGluIGxvY2FsIG1vZGUsIHRoaXMgc3VwcHJlc3NlcyB0aGUgZmlsZS10cmFuc2ZlcgogICAgICAgICAgZGlzcGxheS4KCiAgIC9URVhUCiAgICAgICAgICBSZWNlaXZlcyBpbiB0ZXh0IG1vZGUgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGdsb2JhbCB0cmFuc2ZlcgogICAgICAgICAgbW9kZS4gU2VlIGNvbW1lbnRzIHVuZGVyIFJFQ0VJVkUgL0JJTkFSWS4KCiAgIFRoZSAvTUFJTCBhbmQgL1BSSU5UIG9wdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUsIGJ1dCB5b3UgY2FuIHVzZQogICAvQ09NTUFORCB0byBhY2hpZXZlIHRoZSBzYW1lIGVmZmVjdCwgYXMgaW4gdGhlc2UgVU5JWCBleGFtcGxlczoKCiAgciAvY29tbWFuZCB7bWFpbCBrZXJtaXRAY29sdW1iaWEuZWR1fQogIHIgL2NvbW1hbmQgbHByCgogICBJbiBPUy8yIG9yIFdpbmRvd3MsIHlvdSBjYW4gUkVDRUlWRSBhbmQgcHJpbnQgbGlrZSB0aGlzOgoKICByZWNlaXZlIHBybgoKICAgVGhlIENSRUNFSVZFIGNvbW1hbmQgbm93IGFsc28gYWNjZXB0cyB0aGUgc2FtZSBzd2l0Y2hlcy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA0LjguIE1pbm9yIEtlcm1pdCBQcm90b2NvbCBJbXByb3ZlbWVudHMKCiAgICA0LjguMS4gTXVsdGlwbGUgQXR0cmlidXRlIFBhY2tldHMKCiAgIEMtS2VybWl0IDcuMCBub3cgc2VuZHMgbW9yZSB0aGFuIG9uZSBBdHRyaWJ1dGUgcGFja2V0IGlmIGEgZmlsZSdzCiAgIGF0dHJpYnV0ZXMgZG8gbm90IGZpdCBpbnRvIGEgc2luZ2xlIHBhY2tldCBvZiB0aGUgbmVnb3RpYXRlZCBsZW5ndGguCiAgIElmIGEgcGFydGljdWxhciBhdHRyaWJ1dGUgKHN1Y2ggYXMgZmlsZSBjcmVhdGlvbiBkYXRlLXRpbWUpIGRvZXMgbm90CiAgIGZpdCB3aXRoaW4gdGhlIG5lZ290aWF0ZWQgbGVuZ3RoICh3aGljaCB3aWxsIG9ubHkgaGFwcGVuIHdoZW4gdGhlCiAgIG5lZ290aWF0ZWQgbGVuZ3RoIGlzIGFyb3VuZCAyMCBvciBsZXNzKSwgdGhhdCBhdHRyaWJ1dGUgaXMgbm90IHNlbnQgYXQKICAgYWxsLgoKICAgIDQuOC4yLiBWZXJ5IFNob3J0IFBhY2tldHMKCiAgIFRoZXJlIGFyZSBjZXJ0YWluIHNpdHVhdGlvbnMgd2hlcmUgZXh0cmVtZWx5IHNob3J0IHBhY2tldHMgbXVzdCBiZQogICB1c2VkOyAyMCBvciAzMCBieXRlcyBhdCBtb3N0LiBUaGlzIGNhbiBoYXBwZW4gd2hlbiBvbmUgb3IgbW9yZSBkZXZpY2VzCiAgIGFsb25nIHRoZSBjb21tdW5pY2F0aW9uIHBhdGggaGF2ZSB2ZXJ5IHNtYWxsIGJ1ZmZlcnMgYW5kIGxhY2sgYW4KICAgZWZmZWN0aXZlIG1lYW5zIG9mIGZsb3cgY29udHJvbC4gRXhhbXBsZXMgYXJlIHNvbWV0aW1lcyBjaXRlZAogICBpbnZvbHZpbmcgcmFkaW8gbW9kZW1zLgoKICAgV2hlbiB0aGUgbWF4aW11bSBwYWNrZXQgbGVuZ3RoIGlzIHNob3J0ZXIgdGhhbiBjZXJ0YWluIHBhY2tldHMgdGhhdAogICB3b3VsZCBiZSBzZW50LCB0aG9zZSBwYWNrZXRzIGFyZSBlaXRoZXIgdHJ1bmNhdGVkIG9yIGVsc2UgYnJva2VuIHVwCiAgIGludG8gbXVsdGlwbGUgcGFja2V0cy4gU3BlY2lmaWNhbGx5OgoKICAgIDEuIFBhcmFtZXRlciBuZWdvdGlhdGlvbiBwYWNrZXRzIChJLCBTLCBhbmQgdGhlaXIgQUNLcykgYXJlIHRydW5jYXRlZAogICAgICAgdG8gdGhlIG5lZ290aWF0ZWQgbGVuZ3RoLiBBbnkgcGFyYW1ldGVycyB0aGF0IGRvIG5vdCBmaXQgYXJlIHJlc2V0CiAgICAgICB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGluIHRoZSBLZXJtaXQKICAgICAgIHByb3RvY29sIGZvciBmcmFnbWVudGF0aW9uIGFuZCByZWFzc2VtYmx5IG9mIHBhcmFtZXRlciBzdHJpbmdzLgogICAgMi4gRmlsZSBoZWFkZXIgcGFja2V0cyAoY29udGFpbmluZyB0aGUgZmlsZW5hbWUpIGFyZSBzaW1wbHkKICAgICAgIHRydW5jYXRlZC4gVGhlcmUgaXMgbm8gcHJvdmlzaW9uIGluIHRoZSBLZXJtaXQgcHJvdG9jb2wgZm9yCiAgICAgICBmcmFnbWVudGF0aW9uIGFuZCByZWFzc2VtYmx5IG9mIGZpbGVuYW1lcy4KICAgIDMuIEF0dHJpYnV0ZSBwYWNrZXRzIGFyZSBmcmFnbWVudGVkIGFuZCByZWFzc2VtYmxlZCBhcyBkZXNjcmliZWQgaW4KICAgICAgIDQuOC4xIHdpdGhvdXQgbG9zcyBvZiBkYXRhLCBleGNlcHQgaW4gY2FzZSBhIGZpZWxkIHdpbGwgbm90IGZpdCBhdAogICAgICAgYWxsIGluIHRoZSBuZWdvdGlhdGVkIGxlbmd0aCAodGhlIGxvbmdlc3QgYXR0cmlidXRlIGlzIHVzdWFsbHkgdGhlCiAgICAgICBkYXRlIGFuZCB0aW1lIG9mIGZpbGUgY3JlYXRpb24vbW9kaWZpY2F0aW9uKSBiZWNhdXNlIG9mIHRoZSBydWxlCiAgICAgICB0aGF0IGF0dHJpYnV0ZXMgbWF5IG5vdCBiZSBicm9rZW4gYWNyb3NzIHBhY2tldHMuCiAgICA0LiBEYXRhIHBhY2tldHMgYW5kIG90aGVyIHBhY2tldHMgYXJlIHVuYWZmZWN0ZWQgLS0gdGhleSBjYW4gYmUgYXMKICAgICAgIHNob3J0IGFzIHRoZXkgbmVlZCB0byBiZSwgd2l0aGluIHJlYXNvbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA0LjkuIFdpbGRjYXJkIC8gRmlsZSBHcm91cCBFeHBhbnNpb24KCiAgICJXaWxkY2FyZCIgcmVmZXJzIHRvIHRoZSBub3RhdGlvbiB1c2VkIGluIGZpbGVuYW1lcyB0byBzcGVjaWZ5IGEgZ3JvdXAKICAgb2YgZmlsZXMgYnkgcGF0dGVybiBtYXRjaGluZy4KCiAgICA0LjkuMS4gSW4gVU5JWCBDLUtlcm1pdAoKICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCBDLUtlcm1pdCB3YXMgY2FwYWJsZSBvZiBleHBhbmRpbmcgd2lsZGNhcmQKICAgc3RyaW5ncyBjb250YWluaW5nIG9ubHkgdGhlICJtZXRhY2hhcmFjdGVycyIgJyonIGFuZCAnPyc6CgogICAqCiAgICAgICAgICBNYXRjaGVzIGFueSBzZXF1ZW5jZSBvZiB6ZXJvIG9yIG1vcmUgY2hhcmFjdGVycy4gRm9yIGV4YW1wbGU6CiAgICAgICAgICAiY2sqLmMiIG1hdGNoZXMgYWxsIGZpbGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggImNrIiBhbmQgZW5kCiAgICAgICAgICB3aXRoICIuYyIsIGluY2x1ZGluZyAiY2suYyIuCgogICA/CiAgICAgICAgICBNYXRjaGVzIGFueSBzaW5nbGUgY2hhcmFjdGVyLiBGb3IgZXhhbXBsZSwgImNrPy5jIiBtYXRjaGVzIGFsbAogICAgICAgICAgZmlsZXMgd2hvc2UgbmFtZXMgYXJlIGV4YWN0bHkgNSBjaGFyYWN0ZXJzIGxvbmcgYW5kIHN0YXJ0IHdpdGgKICAgICAgICAgICJjayIgYW5kIGVuZCB3aXRoICIuYyIuIFdoZW4gdHlwaW5nIGNvbW1hbmRzIGF0IHRoZSBwcm9tcHQsIHlvdQogICAgICAgICAgbXVzdCBwcmVjZWRlIGFueSBxdWVzdGlvbiBtYXJrIHRvIGJlIHVzZWQgZm9yIG1hdGNoaW5nIGJ5IGEKICAgICAgICAgIGJhY2tzbGFzaCAoXCkgdG8gb3ZlcnJpZGUgdGhlIG5vcm1hbCBmdW5jdGlvbiBvZiBxdWVzdGlvbiBtYXJrLAogICAgICAgICAgd2hpY2ggaXMgcHJvdmlkaW5nIG1lbnVzIGFuZCBmaWxlIGxpc3RzLgoKICAgQy1LZXJtaXQgNy4wIGFkZHMgdGhlIGFkZGl0aW9uYWwgZmVhdHVyZXMgdGhhdCB1c2VycyBvZiBrc2gsIGNzaCwgYW5kCiAgIGJhc2ggYXJlIGFjY3VzdG9tZWQgdG86CgogICBbYWJjXQogICAgICAgICAgU3F1YXJlIGJyYWNrZXRzIGVuY2xvc2luZyBhIGxpc3Qgb2YgY2hhcmFjdGVycyBtYXRjaGVzIGFueQogICAgICAgICAgc2luZ2xlIGNoYXJhY3RlciBpbiB0aGUgbGlzdC4gRXhhbXBsZTogY2t1dXNyLltjaF0gbWF0Y2hlcwogICAgICAgICAgY2t1dXNyLmMgYW5kIGNrdXVzci5oLgoKICAgW2Etel0KICAgICAgICAgIFNxdWFyZSBicmFja2V0cyBlbmNsb3NpbmcgYSByYW5nZSBvZiBjaGFyYWN0ZXJzOyB0aGUgaHlwaGVuCiAgICAgICAgICBzZXBhcmF0ZXMgdGhlIGxvdyBhbmQgaGlnaCBlbGVtZW50cyBvZiB0aGUgcmFuZ2UuIEZvciBleGFtcGxlLAogICAgICAgICAgW2Etel0gbWF0Y2hlcyBhbnkgY2hhcmFjdGVyIGZyb20gYSB0byB6LgoKICAgW2FjZG0tel0KICAgICAgICAgIExpc3RzIGFuZCByYW5nZXMgbWF5IGJlIGNvbWJpbmVkLiBUaGlzIGV4YW1wbGUgbWF0Y2hlcyBhLCBjLCBkLAogICAgICAgICAgb3IgbSB0aHJvdWdoIHouCgogICB7c3RyaW5nMSxzdHJpbmcyLC4uLn0KICAgICAgICAgIEJyYWNlcyBlbmNsb3NlIGEgbGlzdCBvZiBzdHJpbmdzIHRvIGJlIG1hdGNoZWQuIEZvciBleGFtcGxlOgogICAgICAgICAgY2t7dWZpbyx2Y29uLGNtYWl9LmMgbWF0Y2hlcyBja3VmaW8uYywgY2t2Y29uLmMsIG9yIGNrY21haS5jLgogICAgICAgICAgVGhlIHN0cmluZ3MgbWF5IHRoZW1zZWx2ZXMgY29udGFpbiBtZXRhY2hhcmFjdGVycywgYnJhY2tldAogICAgICAgICAgbGlzdHMsIG9yIGluZGVlZCwgb3RoZXIgbGlzdHMgb2Ygc3RyaW5ncywgYnV0ICh3aGVuIG1hdGNoaW5nCiAgICAgICAgICBmaWxlbmFtZXMpIHRoZXkgbWF5IG5vdCBjb250YWluIGRpcmVjdG9yeSBzZXBhcmF0b3JzLgoKICAgICAgICAgIFRodXMsIHRoZSBtZXRhY2hhcmFjdGVycyBpbiBmaWxlbmFtZXMgKGFuZCBpbiBhbnkgb3RoZXIgZmllbGQKICAgICAgICAgIHRoYXQgY2FuIGJlIGEgcGF0dGVybiwgc3VjaCBhcyB0aGUgSUYgTUFUQ0ggcGF0dGVybiwgU0VORCBvcgogICAgICAgICAgR0VUIGV4Y2VwdGlvbiBsaXN0cywgZXRjKSBhcmU6CgogKiA/IFsgewoKICAgICAgICAgIEFuZCB3aXRoaW4gYnJhY2VzIG9ubHksIGNvbW1hICgsKSBpcyBhIG1ldGFjaGFyYWN0ZXIuCgogICBUbyBpbmNsdWRlIGEgbWV0YWNoYXJhY3RlciBpbiBhIHBhdHRlcm4gbGl0ZXJhbGx5LCBwcmVjZWRlIGl0IHdpdGggYQogICBiYWNrc2xhc2ggJ1wnIChvciB0d28gaWYgeW91IGFyZSBwYXNzaW5nIHRoZSBwYXR0ZXJuIHRvIGEgbWFjcm8pLgogICBFeGFtcGxlczoKCiAgc2VuZCBhKmIgICAgICA7IFNlbmQgYWxsIGZpbGVzIHdob3NlIG5hbWVzIHN0YXJ0IHdpdGggJ2EnIGFuZCBlbmQgd2l0aCAnYicuCiAgc2VuZCBhP2IgICAgICA7IERpdHRvLCBidXQgdGhlIG5hbWUgbXVzdCBiZSBleGFjdGx5IHRocmVlIGNoYXJhY3RlcnMgbG9uZy4KICBzZW5kIGFbYS16XWIgIDsgRGl0dG8sIGJ1dCB0aGUgc2Vjb25kIGNoYXJhY3RlciBtdXN0IGJlIGEgbG93ZXJjYXNlIGxldHRlci4KICBzZW5kIGFbeFwtel1iIDsgRGl0dG8sIGV4Y2VwdCB0aGUgc2Vjb25kIGNoYXJhY3RlciBtdXN0IGJlICd4JywgJy0nLCBvciAneScuCiAgc2VuZCBhW2doaV1iICA7IERpdHRvLCBleGNlcHQgdGhlIHNlY29uZCBjaGFyYWN0ZXIgbXVzdCBiZSAnZycsICdoJywgb3IgJ2knLgogIHNlbmQgYVs/Kl1iICAgOyBEaXR0bywgZXhjZXB0IHRoZSBzZWNvbmQgY2hhcmFjdGVyIG11c3QgYmUgJz8nIG9yICcqJy4KICBzZW5kIGFbXD9cKl1iIDsgU2FtZSBhcyBwcmV2aW91cy4KICBzZW5kICo/W2Etel0qIDsgQWxsIGZpbGVzIHdpdGggbmFtZXMgY29udGFpbmluZyBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyCiAgICAgICAgICAgICAgICA7IHRoYXQgaXMgZm9sbG93ZWQgYnkgYSBsb3dlcmNhc2UgbGV0dGVyLgoKICAgT3IsIG1vcmUgcHJhY3RpY2FsbHk6CgogIHNlbmQgY2tbY3V3XSouW2N3aF0gIDsgU2VuZCB0aGUgVU5JWCBDLUtlcm1pdCBzb3VyY2UgZmlsZXMuCgogICBUbyByZWZlciB0byB0aGUgQy1LZXJtaXQgc291cmNlcyBmaWxlcyBhbmQgbWFrZWZpbGUgYWxsIGluIG9uZQogICBmaWxlc3BlYzoKCiAge3ttYWtlZmlsZSxja1tjdXddKi5bY3doXX19CgogICAoTk9URTogaWYgdGhlIGVudGlyZSBwYXR0ZXJuIGlzIGEge3N0cmluZ2xpc3R9LCB5b3UgbXVzdCBlbmNsb3NlIGl0IGl0CiAgIFRXTyBwYWlycyBvZiBicmFjZXMsIHNpbmNlIHRoZSBTRU5EIGNvbW1hbmQgc3RyaXBzIHRoZSBvdXRlciBicmFjZQogICBwYWlyLCBiZWNhdXNlIG9mIHRoZSAiZW5jbG9zZSBpbiBicmFjZXMgaWYgdGhlIGZpbGVuYW1lIGNvbnRhaW5zCiAgIHNwYWNlcyIgcnVsZSkuCgogICBJZiB0aGUgbWFrZWZpbGUgaXMgY2FsbGVkIGNrdWtlci5tYWs6CgogIGNrW2N1d10qLntbY3doXSxtYWt9CgogICAoTk9URTogZG91YmxlIGJyYWNlcyBhcmUgbm90IG5lZWRlZCBoZXJlIHNpbmNlIHRoZSBwYXR0ZXJuIGRvZXMgbm90CiAgIGJvdGggYmVnaW4gYW5kIGVuZCB3aXRoIGEgYnJhY2UuKQoKICAgVG8gYWRkIGluIGFsbCB0aGUgQy1LZXJtaXQgdGV4dCBmaWxlczoKCiAgY2tbY3V3XSoue1tjd2hdLG1hayx0eHR9CgogICBBbGwgb2YgdGhlc2UgZmVhdHVyZXMgY2FuIGJlIHVzZWQgYW55d2hlcmUgeW91IHdvdWxkIHR5cGUgYSBmaWxlbmFtZQogICB0aGF0IGlzIGFsbG93ZWQgdG8gY29udGFpbiB3aWxkY2FyZHMuCgogICBXaGVuIHlvdSBhcmUgdHlwaW5nIGF0IHRoZSBjb21tYW5kIHByb21wdCwgYW4gZXh0cmEgbGV2ZWwgb2YgcXVvdGluZwogICBpcyByZXF1aXJlZCBmb3IgdGhlICc/JyBjaGFyYWN0ZXIgdG8gZGVmZWF0IGl0cyByZWd1bGFyIGZ1bmN0aW9uIG9mCiAgIHByb2R1Y2luZyBhIGxpc3Qgb2YgZmlsZXMgdGhhdCBtYXRjaCB3aGF0IHlvdSBoYXZlIHR5cGVkIHNvIGZhciwgZm9yCiAgIGV4YW1wbGU6CgogIHNlbmQgY2tbY3VdPwoKICAgbGlzdHMgYWxsIHRoZSBmaWxlcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGNrYyBhbmQgY2t1LiBJZiB5b3UgcXVvdGUKICAgdGhlIHF1ZXN0aW9uIG1hcmssIGl0IGlzIHVzZWQgYXMgYSBwYXR0ZXJuLW1hdGNoaW5nIGNoYXJhY3RlciwgZm9yCiAgIGV4YW1wbGU6CgogIHNlbmQgY2tcP1tmdF1pby5jCgogICBzZW5kcyBhbGwgdGhlIGZpbGUgYW5kIGNvbW11bmljYXRpb25zIGkvbyBtb2R1bGVzIGZvciBhbGwgdGhlCiAgIHBsYXRmb3JtczogY2t1ZmlvLmMsIGNrdXRpby5jLCBja3ZmaW8uYywgY2t2dGlvLmMsIGV0Yy4KCiAgIElmLCBob3dldmVyLCBhIGZpbGVuYW1lIGFjdHVhbGx5IGNvbnRhaW5zIGEgcXVlc3Rpb24gbWFyayBhbmQgeW91IG5lZWQKICAgdG8gcmVmZXIgdG8gaXQgb24gdGhlIGNvbW1hbmQgbGluZSwgeW91IG11c3QgdXNlIHRocmVlICgzKQogICBiYWNrc2xhc2hlcy4gRm9yIGV4YW1wbGUsIGlmIHRoZSBmaWxlIGlzIGFjdHVhbGx5IGNhbGxlZCBjaz9maW8uYywgeW91CiAgIHdvdWxkIHVzZToKCiAgc2VuZCBja1xcXD9maW8uYwoKICAgRnVydGhlciBub3RlcyBvbiBxdW90aW5nOgoKICAgICAqIEEgc2luZ2xlIGJhY2tzbGFzaCBpcyBzdWZmaWNpZW50IGZvciBxdW90aW5nIGEgc3BlY2lhbCBjaGFyYWN0ZXIKICAgICAgIGF0IHRoZSBjb21tYW5kIHByb21wdCBvciBpbiBhIGNvbW1hbmQgZmlsZS4gSG93ZXZlciwgd2hlbiBwYXNzaW5nCiAgICAgICBwYXR0ZXJucyB0byBtYWNyb3MgeW91J2xsIG5lZWQgZG91YmxlIGJhY2tzbGFzaGVzLCBhbmQgd2hlbgogICAgICAgcmVmZXJyaW5nIHRvIHRoZXNlIHBhdHRlcm5zIHdpdGhpbiB0aGUgbWFjcm8sIHlvdSdsbCBuZWVkIHRvIHVzZQogICAgICAgXGZjb250ZW50cyhcJTEpIChzZWUgWzQ5OF1TZWN0aW9uIDEuMTEuNSkuIFlvdSBzaG91bGQgZW5jbG9zZQogICAgICAgbWFjcm8gYXJndW1lbnQgcmVmZXJlbmNlcyBpbiBicmFjZXMgaW4gY2FzZSBncm91cGVkIGFyZ3VtZW50cyB3ZXJlCiAgICAgICBwYXNzZWQuIEV4YW1wbGU6CiBkZWZpbmUgaXNtYXRjaCB7CiAgICAgaWYgbWF0Y2gge1xmY29udChcJTEpfSB7XGZjb250KFwlMil9IHsKICAgICAgICAgZW5kIDAgTUFUQ0gKICAgICB9IGVsc2UgewogICAgICAgICBlbmQgMSBOTyBNQVRDSAogICAgIH0KIH0KIGlzbWF0Y2ggYWIqeXogYSpcXCoqeiAgICAgICAgICAgOyBCYWNrc2xhc2ggbXVzdCBiZSBkb3VibGVkCiBpc21hdGNoIHthYmMgZGVmIHh5en0gKmIqZSp5KiAgIDsgQnJhY2VzIG11c3QgYmUgdXNlZCBmb3IgZ3JvdXBpbmcKICAgICAqIFdhdGNoIG91dCBmb3IgcG9zc2libGUgY29uZmxpY3RzIGJldHdlZW4ge30gaW4gZmlsZW5hbWUgcGF0dGVybnMKICAgICAgIGFuZCB7fSB1c2VkIGZvciBncm91cGluZyBtdWx0aXBsZSB3b3JkcyBpbnRvIGEgc2luZ2xlIGZpZWxkLCB3aGVuCiAgICAgICB0aGUgcGF0dGVybiBoYXMgb3V0ZXIgYnJhY2VzLiBGb3IgZXhhbXBsZSwgaW46CiAgICAgaWYgbWF0Y2gge2FiYyB4eXp9IHthKiAqen0gZWNobyBUSEVZIE1BVENICiAgICAgICBicmFjZXMgbXVzdCBiZSB1c2VkIHRvIGdyb3VwICJhYmMgeHl6IiBpbnRvIGEgc2luZ2xlIHN0cmluZy4KICAgICAgIEtlcm1pdCBzdHJpcHMgb2ZmIHRoZSBicmFjZXMgYmVmb3JlIGNvbXBhcmluZyB0aGUgc3RyaW5nIHdpdGggdGhlCiAgICAgICBwYXR0ZXJuLiBUaGVyZWZvcmU6CiBpZiBtYXRjaCBtYWtlZmlsZSB7bWFrZWZpbGUsTWFrZWZpbGV9IGVjaG8gVEhFWSBNQVRDSAogICAgICAgZG9lcyBub3Qgd29yaywgYnV0OgogaWYgbWF0Y2ggbWFrZWZpbGUge3ttYWtlZmlsZSxNYWtlZmlsZX19IGVjaG8gVEhFWSBNQVRDSAogICAgICAgZG9lcy4KICAgICAqIElmIHlvdSB1c2UgYSBwYXR0ZXJuIHRoYXQgaGFzIG91dGVyIGJyYWNlcywgbGlrZSB7Ki50eHQsKi5kb2N9LCBpbgogICAgICAgYSBmaWVsZCB0aGF0IGFjY2VwdHMgYSBwYXR0ZXJuIGxpc3QgKGxpa2UgU0VORCAvRVhDRVBUOnh4eCksCiAgICAgICB5b3UnbGwgbmVlZCB0byBhZGQgdHdvIGV4dHJhIHNldHMgb2Ygb3V0ZXIgYnJhY2VzOgogc2VuZCAvZXhjZXB0Ont7eyoudHh0LCouZG9jfX19ICouKgoKICAgQy1LZXJtaXQncyBuZXcgcGF0dGVybiBtYXRjaGluZyBjYXBhYmlsaXRpZXMgYXJlIGFsc28gdXNlZCB3aGVuCiAgIEMtS2VybWl0IGlzIGluIHNlcnZlciBtb2RlLCBzbyBub3cgeW91IGNhbiBzZW5kIHJlcXVlc3RzIHN1Y2ggYXM6CgogIGdldCBja1tjdXddKi5bY3doXQoKICAgdG8gYSBDLUtlcm1pdCBzZXJ2ZXIgd2l0aG91dCBoYXZpbmcgdG8gdGVsbCBpdCB0byBTRVQgV0lMRCBTSEVMTAogICBmaXJzdC4gUHJldmlvdXNseSB0aGlzIHdvdWxkIGhhdmUgcmVxdWlyZWQ6CgogIG1nZXQgY2tjKi5jIGNrYyoudyBja2MqLmggY2t1Ki5jIGNrdSoudyBja3UqLmggY2t3Ki5jIGNrdyoudyBja3cqLmgKCiAgIFRoZSBuZXcgcGF0dGVybiBtYXRjaGluZyBmZWF0dXJlcyBtYWtlIFNFVCBXSUxEIFNIRUxMIHJlZHVuZGFudCwgYW5kCiAgIGJhcnJpbmcgYW55IG9iamVjdGlvbnMsIGl0IHdpbGwgZXZlbnR1YWxseSBiZSBwaGFzZWQgb3V0LiAoT25lCiAgIHBvc3NpYmxlIHJlYXNvbiBmb3IgcmV0YWluaW5nIGl0IHdvdWxkIGJlIGFzIGFuIGVzY2FwZSBtZWNoYW5pc20gd2hlbgogICBLZXJtaXQgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgdW5kZXJseWluZyBmaWxlIHN5c3RlbS4pCgogICBCeSB0aGUgd2F5LCBwYXR0ZXJucyBzdWNoIGFzIHRoZXNlIGFyZSBzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMKICAgInJlZ3VsYXIgZXhwcmVzc2lvbnMiLCBidXQgdGhleSBhcmUgbm90IHF1aXRlIHRoZSBzYW1lLiBJbiBhIHRydWUKICAgcmVndWxhciBleHByZXNzaW9uIChmb3IgZXhhbXBsZSksICIqIiBtZWFucyAiemVybyBvciBtb3JlIHJlcGV0aXRpb25zCiAgIG9mIHRoZSBwcmV2aW91cyBpdGVtIiwgc28gKGZvciBleGFtcGxlKSwgIihbMC05XSopIiB3b3VsZCBtYXRjaCB6ZXJvCiAgIG9yIG1vcmUgZGlnaXRzIGluIHBhcmVudGhlc2VzLiBJbiBLZXJtaXQgKGFuZCBpbiBtb3N0IHNoZWxscyksIHRoaXMKICAgbWF0Y2hlcyBvbmUgZGlnaXQgZm9sbG93ZWQgYnkgemVybyBvciBtb3JlIGNoYXJhY3RlcnMsIHdpdGhpbgogICBwYXJlbnRoZXNlcy4gSGVyZSBhcmUgc29tZSBoaW50czoKCiAgICAgKiBBbHRob3VnaCB5b3UgY2FuJ3QgbWF0Y2ggYW55IHNlcXVlbmNlIG9mIGRpZ2l0cyAob3IgbGV0dGVycywgZXRjKSwKICAgICAgIHlvdSBjYW4gbWF0Y2ggKHNheSkgMSwgMiwgb3IgMyBvZiB0aGVtIGluIHJvdy4gRm9yIGV4YW1wbGUsIHRoZQogICAgICAgZm9sbG93aW5nIHBhdHRlcm4gbWF0Y2hlcyBLZXJtaXQgYmFja3VwIGZpbGVzICh3aXRoIGJhY2t1cCBudW1iZXJzCiAgICAgICBmcm9tIDEgdG8gOTk5KToKICoufntbMS05XSxbMS05XVswLTldLFsxLTldWzAtOV1bMC05XX1+CiAgICAgKiBUaGVyZSBpcyBwcmVzZW50bHkgbm8gTk9UIG9wZXJhdG9yLCBzbyBubyB3YXkgdG8gbWF0Y2ggYW55CiAgICAgICBjaGFyYWN0ZXIgb3Igc3RyaW5nIEVYQ0VQVCB0aGUgb25lKHMpIHNob3duLgoKICAgSW4gb3RoZXIgd2lsZGNhcmRpbmcgbmV3cy4uLgoKICAgICAqIFlvdSBtYXkgbm93ICJzZW5kIHh4eCIgd2hlcmUgInh4eCIgaXMgYSBkaXJlY3RvcnkgbmFtZSwgYW5kIHRoaXMKICAgICAgIHdpbGwgc2VuZCBhbGwgdGhlIGZpbGVzIGZyb20gdGhlIGRpcmVjdG9yeSB4eHgsIGFzIGlmIHlvdSBoYWQKICAgICAgIHR5cGVkICJzZW5kIHh4eC8qIi4gWW91IGNhbiBhbHNvIHVzZSB0aGUgc3BlY2lhbCBzaG9ydGhhbmQgInNlbmQKICAgICAgIC4iIHRvIHNlbmQgYWxsIHRoZSBmaWxlcyBmcm9tIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KICAgICAqIFRvIGVhc2lseSBza2lwIG92ZXIgYmFja3VwIGZpbGVzICh0aGUgb25lcyB3aG9zZSBuYW1lcyBlbmQgbGlrZQogICAgICAgLn4yMn4pIHdoZW4gc2VuZGluZywgeW91IGNhbiB1c2UgU0VORCAvTk9CQUNLVVAgKHNlZSBbNDk5XVNlY3Rpb24KICAgICAgIDQuMC42IGZvciBkZXRhaWxzKS4KICAgICAqIFdoZW4gY2hvb3NpbmcgS2VybWl0IHRvIGV4cGFuZCB3aWxkY2FyZHMsIHJhdGhlciB0aGFuIHRoZSBzaGVsbCwKICAgICAgIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgImRvdCBmaWxlcyIgLS0gZmlsZXMgd2hvc2UgbmFtZXMgYmVnaW4gd2l0aAogICAgICAgIi4iLCB3aGljaCBhcmUgbm9ybWFsbHkgImludmlzaWJsZSIgLS0gc2hvdWxkIGJlIG1hdGNoZWQ6CiBTRVQgV0lMRCBLRVJNSVQgL05PLU1BVENILURPVC1GSUxFUyAodGhpcyBpcyB0aGUgZGVmYXVsdCkKIFNFVCBXSUxEIEtFUk1JVCAvTUFUQ0gtRE9ULUZJTEVTICAgICh0aGlzIGFsbG93cyBtYXRjaGluZyBvZiAiLiIgZmlsZXMpCiAgICAgICBvciBpbmNsdWRlIHRoZSAvRE9URklMRVMgb3IgL05PRE9URklMRVMgc3dpdGNoIG9uIHRoZSBjb21tYW5kIHlvdQogICAgICAgYXJlIHVzaW5nLCBzdWNoIGFzIFNFTkQgb3IgRElSRUNUT1JZLgogICAgICogQ29tbWFuZHMgc3VjaCBhcyBESVJFQ1RPUlkgYW5kIFNFTkQgYWxsb3cgcmVjdXJzaXZlIGRpcmVjdG9yeQogICAgICAgdHJhdmVyc2FsLiBUaGVyZSBhcmUgYWxzbyBuZXcgZnVuY3Rpb25zIGZvciB0aGlzIHRvIHVzZSBpbgogICAgICAgc2NyaXB0cy4gU2VlIFs1MDBdU2VjdGlvbiA0LjExIGZvciBkZXRhaWxzLgoKICAgV2hlbiBidWlsZGluZyBmaWxlIGxpc3RzIGluIFVOSVgsIEMtS2VybWl0IGZvbGxvd3Mgc3ltYm9saWMgbGlua3MuCiAgIEJlY2F1c2Ugb2YgdGhpcywgeW91IG1pZ2h0IGVuY291bnRlciBhbnkgb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcKICAgcGhlbm9tZW5hOgoKICAgICAqIE11bHRpcGxlIGNvcGllcyBvZiB0aGUgc2FtZSBmaWxlOyBlLmcuIG9uZSBmcm9tIGl0cyByZWFsIGRpcmVjdG9yeQogICAgICAgYW5kIG90aGVycyBmcm9tIGxpbmtzIHRvIGl0cyByZWFsIGRpcmVjdG9yeSwgaWYgYm90aCB0aGUgcmVhbAogICAgICAgZGlyZWN0b3J5IGFuZCB0aGUgbGlua3MgdG8gaXQgYXJlIGluIHRoZSB3aWxkY2FyZCBleHBhbnNpb24gbGlzdC4KICAgICAqIEEgY29tbWFuZCBtaWdodCB1bmV4cGVjdGVkbHkgImhhbmciIGZvciBhIGxvbmcgdGltZSBiZWNhdXNlIGFuIE5GUwogICAgICAgbGluayBtaWdodCBub3QgYmUgcmVzcG9uZGluZywgb3IgdGhlIGRpcmVjdG9yeSB5b3UgYXJlIGxvb2tpbmcgYXQKICAgICAgIGNvbnRhaW5zIGEgbGluayB0byBhIGh1Z2UgZGlyZWN0b3J5IHRyZWUgKGV4YW1wbGU6ICJkaXJlY3RvcnkKICAgICAgIC9yZWN1cnNpdmUgL2V0YyIgd2hlbiAvZXRjL3Nwb29sIGlzIGEgc3ltbGluayB0byAvdmFyL3Nwb29sLCB3aGljaAogICAgICAgaXMgYSBsYXJnZSBvcmdhbml6YXRpb24ncyBpbmNvbWluZyBlbWFpbCBkaXJlY3RvcnksIGNvbnRhaW5pbmcKICAgICAgIHRlbnMgb2YgdGhvdXNhbmRzIG9mIHN1YmRpcmVjdG9yaWVzKS4KCiAgIFRoZSBzaXplIG9mIHRoZSBmaWxlIGxpc3QgdGhhdCBLZXJtaXQgY2FuIGJ1aWxkIGlzIGxpbWl0ZWQgaW4gbW9zdAogICBDLUtlcm1pdCBpbXBsZW1lbnRhdGlvbnMuIFRoZSBsaW1pdCwgaWYgYW55LCBkZXBlbmRzIG9uIHRoZQogICBpbXBsZW1lbnRhdGlvbi4gVXNlIHRoZSBTSE9XIEZFQVRVUkVTIGNvbW1hbmQgYW5kIGxvb2sgaW4gdGhlCiAgIGFscGhhYmV0aXplZCBvcHRpb25zIGxpc3QgZm9yIE1BWFdMRCB0byBzZWUgdGhlIHZhbHVlLgoKICAgIDQuOS4yLiBJbiBLZXJtaXQgOTUKCiAgIEtlcm1pdCA5NSAxLjEuMTkgYW5kIGxhdGVyIHVzZXMgdGhlIHNhbWUgcGF0dGVybiBtYXRjaGluZyBzeW50YXggYXMgaW4KICAgVU5JWCwgYnV0IChhcyBhbHdheXMpIHlvdSB3aWxsIGVuY291bnRlciBudW1lcm91cyBkaWZmaWN1bHRpZXMgaWYgeW91CiAgIHVzZSBiYWNrc2xhc2ggKFwpIGFzIHRoZSBkaXJlY3Rvcnkgc2VwYXJhdG9yLiBJbiBhbnkgY29tbWFuZCB3aGVyZSBLOTUKICAgcGFyc2VzIGZpbGVuYW1lcyBpdHNlbGYgKHRoYXQgaXMsIHByYWN0aWNhbGx5IGFueSBmaWxlLW9yaWVudGVkCiAgIGNvbW1hbmQgZXhjZXB0IFJVTiksIHlvdSBjYW4gdXNlIGZvcndhcmQgc2xhc2ggKC8pIGFzIHRoZSBkaXJlY3RvcnkKICAgc2VwYXJhdG9yIHRvIGF2b2lkIGFsbCB0aGUgbmFzdHkgY29uZmxpY3RzLgoKICAgIDQuOS4zLiBJbiBWTVMsIEFPUy9WUywgT1MtOSwgVk9TLCBldGMuCgogICBQbGF0Zm9ybXMgb3RoZXIgdGhhbiBVTklYLCBXaW5kb3dzIDk1Lzk4L05ULCBhbmQgT1MvMiBoYXZlIHRoZWlyIG93bgogICBmaWxlbmFtZSBtYXRjaGluZyBjYXBhYmlsaXRpZXMgdGhhdCBhcmUsIGluIGdlbmVyYWwsIGRpZmZlcmVudCBmcm9tCiAgIEtlcm1pdCdzIGJ1aWx0LWluIG9uZXMgYW5kIGluIGFueSBjYXNlIG1pZ2h0IGNvbmZsaWN0IHdpdGggdGhlbS4gRm9yCiAgIGV4YW1wbGUsIFtdIGVuY2xvc2VzIGRpcmVjdG9yeSBuYW1lcyBpbiBWTVMuCgogICBOZXZlcnRoZWxlc3MgeW91IGNhbiBzdGlsbCB1c2UgYWxsIHRoZSBwYXR0ZXJuLW1hdGNoaW5nIGNhcGFiaWxpdGllcwogICBkZXNjcmliZWQgaW4gWzUwMV1TZWN0aW9uIDQuOS4xIGJ5IGxvYWRpbmcgYSBmaWxlIGxpc3QgaW50byBhbiBhcnJheQogICAoZS5nLiB3aXRoIFxmZmlsZXMoKiwmYSksIHNlZSBbNTAyXVNlY3Rpb24gNC4xMS4zKSBhbmQgdGhlbiB1c2luZyBJRgogICBNQVRDSCBvbiB0aGUgbWVtYmVycy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA0LjEwLiBBZGRpdGlvbmFsIFBhdGhuYW1lIENvbnRyb2xzCgogICBJbiB2ZXJzaW9uIDYuMCBhbmQgZWFybGllciwgQy1LZXJtaXQncyBTRVQgeyBTRU5ELCBSRUNFSVZFIH0gUEFUSE5BTUVTCiAgIGNvbW1hbmQgaGFkIG9ubHkgT04gYW5kIE9GRiBhcyBvcHRpb25zLiBJbiB2ZXJzaW9uIDcuMCwgdGhlcmUgYXJlIG1vcmUKICAgY2hvaWNlczoKCiAgIFNFVCBTRU5EIFBBVEhOQU1FUyBPRkYKICAgICAgICAgIFdoZW4gc2VuZGluZyBhIGZpbGUsIHN0cmlwIGFsbCBkaXNrL2RpcmVjdG9yeSBpbmZvcm1hdGlvbiBmcm9tCiAgICAgICAgICB0aGUgbmFtZS4gRXhhbXBsZTogInNlbmQgL3Vzci9vbGdhL2xldHRlcnMvb29mYS50eHQiIHNlbmRzIHRoZQogICAgICAgICAgZmlsZSBhcyAib29mYS50eHQiLiBUaGlzIGFwcGxpZXMgdG8gYWN0dWFsIGZpbGVuYW1lcywgbm90IHRvCiAgICAgICAgICBhbnkgYXMtbmFtZSB5b3UgbWlnaHQgc3BlY2lmeS4KCiAgIFNFVCBTRU5EIFBBVEhOQU1FUyBSRUxBVElWRQogICAgICAgICAgV2hlbiBzZW5kaW5nIGEgZmlsZSwgbGVhdmUgdGhlIHBhdGhuYW1lIG9uIGFzIGdpdmVuLiBGb3IKICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgaXMgL3Vzci9vbGdhLCAic2VuZAogICAgICAgICAgbGV0dGVycy9vb2ZhLnR4dCIgc2VuZHMgdGhlIGZpbGUgYXMgImxldHRlcnMvb29mYS50eHQiLCBub3QKICAgICAgICAgICIvdXNyL29sZ2EvbGV0dGVycy9vb2ZhLnR4dCIgb3IgImxldHRlcnMudHh0Ii4KCiAgIFNFVCBTRU5EIFBBVEhOQU1FUyBBQlNPTFVURQogICAgICAgICAgV2hlbiBzZW5kaW5nIGEgZmlsZSwgY29udmVydCBpdHMgbmFtZSB0byB0aGUgZnVsbCwgYWJzb2x1dGUKICAgICAgICAgIGxvY2FsIHBhdGhuYW1lLiBGb3IgZXhhbXBsZSwgaWYgeW91ciBjdXJyZW50IGRpcmVjdG9yeSBpcwogICAgICAgICAgL3Vzci9vbGdhLCAic2VuZCBsZXR0ZXJzL29vZmEudHh0IiBzZW5kcyB0aGUgZmlsZSBhcwogICAgICAgICAgIi91c3Ivb2xnYS9sZXR0ZXJzL29vZmEudHh0Ii4gTk9URTogRXZlbiB3aXRoIHRoaXMgc2V0dGluZywKICAgICAgICAgIGRldmljZSBhbmQvb3Igbm9kZSBuYW1lcyBhcmUgbm90IGluY2x1ZGVkLiBGb3IgZXhhbXBsZSwgaW4gVk1TLAogICAgICAgICAgYW55IG5vZGUgb3IgZGV2aWNlIG5hbWUgaXMgc3RyaXBwZWQ7IGluIFdpbmRvd3Mgb3IgT1MvMiwgYW55CiAgICAgICAgICBkaXNrIGxldHRlciBpcyBzdHJpcHBlZC4KCiAgIFNFVCBSRUNFSVZFIFBBVEhOQU1FUyBPRkYKICAgICAgICAgIFdoZW4gcmVjZWl2aW5nIGEgZmlsZSwgc3RyaXAgYWxsIGRpc2svZGlyZWN0b3J5IGluZm9ybWF0aW9uCiAgICAgICAgICBmcm9tIHRoZSBuYW1lIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHN0b3JlIGl0LiBUaGlzIGFwcGxpZXMgdG8KICAgICAgICAgIGluY29taW5nIGZpbGVuYW1lLCBub3QgdG8gYW55IGFzLW5hbWUgeW91IG1pZ2h0IHNwZWNpZnkuCiAgICAgICAgICBFeGFtcGxlOiBJZiBhIGZpbGUgYXJyaXZlcyB1bmRlciB0aGUgbmFtZQogICAgICAgICAgIi91c3Ivb2xnYS9sZXR0ZXJzL29vZmEudHh0IiBpdCBpcyBzdG9yZWQgc2ltcGx5IGFzICJvb2ZhLnR4dCIKICAgICAgICAgIGluIHlvdXIgZG93bmxvYWQgZGlyZWN0b3J5IG9yLCBpZiBubyBkb3dubG9hZCBkaXJlY3RvcnkgaGFzCiAgICAgICAgICBiZWVuIHNwZWNpZmllZCwgaW4geW91ciBjdXJyZW50IGRpcmVjdG9yeS4KCiAgIFNFVCBSRUNFSVZFIFBBVEhOQU1FUyBSRUxBVElWRQogICAgICAgICAgV2hlbiByZWNlaXZpbmcgYSBmaWxlLCBsZWF2ZSB0aGUgcGF0aG5hbWUgb24gYXMgaXQgYXBwZWFycyBpbgogICAgICAgICAgdGhlIGluY29taW5nIG5hbWUsIGJ1dCBpZiB0aGUgaW5jb21pbmcgbmFtZSBhcHBlYXJzIHRvIGJlCiAgICAgICAgICBhYnNvbHV0ZSwgbWFrZSBpdCByZWxhdGl2ZSB0byB5b3VyIGN1cnJlbnQgb3IgZG93bmxvYWQKICAgICAgICAgIGRpcmVjdG9yeS4gRXhhbXBsZXM6CgogICAgICAgICAgKyAib29mYS50eHQiIGlzIHN0b3JlZCBhcyAib29mYS50eHQiLgogICAgICAgICAgKyAibGV0dGVycy9vb2ZhLnR4dCIgaXMgc3RvcmVkIGFzICJsZXR0ZXJzL29vZmEudHh0IjsgdGhlCiAgICAgICAgICAgICJsZXR0ZXJzIiBzdWJkaXJlY3RvcnkgaXMgY3JlYXRlZCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5CiAgICAgICAgICAgIGV4aXN0LgogICAgICAgICAgKyAiL3Vzci9vbGdhL2xldHRlcnMvb29mYS50eHQiIGlzIHN0b3JlZCBhcwogICAgICAgICAgICAidXNyL29sZ2EvbGV0dGVycy9vb2ZhLnR4dCIgaW4geW91ciBjdXJyZW50IG9yIGRvd25sb2FkCiAgICAgICAgICAgIGRpcmVjdG9yeSwgYW5kIHRoZSAidXNyIiwgInVzci9vbGdhIiwgZXRjLCBkaXJlY3RvcmllcyBhcmUKICAgICAgICAgICAgY3JlYXRlZCBpZiB0aGV5IGRvIG5vdCBleGlzdC4KCiAgIFNFVCBSRUNFSVZFIFBBVEhOQU1FUyBBQlNPTFVURQogICAgICAgICAgVGhlIGluY29taW5nIGZpbGVuYW1lIGlzIHVzZWQgYXMgZ2l2ZW4uIFRodXMgaXQgY2Fubm90IGJlCiAgICAgICAgICBzdG9yZWQgdW5sZXNzIHRoZSBnaXZlbiBwYXRoIChpZiBhbnkpIGFscmVhZHkgZXhpc3RzIG9yIGNhbiBiZQogICAgICAgICAgY3JlYXRlZC4gSW4gdGhpcyBjYXNlLCBub2RlLCBkZXZpY2UsIG9yIGRpc2sgZGVzaWduYXRpb25zIGFyZQogICAgICAgICAgTk9UIHN0cmlwcGVkLCBzaW5jZSB0aGV5IG1vc3QgbGlrZWx5IHdlcmUgZ2l2ZW4gZXhwbGljaXRseSBieQogICAgICAgICAgdGhlIHVzZXIgYXMgYW4gYXMtbmFtZSwgbWVhbnQgdG8gYmUgdXNlZCBhcyBnaXZlbi4KCiAgIFNFVCBSRUNFSVZFIFBBVEhOQU1FUyBBVVRPCiAgICAgICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0LCBhbmQgbWVhbnMgUkVMQVRJVkUgaWYgdGhlIHNlbmRlciB0ZWxscyBtZQogICAgICAgICAgaXQgaXMgYSByZWN1cnNpdmUgdHJhbnNmZXIsIE9GRiBvdGhlcndpc2UuCgogICBTZXQgRklMRSBOQU1FUyBDT05WRVJURUQgbm93IGFsc28gYWZmZWN0cyBwYXRobmFtZXMgdG9vLiBXaGVuCiAgIFBBVEhOQU1FUyBhcmUgUkVMQVRJVkUgb3IgQUJTT0xVVEUgYW5kIEZJTEUgTkFNRVMgYXJlIENPTlZFUlRFRCwgdGhlCiAgIGZpbGUgc2VuZGVyIGNvbnZlcnRzIGl0cyBuYXRpdmUgZGlyZWN0b3J5LW5hbWUgZm9ybWF0IHRvIFVOSVggZm9ybWF0LAogICBhbmQgdGhlIGZpbGUgcmVjZWl2ZXIgY29udmVydHMgZnJvbSBVTklYIGZvcm1hdCB0byBpdHMgbmF0aXZlIG9uZTsKICAgdGh1cyBVTklYIGZvcm1hdCBpcyB0aGUgY29tbW9uIGludGVybWVkaWF0ZSByZXByZXNlbnRhdGlvbiBmb3IKICAgZGlyZWN0b3J5IGhpZXJhcmNoaWVzLCBhcyBpdCBpcyBpbiB0aGUgWklQL1VOWklQIHByb2dyYW1zICh3aGljaCBpcwogICB3aHkgWklQIGFyY2hpdmVzIGFyZSB0cmFuc3BvcnRhYmxlIGFtb25nLCBVTklYLCBET1MsIGFuZCBWTVMpLgoKICAgSGVyZSdzIGFuIGV4YW1wbGUgaW4gd2hpY2ggYSBmaWxlIGlzIHNlbnQgZnJvbSBXaW5kb3dzIHRvIFVOSVggd2l0aAogICByZWxhdGl2ZSBwYXRobmFtZXMgYW5kIEZJTEUgTkFNRVMgQ09OVkVSVEVEOgoKICBTb3VyY2UgbmFtZSAgICAgICAgICAgICAgICBJbnRlcm1lZGlhdGUgbmFtZSAgICAgIERlc3RpbmF0aW9uIE5hbWUKICBDOlxLOTVcVE1QXE9PRkEuVFhUICAgICAgICBLOTUvVE1QL09PRkEuVFhUICAgICAgIGs5NS90bXAvb29mYS50eHQKCiAgIEluIGEgbW9yZSBjb21wbGljYXRlZCBleGFtcGxlLCB3ZSBzZW5kIHRoZSBzYW1lIGZpbGUgZnJvbSBXaW5kb3dzIHRvCiAgIFZNUzoKCiAgU291cmNlIG5hbWUgICAgICAgICAgICAgICAgSW50ZXJtZWRpYXRlIG5hbWUgICAgICBEZXN0aW5hdGlvbiBOYW1lCiAgQzpcSzk1XFRNUFxPT0ZBLlRYVCAgICAgICAgSzk1L1RNUC9PT0ZBLlRYVCAgICAgICBbLks5NS5UTVBdT09GQS5UWFQKCiAgIChOb3RlIHRoYXQgZGlzayBsZXR0ZXJzIGFuZCBkZXZpY2UgZGVzaWduYXRpb25zIGFyZSBhbHdheXMgc3RyaXBwZWQKICAgd2hlbiBwYXRobmFtZXMgYXJlIHJlbGF0aXZlKS4KCiAgIEFzIHlvdSBjYW4gaW1hZ2luZSwgYXMgbW9yZSBhbmQgbW9yZSBkaXJlY3RvcnkgZm9ybWF0cyBhcmUgY29uc2lkZXJlZCwKICAgdGhpcyBhcHByb2FjaCBrZWVwcyBtYXR0ZXJzIHNpbXBsZTogb24gZWFjaCBwbGF0Zm9ybSwgS2VybWl0IG11c3Qga25vdwogICBvbmx5IGl0cyBvd24gbG9jYWwgZm9ybWF0IGFuZCB0aGUgY29tbW9uIGludGVybWVkaWF0ZSBvbmUuIEluIG1vc3QKICAgY2FzZXMsIHRoZSByZWNlaXZlciBjYW4gZGV0ZWN0IHdoaWNoIGZvcm1hdCBpcyB1c2VkIGF1dG9tYXRpY2FsbHkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4xMS4gUmVjdXJzaXZlIFNFTkQgYW5kIEdFVDogVHJhbnNmZXJyaW5nIERpcmVjdG9yeSBUcmVlcwoKICAgQy1LZXJtaXQgNy4wIGluIHNlbGVjdGVkIHZlcnNpb25zIChVTklYLCBWTVMsIFZPUywgQU9TL1ZTLCBXaW5kb3dzLAogICBhbmQgT1MvMiBhdCB0aGlzIHdyaXRpbmcpIG5vdyBwZXJtaXRzIHRoZSBTRU5EIGNvbW1hbmQgdG8gdHJhdmVyc2UKICAgZGlyZWN0b3JpZXMgInJlY3Vyc2l2ZWx5IiBpZiB5b3UgYXNrIGl0IHRvOyB0aGF0IGlzLCB0byBzZW5kIGZpbGVzCiAgIGZyb20gdGhlIGN1cnJlbnQgb3Igc3BlY2lmaWVkIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyBzdWJkaXJlY3RvcmllcwogICB0b28sIGFuZCB0aGVpciBzdWJkaXJlY3RvcmllcywgZXRjLiAoU29tZSBvdGhlciBjb21tYW5kcyBjYW4gZG8gdGhpcwogICB0b28sIGluY2x1ZGluZyBESVJFQ1RPUlkuKQoKICAgVGhpcyBmZWF0dXJlIGlzIG5ldyB0byBVTklYLCBXaW5kb3dzLCBWT1MsIGFuZCBPUy8yLiBWTVMgYW5kIEFPUy9WUwogICBoYXZlIGFsd2F5cyBpbmNsdWRlZCAid2lsZGNhcmQiIG9yICJ0ZW1wbGF0ZSIgY2hhcmFjdGVycyB0aGF0IGFsbG93CiAgIHRoaXMsIGFuZCBpbiB0aGlzIGNhc2UsIHJlY3Vyc2l2ZSBkaXJlY3RvcnkgdHJhdmVyc2FsIGNvdWxkIGhhcHBlbgogICBiZWhpbmQgS2VybWl0J3MgYmFjaywgaS5lLiBLZXJtaXQgZG9lcyBub3QgaGF2ZSB0byBkbyBpdCBpdHNlbGYgKGluCiAgIFZNUywgdGhlIG5vdGF0aW9uIGlzICJbLi4uXSIgb3IgIltkaXJlY3RvcnkuLi5dIjsgaW4gQU9TL1ZTIGlzICIjIikuCiAgIEluIEMtS2VybWl0IDcuMCwgaG93ZXZlciwgU0VORCAvUkVDVVJTSVZFIGlzIHN1cHBvcnRlZCBieSBDLUtlcm1pdAogICBpdHNlbGYgZm9yIFZNUy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMTEuMS4gQ29tbWFuZC1MaW5lIE9wdGlvbnMKCiAgIFRvIGRlc2NlbmQgYSBkaXJlY3RvcnkgdHJlZSB3aGVuIHNlbmRpbmcgZmlsZXMsIHVzZSB0aGUgLUwKICAgY29tbWFuZC1saW5lIG9wdGlvbiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzZW5kIG9wZXJhdGlvbiBpcyB0byBiZQogICByZWN1cnNpdmUsIGFuZCBpbmNsdWRlIGEgbmFtZSBvciBwYXR0ZXJuIHRvIGJlIHNlbnQuIFdoZW4gZ2l2aW5nIGEKICAgcGF0dGVybiwgeW91IHNob3VsZCBlbmNsb3NlIGl0IGluIHF1b3RlcyB0byBwcmV2ZW50IHRoZSBzaGVsbCBmcm9tCiAgIGV4cGFuZGluZyBpdC4gRXhhbXBsZXM6CgogICQga2VybWl0IC1McyAiL3Vzci9vbGdhLyoiICMgc2VuZCBhbGwgb2YgT2xnYSdzIGZpbGVzIGluIGFsbCBoZXIgZGlyZWN0b3JpZXMKICAkIGtlcm1pdCAtTHMgZm9vLnR4dCAgICAgICAjIHNlbmQgYWxsIGZvby50eHQgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdHJlZQogICQga2VybWl0IC1McyAiKi50eHQiICAgICAgICMgc2VuZCBhbGwgLnR4dCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlCiAgJCBrZXJtaXQgLUxzICJsZXR0ZXJzLyoiICAgIyBzZW5kIGFsbCBmaWxlcyBpbiB0aGUgbGV0dGVycyBkaXJlY3RvcnkgdHJlZQogICQga2VybWl0IC1McyBsZXR0ZXJzICAgICAgICMgc2VuZCBhbGwgZmlsZXMgaW4gdGhlIGxldHRlcnMgZGlyZWN0b3J5IHRyZWUKICAkIGtlcm1pdCAtTHMgIioiICAgICAgICAgICAjIHNlbmQgYWxsIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUKICAkIGtlcm1pdCAtTHMgLiAgICAgICAgICAgICAjIFVOSVggb25seTogc2VuZCBhbGwgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgdHJlZQogICQga2VybWl0IC1zIC4gICAgICAgICAgICAgICMgVU5JWCBvbmx5OiBhIGZpbGVuYW1lIG9mIC4gaW1wbGllcyAtTAoKICAgSWYgeW91IGxldCB0aGUgc2hlbGwgZXhwYW5kIHdpbGRjYXJkcywgS2VybWl0IG9ubHkgc2VuZHMgZmlsZXMgd2hvc2UKICAgbmFtZXMgbWF0Y2ggZmlsZXMgaW4gdGhlIGN1cnJlbnQgb3IgZ2l2ZW4gZGlyZWN0b3J5LCBiZWNhdXNlIHRoZSBzaGVsbAogICByZXBsYWNlcyBhbiB1bnF1b3RlZCB3aWxkY2FyZCBleHByZXNzaW9uIHdpdGggdGhlIGxpc3Qgb2YgbWF0Y2hpbmcKICAgZmlsZXMgLS0gYW5kIHRoZSBzaGVsbCBkb2VzIG5vdCBidWlsZCByZWN1cnNpdmUgbGlzdHMuIE5vdGUgdGhhdCB0aGUKICAgIi4iIG5vdGF0aW9uIGZvciB0aGUgdHJlZSByb290ZWQgYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIGFsbG93ZWQKICAgb25seSBpbiBVTklYLCBzaW5jZSBpbiBXaW5kb3dzIGFuZCBPUy8yLCBpdCBtZWFucyAiKi4qIgogICAobm9ucmVjdXJzaXZlKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMTEuMi4gVGhlIFNFTkQgL1JFQ1VSU0lWRSBDb21tYW5kCgogICBJZiB5b3UgaW5jbHVkZSB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2ggaW4gYSBTRU5EIChvciBNT1ZFLCBvciBzaW1pbGFyKQogICBjb21tYW5kLCBpdCBtZWFucyB0byBkZXNjZW5kIHRoZSBjdXJyZW50IG9yIHNwZWNpZmllZCBkaXJlY3RvcnkgdHJlZQogICBzZWFyY2hpbmcgZm9yIGZpbGVzIHdob3NlIG5hbWVzIG1hdGNoIHRoZSBnaXZlbiBuYW1lIG9yIHBhdHRlcm4uIFNpbmNlCiAgIHRoaXMgaXMgbm90IHRlcnJpYmx5IHVzZWZ1bCB1bmxlc3MgeW91IGFsc28gaW5jbHVkZSBwYXRobmFtZXMgd2l0aCB0aGUKICAgb3V0Ym91bmQgZmlsZXMsIHRoZSAvUkVDVVJTSVZFIHN3aXRjaCBhbHNvIGluY2x1ZGVzIGFuIGltcGxpY2l0CiAgIC9QQVRITkFNRVM6UkVMQVRJVkUgc3dpdGNoICh3aGljaCB5b3UgY2FuIHVuZG8gYnkgaW5jbHVkaW5nIGFuCiAgIGV4cGxpY2l0IC9QQVRITkFNRVMgc3dpdGNoIGFmdGVyIHRoZSAvUkVDVVJTSVZFIHN3aXRjaCkuCgogICBFeGFtcGxlczoKCiAgIFNFTkQgL1JFQ1VSU0lWRSAqCiAgICAgICAgICBTZW5kcyBhbGwgb2YgdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgYWxsIHRoZQogICAgICAgICAgZmlsZXMgaW4gYWxsIG9mIGl0cyBzdWJkaXJlY3RvcmllcywgYW5kIGFsbCBvZiB0aGVpcgogICAgICAgICAgc3ViZGlyZWN0b3JpZXMsIGV0YywgaW5jbHVkaW5nIHRoZWlyIHJlbGF0aXZlIHBhdGhuYW1lcy4gRW1wdHkKICAgICAgICAgIGRpcmVjdG9yaWVzIGFyZSBub3Qgc2VudC4KCiAgIFNFTkQgL1JFQ1VSU0lWRSAvUEFUSE5BTUVTOkFCU09MVVRFICoKICAgICAgICAgIFNlbmRzIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBhbGwgdGhlCiAgICAgICAgICBmaWxlcyBpbiBhbGwgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLCBhbmQgYWxsIG9mIHRoZWlyCiAgICAgICAgICBzdWJkaXJlY3RvcmllcywgZXRjLCBpbmNsdWRpbmcgdGhlaXIgYWJzb2x1dGUgcGF0aG5hbWVzLgoKICAgU0VORCAvUkVDVVJTSVZFIC9QQVRITkFNRVM6T0ZGICoKICAgICAgICAgIFNlbmRzIGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGFuZCBhbGwgdGhlCiAgICAgICAgICBmaWxlcyBpbiBhbGwgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLCBhbmQgYWxsIG9mIHRoZWlyCiAgICAgICAgICBzdWJkaXJlY3RvcmllcywgZXRjLCB3aXRob3V0IHBhdGhuYW1lcy4KCiAgIFNFTkQgL1JFQ1VSU0lWRSAvdXNyL29sZ2EvKgogICAgICAgICAgU2VuZHMgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGUgL3Vzci9vbGdhIGRpcmVjdG9yeSBhbmQgYWxsIHRoZQogICAgICAgICAgZmlsZXMgaW4gYWxsIG9mIGl0cyBzdWJkaXJlY3RvcmllcywgYW5kIGFsbCBvZiB0aGVpcgogICAgICAgICAgc3ViZGlyZWN0b3JpZXMsIGV0Yy4KCiAgIFNFTkQgL1JFQ1VSU0lWRSAvdXNyL29sZ2EgKG9yIC91c3Ivb2xnYS8pCiAgICAgICAgICBTYW1lIGFzIGFib3ZlLiBJZiB0aGUgbmFtZSBpcyBhIGRpcmVjdG9yeSBuYW1lICh3aXRoIG9yIHdpdGhvdXQKICAgICAgICAgIGEgdHJhaWxpbmcgc2xhc2gpLCBpdHMgZmlsZXMgYXJlIHNlbnQsIGFuZCB0aG9zZSBvZiBpdHMKICAgICAgICAgIHN1YmRpcmVjdG9yaWVzLCBhbmQgdGhlaXIgc3ViZGlyZWN0b3JpZXMsIGV0YyAoc2VlIFs1MDNdU2VjdGlvbgogICAgICAgICAgNC45KS4KCiAgIFNFTkQgL1JFQ1VSU0lWRSAvVEVYVCAvdXNyL29sZ2EvKi50eHQKICAgICAgICAgIEFzIGFib3ZlLCBidXQgb25seSBmaWxlcyB3aG9zZSBuYW1lcyBlbmQgd2l0aCAiLnR4dCIgYXJlIHNlbnQsCiAgICAgICAgICBhbmQgdGhleSBhcmUgc2VudCBpbiB0ZXh0IG1vZGUgKGFzIHRoZXkgd291bGQgYmUgYnkgZGVmYXVsdAogICAgICAgICAgYW55d2F5IGlmIFNFVCBGSUxFIFBBVFRFUk5TIGlzIE9OIG9yIEFVVE8pLgoKICAgU0VORCAuCiAgICAgICAgICBVTklYIG9ubHk6IFNlbmQgYWxsIHRoZSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkuCgogICBTRU5EIC9SRUNVUlNJVkUgLgogICAgICAgICAgVU5JWCBvbmx5OiBTZW5kcyBhbGwgb2YgdGhlIGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQKICAgICAgICAgIGFsbCBvZiBpdHMgc3ViZGlyZWN0b3JpZXMsIGV0YyAoWzUwNF1TZWN0aW9uIDQuOSkuCgogICBUaGUgL1JFQ1VSU0lWRSBzd2l0Y2ggaXMgZGlmZmVyZW50IGZyb20gbW9zdCBvdGhlciBzd2l0Y2hlcyBpbiB0aGF0CiAgIGl0cyBlZmZlY3QgaXMgaW1tZWRpYXRlIChidXQgc3RpbGwgbG9jYWwgdG8gdGhlIGNvbW1hbmQgaW4gd2hpY2ggaXQgaXMKICAgZ2l2ZW4pLCBiZWNhdXNlIGl0IGRldGVybWluZXMgaG93IGZpbGVuYW1lcyBhcmUgdG8gYmUgcGFyc2VkLiBGb3IKICAgZXhhbXBsZSwgInNlbmQgKi50eHQiIGZhaWxzIHdpdGggYSBwYXJzZSBlcnJvciAoIk5vIGZpbGVzIG1hdGNoIikgaWYKICAgdGhlcmUgYXJlIG5vICoudHh0IGZpbGVzIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYnV0ICJzZW5kCiAgIC9yZWN1cnNpdmUgKi50eHQiIHN1Y2NlZWRzIGlmIHRoZXJlIGFyZSAiLnR4dCIgZmlsZXMgYW55d2hlcmUgaW4gdGhlCiAgIHRyZWUgcm9vdGVkIGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCiAgIFRoZSAvUkVDVVJTSVZFIHN3aXRjaCBhbHNvIGFmZmVjdHMgdGhlIGZpbGUgbGlzdHMgZGlzcGxheWVkIGlmIHlvdQogICB0eXBlICI/IiBpbiBhIGZpbGVuYW1lIGZpZWxkLiAic2VuZCAuLz8iIGxpc3RzIHRoZSByZWd1bGFyIGZpbGVzIGluCiAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgYnV0ICJzZW5kIC9yZWN1cnNpdmUgLi8/IiBsaXN0cyB0aGUgZW50aXJlCiAgIGRpcmVjdG9yeSB0cmVlIHJvb3RlZCBhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjExLjMuIFRoZSBHRVQgL1JFQ1VSU0lWRSBDb21tYW5kCgogICBJbiBhIGNsaWVudC9zZXJ2ZXIgc2V0dGluZywgdGhlIGNsaWVudCBjYW4gYWxzbyByZXF1ZXN0IGEgcmVjdXJzaXZlCiAgIHRyYW5zZmVyIHdpdGg6CgogICBHRVQgL1JFQ1VSU0lWRSBbIG90aGVyIHN3aXRjaGVzIF0gcmVtb3RlLWZpbGVzcGVjIFsgbG9jYWwtc3BlYyBdCgogICBJbiB3aGljaCByZW1vdGUgZmlsZSBzcGVjaWZpY2F0aW9uIGNhbiBiZSBhIGRpcmVjdG9yeSBuYW1lLCBhCiAgIGZpbGVuYW1lLCBhIHdpbGRjYXJkLCBvciBhbnkgY29tYmluYXRpb24uIElmIHRoZSBsb2NhbC1zcGVjIGlzIG5vdAogICBnaXZlbiAoYW5kIFBBVEhOQU1FUyBhcmUgUkVMQVRJVkUpLCBpbmNvbWluZyBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZ28KICAgaW50byB0aGUgY3VycmVudCBsb2NhbCBkaXJlY3RvcnkuIElmIGxvY2FsLXNwZWMgaXMgZ2l2ZW4gYW5kIGlzIGEKICAgZGlyZWN0b3J5LCBpdCBiZWNvbWVzIHRoZSByb290IG9mIHRoZSB0cmVlIGludG8gd2hpY2ggdGhlIGluY29taW5nCiAgIGZpbGVzIGFuZCBkaXJlY3RvcmllcyBhcmUgcGxhY2VkLiBJZiBsb2NhbC1zcGVjIGhhcyB0aGUgc3ludGF4IG9mIGEKICAgZGlyZWN0b3J5IG5hbWUgKGUuZy4gaW4gVU5JWCBpdCBlbmRzIHdpdGggLyksIEMtS2VybWl0IGNyZWF0ZXMgdGhlCiAgIGRpcmVjdG9yeSBhbmQgdGhlbiBwbGFjZXMgdGhlIGluY29taW5nIGZpbGVzIGludG8gaXQuIElmIGxvY2FsLXNwZWMgaXMKICAgYSBmaWxlbmFtZSAobm90IHJlY29tbWVuZGVkKSwgdGhlbiBhbGwgaW5jb21pbmcgZmlsZXMgYXJlIHN0b3JlZCB3aXRoCiAgIHRoYXQgbmFtZSB3aXRoIGNvbGxpc2lvbnMgaGFuZGxlZCBhY2NvcmRpbmcgdG8gdGhlIEZJTEUgQ09MTElTSU9OCiAgIHNldHRpbmcuCgogICBBZ2FpbiwgdGhlIG5vcm1hbCBtZXRob2QgZm9yIHRyYW5zZmVycmluZyBkaXJlY3RvcnkgdHJlZXMgdXNlcwogICByZWxhdGl2ZSBwYXRobmFtZXMsIGFuZCB0aGlzIGlzIHRoZSBkZWZhdWx0IHdoZW4gdGhlIHNlbmRlciBoYXMgYmVlbgogICBnaXZlbiB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2guIFRoZSBhY3Rpb24gYXQgdGhlIHJlY2VpdmVyIGRlcGVuZHMgb24gaXRzCiAgIFJFQ0VJVkUgUEFUSE5BTUVTIHNldHRpbmcuIFRoZSBkZWZhdWx0IGlzIEFVVE8sIG1lYW5pbmcgdGhhdCBpZiB0aGUKICAgc2VuZGVyIHRlbGxzIGl0IHRvIGV4cGVjdCBhIHJlY3Vyc2l2ZSB0cmFuc2ZlciwgdGhlbiBpdCBzaG91bGQKICAgYXV0b21hdGljYWxseSBzd2l0Y2ggdG8gcmVsYXRpdmUgcGF0aG5hbWVzIGZvciB0aGlzIHRyYW5zZmVyIG9ubHk7CiAgIG90aGVyd2lzZSBpdCBvYmV5cyB0aGUgUkVDRUlWRSBQQVRITkFNRVMgc2V0dGluZyBvZiBPRkYsIEFCU09MVVRFLCBvcgogICBSRUxBVElWRS4KCiAgIFdoYXQgaGFwcGVucyBpZiBhIGZpbGUgYXJyaXZlcyB0aGF0IGhhcyBhbiBhYnNvbHV0ZSBwYXRobmFtZSwgd2hlbiB0aGUKICAgcmVjZWl2ZXIgaGFzIGJlZW4gdG9sZCB0byB1c2Ugb25seSByZWxhdGl2ZSBwYXRobmFtZXM/IEFzIGEgc2VjdXJpdHkKICAgcHJlY2F1dGlvbiwgaW4gdGhpcyBjYXNlIHRoZSByZWNlaXZlciB0cmVhdHMgdGhlIG5hbWUgYXMgaWYgaXQgd2FzCiAgIHJlbGF0aXZlLiBGb3IgZXhhbXBsZSwgaWYgYSBmaWxlIGFycml2ZXMgYXM6CgogIC91c3Ivb2xnYS9vb2ZhLnR4dAoKICAgVGhlIHJlY2VpdmVyIGNyZWF0ZXMgYSAidXNyIiBzdWJkaXJlY3RvcnkgaW4gaXRzIGN1cnJlbnQgZGlyZWN0b3J5LAogICBhbmQgdGhlbiBhbiAib2xnYSIgc3ViZGlyZWN0b3J5IHVuZGVyIHRoZSAidXNyIiBzdWJkaXJlY3RvcnkgaW4gd2hpY2gKICAgdG8gc3RvcmUgdGhlIGluY29taW5nIGZpbGUuCgogICBTdXBwb3NlLCBob3dldmVyIHRoZXJlIGlzIGEgc2VxdWVuY2Ugb2YgZGlyZWN0b3JpZXM6CgogIC91c3Ivb2xnYS9hL2IvYy9kLwoKICAgaW4gd2hpY2ggImEiIGNvbnRhaW5zIG5vdGhpbmcgYnV0IGEgc3ViZGlyZWN0b3J5ICJiIiwgd2hpY2ggaW4gdHVybgogICBjb250YWlucyBub3RoaW5nIGJ1dCBhIHN1YmRpcmVjdG9yeSAiYyIsIHdoaWNoIGluIHR1cm4gY29udGFpbnMKICAgbm90aGluZyBidXQgYSBzdWJkaXJlY3RvcnkgImQiLCB3aGljaCBjb250YWlucyBub3RoaW5nIGF0IGFsbC4gVGh1cwogICB0aGVyZSBhcmUgbm8gZmlsZXMgaW4gdGhlICIvdXNyL29sZ2EvYS8iIHRyZWUsIGFuZCBzbyBpdCBpcyBub3Qgc2VudCwKICAgYW5kIHRoZXJlZm9yZSBpdCBpcyBub3QgcmVwcm9kdWNlZCBvbiB0aGUgdGFyZ2V0IGNvbXB1dGVyLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4xMS40LiBOZXcgYW5kIENoYW5nZWQgRmlsZSBGdW5jdGlvbnMKCiAgIEMtS2VybWl0IDcuMCBhZGRzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgXGZmaWxlcyhwYXR0ZXJuWywmYV0pCiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgdG8gbWF0Y2ggb25seSByZWd1bGFyIGZpbGVzIGluCiAgICAgICAgICB0aGUgY3VycmVudCBvciBnaXZlbiBkaXJlY3RvcnksIGFuZCB0byB0YWtlIGFuIG9wdGlvbmFsIGFycmF5CiAgICAgICAgICBuYW1lIGFzIGEgc2Vjb25kIGFyZ3VtZW50IChleHBsYWluZWQgYmVsb3cpLgoKICAgXGZkaXJlY3RvcmllcyhwYXR0ZXJuWywmYV0pCiAgICAgICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgdGhhdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0dGVybi4KICAgICAgICAgIElmIHRoZSBwYXR0ZXJuIGRvZXMgbm90IGluY2x1ZGUgYSBkaXJlY3RvcnksIHRoZW4gdGhlIHNlYXJjaCBpcwogICAgICAgICAgcGVyZm9ybWVkIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KCiAgIFxmcmZpbGVzKHBhdHRlcm5bLCZhXSkKICAgICAgICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWxlcyBpbiB0aGUgY3VycmVudCBvciBnaXZlbiBkaXJlY3RvcnkKICAgICAgICAgIGFuZCBhbGwgb2YgaXRzIHN1YmRpcmVjdG9yaWVzLCBhbmQgdGhlaXIgc3ViZGlyZWN0b3JpZXMsIGV0YywKICAgICAgICAgIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIHBhdHRlcm4uIFdhcm5pbmcgLS0gdGhpcyBvbmUgY2FuIHRha2UKICAgICAgICAgIHF1aXRlIHNvbWUgdGltZSBpZiBwZXJmb3JtZWQgYXQgdGhlIHJvb3Qgb2YgYSBsYXJnZSBkaXJlY3RvcnkKICAgICAgICAgIHRyZWUuCgogICBcZnJkaXJlY3RvcmllcyhwYXR0ZXJuWywmYV0pCiAgICAgICAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlyZWN0b3JpZXMgaW4gdGhlIGN1cnJlbnQgb3IgZ2l2ZW4KICAgICAgICAgIGRpcmVjdG9yeSBhbmQgYWxsIG9mIGl0cyBzdWJkaXJlY3RvcmllcywgYW5kIHRoZWlyCiAgICAgICAgICBzdWJkaXJlY3RvcmllcywgZXRjLCB0aGF0IG1hdGNoIHRoZSBnaXZlbiBwYXR0ZXJuLgoKICAgRWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgYnVpbGRzIHVwIGEgbGlzdCBvZiBmaWxlcyB0byBiZSByZXR1cm5lZCBieQogICB0aGUgXGZuZXh0ZmlsZSgpIGZ1bmN0aW9uLCBqdXN0IGFzIFxmZmlsZXMoKSBhbHdheXMgaGFzIGRvbmUuIChUaGlzCiAgIGNhbiBhbHNvIGJlIGRvbmUgd2l0aCB0aGUgL0FSUkFZIHN3aXRjaCBvZiB0aGUgRElSRUNUT1JZIGNvbW1hbmQ7IHNlZQogICBbNTA1XVNlY3Rpb25zIDQuNS4xIGFuZCBbNTA2XTcuMTApLgoKICAgRWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMgY2FuIGJlIGdpdmVuIGFuIGFycmF5IG5hbWUgYXMgYW4gb3B0aW9uYWwKICAgc2Vjb25kIGFyZ3VtZW50LiBJZiBhbiBhcnJheSBuYW1lIGlzIHN1cHBsaWVkLCB0aGUgYXJyYXkgd2lsbCBjb250YWluCiAgIHRoZSBudW1iZXIgb2YgZmlsZXMgYXMgaXRzIDB0aCBlbGVtZW50LCBhbmQgdGhlIGZpbGVuYW1lcyBpbiBlbGVtZW50cwogICAxIHRocm91Z2ggbGFzdC4gSWYgdGhlIGFycmF5IGFscmVhZHkgZXhpc3RlZCwgaXRzIHByZXZpb3VzIGNvbnRlbnRzCiAgIGFyZSBsb3N0LiBGb3IgZXhhbXBsZSwgaWYgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGNvbnRhaW5zIHR3byBmaWxlcywKICAgb29mYS50eHQgYW5kIGZvby5iYXIsIHRoZW4gIlxmZmlsZXMoKiwmYSkiIGNyZWF0ZXMgYW4gYXJyYXkgXCZhW10gd2l0aAogICBhIGRpbWVuc2lvbiBvZiAyLCBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgZWxlbWVudHM6CgogXCZhWzBdID0gMgogXCZhWzFdID0gb29mYS50eHQKIFwmYVsyXSA9IGZvby5iYXIKCiAgIElmIG5vIGZpbGVzIG1hdGNoIHRoZSBzcGVjaWZpY2F0aW9uIGdpdmVuIGluIHRoZSBmaXJzdCBhcmd1bWVudCwgdGhlCiAgIGFycmF5IGdldHMgYSBkaW1lbnNpb24gb2YgMCwgd2hpY2ggaXMgdGhlIHNhbWUgYXMgdW5kZWNsYXJpbmcgdGhlCiAgIGFycmF5LgoKICAgTm90ZSB0aGF0IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgYXJyYXkgaXMgZmlsbGVkIChhbmQgaW4gd2hpY2gKICAgXGZuZXh0ZmlsZSgpIHJldHVybnMgZmlsZW5hbWVzKSBpcyBpbmRldGVybWluYXRlIChidXQgc2VlIFs1MDddU2VjdGlvbgogICA3LjEwLjUpLgoKICAgSGVyZSdzIGFuIGV4YW1wbGUgdGhhdCBidWlsZHMgYW5kIHByaW50cyBhIGxpc3Qgb2YgYWxsIHRoZSBmaWxlIHdob3NlCiAgIG5hbWVzIGVuZCBpbiAudHh0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBhbmQgYWxsIGl0cyBkZXNjZW5kZW50czoKCiAgYXNnIFwlbiBcZnJmaWxlcygqLnR4dCkKICBkZWNsYXJlIFwmYVtcJW5dCiAgZm9yIFwlaSAxIFwlbiAxIHsKICAgICAgYXNnIFwmYVtcJWldIFxmbmV4dGZpbGUoKQogICAgICBlY2hvIFxmbHBhZChcJWksNCkuICJcJmFbXCVpXSIKICB9CgogICBBbHRlcm5hdGl2ZWx5LCB1c2luZyB0aGUgYXJyYXkgbWV0aG9kLCBhbmQgdGhlbiBwcmludGluZyB0aGUgZmlsZW5hbWVzCiAgIGluIGFscGhhYmV0aWMgb3JkZXIgKHNlZSBbNTA4XVNlY3Rpb24gNy4xMC4zIGFuZCBbNTA5XTcuMTAuNSk6CgogIGFzZyBcJW4gXGZyZmlsZXMoKi50eHQsJmEpCiAgc29ydCAmYQogIGZvciBcJWkgMSBcJW4gMSB7CiAgICAgIGVjaG8gXGZscGFkKFwlaSw0KS4gIlwmYVtcJWldIgogIH0KCiAgIE9yIGV2ZW4gbW9yZSBzaW1wbHk6CgogIGFzZyBcJW4gXGZyZmlsZXMoKi50eHQsJmEpCiAgc29ydCAmYQogIHNob3cgYXJyYXkgJmEKCiAgIEFzIG5vdGVkIGVsc2V3aGVyZSwgdGhlIGZpbGUgbGlzdHMgYnVpbHQgYnkgXGZmaWxlcygpLCBcZnJmaWxlcygpLAogICBldGMsIGFyZSBub3cgInNhZmUiIGluIHRoZSBzZW5zZSB0aGF0IFNFTkQgYW5kIG90aGVyIGZpbGUtcmVsYXRlZAogICBjb21tYW5kcyBjYW4gcmVmZXJlbmNlIFxmbmV4dGZpbGUoKSB3aXRob3V0IHJlc2V0dGluZyB0aGUgbGlzdDoKCiAgc2V0IHNlbmQgcGF0aG5hbWVzIHJlbGF0aXZlCiAgZm9yIFwlaSAxIFxmcmZpbGVzKCoudHh0KSAxIHsKICAgICAgYXNnIFwlYSBcZm5leHRmaWxlKCkKICAgICAgZWNobyBTZW5kaW5nIFwlYS4uLgogICAgICBzZW5kIFwlYQogICAgICBpZiBmYWlsIGJyZWFrCiAgfQoKICAgQ29weWluZyB0byBhbiBhcnJheSAoYXMgc2hvd24gb24gcC4zOTggb2YgWzUxMF1Vc2luZyBDLUtlcm1pdCAybmQgRWQpCiAgIGlzIG5vIGxvbmdlciBuZWNlc3NhcnkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjExLjUuIE1vdmluZyBEaXJlY3RvcnkgVHJlZXMgQmV0d2VlbiBMaWtlIFN5c3RlbXMKCiAgICA0LjExLjUuMS4gVU5JWCB0byBVTklYCgogICBUcmFuc2ZlcnJpbmcgYSBkaXJlY3RvcnkgdHJlZSBmcm9tIG9uZSBjb21wdXRlciB0byBhbm90aGVyIHJlcGxpY2F0ZXMKICAgdGhlIGZpbGUgc2VuZGVyJ3MgYXJyYW5nZW1lbnQgb2YgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIG9uIHRoZSBmaWxlCiAgIHJlY2VpdmVyJ3MgY29tcHV0ZXIuIE5vcm1hbGx5IHRoaXMgaXMgZG9uZSB1c2luZyByZWxhdGl2ZSBwYXRobmFtZXMsCiAgIHNpbmNlIHRoZSB1c2VyIElEcyBtaWdodCBub3QgYmUgaWRlbnRpY2FsIG9uIHRoZSB0d28gY29tcHV0ZXJzLiBMZXQncwogICBzYXkgYm90aCBjb21wdXRlcnMgYXJlIFVOSVggYmFzZWQsIHJ1bm5pbmcgQy1LZXJtaXQgNy4wIG9yIGxhdGVyLiBPbgogICB0aGUgc2VuZGluZyBjb21wdXRlciAobGVhdmluZyBvdXQgdGhlIGNvbm5lY3Rpb24gZGV0YWlscywgZXRjKToKCiAgQy1LZXJtaXQ+IGNkIC91c3Ivb2xnYQogIEMtS2VybWl0PiBzZW5kIC9yZWN1cnNpdmUgLgoKICAgVGhlIC9SRUNVUlNJVkUgc3dpdGNoIHRlbGxzIEMtS2VybWl0IHRvIGRlc2NlbmQgdGhyb3VnaCB0aGUgZGlyZWN0b3J5CiAgIHRyZWUgYW5kIHRvIGluY2x1ZGUgcmVsYXRpdmUgcGF0aG5hbWVzIG9uIG91dGJvdW5kIGZpbGVuYW1lcy4KCiAgIE9uIHRoZSByZWNlaXZpbmcgY29tcHV0ZXI6CgogIEMtS2VybWl0PiBta2RpciBvbGdhcy1maWxlcyAgICAgICAgICAgOyBNYWtlIGEgbmV3IGRpcmVjdG9yeS4KICBDLUtlcm1pdD4gY2Qgb2xnYXMtZmlsZXMgICAgICAgICAgICAgIDsgQ0QgdG8gaXQuCiAgQy1LZXJtaXQ+IHJlY2VpdmUgL3JlY3Vyc2l2ZSAgICAgICAgICA7ID0gL1BBVEhOQU1FUzpSRUxBVElWRQoKICAgRWFjaCBLZXJtaXQgcHJvZ3JhbSByZWNvZ25pemVzIHRoYXQgdGhlIG90aGVyIGlzIHJ1bm5pbmcgdW5kZXIgVU5JWAogICBhbmQgc3dpdGNoZXMgdG8gYmluYXJ5IG1vZGUgYW5kIGxpdGVyYWwgZmlsZW5hbWVzIGF1dG9tYXRpY2FsbHkuCiAgIERpcmVjdG9yaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgb24gdGhlIHJlY2VpdmluZyBzeXN0ZW0gYXMKICAgbmVlZGVkLiBGaWxlIGRhdGVzIGFuZCBwZXJtaXNzaW9ucyBhcmUgYXV0b21hdGljYWxseSByZXByb2R1Y2VkIGZyb20KICAgc291cmNlIHRvIGRlc3RpbmF0aW9uLgoKICAgIDQuMTEuNS4yLiBWTVMgdG8gVk1TCgogICBUbyBzZW5kIHJlY3Vyc2l2ZWx5IGZyb20gVk1TLCBzaW1wbHkgaW5jbHVkZSB0aGUgL1JFQ1VSU0lWRSBzd2l0Y2gsCiAgIGZvciBleGFtcGxlIGF0IHRoZSBzZW5kZXI6CgogICQga2VybWl0CiAgQy1LZXJtaXQ+IGNkIFtvbGdhXQogIEMtS2VybWl0PiBzZW5kIC9yZWN1cnNpdmUgKi4qOzAKCiAgIEFuZCBhdCB0aGUgcmVjZWl2ZXI6CgogIEMtS2VybWl0PiBjZCBbLm9sZ2FdCiAgQy1LZXJtaXQ+IHJlY2VpdmUgL3JlY3Vyc2l2ZQoKICAgVGhlIG5vdGF0aW9uICIuLi4iIHdpdGhpbiBkaXJlY3RvcnkgYnJhY2tldHMgaW4gVk1TIG1lYW5zICJ0aGlzCiAgIGRpcmVjdG9yeSBhbmQgYWxsIGRpcmVjdG9yaWVzIGJlbG93IGl0IjsgdGhlIC9SRUNVUlNJVkUgc3dpdGNoLCB3aGVuCiAgIGdpdmVuIHRvIHRoZSBzZW5kZXIsIGltcGxpZXMgdGhlIHVzZSBvZiAiLi4uIiBpbiB0aGUgZmlsZQogICBzcGVjaWZpY2F0aW9uIHNvIHlvdSBkb24ndCBoYXZlIHRvIGluY2x1ZGUgIi4uLiI7IGJ1dCBpdCBtYWtlcyBubwogICBkaWZmZXJlbmNlIGlmIHlvdSBkbzoKCiAgJCBrZXJtaXQKICBDLUtlcm1pdD4gc2VuZCAvcmVjdXJzaXZlIFtvbGdhLi4uXSouKjswCgogICBBbmQgYXQgdGhlIHJlY2VpdmVyOgoKICBDLUtlcm1pdD4gY2QgWy5vbGdhXQogIEMtS2VybWl0PiByZWNlaXZlIC9yZWN1cnNpdmUKCiAgIEluIGVpdGhlciBjYXNlLCBzaW5jZSBib3RoIHN5c3RlbXMgcmVjb2duaXplIGVhY2ggb3RoZXIgYXMgVk1TLCB0aGV5CiAgIHN3aXRjaCBpbnRvIExBQkVMRUQgdHJhbnNmZXIgbW9kZSBhdXRvbWF0aWNhbGx5LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4xMS42LiBNb3ZpbmcgRGlyZWN0b3J5IFRyZWVzIEJldHdlZW4gVW5saWtlIFN5c3RlbXMKCiAgIFRoZXJlIGFyZSBzZXZlcmFsIGRpZmZpY3VsdGllcyB3aXRoIHJlY3Vyc2l2ZSB0cmFuc2ZlcnMgYmV0d2VlbiB1bmxpa2UKICAgc3lzdGVtczoKCiAgICAgKiBGaWxlIGZvcm1hdHMgY2FuIGJlIGRpZmZlcmVudCwgZXNwZWNpYWxseSB0ZXh0IGZpbGVzIGNoYXJhY3RlcgogICAgICAgc2V0cyBhbmQgcmVjb3JkIGZvcm1hdHMuIFRoaXMgY2FuIG5vdyBiZSBoYW5kbGVkIGJ5IHVzaW5nIFNFVCBGSUxFCiAgICAgICBQQVRURVJOLCBTRVQgRklMRSBURVhULVBBVFRFUk5TLCBhbmQgU0VUIEZJTEUgQklOQVJZLVBBVFRFUk5TCiAgICAgICAoWzUxMV1TZWN0aW9uIDQuMykuCiAgICAgKiBGaWxlIG5hbWluZyBjb252ZW50aW9ucyBhcmUgZGlmZmVyZW50LiBGb3IgZXhhbXBsZSwgb25lIHN5c3RlbQogICAgICAgbWlnaHQgYWxsb3cgKGFuZCB1c2UpIGxvbmdlciBmaWxlbmFtZXMgdGhhbiB0aGUgb3RoZXIuIFlvdSBjYW4KICAgICAgIHRlbGwgS2VybWl0IGhvdyB0byBoYW5kbGUgZmlsZSBuYW1lcyB3aXRoIHRoZSBub3JtYWwgInNldCBmaWxlCiAgICAgICBuYW1lcyIgYW5kICJzZXQgZmlsZSBjb2xsaXNpb24iIG1lY2hhbmlzbXMuIE1vc3QgbW9kZXJuIEtlcm1pdHMKICAgICAgIGFyZSBmYWlybHkgdG9sZXJhbnQgb2YgaWxsZWdhbCBmaWxlbmFtZXMgYW5kIHNob3VsZCBub3QgZmFpbAogICAgICAgc2ltcGx5IGJlY2F1c2Ugb2YgYW4gaW5jb21pbmcgZmlsZW5hbWU7IHJhdGhlciwgaXQgd2lsbCBkbyBpdHMKICAgICAgIGJlc3QgdG8gY29udmVydCBpdCB0byBhIHJlY29nbml6YWJsZSBhbmQgdW5pcXVlIGxlZ2FsIGZpbGVuYW1lLgogICAgICogRGlyZWN0b3J5IG5vdGF0aW9ucyBjYW4gYmUgZGlmZmVyZW50LCBlLmcuIGJhY2tzbGFzaGVzIGluc3RlYWQgb2YKICAgICAgIHNsYXNoZXMsIGJyYWNrZXRzLCBwYXJlbnRoZXNlcywgc3BhY2VzLCBldGMuIEJ1dCB0aGlzIGlzIG5vdwogICAgICAgaGFuZGxlZCBieSBjb252ZXJ0aW5nIHBhdGhuYW1lcyB0byBhIHN0YW5kYXJkIGZvcm1hdCBkdXJpbmcKICAgICAgIHRyYW5zZmVyIChbNTEyXVNlY3Rpb24gNC4xMCkuCgogICBTbyBub3csIGZvciB0aGUgZmlyc3QgdGltZSwgaXQgaXMgcG9zc2libGUgdG8gc2VuZCBkaXJlY3RvcnkgdHJlZXMKICAgYW1vbmcgYW55IGNvbWJpbmF0aW9uIG9mIFVOSVgsIERPUywgV2luZG93cywgT1MvMiwgVk1TLCBBT1MvVlMsIGV0Yy4KICAgSGVyZSdzIGFuIGV4YW1wbGUgc2VuZGluZyBmaWxlcyBmcm9tIGFuIEhQLVVYIHN5c3RlbSAod2hlcmUgdGV4dCBmaWxlcwogICBhcmUgZW5jb2RlZCBpbiB0aGUgSFAgUm9tYW44IGNoYXJhY3RlciBzZXQpIHRvIGEgUEMgd2l0aCBLOTUgKHdoZXJlCiAgIHRleHQgZmlsZXMgYXJlIGVuY29kZWQgaW4gQ1A4NTApOgoKIFNlbmRlcjoKICBjZCB4eHggICAgICAgICAgICAgICAgICAgICAgICAgICA7IENEIHRvIHJvb3Qgb2Ygc291cmNlIHRyZWUKICBzZXQgZmlsZSB0eXBlIGJpbmFyeSAgICAgICAgICAgICA7IERlZmF1bHQgdHJhbnNmZXIgbW9kZQogIHNldCBmaWxlIGNoYXJhY3Rlci1zZXQgaHAtcm9tYW44IDsgTG9jYWwgY2hhcmFjdGVyIHNldCBmb3IgdGV4dCBmaWxlcwogIHNldCB4ZmVyIGNoYXJhY3Rlci1zZXQgbGF0aW4xICAgIDsgVHJhbnNmZXIgY2hhcmFjdGVyIHNldAogIHNldCBmaWxlIHBhdHRlcm5zIG9uICAgICAgICAgICAgIDsgRW5hYmxlIGF1dG9tYXRpYyBmaWxlLXR5cGUgc3dpdGNoaW5nLi4uCiAgc2V0IGZpbGUgYmluYXJ5LXBhdHRlcm5zICouWiAqLmd6ICoubyAgOyBiYXNlZCBvbiB0aGVzZSBwYXR0ZXJucy4uLgogIHNldCBmaWxlIHRleHQtcGF0dGVybnMgKi50eHQgKi5jICouaCAgIDsgZm9yIGJpbmFyeSBhbmQgdGV4dCBmaWxlcy4KICBzZW5kIC9yZWN1cnNpdmUgKiAgICAgICAgICAgICAgICA7IFNlbmQgYWxsIHRoZSBmaWxlIGluIHRoaXMgZGlyZWN0b3J5IHRyZWUKCiBSZWNlaXZlcjoKICBjZCB5eXkgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENEIHRvIHJvb3Qgb2YgZGVzdGluYXRpb24gdHJlZQogIHNldCBmaWxlIGNoYXJhY3Rlci1zZXQgY3A4NTAgICAgIDsgTG9jYWwgY2hhcmFjdGVyIHNldCBmb3IgdGV4dCBmaWxlcwogIHJlY2VpdmUgL3BhdGhuYW1lczpyZWxhdGl2ZSAgICAgIDsgUmVjZWl2ZSB3aXRoIHBhdGhuYW1lcwoKICAgTm90ZXM6CiAgICAgKiBSZXBsYWNlICJ4eHgiIGFuZCAieXl5IiB3aXRoIHRoZSBkZXNpcmVkIGRpcmVjdG9yaWVzLgogICAgICogUmVwbGFjZSB0aGUgZmlsZSBjaGFyYWN0ZXIgc2V0cyBhcHByb3ByaWF0ZWx5LgogICAgICogQ2hhbmdlIHRoZSBwYXR0ZXJucyBhcyBuZWVkZWQgKG9yIGp1c3QgdXNlIHRoZSBidWlsdC1pbiBkZWZhdWx0CiAgICAgICBsaXN0cykuCiAgICAgKiBTRU5EIC9SRUNVUlNJVkUgYWxzbyBpbXBsaWVzIC9QQVRITkFNRVM6UkVMQVRJVkUuCiAgICAgKiBUaGUgZmlsZSBzZW5kZXIgdGVsbHMgdGhlIGZpbGUgcmVjZWl2ZXIgdGhlIHRyYW5zZmVyIG1vZGUgb2YgZWFjaAogICAgICAgZmlsZS4KICAgICAqIFRoZSBmaWxlIHNlbmRlciB0ZWxscyB0aGUgZmlsZSByZWNlaXZlciB0aGUgdHJhbnNmZXIgY2hhcmFjdGVyCiAgICAgICBzZXQuCiAgICAgKiBCeSBkZWZhdWx0LCBkZXN0aW5hdGlvbiBmaWxlIGRhdGVzIHdpbGwgYmUgdGhlIHNhbWUgYXMgb24gdGhlCiAgICAgICBzb3VyY2UuCiAgICAgKiBNYW55IG9mIHRoZSBzZXR0aW5ncyBzaG93biBtaWdodCBhbHJlYWR5IGJlIHNldCBieSBkZWZhdWx0LgogICAgICogU2VlIFs1MTNdU2VjdGlvbnMgNC4zLCBbNTE0XTQuMTAsIGFuZCBbNTE1XTQuMTUgZm9yIGFkZGl0aW9uYWwKICAgICAgIGV4cGxhbmF0aW9uLgoKICAgSWYgeW91IGFyZSByZWZyZXNoaW5nIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBvbiB0aGUgZGVzdGluYXRpb24KICAgY29tcHV0ZXIsIHVzZSAic2V0IGZpbGUgY29sbGlzaW9uIHVwZGF0ZSIgb3Igb3RoZXIgYXBwcm9wcmlhdGUgZmlsZQogICBjb2xsaXNpb24gb3B0aW9uIHRvIGhhbmRsZSBmaWxlbmFtZSBjb2xsaXNpb25zLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuMTIuIFdoZXJlIERpZCBNeSBGaWxlIEdvPwoKICAgTm93IHRoYXQgS2VybWl0IGNhbiBiZSBzdGFydGVkIGJ5IGNsaWNraW5nIG9uIGRlc2t0b3AgaWNvbnMgKHRodXMKICAgb2JzY3VyaW5nIHRoZSBjb25jZXB0IG9mICJjdXJyZW50IGRpcmVjdG9yeSIpLCBhbmQgY2FuIGhhdmUgYSBkb3dubG9hZAogICBkaXJlY3RvcnksIGFuZCBjYW4gY3JlYXRlIGRpcmVjdG9yaWVzIGZvciBpbmNvbWluZyBmaWxlcyBvbiB0aGUgZmx5LAogICBldGMsIHNvbWV0aW1lcyBpdCBpcyBlYXN5IHRvIGxvc2UgYSBmaWxlIGFmdGVyIHRyYW5zZmVyLiBPZiBjb3Vyc2UsIGlmCiAgIHlvdSBrZWVwIGEgdHJhbnNhY3Rpb24gbG9nOgoKICBMT0cgVFJBTlNBQ1RJT05TCgogICBpdCB3aWxsIHJlY29yZCB0aGUgZmF0ZSBhbmQgZmluYWwgcmVzdGluZyBwbGFjZSBvZiBlYWNoIGZpbGUuIEJ1dCBpbgogICBjYXNlIHlvdSBkaWQgbm90IGtlZXAgYSBsb2csIHRoZSBuZXcgY29tbWFuZDoKCiAgV0hFUkUKCiAgIGFkZGVkIGluIEMtS2VybWl0IDcuMCwgZ2l2ZXMgeW91IGFzIG11Y2ggaW5mb3JtYXRpb24gYXMgaXQgaGFzIGFib3V0CiAgIHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCBmaWxlcyB0cmFuc2ZlcnJlZCwgaW5jbHVkaW5nIHRoZSBwYXRobmFtZQogICByZXBvcnRlZCBieSB0aGUgcmVjZWl2aW5nIEtlcm1pdCwgaWYgYW55LCB3aGVuIEMtS2VybWl0IGlzIHRoZSBzZW5kZXIuCiAgIFRoaXMgaW5mb3JtYXRpb24gd2FzIGFsc28gYWRkZWQgdG8gU0hPVyBGSUxFIGluIHNvbWV3aGF0IGxlc3MgZGV0YWlsLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuMTMuIEZpbGUgT3V0cHV0IEJ1ZmZlciBDb250cm9sCgogICAoVU5JWCBvbmx5KS4gVGhlIG5ldyBjb21tYW5kIFNFVCBGSUxFIE9VVFBVVCBsZXRzIHlvdSBjb250cm9sIGhvdwogICBpbmNvbWluZyBmaWxlcyBhcmUgd3JpdHRlbiB0byBkaXNrOgoKICAgU0VUIEZJTEUgT1VUUFVUIEJVRkZFUkVEIFsgc2l6ZSBdCiAgICAgICAgICBDaG9vc2VzIGJ1ZmZlcmVkIGZpbGUgb3V0cHV0OyB0aGlzIGlzIHRoZSBkZWZhdWx0LiBVTklYIGRvZXMKICAgICAgICAgIGl0cyBub3JtYWwgc29ydCBvZiBkaXNrIGJ1ZmZlcmluZy4gVGhlIG9wdGlvbmFsIHNpemUgc3BlY2lmaWVzCiAgICAgICAgICBLZXJtaXQncyBvd24gZmlsZSBvdXRwdXQgYnVmZmVyIHNpemUsIGFuZCB0aGVyZWZvcmUgdGhlCiAgICAgICAgICBmcmVxdWVuY3kgb2YgZGlzayBhY2Nlc3NlcyAod3JpdGUoKSBzeXN0ZW0gY2FsbHMpIC0tIHRoZSBiaWdnZXIKICAgICAgICAgIHRoZSBzaXplLCB0aGUgZmV3ZXIgdGhlIGRpc2sgYWNjZXNzZXMuCgogICBTRVQgRklMRSBPVVRQVVQgVU5CVUZGRVJFRCBbIHNpemUgXQogICAgICAgICAgVGhpcyBmb3JjZXMgZWFjaCBmaWxlIG91dHB1dCB3cml0ZSgpIGNhbGwgdG8gYWN0dWFsbHkgY29tbWl0CiAgICAgICAgICB0aGUgZGF0YSB0byBkaXNrIGltbWVkaWF0ZWx5LiBDaG9vc2luZyB0aGlzIG9wdGlvbiB3aWxsIHVzdWFsbHkKICAgICAgICAgIHNsb3cgZmlsZSByZWNlcHRpb24gZG93bi4KCiAgIFNFVCBGSUxFIE9VVFBVVCBCTE9DS0lORwogICAgICAgICAgV3JpdGUoKSBjYWxscyBzaG91bGQgbm90IHJldHVybiB1bnRpbCB0aGV5IGFyZSBjb21wbGV0ZS4gVGhpcwogICAgICAgICAgaXMgdGhlIG5vcm1hbCBzZXR0aW5nLCBhbmQgaXQgbGV0cyBLZXJtaXQgZGV0ZWN0IGRpc2std3JpdGUKICAgICAgICAgIGVycm9ycyBpbW1lZGlhdGVseS4KCiAgIFNFVCBGSUxFIE9VVFBVVCBOT05CTE9DS0lORwogICAgICAgICAgV3JpdGUoKSBjYWxscyBzaG91bGQgcmV0dXJuIGltbWVkaWF0ZWx5LiBUaGlzIGNhbiBzcGVlZCB1cCBmaWxlCiAgICAgICAgICByZWNlcHRpb24sIGJ1dCBhbHNvIGRlbGF5IHRoZSBkZXRlY3Rpb24gb2YgZGlzay13cml0ZSBlcnJvcnMuCgogICBFeHBlcmltZW50YXRpb24gd2l0aCB0aGVzZSBwYXJhbWV0ZXJzIHNob3VsZCBiZSBoYXJtbGVzcywgYW5kIG1pZ2h0CiAgIChvciBtaWdodCBub3QpIGhhdmUgYSBwZXJjZXB0aWJsZSwgZXZlbiBkcmFtYXRpYywgZWZmZWN0IG9uCiAgIHBlcmZvcm1hbmNlLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuMTQuIEltcHJvdmVkIFJlc3BvbnNpdmVuZXNzCgogICBJbiB2ZXJzaW9uIDcuMCwgQy1LZXJtaXQncyBmaWxlLXRyYW5zZmVyIHByb3RvY29sIGVuZ2luZSBoYXMgYmVlbgogICB0dW5lZCBmb3IgYWRkaXRpb25hbCBzcGVlZCBhbmQgcmVzcG9uc2l2ZW5lc3MuCgogICAgICogQmluYXJ5LW1vZGUgdHJhbnNmZXJzIG92ZXIgOC1iaXQgY29ubmVjdGlvbnMsIGEgdmVyeSBjb21tb24gY2FzZSwKICAgICAgIGFyZSBub3cgaGFuZGxlZCBpbiBhIHNwZWNpYWwgd2F5IHRoYXQgbWluaW1pemVzIG92ZXJoZWFkLgogICAgICogU0VUIFRSQU5TRkVSIENSQy1DQUxDVUxBVElPTiBpcyBub3cgT0ZGIGJ5IGRlZmF1bHQsIHJhdGhlciB0aGFuCiAgICAgICBPTi4gKFRoaXMgYWZmZWN0cyBvbmx5IHRoZSBvdmVyYWxsIHBlci10cmFuc2ZlciBDUkMsIFx2KGNyYzE2KSwKICAgICAgIG5vdCB0aGUgcGVyLXBhY2tldCBDUkNzKQogICAgICogQ29ubmVjdGlvbiBsb3NzIGR1cmluZyBmaWxlIHRyYW5zZmVyIGlzIG5vdyBkZXRlY3RlZCBpbW1lZGlhdGVseQogICAgICAgaW4gbW9zdCBjYXNlcyBvbiBJbnRlcm5ldCBjb25uZWN0aW9ucyBhbmQgb24gc2VyaWFsIGNvbm5lY3Rpb25zCiAgICAgICB3aGVuIENBUlJJRVItV0FUQ0ggaXMgbm90IHNldCB0byBPRkYuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4xNS4gRG91YmxpbmcgYW5kIElnbm9yaW5nIENoYXJhY3RlcnMgZm9yIFRyYW5zcGFyZW5jeQoKICAgVGhlIGZvbGxvd2luZyBjb21tYW5kcyB3ZXJlIGFkZGVkIGluIDcuMCwgcHJpbWFyaWx5IHRvIGFsbG93CiAgIHN1Y2Nlc3NmdWwgZmlsZSB0cmFuc2ZlciB0aHJvdWdoIEFSUEFuZXQgVEFDcyBhbmQgd2l0aCBIb25leXdlbGwgRFBTNgogICBzeXN0ZW1zLCBidXQgY2FuIGJlIHVzZWQgaW4gYW55IHNldHRpbmcgd2hlcmUgdGhleSBtaWdodCBiZSBuZWVkZWQ6CgogICBTRVQgU0VORCBET1VCTEUtQ0hBUiB7IFsgY2hhciBbIGNoYXIgWyAuLi4gXSBdIF0sIE5PTkUgfQogICAgICAgICAgVGVsbHMgQy1LZXJtaXQgdG8gZG91YmxlIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVycyAodXNlIGRlY2ltYWwKICAgICAgICAgIG5vdGF0aW9uKSBpbiBwYWNrZXRzIHRoYXQgaXQgc2VuZHMuIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlCiAgICAgICAgICBzZW5kaW5nIGZpbGVzIHRocm91Z2ggYSBkZXZpY2UgdGhhdCB1c2VzIEAgYXMgYW4gZXNjYXBlCiAgICAgICAgICBjaGFyYWN0ZXIsIGJ1dCBhbGxvd3MgeW91IHRvIHNlbmQgYSBzaW5nbGUgY29weSBvZiBAIHRocm91Z2ggYnkKICAgICAgICAgIGRvdWJsaW5nIGl0LCB1c2UgInNldCBzZW5kIGRvdWJsZSA2NCIuCgogICBTRVQgUkVDRUlWRSBJR05PUkUtQ0hBUiBbIGNoYXIgWyBjaGFyIFsgLi4uIF0gXSBdCiAgICAgICAgICBUZWxscyBDLUtlcm1pdCB0byBpZ25vcmUgdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXIocykgaW4gaW5jb21pbmcKICAgICAgICAgIHBhY2tldHMuIFVzZSB0aGlzLCBmb3IgZXhhbXBsZSwgd2hlbiBzb21ldGhpbmcgYmV0d2VlbiB0aGUKICAgICAgICAgIHNlbmRlciBhbmQgcmVjZWl2ZXIgaXMgaW5zZXJ0aW5nIGxpbmVmZWVkcyBmb3Igd3JhcHBpbmcsIE5VTHMKICAgICAgICAgIGZvciBwYWRkaW5nLCBldGMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4xNi4gTmV3IEZpbGUtVHJhbnNmZXIgRGlzcGxheSBGb3JtYXRzCgogICBTRVQgVFJBTlNGRVIgRElTUExBWSB7IEJSSUVGLCBDUlQsIEZVTExTQ1JFRU4sIE5PTkUsIFNFUklBTCB9CiAgICAgICAgICBTZWxlY3RzIHRoZSBmaWxlLXRyYW5zZmVyIGRpc3BsYXkgZm9ybWF0LgoKICAgQlJJRUYgaXMgdGhlIG5ldyBvbmUuIFRoaXMgd3JpdGVzIG9uZSBsaW5lIHRvIHRoZSBzY3JlZW4gcGVyIGZpbGUsCiAgIHNob3dpbmcgdGhlIGZpbGUncyBuYW1lLCB0cmFuc2ZlciBtb2RlLCBzaXplLCB0aGUgc3RhdHVzIG9mIHRoZQogICB0cmFuc2ZlciwgYW5kIHdoZW4gdGhlIHRyYW5zZmVyIGlzIHN1Y2Nlc3NmdWwsIHRoZSBlZmZlY3RpdmUgZGF0YSByYXRlCiAgIGluIGNoYXJhY3RlcnMgcGVyIHNlY29uZCAoQ1BTKS4gRXhhbXBsZToKCiAgU0VORCBja2NmbjMubyAoYmluYXJ5KSAoNTkyMTYgYnl0ZXMpOiBPSyAoMC4xMDQgc2VjLCA1NzAyMDYgY3BzKQogIFNFTkQgY2tjZm5zLm8gKGJpbmFyeSkgKDExNDQzNiBieXRlcyk6IE9LICgwLjE0OCBzZWMsIDc3MjAwNiBjcHMpCiAgU0VORCBja2NtYWkuYyAodGV4dCkgKDc5MTQ3IGJ5dGVzKTogT0sgKDAuMTgwIHNlYywgNDM4NTQzIGNwcykKICBTRU5EIGNrY21haS5vIChiaW5hcnkpICgzNTM5NiBieXRlcyk6IE9LICgwLjA2MCBzZWMsIDU4NzQ5NCBjcHMpCiAgU0VORCBja2NuZXQubyAoYmluYXJ5KSAoNjI3NzIgYnl0ZXMpOiBSRUZVU0VECiAgU0VORCBja2Nwcm8ubyAoYmluYXJ5KSAoMTIxNDQ4IGJ5dGVzKTogT0sgKDAuMTczIHNlYywgNzAzOTI4IGNwcykKICBTRU5EIGNrY3Byby53ICh0ZXh0KSAoNjM2ODcgYnl0ZXMpOiBPSyAoMC4xNDEgc2VjLCA0NTMwNTkgY3BzKQogIFNFTkQgbWFrZWZpbGUgKHRleHQpICgxODY2MzYgYnl0ZXMpOiBPSyAoMC40NDQgc2VjLCA0MjA0NzEgY3BzKQogIFNFTkQgd2VybWl0IChiaW5hcnkpICgxMDY0OTYwIGJ5dGVzKTogT0sgKDIuMjA3IHNlYywgNDgyNDc3IGNwcykKCiAgIE5vdGUgdGhhdCB0cmFuc2ZlciB0aW1lcyBhcmUgbm93IG9idGFpbmVkIGluIGZyYWN0aW9uYWwgc2Vjb25kcywKICAgcmF0aGVyIHRoYW4gd2hvbGUgc2Vjb25kcywgc28gdGhlIENQUyBmaWd1cmVzIGFyZSBtb3JlIGFjY3VyYXRlICh0aGUKICAgZGlzcGxheSBzaG93cyAzIGRlY2ltYWwgcGxhY2VzLCBidXQgaW50ZXJuYWxseSB0aGUgZmlndXJlIGlzIGdlbmVyYWxseQogICBwcmVjaXNlIHRvIHRoZSBtaWNyb3NlY29uZCkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4xNy4gTmV3IFRyYW5zYWN0aW9uIExvZyBGb3JtYXRzCgogICBUaGUgbmV3IGNvbW1hbmQ6CgogIFNFVCBUUkFOU0FDVElPTi1MT0cgeyBWRVJCT1NFLCBGVFAsIEJSSUVGIFsgc2VwYXJhdG9yIF0gfQoKICAgbGV0cyB5b3UgY2hvb3NlIHRoZSBmb3JtYXQgb2YgdGhlIHRyYW5zYWN0aW9uIGxvZy4gVkVSQk9TRSAodGhlCiAgIGRlZmF1bHQpIGluZGljYXRlcyB0aGUgdHJhZGl0aW9uYWwgZm9ybWF0IGRlc2NyaWJlZCBpbiB0aGUgYm9vay4gQlJJRUYKICAgYW5kIEZUUCBhcmUgbmV3LiBUaGlzIGNvbW1hbmQgbXVzdCBiZSBnaXZlbiBwcmlvciB0byB0aGUgTE9HCiAgIFRSQU5TQUNUSU9OIGNvbW1hbmQgaWYgYSBub24tVkVSQk9TRSB0eXBlIGlzIGRlc2lyZWQuCgogICAgNC4xNy4xLiBUaGUgQlJJRUYgRm9ybWF0CgogICBCUklFRiBjaG9vc2VzIGEgb25lLWxpbmUgcGVyIGZpbGUgZm9ybWF0IHN1aXRhYmxlIGZvciBkaXJlY3QKICAgaW1wb3J0YXRpb24gaW50byBkYXRhYmFzZXMgbGlrZSBJbmZvcm1peCwgT3JhY2xlLCBvciBTeWJhc2UsIGluIHdoaWNoOgoKICAgICAqIEVhY2ggcmVjb3JkIGhhcyA4IGZpZWxkcy4KICAgICAqIEZpZWxkcyBhcmUgc2VwYXJhdGVkIGJ5IGEgbm9uLWFscGhhbnVtZXJpYyBzZXBhcmF0b3IgY2hhcmFjdGVyLgogICAgICogVGhlIGRlZmF1bHQgc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBjb21tYSAoLCkuCiAgICAgKiBBbnkgZmllbGQgY29udGFpbmluZyB0aGUgc2VwYXJhdG9yIGNoYXJhY3RlciBpcyBlbmNsb3NlZCBpbgogICAgICAgZG91YmxlcXVvdGVzLgogICAgICogVGhlIGZpbmFsIGZpZWxkIGlzIGVuY2xvc2VkIGluIGRvdWJsZXF1b3Rlcy4KCiAgIFRoZSBmaWVsZHMgYXJlOgoKICAgIDEuIERhdGUgaW4geXl5eW1tZGQgZm9ybWF0CiAgICAyLiBUaW1lIGluIGhoOm1tOnNzIGZvcm1hdAogICAgMy4gQWN0aW9uOiBTRU5EIG9yIFJFQ1YKICAgIDQuIFRoZSBsb2NhbCBmaWxlbmFtZQogICAgNS4gVGhlIHNpemUgb2YgdGhlIGZpbGUKICAgIDYuIFRoZSB0cmFuc2ZlciBtb2RlICh0ZXh0LCBiaW5hcnksIGltYWdlLCBsYWJlbGVkKQogICAgNy4gVGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNmZXI6IE9LIG9yIEZBSUxFRAogICAgOC4gQWRkaXRpb25hbCBzdGF0dXMtZGVwZW5kZW50IGluZm8sIGluIGRvdWJsZXF1b3Rlcy4KCiAgIEV4YW1wbGVzOgoKICAyMDAwMDIwOCwxMjowODo1MixSRUNWLC91L29sZ2Evb29mYS50eHQsNTI0Nix0ZXh0LE9LLCIwLjI4NHNlYyAxODQ0M2NwcyIKICAyMDAwMDIwOCwxMjowOTozMSxTRU5ELC91L29sZ2Evb29mYS5leGUsMzI3NjgsYmluYXJ5LE9LLCIxLjI0M3NlYyAyNjM2MmNwcyIKICAyMDAwMDIwOCwxMjoxMDowMixTRU5ELCIvdS9vbGdhL2EsYiIsMTAxMzAsdGV4dCxGQUlMRUQsIlJlZnVzZWQ6IGRhdGUiCgogICBOb3RlIGhvdyB0aGUgZmlsZW5hbWUgaXMgZW5jbG9zZWQgaW4gZG91YmxlcXVvdGVzIGluIHRoZSBmaW5hbAogICBleGFtcGxlLCBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgY29tbWEuCgogICBUbyBvYnRhaW4gQlJJRUYgZm9ybWF0LCB5b3UgbXVzdCBnaXZlIHRoZSBTRVQgVFJBTlNBQ1RJT04tTE9HIEJSSUVGCiAgIGNvbW1hbmQgYmVmb3JlIHRoZSBMT0cgVFJBTlNBQ1RJT05TIGNvbW1hbmQuIChJZiB5b3UgZ2l2ZSB0aGVtIGluIHRoZQogICBvcHBvc2l0ZSBvcmRlciwgYSBoZWFkaW5nIGlzIHdyaXR0ZW4gdG8gdGhlIGxvZyBieSB0aGUgTE9HIGNvbW1hbmQuKQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4xNy4yLiBUaGUgRlRQIEZvcm1hdAoKICAgU0VUIFRSQU5TQUNUSU9OLUxPRyBGVFAgKGF2YWlsYWJsZSBvbmx5IGluIFVOSVgpIGNob29zZXMgYSBmb3JtYXQgdGhhdAogICBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFdVLUZUUEQgKFdhc2hpbmd0b24gVW5pdmVyc2l0eSBGVFAgZGFlbW9uKSBsb2csCiAgIGFuZCBzbyBjYW4gYmUgcHJvY2Vzc2VkIGJ5IGFueSBzb2Z0d2FyZSB0aGF0IHByb2Nlc3NlcyB0aGUgV1UtRlRQRAogICBsb2cuIEl0IGxvZ3Mgb25seSB0cmFuc2ZlcnMgaW4gYW5kIG91dCwgYm90aCBzdWNjZXNzZnVsIGFuZCBmYWlsZWQKICAgKGJ1dCBzdWNjZXNzIG9yIGZhaWx1cmUgaXMgbm90IGluZGljYXRlZCwgZHVlIHRvIGxhY2sgb2YgYSBmaWVsZCBpbgogICB0aGUgV1UtRlRQRCBsb2cgZm9ybWF0IGZvciB0aGlzIHB1cnBvc2UpLiBOb24tdHJhbnNmZXIgZXZlbnRzIGFyZSBub3QKICAgcmVjb3JkZWQuCgogICBVbmxpa2Ugb3RoZXIgbG9ncywgdGhlIEZUUC1mb3JtYXQgdHJhbnNhY3Rpb24gbG9nIGlzIG9wZW5lZCBpbiBhcHBlbmQKICAgbW9kZSBieSBkZWZhdWx0LiBUaGlzIGFsbG93cyB5b3UgdG8gZWFzaWx5IGtlZXAgYSByZWNvcmQgb2YgYWxsIHlvdXIKICAga2VybWl0IHRyYW5zZmVycywgYW5kIGl0IGFsc28gYWxsb3dzIHRoZSBzYW1lIGxvZyB0byBiZSBzaGFyZWQgYnkKICAgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIEtlcm1pdCBwcm9jZXNzZXMgb3IgKHBlcm1pc3Npb25zIHBlcm1pdHRpbmcpCiAgIHVzZXJzLiBZb3UgY2FuLCBvZiBjb3Vyc2UsIGZvcmNlIGNyZWF0aW9uIG9mIGEgbmV3IGxvZ2ZpbGUgYnkKICAgc3BlY2lmeWluZyB0aGUgTkVXIGtleXdvcmQgYWZ0ZXIgdGhlIGZpbGVuYW1lLCBlLmcuCgogIGxvZyB0cmFuc2FjdGlvbnMgb29mYS5sb2cgbmV3CgogICBBbGwgcmVjb3JkcyBpbiB0aGUgRlRQLXN0eWxlIGxvZyBhcmUgaW4gYSBjb25zaXN0ZW50IGZvcm1hdC4gVGhlIGZpcnN0CiAgIGZpZWxkIGlzIGZpeGVkLWxlbmd0aCBhbmQgY29udGFpbnMgc3BhY2VzOyBzdWJzZXF1ZW50IGZpZWxkcyBhcmUKICAgdmFyaWFibGUgbGVuZ3RoLCBjb250YWluIG5vIHNwYWNlcywgYW5kIGFyZSBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUKICAgc3BhY2VzLiBUaGUgZmllbGRzIGFyZToKCiAgIFRpbWVzdGFtcAogICAgICAgICAgVGhpcyBpcyBhbiBhc2N0aW1lLXN0eWxlIHRpbWVzdGFtcCwgZXhhbXBsZTogIldlZCBTZXAgMTYKICAgICAgICAgIDIwOjE5OjA1IDE5OTkiIEl0IGlzIGFsd2F5cyBleGFjdGx5IDI0IGNoYXJhY3RlcnMgbG9uZywgYW5kIHRoZQogICAgICAgICAgc3ViZmllbGRzIGFyZSBhbHdheXMgaW4gZml4ZWQgcG9zaXRpb25zLgoKICAgRWxhcHNlZCB0aW1lCiAgICAgICAgICBUaGUgd2hvbGUgbnVtYmVyIG9mIHNlY29uZHMgcmVxdWlyZWQgdG8gdHJhbnNmZXIgdGhlIGZpbGUsIGFzIGEKICAgICAgICAgIHN0cmluZyBvZiBkZWNpbWFsIGRpZ2l0cywgZS5nLiAiMjQiLgoKICAgQ29ubmVjdGlvbgogICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIG5ldHdvcmsgaG9zdCB0byB3aGljaCBDLUtlcm1pdCBpcyBjb25uZWN0ZWQsIG9yCiAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgc2VyaWFsIGRldmljZSB0aHJvdWdoIHdoaWNoIGl0IGhhcyBkaWFsZWQgKG9yCiAgICAgICAgICBoYXMgYSBkaXJlY3QgY29ubmVjdGlvbiksIG9yICIvZGV2L3R0eSIgZm9yIHRyYW5zZmVycyBpbiByZW1vdGUKICAgICAgICAgIG1vZGUuCgogICBCeXRlcyB0cmFuc2ZlcnJlZAogICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyB0cmFuc2ZlcnJlZCwgZGVjaW1hbCBkaWdpdHMsIGUuZy4KICAgICAgICAgICIxNTM3OTA0Ii4KCiAgIEZpbGVuYW1lCiAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdhcyB0cmFuc2ZlcnJlZCwgZS5nLgogICAgICAgICAgIi9wdWIvZnRwL2tlcm1pdC9hL1JFQURNRS5UWFQiLiBJZiB0aGUgZmlsZW5hbWUgY29udGFpbnMgYW55CiAgICAgICAgICBzcGFjZXMgb3IgY29udHJvbCBjaGFyYWN0ZXJzLCBlYWNoIHN1Y2ggY2hhcmFjdGVyIGlzIHJlcGxhY2VkCiAgICAgICAgICBieSBhbiB1bmRlcnNjb3JlICgnXycpIGNoYXJhY3Rlci4KCiAgIE1vZGUKICAgICAgICAgIFRoZSBsZXR0ZXIgJ2InIGlmIHRoZSBmaWxlIHdhcyB0cmFuc2ZlcnJlZCBpbiBiaW5hcnkgbW9kZSwgb3IKICAgICAgICAgICdhJyBpZiBpdCB3YXMgdHJhbnNmZXJyZWQgaW4gdGV4dCAoQVNDSUkpIG1vZGUuCgogICBPcHRpb25zCiAgICAgICAgICBUaGlzIGZpZWxkIGFsd2F5cyBjb250YWlucyBhbiB1bmRlcnNjb3JlICgnXycpIGNoYXJhY3Rlci4KCiAgIERpcmVjdGlvbgogICAgICAgICAgVGhlIGxldHRlciAnbycgaWYgdGhlIGZpbGUgd2FzIHRyYW5zZmVycmVkIE91dCwgYW5kICdpJyBpZiB0aGUKICAgICAgICAgIGZpbGUgd2FzIHRyYW5zZmVycmVkIEluLgoKICAgVXNlciBjbGFzcwogICAgICAgICAgVGhlIGxldHRlciAncicgaW5kaWNhdGVzIHRoZSBmaWxlIHdhcyB0cmFuc2ZlcnJlZCBieSBhIFJlYWwKICAgICAgICAgIHVzZXIuCgogICBVc2VyIGlkZW50aWZpY2F0aW9uCiAgICAgICAgICBUaGUgSUQgb2YgdGhlIHVzZXIgd2hvIHRyYW5zZmVycmVkIHRoZSBmaWxlLgoKICAgU2VydmVyIGlkZW50aWZpY2F0aW9uCiAgICAgICAgICBUaGUgc3RyaW5nICJrZXJtaXQiLiBUaGlzIGRpc3Rpbmd1aXNoZXMgYSBLZXJtaXQgdHJhbnNmZXIgbG9nCiAgICAgICAgICByZWNvcmQgZnJvbSBhIFdVLUZUUEQgcmVjb3JkLCB3aGljaCBjb250YWlucyAiZnRwIiBpbiB0aGlzCiAgICAgICAgICBmaWVsZC4KCiAgIEF1dGhlbnRpY2F0aW9uIGNsYXNzCiAgICAgICAgICBUaGUgZGlnaXQgJzEnIGlmIHdlIGtub3cgdGhlIHVzZXIncyBJRCBvbiB0aGUgY2xpZW50IHN5c3RlbSwKICAgICAgICAgIG90aGVyd2lzZSAnMCcuIEN1cnJlbnRseSwgYWx3YXlzICcwJy4KCiAgIEF1dGhlbnRpY2F0ZWQgdXNlcgogICAgICAgICAgSWYgdGhlIGF1dGhlbnRpY2F0aW9uIGNsYXNzIGlzICcxJywgdGhpcyBpcyB0aGUgdXNlcidzIElEIG9uCiAgICAgICAgICB0aGUgY2xpZW50IHN5c3RlbS4gT3RoZXJ3aXNlIGl0IGlzIGFuIGFzdGVyaXNrICgnKicpLiBDdXJyZW50bHkKICAgICAgICAgIGl0IGlzIGFsd2F5cyBhbiBhc3Rlcmlzay4KCiAgIEV4YW1wbGVzOgoKICBUaHUgT2N0IDIyIDE3OjQyOjQ4IDE5OTggMCAqIDk0IC91c3Ivb2xnYS9uZXcueCBhIF8gaSByIG9sZ2Ega2VybWl0IDAgKgogIFRodSBPY3QgMjIgMTc6NTE6MjkgMTk5OCAxICogMTQ3ODk5IC91c3Ivb2xnYS90ZXN0LmMgYSBfIG8gciBvbGdhIGtlcm1pdCAwICoKICBUaHUgT2N0IDIyIDE3OjUxOjQ0IDE5OTggMSAqIDIzNSAvdXNyL29sZ2EvdGVzdC5vIGIgXyBpIHIgb2xnYSBrZXJtaXQgMCAqCiAgRnJpIE9jdCAyMyAxMjoxMDoyNSAxOTk4IDAgKiAyMzUgL3Vzci9vbGdhL3gua3NjIGEgXyBvIHIgb2xnYSBrZXJtaXQgMCAqCgogICBOb3RlIHRoYXQgYW4gZnRwLWZvcm1hdCB0cmFuc2FjdGlvbiBsb2cgY2FuIGFsc28gYmUgc2VsZWN0ZWQgb24gdGhlCiAgIEtlcm1pdCBjb21tYW5kIGxpbmUgYXMgZm9sbG93czoKCiAga2VybWl0IC0teGZlcmZpbGU6ZmlsZXNwZWMKCiAgIFRoaXMgaXMgZXF1aXZhbGVudCB0bzoKCiAgU0VUIFRSQU5TQUNUSU9OLUxPRyBGVFAKICBMT0cgVFJBTlNBQ1RJT05TIGZpbGVzcGVjIEFQUEVORAoKICAgQ29uY2VpdmFibHkgaXQgY291bGQgYmUgcG9zc2libGUgdG8gaGF2ZSBhIHN5c3RlbS13aWRlIHNoYXJlZCBLZXJtaXQKICAgbG9nLCBleGNlcHQgdGhhdCBVTklYIGxhY2tzIGFueSBub3Rpb24gb2YgYW4gYXBwZW5kLW9ubHkgZmlsZTsgdGh1cwogICBhbnkgdXNlciB3aG8gY291bGQgYXBwZW5kIHRvIHRoZSBsb2cgY291bGQgYWxzbyBkZWxldGUgaXQgKG9yIGFsdGVyCiAgIGl0KS4gVGhpcyBwcm9ibGVtIGNvdWxkIGJlIHdvcmtlZCBhcm91bmQgdXNpbmcgc2V0dWlkL3NldGdpZCB0cmlja3MsCiAgIGJ1dCB0aGVzZSB3b3VsZCBtb3N0IGxpa2VseSBpbnRlcmZlcmUgd2l0aCB0aGUgb3RoZXIgc2V0dWlkL3NldGdpZAogICB0cmlja3MgQy1LZXJtaXQgbXVzdCB1c2UgZm9yIGdldHRpbmcgYXQgZGlhbG91dCBkZXZpY2VzIGFuZCBVVUNQCiAgIGxvZ2ZpbGVzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuMTguIFVucHJlZml4aW5nIE5VTAoKICAgQXMgb2YgNi4xLjE5MyBBbHBoYS4xMCwgQy1LZXJtaXQgY2FuIGZpbmFsbHkgc2VuZCBhbmQgcmVjZWl2ZQogICBmaWxlLXRyYW5zZmVyIHBhY2tldHMgaW4gd2hpY2ggTlVMIChBU0NJSSAwKSBpcyB1bnByZWZpeGVkIChubyBtb3JlCiAgIE5VTC10ZXJtaW5hdGVkIHBhY2tldHMhKS4gTlVMIGlzLCBvZiBjb3Vyc2UsIGV4dHJlbWVseSBwcmV2YWxlbnQgaW4KICAgYmluYXJ5IGZpbGVzIHN1Y2ggYXMgZXhlY3V0YWJsZXMsIGFuZCB0aGlzIGhhcyBiZWVuIGEgc2lnbmlmaWNhbnQKICAgc291cmNlIG9mIHBhY2tldCBvdmVyaGVhZC4gRm9yIGV4YW1wbGUsIHdoZW4gdHJhbnNmZXJyaW5nIGl0c2VsZiAodGhlCiAgIFN1bk9TIEMtS2VybWl0IGV4ZWN1dGFibGUpIHdpdGggbWluaW1hbCBwcmVmaXhpbmcgYW5kIDkwMDAtYnl0ZQogICBwYWNrZXRzLCB3ZSBzZWU6CgogIEZpbGUgc2l6ZTogICAgICAgICAgICAgICAgICAgICAgIDEwNjQ5NjAKICBQYWNrZXQgY2hhcnMgd2l0aCAwIHByZWZpeGVkOiAgICAxMTk5NjI5ICBvdmVyaGVhZCA9IDEyLjY1JQogIFBhY2tldCBjaGFycyB3aXRoIDAgdW5wcmVmaXhlZDogIDEwNjIzOTMgIG92ZXJoZWFkID0gLTAuMDMlCgogICBUcmFuc2ZlciByYXRlcyBnbyB1cCBhY2NvcmRpbmdseSwgbm90IG9ubHkgYmVjYXVzZSBvZiB0aGUgcmVkdWNlZAogICBhbW91bnQgb2YgaS9vLCBidXQgYWxzbyBiZWNhdXNlIGxlc3MgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgb24gZWFjaAogICBlbmQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4xOS4gQ2xlYXItQ2hhbm5lbCBQcm90b2NvbAoKICAgTm93IHRoYXQgQy1LZXJtaXQgaXRzZWxmIGlzIGNhcGFibGUgb2Ygc2VuZGluZyBhbmQgcmVjZWl2aW5nIGFueSBieXRlCiAgIGF0IGFsbCBvbiBhIGNsZWFyIGNoYW5uZWwgKFs1MTZdU2VjdGlvbiA0LjE4KSwgaXQgaXMsIGZvciB0aGUgZmlyc3QKICAgdGltZSwgaW4gYSBwb3NpdGlvbiB0byBuZWdvdGlhdGUgYSBjbGVhciBjaGFubmVsIHdpdGggdGhlIG90aGVyCiAgIEtlcm1pdCwgZ2l2aW5nIGl0IHBlcm1pc3Npb24gKGJ1dCBub3QgcmVxdWlyaW5nIGl0KSB0byB1bnByZWZpeCBhbnkKICAgYW5kIGFsbCBjaGFyYWN0ZXJzIHRoYXQgaXQga25vd3MgYXJlIHNhZmUuIEluIGdlbmVyYWwgdGhpcyBtZWFucyBhbGwKICAgYnV0IHRoZSBLZXJtaXQgc3RhcnQtb2YtcGFja2V0IGNoYXJhY3RlciAobm9ybWFsbHkgQ3RybC1BKSwgQ2FycmlhZ2UKICAgUmV0dXJuIChub3Qgb25seSBLZXJtaXQncyBlbmQtb2YtcGFja2V0IGNoYXJhY3RlciwgYnV0IGFsc28gdHJlYXRlZAogICBzcGVjaWFsbHkgb24gVGVsbmV0IE5WVCBsaW5rcyksIGFuZCBJQUMgKDI1NSwgYWxzbyBzcGVjaWFsIHRvIFRlbG5ldCkuCgogICBCeSBkZWZhdWx0LCBDLUtlcm1pdCB3aWxsIHNheSBpdCBoYXMgYSBjbGVhciBjaGFubmVsIG9ubHkgaWYgaXQgaGFzCiAgIG9wZW5lZCBhIFRDUCBzb2NrZXQuIFNpbmNlIHRoZSBLZXJtaXQgcHJvZ3JhbSBvbiB0aGUgZmFyIGVuZCBvZiBhCiAgIFRDUC9JUCBjb25uZWN0aW9uIGdlbmVyYWxseSBkb2VzIG5vdCBrbm93IGl0IGhhcyBhIFRDUC9JUCBjb25uZWN0aW9uLAogICBpdCB3aWxsIG5vdCBhbm5vdW5jZSBhIGNsZWFyIGNoYW5uZWwgdW5sZXNzIGl0IGhhcyBiZWVuIHRvbGQgdG8gZG8gc28uCiAgIFRoZSBjb21tYW5kIGlzOgoKICAgU0VUIENMRUFSLUNIQU5ORUwgeyBPTiwgT0ZGLCBBVVRPIH0KCiAgIEFVVE8gaXMgdGhlIGRlZmF1bHQsIG1lYW5pbmcgdGhhdCB0aGUgY2xlYXItY2hhbm5lbCBzdGF0dXMgaXMKICAgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIHR5cGUgb2YgY29ubmVjdGlvbi4gT04gbWVhbnMgdG8KICAgYW5ub3VuY2UgYSBjbGVhciBjaGFubmVsLCBPRkYgbWVhbnMgbm90IHRvIGFubm91bmNlIGl0LiBVc2UgU0hPVwogICBTVFJFQU1JTkcgKFs1MTddU2VjdGlvbiA0LjIwKSB0byBzZWUgdGhlIGN1cnJlbnQgQ0xFQVItQ0hBTk5FTCBzdGF0dXMuCiAgIFN5bm9ueW06IFNFVCBDTEVBUkNIQU5ORUwuCgogICBDTEVBUi1DSEFOTkVMIGlzIGFsc28gc2V0IGlmIHlvdSBzdGFydCBDLUtlcm1pdCB3aXRoIHRoZSAtSSBzd2l0Y2gKICAgKHNlZSBbNTE4XVNlY3Rpb24gNC4yMCkuCgogICBXaGVuZXZlciBhIGNsZWFyIGNoYW5uZWwgaXMgbmVnb3RpYXRlZCwgdGhlIHJlc3VsdGluZwogICBjb250cm9sLWNoYXJhY3RlciB1bnByZWZpeGluZyBpcyAic3RpY2t5IjsgdGhhdCBpcywgaXQgcmVtYWlucyBpbgogICBlZmZlY3QgYWZ0ZXIgdGhlIHRyYW5zZmVyIHNvIHlvdSBjYW4gdXNlIFNIT1cgQ09OVFJPTCB0byBzZWUgd2hhdCB3YXMKICAgbmVnb3RpYXRlZC4KCiAgIFlvdSBjYW4gYWxzbyBzZWUgd2hldGhlciBhIGNsZWFyIGNoYW5uZWwgd2FzIG5lZ290aWF0ZWQgaW4gdGhlCiAgIFNUQVRJU1RJQ1MgL1ZFUkJPU0UgRGlzcGxheS4KCiAgIFRoZSBhZHZhbnRhZ2Ugb2YgdGhlIGNsZWFyIGNoYW5uZWwgZmVhdHVyZSBpcyB0aGF0IGl0IGNhbiBtYWtlIGZpbGUKICAgdHJhbnNmZXJzIGdvIGZhc3RlciBhdXRvbWF0aWNhbGx5LiBUaGUgZGlzYWR2YW50YWdlIHdvdWxkIGJlCiAgIGZpbGUtdHJhbnNmZXIgZmFpbHVyZXMgaWYgdGhlIGNoYW5uZWwgaXMgbm90IHRydWx5IGNsZWFyLCBmb3IgZXhhbXBsZQogICBpZiBDLUtlcm1pdCBtYWRlIGEgVGVsbmV0IGNvbm5lY3Rpb24gdG8gYSB0ZXJtaW5hbCBzZXJ2ZXIsIGFuZCB0aGVuCiAgIGRpYWxlZCBvdXQgZnJvbSB0aGVyZTsgb3IgaWYgQy1LZXJtaXQgbWFkZSBhbiBSbG9naW4gY29ubmVjdGlvbiB0bwogICBob3N0IGFuZCB0aGVuIG1hZGUgYSBUZWxuZXQgY29ubmVjdGlvbiBmcm9tIHRoZXJlIHRvIGFub3RoZXIgaG9zdC4gSWYKICAgYSBmaWxlIHRyYW5zZmVyIGZhaWxzIG9uIGEgVENQL0lQIGNvbm5lY3Rpb24sIHVzZSBTSE9XIENPTlRST0wgdG8KICAgY2hlY2sgd2hldGhlciBjb250cm9sIGNoYXJhY3RlcnMgYmVjYW1lIHVucHJlZml4ZWQgYXMgYSByZXN1bHQgb2YKICAgcHJvdG9jb2wgbmVnb3RpYXRpb25zLCBhbmQvb3IgU0hPVyBTVFJFQU1JTkcgKFs1MTldU2VjdGlvbiA0LjIwKSB0bwogICBzZWUgaWYgImNsZWFyLWNoYW5uZWwiIHdhcyBuZWdvdGlhdGVkLiBJZiB0aGlzIGhhcHBlbmVkLCB1c2UgU0VUCiAgIENMRUFSLUNIQU5ORUwgT0ZGIGFuZCBTRVQgUFJFRklYSU5HIENBVVRJT1VTIChvciB3aGF0ZXZlcikgdG8gcHJldmVudAogICBpdCBmcm9tIGhhcHBlbmluZyBhZ2Fpbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA0LjIwLiBTdHJlYW1pbmcgUHJvdG9jb2wKCiAgIEEgbmV3IEtlcm1pdCBwcm90b2NvbCBvcHRpb24gY2FsbGVkICJzdHJlYW1pbmciIHdhcyBhZGRlZCBpbiBDLUtlcm1pdAogICA3LjAuIFRoZSBpZGVhIGlzIHRoYXQgaWYgdGhlIHR3byBLZXJtaXQgcGFydG5lcnMgaGF2ZSBhIHJlbGlhYmxlCiAgIHRyYW5zcG9ydCAoc3VjaCBhcyBUQ1AvSVAgb3IgWC4yNSkgYmV0d2VlbiB0aGVtLCB0aGVuIHRoZXJlIGlzIG5vIG5lZWQKICAgdG8gc2VuZCBBQ0tzIGZvciBEYXRhIHBhY2tldHMsIG9yIE5BS3MsIHNpbmNlIGEgcmVsaWFibGUgdHJhbnNwb3J0CiAgIHdpbGwsIGJ5IGRlZmluaXRpb24sIGRlbGl2ZXIgYWxsIHBhY2tldHMgaW4gb3JkZXIgYW5kIHVuZGFtYWdlZC4gT24KICAgc3VjaCBhIGNvbm5lY3Rpb24sIHN0cmVhbWluZyBjdXRzIGRvd24gbm90IG9ubHkgb24gS2VybWl0IHByb2dyYW0KICAgb3ZlcmhlYWQgKHN3aXRjaGluZyBiYWNrIGFuZCBmb3J0aCBiZXR3ZWVuIHJlYWRpbmcgYW5kIHNlbmRpbmcKICAgcGFja2V0cyksIGJ1dCBhbHNvIHRlbmRzIHRvIG1ha2UgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0IHVzZSBpdHNlbGYKICAgbW9yZSBlZmZpY2llbnRseSAoZS5nLiBieSBkZWZlYXRpbmcgdGhlIE5hZ2xlIGFsZ29yaXRobSBhbmQvb3IgRGVsYXllZAogICBBQ0sgc3RyYXRhZ2VtIG9mIHRoZSBUQ1AgbGF5ZXIpLiBGdXJ0aGVybW9yZSwgaXQgYWxsb3dzIHRyYW5zZmVycyB0bwogICB3b3JrIHNtb290aGx5IG9uIGV4dHJlbWVseSBzbG93IG5ldHdvcmsgY29uZ2VzdGlvbnMgdGhhdCB3b3VsZAogICBvdGhlcndpc2UgY2F1c2UgdGltZW91dHMgYW5kIHJldHJhbnNtaXNzaW9ucywgYW5kIGV2ZW4gZmFpbHVyZSB3aGVuCiAgIHRoZSByZXRyeSBsaW1pdCB3YXMgZXhjZWVkZWQuCgogICBUaGUgdHJpY2sgaXMga25vd2luZyB3aGVuIHdlIGNhbiBzdHJlYW06CgogICAgMS4gSWYgQy1LZXJtaXQgaGFzIG9wZW5lZCBhIFRDUCBzb2NrZXQgb3IgWC4yNSBjb25uZWN0aW9uLCBpdCBvZmZlcnMKICAgICAgIHN0cmVhbS4KICAgIDIuIElmIEMtS2VybWl0IGhhcyBiZWVuIHN0YXJ0ZWQgd2l0aCB0aGUgLUkgKHVwcGVyY2FzZSkgb3B0aW9uLCBvciBpZgogICAgICAgaXQgaGFzIGJlZW4gdG9sZCB0byBTRVQgUkVMSUFCTEUgT04sIGl0IG9mZmVycyB0byBzdHJlYW0uCiAgICAzLiBJZiBDLUtlcm1pdCBpcyBpbiByZW1vdGUgbW9kZSwgYW5kIGhhcyBiZWVuIHRvbGQgdG8gU0VUIFJFTElBQkxFCiAgICAgICBBVVRPIChvciBPTiksIGl0IGFsd2F5cyBvZmZlcnMgdG8gc3RyZWFtLCBhbmQgYWxzbyBhbHdheXMgYWdyZWVzCiAgICAgICB0byBzdHJlYW0sIGlmIHRoZSBvdGhlciBLZXJtaXQgb2ZmZXJzLiBVbmxlc3MgeW91IHRha2UgZXhwbGljaXQKICAgICAgIGFjdGlvbnMgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHRzLCB0aGlzIGFsbG93cyB0aGUgbG9jYWwgS2VybWl0CiAgICAgICAodGhlIG9uZSB0aGF0IG1hZGUgdGhlIGNvbm5lY3Rpb24sIGFuZCBzbyBrbm93cyB3aGV0aGVyIGl0J3MKICAgICAgIHJlbGlhYmxlKSB0byBjb250cm9sIHN0cmVhbWluZy4KCiAgIChOb3RlIHRoYXQgYW4gb2ZmZXIgdG8gc3RyZWFtIGFsc28gcmVzdWx0cyBpbiBhIENsZWFyLUNoYW5uZWwKICAgYW5ub3VuY2VtZW50IGlmIENMRUFSLUNIQU5ORUwgaXMgc2V0IHRvIEFVVE87IHNlZSBbNTIwXVNlY3Rpb24gNC4xOS4pCgogICBXaGVuIEJPVEggS2VybWl0cyBvZmZlciB0byBzdHJlYW0sIHRoZW4gdGhleSBzdHJlYW07IG90aGVyd2lzZSB0aGV5CiAgIGRvbid0LiBUaHVzIHN0cmVhbWluZy1jYXBhYmxlIEtlcm1pdCBwcm9ncmFtcyBpbnRlcm9wZXJhdGUKICAgYXV0b21hdGljYWxseSBhbmQgdHJhbnNwYXJlbnRseSB3aXRoIG5vbnN0cmVhbWluZyBvbmVzLiBJZiB0aGUgdHdvCiAgIEtlcm1pdHMgZG8gYWdyZWUgdG8gc3RyZWFtLCB5b3UnbGwgc2VlIHRoZSB3b3JkICJTVFJFQU1JTkciIG9uIHRoZQogICBmdWxsc2NyZWVuIGZpbGUtdHJhbnNmZXIgZGlzcGxheSBpbiB0aGUgV2luZG93IFNsb3RzIGZpZWxkLiBZb3UgY2FuCiAgIGFsc28gZmluZCBvdXQgYWZ0ZXJ3YXJkcyB3aXRoIHRoZSBTVEFUSVNUSUNTIG9yIFNIT1cgU1RSRUFNSU5HCiAgIGNvbW1hbmRzLgoKICAgICBXQVJOSU5HOiBBdXRvbWF0aWMgY2hvaWNlIG9mIHN0cmVhbWluZyBpcyBiYXNlZCBvbiB0aGUgYXNzdW1wdGlvbgogICAgIG9mIGEgImRpcmVjdCIgZW5kLXRvLWVuZCBuZXR3b3JrIGNvbm5lY3Rpb247IGZvciBleGFtcGxlLCBhIFRlbG5ldAogICAgIG9yIFJsb2dpbiBjb25uZWN0aW9uIGZyb20gaG9zdCBBIHRvIGhvc3QgQiwgYW5kIHRyYW5zZmVycmluZyBmaWxlcwogICAgIGJldHdlZW4gQSBhbmQgQi4gSG93ZXZlciwgaWYgeW91ciBjb25uZWN0aW9uIGhhcyBhZGRpdGlvbmFsCiAgICAgY29tcG9uZW50cyAtLSBzb21ldGhpbmcgImluIHRoZSBtaWRkbGUiIChCKSB0aGF0IHlvdSBoYXZlIG1hZGUgYQogICAgIG5ldHdvcmsgY29ubmVjdGlvbiB0bywgd2hpY2ggbWFrZXMgYSBzZXBhcmF0ZSBjb25uZWN0aW9uIHRvIHRoZQogICAgIGRlc3RpbmF0aW9uIGhvc3QgKEMpLCB0aGVuIHlvdSBkb24ndCByZWFsbHkgaGF2ZSBhIHJlbGlhYmxlCiAgICAgY29ubmVjdGlvbiwgYnV0IEMtS2VybWl0IGhhcyBubyB3YXkgb2Yga25vd2luZyB0aGlzOyB0cmFuc2ZlcnJpbmcKICAgICBmaWxlcyBiZXR3ZWVuIEEgYW5kIEMgd2lsbCBwcm9iYWJseSBmYWlsLiBJbiBzdWNoIGNhc2VzLCB5b3UnbGwKICAgICBuZWVkIHRvIHRlbGwgdGhlICpsb2NhbCogQy1LZXJtaXQgdG8gInNldCByZWxpYWJsZSBvZmYiIGJlZm9yZQogICAgIHRyYW5zZmVycmluZyBmaWxlcyAoaXQgZG9lcyBubyBnb29kIHRvIGdpdmUgdGhpcyBjb21tYW5kIHRvIHRoZQogICAgIHJlbW90ZSBLZXJtaXQgc2luY2UgdGhlIGxvY2FsIG9uZSBjb250cm9scyB0aGUgUkVMSUFCTEUgc2V0dGluZykuCgogICBTdHJlYW1pbmcgaXMgbGlrZSB1c2luZyBhbiBpbmZpbml0ZSB3aW5kb3cgc2l6ZSwgd2l0aCBubyB0aW1lb3V0cyBhbmQKICAgbm8gdG9sZXJhbmNlIGZvciB0cmFuc21pc3Npb24gZXJyb3JzIChzaW5jZSB0aGVyZSBzaG91bGRuJ3QgYmUgYW55KS4KICAgSXQgcmVsaWVzIG9uIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBmb3IgZmxvdyBjb250cm9sLCBlcnJvcgogICBjb3JyZWN0aW9uLCB0aW1lb3V0cywgYW5kIHJldHJhbnNtaXNzaW9uLiBUaHVzIGl0IGlzIHZlcnkgc3VpdGFibGUgZm9yCiAgIHVzZSBvbiBUQ1AvSVAgY29ubmVjdGlvbnMsIGVzcGVjaWFsbHkgc2xvdyBvciBidXJzdHkgb25lcywgc2luY2UKICAgS2VybWl0J3MgcGFja2V0IHRpbWVvdXRzIHdvbid0IGludGVyZmVyZSB3aXRoIHRoZSB0cmFuc2ZlciAtLSBlYWNoCiAgIHBhY2tldCB0YWtlcyBhcyBsb25nIHRvIHJlYWNoIGl0cyBkZXN0aW5hdGlvbiBhcyBpdCB0YWtlcyBUQ1AgdG8KICAgZGVsaXZlciBpdC4gSWYgVENQIGNhbid0IGRlbGl2ZXIgdGhlIHBhY2tldCB3aXRoaW4gaXRzIG93biB0aW1lb3V0CiAgIHBlcmlvZCAob3ZlciB3aGljaCBLZXJtaXQgaGFzIG5vIGNvbnRyb2wpLCBpdCBzaWduYWxzIGEgZmF0YWwgZXJyb3IuCiAgIEp1c3QgbGlrZSBGVFAuCgogICBTdHJlYW1pbmcgZ29lcyBtdWNoIGZhc3RlciB0aGFuIG5vbi1zdHJlYW1pbmcgd2hlbiBhIHJlbGF0aXZlbHkgc21hbGwKICAgcGFja2V0IGxlbmd0aCBpcyB1c2VkLCBhbmQgaXQgdGVuZHMgdG8gZ28gZmFzdGVyIHRoYW4gbm9uLXN0cmVhbWluZwogICB3aXRoIGV2ZW4gdGhlIGxvbmdlc3QgcGFja2V0IGxlbmd0aHMuIFRoZSBLZXJtaXQgd2luZG93IHNpemUgaXMKICAgaXJyZWxldmFudCB0byBzdHJlYW1pbmcgcHJvdG9jb2wsIGJ1dCBzdGlsbCBtaWdodCBhZmZlY3QgcGVyZm9ybWFuY2UKICAgaW4gc21hbGwgd2F5cyBzaW5jZSBpdCBjYW4gcmVzdWx0IGluIGRpZmZlcmVudCBwYXRocyB0aHJvdWdoIHRoZSBjb2RlLgoKICAgVGhlIGRlZmluaXRpb24gb2YgInJlbGlhYmxlIHRyYW5zcG9ydCIgZG9lcyBub3QgbmVjZXNzYXJpbHkgZGVtYW5kCiAgIDgtYml0IGFuZCBjb250cm9sLWNoYXJhY3RlciB0cmFuc3BhcmVuY3kuIFN0cmVhbWluZyBjYW4gd29yayB3aXRoCiAgIHBhcml0eSBhbmQvb3IgY29udHJvbC1jaGFyYWN0ZXIgcHJlZml4aW5nIGp1c3QgYXMgd2VsbCAoYnV0IG5vdCBhcwogICBmYXN0KSBhcyB3aXRob3V0IHRoZW07IGluIHN1Y2ggY2FzZXMgeW91IGNhbiBsZWF2ZSBSRUxJQUJMRSBzZXQgdG8gT04sCiAgIGJ1dCBzZXQgQ0xFQVJDSEFOTkVMIGFuZC9vciBQQVJJVFkgYXBwcm9wcmlhdGVseS4KCiAgIE1heGltdW0gcGVyZm9ybWFuY2UgLS0gY29tcGFyYWJsZSB0byBhbmQgb2Z0ZW4gZXhjZWVkaW5nIEZUUCAtLSBpcwogICBhY2hpZXZlZCBvbiBzb2NrZXQtdG8tc29ja2V0IGNvbm5lY3Rpb25zIChpbiB3aGljaCB0aGUgY29uc2lkZXJhYmxlCiAgIG92ZXJoZWFkIG9mIHRoZSB0ZXJtaW5hbCBkcml2ZXIgYW5kIFRlbG5ldCBvciBSbG9naW4gc2VydmVyIGlzCiAgIGVsaW1pbmF0ZWQpIHdpdGggbG9uZyBwYWNrZXRzIGFuZCB0aGUgbmV3ICJicmllZiIgZmlsZS10cmFuc2ZlcgogICBkaXNwbGF5IChbNTIxXVNlY3Rpb24gNC4xNikuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIwLjEuIENvbW1hbmRzIGZvciBTdHJlYW1pbmcKCiAgIFNFVCBSRUxJQUJMRSB7IE9OLCBPRkYsIEFVVE8gfQogICAgICAgICAgU0VUIFJFTElBQkxFIE9OIHRlbGxzIEtlcm1pdCB0aGF0IGl0IGhhcyBhIHJlbGlhYmxlIHRyYW5zcG9ydC4KICAgICAgICAgIFNFVCBSRUxJQUJMRSBPRkYgdGVsbHMgS2VybWl0IHRoZSB0cmFuc3BvcnQgaXMgbm90IHJlbGlhYmxlLgogICAgICAgICAgU0VUIFJFTElBQkxFIEFVVE8gdGVsbHMgS2VybWl0IHRoYXQgaXQgc2hvdWxkIFNFVCBSRUxJQUJMRSBPTgogICAgICAgICAgd2hlbmV2ZXIgaXQgbWFrZXMgYSByZWxpYWJsZSBjb25uZWN0aW9uIChlLmcuIFRFTE5FVCBvciBTRVQKICAgICAgICAgIEhPU1Qgb24gYSBUQ1AvSVAgb3IgWC4yNSBuZXR3b3JrKSwgYW5kIHdoZW4gaW4gcmVtb3RlIG1vZGUgaXQKICAgICAgICAgIHNob3VsZCBiZWxpZXZlIHRoZSB0cmFuc3BvcnQgaXMgcmVsaWFibGUgaWYgdGhlIG90aGVyIEtlcm1pdAogICAgICAgICAgc2F5cyBpdCBpcyBkdXJpbmcgS2VybWl0IHByb3RvY29sIG5lZ290aWF0aW9uLgoKICAgQVVUTyBpcyB0aGUgZGVmYXVsdDsgdGhlIEtlcm1pdCBwcm9ncmFtIHRoYXQgbWFrZXMgdGhlIGNvbm5lY3Rpb24KICAga25vd3Mgd2hldGhlciBpdCBpcyByZWxpYWJsZSwgYW5kIHRlbGxzIHRoZSByZW1vdGUgS2VybWl0LgoKICAgVGhlIFJFTElBQkxFIHNldHRpbmcgaGFzIHNldmVyYWwgZWZmZWN0cywgaW5jbHVkaW5nOgoKICAgICAqIEl0IGNhbiBhZmZlY3QgdGhlIHRpbWVvdXRzIHVzZWQgZHVyaW5nIG5vcm1hbCBBQ0svTkFLIHByb3RvY29sLgogICAgICogSXQgY2FuIGFmZmVjdCB0aGUgY2xlYXItY2hhbm5lbCBhbm5vdW5jZW1lbnQuCiAgICAgKiBJdCBjYW4gYWZmZWN0IHN0cmVhbWluZy4KCiAgIElmIHlvdSBURUxORVQgb3IgU0VUIEhPU1Qgc29tZXdoZXJlLCB0aGlzIGluY2x1ZGVzIGFuIGltcGxpY2l0IFNFVAogICBSRUxJQUJMRSBPTiBjb21tYW5kLiBUaGUgLUkgY29tbWFuZC1saW5lIG9wdGlvbiBpcyBlcXVpdmFsZW50IHRvIFNFVAogICBSRUxJQUJMRSBPTi4KCiAgIFNpbmNlIFNFVCBSRUxJQUJMRSBPTiAoYW5kIC1JKSBhbHNvIGltcGxpZXMgU0VUIENMRUFSIENIQU5ORUwgT04sIHlvdQogICBtaWdodCBmaW5kIHRoYXQgaW4gY2VydGFpbiBjYXNlcyB5b3UgbmVlZCB0byB0ZWxsIEtlcm1pdCB0aGF0IGV2ZW4KICAgdGhvdWdoIHRoZSBjb25uZWN0aW9uIGlzIHJlbGlhYmxlLCBpdCBkb2Vzbid0IGhhdmUgYSBjbGVhciBjaGFubmVsCiAgIGFmdGVyIGFsbDoKCiAgU0VUIENMRUFSLUNIQU5ORUwgT0ZGCiAgU0VUIFBSRUZJWElORyBDQVVUSU9VUyA7IG9yIHdoYXRldmVyLi4uCgogICBZb3UgY2FuIGNvbnRyb2wgc3RyZWFtaW5nIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBvdGhlciBpdGVtcyB3aXRoOgoKICBTRVQgU1RSRUFNSU5HIHsgT04sIE9GRiwgQVVUTyB9CgogICBBVVRPIGlzIHRoZSBkZWZhdWx0LCBtZWFuaW5nIHN0cmVhbWluZyB3aWxsIG9jY3VyIGlmIEtlcm1pdCBoYXMgbWFkZSBhCiAgIFRDUC9JUCBjb25uZWN0aW9uIG9yIGlmIFJFTElBQkxFIGlzIE9OIChvciBpdCB3YXMgc3RhcnRlZCB3aXRoIHRoZSAtSQogICBjb21tYW5kIGxpbmUgb3B0aW9uKS4gT0ZGIG1lYW5zIGRvbid0IHN0cmVhbTsgT04gbWVhbnMgb2ZmZXIgdG8gc3RyZWFtCiAgIG5vIG1hdHRlciB3aGF0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMC4yLiBFeGFtcGxlcyBvZiBTdHJlYW1pbmcKCiAgIEhlcmUgd2UgbG9vayBhdCB0aGUgdXNlIGFuZCBiZWhhdmlvciBvZiBzdHJlYW1pbmcgb24gc2V2ZXJhbCBkaWZmZXJlbnQKICAga2luZHMgb2YgY29ubmVjdGlvbnMsIGFuZCBjb21wYXJlIGl0cyBwZXJmb3JtYW5jZSB3aXRoIG5vbi1zdHJlYW1pbmcKICAgdHJhbnNmZXJzLgoKICAgIDQuMjAuMi4xLiBTdHJlYW1pbmcgb24gU29ja2V0LXRvLVNvY2tldCBDb25uZWN0aW9ucwoKICAgSGVyZSB3ZSBnZXQgc3RyZWFtaW5nIGF1dG9tYXRpY2FsbHkgd2hlbiBib3RoIEtlcm1pdCBwcm9ncmFtcyBhcmUKICAgY2FwYWJsZSBvZiBpdCwgc2luY2UgdGhleSBib3RoIG1ha2Ugc29ja2V0IGNvbm5lY3Rpb25zLiBGb3IgZXhhbXBsZSwKICAgb24gdGhlIGZhciBlbmQ6CgogIEMtS2VybWl0PiBzZXQgaG9zdCAqIDMwMDAKICBDLUtlcm1pdD4gc2VydmVyCgogICBhbmQgb24gdGhlIG5lYXIgZW5kOgoKICBDLUtlcm1pdD4gc2V0IGhvc3QgZm9vLmJhci54eXouY29tIDMwMDAKICAobm93IGdpdmUgU0VORCBhbmQgR0VUIGNvbW1hbmQpCgogICBBbGwgc3Vic2VxdWVudCBmaWxlIHRyYW5zZmVycyB1c2Ugc3RyZWFtaW5nIGF1dG9tYXRpY2FsbHkuCgogICBIZXJlIGFyZSB0aGUgcmVzdWx0cyBmcm9tIDg0IHRyaWFscywgcnVuIG9uIGEgcHJvZHVjdGlvbiBuZXR3b3JrLAogICBkaXNrLXRvLWRpc2ssIGluIHdoaWNoIGEgMS1NQiBiaW5hcnkgZmlsZSAodGhlIFN1bk9TIEMtS2VybWl0IFNwYXJjCiAgIGV4ZWN1dGFibGUpIHdhcyBzZW50IGZyb20gYSBTdW4gU3BhcmMtMTAgd2l0aCBTdW5PUyA0LjEuMyB0byBhbiBJQk0KICAgUG93ZXIgU2VydmVyIDg1MCB3aXRoIEFJWCA0LjEsIHNvY2tldC10by1zb2NrZXQsIG92ZXIgYSAxME1icHMgMTBCYXNlVAogICBFdGhlcm5ldCwgdXNpbmcgbWluaW1hbCBjb250cm9sLWNoYXJhY3RlciB1bnByZWZpeGluZywgd2luZG93IHNpemVzCiAgIGZyb20gMTAgdG8gMzIsIGFuZCBwYWNrZXQgc2l6ZXMgZnJvbSAxNDUwIHRvIDkwMTA6CgogICAgICAgICAgICAgICAgU3RyZWFtaW5nICAgIE5vbnN0cmVhbWluZwogIE1heCBDUFMgICAgICAgICA3NDg5NTUgICAgICAgIDY4MzM1NAogIE1pbiBDUFMgICAgICAgICAyMjE1MjIgICAgICAgIDE3MjQ5MQogIE1lYW4gQ1BTICAgICAgICA2NDYxMzQgICAgICAgIDU1ODY4MAogIE1lZGlhbiBDUFMgICAgICA2NzgwNDMgICAgICAgIDU5NTg3NAogIFN0ZCBEZXYgICAgICAgICAxMDE0MjQgICAgICAgIDExMTQ5MwoKICAgQ29ycmVsYXRpb25zOgoKICBDUFMgYW5kIHdpbmRvdyBzaXplOiAgIC0wLjAzNgogIENQUyBhbmQgcGFja2V0IGxlbmd0aDogIDAuMjU0CiAgQ1BTIGFuZCBzdHJlYW1pbmc6ICAgICAgMC4zODIKCiAgIE5vdGUgdGhhdCB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gc3RyZWFtaW5nIGFuZCB0aHJvdWdocHV0IGlzCiAgIHNpZ25pZmljYW50bHkgc3Ryb25nZXIgdGhhbiB0aGF0IGJldHdlZW4gQ1BTIGFuZCB3aW5kb3cgc2l6ZSBvciBwYWNrZXQKICAgbGVuZ3RoLgoKICAgQWxzbyBub3RlIHRoYXQgdGhpcyBhbmQgYWxsIG90aGVyIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cyBpbiB0aGlzCiAgIHNlY3Rpb24gYXJlIHNuYXBzaG90cyBpbiB0aW1lOyB0aGUgcmVzdWx0cyBjb3VsZCBiZSBtdWNoIGRpZmZlcmVudCBhdAogICBvdGhlciB0aW1lcyB3aGVuIHRoZSBsb2FkIG9uIHRoZSBzeXN0ZW1zIGFuZC9vciB0aGUgbmV0d29yayBpcyBoaWdoZXIKICAgb3IgbG93ZXIuCgogICBJbiBhIHNpbWlsYXIgc29ja2V0LXRvLXNvY2tldCB0cmlhbCwgYnV0IHRoaXMgdGltZSBvdmVyIGEgd2lkZS1hcmVhCiAgIFRDUC9JUCBjb25uZWN0aW9uIChmcm9tIE5ldyBZb3JrIENpdHkgdG8gTG9nYW4sIFV0YWgsIGFib3V0IDIwMDAKICAgbWlsZXMpLCB0aGUgZm9sbG93aW5nIHJlc3VsdHMgd2VyZSBvYnRhaW5lZDoKCiAgICAgICAgICAgICAgICBTdHJlYW1pbmcgICAgTm9uc3RyZWFtaW5nCiAgTWF4IENQUyAgICAgICAgIDMzODIyNiAgICAgICAgMzE4MjAzCiAgTWluIENQUyAgICAgICAgIDE5MTY1OSAgICAgICAgMTMyMzE0CiAgTWVhbiBDUFMgICAgICAgIDI5Mzc0NCAgICAgICAgMjU5MjQwCiAgTWVkaWFuIENQUyAgICAgIDMwMDg0NSAgICAgICAgMjczMjcxCiAgU3RkIERldiAgICAgICAgICA0MTkxNCAgICAgICAgIDUyMzUxCgogICBDb3JyZWxhdGlvbnM6CgogIENQUyBhbmQgd2luZG93IHNpemU6ICAgIDAuMTY0CiAgQ1BTIGFuZCBwYWNrZXQgbGVuZ3RoOiAgMC4xMjMKICBDUFMgYW5kIHN0cmVhbWluZzogICAgICAwLjM0NgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMC4yLjIuIFN0cmVhbWluZyBvbiBUZWxuZXQgQ29ubmVjdGlvbnMKCiAgIEluIHRoaXMgY2FzZSB0aGUgbG9jYWwgY29weSBvZiBLZXJtaXQgaXMgdG9sZCB0byBURUxORVQgb3IgU0VUIEhPU1QsCiAgIGFuZCBzbyBpdCBrbm93cyBpdCBoYXMgYSByZWxpYWJsZSBjb25uZWN0aW9uIGFuZCAtLSB1bmxlc3MgaXQgaGFzIGJlZW4KICAgdG9sZCBub3QgdG8gLS0gd2lsbCBvZmZlciB0byBzdHJlYW0sIGFuZCB0aGUgb3RoZXIgS2VybWl0IHByb2dyYW0sCiAgIHNpbmNlIGl0IGhhcyBTVFJFQU1JTkcgc2V0IHRvIEFVVE8sIGFncmVlcy4KCiAgIFNpbmNlIHdlIGhhdmUgYSByZWxpYWJsZSBjb25uZWN0aW9uLCB3ZSdsbCBhbHNvIGdldCBjb250cm9sLWNoYXJhY3RlcgogICB1bnByZWZpeGluZyBhdXRvbWF0aWNhbGx5IGJlY2F1c2Ugb2YgdGhlIG5ldyBjbGVhci1jaGFubmVsIHByb3RvY29sCiAgIChbNTIyXVNlY3Rpb24gNC4xOSkuCgogICBBbnkgZXJyb3JzIHRoYXQgb2NjdXIgZHVyaW5nIHN0cmVhbWluZyBhcmUgZmF0YWwgdG8gdGhlIHRyYW5zZmVyLiBUaGUKICAgbWVzc2FnZSBpcyAiVHJhbnNtaXNzaW9uIGVycm9yIG9uIHJlbGlhYmxlIGxpbmsiLiBTaG91bGQgdGhpcyBoYXBwZW46CgogICAgMS4gQ2hlY2sgdGhlIHJlbW90ZSBLZXJtaXQncyBmbG93IGNvbnRyb2wgc2V0dGluZyAoU0hPVwogICAgICAgQ09NTVVOSUNBVElPTlMpLiBJZiBpdCBpcyBOT05FLCBjaGFuZ2UgaXQgdG8gWE9OL1hPRkYsIG9yIHZpY2UKICAgICAgIHZlcnNhLiBJZiBpdCBpcyBYT04vWE9GRiAob3IgeW91IGp1c3QgY2hhbmdlZCBpdCB0byBYT0ZGL1hPRkYpLAogICAgICAgbWFrZSBzdXJlIHRoZSBmaWxlIHNlbmRlciBpcyBwcmVmaXhpbmcgdGhlIFhPTiBhbmQgWE9GRgogICAgICAgY2hhcmFjdGVycy4gSW4gdGhlIG1vc3QgZHJhc3RpYyBjYXNlLCB1c2UgInNldCBwcmVmaXggYWxsIiB0bwogICAgICAgZm9yY2UgcHJlZml4aW5nIG9mIGFsbCBjb250cm9sIGNoYXJhY3RlcnMuCiAgICAyLiBUaGUgcmVtb3RlIFRlbG5ldCBzZXJ2ZXIgbWlnaHQgY2hvcCBvZmYgdGhlIDh0aCBiaXQuIEluIHRoYXQgY2FzZSwKICAgICAgIHRlbGwgQy1LZXJtaXQgdG8gInNldCBwYXJpdHkgc3BhY2UiLiBPciwgeW91IG1pZ2h0IGJlIGFibGUgdG8KICAgICAgIGZvcmNlIHRoZSBUZWxuZXQgdG8gYWxsb3cgZWlnaHQtYml0IGRhdGEgYnkgdGVsbGluZyBDLUtlcm1pdCB0bwogICAgICAgInNldCB0ZWxvcHQgYmluYXJ5IHJlcXVlc3QgYWNjZXB0IiAtLSB0aGF0IGlzLCByZXF1ZXN0IHRoZSBUZWxuZXQKICAgICAgIHNlcnZlciB0byBlbnRlciBiaW5hcnkgbW9kZSwgYW5kIGFjY2VwdCBiaW5hcnktbW9kZSBiaWRzIGZyb20gdGhlCiAgICAgICBzZXJ2ZXIuCiAgICAzLiBUaGUgcmVtb3RlIFRlbG5ldCBzZXJ2ZXIgbWlnaHQgaGF2ZSBhIGJ1ZmZlcmluZyBsaW1pdGF0aW9uLiBJZiBhCiAgICAgICBhbmQgYiBkb24ndCBjdXJlIHRoZSBwcm9ibGVtLCB0ZWxsIHRoZSBmaWxlIHJlY2VpdmVyIHRvICJzZXQKICAgICAgIHJlY2VpdmUgcGFja2V0LWxlbmd0aCAxMDAwIiAob3Igb3RoZXIgbnVtYmVyIC0tIHVzZSB0aGUgbGFyZ2VzdAogICAgICAgb25lIHRoYXQgd29ya3MpLiBUaGlzIHRvbywgaXMgbm8gZGlmZmVyZW50IGZyb20gdGhlIG5vbi1zdHJlYW1pbmcKICAgICAgIGNhc2UgKG1vcmUgYWJvdXQgdGhpcyBpbiBbNTIzXVNlY3Rpb24gNC4yMC4yLjMpLgoKICAgQW5kIHJlbWVtYmVyIHlvdSBjYW4gY29udGludWUgaW50ZXJydXB0ZWQgYmluYXJ5LW1vZGUgdHJhbnNmZXJzIHdoZXJlCiAgIHRoZXkgbGVmdCBvZmYgd2l0aCB0aGUgUkVTRU5EICg9IFNFTkQgL1JFQ09WRVIpIGNvbW1hbmQuCgogICBIZXJlIGFyZSB0aGUgZmlndXJlcyBmb3IgdGhlIHNhbWUgODQgdHJpYWxzIGJldHdlZW4gdGhlIHNhbWUgU3VuIGFuZAogICBJQk0gaG9zdHMgYXMgaW4gNC4yMC4yLjEsIG9uIHRoZSBzYW1lIG5ldHdvcmssIGJ1dCBvdmVyIGEgVGVsbmV0CiAgIGNvbm5lY3Rpb24gcmF0aGVyIHRoYW4gc29ja2V0LXRvLXNvY2tldDoKCiAgICAgICAgICAgICAgICAgIFN0cmVhbWluZyAgICBOb25zdHJlYW1pbmcKICBNYXggQ1BTICAgICAgICAgMzUwMDg4ICAgICAgICAzMjI1MjMKICBNaW4gQ1BTICAgICAgICAgIDk1NTQ3ICAgICAgICAxNzMxNTIKICBNZWFuIENQUyAgICAgICAgMzIxMzcyICAgICAgICAyODE4MzAKICBNZWRpYW4gQ1BTICAgICAgMzQyNjA0ICAgICAgICAyOTE0NjkKICBTdGQgRGV2ICAgICAgICAgIDQwNTAzICAgICAgICAgMjk5NDgKCiAgIENvcnJlbGF0aW9uczoKCiAgQ1BTIGFuZCB3aW5kb3cgc2l6ZTogICAgMC4wMDEKICBDUFMgYW5kIHBhY2tldCBsZW5ndGg6ICAwLjE1MgogIENQUyBhbmQgc3RyZWFtaW5nOiAgICAgIDAuMTI4CgogICBIZXJlIHRoZSBlZmZlY3QgaXMgbm90IGFzIGVtcGhhdGljIGFzIGluIHRoZSBzb2NrZXQtdG8tc29ja2V0IGNhc2UsCiAgIHlldCBvbiB0aGUgd2hvbGUgc3RyZWFtaW5nIHRlbmRzIHRvIGJlIGJlbmVmaWNpYWwuCgogICBBZGRpdGlvbmFsIG1lYXN1cmVtZW50cyBvbiBIUC1VWCB1c2luZyBDLUtlcm1pdCA3LjAgQmV0YS4wNjoKCiAgICAgICAgICAgICAgICAgIFdpbmRvd2luZyAgICAgU3RyZWFtaW5nCiAgSFAtVVggOC0+OCAgICAgIG5vdCB0ZXN0ZWQgICAgICAgMTRLY3BzCiAgSFAtVVggOC0+OSAgICAgIG5vdCB0ZXN0ZWQgICAgICAgNzZLY3BzCiAgSFAtVVggOC0+MTAgICAgICAzNktjcHMgICAgICAgICAgNjZLY3BzCiAgSFAtVVggOS0+OSAgICAgIG5vdCB0ZXN0ZWQgICAgICAxOTBLY3BzCiAgSFAtVVggOS0+MTAgICAgIDE2MEtjcHMgICAgICAgICAzNzhLY3BzCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIwLjIuMy4gU3RyZWFtaW5nIHdpdGggTGltaXRlZCBQYWNrZXQgTGVuZ3RoCgogICBUaGUgSVJJWCB0ZWxuZXQgc2VydmVyIChhdCBsZWFzdCB0aGUgb25lcyBvYnNlcnZlZCBpbiBJUklYIDUuMyBhbmQKICAgNi4yKSBkb2VzIG5vdCBhbGxvdyBLZXJtaXQgdG8gc2VuZCBwYWNrZXRzIGxvbmdlciB0aGFuIDQwOTYgYnl0ZXMuCiAgIFRodXMgd2hlbiBzZW5kaW5nIGZyb20gSVJJWCBDLUtlcm1pdCB3aGVuIGl0IGlzIG9uIHRoZSByZW1vdGUgZW5kIG9mIGEKICAgVGVsbmV0IGNvbm5lY3Rpb24sIHRoZSBwYWNrZXQgbGVuZ3RoIG11c3QgYmUgNEsgb3IgbGVzcy4gVHJpYWxzIGluCiAgIHRoaXMgY2FzZSAoaW4gd2hpY2ggcGFja2V0IGxlbmd0aHMgcmFuZ2UgZnJvbSAxNDUwIHRvIDQwMDApIHNob3cgYQogICBzdHJvbmcgYWR2YW50YWdlIGZvciBzdHJlYW1pbmcsIHdoaWNoIHdvdWxkIGJlIGV2aWRlbnQgaW4gYW55IG90aGVyCiAgIGNhc2Ugd2hlcmUgdGhlIHBhY2tldCBsZW5ndGggaXMgcmVzdHJpY3RlZCwgYW5kIHN0cm9uZ2VyIHRoZSBzaG9ydGVyCiAgIHRoZSBtYXhpbXVtIHBhY2tldCBsZW5ndGguCgogICAgICAgICAgICAgICAgICBTdHJlYW1pbmcgICAgTm9uc3RyZWFtaW5nCiAgTWF4IENQUyAgICAgICAgIDQyNjE4NyAgICAgICAgMzY2ODcwCiAgTWluIENQUyAgICAgICAgIDQwNzUwMCAgICAgICAgMjc2NTE3CiAgTWVhbiBDUFMgICAgICAgIDQxNTIyNiAgICAgICAgMzM5MTY4CiAgTWVkaWFuIENQUyAgICAgIDQxNDEzOSAgICAgICAgMzQzODAzCiAgU3RkIERldiAgICAgICAgICAgNjA5NCAgICAgICAgIDI1ODUxCgogICBDb3JyZWxhdGlvbnM6CgogIENQUyBhbmQgd2luZG93IHNpemU6ICAgIDAuMTE2CiAgQ1BTIGFuZCBwYWNrZXQgbGVuZ3RoOiAgMC4yNDEKICBDUFMgYW5kIHN0cmVhbWluZzogICAgICAwLjkwMQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMC4yLjQuIFN0cmVhbWluZyBvbiBEaWFsdXAgQ29ubmVjdGlvbnMKCiAgIEhlcmUgImRpYWx1cCIgcmVmZXJzIHRvIGEgImRpcmVjdCIgZGlhbHVwIGNvbm5lY3Rpb24sIG5vdCBhIFNMSVAgb3IKICAgUFBQIGNvbm5lY3Rpb24sIHdoaWNoIGlzIG9ubHkgYSBwYXJ0aWN1bGFyIGtpbmQgb2YgVENQL0lQIGNvbm5lY3Rpb24uCgogICBBdHRlbXB0IHRoaXMgYXQgeW91ciBvd24gcmlzaywgYW5kIHRoZW4gb25seSBpZiAoYSkgeW91IGhhdmUKICAgZXJyb3ItY29ycmVjdGluZyBtb2RlbXMsIGFuZCAoYikgdGhlIGNvbm5lY3Rpb25zIGJldHdlZW4gdGhlIG1vZGVtcwogICBhbmQgY29tcHV0ZXJzIGFyZSBhbHNvIGVycm9yLWZyZWUsIHBlcmZlY3RseSBmbG93LWNvbnRyb2xsZWQsIGFuZCBmcmVlCiAgIG9mIGludGVycnVwdCBjb25mbGljdHMuIFN0cmVhbWluZyBjYW4gYmUgdXNlZCBlZmZlY3RpdmVseSBhbmQgdG8KICAgZmFpcmx5IGdvb2QgYWR2YW50YWdlIG9uIHN1Y2ggY29ubmVjdGlvbnMsIGJ1dCByZW1lbWJlciB0aGF0IHRoZQogICB0cmFuc2ZlciBpcyBmYXRhbCBpZiBldmVuIG9uZSBlcnJvciBpcyBkZXRlY3RlZCAoYWxzbyByZW1lbWJlciB0aGF0CiAgIHNob3VsZCBhIGJpbmFyeS1tb2RlIHRyYW5zZmVyIGZhaWwsIGl0IGNhbiBiZSByZWNvdmVyZWQgZnJvbSB0aGUgcG9pbnQKICAgb2YgZmFpbHVyZSB3aXRoIFJFU0VORCkuCgogICBUbyB1c2Ugc3RyZWFtaW5nIG9uIGFuIHVucmVsaWFibGUgY29ubmVjdGlvbiwgeW91IG11c3QgdGVsbCBib3RoCiAgIEtlcm1pdHMgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyByZWxpYWJsZToKCiAga2VybWl0IC1JCgogICBvcjoKCiAgQy1LZXJtaXQ+IHNldCByZWxpYWJsZSBvbgoKICAgSW4gdGhpcyBjYXNlLCBpdCB3aWxsIHByb2JhYmx5IGJlIG5lY2Vzc2FyeSB0byBwcmVmaXggc29tZSBjb250cm9sCiAgIGNoYXJhY3RlcnMsIGZvciBleGFtcGxlIGlmIHlvdXIgY29ubmVjdGlvbiBpcyB0aHJvdWdoIGEgdGVybWluYWwKICAgc2VydmVyIHRoYXQgaGFzIGFuIGVzY2FwZSBjaGFyYWN0ZXIuIE1vc3QgQ2lzY28gdGVybWluYWwgc2VydmVycywgZm9yCiAgIGV4YW1wbGUsIHJlcXVpcmUgQ3RybC1eICgzMCwgYXMgd2VsbCBhcyBpdHMgaGlnaC1iaXQgZXF1aXZhbGVudCwgMTU4KQogICB0byBiZSBwcmVmaXhlZC4gVG8gdW5wcmVmaXggdGhlc2UsIHlvdSdsbCBuZWVkIHRvIGRlZmVhdCB0aGUgImNsZWFyCiAgIGNoYW5uZWwiIGZlYXR1cmU6CgogIEMtS2VybWl0PiBzZXQgcmVsaWFibGUgb24KICBDLUtlcm1pdD4gc2V0IGNsZWFyLWNoYW5uZWwgb2ZmCiAgQy1LZXJtaXQ+IHNldCBwcmVmaXhpbmcgbm9uZQogIEMtS2VybWl0PiBzZXQgY29udHJvbCBwcmVmaXggMSAxMyAzMCAxNTggOyBhbmQgd2hhdGV2ZXIgZWxzZSBpcyBuZWNlc3NhcnkKCiAgIERpYWx1cCB0cmlhbHMgd2VyZSBkb25lIHVzaW5nIGZpeGVkIGxhcmdlIHdpbmRvdyBhbmQgcGFja2V0IHNpemVzLgogICBUaGV5IGNvbXBhcmUgdXBsb2FkaW5nIGFuZCBkb3dubG9hZGluZyBvZiB0d28gY29tbW9uIHR5cGVzIG9mIGZpbGVzLAogICB3aXRoIGFuZCB3aXRob3V0IHN0cmVhbWluZy4gQ29uZmlndXJhdGlvbjoKCiAgICAgSFAtOTAwMC83MTUvMzMgLS0gNTc2MDBicHMsIFJUUy9DVFMgLS0gVVNSIENvdXJpZXIgVi4zNCAtLQogICAgIFYuMzQrVi40MiwgMzEyMDBicHMgLS0gVVNSIFYuMzQrIFJhY2ttb3VudCAtLSA1NzYwMGJwcywgUlRTL0NUUyAtLQogICAgIENpc2NvIHRlcm1pbmFsIHNlcnZlciAtLSBTb2xhcmlzIDIuNS4xLiBQYWNrZXQgc2l6ZSA9IDgwMDAsIFdpbmRvdwogICAgIFNpemUgPSAzMCwgQ29udHJvbCBDaGFyYWN0ZXIgVW5wcmVmaXhpbmcgTWluaW1hbCAoYnV0IGluY2x1ZGluZyB0aGUKICAgICBDaXNjbyBlc2NhcGUgY2hhcmFjdGVyKS4KCiAgIFNpbmNlIHRoaXMgaXMgbm90IGEgdHJ1bHkgcmVsaWFibGUgY29ubmVjdGlvbiwgYSBmZXcgdHJpYWxzIGZhaWxlZAogICB3aGVuIGEgYmFkIHBhY2tldCB3YXMgcmVjZWl2ZWQgKG1vc3QgbGlrZWx5IGR1ZSB0byBVQVJUIG92ZXJydW5zKTsgdGhlCiAgIGZhaWx1cmUgd2FzIGdyYWNlZnVsIGFuZCBpbW1lZGlhdGUsIGFuZCB0aGUgbWVzc2FnZSB3YXMgaW5mb3JtYXRpdmUuCiAgIFRoZSByZXN1bHRzIG9mIHRlbiBzdWNjZXNzZnVsIHRyaWFscyB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nIHRoZSB0d28KICAgZmlsZXMgd2l0aCBhbmQgd2l0aG91dCBzdHJlYW1pbmcgYXJlOgoKICAgICAgICAgICAgU3RyZWFtaW5nLi4KICAgICAgICAgICAgT2ZmICAgIE9uCiAgIFVwbG9hZCAgIDUxOTQgICA1NTY1ICAgdHh0ICg9IEMgc291cmNlIGNvZGUsIDc4SykKICAgICAgICAgICAgMzEzNSAgIDM0MDYgICBneiAgKD0gZ3ppcCBmaWxlLCBjb21wcmVzc2VkLCA4NUspCiBEb3dubG9hZCAgIDUxOTQgICA1NTY1ICAgdHh0CiAgICAgICAgICAgIDMwNDEgICAzNDA2ICAgZ3oKCiAgIEVhY2ggQ1BTIGZpZ3VyZSBpcyB0aGUgbWVhbiBvZiAxMCByZXN1bHRzLgoKICAgQSBicmllZiB0ZXN0IHdhcyBhbHNvIHBlcmZvcm1lZCBvbiBhIExBVC1iYXNlZCBkaWFsb3V0IGNvbm5lY3Rpb24gZnJvbQogICBhIFZBWCAzMTAwIHdpdGggVk1TIDUuNSB0byBhIFVTUiBDb3VyaWVyIFYuMzQgY29ubmVjdGVkIHRvIGEgREVDc2VydmVyCiAgIDcwMCBhdCAxOTIwMCBicHMuIFRoZSAxLU1CIFNwYXJjIGV4ZWN1dGFibGUgZG93bmxvYWRlZCBmcm9tIGEgU3VuIHRvCiAgIHRoZSBWQVggYXQgMTEwMGNwcyB3aXRob3V0IHN0cmVhbWluZyBhbmQgMTkwMGNwcyB3aXRoIHN0cmVhbWluZywgdXNpbmcKICAgODAwMC1ieXRlIHBhY2tldHMsIDMwIHdpbmRvdyBzbG90cywgYW5kIG1pbmltYWwgcHJlZml4aW5nIGluIGJvdGgKICAgY2FzZXMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA0LjIwLjIuNS4gU3RyZWFtaW5nIG9uIFguMjUgQ29ubmVjdGlvbnMKCiAgIFdlIGhhdmUgb25seSBsaW1pdGVkIGFjY2VzcyB0byBYLjI1IG5ldHdvcmtzLiBPbmUgdHJpYWwgd2FzIHBlcmZvcm1lZAogICBpbiB3aGljaCB0aGUgMU1CIFNvbGFyaXMgMi40IFNwYXJjIGV4ZWN1dGFibGUgd2FzIHRyYW5zZmVycmVkIG92ZXIgYQogICBTdW5MaW5rIFguMjUgY29ubmVjdGlvbjsgbm90aGluZyBpcyBrbm93biBhYm91dCB0aGUgYWN0dWFsIHBoeXNpY2FsCiAgIGNvbm5lY3Rpb24uIFdpdGggYSBwYWNrZXQgbGVuZ3RoIG9mIDgwMDAgYW5kIGEgd2luZG93IHNpemUgb2YgMzAsIHRoZQogICBmaWxlIHRyYW5zZmVycmVkIGF0IDY0MDAgY3BzICh1c2luZyBhIG1heGltdW0gb2YgNiB3aW5kb3cgc2xvdHMpLiBXaXRoCiAgIHRoZSBzYW1lIHBhY2tldCBsZW5ndGgsIGJ1dCB3aXRoIHN0cmVhbWluZywgaXQgdHJhbnNmZXJyZWQgd2l0aG91dAogICBtaXNoYXAgYXQgNjcxMCBjcHMsIGFib3V0IDUlIGZhc3Rlci4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMjAuMy4gU3RyZWFtaW5nIC0gUHJlbGltaW5hcnkgQ29uY2x1c2lvbnMKCiAgIFRoZSByZXN1bHRzIHZhcnkgd2l0aCB0aGUgcGFydGljdWxhciBjb25uZWN0aW9uLCBidXQgYXJlIGdvb2Qgb3ZlcmFsbC4KICAgQWx0aG91Z2ggbnVtZXJvdXMgbG93ZXItbGV2ZWwgdHJpY2tzIGNhbiBiZSB1c2VkIHRvIGltcHJvdmUKICAgcGVyZm9ybWFuY2Ugb24gc3BlY2lmaWMgcGxhdGZvcm1zIG9yIGNvbm5lY3Rpb24gbWV0aG9kcywgc3RyZWFtaW5nCiAgIG9jY3VycyBhdCBhIGhpZ2gsIHN5c3RlbS1pbmRlcGVuZGVudCBsZXZlbCBvZiB0aGUgS2VybWl0IHByb3RvY29sIGFuZAogICB0aGVyZWZvcmUgY2FuIGFwcGx5IHRvIGFsbCB0eXBlcyBvZiBwbGF0Zm9ybXMgYW5kIChyZWxpYWJsZSkKICAgY29ubmVjdGlvbnMgdHJhbnNwYXJlbnRseS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA0LjIxLiBUaGUgVFJBTlNNSVQgQ29tbWFuZAoKICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCB0aGUgVFJBTlNNSVQgY29tbWFuZCB0cmFuc21pdHRlZCBpbiB0ZXh0IG9yCiAgIGJpbmFyeSBtb2RlIGFjY29yZGluZyB0byBTRVQgRklMRSBUWVBFIHsgVEVYVCwgQklOQVJZIH0uIEJ1dCBub3cgdGhhdAogICBiaW5hcnkgbW9kZSBpcyBsaWtlbHkgdG8gYmUgdGhlIGRlZmF1bHQgZm9yIHByb3RvY29sIHRyYW5zZmVycywgaXQgaXMKICAgZXZpZGVudCB0aGF0IHRoaXMgbm90IGFsc28gYW4gYXBwcm9wcmlhdGUgZGVmYXVsdCBmb3IgVFJBTlNNSVQsIHNpbmNlCiAgIGJpbmFyeS1tb2RlIFRSQU5TTUlUIGlzIGEgcmF0aGVyIHNwZWNpYWxpemVkIGFuZCB0cmlja3kgb3BlcmF0aW9uLgogICBUaGVyZWZvcmUsIFRSQU5TTUlUIGRlZmF1bHRzIHRvIHRleHQgbW9kZSBhbHdheXMsIHJlZ2FyZGxlc3Mgb2YgdGhlCiAgIEZJTEUgVFlQRSBzZXR0aW5nLgoKICAgQy1LZXJtaXQgNy4wIGV4cGFuZHMgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUgVFJBTlNNSVQgY29tbWFuZCBieQogICBhZGRpbmcgdGhlIGZvbGxvd2luZyBzd2l0Y2hlcyAoc2VlIFs1MjRdU2VjdGlvbiAxLjUpLiBUaGUgbmV3IHN5bnRheAogICBpczoKCiAgVFJBTlNNSVQgWyBzd2l0Y2hlcy4uLiBdIGZpbGVuYW1lCgogICBaZXJvIG9yIG1vcmUgc3dpdGNoZXMgbWF5IGJlIGluY2x1ZGVkOgoKICAgL1BJUEUKICAgICAgICAgIFdoZW4gL1BJUEUgaXMgaW5jbHVkZWQsICJmaWxlbmFtZSIgaXMgaW50ZXJwcmV0ZWQgYXMgYSBzeXN0ZW0KICAgICAgICAgIGNvbW1hbmQgb3IgcHJvZ3JhbSB3aG9zZSBvdXRwdXQgaXMgdG8gYmUgc2VudC4gU3lub255bToKICAgICAgICAgIC9DT01NQU5ELiBFeGFtcGxlOgoKICB0cmFuc21pdCAvcGlwZSBmaW5nZXIKCiAgICAgICAgICBZb3UgbWF5IGVuY2xvc2UgdGhlIGNvbW1hbmQgaW4gYnJhY2VzLCBidXQgeW91IGRvbid0IGhhdmUgdG86CgogIHhtaXQgL3BpcGUge2xzIC1sIHwgc29ydCAtciArMC4yMiAtMC4zMiB8IGhlYWR9CgogICAvQklOQVJZCiAgICAgICAgICBUcmFuc21pdHMgdGhlIGZpbGUgKG9yIHBpcGUgb3V0cHV0KSBpbiBiaW5hcnkgbW9kZS4KCiAgIC9URVhUCiAgICAgICAgICBUcmFuc21pdHMgdGhlIGZpbGUgKG9yIHBpcGUgb3V0cHV0KSBpbiBsaW5lLW9yaWVudGVkIHRleHQgbW9kZS4KICAgICAgICAgIEN1cnJlbnQgRklMRSBDSEFSQUNURVItU0VUIGFuZCBURVJNSU5BTCBDSEFSQUNURVItU0VUCiAgICAgICAgICBzZWxlY3Rpb25zIGdvdmVybiB0cmFuc2xhdGlvbi4gRGVmYXVsdC4KCiAgIC9UUkFOU1BBUkVOVAogICAgICAgICAgU3BlY2lmaWVzIHRleHQgbW9kZSB3aXRob3V0IGNoYXJhY3Rlci1zZXQgdHJhbnNsYXRpb24sIG5vCiAgICAgICAgICBtYXR0ZXIgd2hhdCB0aGUgRklMRSBhbmQgVEVSTUlOQUwgQ0hBUkFDVEVSLVNFVCBzZWxlY3Rpb25zIGFyZS4KCiAgIC9OT1dBSVQKICAgICAgICAgIFRoaXMgaXMgZXF1aXZhbGVudCB0byBTRVQgVFJBTlNNSVQgUFJPTVBUIDAsIGJ1dCBmb3IgdGhpcwogICAgICAgICAgVFJBTlNNSVQgY29tbWFuZCBvbmx5LiBBcHBsaWVzIG9ubHkgdG8gdGV4dCBtb2RlOyBpdCBtZWFucyB0bwogICAgICAgICAgbm90IHdhaXQgZm9yIGFueSBraW5kIG9mIGVjaG8gb3IgdHVybmFyb3VuZCBjaGFyYWN0ZXIgYWZ0ZXIKICAgICAgICAgIHNlbmRpbmcgYSBsaW5lIGJlZm9yZSBzZW5kaW5nIHRoZSBuZXh0IGxpbmUuIChOb3JtYWxseSBLZXJtaXQKICAgICAgICAgIHdhaXRzIGZvciBhIGxpbmVmZWVkLikKCiAgIFdoZW4gVFJBTlNNSVQgRUNITyBpcyBPTiwgQy1LZXJtaXQgdHJpZXMgdG8gcmVhZCBiYWNrIHRoZSBlY2hvIG9mIGVhY2gKICAgY2hhcmFjdGVyIHRoYXQgaXMgc2VudC4gUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCAxIHNlY29uZCB3YXMgYWxsb3dlZAogICBmb3IgZWFjaCBlY2hvIHRvIGFwcGVhcjsgaWYgaXQgZGlkbid0IHNob3cgdXAgaW4gYSBzZWNvbmQsIHRoZQogICBUUkFOU01JVCBjb21tYW5kIHdvdWxkIGZhaWwuIFNpbWlsYXJseSBmb3IgdGhlIFRSQU5TTUlUIFBST01QVAogICBjaGFyYWN0ZXIuIEhvd2V2ZXIsIHdpdGggdG9kYXkncyBjb25nZXN0ZWQgSW50ZXJuZXQgY29ubmVjdGlvbnMsIGV0YywKICAgbW9yZSB0aW1lIGlzIG9mdGVuIG5lZWRlZDoKCiAgIFNFVCBUUkFOU01JVCBUSU1FT1VUIG51bWJlcgogICBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgZm9yIGFuIGVjaG8gb3IgdGhlIHByb21wdAogICBjaGFyYWN0ZXIgd2hlbiBUUkFOU01JVCBQUk9NUFQgaXMgbm9uemVybzsgdGhlIGRlZmF1bHQgd2FpdCBpcyAxCiAgIHNlY29uZC4gSWYgeW91IHNwZWNpZnkgMCwgdGhlIHdhaXQgaXMgaW5kZWZpbml0ZS4gV2hlbiBhIHRpbWVvdXQKICAgaW50ZXJ2YWwgb2YgMCBpcyBzcGVjaWZpZWQsIGFuZCBhIGRlc2lyZWQgZWNobyBvciBwcm9tcHQgZG9lcyBub3Qgc2hvdwogICB1cCwgdGhlIFRSQU5TTUlUIGNvbW1hbmQgd2lsbCBub3QgdGVybWluYXRlIHVudGlsIG9yIHVubGVzcyB5b3UKICAgaW50ZXJydXB0IGl0IHdpdGggQ3RybC1DOyB1c2UgU0VUIFRSQU5TTUlUIFRJTUVPVVQgMCB3aXRoIGNhdXRpb24uCgogICBOb3RlOiB0byBibGFzdCBhIGZpbGUgb3V0IHRoZSBjb21tdW5pY2F0aW9ucyBjb25uZWN0aW9uIHdpdGhvdXQgYW55CiAgIGtpbmQgb2Ygc3luY2hyb25pemF0aW9uIG9yIHRpbWVvdXRzIG9yIG90aGVyIG1hbm5lciBvZiBjaGVja2luZywgdXNlOgoKICBTRVQgVFJBTlNNSVQgRUNITyBPRkYKICBTRVQgVFJBTlNNSVQgUFJPTVBUIDAgKG9yIGluY2x1ZGUgdGhlIC9OT1dBSVQgc3dpdGNoKQogIFNFVCBUUkFOU01JVCBQQVVTRSAwCiAgVFJBTlNNSVQgWyBzd2l0Y2hlcyBdIGZpbGVuYW1lCgogICBJbiB0aGlzIGNhc2UsIHRleHQtZmlsZSB0cmFuc21pc3Npb24gaXMgbm90LWxpbmUgb3JpZW50ZWQgYW5kIGxhcmdlCiAgIGJsb2NrcyBjYW4gYmUgc2VudCwgcmVzdWx0aW5nIGluIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQKICAgb3ZlciBsaW5lLWF0LWF0LXRpbWUgdHJhbnNtaXNzaW9uLiBTdWNjZXNzZnVsIG9wZXJhdGlvbiBkZXBlbmRzIChldmVuCiAgIG1vcmUgdGhhbiB1c3VhbCBmb3IgdGhlIFRSQU5TTUlUIGNvbW1hbmQhKSBvbiBhIGNsZWFuIGNvbm5lY3Rpb24gd2l0aAogICBlZmZlY3RpdmUgZmxvdyBjb250cm9sLgoKICAgRm9yIGRldGFpbHMgb24gVFJBTlNNSVQgYW5kIGNoYXJhY3RlciBzZXRzLCBzZWUgWzUyNV1TZWN0aW9uIDYuNi41LjQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4yMi4gQ29waW5nIHdpdGggRmF1bHR5IEtlcm1pdCBJbXBsZW1lbnRhdGlvbnMKCiAgIEtlcm1pdCBwcm90b2NvbCBoYXMgYmVlbiBpbXBsZW1lbnRlZCBpbiBxdWl0ZSBhIGZldyB0aGlyZC1wYXJ0eQogICBjb21tZXJjaWFsLCBzaGFyZXdhcmUsIGFuZCBmcmVld2FyZSBzb2Z0d2FyZSBwYWNrYWdlcywgd2l0aCB2YXJ5aW5nCiAgIGRlZ3JlZXMgb2Ygc3VjY2Vzcy4gSW4gbW9zdCBjYXNlcyBvcGVyYXRpb24gaXMgc2F0aXNmYWN0b3J5IGJ1dCBzbG93CiAgIC0tIG9ubHkgdGhlIGJhcmUgbWluaW11bSBzdWJzZXQgb2YgdGhlIHByb3RvY29sIGlzIGF2YWlsYWJsZSAtLSBzaG9ydAogICBwYWNrZXRzLCBubyBzbGlkaW5nIHdpbmRvd3MsIG5vIGF0dHJpYnV0ZXMsIGV0Yy4gSW4gb3RoZXIgY2FzZXMsIHRoZQogICBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvcnJlY3QsIHJlc3VsdGluZyBpbiBmYWlsdXJlcyBhdCB0aGUgaW5pdGlhbAogICBuZWdvdGlhdGlvbiBzdGFnZSBvciBjb3JydXB0ZWQgZmlsZXMuCgogICBDLUtlcm1pdCA3LjAgYW5kIEtlcm1pdCA5NSAxLjEuMTkgaW5jbHVkZSBzb21lIG5ldyBkZWZlbnNlIG1lY2hhbmlzbXMKICAgdG8gaGVscCBjb3BlIHdpdGggdGhlIG1vc3QgY29tbW9uIHNpdHVhdGlvbnMuIEhvd2V2ZXIsIGJlYXIgaW4gbWluZAogICB0aGVyZSBpcyBvbmx5IHNvIG11Y2ggd2UgY2FuIGRvIGluIHN1Y2ggY2FzZXMgLS0gdGhlIHJlc3BvbnNpYmlsaXR5CiAgIGZvciBmaXhpbmcgdGhlIHByb2JsZW0gbGllcyB3aXRoIHRoZSBtYWtlciBvZiB0aGUgZmF1bHR5IHNvZnR3YXJlLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMi4xLiBGYWlsdXJlIHRvIEFjY2VwdCBNb2Rlcm4gTmVnb3RpYXRpb24gU3RyaW5ncwoKICAgVGhlIHB1Ymxpc2hlZCBLZXJtaXQgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCBuZXcgZmllbGRzIGNhbgogICBiZSBhZGRlZCB0byB0aGUgcGFyYW1ldGVyIG5lZ290aWF0aW9uIHN0cmluZy4gVGhlc2UgYXJlIHRvIGJlIGlnbm9yZWQKICAgYnkgYW55IEtlcm1pdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90IHVuZGVyc3RhbmQgdGhlbTsgdGhpcyBpcwogICB3aGF0IG1ha2VzIHRoZSBLZXJtaXQgcHJvdG9jb2wgZXh0ZW5zaWJsZS4gVW5mb3J0dW5hdGVseSwgc29tZSBLZXJtaXQKICAgaW1wbGVtZW50YXRpb25zIGJlY29tZSBjb25mdXNlZCAob3Igd29yc2UpIHdoZW4gcmVjZWl2aW5nIGEKICAgbmVnb3RpYXRpb24gc3RyaW5nIGxvbmdlciB0aGFuIHRoZSBvbmUgdGhleSBleHBlY3QuIFlvdSBjYW4gdHJ5CiAgIHdvcmtpbmcgYXJvdW5kIHN1Y2ggcHJvYmxlbXMgYnkgdGVsbGluZyBLZXJtaXQgdG8gc2hvcnRlbiBpdHMKICAgbmVnb3RpYXRpb24gc3RyaW5nIChhbmQgdGh1cyBkaXNhYmxlIHRoZSBjb3JyZXNwb25kaW5nIG5ldyBmZWF0dXJlcyk6CgogIFNFVCBTRU5EIE5FR09USUFUSU9OLVNUUklORy1NQVgtTEVOR1RIIG51bWJlcgoKICAgVHJ5IGEgbnVtYmVyIGxpa2UgMTAuIElmIHRoYXQgZG9lc24ndCB3b3JrLCB0cnkgOSwgOCwgNywgNiwgYW5kIHNvIG9uLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMi4yLiBGYWlsdXJlIHRvIE5lZ290aWF0ZSA4dGgtYml0IFByZWZpeGluZwoKICAgVGhlIHB1Ymxpc2hlZCBLZXJtaXQgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbiBzdGF0ZXMgdGhhdCA4dGgtYml0CiAgIHByZWZpeGluZyAod2hpY2ggYWxsb3dzIHRyYW5zZmVyIG9mIDgtYml0IGRhdGEgb3ZlciBhIDctYml0CiAgIGNvbm5lY3Rpb24pIG9jY3VycyBpZiB0aGUgZmlsZSBzZW5kZXIgcHV0cyBhIHZhbGlkIHByZWZpeCBjaGFyYWN0ZXIKICAgKG5vcm1hbGx5ICImIikgaW4gdGhlIDh0aC1iaXQtcHJlZml4IGZpZWxkIG9mIHRoZSBuZWdvdGlhdGlvbiBzdHJpbmcsCiAgIGFuZCB0aGUgcmVjZWl2ZXIgcHV0cyBlaXRoZXIgYSBsZXR0ZXIgIlkiIG9yIHRoZSBzYW1lIHByZWZpeAogICBjaGFyYWN0ZXIuIEF0IGxlYXN0IG9uZSBmYXVsdHkgS2VybWl0IGltcGxlbWVudGF0aW9uIGV4aXN0cyB0aGF0IGRvZXMKICAgbm90IGFjY2VwdCB0aGUgbGV0dGVyICJZIi4gVG8gZm9yY2UgQy1LZXJtaXQgLyBLLTk1IHRvIHJlcGx5IHdpdGggdGhlCiAgIG90aGVyIEtlcm1pdCdzIHByZWZpeCBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYSAiWSIsIGdpdmUgdGhlIGZvbGxvd2luZwogICAoaW52aXNpYmxlKSBjb21tYW5kOgoKICBTRVQgUThGTEFHIE9OCgogICBVc2UgU0VUIFE4RkxBRyBPRkYgdG8gcmVzdG9yZSB0aGUgbm9ybWFsIGJlaGF2aW9yLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMi4zLiBDb3JydXB0IEZpbGVzCgogICBSZWZlciB0byBbNTI2XVNlY3Rpb24gNC4yMi4yLiBTb21lIEtlcm1pdCBpbXBsZW1lbnRhdGlvbnMgbWlzdGFrZW5seQogICBpbnRlcnByZXQgdGhlICJZIiBhcyBhIHByZWZpeCBjaGFyYWN0ZXIuIFRoZW4sIHdoZW5ldmVyIGEgbGV0dGVyIFkKICAgYXBwZWFycyBpbiB0aGUgZGF0YSwgdGhlIFkgYW5kIHRoZSBjaGFyYWN0ZXIgdGhhdCBmb2xsb3dzIGl0IGFyZQogICByZXBsYWNlZCBieSBhIGdhcmJhZ2UgY2hhcmFjdGVyLiBBdCB0aGlzIHdyaXRpbmcsIHdlIGFyZSBub3Qgc3VyZSBpZgogICB0aGVyZSBpcyBhbnkgc29sdXRpb24sIGJ1dCB0cnkgInNldCBzZW5kIG5lZ290aWF0aW9uLXN0cmluZy1tYXgtbGVuZ3RoCiAgIDYiIGFuZC9vciAic2V0IHE4ZmxhZyBvbiIuCgogICBGaWxlIGNvcnJ1cHRpb24gY2FuIGFsc28gb2NjdXIgd2hlbiBjb250cm9sIGNoYXJhY3RlcnMgd2l0aGluIHRoZSBmaWxlCiAgIGRhdGEgYXJlIHNlbnQgd2l0aG91dCBwcmVmaXhpbmcsIGFzIGF0IGxlYXN0IHNvbWUgYXJlIGJ5IGRlZmF1bHQgaW4KICAgQy1LZXJtaXQgNy4wIGFuZCBLLTk1LiBTb21lIEtlcm1pdCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IGhhbmRsZQogICBpbmNvbWluZyAiYmFyZSIgY29udHJvbCBjaGFyYWN0ZXJzLiBUbyB3b3JrIGFyb3VuZCwgInNldCBwcmVmaXhpbmcKICAgYWxsIi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMjIuNC4gU3B1cmlvdXMgQ2FuY2VsbGF0aW9ucwoKICAgVGhlIEtlcm1pdCBwcm90b2NvbCBzcGVjaWZpY2F0aW9uIHN0YXRlcyB0aGF0IGlmIGFuIEFDSyB0byBhIERhdGEKICAgcGFja2V0IGNvbnRhaW5zIFggaW4gaXRzIGRhdGEgZmllbGQsIHRoZSB0cmFuc2ZlciBvZiB0aGUgY3VycmVudCBmaWxlCiAgIGlzIGNhbmNlbGVkLCBhbmQgaWYgaXQgY29udGFpbnMgYSBaLCB0aGUgZW50aXJlIHRyYW5zZmVyIGlzIGNhbmNlbGVkLgogICBBdCBsZWFzdCBvbmUgb3ZlcnplYWxvdXMgS2VybWl0IGltcGxlbWVudGF0aW9uIGFwcGxpZXMgdGhpcyBydWxlIHRvCiAgIG5vbi1EYXRhIHBhY2tldHMgYXMgd2VsbCwgdGhlIHR5cGljYWwgc3ltcHRvbSBiZWluZyB0aGF0IGFueSBhdHRlbXB0CiAgIHRvIHRyYW5zZmVyIGEgZmlsZSB3aG9zZSBuYW1lIGJlZ2lucyB3aXRoIFggb3IgWiByZXN1bHRzIGluCiAgIGNhbmNlbGxhdGlvbi4gVGhpcyBpcyBiZWNhdXNlIHRoZSBmaWxlIHJlY2VpdmVyIHR5cGljYWxseSBzZW5kcyBiYWNrCiAgIHRoZSBuYW1lIHVuZGVyIHdoaWNoIGl0IHN0b3JlZCB0aGUgZmlsZSAod2hpY2ggbWlnaHQgbm90IGJlIHRoZSBzYW1lCiAgIGFzIHRoZSBuYW1lIGl0IHdhcyBzZW50IHdpdGgpIGluIHRoZSBBQ0sgdG8gdGhlIEZpbGUgSGVhZGVyIHBhY2tldC4KICAgVGhpcyBpcyBpbmZvcm1hdGlvbiBvbmx5IGFuZCBzaG91bGQgbm90IGNhdXNlIGNhbmNlbGxhdGlvbi4gVG8gd29yawogICBhcm91bmQgdGhlIHByb2JsZW0sIHVzZToKCiAgU0VUIEYtQUNLLUJVRyB7IE9OLCBPRkYgfQoKICAgT04gdGVsbHMgS2VybWl0IG5vdCB0byBzZW5kIGJhY2sgdGhlIGZpbGVuYW1lIGluIHRoZSBBQ0sgdG8gdGhlIGZpbGUKICAgaGVhZGVyIHBhY2tldCBhcyBpdCBub3JtYWxseSB3b3VsZCBkbyAoT0ZGIHB1dHMgS2VybWl0IGJhY2sgdG8gbm9ybWFsCiAgIGFmdGVyIHVzaW5nIE9OKS4KCiAgIEEgdmFyaWF0aW9uIG9uIHRoZSB0aGlzIGJ1ZyBvY2N1cnMgaW4gYW4gb2JzY3VyZSBLZXJtaXQgcHJvZ3JhbSBmb3IKICAgTVVNUFM6IFdoZW4gdGhpcyBLZXJtaXQgcHJvZ3JhbSBzZW5kcyBhIGZpbGUgY2FsbGVkIChzYXkpIEZPTy5CQVIsIGl0CiAgIHJlcXVpcmVzIHRoYXQgdGhlIEFDSyB0byBpdHMgRiBwYWNrZXQgY29udGFpbiBleGFjdGx5IHRoZSBzYW1lIG5hbWUsCiAgIEZPTy5CQVIuIEhvd2V2ZXIsIEMtS2VybWl0IGxpa2VzIHRvIHNlbmQgYmFjayB0aGUgZnVsbCBwYXRobmFtZSwKICAgY2F1c2luZyB0aGUgTVVNUFMgS2VybWl0IHRvIGZhaWwuIFNFVCBGLUFDSy1CVUcgT04gZG9lc24ndCBoZWxwIGhlcmUuCiAgIFNvIGEgc2VwYXJhdGUgY29tbWFuZCBoYXMgYmVlbiBhZGRlZCB0byBoYW5kbGUgdGhpcyBzaXR1YXRpb246CgogIFNFVCBGLUFDSy1QQVRIIHsgT04sIE9GRiB9CgogICBOb3JtYWxseSBpdCBpcyBPTiAocmVnYXJkbGVzcyBvZiB0aGUgU0VUIFNFTkQgUEFUSE5BTUVTIHNldHRpbmcpLiBVc2UKICAgU0VUIEYtQUNLLVBBVEggT0ZGIHRvIGluc3RydWN0IEtlcm1pdCB0byBzZW5kIGJhY2sgb25seSB0aGUgZmlsZW5hbWUKICAgd2l0aG91dCB0aGUgcGF0aCBpbiB0aGUgQUNLIHRvIHRoZSBGIHBhY2tldC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDQuMjIuNS4gU3B1cmlvdXMgUmVmdXNhbHMKCiAgIFNvbWUgS2VybWl0IGltcGxlbWVudGF0aW9ucywgbm90YWJseSBQRFAtMTEgS2VybWl0IDMuNjAgYW5kIGVhcmxpZXIsCiAgIGhhdmUgYnVncyBpbiB0aGVpciBoYW5kbGluZyBvZiBBdHRyaWJ1dGUgcGFja2V0cyB0aGF0IGNhbiBjYXVzZQogICB1bndhcnJhbnRlZCByZWZ1c2FsIG9mIGluY29taW5nIGZpbGVzLCBlLmcuIGJhc2VkIG9uIGRhdGUgb3Igc2l6ZS4KICAgVGhpcyBjYW4gYmUgd29ya2VkIGFyb3VuZCBieSB0ZWxsaW5nIG9uZSBvciBib3RoIG9mIHRoZSBLZXJtaXQKICAgcGFydG5lcnMgdG86CgogIFNFVCBBVFRSSUJVVEVTIE9GRgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMi42LiBGYWlsdXJlcyBkdXJpbmcgdGhlIERhdGEgVHJhbnNmZXIgUGhhc2UKCiAgIFRoaXMgY2FuIGJlIGNhdXNlZCBieSBjb250cm9sLWNoYXJhY3RlciB1bnByZWZpeGluZyAoWzUyN11TZWN0aW9uCiAgIDQuMjIuMyApLCBhbmQgZml4ZWQgYnk6CgogIFNFVCBQUkVGSVhJTkcgQUxMCgogICBJdCBjYW4gYWxzbyBoYXZlIG51bWVyb3VzIG90aGVyIGNhdXNlcywgZXhwbGFpbmVkIGluIENoYXB0ZXIgMTAgb2YKICAgWzUyOF1Vc2luZyBDLUtlcm1pdDogdGhlIGNvbm5lY3Rpb24gaXMgbm90IDgtYml0IHRyYW5zcGFyZW50IChzbyB1c2UKICAgInNldCBwYXJpdHkgc3BhY2UiIG9yIHNvbWVzdWNoKSwgaW5hZGVxdWF0ZSBmbG93IGNvbnRyb2wsIGV0Yy4gQ29uc3VsdAogICB0aGUgbWFudWFsLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMi43LiBGcmFjdHVyZWQgRmlsZW5hbWVzCgogICBBdCBsZWFzdCBvbmUgd2VsbC1rbm93biBQQy1iYXNlZCBjb21tdW5pY2F0aW9ucyBwYWNrYWdlIG5lZ290aWF0ZXMKICAgZGF0YSBjb21wcmVzc2lvbiwgd2hpY2ggKGFjY29yZGluZyB0byB0aGUgcHJvdG9jb2wgc3BlY2lmaWNhdGlvbikKICAgYXBwbGllcyB0byBib3RoIHRoZSBmaWxlbmFtZSBhbmQgdGhlIGZpbGUgZGF0YSwgYnV0IHRoZW4gZmFpbHMgdG8KICAgZGVjb21wcmVzcyB0aGUgZmlsZW5hbWUuIEV4YW1wbGU6IEMtS2VybWl0IHNlbmRzIGEgZmlsZSBjYWxsZWQKICAgUjAwMDEwMS5EQVQgKHdoZXJlIDAwMDEwMSBtaWdodCBiZSBub24tWTJLLXdpc2UgWVlNTUREIG5vdGF0aW9uKSwgYW5kCiAgIHRoZSBwYWNrYWdlIGluIHF1ZXN0aW9uIHN0b3JlcyB0aGUgZmlsZXMgYXMgUn4jMDEwMS5EQVQuIFdvcmthcm91bmQ6CiAgIFRlbGwgQy1LZXJtaXQgdG8gU0VUIFJFUEVBVCBDT1VOVFMgT0ZGLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNC4yMi44LiBCYWQgRmlsZSBEYXRlcwoKICAgQXQgbGVhc3Qgb25lIHdlbGwta25vd24gUEMtYmFzZWQgY29tbXVuaWNhdGlvbnMgcGFja2FnZSBuZWdvdGlhdGVzIHRoZQogICBwYXNzaW5nIG9mIGZpbGUgdGltZXN0YW1wcyBmcm9tIHNlbmRlciB0byByZWNlaXZlciwgYnV0IHdoZW4gaXQgaXMKICAgc2VuZGluZyBmaWxlcywgaXQgYWx3YXlzIGdpdmVzIHRoZW0gYSB0aW1lc3RhbXAgb2YgMSBGZWJydWFyeSAxOTcwLgogICBXb3JrYXJvdW5kOiB0ZWxsIEMtS2VybWl0IHRvIFNFVCBBVFRSSUJVVEUgREFURSBPRkYuIFlvdSBkb24ndCBnZXQgdGhlCiAgIGZpbGUncyByZWFsIGRhdGUsIGJ1dCB5b3UgYWxzbyBkb24ndCBnZXQgMSBGZWIgMTk3MDsgaW5zdGVhZCB0aGUgZmlsZQogICBnZXRzIHRoZSBjdXJyZW50IGRhdGUgYW5kIHRpbWUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4yMy4gRmlsZSBUcmFuc2ZlciBSZWNvdmVyeQoKICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCBSRVNFTkQgKFNFTkQgL1JFQ09WRVIpIGFuZCBSRUdFVCAoR0VUIC9SRUNPVkVSKQogICByZWZ1c2VkIHRvIHdvcmsgaWYgRklMRSBUWVBFIHdhcyBub3QgQklOQVJZIG9yIHRoZSAvQklOQVJZIHN3aXRjaCB3YXMKICAgbm90IGluY2x1ZGVkLiBOb3cgdGhlc2UgY29tbWFuZHMgaW5jbHVkZSBhbiBpbXBsaWVkIC9CSU5BUlkgc3dpdGNoLAogICBtZWFuaW5nIHRoZXkgc2V0IHRoZSBmaWxlIHR5cGUgdG8gYmluYXJ5IGZvciB0aGUgZHVyYXRpb24gb2YgdGhlCiAgIGNvbW1hbmQgYXV0b21hdGljYWxseS4KCiAgIEluIHRoZSBjbGllbnQvc2VydmVyIGFycmFuZ2VtZW50LCB0aGlzIGFsc28gZm9yY2VzIHRoZSBzZXJ2ZXIgaW50bwogICBiaW5hcnkgbW9kZSAoaWYgaXQgaXMgQy1LZXJtaXQgNy4wIG9yIGdyZWF0ZXIsIG9yIEs5NSAxLjEuMTkgb3IKICAgZ3JlYXRlcikgc28gdGhlIHJlY292ZXJ5IG9wZXJhdGlvbiBwcm9jZWVkcywganVzdCBhcyB5b3UgYXNrZWQgYW5kCiAgIGV4cGVjdGVkLgoKICAgQlVULi4uIEp1c3QgYXMgYmVmb3JlLCB0aGUgcmVzdWx0cyBhcmUgY29ycmVjdCBvbmx5IHVuZGVyIHRoZQogICBmb2xsb3dpbmcgY29uZGl0aW9uczoKCiAgICAgKiBJZiB0aGUgcHJpb3IgaW50ZXJydXB0ZWQgdHJhbnNmZXIgd2FzIGFsc28gaW4gYmluYXJ5IG1vZGU7IG9yOgogICAgICogSWYgdGhlIHByaW9yIHRyYW5zZmVyIHdhcyBpbiB0ZXh0IG1vZGUgYW5kIHRoZSBvdGhlciBjb21wdXRlciB3YXMKICAgICAgIGEgImxpa2UgcGxhdGZvcm0iIChlLmcuIFVOSVgtdG8tVU5JWCwgV2luZG93cy10by1XaW5kb3dzLAogICAgICAgRE9TLXRvLVdpbmRvd3MpIEFORCB0aGVyZSB3YXMgbm8gY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiAoaS5lLgogICAgICAgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCB3YXMgVFJBTlNQQVJFTlQpLgoKICAgTm90ZSB0aGF0IHRoZXNlIGNpcmN1bXN0YW5jZXMgYXJlIG1vcmUgbGlrZWx5IHRvIG9idGFpbiBpbiBDLUtlcm1pdAogICA3LjAsIGluIHdoaWNoOgoKICAgICAqIFRoZSBkZWZhdWx0IEZJTEUgVFlQRSBpbiBDLUtlcm1pdCA3LjAgaXMgQklOQVJZLgogICAgICogVGhlIGRlZmF1bHQgRklMRSBJTkNPTVBMRVRFIHNldHRpbmcgaXMgQVVUTywgd2hpY2ggbWVhbnMgS0VFUCBpZgogICAgICAgdGhlIHRyYW5zZmVyIGlzIGluIGJpbmFyeSBtb2RlLCBESVNDQVJEIG90aGVyd2lzZS4KICAgICAqIEMtS2VybWl0IDcuMCwgS2VybWl0IDk1IDEuMS4xNywgYW5kIE1TLURPUyBLZXJtaXQgMy4xNSBhbmQgbGF0ZXIKICAgICAgIGNhbiByZWNvZ25pemUgImxpa2UgcGxhdGZvcm1zIiBhbmQgc3dpdGNoIGludG8gYmluYXJ5IG1vZGUKICAgICAgIGF1dG9tYXRpY2FsbHkuIFRyYW5zZmVycyBiZXR3ZWVuIGxpa2UgcGxhdGZvcm1zIGFyZSBhbHdheXMgYmluYXJ5CiAgICAgICB1bmxlc3MgY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQsIGFuZCB0aGVuIGlzCiAgICAgICBzdGlsbCBiaW5hcnkgZm9yIGFsbCBmaWxlcyB3aG9zZSBuYW1lcyBtYXRjaCBhIGJpbmFyeSBwYXR0ZXJuLAogICAgICAgdW5sZXNzIHRoZSBhdXRvbWF0aWMgbWVjaGFuaXNtcyBoYXZlIGJlZW4gZGlzYWJsZWQgKHdpdGggYSAvVEVYVAogICAgICAgc3dpdGNoLCBvciB3aXRoIFNFVCBUUkFOU0ZFUiBNT0RFIE1BTlVBTCkuCiAgICAgKiBTRU5EIC9CSU5BUlkgYW5kIEdFVCAvQklOQVJZIGFsd2F5cyBmb3JjZSBiaW5hcnktbW9kZSB0cmFuc2ZlcnMsCiAgICAgICBldmVuIHdoZW4gRklMRSBUWVBFIGlzIFRFWFQsIGV2ZW4gd2hlbiBUUkFOU0ZFUiBNT0RFIGlzIEFVVE9NQVRJQywKICAgICAgIGV2ZW4gd2hlbiBQQVRURVJOUyBhcmUgT04gYW5kIHRoZSBmaWxlJ3MgbmFtZSBtYXRjaGVzIGEgdGV4dAogICAgICAgcGF0dGVybi4KCiAgIEJ1dCBhbHNvIG5vdGUgdGhhdCB0aGUgYXV0b21hdGljIGNsaWVudC9zZXJ2ZXIgdHJhbnNmZXItbW9kZQogICBhZGp1c3RtZW50cyBkbyBub3Qgd29yayB3aXRoIHZlcnNpb25zIG9mIEMtS2VybWl0IHByaW9yIHRvIDcuMCBvciBLOTUKICAgcHJpb3IgdG8gMS4xLjE2LgoKICAgSWYgdGhlIHByaW9yIHRyYW5zZmVyIHdhcyBpbiB0ZXh0IG1vZGU6CgogICAgICogSWYgdGV4dC1tb2RlIHRyYW5zZmVycyBiZXR3ZWVuIHRoZSB0d28gcGxhdGZvcm1zIGFyZQogICAgICAgImxlbmd0aC1jaGFuZ2luZyIgKGFzIHRoZXkgYXJlIGJldHdlZW4gVU5JWCAtLSB3aGljaCB0ZXJtaW5hdGVzCiAgICAgICB0ZXh0IGxpbmVzIHdpdGggTEYgLS0gYW5kIERPUyBvciBXaW5kb3dzIC0tIHdoaWNoIHRlcm1pbmF0ZXMgdGV4dAogICAgICAgbGluZXMgd2l0aCBDUkxGKSwgdGhlIHJlY292ZXJlZCBmaWxlIHdpbGwgYmUgY29ycnVwdC4KICAgICAqIElmIHRleHQtbW9kZSB0cmFuc2ZlcnMgYmV0d2VlbiB0aGUgdHdvIHBsYXRmb3JtcyBhcmUgbm90CiAgICAgICBsZW5ndGgtY2hhbmdpbmcsIGJ1dCBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIHdhcyBhY3RpdmUgaW4gdGhlCiAgICAgICBwcmlvciB0cmFuc2ZlciwgdGhlIHJlc3VsdCB3aWxsIGJlIGEgZmlsZSBpbiB3aGljaCB0aGUgZmlyc3QgcGFydAogICAgICAgaGFzIHRyYW5zbGF0ZWQgY2hhcmFjdGVycyBhbmQgdGhlIHNlY29uZCBwYXJ0IGRvZXMgbm90LgoKICAgQnV0IGluIEMtS2VybWl0IDcuMCBhbmQgSzk1IDEuMS4xOSBhbmQgbGF0ZXIsIGluY29tcGxldGVseSB0cmFuc2ZlcnJlZAogICB0ZXh0IGZpbGVzIGFyZSBub3Qga2VwdCB1bmxlc3MgeW91IGNoYW5nZSB0aGUgZGVmYXVsdC4gQnV0IGlmIHlvdSBoYXZlCiAgIGRvbmUgdGhpcywgYW5kIHlvdSBoYXZlIGFuIGluY29tcGxldGVseSB0cmFuc2ZlcnJlZCB0ZXh0IGZpbGUsIHlvdSdsbAogICBuZWVkIHRvOgoKICAgICAqIFRyYW5zZmVyIHRoZSB3aG9sZSBmaWxlIGFnYWluIGluIHRleHQgbW9kZSwgb3I6CiAgICAgKiBVc2UgU0VORCAvU1RBUlRJTkctQVQ6IHRvIHJlY292ZXIgdGhlIHRyYW5zZmVyIGF0IHRoZSBjb3JyZWN0CiAgICAgICBwb2ludDsgYnV0IHlvdSBoYXZlIHRvIGZpbmQgb3V0IHdoYXQgdGhhdCBwb2ludCBpcywgYXMgZGVzY3JpYmVkCiAgICAgICBpbiB0aGUgbWFudWFsLgoKICAgS2VybWl0IGhhcyBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBwcmV2aW91cyB0cmFuc2ZlciB3YXMgaW4gdGV4dAogICBvciBiaW5hcnkgbW9kZSBzbyBpdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGNob29zZSB0aGUgYXBwcm9wcmlhdGUKICAgcmVjb3ZlcnkgbWV0aG9kLgoKICAgSWYgeW91IHVzZSBDLUtlcm1pdCB0byBtYWludGFpbiBwYXJhbGxlbCBkaXJlY3RvcmllcyBvbiBkaWZmZXJlbnQKICAgY29tcHV0ZXJzLCB1c2luZyBTRVQgRklMRSBDT0xMSVNJT04gdG8gdHJhbnNmZXIgb25seSB0aG9zZSBmaWxlcyB0aGF0CiAgIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lLCBhbmQgdGhlIGZpbGVzIGFyZSBiaWcgZW5vdWdoIChvciB0aGUKICAgY29ubmVjdGlvbiBzbG93IGVub3VnaCkgdG8gcmVxdWlyZSBTRU5EIC9SRUNPVkVSIHRvIHJlc3VtZSBpbnRlcnJ1cHRlZAogICB0cmFuc2ZlcnMsIHlvdSBzaG91bGQgcmVtZW1iZXIgdGhhdCBTRU5EIC9SRUNPVkVSIChSRVNFTkQpIG92ZXJyaWRlcwogICBhbGwgRklMRSBDT0xMSVNJT04gc2V0dGluZ3MuIFRoZXJlZm9yZSB5b3Ugc2hvdWxkIHVzZSBTRU5EIC9SRUNPVkVSCiAgIChSRVNFTkQpIG9ubHkgb24gdGhlIGZpbGUgdGhhdCB3YXMgaW50ZXJydXB0ZWQsIG5vdCB0aGUgZmlsZSBncm91cC4KICAgRm9yIGV4YW1wbGUsIGlmIHRoZSBvcmlnaW5hbCB0cmFuc2ZlciB3YXMgaW5pdGlhdGVkIHdpdGg6CgogIFNFTkQgKgoKICAgYW5kIHdhcyBpbnRlcnJ1cHRlZCwgdGhlbiBhZnRlciByZWVzdGFibGlzaGluZyB5b3VyIGNvbm5lY3Rpb24gYW5kCiAgIHN0YXJ0aW5nIHRoZSBLZXJtaXQgcmVjZWl2ZXIgd2l0aCBTRVQgRklMRSBDT0xMSVNJT04gVVBEQVRFIG9uIHRoZQogICByZW1vdGUgZW5kLCB1c2UgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZSBhdCB0aGUgc2VuZGVyIHRvIHJlc3VtZSB0aGUKICAgdHJhbnNmZXI6CgogIFNFTkQgL1JFQ09WRVIgbmFtZS1vZi1pbnRlcnJ1cHRlZC1maWxlCgogICBhbmQgdGhlbjoKCiAgU0VORCAqCgogICAoSW4gQy1LZXJtaXQgNy4wIGFuZCBsYXRlciwgXHYoZmlsZW5hbWUpIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBmaWxlCiAgIG1vc3QgcmVjZW50bHkgdHJhbnNmZXJyZWQsIGFzIGxvbmcgeW91IGhhdmUgbm90IEVYSVRlZCBmcm9tIEtlcm1pdCBvcgogICBjaGFuZ2VkIGRpcmVjdG9yeSwgZXRjLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDQuMjQuIEZJTEUgQ09MTElTSU9OIFVQREFURSBDbGFyaWZpY2F0aW9uCgogICBJbiBVTklYLCBmaWxlIG1vZGlmaWNhdGlvbiBkYXRlcyBhcmUgdXNlZCB3aGVuIGNvbXBhcmluZyB0aGUgZmlsZSBkYXRlCiAgIHdpdGggdGhlIGRhdGUgaW4gdGhlIGF0dHJpYnV0ZSBwYWNrZXQuIEluIFZNUywgaG93ZXZlciwgdGhlIGZpbGUKICAgY3JlYXRpb24gZGF0ZSBpcyB1c2VkLiBUaGVzZSB0d28gcG9saWNpZXMgcmVmbGVjdCB0aGUgcHJlZmVyZW5jZXMgb2YKICAgdGhlIHR3byB1c2VyIGNvbW11bml0aWVzLgoKICAgQWxzbywgcmVtZW1iZXIgdGhhdCB0aGUgZmlsZSBkYXRlL3RpbWUgZ2l2ZW4gaW4gdGhlIGF0dHJpYnV0ZSBwYWNrZXQKICAgaXMgdGhlIGxvY2FsIHRpbWUgYXQgdGhlIGZpbGUgc2VuZGVyLiBBdCBwcmVzZW50LCBubyB0aW1lem9uZQogICBjb252ZXJzaW9ucyBhcmUgZGVmaW5lZCBpbiBvciBwZXJmb3JtZWQgYnkgdGhlIEtlcm1pdCBwcm90b2NvbC4gVGhpcwogICBpcyBwcmltYXJpbHkgYmVjYXVzZSB0aGlzIGZlYXR1cmUgd2FzIGRlc2lnbmVkIGF0IGEgdGltZSB3aGVuIG1hbnkgb2YKICAgdGhlIHN5c3RlbXMgd2hlcmUgS2VybWl0IHJ1bnMgaGFkIG5vIGNvbmNlcHQgb2YgdGltZXpvbmUsIGFuZAogICB0aGVyZWZvcmUgd291bGQgYmUgdW5hYmxlIHRvIGNvbnZlcnQgKHNheSwgdG8vZnJvbSBHTVQgb3IgVVRDIG9yIFp1bHUKICAgdGltZSkuCgogICBBcyBhIGNvbnNlcXVlbmNlLCBzb21lIHVuZXhwZWN0ZWQgcmVzdWx0cyBtaWdodCBvY2N1ciB3aGVuCiAgIHRyYW5zZmVycmluZyBmaWxlcyBhY3Jvc3MgdGltZXpvbmVzOyBlLmcuIGNvbW1hbmRzIG9uIHRoZSB0YXJnZXQKICAgc3lzdGVtIHRoYXQgYXJlIHNlbnNpdGl2ZSB0byBmaWxlIGRhdGVzIG1pZ2h0IHdvcmsgKFVOSVggIm1ha2UiLAogICBiYWNrdXBzLCBldGMpLgoKICAgVGltZXpvbmUgaGFuZGxpbmcgaXMgZGVmZXJyZWQgZm9yIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNC4yNS4gQXV0b2Rvd25sb2FkIEltcHJvdmVtZW50cwoKICAgUmVmZXIgdG8gcGFnZXMgMTY0LTE2NSBvZiBbNTI5XVVzaW5nIEMtS2VybWl0IGFib3V0IHRoZSBoYXphcmRzIG9mCiAgIGF1dG9kb3dubG9hZCB3aGVuIEMtS2VybWl0IGlzICJpbiB0aGUgbWlkZGxlIi4gQXMgb2YgQy1LZXJtaXQgNy4wLCBubwogICBtb3JlIGhhemFyZHMuIElmIEMtS2VybWl0IGhhcyBURVJNSU5BTCBBVVRPRE9XTkxPQUQgT04gYW5kIGl0IGRldGVjdHMKICAgYSBwYWNrZXQgb2YgdGhlIGN1cnJlbnQgcHJvdG9jb2wgdHlwZSAoS2VybWl0IG9yIFptb2RlbSksIGl0ICJlcmFzZXMiCiAgIHRoZSB2aXN1YWwgYXNwZWN0IG9mIHRoZSBwYWNrZXQgdGhhdCB3b3VsZCBiZSBzZWVuIGJ5IHRoZSB0ZXJtaW5hbAogICAob3IsIG1vcmUgdG8gdGhlIHBvaW50LCB0aGUgZW11bGF0b3IsIHN1Y2ggYXMgSzk1KS4gVGhpcyB3YXksIG9ubHkKICAgQy1LZXJtaXQgZ29lcyBpbnRvIFJFQ0VJVkUgbW9kZSwgYW5kIG5vdCBhbHNvIHRoZSB0ZXJtaW5hbCBlbXVsYXRvcgogICB0aHJvdWdoIHdoaWNoIEMtS2VybWl0IGlzIGFjY2Vzc2VkLiBBbmQgdGhlcmVmb3JlLCBpdCBpcyBubyBsb25nZXIKICAgbmVjZXNzYXJ5IHRvIFNFVCBURVJNSU5BTCBBVVRPRE9XTkxPQUQgT0ZGIHRvIHByZXZlbnQgbXVsdGlwbGUgS2VybWl0cwogICBmcm9tIGdvaW5nIGludG8gcmVjZWl2ZSBtb2RlIGF0IG9uY2UsIGJ1dCBvZiBjb3Vyc2UgaXQgaXMgc3RpbGwKICAgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0LCB3aGVuIHlvdSBoYXZlIG11bHRpcGxlIEtlcm1pdHMgaW4gYSBjaGFpbiwKICAgdGhhdCB0aGUgZGVzaXJlZCBvbmUgcmVjZWl2ZXMgdGhlIGF1dG9kb3dubG9hZC4KCiAgIFRoZSBkZWZhdWx0cyBoYXZlIG5vdCBiZWVuIGNoYW5nZWQ7IEtlcm1pdCA5NSBzdGlsbCBoYXMgYXV0b2Rvd25sb2FkCiAgIE9OIGJ5IGRlZmF1bHQsIGFuZCBDLUtlcm1pdCBoYXMgaXQgT0ZGIGJ5IGRlZmF1bHQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNS4gQ0xJRU5UL1NFUlZFUgoKICA1LjAuIEhpbnRzCgogICBJZiB5b3UgdXNlIFNFVCBTRVJWRVIgR0VULVBBVEggdG8gc2V0IHVwIHlvdXIgc2VydmVyLCBhbmQgdGhlIEdFVC1QQVRICiAgIGRvZXMgbm90IGluY2x1ZGUgdGhlIHNlcnZlcidzIGN1cnJlbnQgZGlyZWN0b3J5LCBjbGllbnRzIGNhbiBiZWNvbWUKICAgcXVpdGUgY29uZnVzZWQuIEZvciBleGFtcGxlLCAicmVtb3RlIGRpciBvb2ZhLnR4dCIgc2hvd3MgYSBmaWxlIG5hbWVkCiAgIG9vZmEudHh0LCBidXQgImdldCBvb2ZhLnR4dCIgZmFpbHMuIEluIHRoaXMgc2l0dWF0aW9uLCB5b3Ugc2hvdWxkCiAgIGVpdGhlciBESVNBQkxFIERJUiBvciBtYWtlIHlvdXIgR0VULVBBVEggaW5jbHVkZSB0aGUgY3VycmVudAogICBkaXJlY3RvcnkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNS4xLiBOZXcgQ29tbWFuZC1MaW5lIE9wdGlvbnMKCiAgIFRoZSAtRyBjb21tYW5kLWxpbmUgb3B0aW9uIGlzIGxpa2UgLWcgKEdFVCksIGV4Y2VwdCB0aGUgaW5jb21pbmcgZmlsZQogICBpcyBzZW50IHRvIHN0YW5kYXJkIG91dHB1dCByYXRoZXIgdGhhbiB3cml0dGVuIHRvIGRpc2suCgogICBUaGUgLUkgb3B0aW9uICgiSW50ZXJuZXQiKSBpcyB1c2VkIHRvIHRlbGwgYSByZW1vdGUgQy1LZXJtaXQgcHJvZ3JhbQogICB0aGF0IHlvdSBhcmUgY29taW5nIGluIHZpYSBJbnRlcm5ldCBUZWxuZXQgb3IgUmxvZ2luIGFuZCB0aGVyZWZvcmUKICAgaGF2ZSBhIHJlbGlhYmxlIGNvbm5lY3Rpb24uIFRoZSAtSSBvcHRpb24gaXMgZXF1aXZhbGVudCB0byBTRVQKICAgUkVMSUFCTEUgT04gYW5kIFNFVCBGTE9XIE5PTkUuCgogICBUaGUgLU8gb3B0aW9uICgiT25seSBPbmUiKSB0ZWxscyBDLUtlcm1pdCB0byBlbnRlciBzZXJ2ZXIgbW9kZSBidXQKICAgdGhlbiBleGl0IGFmdGVyIHRoZSBmaXJzdCBjbGllbnQgb3BlcmF0aW9uLgoKICAgU2VlIFs1MzBdU2VjdGlvbiA5LjMgZm9yIGRldGFpbHMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNS4yLiBOZXcgQ2xpZW50IENvbW1hbmRzCgogICBCWUUgYW5kIEZJTklTSCBubyBsb25nZXIgdHJ5IHRvIGRvIGFueXRoaW5nIGlmIGEgY29ubmVjdGlvbiBpcyBub3QKICAgYWN0aXZlLiBUaHVzIGEgc2VxdWVuY2UgbGlrZSAiaGFuZ3VwIiBmb2xsb3dlZCBieSAiYnllIiBvciAiZmluaXNoIgogICB3aWxsIG5vIGxvbmdlciBnZXQgc3R1Y2sgaW4gYSBsb25nIHRpbWVvdXQtYW5kLXJldHJhbnNtaXNzaW9uIGN5Y2xlLAogICBub3Igd2lsbCBpdCB0cnkgdG8gb3BlbiBhIG5ldyBjb25uZWN0aW9uLgoKICAgUkVNT1RFIEVYSVQKICAgICAgICAgIFNpbWlsYXIgdG8gRklOSVNILCBleGNlcHQgaXQgZW5zdXJlcyB0aGF0IHRoZSBLZXJtaXQgc2VydmVyCiAgICAgICAgICBwcm9ncmFtIGV4aXRzIGJhY2sgdG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0gb3Igc2hlbGwgcHJvbXB0LgogICAgICAgICAgKEZJTklTSCB3b3VsZCByZXR1cm4gaXQgdG8gaXRzIGludGVyYWN0aXZlIHByb21wdCBpZiBpdCB3YXMKICAgICAgICAgIHN0YXJ0ZWQgaW4gaW50ZXJhY3RpdmUgbW9kZSwgYW5kIHdvdWxkIGNhdXNlIGl0IHRvIGV4aXQgaWYgaXQKICAgICAgICAgIGVudGVyZWQgc2VydmVyIG1vZGUgdmlhIGNvbW1hbmQtbGluZSBvcHRpb24uKSBXaGVuIEMtS2VybWl0IGlzCiAgICAgICAgICB0byBiZSB0aGUgc2VydmVyLCB5b3UgY2FuIHVzZSB7IEVOQUJMRSwgRElTQUJMRSB9IEVYSVQgdG8KICAgICAgICAgIGNvbnRyb2wgdGhlIGNsaWVudCdzIGFjY2VzcyB0byB0aGlzIGZlYXR1cmUuCgogICBSRU1PVEUgTUtESVIgZGlyZWN0b3J5LW5hbWUKICAgICAgICAgIFRlbGxzIHRoZSBjbGllbnQgdG8gYXNrIHRoZSBzZXJ2ZXIgdG8gY3JlYXRlIGEgZGlyZWN0b3J5IHdpdGgKICAgICAgICAgIHRoZSBnaXZlbiBuYW1lLCB3aGljaCBjYW4gYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUuIFRoZSBzeW50YXgKICAgICAgICAgIG9mIHRoZSBkaXJlY3RvcnkgbmFtZSBkZXBlbmRzIG9uIHRoZSBLZXJtaXQgc2VydmVyIChzZWUKICAgICAgICAgIFs1MzFdbmV4dCBzZWN0aW9uKTsgaW4gYWxsIGNhc2VzLCBpdCBjYW4gYmUgaW4gdGhlIHN5bnRheCBvZgogICAgICAgICAgdGhlIHN5c3RlbSB3aGVyZSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgKFVOSVgsIFZNUywgRE9TLCBldGMpCiAgICAgICAgICBidXQgbmV3ZXIgc2VydmVycyBhbHNvIGFjY2VwdCBVTklYIHN5bnRheCwgbm8gbWF0dGVyIHdoYXQgdGhlCiAgICAgICAgICB1bmRlcmx5aW5nIHBsYXRmb3JtLiBUaGUgc2VydmVyIHdpbGwgbm90IGV4ZWN1dGUgdGhpcyBjb21tYW5kCiAgICAgICAgICBpZiAoYSkgaXQgZG9lcyBub3QgdW5kZXJzdGFuZCBpdCwgKGIpIGEgRElTQUJMRSBNS0RJUiBjb21tYW5kCiAgICAgICAgICBoYXMgYmVlbiBnaXZlbiwgb3IgKGMpIGEgRElTQUJMRSBDV0QgY29tbWFuZCBoYXMgYmVlbiBnaXZlbjsKICAgICAgICAgIG90aGVyd2lzZSwgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQsIGJ1dCB3aWxsIGZhaWwgaWYgdGhlCiAgICAgICAgICBkaXJlY3RvcnkgY2FuIG5vdCBiZSBjcmVhdGVkLCBpbiB3aGljaCBjYXNlcyBtb3N0IHNlcnZlcnMgd2lsbAogICAgICAgICAgYXR0ZW1wdCB0byByZXR1cm4gYSBtZXNzYWdlIGdpdmluZyB0aGUgcmVhc29uIGZvciBmYWlsdXJlLiBUaGUKICAgICAgICAgIFJFTU9URSBNS0RJUiBjb21tYW5kIHN1Y2NlZWRzIGlmIHRoZSByZW1vdGUgZGlyZWN0b3J5IGlzCiAgICAgICAgICBjcmVhdGVkLCBvciBpZiBpdCBhbHJlYWR5IGV4aXN0cyBhbmQgdGhlcmVmb3JlIGRvZXMgbm90IG5lZWQgdG8KICAgICAgICAgIGJlIGNyZWF0ZWQsIGFuZCBmYWlscyBvdGhlcndpc2UuCgogICBSRU1PVEUgUk1ESVIgZGlyZWN0b3J5LW5hbWUKICAgICAgICAgIFRlbGxzIHRoZSBjbGllbnQgdG8gYXNrIHRoZSBzZXJ2ZXIgdG8gcmVtb3ZlIChkZWxldGUpIGEKICAgICAgICAgIGRpcmVjdG9yeSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBUaGUgc2FtZSBjb25zaWRlcmF0aW9ucyBhcHBseSBhcwogICAgICAgICAgZm9yIFJFTU9URSBNS0RJUi4KCiAgIFJFTU9URSBTRVQgRklMRSBJTkNPTVBMRVRFIHsgRElTQ0FSRCwgS0VFUCwgQVVUTyB9CiAgICAgICAgICBQcmV2aW91c2x5IHRoaXMgd2FzIG9ubHkgYXZhaWxhYmxlIGluIGl0cyBlYXJsaWVyIGZvcm0sIFJFTU9URQogICAgICAgICAgU0VUIElOQ09NUExFVEUgKG5vIEZJTEUpLiBUaGUgZWFybGllciBmb3JtIGlzIHN0aWxsIGF2YWlsYWJsZSwKICAgICAgICAgIGJ1dCBpbnZpc2libGUuIEFsc28sIEFVVE8gd2FzIGFkZGVkLCBtZWFuaW5nIEtFRVAgaWYgaW4gYmluYXJ5CiAgICAgICAgICBtb2RlLCBESVNDQVJEIG90aGVyd2lzZS4KCiAgIFJFTU9URSBTRVQgVFJBTlNGRVIgTU9ERSB7IEFVVE9NQVRJQywgTUFOVUFMIH0KICAgICAgICAgIFRlbGxzIHRoZSBjbGllbnQgdG8gYXNrIHRoZSBzZXJ2ZXIgdG8gc2V0IHRoZSBnaXZlbgogICAgICAgICAgZmlsZS10cmFuc2ZlciBtb2RlLiBBdXRvbWF0aWMgbWVhbnMgKHJvdWdobHkpOiBpZiB0aGUgY2xpZW50CiAgICAgICAgICBhbmQgdGhlIHNlcnZlciBhcmUgcnVubmluZyBvbiB0aGUgc2FtZSBraW5kIG9mIGNvbXB1dGVyIChlLmcuCiAgICAgICAgICBib3RoIGFyZSBvbiBVTklYKSwgdGhlbiB1c2UgYmluYXJ5IG1vZGUgYXV0b21hdGljYWxseTsgaWYgdGhlCiAgICAgICAgICBzeXN0ZW0gdHlwZXMgYXJlIGRpZmZlcmVudCwgdXNlIHNvbWUgb3RoZXIgbWV0aG9kIHRvCiAgICAgICAgICBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0ZXh0IG9yIGJpbmFyeSBtb2RlLCBzdWNoIGFzIGZpbGVuYW1lCiAgICAgICAgICBwYXR0ZXJuIG1hdGNoaW5nLiBNQU5VQUwgbWVhbnMsIGluIHRoaXMgY29udGV4dCwgb2JleSB0aGUKICAgICAgICAgIGNsaWVudCdzIEZJTEUgVFlQRSBzZXR0aW5nIChURVhUIG9yIEJJTkFSWSkuIFN5bm9ueW06IFJFTU9URQogICAgICAgICAgU0VUIFhGRVIgTU9ERS4KCiAgIFsgUkVNT1RFIF0gUVVFUlkgS0VSTUlUIGZ1bmN0aW9uKGFyZ3MuLi4pCiAgICAgICAgICBQcmlvciB0byBDLUtlcm1pdCA3LjAsIHRoZSBhcmd1bWVudHMgd2VyZSBub3QgZXZhbHVhdGVkCiAgICAgICAgICBsb2NhbGx5LiBUaHVzIGl0IHdhcyBub3QgcG9zc2libGUgdG8gaGF2ZSB0aGUgc2VydmVyIHJ1biB0aGUKICAgICAgICAgIGZ1bmN0aW9uIHdpdGggY2xpZW50LXNpZGUgdmFyaWFibGVzIGFzIGFyZ3VtZW50cy4gTm93OgoKICBkZWZpbmUgXCVhIG9vZmEuKgogIHJlbW90ZSBxdWVyeSBrZXJtaXQgZmlsZXMoXCVhKSAgICA7IENsaWVudCdzIFwlYQogIHJlbW90ZSBxdWVyeSBrZXJtaXQgZmlsZXMoXFwlYSkgICA7IFNlcnZlcidzIFwlYQoKICAgWyBSRU1PVEUgXSBMT0dJTiBbIHVzZXIgWyBwYXNzd29yZCBdIF0KICAgICAgICAgIExPR0lOIGlzIG5vdyBhIHN5bm9ueW0gZm9yIFJFTU9URSBMT0dJTi4KCiAgIExPR09VVAogICAgICAgICAgVGhpcyBjb21tYW5kLCB3aGVuIGdpdmVuIGluIGxvY2FsIG1vZGUsIGlzIGVxdWl2YWxlbnQgdG8gUkVNT1RFCiAgICAgICAgICBMT0dPVVQuIFdoZW4gZ2l2ZW4gYXQgdGhlIElLU0QgcHJvbXB0LCBpdCBsb2dzIG91dCB0aGUgSUtTRC4KICAgICAgICAgIFdoZW4gZ2l2ZW4gYXQgdGhlIEMtS2VybWl0IHByb21wdCB3aGVuIGl0IGhhcyBubyBjb25uZWN0aW9uLCBpdAogICAgICAgICAgZG9lcyBub3RoaW5nLgoKICAgTm90ZSB0aGF0IGluIEMtS2VybWl0IDcuMCwgdGhlIFJFTU9URSAob3IgUikgcHJlZml4IGlzIG5vdCByZXF1aXJlZAogICBmb3IgUVVFUlksIHNpbmNlIHRoZXJlIGlzIG5vIGxvY2FsIFFVRVJZIGNvbW1hbmQuIFRoZSBuZXcgdG9wLWxldmVsCiAgIFFVRVJZIGNvbW1hbmQgZG9lcyBleGFjdGx5IHdoYXQgUkVNT1RFIFFVRVJZIChSUVVFUlkpIGRvZXMuCgogICBBbGwgUkVNT1RFIGNvbW1hbmRzIG5vdyBoYXZlIHNpbmdsZS13b3JkIHNob3J0Y3V0czoKCiBTaG9ydGN1dCAgIEZ1bGwgRm9ybQogIFJBU0cgICAgICAgUkVNT1RFIEFTU0lHTgogIFJDRCAgICAgICAgUkVNT1RFIENECiAgUkNPUFkgICAgICBSRU1PVEUgQ09QWQogIFJERUwgICAgICAgUkVNT1RFIERFTEVURQogIFJESVIgICAgICAgUkVNT1RFIERJUkVDVE9SWQogIFJFWElUICAgICAgUkVNT1RFIEVYSVQKICBSSEVMUCAgICAgIFJFTU9URSBIRUxQCiAgUkhPU1QgICAgICBSRU1PVEUgSE9TVAogIFJQV0QgICAgICAgUkVNT1RFIFBXRAogIFJTRVQgICAgICAgUkVNT1RFIFNFVAogIGV0Yy4KCiAgIFRoZSBSIHByZWZpeCBpcyBub3QgYXBwbGllZCB0byBMT0dJTiBiZWNhdXNlIHRoZXJlIGlzIGFscmVhZHkgYW4KICAgUkxPR0lOIGNvbW1hbmQgd2l0aCBhIGRpZmZlcmVudCBtZWFuaW5nLiBJdCBpcyBub3QgYXBwbGllZCB0byBMT0dPVVQKICAgZWl0aGVyLCBzaW5jZSBMT0dPVVQga25vd3Mgd2hhdCB0byBkbyBpbiBlYWNoIGNhc2UsIGFuZCBmb3Igc3ltbWV0cnkKICAgd2l0aCBMT0dJTi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDUuMi4xLiBSZW1vdGUgUHJvY2VkdXJlIERlZmluaXRpb25zIGFuZCBDYWxscwoKICAgVGhpcyBpcyBub3RoaW5nIG5ldywgYnV0IGl0IG1pZ2h0IG5vdCBiZSBvYnZpb3VzLi4uIFJFTU9URSBBU1NJR04gYW5kCiAgIFJFTU9URSBRVUVSWSBtYXkgYmUgdXNlZCB0byBhY2hpZXZlIHJlbW90ZSBwcm9jZWR1cmUgZXhlY3V0aW9uLiBUaGUKICAgcmVtb3RlIHByb2NlZHVyZSBjYW4gYmUgZGVmaW5lZCBsb2NhbGx5IG9yIHJlbW90ZWx5LgoKICAgQSByZW1vdGUgcHJvY2VkdXJlIGNhbGwgaXMgYWNjb21wbGlzaGVkIGFzIG5vdGVkIGluIHRoZSBwcmV2aW91cwogICBzZWN0aW9uOgoKICBbIHJlbW90ZSBdIHF1ZXJ5IGtlcm1pdCBmdW5jdGlvbi1uYW1lKGFyZ3MuLi4pCgogICBUaGlzIGludm9rZXMgYW55IGZ1bmN0aW9uIHRoYXQgaXMgYnVpbHQgaW4gdG8gdGhlIEtlcm1pdCBzZXJ2ZXIsIGUuZy46CgogIFsgcmVtb3RlIF0gcXVlcnkga2VybWl0IHNpemUoZm9vLmJhcikKCiAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIHJlbW90ZSBmaWxlLCBmb28uYmFyLgoKICAgTm93IG5vdGUgdGhhdCBDLUtlcm1pdCBpbmNsdWRlcyBhbiBcZmV4ZWN1dGUoKSBmdW5jdGlvbiwgYWxsb3dpbmcgaXQKICAgdG8gZXhlY3V0ZSBhbnkgbWFjcm8gYXMgaWYgaXQgd2VyZSBhIGJ1aWx0LWluIGZ1bmN0aW9uLiBTbyBzdXBwb3NlCiAgIE1ZTUFDUk8gaXMgdGhlIG5hbWUgb2YgYSBtYWNybyBkZWZpbmVkIGluIHRoZSBzZXJ2ZXIuIFlvdSBjYW4gZXhlY3V0ZQogICBpdCBmcm9tIHRoZSBjbGllbnQgYXMgZm9sbG93cyAodGhlIHJlZHVuZGFudCAicmVtb3RlIiBwcmVmaXggaXMKICAgb21pdHRlZCBpbiB0aGUgcmVtYWluaW5nIGV4YW1wbGVzKToKCiAgcXVlcnkga2VybWl0IGV4ZWN1dGUobXltYWNybyBhcmcxIGFyZzIuLi4pCgogICBUaGUgcmV0dXJuIHZhbHVlLCBpZiBhbnksIGlzIHRoZSB2YWx1ZSBvZiB0aGUgUkVUVVJOIGNvbW1hbmQgdGhhdAogICB0ZXJtaW5hdGVkIGV4ZWN1dGlvbiBvZiB0aGUgbWFjcm8sIGZvciBleGFtcGxlOgoKICBkZWZpbmUgYWRkdHdvbnVtYmVycyByZXR1cm4gXGZldmFsKFwlMStcJTIpCgogICBUaGUgY2xpZW50IGludm9jYXRpb24gd291bGQgYmU6CgogIHF1ZXJ5IGtlcm1pdCBleGVjdXRlKGFkZHR3b251bWJlcnMgMyA0KQogIDcKCiAgIFRoZSByZXN1bHQgKCI3IiBpbiB0aGlzIGNhc2UpIGlzIGFsc28gYXNzaWduZWQgdG8gdGhlIGNsaWVudCdzCiAgIFx2KHF1ZXJ5KSB2YXJpYWJsZS4KCiAgIFRvIGV4ZWN1dGUgYSByZW1vdGUgc3lzdGVtIGNvbW1hbmQgb3IgY29tbWFuZCBwcm9jZWR1cmUgKHNoZWxsIHNjcmlwdCwKICAgZXRjKSB1c2U6CgogIHF1ZXJ5IGtlcm1pdCBjb21tYW5kKG5hbWUgYXJncy4uLikKCiAgIEZpbmFsbHksIHN1cHBvc2UgeW91IHdhbnQgdGhlIGNsaWVudCB0byBzZW5kIGEgbWFjcm8gdG8gdGhlIHNlcnZlciB0bwogICBiZSBleGVjdXRlZCBvbiB0aGUgc2VydmVyIGVuZC4gVGhpcyBpcyBkb25lIGFzIGZvbGxvd3M6CgogIHJlbW90ZSBhc3NpZ24gbWFjcm9uYW1lIGRlZmluaXRpb24KICBxdWVyeSBrZXJtaXQgZXhlY3V0ZShtYWNyb25hbWUgYXJnMSBhcmcyLi4uKQoKICAgUXVvdGluZyBpcyByZXF1aXJlZCBpZiB0aGUgZGVmaW5pdGlvbiBjb250YWlucyBmb3JtYWwgcGFyYW1ldGVycy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA1LjMuIE5ldyBTZXJ2ZXIgQ2FwYWJpbGl0aWVzCgogICAgNS4zLjEuIENyZWF0aW5nIGFuZCBSZW1vdmluZyBEaXJlY3RvcmllcwoKICAgVGhlIEMtS2VybWl0IDcuMCBzZXJ2ZXIgcmVzcG9uZHMgdG8gUkVNT1RFIE1LRElSIGFuZCBSRU1PVEUgUk1ESVIKICAgY29tbWFuZHMuIFRoZSBkaXJlY3RvcnkgbmFtZSBtYXkgYmUgaW4gZWl0aGVyIHRoZSBuYXRpdmUgZm9ybWF0IG9mIHRoZQogICBzZXJ2ZXIncyBjb21wdXRlciwgb3IgaW4gVU5JWCBmb3JtYXQuIEZvciBleGFtcGxlLCBhIHNlcnZlciBydW5uaW5nIG9uCiAgIFZNUyB3aXRoIGEgY3VycmVudCBkaXJlY3Rvcnkgb2YgW0lWQU5dIGNhbiBhY2NlcHQgY29tbWFuZHMgZnJvbSB0aGUKICAgY2xpZW50IGxpa2U6CgogIHJlbW90ZSBta2RpciBvbGdhICAgICAgICAgOyBNYWtlcyBbSVZBTi5PTEdBXSAobm9uc3BlY2lmaWMgZm9ybWF0KQogIHJlbW90ZSBta2RpciAub2xnYSAgICAgICAgOyBNYWtlcyBbSVZBTi5PTEdBXSAoVk1TIGZvcm1hdCB3aXRob3V0IGJyYWNrZXRzKQogIHJlbW90ZSBta2RpciBvbGdhLyAgICAgICAgOyBNYWtlcyBbSVZBTi5PTEdBXSAoVU5JWCByZWxhdGl2ZSBmb3JtYXQpCiAgcmVtb3RlIG1rZGlyIC9pdmFuL29sZ2EgICA7IE1ha2VzIFtJVkFOLk9MR0FdIChVTklYIGFic29sdXRlIGZvcm1hdCkKICByZW1vdGUgbWtkaXIgW2l2YW4ub2xnYV0gIDsgTWFrZXMgW0lWQU4uT0xHQV0gKFZNUyBhYnNvbHV0ZSBmb3JtYXQpCiAgcmVtb3RlIG1rZGlyIFsub2xnYV0gICAgICA7IE1ha2VzIFtJVkFOLk9MR0FdIChWTVMgcmVsYXRpdmUgZm9ybWF0KQoKICAgIDUuMy4xLjEuIENyZWF0aW5nIERpcmVjdG9yaWVzCgogICBJZiBhIGRpcmVjdG9yeSBuYW1lIGlzIGdpdmVuIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBzZWdtZW50IHRoYXQKICAgZG9lcyBub3QgZXhpc3QsIHRoZSBzZXJ2ZXIgYXR0ZW1wdHMgdG8gY3JlYXRlIGFsbCB0aGUgc2VnbWVudHMuIEZvcgogICBleGFtcGxlLCBpZiB0aGUgY2xpZW50IHNheXM6CgogIFJFTU9URSBNS0RJUiBsZXR0ZXJzL2FuZ3J5CgogICBhICJsZXR0ZXJzIiBzdWJkaXJlY3RvcnkgaXMgY3JlYXRlZCBpbiB0aGUgc2VydmVyJ3MgY3VycmVudCBkaXJlY3RvcnkKICAgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdCwgYW5kIHRoZW4gYW4gImFuZ3J5IiBzdWJkaXJlY3RvcnkgaXMKICAgY3JlYXRlZCBiZW5lYXRoIGl0LCBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgb25lLiBUaGlzIGNhbiByZXBlYXRlZAogICB0byBhbnkgcmVhc29uYWJsZSBkZXB0aDoKCiAgUkVNT1RFIE1LRElSIGEvYi9jL2QvZS9mL2cvaC9pL2ovay9sL20vbi9vL3AvcS9yL3MvdC91L3Yvdy96L3kvegoKICAgIDUuMy4xLjIuIFJlbW92aW5nIERpcmVjdG9yaWVzCgogICBXaGVuIGF0dGVtcHRpbmcgdG8gZXhlY3V0ZSBhIFJFTU9URSBSTURJUiwgdGhlIHNlcnZlciBjYW4gcmVtb3ZlIG9ubHkKICAgYSBzaW5nbGUgZGlyZWN0b3J5LCBub3QgYW4gZW50aXJlIHNlcXVlbmNlIG9yIHRyZWUuIFRoZSBzeXN0ZW0gc2VydmljZQogICB0aGF0IGlzIGNhbGxlZCB0byByZW1vdmUgdGhlIGRpcmVjdG9yeSBnZW5lcmFsbHkgcmVxdWlyZXMgbm90IG9ubHkKICAgdGhhdCB0aGUgc2VydmVyIHByb2Nlc3MgaGFzIHdyaXRlIGRlbGV0ZSBhY2Nlc3MsIGJ1dCBhbHNvIHRoYXQgdGhlCiAgIGRpcmVjdG9yeSBjb250YWluIG5vIGZpbGVzLgoKICAgSW4gdGhlIGZ1dHVyZSwgYSBSRU1PVEUgUk1ESVIgL1JFQ1VSU0lWRSBjb21tYW5kIChhbmQgdGhlIGFjY29tcGFueWluZwogICBwcm90b2NvbCkgbWlnaHQgYmUgYWRkZWQuIEZvciBub3csIHVzZSB0aGUgZXF1aXZhbGVudCBSRU1PVEUgSE9TVAogICBjb21tYW5kKHMpLCBpZiBhbnkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA1LjMuMi4gRGlyZWN0b3J5IExpc3RpbmdzCgogICBEaXJlY3RvcnkgbGlzdGluZ3MgYXJlIGdlbmVyYXRlZCBieSBDLUtlcm1pdCBpdHNlbGYsIHJhdGhlciB0aGFuIGJ5CiAgIHJ1bm5pbmcgdGhlIHVuZGVybHlpbmcgc3lzdGVtJ3MgZGlyZWN0b3J5IGNvbW1hbmQuIFNvbWUgY29udHJvbCBvdmVyCiAgIHRoZSBsaXN0aW5nIGZvcm1hdCBjYW4gYmUgb2J0YWluZWQgd2l0aCB0aGUgU0VUIE9QVElPTlMgRElSRUNUT1JZCiAgIGNvbW1hbmQgKFs1MzJdU2VjdGlvbiA0LjUuMSkuIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhZmZlY3QgbGlzdGluZ3MKICAgc2VudCBieSB0aGUgc2VydmVyOiAvW05PXUhFQURJTkcsIC9bTk9dRE9URklMRVMsIGFuZCAvW05PXUJBQ0tVUC4gSW4KICAgVU5JWCBhbmQgVk1TLCB0aGUgbGlzdGluZyBpcyBhbHdheXMgc29ydGVkIGJ5IGZpbGVuYW1lLiBUaGVyZSBpcywgYXQKICAgcHJlc2VudCwgbm8gcHJvdG9jb2wgZGVmaW5lZCBmb3IgdGhlIGNsaWVudCB0byByZXF1ZXN0IGxpc3Rpbmcgb3B0aW9ucwogICBvZiB0aGUgc2VydmVyOyB0aGlzIG1pZ2h0IGJlIGFkZGVkIGluIHRoZSBmdXR1cmUuCgogICBUaGUgc2VydmVyJ3MgZGlyZWN0b3J5IGxpc3RpbmdzIGFyZSBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKCiAgIFByb3RlY3Rpb24gb3IgcGVybWlzc2lvbnM6CiAgICAgICAgICBJbiBVTklYIGFuZCBPUy05LCB0aGlzIGlzIGEgMTAtY2hhcmFjdGVyIGZpZWxkLCBsZWZ0IGFkanVzdGVkLgogICAgICAgICAgSW4gVk1TIGl0IGlzIGEgMjItY2hhcmFjdGVyIGZpZWxkLCBsZWZ0LWFkanVzdGVkLiBJbiBlYWNoIGNhc2UsCiAgICAgICAgICB0aGUgcHJvdGVjdGlvbiAvIHBlcm1pc3Npb24gY29kZXMgYXJlIHNob3duIGluIHRoZSBzZXJ2ZXIKICAgICAgICAgIHBsYXRmb3JtJ3MgbmF0aXZlIGZvcm1hdC4gSW4gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMsIHRoaXMKICAgICAgICAgIGZpZWxkIGlzIG5vdCBzaG93bi4KCiAgIFNpemUgaW4gYnl0ZXM6CiAgICAgICAgICBUaGlzIGlzIGFsd2F5cyBhIDEwLWNoYXJhY3RlciBmaWVsZC4gVGhlIGZpbGUncyBzaXplIGlzIHNob3duCiAgICAgICAgICBhcyBhIGRlY2ltYWwgbnVtYmVyLCByaWdodCBhZGp1c3RlZCBpbiB0aGUgZmllbGQuIElmIHRoZSBmaWxlCiAgICAgICAgICBpcyBhIGRpcmVjdG9yeSBhbmQgaXRzIHNpemUgY2FuIG5vdCBiZSBvYnRhaW5lZCwgdGhlIHNpemUgaXMKICAgICAgICAgIHNob3duIGFzICI8RElSPiIuIFR3byBibGFua3MgZm9sbG93IHRoaXMgZmllbGQuCgogICBEYXRlOgogICAgICAgICAgQWx3YXlzIGluIHl5eXktbW0tZGQgaGg6bW06c3MgbnVtZXJpYyBmb3JtYXQsIGFuZCB0aGVyZWZvcmUgMTkKICAgICAgICAgIGNoYXJhY3RlcnMgbG9uZy4gSWYgdGhlIGZpbGUncyBkYXRlL3RpbWUgY2FuJ3QgYmUgb2J0YWluZWQsCiAgICAgICAgICB6ZXJvcyAoMCkgYXJlIHNob3duIGZvciBhbGwgdGhlIGRpZ2l0cy4gVGhpcyBmaWVsZCBpcyBmb2xsb3dlZAogICAgICAgICAgYnkgdHdvIGJsYW5rcy4KCiAgIEZpbGVuYW1lOgogICAgICAgICAgVGhpcyBmaWVsZCBleHRlbmRzIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuIEZpbGVuYW1lcyBhcmUgc2hvd24KICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBzZXJ2ZXIncyBjdXJyZW50IGRpcmVjdG9yeS4gSW4gVU5JWCwgc3ltYm9saWMKICAgICAgICAgIGxpbmtzIGFyZSBzaG93biBhcyB0aGV5IGFyZSBpbiBhbiAibHMgLWwiIGxpc3RpbmcgYXMgImxpbmtuYW1lCiAgICAgICAgICAtPiBmaWxlbmFtZSIuCgogICBJbiBVTklYIGFuZCBWTVMsIGxpc3RpbmdzIGFyZSByZXR1cm5lZCBieSB0aGUgc2VydmVyIGluIGFscGhhYmV0aWNhbAogICBvcmRlciBvZiBmaWxlbmFtZS4gVGhlcmUgYXJlIHByZXNlbnRseSBubyBvdGhlciBzb3J0IG9yIHNlbGVjdGlvbgogICBvcHRpb25zLgoKICAgSG93ZXZlciwgc2luY2UgdGhlc2UgYXJlIGZpeGVkLWZpZWxkIGxpc3RpbmdzLCBhbGwgZmllbGRzIGNhbiBiZSB1c2VkCiAgIGFzIHNvcnQga2V5cyBieSBleHRlcm5hbCBzb3J0IHByb2dyYW1zLiBOb3RlLCBpbiBwYXJ0aWN1bGFyLCB0aGF0IHRoZQogICBmb3JtYXQgdXNlZCBmb3IgdGhlIGRhdGUgYWxsb3dzIGEgbm9ybWFsIGxleGljYWwgb24gdGhhdCBmaWVsZCB0bwogICBhY2hpZXZlIHRoZSBkYXRlIG9yZGVyaW5nLiBGb3IgZXhhbXBsZSwgbGV0J3MgYXNzdW1lIHdlIGhhdmUgYSBVTklYCiAgIGNsaWVudCBhbmQgYSBVTklYIHNlcnZlci4gSW4gdGhpcyBjYXNlLCB0aGUgc2VydmVyJ3MgbGlzdGluZyBoYXMgdGhlCiAgIGRhdGUgaW4gY29sdW1ucyAyMi00MCwgYW5kIHRodXMgY291bGQgYmUgc29ydGVkIGJ5IHRoZSBVTklYIHNvcnQKICAgcHJvZ3JhbSB1c2luZyAic29ydCArMC4yMiAtMC40MCIgb3IgaW4gcmV2ZXJzZSBvcmRlciBieSAic29ydCArMC4yMgogICAtMC40MHIiLgoKICAgU2luY2UgdGhlIFVOSVggY2xpZW50IGNhbiBwaXBlIHJlc3BvbnNlcyB0byBSRU1PVEUgY29tbWFuZHMgdGhyb3VnaAogICBmaWx0ZXJzLCBhbnkgZGVzaXJlZCBzb3J0aW5nIGNhbiBiZSBhY2NvbXBsaXNoZWQgdGhpcyB3YXksIGZvcgogICBleGFtcGxlOgoKQy1LZXJtaXQ+IHJlbW90ZSBkaXJlY3RvcnkgfCBzb3J0ICswLjIyIC0wLjQwCgogICBZb3UgY2FuIGFsc28gc29ydCBieSBzaXplOgoKICBDLUtlcm1pdD4gcmVtb3RlIGRpcmVjdG9yeSB8IHNvcnQgKzAuMTEgLTAuMTkKCiAgIFlvdSBjYW4gdXNlIHNvcnQgb3B0aW9ucyB0byBzZWxlY3QgcmV2ZXJzZSBvciBhc2NlbmRpbmcgb3JkZXIuICJtYW4KICAgc29ydCIgKGluIFVOSVgpIGZvciBtb3JlIGluZm9ybWF0aW9uLiBBbmQgb2YgY291cnNlLCB5b3UgY2FuIHBpcGUKICAgdGhlc2UgbGlzdGluZ3MgdGhyb3VnaCBhbnkgb3RoZXIgZmlsdGVyIG9mIHlvdXIgY2hvaWNlLCBzdWNoIGFzIGdyZXAKICAgdG8gc2tpcCB1bndhbnRlZCBsaW5lcy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA1LjQuIFN5bnRheCBmb3IgUmVtb3RlIEZpbGVuYW1lcyB3aXRoIEVtYmVkZGVkIFNwYWNlcwoKICAgQy1LZXJtaXQgYW5kIEs5NSwgd2hlbiBpbiBzZXJ2ZXIgbW9kZSwgYXNzdW1lIHRoYXQgYW55IHNwYWNlcyBpbiB0aGUKICAgZmlsZSBzcGVjaWZpY2F0aW9uIGluIGFuIGluY29taW5nIEdFVCBjb21tYW5kIGFyZSBmaWxlbmFtZSBzZXBhcmF0b3JzLgogICBUaHVzIGlmIHRoZSBjbGllbnQgZ2l2ZXMgYSBjb21tYW5kIGxpa2U6CgogIGdldCB7b29mYS50eHQgb29mYS5iaW59CgogICBvciwgZXF1aXZhbGVudGx5OgoKICBtZ2V0IG9vZmEudHh0IG9vZmEuYmluCgogICB0aGUgc2VydmVyIHRyaWVzIHRvIHNlbmQgdGhlIHR3byBmaWxlcywgb29mYS50eHQgYW5kIG9vZmEuYmluLiBCdXQKICAgd2hhdCBpZiB5b3Ugd2FudCB0aGUgc2VydmVyIHRvIHNlbmQgeW91IGEgZmlsZSBuYW1lZCwgc2F5OgoKICBEOlxIUCBPZmZpY2VKZXQgNTAwXEltYWdlc1xNeSBQcmV0dHkgUGljdHVyZSBEb3QgUENMCgogICBIb3cgZG9lcyB0aGUgc2VydmVyIGtub3cgdGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvbmUgZmlsZSBhbmQgbm90CiAgIHNldmVuPyBJbiB0aGlzIGNhc2UsIHlvdSBuZWVkIHRvIHRoZSBzZW5kIGZpbGUgbmFtZSB0byB0aGUgc2VydmVyCiAgIGVuY2xvc2VkIGluIGVpdGhlciBjdXJseSBicmFjZXM6CgogIHtEOlxIUCBPZmZpY2VKZXQgNTAwXEltYWdlc1xNeSBQcmV0dHkgUGljdHVyZSBEb3QgUENMfQoKICAgb3IgQVNDSUkgZG91YmxlcXVvdGVzOgoKICAiRDpcSFAgT2ZmaWNlSmV0IDUwMFxJbWFnZXNcTXkgUHJldHR5IFBpY3R1cmUgRG90IFBDTCIKCiAgIFRoZSBtZXRob2QgZm9yIGRvaW5nIHRoaXMgZGVwZW5kcyBvbiB5b3VyIGNsaWVudC4gSWYgeW91ciBjbGllbnQgaXMKICAgQy1LZXJtaXQgNy4wLCBhbnkgcmVjZW50IHZlcnNpb24gb2YgS2VybWl0IDk1LCBvciBNUy1ET1MgS2VybWl0IDMuMTYsCiAgIHRoZW4geW91IGhhdmUgdG8gZW5jbG9zZSB0aGUgbmFtZSBpbiBicmFjZXMganVzdCBzbyB0aGUgY2xpZW50IGNhbgogICBwYXJzZSBpdCwgc28gdG8gc2VuZCBicmFjZXMgb3IgZG91YmxlcXVvdGVzIHRvIHRoZSBzZXJ2ZXIsIHlvdSBtdXN0CiAgIHB1dCB0aGVtIGluc2lkZSB0aGUgZmlyc3QsIG91dHNpZGUgcGFpciBvZiBicmFjZXMuIEFuZCB5b3UgYWxzbyBuZWVkCiAgIHRvIGRvdWJsZSB0aGUgYmFja3NsYXNoZXMgdG8gcHJldmVudCB0aGVtIGZyb20gYmVpbmcgaW50ZXJwcmV0ZWQ6CgogIGdldCB7e0Q6XFxIUCBPZmZpY2VKZXQgNTAwXFxJbWFnZXNcXE15IFByZXR0eSBQaWN0dXJlIERvdCBQQ0x9fQogIGdldCB7IkQ6XFxIUCBPZmZpY2VKZXQgNTAwXFxJbWFnZXNcXE15IFByZXR0eSBQaWN0dXJlIERvdCBQQ0wifQoKICAgVG8gZ2V0IGFyb3VuZCB0aGUgcmVxdWlyZW1lbnQgdG8gZG91YmxlIGJhY2tzbGFzaGVzIGluIGxpdGVyYWwKICAgZmlsZW5hbWVzLCBvZiBjb3Vyc2UgeW91IGNhbiBhbHNvIHVzZToKCiAgc2V0IGNvbW1hbmQgcXVvdGluZyBvZmYKICBnZXQge3tEOlxIUCBPZmZpY2VKZXQgNTAwXEltYWdlc1xNeSBQcmV0dHkgUGljdHVyZSBEb3QgUENMfX0KICBnZXQgeyJEOlxIUCBPZmZpY2VKZXQgNTAwXEltYWdlc1xNeSBQcmV0dHkgUGljdHVyZSBEb3QgUENMIn0KICBzZXQgY29tbWFuZCBxdW90aW5nIG9uCgogICBJZiB5b3UgYXJlIGdpdmluZyBhICJrZXJtaXQiIGNvbW1hbmQgdG8gdGhlIFVOSVggc2hlbGwsIHlvdSBoYXZlIHRvCiAgIG9ic2VydmUgdGhlIHNoZWxsJ3MgcXVvdGluZyBydWxlcywgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAga2VybWl0IC1pZyAie0Q6XEhQIE9mZmljZUpldCA1MDBcSW1hZ2VzXE15IFByZXR0eSBQaWN0dXJlIERvdCBQQ0x9IgoKICAgSGVyZSwgdGhlIHF1b3RlcyBnbyBvbiB0aGUgb3V0c2lkZSBzbyBVTklYIHdpbGwgcGFzcyB0aGUgZW50aXJlCiAgIGZpbGVuYW1lLCBzcGFjZXMsIGJyYWNlcywgYW5kIGFsbCwgYXMgYSBzaW5nbGUgYXJndW1lbnQgdG8gS2VybWl0LCBhbmQKICAgdGhlIGJhY2tzbGFzaGVzIGFyZSBub3QgZG91YmxlZCBiZWNhdXNlIChhKSB0aGUgVU5JWCBzaGVsbCBpZ25vcmVzCiAgIHRoZW0gc2luY2UgdGhleSBhcmUgaW4gYSBxdW90ZWQgc3RyaW5nLCBhbmQgKGIpIEtlcm1pdCBpZ25vcmVzIHRoZW0KICAgc2luY2UgdGhlIGludGVyYWN0aXZlIGNvbW1hbmQgcGFyc2VyIGlzIG5vdCBhY3RpdmF0ZWQgaW4gdGhpcyBjYXNlLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDUuNS4gQXV0b21hdGljIE9yaWVudGF0aW9uIE1lc3NhZ2VzIHVwb24gRGlyZWN0b3J5IENoYW5nZQoKICAgQy1LZXJtaXQgNy4wLCB3aGVuIGFjdGluZyBhcyBhIHNlcnZlciwgY2FuIHNlbmQgYW4gb3JpZW50YXRpb24gbWVzc2FnZQogICB0byB0aGUgY2xpZW50IHdoZW5ldmVyIHRoZSBzZXJ2ZXIgZGlyZWN0b3J5IGNoYW5nZXMuIEZvciBleGFtcGxlLCB3aGVuCiAgIHRoZSBjbGllbnQgZ2l2ZXMgYSBSRU1PVEUgQ0QgY29tbWFuZCwgdGhlIHNlcnZlciBzZW5kcyB0aGUgY29udGVudHMgb2YKICAgdGhlIG5ldyBkaXJlY3RvcnkncyAiUmVhZCBNZSIgZmlsZSB0byB0aGUgY2xpZW50J3Mgc2NyZWVuLiBUaGUKICAgZm9sbG93aW5nIGNvbW1hbmRzIGdvdmVybiB0aGlzIGZlYXR1cmU6CgogICBTRVQgU0VSVkVSIENELU1FU1NBR0UgRklMRSBuYW1lCiAgICAgICAgICBHaXZlbiB0byB0aGUgc2VydnIsIGFsbG93cyB0aGUgbWVzc2FnZS1maWxlIG5hbWUgdG8gYmUKICAgICAgICAgIHNwZWNpZmllZCBhdCBydW50aW1lLiBBIGxpc3Qgb2YgbmFtZXMgdG8gbG9vayBmb3IgY2FuIGJlIGdpdmVuCiAgICAgICAgICBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdDoKCiAge3tuYW1lMX17bmFtZTJ9e25hbWUzfXsuLi59fQoKICAgICAgICAgIGUuZy4gU0VUIFNFUlZFUiBDRC1NRVNTQUdFIEZJTEUKICAgICAgICAgIHt7Li8ucmVhZG1lfXtSRUFETUUuVFhUfXtSRUFELk1FfX0KCiAgIFJFTU9URSBTRVQgU0VSVkVSIENELU1FU1NBR0UgeyBPTiwgT0ZGIH0KICAgICAgICAgIEdpdmVuIHRvIHRoZSBjbGllbnQsIGxldHMgdGhlIGNsaWVudCBjb250cm9sIHdoZXRoZXIgdGhlIHNlcnZlcgogICAgICAgICAgc2VuZHMgYXV0b21hdGljIENEIG1lc3NhZ2VzLgoKICAgU0hPVyBTRVJWRVIKICAgICAgICAgIEdpdmVuIHRvIHNlcnZlciwgaW5jbHVkZXMgQ0QtTWVzc2FnZSBzdGF0dXMuCgogICBUaGUgZGVmYXVsdCBDRCBtZXNzYWdlIGZpbGUgbmFtZSBpcyBzeXN0ZW0gZGVwZW5kZW50LiBTSE9XIENEIG9yIFNIT1cKICAgU0VSVkVSIGRpc3BsYXlzIHRoZSBsaXN0LiBBbHNvIHNlZSBbNTMzXVNlY3Rpb24gNC41LjIuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNS42LiBOZXcgU2VydmVyIENvbnRyb2xzCgogICBESVNBQkxFIEVOQUJMRQogICAgICAgICAgQWxsb3dzIHRoZSBzZXJ2ZXIgdG8gY29uZmlndXJlZCBzdWNoIHRoYXQgRElTQUJMRWQgZmVhdHVyZXMgY2FuCiAgICAgICAgICBub3QgYmUgcmUtZW5hYmxlZCBieSBhbnkgbWVhbnMgLS0gZS5nLiBpZiB0aGUgY2xpZW50IGlzIHNvbWVob3cKICAgICAgICAgIGFibGUgdG8gZ2V0IHRoZSBzZXJ2ZXIgaW50byBjb21tYW5kIG1vZGUuIE9uY2UgRElTQUJMRWQsIEVOQUJMRQogICAgICAgICAgY2FuIG5vdCBiZSByZS1FTkFCTEVkLgoKICAgU0VUIFNFUlZFUiBJRExFLVRJTUVPVVQgc2Vjb25kcwogICAgICAgICAgVGhpcyB3YXMgYXZhaWxhYmxlIHByZXZpb3VzbHkgaW4gS2VybWl0IDk1IG9ubHkuIE5vdyBpdCBjYW4gYmUKICAgICAgICAgIHVzZWQgaW4gQy1LZXJtaXQgYWxzbyB0byBzcGVjaWZ5IGEgbWF4aW11bSBudW1iZXIgb2Ygc2Vjb25kcwogICAgICAgICAgdGhlIHNlcnZlciBpcyBhbGxvd2VkIHRvIGJlIGlkbGUgYmVmb3JlIGV4aXRpbmcgc2VydmVyIG1vZGUuIDAKICAgICAgICAgIHNlY29uZHMgbWVhbnMgbm8gaWRsZSB0aW1lb3V0LiBJbiBDLUtlcm1pdCAoYnV0IG5vdCBLLTk1KSwgU0VUCiAgICAgICAgICBTRVJWRVIgVElNRU9VVCBhbmQgU0VUIFNFUlZFUiBJRExFLVRJTUVPVVQgYXJlIG11dHVhbGx5CiAgICAgICAgICBleGNsdXNpdmUgLS0geW91IGNhbiBoYXZlIG9uZSBvciB0aGUgb3RoZXIgKG9yIG5laXRoZXIpLCBidXQKICAgICAgICAgIG5vdCBib3RoLiAoU2VydmVyIHRpbWVvdXRzIGFyZSBmb3IgdGhlIGJlbmVmaXQgb2YgcHJpbWl0aXZlCiAgICAgICAgICBLZXJtaXQgY2xpZW50cyB0aGF0IGFyZSBub3QgY2FwYWJsZSBvZiB0aW1pbmcgb3V0IG9uIHRoZWlyIG93bjsKICAgICAgICAgIHRvIG91ciBrbm93bGVkZ2UsIG5vIHN1Y2ggY2xpZW50cyBhcmUgc3RpbGwgaW4gY2lyY3VsYXRpb24uKQoKICAgU0VUIFNFUlZFUiBLRUVQQUxJVkUgeyBPTiwgT0ZGIH0KICAgICAgICAgIChTZWUgbmV4dCBzZWN0aW9uKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA1LjcuIFRpbWVvdXRzIGR1cmluZyBSRU1PVEUgSE9TVCBDb21tYW5kIEV4ZWN1dGlvbgoKICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCB0aGUgQy1LZXJtaXQgc2VydmVyIHdvdWxkIGJsb2NrIHdhaXRpbmcgZm9yCiAgIG91dHB1dCBmcm9tIGEgc3lzdGVtIGNvbW1hbmQgaW52b2tlZCB2aWEgUkVNT1RFIEhPU1QgZnJvbSB0aGUgY2xpZW50LgogICBJZiB0aGUgc3lzdGVtIGNvbW1hbmQgdG9vayBhIGxvbmcgdGltZSB0byBleGVjdXRlLCB0aGUgY2xpZW50IHdvdWxkCiAgIHRpbWUgb3V0IGFuZCBzZW5kIE5BSyBwYWNrZXRzLiBJZiB0aGUgY29tbWFuZCB0b29rIHRvbyBsb25nLCB0aGUKICAgY2xpZW50IHdvdWxkIHJlYWNoIGl0cyByZXRyeSBsaW1pdCBhbmQgZ2l2ZSB1cC4gRXZlbiBpZiBpdCBkaWRuJ3QsIHRoZQogICBOQUtzIHdvdWxkIGNhdXNlIHVubmVjZXNzYXJ5IHJldHJhbnNtaXNzaW9ucy4KCiAgIEluIHZlcnNpb24gNy4wLCB0aGUgQy1LZXJtaXQgc2VydmVyIChWTVMgYW5kIHNlbGVjdCgpLWNhcGFibGUgVU5JWAogICB2ZXJzaW9ucyBvbmx5KSwgc2VuZHMgImtlZXBhbGl2ZSBwYWNrZXRzIiAoZW1wdHkgZGF0YSBwYWNrZXRzKSBvbmNlCiAgIHBlciBzZWNvbmQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHN5c3RlbSBjb21tYW5kIHRvIGNvbXBsZXRlLiBUaGlzCiAgIHByb2NlZHVyZSBzaG91bGQgYmUgZW50aXJlbHkgdHJhbnNwYXJlbnQgdG8gdGhlIEtlcm1pdCBjbGllbnQsIGFuZAogICBzaG91bGQgcHJldmVudCB0aGUgdW53YW50ZWQgdGltZW91dHMgYW5kIE5BS3MuIFdoZW4gQy1LZXJtaXQgNy4wCiAgIGl0c2VsZiAob3IgSzk1IDEuMS4xOSkgaXMgdGhlIGNsaWVudCwgaXQgcHJpbnRzIGRvdHMgdG8gc2hvdyB0aGUKICAga2VlcGFsaXZlIHBhY2tldHMuCgogICBUaGUga2VlcGFsaXZlIGZlYXR1cmUgY2FuIGJlIHR1cm5lZCBvZmYgYW5kIG9uIHdpdGg6CgogIFNFVCBTRVJWRVIgS0VFUEFMSVZFIHsgT04sIE9GRiB9CgogICBOb3JtYWxseSBpdCBzaG91bGQgYmUgb24uIFR1cm4gaXQgb2ZmIGl0IGlmIGNhdXNlcyB0cm91YmxlIHdpdGggdGhlCiAgIGNsaWVudCwgb3IgaWYgaXQgc2VlbXMgdG8gc2xvdyBkb3duIHRoZSBzZXJ2ZXIgKGFzIGl0IG1pZ2h0IG9uIHNvbWUKICAgcGxhdGZvcm1zIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcykuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNi4gSU5URVJOQVRJT05BTCBDSEFSQUNURVIgU0VUUwoKICAgU3VwcG9ydCBmb3Igc2V2ZXJhbCBuZXcgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyIHNldHMgd2FzIGFkZGVkIGluCiAgIEMtS2VybWl0IDcuMC4gVW5pY29kZSAvIElTTyAxMDY0NiBpcyBub3QgeWV0IHN1cHBvcnRlZCwgYnV0IGlzIGEgaGlnaAogICBwcmlvcml0eSBmb3IgZm9ydGhjb21pbmcgcmVsZWFzZXMuCgogIDYuMC4gSVNPIDg4NTktMTUgTGF0aW4gQWxwaGFiZXQgOQoKICAgVG8gYWNjb21tb2RhdGUgdGhlIEV1cm8gY3VycmVuY3kgc3ltYm9sLCBhbmQgdG8gY29ycmVjdCBzZXZlcmFsIG90aGVyCiAgIGxvbmdzdGFuZGluZyBwcm9ibGVtcyB3aXRoIElTTyBMYXRpbiBBbHBoYWJldCAxLCBJU08gODg1OS0xNSBMYXRpbgogICBBbHBoYWJldCA5IHdhcyBpc3N1ZWQgaW4gTWF5IDE5OTguIEl0IGlzIHN1cHBvcnRlZCBieSBDLUtlcm1pdCA3LjAgYXMKICAgYSB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0LCBhIGZpbGUgY2hhcmFjdGVyIHNldCwgYW5kIGEgdGVybWluYWwKICAgY2hhcmFjdGVyIHNldC4gVHJhbnNsYXRpb25zIHRoYXQgcHJlc2VydmUgdGhlIG5ldyBjaGFyYWN0ZXJzIGFyZQogICBhdmFpbGFibGUgYmV0d2VlbiBMYXRpbi05IGFuZCBzZXZlcmFsIG90aGVyIHNldHMgaW5jbHVkaW5nOgoKICBQQyBDb2RlIFBhZ2UgODU4ICAgICAgICAgKFdlc3Rlcm4gRXVyb3BlYW4gbGFuZ3VhZ2VzLCBzaW1pbGFyIHRvIENQODUwKQogIFdpbmRvd3MgQ29kZSBQYWdlIDEyNTIgICAoV2VzdGVybiBFdXJvcGVhbiBsYW5ndWFnZXMsIHNpbWlsYXIgdG8gTGF0aW4tMSkKICBXaW5kb3dzIENvZGUgUGFnZSAxMjUwICAgKEVhc3Rlcm4gRXVyb3BlYW4gbGFuZ3VhZ2VzLCBzaW1pbGFyIHRvIExhdGluLTIpCgogICBUaGUgTGF0aW4tOSB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0IGFsc28gYWxsb3dzIGZvciB0aGUgT0UgZGlncmFwaAogICBjaGFyYWN0ZXIsIHVzZWQgcHJpbWFyaWx5IGluIEZyZW5jaCwgdG8gYmUgcHJlc2VydmVkIGluIHRyYW5zZmVycwogICBpbnZvbHZpbmcgdGhlIERFQyBNQ1Mgb3IgTmVYVCBjaGFyYWN0ZXIgc2V0cy4KCiAgIFRoZSBFdXJvIGNoYXJhY3RlciBpcyBhbHNvIHByZXNlbnQgaW4gdGhlIFVuaXZlcnNhbCBDaGFyYWN0ZXIgU2V0LAogICBkZXNjcmliZWQgaW4gWzUzNF1TZWN0aW9uIDYuNi4KCiAgNi4xLiBUaGUgSFAtUm9tYW44IENoYXJhY3RlciBTZXQKCiAgIFRoZSBIUC1Sb21hbjggY2hhcmFjdGVyIHNldCBpcyBzdXBwb3J0ZWQgaW4gQy1LZXJtaXQgNi4wIGFuZCBsYXRlciBidXQKICAgd2FzIG9taXR0ZWQgZnJvbSBUYWJsZSBWSUktNCBpbiB0aGUgMm5kIEVkaXRpb24gb2YgVXNpbmcgQy1LZXJtaXQgZHVlCiAgIHRvIGxhY2sgb2Ygc3BhY2UuIEl0IGlzIGxpc3RlZCBpbiBbNTM1XUFwcGVuZGl4IElJSS4KCiAgNi4yLiBHcmVlayBDaGFyYWN0ZXIgU2V0cwoKICAgR3JlZWsgY2hhcmFjdGVyIHNldHMgd2VyZSBhZGRlZCBpbiA2LjE6CgogIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgeyBDUDg2OSwgRUxPVDkyNywgR1JFRUstSVNPIH0KICBTRVQgVFJBTlNGRVIgQ0hBUkFDVEVSLVNFVCB7IEdSRUVLLUlTTyB9CgogICBHUkVFSy1JU08gaXMgSVNPIDg4NTktNywgd2hpY2ggdGhlIHNhbWUgYXMgRUxPVCA5MjguCgogICBUaGUgbmV3IEdyZWVrIGNoYXJhY3RlciBzZXRzIGFyZSBsaXN0ZWQgaW4gWzUzNl1BcHBlbmRpeCBJSUkuCgogIDYuMy4gQWRkaXRpb25hbCBMYXRpbi0yIENoYXJhY3RlciBTZXRzCgogICBUaGUgZm9sbG93aW5nIGhhdmUgYmVlbiBhZGRlZCBhcyBGSUxFIGFuZCBURVJNSU5BTCBDSEFSQUNURVItU0VUczoKCiAgIE1BWk9WSUEtUEMKICAgICAgICAgIEEgUEMgY29kZSBwYWdlIHVzZWQgaW4gUG9sYW5kLCBlcXVpdmFsZW50IHRvIENQNDM3LCBidXQgd2l0aCAxOAogICAgICAgICAgc3Vic3RpdHV0aW9ucyBuZWVkZWQgZm9yIFBvbGlzaC4KCiAgIENQMTI1MAogICAgICAgICAgVGhlIFdpbmRvd3MgTGF0aW4gMiBDb2RlIFBhZ2UuIEVxdWl2YWxlbnQgdG8gSVNPIDg4NTktMiwgYnV0CiAgICAgICAgICB3aXRoIGRpZmZlcmVudCBlbmNvZGluZy4KCiAgNi40LiBBZGRpdGlvbmFsIEN5cmlsbGljIENoYXJhY3RlciBTZXRzCgogICBUaGUgZm9sbG93aW5nIGhhdmUgYmVlbiBhZGRlZCBhcyBGSUxFIGFuZCBURVJNSU5BTCBDSEFSQUNURVItU0VUczoKCiAgIEJVTEdBUklBLVBDCiAgICAgICAgICBUaGlzIGlzIHRoZSBDeXJpbGxpYyBQQyBjb2RlIHBhZ2UgdXNlZCBpbiBCdWxnYXJpYSwgd2hlcmUgaXQgaXMKICAgICAgICAgIGNhbGxlZCBDb2RlIFBhZ2UgODU2LiBJdCBpcyBhdHRyaWJ1dGVkIHRvIGEgY29tcGFueSBjYWxsZWQKICAgICAgICAgIERBVEVDLCBJbmMsIGJ1dCBDUDg1NiBpcyBub3QgYSBwcm9wZXIgZGVzaWduYXRpb24sIHNpbmNlIGl0CiAgICAgICAgICByZWZlcnMgdG8gYSBIZWJyZXcgQ29kZSBQYWdlIChzZWUgdGhlIElCTSBSZWdpc3RyeSkuCgogICBDUDg1NQogICAgICAgICAgVGhpcyBQQyBDb2RlIFBhZ2UgY29udGFpbnMgYWxsIHRoZSBDeXJpbGxpYyBsZXR0ZXJzIHRoYXQgYXJlCiAgICAgICAgICBhbHNvIGluIElTTyA4ODU5LTUsIGFuZCBpcyB0aGVyZWZvcmUgdXNlZnVsIGZvciBub24tUnVzc2lhbgogICAgICAgICAgQ3lyaWxsaWMgdGV4dCAoVWtyYWluaWFuLCBCZWxvcnVzc2lhbiwgZXRjKSwgdW5saWtlIENQODY2LAogICAgICAgICAgd2hpY2ggaGFzIGEgc21hbGxlciByZXBlcnRvaXJlIG9mIEN5cmlsbGljIGxldHRlcnMuCgogICBDUDEyNTEKICAgICAgICAgIFRoZSBXaW5kb3dzIEN5cmlsbGljIENvZGUgUGFnZS4gRXF1aXZhbGVudCB0byBDUDg1NSwgYnV0IHdpdGgKICAgICAgICAgIGRpZmZlcmVudCBlbmNvZGluZy4KCiAgIEtPSThSCiAgICAgICAgICBBbiBleHRlbnNpb24gdG8gIk9sZCBLT0ktOCIgdGhhdCBhZGRzIHVwcGVyIGFuZCBsb3dlciBjYXNlCiAgICAgICAgICBDeXJpbGxpYyBsZXR0ZXIgSW8gKGxvb2tzIGxpa2UgUm9tYW4gRSB3aXRoIGRpYWVyZXNpcykgcGx1cyBhCiAgICAgICAgICBzZWxlY3Rpb24gb2YgYm94LWRyYXdpbmcgY2hhcmFjdGVycyB0byBjb2x1bW5zIDggdGhyb3VnaCAxMSwKICAgICAgICAgIHdoaWNoIGFyZSB2YWNhbnQgaW4gb3JpZ2luYWwgT2xkIEtPSS04LiBLT0k4LVIgaXMgdXNlZCBmb3IgdGhlCiAgICAgICAgICBSdXNzaWFuIGxhbmd1YWdlLiBJdCBpcyBzcGVjaWZpZWQgaW4gWzUzN11SRkMgMTQ4OS4KCiAgIEtPSThVCiAgICAgICAgICBBIHNpbWlsYXIgZXh0ZW5zaW9uIG9mIE9sZCBLT0ktOCwgYnV0IGZvciBVa3JhaW5pYW4uIEl0IGlzCiAgICAgICAgICBzcGVjaWZpZWQgaW4gWzUzOF1SRkMgMjMxOS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA2LjUuIEF1dG9tYXRpYyBDaGFyYWN0ZXItU2V0IFN3aXRjaGluZwoKICAgUHJpb3IgdG8gdmVyc2lvbiA3LjAsIEMtS2VybWl0J3MgZmlsZSBjaGFyYWN0ZXItc2V0IGFsd2F5cyBoYWQgdG8gYmUKICAgc2V0IGV4cGxpY2l0bHkuIEluIDcuMCBhbmQgbGF0ZXIsIGl0IGlzIHNldCBhdXRvbWF0aWNhbGx5IHdoZW46CgogICAgMS4gVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgKGFzIGl0IGlzIHVubGVzcyB5b3UgZGlzYWJsZSBpdCkuCiAgICAyLiBBbiBpbmNvbWluZyB0ZXh0LW1vZGUgdHJhbnNmZXIgaW5jbHVkZXMgYSB0cmFuc2Zlci1jaGFyYWN0ZXItc2V0CiAgICAgICBhbm5vdW5jZXIgYW5kIHlvdSBoYXZlIG5vdCBwcmV2aW91c2x5IGdpdmVuIGEgU0VUIEZJTEUKICAgICAgIENIQVJBQ1RFUi1TRVQgY29tbWFuZC4gSW4gdGhpcyBjYXNlLCBDLUtlcm1pdCBzd2l0Y2hlcyB0byBhbgogICAgICAgYXBwcm9wcmlhdGUgZmlsZSBjaGFyYWN0ZXIgc2V0LiBGb3IgZXhhbXBsZSwgb24gYW4gSFAtVVgKICAgICAgIHdvcmtzdGF0aW9uLCBhbiBpbmNvbWluZyBMYXRpbi0xIGZpbGUgYXV0b21hdGljYWxseSBzZWxlY3RzCiAgICAgICBIUC1Sb21hbjggZm9yIHRoZSBsb2NhbCBjb3B5IG9mIHRoZSBmaWxlOyBpbiBEYXRhIEdlbmVyYWwgQU9TL1ZTLAogICAgICAgaXQgd291bGQgc2VsZWN0IERHIEludGVybmF0aW9uYWwuCiAgICAzLiBZb3UgZ2l2ZSBhIFNFVCBUUkFOU0ZFUiBDSEFSQUNURVItU0VUIGNvbW1hbmQgd2l0aG91dCBoYXZpbmcKICAgICAgIHByZXZpb3VzbHkgc3BlY2lmaWVkIGEgRklMRSBDSEFSQUNURVItU0VULiBBbiBhcHByb3ByaWF0ZSBmaWxlCiAgICAgICBjaGFyYWN0ZXItc2V0IGlzIGNob3NlbiBhdXRvbWF0aWNhbGx5LgoKICAgSW4gYWRkaXRpb24sIHdoZW4geW91IGdpdmUgYSBTRVQgRklMRSBDSEFSQUNURVItU0VUIGNvbW1hbmQsIHRoZQogICBhcHByb3ByaWF0ZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IGlzIGF1dG9tYXRpY2FsbHkgY2hvc2VuLCB0byBiZSB1c2VkCiAgIHdoZW4geW91IGFyZSBzZW5kaW5nIGZpbGVzIChidXQgdGhpcyBkb2VzIG5vdCBvdmVycmlkZSB0aGUgb25lCiAgIGFubm91bmNlZCBieSB0aGUgc2VuZGVyIHdoZW4geW91IGFyZSByZWNlaXZpbmcgZmlsZXMpLgoKICAgWW91IG1pZ2h0IG5vdCBhZ3JlZSBhYm91dCB3aGF0IGlzICJhcHByb3ByaWF0ZSIsIHNvIG9mIGNvdXJzZSB5b3UgY2FuCiAgIGRpc2FibGUgb3IgY2hhbmdlIGFsbCBvZiB0aGUgYWJvdmUgYWN0aW9ucy4KCiAgIFlvdSBjYW4gZGlzYWJsZSAob3IgcmUtZW5hYmxlKSB0aGUgbmV3IGF1dG9tYXRpYyBjaGFyYWN0ZXItc2V0CiAgIHN3aXRjaGluZyBmZWF0dXJlIGluIGVhY2ggZGlyZWN0aW9uIHNlcGFyYXRlbHk6CgogICBTRVQgUkVDRUlWRSBDSEFSQUNURVItU0VULVNFTEVDVElPTiB7IEFVVE9NQVRJQywgTUFOVUFMIH0KICAgICAgICAgIEFVVE9NQVRJQyBpcyB0aGUgZGVmYXVsdCwgY2F1c2luZyB0aGUgYmVoYXZpb3IgZGVzY3JpYmVkIGFib3ZlCiAgICAgICAgICB3aGVuIGFuIGluY29taW5nIGZpbGUgYXJyaXZlcy4gQ2hvb3NlIE1BTlVBTCB0byBkZWZlYXQgdGhpcwogICAgICAgICAgYmVoYXZpb3IgYW5kIGZvcmNlIHlvdXIgY3VycmVudCBGSUxFIENIQVJBQ1RFUi1TRVQgc2V0dGluZyB0bwogICAgICAgICAgYmUgdXNlZCwgbm8gbWF0dGVyIHdoYXQgaXQgaXMuIE5vdGUgdGhhdCBTRVQgUkVDRUlWRQogICAgICAgICAgQ0hBUkFDVEVSLVNFVCBNQU5VQUwgZG9lcyBub3QgZGlzYWJsZSByZWNvZ25pdGlvbiBvZiB0aGUKICAgICAgICAgIGluY29taW5nIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgYW5ub3VuY2VyLCBhbmQgdHJhbnNsYXRpb24gZnJvbQogICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgY2hhcmFjdGVyLXNldCB0byB5b3VyIGN1cnJlbnQgZmlsZQogICAgICAgICAgY2hhcmFjdGVyLXNldC4gVG8gZGlzYWJsZSB0aGF0LCB1c2UgU0VUIEFUVFJJQlVURSBDSEFSQUNURVItU0VUCiAgICAgICAgICBPRkYuCgogICBTRVQgU0VORCBDSEFSQUNURVItU0VULVNFTEVDVElPTiB7IEFVVE9NQVRJQywgTUFOVUFMIH0KICAgICAgICAgIEFnYWluIEFVVE9NQVRJQyBpcyB0aGUgZGVmYXVsdCwgY2F1c2luZyB0aGUgYmVoYXZpb3IgZGVzY3JpYmVkCiAgICAgICAgICBhYm92ZSB3aGVuIHlvdSBnaXZlIGEgU0VUIHsgRklMRSwgVFJBTlNGRVIgfSBDSEFSQUNURVItU0VUCiAgICAgICAgICBjb21tYW5kLiBVc2UgTUFOVUFMIHRvIGFsbG93IHlvdSB0byBzcGVjaWZ5IHRoZSB0cmFuc2ZlciBhbmQKICAgICAgICAgIGZpbGUgY2hhcmFjdGVyLXNldHMgaW5kZXBlbmRlbnRseS4KCiAgIFNIT1cgQ0hBUkFDVEVSLVNFVFMKICAgICAgICAgIFRlbGxzIHNldHRpbmdzIG9mIHsgU0VORCwgUkVDRUlWRSB9IENIQVJBQ1RFUi1TRVQtU0VMRUNUSU9OLgoKICAgTm9ybWFsbHksIGhvd2V2ZXIsIGl0IGlzIG1vcmUgY29udmVuaWVudCB0byBsZWF2ZSBhdXRvbWF0aWMgc3dpdGNoaW5nCiAgIGFjdGl2ZSwgYW5kIGNoYW5nZSBhbnkgYXNzb2NpYXRpb25zIHRoYXQgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgeW91cgogICBhcHBsaWNhdGlvbiwgYXJlYSwgb3IgY291bnRyeS4gVGhlIGNvbW1hbmRzIGFyZToKCiAgIFNIT1cgQVNTT0NJQVRJT05TCiAgICAgICAgICBUaGlzIGNvbW1hbmQgbGlzdHMgYWxsIHRoZSBhc3NvY2lhdGlvbnMgaW4gZWFjaCBkaXJlY3Rpb246IGZvcgogICAgICAgICAgZWFjaCBwb3NzaWJsZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0LCBpdCBsaXN0cyB0aGUgYXNzb2NpYXRlZAogICAgICAgICAgZmlsZSBjaGFyYWN0ZXItc2V0LCBhbmQgdmljZSB2ZXJzYS4gVGhlc2UgYXJlIHR3byBzZXBhcmF0ZSBhbmQKICAgICAgICAgIGluZGVwZW5kZW50IGxpc3RzLgoKICAgQVNTT0NJQVRFIFRSQU5TRkVSLUNIQVJBQ1RFUi1TRVQgbmFtZTEgWyBuYW1lMiBdCiAgICAgICAgICBDaGFuZ2VzIHRoZSBhc3NvY2lhdGlvbiBmb3IgdGhlIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgbmFtZTEgdG8KICAgICAgICAgIGJlIHRoZSBmaWxlIGNoYXJhY3Rlci1zZXQgbmFtZTIuIElmIG5hbWUyIGlzIG9taXR0ZWQsIGF1dG9tYXRpYwogICAgICAgICAgc3dpdGNoaW5nIGlzIGRpc2FibGVkIGZvciB0aGlzIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgb25seS4KCiAgIEFTU09DSUFURSBGSUxFLUNIQVJBQ1RFUi1TRVQgbmFtZTEgWyBuYW1lMiBdCiAgICAgICAgICBDaGFuZ2VzIHRoZSBhc3NvY2lhdGlvbiBmb3IgdGhlIGZpbGUgY2hhcmFjdGVyLXNldCBuYW1lMSB0byBiZQogICAgICAgICAgdGhlIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgbmFtZTIuIElmIG5hbWUyIGlzIG9taXR0ZWQsCiAgICAgICAgICBhdXRvbWF0aWMgc3dpdGNoaW5nIGlzIGRpc2FibGVkIGZvciB0aGlzIGZpbGUgY2hhcmFjdGVyLXNldAogICAgICAgICAgb25seS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA2LjYuIFVOSUNPREUKCiAgIEMtS2VybWl0IDcuMCBhZGRzIHN1cHBvcnQgZm9yIFVuaWNvZGUsIHRoZSBVbml2ZXJzYWwgQ2hhcmFjdGVyIFNldCwKICAgZm9yOgoKICAgICAqIEZpbGUgVHJhbnNmZXIgKFNFTkQsIFJFQ0VJVkUsIEdFVCwgZXRjKQogICAgICogVGVybWluYWwgY29ubmVjdGlvbiAoQ09OTkVDVCkKICAgICAqIFVuZ3VhcmRlZCBmaWxlIGNhcHR1cmUgKExPRyBTRVNTSU9OKQogICAgICogVW5ndWFyZGVkIGZpbGUgdHJhbnNtaXNzaW9uIChUUkFOU01JVCkKICAgICAqIExvY2FsIGZpbGUgY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uIChUUkFOU0xBVEUpCgogICBDLUtlcm1pdCBpcyBub3QsIGhvd2V2ZXIsIGEgIlVuaWNvZGUgYXBwbGljYXRpb24iIGluIHRoZSBzZW5zZSB0aGF0CiAgIGl0cyBjb21tYW5kcywgbWVzc2FnZXMsIG9yIHVzZXIgaW50ZXJmYWNlIGFyZSBVbmljb2RlLiBSYXRoZXIsIGl0IGlzCiAgICJVbmljb2RlIGF3YXJlIiBpbiBpdHMgYWJpbGl0eSB0byBoYW5kbGUgYW5kIGNvbnZlcnQgVW5pY29kZSB0ZXh0IGluCiAgIHRoZSBjb3Vyc2Ugb2YgZmlsZSB0cmFuc2ZlciBhbmQgdGVybWluYWwgY29ubmVjdGlvbiwgYW5kIHlvdSBjYW4gYWxzbwogICB1c2UgS2VybWl0IHRvIGNvbnZlcnQgbG9jYWwgZmlsZXMgYmV0d2VlbiBVbmljb2RlIGFuZCBvdGhlciBjaGFyYWN0ZXIKICAgc2V0cy4gVExBJ3M6CgogIEJNUCAtIEJhc2UgTXVsdGlsaW5ndWFsIFBsYW5lCiAgQk9NIC0gQnl0ZSBPcmRlciBNYXJrCiAgQ0pLIC0gQ2hpbmVzZSwgSmFwYW5lc2UsIGFuZCBLb3JlYW4KICBJU08gLSBJbnRlcm5hdGlvbmFsIFN0YW5kYXJkcyBPcmdhbml6YXRpb24KICBUTEEgLSBUaHJlZS1MZXR0ZXIgQWNyb255bQogIFVDUyAtIFVuaXZlcnNhbCBDaGFyYWN0ZXIgU2V0CiAgVVRGIC0gVUNTIFRyYW5zZm9ybWF0aW9uIEZvcm1hdAoKICAgVW5pY29kZSBhbmQgSVNPIDEwNjQ2IGFyZSB0aGUgY29vcmRpbmF0ZWQgYW5kIGNvbXBhdGlibGUgY29ycG9yYXRlIGFuZAogICBpbnRlcm5hdGlvbmFsIHN0YW5kYXJkcyBmb3IgdGhlIFVuaXZlcnNhbCBDaGFyYWN0ZXIgU2V0IChVQ1MpLiBVbmxpa2UKICAgc2luZ2xlLWJ5dGUgYW5kIGV2ZW4gbW9zdCBtdWx0aWJ5dGUgY2hhcmFjdGVyIHNldHMsIHRoZSBVQ1MgY2FuCiAgIHJlcHJlc2VudCBhbGwgY2hhcmFjdGVycyBpbiBldmVyeSBleGlzdGluZyB3cml0aW5nIHN5c3RlbS4gQSBmbGF0CiAgIHBsYWluLXRleHQgZmlsZSBlbmNvZGVkIGluIHNvbWUgZm9ybSBvZiBVQ1MgY2FuIGNvbnRhaW4gYW55IG1peHR1cmUgb2YKICAgRW5nbGlzaCwgU3BhbmlzaCwgSXRhbGlhbiwgR2VybWFuLCBIZWJyZXcsIEFyYWJpYywgR3JlZWssIFJ1c3NpYW4sCiAgIEFybWVuaWFuLCBHZW9yZ2lhbiwgSmFwYW5lc2UsIENoaW5lc2UsIEtvcmVhbiwgVmlldG5hbWVzZSwgVGliZXRhbiwKICAgSGluZGksIEJlbmdhbGksIFRhbWlsLCBUaGFpLCBFdGhpb3BpYywgYW5kIHNvIG9uLCBwbHVzIHNjaWVudGlmaWMgYW5kCiAgIG1hdGhlbWF0aWNhbCBub3RhdGlvbiwgYXMgd2VsbCBhcyB0ZXh0cyBpbiBSdW5lcywgT2doYW0sIEdsYWdvbGl0aWMsCiAgIGFuZCBvdGhlciBoaXN0b3JpYyBzY3JpcHRzLgoKICAgVGhlIFVDUyBhbHJlYWR5IGNvdmVycyB0aGVzZSBzY3JpcHRzIGFuZCBtYW55IG1vcmUsIGJ1dCBpdCdzIGFuCiAgIGV2b2x2aW5nIHN0YW5kYXJkIHdpdGggZWZmb3J0cyB1bmRlcndheSB0byBhY2NvbW1vZGF0ZSBldmVuIG1vcmUKICAgbGFuZ3VhZ2VzIGFuZCB3cml0aW5nIHN5c3RlbXMuIFN1cHBvcnQgaXMgZ3Jvd2luZyBmb3IgbmF0aXZlIFVDUyB1c2UKICAgb24gbWFueSBwbGF0Zm9ybXMgYW5kIGluIG1hbnkgYXBwbGljYXRpb25zLiBUaGUgZ29hbCBvZiB0aGUgZnJhbWVycyBvZgogICB0aGUgVUNTIGlzIGZvciBpdCB0byByZXBsYWNlIEFTQ0lJLCB0aGUgSVNPIExhdGluIEFscGhhYmV0cywgSVNDSUksCiAgIFZJU0NJSSwgdGhlIENoaW5lc2UsIEphcGFuZXNlLCBhbmQgS29yZWFuIChDSkspIG11bHRpYnl0ZSBzZXRzLCBldGMsCiAgIGFzIHdlbGwgYXMgdGhlIG1hbnkgcHJpdmF0ZSBjaGFyYWN0ZXIgc2V0cyBpbiB1c2UgdG9kYXksIGluIG90aGVyCiAgIHdvcmRzIHRvIGJlY29tZSAqdGhlKiBVbml2ZXJzYWwgQ2hhcmFjdGVyIFNldC4KCiAgIFVudGlsIHRoYXQgdGltZSwgaG93ZXZlciwgY29udmVyc2lvbnMgYmV0d2VlbiBleGlzdGluZyBzZXRzIGFuZCB0aGUKICAgVUNTIHdpbGwgYmUgbmVjZXNzYXJ5IHdoZW4gbW92aW5nIHRleHQgYmV0d2VlbiBwbGF0Zm9ybXMgYW5kCiAgIGFwcGxpY2F0aW9ucy4gTm93IEtlcm1pdCBjYW4gaGVscC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDYuNi4xLiBPdmVydmlldyBvZiBVbmljb2RlCgogICBGb3IgYSBtb3JlIGNvbXBsZXRlIHBpY3R1cmUsIHBsZWFzZSB2aXNpdDoKCiAgWzUzOV1odHRwOi8vd3d3LnVuaWNvZGUub3JnLwoKICAgYW5kIGFjY2VzcyB0aGUgdmFyaW91cyBvbmxpbmUgaW50cm9kdWN0aW9ucywgRkFRcywgdGVjaG5pY2FsIHJlcG9ydHMsCiAgIGFuZCBvdGhlciBpbmZvcm1hdGlvbi4gRm9yIGdyZWF0ZXIgZGVwdGgsIG9yZGVyIHRoZSBsYXRlc3QgdmVyc2lvbiBvZgogICB0aGUgcHVibGlzaGVkIFVuaWNvZGUgU3RhbmRhcmQuIFRoZSBmb2xsb3dpbmcgb3ZlcnZpZXcgY29udGFpbnMgYQogICBncmVhdCBtYW55IG92ZXJzaW1wbGlmaWNhdGlvbnMgYW5kIHBlcmhhcHMgYW4gb3BpbmlvbiBvciB0d28uCgogICBBdCBwcmVzZW50LCB0aGUgVUNTIGlzIGEgMTYtYml0ICgyLWJ5dGUpIGNoYXJhY3RlciBzZXQsIGJ1dCB3aXRoCiAgIHByb3Zpc2lvbnMgdG8gZ3JvdyB0byBhIDQtYnl0ZSBzZXQuIFVDUy0yIHJlZmVycyB0byB0aGUgdHdvLWJ5dGUgc2V0LAogICBhbHNvIGNhbGxlZCB0aGUgQmFzZSBNdWx0aWxpbmd1YWwgUGxhbmUgKEJNUCksIGluIHdoaWNoIGVhY2ggY2hhcmFjdGVyCiAgIGhhcyAxNiBiaXRzLCBhbmQgdGhlcmVmb3JlIHRoZXJlIGFyZSAyXjE2ID0gNjU1MzYgcG9zc2libGUgY2hhcmFjdGVycy4KICAgVGhlIGZpcnN0IDEyOCBjaGFyYWN0ZXJzIGFyZSB0aGUgc2FtZSBhcyBVUyBBU0NJSSAoQzAgY29udHJvbAogICBjaGFyYWN0ZXJzIGFuZCBERUwgaW5jbHVkZWQpLCB0aGUgbmV4dCAzMiBhcmUgdGhlIEMxIGNvbnRyb2wKICAgY2hhcmFjdGVycyBvZiBJU08gNjQyOSwgYW5kIHRoZSBuZXh0IDk2IGFyZSB0aGUgUmlnaHQgSGFsZiBvZiBJU08KICAgODg1OS0xIExhdGluIEFscGhhYmV0IDEuIFRoZSByZW1haW5pbmcgdGVucyBvZiB0aG91c2FuZHMgb2YgY2hhcmFjdGVycwogICBhcmUgYXJyYW5nZWQgbmV3bHkgZm9yIHRoZSBVQ1MsIHVzdWFsbHkgKGJ1dCBub3QgYWx3YXlzKSBpbiBzZWN0aW9ucwogICBjb3JyZXNwb25kaW5nIHRvIGV4aXN0aW5nIHN0YW5kYXJkcywgc3VjaCBhcyBJU08gTGF0aW4vQ3lyaWxsaWMsIG9mdGVuCiAgIHBsdXMgYWRkaXRpb25hbCBjaGFyYWN0ZXJzIG5vdCBhcHBlYXJpbmcgaW4gdGhlIGV4aXN0aW5nIHN0YW5kYXJkcyBkdWUKICAgdG8gbGFjayBvZiBzcGFjZSAob3Igb3RoZXIgcmVhc29ucykuCgogICBJU08gMTA2NDYgYWxsb3dzIGZvciBhZGRpdGlvbmFsIHBsYW5lcywgZS5nLiBmb3IgRWd5cHRpYW4KICAgaGllcm9nbHlwaGljcyBvciBhbmNpZW50IChvciBvdGhlciBlc290ZXJpYykgQ0pLIGNoYXJhY3RlcnMsIGJ1dCB0aGVzZQogICBwbGFuZXMgYXJlIG5vdCB5ZXQgZGVmaW5lZCBhbmQgc28gd2Ugd2lsbCBzYXkgbm90aGluZyBtb3JlIGFib3V0IHRoZW0KICAgaGVyZSwgZXhjZXB0IHRoYXQgdGhlaXIgdXNlIHdpbGwgcmVxdWlyZSB0aGUgNC1ieXRlIGZvcm0gb2YgVUNTLAogICBjYWxsZWQgVUNTLTQsIGluIHNvbWUgZm9ybSAobW9yZSBhYm91dCAiZm9ybXMiIGluIFs1NDBdU2VjdGlvbiA2LjYuMikuCgogICBVbmljb2RlIGFuZCBJU08gMTA2NDYgYXJlIGNvbnN0YW50bHkgdW5kZXIgcmV2aXNpb24sIG1haW5seSB0byBhZGQgbmV3CiAgIGNoYXJhY3RlcnMuIFRoZSBVbmljb2RlIHJldmlzaW9uIGlzIGRlbm90ZWQgYnkgYSB2ZXJzaW9uIG51bWJlciwgc3VjaAogICBhcyAxLjAsIDEuMSwgMi4wLCAzLjAuIFRoZSBJU08gMTA2NDYgc3RhbmRhcmQgcmV2aXNpb24gaXMgaWRlbnRpZmllZAogICBieSBFZGl0aW9uIChzdWNoIGFzIElTTyAxMDY0Ni0xIDE5OTMpLCBwbHVzIHJlZmVyZW5jZSB0byBhbnkKICAgYW1lbmRtZW50cy4gVGhlIGZpcnN0IHZlcnNpb25zIG9mIHRoZXNlIHN0YW5kYXJkcyBpbmNsdWRlZCBlbmNvZGluZ3MKICAgZm9yIEtvcmVhbiBIYW5ndWwgc3lsbGFibGVzIChKYW1vcyk7IHRoZXNlIGVuY29kaW5ncyB3ZXJlIGNoYW5nZWQgaW4KICAgdmVyc2lvbiAxLjEgb2YgVW5pY29kZSBhbmQgYnkgQW1lbmRtZW50IDUgdG8gSVNPIDEwNjQ2LTEuIFRoZSBVbmljb2RlCiAgIFRlY2huaWNhbCBDb21taXR0ZWUgYW5kIHRoZSBJU08gYWNrbm93bGVkZ2UgdGhhdCB0aGlzIHdhcyBhIGJhZCB0aGluZwogICB0byBkbywgYW5kIHByb21pc2UgbmV2ZXIgY2hhbmdlIGVuY29kaW5ncyBvciBjaGFyYWN0ZXIgbmFtZXMgYWdhaW4sCiAgIHNpbmNlIHRoaXMgcG9zZXMgc2VyaW91cyBwcm9ibGVtcyBmb3IgY29uZm9ybWFuY2UgYW5kIGRhdGEKICAgaW50ZXJjaGFuZ2UuCgogICBBIFVDUy0yIHZhbHVlIGlzIGN1c3RvbWFyaWx5IHdyaXR0ZW4gbGlrZSB0aGlzOgoKICBVK3h4eHgKCiAgIHdoZXJlICJ4eHh4IiByZXByZXNlbnRzIGZvdXIgaGV4YWRlY2ltYWwgZGlnaXRzLCAwLTkgYW5kIEEtRi4gRm9yCiAgIGV4YW1wbGUsIFUrMDA0MSBpcyAiQSIsIFUrMDBDMSBpcyBBLWFjdXRlLCBVKzA0MkYgaXMgdXBwZXJjYXNlCiAgIEN5cmlsbGljICJZYSIsIFUrRkI0RiBpcyBIZWJyZXcgTGlnYXR1cmUgQWxlZiBMYW1lZCwgYW5kIFUrRkZGRCBpcyB0aGUKICAgc3BlY2lhbCBjaGFyYWN0ZXIgdGhhdCBtZWFucyAibm90IGEgY2hhcmFjdGVyIi4KCiAgIE1vc3QgY2hhcmFjdGVycyBmcm9tIHdpZGVseS11c2VkIGFscGhhYmV0aWMgd3JpdGluZyBzeXN0ZW1zIHN1Y2ggYXMKICAgdGhlIFdlc3QgRXVyb3BlYW4gb25lcywgQ3lyaWxsaWMsIEdyZWVrLCBIZWJyZXcsIFZpZXRuYW1lc2UsIGV0YywgYXJlCiAgIGF2YWlsYWJsZSBpbiAicHJlY29tcG9zZWQiIGZvcm07IGZvciBleGFtcGxlIFVwcGVyY2FzZSBMYXRpbiBMZXR0ZXIgQQogICB3aXRoIEFjdXRlIEFjY2VudCBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIgKGFzIGl0IGlzIGluIExhdGluLTEpLgogICBIb3dldmVyLCB0aGUgVUNTIGFsc28gcGVybWl0cyBjb21wb3NpdGlvbiBvZiBhIGJhc2UgY2hhcmFjdGVyIHdpdGggb25lCiAgIG9yIG1vcmUgbm9uc3BhY2luZyBkaWFjcml0aWNzLiBUaGlzIG1lYW5zIHRoZSBzYW1lIGNoYXJhY3RlciBjYW4gYmUKICAgcmVwcmVzZW50ZWQgaW4gbW9yZSB0aGFuIG9uZSB3YXksIHdoaWNoIGNhbiBwcmVzZW50IHByb2JsZW1zIGluIG1hbnkKICAgYXBwbGljYXRpb24gYXJlYXMsIGluY2x1ZGluZyB0cmFuc2ZlciBhbmQgY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uIG9mCiAgIHRleHQuCgogICBDb252ZXJzaW9uIGZyb20gQVNDSUkgb3IgTGF0aW4tMSB0byBVQ1MtMiB0ZXh0IGlzICJ0cml2aWFsIjogc2ltcGx5CiAgIGluc2VydCBhIE5VTCAoMCkgYnl0ZSBiZWZvcmUgZWFjaCBBU0NJSSBvciBMYXRpbi0xIGJ5dGUuIENvbnZlcnRpbmcgaW4KICAgdGhlIHJldmVyc2UgZGlyZWN0aW9uIChwcm92aWRlZCB0aGUgVUNTLTIgZmlsZSBjb250YWlucyBvbmx5IFUrMDAwMCB0bwogICBVKzAwRkYpIGlzIGVxdWFsbHkgc2ltcGxlIChpZiB3ZSBpZ25vcmUgdGhlIGlzc3VlIG9mIGNvbXBvc2l0aW9uKToKICAgcmVtb3ZlIGV2ZXJ5IHNlY29uZCAoTlVMKSBieXRlLiBDb252ZXJzaW9uIG9mIG90aGVyIGNoYXJhY3RlciBzZXRzIHRvCiAgIGFuZCBmcm9tIFVDUywgaG93ZXZlciwgcmVxdWlyZXMgdGFibGVzIG9yIGFsZ29yaXRobXMgc3BlY2lmaWMgdG8gZWFjaAogICBzZXQuIE5ldmVydGhlbGVzcywgdGhlIHJlbGF0aXZlbHkgdHJhbnNwYXJlbnQgdXB3YXJkcyBjb21wYXRpYmlsaXR5CiAgIGZyb20gQVNDSUkgYW5kIExhdGluLTEsIGluIHdoaWNoIGEgdmVyeSBsYXJnZSBzaGFyZSBvZiB0aGUgd29ybGQncwogICB0ZXh0dWFsIGRhdGEgaXMgZW5jb2RlZCwgZ2l2ZXMgdGhlIFVDUyBhbiBlbnRyZWUgb250byBleGlzdGluZwogICBwbGF0Zm9ybXMuCgogICBCdXQgdGhlIDItYnl0ZSBmb3JtYXQgYW5kIHRoZSBwcmVwb25kZXJhbmNlIG9mIE5VTCBhbmQgb3RoZXIgY29udHJvbAogICBieXRlcyBpbiBVQ1MtMiB0ZXh0IHBvc2UgcHJvYmxlbXMgZm9yIGN1cnJlbnQgYXBwbGljYXRpb25zIGFuZAogICB0cmFuc21pc3Npb24gbWV0aG9kcy4gQW5kIHRvIG1ha2UgbWF0dGVycyB3b3JzZSwgZGlmZmVyZW50IGhhcmR3YXJlCiAgIHBsYXRmb3JtcyBzdG9yZSBVQ1MtMiBjaGFyYWN0ZXJzIGluIGRpZmZlcmVudCBieXRlIG9yZGVyLiBUaHVzIGEgVUNTLTIKICAgZmlsZSB0cmFuc2ZlcnJlZCBieSBGVFAgKG9yIGFjY2Vzc2VkIHZpYSBORlMsIGV0YykgYmV0d2VlbiB0d28KICAgY29tcHV0ZXJzIHdpdGggZGlmZmVyZW50IGFyY2hpdGVjdHVyZSBtaWdodCBoYXZlIGl0cyBieXRlcyBpbiB0aGUKICAgd3Jvbmcgb3JkZXIgKG9yIHdvcnNlOyBzZWUgWzU0MV1TZWN0aW9uIDYuNi41LjEgKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDYuNi4yLiBVQ1MgQnl0ZSBPcmRlcgoKICAgQ29uc2lkZXIgdGhlIG51bWJlciAxLiBJbiBhbiA4LWJpdCBieXRlLCB0aGlzIHdvdWxkIGJlIHJlcHJlc2VudGVkIGJ5CiAgIHRoZSBmb2xsb3dpbmcgc2VyaWVzIG9mIDAtIGFuZCAxLWJpdHM6CgogICstLS0tLS0tLS0tLS0tLS0tLSsKICB8IDAgMCAwIDAgMCAwIDAgMSB8CiAgKy0tLS0tLS0tLS0tLS0tLS0tKwoKICAgVGhlcmVmb3JlIGluIGEgMTYtYml0ICJ3b3JkIiB0aGUgcmVwcmVzZW50YXRpb24gbWlnaHQgYmU6CgogICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKICB8IDAgMCAwIDAgMCAwIDAgMCB8IDAgMCAwIDAgMCAwIDAgMSB8CiAgKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKwoKICAgTm93IGNvbnNpZGVyIHRoZSBudW1iZXIgMjU2LCB3aGljaCBpcyAyIHRvIHRoZSA4dGggcG93ZXIuIFRoZSBiaW5hcnkKICAgcmVwcmVzZW50YXRpb24gaXMgMTAwMDAwMDAwICgxIGZvbGxvd2VkIGJ5IDggemVyb3MpLiAyNTYgd291bGQgZ28gaW50bwogICBhIDE2LWJpdCB3b3JkIGxpa2UgdGhpczoKCiAgKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKwogIHwgMCAwIDAgMCAwIDAgMCAxIHwgMCAwIDAgMCAwIDAgMCAwIHwKICArLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCgogICBXaGVuIGEgY29tcHV0ZXIgd29ya3MgdGhpcyB3YXksIGl0IGlzIHNhaWQgdG8gYmUgQmlnIEVuZGlhbiwgbWVhbmluZwogICBpdCBwdXRzIHRoZSBtb3N0IHNpZ25pZmljYW50IChiaWdnZXN0KSBieXRlIGZpcnN0IChvbiB0aGUgImxlZnQiKSBpbiBhCiAgIDE2LWJpdCB3b3JkLCBhbmQgdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgc2Vjb25kIChvbiB0aGUgcmlnaHQpLgoKICAgSG93ZXZlciwgc29tZSBvdGhlciBjb21wdXRlcnMgaGF2ZSB0aGUgb3Bwb3NpdGUgYXJyYW5nZW1lbnQsIGNhbGxlZAogICBMaXR0bGUgRW5kaWFuLCBpbiB3aGljaCAxIGlzOgoKICArLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0rCiAgfCAwIDAgMCAwIDAgMCAwIDEgfCAwIDAgMCAwIDAgMCAwIDAgfAogICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKCiAgIGFuZCAyNTYgaXM6CgogICstLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLSsKICB8IDAgMCAwIDAgMCAwIDAgMCB8IDAgMCAwIDAgMCAwIDAgMSB8CiAgKy0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tKwoKICAgQ29tcHV0ZXJzIHN1Y2ggYXMgU3BhcmMsIE1JUFMsIFBBLVJJU0MsIGFuZCBQb3dlclBDIGFyZSBCaWcgRW5kaWFuLAogICB3aGVyZWFzIHRoZSBQQyBhbmQgdGhlIEFscGhhIGFyZSBMaXR0bGUgRW5kaWFuLiBFbmRpYW5uZXNzIGhhcyBuZXZlcgogICBiZWVuIGFuIGlzc3VlIHdpdGggNy0gb3IgOC1iaXQgY2hhcmFjdGVycywgYnV0IGl0IGlzIHdpdGggVUNTCiAgIGNoYXJhY3RlcnMuIEl0IGNhbiBiZSBhIHRyaWNreSBidXNpbmVzcyB0byBzaGFyZSBvciB0cmFuc2ZlciBhIFVDUy0yCiAgIGZpbGUgYmV0d2VlbiB0d28gZGlmZmVyZW50IGtpbmRzIG9mIGNvbXB1dGVycy4KCiAgIFRvIGFsbGV2aWF0ZSAoYnV0IG5vdCBlbnRpcmVseSBzb2x2ZSkgdGhlIHByb2JsZW0sIFVDUy0yIGZpbGVzIGFyZQogICBzdXBwb3NlZCB0byBiZWdpbiB3aXRoIHRoZSBVbmljb2RlIGNoYXJhY3RlciBVK0ZFRkYsIFplcm8tV2lkdGgKICAgTm8tQnJlYWsgU3BhY2UgKFpXTkJTKS4gVGhpcyBpcyBhIGtpbmQgb2YgIm5vLW9wIiAobm90ZTogYW55IHN1Y2gKICAgYXNzZXJ0aW9uIG11c3Qgbm9ybWFsbHkgYmUgcXVhbGlmaWVkIHdpdGggbWFueSAiYnV0IGlmcyIgYW5kICJleGNlcHRzIgogICB3aGljaCBhcmUgb21pdHRlZCBoZXJlIGluIHRoZSBpbnRlcmVzdCBvZiBicmV2aXR5KS4gSWYgdGhlIGJ5dGVzIGFyZQogICByZXZlcnNlZCB0aGUgWldOQlMgYmVjb21lcyBVK0ZGRkUsIHdoaWNoIGlzIG5vdCAoYW5kIG5ldmVyIHdpbGwgYmUpIGEKICAgZGVmaW5lZCBVQ1MgY2hhcmFjdGVyLiBVK0ZFRkYgYXQgdGhlIGJlZ2lubmluZyBvZiBhIFVDUyBmaWxlIGlzCiAgIHRoZXJlZm9yZSBjYWxsZWQgYSBCeXRlIE9yZGVyIE1hcmssIG9yIEJPTS4KCiAgIEFueSBhcHBsaWNhdGlvbiB0aGF0IGNyZWF0ZXMgYSBVQ1MtMiAob3IgVVRGLTE2LCBvciBVQ1MtNCkgZmlsZSBzaG91bGQKICAgaW5jbHVkZSBhIEJPTSwgYW5kIGFueSBhcHBsaWNhdGlvbiB0aGF0IHJlYWRzIG9uZSBzaG91bGQgdGVzdCBmb3IgYQogICBCT00sIGFuZCBpZiBvbmUgaXMgZm91bmQsIGluZmVyIHRoZSBieXRlIG9yZGVyIGZyb20gaXQuIFRoaXMgaXMgYQogICBjb252ZW50aW9uLCBob3dldmVyIC0tIG5vdCBhIHN0YW5kYXJkIG9yIGEgcmVxdWlyZW1lbnQgLS0gYW5kCiAgIGFwcGxpY2F0aW9ucyB2YXJ5IGluIHRoZWlyIGFiaWxpdHkgdG8gaGFuZGxlIEJPTXMgYW5kICJiYWNrd2FyZHMiCiAgIFVDUy0yIGZpbGVzLgoKICAgTm90ZSB0aGF0IGEgQk9NIGlzIHVzZWZ1bCBvbmx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBmaWxlLiBJZiB5b3UKICAgYXBwZW5kIG9uZSBVQ1MtMiBmaWxlIHRvIGFub3RoZXIsIGFuZCBib3RoIGhhdmUgQk9NcywgdGhlIGludGVybmFsIEJPTQogICBpcyBubyBsb25nZXIgYSBCT00uIEFuZCBpZiB0aGUgYnl0ZSBvcmRlcnMgb2YgdGhlIHR3byBmaWxlcyBkaWZmZXIsCiAgIHRoZW4gZWl0aGVyIHRoZSBmaXJzdCBwYXJ0IG9yIHRoZSBzZWNvbmQgd2lsbCBiZSBiYWNrd2FyZHMuIChWYXJpb3VzCiAgIG90aGVyIHVuZGVzaXJhYmxlIGVmZmVjdHMgbWlnaHQgYWxzbyBvY2N1ciwgbm90IGRpc2N1c3NlZCBoZXJlLikKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDYuNi4yLiBVQ1MgVHJhbnNmb3JtYXRpb24gRm9ybWF0cwoKICAgVUNTIHRleHR1YWwgZGF0YSBjYW4gYmUgbW9kaWZpZWQgaW4gdmFyaW91cyB3YXlzIGZvciB0cmFuc21pc3Npb24gb3IKICAgc3RvcmFnZS4gQW55IG9mZmljaWFsbHkgc2FuY3Rpb25lZCBtZXRob2Qgb2YgZG9pbmcgdGhpcyBpcyBjYWxsZWQgYQogICBVQ1MgVHJhbnNmb3JtYXRpb24gRm9ybWF0LCBvciBVVEYuIE9uZSBzdWNoIG1ldGhvZCwgY2FsbGVkIFVURi0xNiwgaXMKICAgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHdpdGggVUNTLTIgZXhjZXB0IHRoYXQgaXQgZGVzaWduYXRlcyBjZXJ0YWluCiAgIGNvZGUgdmFsdWVzIGFzICJlc2NhcGUgc2VxdWVuY2VzIiAoY2FsbGVkIHN1cnJvZ2F0ZSBwYWlycykgdG8gYWNjZXNzCiAgIGNoYXJhY3RlcnMgaW4gb3RoZXIgcGxhbmVzIHdpdGhvdXQgaGF2aW5nIHRvIHVzZSBmdWxsIFVDUy00LiBXZSB3b24ndAogICBkaXNjdXNzIFVURi0xNiBmdXJ0aGVyIGhlcmUsIHNpbmNlIGF0IHRoZSBtb21lbnQgdGhlcmUgYXJlIG5vIG90aGVyCiAgIHBsYW5lcy4gU2V2ZXJhbCBvdGhlciBVVEYncyAoc3VjaCBhcyBVVEYtMSwgVVRGLTIsIGFuZCBVVEYtNykgaGF2ZQogICBmYWxsZW4gaW50byBkaXN1c2UgYW5kIGFyZSBub3QgZGlzY3Vzc2VkIGhlcmUuIFRoZSBtb3N0IGltcG9ydGFudAogICB0cmFuc2Zvcm1hdGlvbiBmb3JtYXQgdG9kYXkgaXMgVVRGLTguCgogICBVVEYtOCwgc28gY2FsbGVkIGJlY2F1c2UgaXQgInNlcmlhbGl6ZXMiIFVDUy0yIGRhdGEgaW50byBhIHN0cmVhbSBvZgogICA4LWJpdCBieXRlcywgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIFVDUyB0byB3b3JrIHdpdGggcHJlc2VudC1kYXkKICAgY29tbXVuaWNhdGlvbnMgZ2VhciwgY29tcHV0ZXJzLCBhbmQgc29mdHdhcmUuIFRoZSBtb3N0IGltcG9ydGFudAogICBwcm9wZXJ0aWVzIG9mIFVURi04IGFyZSB0aGF0IGJ5dGUgb3JkZXIgaXMgY29uc3RhbnQgKG5vIGJ5dGUgc3dhcHBpbmcpCiAgIGFuZCBhbGwgKDctYml0KSBBU0NJSSBjaGFyYWN0ZXJzIHJlcHJlc2VudCB0aGVtc2VsdmVzLiBUaGVyZWZvcmUKICAgY29udmVyc2lvbiBiZXR3ZWVuIEFTQ0lJIGFuZCBVVEYtOCBpcyBubyBjb252ZXJzaW9uIGF0IGFsbCwgYW5kCiAgIGFwcGxpY2F0aW9ucyBvciBwbGF0Zm9ybXMgKHN1Y2ggYXMgUGxhbiA5IGZyb20gQmVsbCBMYWJzKSB0aGF0IHVzZQogICBVVEYtOCAiZm9yIGV2ZXJ5dGhpbmciIGNhbiBzdGlsbCBydW4gdHJhZGl0aW9uYWwgQVNDSUktb25seQogICBhcHBsaWNhdGlvbnMgYW5kIGJlIGFjY2Vzc2VkIGZyb20gdGhlbS4gSW4gcGFydGljdWxhciwgdW5saWtlIFVDUy0yLAogICBBU0NJSSBjaGFyYWN0ZXJzIGFyZSBub3QgcGFkZGVkIHdpdGggTlVMIGJ5dGVzLiBCdXQgYWxzbyB1bmxpa2UgVUNTLTIsCiAgIHRoZXJlIGlzIG5vIHRyYW5zcGFyZW5jeSBmb3IgTGF0aW4tMSBvciBhbnkgb3RoZXIgbm9uLUFTQ0lJIGNoYXJhY3RlcgogICBzZXQuIEV2ZXJ5IG5vbi1BU0NJSSBVQ1MtMiBjaGFyYWN0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgYSBzZXF1ZW5jZSBvZiAyCiAgIG9yIDMgVVRGLTggYnl0ZXMuIFRodXMgVVRGLTggaXMgbW9yZSBjb21wYWN0IHRoYW4gVUNTLTIgZm9yIHRleHQKICAgY29udGFpbmluZyBhIHByZXBvbmRlcmFuY2Ugb2YgQUJDJ3MgKG9yIG90aGVyIEFTQ0lJIGNoYXJhY3RlcnMpLCBhYm91dAogICB0aGUgc2FtZSBhcyBVQ1MtMiBmb3Igb3RoZXIgYWxwaGFiZXRpYyBzY3JpcHRzIChDeXJpbGxpYywgUm9tYW4sCiAgIEdyZWVrLCBldGMpLCBhbmQgbGFyZ2VyIHRoYW4gVUNTLTIgZm9yIENoaW5lc2UsIEphcGFuZXNlLCBhbmQgS29yZWFuLgoKICAgVGhlIFVURi04IHVuY29kaW5nIG9mIHRoZSBVQ1MgaGFzIGJlZW4gYWRvcHRlZCBieSB0aGUgSW50ZXJuZXQgYXMgdGhlCiAgIHByZWZlcnJlZCBjaGFyYWN0ZXIgc2V0IGZvciBuZXcgYXBwbGljYXRpb25zLCBhbmQgaXMgZ3JhZHVhbGx5IGJlaW5nCiAgIHJldHJvZml0dGVkIGludG8gdHJhZGl0aW9uYWwgYXBwbGljYXRpb25zIGxpa2UgRlRQIChbNTQyXVJGQyAyNjQwKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDYuNi4zLiBDb25mb3JtYW5jZSBMZXZlbHMKCiAgIEFsdGhvdWdoIHRoZSBVbmljb2RlIGFuZCBJU08gMTA2NDYgc3RhbmRhcmRzIGJvdGggZGVzY3JpYmUgdGhlIHNhbWUKICAgY2hhcmFjdGVyIHNldCwgdGhlc2Ugc3RhbmRhcmRzIGRpZmZlciBpbiBtYW55IHdheXMsIGluY2x1ZGluZyB0aGVpcgogICBzdGF0ZWQgcmVxdWlyZW1lbnRzIGZvciBjb25mb3JtYW5jZSBhbmQgdGhlaXIgY2xhc3NpZmljYXRpb24gb2YKICAgY29uZm9ybWFuY2UgbGV2ZWxzLgoKICAgS2VybWl0IGhhcyBhbHdheXMgYWJpZGVkIGJ5IElTTyBjaGFyYWN0ZXItc2V0IHN0YW5kYXJkcywgaW5jbHVkaW5nIElTTwogICBjaGFyYWN0ZXItc2V0IGRlc2lnbmF0aW9uIGFuZCBpbnZvY2F0aW9uIG1ldGhvZHMuIEluIGFkYXB0aW5nIFVuaWNvZGUsCiAgIHRoZXJlZm9yZSwgd2UgaGFkIHRvIGNob29zZSBmcm9tIGFtb25nIHRoZSBhdmFpbGFibGUgSVNPIGRlc2lnbmF0aW9ucwogICB3aGljaCwgaW4gdHVybiwgY29ycmVzcG9uZCB3aXRoIElTTyAxMDY0NiBjb25mb3JtYW5jZSBsZXZlbHMuIEF0CiAgIHByZXNlbnQsIEtlcm1pdCBjbGFpbXMgdGhlIGxvd2VzdCBjb25mb3JtYW5jZSBsZXZlbCwgMSwgbWVhbmluZwogICAocm91Z2hseSkgdGhhdCBpdCBkb2VzIG5vdCBoYW5kbGUgY29tYmluaW5nIGZvcm1zIGFuZCBpdCBkb2VzIG5vdAogICBoYW5kbGUgS29yZWFuIEhhbmd1bCBKYW1vcyAoanVzdCBhcywgYXQgcHJlc2VudCwgaXQgZG9lcyBub3QgaGFuZGxlCiAgIEtvcmVhbiBpbiBnZW5lcmFsKS4gTm90ZSB0aGF0IElTTyAxMDY0NiBDb25mb3JtYW5jZSBMZXZlbHMgMSBhbmQgMgogICBzaWRlc3RlcCB0aGUgaXNzdWUgb2YgdGhlIGNvZGUgY2hhbmdlcyBmb3IgS29yZWFuIEhhbmd1bCBieSBhbm5vdW5jaW5nCiAgIG5vbi1zdXBwb3J0IGZvciBIYW5ndWwgcmVnYXJkbGVzcyBvZiBlbmNvZGluZy4KCiAgIElTTyAxMDY0NiBDb25mb3JtYW5jZSBMZXZlbCAxIGlzIGFwcHJveGltYXRlbHkgZXF1aXZhbGVudCB0byBVbmljb2RlCiAgIE5vcm1hbGl6YXRpb24gRm9ybSBDIChkZXNjcmliZWQgaW4gVW5pY29kZSBUZWNobmljYWwgUmVwb3J0IDE1LAogICBpbmNvcnBvcmF0ZWQgaW50byBVbmljb2RlIDMuMCkuCgogICBBcyBub3RlZCBpbiBbNTQzXVNlY3Rpb24gNi42LjIsIEtlcm1pdCBkb2VzIG5vdCBjbGFpbSB0byBzdXBwb3J0CiAgIFVURi0xNiBhdCB0aGUgcHJlc2VudCB0aW1lLCBoZW5jZSB0aGUgVUNTLTIgbm9tZW5jbGF0dXJlLiBLZXJtaXQKICAgdHJlYXRzIHN1cnJvZ2F0ZXMganVzdCBhcyBpZiB0aGV5IHdlcmUgYW55IG90aGVyIFVDUy0yIGNoYXJhY3RlcnMsCiAgIHJhdGhlciB0aGFuIGFzIGVzY2FwZXMgdG8gb3RoZXIgcGxhbmVzLCB3aGljaCBtZWFucyB0aGF0IChleGNlcHQgd2hlbgogICBjb252ZXJ0aW5nIGJldHdlZW4gVUNTLTIgYW5kIFVURi04KSB0aGV5IGFyZSB0cmFuc2xhdGVkIHRvICJlcnJvciIKICAgY2hhcmFjdGVycywgc2luY2UgKGEpIG5vIG90aGVyIHBsYW5lcyBhcmUgZGVmaW5lZCB5ZXQgKGFuZCBpZiB0aGV5CiAgIHdlcmUsIG5vIG90aGVyIGNoYXJhY3RlciBzZXRzIHN1cHBvcnRlZCBieSBLZXJtaXQgd291bGQgZW5jb2RlIHRoZWlyCiAgIGNoYXJhY3RlcnMpLCBhbmQgKGIpIG5vIHZhbGlkIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIgY29ycmVzcG9uZHMgdG8gYW55CiAgIG90aGVyIFVDUy0yIGNoYXJhY3Rlci4KCiAgIEEgbWlub3IgeWV0IHNpZ25pZmljYW50IGFzcGVjdCBvZiBVbmljb2RlIDMuMCBhbmQgc29tZSByZWNlbnQKICAgcGVydHVyYmF0aW9uIG9mIElTTyAxMDY0Ni0xIChwcm9iYWJseSBBbWVuZG1lbnQgMTgsICJTeW1ib2xzIGFuZCBPdGhlcgogICBDaGFyYWN0ZXJzIikgaXMgdGhlIGFkZGl0aW9uIG9mIHRoZSBFdXJvIFNpZ24gYXQgVSsyMEFDLiBBcyBub3RlZCBpbgogICBbNTQ0XVNlY3Rpb24gNi4wLCBLZXJtaXQncyAiRXVybyBjb21wbGlhbmNlIiBpbmNsdWRlcyBjb252ZXJzaW9uCiAgIGJldHdlZW4gTGF0aW4gQWxwaGFiZXQgOSBhbmQgdmFyaW91cyBQQyBjb2RlIHBhZ2VzLiBUZXh0IGNhbiBhbHNvIGJlCiAgIGNvbnZlcnRlZCBiZXR3ZWVuIFVDUy0yIG9yIFVURi04IGFuZCBhbnkgb3RoZXIgRXVyby1jb21wbGlhbnQKICAgY2hhcmFjdGVyIHNldCAoTGF0aW4tOSwgQ1A4NTgsIENQMTI1MCwgQ1AxMjUyKSB3aXRob3V0IGxvc3Mgb2YgdGhlCiAgIEV1cm8gU2lnbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDYuNi40LiBSZWxhdGlvbnNoaXAgb2YgVW5pY29kZSB3aXRoIEtlcm1pdCdzIE90aGVyIENoYXJhY3RlciBTZXRzCgogICBLZXJtaXQncyBjaGFyYWN0ZXIgc2V0cyBhcmUgZGl2aWRlZCBpbnRvIHR3byBncm91cHM6IHNpbmdsZS1ieXRlIHNldHMKICAgKHN1Y2ggYXMgUm9tYW4sIEhlYnJldywgQ3lyaWxsaWMsIEdyZWVrKSBhbmQgbXVsdGlieXRlICh2YXJpb3VzCiAgIEphcGFuZXNlIHNldHMpLiBUaGUgdHdvIGdyb3VwcyBhcmUgZGlzdGluY3Qgc2luY2Ugb25lIG5vcm1hbGx5IHdvdWxkCiAgIG5vdCBleHBlY3QgdG8gY29udmVydCBLYW5qaSBpZGVvZ3JhbXMgdG8gUm9tYW4gKG9yIG90aGVyKSBsZXR0ZXJzLCBvcgogICB2aWNlIHZlcnNhLgoKICAgVW5pY29kZSBjaGFyYWN0ZXItc2V0IGNvbnZlcnNpb24gd29ya3Mgd2l0aCBib3RoIGdyb3VwcywgYnV0IG9idmlvdXNseQogICB0aGUgcmVzdWx0IGRlcGVuZHMgb24gdGhlIHJlcGVydG9pcmVzIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCiAgIGNoYXJhY3Rlci1zZXRzIGJvdGggaW5jbHVkaW5nIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlLiBGb3IgZXhhbXBsZSwKICAgeW91IGNhbiB0cmFuc2xhdGUgYSBIdW5nYXJpYW4gdGV4dCBmaWxlIGJldHdlZW4gTGF0aW4tMiBhbmQgVW5pY29kZSwKICAgYnV0IG5vdCBiZXR3ZWVuIChzYXkpIFVuaWNvZGUgYW5kIExhdGluL0dyZWVrLiBCeSB0aGUgc2FtZSB0b2tlbiB5b3UKICAgY2FuIGNvbnZlcnQgSmFwYW5lc2UgdGV4dCBmcm9tIFNoaWZ0LUpJUyBvciBFVUMgb3IgSklTLTcgdG8gVW5pY29kZQogICBhbmQgYmFjaywgYnV0IHlvdSBjYW4ndCBjb252ZXJ0IHRoZSBzYW1lIGZpbGUgdG8gKHNheSkgTGF0aW4tMSBpZiBpdAogICBjb250YWlucyBKYXBhbmVzZSBjaGFyYWN0ZXJzLgoKICAgICBKSVMtNyBpcyBlcXVpdmFsZW50IHRvIERFQyBLYW5qaSBhbmQgSVNPLTIwMjItSlAgZXhjZXB0IHRoYXQgdGhlCiAgICAgbGF0dGVyIHR3byBkbyBub3Qgc3VwcG9ydCBoYWxmd2lkdGggS2F0YWthbmEuIEtlcm1pdCB0cmVhdHMgYWxsCiAgICAgdGhyZWUgb2YgdGhlc2Ugc2V0cyB0aGUgc2FtZSB3YXksIGkuZS4gYXMgSklTLTcuCgogICBBcyBub3RlZCwgS2VybWl0IHByZXNlbnRseSBkb2VzIG5vdCBoYW5kbGUgY29tYmluaW5nIGRpYWNyaXRpY3MsIGFuZAogICBzbyB3aWxsIG5vdCBjb3JyZWN0bHkgY29udmVydCBVQ1MgZmlsZXMgdGhhdCB1c2UgdGhlbSBpbnRvIGEKICAgc2luZ2xlLWJ5dGUgY2hhcmFjdGVyIHNldC4gRm9yIGV4YW1wbGUsIGlmIGEgVUNTIGZpbGUgY29udGFpbnMgTGF0aW4KICAgQ2FwaXRhbCBMZXR0ZXIgQSAoVSswMDQxKSBmb2xsb3dlZCBieSBDb21iaW5pbmcgQWN1dGUgQWNjZW50IChVKzAzMDEpLAogICB0aGUgcmVzdWx0IHdpbGwgYmUgYSB0d28tY2hhcmFjdGVyIHNlcXVlbmNlLCBBIGZvbGxvd2VkIGJ5IGFub3RoZXIKICAgY2hhcmFjdGVyLiBUaGlzIGlzIHdoYXQgaXMgbWVhbnQgYnkgQ29uZm9ybWFuY2UgTGV2ZWwgMS4gKFRoZQogICBzaXR1YXRpb24gZ3Jvd3Mgd29yc2Ugd2l0aCBtdWx0aXBsZSBkaWFjcml0aWNzLCBzaW5jZSB0aGV5IGNhbiBvY2N1cgogICBpbiBhbnkgb3JkZXIuKQoKICAgQSBoaWdoZXIgbGV2ZWwgb2YgY29uZm9ybWFuY2UgaXMgcG9zc2libGUsIGluIHdoaWNoICJjYW5vbmljYWwKICAgZXF1aXZhbGVuY2VzIiBhcmUgaGFuZGxlZCB2aWEgYWxnb3JpdGhtcyBhbmQgZGF0YWJhc2VzLCBhdCBzb21lCiAgIChwZXJoYXBzIGNvbnNpZGVyYWJsZSkgY29zdCBpbiBwZXJmb3JtYW5jZSwgc2luY2UgYSBmYWlyIGFtb3VudCBvZgogICBhZGRpdGlvbmFsIGNvZGUgbXVzdCBiZSBleGVjdXRlZCBmb3IgZXZlcnkgY2hhcmFjdGVyIGR1cmluZyBkYXRhCiAgIHRyYW5zZmVyIChkYXRhYmFzZSBsb29rdXAsIHNvcnRpbmcgb2YgY29tYmluaW5nIHNlcXVlbmNlcyBpbnRvCiAgIGNhbm9uaWNhbCBvcmRlciwgZXRjKS4gVGhpcyBjYW4gYmUgYWRkZWQgaW4gZnV0dXJlIHJlbGVhc2VzIGlmIHRoZXJlCiAgIGlzIGEgbmVlZCAoYnV0IGluIG1hbnkgY2FzZXMsIHByZS0gYW5kIHBvc3Rwb3N0cHJvY2Vzc2luZyBtaWdodCBiZSBhCiAgIGJldHRlciBvcHRpb24pLgoKICAgV2l0aGluIHRoZXNlIGNvbnN0cmFpbnRzLCBLZXJtaXQgY29udmVydHMgYmV0d2VlbiB0aGUgVUNTIGFuZCBpdHMKICAgb3RoZXIgY2hhcmFjdGVyIHNldHMuIEZvciBleGFtcGxlLCBhIG1peHR1cmUgb2YgUnVzc2lhbiBhbmQgRW5nbGlzaAogICAoYW5kL29yIER1dGNoLCBvciBMYXRpbikgdGV4dCBjYW4gYmV0IGNvbnZlcnRlZCBiZXR3ZWVuIHRoZSBVQ1MgYW5kCiAgIElTTyBMYXRpbi9DeXJpbGxpYyBvciBLT0ktOC4gQnV0IHNpbmNlIEtlcm1pdCBkb2VzIG5vdCBwcmVzZW50bHkKICAgc3VwcG9ydCBBcmFiaWMgY2hhcmFjdGVyLXNldCBjb252ZXJzaW9uLCB0aGUgbmV3IGF2YWlsYWJpbGl0eSBvZiBVQ1MKICAgY29udmVyc2lvbiBkb2VzIG5vdCBtZWFuIHRoYXQgS2VybWl0IGNhbiBjb252ZXJ0IGZyb20gQXJhYmljIFVDUyB0ZXh0CiAgIHRvIHNvbWUgb3RoZXIgY2hhcmFjdGVyIHNldCwgYmVjYXVzZSBLZXJtaXQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgb3RoZXIKICAgY2hhcmFjdGVyIHNldCB0aGF0IGluY2x1ZGVzIEFyYWJpYy4gRGl0dG8gZm9yIFRoYWksIEFybWVuaWFuLAogICBHZW9yZ2lhbiwgVGliZXRhbiwgQ2hpbmVzZSwgS29yZWFuLCBldGMuIEhvd2V2ZXIsIEtlcm1pdCBDQU4gY29udmVydAogICBBcmFiaWMgKG9yIGFueSBvdGhlciBzY3JpcHQpIGJldHdlZW4gVUNTLTIgYW5kIFVURi04LgoKICAgQ29uc2lkZXJpbmcgQ3lyaWxsaWMgbW9yZSBjYXJlZnVsbHksIG5vdGUgdGhhdCB0aGUgVUNTIGFsc28gY29udGFpbnMKICAgbnVtZXJvdXMgQ3lyaWxsaWMgY2hhcmFjdGVycyBub3QgZm91bmQgaW4gYW55IG9mIHRoZSBDeXJpbGxpYyBzZXRzCiAgIChJU08gTGF0aW4vQ3lyaWxsaWMsIEtPSTgsIENQODY2LCBldGMpIHRoYXQgS2VybWl0IHN1cHBvcnRzOwogICBjaGFyYWN0ZXJzIG5lZWRlZCBmb3IgQWJraGFzaWFuLCBZYWt1dCwgVGF0YXIsIEJhc2hraXIsIEFsdGFpYywgT2xkCiAgIENodXJjaCBTbGF2b25pYywgZXRjOyBVQ1MgdGV4dCBjb250YWluaW5nIGFueSBvZiB0aGVzZSBoaXN0b3JpYyBvcgogICAiZXh0ZW5kZWQiIEN5cmlsbGljIGNoYXJhY3RlcnMgY2FuIG5vdCBiZSBjb252ZXJ0ZWQgdG8gYW55IG9mIEtlcm1pdCdzCiAgIGN1cnJlbnQgc2luZ2xlLWJ5dGUgQ3lyaWxsaWMgc2V0cyB3aXRob3V0IGxvc3MuIFRoZSBzaXR1YXRpb24gaXMKICAgc2ltaWxhciBmb3IgR3JlZWssIEhlYnJldywgZXRjLCBhbmQgZXZlbiB3b3JzZSBmb3IgSmFwYW5lc2Ugc2luY2UKICAgVW5pY29kZSBjb250YWlucyB0aG91c2FuZHMgb2YgS2FuamlzIHRoYXQgYXJlIGxhY2tpbmcgZnJvbSB0aGUKICAgSmFwYW5lc2UgY2hhcmFjdGVyIHNldHMgYmFzZWQgb24gSklTIFggMDIwOCwgc3VjaCBhcyBFVUMtSlAsIEpJUy03LAogICBhbmQgU2hpZnQtSklTLgoKICAgSW4gZ2VuZXJhbCwgd2hlbiBjb252ZXJ0aW5nIGZyb20gVUNTIHRvIGEgc2luZ2xlLWJ5dGUgc2V0LCB0aGVyZSBpcwogICBhbHdheXMgdGhlIHBvc3NpYmlsaXR5IG9mIGRhdGEgbG9zcywganVzdCBhcyB0aGVyZSBpcyB3aGVuIGNvbnZlcnRpbmcKICAgZnJvbSBhbnkgbGFyZ2VyIHNldCB0byBhIHNtYWxsZXIgb25lLiBGb3IgZXhhbXBsZSwgaWYgYSBVQ1MgZmlsZQogICBjb250YWlucyBEZXZhbmFnYXJpIGNoYXJhY3RlcnMsIHRoZXNlIGNoYXJhY3RlcnMgd2lsbCBiZSBsb3N0IHdoZW4KICAgY29udmVydGluZyB0byAoc2F5KSBMYXRpbi0xLCBqdXN0IGFzIFJvbWFuIHZvd2VscyB3aXRoIGFjdXRlIGFjY2VudHMKICAgYXJlIGxvc3Qgd2hlbiBjb252ZXJ0aW5nIGZyb20gTGF0aW4tMSAoYW4gOC1iaXQgc2V0KSB0byBHZXJtYW4gSVNPIDY0NgogICAoYSA3LWJpdCBzZXQpLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNi42LjUuIEtlcm1pdCdzIFVuaWNvZGUgRmVhdHVyZXMKCiAgIEMtS2VybWl0IGNhbiBjb252ZXJ0IGJldHdlZW4gVUNTLTIgb3IgVVRGLTggYW5kIGFueSBvZiBpdHMgb3RoZXIKICAgY2hhcmFjdGVyIHNldHMsIGFuZCBhbHNvIGJldHdlZW4gVUNTLTIgYW5kIFVURi04LiBXaGVuIGNvbnZlcnRpbmcKICAgYmV0d2VlbiBVQ1MtMiBvciBVVEYtOCBhbmQgYSBub24tVW5pY29kZSBjaGFyYWN0ZXIgc2V0IChzdWNoIGFzCiAgIExhdGluLTEpLCB0aGUgVUNTIExpbmUgU2VwYXJhdG9yIChMUywgVSsyMDI4KSBhbmQgUGFyYWdyYXBoIFNlcGFyYXRvcgogICAoUFMsIFUrMjAyOSkgY2hhcmFjdGVycyBhcmUgY29udmVydGVkIHRvIHRoZSBhcHByb3ByaWF0ZSBsaW5lCiAgIHRlcm1pbmF0b3IgKENSLCBMRiwgb3IgQ1JMRikuIFdoZW4gY29udmVydGluZyBmcm9tIGEgbm9uLVVuaWNvZGUgc2V0CiAgIHRvIFVDUy0yIG9yIFVURi04LCBob3dldmVyLCBsaW5lIHRlcm1pbmF0b3JzIGFyZSBub3QgY29udmVydGVkIHRvIExTCiAgIG9yIFBTLiBUaGlzIGlzIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcmVjb21tZW5kYXRpb25zIG9mIFVuaWNvZGUKICAgVGVjaG5pY2FsIFJlcG9ydCAjMTMuCgogICBXaGVuIEMtS2VybWl0IHN0YXJ0cywgaXQgdGVzdHMgdGhlIG5hdGl2ZSBieXRlIG9yZGVyIG9mIHRoZSBjb21wdXRlci4KICAgWW91IGNhbiBzZWUgdGhlIHJlc3VsdCBpbiB0aGUgU0hPVyBGRUFUVVJFUyBvciBTSE9XIEZJTEUgZGlzcGxheS4gSXQncwogICBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgdmFyaWFibGUgXHYoYnl0ZW9yZGVyKTogMCBtZWFucyBCaWcgRW5kaWFuLCAxCiAgIG1lYW5zIExpdHRsZSBFbmRpYW4uCgogICBXaGVuIFVDUy0yIGlzIGludm9sdmVkIGluIGZpbGUgdHJhbnNmZXIgb3IgdHJhbnNsYXRpb24sIHRoZSBmb2xsb3dpbmcKICAgY29tbWFuZHMgdGVsbCBDLUtlcm1pdCB3aGF0IHRvIGRvIGFib3V0IGJ5dGUgb3JkZXI6CgogICBTRVQgRklMRSBVQ1MgQllURS1PUkRFUiB7IEJJRy1FTkRJQU4sIExJVFRMRS1FTkRJQU4gfQogICAgICAgICAgVGhpcyBpcyBmb3IgcmVhZGluZyBVQ1MtMiBmaWxlcyB0aGF0IGRvbid0IGhhdmUgYSBCT00sIGFuZCBhbHNvCiAgICAgICAgICBmb3Igd3JpdGluZyBVQ1MtMiBmaWxlcy4gSWYgdGhpcyBjb21tYW5kIGlzIG5vdCBnaXZlbiwgdGhlCiAgICAgICAgICBtYWNoaW5lJ3MgbmF0aXZlIGJ5dGUgb3JkZXIgaXMgdXNlZCB3aGVuIHdyaXRpbmcgVUNTLTIgZmlsZXMsCiAgICAgICAgICBhbmQgYWxzbyB3aGVuIHJlYWRpbmcgVUNTLTIgZmlsZXMgdGhhdCBkb24ndCBoYXZlIGEgQk9NLgoKICAgU0VUIEZJTEUgVUNTIEJPTSB7IE9OLCBPRkYgfQogICAgICAgICAgVGhpcyBzZXR0aW5nIGlzIHVzZWQgd2hlbiBjcmVhdGluZyBVQ1MtMiBmaWxlcy4gQSBCT00gaXMgYWRkZWQKICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgYnkgZGVmYXVsdC4gVXNlIE9GRiB0byBub3QgYWRkIHRoZSBCT00uIFRoaXMKICAgICAgICAgIGNvbW1hbmQgaGFzIG5vIGFmZmVjdCB3aGVuIHdyaXRpbmcgZmlsZXMuCgogICBDT1BZIC9TV0FQLUJZVEVTIHNvdXJjZWZpbGUgZGVzdGluYXRpb25maWxlCiAgICAgICAgICBVc2UgdGhpcyBmb3IgZml4aW5nIGEgVUNTLTIgZmlsZSB3aG9zZSBieXRlcyBhcmUgaW4gdGhlIHdyb25nCiAgICAgICAgICBvcmRlci4KCiAgIFVzZSBTSE9XIEZJTEUgdG8gZGlzcGxheSB0aGUgRklMRSBVQ1Mgc2V0dGluZ3MuCgogICBQbGVhc2Ugbm90ZSwgYWdhaW4sIHRoYXQgQy1LZXJtaXQncyB1c2VyIGludGVyZmFjZSwgaW5jbHVkaW5nIGl0cwogICBzY3JpcHQgbGFuZ3VhZ2UsIGlzIG5vdCBpbnRlcm5hdGlvbmFsaXplZCBpbiBhbnkgd2F5LiBTdHJpbmcKICAgY29tcGFyaXNvbnMsIGNhc2UgY29udmVyc2lvbiwgYW5kIHNvIG9uLCB3b3JrIG9ubHkgZm9yIFVTIEFTQ0lJCiAgIChjb21wYXJpc29ucyBmb3IgZXF1YWxpdHkgd29yayB3aXRoIG90aGVyIHNldHMsIGJ1dCBub3QKICAgbGV4aWNhbGx5LWdyZWF0ZXItb3ItbGVzcy10aGFuIG9yIGNhc2VsZXNzIGNvbXBhcmlzb25zOyBldmVuCiAgIGNvbXBhcmlzb25zIGZvciBlcXVhbGl0eSBjYW4gZmFpbCB3aGVuIGNvbXBvc2VkIGNoYXJhY3RlcnMgb3IgYnl0ZQogICBvcmRlciBhcmUgaW52b2x2ZWQpLiBTdHJpbmcgZnVuY3Rpb25zIHN1Y2ggYXMgXGZpbmRleCgpIGFuZAogICBcZnN1YnN0cmluZygpIHRoYXQgcmVmZXJlbmNlIGJ5dGUgcG9zaXRpb25zIGRvIGp1c3QgdGhhdDsgdGhleSB3b24ndAogICB3b3JrIHdpdGggVVRGLTggdGV4dCB0aGF0IGNvbnRhaW5zIGFueSBub24tQVNDSUkgY2hhcmFjdGVycywgYW5kIHRoZXkKICAgd2lsbCBub3Qgd29yayB3aXRoIFVDUy0yIHRleHQgYXQgYWxsIHNpbmNlIHRoZXkgdXNlIEMgc3RyaW5ncwogICBpbnRlcm5hbGx5LCB3aGljaCBhcmUgTlVMLXRlcm1pbmF0ZWQuIFRoZXNlIGFyZSBqdXN0IGEgZmV3IGV4YW1wbGVzIHRvCiAgIGlsbHVzdHJhdGUgdGhhdCBuZWl0aGVyIFVuaWNvZGUgbm9yIGFueSBvdGhlciBjaGFyYWN0ZXItc2V0IGJleW9uZAogICBBU0NJSSBpcyBzdXBwb3J0ZWQgYXQgdGhlIHVzZXItaW50ZXJmYWNlLCBjb21tYW5kLCBvciBzY3JpcHRpbmcgbGV2ZWwKICAgaW4gdGhpcyB2ZXJzaW9uIG9mIEMtS2VybWl0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNi42LjUuMS4gRmlsZSBUcmFuc2ZlcgoKICAgS2VybWl0IHN1cHBvcnRzIGJvdGggVUNTLTIgYW5kIFVURi04IGFzIGZpbGUgYW5kIHRyYW5zZmVyIGNoYXJhY3RlcgogICBzZXRzIGluIHRleHQtbW9kZSBmaWxlIHRyYW5zZmVyLgoKICAgVG8gc2VsZWN0IFVDUy0yIG9yIFVURi04IGFzIGEgZmlsZSBjaGFyYWN0ZXItc2V0LCB1c2U6CgogIFNFVCBGSUxFIENIQVJBQ1RFUi1TRVQgeyBVQ1MyLCBVVEY4IH0KCiAgIElmIHlvdSB3YW50IHRvIHNlbmQgYSBVQ1MtMiB0ZXh0IGZpbGUgKG9yIHNhdmUgYW4gaW5jb21pbmcgZmlsZSBpbgogICBVQ1MtMiBmb3JtYXQpLCB0ZWxsIEtlcm1pdCB0bzoKCiAgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBVQ1MyCgogICBhbmQgaWYgeW91IHdhbnQgdG8gc2VuZCBhIFVURi04IHRleHQgZmlsZSAob3Igc3RvcmUgYW4gaW5jb21pbmcgZmlsZQogICBpbiBVVEYtOCBmb3JtYXQpLCB0ZWxsIEtlcm1pdCB0bzoKCiAgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBVVEY4CgogICBXaGVuIHNlbmRpbmcgVUNTLTIgZmlsZXMsIEtlcm1pdCBkZXRlcm1pbmVzIHRoZSBieXRlIG9yZGVyIGZyb20gdGhlCiAgIEJPTSwgaWYgdGhlcmUgaXMgb25lIChhbmQgaWYgdGhlcmUgaXMgYSBCT00sIGl0IGlzIHN0cmlwcGVkLCBpLmUuIG5vdAogICBzZW50KS4gSWYgdGhlcmUgaXMgbm8gQk9NLCB0aGUgYnl0ZSBvcmRlciBpcyB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGUKICAgbW9zdCByZWNlbnQgU0VUIEZJTEUgVUNTIEJZVEUtT1JERVIgY29tbWFuZCwgaWYgYW55LCBvdGhlcndpc2UgdGhlCiAgIGNvbXB1dGVyJ3MgbmF0aXZlIGJ5dGUgb3JkZXIgaXMgYXNzdW1lZC4gV2hlbiBzdG9yaW5nIGluY29taW5nIGZpbGVzCiAgIGFzIFVDUy0yLCB0aGUgYnl0ZSBvcmRlciBpcyBhY2NvcmRpbmcgU0VUIEZJTEUgVUNTIEJZVEUtT1JERVIsIGlmCiAgIGdpdmVuLCBvdGhlcndpc2UgdGhlIG5hdGl2ZSBvbmU7IGEgQk9NIGlzIHdyaXR0ZW4gYWNjb3JkaW5nIHRvIFNFVAogICBGSUxFIFVDUyBCT00uCgogICBBIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgc2hvdWxkIGJlIGNob3NlbiB0aGF0IGluY2x1ZGVzIGFsbCBvZiB0aGUKICAgY2hhcmFjdGVycyBpbiB0aGUgc291cmNlIGZpbGUuIFNvLCBmb3IgZXhhbXBsZSwgaWYgeW91IGFyZSBzZW5kaW5nIGEKICAgVUNTLTIgZmlsZSBjb250YWluaW5nIG9ubHkgR2VybWFuLWxhbmd1YWdlIHRleHQsIHlvdXIgdHJhbnNmZXIKICAgY2hhcmFjdGVyLXNldCBjYW4gYmUgTGF0aW4tMSwgTGF0aW4tMiwgTGF0aW4tOSwgVUNTLTIsIG9yIFVURi04LiBCdXQKICAgaWYgeW91IGFyZSBzZW5kaW5nIGEgZmlsZSB0aGF0IGNvbnRhaW5zIGEgY29tYmluYXRpb24gb2YgSGVicmV3IGFuZAogICBHcmVlaywgeW91ciB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IG11c3QgYmUgVUNTLTIgb3IgVVRGLTggaWYgeW91IGRvbid0CiAgIHdhbnQgdG8gbG9zZSBvbmUgc2NyaXB0IG9yIHRoZSBvdGhlci4gRnVydGhlcm1vcmUsIHRoZSB0cmFuc2ZlcgogICBjaGFyYWN0ZXItc2V0IG11c3QgYmUgb25lIHRoYXQgaXMgc3VwcG9ydGVkIGJ5IHRoZSByZWNlaXZpbmcgS2VybWl0CiAgIHByb2dyYW0uIFNpbmNlIFVDUyBzdXBwb3J0IGlzIG5ldywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgb3RoZXIKICAgS2VybWl0IHByb2dyYW0gKGlmIGl0IHN1cHBvcnRzIGNoYXJhY3RlciBzZXRzIGF0IGFsbCkgZG9lcyBub3Qgc3VwcG9ydAogICBpdCwgYnV0IGRvZXMgc3VwcG9ydCBzaW5nbGUtYnl0ZSBzZXRzIHN1Y2ggYXMgTGF0aW4tMSwgTGF0aW4vQ3lyaWxsaWMsCiAgIGV0Yy4KCiAgIFRvIHNlbGVjdCBVQ1MtMiBvciBVVEYtOCBhcyBhIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQsIHVzZToKCiAgU0VUIFRSQU5TRkVSIENIQVJBQ1RFUi1TRVQgeyBVQ1MyLCBVVEY4IH0KCiAgIEl0IGlzIHVwIHRvIHRoZSByZWNlaXZpbmcgS2VybWl0IHByb2dyYW0gdG8gY29udmVydCB0aGUgdHJhbnNmZXIKICAgZm9ybWF0IHRvIGl0cyBvd24gbG9jYWwgZm9ybWF0LCBpZiBuZWNlc3NhcnkuIElmIGl0IGRvZXMgbm90CiAgIHVuZGVyc3RhbmQgdGhlIFVURi04IG9yIFVDUy0yIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQsIGFuZCB5b3VyIGZpbGUKICAgY2FuIG5vdCBiZSBhZGVxdWF0ZWx5IHJlcHJlc2VudGVkIGJ5IGFueSBzaW5nbGUtYnl0ZSB0cmFuc2ZlcgogICBjaGFyYWN0ZXItc2V0IChzdWNoIGFzIExhdGluLTEgb3IgTGF0aW4vQ3lyaWxsaWMpIHRoZW4sIGlmIFVURi04CiAgIGZvcm1hdCBpcyBhY2NlcHRhYmxlIG9uIHRoZSByZWNlaXZpbmcgY29tcHV0ZXIsIHVzZSBVVEYtOCBhcyB0aGUKICAgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCwgd2l0aCB0aGUgcmVjZWl2ZXIgdG9sZCB0byAic2V0IHVua25vd24tY2hhcgogICBrZWVwIiwgb3Igd2l0aCB0aGUgc2VuZGVyIHRvbGQgdG8gInNldCBhdHRyaWJ1dGUgY2hhciBvZmYiLiBJZiB5b3UKICAgd2FudCB0aGUgZmlsZSB0byBiZSBzdG9yZWQgaW4gVUNTLTIgZm9ybWF0IGF0IHRoZSByZWNlaXZlciwgc2VuZCBpdCBpdAogICBiaW5hcnkgbW9kZSBpZiB0aGUgc291cmNlIGZpbGUgaXMgYWxzbyBVQ1MtMiwgb3IgZWxzZSB1c2UgdGhlCiAgIFRSQU5TTEFURSBjb21tYW5kIChuZXh0IHNlY3Rpb24pIHRvIGNvbnZlcnQgaXQgdG8gVUNTLTIgZmlyc3QsIHRoZW4KICAgc2VuZCBpdCBpbiBiaW5hcnkgbW9kZS4gWW91IHNob3VsZCBub3QgdXNlIFVDUy0yIGFzIGEgdHJhbnNmZXIKICAgY2hhcmFjdGVyLXNldCBpbiB0ZXh0LW1vZGUgdHJhbnNmZXJzIHRvIEtlcm1pdCBwcm9ncmFtcyB0aGF0IGRvbid0CiAgIHN1cHBvcnQgaXQsIGJlY2F1c2UgdGhleSBhcmUgbGlrZWx5IHRvIGNvcnJ1cHQgdGhlIHJlc3VsdCB0aGUgc2FtZSB3YXkKICAgRlRQIHdvdWxkIChzZWUgdGhlIGZpbmFsIHBhcmFncmFwaCBvZiB0aGlzIHNlY3Rpb24pLgoKICAgV2hlbiBVQ1MtMiBpcyB0aGUgdHJhbnNmZXIgY2hhcmFjdGVyIHNldCwgaXQgYWx3YXlzIGdvZXMgaW50byBLZXJtaXQKICAgcGFja2V0cyBpbiBCaWcgRW5kaWFuIGZvcm1hdCwgd2l0aCBubyBCT00uIEFzIGFsd2F5cywgdGhlIHRyYW5zZmVyCiAgIGNoYXJhY3Rlci1zZXQgaXMgYW5ub3VuY2VkIGJ5IHRoZSBzZW5kZXIgdG8gdGhlIHJlY2VpdmVyLiBUaGUKICAgYW5ub3VuY2VtZW50IGZvciBVQ1MtMiBpcyAiSTE2MiIgKElTTyBSZWdpc3RyYXRpb24gMTYyID0gVUNTLTIgTGV2ZWwKICAgMSkgYW5kIGJ5IGRlZmluaXRpb24gaXQgaXMgQmlnIEVuZGlhbiAodGhlIHN0YW5kYXJkcyBzYXkgdGhhdCB3aGVuCiAgIFVDUy0yIGlzIHNlcmlhbGl6ZWQgaW50byBieXRlcywgdGhlIG9yZGVyIG11c3QgYmUgQmlnIEVuZGlhbikuIFRoZQogICBhbm5vdW5jZW1lbnQgZm9yIFVURi04IGlzICJJMTkwIiAoVVRGLTggTGV2ZWwgMSkuCgogICBXaGVuIHJlY2VpdmluZyBhIGZpbGUgd2hvc2UgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCBpcyBVQ1MtMiBvciBVVEYtOCwKICAgeW91IG11c3QgY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSBmaWxlIGNoYXJhY3RlciBzZXQgZm9yIHRoZSByZXN1bHQuCiAgIFRoZXJlIGlzIG5vIHdheSBLZXJtaXQgY2FuIGRvIHRoaXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LCBzaW5jZSBVQ1MKICAgZGF0YSBjYW4gYmUgaW4gYW55IHNjcmlwdCBhdCBhbGwsIG9yIGFueSBjb21iaW5hdGlvbi4KCiAgIEluIGdlbmVyYWwsIFVURi04IG9yIFVDUy0yIHNob3VsZCBiZSBjaG9zZW4gYXMgYSB0cmFuc2ZlcgogICBjaGFyYWN0ZXItc2V0IGlmIHRoZSBzb3VyY2UgZmlsZSBpcyBhbHNvIGVuY29kZWQgaW4gc29tZSBmb3JtIG9mIFVDUwogICBhbmQgaXQgY29udGFpbnMgbW9yZSB0aGFuIG9uZSBzY3JpcHQuIEJ1dCB0aGVyZSBhcmUgb3RoZXIgc2l0dWF0aW9ucwogICB3aGVyZSB3aGVyZSBVVEYtOCBvciBVQ1MtMiBvZmZlciBhZHZhbnRhZ2VzLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB0aGUKICAgc291cmNlIGZpbGUgaXMgb24gYSBOZVhUc3RhdGlvbiBhbmQgdGhlIGRlc3RpbmF0aW9uIGZpbGUgaXMgb24gVk1TLgogICBCb3RoIHRoZSBOZVhUIGFuZCB0aGUgREVDIE11bHRpbmF0aW9uYWwgY2hhcmFjdGVyIHNldHMgaW5jbHVkZSB0aGUKICAgRnJlbmNoIE9FIGRpZ3JhcGgsIGJ1dCBMYXRpbi0xIGRvZXMgbm90LiBUaGVyZWZvcmUgRnJlbmNoIHdvcmRzCiAgIGNvbnRhaW5pbmcgdGhpcyBjaGFyYWN0ZXIgbWlnaHQgbm90IGFycml2ZSBpbnRhY3Qgd2hlbiBMYXRpbi0xIGlzIHRoZQogICB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0LCBidXQgd2lsbCB3aXRoIFVURi04IG9yIFVDUy0yLCBzaW5jZSB0aGUgVUNTCiAgIGluY2x1ZGVzIHRoZSBPRSBkaWdyYXBoIChidXQgc28gZG9lcyBMYXRpbi05KS4KCiAgIFVDUy0yIHNob3VsZCBiZSBjaG9zZW4gYXMgYSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IG9ubHkgZm9yIEphcGFuZXNlCiAgIHRleHQgZmlsZXMgdGhhdCBjb250YWluIGEgbGFyZ2UgcHJlcG9uZGVyYW5jZSBvZiBLYW5qaSwgc2luY2UgaW4gdGhpcwogICBjYXNlIChhbmQgb25seSB0aGlzIGNhc2UpIFVDUy0yICh0d28gYnl0ZXMgcGVyIEthbmppKSBpcyBtb3JlCiAgIGVmZmljaWVudCB0aGFuIFVURi04ICh0aHJlZSBieXRlcyBwZXIgS2FuamkpLiBUaGUgc2FtZSB3aWxsIGJlIHRydWUKICAgZm9yIENoaW5lc2UgYW5kIEtvcmVhbiB3aGVuIHRoZXkgYXJlIHN1cHBvcnRlZCBieSBLZXJtaXQuIFVDUy0yIHNob3VsZAogICBuZXZlciBiZSB1c2VkIGFzIGEgdHJhbnNmZXIgY2hhcmFjdGVyLXNldCB3aXRoIGEgdHJhbnNmZXIgcGFydG5lciB0aGF0CiAgIGRvZXMgbm90IHN1cHBvcnQgVUNTLTIgc2luY2UgdGhpcyBjYW4gY2F1c2UgZmlsZSBjb3JydXB0aW9uIChzZWUgbGFzdAogICBwYXJhZ3JhcGggaW4gdGhpcyBzZWN0aW9uKS4KCiAgIE5vdGUgdGhhdCBLZXJtaXQncyByZXBlYXQtY291bnQgY29tcHJlc3Npb24gaXMgMTAwJSBpbmVmZmVjdGl2ZSBmb3IKICAgVUNTLTIsIGFuZCBpcyBhbHNvIGluZWZmZWN0aXZlIGZvciBtdWx0aWJ5dGUgY2hhcmFjdGVycyBpbiBVVEYtOCBhbmQKICAgRVVDLUpQOyB0aGlzIGlzIGJlY2F1c2UgcmVwZWF0LWNvbXByZXNzaW9uIGlzIGEgdHJhbnNwb3J0LWxldmVsCiAgIG1lY2hhbmlzbSB0aGF0IG9wZXJhdGVzIG9uIGEgcGVyLWJ5dGUgYmFzaXM7IGl0IGhhcyBubyBrbm93bGVkZ2Ugb2YKICAgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gYSBieXRlIGFuZCBhIGNoYXJhY3Rlci4KCiAgIFdoZW4gQy1LZXJtaXQgc3RhcnRzLCBpdCBzZXRzIHVwIGFzc29jaWF0aW9ucyAoWzU0NV1TZWN0aW9uIDYuNSkgZm9yCiAgIGluY29taW5nIGZpbGVzIHdob3NlIHRyYW5zZmVyIGNoYXJhY3RlciBzZXRzIGFyZSBVQ1MtMiBvciBVVEYtOAogICBhcHByb3ByaWF0ZWx5IGZvciB0aGUgcGxhdGZvcm0gc28gdGhhdCB0aGUgZmlsZSBjaGFyYWN0ZXItc2V0IGZvciB0aGUKICAgaW5jb21pbmcgZmlsZSBpcyBVQ1MtMiBpbiBXaW5kb3dzIGFuZCBVVEYtOCBlbHNld2hlcmUuIE90aGVyd2lzZSwKICAgQy1LZXJtaXQgZG9lcyBub3QgbWFrZSBhbnkgZGVmYXVsdCBhc3NvY2lhdGlvbnMgZm9yIFVDUy0yIG9yIFVURi04LAogICBidXQgb2YgY291cnNlIHlvdSBtYXkgYWRkIG9yIGNoYW5nZSBhc3NvY2lhdGlvbnMgdG8gc3VpdCB5b3VyIG5lZWRzCiAgIGFuZCBwcmVmZXJlbmNlcyBieSBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIEFTU09DSUFURSBjb21tYW5kcyBpbgogICB5b3VyIEtlcm1pdCBzdGFydHVwIGZpbGUuIEZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGEgUEMgdXNlciBhbmQgZGVhbAogICBvbmx5IHdpdGggdGV4dCB3cml0dGVuIGluIEdyZWVrIGFuZCBFbmdsaXNoLCB5b3UgY2FuOgoKICBBU1NPQ0lBVEUgVFJBTlNGRVItQ0hBUkFDVEVSLVNFVCBVVEY4IENQODY5CiAgQVNTT0NJQVRFIFRSQU5TRkVSLUNIQVJBQ1RFUi1TRVQgVUNTMiBDUDg2OQogIEFTU09DSUFURSBGSUxFLUNIQVJBQ1RFUi1TRVQgQ1A4NjkgVVRGOAoKICAgTm90ZSB0aGF0IHdoZW4gZmlsZSB0cmFuc2ZlciBpbnZvbHZlcyBjb252ZXJzaW9uIGJldHdlZW4gYSBzaW5nbGUtYnl0ZQogICBjaGFyYWN0ZXIgc2V0IGFuZCBVQ1MtMiBvciBVVEYtOCwgdGhlIGZpbGUtdHJhbnNmZXIgdGhlcm1vbWV0ZXIgYW5kCiAgIGVzdGltYXRlZCB0aW1lIGxlZnQgbWlnaHQgYmUgaW5hY2N1cmF0ZSwgc2luY2UgdGhleSBhcmUgYmFzZWQgb24gdGhlCiAgIHNvdXJjZSBmaWxlIHNpemUsIG5vdCB0aGUgdHJhbnNmZXIgZW5jb2RpbmcuIFRoaXMgaXMgcHVyZWx5IGEgY29zbWV0aWMKICAgaXNzdWUgYW5kIGRvZXMgbm90IGVmZmVjdCB0aGUgZmluYWwgcmVzdWx0LiAoQW5kIGlzIG5vdCwgc3RyaWN0bHkKICAgc3BlYWtpbmcsIGEgYnVnOyBLZXJtaXQgcHJvdG9jb2wgcHJlc2VudGx5IGluY2x1ZGVzIG5vIG1ldGhvZCBmb3IgdGhlCiAgIHNlbmRlciB0byBmdXJuaXNoIGFuICJlc3RpbWF0ZWQgdHJhbnNmZXIgc2l6ZSIgdG8gdGhlIHJlY2VpdmVyLCBhbmQgaW4KICAgYW55IGNhc2UgYW55IHN1Y2ggZ3Vlc3MgY291bGQgYmUgYXMgZmFyIG9mZiBhcyB0aGUgZmlsZSBzaXplLCBnaXZlbgogICB0aGUgbWFueSBvdGhlciBmYWN0b3JzIHRoYXQgY29tZSBpbnRvIHBsYXksIHN1Y2ggYXMgY29tcHJlc3Npb24gYW5kCiAgIHByZWZpeGluZykuCgogICBBIGNhdXRpb24gYWJvdXQgRlRQIGFuZCBVQ1MtMi4gQXMgbm90ZWQgcHJldmlvdXNseSwgaWYgeW91IHRyYW5zZmVyIGEKICAgVUNTLTIgZmlsZSB3aXRoIEZUUCBpbiBiaW5hcnkgbW9kZSBiZXR3ZWVuIHR3byBjb21wdXRlcnMgd2l0aCBvcHBvc2l0ZQogICBFbmRpYW5uZXNzLCB0aGUgcmVzdWx0IHdpbGwgaGF2ZSBpdHMgYnl0ZXMgaW4gdGhlIHdyb25nIG9yZGVyLgogICBIb3dldmVyLCBpZiB5b3UgdXNlIEZUUCB0byB0cmFuc2ZlciBhIFVDUy0yIGZpbGUgaW4gImFzY2lpIiAodGV4dCkKICAgbW9kZSB0byBBTlkgY29tcHV0ZXIsIGV2ZW4gaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHlvdXJzLCB0aGUgcmVzdWx0CiAgIHdpbGwgYmUgY29ycnVwdGVkIGJlY2F1c2UgRlRQJ3MgbGluZS10ZXJtaW5hdG9yIGNvbnZlcnNpb25zIGRvIG5vdAogICBhY2NvdW50IGZvciBVQ1MtMi4gVGhlIHNhbWUgaG9sZHMgd2hlbiBzZW5kaW5nIGZyb20gYSBVQ1MtYXdhcmUgS2VybWl0CiAgIHByb2dyYW0gdG8gYW4gb2xkZXIgS2VybWl0IHByb2dyYW0gaW4gdGV4dCBtb2RlIHdpdGggYSB0cmFuc2ZlcgogICBjaGFyYWN0ZXItc2V0IG9mIFVDUy0yLiBTbyB1c2UgVUNTLTIgYXMgYSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0IE9OTFkKICAgd2l0aCBhIFVDUy0yLWF3YXJlIEtlcm1pdCBwYXJ0bmVyLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNi42LjUuMi4gVGhlIFRSQU5TTEFURSBDb21tYW5kCgogICBJbiBLZXJtaXQgdmVyc2lvbnMgdGhhdCBoYXZlIFVuaWNvZGUgc3VwcG9ydCBpbmNsdWRlZCwgVFJBTlNMQVRFIG5vdwogICBhbHdheXMgZ29lcyB0aHJvdWdoIFVuaWNvZGU7IHRoYXQgaXMsIHRoZSBzb3VyY2Ugc2V0IGlzIGNvbnZlcnRlZCB0bwogICBVQ1MtMiBhbmQgdGhlbmNlIHRvIHRoZSB0YXJnZXQgc2V0LiBUaGlzIGlzIGEgbWFqb3IgaW1wcm92ZW1lbnQsIHNpbmNlCiAgIGluIHByaW9yIHJlbGVhc2VzLCBDLUtlcm1pdCBoYWQgdG8gcGljayB0aGUgIm1vc3QgYXBwcm9wcmlhdGUiCiAgIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQgYXMgdGhlIGludGVybWVkaWF0ZSBzZXQsIGFuZCB0aGlzIHdvdWxkIHJlc3VsdAogICBpbiB0aGUgbG9zcyBvZiBhbnkgY2hhcmFjdGVycyB0aGF0IHRoZSBzb3VyY2UgYW5kIHRhcmdldCBzZXRzIGhhZCBpbgogICBjb21tb24gYnV0IHdlcmUgbGFja2luZyBmcm9tIHRoZSBpbnRlcm1lZGlhdGUgc2V0IChmb3IgZXhhbXBsZSB0aGUgT0UKICAgZGlncmFwaCB3aGVuIHRyYW5zbGF0aW5nIGZyb20gTmVYVCB0byBERUMgTUNTIHRocm91Z2ggTGF0aW4tMSkuIFRoaXMKICAgbmV2ZXIgaGFwcGVucyB3aGVuIFVuaWNvZGUgaXMgdGhlIGludGVybWVkaWF0ZSBzZXQgYmVjYXVzZSBVbmljb2RlIGlzCiAgIGEgc3VwZXJzZXQgb2YgYWxsIG90aGVyIGNoYXJhY3RlciBzZXRzIHN1cHBvcnRlZCBieSBLZXJtaXQuIEEgbW9yZQogICBkcmFtYXRpYyBleGFtcGxlIHdvdWxkIGJlIHRyYW5zbGF0aW9uIGJldHdlZW4gQ3lyaWxsaWMgUEMgY29kZSBwYWdlCiAgIDg2NiBhbmQgS09JOC1SIChbNTQ2XVNlY3Rpb24gNi40KTsgZm9ybWVybHkgYWxsIHRoZSBsaW5lLSBhbmQKICAgYm94LWRyYXdpbmcgY2hhcmFjdGVycyB3b3VsZCBiZSBsb3N0IChzaW5jZSBJU08gODg1OS01IGRvZXMgbm90IGhhdmUKICAgYW55KTsgbm93IHRoZSBvbmVzIHRoYXQgdGhlc2UgdHdvIHNldHMgaGF2ZSBpbiBjb21tb24gYXJlIHByZXNlcnZlZC4KCiAgIFVDUy0yIGFuZCBVVEYtOCBhcmUgbm93IGJvdGggc3VwcG9ydGVkIGFzIHNvdXJjZS1maWxlIGFuZAogICBkZXN0aW5hdGlvbi1maWxlIGNoYXJhY3RlciBzZXRzIGJ5IEMtS2VybWl0J3MgVFJBTlNMQVRFIGNvbW1hbmQsIGZvcgogICBleGFtcGxlOgoKICB0cmFuc2xhdGUgb29mYS50eHQgdWNzMiBsYXRpbjEgb29mYS1sMS50eHQKCiAgIHRyYW5zbGF0ZXMgb29mYS50eHQgZnJvbSBVQ1MtMiB0byBMYXRpbi0xLCBzdG9yaW5nIHRoZSByZXN1bHQgYXMKICAgb29mYS1sMS50eHQuIFNpbWlsYXJseToKCiAgdHJhbnNsYXRlIG9vZmEudHh0IHV0ZjggbGF0aW4xIG9vZmEtbDEudHh0CiAgdHJhbnNsYXRlIG9vZmEudHh0IGxhdGluMSB1Y3MyIG9vZmEtdWNzMi50eHQKICB0cmFuc2xhdGUgb29mYS50eHQgbGF0aW4xIHV0Zjggb29mYS11dGY4LnR4dAogIHRyYW5zbGF0ZSBvb2ZhLnR4dCB1Y3MyIHV0Zjggb29mYS11dGY4LnR4dAogIHRyYW5zbGF0ZSBvb2ZhLnR4dCB1dGY4IHVjczIgb29mYS11Y3MyLnR4dAoKICAgVHJlYXRtZW50IG9mIHRoZSBVQ1MtMiBCT00gaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgZmlsZSB0cmFuc2Zlci4KICAgTm90ZSB0aGF0IGlmIGEgVUNTLTIgc291cmNlIGZpbGUgaXMgaW4gdGhlICJ3cm9uZyIgYnl0ZSBvcmRlciBhbmQKICAgbGFja3MgYSBCT00sIGFuZCB5b3UgZG9uJ3QgdGVsbCBLZXJtaXQgYWJvdXQgaXQgd2l0aCBTRVQgRklMRSBVQ1MKICAgQllURS1PUkRFUiwgdGhlIHJlc3VsdCBvZiB0aGUgdHJhbnNsYXRpb24gaXMgdG90YWwgZ2liYmVyaXNoLiBSZWNhbGwKICAgdGhhdCB5b3UgY2FuIHVzZSBDT1BZIC9TV0FQLUJZVEVTIHRvIHN3aXRjaCB0aGUgYnl0ZSBvcmRlciBvZiBhbgogICBlcnJhbnQgVUNTLTIgZmlsZSAob3IgYW55IG90aGVyIGZpbGUgZm9yIHRoYXQgbWF0dGVyLCBpZiB5b3UgY2FuIHRoaW5rCiAgIG9mIGEgcmVhc29uIHRvKS4gQWxzbyBub3RlIHRoYXQ6CgogIHRyYW5zbGF0ZSBvb2ZhLnR4dCB1Y3MyIHVjczIgbmV3LnR4dAoKICAgUHJvZHVjZXMgYSByZXN1bHQgaW4gdGhlIG5hdGl2ZSAob3IgU0VUIEZJTEUgVUNTKSBieXRlLW9yZGVyIGFzIGxvbmcKICAgYXMgb29mYS50eHQgaGFzIGEgQk9NLgoKICAgQXMgYSBzaWRlIGJlbmVmaXQgb2YgdGhlIFVuaWNvZGUgd29yaywgdGhlIFRSQU5TTEFURSBjb21tYW5kIG5vdyB3b3JrcwogICBmb3IgdGhlIGZpcnN0IHRpbWUgYWxzbyBmb3IgYWxsIEphcGFuZXNlIGNoYXJhY3RlciBzZXRzIHRoYXQgS2VybWl0CiAgIHN1cHBvcnRzLiBJbiBvdGhlciB3b3JkcywgaWYgeW91IGhhdmUgYSBKYXBhbmVzZSB0ZXh0IGZpbGUgaW4gYW55IG9mCiAgIHRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzOgoKICBFVUMtSlAKICBTaGlmdC1KSVMKICBKSVMtNwogIFVDUy0yCiAgVVRGLTgKCiAgIFlvdSBjYW4gdXNlIHRoZSBUUkFOU0xBVEUgY29tbWFuZCB0byBjb252ZXJ0IHRvIGFueSBvdGhlciBlbmNvZGluZwogICBmcm9tIHRoZSBzYW1lIGxpc3QuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA2LjYuNS4zLiBUZXJtaW5hbCBDb25uZWN0aW9uCgogICBUaGUgQ09OTkVDVCBjb21tYW5kIG5vdyBhbGxvd3MgVVRGLTggYXMgYSBsb2NhbCBvciByZW1vdGUgdGVybWluYWwKICAgY2hhcmFjdGVyLXNldDoKCiAgU0VUIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQgeyAuLi4sIFVURjggfSB7IC4uLiwgVVRGOCB9CiAgU0VUIFRFUk1JTkFMIFJFTU9URS1DSEFSQUNURVItU0VUIHsgLi4uLCBVVEY4IH0KICBTRVQgVEVSTUlOQUwgTE9DQUwtQ0hBUkFDVEVSLVNFVCB7IC4uLiwgVVRGOCB9CgogICAoUmVjYWxsIHRoYXQgS2VybWl0J3MgdGVybWluYWwgY2hhcmFjdGVyLXNldCBoYXMgdHdvICJlbmRzIiAtLSB0aGUgc2V0CiAgIHVzZWQgb24gdGhlIGhvc3QgdG8gd2hpY2ggS2VybWl0IGlzIGNvbm5lY3RlZCwgYW5kIHRoZSBzZXQgdXNlZCBvbiB0aGUKICAgbG9jYWwga2V5Ym9hcmQgYW5kIHNjcmVlbi4pCgogICBVQ1MtMiBpcyBub3Qgc3VwcG9ydGVkIGFzIGEgdGVybWluYWwgY2hhcmFjdGVyLXNldCAoZWl0aGVyIGVuZCkgc2luY2UKICAgKGEpIGl0IGlzIG5vdCB1c2VkIHRoYXQgd2F5IGFueXdoZXJlIHRvIG91ciBrbm93bGVkZ2UsIGFuZCAoYikgdGhlCiAgIHByb2JsZW1zIG9mIEVuZGlhbm5lc3MgYW5kIHRoZSBoaWdoIGxpa2VsaWhvb2Qgb2YgbG9zcyBvZgogICBzeW5jaHJvbml6YXRpb24gbWFrZSBpdCBpbXByYWN0aWNhbC4gKFRlbGVjb21tdW5pY2F0aW9ucyBpcwogICBieXRlLW9yaWVudGVkOyBpZiBvbmUgYnl0ZSwgb3IgYW55IG9kZCBudW1iZXIgb2YgYnl0ZXMsIGlzIGxvc3QKICAgYmVjYXVzZSBvZiBidWZmZXIgb3ZlcnJ1bnMsIGNpcmN1aXQgcmVzZXRzLCBldGMgKG9yIGxpa2V3aXNlIGlmIGEKICAgYnVyc3Qgb2Ygbm9pc2UgYXBwZWFycyB0aGF0IHRha2VzIHRoZSBndWlzZSBvZiBhbiBvZGQgbnVtYmVyIG9mCiAgIGJ5dGVzKSwgdGhlIGJ5dGUgb3JkZXIgb2YgdGhlIHN1YnNlcXVlbnQgZGF0YSBzdHJlYW0gd2lsbCBiZQogICBiYWNrd2FyZHM7IHVubGlrZSBVVEYtOCBhbmQgdHJhZGl0aW9uYWwgYnl0ZS1iYXNlZCBjaGFyYWN0ZXIgc2V0cywKICAgVUNTLTIgaXMgbm90ICJzZWxmIHN5bmNocm9uaXppbmciLikKCiAgIFVURi04IGRvZXMgbm90IGhhdmUgYnl0ZS1vcmRlciBvciBzeW5jaHJvbml6YXRpb24gcHJvYmxlbXMgYW5kIGlzCiAgIGdyb3dpbmcgaW4gcG9wdWxhcml0eSBhcyBhIHRlcm1pbmFsIGNoYXJhY3RlciBzZXQgYXMgd2VsbCBhcyBpbiBvdGhlcgogICBhcHBsaWNhdGlvbiBhcmVhcy4gSXQgYWxsb3dzIGEgc2luZ2xlIHRlcm1pbmFsIHNlc3Npb24gdG8gdXNlIG11bHRpcGxlCiAgIHNjcmlwdHMgKFJvbWFuLCBDeXJpbGxpYywgR3JlZWssIGV0Yykgd2l0aG91dCBJU08gMjAyMiBjaGFyYWN0ZXItc2V0CiAgIHN3aXRjaGluZyAod2hpY2ggdGVybWluYWwgZW11bGF0b3JzIGxpa2UgS2VybWl0IDk1IGNhbiBoYW5kbGUgYnV0IGZldwogICBob3N0IGFwcGxpY2F0aW9ucyB1bmRlcnN0YW5kIG9yIHVzZSksIGFuZCBtZXNoZXMgbmljZWx5IHdpdGggdGhlCiAgIFVuaWNvZGUgc2NyZWVuIGZvbnRzIHRoYXQgYXJlIGJlZ2lubmluZyB0byBhcHBlYXIuCgogICBVVEYtOCB3YXMgZmlyc3QgdXNlZCBpbiBQbGFuIDkgYW5kIHNvb24gd2lsbCBiZSBhdmFpbGFibGUgaW4gTGludXguIEl0CiAgIHdpbGwgcHJvYmFibHkgc3ByZWFkIGZyb20gdGhlcmUgKFVuaWNvZGUgaW4gc29tZSBmb3JtIGlzLCBvZiBjb3Vyc2UsCiAgIGFsc28gdXNlZCBpbiBXaW5kb3dzIE5ULCBidXQgb25seSBpbnRlcm5hbGx5IC0tIG5vdCBmb3IgYWNjZXNzIGZyb20KICAgb3V0c2lkZSkuCgogICBUbyB1c2UgVVRGLTggb3IgYW55IG90aGVyIGNoYXJhY3RlciBzZXQgdGhhdCB1c2VzIDgtYml0IGJ5dGVzIGluIHlvdXIKICAgdGVybWluYWwgc2Vzc2lvbiwgYmUgc3VyZSB0byB0ZWxsIEMtS2VybWl0IHRvOgoKICBTRVQgVEVSTUlOQUwgQllURVNJWkUgOAogIFNFVCBDT01NQU5EIEJZVEVTSVpFIDgKICBTRVQgUEFSSVRZIE5PTkUKCiAgIChvciB1c2UgdGhlIHNob3J0Y3V0IGNvbW1hbmQsIEVJR0hUQklULCB3aGljaCBkb2VzIGFsbCB0aHJlZSBhdCBvbmNlKS4KCiAgIEluIGEgc2V0dXAgd2hlcmUgeW91ciBsb2NhbCBLZXJtaXQgcHJvZ3JhbSB1c2VzIGEgc2luZ2xlLWJ5dGUKICAgY2hhcmFjdGVyIHNldCBzdWNoIGFzIFBDIENvZGUgUGFnZSA4NTAgYW5kIHRoZSByZW1vdGUgaG9zdCB1c2VzIFVURi04OgoKICBTRVQgVEVSTSBDSEFSIFVURjggQ1A4NTAKCiAgIG9yOgoKICBTRVQgVEVSTSBSRU1PVEUgQ0hBUiBVVEY4CiAgU0VUIFRFUk0gTE9DQUwgQ0hBUiBDUDg1MAoKICAgYWxsIHdvcmtzIGFzIGV4cGVjdGVkLiBVVEYtOCB0ZXh0IG9uIHRoZSByZW1vdGUgZGlzcGxheXMgY29ycmVjdGx5IG9uCiAgIHlvdXIgc2NyZWVuLCBhbmQgd2hlbiB5b3UgdHlwZSBDUDg1MCBjaGFyYWN0ZXJzLCB0aGV5IGFyZSB0cmFuc2xhdGVkCiAgIHRvIFVURi04IHNlcXVlbmNlcyBmb3IgdHJhbnNtaXNzaW9uLCBhbmQgdGhlIGVjaG8gZnJvbSB0aGUgaG9zdCBpcwogICB0cmFuc2xhdGVkIGZyb20gVVRGLTggYmFjayB0byBDUDg1MC4gVGVsbmV0IG5lZ290aWF0aW9ucyBhbmQKICAgYXV0b2Rvd25sb2FkIHRha2UgcGxhY2UgYmVmb3JlIGFueSBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uIGFuZCB3b3JrCiAgIGFzIGJlZm9yZS4gVGhlIHNlc3Npb24gbG9nIChpZiB0ZXh0IG1vZGUgd2FzIHNlbGVjdGVkIGZvciBpdCkgY29udGFpbnMKICAgb25seSB0aGUgbG9jYWwgdGVybWluYWwgY2hhcmFjdGVyLXNldC4gQW5kIHNvIG9uLgoKICAgS2VybWl0IG1lcmVseSBzdXBwbGllcyB0cmFuc2xhdGlvbnMgZnJvbSBVVEYtOCB0byB5b3VyIGxvY2FsIHRlcm1pbmFsCiAgIGNoYXJhY3Rlci1zZXQgKHRoaXMgaW5jbHVkZXMgdHJlYXRpbmcgVVRGLTggTGluZSBTZXBhcmF0b3IgYW5kCiAgIFBhcmFncmFwaCBzZXBhcmF0b3IgYXMgQ1JMRikuIEhvd2V2ZXIsIEtlcm1pdCBkb2VzIGRvZXMgbm90LCBhdAogICBwcmVzZW50LCBwZXJmb3JtICJjYW5vbmljYWxpemF0aW9uIiBvZiBjb21wb3NlZCBzZXF1ZW5jZXMsIG5vciBkb2VzIGl0CiAgIGF1dG9tYXRpY2FsbHkgZXhlY3V0ZSBiaWRpcmVjdGlvbmFsaXR5IGFsZ29yaXRobXMgZm9yIGRpc3BsYXkgb2YKICAgbWl4ZWQtZGlyZWN0aW9uIHRleHQgKGUuZy4gSGVicmV3IGFuZCBFbmdsaXNoKS4gU3VjaCBwcmVzZW50YXRpb24KICAgaXNzdWVzLCBsaWtlIGFsbCBvdGhlcnMgaW4gdGhlIHRlcm1pbmFsLWhvc3QgcmVnaW1lLCBhcmUgbGVmdCB0byB0aGUKICAgaG9zdC4KCiAgIEJ5IHRoZSB3YXksIEMtS2VybWl0IGFsc28gYWxsb3dzIFVURi04IHRvIGJlIHRoZSBsb2NhbCBlbmQgb2YgdGhlCiAgIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQsIGJ1dCBzbyBmYXIgdGhpcyBjb2RlIGlzIG5vdCB0ZXN0ZWQsIHNpbmNlIHdlCiAgIGRvbid0IGhhdmUgYSBVVEYtOCBjb25zb2xlIG9yIHRlcm1pbmFsIHRvIHdvcmsgd2l0aC4gSG93ZXZlciwgaXQgY2FuCiAgIGJlIHN0YXRlZCB3aXRob3V0IGRvdWJ0IHRoYXQgQy1LZXJtaXQncyBrZXkgbWFwcGluZyB3aWxsIG5vdCB3b3JrIGZvcgogICBVVEYtOCB2YWx1ZXMsIHNpbmNlIChhKSB0aGUga2V5IG1hcCBpcyBpbmRleGVkIGJ5IDgtYml0IGJ5dGUgdmFsdWVzCiAgIGFuZCAoYikgQy1LZXJtaXQgcmVhZHMga2V5c3Ryb2tlcyBhIGJ5dGUgYXQgYSB0aW1lICh0aGVzZSBjb21tZW50cyBkbwogICBub3QgYXBwbHkgdG8gSzk1LCB3aGljaCBoYXMgZGlyZWN0IGFjY2VzcyB0byB0aGUga2V5Ym9hcmQgYW5kIGNhbiByZWFkCiAgICJ3aWRlIiBrZXljb2RlcyBhbmQgdXNlcyB0aGVtIHRvIGluZGV4IGEgIndpZGUiIGtleW1hcCkuCgogICBSZXN0cmljdGlvbnM6IEFzIG5vdGVkLCB0aGUgQ09OTkVDVCBjb21tYW5kIGRvZXMgbm90IHN1cHBvcnQgVUNTLTIgYXMKICAgYSBSRU1PVEUgVEVSTUlOQUwgY2hhcmFjdGVyLXNldC4gTmVpdGhlciBkb2VzIGl0IHN1cHBvcnQgdGhlIEphcGFuZXNlCiAgIHNldHMgRVVDLUpQLCBKSVMtNywgYW5kIFNoaWZ0LUpJUy4gU3VwcG9ydCBmb3IgdGhlIEphcGFuZXNlIHNldHMgKGFuZAogICBwb3NzaWJseSBDaGluZXNlIGFuZCBLb3JlYW4gdG9vKSBtaWdodCBiZSBhZGRlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgogICBTaW5jZSB0aGUgVFJBTlNNSVQgY29tbWFuZCAobmV4dCBzZWN0aW9uKSB1c2VzIHRoZSBzYW1lIFJFTU9URQogICBURVJNSU5BTCBjaGFyYWN0ZXItc2V0cyBhcyB0aGUgQ09OTkVDVCBjb21tYW5kLCBpdCBoYXMgdGhlIHNhbWUKICAgcmVzdHJpY3Rpb25zLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNi42LjUuNC4gVGhlIFRSQU5TTUlUIENvbW1hbmQKCiAgIEFzIGRlc2NyaWJlZCBpbiBDaGFwdGVyIDE1IG9mIFs1NDddVXNpbmcgQy1LZXJtaXQgYW5kIFs1NDhdU2VjdGlvbgogICA0LjIxIG9mIHRoaXMgZG9jdW1lbnQsIHRoZSBUUkFOU01JVCBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHVwbG9hZCBhCiAgIGZpbGUgd2l0aG91dCBwcm90b2NvbCwgbW9yZSBvciBsZXNzIGFzIGlmIHlvdSB3ZXJlIHR5cGluZyBpdCBvbiB5b3VyCiAgIGtleWJvYXJkIHdoaWxlIGNvbm5lY3RlZCB0byB0aGUgaG9zdC4gV2hlbiBUUkFOU01JVHRpbmcgaW4gdGV4dCBtb2RlLAogICB0aGUgZmlsZSdzIGNoYXJhY3RlciBzZXQgaXMgY29udmVydGVkIHRvIHRoZSBob3N0J3MgdW5sZXNzIHlvdSBoYXZlCiAgIFNFVCBURVJNSU5BTCBDSEFSQUNURVItU0VUIFRSQU5TUEFSRU5ULCBvciB5b3UgaW5jbHVkZSB0aGUgbmV3CiAgIFRSQU5TTUlUIHN3aXRjaCwgL1RSQU5TUEFSRU5ULgoKICAgQmVmb3JlIEMtS2VybWl0IDcuMCwgdGhlIGZpbGUgY2hhcmFjdGVyLXNldCB3YXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZQogICBhcyB0aGUgbG9jYWwgZW5kIG9mIHRoZSB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0LCBhbmQgdGhlIFRSQU5TTUlUCiAgIGNvbW1hbmQgdXNlZCB0aGUgc2FtZSB0cmFuc2xhdGlvbnMgYXMgdGhlIENPTk5FQ1QgY29tbWFuZCwgaWdub3JpbmcKICAgdGhlIGZpbGUgY2hhcmFjdGVyLXNldC4KCiAgIEluIEMtS2VybWl0IDcuMCwgdGhhdCBhc3N1bXB0aW9uIChhIHBvb3Igb25lIHRvIGJlZ2luIHdpdGgpIGNhbiBubwogICBsb25nZXIgYmUgbWFkZSwgc2luY2UgVUNTLTIgY2FuIGJlIGEgZmlsZSBjaGFyYWN0ZXItc2V0IGJ1dCBub3QgYQogICB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0LiBTbyBub3cgdGhlIGZpbGUncyBjaGFyYWN0ZXItc2V0IGlzIGdpdmVuIGJ5CiAgIHlvdXIgbW9zdCByZWNlbnQgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCBjb21tYW5kLiBUaGUgaG9zdCdzIGNoYXJhY3RlcgogICBzZXQgaXMgdGhlIHJlbW90ZSBlbmQgb2YgeW91ciBtb3N0IHJlY2VudCBTRVQgVEVSTUlOQUwgQ0hBUkFDVEVSLVNFVAogICBjb21tYW5kOgoKICBTRVQgVEVSTUlOQUwgQ0hBUkFDVEVSLVNFVCByZW1vdGUtc2V0IFsgbG9jYWwtc2V0IF0KCiAgIG9yOgoKICBTRVQgVEVSTUlOQUwgUkVNT1RFLUNIQVJBQ1RFUi1TRVQgcmVtb3RlLXNldAoKICAgVGhlIFRSQU5TTUlUIGNvbW1hbmQgY29udmVydHMgZWFjaCBzb3VyY2UtZmlsZSBjaGFyYWN0ZXIgZnJvbSB0aGUgRklMRQogICBjaGFyYWN0ZXItc2V0IHRvIHRoZSBSRU1PVEUgVEVSTUlOQUwgY2hhcmFjdGVyLXNldCwgYW5kIHRoZW4gdHJhbnNtaXRzCiAgIHRoZSB0cmFuc2xhdGVkIGNoYXJhY3RlcnMgYWNjb3JkaW5nIHRvIHlvdXIgU0VUIFRSQU5TTUlUIHByZWZlcmVuY2VzCiAgIChDaGFwdGVyIDE1KS4KCiAgIElmIHlvdSBoYXZlIFNFVCBUUkFOU01JVCBFQ0hPIE9OLCBhbmQgdGhlIGhvc3QgaXMgZWNob2luZyB0aGUKICAgdHJhbnNtaXR0ZWQgY2hhcmFjdGVycywgdGhlIGVjaG9zIGFyZSBjb252ZXJ0ZWQgZnJvbSB0aGUgcmVtb3RlCiAgIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQgdG8gdGhlIGxvY2FsIHRlcm1pbmFsIGNoYXJhY3Rlci1zZXQuCgogIFsgQSBwaWN0dXJlIHdvdWxkIGhlbHAuLi4gXQoKICAgQ29uZnVzZWQ/IExldCdzIHdvcmsgdGhyb3VnaCBhbiBleGFtcGxlLiBTdXBwb3NlIHlvdXIgbG9jYWwgY29tcHV0ZXIKICAgaXMgYSBOZVhUc3RhdGlvbiwgb24gd2hpY2ggdGV4dCBmaWxlcyBhcmUgZW5jb2RlZCBpbiB0aGUgTmVYVAogICBjaGFyYWN0ZXIgc2V0LCBhbmQgdGhhdCB0aGUgcmVtb3RlIGNvbXB1dGVyIGlzIGEgRGF0YSBHZW5lcmFsIEFWaWlPTiwKICAgd2hpY2ggdXNlcyB0aGUgRGF0YSBHZW5lcmFsIEludGVybmF0aW9uYWwgY2hhcmFjdGVyIHNldC4gRnVydGhlcgogICBzdXBwb3NlIHRoYXQgeW91IGFyZSBsb2dnZWQgaW4gdG8gdGhlIE5lWFQgZnJvbSBhIFZUMjIwIHRlcm1pbmFsIHdoaWNoCiAgIHVzZXMgdGhlIERFQyBNdWx0aW5hdGlvbmFsIGNoYXJhY3RlciBzZXQuCgogICBZb3UgbmVlZCB0byBjb252ZXJ0IHRoZSBmaWxlIGZyb20gTmVYVCBlbmNvZGluZyB0byBERyBlbmNvZGluZyBhbmQKICAgY29udmVydCB0aGUgZWNob2VzIGZyb20gREcgZW5jb2RpbmcgdG8gREVDIGVuY29kaW5nLiBTbyBvbiB0aGUgTmVYVCwKICAgdGVsbCBDLUtlcm1pdCB0bzoKCiAgZWlnaHRiaXQKICBzZXQgZmlsZSBjaGFyYWN0ZXItc2V0IG5leHQKICBzZXQgdGVybSBjaGFyYWN0ZXItc2V0IGRnLWludGVybmF0aW9uYWwgZGVjLW1jcwogIHRyYW5zbWl0IC90ZXh0IG5leHRkYXRhLnR4dAoKICAgKFRoaXMgYXNzdW1lcyB5b3UgaGF2ZSBzb21lIHNvcnQgb2YgY29sbGVjdGlvbiBwcm9jZXNzIGFscmVhZHkgc2V0IHVwCiAgIG9uIHRoZSBEYXRhIEdlbmVyYWwsIHN1Y2ggYXMgYSB0ZXh0IGVkaXRvciBvciB0aGUgdmVuZXJhYmxlICJjYXQgPgogICBmb28iLiBUaGUgRUlHSFRCSVQgY29tbWFuZCBpcyBlcXVpdmFsZW50IHRvIFNFVCBURVJNSU5BTCBCWVRFU0laRSA4LAogICBTRVQgQ09NTUFORCBCWVRFU0laRSA4LCBTRVQgUEFSSVRZIE5PTkUuKQoKICAgVG8gZnVydGhlciBjb21wbGljYXRlIG1hdHRlcnMsIHN1cHBvc2UgeW91ciBsb2NhbCB0ZXJtaW5hbCBjaGFyYWN0ZXIKICAgc2V0IGlzIHRoZSBzYW1lIGFzIHRoZSByZW1vdGUgb25lLCBzbyB5b3UgZG9uJ3QgbmVlZCB0ZXJtaW5hbAogICBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uLCBidXQgeW91IG5lZWQgdG8gVFJBTlNNSVQgYSBmaWxlIHRoYXQgaXMgaW4KICAgYSBkaWZmZXJlbnQgY2hhcmFjdGVyIHNldCBhbmQgeW91IHdhbnQgaXQgdHJhbnNsYXRlZCB0byB0aGUgaG9zdCBzZXQuCiAgIEluIHRoaXMgY2FzZSwgdXNlIFNFVCBURVJNIENIQVJBQ1RFUi1TRVQgdG8gYWN0dWFsbHkgc3BlY2lmeSB0aGUKICAgY2hhcmFjdGVyIHNldCB1c2VkIG9uIGVhY2ggZW5kLCByYXRoZXIgdGhhbiBzcGVjaWZ5aW5nIFRSQU5TUEFSRU5UOgoKICBlaWdodGJpdAogIHNldCBmaWxlIGNoYXJhY3Rlci1zZXQgdWNzMgogIHNldCB0ZXJtIGNoYXJhY3Rlci1zZXQgbGF0aW4xIGxhdGluMQogIHRyYW5zbWl0IC90ZXh0IHVjczJkYXRhLnR4dAoKICAgVGhlIGRpc3RpbmN0aW9uIGJldHdlZW46CgogIFNFVCBURVJNSU5BTCBDSEFSQUNURVItU0VUIHh4eCB5eXkKCiAgICh3aGVyZSB4eHggYW5kIHl5eSBhcmUgdGhlIHNhbWUgc2V0KSBhbmQ6CgogIFNFVCBURVJNSU5BTCBDSEFSQUNURVItU0VUIFRSQU5TUEFSRU5UCgogICBpcyBuZXcgdG8gQy1LZXJtaXQgNy4wLCBidXQgYWZmZWN0cyBvbmx5IHRoZSBUUkFOU01JVCBjb21tYW5kLgoKICAgVGhlIFRSQU5TTUlUIGNvbW1hbmQgY3VycmVudGx5IGRvZXMgbm90aGluZyBzcGVjaWFsIHdpdGggVUNTLTIvVVRGLTgKICAgTGluZSBhbmQgUGFyYWdyYXBoIFNlcGFyYXRvciBjaGFyYWN0ZXJzOyBtb3JlIGV4cGVyaWVuY2UgaXMgcmVxdWlyZWQKICAgdG8gZmluZCBvdXQgaG93IHRoZXNlIGJlaGF2ZSBpbiBhIGdlbnVpbmUgVW5pY29kZSB0ZXJtaW5hbC1ob3N0CiAgIHNldHRpbmcuCgogICBSZXN0cmljdGlvbnM6IEFzIG5vdGVkLCB0aGUgVFJBTlNNSVQgY29tbWFuZCB0cmFuc2xhdGVzIGZyb20gdGhlIEZJTEUKICAgY2hhcmFjdGVyLXNldCB0byB0aGUgUkVNT1RFIFRFUk1JTkFMIGNoYXJhY3Rlci1zZXQuIFRoaXMgcnVsZXMgb3V0CiAgIHRyYW5zbGF0aW9ucyB0byBhbnkgY2hhcmFjdGVyIHNldCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYXMgYSBSRU1PVEUKICAgVEVSTUlOQUwgY2hhcmFjdGVyLXNldCwgc3VjaCBhcyBVQ1MtMiwgRVVDLUpQLCBKSVMtNywgYW5kIFNoaWZ0LUpJUy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDYuNi41LjUuIFN1bW1hcnkgb2YgS2VybWl0IFVuaWNvZGUgQ29tbWFuZHMKCiAgIFNwZWNpZnlpbmcgZmlsZSBjaGFyYWN0ZXItc2V0IGFuZCBieXRlIG9yZGVyOgogICAgICAgICAgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCB7IC4uLiwgVUNTMiwgVVRGOCB9CiAgICAgICAgICBSRU1PVEUgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVCB7IC4uLiwgVUNTMiwgVVRGOCB9IChTZWUgbmV4dAogICAgICAgICAgc2VjdGlvbikKICAgICAgICAgIFNFVCBGSUxFIFVDUyBCT00geyBPTiwgT0ZGIH0KICAgICAgICAgIFNFVCBGSUxFIFVDUyBCWVRFLU9SREVSIHsgQklHLUVORElBTiwgTElUVExFLUVORElBTiB9CgogICBTcGVjaWZ5aW5nIHRoZSB0cmFuc2ZlciBjaGFyYWN0ZXItc2V0OgogICAgICAgICAgU0VUIFRSQU5TRkVSIENIQVJBQ1RFUi1TRVQgeyAuLi4sIFVDUy0yLCBVVEYtOCB9CiAgICAgICAgICBSRU1PVEUgU0VUIFRSQU5TRkVSIENIQVJBQ1RFUi1TRVQgeyAuLi4sIFVDUy0yLCBVVEYtOCB9CgogICBTcGVjaWZ5aW5nIHRoZSB0ZXJtaW5hbCBjaGFyYWN0ZXItc2V0OgogICAgICAgICAgU0VUIFRFUk1JTkFMIENIQVJBQ1RFUi1TRVQgeyAuLi4sIFVURjggfSB7IC4uLiwgVVRGOCB9CiAgICAgICAgICBTRVQgVEVSTUlOQUwgUkVNT1RFLUNIQVJBQ1RFUi1TRVQgeyAuLi4sIFVURjggfQogICAgICAgICAgU0VUIFRFUk1JTkFMIExPQ0FMLUNIQVJBQ1RFUi1TRVQgeyAuLi4sIFVURjggfQoKICAgRGlzcGxheWluZyBzZXR0aW5nczoKICAgICAgICAgIFNIT1cgRklMRQogICAgICAgICAgU0hPVyBUUkFOU0ZFUgogICAgICAgICAgU0hPVyBURVJNSU5BTAogICAgICAgICAgU0hPVyBDSEFSQUNURVItU0VUUwoKICAgQ29tbWFuZHMgdGhhdCB1c2UgdGhlc2Ugc2V0dGluZ3MgaW5jbHVkZToKICAgICAgICAgIFNFTkQsIFJFQ0VJVkUsIEdFVCwgZXRjLgogICAgICAgICAgQ09OTkVDVAogICAgICAgICAgVFJBTlNNSVQKICAgICAgICAgIExPRyBTRVNTSU9OCgogICBDb252ZXJ0aW5nIGZpbGVzOgogICAgICAgICAgVFJBTlNMQVRFIGluZmlsZSB7IC4uLiwgVUNTLTIsIFVURi04IH0geyAuLi4sIFVDUy0yLCBVVEYtOCB9CiAgICAgICAgICBvdXRmaWxlCiAgICAgICAgICBDT1BZIC9TV0FQLUJZVEVTIGluZmlsZSBvdXRmaWxlCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNi43LiBDbGllbnQvU2VydmVyIENoYXJhY3Rlci1TZXQgU3dpdGNoaW5nCgogICBBIHNpbXBsZSBtZWNoYW5pc20gaGFzIGJlZW4gYWRkZWQgdG8gYWxsb3cgdGhlIGNsaWVudCB0byBjaGFuZ2UgdGhlCiAgIHNlcnZlcidzIEZJTEUgQ0hBUkFDVEVSLVNFVDoKCiAgIFJFTU9URSBTRVQgRklMRSBDSEFSQUNURVItU0VUIG5hbWUKICAgICAgICAgIFRoZSBjbGllbnQgYXNrcyB0aGUgc2VydmVyIHRvIGNoYW5nZSBpdHMgZmlsZSBjaGFyYWN0ZXItc2V0IHRvCiAgICAgICAgICB0aGUgb25lIGdpdmVuLiBUaGUgbmFtZSBtdXN0IG1hdGNoIG9uZSBvZiB0aGUgc2VydmVyJ3MgZmlsZQogICAgICAgICAgY2hhcmFjdGVyLXNldCBuYW1lcy4gRm9yIGNvbnZlbmllbmNlLCBDLUtlcm1pdCB1c2VzIGl0cyBvd24KICAgICAgICAgIGZpbGUgY2hhcmFjdGVyLXNldCBrZXl3b3JkIGxpc3QgZm9yIHBhcnNpbmcgdGhpcyBjb21tYW5kIHNvIHlvdQogICAgICAgICAgY2FuIHVzZSA/IGZvciBoZWxwIGFuZCBUYWIgb3IgRXNjIGZvciBjb21wbGV0aW9uLiBIb3dldmVyLAogICAgICAgICAgc2luY2UgdGhlIHNlcnZlciBtaWdodCBoYXZlIGEgZGlmZmVyZW50IHJlcGVydG9pcmUgKG9yIGV2ZW4gdXNlCiAgICAgICAgICBkaWZmZXJlbnQgbmFtZXMgZm9yIHRoZSBzYW1lIHNldHMpLCBDLUtlcm1pdCBhY2NlcHRzIGFueSBzdHJpbmcKICAgICAgICAgIHlvdSBzdXBwbHkgYW5kIHNlbmRzIGl0IHRvIHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIsIGlmIGl0CiAgICAgICAgICBzdXBwb3J0cyB0aGlzIGNvbW1hbmQgKEMtS2VybWl0IDcuMCBhbmQgSzk1IDEuMS4xOSBkbyksIHNldHMKICAgICAgICAgIGl0cyBmaWxlIGNoYXJhY3Rlci1zZXQgYXMgcmVxdWVzdGVkLCBhbmQgYWxzbyBkaXNhYmxlcwogICAgICAgICAgYXV0b21hdGljIGNoYXJhY3Rlci1zZXQgc3dpdGNoaW5nIChbNTQ5XVNlY3Rpb24gNi41KS4gSWYgdGhlCiAgICAgICAgICBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCB0aGlzIGNvbW1hbmQgb3IgaWYgaXQgZG9lcyBub3Qgc3VwcG9ydAogICAgICAgICAgdGhlIGdpdmVuIGNoYXJhY3RlciBzZXQsIHRoZSBSRU1PVEUgU0VUIEZJTEUgQ0hBUkFDVEVSLVNFVAogICAgICAgICAgY29tbWFuZCBmYWlscy4KCiAgIEhlcmUncyBhbiBleGFtcGxlIHRoYXQgc2VuZHMgYSBKYXBhbmVzZSB0ZXh0IGZpbGUgZW5jb2RlZCBpbiBTaGlmdC1KSVMKICAgdG8gYSBzZXJ2ZXIgdXNpbmcgZXZlcnkgY29tYmluYXRpb24gb2YgS2VybWl0J3MgSmFwYW5lc2UtY2FwYWJsZSBmaWxlCiAgIGFuZCB0cmFuc2ZlciBjaGFyYWN0ZXIgc2V0czoKCiAgZGNsIFwmeFtdID0gZXVjIHVjczIgdXRmOCAgICAgICAgICAgICA7IHRyYW5zZmVyIGNoYXJhY3Rlci1zZXRzCiAgZGNsIFwmeVtdID0gZXUgdWMgdXQgICAgICAgICAgICAgICAgICA7IDItbGV0dGVyIGFiYnJldmlhdGlvbnMgZm9yIHRoZW0KICBkY2wgXCZmW10gPSBzaGlmdCBldWMgamlzNyB1Y3MyIHV0ZjggIDsgZmlsZSBjaGFyYWN0ZXItc2V0cwogIGRjbCBcJmdbXSA9IHNqIGV1IGo3IHVjIHV0ICAgICAgICAgICAgOyAyLWxldHRlciBhYmJyZXZpYXRpb25zCgogIHNldCBmaWxlIGNoYXIgc2hpZnQtamlzICAgICAgICAgICAgICAgOyBsb2NhbCBmaWxlIGNoYXJhY3Rlci1zZXQgaXMgU2hpZnQtSklTCiAgZm9yIFwlaSAxIFxmZGltKCZ4KSAxIHsgICAgICAgICAgICAgICA7IGZvciBlYWNoIHRyYW5zZmVyIGNoYXJhY3Rlci1zZXQuLi4KICAgICAgc2V0IHhmZXIgY2hhciBcJnhbXCVpXSAgICAgICAgICAgIDsgc2V0IGl0CiAgICAgIGZvciBcJWogMSBcZmRpbSgmZikgMSB7ICAgICAgICAgICA7IGZvciBlYWNoIHJlbW90ZSBmaWxlIGNoYXJhY3Rlci1zZXQuLi4KICAgICAgICAgIHJlbW90ZSBzZXQgZmlsZSBjaGFyIFwmZltcJWpdIDsgc2V0IGl0CiAgICAgICAgICBpZiBmYWlsIGV4aXQgMSBTRVJWRVIgUkVKRUNURUQgQ0hBUlNFVAogICAgICAgICAgc2VuZCAvdGV4dCBtZWliby1zai5odG1sIG1laWJvLXNqLVwmeVtcJWldLVwmZ1tcJWpdLnR4dCA7IHNlbmQgdGhlIGZpCmxlCiAgICAgICAgICBpZiBmYWlsIGV4aXQgMSBUUkFOU0ZFUiBGQUlMRUQKICAgICAgfQogIH0KCiAgIFRoZSBLZXJtaXQtMzcwIHNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IFJFTU9URSBTRVQgRklMRSBDSEFSQUNURVItU0VULAogICBidXQgc2luY2UgaXQgc3VwcG9ydHMgUkVNT1RFIEtFUk1JVCBjb21tYW5kcywgeW91IGNhbiBnZXQgdGhlIHNhbWUKICAgZWZmZWN0IHdpdGggUkVNT1RFIEtFUk1JVCBTRVQgRklMRSBDSEFSQUNURVItU0VUIG5hbWUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy4gU0NSSVBUIFBST0dSQU1NSU5HCgogICAoQWxzbyBzZWUgWzU1MF1TZWN0aW9uIDIuOCwgU2NyaXB0aW5nIExvY2FsIFByb2dyYW1zLikKCiAgNy4wLiBCdWcgRml4ZXMKCiAgIFRoZSBmb2xsb3dpbmcgc2NyaXB0IHByb2dyYW1taW5nIGJ1Z3Mgd2VyZSBmaXhlZCBpbiBDLUtlcm1pdCA3LjA6CgogICAgICogSUYgRVhJU1QgYW5kIElGIERJUkVDVE9SWSB3ZXJlIGZpeGVkIHRvIHByb3Blcmx5IHN0cmlwIGJyYWNlcyBmcm9tCiAgICAgICBhcm91bmQgdGhlaXIgYXJndW1lbnRzLCBzbyAiaWYgZGlyZWN0b3J5IHtDOlxQcm9ncmFtIEZpbGVzfSIsIGV0YywKICAgICAgIHdvdWxkIHdvcmsgYXMgZXhwZWN0ZWQuIEhvd2V2ZXIsIHRoaXMgbWVhbnMgdGhhdCBpZiB0aGUgZmlsZSBvcgogICAgICAgZGlyZWN0b3J5IG5hbWUgaXMgYWN0dWFsbHkgZW5jbG9zZWQgaW4gYnJhY2VzLCB0aGUgYnJhY2VzIG11c3QgYmUKICAgICAgIGRvdWJsZWQuCiAgICAgKiBUaGUgUkVBRCBjb21tYW5kIGRpZCBub3QgZmFpbCBpZiB0aGUgUkVBRCBmaWxlIHdhc24ndCBvcGVuOyBub3cgaXQKICAgICAgIGRvZXMuCiAgICAgKiBUaGUgUkVBRCBjb21tYW5kIHJlZnVzZWQgdG8gcmVhZCB0aGUgbGFzdCBvciBvbmx5IGxpbmUgb2YgYSBmaWxlCiAgICAgICBpZiBpdCBkaWQgbm90IGVuZCB3aXRoIGEgcHJvcGVyIGxpbmUgdGVybWluYXRvcjsgbm93IGl0IGRvZXMuCiAgICAgKiBUaGUgRU5EIGNvbW1hbmQsIHdoZW4gZ2l2ZW4gZnJvbSB3aXRoaW4gYSBTV0lUQ0ggc3RhdGVtZW50LCBkaWQKICAgICAgIG5vdCBleGl0IGZyb20gdGhlIGN1cnJlbnQgbWFjcm8gb3IgY29tbWFuZCBmaWxlOyBpbnN0ZWFkIGl0IGp1c3QKICAgICAgIHRlcm1pbmF0ZWQgdGhlIFNXSVRDSC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjEuIFRoZSBJTlBVVCBDb21tYW5kCgogICA3LjEuMS4gSU5QVVQgVGltZW91dHMKCiAgIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgSU5QVVQgY29tbWFuZCBvbiBwYWdlIDQyMiBmYWlscyB0byBtZW50aW9uIHRoZQogICBmb2xsb3dpbmcgdHdvIHBvaW50cyBhYm91dCB0aGUgdGltZW91dCAod2hpY2ggYXBwbHkgdG8gQy1LZXJtaXQgNi4wCiAgIGFuZCBsYXRlcik6CgogICAgMS4gIklOUFVUIC0xIHRleHQiIChvciAiSU5QVVQgXCV4IHRleHQiLCB3aGVyZSBcJXggaXMgYW55IHZhcmlhYmxlCiAgICAgICB3aG9zZSB2YWx1ZSBpcyAtMSBvciBsZXNzKSBtZWFucyAid2FpdCBmb3JldmVyIi4gVGhpcyBmb3JtIG9mIHRoZQogICAgICAgSU5QVVQgY29tbWFuZCBmYWlscyBvbmx5IGlmIGl0IGlzIGludGVycnVwdGVkLCBzaW5jZSBpdCB3aWxsIG5ldmVyCiAgICAgICB0aW1lIG91dC4KICAgIDIuIElOUFVUIDAgcGVyZm9ybXMgYSBub25ibG9ja2luZyByZWFkIG9mIG1hdGVyaWFsIHRoYXQgaGFzIGFscmVhZHkKICAgICAgIGFycml2ZWQgYnV0IGhhcyBub3QgeWV0IGJlZW4gcmVhZCwgYW5kIHN1Y2NlZWRzIGltbWVkaWF0ZWx5IGlmIHRoZQogICAgICAgdGFyZ2V0IHN0cmluZyBpcyBmb3VuZCwgb3IgZmFpbHMgaW1tZWRpYXRlbHkgaWYgaXQgaXMgbm90IGZvdW5kLgoKICAgVGhlIHNhbWUgcG9pbnRzIGFwcGx5IHRvIE1JTlBVVC4gUkVJTlBVVCBpZ25vcmVzIGl0cyB0aW1lb3V0CiAgIHBhcmFtZXRlci4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDcuMS4yLiBOZXcgSU5QVVQgQ29udHJvbHMKCiAgIFRoZSBmb2xsb3dpbmcgbmV3IElOUFVUIGNvbnRyb2xzIHdlcmUgYWRkZWQgaW4gdmVyc2lvbiA3LjA6CgogICBTRVQgSU5QVVQgQVVUT0RPV05MT0FEIHsgT04sIE9GRiB9CiAgICAgICAgICBFeHBsYWluZWQgaW4gWzU1MV1TZWN0aW9uIDcuNy4KCiAgIFNFVCBJTlBVVCBDQU5DRUxMQVRJT04geyBPTiwgT0ZGIH0KICAgICAgICAgIFRoaXMgZ292ZXJucyB3aGV0aGVyIGFuIElOUFVUIGNvbW1hbmQgY2FuIGJlIGNhbmNlbGVkIGJ5CiAgICAgICAgICAicHJlc3NpbmcgYW55IGtleSIgb24gdGhlIGtleWJvYXJkLiBOb3JtYWxseSBpdCBjYW4gYmUsIGluCiAgICAgICAgICB3aGljaCBjYXNlIHRoZSBJTlBVVCBjb21tYW5kIGZhaWxzIGltbWVkaWF0ZWx5IGFuZCBcdihpbnN0YXR1cykKICAgICAgICAgIGlzIHNldCB0byAyLCBpbmRpY2F0aW5nIGludGVycnVwdGlvbi4gU0VUIElOUFVUIENBTkNFTExBVElPTgogICAgICAgICAgT0ZGIGRpc2FibGVzIGtleWJvYXJkIGNhbmNlbGxhdGlvbnM7IHRodXMgaWYgdGhlIHNlYXJjaCB0ZXh0IGlzCiAgICAgICAgICBub3QgZW5jb3VudGVyZWQsIHRoZSBJTlBVVCBjb21tYW5kIHdpbGwgcnVuIGZvciBpdHMgZW50aXJlCiAgICAgICAgICB0aW1lb3V0IGludGVydmFsLiBTRVQgSU5QVVQgQ0FOQ0VMTEFUSU9OIE9GRiBkb2VzIG5vdCBkaXNhYmxlCiAgICAgICAgICBpbnRlcnJ1cHRpb24gYnkgQ3RybC1DLCBob3dldmVyOyBldmVyeSBjb21tYW5kIG5lZWRzIGFuCiAgICAgICAgICBlbWVyZ2VuY3kgZXhpdC4gKElmIHlvdSByZWFsbHkgd2FudCB0byBkaXNhYmxlIGludGVycnVwdGlvbiBieQogICAgICAgICAgQ3RybC1DLCB1c2UgU0VUIENPTU1BTkQgSU5URVJSVVBUSU9OIE9GRi4pCgogICBBbHNvIHNlZSBbNTUyXVNlY3Rpb24gNy4yIGZvciBhbnkgbmV3IHZhcmlhYmxlcyByZWxhdGVkIHRvIElOUFVULgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNy4xLjMuIElOUFVUIHdpdGggUGF0dGVybiBNYXRjaGluZwoKICAgQy1LZXJtaXQgNy4wIGFsbG93cyBJTlBVVCwgTUlOUFVULCBhbmQgUkVJTlBVVCB0YXJnZXRzIHRvIGJlIGEgcGF0dGVybgogICAoZXhwbGFpbmVkIGluIFs1NTNdU2VjdGlvbnMgMS4xOSBhbmQgWzU1NF00LjkpLiBUaGlzIHNvbHZlcyBhCiAgIGxvbmctc3RhbmRpbmcgcHJvYmxlbSBpbGx1c3RyYXRlZCBieSB0aGUgZm9sbG93aW5nIHNjZW5hcmlvOiBhIGNlcnRhaW4KICAgY29tcGFueSBoYXMgYSBiYW5rIG9mIFRDUC9JUCBtb2RlbSBzZXJ2ZXJzLCB3aXRoIGhvc3RuYW1lcyBzZXJ2ZXIxLAogICBzZXJ2ZXIyLCBzZXJ2ZXIzLCBhbmQgc28gb24uIEVhY2ggc2VydmVyJ3MgcHJvbXB0IGlzIGl0cyBuYW1lLAogICBmb2xsb3dlZCBieSBhIGNvbG9uICg6KSwgZm9yIGV4YW1wbGUgIlNlcnZlcjcyOiIuIFdpdGhvdXQgSU5QVVQKICAgcGF0dGVybnMsIGl0IHdvdWxkIGJlIHJhdGhlciBkaWZmaWN1bHQgdG8gd2FpdCBmb3IgdGhlIHByb21wdC4gVGhlCiAgIGJydXRlIGZvcmNlIGFwcHJvYWNoOgoKICBtaW5wdXQgMjAgU2VydmVyMTogU2VydmVyMjogU2VydmVyMzogLi4uIChlbnVtZXJhdGluZyBlYWNoIG9uZSkKCiAgIGlzIHN1YmplY3QgdG8gZmFpbHVyZSB3aGVuZXZlciBhIG5ldyBzZXJ2ZXIgaXMgYWRkZWQuIEEgbW9yZSBzdWJ0bGUKICAgYXBwcm9hY2g6CgogIGlucHV0IDIwIFNlcnZlcgogIGlmIGZhaWwgLi4uCiAgaW5wdXQgMiA6CgogICBpcyBsaWFibGUgdG8gZmFsc2UgcG9zaXRpdmVzLCBlLmcuICJXZWxjb21lIHRvIHRoZSBYWVogQ29ycCBNb2RlbQogICBTZXJ2ZXIuIFBsZWFzZSByZWFkIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToiLi4uCgogICBXaXRoIHBhdHRlcm5zLCB5b3UgY2FuIG1hdGNoIHRoZSBwcm9tcHQgd2l0aCAiU2VydmVyKjoiICh3aGljaCBkb2Vzbid0CiAgIHNvbHZlIHRoZSAiZmFsc2UgcG9zaXRpdmVzIiBwcm9ibGVtLCBidXQgY2VydGFpbmx5IGlzIG1vcmUgY29tcGFjdAogICB0aGFuIHRoZSBicnV0ZSBmb3JjZSBtZXRob2QpLCBvciB3aXRoIG1vcmUgc3BlY2lmaWMgcGF0dGVybnMgc3VjaCBhcwogICAiU2VydmVyWzEtOV06IiBhbmQgIlNlcnZlclsxLTldWzAtOV06Iiwgb3IgZXF1aXZhbGVudGx5OgoKICBTZXJ2ZXJ7WzEtOV0sWzEtOV1bMC05XX06CgogICBtZWFuaW5nIHRoZSB3b3JkICJTZXJ2ZXIiIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIGRpZ2l0ICgxLTkpIG9yIGJ5IHR3bwogICBkaWdpdHMgcmVwcmVzZW50aW5nIGEgbnVtYmVyIGZyb20gMSB0byA5OSwgZm9sbG93ZWQgYnkgYSBjb2xvbi4KCiAgIElOUFVUIHBhdHRlcm4gbWF0Y2hpbmcgaGFzIGJlZW4gYWRkZWQgaW4gYSB3YXkgdGhhdCBkb2VzIG5vdCBpbnRlcmZlcmUKICAgd2l0aCBleGlzdGluZyBzY3JpcHRzLiBObyBuZXcgY29tbWFuZHMgb3Igc3dpdGNoZXMgYXJlIHVzZWQuIFRoZQogICBzaW1wbGUgcnVsZSBpczogaWYgYW4gSU5QVVQgc2VhcmNoIHRhcmdldCBpcyB0aGUgYXJndW1lbnQgb2YgdGhlIChuZXcpCiAgIFxmcGF0dGVybigpIGZ1bmN0aW9uLCBpdCBpcyBhIHBhdHRlcm4uIE90aGVyd2lzZSBpdCBpcyB0YWtlbgogICBsaXRlcmFsbHksIGFzIGJlZm9yZS4gRm9yIGV4YW1wbGU6CgogIGlucHV0IDUgYSpiCgogICBzZWFyY2hlcyBmb3IgYW4gJ2EnIGZvbGxvd2VkIGJ5IGFuIGFzdGVyaXNrICgnKicpLCBmb2xsb3dlZCBieSBhICdiJy4KICAgQnV0OgoKICBpbnB1dCA1IFxmcGF0dGVybihhKmIpCgogICBzZWFyY2hlcyBmb3IgYW4gJ2EnIGZvbGxvd2VkIGJ5IGFueXRoaW5nIGF0IGFsbCB1cCB0byBhbmQgaW5jbHVkaW5nCiAgIHRoZSBmaXJzdCAnYicuIFRoaXMgbWVhbnMgdGhhdCBhbnkgc2VhcmNoIHRhcmdldCB0byBJTlBVVCwgTUlOUFVULCBvcgogICBSRUlOUFVUIGNhbiBiZSBhIHBhdHRlcm4gb3IgYSBsaXRlcmFsIHN0cmluZywgYW5kIGluIHBhcnRpY3VsYXIgdGhhdAogICBNSU5QVVQgY2FuIGFjY29tbW9kYXRlIGFueSBtaXh0dXJlIG9mIHBhdHRlcm5zIGFuZCBsaXRlcmFsIHN0cmluZ3MuCgogICBJbiBzZWxlY3RpbmcgcGF0dGVybnMsIG5vdGUgdGhhdDoKCiAgICAgKiBBIGxlYWRpbmcgJyonIGlzIGFsd2F5cyBpbXBsaWVkIHNvIHRoZXJlIGlzIG5vIG5lZWQgdG8gaW5jbHVkZQogICAgICAgb25lLgogICAgICogQSB0cmFpbGluZyAnKicgaXMgbWVhbmluZ2xlc3MgYW5kIGlnbm9yZWQuCiAgICAgKiBBICcqJyBieSBpdHNlbGYgbWF0Y2hlcyB0aGUgZmlyc3QgY2hhcmFjdGVyIHRoYXQgYXJyaXZlcy4KCiAgIEEgc3ludGF4IG5vdGU6IElmIHlvdXIgcGF0dGVybiBpcyBhIHNlbGVjdGlvbiBsaXN0LCBtZWFuaW5nIGEgbGlzdCBvZgogICBhbHRlcm5hdGl2ZXMgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgZW5jbG9zZWQgaW4gYnJhY2VzLCB0aGVuIHRoZQogICBvdXRlciBicmFjZXMgd2lsbCBiZSBzdHJpcHBlZCBieSB2YXJpb3VzIGxldmVscyBvZiBwYXJzZXJzLCBzbyB5b3UKICAgbXVzdCBpbmNsdWRlIHRocmVlIG9mIGVhY2g6CgogIGlucHV0IDEwIFxmcGF0dGVybih7e3thYmMsbW5vLHh5en19fSkKCiAgIE5vdGUgdGhhdCB0aGlzIGlzIGVxdWl2YWxlbnQgdG86CgogIG1pbnB1dCAxMCBhYmMgbW5vIHh5egoKICAgZXhjZXB0IGZvciB0aGUgc2V0dGluZyBvZiB0aGUgXHYobWlucHV0KSB2YXJpYWJsZS4KCiAgIEFuZCBhIGNhdXRpb246IElOUFVUIHBhdHRlcm4gbWF0Y2hpbmcgaGFzIGEgbGltaXRhdGlvbiB0aGF0IHlvdQogICBwcm9iYWJseSBuZXZlciBub3RpY2VkIHdpdGggbGl0ZXJhbC1zdHJpbmcgbWF0Y2hpbmcsIG5hbWVseSB0aGF0IHRoZXJlCiAgIGlzIGEgbGltaXQgb24gdGhlIHNpemUgb2YgdGhlIG1hdGNoLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHBhdHRlcm4gaXMKICAgImEqYiIsIHRoZSBtYXRjaCB3aWxsIHN1Y2NlZWQgaWYgdGhlICdhJyBhbmQgJ2InIGFyZSBub3Qgc2VwYXJhdGVkIGJ5CiAgIG1vcmUgdGhhbiAoc2F5KSA4SyBieXRlcywgYnV0IHdpbGwgZmFpbCBpZiB0aGV5IGFyZSBmYXJ0aGVyIGFwYXJ0IHRoYW4KICAgdGhhdC4gSW4gc3VjaCBjYXNlcywgaXQgYmV0dGVyIHRvIHVzZSB0d28gSU5QVVRzIChlLmcuICJpbnB1dCAxMCBhIgogICBhbmQgdGhlbiAiaW5wdXQgMTAwIGIiKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDcuMS40LiBUaGUgSU5QVVQgTWF0Y2ggUmVzdWx0CgogICBUaGUgcmVzdWx0IG9mIGFueSBJTlBVVCwgTUlOUFVULCBvciBSRUlOUFVUIGNvbW1hbmQsIG5vIG1hdHRlciB3aGV0aGVyCiAgIHRoZSBzZWFyY2ggdGFyZ2V0cyBhcmUgcGF0dGVybnMgb3IgbGl0ZXJhbCBzdHJpbmdzLCBpcyBhdmFpbGFibGUgaW4KICAgdGhlIG5ldyBcdihpbm1hdGNoKSB2YXJpYWJsZS4gRm9yIGV4YW1wbGU6CgogIG1pbnB1dCAxMCBjYXQgXGZwYXR0ZXJuKFtkaF1vZykKICBpZiBzdWNjZXNzIGVjaG8gTUlOUFVUIG1hdGNoZWQgIlx2KGlubWF0Y2gpIgoKICAgVGhpcyBpcyBlc3BlY2lhbGx5IHVzZWZ1bCB3aGVuIGEgcGF0dGVybiB3YXMgbWF0Y2hlZCwgc2luY2UgaXQgbWFrZXMKICAgdGhlIHN0cmluZyB0aGF0IG1hdGNoZWQgdGhlIHBhdHRlcm4gYXZhaWxhYmxlIHRvIEtlcm1pdDsgdGhlcmUgd291bGQKICAgYmUgbm8gd2F5IHRvIGdldCBpdCBvdGhlcndpc2UuCgogICBBZnRlciBhbiBJTlBVVCBjb21tYW5kLCB5b3UgY2FuIHZpZXcgYWxsIHRoZSBJTlBVVC1yZWxhdGVkIHZhcmlhYmxlcwogICBieSB0eXBpbmcgInNob3cgdmFyaWFibGVzIGluIiAoYWJicmV2aWF0ZSBhcyAic2hvIHZhciBpbiIpLCB3aGljaAogICBzaG93cyB0aGUgdmFsdWVzIG9mIGFsbCBidWlsdC1pbiB2YXJpYWJsZXMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aAogICAiaW4iLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDcuMi4gTmV3IG9yIEltcHJvdmVkIEJ1aWx0LUluIFZhcmlhYmxlcwoKICAgXHYoYmxvY2tjaGVjaykKICAgICAgICAgIEN1cnJlbnQgQkxPQ0stQ0hFQ0sgc2V0dGluZywgMSwgMiwgMywgb3IgNC4gNCBpcyB0aGUgY29kZSBmb3IKICAgICAgICAgIEJMQU5LLUZSRUUtMi4KCiAgIFx2KGJ5dGVvcmRlcikKICAgICAgICAgIFRoZSBtYWNoaW5lJ3MgYnl0ZSBvcmRlcjogMCA9IEJpZyBFbmRpYW4sIDEgPSBMaXR0bGUgRW5kaWFuLgoKICAgXHYoY21kYnVmc2l6ZSkKICAgICAgICAgIFRoZSBsZW5ndGggb2YgdGhlIGNvbW1hbmQgYnVmZmVyLCB3aGljaCBpcyB0aGUgbWF4aW11bSBzaXplIGZvcgogICAgICAgICAgYSBtYWNybywgYSBjb21tYW5kLCBhIHZhcmlhYmxlLCBvciBhbnl0aGluZyBlbHNlIGluIEMtS2VybWl0J3MKICAgICAgICAgIHNjcmlwdCBsYW5ndWFnZS4KCiAgIFx2KGN0dHkpCiAgICAgICAgICBUaGUgZGV2aWNlIG5hbWUgb2YgQy1LZXJtaXQncyBjb250cm9sbGluZyAobG9naW4pIHRlcm1pbmFsLgoKICAgXHYoZmlsZW5hbWUpCiAgICAgICAgICBEZXNjcmliZWQgaW4gWzU1NV1TZWN0aW9ucyA0LjEgYW5kIFs1NTZdNC4yLgoKICAgXHYoZmlsZW51bWJlcikKICAgICAgICAgIERlc2NyaWJlZCBpbiBbNTU3XVNlY3Rpb25zIDQuMSBhbmQgWzU1OF00LjIuCgogICBcdihmaWxlc3BlYykKICAgICAgICAgIEFzIG9mIEMtS2VybWl0IDcuMCwgY29udGFpbnMgZnVsbHkgcXVhbGlmaWVkIGZpbGVuYW1lcyByYXRoZXIKICAgICAgICAgIHRoYW4gKHVzdWFsbHkpIHJlbGF0aXZlIG9uZXMuCgogICBcdihyZXR1cm4pCiAgICAgICAgICBOb3cgaG9sZHMgdGhlIEVORCBuIHZhbHVlIG9mIHRoZSBtYWNybyB0aGF0IG1vc3QgcmVjZW50bHkKICAgICAgICAgIHJldHVybmVkLCBpbiBjYXNlIEVORCB3YXMgdXNlZCByYXRoZXIgdGhhbiBSRVRVUk4uCgogICBcdihlZGl0b3IpCiAgICAgICAgICBQYXRobmFtZSBvZiBwcmVmZXJyZWQgdGV4dCBlZGl0b3IKCiAgIFx2KGVkaXRvcHRzKQogICAgICAgICAgQ29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIGVkaXRvcgoKICAgXHYoZWRpdGZpbGUpCiAgICAgICAgICBGaWxlIG1vc3QgcmVjZW50bHkgZWRpdGVkCgogICBcdihicm93c2VyKQogICAgICAgICAgUGF0aG5hbWUgb2YgcHJlZmVycmVkIFdlYiBicm93c2VyCgogICBcdihicm93c29wdHMpCiAgICAgICAgICBDb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgV2ViIGJyb3dzZXIKCiAgIFx2KGJyb3dzdXJsKQogICAgICAgICAgVVJMIG1vc3QgcmVjZW50bHkgZ2l2ZW4gdG8gV2ViIGJyb3dzZXIKCiAgIFx2KGRpYWx0eXBlKQogICAgICAgICAgVHlwZSBvZiBjYWxsIG1vc3QgcmVjZW50bHkgcGxhY2VkIChzZWUgWzU1OV1TZWN0aW9uIDIuMS4xMSkuCgogICBcdihrYmNoYXIpCiAgICAgICAgICBUaGUgY2hhcmFjdGVyLCBpZiBhbnksIHRoYXQgd2FzIHR5cGVkIGF0IHRoZSBrZXlib2FyZCB0byB0bwogICAgICAgICAgaW50ZXJydXB0IHRoZSBtb3N0IHJlY2VudCBQQVVTRSwgU0xFRVAsIFdBSVQsIE1TTEVFUCwgb3IgSU5QVVQKICAgICAgICAgIGNvbW1hbmQ7IGVtcHR5IGlmIHRoZSBtb3N0IHJlY2VudCBzdWNoIGNvbW1hbmQgd2FzIG5vdAogICAgICAgICAgaW50ZXJydXB0ZWQgZnJvbSB0aGUga2V5Ym9hcmQuCgogICBcdihsb2NrZGlyKQogICAgICAgICAgVU5JWCBvbmx5IC0gVGhlIG5hbWUgb2YgdGhlIFVVQ1AgbG9ja2ZpbGUgZGlyZWN0b3J5LCBpZiBrbm93biwKICAgICAgICAgIG90aGVyd2lzZSAiKHVua25vd24pIi4KCiAgIFx2KGxvY2twaWQpCiAgICAgICAgICBVTklYIG9ubHkgLSBQSUQgb2YgcHJvY2VzcyB0aGF0IG93bnMgdGhlIGNvbW11bmljYXRpb24gcG9ydAogICAgICAgICAgdGhhdCB5b3UgdHJpZWQgdG8gb3BlbiB3aXRoIGEgU0VUIExJTkUgY29tbWFuZCB0aGF0IGZhaWxlZAogICAgICAgICAgYmVjYXVzZSB0aGUgcG9ydCB3YXMgaW4gdXNlLCBvdGhlcndpc2UgZW1wdHkuIFRoaXMgdmFyaWFibGUgaXMKICAgICAgICAgIHNldCB3aXRoIGV2ZXJ5IFNFVCBMSU5FIGNvbW1hbmQuCgogICBcdihjeF90aW1lKQogICAgICAgICAgSWYgbm8gY29ubmVjdGlvbiAoU0VUIEhPU1QsIFNFVCBMSU5FLCBESUFMLCBURUxORVQsIGV0YykgaXMKICAgICAgICAgIGFjdGl2ZSwgdGhpcyBpcyAwLiBJZiBhIGNvbm5lY3Rpb24gaXMgYWN0aXZlLCB0aGlzIGlzIHRoZQogICAgICAgICAgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgdGhlIGNvbm5lY3Rpb24gd2FzIG1hZGUuCgogICBcdihod3Bhcml0eSkKICAgICAgICAgIElmIGhhcmR3YXJlIHBhcml0eSBpcyBpbiBlZmZlY3QsIHRoaXMgdmFyaWFibGUgZ2l2ZXMgaXRzIHZhbHVlLAogICAgICAgICAgc3VjaCBhcyAiZXZlbiIgb3IgIm9kZCIgKGluIHdoaWNoIGNhc2UsIHRoZSBcdihwYXJpdHkpIHZhcmlhYmxlCiAgICAgICAgICB3aWxsIGJlICJub25lIikuIE90aGVyd2lzZSB0aGlzIHZhcmlhYmxlIGlzIGVtcHR5LgoKICAgXHYoc2VyaWFsKQogICAgICAgICAgQ3VycmVudCBzZXJpYWwgcG9ydCBzZXR0aW5ncyBpbiA4TjEgZm9ybWF0IChbNTYwXVNlY3Rpb24gMi4xMCkuCgogICBcdihlcnJubykKICAgICAgICAgIEluIFVOSVgsIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBDIHJ1bnRpbWUgZXJybm8gdmFyaWFibGUsCiAgICAgICAgICB3aGljaCBpcyBxdWl0ZSB2b2xhdGlsZSAobWVhbmluZyB0aGF0IG9mdGVuIGFuICJpbnRlcmVzdGluZyIKICAgICAgICAgIGVycm9yIGNvZGUgY2FuIGJlIG92ZXJ3cml0dGVuIGJ5IHNvbWUgb3RoZXIgbGlicmFyeSBjYWxsIG9yCiAgICAgICAgICBzeXN0ZW0gc2VydmljZSB0aGF0IHNldHMgZXJybm8gYmVmb3JlIHlvdSBoYXZlIGEgY2hhbmNlIHRvIGxvb2sKICAgICAgICAgIGF0IGl0KS4gSW4gVk1TLCB0aGUgZXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgc3lzdGVtIG9yCiAgICAgICAgICBsaWJyYXJ5IGNhbGwgdGhhdCBtb3N0IHJlY2VudGx5IGZhaWxlZCAoc3VjY2VzcyBjb2RlcyBhcmUgbm90CiAgICAgICAgICBzYXZlZCkuIE5vdCBhdmFpbGFibGUgaW4gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMuCgogICBcdihlcnJzdHJpbmcpCiAgICAgICAgICBUaGUgVU5JWCBvciBWTVMgc3lzdGVtIGVycm9yIG1lc3NhZ2UgdGhhdCBjb3JyZXNwb25kcyB0bwogICAgICAgICAgXHYoZXJybm8pLiBOb3QgYXZhaWxhYmxlIGluIGFsbCBPUydzLiBBbHNvIHNlZQogICAgICAgICAgWzU2MV1cZmVycnN0cmluZygpLgoKICAgXHYoc2V0bGluZW1zZykKICAgICAgICAgIFRoZSBlcnJvciBtZXNzYWdlLCBpZiBhbnksIGZyb20gdGhlIG1vc3QgcmVjZW50IFNFVCBMSU5FLCBTRVQKICAgICAgICAgIFBPUlQsIFNFVCBIT1NULCBURUxORVQsIG9yIG90aGVyIGNvbm5lY3Rpb24tbWFraW5nIGNvbW1hbmQuCiAgICAgICAgICBUaGlzIGlzIG5vdCBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyBcdihlcnJzdHJpbmcpIHNpbmNlIHRoZXNlCiAgICAgICAgICBjb21tYW5kcyBtaWdodCBmYWlsIHdpdGhvdXQgZ2VuZXJhdGluZyBhIHN5c3RlbSBlcnJvciBjb2RlLCBmb3IKICAgICAgICAgIGV4YW1wbGUgKGluIFVOSVgpIGJlY2F1c2UgYSBsb2NrZmlsZSBleGlzdGVkIGluZGljYXRpbmcgdGhlCiAgICAgICAgICBkZXZpY2Ugd2FzIGFzc2lnbmVkIGJ5IGFub3RoZXIgdXNlci4KCiAgIFx2KGV4aXRzdGF0dXMpCiAgICAgICAgICBUaGUgZXhpdCBzdGF0dXMgQy1LZXJtaXQgd291bGQgcmV0dXJuIGlmIGl0IGV4aXRlZCBub3cuCgogICBcdihwZXhpdHN0YXQpCiAgICAgICAgICBUaGUgZXhpdCBzdGF0dXMgb2YgdGhlIGluZmVyaW9yIHByb2Nlc3MgbW9zdCByZWNlbnRseSBpbnZva2VkCiAgICAgICAgICBieSBDLUtlcm1pdCAoYnkgUlVOLCAhLCBSRURJUkVDVCwgU0VORCAvQ09NTUFORCwgZXRjKS4gSW4gVk1TLAogICAgICAgICAgdGhpcyBjb2RlIGNhbiBiZSBnaXZlbiB0byBcZmVycnN0cmluZygpIHRvIGdldCB0aGUKICAgICAgICAgIGNvcnJlc3BvbmRpbmcgZXJyb3IgbWVzc2FnZSAoaW4gVU5JWCwgcHJvZ3JhbS9jb21tYW5kIHJldHVybgogICAgICAgICAgY29kZXMgYXJlIG5vdCB0aGUgc2FtZSBhcyBzeXN0ZW0gZXJyb3IgY29kZXMpLiBOb3QgYXZhaWxhYmxlIGluCiAgICAgICAgICBvcGVyYXRpbmcgc3lzdGVtcyBvdGhlciB0aGFuIFVOSVggYW5kIFZNUy4gU2VlIFs1NjJdU2VjdGlvbgogICAgICAgICAgNC4yLjUgZm9yIGRldGFpbHMuCgogICBcdihpbm1hdGNoKQogICAgICAgICAgVGhlIGluY29taW5nIHN0cmluZyBvZiBjaGFyYWN0ZXJzLCBpZiBhbnksIHRoYXQgbWF0Y2hlZCB0aGUKICAgICAgICAgIG1vc3QgcmVjZW50IElOUFVULCBSRUlOUFVULCBvciBNSU5QVVQgY29tbWFuZC4KCiAgIFx2KGludGltZSkKICAgICAgICAgIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzICh0aG91c2FuZHRocyBvZiBzZWNvbmRzKSBpdCB0b29rIGZvcgogICAgICAgICAgdGhlIG1vc3QgcmVjZW50IElOUFVUIGNvbW1hbmQgdG8gZmluZCBpdHMgbWF0Y2gsIG9yIC0xIGlmIG5vCiAgICAgICAgICBJTlBVVCBjb21tYW5kIGhhcyBiZWVuIGdpdmVuIHlldC4gSWYgdGhlIElOUFVUIGNvbW1hbmQgdGltZWQKICAgICAgICAgIG91dCwgdGhlIHZhbHVlIGlzIGFwcHJveGltYXRlbHkgZXF1YWwgdG8gMTAwMCB0aW1lcyB0aGUgSU5QVVQKICAgICAgICAgIHRpbWVvdXQuIElmIElOUFVUIGZhaWxlZCBmb3Igc29tZSBvdGhlciByZWFzb24sIHRoZSB2YWx1ZSBpcwogICAgICAgICAgdW5kZWZpbmVkIChcdihpbnN0YXR1cykgZ2l2ZXMgSU5QVVQgY29tcGxldGlvbiBzdGF0dXMpLiBJZiB5b3VyCiAgICAgICAgICB2ZXJzaW9uIG9mIEMtS2VybWl0IGlzIGJ1aWx0IHdpdGhvdXQgaGlnaC1wcmVjaXNpb24KICAgICAgICAgIGZsb2F0aW5nLXBvaW50IHRpbWVycywgdGhpcyBudW1iZXIgd2lsbCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZgogICAgICAgICAgMTAwMC4KCiAgIFx2KGlud2FpdCkKICAgICAgICAgIFRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzcGVjaWZpZWQgYXMgdGhlIHRpbWVvdXQgaW4gdGhlIG1vc3QKICAgICAgICAgIHJlY2VudCBJTlBVVCBjb21tYW5kLgoKICAgXHYoZGlhbHN1ZmZpeCkKICAgICAgICAgIERpYWxpbmcgc3VmZml4IGZvciB1c2UgZHVyaW5nIFBESUFMIHNlcXVlbmNlOyBzZWUgWzU2M11TZWN0aW9uCiAgICAgICAgICAyLjEuMTAuCgogICBcdihwaWQpCiAgICAgICAgICBVTklYLCBWTVMsIGFuZCBLOTUgb25seS4gQy1LZXJtaXQncyBwcmltYXJ5IHByb2Nlc3MgSUQsCiAgICAgICAgICBudW1lcmljLCBkZWNpbWFsLiBJZiB5b3Ugd2FudCB0byBzaG93IGl0IGluIGhleCwgdXNlCiAgICAgICAgICBcZm4yaGV4KFx2KHBpZCkpIElmIHlvdSB3YW50IHRvIHNob3cgaXQgaW4gb2N0YWwsIHVzZQogICAgICAgICAgXGZuMm9jdGFsKFx2KHBpZCkpLgoKICAgXHYocHJpbnRlcikKICAgICAgICAgIEN1cnJlbnQgcHJpbnRlciBuYW1lIG9yIFNFVCBQUklOVEVSIHZhbHVlLgoKICAgXHYocF9jdGwpCiAgICAgICAgICBDb250cm9sIHByZWZpeCBjaGFyIFx2KHBfOGJpdCkgOC1iaXQgcHJlZml4IGNoYXIgKGlmIHBhcml0eSBub3QKICAgICAgICAgIG5vbmUpCgogICBcdihwX3JwdCkKICAgICAgICAgIFJlcGVhdCBwcmVmaXggY2hhciAoaWYgcmVwZWF0IGNvbXByZXNzaW9uIGVuYWJsZWQpCgogICBcdihoZXJhbGQpCiAgICAgICAgICBLZXJtaXQncyB2ZXJzaW9uIGhlcmFsZAoKICAgXHYodGVzdCkKICAgICAgICAgIEtlcm1pdCdzIHRlc3QgdmVyc2lvbiwgaWYgYW55LCBvciAwIGlmIHRoaXMgaXMgbm90IGEgdGVzdAogICAgICAgICAgdmVyc2lvbi4gVHlwaWNhbCB2YWx1ZXMgZm9yIHRlc3QgdmVyc2lvbnMgYXJlICJBbHBoYS4wMyIgb3IKICAgICAgICAgICJCZXRhLjE0Ii4KCiAgIFx2KHNlbmRsaXN0KQogICAgICAgICAgVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBTRU5ELUxJU1QsIDAgaWYgbm9uZS4gTm90ZToKICAgICAgICAgIGVudHJpZXMgZG8gbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gZmlsZXMsIHNpbmNlIGFuIGVudHJ5CiAgICAgICAgICBtaWdodCBjb250YWluIHdpbGRjYXJkcy4gQWxzbyBub3RlIHRoYXQgdGhlIHZhbHVlIGRvZXMgbm90IGdvCiAgICAgICAgICBiYWNrIHRvIDAgYWZ0ZXIgdGhlIGZpbGVzIGluIHRoZSBsaXN0IGFyZSBzZW50LiBUbyByZXNldCB0aGlzCiAgICAgICAgICB2YXJpYWJsZSwgdXNlIENMRUFSIFNFTkQtTElTVC4gVGhlIHB1cnBvc2Ugb2YgdGhpcyB2YXJpYWJsZSBpcwogICAgICAgICAgdG8gZGV0ZXJtaW5lIGlmIGEgU0VORCBjb21tYW5kLCB3aGVuIGdpdmVuIHdpdGhvdXQgYW55CiAgICAgICAgICBmaWxlbmFtZXMsIHdpbGwgYmUgbGVnYWwuIEV4YW1wbGU6CgogIHhpZiBcdihzZW5kbGlzdCkgeyBzZW5kIH0gZWxzZSB7IHNlbmQgb29mYS50eHQgfQoKICAgXHYodHJpZ2dlcikKICAgICAgICAgIElmIHRoZSBtb3N0IHJlY2VudCBDT05ORUNUIHNlc3Npb24gd2FzIHRlcm1pbmF0ZWQgYXV0b21hdGljYWxseQogICAgICAgICAgYnkgYSB0cmlnZ2VyLCB0aGlzIHZhcmlhYmxlIGNvbnRhaW5zIHRoZSB0cmlnZ2VyIHZhbHVlLgoKICAgXHYodHlfbG4pCiAgICAgICAgICBUWVBFIGxpbmUgbnVtYmVyIChkdXJpbmcgVFlQRSkKCiAgIFx2KHR5X2xjKQogICAgICAgICAgVFlQRSBsaW5lIGNvdW50IChhZnRlciBUWVBFKQoKICAgXHYodHlfbWMpCiAgICAgICAgICBUWVBFIG1hdGNoIGNvdW50IChhZnRlciBUWVBFKQoKICAgXHYoeGZlcnN0YXQpCiAgICAgICAgICBTdGF0dXMgb2YgbW9zdCByZWNlbnQgZmlsZSB0cmFuc2ZlcjoKCi0xOiBObyB0cmFuc2ZlciB5ZXQKIDA6IFN1Y2NlZWRlZAogMTogRmFpbGVkCgogICBcdih4ZmVybXNnKQogICAgICAgICAgSWYgdGhlIG1vc3QgcmVjZW50IGZpbGUgdHJhbnNmZXIgZmFpbGVkLCB0aGlzIGlzIHRoZSByZWFzb24uIElmCiAgICAgICAgICBpdCBzdWNjZWVkZWQsIFx2KHhmZXJtc2cpIGlzIGFuIGVtcHR5IHN0cmluZy4KCiAgIFx2KHRmdGltZSkKICAgICAgICAgIFRvdGFsIGVsYXBzZWQgdGltZSBvZiBtb3N0IHJlY2VudCBmaWxlIHRyYW5zZmVyIG9wZXJhdGlvbiwgaW4KICAgICAgICAgIHNlY29uZHMuCgogICBcdih0ZXh0ZGlyKQogICAgICAgICAgRGlyZWN0b3J5IHRoYXQgaG9sZHMgKG9yIGlzIHN1cHBvc2VkIHRvIGhvbGQpIEtlcm1pdCB0ZXh0IGZpbGVzCiAgICAgICAgICBzdWNoIGFzIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMsIHJlbGVhc2Ugbm90ZXMsIHVwZGF0ZSBub3RlcywKICAgICAgICAgIHJlYWQtbWUgZmlsZXMsICJiZXdhcmUiIGZpbGVzLCBldGMuCgogICBcdihuYW1lKQogICAgICAgICAgVGhlIG5hbWUgd2l0aCB3aGljaCB0aGUgS2VybWl0IHByb2dyYW0gd2FzIGludm9rZWQsIGUuZy4KICAgICAgICAgICJrZXJtaXQiLCAid2VybWl0IiwgIms5NSIsICJrMiIsIGV0YyAoc2VlIFs1NjRdU2VjdGlvbiA5LjEpLgoKICAgXHYob3NuYW1lKQogICAgICAgICAgTmFtZSBvZiBvcGVyYXRpbmcgc3lzdGVtIG9uIGNvbXB1dGVyIHdoZXJlIEMtS2VybWl0IGlzIHJ1bm5pbmcsCiAgICAgICAgICBvYnRhaW5lZCBhdCBydW50aW1lIChmcm9tIHVuYW1lIG9yIGVxdWl2YWxlbnQpLgoKICAgXHYob3N2ZXJzaW9uKQogICAgICAgICAgVmVyc2lvbiBvZiBvcGVyYXRpbmcgc3lzdGVtIG9uIGNvbXB1dGVyIHdoZXJlIEMtS2VybWl0IGlzCiAgICAgICAgICBydW5uaW5nLCBvYnRhaW5lZCBhdCBydW50aW1lIChmcm9tIHVuYW1lIG9yIGVxdWl2YWxlbnQpLgoKICAgXHYob3NyZWxlYXNlKQogICAgICAgICAgUmVsZWFzZSBvZiBvcGVyYXRpbmcgc3lzdGVtIG9uIGNvbXB1dGVyIHdoZXJlIEMtS2VybWl0IGlzCiAgICAgICAgICBydW5uaW5nLCBvYnRhaW5lZCBhdCBydW50aW1lIChmcm9tIHVuYW1lIG9yIGVxdWl2YWxlbnQpLgoKICAgXHYobW9kZWwpCiAgICAgICAgICBUaGUgc3BlY2lmaWMgaGFyZHdhcmUgbW9kZWwgb2YgdGhlIGNvbXB1dGVyIHdoZXJlIEMtS2VybWl0IGlzCiAgICAgICAgICBydW5uaW5nLCBpZiBrbm93bi4KCiAgIFx2KG1hdGhfcGkpCiAgICAgICAgICBUaGUgdmFsdWUgb2YgUGkgKHNlZSBbNTY1XVNlY3Rpb24gNy4yMykKCiAgIFx2KG1hdGhfZSkKICAgICAgICAgIFRoZSB2YWx1ZSBvZiBlIChzZWUgWzU2Nl1TZWN0aW9uIDcuMjMpCgogICBcdihtYXRoX3ByZWNpc2lvbikKICAgICAgICAgIEhvdyBtYW55IHNpZ25pZmljYW50IGRpZ2l0cyBpbiBhIGZsb2F0aW5nLXBvaW50IG51bWJlci4KCiAgIFx2KGZfY291bnQpCiAgICAgICAgICBSZXN1bHQgb2YgdGhlIG1vc3QgcmVjZW50IEZJTEUgQ09VTlQgKEZDT1VOVCkgY29tbWFuZC4KCiAgIFx2KGZfZXJyb3IpCiAgICAgICAgICBOdW1lcmljIGVycm9yIGNvZGUgb2YgbW9zdCByZWNlbnQgRklMRSBjb21tYW5kLgoKICAgXHYoZl9tYXgpCiAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBmaWxlcyBvcGVuIHNpbXVsdGFuZW91c2x5LgoKICAgVGhlIG1hdGggY29uc3RhbnRzIGFyZSBnaXZlbiBpbiB0aGUgcHJlY2lzaW9uIG9mIHVuZGVybHlpbmcgY29tcHV0ZXIncwogICBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljLgoKICAgTm90ZSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBcdihvc25hbWUpLCBcdihvc3ZlcnNpb24pLCBhbmQKICAgXHYocGxhdGZvcm0pOyB0aGUgbGF0dGVyIHJlZmVycyB0byB0aGUgcGxhdGZvcm0gZm9yIHdoaWNoIGFuZC9vciB1cG9uCiAgIHdoaWNoIEMtS2VybWl0IHdhcyBidWlsdCwgYXMgb3Bwb3NlZCB0byB0aGUgb25lIG9uIHdoaWNoIGl0IGlzCiAgIGFjdHVhbGx5IHJ1bm5pbmcuIEFsc28gbm90ZSB0aGF0IGVhY2ggb3BlcmF0aW5nIHN5c3RlbSBjYW4sIGFuZAogICBwcm9iYWJseSB3aWxsLCBpbnRlcnByZXQgYW5kIGZpbGwgaW4gdGhlIG9zKiB2YXJpYWJsZXMgZGlmZmVyZW50bHksIG9yCiAgIG5vdCBhdCBhbGwuCgogICBUaGUgU0hPVyBWQVJJQUJMRVMgY29tbWFuZCBub3cgYWNjZXB0cyBhIHZhcmlhYmxlIG5hbWUsIHByZWZpeCwgb3IKICAgcGF0dGVybjoKCiAgc2hvdyB2YXJpYWJsZXMgICAgICAgICBTaG93cyBhbGwgdmFyaWFibGVzLgogIHNob3cgdmFyaWFibGVzIHQgICAgICAgU2hvd3MgYWxsIHZhcmlhYmxlcyB0aGF0IHN0YXJ0IHdpdGggInQiLgogIHNob3cgdmFyaWFibGVzICp2ZXIqICAgU2hvd3MgYWxsIHZhcmlhYmxlcyB3aG9zZSBuYW1lcyBjb250YWluICJ2ZXIiLgogIHNob3cgdmFyaWFibGVzICp2ZXIgICAgRGl0dG8gKGFuIGltcGxpZWQgIioiIGlzIGFwcGVuZGVkKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjMuIE5ldyBvciBJbXByb3ZlZCBCdWlsdC1JbiBGdW5jdGlvbnMKCiAgIFRoZSBmb2xsb3dpbmcgbmV3IGZpbGUtaS9vIGZ1bmN0aW9ucyBhcmUgZXhwbGFpbmVkIGluIFs1NjddU2VjdGlvbgogICAxLjIyLgoKICBcZl9zdGF0dXMoY2hhbm5lbCkgICAgICAgICAgIFN0YXR1cyBvZiBmaWxlIG9wZW4gb24gY2hhbm5lbAogIFxmX3BvcyhjaGFubmVsKSAgICAgICAgICAgICAgUmVhZC93cml0ZSAoYnl0ZSkgcG9pbnRlciBvZiBnaXZlbiBmaWxlCiAgXGZfbGluZShjaGFubmVsKSAgICAgICAgICAgICBDdXJyZW50IGxpbmUgb2YgZmlsZQogIFxmX2hhbmRsZShjaGFubmVsKSAgICAgICAgICAgSGFuZGxlIG9mIGZpbGUKICBcZl9lb2YoY2hhbm5lbCkgICAgICAgICAgICAgIFdoZXRoZXIgZ2l2ZW4gZmlsZSBpcyBhdCBFT0YKICBcZl9nZXRjaGFyKGNoYW5uZWwpICAgICAgICAgIFJlYWQgYSBjaGFyIGZyb20gZ2l2ZW4gZmlsZQogIFxmX2dldGxpbmUoY2hhbm5lbCkgICAgICAgICAgUmVhZCBhIGxpbmUgZnJvbSBnaXZlbiBmaWxlCiAgXGZfZ2V0YmxvY2soY2hhbm5lbCxuKSAgICAgICBSZWFkIGEgYmxvY2sgZnJvbSBnaXZlbiBmaWxlCiAgXGZfcHV0Y2hhcihjaGFubmVsLGMpICAgICAgICBXcml0ZSBhIGNoYXIgdG8gZ2l2ZW4gZmlsZQogIFxmX3B1dGxpbmUoY2hhbm5lbCxzdHJpbmcpICAgV3JpdGUgYSBsaW5lIHRvIGdpdmVuIGZpbGUKICBcZl9wdXRibG9jayhjaGFubmVsLHN0cmluZykgIFdyaXRlIGEgYmxvY2sgdG8gZ2l2ZW4gZmlsZQoKICAgVGhlIGZvbGxvd2luZyBuZXcgZGF0ZS10aW1lLXJlbGF0ZWQgZnVuY3Rpb25zIGFyZSBleHBsYWluZWQgaW4KICAgWzU2OF1TZWN0aW9uIDEuNjoKCiAgXGZkYXkoKSAgICAgICAgICAgICAgICBSZXR1cm5zIGRheSBvZiB3ZWVrIG9mIGdpdmVuIGRhdGUKICBcZm5kYXkoKSAgICAgICAgICAgICAgIFJldHVybnMgbnVtZXJpYyBkYXkgb2Ygd2VlayBvZiBnaXZlbiBkYXRlCiAgXGZ0aW1lKCkgICAgICAgICAgICAgICBSZXR1cm5zIHRpbWUgcG9ydGlvbiBvZiBnaXZlbiBkYXRlLXRpbWUKICBcZm50aW1lKCkgICAgICAgICAgICAgIENvbnZlcnRzIHRpbWUgdG8gc2Vjb25kcyBzaW5jZSBtaWRuaWdodAogIFxmbjJ0aW1lKCkgICAgICAgICAgICAgQ29udmVydHMgc2Vjb25kcyBzaW5jZSBtaWRuaWdodCB0byBoaDptbTpzcwogIFxmY3Z0ZGF0ZShkYXRlLXRpbWUpICAgQ29udmVydHMgZnJlZS1mb3JtYXQgZGF0ZSB0byB5eXl5bW1kZCBoaDptbTpzcwogIFxmZGF5b2Z5ZWFyKGRhdGUtdGltZSkgQ29udmVydHMgZGF0ZSB0byB5eXl5ZGRkIChkYXktb2YteWVhcikgZm9ybWF0CiAgXGZkb3koZGF0ZS10aW1lKSAgICAgICBTeW5vbnltIGZvciBcZmRheW9meWVhcigpCiAgXGZkb3kyZGF0ZShkYXlvZnllYXIpICBDb252ZXJ0cyB5eXl5ZGRkIHRvIHl5eXltbWRkCiAgXGZtamQoZGF0ZS10aW1lKSAgICAgICBDb252ZXJ0cyBmcmVlLWZvcm1hdCBkYXRlIHRvIE1vZGlmaWVkIEp1bGlhbiBEYXRlCiAgXGZtamQyZGF0ZShtamQpICAgICAgICBDb252ZXJ0cyBtb2RpZmllZCBKdWxpYW4gZGF0ZSB0byB5eXl5bW1kZAoKICAgVGhlIG5ldyBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljIGZ1bmN0aW9ucyBhcmUgZXhwbGFpbmVkIGluCiAgIFs1NjldU2VjdGlvbiA3LjIzLiBmMSBhbmQgZjIgYXJlIGZsb2F0aW5nLXBvaW50IChyZWFsKSBudW1iZXJzOyBkIGlzCiAgIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gc2hvdzoKCiAgXGZmcGFic29sdXRlKGYxLGQpICAgICBBYnNvbHV0ZSB2YWx1ZSBvZiBmMQogIFxmZnBhZGQoZjEsZjIsZCkgICAgICAgZjEgKyBmMQogIFxmZnBjb3NpbmUoZjEsZCkgICAgICAgQ29zaW5lIG9mIGYxCiAgXGZmcGRpdmlkZShmMSxmMixkKSAgICBmMSBkaXZpZGVkIGJ5IGYyCiAgXGZmcGV4cChmMSxkKSAgICAgICAgICBlIHRvIHRoZSBmMSBwb3dlcgogIFxmZnBpbnQoZjEpICAgICAgICAgICAgSW50ZWdlciBwYXJ0IG9mIGYxCiAgXGZmcGxvZzEwKGYxLGQpICAgICAgICBMb2cgYmFzZSAxMCBvZiBmMQogIFxmZnBsb2duKGYxLGQpICAgICAgICAgTmF0dXJhbCBsb2cgb2YgZjEKICBcZmZwbWF4aW11bShmMSxmMixkKSAgIE1heGltdW0gb2YgZjEgYW5kIGYyCiAgXGZmcG1pbmltdW0oZjEsZjIsZCkgICBNaW5pbXVtIG9mIGYxIGFuZCBmMgogIFxmZnBtb2R1bHVzKGYxLGYyLGQpICAgTW9kdWx1cyBvZiBmMSBhbmQgZjIKICBcZmZwbXVsdGlwbHkoZjEsZjIsZCkgIFByb2R1Y3Qgb2YgZjEgYW5kIGYyCiAgXGZmcHJhaXNlKGYxLGYyLGQpICAgICBSYWlzZSBmMSB0byBwb3dlciBmMgogIFxmZnByb3VuZChmMSxkKSAgICAgICAgUm91bmQgZjEgdG8gZCBwbGFjZXMKICBcZmZwc2luZShmMSxkKSAgICAgICAgIFNpbmUgb2YgZjEKICBcZmZwc3FydChmMSxkKSAgICAgICAgIFNxdWFyZSByb290IG9mIGYxCiAgXGZmcHN1YnRyYWN0KGYxLGYyLGQpICBmMiAtIGYxCiAgXGZmcHRhbmdlbnQoZjEsZCkgICAgICBUYW5nZW50IG9mIGYxCgogICBJbnRlZ2VyIG51bWJlciBmdW5jdGlvbnM6CgogICBcZmFic29sdXRlKG4pCiAgICAgICAgICBBYnNvbHV0ZSB2YWx1ZSBvZiBpbnRlZ2VyIG4uCgogICBcZnJhbmRvbShuKQogICAgICAgICAgUmV0dXJucyBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgbi0xLgoKICAgXGZyYWRpeChzLG4xLG4yKQogICAgICAgICAgSWYgdGhlIHN0cmluZyBzIGlzIGFuIGludGVnZXIgaW4gcmFkaXggbjEsIHRoZSByZXN1bHQgaXMgdGhlCiAgICAgICAgICBzYW1lIG51bWJlciBleHByZXNzZWQgaW4gcmFkaXggbjIsIHdoZXJlIG4xIGFuZCBuMiBtYXkgYmUgYW55CiAgICAgICAgICBudW1iZXIgZnJvbSAyIHRocm91Z2ggMzYsIGV4cHJlc3NlZCBhcyBkZWNpbWFsIG51bWJlcnMsIG9yCiAgICAgICAgICB2YXJpYWJsZXMgKGV0YykgdGhhdCBldmFsdWF0ZSB0byBkZWNpbWFsIG51bWJlcnMuIEZvciB0aGUKICAgICAgICAgIHNvdXJjZSBhbmQgcmVzdWx0LCB0aGUgZGlnaXRzIG9mIGFueSByYWRpeCwgciwgYXJlIHRoZSBmaXJzdCByCiAgICAgICAgICBjaGFyYWN0ZXJzIGluIHRoZSBzZXF1ZW5jZSAwLTksYS16IChjYXNlIGRvZXNuJ3QgbWF0dGVyIGZvciB0aGUKICAgICAgICAgIGxldHRlcnMpLiBUaGUgc3RyaW5nIHMgbWF5IGhhdmUgYSBzaWduLCArIG9yIC07IGlmIGl0IHN0YXJ0cwogICAgICAgICAgd2l0aCBhIG1pbnVzICgtKSBzaWduLCB0aGUgcmVzdWx0IGFsc28gaGFzIGEgbWludXMgc2lnbi4KCiAgIFRoZSBcZnJhZGl4KCkgZnVuY3Rpb24gZG9lcyBub3Qgd29yayB3aXRoIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuIEl0CiAgIGRvZXMgbm90IHJldmVhbCB0aGUgaW50ZXJuYWwgc3RvcmFnZSBmb3JtYXQgb2YgYSBudW1iZXI7IGZvciBleGFtcGxlLAogICBcZnJhZGl4KC0xLDEwLDE2KSBpcyAtMSwgbm90IHNvbWV0aGluZyBsaWtlIEZGRkZGRkZGRkYuIElmIGFsbCB0aHJlZQogICBhcmd1bWVudHMgYXJlIG5vdCBnaXZlbiwgb3IgaWYgbjEgb3IgbjIgYXJlIG5vdCBudW1iZXJzIGJldHdlZW4gMiBhbmQKICAgMzYgaW5jbHVzaXZlLCBvciBzIGlzIG5vdCBhIG51bWJlciBpbiByYWRpeCBuMSwgYW4gZXJyb3Igb2NjdXJzIGFuZAogICB0aGUgZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLiBcZnJhZGl4KCkgYWxzbyBkb2VzIG5vdCBvZmZlcgogICBleHRlbmRlZC1wcmVjaXNpb24gYXJpdGhtZXRpYzsgbnVtYmVyIHZhbHVlcyBhcmUgbGltaXRlZCB0byB0aG9zZQogICBleHByZXNzZWQgYXMgYSBsb25nIGludGVnZXIgaW4gdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgdW5kZXJseWluZwogICBjb21wdXRlciwgdXN1YWxseSAzMiBvciA2NCBiaXRzLiBJZiB5b3UgZ2l2ZSBpdCBhbiBhcmd1bWVudCB3aG9zZQogICBhYnNvbHV0ZSB2YWx1ZSBpcyBsYXJnZXIgdGhhbiBjYW4gYmUgaGVsZCBpbiBhbiB1bnNpZ25lZCBsb25nLCB0aGUKICAgcmVzdWx0IGlzIC0xLgoKICAgVGhlIG5leHQgZm91ciBhcmUgc2hvcnRoYW5kIGZ1bmN0aW9ucyBmb3IgZGVjaW1hbC9oZXhhZGVjaW1hbCBhbmQKICAgZGVjaW1hbC9vY3RhbCBudW1iZXIgY29udmVyc2lvbjoKCiAgIFxmbjJoZXgobikKICAgICAgICAgIFJldHVybnMgdGhlIGhleGFkZWNpbWFsIChiYXNlIDE2KSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50ZWdlcgogICAgICAgICAgbi4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBcZmhleGlmeShzKSwgd2hpY2ggdHJlYXRzIGl0cwogICAgICAgICAgYXJndW1lbnQgYXMgYSBzdHJpbmcgcmF0aGVyIHRoYW4gYSBudW1iZXIuIFRoZSByZXN1bHQgaXMgYWx3YXlzCiAgICAgICAgICBsZWZ0LXBhZGRlZCB3aXRoIDAncyB0byBtYWtlIGl0cyBsZW5ndGggZXZlbi4gRXhhbXBsZXM6CgogIFxuMmhleCgwKSAgID0gIjAwIiAgICAgICAgICAgICAgICAgICAgXGZoZXhpZnkoMCkgICA9ICIzMCIKICBcbjJoZXgoMjU1KSA9ICJmZiIgICAgICAgICAgICAgICAgICAgIFxmaGV4aWZ5KDI1NSkgPSAiMzIzNTM1IgogIFxuMmhleCgyNTYpID0gIjAxMDAiICAgICAgICAgICAgICAgICAgXGZoZXhpZnkoMjU2KSA9ICIzMjM1MzYiCgogICBcZmhleDJuKHgpCiAgICAgICAgICBDb252ZXJ0cyBoZXhhZGVjaW1hbCBudW1iZXIgeCB0byBkZWNpbWFsIGVxdWl2YWxlbnQgZGVjaW1hbAogICAgICAgICAgbnVtYmVyLiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIFxmbjJoZXgoKS4gRXF1aXZhbGVudCB0bwogICAgICAgICAgXGZyYWRpeChzLDE2LDEwKS4KCiAgIFxmbjJvY3RhbChuKQogICAgICAgICAgUmV0dXJucyB0aGUgb2N0YWwgKGJhc2UgOCkgcmVwcmVzZW50YXRpb24gb2YgdGhlIG51bWJlciBuLgogICAgICAgICAgRXhhbXBsZXM6CgogIFxuMm9jdGFsKDApID0gIjAiCiAgXG4yb2N0KDI1NSkgPSAiMzc3IgogIFxuMm9jdCgyNTYpID0gIjQwMCIKICBFcXVpdmFsZW50IHRvIFxmcmFkaXgobiwxMCw4KS4KCiAgIFxmb2N0Mm4obikKICAgICAgICAgIFJldHVybnMgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG9jdGFsIG51bWJlciwKICAgICAgICAgIG4uIFRoZSBpbnZlcnNlIG9mIFxmbjJvY3RhbCgpLiBFcXVpdmFsZW50IHRvIFxmcmFkaXgobiw4LDEwKS4KCiAgIFN0cmluZyBmdW5jdGlvbnM6CgogICBccyhuYW1lW246bV0pCiAgICAgICAgICBFcXVpdmFsZW50IHRvIFxmc3Vic3RyaW5nKFxtKG5hbWUpLG4sbSkgKFs1NzBdU2VjdGlvbiA3LjI0KS4KCiAgIFw6KG5hbWVbbjptXSkKICAgICAgICAgIEVxdWl2YWxlbnQgdG8gXGZzdWJzdHJpbmcobmFtZSxuLG0pICh3aGVyZSAibmFtZSIgaXMgYW55CiAgICAgICAgICBcLXF1YW50aXR5KSAoWzU3MV1TZWN0aW9uIDcuMjQpLgoKICAgXGZsZWZ0KHMsbikKICAgICAgICAgIFRoZSBsZWZ0bW9zdCBuY2hhcmFjdGVycyBvZiBzdHJpbmcgczsgZXF1aXZhbGVudCB0bwogICAgICAgICAgXGZzdWJzdHJpbmcocywxLG4pLgoKICAgXGZzdHJpcHgoc3RyaW5nLGNoYXIpCiAgICAgICAgICBSZXR1cm5zIHRoZSBwYXJ0IG9mIHRoZSBzdHJpbmcgdXAgdG8gdGhlIHJpZ2h0bW9zdCBvY2N1cnJlbmNlLAogICAgICAgICAgaWYgYW55LCBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLiBUaGUgZGVmYXVsdCBjaGFyYWN0ZXIgaXMgcGVyaW9kCiAgICAgICAgICAoLikgRXhhbXBsZXM6CgogIFxmc3RyaXB4KGZvby9iYXIsLykgICAgICAgICAgICAgICAgID0gImZvbyIKICBcZnN0cmlweChmb28vYmFyL2JheiwvKSAgICAgICAgICAgICA9ICJmb28vYmFyIgogIFxmc3RyaXB4KGF1dG9leGVjLmJhdCwuKSAgICAgICAgICAgID0gImF1dG9leGVjIgogIFxmc3RyaXB4KGF1dG9leGVjLmJhdCkgICAgICAgICAgICAgID0gImF1dG9leGVjIgogIFxmc3RyaXB4KGZzdHJpcHgoZm9vL2Jhci9iYXosLyksLykgID0gImZvbyIKCiAgIFxmbG9wKHN0cmluZyxjaGFyYWN0ZXIpCiAgICAgICAgICBSZXR1cm5zIHRoZSBwb3J0aW9uIG9mIHRoZSBzdHJpbmcgc3RhcnRpbmcgYWZ0ZXIgdGhlIGZpcnN0CiAgICAgICAgICBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIuIFRoZSBkZWZhdWx0IGNoYXJhY3RlciBpcwogICAgICAgICAgcGVyaW9kICguKSBFeGFtcGxlczoKCiAgXGZsb3AoYXV0b2V4ZWMuYmF0KSAgICAgICAgICAgICAgICAgPSAiYmF0IgogIFxmbG9wKGJhei5mb28vYmFyKSAgICAgICAgICAgICAgICAgID0gImZvby9iYXIiCiAgXGZsb3AoYmF6LmZvby9iYXIsLykgICAgICAgICAgICAgICAgPSAiYmFyCgogICBcZnN0cmlwbihzdHJpbmcsbikKICAgICAgICAgIFJldHVybnMgdGhlIHN0cmluZyB3aXRoIG5jaGFyYWN0ZXJzIHJlbW92ZWQgZnJvbSB0aGUgZW5kLgogICAgICAgICAgRXhhbXBsZToKCiAgXGZzdHJpcG4oMTIzNDU2NzgsMykgICAgICAgICAgICAgICAgPSAiMTIzNDUiCgogICAgICAgICAgKEZvciBtb3JlIGRpc2N1c3Npb24gb2YgXGZzdHJpcHgoKSwgXGZzdHJpcG4oKSwgYW5kIFxmbG9wKCkgc2VlCiAgICAgICAgICBbNTcyXVNlY3Rpb24gNC4yLjMpLgoKICAgXGZiNjRlbmNvZGUocykKICAgICAgICAgIFJldHVybnMgdGhlIEJhc2UtNjQgZW5jb2Rpbmcgb2YgdGhlIHN0cmluZyBzLgoKICAgXGZiNjRkZWNvZGUocykKICAgICAgICAgIFJldHVybnMgdGhlIGRlY29kaW5nIG9mIHRoZSBCYXNlLTY0IHN0cmluZyBzLiBGYWlscyBpZiBzIGlzIG5vdAogICAgICAgICAgYSBCYXNlLTY0IHN0cmluZywgb3IgaWYgaXRzIGxlbmd0aCBpcyBub3QgYSBtdWx0aXBsZSBvZiA0LiBOb3RlCiAgICAgICAgICB0aGF0IGlmIGFueSBvZiB0aGUgcmVzdWx0IGJ5dGVzIGFyZSBudWxsICgwKSwgdGhlIHJlc3VsdCBzdHJpbmcKICAgICAgICAgIHN0b3BzIHRoZXJlLiBUaGVyZSBpcyBubyB3YXkgdG8gcmVwcmVzZW50IHN0cmluZ3MgdGhhdCBjb250YWluCiAgICAgICAgICBudWxsIGJ5dGVzIGluIEMtS2VybWl0ICh0aGUgc2FtZSBpcyB0cnVlIGZvciBcZnVuaGV4aWZ5KCkpLgoKICAgXGZ3b3JkKHMxLG4sczIsczMpCiAgICAgICAgICBFeHRyYWN0cyB3b3JkIG51bWJlciBuZnJvbSBzdHJpbmcgczEuIEJ5IGRlZmF1bHQsIGEgIndvcmQiIGlzCiAgICAgICAgICBhbnkgc2VxdWVuY2Ugb2YgQVNDSUkgbGV0dGVycyBvciBkaWdpdHM7IG5pcyAxLWJhc2VkLiBJZiBuaXMKICAgICAgICAgIG9taXR0ZWQsICIxIiBpcyB1c2VkLiBFeGFtcGxlczoKCiAgXGZ3b3JkKG9uZSB0d28gdGhyZWUpICAgID0gIm9uZSIKICBcZndvcmQob25lIHR3byB0aHJlZSwxKSAgPSAib25lIgogIFxmd29yZChvbmUgdHdvIHRocmVlLDIpICA9ICJ0d28iCiAgXGZ3b3JkKG9uZSB0d28gdGhyZWUsMykgID0gInRocmVlIgoKICAgICAgICAgIGFuZDoKCiAgICBcZndvcmQoXHYoZGlhbHJlc3VsdCksMikgPSAiMzEyMDAiCgogICAgICAgICAgaXMgIjMxMjAwIiBpZiBcdihkaWFscmVzdWx0KSBpcyAoZS5nLikgIkNPTk5FQ1QKICAgICAgICAgIDMxMjAwL0FSUS9WMzIvTEFQTS9WNDJCSVMiLgoKICAgICAgICAgIElmIHlvdSBpbmNsdWRlIHMyLCB0aGlzIHJlcGxhY2VzIHRoZSBkZWZhdWx0IGJyZWFrIHNldC4gRm9yCiAgICAgICAgICBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYXZlIGEgc3RyaW5nIFwlYSB3aG9zZSB2YWx1ZSBpczoKCiAgJDE1MC4wMCAkMzAwLjAwICQzOS45NQoKICAgICAgICAgIGFuZCB5b3Ugd2FudCBlYWNoIGRvbGxhciBhbW91bnQgdG8gYmUgYSB3b3JkOyB1c2U6CgogIFxmd29yZChcJWEsXCVuLHsgfSkKCiAgICAgICAgICBUaGlzIHJldHVybnMgZG9sbGFyIGFtb3VudCBudW1iZXIgXCVuLCBlLmcuICIkMzAwLjAwIiBmb3IgXCVuID0KICAgICAgICAgIDIuICJ7IH0iIGRlbm90ZXMgYSBzcGFjZSAoeW91IG11c3QgZW5jbG9zZSBpdCBpbiBicmFjZXMsCiAgICAgICAgICBvdGhlcndpc2UgaXQgaXMgc3F1ZWV6ZWQgb3V0KS4gTm90ZSB0aGF0IEFTQ0lJIGNvbnRyb2wKICAgICAgICAgIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyBpbmNsdWRlZCBpbiB0aGUgYnJlYWsgc2V0OyB5b3UgZG9uJ3QgaGF2ZQogICAgICAgICAgdG8gc3BlY2lmeSB0aGVtIChhbmQgeW91IGNhbid0IG5vdCBzcGVjaWZ5IHRoZW0pLgoKICAgICAgICAgIFRoZSBvcHRpb25hbCBzMyBhcmd1bWVudCBsaXN0cyBjaGFyYWN0ZXJzIChldmVuIGNvbnRyb2wKICAgICAgICAgIGNoYXJhY3RlcnMpIHRoYXQgbm9ybWFsbHkgd291bGQgYmUgY29uc2lkZXJlZCBzZXBhcmF0b3JzIHRoYXQKICAgICAgICAgIHlvdSB3YW50IGluY2x1ZGVkIGluIHdvcmRzLiBTbyB0aGUgZG9sbGFycy1hbmQtY2VudHMgZXhhbXBsZQogICAgICAgICAgY291bGQgYWxzbyBiZSBoYW5kbGVkIHRoaXMgd2F5OgoKICBcZndvcmQoXCVhLFwlbiwsJC4pCgogICAgICAgICAgaW4gb3RoZXIgd29yZHMsIHVzZSB0aGUgZGVmYXVsdCBzZXBhcmF0b3IgbGlzdCwgYnV0IHJlbW92ZSAiJCIKICAgICAgICAgIGFuZCAiLiIgZnJvbSBpdCBzbyB0aGV5IHdpbGwgYmUgY29uc2lkZXJlZCBwYXJ0IG9mIGEgd29yZC4KCiAgIFxmc3BsaXQoczEsJmEsczIsczMpCiAgICAgICAgICBUaGlzIGlzIGxpa2UgXGZ3b3JkKCksIGV4Y2VwdCBpbnN0ZWFkIG9mIGV4dHJhY3RpbmcgYW5kCiAgICAgICAgICByZXR1cm5pbmcgYSBwYXJ0aWN1bGFyIHdvcmQgZnJvbSBzdHJpbmcgczEsIGl0IGNvdW50cyB0aGUgd29yZHMKICAgICAgICAgIGFuZCBvcHRpb25hbGx5IGFzc2lnbnMgdGhlbSB0byB0aGUgYXJyYXkgd2hvc2UgaWRlbnRpZnlpbmcKICAgICAgICAgIGxldHRlciwgYS16LCBpcyBnaXZlbiBhZnRlciB0aGUgIiYiIGluIHRoZSBzZWNvbmQgYXJndW1lbnQsCiAgICAgICAgICB3aXRoIHRoZSBmaXJzdCB3b3JkIGdvaW5nIGludG8gZWxlbWVudCAxLCB0aGUgc2Vjb25kIGludG8KICAgICAgICAgIGVsZW1lbnQgMiwgYW5kIHNvIG9uLiBUaGUgcnVsZXMgcmVnYXJkaW5nIGJyZWFrIGFuZCBpbmNsdWRlCiAgICAgICAgICBsaXN0cyAoczIgYW5kIHMzKSBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgXGZ3b3JkKCkuCiAgICAgICAgICBcZnNwbGl0KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHdvcmRzIHRoYXQgd2VyZSBhc3NpZ25lZCwgd2hpY2gKICAgICAgICAgIGlzIGVpdGhlciB0aGUgbnVtYmVyIG9mIHdvcmRzIGluIHRoZSBzdHJpbmcsIG9yIHRoZSBkaW1lbnNpb24KICAgICAgICAgIG9mIHRoZSBhcnJheSwgd2hpY2hldmVyIGlzIGxlc3MuIElmIHRoZSBhcnJheSBpcyBub3QgZGVjbGFyZWQsCiAgICAgICAgICBcZnNwbGl0KCkgY3JlYXRlcyBpdCBhbmQgcmV0dXJucyBhIG51bWJlciB3aGljaCBpcyBib3RoIHRoZQogICAgICAgICAgbnVtYmVyIG9mIHdvcmRzIGluIHMxIGFuZCB0aGUgZGltZW5zaW9uIG9mIHRoZSBuZXcgYXJyYXkuCiAgICAgICAgICBFeGFtcGxlczoKCiAgZGVjbGFyZSBcJndbMjBdICAgICAgICA7IChPcHRpb25hbC4pCiAgLi4uCiAgcmVhZCBcJXMgICAgICAgICAgICAgICA7IFwlcyBpcyAiVGhpcyBpcyBhIHNlbnRlbmNlIHdpdGggc2V2ZW4gd29yZHMuIgogIC4uLgogIGVjaG8gIlxmc3BsaXQoXCVzKSIgICAgOyBUaGlzIHdvdWxkIHByaW50ICI3Ii4KICBlY2hvICJcZnNwbGl0KFwlcywmdykiIDsgRGl0dG8sIGFuZCBhbHNvIGFzc2lnbnMgdGhlbSB0byBhcnJheSBcJndbXS4KCiAgZWNobyAiXCZ3WzddIiAgICAgICAgICA7IFRoaXMgd291bGQgcHJpbnQgIndvcmRzIi4KCiAgICAgICAgICBJZiB0aGUgbGluZSBjb250YWluZWQgZmllbGRzIHRoYXQgd2VyZSBkZWxpbWl0ZWQgYnkgY29sb24gKDopLAogICAgICAgICAgeW91IHdvdWxkIHVzZSBcZnNwbGl0KFwlcywmdyw6KS4gSWYgdGhlIGZpZWxkcyB3ZXJlIGRlbGltaXRlZAogICAgICAgICAgYnkgY29tbWEsIHRoZW4geW91IHdvdWxkIHVzZSBcZnNwbGl0KFwlcywmdyx7LH0pOyBpbiB0aGlzIGNhc2UKICAgICAgICAgIHRoZSBsaXRlcmFsIGNvbW1hIG11c3QgYmUgZW5jbG9zZWQgaW4gYnJhY2VzIHRvIGRpc3Rpbmd1aXNoIGl0CiAgICAgICAgICBmcm9tIHRoZSBjb21tYSB0aGF0IHNlcGFyYXRlcyBmdW5jdGlvbiBhcmd1bWVudHMuIFRvIGdldCBhIHdvcmQKICAgICAgICAgIGNvdW50IHdpdGhvdXQgbG9hZGluZyBhbiBhcnJheSwgYnV0IHN0aWxsIHNwZWNpZnkgYnJlYWsgYW5kL29yCiAgICAgICAgICBpbmNsdWRlIGxpc3RzLCBsZWF2ZSB0aGUgYXJyYXkgYXJndW1lbnQgZW1wdHk6CgogICBlY2hvICJcZnNwbGl0KFwlcywsOikiIDsgVXNlIGNvbG9uIGFzIHRoZSBzZXBhcmF0b3IuCgogICAgICAgICAgV0FSTklOR1M6CgogICAgICAgICAxLiBJZiB5b3UgdXNlIHRoZSBzYW1lIGFycmF5IHJlcGVhdGVkbHksIFxmc3BsaXQoKSBsZWF2ZXMgYW55CiAgICAgICAgICAgIHRyYWlsaW5nIG1lbWJlcnMgdW5kaXN0dXJiZWQuIEZvciBleGFtcGxlOgogIGRjbCBcJndbMTBdCiAgXGZzcGxpdCgxIDIgMyA0IDUsJncpIDsgU2V0cyBcJndbMV0gdGhydSBcJndbNV0uCiAgXGZzcGxpdChhIGIgYywmdykgICAgIDsgU2V0cyBcJndbMV0tWzNdIGxlYXZpbmcgWzRdLVs1XSBhcyB0aGV5IHdlcmUuCiAgICAgICAgIDIuIElmIHlvdSBhbGxvdyBcZnNwbGl0IHRvIGNyZWF0ZSB0aGUgYXJyYXkgKGJ5IG5vdCBkZWNsYXJpbmcgaXQKICAgICAgICAgICAgZmlyc3QpLCBpdCBpcyBkaW1lbnNpb25lZCB0byB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGl0IHdhcwogICAgICAgICAgICBjcmVhdGVkIHdpdGg6CiAgXGZzcGxpdCgxIDIgMywmeCkgICAgIDsgQ3JlYXRlcyBhbiBhcnJheSBcJnhbXSB3aXRoIDMgZWxlbWVudHMuCiAgXGZzcGxpdChhIGIgYyBkIGUsJngpIDsgVGhpcyBvdmVyZmxvd3MgdGhlIGFycmF5LgoKICAgICAgICAgIFRodXMgaWYgeW91IHdhbnQgdG8gdXNlIFxmc3BsaXQoKSByZXBlYXRlZGx5IG9uIHRoZSBzYW1lIGFycmF5LAogICAgICAgICAgZWl0aGVyIGRpbWVuc2lvbiBpdCBpbiBhZHZhbmNlIHRvIHRoZSBtYXhpbXVtIGV4cGVjdGVkIHNpemUKICAgICAgICAgIChhbmQgdGhlbiBzb21lIC0tIG1vcmUgZWZmaWNpZW50KSwgb3IgZWxzZSBkZXN0cm95IGl0IGFmdGVyCiAgICAgICAgICBlYWNoIHVzZSAodG8gYWxsb3cgZm9yIHVuZXhwZWN0ZWRseSBsYXJnZSBhcmd1bWVudHMpLiBFeGFtcGxlCiAgICAgICAgICB1c2luZyBhIGR5bmFtaWMgYXJyYXk6CgogIGZvcGVuIC9yZWFkIFwlYyBzb21lLWZpbGUKICBpZiBmYWlsIC4uLgogIHNldCBmdW5jdGlvbiBlcnJvciBvbiAgICA7IFNlZSBbNTczXVNlY3Rpb24gNy4xMgogIHdoaWxlIHRydWUgewogICAgICBkY2wgXCZ3W10gICAgICAgICAgICA7IERlc3Ryb3kgXCZbd10gZWFjaCB0aW1lIHRocnUgdGhlIGxvb3AKICAgICAgZnJlYWQgL2xpbmUgXCVjIFwlYQogICAgICBpZiBmYWlsIGJyZWFrCiAgICAgIGFzZyBcJXggXGZzcGxpdChcJWEsJncpCiAgICAgIGlmIGZhaWwgLi4uCiAgICAgIDsgKGRvIHdoYXQgeW91IHdhbnQgd2l0aCBcJndbXSBoZXJlLi4uKQogIH0KICBmY2xvc2UgXCVjCgogICBcZnJpbmRleChzMSxzMixuKQogICAgICAgICAgVGhlICJuIiBhcmd1bWVudCB0byBcZnJpbmRleCgpIG5vdyB3b3JrcyBjb25zaXN0ZW50bHkgKGluCiAgICAgICAgICBtaXJyb3IgaW1hZ2UpIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgXGZpbmRleCgpIGFyZ3VtZW50LiBJbgogICAgICAgICAgZWFjaCBjYXNlLCB0aGUgKG4tMSktbW9zdCBjaGFyYWN0ZXJzIG9mIHMyIGFyZSBpZ25vcmVkIGluIHRoZQogICAgICAgICAgc2VhcmNoOyBmb3IgZmluZGV4LCB0aGlzIG1lYW5zIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUKICAgICAgICAgIHNlYXJjaCBpcyBuICh0aGUgZGVmYXVsdCBuaXMgMSwgYW5kIDAgaXMgdHJlYXRlZCBsaWtlIDEpLiBGb3IKICAgICAgICAgIFxmcmluZGV4KCkgaXQgbWVhbnMgdGhlIGRlZmF1bHQgc3RhcnRpbmcgcG9pbnQgaXM6CgogIGxlbmd0aChzMikgLSBsZW5ndGgoczEpIC0gbiAod2l0aCB0aGUgc2FtZSBkZWZhdWx0cyBmb3IgbikuCgogICBcZnNlYXJjaChwYXR0ZXJuLHN0cmluZ1sscG9zaXRpb25dKQogICAgICAgICAgRXhhY3RseSBsaWtlIFxmaW5kZXgoKSwgZXhjZXB0IHdpdGggYSBwYXR0ZXJuIChzZWUgWzU3NF1TZWN0aW9uCiAgICAgICAgICA3LjkpIHJhdGhlciB0aGFuIGEgbGl0ZXJhbCBzdHJpbmcuCgogICBcZnJzZWFyY2gocGF0dGVybixzdHJpbmdbLHBvc2l0aW9uXSkKICAgICAgICAgIEV4YWN0bHkgbGlrZSBcZnJpbmRleCgpLCBleGNlcHQgd2l0aCBhIHBhdHRlcm4gcmF0aGVyIHRoYW4gYQogICAgICAgICAgbGl0ZXJhbCBzdHJpbmcuCgogICAgICAgICAgRmlsZSBGdW5jdGlvbnM6CgogICBcZmZpbGVzKCksIFxmbmV4dGZpbGUoKQogICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBjb3B5IHRoZSBmaWxlIGxpc3QgdG8gYW4gYXJyYXkKICAgICAgICAgIGJlZm9yZSB1c2UsIGFzIHNob3duIG9uIHAuMzk4IG9mIFs1NzVdVXNpbmcgQy1LZXJtaXQgMm5kCiAgICAgICAgICBFZGl0aW9uLiBcZmZpbGVzKCkgYW5kIGZyaWVuZHMgbm93IG1ha2UgdGhlaXIgb3duIHNhZmUgY29waWVzCiAgICAgICAgICBvZiB0aGUgZmlsZSBsaXN0LiBUaHVzIGNvbnN0cnVjdGlvbnMgbGlrZSB0aGUgZm9sbG93aW5nIGFyZSBub3cKICAgICAgICAgIHBvc3NpYmxlOgoKICBmb3IgXCVpIDEgXGZmaWxlcygqLnR4dCkgMSB7IHNlbmQgXGZuZXh0ZmlsZSgpIH0KCiAgICAgICAgICBUaGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgbmV3IGZ1bmN0aW9uIFxmcmZpbGVzKCksCiAgICAgICAgICBcZmRpcmVjdG9yaWVzKCksIGFuZCBcZnJkaXJlY3RvcmllcygpLCBkZXNjcmliZWQgaW4KICAgICAgICAgIFs1NzZdU2VjdGlvbiA0LjExLjMuCgogICAgICAgICAgQnV0IG5vdGUgdGhhdCBlYWNoIHJlZmVyZW5jZSB0byBcZm5leHRmaWxlKCkgc3RpbGwgZ2V0cyB5b3UgdGhlCiAgICAgICAgICBuZXh0IGZpbGUuIFNvICJpZiBuZXdlciBcZm5leHRmaWxlKCkgZm9vLnR4dCBzZW5kIFxmbmV4dGZpbGUoKSIKICAgICAgICAgIGNvbXBhcmVzIG9uZSBmaWxlJ3MgYWdlIHdpdGggdGhhdCBvZiBmb28udHh0LCBhbmQgdGhlbiBzZW5kcyBhbgogICAgICAgICAgZW50aXJlbHkgZGlmZmVyZW50IGZpbGUuIElmIHlvdSdyZSBnb2luZyB0byByZWZlciB0byB0aGUgc2FtZQogICAgICAgICAgZmlsZSBtb3JlIHRoYW4gb25jZSwgYXNzaWduIGl0IHRvIGEgdmFyaWFibGU6CgogIGFzZyBcJWYgXGZuZXh0ZmlsZSgpCiAgaWYgbmV3ZXIgXCVmIGZvby50eHQgc2VuZCBcJWYKCiAgICAgICAgICAobm90ZTogYXNzaWduLCBub3QgZGVmaW5lKS4KCiAgICAgICAgICBBbHNvIG5vdGUgdGhhdCBcZmZpbGVzKCksIFxmcmZpbGVzKCksIFxmZGlyZWN0b3JpZXMoKSwgYW5kCiAgICAgICAgICBcZnJkaXJlY3RvcmllcygpIGFsbCBub3cgYWNjZXB0IG9uIG9wdGlvbmFsIDJuZCBhcmd1bWVudDogdGhlCiAgICAgICAgICBuYW1lIG9mIGFuIGFycmF5IHRvIGxvYWQgd2l0aCB0aGUgcmVzdWx0aW5nIGZpbGUgb3IgZGlyZWN0b3J5CiAgICAgICAgICBsaXN0LCBleHBsYWluZWQgaW4gWzU3N11TZWN0aW9uIDQuMTEuMy4gU28geW91IGNhbiBhbHNvIGxvYWQgYW4KICAgICAgICAgIGFycmF5IHdpdGggdGhlIGZpbGVsaXN0IHdoZW4geW91IG5lZWQgdG8gcmVmZXIgdG8gdGhlIHNhbWUgZmlsZQogICAgICAgICAgbW9yZSB0aGFuIG9uY2U6CgogIGZvciBcJWkgMSBcZmZpbGVzKCosJmEpIDEgeyBpZiBuZXdlciBcJmFbXCVpXSBmb28udHh0IHNlbmQgXCZhW1wlaV0gfQoKICAgXGZwZXJtaXNzaW9ucyhmaWxlKQogICAgICAgICAgUmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgcGVybWlzc2lvbnMgc3RyaW5nIGZvciB0aGUgZmlsZSwKICAgICAgICAgIHN1Y2ggYXMgIi1ydy1ydy1yLS0iIGluIFVOSVggb3IgIihSV0UsUldFLFJFLEUpIiBpbiBWTVMuCgogICBcZmRpcm5hbWUoZikKICAgICAgICAgIEdpdmVuIGEgZmlsZSBzcGVjaWZpY2F0aW9uIGYsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUKICAgICAgICAgIGNvbXBsZXRlIHBhdGhuYW1lIG9mIGRpcmVjdG9yeSB0aGUgZmlsZSBpcyBpbi4KCiAgIEFycmF5IEZ1bmN0aW9uczoKCiAgIFxmZGltZW5zaW9uKCZhKQogICAgICAgICAgUmV0dXJucyB0aGUgZGltZW5zaW9uIGRlY2xhcmVkIGZvciB0aGUgYXJyYXkgd2hvc2UgaWRlbnRpZnlpbmcKICAgICAgICAgIGxldHRlciwgYS16LCBvciBzcGVjaWFsIGNoYXJhY3RlciAiXyIgb3IgIkAiLCBpcyBnaXZlbiBhZnRlcgogICAgICAgICAgdGhlICImIiBpbiB0aGUgYXJndW1lbnQuIElmIHRoZSBhcnJheSBpcyBub3QgZGVjbGFyZWQsIDAgaXMKICAgICAgICAgIHJldHVybmVkLiBOb3RlIHRoYXQgd2hlbiB1c2VkIHdpdGggdGhlIG1hY3JvIGFyZ3VtZW50IHZlY3RvcgogICAgICAgICAgYXJyYXksIFwmX1tdIChzZWUgWzU3OF1TZWN0aW9uIDcuNSksIHRoZSB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICBpcyBvbmUgbGVzcyB0aGFuIFx2KGFyZ2MpLCBhbmQgd2hlbiB1c2VkIHdpdGggdGhlIEMtS2VybWl0CiAgICAgICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnQgdmVjdG9yIGFycmF5LCBcJkBbXSwgaXQgaXMgZXF1YWwgdG8gdGhlCiAgICAgICAgICBcdihhcmdzKSB2YXJpYWJsZS4gRXhhbXBsZXM6CgogIGVjaG8gXGZkaW1lbnNpb24oJmEpICAgICAgIDsgTm90IGRlY2xhcmVkLgogIDAKICBkZWNsYXJlIFwmYVsxMl0gICAgICAgICAgICA7IE5vdyBpdCdzIGRlY2xhcmVkLgogIGVjaG8gXGZkaW0oJmEpCiAgMTIKCiAgIFxmYXJyYXlsb29rKHBhdHRlcm4sYXJyYXluYW1lKQogICAgICAgICAgTG9va3MgaW4gdGhlIGdpdmVuIGFycmF5IGZvciB0aGUgcGF0dGVybiBhbmQgcmV0dXJucyB0aGUgaW5kZXgKICAgICAgICAgIG9mIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgbWF0Y2hlcywgaWYgYW55LCBvciAtMSBpZiBub25lIG1hdGNoLgogICAgICAgICAgVGhlIGFycmF5bmFtZSBjYW4gaW5jbHVkZSBhIHJhbmdlIHNwZWNpZmllciB0byByZXN0cmljdCB0bwogICAgICAgICAgc2VhcmNoIHRvIGEgc2VnbWVudCBvZiB0aGUgYXJyYXksIGUuZy4KICAgICAgICAgIFxmYXJyYXlsb29rKCp4eXoqLCZhWzMyOjYzXSkuIEZvciBncmVhdGVyIGRldGFpbCBzZWUKICAgICAgICAgIFs1NzldU2VjdGlvbiA3LjEwLjcuCgogICBcZnRhYmxlbG9vayhrZXl3b3JkLGFycmF5bmFtZVssZGVsaW1pdGVyXSkKICAgICAgICAgIExvb2tzIGluIHRoZSBnaXZlbiAidGFibGUiLCB3aGljaCBtdXN0IGJlIHNvcnRlZCwgZm9yIHRoZSBnaXZlbgogICAgICAgICAga2V5d29yZC4gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRhYmxlIGVsZW1lbnQgdGhhdCB1bmlxdWVseQogICAgICAgICAgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5d29yZCwgb3IgLTEgaWYgbm9uZSBtYXRjaCwgb3IgLTIgaWYgbW9yZQogICAgICAgICAgdGhhbiAxIG1hdGNoLiBGb3IgZ3JlYXRlciBkZXRhaWwgc2VlIFs1ODBdU2VjdGlvbiA3LjEwLjcuCgogICBPdGhlciBuZXcgZnVuY3Rpb25zOgoKICAgXGZpcDJoZXgocykKICAgICAgICAgIENvbnZlcnRzIGEgZG90dGVkIGRlY2ltYWwgSVAgYWRkcmVzcyB0byBhbiA4LWRpZ2l0IGhleGFkZWNpbWFsCiAgICAgICAgICBudW1iZXIuIFxmaXAyaGV4KDEyOC41OS4zOS4yKSA9IDgwM2IyNzAyLgoKICAgXGZoZXgyaXAoeCkKICAgICAgICAgIENvbnZlcnRzIGFuIDgtZGlnaXQgaGV4YWRlY2ltYWwgSVAgYWRkcmVzcyB0byBkb3R0ZWQgZGVjaW1hbAogICAgICAgICAgZm9ybSwgZS5nLiBcZmhleDJpcCg4MDNiMjcwMikgPSAxMjguNTkuMzkuMi4gVGhlIGludmVyc2Ugb2YKICAgICAgICAgIFxmaXAyaGV4KCkuCgogICBcZmNvbW1hbmQoKQogICBcZnJhd2NvbW1hbmQoKQogICAgICAgICAgVGhlc2UgcnVuIGFuIGV4dGVybmFsIGNvbW1hbmQgYW5kIHJldHVybiBpdHMgb3V0cHV0OyBzZWUKICAgICAgICAgIFs1ODFdU2VjdGlvbiA0LjIuOC40LgoKICAgXGZkaWFsY29udmVydChzKQogICAgICAgICAgcyBpcyBhIHBob25lIG51bWJlciBpbiBlaXRoZXIgbGl0ZXJhbCBvciBwb3J0YWJsZSBmb3JtYXQgKG5vdCBhCiAgICAgICAgICBkaWFsaW5nIGRpcmVjdG9yeSBlbnRyeSBuYW1lKS4gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGRpYWwKICAgICAgICAgIHN0cmluZyB0aGF0IHdvdWxkIGFjdHVhbGx5IGJlIHVzZWQgd2hlbiBkaWFsaW5nIGZyb20gdGhlCiAgICAgICAgICBjdXJyZW50IGxvY2F0aW9uIChhZnRlciBwcm9jZXNzaW5nIGNvdW50cnkgY29kZSwgYXJlYSBjb2RlLCBhbmQKICAgICAgICAgIG90aGVyIFNFVCBESUFMIHZhbHVlcykuCgogICBcZmVycnN0cmluZyhuKQogICAgICAgICAgUmV0dXJucyB0aGUgc3lzdGVtIGVycm9yIG1lc3NhZ2UgYXNzb2NpYXRlZCB3aXRoIHRoZSAobnVtZXJpYykKICAgICAgICAgIGVycm9yIGNvZGUgbi4gVU5JWCBhbmQgVk1TIG9ubHkuIFVzZSBpbiBjb25qdW5jdGlvbiB3aXRoCiAgICAgICAgICBcdihlcnJubykgb3IgXHYocGV4aXRzdGF0KS4gU2VlIFs1ODJdU2VjdGlvbiA0LjIuNSBmb3IgYSB1c2FnZQogICAgICAgICAgZXhhbXBsZS4gTm90ZTogVGhpcyBmdW5jdGlvbiBkb2Vzbid0IHdvcmsgaW4gV2luZG93cyBiZWNhdXNlCiAgICAgICAgICB0aGVyZSBpcyBub3QgYSBjb25zaXN0ZW50IGVycm9yLWNvZGUtdG8tbWVzc2FnZSBtYXBwaW5nOyBlcnJvcgogICAgICAgICAgY29kZSAieCIgbWVhbnMgc29tZXRoaW5nIGNvbXBsZXRlbHkgZGlmZmVyZW50IGRlcGVuZGluZyBvbgogICAgICAgICAgd2hldGhlciBpdCBjb21lcyBmcm9tIHRoZSBDIHJ1bnRpbWUgbGlicmFyeSwgV2luc29jaywgYQogICAgICAgICAgV2luZG93cy0zMiBBUEksIFRBUEksIGV0YywKCiAgIFxmcGF0dGVybihzKQogICAgICAgICAgVXNlZCBpbiBJTlBVVCwgUkVJTlBVVCwgYW5kIE1JTlBVVCBjb21tYW5kcyB0byBkZW5vdGUgc2VhcmNoCiAgICAgICAgICBzdHJpbmdzIHRoYXQgYXJlIHRvIGJlIHRyZWF0ZWQgYXMgcGF0dGVybnMgcmF0aGVyIHRoYW4KICAgICAgICAgIGxpdGVyYWxseS4KCiAgIEFsc28gc2VlIFs1ODNdU2VjdGlvbiA3Ljggb24gYnVpbHQtaW4gaGVscCBmb3IgZnVuY3Rpb25zLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDcuNC4gTmV3IElGIENvbmRpdGlvbnMKCiAgIElGIEFWQUlMQUJMRSBmZWF0dXJlIGNvbW1hbmQKICAgICAgICAgIEV4ZWN1dGVzIHRoZSBjb21tYW5kIGlmIHRoZSBnaXZlbiBmZWF0dXJlIGlzIGF2YWlsYWJsZS4KICAgICAgICAgIFByZXNlbnRseSB1c2VkIG9ubHkgdG8gZGV0ZXJtaW5lIGlmIHNwZWNpZmljIGF1dGhlbnRpY2F0aW9uIGFuZAogICAgICAgICAgZW5jcnlwdGlvbiBvcHRpb25zIGFyZSBhdmFpbGFibGUuIFR5cGUgImlmIGF2YWlsYWJsZSA/IiB0byBzZWUKICAgICAgICAgIHdoaWNoIGZlYXR1cmVzIG1heSBiZSB0ZXN0ZWQuCgogICBJRiBGTE9BVCBmMSBjb21tYW5kCiAgICAgICAgICBFeGVjdXRlcyBjb21tYW5kIGlmIGYxIGlzIGEgbGVnYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVyICh3aGljaAogICAgICAgICAgaW5jbHVkZXMgaW50ZWdlcnMpLiBVc2UgdGhpcyB0byBwcmV2ZXJpZnkgYXJndW1lbnRzIGZvciB0aGUKICAgICAgICAgIFxmZnAuLi4oKSBmbG9hdGluZy1wb2ludCBhcml0aG1ldGljIGZ1bmN0aW9ucywgZS5nLiAiaWYgZmxvYXQKICAgICAgICAgIFwlMSBlY2hvIFxmZnBpbnQoXCUxKSIuCgogICBJRiA9PSBuMSBuMiBjb21tYW5kCiAgICAgICAgICBTeW5vbnltIGZvciAiaWYgPSIgKG51bWVyaWMgZXF1YWxpdHkpLiBOb3RlIHRoYXQgYXMgb2YgQy1LZXJtaXQKICAgICAgICAgIDcuMCwgdGhpcyBhbmQgYWxsIG90aGVyIG51bWVyaWMgY29tcGFyaXNvbiBvcGVyYXRvcnMgYWxzbyB3b3JrCiAgICAgICAgICBmb3IgZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KCiAgIElGICE9IG4xIG4yIGNvbW1hbmQKICAgICAgICAgIEV4ZWN1dGVzIHRoZSBjb21tYW5kIGlmIG4xIGFuZCBuMiBhcmUgYm90aCBudW1iZXJzIG9yIHZhcmlhYmxlcwogICAgICAgICAgY29udGFpbmluZyBudW1iZXJzIGFuZCB0aGUgdmFsdWUgb2YgbjEgaXMgbm90IGVxdWFsIHRvIHRoZQogICAgICAgICAgdmFsdWUgb2YgbjIuIFRoaXMgaXMgZXF1aXZhbGVudCB0byAiaWYgbm90ID0gbjEgbjIiLgoKICAgSUYgPD0gbjEgbjIgY29tbWFuZAogICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgbjEgYW5kIG4yIGFyZSBib3RoIG51bWJlcnMgb3IgdmFyaWFibGVzCiAgICAgICAgICBjb250YWluaW5nIG51bWJlcnMgYW5kIHRoZSB2YWx1ZSBvZiBuMSBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8KICAgICAgICAgIHRoZSB2YWx1ZSBvZiBuMi4gVGhpcyBpcyBlcXVpdmFsZW50IHRvICJpZiBub3QgPiBuMSBuMiIuCgogICBJRiA+PSBuMSBuMiBjb21tYW5kCiAgICAgICAgICBFeGVjdXRlcyB0aGUgY29tbWFuZCBpZiBuMSBhbmQgbjIgYXJlIGJvdGggbnVtYmVycyBvciB2YXJpYWJsZXMKICAgICAgICAgIGNvbnRhaW5pbmcgbnVtYmVycyBhbmQgdGhlIHZhbHVlIG9mIG4xIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAogICAgICAgICAgdG8gdGhlIHZhbHVlIG9mIG4yLiBFcXVpdmFsZW50IHRvICJpZiBub3QgPCBuMSBuMiIuCgogICBJRiBDT01NQU5EIHdvcmQgY29tbWFuZAogICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgd29yZCBpcyBhIGJ1aWx0LWluIEMtS2VybWl0IGNvbW1hbmQuCiAgICAgICAgICBFeGFtcGxlOgoKICBpZiBub3QgY29tbWFuZCBjb3B5IGRlZmluZSB7IGNvcHkgcnVuIGNvcHkgXCUxIFwlMiB9Ii4KCiAgICAgICAgICBUaGlzIGRlZmluZXMgYSBDT1BZIG1hY3JvIHRoYXQgcnVucyBhbiBleHRlcm5hbCBDT1BZIGNvbW1hbmQgaWYKICAgICAgICAgIENPUFkgaXMgbm90IGFscmVhZHkgYSBidWlsdC1pbiBjb21tYW5kLgoKICAgSUYgTE9DQUwgY29tbWFuZAogICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgS2VybWl0IGlzIGluIGxvY2FsIG1vZGUsIGkuZS4gaWYgaXQgaGFzCiAgICAgICAgICBhIFNFVCBMSU5FLCBTRVQgUE9SVCwgb3IgU0VUIEhPU1QgKFRFTE5FVCwgUkxPR0lOLCBldGMpIGRldmljZQogICAgICAgICAgb3IgY29ubmVjdGlvbiBvcGVuLiBEb2VzIG5vdCBleGVjdXRlIHRoZSBjb21tYW5kIGlmIGluIHJlbW90ZQogICAgICAgICAgbW9kZS4KCiAgIElGIE1BVENIIHN0cmluZyBwYXR0ZXJuIGNvbW1hbmQKICAgICAgICAgIEV4ZWN1dGVzIHRoZSBjb21tYW5kIGlmIHRoZSBzdHJpbmcgbWF0Y2hlcyB0aGUgcGF0dGVybi4gRm9yIGEKICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggZm9yIHRoZSBwYXR0ZXJuLCBzZWUgWzU4NF1TZWN0aW9uCiAgICAgICAgICA0LjkuMS4gSWYgeW91IHdhbnQgdG8gdGVzdCBpZiB0aGUgc3RyaW5nIGNvbnRhaW5zIHBhdHRlcm4sIHVzZQogICAgICAgICAgSUYgXGZzZWFyY2gocGF0dGVybixzdHJpbmcpLgoKICAgSUYgT1BFTiB7IERFQlVHLUxPRywgU0VTU0lPTi1MT0csIFRSQU5TQUNUSU9OLUxPRywgLi4uIH0gY29tbWFuZAogICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgdGhlIGdpdmVuIGZpbGUgaXMgb3BlbiwgZmFpbHMgaWYgaXQgaXMKICAgICAgICAgIG5vdCBvcGVuLiBUeXBlIElGIE9QRU4gPyBmb3IgYSBjb21wbGV0ZSBsaXN0IG9mIGZpbGVzIHRoYXQgY2FuCiAgICAgICAgICBiZSBjaGVja2VkIChhbGwgdGhlIGZpbGVzIHRoYXQgY2FuIGJlIG9wZW5lZCB3aXRoIHRoZSBPUEVOIG9yCiAgICAgICAgICBMT0cgY29tbWFuZHMpLgoKICAgSUYgUVVJRVQgY29tbWFuZAogICAgICAgICAgRXhlY3V0ZXMgdGhlIGNvbW1hbmQgaWYgU0VUIFFVSUVUIGlzIE9OLCBhbmQgZG9lcyBub3QgZXhlY3V0ZQogICAgICAgICAgaXQgaWYgU0VUIFFVSUVUIGlzIE9GRi4gRXhhbXBsZTogSUYgTk9UIFFVSUVUIEVDSE8geyBUaGlzIGlzIGEKICAgICAgICAgIG1lc3NhZ2UufS4KCiAgIElGIFJFQURBQkxFIG5hbWUKICAgICAgICAgIFN1Y2NlZWRzIGlmIG5hbWUgaXMgdGhlIG5hbWUgb2YgYW4gZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkKICAgICAgICAgIHRoYXQgaXMgcmVhZGFibGUuCgogICBJRiBXUklURUFCTEUgbmFtZQogICAgICAgICAgU3VjY2VlZHMgaWYgbmFtZSBpcyB0aGUgbmFtZSBvZiBhbiBleGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeQogICAgICAgICAgdGhhdCBpcyB3cml0ZWFibGUsIGUuZy46CgogIGlmIG5vdCB3cml0ZWFibGUgXHYobG9ja2RpcikgZWNobyBQbGVhc2UgcmVhZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zIQoKICAgSUYgRkxBRyBjb21tYW5kCiAgICAgICAgICBUaGlzIHRlc3RzIGEgdXNlci1zZXR0YWJsZSBjb25kaXRpb24sIHdoaWNoIGNhbiBtZWFuIGFueXRoaW5nCiAgICAgICAgICB5b3UgbGlrZS4gU0VUIEZMQUcgT04gY2F1c2VzIHN1YnNlcXVlbnQgSUYgRkxBRyBjb21tYW5kcyB0bwogICAgICAgICAgc3VjY2VlZDsgU0VUIEZMQUcgT0ZGIGNhdXNlcyB0aGVtIHRvIGZhaWwuIE9uZSB3YXkgdG8gdXNlIGl0CiAgICAgICAgICB3b3VsZCBiZSBmb3IgZGVidWdnaW5nIHlvdXIgc2NyaXB0czsgcHJlY2VkZSBhbnkgZGVidWdnaW5nCiAgICAgICAgICBzdGF0ZW1lbnRzIHdpdGggSUYgRkxBRy4gVGhlbiBTRVQgRkxBRyBvbiB0byBkZWJ1ZyB5b3VyIHNjcmlwdCwKICAgICAgICAgIFNFVCBGTEFHIE9GRiB0byBydW4gaXQgd2l0aG91dCBkZWJ1Z2dpbmcuIEFub3RoZXIgY29tbW9uIHVzZSBpcwogICAgICAgICAgZm9yIGNhdXNpbmcgYW4gaW5uZXIgbG9vcCB0byBjYXVzZSBhbiBvdXRlciBsb29wIHRvIGV4aXQuCgogICBJRiBDLUtFUk1JVCBjb21tYW5kCiAgICAgICAgICBDLUtlcm1pdCwgYnV0IG5vdCBLZXJtaXQgOTUgb3IgTVMtRE9TIEtlcm1pdCwgZXhlY3V0ZXMgdGhlCiAgICAgICAgICBjb21tYW5kLgoKICAgSUYgSy05NSBjb21tYW5kCiAgICAgICAgICBLZXJtaXQgOTUsIGJ1dCBub3QgQy1LZXJtaXQgb3IgTVMtRE9TIEtlcm1pdCwgZXhlY3V0ZXMgdGhlCiAgICAgICAgICBjb21tYW5kLgoKICAgSUYgTVMtS0VSTUlUIGNvbW1hbmQKICAgICAgICAgIE1TLURPUyBLZXJtaXQsIGJ1dCBub3QgQy1LZXJtaXQgb3IgS2VybWl0IDk1LCBleGVjdXRlcyB0aGUKICAgICAgICAgIGNvbW1hbmQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy41LiBVc2luZyBNb3JlIHRoYW4gVGVuIE1hY3JvIEFyZ3VtZW50cwoKICAgVGhlIFx2KGFyZ2MpIHZhcmlhYmxlIG5vdyBnaXZlcyB0aGUgYWN0dWFsIG51bWJlciBvZiBhcmd1bWVudHMsIGV2ZW4KICAgaWYgdGhlIG51bWJlciBpcyBncmVhdGVyIHRoYW4gOToKCiAgQy1LZXJtaXQ+IGRlZmluZSB4eCBlY2hvIFx2KGFyZ2MpCiAgQy1LZXJtaXQ+IHh4IGEgYiBjIGQgZSBmIGcgaCBpIGogayBsIG0gbiBvIHAgcSByIHMgdCB1IHYgdyB4IHkgegogIDI3CgogICBSZW1lbWJlciB0aGF0IFx2KGFyZ2MpIGluY2x1ZGVzIHRoZSBuYW1lIG9mIHRoZSBtYWNybyBpdHNlbGYsIHNvIGl0IGlzCiAgIGFsd2F5cyBhdCBsZWFzdCAxLCBhbmQgaXMgYWx3YXlzIDEgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mCiAgIGFyZ3VtZW50cy4gQXMgaW4gdmVyc2lvbnMgNi4wIGFuZCBlYXJsaWVyLCBpZiBtb3JlIHRoYW4gOSBhcmd1bWVudHMKICAgYXJlIGdpdmVuLCBvbmx5IHRoZSBmaXJzdCBuaW5lIGFyZSBhc3NpZ25lZCB0byB0aGUgdmFyaWFibGVzIFwlMS4uXCU5LgoKICAgVGhlIFwmX1tdIGFycmF5LCBkaXNjdXNzZWQgb24gcGFnZSAzNTMgb2YgWzU4NV1Vc2luZyBDLUtlcm1pdCwgMm5kIGVkLAogICBub3cgaG9sZHMgYWxsIHRoZSBhcmd1bWVudHMsIHVwIHRvIHNvbWUgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IGxpbWl0CiAgICg2NCBvciBncmVhdGVyKSwgcmF0aGVyIHRoYW4gb25seSB0aGUgZmlyc3QgOS4gVG8gaWxsdXN0cmF0ZTogdGhlCiAgIGZvbGxvd2luZyBtYWNybyB0ZWxscyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBpdCB3YXMgY2FsbGVkIHdpdGggYW5kCiAgIHRoZW4gcHJpbnRzIHRoZW06CgogIGRlZmluZSBzaG93X2FsbF9hcmdzIHsKICAgICAgbG9jYWwgXCVpCiAgICAgIGVjaG8gXCZfWzBdIC0gTnVtYmVyIG9mIGFyZ3VtZW50czogXGZldmFsKFx2KGFyZ2MpLTEpCiAgICAgIGZvciBcJWkgMSBcdihhcmdjKS0xIDEgeyBlY2hvIFxmbHBhZChcJWksMykuICJcJl9bXCVpXSIgfQogIH0KCiAgIFdpdGhpbiBhIG1hY3JvIFwmX1swXSwgbGlrZSBcJTAsIGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBtYWNyby4KCiAgIEF0IHRvcCBsZXZlbCwgdGhlIFwmX1tdIGFycmF5IGlzIGZpbGxlZCBhcyBmb2xsb3dzOgoKICAgICAqIElmIHRoZSBmaXJzdCBhcmd1bWVudCBvbiB0aGUgQy1LZXJtaXQgY29tbWFuZCBsaW5lIHdhcyBhIGZpbGVuYW1lLAogICAgICAgb3IgQy1LZXJtaXQgd2FzIGludm9rZWQgZnJvbSBhICJLZXJiYW5nIiBzY3JpcHQgKFs1ODZdU2VjdGlvbgogICAgICAgNy4xOSksIGVsZW1lbnQgMCBjb250YWlucyB0aGUgZmlsZW5hbWUsIGFuZCBlbGVtZW50cyAxIHRocm91Z2gKICAgICAgIFx2KGFyZ2MpLTEgaG9sZCB0aGUgcmVtYWluaW5nIGNvbW1hbmQtbGluZSBhcmd1bWVudHMuCiAgICAgKiBPdGhlcndpc2UgdGhlIHByb2dyYW0gbmFtZSBnb2VzIGluIGVsZW1lbnQgMCwgYW5kIGVsZW1lbnRzIDEKICAgICAgIHRocm91Z2ggXHYoYXJnYyktMSBob2xkIGFueSBhcmd1bWVudHMgdGhhdCB3ZXJlIGluY2x1ZGVkIGFmdGVyCiAgICAgICAiLS0iIG9yICI9IgoKICAgVGhlIG5ldyBcJSogdmFyaWFibGUsIHdoZW4gdXNlZCB3aXRoaW4gYSBtYWNybywgaXMgcmVwbGFjZWQgYnkgdGhlCiAgIHRleHQgdGhhdCBmb2xsb3dlZCB0aGUgbWFjcm8gbmFtZSBpbiB0aGUgbWFjcm8gaW52b2NhdGlvbi4gSWYgbm8KICAgYXJndW1lbnRzIHdlcmUgZ2l2ZW4sIFwlKiBpcyByZXBsYWNlZCBieSB0aGUgZW1wdHkgc3RyaW5nLiBFeGFtcGxlczoKCiAgQy1LZXJtaXQ+IGRlZmluZSB4eCBlY2hvIFtcJSpdCiAgQy1LZXJtaXQ+IGRlZmluZSBcJWEgb29mYQogIEMtS2VybWl0PiB4eAogIFtdCiAgQy1LZXJtaXQ+IHh4IFwlYQogIFtvb2ZhXQogIEMtS2VybWl0PiB4eCBhCiAgW2FdCiAgQy1LZXJtaXQ+IHh4IGEgYgogIFthIGJdCiAgQy1LZXJtaXQ+IHh4IGEgYiBjCiAgW2EgYiBjXQogIEMtS2VybWl0PiB4eCBhIGIgYyBkIGUgZiBnIGggaSBqIGsgbCBtIG4gbyBwIHEgciBzIHQgdSB2IHcgeCB5IHoKICBbYSBiIGMgZCBlIGYgZyBoIGkgaiBrIGwgbSBuIG8gcCBxIHIgcyB0IHUgdiB3IHggeSB6XQoKICAgTm90ZSB0aGF0IFwlKiBjYW4gbm90IGJlIHVzZWQgYXQgdG9wIGxldmVsLCBzaW5jZSBLZXJtaXQgZG9lcyBub3QgaGF2ZQogICBhY2Nlc3MgdG8gdGhlIHJhdyBjb21tYW5kIGxpbmUgKG9ubHkgdG8gaXRzIGVsZW1lbnRzIHNlcGFyYXRlbHksIGFmdGVyCiAgIHRoZXkgaGF2ZSBiZWVuIHByb2Nlc3NlZCBieSB0aGUgc2hlbGwgYW5kIHRoZSBDIGxpYnJhcnkpLgoKICAgQy1LZXJtaXQgNy4wIGFsc28gYWRkcyBhIFNISUZUIGNvbW1hbmQ6CgogICBTSElGVCBbIG51bWJlciBdCiAgICAgICAgICBTaGlmdHMgdGhlIG1hY3JvIGFyZ3VtZW50cyAoZXhjZXB0IGFyZ3VtZW50IDApIHRoZSBnaXZlbiBudW1iZXIKICAgICAgICAgIG9mIHBsYWNlcyB0byB0aGUgbGVmdCBhbmQgYWRqdXN0cyBcdihhcmdjKSBhY2NvcmRpbmdseS4gVGhlCiAgICAgICAgICBkZWZhdWx0IG51bWJlciBpcyAxLgoKICAgVG8gaWxsdXN0cmF0ZSwgc3VwcG9zZSBtYWNybyBYWFggaXMgaW52b2tlZCBhcyBmb2xsb3dzOgoKICB4eHggYXJnMSBhcmcyIGFyZzMKCiAgIFRoZW4gaW5zaWRlIFhYWCwgXCUxIGlzICJhcmcxIiwgXCUyIGlzICJhcmcyIiwgYW5kIFwlMyBpcyAiYXJnMyIuCiAgIEFmdGVyIGEgU0hJRlQgY29tbWFuZCBpcyBnaXZlbiBpbnNpZGUgWFhYLCB0aGVuIFwlMSBpcyAiYXJnMiIsIFwlMiBpcwogICAiYXJnMyIsIGFuZCBcJTMgaXMgZW1wdHkuIFwlMCAodGhlIG5hbWUgb2YgdGhlIG1hY3JvKSByZW1haW5zCiAgIHVuY2hhbmdlZC4KCiAgIElmIG1vcmUgdGhhbiA5IGFyZ3VtZW50cyB3ZXJlIGdpdmVuLCB0aGVuIGFyZ3VtZW50cyBhcmUgc2hpZnRlZCBpbnRvCiAgIHRoZSBcJTEuLjkgdmFyaWFibGVzIGZyb20gdGhlIGFyZ3VtZW50IHZlY3RvciBhcnJheS4KCiAgIEF0IHRvcCBsZXZlbCwgdGhlIFNISUZUIGNvbW1hbmQgb3BlcmF0ZXMgb24gdGhlIFwmX1tdIGFycmF5IGFuZCBcJTEuLjkKICAgdmFyaWFibGVzOyB0aGUgXCZAW10gYXJyYXkgaXMgbm90IGFmZmVjdGVkLiBTZWUgWzU4N11TZWN0aW9uIDcuMTYgZm9yCiAgIGRldGFpbHMuCgogICBUaGUgXCUqIHZhcmlhYmxlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgU0hJRlQgY29tbWFuZC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjYuIENsYXJpZmljYXRpb24gb2YgRnVuY3Rpb24gQ2FsbCBTeW50YXgKCiAgIFNwYWNlcyBhcmUgbm9ybWFsbHkgc3RyaXBwZWQgZnJvbSB0aGUgZnJvbnQgYW5kIGJhY2sgb2YgZWFjaCBmdW5jdGlvbgogICBhcmd1bWVudDsgdG8gcHJldmVudCB0aGlzIGVuY2xvc2UgdGhlIGFyZ3VtZW50IGluIGJyYWNlczoKCiAgXGZzcGxpdChcJWEsJmEseyB9KQoKICAgSG93ZXZlciwgZnVuY3Rpb24gY2FsbHMgdGhhdCBjb250YWluIHNwYWNlcyBjYW4gbWFrZSB0cm91YmxlIHdoZW4gdGhlCiAgIGZ1bmN0aW9uIGlzIHRvIGJlIHVzZWQgaW4gYSAid29yZCIgZmllbGQsIHNpbmNlIHNwYWNlIHNlcGFyYXRlcyB3b3Jkcy4KICAgRm9yIGV4YW1wbGU6CgogIGZvciBcJWkgMSBcZnNwbGl0KFwlYSwmYSx7IH0pIDEgewogICAgZWNobyBcJWkuICJcJmFbXCVpXSIKICB9CgogICBJbiBtb3N0IGNhc2VzLCB0aGUgdHJvdWJsZSBjYW4gYmUgYXZlcnRlZCBieSBlbmNsb3NpbmcgdGhlIGZ1bmN0aW9uCiAgIHJlZmVyZW5jZSBpbiBicmFjZXM6CgogIGZvciBcJWkgMSB7XGZzcGxpdChcJWEsJmEseyB9KX0gMSB7CiAgICBlY2hvIFwlaS4gIlwmYVtcJWldIgogIH0KCiAgIG9yIGJ5IHJlcGxhY2luZyBzcGFjZXMgd2l0aCBcMzIgKHRoZSBBU0NJSSBjb2RlIGZvciBzcGFjZSk6CgogIGZvciBcJWkgMSBcZnNwbGl0KFwlYSwmYSxcMzIpIDEgewogICAgZWNobyBcJWkuICJcJmFbXCVpXSIKICB9CgogICBCcmFjZXMgYXJlIGFsc28gdXNlZCBpbiBmdW5jdGlvbiBjYWxscyB0byBpbmRpY2F0ZSBncm91cGluZy4gRm9yCiAgIGV4YW1wbGU6CgogIFxmc3Vic3RyaW5nKGFiY2QsMiwyKSA9ICJiYyIKCiAgIEJ1dCBzdXBwb3NlICJhYmNkIiBuZWVkZWQgdG8gY29udGFpbiBhIGNvbW1hOgoKICBcZnN1YnN0cmluZyhhYixjZCwyLDIpCgogICBUaGlzIHdvdWxkIGNhdXNlIGFuIGVycm9yLCBzaW5jZSAiY2QiIGFwcGVhcnMgdG8gYmUgdGhlIHNlY29uZAogICBhcmd1bWVudCwgd2hlbiByZWFsbHkgeW91IHdhbnQgdGhlIGZpcnN0ICIyIiB0byBiZSB0aGUgc2Vjb25kCiAgIGFyZ3VtZW50LiBCcmFjZXMgdG8gdGhlIHJlc2N1ZToKCiAgXGZzdWJzdHJpbmcoe2FiLGNkfSwyLDIpID0gImIsIgoKICAgU2ltaWxhcmx5LCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgYXJlIHN0cmlwcGVkIGZyb20gZWFjaAogICBhcmd1bWVudCwgc286CgogIFxmc3Vic3RyaW5nKCBhYmNkICwyLDIpID0gImJjIgoKICAgYnV0IGJyYWNlcyBwcmVzZXJ2ZSB0aGVtOgoKICBcZnN1YnN0cmluZyh7IGFiY2QgfSwyLDIpID0gImFiIgoKICAgR2l2ZW4gdGhlc2Ugc3BlY2lhbCB1c2VzIGZvciBicmFjZXMsIHRoZXJlIGlzIG5vIHdheSB0byBwYXNzIGxpdGVyYWwKICAgYnJhY2VzIHRvIHRoZSBmdW5jdGlvbiBpdHNlbGYuIEZvciBleGFtcGxlOgoKICBcZnN1YnN0cmluZyhhYntjZCwyLDIpCgogICBjYXVzZXMgYW4gZXJyb3IuCgogICBTbyBpZiB5b3UgbmVlZCBhIGZ1bmN0aW9uIHRvIGluY2x1ZGUgYnJhY2VzLCBkZWZpbmUgYSB2YXJpYWJsZQogICBjb250YWluaW5nIHRoZSBzdHJpbmcgdGhhdCBoYXMgYnJhY2VzLiBFeGFtcGxlOgoKICBkZWZpbmUgXCVhIGFie2NkCiAgXGZzdWJzdHJpbmcoXCVhLDIsMikgPSAiYnsiCgogICBJZiB0aGUgc3RyaW5nIGlzIHRvIHN0YXJ0IHdpdGggYSBsZWFkaW5nIGJyYWNlIGFuZCBlbmQgd2l0aCBhIGNsb3NpbmcKICAgYnJhY2UsIHRoZW4gZG91YmxlIGJyYWNlcyBtdXN0IGFwcGVhciBhcm91bmQgdGhlIHN0cmluZyAod2hpY2ggaXRzZWxmCiAgIGlzIGVuY2xvc2VkIGluIGJyYWNlcyk6CgogIGRlZmluZSBcJWEge3t7Zm9vfX19CiAgXGZzdWJzdHJpbmcoXCVhKSA9ICJ7Zm9vfSIKCiAgIFRoaXMgYWxzbyB3b3JrcyBmb3IgYW55IG90aGVyIGtpbmQgb2Ygc3RyaW5nOgoKICBkZWZpbmUgXCVhIHt7YWJ7Y2R9fQogIGVjaG8gXGZzdWJzdHJpbmcoXCVhKSA9ICJhYntjZCIKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjcuIEF1dG9kb3dubG9hZCBkdXJpbmcgSU5QVVQgQ29tbWFuZCBFeGVjdXRpb24KCiAgIEFzIG9mIDYuMSAvIDEuMS4xMiwgQy1LZXJtaXQgY2FuIGJlIHRvbGQgdG8gbG9vayBmb3IgaW5jb21pbmcgS2VybWl0CiAgIChvciBabW9kZW0pIHBhY2tldHMgZHVyaW5nIGV4ZWN1dGlvbiBvZiBhbiBJTlBVVCBjb21tYW5kLiBCeSBkZWZhdWx0CiAgIChmb3IgY29uc2lzdGVuY3kgd2l0aCBlYXJsaWVyIHJlbGVhc2VzKSwgdGhpcyBpcyBub3QgZG9uZS4gWW91IGNhbgogICBlbmFibGUgdGhpcyBmZWF0dXJlIHdpdGg6CgogIFNFVCBJTlBVVCBBVVRPRE9XTkxPQUQgT04KCiAgIChhbmQgZGlzYWJsZSBpdCBhZ2FpbiB3aXRoIE9GRi4pCgogICBPbmUgcG9zc2libGUgdXNlIGZvciB0aGlzIGZlYXR1cmUgaXMgYXMgYSBzZXJ2ZXIgbW9kZSB3aXRoIGEgdGltZQogICBsaW1pdDoKCiAgSU5QVVQgMzYwMCBzZWNyZXQtc3RyaW5nLXRvLWVuZC10aGUtSU5QVVQtY29tbWFuZAoKICAgSW4gdGhpcyBleGFtcGxlLCBhbnkgR0VULCBTRU5ELCBvciBSRU1PVEUgY29tbWFuZHMgcmVjZWl2ZWQgd2l0aGluIG9uZQogICBob3VyICgzNjAwIHNlY29uZHMpIG9mIHdoZW4gdGhlIElOUFVUIGNvbW1hbmQgd2FzIGlzc3VlZCB3aWxsIGJlCiAgIGV4ZWN1dGVkLiBIZXJlJ3MgYW5vdGhlciBleGFtcGxlLCBpbiB3aGljaCB3ZSB3YW50IHRvIHN0YXkgb3BlbiB1bnRpbAogICAxMTozMHBtLCBvciB1bnRpbCBpbnRlcnJ1cHRlZCBieSBzZXZlbiBjb25zZWN1dGl2ZSBDdHJsLUMgKFwzKQogICBjaGFyYWN0ZXJzOgoKICBJTlBVVCAyMzozMDowMCBcM1wzXDNcM1wzXDNcMwoKICAgVGhlIElOUFVUIEFVVE9ET1dOTE9BRCBzZXR0aW5nIGlzIGRpc3BsYXllZCBieSBTSE9XIFNDUklQVFMgb3IgU0hPVwogICBJTlBVVC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjguIEJ1aWx0LWluIEhlbHAgZm9yIEZ1bmN0aW9ucy4KCiAgIEJlZ2lubmluZyBpbiBDLUtlcm1pdCA3LjAsIHlvdSBtYXkgb2J0YWluIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNhbGxpbmcKICAgY29udmVudGlvbnMgYW5kIHJldHVybiB2YWx1ZXMgb2YgYW55IGJ1aWx0LWluIGZ1bmN0aW9uLCBzdWNoIGFzCiAgIFxmc3Vic3RyaW5nKCksIHdpdGggdGhlIG5ldyBIRUxQIEZVTkNUSU9OIGNvbW1hbmQ7IGdpdmUgdGhlIGZ1bmN0aW9uJ3MKICAgbmFtZSB3aXRob3V0IHRoZSBsZWFkaW5nICJcZiIsIGUuZy4gImhlbHAgZnVuYyBzdWJzdHJpbmciLiBZb3UgY2FuIHVzZQogICA/LCBjb21wbGV0aW9uLCBhbmQgYWJicmV2aWF0aW9uIGluIHRoZSBub3JtYWwgbWFubmVyLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDcuOS4gVmFyaWFibGUgQXNzaWdubWVudHMKCiAgICA3LjkuMS4gQXNzaWdubWVudCBPcGVyYXRvcnMKCiAgIFByb2dyYW1tZXJzIGFjY3VzdG9tZWQgdG8gbGFuZ3VhZ2VzIHN1Y2ggYXMgQyBvciBGb3J0cmFuIG1pZ2h0IGZpbmQKICAgS2VybWl0J3MgbWV0aG9kIG9mIGFzc2lnbmluZyB2YWx1ZXMgdG8gdmFyaWFibGVzIHVubmF0dXJhbCBvciBhd2t3YXJkLgogICBCZWdpbm5pbmcgaW4gQy1LZXJtaXQgNy4wLCB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIGFsdGVybmF0aXZlCiAgIG5vdGF0aW9uOgoKIC5uYW1lID0gdmFsdWUgICAgaXMgZXF1aXZhbGVudCB0byAgIERFRklORSBuYW1lIHZhbHVlCiAubmFtZSA6PSB2YWx1ZSAgIGlzIGVxdWl2YWxlbnQgdG8gICBBU1NJR04gbmFtZSB2YWx1ZQogLm5hbWUgOjo9IHZhbHVlICBpcyBlcXVpdmFsZW50IHRvICAgQVNTSUdOIG5hbWUgXGZldmFsKHZhbHVlKQoKICAgV2hlbiB0aGUgY29tbWFuZCBiZWdpbnMgd2l0aCBhIHBlcmlvZCAoLiksIHRoaXMgaW5kaWNhdGVzIGFuCiAgIGFzc2lnbm1lbnQuIFRoZSBuYW1lIGNhbiBiZSBhIG1hY3JvIG5hbWUsIGEgXCV7ZGlnaXQsbGV0dGVyfSB2YXJpYWJsZSwKICAgb3IgYW4gYXJyYXkgZWxlbWVudC4gVGhlcmUgY2FuIGJlIHNwYWNlKHMpIGJldHdlZW4gIi4iIGFuZCB0aGUgbmFtZS4KICAgRXhhbXBsZXM6CgogIC5cJWEgPSBUaGlzIGlzIGEgc3RyaW5nICA7IFNhbWUgYXMgImRlZmluZSBcJWEgVGhpcyBpcyBhIHN0cmluZyIKICBlY2hvIFwlYQogIFRoaXMgaXMgYSBzdHJpbmcKCiAgLnh4eCA9IFwlYSAgICAgICAgICAgICAgIDsgU2FtZSBhcyAiZGVmaW5lIHh4eCBcJWEiCiAgZWNobyBcbSh4eHgpCiAgXCVhCgogIC54eHggOj0gXCVhICAgICAgICAgICAgICA7IFNhbWUgYXMgImFzc2lnbiB4eHggXCVhIgogIGVjaG8gXG0oeHh4KQogIFRoaXMgaXMgYSBzdHJpbmcKCiAgZGVjbGFyZSBcJmFbMl0gICAgICAgICAgIDsgVXNlIHdpdGggYXJyYXlzLi4uCiAgZGVmaW5lIFwlaSAyCiAgLlwmYVsxXSA9IGZpcnN0CiAgLlwmYVtcJWldID0gc2Vjb25kCgogICBUaGUgZm9sbG93aW5nIHNlcXVlbmNlIGlsbHVzdHJhdGVzIHRoZSBkaWZmZXJlbmNlcyBhbW9uZyB0aHJlZSBsZXZlbHMKICAgb2YgZXZhbHVhdGlvbjoKCiAgLlwleCA9IDIgICAgICAgICAgOyBEZWZpbmUgYSB2YXJpYWJsZSB0byBoYXZlIGEgbnVtZXJpYyB2YWx1ZQogIC5cJXkgPSAoMyArIFwleCkgIDsgRGVmaW5lIGFub3RoZXIgdmFyaWFibGUgYXMgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uCgogIC54eHggPSA0ICogXCV5ICAgIDsgIj0iIHNpbXBseSBjb3BpZXMgdGhlIHJpZ2h0LWhhbmQgc2lkZS4KICBlY2hvIFxtKHh4eCkKICA0ICogXCV5CgogIC54eHggOj0gNCAqIFwleSAgIDsgIjo9IiBldmFsdWF0ZXMgdGhlIHZhcmlhYmxlcyBmaXJzdCwgdGhlbiBjb3BpZXMuCiAgZWNobyBcbSh4eHgpCiAgNCAqICgzICsgMikKCiAgLnh4eCA6Oj0gNCAqIFwleSAgOyAiOjo9IiBldmFsdWF0ZXMgdGhlIGV4cHJlc3Npb24sIHRoZW4gY29waWVzLgogIGVjaG8gXG0oeHh4KQogIDIwCgogICBZb3UgY2FuIGFsc28gdXNlIHRoaXMgc3ludGF4IHRvIGNsZWFyICh1bmRlZmluZSkgYSB2YXJpYWJsZToKCiAgLlwlYSA9IG9vZmEgICAgICAgOyBEZWZpbmUgdGhlIHZhcmlhYmxlCiAgZWNobyAiXCVhIgogICJvb2ZhIgogIC5cJWEgICAgICAgICAgICAgIDsgQ2xlYXIgdGhlIHZhcmlhYmxlCiAgZWNobyAiXCVhIgogICIiCgogICBFeHRyYSBjcmVkaXQ6IENhbiB5b3UgZ3Vlc3Mgd2hhdCBoYXBwZW5zIGJlbG93IHdoZW4gdGhlIGZpbGUgImFiYyIKICAgZG9lcyBub3QgZXhpc3Q/CgogIGZvcGVuIC9yZWFkIFwlYyBhYmMKICBpZiBmYWlsIC4uLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNy45LjIuIE5ldyBBc3NpZ25tZW50IENvbW1hbmRzCgogICBSZWNhbGwgdGhlIERFRklORSBhbmQgQVNTSUdOIGNvbW1hbmRzLCBhbmQgdGhlaXIgaGlkZGVuIGNvdW50ZXJwYXJ0cywKICAgX0RFRklORSBhbmQgX0FTU0lHTi4gVGhlIGZvcm1lciB0YWtlIHRoZSB2YXJpYWJsZSBuYW1lIGxpdGVyYWxseSwgdGhlCiAgIGxhdHRlciBldmFsdWF0ZSB0aGUgdmFyaWFibGUtbmFtZSBmaWVsZCB0byBmb3JtIHRoZSB2YXJpYWJsZSBuYW1lCiAgIGR5bmFtaWNhbGx5LiBFeGFtcGxlczoKCiAgREVGSU5FIFwleCBmb28gICAgOyBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgXCV4IHRvICJmb28iLgogIERFRklORSBcJWEgXCV4ICAgIDsgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIFwlYSB0byAiXCV4Ii4KICBfREVGSU5FIHhfXCVhIFwleCA7IFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSB4X2ZvbyB0byAiXCV4Ii4KICBBU1NJR04gXCVhIFwleCAgICA7IFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBcJWEgdG8gdGhlICJmb28iLgogIF9BU1NJR04geF9cJWEgXCV4IDsgU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHhfZm9vIHRvICJmb28iLgoKICAgVGhpcyBjb25jZXB0IGhhcyBiZWVuIGNhcnJpZWQgb3ZlciB0byB0aGUgcmVtYWluaW5nCiAgIHZhcmlhYmxlLWFzc2lnbm1lbnQgY29tbWFuZHM6IEVWQUxVQVRFLCBJTkNSRU1FTlQsIGFuZCBERUNSRU1FTlQ6CgogICBFVkFMVUFURSB2YXJpYWJsZW5hbWUgZXhwcmVzc2lvbgogICAgICAgICAgRXZhbHVhdGVzIHRoZSBhcml0aG1ldGljIGV4cHJlc3Npb24gYW5kIGFzc2lnbnMgaXRzIHZhbHVlIHRvCiAgICAgICAgICB0aGUgdmFyaWFibGUgd2hvc2UgbmFtZSBpcyBnaXZlbi4gRXhhbXBsZTogImV2YWwgXCVhIDErMSIKICAgICAgICAgIGFzc2lnbnMgIjIiIHRvIFwlYS4KCiAgIF9FVkFMVUFURSBtZXRhbmFtZSBleHByZXNzaW9uCiAgICAgICAgICBFdmFsdWF0ZXMgdGhlIGFyaXRobWV0aWMgZXhwcmVzc2lvbiBhbmQgYXNzaWducyBpdHMgdmFsdWUgdG8KICAgICAgICAgIHRoZSB2YXJpYWJsZSB3aG9zZSBuYW1lIGlzIGNvbXB1dGVkIGZyb20gdGhlIGdpdmVuIG1ldGFuYW1lLgogICAgICAgICAgRXhhbXBsZTogImV2YWwgZm9vPFwlYT46OlwlMSBcJTIgKiAoXCUzICsgXCU0KSIgYXNzaWducyB0aGUKICAgICAgICAgIHZhbHVlIG9mICJcJTIgKiAoXCUzICsgXCU0KSIgdG8gdGhlIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMKICAgICAgICAgIGNvbXB1dGVkIGZyb20gImZvbzxcJWE+OjpcJTEiLgoKICAgSU5DUkVNRU5UIHZhcmlhYmxlbmFtZSBbIGV4cHJlc3Npb24gXQogICAgICAgICAgRXZhbHVhdGVzIHRoZSBhcml0aG1ldGljIGV4cHJlc3Npb24gYW5kIGFkZHMgaXRzIHZhbHVlIHRvIHRoZQogICAgICAgICAgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMgZ2l2ZW4uIEV4YW1wbGU6ICJpbmNyZW1lbnQKICAgICAgICAgIFwlYSIuCgogICBfSU5DUkVNRU5UIG1ldGFuYW1lIFsgZXhwcmVzc2lvbiBdCiAgICAgICAgICBFdmFsdWF0ZXMgdGhlIGFyaXRobWV0aWMgZXhwcmVzc2lvbiBhbmQgYWRkcyBpdHMgdmFsdWUgdG8gdGhlCiAgICAgICAgICB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgd2hvc2UgbmFtZSBpcyBjb21wdXRlZCBmcm9tIHRoZSBnaXZlbgogICAgICAgICAgbWV0YW5hbWUuIEV4YW1wbGU6ICJfaW5jcmVtZW50IFdvcmRzOjpcJTEuY291bnRbXCUyXSIuCgogICBERUNSRU1FTlQgdmFyaWFibGVuYW1lIFsgZXhwcmVzc2lvbiBdCiAgICAgICAgICBFdmFsdWF0ZXMgdGhlIGFyaXRobWV0aWMgZXhwcmVzc2lvbiBhbmQgc3VidHJhY3RzIGl0cyB2YWx1ZQogICAgICAgICAgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMgZ2l2ZW4uCgogICBfREVDUkVNRU5UIG1ldGFuYW1lIFsgZXhwcmVzc2lvbiBdCiAgICAgICAgICBFdmFsdWF0ZXMgdGhlIGFyaXRobWV0aWMgZXhwcmVzc2lvbiBhbmQgc3VidHJhY3RzIGl0cyB2YWx1ZQogICAgICAgICAgZnJvbSB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIHdob3NlIG5hbWUgaXMgY29tcHV0ZWQgZnJvbSB0aGUKICAgICAgICAgIGdpdmVuIG1ldGFuYW1lLgoKICAgV0FSTklORzogVGhlIHN5bnRheCBvZiB0aGUgRVZBTFVBVEUgY29tbWFuZCBoYXMgY2hhbmdlZCBzaW5jZSBDLUtlcm1pdAogICA2LjAgYW5kIEs5NSAxLjEuMTcuIFByZXZpb3VzbHksIGl0IGRpZCBub3QgaW5jbHVkZSBhIHZhcmlhYmxlIG5hbWUsCiAgIG9ubHkgYW4gZXhwcmVzc2lvbi4gVG8gcmVzdG9yZSB0aGUgb2xkIGJlaGF2aW9yLCB1c2UgU0VUIEVWQUxVQVRFIE9MRC4KICAgVG8gcmV0dXJuIHRvIHRoZSBuZXcgYmVoYXZpb3IgYWZ0ZXIgcmVzdG9yaW5nIHRoZSBvbGQgYmVoYXZpb3IsIHVzZQogICBTRVQgRVZBTFVBVEUgTkVXLgoKICAgTk9URTogVGhlcmUgYXJlIG5vIGFuYWxvZ3MgdG8gdGhlICJfIiBjb21tYW5kcyBmb3IgdGhlIG9wZXJhdG9ycwogICBkZXNjcmliZWQgaW4gWzU4OF1TZWN0aW9uIDcuOS4xOyB0aG9zZSBvcGVyYXRvcnMgY2FuIG5vdCBiZSB1c2VkIHRvCiAgIGFzc2lnbiB2YWx1ZXMgdG8gdmFyaWFibGVzIHdob3NlIG5hbWVzIG11c3QgYmUgY29tcHV0ZWQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy4xMC4gQXJyYXlzCgogICBDLUtlcm1pdCA3LjAgYWRkcyBsb3RzIG9mIG5ldyBhcnJheS1yZWxhdGVkIGZlYXR1cmVzLCBhbmQgZ3JvdXBzIHRoZW0KICAgdG9nZXRoZXIgdW5kZXIgdGhlIE5FVyBBUlJBWSBjb21tYW5kOgoKICAgQVJSQVkgeyBDTEVBUiwgQ09QWSwgREVDTEFSRSwgREVTVFJPWSwgUkVTSVpFLCBTSE9XLCBTT1JUIH0KCiAgIEluIGVhY2ggb2YgdGhlIEFSUkFZIGNvbW1hbmRzLCB3aGVyZXZlciBhbiBhcnJheSBuYW1lIGlzIGV4cGVjdGVkLAogICAic2hvcnQgZm9ybXMiIG1heSBiZSB1c2VkLiBGb3IgZXhhbXBsZSwgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlCiAgIGFjY2VwdGFibGU6CgogIGFycmF5IHNob3cgXCZhW10gIChvciBTSE9XIEFSUkFZLi4uKQogIGFycmF5IHNob3cgJmFbXQogIGFycmF5IHNob3cgYVtdCiAgYXJyYXkgc2hvdyAmYQogIGFycmF5IHNob3cgYQoKICAgSW4gYWRkaXRpb24sIHJhbmdlcyBhcmUgYWNjZXB0ZWQgaW4gdGhlIEFSUkFZIENPUFksIEFSUkFZIENMRUFSLCBBUlJBWQogICBTRVQsIEFSUkFZIFNIT1csIGFuZCBBUlJBWSBTT1JUIGNvbW1hbmRzOgoKICBhcnJheSBjbGVhciBcJmFbMTZdICAgICA7IENsZWFycyAxNiB0aHJ1IGVuZAogIGFycmF5IGNsZWFyICZhWzE2XSAgICAgIDsgRGl0dG8KICBhcnJheSBjbGVhciBhWzE2XSAgICAgICA7IERpdHRvCgogIGFycmF5IGNsZWFyIFwmYVsxNjozMl0gIDsgQ2xlYXJzIDE2IHRocnUgMzIKICBhcnJheSBjbGVhciAmYVsxNjozMl0gICA7IERpdHRvCiAgYXJyYXkgY2xlYXIgYVsxNjozMl0gICAgOyBEaXR0bwoKICAgV2hlbiB1c2luZyBhcnJheSBuYW1lcyBhcyBmdW5jdGlvbiBhcmd1bWVudHMsIHlvdSBtdXN0IG9taXQgdGhlICJcIgogICBhbmQgeW91IG11c3QgaW5jbHVkZSB0aGUgIiYiLiBZb3UgbWF5IG9wdGlvbmFsbHkgaW5jbHVkZSBlbXB0eQogICBicmFja2V0cy4gRXhhbXBsZXM6CgogIFxmc3BsaXQoXCVhLGEpICAgICAgICAgIDsgQmFkCiAgXGZzcGxpdChcJWEsXCZhKSAgICAgICAgOyBCYWQKICBcZnNwbGl0KFwlYSwmYVszXSkgICAgICA7IEJhZAoKICBcZnNwbGl0KFwlYSwmYSkgICAgICAgICA7IEdvb2QKICBcZnNwbGl0KFwlYSwmYVtdKSAgICAgICA7IEdvb2QKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDcuMTAuMS4gQXJyYXkgSW5pdGlhbGl6ZXJzCgogICBCZWdpbm5pbmcgaW4gQy1LZXJtaXQgNy4wLCB5b3UgbWF5IGluaXRpYWxpemUgYW4gYXJyYXkgLS0gaW4gd2hvbGUgb3IKICAgaW4gcGFydCAtLSBpbiBpdHMgZGVjbGFyYXRpb246CgogICBbIEFSUkFZIF0gREVDTEFSRSBhcnJheS1uYW1lW3NpemVdIFsgPSBdIFsgdmFsdWUxIFsgdmFsdWUyIFsuLi5dIF0gXQoKICAgRm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9ucyA1QSBhbmQgNi4wLCB0aGUgQVJSQVkga2V5d29yZCBpcwogICBvcHRpb25hbC4gREVDTEFSRSBjYW4gYWxzbyBiZSBzcGVsbGVkIERDTC4KCiAgIEluaXRpYWxpemVycyBhcmUgKGEpIG9wdGlvbmFsLCAoYikgc3RhcnQgd2l0aCBlbGVtZW50IDEsIChjKSBtdXN0IGJlCiAgIGVuY2xvc2VkIGluIGJyYWNlcyBpZiB0aGV5IGNvbnRhaW4gc3BhY2VzLCBhbmQgKGQpIGFyZSBldmFsdWF0ZWQKICAgYWNjb3JkaW5nIHRvIG5vcm1hbCBydWxlcyBieSB0aGUgREVDTEFSRSBjb21tYW5kIHByaW9yIHRvIGFzc2lnbm1lbnQuCiAgIFRodXMgdGhlIGFzc2lnbm1lbnRzIG1hZGUgaGVyZSBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgbWFkZSBieSB0aGUKICAgQVNTSUdOIGNvbW1hbmQuIFRoaXMgYWxsb3dzIHlvdSB0byBpbml0aWFsaXplIGFycmF5IGVsZW1lbnRzIGZyb20gdGhlCiAgIHZhbHVlcyBvZiBvdGhlciB2YXJpYWJsZXMuIElmIHlvdSBhY3R1YWxseSB3YW50IHRvIGluaXRpYWxpemUgYW4gYXJyYXkKICAgZWxlbWVudCB0byB2YXJpYWJsZSdzIG5hbWUsIGFzIG9wcG9zZWQgdG8gaXRzIHZhbHVlLCB1c2UgZG91YmxlCiAgIGJhY2tzbGFzaGVzIChhcyBpbiAiXFwmYSIsICJcXHYodGltZSkiLCBldGMpLgoKICAgVGhlIHNpemUgKGRpbWVuc2lvbikgb2YgdGhlIGFycmF5IGlzIG9wdGlvbmFsLiBJZiB0aGUgc2l6ZSBpcyBvbWl0dGVkLAogICBhcyBpbiAiXCZhW10iLCB0aGVuIHRoZSBhcnJheSBzaXplcyBpdHNlbGYgdG8gdGhlIG51bWJlciBvZgogICBpbml0aWFsaXplcnM7IGlmIHRoZXJlIGFyZSBubyBpbml0aWFsaXplcnMgdGhlIGFycmF5IGlzIG5vdCBkZWNsYXJlZAogICBvciwgaWYgaXQgd2FzIGRlY2xhcmVkIHByZXZpb3VzbHksIGl0IGlzIGRlc3Ryb3llZC4gSWYgYSBzaXplIGlzCiAgIGdpdmVuLCBhbnkgZXh0cmEgZWxlbWVudHMgaW4gdGhlIGluaXRpYWxpemF0aW9uIGxpc3QgYXJlIGRpc2NhcmRlZCBhbmQKICAgaWdub3JlZC4KCiAgIE5PVEU6IFVubGlrZSBpbiBDLCB0aGUgbGlzdCBvZiBpbml0aWFsaXplcnMgaXMgTk9UIGVuY2xvc2VkIGluIGJyYWNlcy4KICAgSW5zdGVhZCwgYnJhY2VzIGFyZSB1c2VkIHRvIGdyb3VwIG11bHRpcGxlIHdvcmRzIHRvZ2V0aGVyLiBTbzoKCiAgQVJSQVkgREVDTEFSRSBcJmFbXSA9IHsgb25lIHR3byB0aHJlZSB9CgogICB3b3VsZCBjcmVhdGUgYW4gYXJyYXkgd2l0aCB0d28gZWxlbWVudHMgKDAgYW5kIDEpLCB3aXRoIGVsZW1lbnQgMQogICBoYXZpbmcgdGhlIHZhbHVlICIgb25lIHR3byB0aHJlZSAiLgoKICAgRXhhbXBsZXM6CgogICBBUlJBWSBERUNMQVJFIFwmYVsxNl0KICAgICAgICAgIERlY2xhcmVzIHRoZSBhcnJheSBcJmEgd2l0aCAxNyBlbGVtZW50cyAoMCB0aHJvdWdoIDE2KSwgaW4KICAgICAgICAgIHdoaWNoIGFsbCBlbGVtZW50cyBhcmUgaW5pdGlhbGx5IGVtcHR5LiBJZiB0aGUgYXJyYXkgXCZhW10KICAgICAgICAgIGV4aXN0ZWQgYmVmb3JlLCB0aGUgZWFybGllciBjb3B5IGlzIGRlc3Ryb3llZC4KCiAgIEFSUkFZIERFQ0xBUkUgJmFbMTZdCiAgIEFSUkFZIERFQ0xBUkUgYVsxNl0KICAgQVJSQVkgRENMIFwmYVsxNl0KICAgQVJSQVkgRENMICZhWzE2XQogICBBUlJBWSBEQ0wgYVsxNl0KICAgREVDTEFSRSBcJmFbMTZdCiAgIERFQ0xBUkUgJmFbMTZdCiAgIERFQ0xBUkUgYVsxNl0KICAgRENMIFwmYVsxNl0KICAgRENMICZhWzE2XQogICBEQ0wgYVsxNl0KICAgICAgICAgIEFsbCBvZiB0aGUgYWJvdmUgYXJlIHRoZSBzYW1lIGFzIHRoZSBmaXJzdCBleGFtcGxlLgoKICAgQVJSQVkgREVDTEFSRSBcJmFbMTZdID0gYWxwaGEgYmV0YSB7Z2FtbWEgZGVsdGF9CiAgICAgICAgICBEZWNsYXJlcyB0aGUgYXJyYXkgXCZhIHdpdGggMTcgZWxlbWVudHMgKDAgdGhyb3VnaCAxNiksCiAgICAgICAgICBpbml0aWFsaXppbmcgXCZhWzFdIHRvICJhbHBoYSIsIFwmYVsyXSB0byAiYmV0YSIsIGFuZCBcJmFbM10gdG8KICAgICAgICAgICJnYW1tYSBkZWx0YSIuIFRoZSByZW1haW5pbmcgZWxlbWVudHMgYXJlIGVtcHR5LgoKICAgQVJSQVkgREVDTEFSRSBcJmFbXSA9IGFscGhhIGJldGEge2dhbW1hIGRlbHRhfQogICAgICAgICAgU2FtZSBhcyB0aGUgcHJldmlvdXMgZXhhbXBsZSwgYnV0IHRoZSBhcnJheSBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICBkaW1lbnNpb25lZCB0byAzLgoKICAgQVJSQVkgREVDTEFSRSBcJmFbM10gPSBhbHBoYSBiZXRhIHtnYW1tYSBkZWx0YX0gZXBzaWxvbiB6ZXRhCiAgICAgICAgICBUb28gbWFueSBpbml0aWFsaXplcnM7IG9ubHkgdGhlIGZpcnN0IHRocmVlIGFyZSBrZXB0LgoKICAgQVJSQVkgREVDTEFSRSBcJmFbMF0KICAgQVJSQVkgREVDTEFSRSBcJmFbXQogICBBUlJBWSBERUNMQVJFICZhW10KICAgQVJSQVkgREVDTEFSRSAmYQogICBBUlJBWSBERUNMQVJFIGEKICAgREVDTEFSRSBcJlswXQogICBERUNMQVJFIGEKICAgRENMIGEKICAgICAgICAgIEFsbCBvZiB0aGVzZSBhcmUgZXF1aXZhbGVudC4gRWFjaCBkZXN0cm95cyBcJmFbXSBpZiBpdCBleGlzdHMuCiAgICAgICAgICBEZWNsYXJpbmcgYW4gYXJyYXkgd2l0aCBhIGRpbWVuc2lvbiBvZiAwIGlzIHRoZSBzYW1lIGFzIEFSUkFZCiAgICAgICAgICBERVNUUk9ZIGFycmF5bmFtZS4KCiAgIEFSUkFZIERFQ0xBUkUgXCZhW10gPSBcJTEgXCUyIFwlMwogICAgICAgICAgRGVjbGFyZXMgdGhlIGFycmF5IFwmYSB3aXRoIDMgZWxlbWVudHMgKDAgdGhyb3VnaCAzKSwKICAgICAgICAgIGluaXRpYWxpemluZyBcJmFbMV0gdG8gdGhlIHZhbHVlIG9mIFwlMSwgXCZhWzJdIHRvIHRoZSB2YWx1ZSBvZgogICAgICAgICAgXCUyLCBhbmQgXCZhWzNdIHRvIHRoZSB2YWx1ZSBvZiBcJTMuIEluIHRoaXMgY2FzZSwgYW55CiAgICAgICAgICByZWZlcmVuY2UgdG8gb25lIG9mIHRoZXNlIGFycmF5IGVsZW1lbnRzIGlzIHJlcGxhY2VkIGJ5IHRoZQogICAgICAgICAgdmFsdWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgXCVuIHZhcmlhYmxlIGF0IHRoZSB0aW1lIHRoZQogICAgICAgICAgZGVjbGFyYXRpb24gd2FzIGV4ZWN1dGVkIChpbW1lZGlhdGUgZXZhbHVhdGlvbjsgdGhlIGFycmF5CiAgICAgICAgICBlbGVtZW50J3MgdmFsdWUgZG9lcyBub3QgY2hhbmdlIGlmIHRoZSBpbml0aWFsaXplciB2YXJpYWJsZSdzCiAgICAgICAgICB2YWx1ZSBjaGFuZ2VzKS4KCiAgIEFSUkFZIERFQ0xBUkUgXCZhW10gPSBcXCUxIFxcJTIgXFwlMwogICAgICAgICAgRGVjbGFyZXMgdGhlIGFycmF5IFwmYSB3aXRoIDMgZWxlbWVudHMgKDAgdGhyb3VnaCAzKSwKICAgICAgICAgIGluaXRpYWxpemluZyBcJmFbMV0gdG8gdGhlIHN0cmluZyAiXCUxIiwgXCZhWzJdIHRvICJcJTIiLCBhbmQKICAgICAgICAgIFwmYVszXSB0byAiXCUzIi4gSW4gdGhpcyBjYXNlIGFueSByZWZlcmVuY2UgdG8gb25lIG9mIHRoZXNlCiAgICAgICAgICBhcnJheSBlbGVtZW50cyBpcyByZXBsYWNlZCBieSB0aGUgQ1VSUkVOVCB2YWx1ZSBvZiB0aGUKICAgICAgICAgIGNvcnJlc3BvbmRpbmcgXCVuIHZhcmlhYmxlIChkZWZlcnJlZCBldmFsdWF0aW9uIC0tIHRoZSBhcnJheQogICAgICAgICAgZWxlbWVudCdzIHZhbHVlIGZvbGxvd3MgdGhlIHZhbHVlIG9mIHRoZSBpbml0aWFsaXplciB2YXJpYWJsZSkuCgogICBUaGUgZXF1YWwgc2lnbiAoPSkgcHJlY2VkaW5nIHRoZSBpbml0aWFsaXplciBsaXN0IGlzIG9wdGlvbmFsLCBidXQgaXMKICAgcmVjb21tZW5kZWQgZm9yIGNsYXJpdHkuIElmIHlvdSBuZWVkIHRvIGluaXRpYWxpemUgZWxlbWVudCAxIHRvIGEKICAgbGl0ZXJhbCBlcXVhbCBzaWduLCB1c2UgdHdvIG9mIHRoZW0sIHNlcGFyYXRlZCBieSBhIHNwYWNlLCBhcyBpbiB0aGlzCiAgIGV4YW1wbGU6CgogIEFSUkFZIERFQ0xBUkUgXCZhW10gPSA9ICsgLSAqIC8KCiAgIFJlbWVtYmVyLCBlbGVtZW50IDAgaXMgbm90IGluaXRpYWxpemVkIGJ5IHRoZSBERUNMQVJFIGNvbW1hbmQuIFRvCiAgIGluaXRpYWxpemUgZWxlbWVudCAwLCB1c2UgYSByZWd1bGFyIERFRklORSBvciBBU1NJR04gY29tbWFuZDoKCiAgQVJSQVkgREVDTEFSRSBcJmFbXSBvbmUgdHdvIHRocmVlIGZvdXIgZml2ZSBzaXggc2V2ZW4gZWlnaHQgbmluZQogIERFRklORSBcJmFbMF0gemVybwoKICAgRmluYWxseSwgcmVtZW1iZXIgdGhhdCBldmVyeSBjb21tYW5kIGxldmVsIGhhcyBpdHMgb3duIGxvY2FsIGFycmF5LAogICBcJl9bXSwgY29udGFpbmluZyBhbGwgdGhlIG1hY3JvIGFyZ3VtZW50cyAoXCUwLCBcJTEsIC4uLikgZm9yIHRoYXQKICAgbGV2ZWwuIFNlZSBbNTg5XVNlY3Rpb24gNy41IGZvciBkZXRhaWxzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNy4xMC4yLiBUdXJuaW5nIGEgU3RyaW5nIGludG8gYW4gQXJyYXkgb2YgV29yZHMKCiAgIFRoZSBcZnNwbGl0KHMxLCZhLHMyLHMzKSBmdW5jdGlvbiBhc3NpZ25zIHRoZSB3b3JkcyBvZiBzdHJpbmcgczEgdG8KICAgc3VjY2Vzc2l2ZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgKGJlZ2lubmluZyB3aXRoIGVsZW1lbnQgMSkgd2hvc2UKICAgaWRlbnRpZnlpbmcgbGV0dGVyLCBhLXosIGlzIGdpdmVuIGFmdGVyIHRoZSAiJiIgaW4gdGhlIHNlY29uZAogICBhcmd1bWVudCwgdXNpbmcgYnJlYWsgYW5kIGluY2x1ZGUgY2hhcmFjdGVycyBnaXZlbiBpbiBzMiBhbmQgczMuIFNlZQogICBbNTkwXVNlY3Rpb24gNy4zIGZvciBkZXRhaWxzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNy4xMC4zLiBBcnJheXMgb2YgRmlsZW5hbWVzCgogICBTZWUgWzU5MV1TZWN0aW9uIDQuMTEuMyBmb3IgbmV3cyBhYm91dCBob3cgXGZmaWxlcygpIGFuZCByZWxhdGVkCiAgIGZ1bmN0aW9ucyBjYW4gYXNzaWduIGEgbGlzdCBvZiBmaWxlbmFtZXMgdG8gYW4gYXJyYXkuIFRvIHJlY2FwaXR1bGF0ZQogICBicmllZmx5IGhlcmU6CgogIFxmZmlsZXMoKiwmYSkKCiAgIGFzc2lnbnMgYWxsIGZpbGVzIHRoYXQgbWF0Y2ggdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBhcnJheSBkZW5vdGVkCiAgIGJ5IHRoZSBzZWNvbmQgYXJndW1lbnQuIElmIHRoZSBhcnJheSBoYXMgbm90IGJlZW4gZGVjbGFyZWQsIGl0IGlzCiAgIGRlY2xhcmVkIGF1dG9tYXRpY2FsbHksIHdpdGggZXhhY3RseSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG5lZWRlZCB0bwogICBob2xkIHRoZSBmaWxlIGxpc3Q7IGlmIGl0IHdhcyBwcmV2aW91c2x5IGRlY2xhcmVkLCBpdCBpcyBkZXN0cm95ZWQgYW5kCiAgIHJldXNlZC4gVGhlIGZpbGVuYW1lcyBhcmUgYXNzaWduZWQgc3RhcnRpbmcgYXQgYXJyYXkgZWxlbWVudCAxLgogICBFbGVtZW50IDAgaG9sZHMgdGhlIG51bWJlciBvZiBmaWxlcyBpbiB0aGUgbGlzdC4KCiAgIFRoZSBESVJFQ1RPUlkgY29tbWFuZCAoWzU5Ml1TZWN0aW9uIDQuNS4xKSBjYW4gYWxzbyBjcmVhdGUgZmlsZW5hbWUKICAgYXJyYXlzIGlmIHlvdSBnaXZlIGl0IHRoZSAvQVJSQVk6IHN3aXRjaDsgdGhpcyBhbGxvd3Mgc2VsZWN0aW9uCiAgIGNyaXRlcmlhIGJleW9uZCB3aGV0aGVyIHRoZSBmaWxlbmFtZSBtYXRjaGVzIHRoZSBnaXZlbiBwYXR0ZXJuLgoKICAgQWxsIGZ1bmN0aW9ucyBhbmQgY29tbWFuZHMgdGhhdCBjcmVhdGUgZmlsZW5hbWUgYXJyYXlzIHN0b3JlIHRoZQogICBudW1iZXIgb2YgZmlsZW5hbWVzLCBuLCBhcyBlbGVtZW50IDAgb2YgdGhlIGFycmF5LCBhbmQgdGhlIGZpbGVuYW1lcwogICBhcyBlbGVtZW50cyAxIHRocm91Z2ggbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDcuMTAuNC4gQXV0b21hdGljIEFycmF5cwoKICAgSW4gYSBjb21tYW5kIGZpbGUgb3IgbWFjcm8sIHlvdSBjYW4gbm93IGhhdmUgbG9jYWwgKGF1dG9tYXRpYykgYXJyYXlzLgogICBKdXN0IGdpdmUgdGhlIG5hbWUgZm9sbG93ZWQgYnkgZW1wdHkgc3Vic2NyaXB0IGJyYWNrZXRzIChubyBzcGFjZXMKICAgaW5zaWRlIHRoZSBicmFja2V0cyBwbGVhc2UpIGluIGEgTE9DQUwgY29tbWFuZCwgYW5kIHRoZW4gZGVjbGFyZSB0aGUKICAgYXJyYXk6CgogIExPQ0FMIFwlYSBcJmFbXSBvb2ZhCiAgQVJSQVkgREVDTEFSRSBcJmFbMzJdID0gdmFsdWUxIHZhbHVlMiB2YWx1ZTMgLi4uCgogICBUaGlzIGRlY2xhcmVzIHRoZSBzY2FsYXIgdmFyaWFibGUgXCVhLCB0aGUgYXJyYXkgXCZhW10sIGFuZCB0aGUgbWFjcm8KICAgbmFtZSAib29mYSIgdG8gYmUgbG9jYWwsIGFuZCB0aGVuIGRlY2xhcmVzIHRoZSBuZXcgbG9jYWwgY29weSBvZiBcJmFbXQogICB3aXRoIDMyIGVsZW1lbnRzLCBwZXJoYXBzIGFzc2lnbmluZyBzb21lIGluaXRpYWwgdmFsdWVzLiBXaGVuIEMtS2VybWl0CiAgIGV4aXRzIGZyb20gdGhlIGNvbW1hbmQgZmlsZSBvciBtYWNybyBjb250YWluaW5nIHRoZXNlIGNvbW1hbmQsIHRoZQogICBwcmV2aW91cyBcJmFbXSBhcnJheSBpcyByZXN0b3JlZCAoYW5kIGlmIHRoZXJlIHdhcyBubyBcJmFbXSBhdCBhbnkKICAgaGlnaGVyIGxldmVsLCB0aGlzIHdpbGwgc3RpbGwgYmUgdHJ1ZSkuIFRoZSBwcm9jZXNzIGNhbiBiZSByZXBlYXRlZCB0bwogICBhbnkgbGV2ZWwuIFRodXMgaXQgaXMgbm93IHNhZmUgdG8gd3JpdGUgc2NyaXB0cyBvciBtYWNyb3MgY29udGFpbmluZwogICBhcnJheXMgd2l0aG91dCBkYW5nZXIgb2YgaW50ZXJmZXJpbmcgd2l0aCBnbG9iYWwgYXJyYXlzIG9mIHRoZSBzYW1lCiAgIG5hbWUuCgogICBKdXN0IGFzIHNjYWxhcnMgYXJlIGluaGVyaXRlZCBieSBsb3dlciBjb21tYW5kIGxldmVscywgc28gYXJlIGFycmF5cy4KICAgU28sIGZvciBleGFtcGxlLCBpZiBcJmFbXSBpcyBkZWNsYXJlZCBhdCB0b3AgbGV2ZWwsIGFsbCBsb3dlciBsZXZlbHMKICAgd2lsbCBzZWUgaXQgdW5sZXNzIHRoZXkgaW5jbHVkZSBhICJsb2NhbCBcJmFbXSIgc3RhdGVtZW50LCBpbiB3aGljaAogICBjYXNlIGFsbCBsZXZlbHMgYXQgYW5kIGJlbmVhdGggdGhlIGxldmVsIHdoZXJlIHRoZSBMT0NBTCBzdGF0ZW1lbnQgd2FzCiAgIGV4ZWN1dGVkIHdpbGwgc2VlIHRoZSBsb2NhbCBjb3B5LiBUaGlzIHRvbyBjYW4gYmUgcmVwZWF0ZWQgdG8gYW55CiAgIGxldmVsLgoKICAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHlvdSBERUNMQVJFIGFuIGFycmF5IGF0IGEgbG93ZXIgY29tbWFuZCBsZXZlbAogICB3aXRob3V0IGFsc28gbWFraW5nIGl0IExPQ0FMLCB0aGlzIHJlcGxhY2VzIHRoZSBjb3B5IHRoYXQgd2FzIGRlY2xhcmVkCiAgIGF0IHRoZSBsb3dlc3QgY29tbWFuZCBsZXZlbCBhYm92ZSB0aGlzIG9uZS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDcuMTAuNS4gU29ydGluZyBBcnJheXMKCiAgIEFsdGhvdWdoIGFycmF5cyBjYW4gYmUgc29ydGVkIHVzaW5nIEZPUiBsb29wcyBhcyBzaG93biBvbiBwYWdlIDM4MyBvZgogICBVc2luZyBDLUtlcm1pdCwgMm5kIEVkLiwgdGhpcyBpbnZvbHZlcyBxdWl0ZSBhIGJpdCBvZiByZXBldGl0aXZlCiAgIGludGVycHJldGF0aW9uIGJ5IHRoZSBjb21tYW5kIHBhcnNlciwgYW5kIHNvIGNhbiBiZSBzbG93IGZvciBsYXJnZQogICBhcnJheXMuIEZvciB0aGlzIHJlYXNvbiwgQy1LZXJtaXQgNy4wIGFkZHMgYSBidWlsdC1pbiBTT1JUIGNvbW1hbmQ6CgogICBBUlJBWSBTT1JUIFsgc3dpdGNoZXMgXSBhcnJheSBbIGFycmF5MiBdCiAgICAgICAgICBTb3J0cyB0aGUgZ2l2ZW4gYXJyYXkgaW4gcGxhY2UuIFNvcnRpbmcgaXMgc3RyaWN0bHkgbGV4aWNhbAogICAgICAgICAgKHN0cmluZyBiYXNlZCkuIFRoZSBhcnJheSBuYW1lIGNhbiBiZSBnaXZlbiBmdWxseSwgZS5nLgogICAgICAgICAgIlwmYVtdIiwgb3IgdGhlICJcIiBhbmQvb3IgIiYiIGFuZC9vciBicmFja2V0cyBjYW4gYmUgb21pdHRlZCwKICAgICAgICAgIGUuZy4gImFycmF5IHNvcnQgXCZhW10iLCAic29ydCAmYSIsICJzb3J0IGEiLiBBbHNvLCBhIHJhbmdlIGNhbgogICAgICAgICAgYmUgaW5kaWNhdGVkIGluIHRoZSBicmFja2V0cyBhcyBub3RlZCBpbiBbNTkzXVNlY3Rpb24gNy4xMCwgdG8KICAgICAgICAgIHJlc3RyaWN0IHRoZSBzb3J0IHRvIGEgcmFuZ2Ugb2YgZWxlbWVudHMgKGVxdWl2YWxlbnQgdG8gdGhlCiAgICAgICAgICAvUkFOR0Ugc3dpdGNoLCBkZXNjcmliZWQganVzdCBiZWxvdyksIGUuZy4gImFycmF5IHNvcnQKICAgICAgICAgICZhWzIwOjMwXSIuCgogICBBIHNlY29uZCBhcnJheSBtYXkgYmUgc3BlY2lmaWVkLiBJZiBpdCBpcywgYW5kIGlmIGl0IGlzIGF0IGxlYXN0IGFzCiAgIGJpZyBhcyB0aGUgZmlyc3QgYXJyYXksIGl0IGlzIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGZpcnN0IGFycmF5LiBGb3IKICAgYSBzYW1wbGUgYXBwbGljYXRpb24sIHNlZSBbNTk0XVNlY3Rpb24gNy4xMC4xMC4KCiAgIFNlZSBbNTk1XVNlY3Rpb24gMS41IGZvciBhbiBleHBsYW5hdGlvbiBvZiBzd2l0Y2hlcy4gVGhlIG9wdGlvbmFsCiAgIHN3aXRjaGVzIGFyZToKCiAgIC9DQVNFOntPTixPRkZ9CiAgICAgICAgICAvQ0FTRTpPTiBtZWFucyB0aGF0IGFscGhhYmV0aWMgY2FzZSBpcyBzaWduaWZpY2FudCBpbgogICAgICAgICAgY29tcGFyaXNvbnM7IHVwcGVyY2FzZSBsZXR0ZXJzIGFyZSBzb3J0ZWQgYmVmb3JlIGxvd2VyY2FzZQogICAgICAgICAgb25lcy4gL0NBU0U6T0ZGIG1lYW5zIGNhc2UgaXMgaWdub3JlZCwgZS5nLiAiQSIgaXMgdGhlIHNhbWUgYXMKICAgICAgICAgICJhIi4gSWYgdGhpcyBzd2l0Y2ggaXMgbm90IGdpdmVuLCBzb3J0aW5nIGlzIGFjY29yZGluZyB0aGUKICAgICAgICAgIGN1cnJlbnQgU0VUIENBU0Ugc2V0dGluZy4KCiAgIC9LRVk6bgogICAgICAgICAgQ29tcGFyaXNvbiBiZWdpbnMgYXQgcG9zaXRpb24gbigxLWJhc2VkKSBpbiBlYWNoIHN0cmluZy4gSWYgbm8KICAgICAgICAgIGtleSBpcyBnaXZlbiwgdGhlIGVudGlyZSBzdHJpbmdzIGFyZSBjb21wYXJlZC4gT25seSBvbmUga2V5IGNhbgogICAgICAgICAgYmUgZ2l2ZW4uIElmIGFuIGFycmF5IGVsZW1lbnQgaXMgc2hvcnRlciB0aGFuIHRoZSBrZXkgdmFsdWUsIG4sCiAgICAgICAgICB0aGF0IGVsZW1lbnQgaXMgY29uc2lkZXJlZCBlbXB0eSBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcywgYW5kCiAgICAgICAgICB0aGVyZWZvcmUgbGV4aWNhbGx5IGxlc3MgdGhhbiBhbnkgZWxlbWVudCBhdCBsZWFzdCBuY2hhcmFjdGVycwogICAgICAgICAgbG9uZy4KCiAgIC9OVU1FUklDCiAgICAgICAgICBJZiB0aGlzIHN3aXRjaCBpcyBpbmNsdWRlZCwgaXQgbWVhbnMgc29ydGluZyBzaG91bGQgYmUgbnVtZXJpYywKICAgICAgICAgIHJhdGhlciB0aGFuIGxleGljYWwuIFRoZSBzb3J0IGtleSBpcyB0aGUgc3RyaW5nIHN0YXJ0aW5nIGF0IHRoZQogICAgICAgICAga2V5IHBvc2l0aW9uLCBza2lwcGluZyBhbnkgbGVhZGluZyBibGFua3Mgb3IgdGFicywgYW5kIHRoZW4gYXMKICAgICAgICAgIG11Y2ggb2YgdGhlIHN0cmluZyBmcm9tIHRoYXQgcG9pbnQgb24gdGhhdCBmaXRzIHRoZSBkZWZpbml0aW9uCiAgICAgICAgICBvZiAibnVtZXJpYyIsIHRlcm1pbmF0aW5nIGF0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgdGhhdCBkb2VzIG5vdAogICAgICAgICAgcXVhbGlmeS4gQSBudW1lcmljIHN0cmluZyBoYXMgYW4gb3B0aW9uYWwgc2lnbiAoKyBvciAtKQogICAgICAgICAgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZGlnaXRzLCBhbmQgKGlmIHlvdXIgdmVyc2lvbiBvZiBLZXJtaXQKICAgICAgICAgIHdhcyBidWlsdCB3aXRoIGZsb2F0aW5nLXBvaW50IHN1cHBvcnQ7IHNlZSBbNTk2XVNlY3Rpb24gNy4yMyApCiAgICAgICAgICB6ZXJvIG9yIG9uZSBkZWNpbWFsIHBvaW50IChwZXJpb2QpLiBJZiBib3RoIC9DQVNFIGFuZCAvTlVNRVJJQwogICAgICAgICAgYXJlIGdpdmVuLCAvTlVNRVJJQyB0YWtlcyBwcmVjZWRlbmNlLgoKICAgL1JBTkdFOm5bOm1dCiAgICAgICAgICBTb3J0IGVsZW1lbnRzIG50aHJvdWdoIG0gb2YgdGhlIGFycmF5LiBCeSBkZWZhdWx0LCB0aGUgZW50aXJlCiAgICAgICAgICBhcnJheSBmcm9tIGVsZW1lbnQgMSB0byBpdHMgZGltZW5zaW9uZWQgc2l6ZSBpcyBzb3J0ZWQsIHdoaWNoCiAgICAgICAgICBtaWdodCBwcm9kdWNlIHN1cnByaXNpbmcgcmVzdWx0cyBpZiB0aGUgYXJyYXkgaXMgbm90IGZ1bGw7IHNlZQogICAgICAgICAgZXhhbXBsZSBpbiBbNTk3XVNlY3Rpb24gNy4xMC43LiBJZiAiOm0iIGlzIG9taXR0ZWQgZnJvbSB0aGUKICAgICAgICAgIHJhbmdlLCB0aGUgZGltZW5zaW9uZWQgc2l6ZSBpcyB1c2VkLiBUaHVzLCB0byBzb3J0IGFuIGVudGlyZQogICAgICAgICAgYXJyYXksIFwmYVtdLCBpbmNsdWRpbmcgaXRzIDB0aCBlbGVtZW50LCB1c2UgInNvcnQgL3JhbmdlOjAKICAgICAgICAgICZhIi4gWW91IGNhbiBhbHNvIHNvcnQgYW55IGRlc2lyZWQgc2VjdGlvbiBvZiBhbiBhcnJheSwgZS5nLgogICAgICAgICAgInNvcnQgL3JhbmdlOjEwOjIwICZhIiBvciAic29ydCAvcmFuZ2U6XCVpOlwlai0xICZiIi4gQXMgbm90ZWQKICAgICAgICAgIGFib3ZlLCB5b3UgY2FuIGFsc28gc3BlY2lmeSBhIHJhbmdlIGluIHRoZSBhcnJheS1uYW1lIGJyYWNrZXRzLgogICAgICAgICAgSWYgeW91IHNwZWNpZnkgYSByYW5nZSBpbiB0aGUgYXJyYXktbmFtZSBicmFja2V0cyBBTkQgd2l0aCBhCiAgICAgICAgICAvUkFOR0Ugc3dpdGNoLCB0aGUgb25lcyBpbiB0aGUgYnJhY2tldHMgdGFrZSBwcmVjZWRlbmNlLgoKICAgL1JFVkVSU0UKICAgICAgICAgIFNvcnQgaW4gcmV2ZXJzZSBvcmRlci4gSWYgdGhpcyBzd2l0Y2ggaXMgbm90IGdpdmVuLCB0aGUgYXJyYXkKICAgICAgICAgIGlzIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuCgogICBSZW1lbWJlciB0aGF0IG51bWVyaWMgc3dpdGNoIGFyZ3VtZW50cyBjYW4gYmUgbnVtYmVycywgYXJpdGhtZXRpYwogICBleHByZXNzaW9ucywgb3IgdmFyaWFibGVzIHdob3NlIHZhbHVlcyBhcmUgbnVtYmVycyBvciBleHByZXNzaW9ucywgYXMKICAgaWxsdXN0cmF0ZWQgaW4gdGhlIC9SQU5HRSBleGFtcGxlcyBhYm92ZS4KCiAgIEEgdHlwaWNhbCBzb3J0aW5nIGFwcGxpY2F0aW9uIG1pZ2h0IGJlIHRvIGxpc3Qgc3R1ZGVudHMnIHRlc3Qgc2NvcmVzCiAgIGluIGRlc2NlbmRpbmcgb3JkZXIuIFN1cHBvc2UgeW91IGhhZCB0aGUgZm9sbG93aW5nIHJlY29yZHM6CgogIG9sYWYgICAgICA2NQogIG9sZ2EgICAgICA5OAogIGl2YW4gICAgICA4MwogIHhlbmEgICAgIDEwMAoKICAgKGFuZCBzbyBvbikgc3RvcmVkIGluIGFycmF5IFwmc1tdIChlLmcuIGJ5IHJlYWRpbmcgdGhlbSBmcm9tIGEgZmlsZSBhcwogICBpbGx1c3RyYXRlZCBpbiBbNTk4XXNlY3Rpb24gNy4xMC43KS4gSW4gdGhlc2UgcmVjb3JkcywgdGhlIHN0dWRlbnQncwogICBuYW1lIGlzIGluIGNvbHVtbnMgMS05IGFuZCB0aGUgc2NvcmUgaW4gMTAtMTIuIFNvIHRvIHJlYXJyYW5nZSB0aGUKICAgbGlzdCBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHNjb3JlOgoKICBzb3J0IC9rZXk6MTAgL3JldmVyc2UgJnMKCiAgIFRoZW4gdG8gbGlzdCB5b3VyIHRvcCBmaXZlIHN0dWRlbnRzOgoKICBmb3IgXCVpIDEgNSAxIHsgZWNobyBcJnNbXCVpXSB9CgogICBPciBtb3JlIHNpbXBseSAoc2VlIG5leHQgc2VjdGlvbik6CgogIHNob3cgYXJyYXkgYVsxOjVdCgogICBUbyBpbGx1c3RyYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBsZXhpY2FsIGFuZCBhIG51bWVyaWMgc29ydCwKICAgc3VwcG9zZSB5b3UgaGF2ZSB0aGUgZm9sbG93aW5nIHJlY29yZHMgKHRoZSBsaW5lcyB0aGF0IGFyZSBudW1iZXJlZCwKICAgc3RhcnRpbmcgYXQgY29sdW1uIDEpIGluIGFycmF5IFwmYVtdOgoKICAgIENvbHVtbiAgIDEgICAgICAgICAyCiAgICAxMjM0NTY3ODkwMTIzNDU2Nzg5MAoKICAgMS4gSXZhbiAxMC4wIDIuIE9sYWYgOS45NSAzLiBPbGdhIDEwMS41CgogICBBUlJBWSBTT1JUIC9LRVk6MTAgJmFbXSB3b3VsZCBvcmRlciB0aGVtIDMsMSwyLCBidXQgQVJSQVkgU09SVCAvS0VZOjEwCiAgIC9OVU1FUklDICZhW10gd291bGQgb3JkZXIgdGhlbSAyLDEsMy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDcuMTAuNi4gRGlzcGxheWluZyBBcnJheXMKCiAgIFRoZSBTSE9XIEFSUkFZIGNvbW1hbmQgKG9yIEFSUkFZIFNIT1cpIG5vdyBhY2NlcHRzIGFuIG9wdGlvbmFsCiAgIGFycmF5LW5hbWUgYXJndW1lbnQ6CgogIFNIT1cgQVJSQVkgXCZhW10KCiAgICh5b3UgY2FuIGxlYXZlIG9mZiB0aGUgXCwgdGhlIFwmLCBhbmQvb3IgdGhlIFtdJ3MgaWYgeW91IGxpa2U7ICJzaG93CiAgIGFycmF5IGEiIGlzIGVxdWl2YWxlbnQgdG8gInNob3cgYXJyYXkgXCZhW10iKS4gV2hlbiBhbiBhcnJheSBpcwogICBzcGVjaWZpZWQsIGl0cyBkaW1lbnNpb24gaXMgc2hvd24gYW5kIGFsbCBkZWZpbmVkIChub24tZW1wdHkpIGVsZW1lbnRzCiAgIGFyZSBsaXN0ZWQuCgogICBFeGFtcGxlOgoKICBhc3NpZ24gXCVuIFxmZmlsZXMoKiwmYSkgIDsgRmlsbCBhbiBhcnJheSB3aXRoIGZpbGVuYW1lcyAoWzU5OV1TZWN0aW9uIDQuMTEuMwopCiAgc2hvdyBhcnJheSBcJmFbXSAgICAgICAgICA7IFNob3cgdGhlIGFycmF5IHdlIGp1c3QgcmVhZAogIGFycmF5IHNob3cgXCZhW10gICAgICAgICAgOyBTYW1lIGFzIHByZXZpb3VzCiAgYXJyYXkgc29ydCBcJmFbXSAgICAgICAgICA7IFNvcnQgdGhlIGFycmF5CiAgYXJyYXkgc2hvdyBcJmFbXSAgICAgICAgICA7IFNob3cgaXQgYWZ0ZXIgc29ydGluZwogIGFycmF5IHNob3cgXCZhICAgICAgICAgICAgOyBTaG93IGl0IGFnYWluCiAgYXJyYXkgc2hvdyAmYSAgICAgICAgICAgICA7IFNob3cgaXQgYWdhaW4KICBhcnJheSBzaG93IGEgICAgICAgICAgICAgIDsgU2hvdyBpdCBhZ2FpbgoKICAgKFRoZSBmaW5hbCBmb3VyIGNvbW1hbmRzIGRlbW9uc3RyYXRlIHRoZSBhbHRlcm5hdGl2ZSBmb3JtcyB0aGF0IGFyZQogICBhY2NlcHRlZCBmb3IgdGhlIGFycmF5IG5hbWUuKQoKICAgSWYgeW91IFNIT1cgQVJSQVkgd2l0aG91dCBnaXZpbmcgYW4gYXJyYXkgbmFtZSwgYWxsIGRlZmluZWQgYXJyYXlzIGFyZQogICBsaXN0ZWQgYnkgbmFtZSBhbmQgZGltZW5zaW9uLCBidXQgdGhlaXIgY29udGVudHMgYXJlIG5vdCBzaG93bi4KCiAgIFlvdSBjYW4gYWxzbyBzaG93IGEgcGllY2Ugb2YgYW4gYXJyYXkgYnkgaW5jbHVkaW5nIGEgc3Vic2NyaXB0IG9yCiAgIHJhbmdlIHdpdGhpbiB0aGUgYXJyYXkgYnJhY2tldHM6CgogIGFycmF5IHNob3cgXCZhWzVdICAgICAgICAgOyBTaG93cyBcJmFbNV0KICBhcnJheSBzaG93ICZhWzM6OF0gICAgICAgIDsgU2hvd3MgXCZhWzNdIHRocm91Z2ggXCZhWzhdCiAgYXJyYXkgc2hvdyBhWzpcJW4tMV0gICAgICA7IFNob3dzIFwmYVswXSB0aHJvdWdoIFwmYVtcJW4tMV0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDcuMTAuNy4gT3RoZXIgQXJyYXkgT3BlcmF0aW9ucwoKICAgQVJSQVkgREVTVFJPWSBhcnJheW5hbWUKICAgICAgICAgIERlc3Ryb3lzIGFuZCB1bmRlY2xhcmVzIHRoZSBuYW1lZCBhcnJheS4gU3Vic2NyaXB0cyBvciByYW5nZXMKICAgICAgICAgIGFyZSBub3QgYWNjZXB0ZWQgaW4gdGhpcyBjb21tYW5kLgoKICAgQVJSQVkgQ09QWSBhcnJheTEgYXJyYXkyCiAgICAgICAgICBDb3BpZXMgdGhlIGZpcnN0IGFycmF5IHRvIHRoZSBzZWNvbmQgYXJyYXkuIElmIHRoZSB0YXJnZXQgYXJyYXkKICAgICAgICAgIGhhcyBub3QgYmVlbiBkZWNsYXJlZCwgaXQgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IHdpdGggdGhlCiAgICAgICAgICBzYW1lIHNpemUgYXMgdGhlIGZpcnN0LiBJZiBpdCBoYXMgYmVlbiBkZWNsYXJlZCwgaXQgd2lsbCBiZQogICAgICAgICAgdXNlZCBhcyBkZWNsYXJlZDsgaWYgdGhlIHNvdXJjZSBhcnJheSBpcyBsYXJnZXIsIG9ubHkgYXMgbXVjaAogICAgICAgICAgb2YgaXQgYXMgd2lsbCBmaXQgaXMgY29waWVkIHRvIHRoZSB0YXJnZXQgYXJyYXkuIFN5bnRheCBmb3IKICAgICAgICAgIGFycmF5MSBhbmQgYXJyYXkyIGlzIGFzIGluIEFSUkFZIFNIT1cgKFNIT1cgQVJSQVkpLiBFeGFtcGxlOgoKICAuXCVuIDo9IFxmZmlsZXMoKiwmYSkgIDsgQ3JlYXRlIGFuZCBsb2FkIGFycmF5IEEgd2l0aCBhIGZpbGUgbGlzdC4KICBhcnJheSBjb3B5ICZhICZiICAgICAgIDsgQ29weSBhcnJheSBBIHRvIGFycmF5IEIuCgogICAgICAgICAgVGhlIEFSUkFZIENPUFkgY29tbWFuZCBhbHNvIGxldHMgeW91IGNvcHkgcGllY2VzIG9mIGFycmF5cyBieQogICAgICAgICAgaW5jbHVkaW5nIHJhbmdlIHNwZWNpZmllcnMsIGFzIGluIHRoZXNlIGV4YW1wbGVzOgoKICAgICAgICBBUlJBWSBDT1BZIFwmYVs0OjI3XSBcJmIKICAgICAgICAgICAgICAgIFRoaXMgY29waWVzIFwmYVtdIGVsZW1lbnRzIDQtMjcgdG8gXCZiW10gZWxlbWVudHMgMS0yMywKICAgICAgICAgICAgICAgIGNyZWF0aW5nIFwmYltdIGlmIG5lY2Vzc2FyeSBvciwgaWYgXCZiW10gaXMgYWxyZWFkeQogICAgICAgICAgICAgICAgZGVjbGFyZWQsIHN0b3BwaW5nIGVhcmx5IGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiAyMy4KCiAgICAgICAgQVJSQVkgQ09QWSBcJmFbNDoyN10gXCZiWzEyXQogICAgICAgICAgICAgICAgVGhpcyBjb3BpZXMgXCZhW10gZWxlbWVudHMgNC0yNyB0byBcJmJbXSBlbGVtZW50cyAxMi0zNSwKICAgICAgICAgICAgICAgIGNyZWF0aW5nIFwmYltdIGlmIG5lY2Vzc2FyeSBvciwgaWYgXCZiW10gaXMgYWxyZWFkeQogICAgICAgICAgICAgICAgZGVjbGFyZWQsIHN0b3BwaW5nIGVhcmx5IGlmIGl0cyBzaXplIGlzIGxlc3MgdGhhbiAzNS4KCiAgICAgICAgQVJSQVkgQ09QWSBcJmFbNDoyN10gXCZiWzEyOjE0XQogICAgICAgICAgICAgICAgVGhpcyBjb3BpZXMgXCZhW10gZWxlbWVudHMgNC02IHRvIFwmYltdIGVsZW1lbnRzIDEyLTE0LAogICAgICAgICAgICAgICAgY3JlYXRpbmcgXCZiW10gaWYgbmVjZXNzYXJ5IG9yLCBpZiBcJmJbXSBpcyBhbHJlYWR5CiAgICAgICAgICAgICAgICBkZWNsYXJlZCwgc3RvcHBpbmcgZWFybHkgaWYgaXRzIHNpemUgaXMgbGVzcyB0aGFuIDE0LgoKICAgICAgICBBUlJBWSBDT1BZIFwmYVsxN10gXCZiCiAgICAgICAgICAgICAgICBUaGlzIGNvcGllcyBhbGwgdGhlIGVsZW1lbnRzIG9mIFwmYVtdIHN0YXJ0aW5nIHdpdGggMTcKICAgICAgICAgICAgICAgIHVudGlsIHRoZSBsYXN0IHRvIFwmYltdLCBjcmVhdGluZyBcJmJbXSBpZiBuZWNlc3Nhcnkgb3IsCiAgICAgICAgICAgICAgICBpZiBcJmJbXSBpcyBhbHJlYWR5IGRlY2xhcmVkLCBzdG9wcGluZyBlYXJseSBpZiBcJmJbXSBpcwogICAgICAgICAgICAgICAgbm90IGJpZyBlbm91Z2guCgogICBBUlJBWSBDTEVBUiBhcnJheW5hbWUKICAgICAgICAgIFNldHMgYWxsIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkgdG8gdGhlIGVtcHR5IHZhbHVlLiBZb3UgbWF5CiAgICAgICAgICBhbHNvIGluY2x1ZGUgYSByYW5nZSBzcGVjaWZpZXIgdG8gY2xlYXIgb25seSBhIHNlbGVjdGVkIHBvcnRpb24KICAgICAgICAgIG9mIHRoZSBhcnJheTsgZm9yIGV4YW1wbGUgImFycmF5IGNsZWFyIFwmYVszNzoyMTRdIi4gSWYgdGhlCiAgICAgICAgICByYW5nZSBpcyBvdXQgb2YgYm91bmRzLCBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBhcnJheSB0aGF0IGlzIGluCiAgICAgICAgICBib3VuZHMgaXMgY2xlYXJlZC4KCiAgIEFSUkFZIFNFVCBhcnJheW5hbWUgWyB2YWx1ZSBdCiAgICAgICAgICBTZXRzIGFsbCB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5IHRvIHRoZSBnaXZlbiB2YWx1ZS4gSWYgbm8KICAgICAgICAgIHZhbHVlIGlzIGdpdmVuLCB0aGUgYXJyYXkgaXMgY2xlYXJlZC4gWW91IG1heSBhbHNvIGluY2x1ZGUgYQogICAgICAgICAgcmFuZ2Ugc3BlY2lmaWVyIHRvIHNldCBvbmx5IGEgc2VsZWN0ZWQgcG9ydGlvbiBvZiB0aGUgYXJyYXk7CiAgICAgICAgICBmb3IgZXhhbXBsZSAiYXJyYXkgc2V0IFwmYVsxOjldIC0xIi4gSWYgdGhlIHJhbmdlIGlzIG91dCBvZgogICAgICAgICAgYm91bmRzLCBvbmx5IHRoZSBwYXJ0IG9mIHRoZSBhcnJheSB0aGF0IGlzIGluIGJvdW5kcyBpcyBzZXQuCgogICBBUlJBWSBSRVNJWkUgYXJyYXluYW1lIHNpemUKICAgICAgICAgIFJlc2l6ZXMgdGhlIGdpdmVuIGFycmF5LiBJZiB0aGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlCiAgICAgICAgICBhcnJheSdzIGN1cnJlbnQgZGltZW5zaW9uLCBuZXcgZW1wdHkgZWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZQogICAgICAgICAgZW5kLiBJZiB0aGUgc2l6ZSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgZGltZW5zaW9uLCB0aGUgZXh0cmEKICAgICAgICAgIGVsZW1lbnRzIGFyZSBkaXNjYXJkZWQuIE5vdGU6IElmIHlvdSBoYXZlIHN0b3JlZCB0aGUgYXJyYXkgc2l6ZQogICAgICAgICAgaW4gZWxlbWVudCAwLCBBUlJBWSBSRVNJWkUgZG9lcyBub3QgY2hhbmdlIHRoaXMgdmFsdWUuCiAgICAgICAgICBBbHRlcm5hdGl2ZSBub3RhdGlvbjogQVJSQVkgUkVTSVpFIGFycmF5bmFtZVtzaXplXS4gRm9yIGEKICAgICAgICAgIHByYWN0aWNhbCBleGFtcGxlLCBzZWUgWzYwMF1TZWN0aW9uIDcuMTAuMTEuCgogICBcZmFycmF5bG9vayhwYXR0ZXJuLGFycmF5bmFtZSkKICAgICAgICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlCiAgICAgICAgICBnaXZlbiBhcnJheSB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuIHBhdHRlcm4gKGZvciBkZXRhaWxzIGFib3V0CiAgICAgICAgICBwYXR0ZXJuIHN5bnRheCwgc2VlIFs2MDFdc2VjdGlvbiA0LjkpLiBUaGUgYXJyYXkgbmFtZSBjYW4KICAgICAgICAgIGluY2x1ZGUgYSByYW5nZSBzcGVjaWZpY2F0aW9uIHRvIHJlc3RyaWN0IHRoZSBzZWFyY2ggdG8gYSBnaXZlbgogICAgICAgICAgc2VnbWVudCBvZiB0aGUgYXJyYXkuIElmIG5vIGVsZW1lbnRzIG1hdGNoIHRoZSBwYXR0ZXJuLCAtMSBpcwogICAgICAgICAgcmV0dXJuZWQuCgogICBcZnRhYmxlbG9vayhrZXl3b3JkLGFycmF5bmFtZVssZGVsaW1pdGVyXSkKICAgICAgICAgIExvb2tzIGluIHRoZSBnaXZlbiAidGFibGUiLCB3aGljaCBtdXN0IGJlIHNvcnRlZCwgZm9yIHRoZSBnaXZlbgogICAgICAgICAga2V5d29yZC4gVGhlIGtleXdvcmQgbmVlZCBub3QgYmUgc3BlbGxlZCBvdXQgaW4gZnVsbC4KICAgICAgICAgIFBhdHRlcm4tbWF0Y2hpbmcgY2hhcmFjdGVycyBzaG91bGQgbm90IGJlIGluY2x1ZGVkIGFzIHBhcnQgb2YKICAgICAgICAgIHRoZSBrZXl3b3JkLiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRhYmxlCiAgICAgICAgICBlbGVtZW50IHRoYXQgdW5pcXVlbHkgbWF0Y2hlcyB0aGUgZ2l2ZW4ga2V5d29yZCwgb3IgLTEgaWYgbm9uZQogICAgICAgICAgbWF0Y2gsIG9yIC0yIGlmIG1vcmUgdGhhbiAxIG1hdGNoLgoKICAgQSAidGFibGUiIGlzIGFuIGFycmF5IHRoYXQgaXMgc29ydGVkIGluIGxleGljYWwgb3JkZXI7IGVhY2ggb2YgaXRzCiAgIGVsZW1lbnRzIG1heSBjb250YWluIG11bHRpcGxlIGZpZWxkcywgZGVsaW1pdGVkIGJ5IHRoZSBnaXZlbiBkZWxpbWl0ZXIKICAgY2hhcmFjdGVyIG9yLCBpZiBubyBkZWxpbWl0ZXIgaXMgc3BlY2lmaWVkLCBhIGNvbG9uICg6KS4KCiAgIFRoZSBcZmFycmF5bG9vaygpIGZ1bmN0aW9uIGRvZXMgZXhhY3RseSB3aGF0IHlvdSB0ZWxsIGl0LiBJZiB5b3UgZ2l2ZQogICBpdCBhIHBhdHRlcm4gdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHdpbGRjYXJkIGNoYXJhY3RlcnMgKHN1Y2ggYXMgKiwgPywKICAgZXRjKSwgaXQgcmVxdWlyZXMgYW4gZXhhY3QgbWF0Y2guIEZvciBleGFtcGxlOgoKICBcZmFycmF5bG9vayhvb2ZhLCZhKQoKICAgc2VhcmNoZXMgZm9yIHRoZSBmaXJzdCBlbGVtZW50IG9mIFwmYVtdIHdob3NlIHZhbHVlIGlzICJvb2ZhIi4gQnV0OgoKICBcZmFycmF5bG9vayhvb2ZhKiwmYSkKCiAgIGZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IHdob3NlIHZhbHVlIHN0YXJ0cyB3aXRoICJvb2ZhIiwgYW5kOwoKICBcZmFycmF5bG9vaygqb29mYSwmYSkKCiAgIGZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IHdob3NlIHZhbHVlIGVuZHMgd2l0aCAib29mYSIsIGFuZDsKCiAgXGZhcnJheWxvb2soKm9vZmEqLCZhKQoKICAgZmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgd2hvc2UgdmFsdWUgY29udGFpbnMgIm9vZmEiLgoKICAgSGVyZSdzIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24gb2YgbG9va2luZyB1cCBwYXR0ZXJucyBpbiBhcnJheXM6CgogIGxvY2FsIFwmYVtdIFwleCBcJW4KICBkZWNsYXJlIFwmYVtdID0gemVybyBvbmUgdHdvIHRocmVlIGZvdXIgZml2ZSBzaXggc2V2ZW4gZWlnaHQgbmluZSB0ZW4KICB3aGlsZSB0cnVlIHsKICAgICAgLlwleCA9IDEKICAgICAgLlwlbiA9IDAKICAgICAgYXNrIFwlYSB7IFBhdHRlcm4/IH0KICAgICAgaWYgbm90IGRlZiBcJWEgZXhpdCAwIERvbmUuCiAgICAgIHdoaWxlIDw9IFwleCBcZmRpbSgmYSkgewogICAgICAgICAgLlwleCA6PSBcZmFycmF5bG9vayhcJWEsJmFbXCV4XSkKICAgICAgICAgIGlmICggPCBcJXggMCApIGJyZWFrCiAgICAgICAgICBlY2hvIFxmbHBhZChcJXgsMykuIFwmYVtcJXhdCiAgICAgICAgICBpbmNyZW1lbnQgXCV4CiAgICAgICAgICBpbmNyZW1lbnQgXCVuCiAgICAgIH0KICAgICAgaWYgKCA8IFwlbiAxICkgZWNobyBQYXR0ZXJuIG5vdCBmb3VuZCAtICJcJWEiCiAgfQoKICAgVGhlIGFycmF5IG5lZWQgbm90IGJlIHNvcnRlZC4gV2hlbiBhIHBhdHRlcm4gaXMgZ2l2ZW4sIGEgc2VhcmNoIGlzCiAgIHBlcmZvcm1lZDsgaWYgdGhlcmUgaXMgYSBtYXRjaCwgdGhlIG1hdGNoaW5nIGVsZW1lbnQncyBpbmRleCBhbmQgdGhlCiAgIGVsZW1lbnQgaXRzZWxmIGFyZSBwcmludGVkLCBhbmQgdGhlIHNlYXJjaCBiZWdpbnMgYWdhaW4gYXQgdGhlIG5leHQKICAgZWxlbWVudC4gVGh1cyBlYWNoIG1hdGNoaW5nIGVsZW1lbnQgaXMgcHJpbnRlZC4gSWYgbm9uZSBtYXRjaCwgdGhlCiAgICJQYXR0ZXJuIG5vdCBmb3VuZCIgbWVzc2FnZSBpcyBwcmludGVkLiBUaGUgcHJvY2VzcyByZXBlYXRzIGZvciBhcwogICBtYW55IHBhdHRlcm5zIGFzIHRoZSB1c2VyIHdhbnRzIHRvIHR5cGUsIGFuZCB0ZXJtaW5hdGVzIHdoZW4gdGhlIHVzZXIKICAgdHlwZXMgYW4gZW1wdHkgcGF0dGVybi4KCiAgIE5vdyBsZXQncyBidWlsZCBhIGxpdHRsZSBjb21tYW5kIHBhcnNlciwgY29uc2lzdGluZyBvZiBhIGtleXdvcmQKICAgdGFibGUsIGFuZCBhIGxvb3AgdG8gbG9vayB1cCB0aGUgdXNlcidzIGNvbW1hbmRzIGluIGl0IHdpdGgKICAgXGZ0YWJsZWxvb2soKS4gSW4gdGhpcyBjYXNlIHRoZSBhcnJheSBlbGVtZW50cyBoYXZlICJmaWVsZHMiIHNlcGFyYXRlZAogICBieSBjb2xvbiAoOikgLS0gYSBrZXl3b3JkIGFuZCBhIHZhbHVlLiBLZXl3b3JkIHRhYmxlcyBtdXN0IGJlIHNvcnRlZAogICBpZiBcdGFibGVsb29rKCkgaXMgdG8gd29yayByaWdodCwgc28gYWZ0ZXIgZGVjbGFyaW5nIGFuZCBpbml0aWFsaXppbmcKICAgdGhlIHRhYmxlIGFycmF5LCB3ZSBzb3J0IGl0LgoKICBsb2NhbCBcJmtbXSBcJWEgXCVpIFwlbgoKICBhcnJheSBkZWNsYXJlIFwma1tdID0gZHJpdmU6OSBkbzo4IGRpc2N1c3M6NyBsaXZlOjYgc3BlbmQ6NSBoZWxwOjQgcXVpdDowCgogIGFycmF5IHNvcnQgJmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTWFrZSBzdXJlIGFycmF5IGlzIHNvcnRlZAogIGVjaG8gVHlwZSAiaGVscCIgZm9yIGhlbHAuICAgICAgICAgICAgICAgIDsgUHJpbnQgZ3JlZXRpbmcgJiBpbnN0cnVjdGlvbnMKCiAgd2hpbGUgdHJ1ZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb29wIHRvIGdldCBjb21tYW5kcwogICAgICB1bmRlZmluZSBcJWEKICAgICAgd2hpbGUgbm90IGRlZmluZWQgXCVhIHsgICAgICAgICAgICAgICA7IEdldCBhIGNvbW1hbmQKICAgICAgICAgIGFzayBcJWEgeyBDb21tYW5kPyB9CiAgICAgIH0KICAgICAgLlwlbiA6PSBcZnRhYmxlbG9vayhcJWEsJmspICAgICAgICAgICA7IExvb2sgdXAgdGhlIGNvbW1hbmQKICAgICAgc3dpdGNoIFwlbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICA7IEhhbmRsZSBlcnJvcnMKICAgICAgICA6LTEsIGVjaG8gTm90IGZvdW5kIC0gIlwlYSIgICAgICAgICA7IERvZXNuJ3QgbWF0Y2gKICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgOi0yLCBlY2hvIEFtYmlndW91cyAtICJcJWEiICAgICAgICAgOyBNYXRjaGVzIHRvbyBtYW55CiAgICAgICAgICAgICBjb250aW51ZQogICAgICB9CiAgICAgIHN3aXRjaCBcZndvcmQoXCZrW1wlbl0sMikgeyAgICAgICAgICAgOyBEaXNwYXRjaCBhY2NvcmRpbmcgdG8gdmFsdWUKICAgICAgICAgOjksIGVjaG8gRHJpdmluZy4uLiwgYnJlYWsKICAgICAgICAgOjgsIGVjaG8gRG9pbmcuLi4sIGJyZWFrCiAgICAgICAgIDo3LCBlY2hvIERpc2N1c3NpbmcuLi4sIGJyZWFrCiAgICAgICAgIDo2LCBlY2hvIExpdmluZy4uLiwgYnJlYWsKICAgICAgICAgOjUsIGVjaG8gU3BlbmRpbmcuLi4sIGJyZWFrCiAgICAgICAgIDo0LCBlY2hvIHsgQ29tbWFuZHMgKG1heSBiZSBhYmJyZXZpYXRlZCk6fQogICAgICAgICAgICAgZm9yIFwlaSAxIFxmZGltKCZrKSAxIHsKICAgICAgICAgICAgICAgIGVjaG8geyAgXCVpLiBcZndvcmQoXCZrW1wlaV0sMSkgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWsKICAgICAgICAgOjAsIGV4aXQgMCBCeWUhCiAgICAgICAgIDpkZWZhdWx0LCBzdG9wIDEgSW50ZXJuYWwgZXJyb3IKICAgICAgfQogIH0KCiAgIEluIHRoaXMgZXhhbXBsZSwga2V5d29yZHMgYXJlICJkcml2ZSIsICJkbyIsICJkaXNjdXNzIiwgZXRjLCBhbmQgdGhlaXIKICAgdmFsdWVzIGFyZSB1bmlxdWUgbnVtYmVycyAodmFsdWVzIG5lZWQgbm90IGJlIG51bWJlcnMsIGFuZCB0aGVyZSBuZWVkCiAgIG5vdCBiZSBvbmx5IG9uZSB2YWx1ZSAtLSB0aGVyZSBjYW4gYmUgMCwgMSwgMiwgb3IgbW9yZSBvZiB0aGVtKS4gVGhlCiAgIHVzZXIgdHlwZXMgYSBjb21tYW5kLCB3aGljaCBjYW4gYmUgdGhlIHdob2xlIHdvcmQgKGxpa2UgImhlbHAiKSBvciBhbnkKICAgYWJicmV2aWF0aW9uIChsaWtlICJoZWwiLCAiaGUiLCBvciBqdXN0ICJoIikuIElmIHRoaXMgZG9lcyBub3QgbWF0Y2gKICAgYW55IGtleXdvcmRzLCBcZnRhYmxlbG9vaygpIHJldHVybnMgLTE7IGlmIGl0IG1hdGNoZXMgbW9yZSB0aGFuIG9uZQogICAoYXMgd291bGQgImQiKSwgaXQgcmV0dXJucyAtMi4gT3RoZXJ3aXNlIHRoZSBhcnJheSBpbmRleCBpcyByZXR1cm5lZCwKICAgMSBvciBoaWdoZXIuCgogICBHaXZlbiB0aGUgYXJyYXkgaW5kZXggXCVuLCB3ZSBjYW4gZ2V0IHRoZSB0YWJsZSB2YWx1ZXMgYXMgZm9sbG93czoKCiAgXGZ3b3JkKFwma1tcJW5dLDEpIGlzIHRoZSBrZXl3b3JkIChmaXJzdCBmaWVsZCkKICBcZndvcmQoXCZrW1wlbl0sMikgaXMgdGhlIHZhbHVlIChzZWNvbmQgZmllbGQsIGluIHRoaXMgY2FzZSBhIG51bWJlcikKCiAgIEluIG91ciBleGFtcGxlLCB3ZSB1c2UgdGhlIHZhbHVlIChudW1iZXIpIGFzIHRoZSBTV0lUQ0ggdmFyaWFibGUuIEFzCiAgIG5vdGVkLCBcZmFibGVsb29rKCkgZXhwZWN0cyB0aGUgYXJyYXkgZWxlbWVudHMgdG8gY29udGFpbiBtdWx0aXBsZQogICBmaWVsZHMgc2VwYXJhdGVkIGJ5IGNvbG9uICg6KSAob3Igb3RoZXIgY2hhcmFjdGVyIHRoYXQgeW91IHNwZWNpZnksCiAgIGUuZy4gXGZ0YWJsZWxvb2soXCVhLCZhLF4pKSBhbmQgd2hlbiBtYXRjaGluZyB0aGUga2V5d29yZCwgaWdub3JlcyB0aGUKICAgZmlyc3QgZGVsaW1pdGVyIGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNy4xMC44LiBIaW50cyBmb3IgVXNpbmcgQXJyYXlzCgogICBDIHByb2dyYW1tZXJzIGFyZSBhY2N1c3RvbWVkIHRvIG91dC1vZi1ib3VuZHMgYXJyYXkgcmVmZXJlbmNlcyBjYXVzaW5nCiAgIGNvcmUgZHVtcHMgb3Igd29yc2UuIEluIEMtS2VybWl0OgoKICAgICAqIEEgcmVmZXJlbmNlIHRvIGFuIGFuIG91dC1vZi1ib3VuZHMgYXJyYXkgZWxlbWVudCByZXR1cm5zIHRoZSBlbXB0eQogICAgICAgc3RyaW5nLgogICAgICogQW4gYXR0ZW1wdCB0byBzZXQgdGhlIHZhbHVlIG9mIGFuIGFycmF5IGVsZW1lbnQgdGhhdCBpcyBvdXQgb2YKICAgICAgIGJvdW5kcyBvciB0aGF0IGhhcyBub3QgYmVlbiBkZWNsYXJlZCBzaW1wbHkgZmFpbHMuCgogICBDIHByb2dyYW1tZXJzIGV4cGVjdCBhbiBhcnJheSBvZiBzaXplIG50byBoYXZlIGVsZW1lbnRzIDAgdGhyb3VnaCBuLTEuCiAgIEZvcnRyYW4gcHJvZ3JhbW1lcnMgZXhwZWN0IHRoZSBzYW1lIGFycmF5IHRvIGhhdmUgZWxlbWVudHMgMSB0aHJvdWdoCiAgIG4uIEMtS2VybWl0IGFjY29tbW9kYXRlcyBib3RoIHN0eWxlczsgd2hlbiB5b3UgZGVjbGFyZSBhbiBhcnJheSBvZgogICBzaXplIG4sIGl0IGhhcyBuPTEgZWxlbWVudHMsIDAgdGhyb3VnaCBuLCBhbmQgeW91IGNhbiB1c2UgdGhlIGFycmF5IGluCiAgIHlvdXIgYWNjdXN0b21lZCBtYW5uZXIsIDAtYmFzZWQgb3IgMS1iYXNlZC4KCiAgIEhvd2V2ZXIsIG5vdGUgdGhhdCBDLUtlcm1pdCBoYXMgY2VydGFpbiBiaWFzZXMgdG93YXJkcyAxLWJhc2VkIGFycmF5czoKCiAgICAgKiBBc3NpZ25tZW50IG9mIGZpbGUgbGlzdHMgc3RhcnRzIHdpdGggZWxlbWVudCAxIChbNjAyXVNlY3Rpb24KICAgICAgIDcuMTAuMykuCiAgICAgKiBBc3NpZ25tZW50IGJ5IFxmc3BsaXQoKSBzdGFydHMgd2l0aCBlbGVtZW50IDEgKFs2MDNdU2VjdGlvbiA3LjMpLgogICAgICogQXJyYXkgaW5pdGlhbGl6YXRpb24gc2tpcHMgdGhlIDB0aCBlbGVtZW50LiBUbyBpbml0aWFsaXplIGEKICAgICAgIDAtYmFzZWQgYXJyYXksIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzOgogIGRlY2xhcmUgXCZhWzNdID0gb25lIHR3byB0aHJlZQogIC5cJmFbMF0gPSB6ZXJvCiAgICAgKiBUaGUgQVJSQVkgU09SVCBjb21tYW5kIHNraXBzIHRoZSAwdGggZWxlbWVudCB1bmxlc3MgeW91IGluY2x1ZGUKICAgICAgIC9SQU5HRTowCiAgICAgKiBUaGUgU0hJRlQgY29tbWFuZCBpZ25vcmVzIGVsZW1lbnQgMCBvZiB0aGUgXCZfW10gYXJyYXkuCgogICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBhbiBhcnJheSdzIGRpbWVuc2lvbmVkIHNpemUgYW5kIHRoZSBudW1iZXIgb2YKICAgZWxlbWVudHMgaW4gdGhlIGFycmF5IGlzIGltcG9ydGFudCB3aGVuIHNvcnRpbmcuIFRvIGlsbHVzdHJhdGU6CgogIGRlY2xhcmUgXCZhWzEwMF0gICAgICAgICAgICAgICAgICA7IERlY2xhcmUgYXJyYXkgJmEgd2l0aCAxMDAgZWxlbWVudHMKICBmb3BlbiAvcmVhZCBcJWMgb29mYS50eHQgICAgICAgICAgOyBPcGVuIGEgZmlsZQogIGlmIGZhaWwuLi4KICBmb3IgXCVpIDEgXGZkaW0oJmEpIDEgeyAgICAgICAgICAgOyBSZWFkIHRoZSBmaWxlIGludG8gdGhlIGFycmF5CiAgICAgIGZyZWFkIFwlYyBcJmFbXCVpXQogICAgICBpZiBmYWlsIGJyZWFrCiAgfQogIGZjbG9zZSBcJWMKICBpZiA+IFwlaSBcZmRpbSgmYSkgZW5kIDEgRmlsZSBoYXMgdG9vIG1hbnkgbGluZXMgZm9yIGFycmF5LgogIC5cJW4gOjo9IFwlaSAtIDEKICBlY2hvIEZpbGUgaGFzIFwlbiBsaW5lKHMpLgoKICAgTGV0J3Mgc2F5IHRoZSBmaWxlIGhhZCA5NSBsaW5lcy4gVGhpcyBsZWF2ZXMgZWxlbWVudHMgOTYtMTAwIG9mIHRoZQogICBhcnJheSBlbXB0eS4gTm93IHN1cHBvc2UgeW91IHNvcnQgdGhlIGFycmF5IGFuZCB3cml0ZSBvdXQgdGhlIHJlc3VsdDoKCiAgc29ydCAmYSAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgU29ydCB0aGUgd2hvbGUgYXJyYXkKICBmb3BlbiAvd3JpdGUgXCVvIG9vZmEudHh0LnNvcnRlZCAgOyBPcGVuIGFuIG91dHB1dCBmaWxlCiAgaWYgZmFpbCAuLi4KICBmb3IgXCVpIDEgXCVuIDEgeyAgICAgICAgICAgICAgICAgOyBXcml0ZSBvdXQgOTUgcmVjb3JkcwogICAgICBmd3JpdGUgL2xpbmUgXCVvIFwmYVtcJWldCiAgICAgIGlmIGZhaWwgZW5kIDEgV3JpdGUgZXJyb3IKICB9CiAgY2xvc2Ugd3JpdGUKCiAgIFlvdSBtaWdodCBiZSBzdXJwcmlzZWQgYXQgdGhlIGNvbnRlbnRzIG9mICJvb2ZhLnR4dC5zb3J0ZWQiIC0tIGZpdmUKICAgZW1wdHkgZWxlbWVudHMsIDk2LTEwMCwgZmxvYXRlZCB0byB0aGUgdG9wIG9mIHRoZSBhcnJheSBpbiB0aGUgc29ydCwKICAgYW5kIHNpbmNlIHlvdXIgd3JpdGUgbG9vcCBvbmx5IGhhZCA5NSBpdGVyYXRpb25zLCB0aGUgZmluYWwgNSBsaW5lcyBvZgogICB0aGUgc29ydGVkIGZpbGUgYXJlIGxvc3QuCgogICBUaGVyZWZvcmUsIHdoZW4gZGVhbGluZyB3aXRoIHBhcnRpYWxseSBmaWxsZWQgYXJyYXlzIC0tIGVzcGVjaWFsbHkKICAgd2hlbiBzb3J0aW5nIHRoZW0gLS0gcmVtZW1iZXIgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzLiBBCiAgIGhhbmR5IHdheSBvZiByZWNvcmRpbmcgYW4gYXJyYXkncyAidHJ1ZSIgc2l6ZSBpcyB0byBwdXQgaXQgaW4gdGhlIDB0aAogICBlbGVtZW50LiBUaGF0IHdheSwgaXQgInRyYXZlbHMgd2l0aCB0aGUgYXJyYXkiLiBUbyBpbGx1c3RyYXRlCiAgIChjb250aW51aW5nIHRoZSBwcmV2aW91cyBleGFtcGxlIGF0IHRoZSAiY2xvc2UgcmVhZCIgc3RhdGVtZW50KToKCiAgY2xvc2UgcmVhZAogIGlmID4gXCVpIFxmZGltKCZhKSBlbmQgMSBGaWxlIGhhcyB0b28gbWFueSBsaW5lcyBmb3IgYXJyYXkuCiAgLlwmYVswXSA6Oj0gXCVpIC0gMSAgICAgOyBBc3NpZ24gbnVtYmVyIG9mIGxpbmVzIHRvIFwmYVswXS4KICBlY2hvIEZpbGUgaGFzIFwmYVswXSBsaW5lKHMpLgogIHNvcnQgL3JhbmdlOjE6XCZhWzBdICZhCiAgb3BlbiB3cml0ZSBvb2ZhLnR4dC5zb3J0ZWQKICBpZiBmYWlsIC4uLgogIGZvciBcJWkgMSBcJmFbMF0gMSB7CiAgICAgIHdyaXRlbG4gZmlsZSBcJmFbXCVqXQogICAgICBpZiBmYWlsIGVuZCAxIFdyaXRlIGVycm9yCiAgfQogIGNsb3NlIHdyaXRlCgogICBOb3RlIHRoZSBTT1JUIHN3aXRjaCwgL1JBTkdFOjE6XCZhWzBdLiBUaGlzIGtlZXBzIHRoZSBzb3J0IDEtYmFzZWQsCiAgIGFuZCB1c2VzIGVsZW1lbnQgMCBvZiB0aGUgYXJyYXkgYXMgaXRzIHNpemUgaW5kaWNhdG9yLgoKICAgRmluYWxseSwgbm90ZSB0aGF0IGV2ZW4gdGhvdWdoIHNvbWUgY29tbWFuZHMgb3IgZnVuY3Rpb25zIG1pZ2h0IHB1dCBhCiAgIHNpemUgaW4gYXJyYXkgZWxlbWVudCAwLCBubyBidWlsdC1pbiBmdW5jdGlvbnMgb3IgY29tbWFuZHMgZGVwZW5kIG9uIGEKICAgc2l6ZSBhY3R1YWxseSBiZWluZyB0aGVyZS4gVGh1cyB5b3UgYXJlIHBlcmZlY3RseSBmcmVlIHRvIHJlcGxhY2UgdGhlCiAgIHNpemUgd2l0aCBzb21ldGhpbmcgZWxzZSBhbmQgdHJlYXQgdGhlIGFycmF5IGFzIDAtYmFzZWQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA3LjEwLjkuIERvLUl0LVlvdXJzZWxmIEFycmF5cwoKICAgS2VybWl0J3MgXCZ4W10gYXJyYXlzIGFyZSBuaWNlIGJlY2F1c2Ugb2YgdGhlIGFjY29tcGFueWluZyBidWlsdC1pbgogICBmdW5jdGlvbmFsaXR5IC0tIEFSUkFZIGNvbW1hbmRzLCBidWlsdC1pbiBmdW5jdGlvbnMgdGhhdCBsb2FkIGFuZAogICBzZWFyY2ggYXJyYXlzLCBhdXRvbWF0aWMgZXZhbHVhdGlvbiBvZiBhcml0aG1ldGljIGV4cHJlc3Npb25zIHdpdGhpbgogICB0aGUgc3Vic2NyaXB0IGJyYWNrZXRzLCBhbmQgc28gb24uIFlldCB0aGV5IGFsc28gaGF2ZSBjZXJ0YWluCiAgIGxpbWl0YXRpb25zOgoKICAgIDEuIEV4Y2VwdCB3aGVuIGNyZWF0ZWQgYnkgZHluYW1pYyBsb2FkaW5nIChlLmcuIGJ5IFxmZmlsZXMoKSkgdGhleQogICAgICAgbXVzdCBiZSBkZWNsYXJlZCBhbmQgZGltZW5zaW9uZWQgaW4gYWR2YW5jZS4KICAgIDIuIEluZGljZXMgbXVzdCBiZSBudW1lcmljLCBwb3NpdGl2ZSwgYW5kIGluIHJhbmdlLgogICAgMy4gVGhlcmUgY2FuIGJlIG9ubHkgb25lIGRpbWVuc2lvbi4gTWF0cmljZXMgb3Igb3RoZXIKICAgICAgIGhpZ2hlci1kaW1lbnNpb25lZCBhcnJheXMgYXJlIG5vdCBhdmFpbGFibGUuCgogICBCdXQgbm9uZSBvZiB0aGlzIGlzIHRvIHNheSB5b3UgY2FuJ3QgaW52ZW50IGFueSBraW5kIG9mIGRhdGEgc3RydWN0dXJlCiAgIHlvdSBsaWtlLiBJbiBbNjA0XVNlY3Rpb24gNy45LjIgeW91IGNhbiBzZWUgc29tZSBleGFtcGxlcy4gSGVyZSdzCiAgIGFub3RoZXIgKGNvdXJ0ZXN5IG9mIERhdCBUaHVjIE5ndXllbiksIGluIHdoaWNoIGEgcGFpciBvZiBtYXRyaWNlcyBpcwogICBjcmVhdGVkIGFuZCB0aGVuIGFkZGVkOiBubyBkaW1lbnNpb25pbmcgbmVjZXNzYXJ5LgoKICAucm93ID0gNAogIC5jb2wgPSA5CgogIDsgTUFDUk8gVE8gUFJJTlQgQSBNQVRSSVgKICBkZWZpbmUgUE1BVFJJWCB7CiAgICAgIGVjaG8gTWF0cml4IFwlMToKICAgICAgZm9yIFwlciAxIFxtKHJvdykgMSB7CiAgICAgICAgICBmb3IgXCVjIDEgXG0oY29sKSAxIHsKICAgICAgICAgICAgICB4ZWNobyBcZmxwYWQoXG0oXCUxW1wlcl1bXCVjXSksNCkKICAgICAgICAgIH0KICAgICAgICAgIGVjaG8KICAgICAgfQogICAgICBlY2hvCiAgfQogIDsgQ1JFQVRFIE1BVFJJQ0VTIEEgQU5EIEIKICBmb3IgXCVyIDEgXG0ocm93KSAxIHsKICAgICAgZm9yIFwlYyAxIFxtKGNvbCkgMSB7CiAgICAgICAgICBfZXZhbCBBW1wlcl1bXCVjXSBcJXIgKyBcJWMKICAgICAgICAgIF9ldmFsIEJbXCVyXVtcJWNdIFwlciAqIFwlYwogICAgICB9CiAgfQogIDsgQ1JFQVRFIE1BVFJJWCBDID0gU1VNIE9GIE1BVFJJWCBBIEFORCBNQVRSSVggQgogIGZvciBcJXIgMSBcbShyb3cpIDEgewogICAgICBmb3IgXCVjIDEgXG0oY29sKSAxIHsKICAgICAgICAgIF9ldmFsIENbXCVyXVtcJWNdIFxtKEFbXCVyXVtcJWNdKSArIFxtKEJbXCVyXVtcJWNdKQogICAgICB9CiAgfQogIHBtYXRyaXggQSAgOyBQcmludCBNYXRyaXggQQogIHBtYXRyaXggQiAgOyBQcmludCBNYXRyaXggQgogIHBtYXRyaXggQyAgOyBQcmludCBNYXRyaXggQwoKICAgSW4gdGhlIGV4YW1wbGUsIHdlIHVzZSBtYXRyaXgtbGlrZSBub3RhdGlvbiB0byBjcmVhdGUgbWFjcm9zIHdpdGgKICAgbmFtZXMgbGlrZSAiQVsxXVsxXSIsICJCWzNdWzddIiwgYW5kIHNvIG9uLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNy4xMC4xMC4gQXNzb2NpYXRpdmUgQXJyYXlzCgogICBBbiBhc3NvY2lhdGl2ZSBhcnJheSBpcyBhIHNwZWNpYWwga2luZCBvZiBEby1JdC1Zb3Vyc2VsZiBhcnJheS4gSXQKICAgZGlmZmVycyBmcm9tIGEgcmVndWxhciBhcnJheSBpbiB0aGF0IGl0cyBpbmRpY2VzIG5lZWQgbm90IGJlIG51bWJlcnMKICAgLS0gdGhleSBjYW4gYmUgYW55dGhpbmcgYXQgYWxsIC0tIHdvcmRzLCBmaWxlbmFtZXMsIG5hbWVzIG9mIG1vbnRocywKICAgYW55IGNoYXJhY3RlciBzdHJpbmcgYXQgYWxsLCBhbmQgdGhhdCBpdCBkb2Vzbid0IGhhdmUgdG8gYmUgKGFuZCBpbgogICBmYWN0IGNhbid0IGJlKSBkZWNsYXJlZC4gQW4gYXNzb2NpYXRpdmUgYXJyYXkgZWxlbWVudCBpcyBzaW1wbHkgYQogICBtYWNybyB3aG9zZSBuYW1lIGVuZHMgd2l0aCBhbiBpbmRleCBlbmNsb3NlZCBpbiBhbmdsZSBicmFja2V0cywgZm9yCiAgIGV4YW1wbGU6CgogIGZpbGU8b29mYS50eHQ+CgogICBNb3JlIGZvcm1hbGx5OgoKICBiYXNlbmFtZTxpbmRleD4KCiAgIEFuIGFzc29jaWF0aXZlIGFycmF5IGlzIGEgY29sbGVjdGlvbiBvZiBhbGwgYXNzb2NpYXRpdmUgYXJyYXkgZWxlbWVudHMKICAgdGhhdCBoYXZlIHRoZSBzYW1lIGJhc2VuYW1lLiBBbnkgbnVtYmVyIG9mIGFzc29jaWF0aXZlIGFycmF5cywgZWFjaAogICB3aXRoIGFueSBudW1iZXIgb2YgZWxlbWVudHMsIGNhbiBleGlzdCBhdCB0aGUgc2FtZSB0aW1lLgoKICAgQW4gYXNzb2NpYXRpdmUgYXJyYXkgZWxlbWVudCBjYW4gYmUgYXNzaWduZWQgYSB2YWx1ZSwgc3VjaCBhcyAiMSIsCiAgIGp1c3QgbGlrZSBhbnkgb3RoZXIgbWFjcm86CgogIGRlZmluZSBmaWxlPG9vZmEudHh0PiAxICAgICA7IEdpdmUgImZpbGU8b29mYS50eHQ+IiB0aGUgdmFsdWUgIjEiLgoKICAgb3I6CgogIGFzc2lnbiBmaWxlPG9vZmEudHh0PiBcJWEgICA7IEdpdmUgaXQgdGhlIHZhbHVlIG9mIHRoZSB2YXJpYWJsZSBcJWEuCgogICBIb3dldmVyLCBzaW5jZSBhbiBhc3NvY2lhdGl2ZSBhcnJheSBlbGVtZW50IGlzIGEgbWFjcm8sIGl0IG1heSBub3QKICAgaGF2ZSBhbiBlbXB0eSAobnVsbCkgdmFsdWUsIHNpbmNlIGFzc2lnbmluZyBhbiBlbXB0eSB2YWx1ZSB0byBhIG1hY3JvCiAgIHVuZGVmaW5lcyB0aGUgbWFjcm8uCgogICBZb3UgY2FuIHJlZmVyIHRvIHRoZSB2YWx1ZSBvZiBhbiBhc3NvY2lhdGl2ZSBhcnJheSBlbGVtZW50IHVzaW5nIHRoZQogICBmYW1pbGlhciBub3RhdGlvbiBmb3IgbWFjcm8gdmFsdWVzOgoKICBlY2hvIFxtKGZpbGU8b29mYS50eHQ+KSAgICAgOyBFY2hvIHRoZSB2YWx1ZSBvZiAiZmlsZTxvb2ZhLnR4dD4iLgoKICAgQXNzb2NpYXRpdmUgYXJyYXlzIGFyZSBtb3N0IHVzZWZ1bCwgaG93ZXZlciwgd2hlbiB0aGUgdmFsdWUgb2YgdGhlCiAgIGluZGV4IGlzIGEgdmFyaWFibGUuIEluIHRoYXQgY2FzZSwgeW91IG11c3QgdXNlIHRoZSAiaGlkZGVuIiBmb3JtcyBvZgogICB0aGUgREVGSU5FIG9yIEFTU0lHTiBjb21tYW5kcyB0aGF0IGV2YWx1YXRlIHRoZSBtYWNybyBuYW1lIGJlZm9yZQogICBtYWtpbmcgdGhlIGFzc2lnbm1lbnQgKHNlZSBbNjA1XVVzaW5nIEMtS2VybWl0LCBwYWdlIDQ1NykuIEV4YW1wbGU6CgogIGRlZmluZSBcJWYgb29mYS50eHQKICBfZGVmaW5lIGZpbGU8XCVmPiAxCiAgZWNobyBmaWxlPFwlZj4gPSBcbShmaWxlPFwlZj4pCgogICBwcmludHM6CgogIGZpbGU8b29mYS50eHQ+ID0gMQoKICAgYW5kIHRoZW46CgogIF9pbmNyZW1lbnQgZmlsZTxcJWY+CiAgZWNobyBmaWxlPFwlZj4gPSBcbShmaWxlPFwlZj4pCgogICBwcmludHM6CgogIGZpbGU8b29mYS50eHQ+ID0gMgoKICAgV2hhdCBhcmUgYXNzb2NpYXRpdmUgYXJyYXlzIGdvb2QgZm9yPyBUaGUgY2xhc3NpYyBleGFtcGxlIGlzICJ3b3JkCiAgIGNvdW50cyI6IGZpbmRpbmcgdGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIHdvcmQgaXMgdXNlZCBpbiBhIHRleHQKICAgd2l0aG91dCBrbm93aW5nIGluIGFkdmFuY2Ugd2hhdCB0aGUgd29yZHMgYXJlLiBXaXRob3V0IGFzc29jaWF0aXZlCiAgIGFycmF5cywgeW91ciBwcm9ncmFtIHdvdWxkIGhhdmUgdG8gYnVpbGQgYSB0YWJsZSBvZiBzb21lIGtpbmQsIGFuZAogICBldmVyeSB0aW1lIGEgd29yZCB3YXMgZW5jb3VudGVyZWQsIGxvb2sgaXQgdXAgaW4gdGhlIHRhYmxlIHRvIGZpbmQgaXRzCiAgIHBvc2l0aW9uIGFuZCBjb3VudGVyLCBvciBhZGQgaXQgdG8gdGhlIHRhYmxlIGlmIGl0IHdhc24ndCBmb3VuZCAtLSBhCiAgIHRpbWUtY29uc3VtaW5nIGFuZCBsYWJvcmlvdXMgcHJvY2Vzcy4gQXNzb2NpYXRpdmUgYXJyYXlzLCBob3dldmVyLCBsZXQKICAgeW91IHVzZSB0aGUgd29yZCBpdHNlbGYgYXMgdGhlIHRhYmxlIGluZGV4IGFuZCB0aGVyZWZvcmUgc2lkZXN0ZXAgYWxsCiAgIHRoZSB0YWJsZSBidWlsZGluZyBhbmQgbG9va3Vwcy4KCiAgIExldCdzIHdvcmsgdGhyb3VnaCBhIHByYWN0aWNhbCBleGFtcGxlLiBTdXBwb3NlIHlvdSBoYXZlIGEKICAgZmlsZS10cmFuc2ZlciBsb2cgaW4gd2hpY2ggZWFjaCBsaW5lIGlzIGNvbXBvc2VkIG9mIGEgbnVtYmVyIG9mCiAgIGJsYW5rLXNlcGFyYXRlZCBmaWVsZHMsIGFuZCB0aGUgOXRoIGZpZWxkIGlzIGEgZmlsZW5hbWUgKHdoaWNoIGhhcHBlbnMKICAgdG8gYmUgdGhlIGZvcm1hdCBvZiBjZXJ0YWluIEZUUCBzZXJ2ZXIgbG9ncywgYXMgd2VsbCBhcyBvZiBDLUtlcm1pdCdzCiAgIG5ldyBGVFAtZm9ybWF0IHRyYW5zYWN0aW9uIGxvZywgZGVzY3JpYmVkIGluIFs2MDZdU2VjdGlvbiA0LjE3LjIpLCBmb3IKICAgZXhhbXBsZToKCiAgV2VkIEp1bCAxNCAwOTozNTozMSAxOTk5IDIyIHh4Lm1pdC5lZHUgMTM0MTIgL3B1Yi9mdHAvbW0vaW50cm8udHh0IC4uLi4KCiAgIGFuZCB5b3Ugd2FudCB0byBmaW5kIG91dCBob3cgbWFueSB0aW1lcyBlYWNoIGZpbGUgd2FzIHRyYW5zZmVycmVkLiBUaGUKICAgZm9sbG93aW5nIGNvZGUgYnVpbGRzIGFuIGFzc29jaWF0aXZlIGFycmF5LCBmaWxlPD4sIGNvbnRhaW5pbmcgdGhlCiAgIGNvdW50cyBmb3IgZWFjaCBmaWxlOgoKICBsb2NhbCBuYW1lIGxpbmUgbWF4IFwlYyBcJW4gICAgICAgICAgOyBEZWNsYXJlIGxvY2FsIHZhcmlhYmxlcwogIGZvcGVuIC9yZWFkIFwlYyAvdmFyL2xvZy9mdHBkLmxvZyAgICA7IE9wZW4gdGhlIGxvZyBmaWxlIChbNjA3XVNlY3Rpb24gMS4yMikKICBpZiBmYWlsIGV4aXQgMSBDYW4ndCBvcGVuIGxvZyAgICAgICAgOyBDaGVjawogIHdoaWxlIHRydWUgeyAgICAgICAgICAgICAgICAgICAgICAgICA7IExvb3AgZm9yIGVhY2ggcmVjb3JkCiAgICAgIGZyZWFkIC9saW5lIFwlYyBsaW5lICAgICAgICAgICAgIDsgUmVhZCBhIGxpbmUKICAgICAgaWYgZmFpbCBicmVhayAgICAgICAgICAgICAgICAgICAgOyBDaGVjayBmb3IgZW5kIG9mIGZpbGUKICAgICAgLm5hbWUgOj0gXGZ3b3JkKFxtKGxpbmUpLDkseyB9KSAgOyBHZXQgOXRoIGZpZWxkID0gZmlsZW5hbWUgKFNlYyA3LjMpCiAgICAgIF9pbmNyZW1lbnQgZmlsZTxcbShuYW1lKT4gICAgICAgIDsgSW5jcmVtZW50IGl0cyBjb3VudGVyIChTZWMgNy45LjIpCiAgfQogIGZjbG9zZSBcJWMgICAgICAgICAgICAgICAgICAgICAgICAgICA7IENsb3NlIGZpbGUgd2hlbiBkb25lLgoKICAgTm90ZSB0aGF0IF9JTkNSRU1FTlQgKGFuZCBJTkNSRU1FTlQsIGFuZCBbX11ERUNSRU1FTlQpIHRyZWF0IGFuIGVtcHR5CiAgIChpLmUuIG5vbmV4aXN0ZW50KSB2YXJpYWJsZSBhcyBoYXZpbmcgYSB2YWx1ZSBvZiAwLCBhbmQgdGhlcmVmb3JlCiAgIGNyZWF0ZXMgdGhlIHZhcmlhYmxlIHdpdGggYSB2YWx1ZSBvZiAxLgoKICAgQXQgdGhpcyBwb2ludCwgaWYgeW91IHRvbGQgS2VybWl0IHRvICJzaG93IG1hY3JvIGZpbGU8IiwgaXQgd291bGQgbGlzdAogICB0aGUgYXNzb2NpYXRpdmUgYXJyYXkuIEJ1dCBzaW5jZSB5b3UgZG9uJ3QgbmVjZXNzYXJpbHkga25vdyB0aGUgbmFtZXMKICAgb2YgdGhlIGZpbGVzIGluIHRoZSBhcnJheSwgb3IgZXZlbiBob3cgbWFueSBlbGVtZW50cyBhcmUgaW4gdGhlIGFycmF5LAogICBob3cgY2FuIHlvdSB1c2UgaXQgaW4gYSBzY3JpcHQgcHJvZ3JhbT8KCiAgIFRoZSBpZGVhIG9mIGNyZWF0aW5nIG1hY3JvIG5hbWVzIHRoYXQgaW5jbHVkZSBjaGFyYWN0ZXItc3RyaW5nIGluZGljZXMKICAgZW5jbG9zZWQgaW4gYW5nbGUgYnJhY2tldHMgaXMgcGVyZmVjdGx5IGFyYml0cmFyeSBhbmQgZG9lc24ndCBkZXBlbmQKICAgb24gYW55IEtlcm1pdCBmZWF0dXJlcyB0aGF0IHdlcmVuJ3QgYWxyZWFkeSB0aGVyZSAtLSB3ZSBjb3VsZCBqdXN0IGFzCiAgIGVhc2lseSBoYXZlIHVzZWQgc29tZSBvdGhlciBub3RhdGlvbiwgc3VjaCBhcyAiZmlsZVtpbmRleF0iLAogICAiZmlsZTppbmRleCIsIG9yICJmaWxlLmluZGV4IiwgYW5kIHRoZSBjb2RlIGFib3ZlIHdvdWxkIGhhdmUgd29ya2VkCiAgIGp1c3QgYXMgd2VsbCAod2l0aCB0aGUgY29ycmVzcG9uZGluZyBzeW50YXggYWRqdXN0bWVudHMpLiBCdXQgdG8gYmUKICAgYWJsZSB0byB1c2UgYW4gYXNzb2NpYXRpdmUgYXJyYXkgaW4gYSBwcm9ncmFtIGFmdGVyIHRoZSBhcnJheSBpcwogICBidWlsdCwgd2UgbmVlZCBhIG1ldGhvZCBvZiBhY2Nlc3NpbmcgYWxsIGl0cyBlbGVtZW50cyB3aXRob3V0IGtub3dpbmcKICAgaW4gYWR2YW5jZSB3aGF0IHRoZXkgYXJlLiBUaGF0J3Mgd2hlcmUgdGhlIGNob3NlbiBub3RhdGlvbiBjb21lcyBpbi4KCiAgIEZpcnN0IG9mIGFsbCwgYW55IG1hY3JvIG5hbWUgdGhhdCBlbmRzIHdpdGggIjx4eHg+IiAod2hlcmUgInh4eCIgaXMKICAgYW55IHN0cmluZykgaXMgY2FzZSBzZW5zaXRpdmUsIHVubGlrZSBhbGwgb3RoZXIgbWFjcm8gbmFtZXMsIHdoaWNoIGFyZQogICBjYXNlIGluZGVwZW5kZW50LiBUbyBpbGx1c3RyYXRlLCAiZmlsZTxvb2ZhLnR4dD4iIGFuZCAiZmlsZTxPT0ZBLlRYVD4iCiAgIGFyZSB0d28gZGlzdGluY3QgbWFjcm9zLCB3aGVyZWFzICJPT0ZBIiwgIk9vZmEiLCBhbmQgIm9vZmEiLCB3aGVuIHVzZWQKICAgYXMgbWFjcm8gbmFtZXMsIGFyZSBhbGwgdGhlIHNhbWUuCgogICBTZWNvbmQsIHRoZSBuZXcgXGZhYWNvbnZlcnQoKSBmdW5jdGlvbiBjb252ZXJ0cyBhbiBhc3NvY2lhdGl2ZSBhcnJheQogICAodGhhdCBpcywgYWxsIG1hY3JvcyB3aXRoIG5hbWVzIG9mIHRoZSBmb3JtICJiYXNlPGluZGV4PiIgdGhhdCBoYXZlCiAgIHRoZSBzYW1lICJiYXNlIiBwYXJ0KSBpbnRvIGEgcGFpciBvZiByZWd1bGFyIGFycmF5cyBhbmQgcmV0dXJucyB0aGUKICAgbnVtYmVyIG9mIGVsZW1lbnRzOgoKICBcZmFhY29udmVydChuYW1lLCZhWywmYl0pCgogICAibmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGFzc29jaWF0aXZlIGFycmF5LCB3aXRob3V0IHRoZSBhbmdsZQogICBicmFja2V0cyBvciBpbmRleCAoImZpbGUiIGluIG91ciBleGFtcGxlKS4KCiAgIFRoZSBzZWNvbmQgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgYSByZWd1bGFyIGFycmF5IGluIHdoaWNoIHRvIHN0b3JlCiAgIHRoZSBpbmRpY2VzIG9mIHRoZSBhc3NvY2lhdGl2ZSBhcnJheSAoZmlsZW5hbWVzIGluIG91ciBleGFtcGxlKTsgaWYgYW4KICAgYXJyYXkgb2YgdGhpcyBuYW1lIGFscmVhZHkgZXhpc3RzLCBpdCBpcyBkZXN0cm95ZWQgdW5sZXNzIHRoZSBhcnJheSBpcwogICBMT0NBTC4gVGhlIHRoaXJkIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIGFub3RoZXIgcmVndWxhciBhcnJheSBpbgogICB3aGljaCB0byBzdG9yZSB0aGUgdmFsdWVzICh0aGUgY291bnRzIGluIG91ciBleGFtcGxlKSwgd2l0aCB0aGUgc2FtZQogICBydWxlcyBhYm91dCBhcnJheSBuYW1lIGNvbGxpc2lvbnMuIElmIHlvdSBjYXJlIG9ubHkgYWJvdXQgdGhlIGluZGljZXMKICAgYW5kIG5vdCB0aGUgdmFsdWVzLCB5b3UgY2FuIG9taXQgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIFxmYWFjb252ZXJ0KCkuCiAgIEluIGFueSBjYXNlLCB0aGUgYXNzb2NpYXRpdmUgYXJyYXkgaXMgY29udmVydGVkLCBub3QgY29waWVkOiBpdHMKICAgZWxlbWVudHMgYXJlIG1vdmVkIHRvIHRoZSBzcGVjaWZpZWQgcmVndWxhciBhcnJheXMsIHNvIGFmdGVyCiAgIGNvbnZlcnNpb24gdGhlIG9yaWdpbmFsIGFzc29jaWF0aXZlIGFycmF5IGlzIGdvbmUuCgogICBBcyB3aXRoIG90aGVyIGFycmF5LWxvYWRpbmcgZnVuY3Rpb25zLCBcZmFhY29udmVydCgpIHNldHMgZWxlbWVudCAwIG9mCiAgIGVhY2ggYXJyYXkgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkuCgogICBUbyBjb250aW51ZSBvdXIgZXhhbXBsZToKCiAgLm1heCA6PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IE1heGltdW0gY291bnQKICAuXCVuIDo9IFxmYWFjb252ZXJ0KGZpbGUsJmEsJmIpICAgICAgICAgICAgIDsgQ29udmVydAogIGZvciBcJWkgMSBcJW4gMSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBMb29wIHRocm91Z2ggdmFsdWVzCiAgICAgIGVjaG8gXGZscGFkKFwlaSwzKS4gXCZhW1wlaV06IFwmYltcJWldICA7IEVjaG8gdGhpcyBwYWlyCiAgICAgIGlmICggPiBcJmJbXCVpXSBcbShtYXgpICkgeyAgICAgICAgICAgICA7IENoZWNrIGZvciBuZXcgbWF4aW11bQogICAgICAgICAgLm5hbWUgOj0gXCZhW1wlaV0KICAgICAgICAgIC5tYXggIDo9IFwmYltcJWldCiAgICAgIH0KICB9CiAgZWNobyBNb3N0IHBvcHVsYXIgZmlsZTogXG0obmFtZSksIGFjY2Vzc2VzOiBcbShtYXgpCgogICBUaGlzIGxpc3RzIHRoZSBmaWxlcyBhbmQgY291bnRzIGFuZCB0aGVuIGFubm91bmNlcyB3aGljaCBmaWxlIGhhcyB0aGUKICAgaGlnaGVzdCBjb3VudC4KCiAgIE5vdyBzdXBwb3NlIHlvdSB3YW50IHRvIHNvcnQgdGhlIGFycmF5IHBhaXIgY3JlYXRlZCBmcm9tIGFuCiAgIGFzc29jaWF0aXZlIGFycmF5LiBJbiBvdXIgZXhhbXBsZSwgXCZhW10gY29udGFpbnMgZmlsZW5hbWVzLCBhbmQgXCZiW10KICAgY29udGFpbnMgdGhlIGFzc29jaWF0ZWQgY291bnRzLiBIZXJlIHdlIHRha2UgYWR2YW50YWdlIG9mIHRoZSBBUlJBWQogICBTT1JUIGNvbW1hbmQncyBhYmlsaXR5IHRvIHNvcnQgYSBzZWNvbmQgYXJyYXkgYWNjb3JkaW5nIHRvIHRoZSBmaXJzdAogICBvbmU6CgogIGFycmF5IHNvcnQgL3JldmVyc2UgL251bWVyaWMgJmIgJmEgICAgICAgICAgOyBEZXNjZW5kaW5nIHNvcnQgYnkgY291bnQKCiAgIE5vdyB0byBzZWUgdGhlIHRvcCBmaXZlIGZpbGVzIGFuZCB0aGVpciBjb3VudHM6CgogIGVjaG8gVGhlIHRvcCA1IGZpbGVzIGFyZToKICBmb3IgXCVpIDEgNSAxIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9vcCB0aHJvdWdoIHRvcCA1IHZhbHVlcwogICAgICBlY2hvIFxmbHBhZChcJWksMykuIFwmYVtcJWldOiBcJmJbXCVpXSAgOyBFY2hvIHRoaXMgcGFpcgogIH0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIDcuMTAuMTEuIFRyYW5zZmVycmluZyBBcnJheSBDb250ZW50cyB0byBPdGhlciBDb21wdXRlcnMKCiAgIFRoZSBTRU5EIC9BUlJBWTphcnJheW5hbWUgY29tbWFuZCAoWzYwOF1TZWN0aW9uIDQuNy4xKSBhbGxvd3MgeW91IHRvCiAgIHNlbmQgdGhlIGNvbnRlbnRzIG9mIGFueSBhcnJheSwgb3IgYW55IGNvbnRpZ3VvdXMgc2VnbWVudCBvZiBpdCwgaW4KICAgZWl0aGVyIHRleHQgb3IgYmluYXJ5IG1vZGUgdG8gYW5vdGhlciBjb21wdXRlciwgdXNpbmcgS2VybWl0IHByb3RvY29sLgogICBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBDLUtlcm1pdCdzIG90aGVyIGZlYXR1cmVzICh0aGUgYXJyYXkKICAgZmVhdHVyZXMgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbjsgdGhlIGZpbGUgaS9vIHBhY2thZ2UgZnJvbQogICBbNjA5XVNlY3Rpb24gMS4yMjsgaXRzIGRlY2lzaW9uLW1ha2luZywgcGF0dGVybi1tYXRjaGluZywgYW5kIHN0cmluZwogICBtYW5pcHVsYXRpb24gY2FwYWJpbGl0aWVzLCBhbmQgc28gb24pIHRoZSBwb3NzaWJpbGl0aWVzIGFyZSBlbmRsZXNzOgogICBleHRyYWN0cyBvZiBsYXJnZSBmaWxlcywgcmVtb3RlIGRhdGFiYXNlIHF1ZXJpZXMsIC4uLiwgYWxsIHdpdGhvdXQKICAgcmVjb3Vyc2UgdG8gc3lzdGVtLWRlcGVuZGVudCBtZWNoYW5pc21zIHN1Y2ggVU5JWCBwaXBlcyBhbmQgZmlsdGVycywKICAgdGh1cyBlbnN1cmluZyBjcm9zcy1wbGF0Zm9ybSBwb3J0YWJpbGl0eSBvZiBzY3JpcHRzIHRoYXQgdXNlIHRoZXNlCiAgIGZlYXR1cmVzLgoKICAgV2hlbiBzZW5kaW5nIGFuIGFycmF5IGluIHRleHQgbW9kZSwgS2VybWl0IGFwcGVuZHMgYSBsaW5lIHRlcm1pbmF0b3IKICAgdG8gZWFjaCBhcnJheSBlbGVtZW50LCBldmVuIGVtcHR5IG9uZXMsIGFuZCBpdCBhbHNvIGNvbnZlcnRzIHRoZQogICBjaGFyYWN0ZXIgc2V0IGZyb20geW91ciBjdXJyZW50IEZJTEUgY2hhcmFjdGVyLXNldCB0byB5b3VyIGN1cnJlbnQKICAgVFJBTlNGRVIgY2hhcmFjdGVyLXNldCwgaWYgYW55LiBObyBjb252ZXJzaW9ucyBhcmUgbWFkZSBvciBsaW5lCiAgIHRlcm1pbmF0aW9ucyBhZGRlZCBpbiBiaW5hcnkgbW9kZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYXJyYXk6CgogIGRjbCBcJmFbXSA9IE9uZSBUd28gVGhyZWUgRm91ciBGaXZlIFNpeAoKICAgaXMgc2VudCBhcyBzaXggbGluZXMsIG9uZSB3b3JkIHBlciBsaW5lLCBpbiB0ZXh0IG1vZGUsIGFuZCBhcyB0aGUgYmFyZQogICB1bnRlcm1pbmF0ZWQgc3RyaW5nICJPbmVUd29UaHJlZUZvdXJGaXZlU2l4IiBpbiBiaW5hcnkgbW9kZS4KCiAgIFlvdSBzaG91bGQgYWx3YXlzIGluY2x1ZGUgYSAvVEVYVCBvciAvQklOQVJZIHN3aXRjaCBpbiBhbnkgU0VORCAvQVJSQVkKICAgY29tbWFuZCB0byBmb3JjZSB0aGUgZGVzaXJlZCB0cmFuc2ZlciBtb2RlLCBvdGhlcndpc2UgeW91J3JlIGxpa2VseSB0bwogICBiZSBzdXJwcmlzZWQgYnkgdGhlIGVmZmVjdHMgZGVzY3JpYmVkIGluIFs2MTBdU2VjdGlvbiA0LjMuCgogICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgoKICAgc2VuZCAvdGV4dCAvYXJyYXk6XCZhW10KICAgICAgICAgIFNlbmRzIHRoZSBlbnRpcmUgY29udGVudHMgb2YgdGhlIGFycmF5IFwmYVtdIGluIHRleHQgbW9kZS4KICAgICAgICAgIFNpbmNlIGFuIGFzLW5hbWUgaXMgbm90IGluY2x1ZGVkLCB0aGUgcmVjZWl2ZXIgaXMgdG9sZCB0aGUKICAgICAgICAgIGZpbGVuYW1lIGlzIF9hcnJheV9hXy4KCiAgIHNlbmQgL3RleHQgL2FycmF5OiZhW10KICAgc2VuZCAvdGV4dCAvYXJyYXk6YVtdCiAgIHNlbmQgL3RleHQgL2FycmF5OiZhCiAgIHNlbmQgL3RleHQgL2FycmF5OmEKICAgICAgICAgIFRoZXNlIGFyZSBhbGwgZXF1aXZhbGVudCB0byB0aGUgcHJldmlvdXMgZXhhbXBsZS4KCiAgIHNlbmQgL3RleHQgL2FycmF5OiZhIC9hcy1uYW1lOmZvby5iYXIKICAgICAgICAgIEFzIGFib3ZlLCBidXQgdGhlIGFycmF5IGlzIHNlbnQgdW5kZXIgdGhlIG5hbWUgZm9vLmJhci4KCiAgIHNlbmQgL3RleHQgL2FycmF5OiZhWzEwMDoxOTldIC9hczpmb28uYmFyCiAgICAgICAgICBBcyBhYm92ZSwgYnV0IG9ubHkgdGhlIGVsZW1lbnRzIGZyb20gMTAwIHRocm91Z2ggMTk5IGFyZSBzZW50LgoKICAgSW4gdGV4dC1tb2RlIHRyYW5zZmVycywgY2hhcmFjdGVyIHNldHMgYXJlIHRyYW5zbGF0ZWQgYWNjb3JkaW5nIHRvCiAgIHlvdXIgY3VycmVudCBzZXR0aW5ncywganVzdCBhcyBmb3IgdGV4dCBmaWxlcy4gSW4gYmluYXJ5IG1vZGUsIG9mCiAgIGNvdXJzZSwgdGhlcmUgaXMgbm8gY2hhcmFjdGVyLXNldCB0cmFuc2xhdGlvbiBvciBvdGhlciBjb252ZXJzaW9uIG9mCiAgIGFueSBraW5kLiBCdXQgcmVtZW1iZXIgdGhhdCBhcnJheSBlbGVtZW50cyBjYW4gbm90IGNvbnRhaW4gdGhlIE5VTAogICAoQVNDSUkgMCkgY2hhcmFjdGVyLCBzaW5jZSB0aGV5IGFyZSBpbXBsZW1lbnRlZCBhcyBOVUwtdGVybWluYXRlZAogICBzdHJpbmdzLgoKICAgSGVyZSdzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gc2VuZCBhbGwgdGhlIGxpbmVzICh1cCB0byAxMDAwIG9mCiAgIHRoZW0pIGZyb20gYSBmaWxlIGFuaW1hbHMudHh0IHRoYXQgY29udGFpbiB0aGUgd29yZHMgImNhdCIsICJkb2ciLCBvcgogICAiaG9nIiAoc2VlIFs2MTFdU2VjdGlvbiA0LjkgYWJvdXQgcGF0dGVybiBtYXRjaGluZyk6CgogIGRlY2xhcmUgXCZhWzEwMDBdCiAgZm9wZW4gL3JlYWQgXCVjIGFuaW1hbHMudHh0CiAgaWYgZmFpbCBleGl0IDEKICAuXCVpID0gMAogIHdoaWxlIHRydWUgewogICAgICBmcmVhZCBcJWMgbGluZQogICAgICBpZiBmYWlsIGJyZWFrCiAgICAgIGlmIG1hdGNoIHtcbShsaW5lKX0geyp7Y2F0LFtkaF1vZ30qfSB7CiAgICAgICAgICBpbmNyZW1lbnQgXCVpCiAgICAgICAgICBpZiAoID4gXCVpIFxmZGltKCZhKSApIGJyZWFrCiAgICAgICAgICAuXCZhW1wlaV0gOj0gXG0obGluZSkKICAgICAgfQogIH0KICBmY2xvc2UgXCVjCiAgc2VuZCAvYXJyYXk6YVsxOlwlaV0gL3RleHQKCiAgIE5vdGUgdGhhdCB3ZSBhcmUgY2FyZWZ1bCB0byBzZW5kIG9ubHkgdGhlIHBhcnQgb2YgdGhlIGFycmF5IHRoYXQgd2FzCiAgIGZpbGxlZCwgbm90IHRoZSBlbnRpcmUgYXJyYXksIGJlY2F1c2UgdGhlcmUgYXJlIGxpa2VseSB0byBiZSBsb3RzIG9mCiAgIHVudXNlZCBlbGVtZW50cyBhdCB0aGUgZW5kLCBhbmQgdGhlc2Ugd291bGQgYmUgc2VudCBhcyBibGFuayBsaW5lcwogICBvdGhlcndpc2UuCgogICBUaGlzIGV4YW1wbGUgcmFpc2VzIGFuIGludGVyZXN0aW5nIHF1ZXN0aW9uOiB3aGF0IGlmIHdlIHdhbnQgdG8gc2VuZAogICBBTEwgdGhlIG1hdGNoaW5nIGxpbmVzLCBldmVuIGlmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMTAwMCBvZiB0aGVtLCBidXQKICAgd2UgZG9uJ3Qga25vdyB0aGUgbnVtYmVyIGluIGFkdmFuY2U/IENsZWFybHkgdGhlIHByb2JsZW0gaXMgbGltaXRlZCBieQogICBLZXJtaXQncyAoYW5kIHRoZSBjb21wdXRlcidzKSBtZW1vcnkuIElmIHRoZXJlIGFyZSBhIHRob3VzYW5kIHRyaWxsaW9uCiAgIG1hdGNoaW5nIGxpbmVzLCB0aGV5IG1vc3QgbGlrZWx5IHdpbGwgbm90IGZpdCBpbiBtZW1vcnksIGFuZCBpbiB0aGlzCiAgIGNhc2UgdGhlIG9ubHkgc29sdXRpb24gaXMgdG8gd3JpdGUgdGhlbSBmaXJzdCB0byBhIHRlbXBvcmFyeSBmaWxlIG9uCiAgIG1hc3Mgc3RvcmFnZSBhbmQgdGhlbiBzZW5kIHRoZSB0ZW1wb3JhcnkgZmlsZSBhbmQgZGVsZXRlIGl0CiAgIGFmdGVyd2FyZHMuCgogICBIb3dldmVyLCB3aGVuIHRoZSBzZWxlY3Rpb24gaXMgbGlrZWx5IHRvIGZpdCBpbiBtZW1vcnksIHRoZQogICBvbmNlLWZhbWlsaWFyIHRlY2huaXF1ZSBvZiBpbml0aWFsIGFsbG9jYXRpb24gd2l0aCBleHRlbnRzIGNhbiBiZQogICB1c2VkOgoKICBpZiBtYXRjaCB7XG0obGluZSl9IHsqe2NhdCxbZGhdb2d9Kn0gewogICAgICBpbmNyZW1lbnQgXCVpCiAgICAgIGlmICggPiBcJWkgXGZkaW0oJmEpICkgewogICAgICAgICAgYXJyYXkgcmVzaXplIGEgXGZkaW0oJmEpKzEwMAogICAgICAgICAgaWYgZmFpbCBzdG9wIDEgTUVNT1JZIEZVTEwKICAgICAgICAgIGVjaG8gTkVXIERJTUVOU0lPTjogXGZkaW0oJmEpCiAgICAgIH0KICAgICAgLlwmYVtcJWldIDo9IFxtKGxpbmUpCiAgfQoKICAgVGhpcyBncm93cyB0aGUgYXJyYXkgaW4gY2h1bmtzIG9mIDEwMCBhcyBuZWVkZWQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy4xMS4gT1VUUFVUIENvbW1hbmQgSW1wcm92ZW1lbnRzCgogICBMSU5FT1VUIFsgdGV4dCBdCiAgICAgICAgICBUaGlzIGNvbW1hbmQgaXMgZXhhY3RseSBsaWtlIE9VVFBVVCwgZXhjZXB0IGl0IHN1cHBsaWVzIGEKICAgICAgICAgIGNhcnJpYWdlIHJldHVybiBhdCB0aGUgZW5kIG9mIHRoZSB0ZXh0LiAibGluZW91dCBleGl0IiBpcwogICAgICAgICAgZXhhY3RseSB0aGUgc2FtZSBhcyAib3V0cHV0IGV4aXRcMTMiLgoKICAgU0VUIE9VVFBVVCBTUEVDSUFMLUVTQ0FQRVMgeyBPTiwgT0ZGIH0KICAgICAgICAgIFRoaXMgY29tbWFuZCBsZXRzIHlvdSB0ZWxsIEMtS2VybWl0IHdoZXRoZXIgdG8gcHJvY2VzcyBcTiwgXEwsCiAgICAgICAgICBhbmQgXEIgc3BlY2lhbGx5IGluIGFuIE9VVFBVVCBjb21tYW5kLCBhcyBkaXN0aW5jdCBmcm9tIG90aGVyIFwKICAgICAgICAgIHNlcXVlbmNlcyAoc3VjaCBhcyBcJWEsIFwxMywgXHYodGltZSksIGV0YykuIE5vcm1hbGx5IHRoZQogICAgICAgICAgc3BlY2lhbCBlc2NhcGVzIGFyZSBoYW5kbGVkLiBVc2UgU0VUIE9VVFBVVCBTUEVDSUFMLUVTQ0FQRVMgT0ZGCiAgICAgICAgICB0byBkaXNhYmxlIHRoZW0uCgogICBEaXNhYmxpbmcgc3BlY2lhbCBlc2NhcGVzIGlzIG5lY2Vzc2FyeSBpbiBzaXR1YXRpb25zIHdoZW4geW91IG5lZWQgdG8KICAgdHJhbnNtaXQgbGluZXMgb2YgZGF0YSBhbmQgeW91IGhhdmUgbm8gY29udHJvbCBvdmVyIHdoYXQgaXMgaW4gdGhlCiAgIGxpbmVzLiBGb3IgZXhhbXBsZSwgYSBmaWxlIG9vZmEudHh0IHRoYXQgY29udGFpbnM6CgogIFRoaXMgaXMgYSBmaWxlCiAgSXQgaGFzIFwlYSB2YXJpYWJsZXMgaW4gaXQKICBBbmQgaXQgaGFzIFxCIGluIGl0LgogIEFuZCBpdCBoYXMgXEwgaW4gaXQuCiAgQW5kIGl0IGhhcyBcTiBpbiBpdC4KICBBbmQgdGhpcyBpcyB0aGUgbGFzdCBsaW5lLgoKICAgY2FuIGJlIHNlbnQgbGlrZSB0aGlzOgoKICBsb2NhbCBsaW5lCiAgc2V0IG91dHB1dCBzcGVjaWFsLWVzY2FwZXMgb2ZmCiAgZm9wZW4gL3JlYWQgXCVjIG9vZmEudHh0CiAgaWYgZmFpbCBzdG9wIDEgQ2FuJ3Qgb3BlbiBvb2ZhLnR4dAogIHdoaWxlIHN1Y2Nlc3MgewogICAgICBmcmVhZCBcJWMgbGluZQogICAgICBpZiBmYWlsIGJyZWFrCiAgICAgIDsgQWRkIGZpbHRlcmluZyBvciBwcm9jZXNzaW5nIGNvbW1hbmRzIGhlcmUuLi4KICAgICAgb3V0cHV0IFxtKGxpbmUpXDEzCiAgfQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDcuMTIuIEZ1bmN0aW9uIGFuZCBWYXJpYWJsZSBEaWFnbm9zdGljcwoKICAgSW4gQy1LZXJtaXQgNi4wIGFuZCBlYXJsaWVyLCB0aGUgb25seSBkaWFnbm9zdGljIHJldHVybmVkIGJ5IGEgZmFpbGluZwogICBmdW5jdGlvbiBjYWxsIHdhcyBhbiBlbXB0eSB2YWx1ZSwgd2hpY2ggKGEpIGNvdWxkIG5vdCBiZSBkaXN0aW5ndWlzaGVkCiAgIGZyb20gYW4gZW1wdHkgdmFsdWUgcmV0dXJuZWQgYnkgYSBzdWNjZXNzZnVsIGZ1bmN0aW9uIGNhbGw7IChiKSBkaWQKICAgbm90IGdpdmUgYW55IGluZGljYXRpb24gb2YgdGhlIGNhdXNlIG9mIGZhaWx1cmU7IGFuZCAoYykgZGlkIG5vdCBjYXVzZQogICB0aGUgZW5jbG9zaW5nIHN0YXRlbWVudCB0byBmYWlsLiBDLUtlcm1pdCA3LjAgY29ycmVjdHMgdGhlc2UKICAgZGVmaWNpZW5jaWVzLgoKICAgU0VUIEZVTkNUSU9OIERJQUdOT1NUSUNTIHsgT04sIE9GRiB9CiAgICAgICAgICB3aGVuIE9OLCBhbGxvd3MgYnVpbHQtaW4gZnVuY3Rpb25zIHRvIHJldHVybiBkaWFnbm9zdGljCiAgICAgICAgICBtZXNzYWdlcyB3aGVuIGltcHJvcGVybHkgcmVmZXJlbmNlZCwgaW5zdGVhZCBvZiBhbiBlbXB0eQogICAgICAgICAgc3RyaW5nLiBGVU5DVElPTiBESUFHTk9TVElDUyBhcmUgT04gYnkgZGVmYXVsdC4gV2hlbiBPRkYsCiAgICAgICAgICBpbXByb3Blcmx5IHJlZmVyZW5jZWQgZnVuY3Rpb25zIGNvbnRpbnVlIHRvIHJldHVybiBhbiBlbXB0eQogICAgICAgICAgc3RyaW5nLiBUaGlzIGNvbW1hbmQgYWxzbyBhZmZlY3RzIGJ1aWx0LWluIHZhcmlhYmxlczsgaW4gdGhpcwogICAgICAgICAgY2FzZSwgYW4gZXJyb3IgbWVzc2FnZSBpcyByZXR1cm5lZCBvbmx5IGlmIHRoZSB2YXJpYWJsZSBkb2VzCiAgICAgICAgICBub3QgZXhpc3QuIFdoZW4gRlVOQ1RJT04gRElBR05PU1RJQ1MgYXJlIE9OLCB0aGUgZXJyb3IgbWVzc2FnZQogICAgICAgICAgaXMgYWxzbyBwcmludGVkLgoKICAgRm9yIHZhcmlhYmxlcywgdGhlIG9ubHkgbWVzc2FnZSBpczoKCiAgPEVSUk9SOk5PX1NVQ0hfVkFSSUFCTEU6XHYobmFtZSk+CgogICB3aGVyZSAibmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIG5vbmV4aXN0ZW50IHZhcmlhYmxlLgoKICAgRm9yIGZ1bmN0aW9ucywgdGhlIGRpYWdub3N0aWMgbWVzc2FnZSBpczoKCiAgPEVSUk9SOm1lc3NhZ2U6XGZuYW1lKCk+CgogICB3aGVyZSAibWVzc2FnZSIgaXMgcmVwbGFjZWQgYnkgYSBtZXNzYWdlLCBhbmQgIm5hbWUiIGlzIHJlcGxhY2VkIGJ5CiAgIHRoZSBmdW5jdGlvbiBuYW1lLCBlLmcuIDxFUlJPUjpBUkdfTk9UX05VTUVSSUM6XGZtb2QoKT4uIE1lc3NhZ2VzCiAgIGluY2x1ZGU6CgogIEFSR19CQURfQVJSQVkgICAgICAgQW4gYXJndW1lbnQgY29udGFpbnMgYSBtYWxmb3JtZWQgYXJyYXkgcmVmZXJlbmNlLgogIEFSR19CQURfREFURSAgICAgICAgQW4gYXJndW1lbnQgY29udGFpbnMgYSBtYWxmb3JtZWQgZGF0ZSBhbmQvb3IgdGltZS4KICBBUkdfQkFEX1BIT05FTlVNICAgIEFuIGFyZ3VtZW50IGNvbnRhaW5zIGEgbWFsZm9ybWVkIHRlbGVwaG9uZSBudW1iZXIuCiAgQVJHX0JBRF9WQVJJQUJMRSAgICBBbiBhcmd1bWVudCBjb250YWlucyBhIG1hbGZvcm1lZCBcJXggdmFyaWFibGUuCiAgQVJHX0lOQ09NUExFVEUgICAgICBBbiBhcmd1bWVudCBpcyBpbmNvbXBsZXRlIChlLmcuIGEgYnJva2VuIEJhc2U2NCBzdHJpbmcpLgogIEFSR19FVkFMX0ZBSUxVUkUgICAgQW4gYXJndW1lbnQgY291bGQgbm90IGJlIGV2YWx1YXRlZCAoaW50ZXJuYWwgZXJyb3IpLgogIEFSR19OT1RfQVJSQVkgICAgICAgQW4gYXJndW1lbnQgcmVmZXJlbmNlcyBhbiBhcnJheSB0aGF0IGlzIG5vdCBkZWNsYXJlZC4KICBBUkdfTk9UX05VTUVSSUMgICAgIEFuIGFyZ3VtZW50IHRoYXQgbXVzdCBiZSBpbnRlZ2VyIGNvbnRhaW5zIG5vbi1kaWdpdHMuCiAgQVJHX05PVF9GTE9BVCAgICAgICBBbiBhcmd1bWVudCBoYXMgYmFkIGZsb2F0aW5nLXBvaW50IG51bWJlciBmb3JtYXQuCiAgQVJHX05PVF9WQVJJQUJMRSAgICBBbiBhcmd1bWVudCB0aGF0IG11c3QgYmUgYSB2YXJpYWJsZSBpcyBub3QgYSB2YXJpYWJsZS4KICBBUkdfT1VUX09GX1JBTkdFICAgIEFuIGFyZ3VtZW50J3MgbnVtZXJpYyB2YWx1ZSBpcyB0b28gYmlnIG9yIHRvbyBzbWFsbCwKICAgICAgICAgICAgICAgICAgICAgIG9yIGFuIGFyZ3VtZW50IGNvbnRhaW5zIGlsbGVnYWwgY2hhcmFjdGVycyAoZS5nLiBhIGhleAogICAgICAgICAgICAgICAgICAgICAgb3IgQmFzZS02NCBzdHJpbmcpLgogIEFSR19UT09fTE9ORyAgICAgICAgQW4gYXJndW1lbnQncyB2YWx1ZSBpcyB0b28gbG9uZy4KICBBUlJBWV9GQUlMVVJFICAgICAgIEZhaWx1cmUgdG8gY3JlYXRlIGFuIGFycmF5LgogIERJVklERV9CWV9aRVJPICAgICAgRXhlY3V0aW9uIG9mIHRoZSBmdW5jdGlvbiB3b3VsZCBjYXVzZSBkaXZpc2lvbiBieSB6ZXJvLgogIEZMT0FUSU5HX1BPSU5UX09QICAgRXhlY3V0aW9uIGVycm9yIGluIGEgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9uLgogIEZJTEVfTk9UX0ZPVU5EICAgICAgRmlsZW5hbWUgYXJndW1lbnQgbmFtZXMgYSBmaWxlIHRoYXQgY2FuJ3QgYmUgZm91bmQuCiAgRklMRV9OT1RfUkVBREFCTEUgICBGaWxlbmFtZSBhcmd1bWVudCBpcyBub3QgYSByZWd1bGFyIGZpbGUuCiAgRklMRV9OT1RfQUNDRVNTSUJMRSBGaWxlbmFtZSBhcmd1bWVudCBuYW1lcyBhIGZpbGUgdGhhdCBpcyByZWFkLXByb3RlY3RlZC4KICBGSUxFX0VSUk9SICAgICAgICAgIE90aGVyIGVycm9yIHdpdGggZmlsZW5hbWUgYXJndW1lbnQuCiAgRklMRV9OT1RfT1BFTiAgICAgICBBIGZpbGUgZnVuY3Rpb24gd2FzIGdpdmVuIGEgY2hhbm5lbCB0aGF0IGlzIG5vdCBvcGVuLgogIEZJTEVfRVJST1JfLW4gICAgICAgQSBmaWxlIGZ1bmN0aW9uIGdvdCBlcnJvciAtbiAoWzYxMl1TZWN0aW9uIDEuMjIpLgogIExPT0tVUF9GQUlMVVJFICAgICAgRXJyb3IgbG9va2luZyB1cCBmdW5jdGlvbiAoc2hvdWxkbid0IGhhcHBlbikuCiAgTUFMTE9DX0ZBSUxVUkUgICAgICBGYWlsdXJlIHRvIGFsbG9jYXRlIG5lZWRlZCBtZW1vcnkgKHNob3VsZG4ndCBoYXBwZW4pLgogIE5BTUVfQU1CSUdVT1VTICAgICAgVGhlIGZ1bmN0aW9uIGlzIG5vdCB1bmlxdWVseSBpZGVudGlmaWVkLgogIE1JU1NJTkdfQVJHICAgICAgICAgQSByZXF1aXJlZCBhcmd1bWVudCBpcyBtaXNzaW5nLgogIE5PX1NVQ0hfRlVOQ1RJT04gICAgQW4gYXJndW1lbnQgcmVmZXJlbmNlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgbm90IGRlZmluZWQuCiAgTk9fU1VDSF9NQUNSTyAgICAgICBBbiBhcmd1bWVudCByZWZlcmVuY2VzIGEgbWFjcm8gdGhhdCBpcyBub3QgZGVmaW5lZC4KICBSRVNVTFRfVE9PX0xPTkcgICAgIFRoZSByZXN1bHQgb2YgYSBmdW5jdGlvbiBpcyB0b28gbG9uZy4KICBVTktOT1dOX0ZVTkNUSU9OICAgIEludGVybmFsIGVycm9yIGxvY2F0aW5nIGZ1bmN0aW9uIChzaG91bGRuJ3QgaGFwcGVuKS4KCiAgIEV4YW1wbGVzOgoKICBhc3NpZ24gXCVtIFxmbW9kKCkKICA/PEVSUk9SOk1JU1NJTkdfQVJHOlxmbW9kKCk+CiAgZWNobyAiXGZjb250ZW50cyhcJW0pIgogICI8RVJST1I6TUlTU0lOR19BUkc6XGZtb2QoKT4iCiAgZWNobyBcZm1vZCgzLHgpCiAgPzxFUlJPUjpBUkdfTk9UX05VTUVSSUM6XGZtb2QoKT4KICBlY2hvIFxmbW9kKDMsNC0yKjIpCiAgPzxFUlJPUjpESVZJREVfQllfWkVSTzpcZm1vZCgpPgoKICAgTm90aWNlIHRoZSB1c2Ugb2YgXGZjb250ZW50cygpIGluIGVjaG9pbmcgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUgdGhhdAogICBjb250YWlucyBhIHJldHVybmVkIGVycm9yIG1lc3NhZ2UuIFRoYXQncyBiZWNhdXNlIHRoZSBlcnJvciBtZXNzYWdlCiAgIGluY2x1ZGVzIHRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBvciBmdW5jdGlvbiB0aGF0IGZhaWxlZCwgc28geW91IG11c3QKICAgdXNlIFxmY29udGVudHMoKSB0byBwcmV2ZW50IGl0IGZyb20gYmVpbmcgZXZhbHVhdGVkIGFnYWluIC0tIG90aGVyd2lzZQogICB0aGUgc2FtZSBlcnJvciB3aWxsIG9jY3VyLgoKICAgVGhlIGhhbmRsaW5nIG9mIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZSBlcnJvcnMgaXMgY29udHJvbGxlZCBieToKCiAgIFNFVCBGVU5DVElPTiBFUlJPUiB7IE9OLCBPRkYgfQogICAgICAgICAgVGVsbHMgd2hldGhlciBpbnZhbGlkIGZ1bmN0aW9uIGNhbGxzIG9yIHZhcmlhYmxlIHJlZmVyZW5jZXMKICAgICAgICAgIHNob3VsZCBjYXVzZSBjb21tYW5kIGVycm9ycy4gRlVOQ1RJT04gRVJST1IgaXMgT04gYnkgZGVmYXVsdC4KICAgICAgICAgIFdoZW4gT04sIGFuZCBhbiBlcnJvciBpcyBkaWFnbm9zZWQgaW4gYSBidWlsdC1pbiBmdW5jdGlvbiBvcgogICAgICAgICAgdmFyaWFibGUsIHRoZSBjb21tYW5kIHRoYXQgaW5jbHVkZXMgdGhlIGZ1bmN0aW9uIGNhbGwgb3IKICAgICAgICAgIHZhcmlhYmxlIHJlZmVyZW5jZSBmYWlscy4gVGhlIGZhaWxpbmcgY29tbWFuZCBjYW4gYmUgaGFuZGxlZCBpbgogICAgICAgICAgdGhlIG5vcm1hbCB3YXkgd2l0aCBJRiBGQUlMVVJFIC8gSUYgU1VDQ0VTUywgU0VUIFRBS0UgRVJST1IsIG9yCiAgICAgICAgICBTRVQgTUFDUk8gRVJST1IuCgogICBXaGVuIEZVTkNUSU9OIERJQUdOT1NUSUNTIGlzIE9GRiwgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZS4KCiAgIFNIT1cgU0NSSVBUUyBkaXNwbGF5cyB0aGUgY3VycmVudCBGVU5DVElPTiBESUFHTk9TVElDUyBhbmQgRVJST1IKICAgc2V0dGluZ3MuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy4xMy4gUmV0dXJuIFZhbHVlIG9mIE1hY3JvcwoKICAgSW4gQy1LZXJtaXQgNUEgYW5kIDYuMCwgdGhlcmUgYXJlIHR3byB3YXlzIHRvIHJldHVybiBvbmUgbGV2ZWwgZnJvbSBhCiAgIG1hY3JvOiBSRVRVUk4gdmFsdWUgYW5kIEVORCBudW1iZXIgdGV4dC4gV2hlbiBSRVRVUk4gaXMgdXNlZCwgdGhlCiAgIHZhbHVlLCB3aGljaCBjYW4gYmUgYSBudW1iZXIgb3IgYSB0ZXh0IHN0cmluZywgaXMgYXNzaWduZWQgdG8KICAgXHYocmV0dXJuKS4gV2hlbiBFTkQgd2FzIHVzZWQsIGhvd2V2ZXIsIFx2KHJldHVybikgd2FzIG5vdCBzZXQuCiAgIFNVQ0NFU1MvRkFJTFVSRSB3YXMgc2V0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoZSBudW1iZXIgd2FzIHplcm8sIGFuZAogICB0aGUgdGV4dCB3YXMgcHJpbnRlZCwgYnV0IHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhlIG51bWJlciB3YXMgbG9zdC4KCiAgIEluIEMtS2VybWl0IDcuMCwgdGhlIEVORCBudW1iZXIgaXMgYXZhaWxhYmxlIGluIHRoZSBcdihyZXR1cm4pCiAgIHZhcmlhYmxlLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDcuMTQuIFRoZSBBU1NFUlQsIEZBSUwsIGFuZCBTVUNDRUVEIENvbW1hbmRzLgoKICAgVGhlIEFTU0VSVCBjb21tYW5kIGlzIGp1c3QgbGlrZSB0aGUgSUYgY29tbWFuZCwgYnV0IHdpdGhvdXQgYSBjb21tYW5kCiAgIHRvIGV4ZWN1dGUuIEl0IHNpbXBseSBzdWNjZWVkcyBvciBmYWlscywgYW5kIHRoaXMgY2FuIGJlIHRlc3RlZCBieSBhCiAgIHN1YnNlcXVlbnQgSUYgU1VDQ0VTUyBvciBJRiBGQUlMVVJFIGNvbW1hbmQuIEV4YW1wbGU6CgogIEFTU0VSVCA9IDEgMQogIElGIFNVQ0NFU1MgZWNobyAxID0gMS4KCiAgIFRoZSBGQUlMIGNvbW1hbmQgZG9lcyBub3RoaW5nLCBidXQgYWx3YXlzIGZhaWxzLiBUaGUgU1VDQ0VFRCBjb21tYW5kCiAgIGRvZXMgbm90aGluZywgYnV0IGFsd2F5cyBzdWNjZWVkcy4KCiAgIFRoZXNlIGNvbW1hbmRzIGFyZSBoYW5keSBpbiBkZWJ1Z2dpbmcgc2NyaXB0cyB3aGVuIHlvdSB3YW50IHRvIGluZHVjZQogICBhIGZhaWx1cmUgKG9yIHN1Y2Nlc3MpIHRoYXQgbm9ybWFsbHkgd291bGQgbm90IG9jY3VyLCBlLmcuIGZvciB0ZXN0aW5nCiAgIGJsb2NrcyBvZiBjb2RlIHRoYXQgbm9ybWFsbHkgYXJlIG5vdCBleGVjdXRlZC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjE1LiBVc2luZyBBbGFybXMKCiAgIEFsYXJtcyBtYXkgYmUgc2V0IGluIHR3byB3YXlzOgoKICAgU0VUIEFMQVJNIG51bWJlcgogICAgICAgICAgU2V0cyBhbiBhbGFybSBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzICJmcm9tIG5vdyIsIGkuZS4KICAgICAgICAgIGluIHRoZSBmdXR1cmUsIHJlbGF0aXZlIHRvIHdoZW4gdGhlIFNFVCBBTEFSTSBjb21tYW5kIHdhcwogICAgICAgICAgZ2l2ZW4uIEV4YW1wbGVzOgoKICBzZXQgYWxhcm0gNjAgICAgICAgIDsgNjAgc2Vjb25kcyBmcm9tIG5vdwogIHNldCBhbGFybSArNjAgICAgICAgOyBUaGUgc2FtZSBhcyAiNjAiCiAgc2V0IGFsYXJtIC02MCAgICAgICA7IE5vdCBsZWdhbCAtIHlvdSBjYW4ndCBzZXQgYW4gYWxhcm0gaW4gdGhlIHBhc3QuCiAgc2V0IGFsYXJtIDYwKjYwICAgICA7IDYwIG1pbnV0ZXMgZnJvbSBub3cuCiAgc2V0IGFsYXJtIFwlYSsxMCAgICA7IFlvdSBjYW4gdXNlIHZhcmlhYmxlcywgZXRjLgoKICAgU0VUIEFMQVJNIGhoOm1tOnNzCiAgICAgICAgICBTZXRzIGFuIGFsYXJtIGZvciB0aGUgc3BlY2lmaWVkIHRpbWUuIElmIHRoZSBnaXZlbiB0aW1lIGlzCiAgICAgICAgICBlYXJsaWVyIHRoYW4gdGhlIGN1cnJlbnQgdGltZSwgdGhlIGFsYXJtIGlzIHNldCBmb3IgdGhlIGdpdmVuCiAgICAgICAgICB0aW1lIGluIHRoZSBuZXh0IGRheS4gWW91IG1heSBnaXZlIHRoZSB0aW1lIGluIHZhcmlvdXMgZm9ybWF0czoKCiAgc2V0IGFsYXJtIDE1OjAwOjAwICA7IDM6MDA6MDBwbQogIHNldCBhbGFybSAzOjAwOjAwcG0gOyAzOjAwOjAwcG0KICBzZXQgYWxhcm0gMzowMHBtICAgIDsgMzowMDowMHBtCiAgc2V0IGFsYXJtIDNwbSAgICAgICA7IDM6MDA6MDBwbQoKICAgU0hPVyBBTEFSTQogICAgICAgICAgRGlzcGxheXMgdGhlIGN1cnJlbnQgYWxhcm0sIGlmIGFueSwgaW4gc3RhbmRhcmQgZGF0ZS10aW1lCiAgICAgICAgICBmb3JtYXQgKHNlZSBbNjEzXVNlY3Rpb24gMS42KTogeXl5eW1tZGQgaGg6bW06c3MuCgogICBJRiBBTEFSTSBjb21tYW5kCiAgICAgICAgICBFeGVjdXRlcyB0aGUgY29tbWFuZCBpZiBhbiBhbGFybSBoYXMgYmVlbiBzZXQgYW5kIHRoZSBhbGFybQogICAgICAgICAgdGltZSBoYXMgcGFzc2VkLgoKICAgSUYgQUxBUk0geyBjb21tYW5kLWxpc3QgfSBbIEVMU0UgeyBjb21tYW5kLWxpc3QgfSBdCiAgICAgICAgICBFeGVjdXRlcyB0aGUgY29tbWFuZC1saXN0IGlmIGFuIGFsYXJtIGhhcyBiZWVuIHNldCBhbmQgdGhlCiAgICAgICAgICBhbGFybSB0aW1lIGhhcyBwYXNzZWQuIE90aGVyd2lzZSwgaWYgYW4gRUxTRSBwYXJ0IGlzIGdpdmVuLCBpdHMKICAgICAgICAgIGNvbW1hbmQtbGlzdCBpcyBleGVjdXRlZC4KCiAgIENMRUFSIEFMQVJNCiAgICAgICAgICBDbGVhcnMgdGhlIGFsYXJtLgoKICAgT25seSBvbmUgYWxhcm0gbWF5IGJlIHNldCBhdCBhIHRpbWUuCgogICBFeGFtcGxlOiBTdXBwb3NlIHlvdSBoYXZlIGEgc2NyaXB0IHRoYXQgaXMgYWx3YXlzIHJ1bm5pbmcsIGFuZCB0aGF0CiAgIHRyYW5zZmVycyBmaWxlcyBwZXJpb2RpY2FsbHksIGFuZCB0aGF0IGtlZXBzIGEgdHJhbnNhY3Rpb24gbG9nLgogICBTdXBwb3NlIHlvdSB3YW50IHRvIHN0YXJ0IGEgbmV3IHRyYW5zYWN0aW9uIGxvZyBlYWNoIGRheToKCiAgbG9nIHRyYW5zYWN0aW9ucyBcdihkYXRlKS5sb2cKICBzZXQgYWxhcm0gMDA6MDA6MDAgICAgICAgICAgICAgICAgICAgICA7IFNldCBhbiBhbGFybSBmb3IgbWlkbmlnaHQKICB3aGlsZSB0cnVlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICA7IE1haW4gc2NyaXB0IGxvb3AKICAgICAgeGlmIGFsYXJtIHsgICAgICAgICAgICAgICAgICAgICAgICA7IElmIHRoZSBhbGFybSB0aW1lIGlzIHBhc3QuLi4KICAgICAgICAgIGNsb3NlIHRyYW5zYWN0aW9ucyAgICAgICAgICAgICA7IENsb3NlIGN1cnJlbnQgbG9nCiAgICAgICAgICBsb2cgdHJhbnNhY3Rpb25zIFx2KGRhdGUpLmxvZyAgOyBTdGFydCBuZXcgb25lCiAgICAgICAgICBwYXVzZSAxICAgICAgICAgICAgICAgICAgICAgICAgOyBUbyBtYWtlIHN1cmUgMDA6MDA6MDAgaXMgcGFzdAogICAgICAgICAgc2V0IGFsYXJtIDAwOjAwOjAwICAgICAgICAgICAgIDsgU2V0IGEgbmV3IGFsYXJtCiAgICAgIH0KICAgICAgOyBwdXQgdGhlIHJlc3Qgb2YgdGhlIHNjcmlwdCBoZXJlLi4uCiAgfQoKICAgTm90ZSB0aGF0IElGIEFMQVJNIC0tIG5vIG1hdHRlciB3aGV0aGVyIGl0IHN1Y2NlZWRzIG9yIGZhaWxzIC0tIGRvZXMKICAgTk9UIGNsZWFyIGFuIGV4cGlyZWQgYWxhcm0uIFRodXMsIG9uY2UgYW4gYWxhcm0gaGFzIGV4cGlyZWQsIGV2ZXJ5IElGCiAgIEFMQVJNIHdpbGwgc3VjY2VlZCB1bnRpbCB0aGUgYWxhcm0gaXMgY2xlYXJlZCAod2l0aCB0aGUgQ0xFQVIgQUxBUk0KICAgY29tbWFuZCkgb3IgcmVzZXQgd2l0aCBhIG5ldyBTRVQgQUxBUk0gY29tbWFuZC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjE2LiBQYXNzaW5nIEFyZ3VtZW50cyB0byBDb21tYW5kIEZpbGVzCgogICBCZWdpbm5pbmcgaW4gdmVyc2lvbiA3LjAsIEMtS2VybWl0IGFjY2VwdHMgYXJndW1lbnRzIG9uIHRoZSBUQUtFCiAgIGNvbW1hbmQgbGluZSwgZm9yIGV4YW1wbGU6CgogIEMtS2VybWl0PiB0YWtlIG9vZmEua3NjIG9uZSB0d28ge3RoaXMgaXMgdGhyZWV9IGZvdXIKCiAgIFRoaXMgYXV0b21hdGljYWxseSBzZXRzIHRoZSB2YXJpYWJsZXMgXCUxIHRocm91Z2ggXCU5IHRvIHRoZQogICBhcmd1bWVudHMsIGFuZCBcJTAgdG8gdGhlIG5hbWUgb2YgdGhlIGZpbGUsIGluIHRoaXMgY2FzZToKCiAgXCUwID0gL3Vzci9vbGdhL29vZmEua3NjCiAgXCUxID0gb25lCiAgXCUyID0gdHdvCiAgXCUzID0gdGhpcyBpcyB0aHJlZQogIFwlNCA9IGZvdXIKCiAgIGFuZCBcJTUuLlwlOSBhcmUgdW5kZWZpbmVkIChlbXB0eSkuIEFyZ3VtZW50cyBwYXN0IHRoZSBuaW50aCBhcmUKICAgYXZhaWxhYmxlIGluIHRoZSBcJl9bXSBhcmd1bWVudC12ZWN0b3IgYXJyYXkgKCBbNjE0XVNlY3Rpb24gNy41KS4KCiAgIFRoZSB2YXJpYWJsZXMgYXJlIHRob3NlIGF0IHRoZSBjdXJyZW50IG1hY3JvIGxldmVsLiBUaHVzLCBpZiB0aGUgVEFLRQogICBjb21tYW5kIGlzIGV4ZWN1dGVkIGZyb20gd2l0aGluIGEgbWFjcm8sIHRoZSBtYWNybydzIGFyZ3VtZW50cyBhcmUKICAgcmVwbGFjZWQgYnkgdGhvc2UgZ2l2ZW4gb24gdGhlIFRBS0UgY29tbWFuZCBsaW5lIChidXQgb25seSBpZiBhdCBsZWFzdAogICBvbmUgYXJndW1lbnQgaXMgZ2l2ZW4pLiBUaGUgY29tbWFuZCBzaG93biBhYm92ZSBpcyBleGFjdGx5IGVxdWl2YWxlbnQKICAgdG86CgogIGFzc2lnbiBcJTAgL3Vzci9vbGdhL29vZmEua3NjCiAgYXNzaWduIFwlMSBvbmUKICBhc3NpZ24gXCUyIHR3bwogIGFzc2lnbiBcJTMgdGhpcyBpcyB0aHJlZQogIGFzc2lnbiBcJTQgZm91cgogIGFzc2lnbiBcJTUKICBhc3NpZ24gXCU2CiAgYXNzaWduIFwlNwogIGFzc2lnbiBcJTgKICBhc3NpZ24gXCU5CiAgdGFrZSBvb2ZhLmtzYwoKICAgUmVtZW1iZXIsIHRoZSB2YXJpYWJsZXMgXCUwLi5cJTkgYXJlIG9uIHRoZSBtYWNybyBjYWxsIHN0YWNrLCBhbmQKICAgY29tbWFuZCBmaWxlcyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIG1hY3JvIHN0YWNrLiBUaHVzLCBpZiBhIGNvbW1hbmQKICAgZmlsZSBUQUtFcyBhbm90aGVyIGNvbW1hbmQgZmlsZSBhbmQgcGFzc2VzIGFyZ3VtZW50cyB0byBpdCwgdGhlCiAgIHZhcmlhYmxlcyBhcmUgY2hhbmdlZCBmcm9tIHRoYXQgcG9pbnQgb24gZm9yIGJvdGggZmlsZXMsIGFuZCBzbyBmb3J0aAogICBmb3IgYWxsIGxldmVscyBvZiBuZXN0ZWQgY29tbWFuZCBmaWxlcyB3aXRob3V0IGludGVydmVuaW5nIG1hY3JvCiAgIGludm9jYXRpb25zLgoKICAgSXQgd291bGQgaGF2ZSBiZWVuIHBvc3NpYmxlIHRvIGNoYW5nZSBDLUtlcm1pdCB0byB1c2UgdGhlIG92ZXJhbGwKICAgY29tbWFuZCBzdGFjaywgcmF0aGVyIHRoYW4gdGhlIG1hY3JvIHN0YWNrLCBmb3IgYXJndW1lbnRzIC0tIHRoaXMKICAgd291bGQgaGF2ZSBtYWRlIFRBS0Ugd29yayBleGFjdGx5IGxpa2UgRE8sIHdoaWNoIGlzICJuaWNlciIsIGJ1dCBpdAogICB3b3VsZCBhbHNvIGhhdmUgYnJva2VuIGNvdW50bGVzcyBleGlzdGluZyBzY3JpcHRzLiBIb3dldmVyLCB0aGUgbmV3CiAgIFNISUZUIGNvbW1hbmQgKFs2MTVdU2VjdGlvbiA3LjUpIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBhbgogICBhbHRlcm5hdGl2ZSBUQUtFIGNvbW1hbmQgdGhhdCBkb2VzIGluZGVlZCBzYXZlIGFuZCByZXN0b3JlIHRoZQogICBhcmd1bWVudCB2YXJpYWJsZXMgYXQgaXRzIG93biBsZXZlbCBhcm91bmQgZXhlY3V0aW9uIG9mIGEgY29tbWFuZAogICBmaWxlOgoKICBkZWZpbmUgbXRha2UgewogICAgIGxvY2FsIFwlZgogICAgIGFzc2lnbiBcJWYgXGZjb250ZW50cyhcJTEpCiAgICAgc2hpZnQKICAgICB0YWtlIFwlZgogIH0KCiAgIEMtS2VybWl0IDcuMCBhbHNvIHN1cHBvcnRzIGEgbmV3LCBlYXNpZXIgd2F5IHRvIHBhc3MgYXJndW1lbnRzIHRvCiAgIHNjcmlwdHMgZnJvbSB0aGUgc3lzdGVtIGNvbW1hbmQgbGluZToKCiAga2VybWl0IGZpbGVuYW1lIGFyZzEgYXJnMiBhcmczIC4uLgoKICAgaW4gd2hpY2ggYXJnMSwgYXJnMiwgYXJnMyAoZXRjKSBhcmUgYXJndW1lbnRzIGZvciB0aGUgc2NyaXB0ICh3aG9zZQogICBmaWxlbmFtZSBpcyBnaXZlbiksIGFuZCBhcmUgYXNzaWduZWQgdG8gXCUxLCBcJTIsIC4uLiBcJTkuIFRoZQogICBmaWxlbmFtZSBpcyBhc3NpZ25lZCB0byBcJTAuIFRoaXMgYXBwbGllcyBlcXVhbGx5IHRvICJLZXJiYW5nIiBzY3JpcHRzCiAgIGluIFVOSVggKFs2MTZdU2VjdGlvbiA3LjE5KS4gRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhdmUgYSBmaWxlCiAgIGNhbGxlZCAic2hvd2FyZ3MiIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBsaW5lczoKCiAgIyEvdXNyL2xvY2FsL2Jpbi9rZXJtaXQgKwogIGVjaG8gSGVsbG8gZnJvbSBcJTAKICBzaG93IGFyZ3MKICBleGl0CgogICAoZXhjZXB0IG5vdCBpbmRlbnRlZCwgc2luY2UgdGhlICIjISIgbGluZSBtdXN0IGJlIG9uIHRoZSBsZWZ0IG1hcmdpbikuCiAgIElmIHlvdSBnaXZlIHRoaXMgZmlsZSBleGVjdXRlIHBlcm1pc3Npb246CgogIGNobW9kICt4IHNob3dhcmdzCgogICB0aGVuIHlvdSBjYW4gcnVuIGl0IGV4YWN0bHkgYXMgeW91IHdvdWxkIHJ1biBhIFVOSVggc2hlbGwgc2NyaXB0LAogICBlLmcuOgoKICAkIHNob3dhcmdzIG9uZSB0d28gdGhyZWUKICBIZWxsbyBmcm9tIC91c3Ivb2xnYS9zaG93YXJncwogIFRvcC1sZXZlbCBhcmd1bWVudHMgKFx2KGFyZ2MpID0gNCk6CiAgIFwmX1swXSA9IC91c3Ivb2xnYS9zaG93YXJncwogICBcJl9bMV0gPSBvbmUKICAgXCZfWzJdID0gdHdvCiAgIFwmX1szXSA9IHRocmVlCgogICBGdXJ0aGVybW9yZSwgdGhlIFwmX1tdIGFycmF5IG5vdyBjb250YWlucyB0aGUgZmlsZW5hbWUsIGlmIG9uZSB3YXMKICAgZ2l2ZW4gYXMgdGhlIGZpcnN0IGNvbW1hbmQgbGluZSBhcmd1bWVudCwgb3IgaXQgaXMgYSAiS2VyYmFuZyIgc2NyaXB0LAogICBpbiBlbGVtZW50IDAuCgogICBPdGhlcndpc2UgZWxlbWVudCAwIGlzIHByb2dyYW0gbmFtZSwgYW5kIGVsZW1lbnRzIDEgdGhyb3VnaCBcdihhcmdjKS0xCiAgIGNvbnRhaW4gdGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGlmIGFueSwgdGhhdCBhcHBlYXIgYWZ0ZXIgIi0tIiBvcgogICAiPSIsIGlmIGFueS4gVGhpcyBhcnJheSBpcyBzYXZlZCBhbmQgcmVzdG9yZWQgYXJvdW5kIG1hY3JvIGNhbGxzOwogICByZWNhbGwgdGhhdCBpbnNpZGUgbWFjcm9zIGl0IGNvbnRhaW5zIHRoZSBtYWNybyBhcmd1bWVudCB2ZWN0b3IKICAgKGFsbG93aW5nIHlvdSB0byBhY2Nlc3MgYXJndW1lbnRzIHByb2dyYW1tYXRpY2FsbHksIGFuZCB0byBoYXZlIG1vcmUKICAgdGhhbiA5IG9mIHRoZW0pLgoKICAgQXQgdG9wIGxldmVsLCBub3RpY2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgXCZAW10gYW5kIFwmX1tdCiAgIGFycmF5cy4gVGhlIGZvcm1lciBpbmNsdWRlcyBDLUtlcm1pdCBvcHRpb25zOyB0aGUgbGF0dGVyIG9taXRzIHRoZW0uCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy4xNy4gRGlhbG9ncyB3aXRoIFRpbWVkIFJlc3BvbnNlcwoKICAgVGhlIEFTSywgQVNLUSwgR0VUT0ssIGFuZCBHRVRDIGNvbW1hbmRzIChsZXQncyBjYWxsIHRoZW0gdGhlCiAgICJBU0stY2xhc3MgY29tbWFuZHMiKSBsZXQgeW91IHdyaXRlIHNjcmlwdHMgdGhhdCBjYXJyeSBvbiBkaWFsb2dzIHdpdGgKICAgdGhlIHVzZXIsIGFza2luZyB0aGVtIGZvciB0ZXh0LCBhIFllcy9ObyBhbnN3ZXIsIG9yIGEgY2hhcmFjdGVyLAogICByZXNwZWN0aXZlbHkuIFByaW9yIHRvIEMtS2VybWl0IDcuMCwgdGhlc2UgcXVlc3Rpb25zIHdvdWxkIGFsd2F5cyB3YWl0CiAgIGZvcmV2ZXIgZm9yIGFuIGFuc3dlci4gSW4gQy1LZXJtaXQgNy4wLCB5b3UgbWF5IHNwZWNpZnkgYSB0aW1lIGxpbWl0CiAgIGZvciB0aGVtIHdpdGggdGhlIG5ldyBjb21tYW5kOgoKICAgU0VUIEFTSy1USU1FUiBudW1iZXIKICAgICAgICAgIFNldHMgYSB0aW1lLWxpbWl0IG9uIEFTSy1DTEFTUyBjb21tYW5kcyB0byB0aGUgZ2l2ZW4gbnVtYmVyIG9mCiAgICAgICAgICBzZWNvbmRzLiBJZiB0aGUgbnVtYmVyIGlzIDAgb3IgbGVzcywgdGhlcmUgaXMgbm8gdGltZSBsaW1pdCBhbmQKICAgICAgICAgIHRoZXNlIGNvbW1hbmRzIHdhaXQgZm9yZXZlciBmb3IgYSByZXNwb25zZS4gQW55IHRpbWVyIHRoYXQgaXMKICAgICAgICAgIGVzdGFibGlzaGVkIGJ5IHRoaXMgY29tbWFuZCByZW1haW5zIGluIGVmZmVjdCBmb3IgYWxsIGZ1dHVyZQogICAgICAgICAgQVNLLWNsYXNzIGNvbW1hbmRzIHVudGlsIGFub3RoZXIgU0VUIEFTSy1USU1FUiBjb21tYW5kIGlzIGdpdmVuCiAgICAgICAgICAoZS5nLiB3aXRoIGEgdmFsdWUgb2YgMCB0byBkaXNhYmxlIEFTSyB0aW1lb3V0cykuCgogICBJRiBBU0tUSU1FT1VUIGNvbW1hbmQKICAgICAgICAgIEFuIEFTSy1jbGFzcyBjb21tYW5kIHRoYXQgdGltZXMgb3V0IHJldHVybnMgYSBmYWlsdXJlIHN0YXR1cy4KICAgICAgICAgIFlvdSBjYW4gdGVzdCBleHBsaWNpdGx5IGZvciBhIHRpbWVvdXQgd2l0aDoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjE4LiBJbmNyZWFzZWQgRmxleGliaWxpdHkgb2YgU1dJVENIIENhc2UgTGFiZWxzCgogICBQcmlvciB0byBDLUtlcm1pdCA3LjAgLyBLOTUgMS4xLjE5LCB0aGUgY2FzZSBsYWJlbHMgaW4gU1dJVENICiAgIHN0YXRlbWVudHMgd2VyZSBzdHJpbmcgY29uc3RhbnRzLgoKICAgTm93IGNhc2UgbGFiZWxzIGNhbiBiZSB2YXJpYWJsZXMsIGZ1bmN0aW9uIGNhbGxzLCBvciBhbnkgbWl4dHVyZSBvZgogICB0aGVzZSB3aXRoIGVhY2ggb3RoZXIgYW5kL29yIHdpdGggcmVndWxhciBjaGFyYWN0ZXJzLgoKICAgRnVydGhlcm1vcmUsIGFmdGVyIHRoZSBjYXNlIGxhYmVsIGlzIGV2YWx1YXRlZCwgaXQgaXMgdHJlYXRlZCBub3QgYXMgYQogICBzdHJpbmcgY29uc3RhbnQsIGJ1dCBhcyBhIHBhdHRlcm4gYWdhaW5zdCB3aGljaCB0aGUgU1dJVENIIHZhcmlhYmxlIGlzCiAgIG1hdGNoZWQgKFs2MTddU2VjdGlvbiA0LjkuMSkuCgogICBUaGlzIGludHJvZHVjZXMgYSBwb3NzaWJsZSBpbmNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyByZWxlYXNlcywKICAgc2luY2UgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJzIGluIGNhc2UgbGFiZWxzIGFyZSBubyBsb25nZXIgdGFrZW4KICAgbGl0ZXJhbGx5OgoKICBcICogPyBbIHsKCiAgIEFueSBzY3JpcHRzIHRoYXQgcHJldmlvdXNseSBpbmNsdWRlZCBhbnkgb2YgdGhlc2UgY2hhcmFjdGVycyBpbiBjYXNlCiAgIGxhYmVscyBtdXN0IG5vdyBxdW90ZSB0aGVtIHdpdGggYmFja3NsYXNoIChcKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjE5LiAiS2VyYmFuZyIgU2NyaXB0cwoKICAgSW4gVU5JWCBvbmx5LCBLZXJtaXQgc2NyaXB0cyBjYW4gYmUgc3RvcmVkIGluIGZpbGVzIGFuZCBydW4KICAgImRpcmVjdGx5Iiwgd2l0aG91dCBzdGFydGluZyBLZXJtaXQgZmlyc3QgKGFzIG5vdGVkIG9uIHBhZ2UgNDY3IG9mIHRoZQogICBtYW51YWwpLCBqdXN0IGFzIGEgc2hlbGwgc2NyaXB0IGNhbiBiZSAicnVuIiBhcyBpZiBpdCB3ZXJlIGEgcHJvZ3JhbS4KICAgVGhpcyBzZWN0aW9uIGFtcGxpZmllcyBvbiB0aGF0IGlkZWEgYSBiaXQsIGFuZCBwcmVzZW50cyBzb21lIG5ldwogICBhc3BlY3RzIG9mIHZlcnNpb24gNy4wIHRoYXQgbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUgYW5kIHJ1biBLZXJtaXQKICAgc2NyaXB0cyBkaXJlY3RseS4KCiAgICAgTk9URTogT24gbm9uLVVOSVggcGxhdGZvcm1zLCBzdWNoIGFzIFZNUyBvciBXaW5kb3dzLCBLZXJiYW5nCiAgICAgc2NyaXB0cyBjYW4gYmUgcnVuIGFzICJrZXJtaXQgKyBzY3JpcHRmaWxlbmFtZSBhcmcxIGFyZzIgYXJnMyAuLi4iLgogICAgIFdpbmRvd3MgOTUvOTgvTlQgZmlsZSBhc3NvY2lhdGlvbnMgZG8gbm90IGFsbG93IGZvciB0aGUgcGFzc2luZyBvZgogICAgIHBhcmFtZXRlcnMuIEluIFZNUywgaG93ZXZlciwgeW91IGNhbiBhY2hpZXZlIHRoZSBLZXJiYW5nIGVmZmVjdCBieQogICAgIGRlZmluaW5nIGEgc3ltYm9sLCBhcyBpbiB0aGlzIGV4YW1wbGU6CgogICQgYXV0b3RlbG5ldCA6PT0gIiRTWVMkVE9PTFM6S0VSTUlULkVYRSArIEFVVE9URUxORVQuS1NDIgoKICAgICBhbmQgdGhlbiBydW5uaW5nIHRoZSBzY3JpcHQgbGlrZSBhbnkgb3RoZXIgY29tbWFuZDoKCiAgJCBhdXRvdGVsbmV0IHh5emNvcnAuY29tIG15dXNlcmlkCgogICAgIFNlZSBbNjE4XVNlY3Rpb24gOS4zIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGUgIisiIHN5bWJvbC4KCiAgIFVOSVggc2hlbGwgc2NyaXB0cyBjYW4gc3BlY2lmeSB3aGljaCBzaGVsbCBzaG91bGQgcnVuIHRoZW0gYnkKICAgaW5jbHVkaW5nIGEgInNoZWJhbmciIGxpbmUgYXQgdGhlIHRvcCwgZS5nLjoKCiAgIyEvYmluL3NoCgogICAoYnV0IG5vdCBpbmRlbnRlZDsgdGhlIHNoZWJhbmcgbGluZSBtdXN0IGJlIG9uIHRoZSBsZWZ0IG1hcmdpbikuIFRoZQogICB0ZXJtICJzaGViYW5nIiBpcyBhIGNvbnRyYWN0aW9uIG9mICJzaGVsbCIgYW5kICJiYW5nIi4gIkJhbmciIGlzIGEKICAgc2xhbmcgd29yZCBmb3IgdGhlIGV4Y2xhbWF0aW9uIG1hcmsgKCIhIik7ICJzaGViYW5nIiBpdHNlbGYgaXMgYW4KICAgQW1lcmljYW4gc2xhbmcgd29yZCB1c2VkIGluIGluIHRoZSBwaHJhc2UgInRoZSB3aG9sZSBzaGViYW5nIi4KCiAgIFdlIGNhbiBydW4gS2VybWl0IHNjcmlwdHMgZGlyZWN0bHkgdG9vLCBieSBpbmNsdWRpbmcgYSAic2hlYmFuZyIgbGluZQogICB0aGF0IG5hbWVzIEtlcm1pdCBhcyB0aGUgInNoZWxsIjsgdGh1cyB3ZSBjYWxsIHRoZXNlICJLZXJiYW5nIgogICBzY3JpcHRzLiBUaGlzIG1lY2hhbmlzbSBoYXMgYmVlbiBjb25zaWRlcmFibHkgc2ltcGxpZmllZCBpbiBDLUtlcm1pdAogICA3LjAgdG8gZmFjaWxpdGF0ZSBDLUtlcm1pdCdzIHVzZSBhIHNjcmlwdGluZyB0b29sIGp1c3QgbGlrZSBhbnkgb2YgdGhlCiAgIFVOSVggc2hlbGxzIG9yIHNjcmlwdGluZyBsYW5ndWFnZXMuIFRoZSBydWxlcyBhcmUgdGhlIHNhbWUgYXMgZm9yCiAgIHNoZWxsIHNjcmlwdHM6CgogICAgMS4gVGhlIGZpcnN0IGxpbmUgb2YgdGhlIEtlcm1pdCBzY3JpcHQgbXVzdCBiZWdpbiB3aXRoICIjISIKICAgICAgIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHRoZSBmdWxsIHBhdGhuYW1lIG9mIHRoZSBwcm9ncmFtIHRoYXQgd2lsbAogICAgICAgZXhlY3V0ZSB0aGUgc2NyaXB0IChpbiB0aGlzIGNhc2UsIEMtS2VybWl0IHJhdGhlciB0aGFuIGEgVU5JWAogICAgICAgc2hlbGwpLCBmb2xsb3dlZCBieSBhbnkgS2VybWl0IGNvbW1hbmQtbGluZSBvcHRpb25zLiBUbyBzdXBwcmVzcwogICAgICAgZXhlY3V0aW9uIG9mIHRoZSBDLUtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlIGFuZCB0byBtYWtlIGNvbW1hbmQKICAgICAgIGxpbmUgYXJndW1lbnRzIGF2YWlsYWJsZSB0byB0aGUgc2NyaXB0LCB0aGUgZmluYWwgb3B0aW9uIHNob3VsZCBiZQogICAgICAgIisiOgogICMhL3Vzci9sb2NhbC9iaW4va2VybWl0ICsKICAgICAgIFNvbWUgdXNlcnMgaGF2ZSByZXBvcnRlZCB0aGF0IGluIHNvbWUgY2lyY3Vtc3RhbmNlcyBhIHNwYWNlIG1pZ2h0CiAgICAgICBiZSBuZWNlc3NhcnkgYWZ0ZXIgdGhlIHBsdXMgc2lnbjsgdGhpcyBkZXBlbmRzIG9uIHlvdXIgc2hlbGwgLS0gaXQKICAgICAgIGhhcyBub3RoaW5nIHRvIGRvIHdpdGggS2VybWl0LiBJbiBtb3N0IGNhc2VzLCBubyBzcGFjZSBpcyBuZWVkZWQuCiAgICAyLiBUaGUgZmlsZSBtdXN0IGhhdmUgZXhlY3V0ZSBwZXJtaXNzaW9uIChncmFudGVkIHZpYSAiY2htb2QgK3gKICAgICAgIGZpbGVuYW1lIikuCgogICBXaGVuIEMtS2VybWl0IGlzIGludm9rZWQgZnJvbSBhIEtlcmJhbmcgc2NyaXB0IChvciBmcm9tIHRoZSBzeXN0ZW0KICAgcHJvbXB0IHdpdGggYSAiKyIgY29tbWFuZC1saW5lIGFyZ3VtZW50LCB3aGljaCBhbW91bnRzIHRvIHRoZSBzYW1lCiAgIHRoaW5nKSwgdGhlIGZvbGxvd2luZyBzcGVjaWFsIHJ1bGVzIGFwcGx5OgoKICAgIDEuIFRoZSBDLUtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlIGlzIE5PVCBleGVjdXRlZCBhdXRvbWF0aWNhbGx5LiBJZgogICAgICAgeW91IHdhbnQgaXQgdG8gYmUgZXhlY3V0ZWQsIGluY2x1ZGUgYSBUQUtFIGNvbW1hbmQgZm9yIGl0IGluIHRoZQogICAgICAgc2NyaXB0LCBlLmcuICJ0YWtlIFx2KGhvbWUpLmtlcm1yYyIuIChJbiBwcmV2aW91cyByZWxlYXNlcywgdGhlCiAgICAgICBpbml0aWFsaXphdGlvbiBmaWxlIHdhcyBhbHdheXMgZXhlY3V0ZWQsIHdpdGggbm8gd2F5IHRvIHByZXZlbnQgaXQKICAgICAgIGV4Y2VwdCBmb3IgdGhlIHVzZXIgdG8gaW5jbHVkZSBLZXJtaXQtc3BlY2lmaWMgY29tbWFuZCBsaW5lCiAgICAgICBvcHRpb25zIHdoaWNoIGhhZCBub3RoaW5nIHRvIGRvIHdpdGggdGhlIHNjcmlwdCkuIE1hbnkgc2NyaXB0cwogICAgICAgaGF2ZSBubyBuZWVkIGZvciB0aGUgc3RhbmRhcmQgS2VybWl0IGluaXRpYWxpemF0aW9uIGZpbGUsIHdoaWNoIGlzCiAgICAgICBxdWl0ZSBsZW5ndGh5IGFuZCBub3Qgb25seSBkZWxheXMgc3RhcnR1cCBvZiB0aGUgc2NyaXB0LCBidXQgYWxzbwogICAgICAgc3Bld3MgZm9ydGggbnVtZXJvdXMgbWVzc2FnZXMgdGhhdCBhcmUgbW9zdCBsaWtlbHkgdW5yZWxhdGVkIHRvCiAgICAgICB0aGUgc2NyaXB0LgogICAgMi4gSWYgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgaXMgbm90IGV4ZWN1dGVkLCBuZWl0aGVyIGlzIHlvdXIKICAgICAgIGN1c3RvbWl6YXRpb24gZmlsZSwgc2luY2UgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgaXMgdGhlIGNvbW1hbmQKICAgICAgIGZpbGUgZnJvbSB3aGljaCB0aGUgY3VzdG9taXphdGlvbiBmaWxlIGlzIFRBS0VuLiBBZ2FpbiwgeW91IGNhbgogICAgICAgaW5jbHVkZSBhIFRBS0UgY29tbWFuZCBmb3IgdGhlIGluaXRpYWxpemF0aW9uIGZpbGUgaWYgZGVzaXJlZCwgb3IKICAgICAgIGZvciB0aGUgY3VzdG9taXphdGlvbiBmaWxlIGJ5IGl0c2VsZiwgb3IgZm9yIGFueSBvdGhlciBmaWxlLgogICAgMy4gQy1LZXJtaXQgZG9lcyBub3QgcHJvY2VzcyBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGF0IGFsbC4gSW5zdGVhZCwKICAgICAgIGl0IHBhc3NlcyBhbGwgd29yZHMgb24gdGhlIGNvbW1hbmQgbGluZSBhZnRlciB0aGUgIisiIHRvIHRoZQogICAgICAgc2NyaXB0IGFzIFwlMCAodGhlIHNjcmlwdCBuYW1lKSwgXCUxLi5cJTkgKHRoZSBmaXJzdCBuaW5lCiAgICAgICBhcmd1bWVudHMpLCBhcyB3ZWxsIGFzIGluIHRoZSBhcmd1bWVudCB2ZWN0b3IgYXJyYXkgXCZfW10uIFRoZQogICAgICAgdmFyaWFibGUgXHYoYXJnYykgaXMgc2V0IHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgIndvcmRzIiAoYXMgcGFzc2VkCiAgICAgICBieSB0aGUgc2hlbGwgdG8gS2VybWl0KSBpbmNsdWRpbmcgdGhlIHNjcmlwdCBuYW1lLiBRdW90aW5nIGFuZAogICAgICAgZ3JvdXBpbmcgcnVsZXMgYXJlIHRob3NlIG9mIHRoZSBzaGVsbC4KICAgIDQuIEF0IGFueSBwb2ludCB3aGVyZSB0aGUgc2NyaXB0IHRlcm1pbmF0ZXMsIGl0IG11c3QgaW5jbHVkZSBhbiBFWElUCiAgICAgICBjb21tYW5kIGlmIHlvdSB3YW50IGl0IHRvIGV4aXQgYmFjayB0byB0aGUgc2hlbGw7IG90aGVyd2lzZQogICAgICAgQy1LZXJtaXQgZW50ZXJzIGludGVyYWN0aXZlIHByb21wdGluZyBtb2RlIHdoZW4gdGhlIHNjcmlwdAogICAgICAgdGVybWluYXRlcy4gVGhlIEVYSVQgY29tbWFuZCBjYW4gaW5jbHVkZSBhIG51bWVyaWMgc3RhdHVzIHRvIGJlCiAgICAgICByZXR1cm5lZCB0byB0aGUgc2hlbGwgKDAsIDEsIGV0YyksIHBsdXMgYW4gb3B0aW9uYWwgbWVzc2FnZS4KCiAgIEhlcmUgaXMgYSBzaW1wbGUgS2VyYmFuZyBzY3JpcHQgdGhhdCBwcmludHMgaXRzIGFyZ3VtZW50czoKCiAgIy91c3IvbG9jYWwvYmluL2tlcm1pdCArCiAgZWNobyBIZWxsbyBmcm9tIFwlMAogIGZvciBcJWkgMCBcdihhcmdjKS0xIDEgewogICAgICBlY2hvIFwlaS4gIlwmX1tcJWldIgogIH0KICBleGl0IDAKCiAgIFNhdmUgdGhpcyBmaWxlIGFzIChzYXkpICJzaG93YXJncyIsIHRoZW4gZ2l2ZSBpdCBleGVjdXRlIHBlcm1pc3Npb24KICAgYW5kIHJ1biBpdCAodGhlIFwmX1tdIGFycmF5IGlzIHRoZSBzYW1lIGFzIFwlMC4uXCU5LCBidXQgYWxsb3dzIHlvdSB0bwogICByZWZlciB0byBhcmd1bWVudCB2YXJpYWJsZXMgcHJvZ3JhbW1hdGljYWxseTsgc2VlIFs2MTldU2VjdGlvbiA3LjUpLgogICAoWWVzLCB5b3UgY291bGQgc3Vic3RpdHV0ZSBTSE9XIEFSR1VNRU5UUyBmb3IgdGhlIGxvb3AuKQoKICAkIGNobW9kICt4IHNob3dhcmdzCiAgJCAuL3Nob3dhcmdzIG9uZSAidGhpcyBpcyB0d28iIHRocmVlCgogICBUaGUgc2NyaXB0IGRpc3BsYXlzIGl0cyBhcmd1bWVudHM6CgogIEhlbGxvIGZyb20gL3Vzci9vbGdhL3Nob3dhcmdzCiAgMC4gIi91c3Ivb2xnYS9zaG93YXJncyIKICAxLiAib25lIgogIDIuICJ0aGlzIGlzIHR3byIKICAzLiAidGhyZWUiCiAgJAoKICAgTm90aWNlIHRoYXQgbm8gYmFubmVycyBvciBncmVldGluZ3MgYXJlIHByaW50ZWQgYW5kIHRoYXQgc3RhcnR1cCBpcwogICBpbnN0YW50YW5lb3VzLCBqdXN0IGxpa2UgYSBzaGVsbCBzY3JpcHQuIEFsc28gbm90aWNlIHRoYXQgZ3JvdXBpbmcgb2YKICAgYXJndW1lbnRzIGlzIGRldGVybWluZWQgYnkgKnNoZWxsKiBxdW90aW5nIHJ1bGVzLCBub3QgS2VybWl0IG9uZXMsCiAgIHNpbmNlIHRoZSBjb21tYW5kIGxpbmUgaXMgcGFyc2VkIGJ5IHRoZSBzaGVsbCBiZWZvcmUgS2VybWl0IGV2ZXIgc2VlcwogICBpdC4KCiAgIE9mIGNvdXJzZSB5b3UgY2FuIHB1dCBhbnkgY29tbWFuZHMgYXQgYWxsIGludG8gYSBLZXJiYW5nIHNjcmlwdC4gSXQKICAgY2FuIHJlYWQgYW5kIHdyaXRlIGZpbGVzLCBtYWtlIGNvbm5lY3Rpb25zLCB0cmFuc2ZlciBmaWxlcywgYW55dGhpbmcKICAgdGhhdCBLZXJtaXQgY2FuIGRvIC0tIGJlY2F1c2UgaXQgKmlzKiBLZXJtaXQuIEFuZCBvZiBjb3Vyc2UsIEtlcmJhbmcKICAgc2NyaXB0cyBjYW4gYWxzbyBiZSBleGVjdXRlZCBmcm9tIHRoZSBLZXJtaXQgcHJvbXB0IChvciBmcm9tIGFub3RoZXIKICAgc2NyaXB0KSB3aXRoIGEgVEFLRSBjb21tYW5kOyB0aGUgS2VyYmFuZyBsaW5lIGlzIGlnbm9yZWQgc2luY2UgaXQKICAgc3RhcnRzIHdpdGggIiMiLCB3aGljaCBpcyBhIGNvbW1lbnQgaW50cm9kdWNlciB0byBLZXJtaXQganVzdCBhcyBpdCBpcwogICB0byB0aGUgVU5JWCBzaGVsbC4gSW4gVk1TIGFuZCBvdGhlciBub24tVU5JWCBwbGF0Zm9ybXMsIHRoZSBLZXJiYW5nCiAgIGxpbmUgaGFzIG5vIGVmZmVjdCBhbmQgY2FuIGJlIG9taXR0ZWQuCgogICBJdCBtaWdodCBiZSBkZXNpcmVhYmxlIGZvciBhIHNjcmlwdCB0byBrbm93IHdoZXRoZXIgaXQgaGFzIGJlZW4KICAgaW52b2tlZCBkaXJlY3RseSBmcm9tIHRoZSBzaGVsbCAoYXMgYSBLZXJiYW5nIHNjcmlwdCkgb3IgYnkgYSBUQUtFCiAgIGNvbW1hbmQgZ2l2ZW4gdG8gdGhlIEtlcm1pdCBwcm9tcHQgb3IgaW4gYSBLZXJtaXQgY29tbWFuZCBmaWxlIG9yCiAgIG1hY3JvLiBUaGlzIGNhbiBiZSBkb25lIGFzIGluIHRoaXMgZXhhbXBsZToKCiAgIyEvdXNyL2xvY2FsL2Jpbi9rZXJtaXQgKwogIGFzc2lnbiBcJW0gXGZiYXNlbmFtZShcJTApCiAgZGVmaW5lIHVzYWdlIHsgZXhpdCAxIHt1c2FnZTogXCVtIHBob25lbnVtYmVyIG1lc3NhZ2V9IH0KICBkZWZpbmUgYXBhZ2UgeyAoZGVmaW5pdGlvbiBvZiBBUEFHRS4uLikgfSA7IChTZWUgWzYyMF1ib29rIHBwLjQ1NC00NTYpCiAgeGlmIGVxdWFsICJcJTAiICJcdihjbWRmaWwpIiB7CiAgICAgIGlmIG5vdCBkZWYgXCUxIHVzYWdlCiAgICAgIGlmIG5vdCBkZWYgXCUyIHVzYWdlCiAgICAgIGFwYWdlIHtcJTF9IHtcJTJ9CiAgICAgIGV4aXQgXHYoc3RhdHVzKQogIH0KCiAgIEluIGEgS2VyYmFuZyBzY3JpcHQsIFwlMCBhbmQgXHYoY21kZmlsZSkgYXJlIHRoZSBzYW1lOyBib3RoIG9mIHRoZW0KICAgYXJlIHRoZSBuYW1lIG9mIHRoZSBzY3JpcHQuIFdoZW4gYSBzY3JpcHQgaXMgaW52b2tlZCBieSBhIEtlcm1pdCBUQUtFCiAgIGNvbW1hbmQsIFwlMCBpcyB0aGUgbmFtZSBvZiB0aGUgS2VybWl0IHByb2dyYW0sIGJ1dCBcdihjbWRmaWxlKSBpcyB0aGUKICAgbmFtZSBvZiB0aGUgc2NyaXB0LiBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgYSBtYWNybyBjYWxsZWQgQVBBR0UgaXMKICAgZGVmaW5lZC4gSWYgdGhlIHNjcmlwdCB3YXMgaW52b2tlZCBkaXJlY3RseSwgdGhlIEFQQUdFIG1hY3JvIGlzIGFsc28KICAgZXhlY3V0ZWQuIE90aGVyd2lzZSwgaXQgaXMgYXZhaWxhYmxlIGZvciBzdWJzZXF1ZW50IGFuZCBwZXJoYXBzCiAgIHJlcGVhdGVkIHVzZSBsYXRlciBpbiB0aGUgS2VybWl0IHNlc3Npb24uCgogICBBbiBlc3BlY2lhbGx5IGhhbmR5IHVzZSBmb3IgS2VyYmFuZyBzY3JpcHRzIGlzIHRvIGhhdmUgdGhlCiAgIGluaXRpYWxpemF0aW9uIGZpbGUgaXRzZWxmIGJlIG9uZS4gU2luY2UgdGhlIHN0YW5kYXJkIGluaXRpYWxpemF0aW9uCiAgIGZpbGUgaXMgcmF0aGVyIGxvbmcgYW5kIHRpbWUtY29uc3VtaW5nIHRvIGV4ZWN1dGUsIGl0IGlzIG9mdGVuCiAgIG92ZXJraWxsIGlmIHlvdSB3YW50IHRvIHN0YXJ0IEtlcm1pdCBqdXN0IHRvIHRyYW5zZmVyIGEgZmlsZS4gT2YKICAgY291cnNlIHRoZXJlIGFyZSBjb21tYW5kLWxpbmUgc3dpdGNoZXMgdG8gc3VwcHJlc3MgaW5pdGlhbGl6YXRpb24tZmlsZQogICBleGVjdXRpb24sIGV0YywgYnV0IGFub3RoZXIgYXBwcm9hY2ggaXMgdG8gInJ1biIgdGhlIGluaXRpYWxpemF0aW9uCiAgIGZpbGUgd2hlbiB5b3Ugd2FudCBpdHMgZmVhdHVyZXMgKG5vdGFibHkgdGhlIHNlcnZpY2VzIGRpcmVjdG9yeSksIGFuZAogICBydW4gQy1LZXJtaXQgZGlyZWN0bHkgd2hlbiB5b3UgZG9uJ3QuIEEgc2V0dXAgbGlrZSB0aGlzIHJlcXVpcmVzIHRoYXQKICAgKGEpIHRoZSBDLUtlcm1pdCBpbml0aWFsaXphdGlvbiBmaWxlIGlzIGNvbmZpZ3VyZWQgYXMgYSBLZXJiYW5nIHNjcmlwdAogICAoaGFzICMhL3BhdGguLi4va2VybWl0IGFzIGZpcnN0IGxpbmUpLCBoYXMgZXhlY3V0ZSBwZXJtaXNzaW9uLCBhbmQgaXMKICAgaW4geW91ciBQQVRIOyBhbmQgKGIpIHRoYXQgeW91IGRvbid0IGhhdmUgYSAua2VybXJjIGZpbGUgaW4geW91ciBsb2dpbgogICBkaXJlY3RvcnkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy4yMC4gSUYgYW5kIFhJRiBTdGF0ZW1lbnQgU3ludGF4CgogICBUaGUgSUYgY29tbWFuZCBoYXMgYmVlbiBpbXByb3ZlZCBpbiB0d28gc2lnbmlmaWNhbnQgd2F5cyBpbiBDLUtlcm1pdAogICA3LjAsIGRlc2NyaWJlZCBpbiB0aGUgZm9sbG93aW5nIHN1YnNlY3Rpb25zLiBBbGwgY2hhbmdlcyBhcmUgYmFja3dhcmRzCiAgIGNvbXBhdGlibGUuCgogICAgNy4yMC4xLiBUaGUgSUYvWElGIERpc3RpbmN0aW9uCgogICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiBJRiBhbmQgWElGIGlzIG5vIGxvbmdlciBpbXBvcnRhbnQgYXMgb2YKICAgQy1LZXJtaXQgNy4wLiBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIElGIGluIGFsbCBjYXNlcyAoYW5kIG9mCiAgIGNvdXJzZSwgYWxzbyBYSUYgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5KS4gSW4gdGhlIHBhc3QsIElGIHdhcwogICB1c2VkIGZvciBzaW5nbGUtY29tbWFuZCBUSEVOIHBhcnRzLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgc2VwYXJhdGUKICAgRUxTRSBjb21tYW5kOgoKICBJRiBjb25kaXRpb24gY29tbWFuZDEgICAgOyBUSEVOIHBhcnQKICBFTFNFIGNvbW1hbmQyICAgICAgICAgICAgOyBFTFNFIHBhcnQKCiAgIHdoZXJlYXMgWElGIHdhcyByZXF1aXJlZCBpZiBlaXRoZXIgcGFydCBoYWQgbXVsdGlwbGUgY29tbWFuZHM6CgogIFhJRiBjb25kaXRpb24geyBjb21tYW5kLCBjb21tYW5kLCAuLi4gfSBFTFNFIHsgY29tbWFuZCwgY29tbWFuZCwgLi4uIH0KCiAgIFRoZSBzeW50YWN0aWMgZGlmZmVyZW5jZXMgd2VyZSBwcmltYXJpbHkgdGhhdCBJRiAvIEVMU0Ugd2FzIHR3bwogICBjb21tYW5kcyBvbiB0d28gc2VwYXJhdGUgbGluZXMsIHdoZXJlYXMgWElGIHdhcyBvbmUgY29tbWFuZCBvbiBvbmUKICAgbGluZSwgYW5kIHRoYXQgWElGIGFsbG93ZWQgKGFuZCBpbiBmYWN0IHJlcXVpcmVkKSBicmFjZXMgYXJvdW5kIGl0cwogICBjb21tYW5kIGxpc3RzLCB3aGVyZWFzIElGIGRpZCBub3QgYWxsb3cgdGhlbS4KCiAgIEZ1cnRoZXJtb3JlLCB0aGUgY2hhaW5pbmcgb3IgbmVzdGluZyBvZiBwYXJ0cyBhbmQgY29uZGl0aW9ucyB3YXMKICAgaW5jb25zaXN0ZW50LiBGb3IgZXhhbXBsZSwgdGhlIElGIGNvbW1hbmQgY291bGQgYmUgdXNlZCBsaWtlIHRoaXM6CgogIElGIGNvbmRpdGlvbiBjb21tYW5kCiAgRUxTRSBJRiBjb25kaXRpb24gY29tbWFuZAogIEVMU0UgSUYgY29uZGl0aW9uIGNvbW1hbmQKICBFTFNFIElGIGNvbmRpdGlvbiBjb21tYW5kCiAgLi4uCgogICBidXQgWElGIGNvdWxkIG5vdC4gQy1LZXJtaXQgNy4wIGFjY2VwdHMgdGhlIG9sZCBzeW50YXggYW5kIGV4ZWN1dGVzIGl0CiAgIHRoZSBzYW1lIGFzIHByZXZpb3VzIHZlcnNpb25zLCBidXQgYWxzbyBhY2NlcHRzIGEgbmV3IHVuaWZpZWQgYW5kIG1vcmUKICAgY29udmVuaWVudCBzeW50YXg6CgogICBJRiBjb25kaXRpb24gY29tbWFuZC1saXN0IFsgRUxTRSBjb21tYW5kLWxpc3QgXQoKICAgb3I6CgpJRiBjb25kaXRpb24gY29tbWFuZC1saXN0CkVMU0UgY29tbWFuZC1saXN0CgogICBpbiB3aGljaCB0aGUgRUxTRSBwYXJ0IGlzIG9wdGlvbmFsLCBhbmQgd2hlcmUgY29tbWFuZC1saXN0IGNhbiBiZSBhCiAgIHNpbmdsZSBjb21tYW5kICh3aXRoIG9yIHdpdGhvdXQgYnJhY2VzIGFyb3VuZCBpdCkgb3IgYSBsaXN0IG9mCiAgIGNvbW1hbmRzIGVuY2xvc2VkIGluIGJyYWNlcy4gRXhhbXBsZXM6CgogICBFeGFtcGxlIDE6CgogIElGIGNvbmRpdGlvbiB7IGNvbW1hbmQxLCBjb21tYW5kMiB9IEVMU0UgeyBjb21tYW5kMywgY29tbWFuZDQgfQoKICAgRXhhbXBsZSAyIChzYW1lIGFzIEV4YW1wbGUgMSk6CgogIElGIGNvbmRpdGlvbiB7CiAgICAgY29tbWFuZDEKICAgICBjb21tYW5kMgogIH0gRUxTRSB7CiAgICAgY29tbWFuZDMKICAgICBjb21tYW5kNAogIH0KCiAgIEV4YW1wbGUgMyAoc2FtZSBhcyAxIGFuZCAyKToKCiAgSUYgY29uZGl0aW9uIHsKICAgICBjb21tYW5kMQogICAgIGNvbW1hbmQyCiAgfQogIEVMU0UgeyBjb21tYW5kMywgY29tbWFuZDQgfQoKICAgRXhhbXBsZSA0IChzYW1lIGFzIDEtMyk6CgogIElGIGNvbmRpdGlvbiB7CiAgICAgY29tbWFuZDEKICAgICBjb21tYW5kMgogIH0KICBFTFNFIHsKICAgICBjb21tYW5kMwogICAgIGNvbW1hbmQ0CiAgfQoKICAgRXhhbXBsZSA1IChFTFNFIGNhbiBiZSBmb2xsb3dlZCBieSBhbm90aGVyIGNvbW1hbmQpOgoKICBJRiBjb25kaXRpb24gewogICAgIGNvbW1hbmQxCiAgICAgY29tbWFuZDIKICB9IEVMU0UgSUYgY29uZGl0aW9uIHsKICAgICBjb21tYW5kMwogICAgIGNvbW1hbmQ0CiAgfSBFTFNFIHsKICAgICBjb21tYW5kNQogICAgIGNvbW1hbmQ2CiAgfQoKICAgRXhhbXBsZSA1IHN1Z2dlc3RzIG90aGVyIHBvc3NpYmlsaXRpZXM6CgogIElGIGNvbmRpdGlvbiB7CiAgICAgY29tbWFuZDEKICAgICBjb21tYW5kMgogIH0gRUxTRSBGT1IgdmFyaWFibGUgaW5pdGlhbCBmaW5hbCBpbmNyZW1lbnQgewogICAgIGNvbW1hbmQzCiAgICAgY29tbWFuZDQKICB9CgogICBBbmQgdGhpcyB0b28gaXMgcG9zc2libGUsIGV4Y2VwdCBmb3Igc29tZSBub24tb2J2aW91cyBxdW90aW5nCiAgIGNvbnNpZGVyYXRpb25zOgoKICBkY2wgXCZhWzZdID0gb25lIHR3byB0aHJlZSBmb3VyIGZpdmUgc2l4CgogIElGIDwgXCVuIDMgewogICAgICBlY2hvIFxcJW4gaXMgdG9vIHNtYWxsOiBcJW4KICB9IEVMU0UgRk9SIFxcJWkgMSBcXCVuIDEgewogICAgICBlY2hvIFxcJWkuIFxcJmFbXFwlaV0KICB9CgogICAoVGhlIGxvb3AgdmFyaWFibGUgbXVzdCBiZSBxdW90ZWQgaW4gdGhpcyBjb250ZXh0IHRvIHByZXZlbnQgcHJlbWF0dXJlCiAgIGV2YWx1YXRpb24uKQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgNy4yMC4yLiBCb29sZWFuIEV4cHJlc3Npb25zIChUaGUgSUYvV0hJTEUgQ29uZGl0aW9uKQoKICAgUHJpb3IgdG8gQy1LZXJtaXQgNy4wLCB0aGUgSUYgYW5kIFdISUxFIGNvbW1hbmRzIGFjY2VwdGVkIG9ubHkgYQogICBzaW5nbGUgQm9vbGVhbiAoInRydWUgb3IgZmFsc2UiKSBhc3NlcnRpb24sIGUuZy4gImlmID4gXCVtIDAgY29tbWFuZCIKICAgb3IgImlmIGV4aXN0IGZpbGVuYW1lIGNvbW1hbmQiLiBUaGVyZSB3YXMgbm8gd2F5IHRvIGZvcm0gQm9vbGVhbgogICBleHByZXNzaW9ucyBhbmQsIGluIHBhcnRpY3VsYXIsIG5vdGhpbmcgdGhhdCBhcHByb2FjaGVkIGEgQm9vbGVhbiBPUgogICBmdW5jdGlvbiAoQU5EIGNvdWxkIGJlIHNpbXVsYXRlZCBieSBjb25jYXRlbmF0aW5nIElGIHN0YXRlbWVudHM6ICJpZgogICBjb25kaXRpb24xIGlmIGNvbmRpdGlvbjIuLiIpLgoKICAgQy1LZXJtaXQgNy4wIChhbmQgSzk1IDEuMS4xOSkgYWxsb3cgZ3JvdXBpbmcgb2YgQm9vbGVhbiBhc3NlcnRpb25zCiAgIHVzaW5nIHBhcmVudGhlc2VzIGFuZCBjb21iaW5pbmcgdGhlbSB1c2luZyBBTkQgKG9yICYmKSBhbmQgT1IgKG9yIHx8KS4KICAgRWFjaCBvZiB0aGVzZSBvcGVyYXRvcnMgLS0gaW5jbHVkaW5nIHRoZSBwYXJlbnRoZXNlcyAtLSBpcyBhIGZpZWxkIGFuZAogICBtdXN0IGJlIHNldCBvZmYgYnkgc3BhY2VzLiBBTkQgaGFzIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4gT1IsIE5PVCBoYXMKICAgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBBTkQsIGJ1dCBwYXJlbnRoZXNlcyBjYW4gYmUgdXNlZCB0byBmb3JjZSBhbnkKICAgZGVzaXJlZCBvcmRlciBvZiBldmFsdWF0aW9uLiBUaGUgb2xkIHN5bnRheCBpcyBzdGlsbCBhY2NlcHRlZC4KCiAgIEhlcmUgYXJlIHNvbWUgZXhhbXBsZXM6CgogIGRlZmluZSBcJXogMCAgICAgICAgICAgICAgICAgICAgICAgICAgOyBEZWZpbmUgc29tZSB2YXJpYWJsZXMKICBkZWZpbmUgXCVuIDEgICAgICAgICAgICAgICAgICAgICAgICAgIDsgZm9yIHVzZSBpbiB0aGUgZXhhbXBsZXMuCgogIGlmID4gXCVuIFwleiBlY2hvIFwlbiBpcyBncmVhdGVyLiAgICAgOyBPcmlnaW5hbCBmb3JtYXQgLSBzdGlsbCBhY2NlcHRlZC4KICBpZiAoID4gXCVuIFwleiApIGVjaG8gXCVuIGlzIGdyZWF0ZXIuIDsgUGFyZW50aGVzZXMgbWF5IGJlIHVzZWQgaW4gNy4wLgogIGlmICggPiBcJW4gXCV6ICYmIG5vdCA9IFwleiAwICkgLi4uICAgOyBUd28gYXNzZXJ0aW9ucyBjb21iaW5lZCB3aXRoIEFORC4KICBpZiAoID4gXCVuIFwleiBhbmQgbm90ID0gXCV6IDAgKSAuLi4gIDsgU2FtZSBhcyBwcmV2aW91cyAoImFuZCIgPSAiJiYiKS4KICBpZiAoID4gXCVuIFwleiB8fCBub3QgPSBcJXogMCApIC4uLiAgIDsgVHdvIGFzc2VydGlvbnMgY29tYmluZWQgd2l0aCBPUi4KICBpZiAoID4gXCVuIFwleiBvciBub3QgPSBcJXogMCApIC4uLiAgIDsgU2FtZSBhcyBwcmV2aW91cyAoIm9yIiA9ICJ8fCIpLgogIGlmICggPiBcJW4gXCV6IHx8ICE9IFwleiAwICkgLi4uICAgICAgOyBEaXR0byAoIiE9IiA9ICJub3QgPSIpLgogIHdoaWxlICggMSApIHsgLi4uIH0gICAgICAgICAgICAgICAgICAgOyBKdXN0IGxpa2UgQy4KCiAgIE5vdGljZSB0aGUgc3BhY2VzIGFyb3VuZCBhbGwgb3BlcmF0b3JzIGluY2x1ZGluZyB0aGUgcGFyZW50aGVzZXMgLS0KICAgdGhlc2UgYXJlIHJlcXVpcmVkLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgaG93IHBhcmVudGhlc2VzIGNhbiBiZQogICB1c2VkIHRvIGFsdGVyIHRoZSBwcmVjZWRlbmNlIG9mIHRoZSBBTkQgYW5kIE9SIG9wZXJhdG9yczoKCiAgaWYgKCBmYWxzZSB8fCBmYWxzZSAmJiBmYWxzZSB8fCB0cnVlICkgLC4uICAgICAgICAgOyBUcnVlCiAgaWYgKCBmYWxzZSB8fCAoIGZhbHNlICYmIGZhbHNlICkgfHwgdHJ1ZSApIC4uLiAgICAgOyBTYW1lIGFzIHByZXZpb3VzCiAgaWYgKCAoIGZhbHNlIHx8IGZhbHNlICkgJiYgKCBmYWxzZSB8fCB0cnVlICkgKSAuLi4gOyBGYWxzZQoKICAgU2ltaWxhcmx5IGZvciBOT1Q6CgogIGlmICggbm90IHRydWUgJiYgZmFsc2UgKSAuLi4gICAgICAgICAgOyBGYWxzZSAoTk9UIGJpbmRzIHRvIFRSVUUgb25seSkKICBpZiAoICggbm90IHRydWUgKSAmJiBmYWxzZSApIC4uLiAgICAgIDsgU2FtZSBhcyBwcmV2aW91cwogIGlmICggbm90ICggdHJ1ZSAmJiBmYWxzZSApICkgLi4uICAgICAgOyBUcnVlIChOT1QgYmluZHMgdG8gKFRSVUUgJiYgRkFMU0UpKQoKICAgTm90ZXM6CgogICAgMS4gVGhlIHN5bnRheCBvZiB0aGUgQm9vbGVhbiBleHByZXNzaW9uIGl0c2VsZiBoYXMgbm90IGNoYW5nZWQ7IGVhY2gKICAgICAgIGV4cHJlc3Npb24gYmVnaW5zIHdpdGggYSBrZXl3b3JkIG9yIHRva2VuIHN1Y2ggYXMgIkVYSVNUIiwgIj4iLCBvcgogICAgICAgIj0iLCBldGM7IG9wZXJhdG9ycyBzdWNoIGFzICI8IiwgIj0iLCBhbmQgIj4iIGRvIG5vdCBnbyBiZXR3ZWVuCiAgICAgICB0aGVpciBvcGVyYW5kcyBidXQgcHJlY2VkZSB0aGVtIGFzIGJlZm9yZTsgdGhpcyBtaWdodCBiZSBjYWxsZWQKICAgICAgICJyZXZlcnNlIHJldmVyc2UgUG9saXNoIG5vdGF0aW9uIjsgaXQgYWxsb3dzIGRldGVybWluaXN0aWMKICAgICAgIG9uLXRoZS1mbHkgcGFyc2luZyBvZiB0aGVzZSBleHByZXNzaW9ucyBhdCB0aGUgQy1LZXJtaXQ+IHByb21wdCBhcwogICAgICAgd2VsbCBhcyBpbiBzY3JpcHRzLCBhbmQgYWxsb3dzID8taGVscCB0byBiZSBnaXZlbiBmb3IgZWFjaCBpdGVtCiAgICAgICB3aGVuIElGIG9yIFdISUxFIGNvbW1hbmRzIGFyZSB0eXBlZCBhdCB0aGUgcHJvbXB0LgogICAgMi4gUGFyZW50aGVzZXMgYXJlIHJlcXVpcmVkIHdoZW4gdGhlcmUgaXMgbW9yZSB0aGFuIG9uZSBCb29sZWFuCiAgICAgICBhc3NlcnRpb24uCiAgICAzLiBQYXJlbnRoZXNlcyBhcmUgbm90IHJlcXVpcmVkLCBidXQgYXJlIGFsbG93ZWQsIHdoZW4gdGhlcmUgaXMgb25seQogICAgICAgb25lIEJvb2xlYW4gYXNzZXJ0aW9uLgogICAgNC4gRXZhbHVhdGlvbiBvZiBCb29sZWFuIGFzc2VydGlvbnMgb2NjdXJzIGxlZnQgdG8gcmlnaHQsIGJ1dCB0aGUKICAgICAgIHJlc3VsdGluZyBCb29sZWFuIGV4cHJlc3Npb24gaXMgZXZhbHVhdGVkIGFmdGVyd2FyZHMgYWNjb3JkaW5nIHRvCiAgICAgICB0aGUgcnVsZXMgb2YgcHJlY2VkZW5jZS4gQWxsIEJvb2xlYW4gYXNzZXJ0aW9ucyBhcmUgYWx3YXlzCiAgICAgICBldmFsdWF0ZWQ7IHRoZXJlIGlzIG5vICJlYXJseSBzdG9wcGluZyIgcHJvcGVydHkgYW5kIHRoZXJlZm9yZSBubwogICAgICAgcXVlc3Rpb24gYWJvdXQgd2hlbiBvciBpZiBzaWRlIGVmZmVjdHMgd2lsbCBvY2N1ciAtLSBpZiBhbnkKICAgICAgIEJvb2xlYW4gYXNzZXJ0aW9uIGhhcyBzaWRlIGVmZmVjdHMsIHRoZXkgd2lsbCBhbHdheXMgb2NjdXIuCgogICBDb25zdHJ1Y3Rpb25zIG9mIGFyYml0cmFyeSBjb21wbGV4aXR5IGFyZSBwb3NzaWJsZSwgd2l0aGluIHJlYXNvbi4KCiAgIEFsc28gc2VlIFs2MjFdU2VjdGlvbiA3LjQgZm9yIG5ldyBJRiAvIFdISUxFIGNvbmRpdGlvbnMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy4yMS4gU2NyZWVuIEZvcm1hdHRpbmcgYW5kIEN1cnNvciBDb250cm9sCgogICBDLUtlcm1pdCA3LjAgYWRkcyBhIHNpbXBsZSB3YXkgdG8gY3JlYXRlIGZvcm1hdHRlZCBzY3JlZW5zLCB0aGUgU0NSRUVOCiAgIGNvbW1hbmQ6CgogICBTQ1JFRU4geyBDTEVBUiwgQ0xFT0wsIE1PVkUtVE8gcm93IFsgY29sdW1uIF0gfQogICAgICAgICAgUGVyZm9ybXMgc2NyZWVuLWZvcm1hdHRpbmcgYWN0aW9ucy4gQ29ycmVjdCBvcGVyYXRpb24gb2YgdGhlc2UKICAgICAgICAgIGNvbW1hbmRzIGRlcGVuZHMgb24gcHJvcGVyIHRlcm1pbmFsIHNldHVwIG9uIGJvdGggZW5kcyBvZiB0aGUKICAgICAgICAgIGNvbm5lY3Rpb24gLS0gbWFpbmx5IHRoYXQgdGhlIGhvc3QgdGVybWluYWwgdHlwZSBpcyBzZXQgdG8KICAgICAgICAgIGFncmVlIHdpdGggdGhlIGtpbmQgb2YgdGVybWluYWwgb3IgdGhlIGVtdWxhdGlvbiB5b3UgYXJlCiAgICAgICAgICB2aWV3aW5nIEMtS2VybWl0IHRocm91Z2guIFRoZSBVTklYIHZlcnNpb24gdXNlcyB0ZXJtaW5mbyBvcgogICAgICAgICAgdGVybWNhcCAobm90IGN1cnNlcyk7IHRoZSBWTVMgdmVyc2lvbiB1c2VzIFNNRzsgSy05NSB1c2VzIGl0cwogICAgICAgICAgYnVpbHQgaW4gc2NyZWVuIG1hbmFnZXIuCgogICBTQ1JFRU4gQ0xFQVIKICAgICAgICAgIE1vdmVzIHRoZSBjdXJzb3IgdG8gaG9tZSBwb3NpdGlvbiBhbmQgY2xlYXJzIHRoZSBlbnRpcmUgc2NyZWVuLgogICAgICAgICAgU3lub255bXM6IENMRUFSIENPTU1BTkQtU0NSRUVOIEFMTCAoSy05NSBvbmx5KSwgQ0xTLCBDTEVBUgogICAgICAgICAgU0NSRUVOLgoKICAgU0NSRUVOIENMRU9MCiAgICAgICAgICBDbGVhcnMgZnJvbSB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24gdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KICAgICAgICAgIFN5bm9ueW06IENMRUFSIENPTU1BTkQtU0NSRUVOIEVPTCAoSy05NSBvbmx5KQoKICAgU0NSRUVOIE1PVkUtVE8gcm93IGNvbHVtbgogICAgICAgICAgTW92ZXMgdGhlIGN1cnNvciB0byB0aGUgaW5kaWNhdGVkIHJvdyBhbmQgY29sdW1uLiBUaGUgcm93IGFuZAogICAgICAgICAgY29sdW1uIG51bWJlcnMgYXJlIDEtYmFzZWQsIHNvIG9uIGEgMjR4ODAgc2NyZWVuIHRoZSBob21lCiAgICAgICAgICBwb3NpdGlvbiBpcyAxIDEgYW5kIHRoZSBsb3dlciByaWdodCBjb3JuZXIgaXMgMjQgODAuIElmIGEgcm93CiAgICAgICAgICBvciBjb2x1bW4gbnVtYmVyIGlzIGdpdmVuIHRoYXQgdG9vIGxhcmdlIGZvciB3aGF0IEtlcm1pdCBvciB0aGUKICAgICAgICAgIG9wZXJhdGluZyBzeXN0ZW0gdGhpbmtzIGlzIHlvdXIgc2NyZWVuIHNpemUsIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICAgbnVtYmVyIGlzIHN1YnN0aXR1dGVkLgoKICAgVGhlc2UgZXNjYXBlIHNlcXVlbmNlcyB1c2VkIGJ5IHRoZXNlIGNvbW1hbmRzIGRlcGVuZHMgb24gdGhlIHBsYXRmb3JtLgogICBJbiBVTklYLCB5b3VyIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgdXNlZCB0byBxdWVyeSB0aGUKICAgdGVybWluZm8vdGVybWNhcCBkYXRhYmFzZTsgaWYgdGhlIHF1ZXJ5IGZhaWxzLCBBTlNJL1ZUMTAwIHNlcXVlbmNlcwogICBhcmUgdXNlZC4gSW4gVk1TLCB0aGUgU01HIGxpYnJhcnkgaXMgdXNlZCwgd2hpY2ggc2VuZHMgc2VxdWVuY2VzIGJhc2VkCiAgIG9uIHlvdXIgVk1TIHRlcm1pbmFsIHR5cGUuIEs5NSBkb2VzIGl0cyBvd24gc2NyZWVuIGNvbnRyb2wuIE9uIG90aGVyCiAgIHBsYXRmb3JtcyAoc3VjaCBhcyBBT1MvVlMsIFZPUywgZXRjKSwgc2NyZWVuIGZvcm1hdHRpbmcgaXMgbm90CiAgIHN1cHBvcnRlZCwgYW5kIHRoZSBTQ1JFRU4gY29tbWFuZCBkb2VzIG5vdGhpbmcuCgogICBUaGUgdGhyZWUgU0NSRUVOIGFjdGlvbnMgY2FuIGJlIHVzZWQgaW4gc2NyaXB0cyB0byBwcm9kdWNlIG1lbnVzLAogICBmb3JtYXR0ZWQgc2NyZWVucywgZHluYW1pYyBkaXNwbGF5cywgZXRjLiBSZWxhdGVkIHZhcmlhYmxlcyBpbmNsdWRlOgoKICBcdih0ZXJtaW5hbCkgICAgIFRoZSB0eXBlIHRlcm1pbmFsIEMtS2VybWl0IHRoaW5rcyB5b3UgaGF2ZS4KICBcdihyb3dzKSAgICAgICAgIFRoZSBudW1iZXIgb2Ygcm93cyBDLUtlcm1pdCB0aGlua3MgeW91ciB0ZXJtaW5hbCBoYXMuCiAgXHYoY29sdW1ucykgICAgICBUaGUgbnVtYmVyIG9mIGNvbHVtbnMgQy1LZXJtaXQgdGhpbmtzIHlvdXIgdGVybWluYWwgaGFzLgoKICAgQW5kIGZ1bmN0aW9uczoKCiAgXGZzY3JuY3VyeCgpICAgICBUaGUgY3VycmVudCBYIGNvb3JkaW5hdGUgb2YgdGhlIGN1cnNvciAoSy05NSBvbmx5KS4KICBcZnNjcm5jdXJ5KCkgICAgIFRoZSBjdXJyZW50IFkgY29vcmRpbmF0ZSBvZiB0aGUgY3Vyc29yIChLLTk1IG9ubHkpLgogIFxmc2NybnN0cih4LHksbikgVGhlIHN0cmluZyBvZiBsZW5ndGggbmF0IHBvc2l0aW9uICh4LHkpIChLLTk1IG9ubHkpLgoKICAgQW5kIGNvbW1hbmRzOgoKICBFQ0hPIHN0cmluZyAgICAgIFdyaXRlcyBzdHJpbmcgKyBDUkxGIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbi4KICBYRUNITyBzdHJpbmcgICAgIFdyaXRlcyBzdHJpbmcgYXQgY3VycmVudCBjdXJzb3IgcG9zaXRpb247IENSTEYgbm90IHN1cHBsaWVkLgogIEdFVEMgdiBwcm9tcHQgICAgSXNzdWVzIHByb21wdCwgcmVhZHMgb25lIGNoYXJhY3RlciBpbnRvIHZhcmlhYmxlIHYsIG5vIGVjaG8uCgogICBBbmQgc3BlY2lhbCBjaGFyYWN0ZXJzOgoKICBDdHJsLUwgICAgICAgICAgIEF0IHRoZSBDLUtlcm1pdD4gY29tbWFuZCBwcm9tcHQsIG9yIGluIGEgQy1LZXJtaXQgY29tbWFuZCwKICAgICAgICAgICAgICAgICAgIHdvcmtzIGxpa2UgUmV0dXJuIG9yIEVudGVyLCBidXQgYWxzbyBjbGVhcnMgdGhlIHNjcmVlbgoKICAgRXhhbXBsZSAxOiBBIG1hY3JvIHRoYXQgcHJpbnRzIGEgbWVzc2FnZSBcJTEgYXQgY3Vyc29yIHBvc2l0aW9uCiAgIChcJTIsXCUzKToKCiAgZGVmaW5lIE1TRyB7CiAgICAgIGlmIG5vdCBkZWYgXCUzIGRlZiBcJTMgMCAgICAgICAgICAgICA7IERlZmF1bHQgY29sdW1uIHRvIDAKICAgICAgaWYgPiBcdihhcmdjKSAyIHNjcmVlbiBtb3ZlIFwlMiBcJTMgIDsgTW92ZSB0byBnaXZlbiByb3cvY29sIChpZiBhbnkpCiAgICAgIHNjcmVlbiBjbGVvbCAgICAgICAgICAgICAgICAgICAgICAgICA7IENsZWFyIHRvIGVuZCBvZiBsaW5lCiAgICAgIGlmIGRlZiBcJTEgeGVjaG8gXGZjb250ZW50cyhcJTEpICAgICA7IFByaW50IG1lc3NhZ2UgKGlmIGFueSkKICB9CgogICBFeGFtcGxlIDI6IEEgbWFjcm8gcHV0IHRoZSBjdXJzb3Igb24gdGhlIGJvdHRvbSBzY3JlZW4gbGluZSwgbGVmdAogICBtYXJnaW46CgogIGRlZmluZSBCT1QgewogICAgICBzY3JlZW4gbW92ZSBcdihyb3dzKSAwCiAgfQoKICAgRXhhbXBsZSAzOiBBIG1hY3JvIHRvIGNlbnRlciBtZXNzYWdlIFwlMSBvbiBsaW5lIFwlMi4KCiAgZGVmaW5lIENFTlRFUiB7CiAgICAgIGlmIG5vdCBkZWYgXCUyIGRlZiBcJTIgMQogICAgICAuXCV4IDo6PSAoXHYoY29scyktXGZsZW4oXCUxKSkvMgogICAgICBtc2cge1wlMX0ge1wlMn0ge1wleH0KICB9CgogICBFeGFtcGxlIDQ6IEEgc2ltcGxlIG1lbnUgKGJ1aWxkaW5nIG9uIEV4YW1wbGVzIDEtMyk6CgogIGRlZiBcJWMgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBNZW51IGNob2ljZSB2YXJpYWJsZQogIHNjcmVlbiBjbGVhciAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciB0aGUgc2NyZWVuCiAgY2VudGVyIHtXZWxjb21lIHRvIFRoaXMgTWVudX0gMiAgICAgICA7IERpc3BsYXkgdGhlIG1lbnUKICBtc2cge0Nob2ljZXM6fSA0CiAgbXNnIHsgMS4gRmlsZX0gNgogIG1zZyB7IDIuIEVkaXR9IDcKICBtc2cgeyAzLiBFeGl0fSA4CiAgd2hpbGUgKCAhPSBcJWMgMyApIHsgICAgICAgICAgICAgICAgICA7IFJlYWQgYW5kIHZlcmlmeSBjaG9pY2UKICAgICAgd2hpbGUgdHJ1ZSB7ICAgICAgICAgICAgICAgICAgICAgIDsgS2VlcCB0cnlpbmcgdGlsbCB3ZSBnZXQgYSBnb29kIG9uZQogICAgICAgICAgc2NyZWVuIG1vdmUgMTAgICAgICAgICAgICAgICAgOyBNb3ZlIHRvIGxpbmUgMTAKICAgICAgICAgIHNjcmVlbiBjbGVvbCAgICAgICAgICAgICAgICAgIDsgQ2xlYXIgdGhpcyBsaW5lCiAgICAgICAgICBnZXRjIFwlYyB7WW91ciBjaG9pY2U6IH0gICAgICA7IFByb21wdCBhbmQgZ2V0IGFuZCBlY2hvIDEgY2hhcmFjdGVyCiAgICAgICAgICB4ZWNobyBcJWMKICAgICAgICAgIGlmICggbm90IG51bWVyaWMgXCVjICkgeyBtc2cge05vdCBudW1lcmljIC0gIlwlYyJ9IDEyLCBjb250aW51ZSB9CiAgICAgICAgICBpZiAoID49IFwlYyAxICYmIDw9IFwlYyAzICkgYnJlYWsKICAgICAgICAgIG1zZyB7T3V0IG9mIHJhbmdlIC0gIlwlYyJ9IDEyCiAgICAgIH0KICAgICAgc3dpdGNoIFwlYyB7ICAgICAgICAgICAgICAgICAgICAgIDsgVmFsaWQgY2hvaWNlIC0gZXhlY3V0ZSBpdC4KICAgICAgICA6MSwgbXNnIHtGaWxpbmcuLi4gfSAxMiwgYnJlYWsKICAgICAgICA6MiwgbXNnIHtFZGl0aW5nLi4ufSAxMiwgYnJlYWsKICAgICAgICA6MywgbXNnIHtFeGl0aW5nLi4ufSAxMiwgYnJlYWsKICAgICAgfQogIH0KICBlY2hvIEJ5ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgRXhpdCBjaG9zZW4gLSBzYXkgZ29vZGJ5ZS4KICBib3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTGVhdmUgY3Vyc29yIGF0IHNjcmVlbiBib3R0b20uCiAgZXhpdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IEFuZCBleGl0LgoKICAgU2ltaWxhciBzY3JpcHRzIGNhbiB3b3JrIG92ZXIgdGhlIGNvbW11bmljYXRpb24gY29ubmVjdGlvbjsgc3Vic3RpdHV0ZQogICBJTlBVVCBhbmQgT1VUUFVUIGZvciBHRVRDIGFuZCBFQ0hPL1hFQ0hPLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDcuMjIuIEV2YWx1YXRpbmcgQXJpdGhtZXRpYyBFeHByZXNzaW9ucwoKICAgQSBuZXcgYXJpdGhtZXRpYyBvcGVyYXRvciB3YXMgYWRkZWQgdG8gdGhlIGxpc3QgcmVjb2duaXplZCBieSB0aGUKICAgRVZBTFVBVEUgY29tbWFuZCwgdGhlIFxmZXZhbCgpIGZ1bmN0aW9uLCBhbmQgd2hpY2ggY2FuIGFsc28gYmUgdXNlZAogICBhbnl3aGVyZSBlbHNlIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMgYXJlIGFjY2VwdGVkIChudW1lcmljIGNvbW1hbmQKICAgZmllbGRzLCBhcnJheSBzdWJzY3JpcHRzLCBldGMpOgoKICAgUHJlZml4ICIhIgogICAgICAgICAgVGhpcyBvcGVyYXRvciBpbnZlcnRzIHRoZSAidHJ1dGggdmFsdWUiIG9mIHRoZSBudW1iZXIgb3IKICAgICAgICAgIGFyaXRobWV0aWMgZXhwcmVzc2lvbiB0aGF0IGZvbGxvd3MuIElmIHRoZSB2YWx1ZSBvZiB0aGUgb3BlcmFuZAogICAgICAgICAgaXMgMCwgdGhlIHJlc3VsdCBpcyAxLiBJZiB0aGUgdmFsdWUgaXMgbm9uemVybywgdGhlIHJlc3VsdCBpcwogICAgICAgICAgMC4KCiAgIEV4YW1wbGVzOgoKICBzZXQgZXZhbCBvbGQKICBldmFsdWF0ZSAwCiAgMAoKICBldmFsdWF0ZSAhMAogIDEKCiAgZXZhbHVhdGUgITMKICAwCgogIGV2YWx1YXRlICEoLTMpCiAgMAoKICAuXCVhID0gMQogIC5cJWIgPSAwCiAgZXZhbHVhdGUgIShcJWF8XCViKQogIDAKCiAgZXZhbHVhdGUgIShcJWEmXCViKQogIDEKCiAgZXZhbHVhdGUgISghKFwlYSZcJWIpKQogIDAKCiAgIE5vdGUgdGhlIGRpc3RpbmN0aW9uIGJldHdlZW4gUHJlZml4ICEgKGludmVydCB0cnV0aCB2YWx1ZSkgYW5kIFN1ZmZpeAogICAhIChmYWN0b3JpYWwpLiBBbHNvIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFByZWZpeCAhIGFuZCBQcmVmaXggfgogICAod2hpY2ggaW52ZXJ0cyBhbGwgdGhlIGJpdHMgaW4gaXRzIG9wZXJhbmQpLiBBbHNvIG5vdGUgdGhhdCBwcmVmaXgKICAgb3BlcmF0b3JzICghLCAtLCBhbmQgfikgY2FuIG5vdCBiZSBhZGphY2VudCB1bmxlc3MgeW91IHVzZSBwYXJlbnRoZXNlcwogICB0byBzZXBhcmF0ZSB0aGVtLCBhcyBzaG93biBpbiB0aGUgZmluYWwgZXhhbXBsZSBhYm92ZS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjIzLiBGbG9hdGluZy1Qb2ludCBBcml0aG1ldGljCgogICBDLUtlcm1pdCA3LjAgYWRkcyBsaW1pdGVkIHN1cHBvcnQgZm9yIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgKG51bWJlcnMKICAgdGhhdCBoYXZlIGZyYWN0aW9uYWwgcGFydHMsIGxpa2UgMy4xNDE1OTI2NTMpLiBUaGlzIHN1cHBvcnQgaXMKICAgcHJvdmlkZWQgdGhyb3VnaCBhIHNtYWxsIHJlcGVydG9pcmUgb2YgZnVuY3Rpb25zIGFuZCBpbiBCb29sZWFuCiAgIGV4cHJlc3Npb25zIHRoYXQgY29tcGFyZSBudW1iZXJzLCBidXQgZG9lcyBub3QgYXBwbHkgdG8gbnVtYmVyIHBhcnNpbmcKICAgaW4gZ2VuZXJhbCwgb3IgdG8gZXhwcmVzc2lvbiBldmFsdWF0aW9uLCBhcnJheSBzdWJzY3JpcHRzLCB0aGUKICAgSU5DUkVNRU5UIGFuZCBERUNSRU1FTlQgY29tbWFuZHMsIG9yIGluIGFueSBjb250ZXh0IG90aGVyIHRoYW4gdGhvc2UKICAgbGlzdGVkIGluIHRoaXMgc2VjdGlvbi4KCiAgIEEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGhhcyBhbiBvcHRpb25hbCBzaWduICgrIG9yIC0pLCBmb2xsb3dlZCBieSBhCiAgIHNlcmllcyBvZiBkZWNpbWFsIGRpZ2l0cyBjb250YWluaW5nIGVpdGhlciB6ZXJvIG9yIG9uZSBwZXJpb2QgKC4pCiAgIGNoYXJhY3Rlciwgd2hpY2ggaXMgdGhlIGRlY2ltYWwgcG9pbnQuIFRoZSB1c2Ugb2YgY29tbWEgb3IgYW55IG90aGVyCiAgIGNoYXJhY3RlciBiZXNpZGVzIHBlcmlvZCBhcyBhIGRlY2ltYWwgcG9pbnQgaXMgbm90IHN1cHBvcnRlZC4KICAgU2NpZW50aWZpYyBub3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGVpdGhlci4gRXhhbXBsZXMgb2YgbGVnYWwKICAgZmxvYXRpbmctcG9pbnQgbnVtYmVyczoKCiAgMCAgICAgICAgICAgICAgICBJbnRlZ2VycyBjYW4gYmUgdXNlZAogIDEgICAgICAgICAgICAgICAgRGl0dG8KICAyLiAgICAgICAgICAgICAgIEEgZGVjaW1hbCBwb2ludCB3aXRob3V0IGRlY2ltYWwgZGlnaXRzCiAgMy4wICAgICAgICAgICAgICBBIGRlY2ltYWwgcG9pbnQgd2l0aCBkZWNpbWFsIGRpZ2l0cwogIDMuMTQxNTkyNjUzICAgICAgRGl0dG8KIC00LjAgICAgICAgICAgICAgIEEgbmVnYXRpdmUgc2lnbiBjYW4gYmUgaW5jbHVkZWQKICs1LjAgICAgICAgICAgICAgIEEgcG9zaXRpdmUgc2lnbiBjYW4gYmUgaW5jbHVkZWQKCiAgIEV4YW1wbGVzIG9mIG5vdGF0aW9ucyB0aGF0IGFyZSBub3QgYWNjZXB0ZWQ6CgogIDEsMDAwLDAwMCAgICAgICAgU2VwYXJhdG9ycyBjYW4gbm90IGJlIHVzZWQKICAxLjAwMC4wMDAgICAgICAgIERpdHRvIChvciBtdWx0aXBsZSBkZWNpbWFsIHBvaW50cykKICA2LjAyMjEzN0UyMyAgICAgIE5vIHNjaWVudGlmaWMgbm90YXRpb24KICA2LjYyNjA2ODY4ZS0zNCAgIERpdHRvCiAgMTIuNSs2LjI1ICAgICAgICBObyAiYmFyZSIgZXhwcmVzc2lvbnMKCiAgIFlvdSBjYW4gdXNlIElGIEZMT0FUIHRlc3QgYSBzdHJpbmcgb3IgdmFyaWFibGUgdG8gc2VlIGlmIGl0J3MgaW4KICAgYWNjZXB0YWJsZSBmbG9hdGluZy1wb2ludCBmb3JtYXQuIEV4YW1wbGU6CgogIGFzayBcJWYgeyBUeXBlIGEgbnVtYmVyOiB9CiAgaWYgbm90IGRlZiBcJWYgLlwlZiA9IDAuMAogIGlmIG5vdCBmbG9hdCBcJWYgc3RvcCAxIEludmFsaWQgZmxvYXRpbmctcG9pbnQgbnVtYmVyOiAiXCVmIgoKICAgQy1LZXJtaXQncyBmbG9hdGluZy1wb2ludCBzdXBwb3J0LCBsaWtlIGl0cyBzdXBwb3J0IGZvciB3aG9sZSBudW1iZXJzCiAgIChpbnRlZ2VycyksIHJlbGllcyBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSB1bmRlcmx5aW5nIGNvbXB1dGVyLgogICBZb3VyIGNvbXB1dGVyIGhhcyBvbmx5IGEgbGltaXRlZCBhbW91bnQgb2YgcHJlY2lzaW9uIGZvciBudW1iZXJzLAogICBkZXBlbmRpbmcgb24gaXRzIGFyY2hpdGVjdHVyZS4gVGh1cyBmbG9hdGluZy1wb2ludCBudW1iZXJzIHRoYXQgaGF2ZQogICB0b28gbWFueSBkaWdpdHMgd2lsbCBub3QgYmUgYWNjdXJhdGU7IGFkZGluZyBhIHZlcnkgc21hbGwgbnVtYmVyIHRvIGEKICAgdmVyeSBsYXJnZSBvbmUgbWlnaHQgaGF2ZSBubyBlZmZlY3QgYXQgYWxsOyBhbmQgc28gb24uIEZvciBkZXRhaWxzLAogICByZWFkIGEgdGV4dCBvbiBudW1lcmljYWwgYW5hbHlzaXMuIEV4YW1wbGU6CgogIC5cJWEgPSAxMTExMTExMTExMTExMTExMTExMSAgOyBBIGxvbmcgbnVtYmVyCiAgLlwlYiA9IDIyMjIyMjIyMjIyMjIyMjIyMjIyICA7IEFub3RoZXIgb25lCiAgZWNobyBcZmZwYWRkKFwlYSxcJWIpICAgICAgICA7IEFkZCB0aGVtIC0gdGhlIHJlc3VsdCBzaG91bGQgYmUgYWxsIDMncwogIDMzMzMzMzMzMzMzMzMzMzMwMDAwLjAgICAgICAgOyBTZWUgdGhlIHJlc3VsdAoKICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgY29tcHV0ZXIgaGFzIDE2IGRpZ2l0cyBvZiBwcmVjaXNpb247IGFmdGVyIHRoYXQsCiAgIHRoZSAobG93LW9yZGVyKSBkaWdpdHMgYXJlIHNldCB0byAwLCBzaW5jZSB0aGUgY29tcHV0ZXIgZG9lc24ndCBrbm93CiAgIHdoYXQgdGhleSByZWFsbHkgYXJlLiBJbiBmYWN0LCB0aGUgY29tcHV0ZXIgcmV0dXJucyByYW5kb20gZGlnaXRzLCBidXQKICAgS2VybWl0IHNldHMgYWxsIGRpZ2l0cyBiZXlvbmQgdGhlIGNvbXB1dGVyJ3MgcHJlY2lzaW9uIHRvIDAuCgogICBDLUtlcm1pdCdzIGZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyBoYXZlIG5hbWVzIG9mIHRoZSBmb3JtCiAgICJcZmZweHh4KGFyZ3MpIiAoIlxmIiBmb3IgZnVuY3Rpb24sICJmcCIgZm9yIGZsb2F0aW5nLXBvaW50KSwgd2hlcmUKICAgInh4eCIgaXMgcmVwbGFjZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLCBzdWNoIGFzICJzcXJ0IiwgYW5kCiAgICJhcmdzIiBpcyB0aGUgYXJndW1lbnQgbGlzdCwgY29uc2lzdGluZyBvZiBvbmUgb3IgdHdvIGZsb2F0aW5nLXBvaW50CiAgIG51bWJlcnMgKGRlcGVuZGluZyBvbiB0aGUgZnVuY3Rpb24pLCBhbmQgYW4gb3B0aW9uYWwgImQiIGFyZ3VtZW50IHRoYXQKICAgc2F5cyBub3cgbWFueSBkZWNpbWFsIHBsYWNlcyBzaG91bGQgYmUgc2hvd24gaW4gdGhlIHJlc3VsdC4gRXhhbXBsZToKCiAgXGZmcGRpdigxMCwzLDEpIHJldHVybnMgIjMuMyIKICBcZmZwZGl2KDEwLDMsMikgcmV0dXJucyAiMy4zMyIKICBcZmZwZGl2KDEwLDMsMykgcmV0dXJucyAiMy4zMzMiCgogICBhbmQgc28gb24sIHVwIHRvIHRoZSBwcmVjaXNpb24gb2YgdGhlIGNvbXB1dGVyLiBJZiB0aGUgZGVjaW1hbC1wbGFjZXMKICAgYXJndW1lbnQgaXMgbGVzcyB0aGFuIHplcm8sIHRoZSBmcmFjdGlvbmFsIHBhcnQgb2YgdGhlIHJlc3VsdCBpcwogICB0cnVuY2F0ZWQ6CgogIFxmZnBkaXYoMTAsMywtMSkgcmV0dXJucyAiMyIuCgogICBJZiB0aGUgZGVjaW1hbC1wbGFjZXMgYXJndW1lbnQgaXMgMCwgb3IgaXMgb21pdHRlZCwgQy1LZXJtaXQgcmV0dXJucwogICBhcyBtYW55IGRlY2ltYWwgcGxhY2VzIGFzIGFyZSBtZWFuaW5nZnVsIGluIHRoZSBjb21wdXRlcidzCiAgIGZsb2F0aW5nLXBvaW50IHByZWNpc2lvbiwgdHJ1bmNhdGluZyBhbnkgZXh0cmFuZW91cyB0cmFpbGluZyAwJ3M6CgogIFxmZnBkaXYoMTAsOCkgcmV0dXJucyAiMS4yNSIuCiAgXGZmcGRpdigxMCw0KSByZXR1cm5zICIyLjUiLgogIFxmZnBkaXYoMTAsMikgcmV0dXJucyAiNS4wIi4KICBcZmZwZGl2KDEwLDMpIHJldHVybnMgIjMuMzMzMzMzMzMzMzMzMzMzIiAoZm9yIDE2LWRpZ2l0IHByZWNpc2lvbikuCgogICBUaGVyZSBpcyBubyB3YXkgdG8gcmVxdWVzdCB0aGF0IGEgZmxvYXRpbmctcG9pbnQgZnVuY3Rpb24gcmV0dXJuIGEKICAgZGVjaW1hbCBwb2ludCBidXQgbm8gZGVjaW1hbCBwbGFjZXMuIEhvd2V2ZXIsIHRoaXMgaXMgZWFzeSBlbm91Z2ggdG8KICAgYWNjb21wbGlzaCBpbiBvdGhlciB3YXlzLCBmb3IgZXhhbXBsZSBieSBzdXBwbHlpbmcgaXQgb3V0c2lkZSB0aGUKICAgZnVuY3Rpb24gY2FsbDoKCiAgZWNobyBcZmZwYWRkKFwlYSxcJWIsLTEpLgoKICAgS2VybWl0J3MgZmxvYXRpbmctcG9pbnQgZnVuY3Rpb25zIGFsd2F5cyByb3VuZCB0aGUgcmVzdWx0IGZvciB0aGUKICAgcmVxdWVzdGVkIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB3aGVuIHRoZSAiZCIgYXJndW1lbnQgaXMgZ2l2ZW4gYW5kCiAgIGhhcyBhIHZhbHVlIGdyZWF0ZXIgdGhhbiAwIChzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIFxmZnByb3VuZCgpIGp1c3QKICAgYmVsb3cpLgoKICAgRmxvYXRpbmctcG9pbnQgYXJndW1lbnRzIGNhbiBiZSBjb25zdGFudHMgaW4gZmxvYXRpbmctcG9pbnQgZm9ybWF0IG9yCiAgIHZhcmlhYmxlcyB3aG9zZSB2YWx1ZXMgYXJlIGZsb2F0aW5nLXBvaW50IG51bWJlcnMuIElmIGEgZmxvYXRpbmctcG9pbnQKICAgYXJndW1lbnQgaXMgb21pdHRlZCwgb3IgaXMgYSB2YXJpYWJsZSB3aXRoIG5vIHZhbHVlLCAwLjAgaXMgc3VwcGxpZWQKICAgYXV0b21hdGljYWxseS4gRXhhbXBsZToKCiAgZGVmIFwleCA5OTkuOTk5CiAgdW5kZWYgXCV5CiAgZWNobyBcZmZwbWluKFwleCxcJXkpCiAgMC4wCgogICBPciBlcXVpdmFsZW50bHk6CgogIGVjaG8gXGZmcG1pbig5OTkuOTk5KQogIDAuMAoKICAgVGhlIGZsb2F0aW5nLXBvaW50IGZ1bmN0aW9ucyBhcmU6CgogICBcZmZwcm91bmQoZjEsZCkKICAgICAgICAgIFJldHVybnMgZjEgcm91bmRlZCB0byBkIGRlY2ltYWwgcGxhY2VzLiBGb3IgdGhpcyBmdW5jdGlvbiBvbmx5LAogICAgICAgICAgZCA9IDAgKG9yIGQgb21pdHRlZCkgaGFzIGEgc3BlY2lhbCBtZWFuaW5nOiByZXR1cm4gdGhlIGludGVnZXIKICAgICAgICAgIHBhcnQgb2YgZjEgcm91bmRlZCBhY2NvcmRpbmcgdG8gdGhlIGZyYWN0aW9uYWwgcGFydC4gRXhhbXBsZXM6CgogIFxmZnByb3VuZCgyLjc0NjUzLC0xKSByZXR1cm5zICIyIiAoZnJhY3Rpb24gdHJ1bmNhdGVkLCBubyByb3VuZGluZykuCiAgXGZmcHJvdW5kKDIuNzQ2NTMsMCkgIHJldHVybnMgIjMiIChpbnRlZ2VyIHBhcnQgaXMgcm91bmRlZCkuCiAgXGZmcHJvdW5kKDIuNzQ2NTMpICAgIHJldHVybnMgIjMiIChkIG9taXR0ZWQgc2FtZSBhcyBkID0gMCkuCiAgXGZmcHJvdW5kKDIuNzQ2NTMsMSkgIHJldHVybnMgIjIuNyIuCiAgXGZmcHJvdW5kKDIuNzQ2NTMsMikgIHJldHVybnMgIjIuNzUiLgogIFxmZnByb3VuZCgyLjc0NjUzLDMpICByZXR1cm5zICIyLjc0NyIuCiAgXGZmcHJvdW5kKDIuNzQ2NTMsNCkgIHJldHVybnMgIjIuNzQ2NSIsIGV0Yy4KCiAgIFxmZnBhZGQoZjEsZjIsZCkKICAgICAgICAgIFJldHVybnMgdGhlIHN1bSBvZiBmMSBhbmQgZjIuCgogICBcZmZwc3VidHJhY3QoZjEsZjIsZCkKICAgICAgICAgIFN1YnRyYWN0cyBmMiBmcm9tIGYxIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCgogICBcZmZwbXVsdGlwbHkoZjEsZjIsZCkKICAgICAgICAgIFJldHVybnMgdGhlIHByb2R1Y3Qgb2YgZjEgYW5kIGYyLgoKICAgXGZmcGRpdmlkZShmMSxmMixkKQogICAgICAgICAgSWYgZjIgaXMgbm90IDAsIGRpdmlkZXMgZjEgYnkgZjIgYW5kIHJldHVybnMgdGhlIHF1b3RpZW50LgogICAgICAgICAgSWYgZjIgaXMgMCwgYSBESVZJREVfQllfWkVSTyBlcnJvciBvY2N1cnMuCgogICBcZmZwcmFpc2UoZjEsZjIsZCkKICAgICAgICAgIElmIGYxID0gMCBhbmQgZjIgPD0gMCwgb3IgaWYgZjEgPCAwIGFuZCBmMiBoYXMgYSBmcmFjdGlvbmFsCiAgICAgICAgICBwYXJ0LCBhbiBBUkdfT1VUX09GX1JBTkdFIGVycm9yIG9jY3Vyczsgb3RoZXJ3aXNlIGYxIHJhaXNlZCB0bwogICAgICAgICAgdGhlIGYyIHBvd2VyIGlzIHJldHVybmVkLgoKICAgXGZmcHNxcnQoZjEsZCkKICAgICAgICAgIElmIGYxID49IDAsIHJldHVybnMgdGhlIHNxdWFyZSByb290IG9mIGYxOyBvdGhlcndpc2UKICAgICAgICAgIEFSR19PVVRfT0ZfUkFOR0UuCgogICBcZmZwYWJzb2x1dGUoZjEsZCkKICAgICAgICAgIFJldHVybnMgdGhlIGFic29sdXRlIHZhbHVlIG9mIGYxIChpLmUuIGYxIHdpdGhvdXQgYSBzaWduKS4gVGhpcwogICAgICAgICAgaXMgdGhlIGZsb2F0aW5nLXBvaW50IGFuYWxvZyBvZiBcZmFic29sdXRlKG4xKS4KCiAgIFxmZnBpbnQoZjEpCiAgICAgICAgICBSZXR1cm5zIHRoZSBpbnRlZ2VyIHBhcnQgb2YgZjEuIEVxdWl2YWxlbnQgdG8gXGZmcHJvdW5kKGYxLC0xKS4KCiAgIFxmZnBleHAoZjEsZCkKICAgICAgICAgIFRoZSBiYXNlIG9mIG5hdHVyYWwgbG9nYXJpdGhtcywgZSAoMi43MTgyODIuLi4pLCByYWlzZWQgdG8gdGhlCiAgICAgICAgICBmMSBwb3dlci4KCiAgIFxmZnBsb2duKGYxLGQpCiAgICAgICAgICBUaGUgbmF0dXJhbCBsb2dhcml0aG0gb2YgZjEgKHRoZSBwb3dlciB0byB3aGljaCBlIG11c3QgYmUKICAgICAgICAgIHJhaXNlZCB0byBvYnRhaW4gZjEpLgoKICAgXGZmcGxvZzEwKGYxLGQpCiAgICAgICAgICBUaGUgYmFzZS0xMCBsb2dhcml0aG0gb2YgZjEgKHRoZSBwb3dlciB0byB3aGljaCAxMCBtdXN0IGJlCiAgICAgICAgICByYWlzZWQgdG8gb2J0YWluIGYxKS4KCiAgIFxmZnBtb2R1bHVzKGYxLGYyLGQpCiAgICAgICAgICBJZiBmMiBpcyBub3QgMCwgdGhlIHJlbWFpbmRlciBhZnRlciBkaXZpZGluZyBmMSBieSBmMi4KICAgICAgICAgIElmIGYyIGlzIDAsIGEgRElWSURFX0JZX1pFUk8gZXJyb3Igb2NjdXJzLgogICAgICAgICAgVGhpcyBpcyB0aGUgZmxvYXRpbmctcG9pbnQgYW5hbG9nIG9mIFxmbW9kKG4xLG4yKS4KCiAgIFxmZnBtYXhpbXVtKGYxLGYyLGQpCiAgICAgICAgICBSZXR1cm5zIHRoZSBtYXhpbXVtIG9mIGYxIGFuZCBmMi4gVGhpcyBpcyB0aGUgZmxvYXRpbmctcG9pbnQKICAgICAgICAgIGFuYWxvZyBvZiBcZm1heChuMSxuMikuCgogICBcZmZwbWluaW11bShmMSxmMixkKQogICAgICAgICAgUmV0dXJucyB0aGUgbWluaW11bSBvZiBmMSBhbmQgZjIuIFRoaXMgaXMgdGhlIGZsb2F0aW5nLXBvaW50CiAgICAgICAgICBhbmFsb2cgb2YgXGZtaW4objEsbjIpLgoKICAgXGZmcHNpbmUoZjEsZCkKICAgICAgICAgIFJldHVybnMgdGhlIHNpbmUgb2YgZjEgcmFkaWFucy4KCiAgIFxmZnBjb3NpbmUoZjEsZCkKICAgICAgICAgIFJldHVybnMgdGhlIGNvc2luZSBvZiBmMSByYWRpYW5zLgoKICAgXGZmcHRhbmdlbnQoZjEsZCkKICAgICAgICAgIFJldHVybnMgdGhlIHRhbmdlbnQgb2YgZjEgcmFkaWFucy4KCiAgIE5vdGUgdGhhdCBhbGwgb2YgdGhlc2UgZnVuY3Rpb25zIGNhbiBiZSB1c2VkIHdpdGggaW50ZWdlciBhcmd1bWVudHMuCiAgIElmIHlvdSB3YW50IGFuIGludGVnZXIgcmVzdWx0LCBzcGVjaWZ5IGQgPSAtMSAodG8gdHJ1bmNhdGUpIG9yIGZlZWQKICAgdGhlIHJlc3VsdCB0byBcZmZwcm91bmQoeHh4LDApICh0byByb3VuZCkuCgogICBGbG9hdGluZy1wb2ludCBudW1iZXJzIChvciB2YXJpYWJsZXMgb3IgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIHRoZW0pCiAgIGNhbiBiZSB1c2VkIGluIEJvb2xlYW4gZXhwcmVzc2lvbnMgKHNlZSBbNjIyXVNlY3Rpb24gNy4yMC4yKSB0aGF0CiAgIGNvbXBhcmUgbnVtYmVyczoKCiAgPSB4IHkKICAhPSB4IHkKICA8IHggeQogID4geCB5CiAgPD0geCB5CiAgPj0geCB5CgogICBJbiB0aGVzZSBleGFtcGxlcywgeCBhbmQgeSBjYW4gYmUgZWl0aGVyIGludGVnZXJzIG9yIGZsb2F0aW5nLXBvaW50CiAgIG51bWJlcnMgaW4gYW55IGNvbWJpbmF0aW9uLiBJbiBhbiBhcml0aG1ldGljIGNvbXBhcmlzb24gb2YgYW4gaW50ZWdlcgogICBhbmQgYSBmbG9hdGluZy1wb2ludCBudW1iZXIsIHRoZSBpbnRlZ2VyIGlzIGNvbnZlcnRlZCB0bwogICBmbG9hdGluZy1wb2ludCBiZWZvcmUgdGhlIGNvbXBhcmlzb24gaXMgbWFkZS4gRXhhbXBsZXM6CgogIC5cJXQgPSAzLjAwMDAwMDAwMAogIC5cJWYgPSAzLjE0MTU5MjY1MwogIC5cJWkgPSAzCgogIGlmID4gXCVmIFwlaSBlY2hvIFBpIGlzIGdyZWF0ZXIuCiAgaWYgPSBcJXQgXCVpIGVjaG8gIlwlaSIgPSAiXCV0Ii4KCiAgIEEgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGNhbiBhbHNvIGJlIHVzZWQgaW46CgogIElGIG51bWJlciBjb21tYW5kCgogICB3aGVyZSB0aGUgY29tbWFuZCBpcyBleGVjdXRlZCBpZiB0aGUgbnVtYmVyIGlzIG5vbnplcm8uIElmIHRoZSBudW1iZXIKICAgaXMgZmxvYXRpbmctcG9pbnQsIHRoZSBjb21tYW5kIGlzIG5vdCBleGVjdXRlZCBpZiB0aGUgbnVtYmVyIGlzIDAuMCwKICAgYW5kIGlzIGV4ZWN1dGVkIG90aGVyd2lzZS4KCiAgIEZsb2F0aW5nLXBvaW50IG51bWJlcnMgY2FuIGJlIHNvcnRlZCB1c2luZyBBUlJBWSBTT1JUIC9OVU1FUklDIChzZWUKICAgWzYyM11TZWN0aW9uIDcuMTAuNSApLgoKICAgVHdvIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50cyBhcmUgcHJvdmlkZWQ6CgogIFx2KG1hdGhfcGkpID0gUGkgKDMuMTQxNTkyNjUzLi4uKQogIFx2KG1hdGhfZSkgID0gZSwgdGhlIGJhc2Ugb2YgbmF0dXJhbCBsb2dhcml0aG1zICgyLjcxODI4Li4uKQoKICAgVGhlc2UgYXJlIGdpdmVuIHRvIHRoZSBjb21wdXRlcidzIHByZWNpc2lvbiwgZS5nLiAxNiBkaWdpdHMuIFRoaXMKICAgbnVtYmVyIGl0c2VsZiBpcyBhdmFpbGFibGUgaW4gYSB2YXJpYWJsZToKCiAgIFx2KG1hdGhfcHJlY2lzaW9uKQogICAgICAgICAgSG93IG1hbnkgc2lnbmlmaWNhbnQgZGlnaXRzIGluIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDcuMjQuIFRyYWNpbmcgU2NyaXB0IEV4ZWN1dGlvbgoKICAgVGhlIFRSQUNFIGNvbW1hbmQgaXMgaGFuZHkgZm9yIGRlYnVnZ2luZyBzY3JpcHRzLgoKICAgVFJBQ0UgWyB7IC9PTiwgL09GRiB9IF0gWyB7IEFTU0lHTk1FTlRTLCBDT01NQU5ELUxFVkVMLCBBTEwgfSBdCiAgICAgICAgICBTZWxlY3RzIHRyYWNpbmcgb2YgdGhlIGdpdmVuIG9iamVjdC4KCiAgIE9wdGlvbmFsIHN3aXRjaGVzIGFyZSAvT04gYW5kIC9PRkYuIElmIG5vIHN3aXRjaCBpcyBnaXZlbiwgL09OIGlzCiAgIGltcGxpZWQuIFRoZSB0cmFjZSBvYmplY3RzIGFyZSBBU1NJR05NRU5UUywgQ09NTUFORC1MRVZFTCwgYW5kIEFMTC4KICAgVGhlIGRlZmF1bHQgb2JqZWN0IGlzIEFMTCwgbWVhbmluZyB0byBzZWxlY3QgYWxsIHRyYWNlIG9iamVjdHMKICAgKGJlc2lkZXMgQUxMKS4gVGh1cyBUUkFDRSBieSBpdHNlbGYgc2VsZWN0cyB0cmFjaW5nIG9mIGV2ZXJ5dGhpbmcsIGFzCiAgIGRvZXMgVFJBQ0UgL09OLCBhbmQgVFJBQ0UgL09GRiB0dXJucyBvZmYgYWxsIHRyYWNpbmcuCgogICBXaGVuIHRyYWNpbmcgb2YgQVNTSUdOTUVOVFMgaXMgb24sIGV2ZXJ5IHRpbWUgdGhlIHZhbHVlIG9mIGFueQogICB1c2VyLWRlZmluZWQgdmFyaWFibGUgb3IgbWFjcm8gY2hhbmdlcywgQy1LZXJtaXQgcHJpbnRzIG9uZSBvZiB0aGUKICAgZm9sbG93aW5nOgoKICAgPj4+IG5hbWU6ICJ2YWx1ZSIKICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSBvciBtYWNybyBmb2xsb3dlZCBieSB0aGUgbmV3IHZhbHVlIGluCiAgICAgICAgICBxdW90ZXMuIFRoaXMgaW5jbHVkZXMgaW1wbGljaXQgbWFjcm8tcGFyYW1ldGVyIGFzc2lnbm1lbnRzCiAgICAgICAgICBkdXJpbmcgbWFjcm8gaW52b2NhdGlvbi4KCiAgID4+PiBuYW1lOiAodW5kZWYpCiAgICAgICAgICBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB2YXJpYWJsZSBvciBtYWNybyBoYXMgYmVlbiB1bmRlZmluZWQuCgogICA8PDwgbmFtZTogInZhbHVlIgogICAgICAgICAgRm9yIFJFVFVSTiBzdGF0ZW1lbnRzOiB0aGUgbmFtZSBvZiB0aGUgbWFjcm8gYW5kIHRoZSByZXR1cm4KICAgICAgICAgIHZhbHVlLgoKICAgPDw8IG5hbWU6IChudWxsKQogICAgICAgICAgRm9yIFJFVFVSTiBzdGF0ZW1lbnRzIHRoYXQgaW5jbHVkZSBubyB2YWx1ZSBvciBhbiBlbXB0eSB2YWx1ZS4KCiAgIFdoZW4gdHJhY2luZyBvZiBDT01NQU5ELUxFVkVMIGlzIG9uLCBDLUtlcm1pdCBwcmludHM6CgogICBbbl0gK0Y6ICJuYW1lIgogICAgICAgICAgV2hlbmV2ZXIgYSBjb21tYW5kIGZpbGUgaXMgZW50ZXJlZCwgd2hlcmUgIm4iIGlzIHRoZSBjb21tYW5kCiAgICAgICAgICBsZXZlbCAoMCA9IHRvcCk7IHRoZSBuYW1lIG9mIHRoZSBjb21tYW5kIGZpbGUgaXMgc2hvd24gaW4KICAgICAgICAgIHF1b3Rlcy4KCiAgIFtuXSArTTogIm5hbWUiCiAgICAgICAgICBXaGVuZXZlciBhIG1hY3JvIGlzIGVudGVyZWQ7ICJuIiBpcyB0aGUgY29tbWFuZCBsZXZlbC4gVGhlIG5hbWUKICAgICAgICAgIG9mIHRoZSBtYWNybyBpcyBzaG93biBpbiBxdW90ZXMuCgogICBbbl0gLUY6ICJuYW1lIgogICAgICAgICAgV2hlbmV2ZXIgYSBjb21tYW5kIGZpbGUgaXMgcmVlbnRlcmVkIGZyb20gYmVsb3csIHdoZW4gYSBtYWNybwogICAgICAgICAgb3IgY29tbWFuZCBmaWxlIHRoYXQgaXQgaGFzIGludm9rZWQgaGFzIHJldHVybmVkLgoKICAgW25dIC1NOiAibmFtZSIKICAgICAgICAgIFdoZW5ldmVyIGEgbWFjcm8gaXMgcmVlbnRlcmVkIGZyb20gYmVsb3cuCgogICBGb3Igb3RoZXIgZGVidWdnaW5nIHRvb2xzLCBzZWUgU0hPVyBBUkdTLCBTSE9XIFNUQUNLLCBTRVQgVEFLRSwgU0VUCiAgIE1BQ1JPLCBhbmQgb2YgY291cnNlLCBFQ0hPLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDcuMjUuIENvbXBhY3QgU3Vic3RyaW5nIE5vdGF0aW9uCgogICBJdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZXh0cmFjdCBhIHN1YnN0cmluZyBmcm9tIGEgc3RyaW5nIHdoaWNoIGlzCiAgIHN0b3JlZCBpbiBhIHZhcmlhYmxlLCBhbmQgZm9yIHRoaXMgd2UgaGF2ZSB0aGUgXGZzdWJzdHJpbmcoKSBmdW5jdGlvbiwKICAgd2hpY2ggaXMgdXNlZCBsaWtlIHRoaXM6CgogIGRlZmluZSBcJWEgMTIzNDU2Nzg5MAogIGVjaG8gXGZzdWJzdHJpbmcoXCVhLDMsNCkgOyBzdWJzdHJpbmcgZnJvbSAzcmQgY2hhcmFjdGVyIGxlbmd0aCA0CiAgMzQ1NgoKICAgb3IgbGlrZSB0aGlzIHdpdGggbWFjcm8tbmFtZWQgdmFyaWFibGVzOgoKICBkZWZpbmUgc3RyaW5nIDEyMzQ1Njc4OTAKICBlY2hvIFxmc3Vic3RyaW5nKFxtKHN0cmluZyksMyw0KQogIDM0NTYKCiAgIEMtS2VybWl0IDcuMCBhZGRzIGEgcGFpciBvZiBhbHRlcm5hdGl2ZSBjb21wYWN0IG5vdGF0aW9uczoKClw6KHZhcmlhYmxlbmFtZVtzdGFydDpsZW5ndGhdKSAgPC0tIFN1YnN0cmluZyBvZiB2YXJpYWJsZSdzIHZhbHVlClxzKG1hY3JvbmFtZVtzdGFydDpsZW5ndGhdKSAgICAgPC0tIFN1YnN0cmluZyBvZiBtYWNybydzIGRlZmluaXRpb24KCiAgIFRoZXNlIGFyZSBleGFjdGx5IGVxdWl2YWxlbnQgdG8gdXNpbmcgXGZzdWJzdHJpbmcoKSwgZXhjZXB0IG1vcmUKICAgY29tcGFjdCB0byB3cml0ZSBhbmQgYWxzbyBmYXN0ZXIgc2luY2UgZXZhbHVhdGlvbiBpcyBpbiBvbmUgc3RlcAogICBpbnN0ZWFkIG9mIHR3by4KCiAgIFRoZSAiXDooKSIgbm90YXRpb24gY2FuIGJlIHVzZWQgd2l0aCBhbnkgS2VybWl0IHZhcmlhYmxlLCB0aGF0IGlzLAogICBhbG1vc3QgYW55dGhpbmcgdGhhdCBzdGFydHMgd2l0aCBhIGJhY2tzbGFzaDoKCiAgXDooXCVhWzI6Nl0pICAgICAgPC0tIGVxdWl2YWxlbnQgdG8gXGZzdWJzdHJpbmcoXCVhLDIsNikKICBcOihcJnhbMV1bMjo2XSkgICA8LS0gZXF1aXZhbGVudCB0byBcZnN1YnN0cmluZyhcJnhbMV0sMiw2KQogIFw6KFxtKGZvbylbMjo2XSkgIDwtLSBlcXVpdmFsZW50IHRvIFxmc3Vic3RyaW5nKFxtKGZvbyksMiw2KQogIFw6KFx2KHRpbWUpWzI6Nl0pIDwtLSBlcXVpdmFsZW50IHRvIFxmc3Vic3RyaW5nKFx2KHRpbWUpLDIsNikKICBcOihcJChURVJNKVsyOjZdKSA8LS0gZXF1aXZhbGVudCB0byBcZnN1YnN0cmluZyhcJChURVJNKSwyLDYpCiAgXDooQUJDREVGR0hbMjo2XSkgPC0tIGVxdWl2YWxlbnQgdG8gXGZzdWJzdHJpbmcoQUJDREVGR0gsMiw2KQoKICAgV2hhdGV2ZXIgYXBwZWFycyBiZXR3ZWVuIHRoZSBsZWZ0IHBhcmVudGhlc2lzIGFuZCB0aGUgbGVmdCBicmFja2V0IGlzCiAgIGV2YWx1YXRlZCBhbmQgdGhlbiB0aGUgaW5kaWNhdGVkIHN1YnN0cmluZyBvZiB0aGUgcmVzdWx0IGlzIHJldHVybmVkLgoKICAgVGhlICJccygpIiBub3RhdGlvbiBpcyB0aGUgc2FtZSwgZXhjZXB0IGFmdGVyIGV2YWx1YXRpbmcgdGhlIHZhcmlhYmxlLAogICB0aGUgcmVzdWx0IGlzIHRyZWF0ZWQgYXMgYSBtYWNybyBuYW1lIGFuZCBpcyBsb29rZWQgdXAgaW4gdGhlIG1hY3JvCiAgIHRhYmxlLiBUaGVuIHRoZSBpbmRpY2F0ZWQgc3Vic3RyaW5nIG9mIHRoZSBtYWNybyBkZWZpbml0aW9uIGlzCiAgIHJldHVybmVkLiBFeGFtcGxlOgoKICBkZWZpbmUgdGVzdGluZyBhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5egogIGRlZmluZSBcJWEgdGVzdGluZwoKICBccyh0ZXN0aW5nWzI6Nl0pICAtLT4gIGJjZGVmZwogIFw6KHRlc3RpbmdbMjo2XSkgIC0tPiAgZXN0aW5nCiAgXDooXCVhWzI6Nl0pICAgICAgLS0+ICBlc3RpbmcKICBccyhcJWFbMjo2XSkgICAgICAtLT4gIGJjZGVmZwoKICAgTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgdHdvIGV4YW1wbGVzIGFyZSBlcXVpdmFsZW50OgoKICBcOihcbShmb28pWzI6Nl0pCiAgXHMoZm9vWzI6Nl0pCgogICBUaGUgZmlyc3QgbnVtYmVyIGluIHRoZSBicmFja2V0cyBpcyB0aGUgMS1iYXNlZCBzdGFydGluZyBwb3NpdGlvbi4gSWYKICAgaXQgaXMgb21pdHRlZCwgb3IgbGVzcyB0aGFuIDEsIGl0IGlzIHRyZWF0ZWQgYXMgMS4gSWYgaXQgaXMgZ3JlYXRlcgogICB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgoKICAgVGhlIHNlY29uZCBudW1iZXIgaXMgdGhlIGxlbmd0aCBvZiB0aGUgZGVzaXJlZCBzdWJzdHJpbmcuIElmIHRoZQogICBzZWNvbmQgbnVtYmVyIGlzIG9taXR0ZWQsIGlzIGxlc3MgdGhhbiAwLCBvciB3b3VsZCBiZSBwYXN0IHRoZSBlbmQgb2YKICAgdGhlIHN0cmluZywgdGhlbiAidGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBzdHJpbmciIGlzIGFzc3VtZWQuIElmIGl0IGlzCiAgIDAsIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCgogICBJZiB0aGUgYnJhY2tldHMgYXJlIGVtcHR5IG9yIG9taXR0ZWQsIHRoZSBvcmlnaW5hbCBzdHJpbmcgaXMgcmV0dXJuZWQuCgogICBUaGUgc3RhcnRpbmcgcG9zaXRpb24gYW5kIGxlbmd0aCBuZWVkIG5vdCBiZSBsaXRlcmFsIG51bWJlcnM7IHRoZXkgY2FuCiAgIGFsc28gYmUgdmFyaWFibGVzLCBmdW5jdGlvbnMsIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMsIG9yIGV2ZW4gb3RoZXIKICAgXHMoKSBvciBcOigpIHF1YW50aXRpZXM7IGFueXRoaW5nIHRoYXQgZXZhbHVhdGVzIHRvIGEgbnVtYmVyLCBmb3IKICAgZXhhbXBsZToKCiAgXHMoYmxvY2tbMTAyNTpcZmhleDJuKFxzKGJsb2NrW1wlYjpcJW4rNF0pKS8yXSkKCiAgIFN5bnRhY3RpY2FsbHksIFxtKG5hbWUpIGFuZCBccyhuYW1lKSBkaWZmZXIgb25seSBpbiB0aGF0IHRoZSBzZXF1ZW5jZQogICBbKl0gYXQgdGhlIGVuZCBvZiB0aGUgbmFtZSAod2hlcmUgKiBpcyBhbnkgc2VxdWVuY2Ugb2YgMCBvciBtb3JlCiAgIGNoYXJhY3RlcnMpIGlzIHRyZWF0ZWQgYXMgc3Vic3RyaW5nIG5vdGF0aW9uIGluIFxzKG5hbWUpLCBidXQgaXMKICAgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBuYW1lIGluIFxtKG5hbWUpICh0byBzZWUgd2h5LCBzZWUgWzYyNF1TZWN0aW9uCiAgIDcuMTAuOSkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgNy4yNi4gTmV3IFdBSVQgQ29tbWFuZCBPcHRpb25zCgogICBUaGUgV0FJVCBjb21tYW5kIGhhcyBiZWVuIGV4dGVuZGVkIHRvIGFsbG93IHdhaXRpbmcgZm9yIGRpZmZlcmVudAogICBraW5kcyBvZiB0aGluZ3MgKGZvcm1lcmx5IGl0IG9ubHkgd2FpdGVkIGZvciBtb2RlbSBzaWduYWxzKS4gTm93IGl0CiAgIGFsc28gY2FuIHdhaXQgZm9yIGZpbGUgZXZlbnRzLgoKICAgIDcuMjYuMS4gV2FpdGluZyBmb3IgTW9kZW0gU2lnbmFscwoKICAgVGhlIHByZXZpb3VzIHN5bnRheDoKCiAgV0FJVCB0aW1lIHsgQ0QsIERTUiwgUlRTLCBSSSwgLi4uIH0KCiAgIGhhcyBjaGFuZ2VkIHRvOgoKICBXQUlUIHRpbWUgTU9ERU0tU0lHTkFMUyB7IENELCBEU1IsIFJUUywgUkksIC4uLiB9CgogICBIb3dldmVyLCB0aGUgcHJldmlvdXMgc3ludGF4IGlzIHN0aWxsIGFjY2VwdGVkLiBUaGUgYmVoYXZpb3IgaXMgdGhlCiAgIHNhbWUgaW4gZWl0aGVyIGNhc2UuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICA3LjI2LjIuIFdhaXRpbmcgZm9yIEZpbGUgRXZlbnRzCgogICBUaGUgbmV3IFdBSVQgb3B0aW9uOgoKICBXQUlUIHRpbWUgRklMRSB7IENSRUFUSU9OLCBERUxFVElPTiwgTU9ESUZJQ0FUSU9OIH0gZmlsZW5hbWUKCiAgIGxldHMgeW91IHRlbGwgS2VybWl0IHRvIHdhaXQgdGhlIGdpdmVuIGFtb3VudCBvZiB0aW1lIChvciB1bnRpbCB0aGUKICAgZ2l2ZW4gdGltZSBvZiBkYXkpIGZvciBhIGZpbGUgd2hvc2UgbmFtZSBpcyBmaWxlbmFtZSB0byBiZSBjcmVhdGVkLAogICBkZWxldGVkLCBvciBtb2RpZmllZCwgcmVzcGVjdGl2ZWx5LiBUaGUgZmlsZW5hbWUgbWF5IG5vdCBjb250YWluCiAgIHdpbGRjYXJkcy4gSWYgdGhlIHNwZWNpZmllZCBldmVudCBkb2VzIG5vdCBvY2N1ciB3aXRoaW4gdGhlIHRpbWUKICAgbGltaXQsIG9yIGlmIFdBSVQgQ0FOQ0VMTEFUSU9OIGlzIE9OIGFuZCB5b3UgaW50ZXJydXB0IGZyb20gdGhlCiAgIGtleWJvYXJkIGJlZm9yZSB0aGUgdGltZSBpcyB1cCwgdGhlIFdBSVQgY29tbWFuZCBmYWlscy4gSWYgdGhlIGV2ZW50CiAgIGlzIE1PRElGSUNBVElPTiBhbmQgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZSBjb21tYW5kIGZhaWxzLgogICBPdGhlcndpc2UsIGlmIHRoZSBnaXZlbiBldmVudCBvY2N1cnMgd2l0aGluIHRoZSB0aW1lIGxpbWl0LCB0aGUKICAgY29tbWFuZCBzdWNjZWVkcy4gRXhhbXBsZXM6CgogICBXQUlUIDYwMCBGSUxFIERFTEVUSU9OIG9vZmEudG1wCiAgICAgICAgICBXYWl0IHVwIHRvIDEwIG1pbnV0ZXMgZm9yIGZpbGUgb29mYS50bXAgdG8gZGlzYXBwZWFyLgoKICAgV0FJVCAyMzo1OTo1OSBGSUxFIE1PRCBvcmRlcnMuZGIKICAgICAgICAgIFdhaXQgdW50aWwganVzdCBiZWZvcmUgbWlkbmlnaHQgZm9yIHRoZSBvcmRlcnMuZGIgZmlsZSB0byBiZQogICAgICAgICAgY2hhbmdlZC4KCiAgIEV4YW1wbGU6IFN1cHBvc2UgeW91IHdhbnQgdG8gaGF2ZSB0aGUgY3VycmVudCBjb3B5IG9mIC9ldGMvbW90ZCBvbgogICB5b3VyIHNjcmVlbiBhdCBhbGwgdGltZXMsIGFuZCB5b3Ugd2FudCB0byBoZWFyIGEgYmVsbCB3aGVuZXZlciBpdAogICBjaGFuZ2VzOgoKICBkZWYgXCVmIC9ldGMvbW90ZCAgICAgICAgICAgICAgICAgICAgICA7IFRoZSBmaWxlIG9mIGludGVyZXN0LgogIHdoaWxlIDEgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDsgTG9vcCBmb3JldmVyLi4uCiAgICAgIGNscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBDbGVhciB0aGUgc2NyZWVuLgogICAgICBlY2hvIFwlZjogXHYoZGF0ZSkgXHYodGltZSkuLi4gICAgIDsgUHJpbnQgMi1saW5lIGhlYWRpbmcuLi4KICAgICAgZWNobwogICAgICBpZiAoIG5vdCBleGlzdCBcJWYgKSB7ICAgICAgICAgICAgIDsgSWYgZmlsZSBkb2Vzbid0IGV4aXN0LAogICAgICAgICAgZWNobyBcJWYgZG9lcyBub3QgZXhpc3QuLi4gICAgIDsgcHJpbnQgbWVzc2FnZSwKICAgICAgICAgIHdhaXQgNjAwIGZpbGUgY3JlYXQgXCVmICAgICAgICA7IGFuZCB3YWl0IGZvciBpdCB0byBhcHBlYXIuCiAgICAgICAgICBjb250aW51ZQogICAgICB9CiAgICAgIGJlZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTb21ldGhpbmcgbmV3IC0gYmVlcC4KICAgICAgdHlwZSAvaGVhZDpcdihyb3dzLTIpIFwlZiAgICAgICAgICA7IERpc3BsYXkgdGhlIGZpbGUKICAgICAgaWYgZmFpbCBleGl0IDEgXCVmOiBcZmVycnN0cmluZygpICA7IChjaGVja2luZyBmb3IgZXJyb3JzKS4KICAgICAgd2FpdCA5OTkgZmlsZSBtb2QgXCVmICAgICAgICAgICAgICA7IFdhaXQgZm9yIGl0IHRvIGNoYW5nZS4KICB9CgogICBUaGlzIG5vdGljZXMgd2hlbiB0aGUgZmlsZSBpcyBjcmVhdGVkLCBkZWxldGVkLCBvciBtb2RpZmllZCwgYW5kIGFjdHMKICAgb25seSB0aGVuIChvciB3aGVuIHlvdSBpbnRlcnJ1cHQgaXQgd2l0aCk7IHRoZSB0aW1lIHNob3duIGluIHRoZQogICBoZWFkaW5nIGlzIHRoZSB0aW1lIG9mIHRoZSBtb3N0IHJlY2VudCBldmVudCAoaW5jbHVkaW5nIHdoZW4gdGhlCiAgIHByb2dyYW0gc3RhcnRlZCkuCgogICBTZWUgWzYyNV1TZWN0aW9uIDEuMTAsIHdoZXJlIHRoZSBcdihrYmNoYXIpIHZhcmlhYmxlIGlzIGV4cGxhaW5lZC4KICAgVGhpcyBsZXRzIHlvdSBtb2RpZnkgYSBsb29wIGxpa2UgdGhlIG9uZSBhYm92ZSB0byBhbHNvIGFjY2VwdAogICBzaW5nbGUtY2hhcmFjdGVyIGNvbW1hbmRzLCB3aGljaCBpbnRlcnJ1cHQgdGhlIFdBSVQsIGFuZCBkaXNwYXRjaAogICBhY2NvcmRpbmdseS4gRm9yIGV4YW1wbGU6CgogIHdhaXQgOTk5IGZpbGUgbW9kIFwlZiAgICAgICAgICAgICAgOyBXYWl0IGZvciB0aGUgZmlsZSB0byBjaGFuZ2UuCiAgaWYgZGVmaW5lZCBcdihrYmNoYXIpIHsgICAgICAgICAgICA7IEludGVycnVwdGVkIGZyb20ga2V5Ym9hcmQ/CiAgICAgIHN3aXRjaCBcdihrYmNoYXIpIHsgICAgICAgICAgICA7IEhhbmRsZSB0aGUga2V5c3Ryb2tlLi4uCiAgICAgICAgOnEsIGV4aXQgICAgICAgICAgICAgICAgICAgICA7IFEgdG8gUXVpdAogICAgICAgIDpoLCBlY2hvIGJsYWggYmxhaCwgYnJlYWsgICAgOyBIIGZvciBIZWxwCiAgICAgICAgOmRlZmF1bHQsIGJlZXAsIGNvbnRpbnVlICAgICA7IEFueXRoaW5nIGVsc2UgYmVlcCBhbmQgaWdub3JlCiAgICAgIH0KICB9CgogICBUaGlzIGxldHMgeW91IHdyaXRlIGV2ZW50LWRyaXZlbiBhcHBsaWNhdGlvbnMgdGhhdCB3YWl0IGZvciB1cCB0bwogICB0aHJlZSBldmVudHMgYXQgb25jZTogYSBmaWxlIG9yIG1vZGVtIGV2ZW50LCBhIHRpbWVvdXQsIGFuZCBhCiAgIGtleXN0cm9rZS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA3LjI3LiBSZWxheGVkIEZPUiBhbmQgU1dJVENIIFN5bnRheAoKICAgRm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIGV4dGVuZGVkIElGIGFuZCBXSElMRSBzeW50YXgsIHRoZSBGT1IgYW5kCiAgIFNXSVRDSCBjb250cm9sIGxpc3RzIG1heSAoYnV0IG5lZWQgbm90IGJlKSBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlczoKCiAgRk9SICggXCVpIDEgXCVuIDEgKSB7IGNvbW1hbmQtbGlzdC4uLiB9CiAgU1dJVENIICggXCVjICkgeyBjb21tYW5kLWxpc3QuLi4gfQoKICAgSW4gdGhlIEZPUiBjb21tYW5kLCB0aGUgaW5jcmVtZW50IGl0ZW0gY2FuIGJlIG9taXR0ZWQgaWYgdGhlIGNvbnRyb2wKICAgbGlzdCBpcyBlbmNsb3NlZCBpbiBwYXJlbnRoZXNlcywgaW4gd2hpY2ggY2FzZSB0aGUgaW5jcmVtZW50IGRlZmF1bHRzCiAgIGFwcHJvcHJpYXRlbHkgdG8gMSBvciAtMSwgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGZpcnN0IHR3bwogICB2YXJpYWJsZXMuCgogICBBcyB3aXRoIElGLCB0aGUgcGFyZW50aGVzZXMgYXJvdW5kIHRoZSBGT1ItY29tbWFuZCBjb250cm9sIGxpc3QgbXVzdAogICBiZSBzZXQgb2ZmIGJ5IHNwYWNlcyAoaW4gdGhlIFNXSVRDSCBjb21tYW5kLCB0aGUgc3BhY2VzIGFyZSBub3QKICAgcmVxdWlyZWQgc2luY2UgdGhlIFNXSVRDSCBleHByZXNzaW9uIGlzIGEgc2luZ2xlIGFyaXRobWV0aWMKICAgZXhwcmVzc2lvbikuCgogICBBbHNvLCBvdXRlciBicmFjZXMgYXJvdW5kIHRoZSBjb21tYW5kIGxpc3QgYXJlIHN1cHBsaWVkIGF1dG9tYXRpY2FsbHkKICAgaWYgeW91IG9taXQgdGhlbSwgZS5nLjoKCiAgRk9SICggXCVpIDEgJW4gMSApIGVjaG8gXCVpCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgOC4gVVNJTkcgT1RIRVIgRklMRSBUUkFOU0ZFUiBQUk9UT0NPTFMKCiAgIEluIEMtS2VybWl0IDcuMCwgYWx0ZXJuYXRpdmUgcHJvdG9jb2xzIGNhbiBiZSBzZWxlY3RlZCB1c2luZyBzd2l0Y2hlcy4KICAgU3dpdGNoZXMgYXJlIGRlc2NyaWJlZCBpbiBbNjI2XVNlY3Rpb24gMS41OyB0aGUgdXNlIG9mCiAgIHByb3RvY29sLXNlbGVjdGlvbiBzd2l0Y2hlcyBpcyBkZXNjcmliZWQgaW4gWzYyN11TZWN0aW9uIDQuNy4xLgogICBFeGFtcGxlOgoKICBzZW5kIC9iaW5hcnkgL3Byb3RvY29sOnptb2RlbSB4LnRhci5negoKICAgTm90ZSB0aGF0IGZpbGUgdHJhbnNmZXIgcmVjb3Zlcnkgd29ya3Mgb25seSB3aXRoIEtlcm1pdCBhbmQgWm1vZGVtCiAgIHByb3RvY29scy4gV2l0aCBabW9kZW0sIHJlY292ZXJ5IGNhbiBiZSBpbml0aWF0ZWQgb25seSBieSB0aGUgc2VuZGVyLgoKICAgT25seSBwcmUtMTk4OCB2ZXJzaW9ucyBvZiB0aGUgcHVibGljbHktZGlzdHJpYnV0ZWQgc3ovcnogcHJvZ3JhbXMgdXNlCiAgIFN0YW5kYXJkIEkvTzsgdGhvc2UgcmVsZWFzZWQgbGF0ZXIgdGhhbiB0aGF0IGRvIG5vdCB1c2UgU3RhbmRhcmQgSS9PCiAgIGFuZCB0aGVyZWZvcmUgZG8gbm90IHdvcmsgd2l0aCBSRURJUkVDVC4gSG93ZXZlciwgT21lbiBUZWNobm9sb2d5IGRvZXMKICAgb2ZmZXIgYW4gdXAtdG8tZGF0ZSByZWRpcmVjdGFibGUgdmVyc2lvbiBjYWxsZWQgY3J6c3osIHdoaWNoIG11c3QgYmUKICAgbGljZW5zZWQgZm9yIHVzZToKCiAgICAgIlVuaXggQ3J6IGFuZCBDc3ogc3VwcG9ydCBYTU9ERU0sIFlNT0RFTSwgYW5kIFpNT0RFTSB0cmFuc2ZlcnMgd2hlbgogICAgIGNhbGxlZCBieSBkaWFsLW91dCBwcm9ncmFtcyBzdWNoIGFzIEtlcm1pdCBhbmQgY2VydGFpbiB2ZXJzaW9ucyBvZgogICAgIGN1KDEpLiBUaGV5IGFyZSBjbGllbnRzIGRlc2lnbmVkIGZvciB0aGlzIHVzZS4KCiAgICAgIkNyeiBhbmQgQ3N6IGFyZSBDb3B5cmlnaHRlZCBzaGFyZXdhcmUgcHJvZ3JhbXMuIFVzZSBvZiB0aGVzZQogICAgIHByb2dyYW1zIGJleW9uZCBhIGJyaWVmIGV2YWx1YXRpb24gcGVyaW9kIHJlcXVpcmVzIHJlZ2lzdHJhdGlvbi4KICAgICBQbGVhc2UgcHJpbnQgdGhlICJtYWlsZXIucnoiIGZpbGUsIGZpbGwgb3V0IHRoZSBmb3JtIGFuZCByZXR1cm4KICAgICBzYW1lIHdpdGggeW91ciByZWdpc3RyYXRpb24uIgoKICAgVG8gdXNlIHRoZSBjcnpzeiBwcm9ncmFtcyBhcyB5b3VyIGV4dGVybmFsIFhZWk1PREVNIHByb2dyYW1zIGluCiAgIEMtS2VybWl0LCBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgYm9vaywgYnV0IHB1dCBhICJjIiBiZWZvcmUKICAgZWFjaCBjb21tYW5kLCBlLmcuOgoKICBzZXQgcHJvdG9jb2wgem1vZGVtIHtjc3ogJXN9IHtjc3ogLWEgJXN9IGNyeiBjcnogY3J6IGNyegoKICAgVG8gdXNlIFptb2RlbSBwcm90b2NvbCBvdmVyIFRlbG5ldCBvciBvdGhlciBub24tdHJhbnNwYXJlbnQKICAgY29ubmVjdGlvbnMsIHlvdSBtaWdodCBuZWVkIHRvIGFkZCB0aGUgLWUgKEVzY2FwZSkgb3B0aW9uOgoKICBzZXQgcHJvdG9jb2wgem1vZGVtIHtjc3ogLWUgJXN9IHtjc3ogLWUgLWEgJXN9IGNyeiBjcnogY3J6IGNyegogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDkuIENPTU1BTkQtTElORSBPUFRJT05TCgogIDkuMC4gRXh0ZW5kZWQtRm9ybWF0IENvbW1hbmQtTGluZSBPcHRpb25zCgogICBTdGFuZGFyZCBVTklYIGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBhIHNpbmdsZSBsZXR0ZXIuIEMtS2VybWl0IGhhcwogICBydW4gb3V0IG9mIGxldHRlcnMsIHNvIG5ldyBvcHRpb25zIGFyZSBpbiBhIG5ldyBleHRlbmRlZCBmb3JtYXQ6CgogLS13b3JkWzphcmddCgogICB3aGVyZSBhIGtleXdvcmQgKHJhdGhlciB0aGFuIGEgc2luZ2xlIGxldHRlcikgc3BlY2lmaWVzIHRoZSBmdW5jdGlvbiwKICAgYW5kIGlmIGFuIGFyZ3VtZW50IGlzIHRvIGJlIGluY2x1ZGVkLCBpdCBpcyBzZXBhcmF0ZWQgYnkgYSBjb2xvbiAob3IKICAgZXF1YWwgc2lnbikuIE1vc3Qgb2YgdGhlIG5ldyBleHRlbmRlZC1mb3JtYXQgY29tbWFuZC1saW5lIG9wdGlvbnMgYXJlCiAgIG9ubHkgZm9yIHVzZSB3aXRoIHRoZSBJbnRlcm5ldCBLZXJtaXQgU2VydmljZSBEYWVtb247IHNlZSB0aGUKICAgWzYyOF1JS1NEIEFkbWluaXN0cmF0aW9uIEd1aWRlIGZvciBkZXRhaWxzLiBIb3dldmVyLCBzZXZlcmFsIG9mIHRoZW0KICAgYXJlIGFsc28gZ2VuZXJhbCBpbiBuYXR1cmU6CgogICAtLW5vaW50ZXJydXB0cwogICAgICAgICAgRGlzYWJsZXMga2V5Ym9hcmQgaW50ZXJydXB0cyB0aGF0IGFyZSBub3JtYWxseSBlbmFibGVkLCB3aGljaAogICAgICAgICAgYXJlIHVzdWFsbHkgQ3RybC1DICh0byBpbnRlcnJ1cHQgYSBjb21tYW5kKSBhbmQgQ3RybC1aIChVTklYCiAgICAgICAgICBvbmx5LCB0byBzdXNwZW5kIEMtS2VybWl0KS4KCiAgIC0taGVscAogICAgICAgICAgTGlzdHMgdGhlIGV4dGVuZGVkIGNvbW1hbmQtbGluZSBvcHRpb25zIHRoYXQgYXJlIGF2YWlsYWJsZSBpbgogICAgICAgICAgeW91ciB2ZXJzaW9uIG9mIEMtS2VybWl0LiBJZiBhbnkgb3B0aW9ucyBzZWVtIHRvIGJlIG1pc3NpbmcsCiAgICAgICAgICB0aGF0IGlzIGJlY2F1c2UgeW91ciBjb3B5IG9mIEMtS2VybWl0IHdhcyBidWlsdCB3aXRoCiAgICAgICAgICBjb21waWxlLXRpbWUgb3B0aW9ucyB0byBkZXNlbGVjdCB0aGVtLgoKICAgLS1oZWxwZmlsZTpmaWxlbmFtZQogICAgICAgICAgU3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgZmlsZSB0byBiZSBkaXNwbGF5ZWQgaWYgdGhlIHVzZXIgdHlwZXMKICAgICAgICAgIEhFTFAgKG5vdCBmb2xsb3dlZCBieSBhIHNwZWNpZmljIGNvbW1hbmQgb3IgdG9waWMpLCBpbiBwbGFjZSBvZgogICAgICAgICAgdGhlIGJ1aWx0LWluIHRvcC1sZXZlbCBoZWxwIHRleHQuIFRoZSBmaWxlIG5lZWQgbm90IGZpdCBvbiBvbmUKICAgICAgICAgIHNjcmVlbjsgbW9yZS1wcm9tcHRpbmcgaXMgdXNlZCBpZiB0aGUgZmlsZSBpcyBtb3JlIHRoYW4gb25lCiAgICAgICAgICBzY3JlZW4gbG9uZyBpZiBDT01NQU5EIE1PUkUtUFJPTVBUSU5HIGlzIE9OLCBhcyBpdCBpcyBieQogICAgICAgICAgZGVmYXVsdC4KCiAgIC0tYmFubmVyZmlsZTpmaWxlbmFtZQogICAgICAgICAgVGhlIG5hbWUgb2YgYSBmaWxlIGNvbnRhaW5pbmcgYSBtZXNzYWdlIHRvIGJlIHByaW50ZWQgYWZ0ZXIgdGhlCiAgICAgICAgICB1c2VyIGxvZ3MgaW4sIGluIHBsYWNlIG9mIHRoZSBub3JtYWwgbWVzc2FnZSAoQ29weXJpZ2h0IG5vdGljZSwKICAgICAgICAgICJUeXBlIEhFTFAgb3IgPyBmb3IgaGVscCIsICJEZWZhdWx0IHRyYW5zZmVyIG1vZGUgaXMuLi4iLCBldGMpLgoKICAgLS1jZG1lc3NhZ2U6e29uLG9mZiwwLDEsMn0KICAgICAgICAgIEZvciB1c2UgaW4gdGhlIFNlcnZlci1TaWRlIFNlcnZlciBjb25maWd1cmF0aW9uOyB3aGVuZXZlciB0aGUKICAgICAgICAgIGNsaWVudCB0ZWxscyB0aGUgc2VydmVyIHRvIGNoYW5nZSBkaXJlY3RvcnksIHRoZSBzZXJ2ZXIgc2VuZHMKICAgICAgICAgIHRoZSBjb250ZW50cyBvZiBhICJyZWFkIG1lIiBmaWxlIHRvIHRoZSBjbGllbnQncyBzY3JlZW4uIFRoaXMKICAgICAgICAgIGZlYXR1cmUgaXMgT24gYnkgZGVmYXVsdCwgYW5kIG9wZXJhdGVzIG9ubHkgaW4gY2xpZW50L3NlcnZlcgogICAgICAgICAgbW9kZSB3aGVuIE9OIG9yIDEuIElmIHNldCB0byAyIG9yIGhpZ2hlciwgaXQgYWxzbyBvcGVyYXRlcyB3aGVuCiAgICAgICAgICB0aGUgQ0QgY29tbWFuZCBpcyBnaXZlbiBhdCB0aGUgSUtTRD4gcHJvbXB0LiBTeW5vbnltOiAtLWNkbXNnLgoKICAgLS1jZGZpbGU6ZmlsZW5hbWUKICAgICAgICAgIFdoZW4gY2RtZXNzYWdlIGlzIG9uLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSAicmVhZCBtZSIgZmlsZSB0bwogICAgICAgICAgYmUgc2VudC4gTm9ybWFsbHkgeW91IHdvdWxkIHNwZWNpZnkgYSByZWxhdGl2ZSAobm90IGFic29sdXRlKQogICAgICAgICAgbmFtZSwgc2luY2UgdGhlIGZpbGUgaXMgb3BlbmVkIHVzaW5nIHRoZSBsaXRlcmFsIG5hbWUgeW91CiAgICAgICAgICBzcGVjaWZpZWQsIGFmdGVyIGNoYW5naW5nIHRvIHRoZSBuZXcgZGlyZWN0b3J5LiBFeGFtcGxlOgoKICAtLWNkZmlsZTpSRUFELk1FCgogICAgICAgICAgWW91IGNhbiBhbHNvIGdpdmUgYSBsaXN0IG9mIHVwIHRvIDggZmlsZW5hbWVzIGJ5IChhKSBlbmNsb3NpbmcKICAgICAgICAgIGVhY2ggZmlsZW5hbWUgaW4gYnJhY2VzLCBhbmQgKGIpIGVuY2xvc2luZyB0aGUgZW50aXJlIGxpc3QgaW4KICAgICAgICAgIGJyYWNlcy4gRXhhbXBsZToKICAgICAgICAgIC0tY2RmaWxlOnt7Li8ucmVhZG1lfXtSRUFELk1FfXthYWFyZWFkbWUudHh0fXtSRUFETUV9e3JlYWQtdGhpcwogICAgICAgICAgLWZpcnN0fX0gV2hlbiBhIGxpc3QgaXMgZ2l2ZW4sIGl0IGlzIHNlYXJjaGVkIGZyb20gbGVmdCB0bwogICAgICAgICAgcmlnaHQgYW5kIHRoZSBmaXJzdCBmaWxlIGZvdW5kIGlzIGRpc3BsYXllZC4gVGhlIGRlZmF1bHQgbGlzdAogICAgICAgICAgZm9yIFVOSVggaXM6CgogIHt7Li8ucmVhZG1lfXtSRUFETUUuVFhUfXtSRUFELk1FfX0KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA5LjEuIENvbW1hbmQgTGluZSBQZXJzb25hbGl0aWVzCgogICBCZWdpbm5pbmcgaW4gdmVyc2lvbiA3LjAsIGlmIHRoZSBDLUtlcm1pdCBiaW5hcnkgaXMgcmVuYW1lZCB0bwogICAidGVsbmV0IiAob3IgVEVMTkVULkVYRSwgdGVsbmV0LnByLCBldGMsIGRlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0pLAogICBpdCBhY2NlcHRzIHRoZSBUZWxuZXQgY29tbWFuZCBsaW5lOgoKICB0ZWxuZXQgWyBob3N0IFsgcG9ydCBdIF0KCiAgIEluIFVuaXgsIHlvdSBjYW4gYWNoaWV2ZSB0aGUgc2FtZSBlZmZlY3Qgd2l0aCBhIHN5bWxpbms6CgogIGNkIC91c3IvYmluCiAgbXYgdGVsbmV0IG9sZHRlbG5ldAogIGxuIC1scyAvdXNyL2xvY2FsL2Jpbi9rZXJtaXQgdGVsbmV0CgogICBXaGVuIGluc3RhbGxlZCBpbiB0aGlzIG1hbm5lciwgQy1LZXJtaXQgYWx3YXlzIHJlYWRzIGl0cwogICBpbml0aWFsaXphdGlvbiBmaWxlLiBJZiBubyBob3N0IChhbmQgdGhlcmVmb3JlIG5vIHBvcnQpIGlzIGdpdmVuLAogICBDLUtlcm1pdCBzdGFydHMgaW4gaW50ZXJhY3RpdmUgcHJvbXB0aW5nIG1vZGUuIElmIGEgaG9zdCBpcyBnaXZlbiBhcwogICB0aGUgZmlyc3QgY29tbWFuZC1saW5lIGFyZ3VtZW50LCBDLUtlcm1pdCBtYWtlcyBhIGNvbm5lY3Rpb24gdG8gaXQuCiAgIFRoZSBob3N0IGFyZ3VtZW50IGNhbiBiZSBhbiBJUCBob3N0IG5hbWUgb3IgYWRkcmVzcywgb3IgdGhlIG5hbWUgb2YgYQogICBUQ1AvSVAgZW50cnkgaW4geW91ciBDLUtlcm1pdCBuZXR3b3JrIGRpcmVjdG9yeS4KCiAgIElmIGEgcG9ydCBpcyBnaXZlbiwgaXQgaXMgdXNlZC4gSWYgYSBwb3J0IGlzIG5vdCBnaXZlbiwgdGhlbiBpZiB0aGUKICAgaG9zdG5hbWUgd2FzIGZvdW5kIGluIHlvdXIgbmV0d29yayBkaXJlY3RvcnkgYW5kIHBvcnQgd2FzIGFsc28gbGlzdGVkCiAgIHRoZXJlLCB0aGVuIHRoYXQgcG9ydCBpcyB1c2VkLiBPdGhlcndpc2UgcG9ydCAyMyAodGhlIFRlbG5ldCBwb3J0KSBpcwogICB1c2VkLgoKICAgV2hlbiBDLUtlcm1pdCBpcyBjYWxsZWQgInRlbG5ldCIgYW5kIGl0IGlzIGludm9rZWQgd2l0aCBhIGhvc3RuYW1lIG9uCiAgIHRoZSBjb21tYW5kIGxpbmUsIGl0IGV4aXRzIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgY29ubmVjdGlvbiBpcwogICBjbG9zZWQuIFdoaWxlIHRoZSBjb25uZWN0aW9uIGlzIG9wZW4sIGhvd2V2ZXIsIHlvdSBtYXkgZXNjYXBlIGJhY2sgYW5kCiAgIGZvcnRoIGFzIG1hbnkgdGltZXMgYXMgeW91IGxpa2UsIHRyYW5zZmVyIGZpbGVzLCBldGMuCgogICBBbiBybG9naW4gcGVyc29uYWxpdHkgaXMgYWxzbyBhdmFpbGFibGUsIGJ1dCBpdCBpcyBsZXNzIHVzZWZ1bCwgYXQKICAgbGVhc3QgaW4gVU5JWCBhbmQgVk1TLCB3aGVyZSB0aGUgUmxvZ2luIFRDUCBwb3J0IGlzIHByaXZpbGVnZWQuCgogICBUaGUgbmV3IHZhcmlhYmxlIFx2KG5hbWUpIGluZGljYXRlcyB0aGUgbmFtZSB3aXRoIHdoaWNoIEMtS2VybWl0IHdhcwogICBpbnZva2VkICgia2VybWl0IiwgIndlcm1pdCIsICJrOTUiLCAidGVsbmV0IiwgZXRjKS4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICA5LjIuIEJ1aWx0LWluIEhlbHAgZm9yIENvbW1hbmQgTGluZSBPcHRpb25zCgogICAia2VybWl0IC1oIiwgZ2l2ZW4gZnJvbSB0aGUgc3lzdGVtIHByb21wdCwgbGlzdHMgYXMgbWFueSBjb21tYW5kLWxpbmUKICAgb3B0aW9ucyBhcyB3aWxsIGZpdCBvbiBhIHN0YW5kYXJkIDI0eDgwIHNjcmVlbi4gRm9yIG1vcmUgY29tcHJlaGVuc2l2ZQogICBoZWxwLCB1c2UgdGhlIGludGVyYWN0aXZlIEhFTFAgT1BUSU9OUyBjb21tYW5kIHRoYXQgd2FzIGFkZGVkIGluCiAgIEMtS2VybWl0IDcuMDoKCiAgIEhFTFAgT1BUSU9OUwogICBFeHBsYWlucyBob3cgY29tbWFuZC1saW5lIG9wdGlvbnMgd29yaywgdGhlaXIgc3ludGF4LCBldGMuCgogICBIRUxQIE9QVElPTlMgQUxMCiAgIExpc3RzIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucyBhbmQgZ2l2ZXMgYnJpZWYgaGVscCBhYm91dCBlYWNoIG9uZS4KCiAgIEhFTFAgT1BUSU9OIHgKICAgR2l2ZXMgYnJpZWYgaGVscCBhYm91dCBvcHRpb24gIngiLgoKICAgSEVMUCBFWFRFTkRFRC1PUFRJT05TCiAgIExpc3RzIHRoZSBhdmFpbGFibGUgZXh0ZW5kZWQtZm9ybWF0IGNvbW1hbmQtbGluZSBvcHRpb25zLgoKICAgSEVMUCBFWFRFTkRFRC1PUFRJT04geHh4CiAgIEdpdmVzIGhlbHAgZm9yIHRoZSBzcGVjaWZpZWQgZXh0ZW5kZWQgb3B0aW9uLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDkuMy4gTmV3IENvbW1hbmQtTGluZSBPcHRpb25zCgogICBDb21tYW5kLWxpbmUgb3B0aW9ucyBhZGRlZCBzaW5jZSBDLUtlcm1pdCA2LjAgYXJlOgoKICAgKwogICAgICAgICAgKHBsdXMgc2lnbiBieSBpdHNlbGYpOiBUaGUgbmV4dCBhcmd1bWVudCBpcyB0aGUgbmFtZSBvZiBhCiAgICAgICAgICBzY3JpcHQgdG8gZXhlY3V0ZTsgYWxsIHN1YnNlcXVlbnQgYXJndW1lbnRzIGFyZSBpZ25vcmVkIGJ5CiAgICAgICAgICBDLUtlcm1pdCBpdHNlbGYsIGJ1dCBwYXNzZWQgdG8gdGhlIHNjcmlwdCBhcyB0b3AtbGV2ZWwgY29waWVzCiAgICAgICAgICBvZiBcJTEsIFwlMiwgZXRjOyB0aGUgXCZfW10gaXMgYWxzbyBzZXQgYWNjb3JkaW5nbHkuIFwlMCBhbmQKICAgICAgICAgIFwmX1swXSBiZWNvbWUgdGhlIG5hbWUgb2YgdGhlIHNjcmlwdCBmaWxlLCByYXRoZXIgdGhhbiB0aGUKICAgICAgICAgIHBhdGhuYW1lIG9mIHRoZSBDLUtlcm1pdCBwcm9ncmFtLCB3aGljaCBpcyBpdHMgbm9ybWFsIHZhbHVlLgogICAgICAgICAgUHJpbWFyaWx5IGZvciB1c2UgaW4gdGhlIHRvcCBsaW5lIG9mICJLZXJiYW5nIiBzY3JpcHRzIGluIFVOSVgKICAgICAgICAgIChzZWUgWzYyOV1TZWN0aW9uIDcuMTkpLiBFeGFtcGxlIGZyb20gVU5JWCBjb21tYW5kIGxpbmU6CgogICQga2VybWl0IFsgcmVndWxhciBrZXJtaXQgYXJncyBdICsgZmlsZW5hbWUKCiAgICAgICAgICBTYW1wbGUgZmlyc3QgbGluZSBvZiBLZXJiYW5nIHNjcmlwdDoKCiAgIyEvdXNyL2xvY2FsL2Jpbi9rZXJtaXQgKwoKICAgLS0KICAgICAgICAgICh0d28gaHlwaGVucyBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UpIEVxdWl2YWxlbnQgdG8gIj0iLCBmb3IKICAgICAgICAgIGNvbXBhdGliaWxpdHkgd2l0aCBVTklYIGdldG9wdCgxLDMpLgoKICAgLUcKICAgICAgICAgIEdFVCAobGlrZSAtZyksIGJ1dCBzZW5kIHRoZSBpbmNvbWluZyBmaWxlIHRvIHN0YW5kYXJkIG91dHB1dC4KICAgICAgICAgIEV4YW1wbGU6ICJrZXJtaXQgLUcgb29mYS50eHQgfCBscHIiIHJldHJpZXZlcyBhIGZpbGUgZnJvbSB5b3VyCiAgICAgICAgICBsb2NhbCBjb21wdXRlciAocHJvdmlkaW5nIGl0IGlzIHJ1bm5pbmcgYSBLZXJtaXQgcHJvZ3JhbSB0aGF0CiAgICAgICAgICBzdXBwb3J0cyB0aGUgYXV0b2Rvd25sb2FkIGZlYXR1cmUgYW5kIGhhcyBpdCBlbmFibGVkKSBhbmQKICAgICAgICAgIHByaW50cyBpdC4KCiAgIC1PCiAgICAgICAgICBlcXVpdmFsZW50IHRvIC14IChzdGFydCB1cCBpbiBzZXJ2ZXIgbW9kZSksIGJ1dCBleGl0cyBhZnRlciB0aGUKICAgICAgICAgIGZpcnN0IGNsaWVudCBjb21tYW5kIGhhcyBiZWVuIGV4ZWN1dGVkIChtbmVtb25pYzogTyA9IE9ubHkKICAgICAgICAgIE9uZSkuIFRoaXMgb25lIGlzIGhhbmR5IHJlcGxhY2luZyAia2VybWl0IC14IiBpbiB0aGUKICAgICAgICAgICJhdXRvbWF0aWNhbGx5IHN0YXJ0IEtlcm1pdCBvbiB0aGUgb3RoZXIgZW5kIiBzdHJpbmc6CgogIHNldCBwcm90b2NvbCBrZXJtaXQge2tlcm1pdCAtaXJ9IHtrZXJtaXQgLXJ9IHtrZXJtaXQgLXh9CgogICAgICAgICAgc2luY2UgLXggbGVhdmVzIHRoZSByZW1vdGUgS2VybWl0IGluIHNlcnZlciBtb2RlIGFmdGVyIHRoZQogICAgICAgICAgdHJhbnNmZXIsIHdoaWNoIGNhbiBiZSBjb25mdXNpbmcsIHdoZXJlYXMgLU8gbWFrZXMgaXQgZ28gYXdheQogICAgICAgICAgYXV0b21hdGljYWxseSBhZnRlciB0aGUgdHJhbnNmZXIuCgogICAtTAogICAgICAgICAgUmVjdXJzaXZlLCB3aGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCAtcyAobW5lbW9uaWM6IEwgPQogICAgICAgICAgTGV2ZWxzKS4gSW4gVU5JWCBvciBvdGhlciBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIHNoZWxsIGV4cGFuZHMKICAgICAgICAgIHdpbGRjYXJkcyBpdHNlbGYsIHRoZSAtcyBhcmd1bWVudCwgaWYgaXQgY29udGFpbnMgd2lsZGNhcmRzLAogICAgICAgICAgbXVzdCBiZSBxdW90ZWQgdG8gcHJldmVudCB0aGlzLCBlLmcuOgoKICBrZXJtaXQgLUwgLXMgIiouYyIKCiAgICAgICAgICBJbiBVTklYIG9ubHksICJrZXJtaXQgLUwgLXMgLiIgbWVhbnMgdG8gc2VuZCB0aGUgY3VycmVudAogICAgICAgICAgZGlyZWN0b3J5IHRyZWUuIFNlZSBbNjMwXVNlY3Rpb25zIDQuMTAgYW5kIFs2MzFdNC4xMSBhYm91dAogICAgICAgICAgcmVjdXJzaXZlIGZpbGUgdHJhbnNmZXIuCgogICAtVgogICAgICAgICAgRXF1aXZhbGVudCB0byBTRVQgRklMRSBQQVRURVJOUyBPRkYgKFs2MzJdU2VjdGlvbiA0LjMpIGFuZCBTRVQKICAgICAgICAgIFRSQU5TRkVSIE1PREUgTUFOVUFMLiBJbiBvdGhlciB3b3JkcywgdGFrZSB0aGUgRklMRSBUWVBFCiAgICAgICAgICBzZXR0aW5nIGxpdGVyYWxseS4gRm9yIGV4YW1wbGUsICJrZXJtaXQgLVZUIG9vZmEuYmluIiBtZWFucwogICAgICAgICAgc2VuZCB0aGUgZmlsZSBpbiBUZXh0IG1vZGUsIG5vIG1hdHRlciB3aGF0IGl0cyBuYW1lIGlzIGFuZCBubwogICAgICAgICAgbWF0dGVyIHdoZXRoZXIgYSBraW5kcmVkIHNwaXJpdCBpcyByZWNvZ25pemVkIGF0IHRoZSBvdGhlciBlbmQKICAgICAgICAgIG9mIHRoZSBjb25uZWN0aW9uLgoKICAgLTAKICAgICAgICAgIChkaWdpdCB6ZXJvKSBtZWFucyAiYmUgMTAwJSB0cmFuc3BhcmVudCBpbiBDT05ORUNUIG1vZGUiLiBUaGlzCiAgICAgICAgICBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgc2VyaWVzIG9mIGNvbW1hbmRzOiBTRVQgUEFSSVRZCiAgICAgICAgICBOT05FLCBTRVQgQ09NTUFORCBCWVRFU0laRSA4LCBTRVQgVEVSTUlOQUwgQllURVNJWkUgOCwgU0VUIEZMT1cKICAgICAgICAgIE5PTkUsIFNFVCBURVJNIEVTQ0FQRSBESVNBQkxFRCwgU0VUIFRFUk0gQ0hBUiBUUkFOU1BBUkVOVCwgU0VUCiAgICAgICAgICBURVJNIEFVVE9ET1dOTE9BRCBPRkYsIFNFVCBURVJNIEFQQyBPRkYsIFNFVCBURUxPUFQgS0VSTUlUCiAgICAgICAgICBSRUZVU0UgUkVGVVNFLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogIDEwLiBDLUtFUk1JVCBBTkQgRy1LRVJNSVQKCiAgIEV2ZXJ5IG11bHRpZnVuY3Rpb25lZCBhbmQgbG9uZy1saXZlZCBzb2Z0d2FyZSBwcm9ncmFtIGdyb3dzIGluCiAgIGNvbXBsZXhpdHkgYW5kIHNpemUgb3ZlciB0aW1lIHRvIG1lZXQgdGhlIG5lZWRzIGFuZCByZXF1ZXN0cyBvZiBpdHMKICAgdXNlcnMgYW5kIHRoZSBkZW1hbmRzIG9mIHRoZSB1bmRlcmx5aW5nIHRlY2hub2xvZ3kgYXMgaXQgY2hhbmdlcy4KCiAgIEV2ZW50dWFsbHkgdXNlcnMgYmVnaW4gdG8gbm90aWNlIGhvdyBiaWcgdGhlIGFwcGxpY2F0aW9uIGhhcyBncm93biwKICAgaG93IG11Y2ggZGlzayBzcGFjZSBpdCBvY2N1cGllcywgaG93IGxvbmcgaXQgdGFrZXMgdG8gbG9hZCwgYW5kIHRoZXkKICAgc3RhcnQgdG8gbG9uZyBmb3IgdGhlIGdvb2Qgb2xkIGRheXMgd2hlbiBpdCB3YXMgbGVhbiBhbmQgbWVhbi4gTm90CiAgIGxvbmcgYWZ0ZXIgdGhhdCB0aGV5IGJlZ2luIGFza2luZyBmb3IgYSAibGlnaHQiIHZlcnNpb24gdGhhdCBvbmx5IGRvZXMKICAgdGhlIGJhc2ljcyB3aXRoIG5vIGZyaWxscy4KCiAgIEFuZCBzbyBpdCBpcyB3aXRoIEMtS2VybWl0LiBBICJsaWdodCIgdmVyc2lvbiBvZiBLZXJtaXQgd2FzIHJlbGVhc2VkCiAgIChmb3IgVU5JWCBvbmx5KSBpbiBEZWNlbWJlciAxOTk5IHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZTsKICAgdGh1cyBpdCBpcyBjYWxsZWQgRy1LZXJtaXQgKGZvciBHTlUgS2VybWl0KS4gQWxsIGl0IGRvZXMgaXMgc2VuZCBhbmQKICAgcmVjZWl2ZSBmaWxlcywgcGVyaW9kLiBZb3UgY2FuIGZpbmQgaXQgYXQ6CgogIFs2MzNdaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2drZXJtaXQuaHRtbAoKICAgV2hlcmUgdGhlIEMtS2VybWl0IDcuMCBiaW5hcnkgbWlnaHQgYmUgYW55d2hlcmUgZnJvbSAxIHRvIDMgbWlsbGlvbgogICBieXRlcyBpbiBzaXplLCB0aGUgRy1LZXJtaXQgYmluYXJ5IHJhbmdlcyBmcm9tIDMwSyB0byAxMDBLLCBkZXBlbmRpbmcKICAgb24gdGhlIHVuZGVybHlpbmcgYXJjaGl0ZWN0dXJlIChSSVNDIHZzIENJU0MsIGV0YykuCgogICBHLUtlcm1pdCBhbmQgQy1LZXJtaXQgbWF5IHJlc2lkZSBzaWRlLWJ5LXNpZGUgb24gdGhlIHNhbWUgY29tcHV0ZXIuCiAgIEctS2VybWl0IGRvZXMgbm90IG1ha2UgY29ubmVjdGlvbnM7IGl0IGRvZXMgbm90IGhhdmUgYSBzY3JpcHQKICAgbGFuZ3VhZ2U7IGl0IGRvZXMgbm90IHRyYW5zbGF0ZSBjaGFyYWN0ZXIgc2V0cy4gRy1LZXJtaXQgbWF5IGJlIHVzZWQKICAgaW5zdGVhZCBvZiBDLUtlcm1pdCB3aGVuOgoKICAgICAqIEl0IGlzIG9uIHRoZSByZW1vdGUgZW5kLgogICAgICogRmlsZXMgYXJlIHRvIGJlIHRyYW5zZmVycmVkIGluIGJpbmFyeSBtb2RlIG9yIGluIHRleHQgbW9kZSB3aXRob3V0CiAgICAgICBjaGFyYWN0ZXItc2V0IHRyYW5zbGF0aW9uLgogICAgICogRmlsZSB0aW1lc3RhbXBzIGRvbid0IG5lZWQgdG8gYmUgcHJlc2VydmVkLgoKICAgSW4gc3VjaCBjYXNlcyBHLUtlcm1pdCBtaWdodCBiZSBwcmVmZXJyZWQgc2luY2UgaXQgZ2VuZXJhbGx5IHN0YXJ0cyB1cAogICBmYXN0ZXIsIGFuZCB5ZXQgdHJhbnNmZXJzIGZpbGVzIGp1c3QgYXMgZmFzdCBvbiBtb3N0IChidXQgbm90CiAgIG5lY2Vzc2FyaWx5IGFsbCkga2luZHMgb2YgY29ubmVjdGlvbnM7IGZvciBleGFtcGxlLCBpdCBzdXBwb3J0cwogICBzdHJlYW1pbmcgKFs2MzRdU2VjdGlvbiA0LjIwKS4KCiAgIEctS2VybWl0IGlzIGFsc28gaGFuZHkgZm9yIGJvb3RzdHJhcHBpbmcuIEl0IGlzIGVhc2llciB0byBsb2FkIG9uIGEKICAgbmV3IGNvbXB1dGVyIHRoYW4gQy1LZXJtaXQgLS0gaXQgZml0cyBvbiBhIGZsb3BweSBkaXNrZXR0ZSB3aXRoIHBsZW50eQogICBvZiByb29tIHRvIHNwYXJlLiBUaHVzIGlmIHlvdSBoYXZlIChzYXkpIGFuIG9sZCBQQyBydW5uaW5nIChzYXkpIFNDTwogICBYZW5peCBhbmQgbm8gbmV0d29yayBjb25uZWN0aW9uLCB5b3UgY2FuIGRvd25sb2FkIHRoZSBYZW5peCB2ZXJzaW9uIG9mCiAgIEctS2VybWl0IHRvIChzYXkpIGEgRE9TIG9yIFdpbmRvd3MgUEMsIGNvcHkgaXQgdG8gZGlza2V0dGUsIHJlYWQgdGhlCiAgIGRpc2tldHRlIG9uIFhlbml4IHdpdGggImRvc3JlYWQiLCBhbmQgdGhlbiB1c2UgRy1LZXJtaXQgdG8gcmVjZWl2ZQogICBDLUtlcm1pdCAod2hpY2ggZG9lcyBub3QgZml0IG9uIGEgZGlza2V0dGUpLiBJZiBkaXNrZXR0ZXMgYXJlbid0IGFuCiAgIG9wdGlvbiwgb3RoZXIgYm9vdHN0cmFwcGluZyBtZXRob2RzIGFyZSBwb3NzaWJsZSB0b28gLS0gc2VlIHRoZQogICBbNjM1XUctS2VybWl0IHdlYiBwYWdlIGZvciBkZXRhaWxzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgpJSUkuIEFQUEVORElDRVMKCiAgSUlJLjEuIENoYXJhY3RlciBTZXQgVGFibGVzCgogICAgSUlJLjEuMS4gVGhlIEhld2xldHQgUGFja2FyZCBSb21hbjggQ2hhcmFjdGVyIFNldAoKZGVjIGNvbC9yb3cgb2N0IGhleCAgZGVzY3JpcHRpb24KMTYwICAxMC8wMCAgMjQwICBBMCAgKFVuZGVmaW5lZCkKMTYxICAxMC8wMSAgMjQxICBBMSAgQSBncmF2ZQoxNjIgIDEwLzAyICAyNDIgIEEyICBBIGNpcmN1bWZsZXgKMTYzICAxMC8wMyAgMjQzICBBMyAgRSBncmF2ZQoxNjQgIDEwLzA0ICAyNDQgIEE0ICBFIGNpcmN1bWZsZXgKMTY1ICAxMC8wNSAgMjQ1ICBBNSAgRSBkaWFlcmVzaXMKMTY2ICAxMC8wNiAgMjQ2ICBBNiAgSSBjaXJjdW1mbGV4CjE2NyAgMTAvMDcgIDI0NyAgQTcgIEkgZGlhZXJlc2lzCjE2OCAgMTAvMDggIDI1MCAgQTggIEFjdXRlIGFjY2VudAoxNjkgIDEwLzA5ICAyNTEgIEE5ICBHcmF2ZSBhY2NlbnQKMTcwICAxMC8xMCAgMjUyICBBQSAgQ2lyY3VtZmxleCBhY2NlbnQKMTcxICAxMC8xMSAgMjUzICBBQiAgRGlhZXJlc2lzCjE3MiAgMTAvMTIgIDI1NCAgQUMgIFRpbGRlIGFjY2VudAoxNzMgIDEwLzEzICAyNTUgIEFEICBVIGdyYXZlCjE3NCAgMTAvMTQgIDI1NiAgQUUgIFUgY2lyY3VtZmxleAoxNzUgIDEwLzE1ICAyNTcgIEFGICBMaXJhIHN5bWJvbAoxNzYgIDExLzAwICAyNjAgIEIwICBUb3AgYmFyIChtYWNyb24pCjE3NyAgMTEvMDEgIDI2MSAgQjEgIFkgYWN1dGUKMTc4ICAxMS8wMiAgMjYyICBCMiAgeSBhY3V0ZQoxNzkgIDExLzAzICAyNjMgIEIzICBEZWdyZWUgU2lnbgoxODAgIDExLzA0ICAyNjQgIEI0ICBDIGNlZGlsbGEKMTgxICAxMS8wNSAgMjY1ICBCNSAgYyBjZWRpbGxhCjE4MiAgMTEvMDYgIDI2NiAgQjYgIE4gdGlsZGUKMTgzICAxMS8wNyAgMjY3ICBCNyAgbiB0aWxkZQoxODQgIDExLzA4ICAyNzAgIEI4ICBJbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrCjE4NSAgMTEvMDkgIDI3MSAgQjkgIEludmVydGVkIHF1ZXN0aW9uIG1hcmsKMTg2ICAxMS8xMCAgMjcyICBCQSAgQ3VycmVuY3kgc3ltYm9sCjE4NyAgMTEvMTEgIDI3MyAgQkIgIFBvdW5kIHN0ZXJsaW5nIHN5bWJvbAoxODggIDExLzEyICAyNzQgIEJDICBZZW4gc3ltYm9sCjE4OSAgMTEvMTMgIDI3NSAgQkQgIFBhcmFncmFwaAoxOTAgIDExLzE0ICAyNzYgIEJFICBGbG9yaW4gKEd1aWxkZXIpIHN5bWJvbAoxOTEgIDExLzE1ICAyNzcgIEJGICBDZW50IHN5bWJvbAoxOTIgIDEyLzAwICAzMDAgIEMwICBhIGNpcmN1bWZsZXgKMTkzICAxMi8wMSAgMzAxICBDMSAgZSBjaXJjdW1mbGV4CjE5NCAgMTIvMDIgIDMwMiAgQzIgIG8gY2lyY3VtZmxleAoxOTUgIDEyLzAzICAzMDMgIEMzICB1IGNpcmN1bWZsZXgKMTk2ICAxMi8wNCAgMzA0ICBDNCAgYSBhY3V0ZQoxOTcgIDEyLzA1ICAzMDUgIEM1ICBlIGFjdXRlCjE5OCAgMTIvMDYgIDMwNiAgQzYgIG8gYWN1dGUKMTk5ICAxMi8wNyAgMzA3ICBDNyAgdSBhY3V0ZQoyMDAgIDEyLzA4ICAzMTAgIEM4ICBhIGdyYXZlCjIwMSAgMTIvMDkgIDMxMSAgQzkgIGUgZ3JhdmUKMjAyICAxMi8xMCAgMzEyICBDQSAgbyBncmF2ZQoyMDMgIDEyLzExICAzMTMgIENCICB1IGdyYXZlCjIwNCAgMTIvMTIgIDMxNCAgQ0MgIGEgZGlhZXJlc2lzCjIwNSAgMTIvMTMgIDMxNSAgQ0QgIGUgZGlhZXJlc2lzCjIwNiAgMTIvMTQgIDMxNiAgQ0UgIG8gZGlhZXJlc2lzCjIwNyAgMTIvMTUgIDMxNyAgQ0YgIHUgZGlhZXJlc2lzCjIwOCAgMTMvMDAgIDMyMCAgRDAgIEEgcmluZwoyMDkgIDEzLzAxICAzMjEgIEQxICBpIGNpcmN1bWZsZXgKMjEwICAxMy8wMiAgMzIyICBEMiAgTyB3aXRoIHN0cm9rZQoyMTEgIDEzLzAzICAzMjMgIEQzICBBRSBkaWdyYXBoCjIxMiAgMTMvMDQgIDMyNCAgRDQgIGEgcmluZwoyMTMgIDEzLzA1ICAzMjUgIEQ1ICBpIGFjdXRlCjIxNCAgMTMvMDYgIDMyNiAgRDYgIG8gd2l0aCBzdHJva2UKMjE1ICAxMy8wNyAgMzI3ICBENyAgYWUgZGlncmFwaAoyMTYgIDEzLzA4ICAzMzAgIEQ4ICBBIGRpYWVyZXNpcwoyMTcgIDEzLzA5ICAzMzEgIEQ5ICBpIGdyYXZlCjIxOCAgMTMvMTAgIDMzMiAgREEgIE8gZGlhZXJlc2lzCjIxOSAgMTMvMTEgIDMzMyAgREIgIFUgZGlhZXJlc2lzCjIyMCAgMTMvMTIgIDMzNCAgREMgIEUgYWN1dGUKMjIxICAxMy8xMyAgMzM1ICBERCAgaSBkaWFlcmVzaXMKMjIyICAxMy8xNCAgMzM2ICBERSAgR2VybWFuIHNoYXJwIHMKMjIzICAxMy8xNSAgMzM3ICBERiAgTyBjaXJjdW1mbGV4CjIyNCAgMTQvMDAgIDM0MCAgRTAgIEEgYWN1dGUKMjI1ICAxNC8wMSAgMzQxICBFMSAgQSB0aWxkZQoyMjYgIDE0LzAyICAzNDIgIEUyICBhIHRpbGRlCjIyNyAgMTQvMDMgIDM0MyAgRTMgIEljZWxhbmRpYyBFdGgKMjI4ICAxNC8wNCAgMzQ0ICBFNCAgSWNlbGFuZGljIGV0aAoyMjkgIDE0LzA1ICAzNDUgIEU1ICBJIGFjdXRlCjIzMCAgMTQvMDYgIDM0NiAgRTYgIEkgZ3JhdmUKMjMxICAxNC8wNyAgMzQ3ICBFNyAgTyBhY3V0ZQoyMzIgIDE0LzA4ICAzNTAgIEU4ICBPIGdyYXZlCjIzMyAgMTQvMDkgIDM1MSAgRTkgIE8gdGlsZGUKMjM0ICAxNC8xMCAgMzUyICBFQSAgbyB0aWxkZQoyMzUgIDE0LzExICAzNTMgIEVCICBTIGNhcm9uCjIzNiAgMTQvMTIgIDM1NCAgRUMgIHMgY2Fyb24KMjM3ICAxNC8xMyAgMzU1ICBFRCAgVSBhY3V0ZQoyMzggIDE0LzE0ICAzNTYgIEVFICBZIGRpYWVyZXNpcwoyMzkgIDE0LzE1ICAzNTcgIEVGICB5IGRpYWVyZXNpcwoyNDAgIDE1LzAwICAzNjAgIEYwICBJY2VsYW5kaWMgVGhvcm4KMjQxICAxNS8wMSAgMzYxICBGMSAgSWNlbGFuZGljIHRob3JuCjI0MiAgMTUvMDIgIDM2MiAgRjIgIE1pZGRsZSBkb3QKMjQzICAxNS8wMyAgMzYzICBGMyAgR3JlZWsgbXUKMjQ0ICAxNS8wNCAgMzY0ICBGNCAgUGlsY3JvdyBzaWduCjI0NSAgMTUvMDUgIDM2NSAgRjUgIEZyYWN0aW9uIDMvNAoyNDYgIDE1LzA2ICAzNjYgIEY2ICBMb25nIGRhc2gsIGhvcml6b250YWwgYmFyCjI0NyAgMTUvMDcgIDM2NyAgRjcgIEZyYWN0aW9uIDEvNAoyNDggIDE1LzA4ICAzNzAgIEY4ICBGcmFjdGlvbiAxLzIKMjQ5ICAxNS8wOSAgMzcxICBGOSAgRmVtaW5pbmUgb3JkaW5hbAoyNTAgIDE1LzEwICAzNzIgIEZBICBNYXNjdWxpbmUgb3JkaW5hbAoyNTEgIDE1LzExICAzNzMgIEZCICBMZWZ0IGd1aWxsZW1vdAoyNTIgIDE1LzEyICAzNzQgIEZDICBTb2xpZCBib3gKMjUzICAxNS8xMyAgMzc1ICBGRCAgUmlnaHQgZ3VpbGxlbW90CjI1NCAgMTUvMTQgIDM3NiAgRkUgIFBsdXMgb3IgbWludXMgc2lnbgoyNTUgIDE1LzE1ICAzNzcgIEZGICAoVW5kZWZpbmVkKQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgSUlJLjEuMi4gR3JlZWsgQ2hhcmFjdGVyIFNldHMKCiAgICBJSUkuMS4yLjEuIFRoZSBJU08gODg1OS03IExhdGluIC8gR3JlZWsgQWxwaGFiZXQgPSBFTE9UIDkyOAoKZGVjIGNvbC9yb3cgb2N0IGhleCAgZGVzY3JpcHRpb24KMTYwICAxMC8wMCAgMjQwICBBMCAgTm8tYnJlYWsgc3BhY2UKMTYxICAxMC8wMSAgMjQxICBBMSAgTGVmdCBzaW5nbGUgcXVvdGF0aW9uIG1hcmsKMTYyICAxMC8wMiAgMjQyICBBMiAgcmlnaHQgc2luZ2xlIHF1b3RhdGlvbiBtYXJrCjE2MyAgMTAvMDMgIDI0MyAgQTMgIFBvdW5kIHNpZ24KMTY0ICAxMC8wNCAgMjQ0ICBBNCAgKFVOVVNFRCkKMTY1ICAxMC8wNSAgMjQ1ICBBNSAgKFVOVVNFRCkKMTY2ICAxMC8wNiAgMjQ2ICBBNiAgQnJva2VuIGJhcgoxNjcgIDEwLzA3ICAyNDcgIEE3ICBQYXJhZ3JhcGggc2lnbgoxNjggIDEwLzA4ICAyNTAgIEE4ICBEaWFlcmVzaXMgKERpYWx5dGlrYSkKMTY5ICAxMC8wOSAgMjUxICBBOSAgQ29weXJpZ2h0IHNpZ24KMTcwICAxMC8xMCAgMjUyICBBQSAgKFVOVVNFRCkKMTcxICAxMC8xMSAgMjUzICBBQiAgTGVmdCBhbmdsZSBxdW90YXRpb24KMTcyICAxMC8xMiAgMjU0ICBBQyAgTm90IHNpZ24KMTczICAxMC8xMyAgMjU1ICBBRCAgU29mdCBoeXBoZW4KMTc0ICAxMC8xNCAgMjU2ICBBRSAgKFVOVVNFRCkKMTc1ICAxMC8xNSAgMjU3ICBBRiAgSG9yaXpvbnRhbCBiYXIgKFBhcmVudGhldGlraSBwYXZsYSkKMTc2ICAxMS8wMCAgMjYwICBCMCAgRGVncmVlIHNpZ24KMTc3ICAxMS8wMSAgMjYxICBCMSAgUGx1cy1taW51cyBzaWduCjE3OCAgMTEvMDIgIDI2MiAgQjIgIFN1cGVyc2NyaXB0IHR3bwoxNzkgIDExLzAzICAyNjMgIEIzICBTdXBlcnNjcmlwdCB0aHJlZQoxODAgIDExLzA0ICAyNjQgIEI0ICBBY2NlbnQgKHRvbm9zKQoxODEgIDExLzA1ICAyNjUgIEI1ICBEaWFlcmVzaXMgYW5kIGFjY2VudCAoRGlhbHl0aWthIGFuZCBUb25vcykKMTgyICAxMS8wNiAgMjY2ICBCNiAgQWxwaGEgd2l0aCBhY2NlbnQKMTgzICAxMS8wNyAgMjY3ICBCNyAgTWlkZGxlIGRvdCAoQW5vIFRlbGVpYSkKMTg0ICAxMS8wOCAgMjcwICBCOCAgRXBzaWxvbiB3aXRoIGFjY2VudAoxODUgIDExLzA5ICAyNzEgIEI5ICBFdGEgd2l0aCBhY2NlbnQKMTg2ICAxMS8xMCAgMjcyICBCQSAgSW90YSB3aXRoIGFjY2VudAoxODcgIDExLzExICAyNzMgIEJCICBSaWdodCBhbmdsZSBxdW90YXRpb24KMTg4ICAxMS8xMiAgMjc0ICBCQyAgT21pY3JvbiB3aXRoIGFjY2VudAoxODkgIDExLzEzICAyNzUgIEJEICBPbmUgaGFsZgoxOTAgIDExLzE0ICAyNzYgIEJFICBVcHNpbG9uIHdpdGggYWNjZW50CjE5MSAgMTEvMTUgIDI3NyAgQkYgIE9tZWdhIHdpdGggYWNjZW50CjE5MiAgMTIvMDAgIDMwMCAgQzAgIGlvdGEgd2l0aCBkaWFlcmVzaXMgYW5kIGFjY2VudAoxOTMgIDEyLzAxICAzMDEgIEMxICBBbHBoYQoxOTQgIDEyLzAyICAzMDIgIEMyICBCZXRhCjE5NSAgMTIvMDMgIDMwMyAgQzMgIEdhbW1hCjE5NiAgMTIvMDQgIDMwNCAgQzQgIERlbHRhCjE5NyAgMTIvMDUgIDMwNSAgQzUgIEVwc2lsb24KMTk4ICAxMi8wNiAgMzA2ICBDNiAgWmV0YQoxOTkgIDEyLzA3ICAzMDcgIEM3ICBFdGEKMjAwICAxMi8wOCAgMzEwICBDOCAgVGhldGEKMjAxICAxMi8wOSAgMzExICBDOSAgSW90YQoyMDIgIDEyLzEwICAzMTIgIENBICBLYXBwYQoyMDMgIDEyLzExICAzMTMgIENCICBMYW1kYQoyMDQgIDEyLzEyICAzMTQgIENDICBNdQoyMDUgIDEyLzEzICAzMTUgIENEICBOdQoyMDYgIDEyLzE0ICAzMTYgIENFICBLc2kKMjA3ICAxMi8xNSAgMzE3ICBDRiAgT21pY3JvbgoyMDggIDEzLzAwICAzMjAgIEQwICBQaQoyMDkgIDEzLzAxICAzMjEgIEQxICBSaG8KMjEwICAxMy8wMiAgMzIyICBEMiAgKFVOVVNFRCkKMjExICAxMy8wMyAgMzIzICBEMyAgU2lnbWEKMjEyICAxMy8wNCAgMzI0ICBENCAgVGF1CjIxMyAgMTMvMDUgIDMyNSAgRDUgIFVwc2lsb24KMjE0ICAxMy8wNiAgMzI2ICBENiAgUGhpCjIxNSAgMTMvMDcgIDMyNyAgRDcgIEtoaQoyMTYgIDEzLzA4ICAzMzAgIEQ4ICBQc2kKMjE3ICAxMy8wOSAgMzMxICBEOSAgT21lZ2EKMjE4ICAxMy8xMCAgMzMyICBEQSAgSW90YSB3aXRoIGRpYWVyZXNpcwoyMTkgIDEzLzExICAzMzMgIERCICBVcHNpbG9uIHdpdGggZGlhZXJlc2lzCjIyMCAgMTMvMTIgIDMzNCAgREMgIGFscGhhIHdpdGggYWNjZW50CjIyMSAgMTMvMTMgIDMzNSAgREQgIGVwc2lsb24gd2l0aCBhY2NlbnQKMjIyICAxMy8xNCAgMzM2ICBERSAgZXRhIHdpdGggYWNjZW50CjIyMyAgMTMvMTUgIDMzNyAgREYgIGlvdGEgd2l0aCBhY2NlbnQKMjI0ICAxNC8wMCAgMzQwICBFMCAgdXBzaWxvbiB3aXRoIGRpYWVyZXNpcyBhbmQgYWNjZW50CjIyNSAgMTQvMDEgIDM0MSAgRTEgIGFscGhhCjIyNiAgMTQvMDIgIDM0MiAgRTIgIGJldGEKMjI3ICAxNC8wMyAgMzQzICBFMyAgZ2FtbWEKMjI4ICAxNC8wNCAgMzQ0ICBFNCAgZGVsdGEKMjI5ICAxNC8wNSAgMzQ1ICBFNSAgZXBzaWxvbgoyMzAgIDE0LzA2ICAzNDYgIEU2ICB6ZXRhCjIzMSAgMTQvMDcgIDM0NyAgRTcgIGV0YQoyMzIgIDE0LzA4ICAzNTAgIEU4ICB0aGV0YQoyMzMgIDE0LzA5ICAzNTEgIEU5ICBpb3RhCjIzNCAgMTQvMTAgIDM1MiAgRUEgIGthcHBhCjIzNSAgMTQvMTEgIDM1MyAgRUIgIGxhbWRhCjIzNiAgMTQvMTIgIDM1NCAgRUMgIG11CjIzNyAgMTQvMTMgIDM1NSAgRUQgIG51CjIzOCAgMTQvMTQgIDM1NiAgRUUgIGtzaQoyMzkgIDE0LzE1ICAzNTcgIEVGICBvbWljcm9uCjI0MCAgMTUvMDAgIDM2MCAgRjAgIHBpCjI0MSAgMTUvMDEgIDM2MSAgRjEgIHJobwoyNDIgIDE1LzAyICAzNjIgIEYyICB0ZXJtaW5hbCBzaWdtYQoyNDMgIDE1LzAzICAzNjMgIEYzICBzaWdtYQoyNDQgIDE1LzA0ICAzNjQgIEY0ICB0YXUKMjQ1ICAxNS8wNSAgMzY1ICBGNSAgdXBzaWxvbgoyNDYgIDE1LzA2ICAzNjYgIEY2ICBwaGkKMjQ3ICAxNS8wNyAgMzY3ICBGNyAga2hpCjI0OCAgMTUvMDggIDM3MCAgRjggIHBzaQoyNDkgIDE1LzA5ICAzNzEgIEY5ICBvbWVnYQoyNTAgIDE1LzEwICAzNzIgIEZBICBpb3RhIHdpdGggZGlhZXJlc2lzCjI1MSAgMTUvMTEgIDM3MyAgRkIgIHVwc2lsb24gd2l0aCBkaWFlcmVzaXMKMjUyICAxNS8xMiAgMzc0ICBGQyAgb21pY3JvbiB3aXRoIGRpYWVyZXNpcwoyNTMgIDE1LzEzICAzNzUgIEZEICB1cHNpbG9uIHdpdGggYWNjZW50CjI1NCAgMTUvMTQgIDM3NiAgRkUgIG9tZWdhIHdpdGggYWNjZW50CjI1NSAgMTUvMTUgIDM3NyAgRkYgIChVTlVTRUQpCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICBJSUkuMS4yLjIuIFRoZSBFTE9UIDkyNyBDaGFyYWN0ZXIgU2V0CgpkZWMgY29sL3JvdyBvY3QgaGV4ICBkZXNjcmlwdGlvbgogMzIgIDAyLzAwICAgNDAgIDIwICBTUEFDRQogMzMgIDAyLzAxICAgNDEgIDIxICBFWENMQU1BVElPTiBNQVJLCiAzNCAgMDIvMDIgICA0MiAgMjIgIFFVT1RBVElPTiBNQVJLCiAzNSAgMDIvMDMgICA0MyAgMjMgIE5VTUJFUiBTSUdOCiAzNiAgMDIvMDQgICA0NCAgMjQgIERPTExBUiBTSUdOCiAzNyAgMDIvMDUgICA0NSAgMjUgIFBFUkNFTlQgU0lHTgogMzggIDAyLzA2ICAgNDYgIDI2ICBBTVBFUlNBTkQKIDM5ICAwMi8wNyAgIDQ3ICAyNyAgQVBPU1RST1BIRQogNDAgIDAyLzA4ICAgNTAgIDI4ICBMRUZUIFBBUkVOVEhFU0lTCiA0MSAgMDIvMDkgICA1MSAgMjkgIFJJR0hUIFBBUkVOVEhFU0lTCiA0MiAgMDIvMTAgICA1MiAgMkEgIEFTVEVSSVNLCiA0MyAgMDIvMTEgICA1MyAgMkIgIFBMVVMgU0lHTgogNDQgIDAyLzEyICAgNTQgIDJDICBDT01NQQogNDUgIDAyLzEzICAgNTUgIDJEICBIWVBIRU4sIE1JTlVTIFNJR04KIDQ2ICAwMi8xNCAgIDU2ICAyRSAgUEVSSU9ELCBGVUxMIFNUT1AKIDQ3ICAwMi8xNSAgIDU3ICAyRiAgU09MSURVUywgU0xBU0gKIDQ4ICAwMy8wMCAgIDYwICAzMCAgRElHSVQgWkVSTwogNDkgIDAzLzAxICAgNjEgIDMxICBESUdJVCBPTkUKIDUwICAwMy8wMiAgIDYyICAzMiAgRElHSVQgVFdPCiA1MSAgMDMvMDMgICA2MyAgMzMgIERJR0lUIFRIUkVFCiA1MiAgMDMvMDQgICA2NCAgMzQgIERJR0lUIEZPVVIKIDUzICAwMy8wNSAgIDY1ICAzNSAgRElHSVQgRklWRQogNTQgIDAzLzA2ICAgNjYgIDM2ICBESUdJVCBTSVgKIDU1ICAwMy8wNyAgIDY3ICAzNyAgRElHSVQgU0VWRU4KIDU2ICAwMy8wOCAgIDcwICAzOCAgRElHSVQgRUlHSFQKIDU3ICAwMy8wOSAgIDcxICAzOSAgRElHSVQgTklORQogNTggIDAzLzEwICAgNzIgIDNBICBDT0xPTgogNTkgIDAzLzExICAgNzMgIDNCICBTRU1JQ09MT04KIDYwICAwMy8xMiAgIDc0ICAzQyAgTEVTUy1USEFOIFNJR04sIExFRlQgQU5HTEUgQlJBQ0tFVAogNjEgIDAzLzEzICAgNzUgIDNEICBFUVVBTFMgU0lHTgogNjIgIDAzLzE0ICAgNzYgIDNFICBHUkVBVEVSLVRIQU4gU0lHTiwgUklHSFQgQU5HTEUgQlJBQ0tFVAogNjMgIDAzLzE1ICAgNzcgIDNGICBRVUVTVElPTiBNQVJLCiA2NCAgMDQvMDAgIDEwMCAgNDAgIENPTU1FUkNJQUwgQVQgU0lHTgogNjUgIDA0LzAxICAxMDEgIDQxICBDQVBJVEFMIExFVFRFUiBBCiA2NiAgMDQvMDIgIDEwMiAgNDIgIENBUElUQUwgTEVUVEVSIEIKIDY3ICAwNC8wMyAgMTAzICA0MyAgQ0FQSVRBTCBMRVRURVIgQwogNjggIDA0LzA0ICAxMDQgIDQ0ICBDQVBJVEFMIExFVFRFUiBECiA2OSAgMDQvMDUgIDEwNSAgNDUgIENBUElUQUwgTEVUVEVSIEUKIDcwICAwNC8wNiAgMTA2ICA0NiAgQ0FQSVRBTCBMRVRURVIgRgogNzEgIDA0LzA3ICAxMDcgIDQ3ICBDQVBJVEFMIExFVFRFUiBHCiA3MiAgMDQvMDggIDExMCAgNDggIENBUElUQUwgTEVUVEVSIEgKIDczICAwNC8wOSAgMTExICA0OSAgQ0FQSVRBTCBMRVRURVIgSQogNzQgIDA0LzEwICAxMTIgIDRBICBDQVBJVEFMIExFVFRFUiBKCiA3NSAgMDQvMTEgIDExMyAgNEIgIENBUElUQUwgTEVUVEVSIEsKIDc2ICAwNC8xMiAgMTE0ICA0QyAgQ0FQSVRBTCBMRVRURVIgTAogNzcgIDA0LzEzICAxMTUgIDREICBDQVBJVEFMIExFVFRFUiBNCiA3OCAgMDQvMTQgIDExNiAgNEUgIENBUElUQUwgTEVUVEVSIE4KIDc5ICAwNC8xNSAgMTE3ICA0RiAgQ0FQSVRBTCBMRVRURVIgTwogODAgIDA1LzAwICAxMjAgIDUwICBDQVBJVEFMIExFVFRFUiBQCiA4MSAgMDUvMDEgIDEyMSAgNTEgIENBUElUQUwgTEVUVEVSIFEKIDgyICAwNS8wMiAgMTIyICA1MiAgQ0FQSVRBTCBMRVRURVIgUgogODMgIDA1LzAzICAxMjMgIDUzICBDQVBJVEFMIExFVFRFUiBTCiA4NCAgMDUvMDQgIDEyNCAgNTQgIENBUElUQUwgTEVUVEVSIFQKIDg1ICAwNS8wNSAgMTI1ICA1NSAgQ0FQSVRBTCBMRVRURVIgVQogODYgIDA1LzA2ICAxMjYgIDU2ICBDQVBJVEFMIExFVFRFUiBWCiA4NyAgMDUvMDcgIDEyNyAgNTcgIENBUElUQUwgTEVUVEVSIFcKIDg4ICAwNS8wOCAgMTMwICA1OCAgQ0FQSVRBTCBMRVRURVIgWAogODkgIDA1LzA5ICAxMzEgIDU5ICBDQVBJVEFMIExFVFRFUiBZCiA5MCAgMDUvMTAgIDEzMiAgNUEgIENBUElUQUwgTEVUVEVSIFoKIDkxICAwNS8xMSAgMTMzICA1QiAgTEVGVCBTUVVBUkUgQlJBQ0tFVAogOTIgIDA1LzEyICAxMzQgIDVDICBSRVZFUlNFIFNPTElEVVMsIEJBQ0tTTEFTSAogOTMgIDA1LzEzICAxMzUgIDVEICBSSUdIVCBTUVVBUkUgQlJBQ0tFVAogOTQgIDA1LzE0ICAxMzYgIDVFICBDSVJDVU1GTEVYIEFDQ0VOVAogOTUgIDA1LzE1ICAxMzcgIDVGICBVTkRFUlNDT1JFCiA5NiAgMDYvMDAgIDE0MCAgNjAgIEFDQ0VOVCBHUkFWRQogOTcgIDA2LzAxICAxNDEgIDYxICBHUkVFSyBMRVRURVIgQUxQSEEKIDk4ICAwNi8wMiAgMTQyICA2MiAgR1JFRUsgTEVUVEVSIEJFVEEKIDk5ICAwNi8wMyAgMTQzICA2MyAgR1JFRUsgTEVUVEVSIEdBTU1BCjEwMCAgMDYvMDQgIDE0NCAgNjQgIEdSRUVLIExFVFRFUiBERUxUQQoxMDEgIDA2LzA1ICAxNDUgIDY1ICBHUkVFSyBMRVRURVIgRVBTSUxPTgoxMDIgIDA2LzA2ICAxNDYgIDY2ICBHUkVFSyBMRVRURVIgWkVUQQoxMDMgIDA2LzA3ICAxNDcgIDY3ICBHUkVFSyBMRVRURVIgRVRBCjEwNCAgMDYvMDggIDE1MCAgNjggIEdSRUVLIExFVFRFUiBUSEVUQQoxMDUgIDA2LzA5ICAxNTEgIDY5ICBHUkVFSyBMRVRURVIgSU9UQQoxMDYgIDA2LzEwICAxNTIgIDZBICBHUkVFSyBMRVRURVIgS0FQUEEKMTA3ICAwNi8xMSAgMTUzICA2QiAgR1JFRUsgTEVUVEVSIExBTURBCjEwOCAgMDYvMTIgIDE1NCAgNkMgIEdSRUVLIExFVFRFUiBNVQoxMDkgIDA2LzEzICAxNTUgIDZEICBHUkVFSyBMRVRURVIgTlUKMTEwICAwNi8xNCAgMTU2ICA2RSAgR1JFRUsgTEVUVEVSIEtTSQoxMTEgIDA2LzE1ICAxNTcgIDZGICBHUkVFSyBMRVRURVIgT01JQ1JPTgoxMTIgIDA3LzAwICAxNjAgIDcwICBHUkVFSyBMRVRURVIgUEkKMTEzICAwNy8wMSAgMTYxICA3MSAgR1JFRUsgTEVUVEVSIFJITwoxMTQgIDA3LzAyICAxNjIgIDcyICBHUkVFSyBMRVRURVIgU0lHTUEKMTE1ICAwNy8wMyAgMTYzICA3MyAgR1JFRUsgTEVUVEVSIFRBVQoxMTYgIDA3LzA0ICAxNjQgIDc0ICBHUkVFSyBMRVRURVIgVVBTSUxPTgoxMTcgIDA3LzA1ICAxNjUgIDc1ICBHUkVFSyBMRVRURVIgRkkKMTE4ICAwNy8wNiAgMTY2ICA3NiAgR1JFRUsgTEVUVEVSIFhJCjExOSAgMDcvMDcgIDE2NyAgNzcgIEdSRUVLIExFVFRFUiBQU0kKMTIwICAwNy8wOCAgMTcwICA3OCAgR1JFRUsgTEVUVEVSIE9NRUdBCjEyMSAgMDcvMDkgIDE3MSAgNzkgIFNQQUNFCjEyMiAgMDcvMTAgIDE3MiAgN0EgIFNQQUNFCjEyMyAgMDcvMTEgIDE3MyAgN0IgIExFRlQgQ1VSTFkgQlJBQ0tFVCwgTEVGVCBCUkFDRQoxMjQgIDA3LzEyICAxNzQgIDdDICBWRVJUSUNBTCBMSU5FLCBWRVJUSUNBTCBCQVIKMTI1ICAwNy8xMyAgMTc1ICA3RCAgUklHSFQgQ1VSTFkgQlJBQ0tFVCwgUklHSFQgQlJBQ0UKMTI2ICAwNy8xNCAgMTc2ICA3RSAgVElMREUKMTI3ICAwNy8xNSAgMTc3ICA3RiAgUlVCT1VULCBERUxFVEUKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIElJSS4xLjIuMy4gUEMgQ29kZSBQYWdlIDg2OQoKICAgKHRvIGJlIGZpbGxlZCBpbi4uLikKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIElJSS4yLiBVcGRhdGVkIENvdW50cnkgQ29kZXMKCiAgIERhdGU6IE1vbiwgNyBBcHIgMTk5NyAyMzoyMzo0OSBFRFQKICAgRnJvbTogRGF2ZSBMZWlib2xkIDxkbGVpYm9sZEBlbHNlLm5ldD4KICAgTmV3c2dyb3VwczogY29tcC5kY29tLnRlbGVjb20KICAgU3ViamVjdDogRXgtVVNTUiBDb3VudHJ5IENvZGVzIFByb2ZpbGUKICAgT3JnYW5pemF0aW9uOiBURUxFQ09NIERpZ2VzdAoKICAgRXgtVVNTUiBDb3VudHJ5IENvZGVzIFByb2ZpbGUKICAgNCBBcHJpbCAxOTk3CgogICBCZWxvdyBpcyBhIHN1bW1hcnkgb2YgdGhlIGNvdW50cnkgY29kZXMgdGhhdCBoYXZlIGZvcm1lZCBpbiB0aGUgd2FrZQogICBvZiB0aGUgVVNTUiBkaXNzb2x1dGlvbiwgYWxvbmcgd2l0aCBzb21lIHVwZGF0ZWQgZmluZGluZ3MgYW5kIHJlcG9ydHMuCiAgIEFkZGl0aW9uYWwgb3IgY29ycmVjdGVkIGluZm9ybWF0aW9uIG9uIGFueSBvZiB0aGVzZSBuYXRpb25zIHdvdWxkIGJlCiAgIHdlbGNvbWUgKGMvbyBkbGVpYm9sZEBlbHNlLm5ldCkuCiAgICAgKiBLeXJneXogUmVwdWJsaWMgY291bnRyeSBjb2RlIDk5NiB3aWxsIHRha2UgZWZmZWN0LCBhdCBsZWFzdCBpbgogICAgICAgQ2FuYWRhLCBlZmZlY3RpdmUgMSBNYXkgMTk5NywgYWNjb3JkaW5nIHRvIENSVEMgVGVsZWNvbSBPcmRlcgogICAgICAgOTctNDY0LCBiYXNlZCBvbiBTdGVudG9yIFRhcmlmZiBOb3RpY2UgNDMzLiBUaGVyZSBpcyBubyBpbmRpY2F0aW9uCiAgICAgICB3aGV0aGVyIHRoZXJlIHdpbGwgYmUgYSBwZXJtaXNzaXZlIGRpYWxpbmcgcGVyaW9kIGludm9sdmVkIG9yIGZvcgogICAgICAgaG93IGxvbmcgc3VjaCBhIHBlcm1pc3NpdmUgb3BlcmF0aW9uIHdvdWxkIHJlbWFpbi4KICAgICAqIENvdW50cnkgY29kZSA5OTIgd2FzIHJlcG9ydGVkIGFzIGEgcmVjZW50IGFzc2lnbm1lbnQgZm9yCiAgICAgICBUYWppa2lzdGFuLCB3aGljaCB3aWxsIGJlIG1vdmluZyBmcm9tIGNvdW50cnkgY29kZSA3IGF0IHNvbWUKICAgICAgIHVua25vd24gdGltZS4KICAgICAqIFV6YmVraXN0YW4gaGFzIGl0cyBvd24gY291bnRyeSBjb2RlIGFzc2lnbm1lbnQsIGJ1dCBJIGhhdmUgbm8KICAgICAgIGluZm9ybWF0aW9uIGlmIHRoaXMgaXMgaW4gc2VydmljZSB5ZXQgb3Igd2hhdCBpbXBsZW1lbnRhdGlvbiBkYXRlcwogICAgICAgaGF2ZSBiZWVuIHNldC4KICAgICAqIEthemFrc3RhbiBkb2VzIG5vdCBoYXZlIGEga25vd24gc2VwYXJhdGUgY291bnRyeSBjb2RlIGFzc2lnbm1lbnQKICAgICAgIGF0IHByZXNlbnQuIEl0IHJlbWFpbnMgaW4gY291bnRyeSBjb2RlIDcgZm9yIHRoZSB0aW1lIGJlaW5nLgogICAgICogUnVzc2lhIHNlZW1zIGRlc3RpbmVkIHRvIGtlZXAgY291bnRyeSBjb2RlIDcuCiAgICAgKiBSZWNlbnQgbmV3cyByZXBvcnRzIHNwZWFrIG9mIHNvbWUgYWdyZWVtZW50cyBmb3JtaW5nIGJldHdlZW4KICAgICAgIFJ1c3NpYSBhbmQgQmVsYXJ1cy4gV2hpbGUgdGhlcmUgaXMgbm8gb3V0cmlnaHQgcmV1bmlmaWNhdGlvbiB5ZXQsCiAgICAgICB0aGVyZSBpcyBleHBlY3RlZCB0byBiZSBtdWNoIGNsb3NlciB0aWVzIGJldHdlZW4gdGhlIHR3byBuYXRpb25zLgogICAgICAgV2hldGhlciB0aGlzIHdpbGwgbGVhZCB0byBhIHJldW5pZmljYXRpb24gb2YgdGVsZXBob25lIGNvZGVzCiAgICAgICByZW1haW5zIHRvIGJlIHNlZW4uCgogICBJbiB0aGUgdGFibGUsICJFZmZlY3RpdmUiIG1lYW5zIHRoZSBkYXRlIGF0IHdoaWNoIHRoZSBjb3VudHJ5IGNvZGUKICAgYmVnYW4gc2VydmljZSAod2hpY2ggY291bGQgdmFyeSBhY2NvcmRpbmcgdG8gdGhlIG5hdGlvbikuICJNYW5kYXRvcnkiCiAgIG1lYW5zIHRoZSBkYXRlIGF0IHdoaWNoIHRoZSBjb3VudHJ5IGNvZGUgNyBpcyBpbnZhbGlkIGZvciBjYWxscyB0bwogICB0aGF0IG5hdGlvbi4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHF1ZXN0aW9uIG1hcmtzIHNpbmNlIGV4YWN0IGRhdGVzCiAgIGhhdmUgbm90IGJlZW4gY29sbGVjdGVkIGluIGFsbCBjYXNlcy4KCkNDICBOYXRpb24gICAgICAgICAgICBFZmZlY3RpdmUgICAgIE1hbmRhdG9yeSAgICBOb3RlcwoKMzcwIExpdGh1YW5pYSAgICAgICAgIDE5OTM/ICAgICAgICAgPz8/ICAgICAgICAgIEFubm91bmNlZCBKYW4gMTk5MwozNzEgTGF0dmlhICAgICAgICAgICAgMTk5Mz8gICAgICAgICA/Pz8KMzcyIEVzdG9uaWEgICAgICAgICAgIDEgRmViIDE5OTM/ICAgTWFyY2ggMTk5Mz8KMzczIE1vbGRvdmEgICAgICAgICAgIDE5OTM/ICAgICAgICAgPz8/ICAgICAgICAgIEFubm91bmNlZCBKYW4gMTk5MwozNzQgQXJtZW5pYSAgICAgICAgICAgMSBNYXkgMTk5NSAgICAxIEp1bHkgMTk5NSAgQW5ub3VuY2VkIEphbiAxOTk1IChJVFUpCjM3NSBCZWxhcnVzICAgICAgICAgICAxNiBBcHIgMTk5NSAgIDE5OTc/CjM4MCBVa3JhaW5lICAgICAgICAgICAxNiBBcHIgMTk5NSAgIE9jdCAxOTk1Pwo3ICAgS2F6YWtzdGFuICAgICAgICAgKG5vIGtub3duIGNoYW5nZXMpCjcgICBSdXNzaWEgICAgICAgICAgICAocHJlc3VtYWJseSBub3QgY2hhbmdpbmcpCjk5MiBUYWppa2lzdGFuICAgICAgICA/Pz8gICAgICAgICAgID8/PyAgICAgICAgICBBbm5vdW5jZWQgMTk5Ni03Pwo5OTMgVHVya21lbmlzdGFuICAgICAgMyBKYW4gMTk5NyAgICAzIEFwciAxOTk3ICAgQ2FuYWRhIGFzIG9mIDI5IE5vdiAxOTk2Cjk5NCBBemVyYmFpamFuICAgICAgICBTZXB0IDE5OTQ/ICAgID8/PyAgICAgICAgICBBbm5vdW5jZWQgMTk5Mgo5OTUgR2VvcmdpYSAgICAgICAgICAgMTk5ND8gICAgICAgICA/Pz8gICAgICAgICAgcmVmOiBUZWxlY29tIERpZ2VzdCBPY3QgMTk5NAo5OTYgS3lyZ3l6IFJlcHVibGljICAgMSBNYXkgMTk5NyAgICA/Pz8gICAgICAgICAgcmVmOiBTdGVudG9yIENhbmFkYS9DUlRDCjk5OCBVemJla2lzdGFuICAgICAgICA/Pz8gICAgICAgICAgID8/PyAgICAgICAgICBBbm5vdW5jZWQgMTk5Nj8gKElUVSkKCiAgIERldGFpbHMgY291cnRlc3kgVG9ieSBOaXhvbiwgSVRVLCBTdGVudG9yIChDYW5hZGEpLCBDUlRDIChDYW5hZGEpLAogICBURUxFQ09NIERpZ2VzdCAoaW5jbHVkaW5nIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBmb3IgdGhlIGNvdW50cnkgY29kZQogICBsaXN0aW5ncykuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCklWLiBFUlJBVEEgJiBDT1JSSUdFTkRBCgogICBUaGUgZm9sbG93aW5nIGVycm9ycyBpbiBbNjM2XVVzaW5nIEMtS2VybWl0LCBTZWNvbmQgRWRpdGlvbiwgZmlyc3QKICAgcHJpbnRpbmcsIGhhdmUgYmVlbiBub3RlZC4KCiAgIEZpcnN0LCBzb21lIG1pc3NpbmcgYWNrbm93bGVkZ2VtZW50cyBmb3IgQy1LZXJtaXQgNi4wOiBKRSBKb25lcyBvZgogICBNaWNyb3dhcmUgZm9yIGhlbHAgd2l0aCBPUy05LCBOaWdlbCBSb2xlcyBmb3IgaGlzIGhlbHAgd2l0aCBQbGFuIDksCiAgIEx1Y2FzIEhhcnQgZm9yIGhlbHAgd2l0aCBWTVMgYW5kIERpZ2l0YWwgVU5JWCwgSWdvciBLb3ZhbGVua28gZm9yIGhpcwogICBoZWxwIHdpdGggUU5YLiBBbmQgbGF0ZXIsIHRvIFN1c2FuIEtsZWlubWFubiBmb3IgaGVyIGhlbHAgd2l0aCBEZWJpYW4KICAgTGludXggcGFja2FnaW5nOyBQYXRyaWNrIFZvbGtlcmRpbmcgZm9yIGhpcyBoZWxwIHdpdGggU2xhY2t3YXJlIExpbnV4CiAgIHBhY2thZ2luZzsgSmltIEtub2JsZSBmb3IgaGlzIGhlbHAgd2l0aCBSZWQgSGF0IExpbnV4IHBhY2thZ2luZzsgYW5kCiAgIHRvIGRvemVucyBvZiBvdGhlcnMgZm9yIHNlbmRpbmcgaW5kaXZpZHVhbCBDLUtlcm1pdCBiaW5hcmllcyBmb3IKICAgdmFyaWVkIGFuZCBkaXZlcnNlIHBsYXRmb3Jtcy4KCiAgIFRoYW5rcyB0byBKYW1lcyBTcGF0aCBmb3IgYm90aCBiaW5hcmllcyBhbmQgcmVwb3J0aW5nIG1hbnkgb2YgdGhlCiAgIHR5cG9zIG5vdGVkIGJlbG93LiBBbHNvIHRvIERhdCBUaHVjIE5ndXllbiBmb3Igc3BvdHRpbmcgc2V2ZXJhbCB0eXBvcy4KClBBR0UgICAgUkVNQVJLUwpDT1ZFUiAgICJDT1MiIGlzIGEgbWlzcHJpbnQuICBUaGVyZSBpcyBubyBDT1MuICBQcmV0ZW5kIGl0IHNheXMgIlNDTyIgb3IgIlZPUyIuCiAgICAgICAgKFRoaXMgaXMgZml4ZWQgaW4gdGhlIHNlY29uZCBwcmludGluZy4pCiB4eGkgICAgU2Vjb25kIGxpbmU6IEZyZWQgU21pdGgncyBhZmZpbGlhdGlvbiBzaG91bGQgYmUgQ29tcHV0cml0aW9uLgogODMgICAgIENoYW5nZSAiY29tbWFuZHMgb3RoZXIiIHRvICJjb21tYW5kcyBhcyBvdGhlciIgKDFzdCBwYXJhZ3JhcGgpCiA4NyAgICAgQ2hhbmdlICJUaGUgdGhlIiB0byAiVGhlIiAoMm5kIHBhcmFncmFwaCkKIDkyICAgICAic2V0IG1vZGVtLXR5cGUgdXNlci1kZWZpbmVkIHN1cHJhIiBzaG91bGQgYmUgInNldCBtb2RlbSB0eXBlIC4uLiIKIDk1ICAgICBDaGFuZ2UgIlZJIiB0byAidmkiICgxc3QgcGFyYWdyYXBoKQogOTYgICAgIENoYW5nZSAiaXQgaXQiIHRvICJpdCBpcyIgKDFzdCBwYXJhZ3JhcGgpCiA5NyAgICAgQ2hhbmdlICJhZHZhbnRhZ2UgYSBsaXRlcmFsIiB0byAiYWR2YW50YWdlIG9mIGEgbGl0ZXJhbCIgKDJuZAogICAgICAgIHBhcmFncmFwaCkKMTAyICAgICBUaGUgY2FsbC13YWl0aW5nIGV4YW1wbGUgd291bGQgYmUgYmV0dGVyIGFzIFNFVCBESUFMIFBSRUZJWCAqNzBXCiAgICAgICAgKHJhdGhlciB0aGFuICIqNzAsIikgYmVjYXVzZSB0aGUgZm9ybWVyIHdpbGwgbm90IGNhdXNlIGFuIGluY29ycmVjdAogICAgICAgIGNhbGwgdG8gYmUgcGxhY2VkIHdpdGggcHVsc2UgZGlhbGluZy4KMTIzICAgICBUaGlyZCBwYXJhZ3JhcGggZnJvbSBib3R0b206ICIuLm90aGVyd2lzZSBpZiBhIHlvdXIgbG9jYWwgdXNlcm5hbWUuLiIKICAgICAgICBzaG91bGQgYmUgIi4ub3RoZXJ3aXNlIHlvdXIgbG9jYWwgdXNlcm5hbWUuLiIuCjE2MCAgICAgRGVsZXRlIHRoZSAiaXQiIGJldHdlZW4gImFuZCIgYW5kICJ0byIgKDJuZCBwYXJhZ3JhcGgpCjE4NSAgICAgSW4gIldoZW4gVFJBTlNGRVIgRElTUExBWSBpcyBPRkYsIEMtS2VybWl0IHNraXBzIHRoZSBkaXNwbGF5Li4uIiwKICAgICAgICAiT0ZGIiBzaG91bGQgYmUgIk5PTkUiLgoxODcgICAgIFRoZSBsYXN0IHBhcmFncmFwaCBzYXlzIHRoZSAiQSBjb21tYW5kIiBpcyBpZ25vcmVkLCBzaG91bGQgYmUgIlMiLgoxOTQgICAgIENoYW5nZSAiaXQga25vd24iIHRvICJpdCBpcyBrbm93biIgKDR0aCBwYXJhZ3JhcGgpLgoyMzUgICAgIEluIEMtS2VybWl0IDcuMCwgdGhlIHN5bnRheCBvZiB0aGUgR0VUIGNvbW1hbmQgY2hhbmdlZC4gIE1HRVQgbm93CiAgICAgICAgbXVzdCBiZSB1c2VkIHRvIGdldCBhIGxpc3Qgb2YgZmlsZXMgYW5kIHRoZXJlIGlzIG5vIG1vcmUgbXVsdGlsaW5lCiAgICAgICAgR0VUIGNvbW1hbmQuCjI2OCAgICAgTGFzdCBwYXJhZ3JhcGg6ICJlZmZlY3QiIHNob3VsZCBiZSAiYWZmZWN0Ii4KMjc1ICAgICBJbiB0aGUgU0VUIFBST1RPQ09MIEtFUk1JVCBkZXNjcmlwdGlvbiwgdGhlIGZvbGxvd2luZyBzZW50ZW5jZSBpcwogICAgICAgIGluY29ycmVjdCBhbmQgc2hvdWxkIGJlIHJlbW92ZWQ6ICdJZiB5b3Ugb21pdCB0aGUgY29tbWFuZHMsIHRoZQogICAgICAgIGRlZmF1bHQgb25lcyBhcmUgcmVzdG9yZWQ6ICJrZXJtaXQgLWlyIiBhbmQgImtlcm1pdCAtciIgcmVzcGVjdGl2ZWx5Ii4KICAgICAgICBUaGUgY29ycmVjdCBpbmZvcm1hdGlvbiBpcyBnaXZlbiBhdCB0aGUgYm90dG9tIG9mIHBhZ2UgMjgxLgoyNzkgICAgIDl0aCBsaW5lLiAgVGhlIGRlY2ltYWwgdmFsdWUgb2YgU1QgaXMgMTU2LCBub3QgMTU1LgoyOTUgICAgIEluIHRoZSBzdGVwcGluZyBzdG9uZXMsIHNraXAgYWhlYWQgdG8gQ2hhcHRlciAxNyBvbiBwLiAzMjcuCjI5OCAgICAgVGFibGUgMTYtMiwgUG9ydHVndWVzZSBlbnRyeS4gIENvbHVtbiA0LzAwIHNob3VsZCBzaG93IHNlY3Rpb24gc2lnbiwKICAgICAgICBub3QgYWN1dGUgYWNjZW50LgozMTYgICAgIE90aGVyIGxhbmd1YWdlcyB3cml0dGVuIGluIHRoZSBIZWJyZXcgYWxwaGFiZXQgaW5jbHVkZSBLYXJhaW0gKGEgVHVya2ljCiAgICAgICAgbGFuZ3VhZ2Ugc3Bva2VuIGluIExpdGh1YW5pYSBhbmQgUG9sYW5kKSwgSnVkZW8tS3VyZGlzaCwgYW5kIEp1ZGVvLQogICAgICAgIEdlb3JnaWFuLgozMzIgICAgIFVOREVGSU5FIGRlZmluaXRpb24sIGNoYW5nZSAiVGhpcyBqdXN0IiB0byAiVGhpcyBpcyBqdXN0Ii4KMzQ0ICAgICBJdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gc2V0IHRoZSBtb2RlbSdzIHB1bHNlIGdlbmVyYXRpb24gcmF0ZSB3aGVuCiAgICAgICAgc2VuZGluZyBudW1lcmljIHBhZ2VzOyBtb3N0IEhheWVzIGNvbXBhdGlibGUgbW9kZW1zIHVzZSB0aGUgUzExCiAgICAgICAgcmVnaXN0ZXIgZm9yIHRoaXMuCjM1MCAgICAgRGVsZXRlICJpcyIgZnJvbSBiZXR3ZWVuICJJdCIgYW5kICJjZWFzZXMiICg0dGggcGFyYWdyYXBoKQozNTEgICAgIFRvcCAtIGJvdGggb2NjdXJyZW5jZXMgb2YgInByaW50IFwlYSIgc2hvdWxkIGJlICJlY2hvIFwlYSIuCjM2NCAgICAgXHYoaW5wdXQpIGFuZCBcdihxdWVyeSkgb3V0IG9mIGFscGhhYmV0aWNhbCBvcmRlci4KMzc4ICAgICBJbiB0aGUgTVlTRU5EIG1hY3JvLCAiaWYgbm90IFxtKHJjKSBnb3RvIGJhZCIgc2hvdWxkIGJlOgogICAgICAgICJpZiBcbShyYykgZ290byBiYWQiIChyZW1vdmUgdGhlICJub3QiKS4KMzgyLTM4MyBJdCBzaG91bGQgYmUgc3RhdGVkIHRoYXQgdGhlIGxvb3AgY29udHJvbCB2YXJpYWJsZSBtdXN0IGJlIG9mIHRoZSBcJWEKICAgICAgICB0eXBlLCBvciBlbHNlIGFuIGFycmF5IGVsZW1lbnQ7IG1hY3JvIG5hbWVzIGNhbiBub3QgYmUgdXNlZCBmb3IgdGhpcy4KMzgzICAgICBJbiBsaW5lIDMsICJcJWZbXCVpXSIgc2hvdWxkIGJlICJcJmZbXCVpXSIuCjM4MyAgICAgSW4gdGhlIHNvcnQgZXhhbXBsZSwgaXQgc2hvdWxkIGJlIHN0YXRlZCB0aGF0IHRoZSBhcnJheSBpcyAxLWJhc2VkLgozODcgICAgIENoYW5nZSAiWW91IGNhbiBsaXN0IiB0byAiWW91IGNhbiBnZXQgYSBsaXN0IiAoNXRoIHBhcmFncmFwaCkKMzkzICAgICBcRnZlcmlmeSgpIGRlc2NyaXB0aW9uLiAgVGhlIDNyZCBzZW50ZW5jZSBjb3VsZCBiZSBzdGF0ZWQgbW9yZSBjbGVhcmx5CiAgICAgICAgYXMgIklmIGFsbCBjaGFyYWN0ZXJzIGluIHN0cmluZzIgYXJlIGFsc28gaW4gc3RyaW5nMSwgMCBpcyByZXR1cm5lZC4iCjM5OCAgICAgQ29weWluZyBcZmZpbGVzKCkgcmVzdWx0cyB0byBhbiBhcnJheSBiZWZvcmUgaXMgbm90IHJlcXVpcmVkIGFzIG9mCiAgICAgICAgQy1LZXJtaXQgNy4wIChzZWUgWzYzN11TZWN0aW9uIDcuMykuCjQwMyAgICAgSW4gIihcJWEgKyAzKSAqIChcJWIgIDUpIiwgYSBtaW51cyBzaWduIGlzIG1pc3NpbmcgYmV0d2VlbiBiIGFuZCA1Lgo0MDcgICAgIEMtS2VybWl0IDcuMCBubyBsb25nZXIgc3VwcG9ydHMgbXVsdGlsaW5lIEdFVC4gIENoYW5nZQogICAgICAgICJnZXQsIFwlMSwgXCUyIiB0byAiZ2V0IHtcJTF9IHtcJTJ9IiBvciAiZ2V0IC9hczp7XCUyfSB7XCUxfSIuCjQwOSAgICAgUkVBRCBleGFtcGxlIHdoaWxlIGxvb3Agc2hvdWxkIGJlOgogICAgICAgIHdoaWxlIHN1Y2Nlc3MgeyBlY2hvIFxtKGxpbmUpLCByZWFkIGxpbmUgfQo0MDkgICAgICJXUklURSBmaWxlIiBzaG91bGQgYmUgIldSSVRFIGtleXdvcmQiICh5b3UgY2FuJ3QgcHV0IGEgZmlsZW5hbWUgdGhlcmUpCiAgICAgICAgKFRoZSBzYW1lIGFwcGxpZXMgdG8gV1JJVEUtTElORSAvIFdSSVRFTE4pLgo0MTQgICAgIFxGdW5oZXhpZnkoKSBtaXNzaW5nIGZyb20gVGFibGUgMTgtMy4KNDI1ICAgICBNSU5QVVQgZGVmaW5pdGlvbiwgY2hhbmdlIDJuZCAidGV4dDIiIHRvICJ0ZXh0MyIuCjQzNiAgICAgU2V2ZXJhbCBsaW5lcyBhcmUgbWlzc2luZyBmcm9tIHRoZSBVTklYTE9HSU4gbWFjcm8gbGlzdGluZy4KICAgICAgICBBZnRlciB0aGUgInhpZiBmYWlsIiBibG9jaywgaW5zZXJ0OgoKICAgICAgICAgIG91dCBcJTFcMTMgICAgICAgICAgICAgICAgICAgIDsgU2VuZCB1c2VybmFtZSwgY2FycmlhZ2UgcmV0dXJuCiAgICAgICAgICBpbnAgNSBQYXNzd29yZDogICAgICAgICAgICAgICA7IFdhaXQgNSBzZWMgZm9yIHRoaXMgcHJvbXB0CiAgICAgICAgICBpZiBmYWlsIGVuZCAxIE5vIHBhc3N3b3JkIHByb21wdAogICAgICAgICAgcGF1c2UgICAgICAgICAgICAgICAgICAgICAgICAgOyBXYWl0IGEgc2VjCiAgICAgICAgICBvdXQgXCUyXDEzICAgICAgICAgICAgICAgICAgICA7IFNlbmQgcGFzc3dvcmQKCjQ0MCAgICAgQ2hhbmdlICJzZXQgdGVybWluYWwgYnl0ZXN6aWUiIHRvICJzZXQgdGVybWluYWwgYnl0ZXNpemUiLgogICAgICAgIENoYW5nZSAiaW5wdXQgUGFzc3dvcmQ6IiB0byAiaW5wdXQgMTAgUGFzc3dvcmQiLgo0NDggICAgIEZyYW5jaGlzZSBzY3JpcHQ6ICJhY2Nlc3MgbGluZSIgc2hvdWxkIGJlICJhY2Nlc3MgXG0obGluZSkiLgo0NTMgICAgIFRoZXJlIGFyZSB0d28gaW5jb3JyZWN0bHkgY29kZWQgSUYgc3RhdGVtZW50cyBpbiB0aGUgREVMSVZFUiBtYWNybwogICAgICAgIGRlZmluaXRpb24uICBSZXBsYWNlIGJvdGggb2NjdXJyZW5jZXMgb2YgImlmID4gXCUxIFwlMyB7IiB3aXRoCiAgICAgICAgInhpZiA+IFwlaSBcJTMgeyIgKHJlcGxhY2UgImlmIiBieSAieGlmIiBhbmQgIlwlMSIgd2l0aCAiXCVpIikuCjQ1MyAgICAgInRoZSB0aGUiIChsYXN0IHBhcmFncmFwaCkgc2hvdWxkIGJlICJ0aGUiLgo0NTQgICAgIEVPVCAobGFzdCBwYXJhZ3JhcGgpIGlzIEVuZCBvZiBUcmFuc21pc3Npb24sIG5vdCBFbmQgb2YgVGV4dC4KNDU3ICAgICBfREVGSU5FIGRlZmluaXRpb246ICJuYW1lIGNvbnN0cnVjdGVkIiBzaG91bGQgYmUgIm5hbWUgaXMgY29uc3RydWN0ZWQiLgo0NTcgICAgICJtYWNybyBmb3IgYW5kIiAobGFzdCBwYXJhZ3JhcGgpIHNob3VsZCBiZSAibWFjcm8gYW5kIi4KNDU5ICAgICBTaG91bGQgZXhwbGFpbiB0aGF0IFx2KHVzZXIpIGlzIGEgbGVnYWwgYWJicmV2aWF0aW9uIG9mIFx2KHVzZXJpZCkuCjQ4MCAgICAgRmlndXJlIElJLTIgaXMgYmFja3dhcmRzOyB0aGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IGlzIHRyYW5zbWl0dGVkCiAgICAgICAgZmlyc3QsIHRoZW4gdXAgdG8gdGhlIGhpZ2hlc3QsIGFuZCB0aGUgcGFyaXR5IGJpdCBsYXN0Lgo1MzQgICAgIFRoZSBWTVMgQXBwZW5kaXggc2VjdGlvbiBvbiBPZGQgUmVjb3JkIExlbmd0aHMgbm8gbG9uZ2VyIGFwcGxpZXM7CiAgICAgICAgQy1LZXJtaXQgNy4wIGhhbmRsZXMgb2RkIHJlY29yZCBsZW5ndGhzIGFzIHdlbGwgYXMgZXZlbiBvbmVzLgo1NTkgICAgIFRhYmxlIFZJSUktMywgUG9ydHVndWVzZSBlbnRyeS4gIENvbHVtbiA0LzAwIHNob3VsZCBzaG93IHNlY3Rpb24gc2lnbiwKICAgICAgICBub3QgYWN1dGUgYWNjZW50Lgo1NjAtNTYzIEhQLVJvbWFuOCBtaXNzaW5nIGZyb20gVGFibGUgVklJLTQ7IHRoZXJlIHdhc24ndCByb29tIHRvIHNxdWVlemUgaXQgaW4uCiAgICAgICAgSXQgaXMgbGlzdGVkIGluIHNlY3Rpb24gSUkoNikuCjU2NSAgICAgImQgc3Ryb2tlIiBpbiBUYWJsZSBWSUktNSBoYXMgdGhlIHdyb25nIGFwcGVhcmFuY2U7IHRoZSBzdGVtIHNob3VsZAogICAgICAgIGJlIHVwcmlnaHQuICBUaGUgbGV0dGVyIHNob3duIGluIHRoZSB0YWJsZSBpcyBhY3R1YWxseSBhIGxvd2VyY2FzZQogICAgICAgIEljZWxhbmRpYyBldGgsIHdoaWNoIGhhcyBhIGN1cnZlZCBzdGVtLgo2MDEtNjA0IEJlQm94LCBCZU9TLCBQbGFuIDksIGFuZCBwcm9iYWJseSBvdGhlcnMgbm90IGxpc3RlZCBpbiB0cmFkZW1hcmtzLgo2MDQgICAgIFRoZSB3b3JkcyAiU0NSSUJFIFRFWFQgRk9STUFUVEVSIiBhcHBlYXIgYXQgdGhlIGVuZCBvZiB0aGUgbGFzdAogICAgICAgIHNlbnRlbmNlIG9mIHRoZSBmaXJzdCBwYXJhZ3JhcGggb2YgdGhlIENvbG9waG9uLiAgVGhleSBzaG91bGQgaGF2ZQogICAgICAgIGJlZW4gaW4gdGhlIEluZGV4LgpJbmRleDogIE1pc3NpbmcgZW50cmllczogU0VUIHsgU0VORCwgUkVDRUlWRSB9IFBBVEhOQU1FUywgQ2FsbCB3YWl0aW5nLCAuLi4KICAgICAgICBcRigpICAgICAgICAgICAgUGFnZSA2MDUsIGFkZCBhbHNvIDQxMy00MTQKICAgICAgICBcRmJyZWFrICAgICAgICAgMzg5CiAgICAgICAgXEZjYXBpdGFsaXplICAgIDM5MAogICAgICAgIFxGY2hlY2tzdW0gICAgICA0MTQKICAgICAgICBcRmNyYzE2ICAgICAgICAgNDE0CiAgICAgICAgXEZleGVjdXRlICAgICAgIDQxNAogICAgICAgIFxGaGV4aWZ5ICAgICAgICAzOTAKICAgICAgICBcRmx0cmltICAgICAgICAgMzkxCiAgICAgICAgXEZyZXBlYXQgICAgICAgIDM5MgogICAgICAgIFxGc3Bhd24gICAgICAgICAzOTIKICAgICAgICBcRnRvZDJzZWNzICAgICAgMzk5CiAgICAgICAgXHYoKSBidWlsdF9pbiAgIFBhZ2UgNjA2LCBhZGQgYWxzbyAzNjEtMzY0CiAgICAgICAgXHYoX2xpbmUpICAgICAgIDM1NCwgMzYxCiAgICAgICAgXHYoYXBjYWN0aXZlKSAgIDM2MQogICAgICAgIFx2KGNoYXJzZXQpICAgICAzNjIKICAgICAgICBcdihjcHUpICAgICAgICAgMzYyCiAgICAgICAgXHYoY3JjMTYpICAgICAgIDM1NywgMzYyCiAgICAgICAgXHYoZCR4eHgpICAgICAgIGFkZCBwYWdlIDM2MgogICAgICAgIFx2KGRpYWxudW1iZXIpICAzNjIKICAgICAgICBcdihkaWFscmVzdWx0KSAgMzYyCiAgICAgICAgXHYoZXJybm8pICAgICAgIDM2MgogICAgICAgIFx2KGVycnN0cmluZykgICAzNjIKICAgICAgICBcdihleGVkaXIpICAgICAgMzYyCiAgICAgICAgXHYoaW5pZGlyKSAgICAgIDM2MwogICAgICAgIFx2KGlwYWRkcmVzcykgICAzNjMKICAgICAgICBcdihrZXlib2FyZCkgICAgMzYzCiAgICAgICAgXHYobWFjcm8pICAgICAgIDM2MwogICAgICAgIFx2KG1pbnB1dCkgICAgICAzNjMKICAgICAgICBcdihtX3h4eCkgICAgICAgOTQsIDM2MwogICAgICAgIFx2KHBhc3N3b3JkKSAgICAzNjQKICAgICAgICBcdihxdWVyeSkgICAgICAgMzY0CiAgICAgICAgXHYocHJvbXB0KSAgICAgIDM2NAogICAgICAgIFx2KHNwZWVkKSAgICAgICAzNTYsIDM2NAogICAgICAgIFx2KHN0YXJ0dXApICAgICAzNjQKICAgICAgICBcdihzdGF0dXMpICAgICAgMzY0CiAgICAgICAgXHYoc3lzaWQpICAgICAgIDM2NAogICAgICAgIFx2KHN5c3RlbSkgICAgICAzNjQKICAgICAgICBcdihmc2l6ZSkgICAgICAgYXQgbG93ZXIgaGFsZiBwYWdlIDYwNiBzaG91bGQgcmVhZCBcdih0ZnNpemUpCiAgICAgICAgXHYoeHZlcnNpb24pICAgIDM2NAogICAgICAgIEJFRVAgQ29tbWFuZCAgICA0MAogICAgICAgIFNFVCBGTE9XICAgICAgICA2MiwgMjEyCgogICBGaWd1cmUgSUktNSBvbiBwYWdlIDQ5My4gVGhlIHBpbiBhc3NpZ25tZW50cyBvZiB0aGUgTWluaSBEaW4tOAogICBjb25uZWN0b3IgYXJlIG5vdCBkZXNjcmliZWQgYW55d2hlcmUuIEFzIG5vdGVkIGluIHRoZSB0ZXh0LCB0aGVzZSB0ZW5kCiAgIHRvIHZhcnkgZnJvbSB2ZW5kb3IgdG8gdmVuZG9yLiBPbmUgY29tbW9uIGFycmFuZ2VtZW50IGlzOgoKICAxLiBIU0tvdXQgKEhhbmRzaGFrZSBvdXQgLS0gZGVmaW5pdGlvbiBkZXBlbmRzIG9uIHNvZnR3YXJlKQogIDIuIEhTS2luICAoSGFuZHNoYWtlIGluIG9yIGV4dGVybmFsIGNsb2NrKQogIDMuIFR4RC0KICA0LiBOb3QgdXNlZAogIDUuIFJ4RC0KICA2LiBUeEQrCiAgNy4gTm90IHVzZWQKICA4LiBSeEQrCgogICBOb3RlIHRoZSAiYmFsYW5jZWQgcGFpcnMiIGZvciBSZWNlaXZlIERhdGEgKFJ4RCkgYW5kIFRyYW5zbWl0IERhdGEKICAgKFR4RCksIGFuZCB0aGUgdXR0ZXIgbGFjayBvZiBtb2RlbSBzaWduYWxzLiBUaGVzZSBjb25uZWN0b3JzIGZvbGxvdwogICB0aGUgUlMtNDIzIHN0YW5kYXJkLCByYXRoZXIgdGhhbiBSUy0yMzIuIEluIHNvbWUgYXJyYW5nZW1lbnRzLCBQaW4gMQogICBpcyB1c2VkIGZvciBEVFIgYW5kIFBpbiAyIGZvciBDRDsgaW4gb3RoZXJzIFBpbiAxIGlzIFJUUyBhbmQgUGluIDIgaXMKICAgQ1RTLgoKICAgUGxlYXNlIHNlbmQgcmVwb3J0cyBvZiBvdGhlciBlcnJvcnMgdG8gdGhlIGF1dGhvcnMsIGFzIHdlbGwgYXMKICAgc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50cywgYWRkaXRpb25hbCBpbmRleCBlbnRyaWVzLCBhbmQgYW55IG90aGVyCiAgIGNvbW1lbnRzOgoKICAgWzYzOF1rZXJtaXRAY29sdW1iaWEuZWR1CiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkFQUEVORElYIFYuIEFERElUSU9OQUwgQ09QWVJJR0hUIE5PVElDRVMKCiAgIFRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cyBjb3ZlciBzb21lIG9mIHRoZSBzb3VyY2UgY29kZSB1c2VkIGluIHRoZQogICBkZXZlbG9wbWVudCBvZiBDLUtlcm1pdCwgS2VybWl0IDk1LCBvciBLZXJtaXQgOTUgc3VwcG9ydCBsaWJyYXJpZXMuCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5NSBieSBPeSBPbmxpbmUgU29sdXRpb25zIEx0ZC4gICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgRGlzdHJpYnV0aW9uIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgc3RyaWN0bHkgZm9yYmJpZGRlbi4gVXNlIG9mIHRoaXMgICAgKi8KLyogICBzb3VyY2UgY29kZSBpcyBncmFudGVkIHRvIHRoZSBVbml2ZXJzaXR5IG9mIENvbHVtYmlhIEMtS2VybWl0IHByb2plY3QgICAqLwovKiAgIHRvIGJlIGRpc3RyaWJ1dGVkIGluIGJpbmFyeSBmb3JtYXQgb25seS4gUGxlYXNlIGZhbWlsaWFyaXplIHlvdXJzZWxmICAgICovCi8qICAgd2l0aCB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UuUCBmaWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICB1c2VkIGZvciBYbW9kZW0sIFltb2RlbSwgYW5kIFptb2RlbSBwcm90b2NvbCBpbiBLZXJtaXQgOTUgKHA5NS5kbGwsCiAgIHAyLmRsbCkKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgQ29weXJpZ2h0IChjKSAxOTk3IFN0YW5mb3JkIFVuaXZlcnNpdHkKCiAgIFRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBmb3IgcmV2ZW51ZS1nZW5lcmF0aW5nIHB1cnBvc2VzIG1heSByZXF1aXJlIGEKICAgbGljZW5zZSBmcm9tIHRoZSBvd25lcnMgb2YgdGhlIHVuZGVybHlpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5LgogICBTcGVjaWZpY2FsbHksIHRoZSBTUlAtMyBwcm90b2NvbCBtYXkgbm90IGJlIHVzZWQgZm9yCiAgIHJldmVudWUtZ2VuZXJhdGluZyBwdXJwb3NlcyB3aXRob3V0IGEgbGljZW5zZS4KCiAgIFdpdGhpbiB0aGF0IGNvbnN0cmFpbnQsIHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZAogICBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cyBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcwogICBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZXMKICAgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZAogICByZWxhdGVkIGRvY3VtZW50YXRpb24uCgogICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTLUlTIiBBTkQgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwKICAgRVhQUkVTUywgSU1QTElFRCBPUiBPVEhFUldJU0UsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04sIEFOWQogICBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCgogICBJTiBOTyBFVkVOVCBTSEFMTCBTVEFORk9SRCBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkNJREVOVEFMLAogICBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT0YgQU5ZIEtJTkQsIE9SIEFOWSBEQU1BR0VTCiAgIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBPUiBOT1QKICAgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgREFNQUdFLCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCiAgIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKICAgU09GVFdBUkUuCgogICBVc2VkIGZvciBTZWN1cmUgUmVtb3RlIFBhc3N3b3JkIChUTSkgcHJvdG9jb2wgKFNSUCkgaW4gQy1LZXJtaXQsCiAgIEtlcm1pdCA5NSAoazk1LmV4ZSwgazIuZXhlLCBrOTVjcnlwdC5kbGwsIGsyY3J5cHQuZGxsKQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBDb3B5cmlnaHQgMTk5MCBieSB0aGUgTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neS4gQWxsCiAgIFJpZ2h0cyBSZXNlcnZlZC4KCiAgIEV4cG9ydCBvZiB0aGlzIHNvZnR3YXJlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSBtYXkgcmVxdWlyZQogICBhIHNwZWNpZmljIGxpY2Vuc2UgZnJvbSB0aGUgVW5pdGVkIFN0YXRlcyBHb3Zlcm5tZW50LiBJdCBpcyB0aGUKICAgcmVzcG9uc2liaWxpdHkgb2YgYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24gY29udGVtcGxhdGluZyBleHBvcnQgdG8KICAgb2J0YWluIHN1Y2ggYSBsaWNlbnNlIGJlZm9yZSBleHBvcnRpbmcuCgogICBXSVRISU4gVEhBVCBDT05TVFJBSU5ULCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQKICAgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kCiAgIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZAogICB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0CiAgIHRoZSBuYW1lIG9mIE0uSS5ULiBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZwogICB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IKICAgcGVybWlzc2lvbi4gTS5JLlQuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YKICAgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzCiAgIG9yIGltcGxpZWQgd2FycmFudHkuCgogICBVc2VkIGZvciBUZWxuZXQgQXV0aGVudGljYXRpb24gT3B0aW9uLCBUZWxuZXQgRW5jcnlwdGlvbiBPcHRpb24sIGFuZAogICBLZXJiZXJvcyAoVE0pIGF1dGhlbnRpY2F0aW9uIGluIEMtS2VybWl0LCBLZXJtaXQgOTUgKGs5NS5leGUsIGsyLmV4ZSwKICAgazk1Y3J5cHQuZGxsLCBrMmNyeXB0LmRsbCkKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCiAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogICBtZXQ6CiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgogICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogICAgICAgZGlzdHJpYnV0aW9uLgogICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCiAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6CgogICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKICAgICBDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KICAgIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMKICAgICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAogICAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJwogICBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKICAgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgogICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMKICAgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgogICBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogICBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IKICAgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCiAgIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFCiAgIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4KICAgSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgogICBVc2VkIGZvciBUZWxuZXQgQXV0aGVudGljYXRpb24gT3B0aW9uLCBUZWxuZXQgRW5jcnlwdGlvbiBPcHRpb24sIGFuZAogICBLZXJiZXJvcyAoVE0pIGF1dGhlbnRpY2F0aW9uIGluIEMtS2VybWl0LCBLZXJtaXQgOTUgKGs5NS5leGUsIGsyLmV4ZSwKICAgazk1Y3J5cHQuZGxsLCBrMmNyeXB0LmRsbCkKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgRXJpYyBZb3VuZyAoZWF5QGNyeXB0c29mdC5jb20pIEFsbCByaWdodHMKICAgcmVzZXJ2ZWQuCgogICBUaGlzIHBhY2thZ2UgaXMgYW4gREVTIGltcGxlbWVudGF0aW9uIHdyaXR0ZW4gYnkgRXJpYyBZb3VuZwogICAoZWF5QGNyeXB0c29mdC5jb20pLiBUaGUgaW1wbGVtZW50YXRpb24gd2FzIHdyaXR0ZW4gc28gYXMgdG8gY29uZm9ybQogICB3aXRoIE1JVCdzIGxpYmRlcy4KCiAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIGZvciBjb21tZXJjaWFsIGFuZCBub24tY29tbWVyY2lhbCB1c2UgYXMgbG9uZyBhcwogICB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIGFoZWFyZWQgdG8uIFRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogICBhcHBseSB0byBhbGwgY29kZSBmb3VuZCBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4KCiAgIENvcHlyaWdodCByZW1haW5zIEVyaWMgWW91bmcncywgYW5kIGFzIHN1Y2ggYW55IENvcHlyaWdodCBub3RpY2VzIGluCiAgIHRoZSBjb2RlIGFyZSBub3QgdG8gYmUgcmVtb3ZlZC4gSWYgdGhpcyBwYWNrYWdlIGlzIHVzZWQgaW4gYSBwcm9kdWN0LAogICBFcmljIFlvdW5nIHNob3VsZCBiZSBnaXZlbiBhdHRyaWJ1dGlvbiBhcyB0aGUgYXV0aG9yIG9mIHRoYXQgdGhlIFNTTAogICBsaWJyYXJ5LiBUaGlzIGNhbiBiZSBpbiB0aGUgZm9ybSBvZiBhIHRleHR1YWwgbWVzc2FnZSBhdCBwcm9ncmFtCiAgIHN0YXJ0dXAgb3IgaW4gZG9jdW1lbnRhdGlvbiAob25saW5lIG9yIHRleHR1YWwpIHByb3ZpZGVkIHdpdGggdGhlCiAgIHBhY2thZ2UuCgogICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICAgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogICBtZXQ6CiAgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGNvcHlyaWdodCBub3RpY2UsCiAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgogICAgICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogICAgICAgZGlzdHJpYnV0aW9uLgogICAgMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzCiAgICAgICBzb2Z0d2FyZSBtdXN0IGRpc3BsYXkgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnZW1lbnQ6IFRoaXMgcHJvZHVjdAogICAgICAgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IEVyaWMgWW91bmcgKGVheUBjcnlwdHNvZnQuY29tKQoKICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBFUklDIFlPVU5HIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICAgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogICBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCiAgIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICAgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUKICAgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUwogICBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUgogICBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKICAgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgogICBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCiAgIFRoZSBsaWNlbnNlIGFuZCBkaXN0cmlidXRpb24gdGVybXMgZm9yIGFueSBwdWJsaWNhbGx5IGF2YWlsYWJsZQogICB2ZXJzaW9uIG9yIGRlcml2YXRpdmUgb2YgdGhpcyBjb2RlIGNhbm5vdCBiZSBjaGFuZ2VkLiBpLmUuIHRoaXMgY29kZQogICBjYW5ub3Qgc2ltcGx5IGJlIGNvcGllZCBhbmQgcHV0IHVuZGVyIGFub3RoZXIgZGlzdHJ1YnV0aW9uIGxpY2Vuc2UKICAgW2luY2x1ZGluZyB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLl0KCiAgIFRoZSByZWFzb24gYmVoaW5kIHRoaXMgYmVpbmcgc3RhdGVkIGluIHRoaXMgZGlyZWN0IG1hbm5lciBpcyBwYXN0CiAgIGV4cGVyaWVuY2UgaW4gY29kZSBzaW1wbHkgYmVpbmcgY29waWVkIGFuZCB0aGUgYXR0cmlidXRpb24gcmVtb3ZlZAogICBmcm9tIGl0IGFuZCB0aGVuIGJlaW5nIGRpc3RyaWJ1dGVkIGFzIHBhcnQgb2Ygb3RoZXIgcGFja2FnZXMuIFRoaXMKICAgaW1wbGVtZW50YXRpb24gd2FzIGEgbm9uLXRyaXZpYWwgYW5kIHVucGFpZCBlZmZvcnQuCgogICBVc2VkIERFUyBlbmNyeXB0aW9uIGluIEtlcm1pdCA5NSAoazk1Y3J5cHQuZGxsLCBrMmNyeXB0LmRsbCkKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICogVGhpcyBpcyB2ZXJzaW9uIDEuMSBvZiBDcnlwdG9MaWIKICoKICogVGhlIGF1dGhvcnMgb2YgdGhpcyBzb2Z0d2FyZSBhcmUgSmFjayBMYWN5LCBEb24gTWl0Y2hlbGwgYW5kIE1hdHQgQmxhemUKICogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MiwgMTk5MywgMTk5NCwgMTk5NSBieSBBVCZULgogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgYW5kIG1vZGlmeSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgZmVlCiAqIGlzIGhlcmVieSBncmFudGVkLCBwcm92aWRlZCB0aGF0IHRoaXMgZW50aXJlIG5vdGljZSBpcyBpbmNsdWRlZCBpbgogKiBhbGwgY29waWVzIG9mIGFueSBzb2Z0d2FyZSB3aGljaCBpcyBvciBpbmNsdWRlcyBhIGNvcHkgb3IKICogbW9kaWZpY2F0aW9uIG9mIHRoaXMgc29mdHdhcmUgYW5kIGluIGFsbCBjb3BpZXMgb2YgdGhlIHN1cHBvcnRpbmcKICogZG9jdW1lbnRhdGlvbiBmb3Igc3VjaCBzb2Z0d2FyZS4KICoKICogTk9URToKICogU29tZSBvZiB0aGUgYWxnb3JpdGhtcyBpbiBjcnlwdG9saWIgbWF5IGJlIGNvdmVyZWQgYnkgcGF0ZW50cy4KICogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IGFueSByZXF1aXJlZAogKiBsaWNlbnNlcyBhcmUgb2J0YWluZWQuCiAqCiAqCiAqIFNPTUUgUEFSVFMgT0YgQ1JZUFRPTElCIE1BWSBCRSBSRVNUUklDVEVEIFVOREVSIFVOSVRFRCBTVEFURVMgRVhQT1JUCiAqIFJFR1VMQVRJT05TLgogKgogKgogKiBUSElTIFNPRlRXQVJFIElTIEJFSU5HIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAogKiBXQVJSQU5UWS4gIElOIFBBUlRJQ1VMQVIsIE5FSVRIRVIgVEhFIEFVVEhPUlMgTk9SIEFUJlQgTUFLRSBBTlkKICogUkVQUkVTRU5UQVRJT04gT1IgV0FSUkFOVFkgT0YgQU5ZIEtJTkQgQ09OQ0VSTklORyBUSEUgTUVSQ0hBTlRBQklMSVRZCiAqIE9GIFRISVMgU09GVFdBUkUgT1IgSVRTIEZJVE5FU1MgRk9SIEFOWSBQQVJUSUNVTEFSIFBVUlBPU0UuCgogICBVc2VkIGZvciBCaWcgTnVtYmVyIGxpYnJhcnkgaW4gS2VybWl0IDk1IChrOTVjcnlwdC5kbGwsIGsyY3J5cHQuZGxsKS4KCiAgIFsgWzYzOV1Ub3AgXSBbIFs2NDBdQy1LZXJtaXQgXSBbIFs2NDFdS2VybWl0IEhvbWUgXQogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBDS0VSTUlUNzAuSFRNIC8gVGhlIEtlcm1pdCBQcm9qZWN0IC8gQ29sdW1iaWEgVW5pdmVyc2l0eSAvIDggRmViIDIwMDAKClJlZmVyZW5jZXMKCiAgIDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCNjb250ZW50cwogICAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdC5odG1sCiAgIDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pbmRleC5odG0KICAgNC4gbWFpbHRvOmtlcm1pdC1zdXBwb3J0QGNvbHVtYmlhLmVkdQogICA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvCiAgIDYuIGh0dHA6Ly93d3cua2VybWl0LXByb2plY3Qub3JnLwogICA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLm55Yy5ueS51cy9rZXJtaXQvCiAgIDguIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvQ09QWUlORy5UWFQKICAgOS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2NtYWkuYwogIDEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeHYKICAxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAgMTIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2tjYndyLnR4dAogIDEzLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrdWJ3ci50eHQKICAxNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja3Zid3IudHh0CiAgMTUuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1YndyLnR4dAogIDE2LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrZXJtaXQ3MC50eHQKICAxNy4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9zZWN1cml0eS50eHQKICAxOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bQogIDE5LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2lrc2QudHh0CiAgMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pa3NkLmh0bQogIDIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY3Vpa3NkLmh0bQogIDIyLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL3RlbG5ldC50eHQKICAyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3RlbG5ldC5odG0KICAyNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9DT1BZSU5HLlRYVAogIDI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvazk1Lmh0bWwKICAyNi4gaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy8KICAyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAgMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aQogIDI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeGlpCiAgMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MAogIDMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEKICAzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjAKICAzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjEKICAzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIKICAzNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjMKICAzNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjQKICAzNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUKICAzOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUuMQogIDM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS4yCiAgNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41LjMKICA0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUuNAogIDQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS41CiAgNDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS42CiAgNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS43CiAgNDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS44CiAgNDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS45CiAgNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xMAogIDQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTEKICA0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjEKICA1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjIKICA1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjMKICA1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjQKICA1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjUKICA1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjYKICA1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjExLjcKICA1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjEyCiAgNTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xMwogIDU4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTQKICA1OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjE1CiAgNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xNgogIDYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTcKICA2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjE4CiAgNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4xOQogIDY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjAKICA2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIxCiAgNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMgogIDY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuMQogIDY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuMgogIDY5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuMwogIDcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuNAogIDcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuNQogIDcyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuNgogIDczLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuNwogIDc0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuOAogIDc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjMKICA3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjI0CiAgNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MgogIDc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMAogIDc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMQogIDgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xCiAgODEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjIKICA4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMwogIDgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS40CiAgODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjUKICA4NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuNgogIDg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS43CiAgODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjgKICA4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuOQogIDg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMAogIDkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMQogIDkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMgogIDkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMwogIDkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xNAogIDk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xNQogIDk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xNgogIDk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMgogIDk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMi4xCiAgOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4yLjIKICA5OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjMKIDEwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjMuMAogMTAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMy4xCiAxMDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjIKIDEwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjMuMwogMTA0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMy40CiAxMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4zLjUKIDEwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjMuNgogMTA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNAogMTA4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNQogMTA5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNgogMTEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNwogMTExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy4wCiAxMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43LjEKIDExMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjcuMgogMTE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy4zCiAxMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43LjQKIDExNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjcuNC4xCiAxMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43LjQuMgogMTE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNy40LjMKIDExOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjcuNC40CiAxMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43LjQuNQogMTIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuOAogMTIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuOQogMTIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuOS4xCiAxMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi45LjIKIDEyNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEwCiAxMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xMQogMTI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMTIKIDEyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEzCiAxMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xNAogMTMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMTUKIDEzMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gzCiAxMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4My4xCiAxMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4My4yCiAxMzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4My4zCiAxMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4My40CiAxMzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NAogMTM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMAogMTM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMQogMTM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMS4xCiAxNDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xLjIKIDE0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEuMwogMTQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMgogMTQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4xCiAxNDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjEuMQogMTQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4xLjIKIDE0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuMS4zCiAxNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjIKIDE0OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuMi4xCiAxNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjIuMgogMTUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4zCiAxNTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjMuMQogMTUyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4zLjIKIDE1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNAogMTU0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi41CiAxNTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjYKIDE1Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNwogMTU3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi44CiAxNTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjguMQogMTU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi44LjIKIDE2MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuOC4zCiAxNjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjguNAogMTYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMwogMTYzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMy4xCiAxNjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4zLjIKIDE2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMuMwogMTY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMy40CiAxNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC40CiAxNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC40LjEKIDE2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjQuMS4xCiAxNzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC40LjEuMgogMTcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNC4yCiAxNzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC40LjIuMQogMTczLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNC4yLjEuMQogMTc0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNC4yLjEuMgogMTc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNC4yLjIKIDE3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUKIDE3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUuMQogMTc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNS4yCiAxNzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC41LjIuMQogMTgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNS4yLjIKIDE4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUuMwogMTgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNS40CiAxODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC42CiAxODQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC43CiAxODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC43LjEKIDE4Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcuMgogMTg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4zCiAxODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC44CiAxODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC44LjEKIDE5MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjguMgogMTkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOQogMTkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOS4xCiAxOTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45LjIKIDE5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMwogMTk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTAKIDE5Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjExCiAxOTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS4xCiAxOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS4yCiAxOTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS4zCiAyMDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS40CiAyMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS41CiAyMDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS42CiAyMDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMgogMjA0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTMKIDIwNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE0CiAyMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNQogMjA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTYKIDIwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE3CiAyMDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNy4xCiAyMTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNy4yCiAyMTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xOAogMjEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTkKIDIxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwCiAyMTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4xCiAyMTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yCiAyMTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yLjEKIDIxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwLjIuMgogMjE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjAuMi4zCiAyMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMC4yLjQKIDIyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwLjIuNQogMjIxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjAuMwogMjIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjEKIDIyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIyCiAyMjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi4xCiAyMjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi4yCiAyMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi4zCiAyMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi40CiAyMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi41CiAyMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi42CiAyMzAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi43CiAyMzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMi44CiAyMzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMwogMjMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjQKIDIzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjI1CiAyMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NQogMjM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMAogMjM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMQogMjM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMgogMjM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMwogMjQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMy4xCiAyNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NS4zLjIKIDI0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g1LjQKIDI0My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g1LjUKIDI0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g1LjYKIDI0NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g1LjcKIDI0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2CiAyNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni4wCiAyNDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni4xCiAyNDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni4yCiAyNTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni4zCiAyNTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni40CiAyNTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni41CiAyNTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni42CiAyNTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni42LjEKIDI1NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuMgogMjU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi4yCiAyNTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni42LjMKIDI1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuNAogMjU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41CiAyNjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni42LjUuMQogMjYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41LjIKIDI2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjYuNS4zCiAyNjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni42LjUuNAogMjY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41LjUKIDI2NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjcKIDI2Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3CiAyNjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4wCiAyNjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xCiAyNjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xLjEKIDI3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEuMgogMjcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMS4zCiAyNzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xLjQKIDI3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIKIDI3NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjMKIDI3NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjQKIDI3Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjUKIDI3Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjYKIDI3OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjcKIDI3OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjgKIDI4MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjkKIDI4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjkuMQogMjgyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuOS4yCiAyODMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMAogMjg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMQogMjg1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMgogMjg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMwogMjg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNAogMjg4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNQogMjg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNgogMjkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNwogMjkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuOAogMjkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuOQogMjkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMTAKIDI5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjExCiAyOTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMgogMjk2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTMKIDI5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjE0CiAyOTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xNQogMjk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTYKIDMwMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjE3CiAzMDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xOAogMzAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTkKIDMwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIwCiAzMDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMC4xCiAzMDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMC4yCiAzMDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMQogMzA3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjIKIDMwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIzCiAzMDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yNAogMzEwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjUKIDMxMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjI2CiAzMTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yNi4xCiAzMTMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yNi4yCiAzMTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yNwogMzE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDgKIDMxNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g5CiAzMTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OS4wCiAzMTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OS4xCiAzMTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OS4yCiAzMjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OS4zCiAzMjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MTAKIDMyMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3hpaWkKIDMyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3hpaWkuMQogMzI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeGlpaS4xLjEKIDMyNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3hpaWkuMS4yCiAzMjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWlpLjEuMi4xCiAzMjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWlpLjEuMi4yCiAzMjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWlpLjEuMi4zCiAzMjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4aWlpLjIKIDMzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3hpdgogMzMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeHYKIDMzMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAzMzMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2JyZXZpZXdzLmh0bWwKIDMzNC4gaHR0cDovL3d3dy5iaHVzYS5jb20vCiAzMzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9tYW51YWxzLmh0bWwjY2tkZQogMzM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvbWFudWFscy5odG1sI2t0YgogMzM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvbmV3cy5odG1sCiAzMzguIG5ld3M6Y29tcC5wcm90b2NvbHMua2VybWl0LmFubm91bmNlCiAzMzkuIG5ld3M6Y29tcC5wcm90b2NvbHMua2VybWl0Lm1pc2MKIDM0MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAzNDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NAogMzQyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMwogMzQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjMKIDM0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUuMQogMzQ1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQogMzQ2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4xCiAzNDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45LgogMzQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDM0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjkuMgogMzUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMTUKIDM1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g5LjEKIDM1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjYKIDM1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjQKIDM1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMQogMzU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjbWpkCiAzNTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCNtamQKIDM1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKIDM1OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAzNTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogMzYwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQogMzYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMTIKIDM2Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUKIDM2My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMQogMzY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41CiAzNjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CiAzNjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xOAogMzY3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNAogMzY4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTUKIDM2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMKIDM3MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjMKIDM3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjcKIDM3Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEKIDM3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMQogMzc0LiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrY2NmZy50eHQKIDM3NS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2NjZmcudHh0CiAzNzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMi40CiAzNzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMi41CiAzNzguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogMzc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMjIuNQogMzgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTIKIDM4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMTYKIDM4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjcKIDM4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjMuNQogMzg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQogMzg1LiBodHRwOi8vd3d3LnRlbGVmb25pY2EuZXMvY2FtYmlvZGVudW1lcmFjaW9uLwogMzg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQogMzg3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDM4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjIuMgogMzg5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMQogMzkwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMwogMzkxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMS4xMgogMzkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDM5My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuMQogMzk0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDM5NS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiAzOTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjcKIDM5Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjEuNgogMzk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDM5OS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi90ZWxuZXQudHh0CiA0MDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC90ZWxuZXQuaHRtCiA0MDEuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvdGVsbmV0LnR4dAogNDAyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvdGVsbmV0Lmh0bQogNDAzLiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMxNTcyLnR4dAogNDA0LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmM3NzkudHh0CiA0MDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNDA2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuMTAKIDQwNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjgKIDQwOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUKIDQwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwCiA0MTAuIGh0dHA6Ly93d3cucHN5LnVxLm96LmF1L35mdHAvQ3J5cHRvLwogNDExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvc2VjdXJpdHkuaHRtCiA0MTIuIGh0dHA6Ly9zcnAuc3RhbmZvcmQuZWR1L3NycC8KIDQxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjcuMSwKIDQxNC4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja2NjZmcudHh0CiA0MTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9zZWN1cml0eS5odG0KIDQxNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiA0MTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi43CiA0MTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4wCiA0MTkuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1aW5zLnR4dAogNDIwLiBmdHA6Ly9rZXJtaXQuY29sdW1iaWEuZWR1L2tlcm1pdC9mL2NrdWJ3ci50eHQKIDQyMS4gZnRwOi8va2VybWl0LmNvbHVtYmlhLmVkdS9rZXJtaXQvZi9ja3VpbnMudHh0CiA0MjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9pa3NkLmh0bWwjeDQuMgogNDIzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvaWtzZC5odG1sCiA0MjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjguMQogNDI1LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMxOTQ1LnR4dAogNDI2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQogNDI3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDMuMgogNDI4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDMuMgogNDI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDQzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiA0MzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NS40CiA0MzIuIGZ0cDovL2tlcm1pdC5jb2x1bWJpYS5lZHUva2VybWl0L2YvY2t1YndyLnR4dAogNDMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTAKIDQzNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcuMQogNDM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4zCiA0MzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4zCiA0MzcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMAogNDM4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEKIDQzOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE1CiA0NDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjQKIDQ0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcKIDQ0Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuMwogNDQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi4xLjMKIDQ0NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiA0NDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjIKIDQ0Ni4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUKIDQ0Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuOC4yCiA0NDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4zCiA0NDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMAogNDUwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEKIDQ1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE1CiA0NTIuIGh0dHA6Ly93d3cudGVsc3RyYS5jb20uYXUvZG9jcy9QR1AvCiA0NTMuIGh0dHA6Ly93d3cudGVsc3RyYS5jb20uYXUvZG9jcy9QR1AvcGdwZG9jMi9wZ3Bkb2MyXzE3Lmh0bWwKIDQ1NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L3NlY3VyaXR5Lmh0bQogNDU1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDIuNwogNDU2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDQ1Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjE0CiA0NTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMwogNDU5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNwogNDYwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDQ2MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiA0NjIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CiA0NjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNDY0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS40CiA0NjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4zCiA0NjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41LjUKIDQ2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjUKIDQ2OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKIDQ2OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjUuNAogNDcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOQogNDcxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNS40CiA0NzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41LjUKIDQ3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiA0NzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNDc1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQogNDc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNgogNDc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAKIDQ3OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjExCiA0NzkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS42CiA0ODAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjIKIDQ4MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjExCiA0ODIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41LjQKIDQ4My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMQogNDg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMC42CiA0ODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yCiA0ODYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xCiA0ODcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC43LjEKIDQ4OC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiA0ODkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41CiA0OTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjIKIDQ5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjcuMQogNDkyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMgogNDkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTAKIDQ5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuMgogNDk1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuNy4xCiA0OTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yCiA0OTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMAogNDk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuMTEuNQogNDk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMC42CiA1MDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMQogNTAxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOS4xCiA1MDIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMS4zCiA1MDMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CiA1MDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CiA1MDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC41LjEKIDUwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwCiA1MDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC41CiA1MDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC4zCiA1MDkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4xMC41CiA1MTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNTExLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMwogNTEyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTAKIDUxMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjMKIDUxNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEwCiA1MTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNQogNTE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTgKIDUxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwCiA1MTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMAogNTE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjAKIDUyMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE5CiA1MjEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xNgogNTIyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTkKIDUyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIwLjIuMwogNTI0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNQogNTI1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi41LjQKIDUyNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIyLjIKIDUyNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIyLjMKIDUyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrYjIuaHRtCiA1MjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNTMwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDkuMwogNTMxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDUuMi4xCiA1MzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC41LjEKIDUzMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUuMgogNTM0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNgogNTM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeGlpaQogNTM2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeGlpaQogNTM3LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMxNDg5LnR4dAogNTM4LiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyMzE5LnR4dAogNTM5LiBodHRwOi8vd3d3LnVuaWNvZGUub3JnLwogNTQwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi4yCiA1NDEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni42LjUuMQogNTQyLiBmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyNjQwLnR4dAogNTQzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDYuNi4yCiA1NDQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni4wCiA1NDUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni41CiA1NDYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ni40CiA1NDcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNTQ4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMjEKIDU0OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g2LjUKIDU1MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gyLjgKIDU1MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjcKIDU1Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIKIDU1My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjE5CiA1NTQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CiA1NTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xCiA1NTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yCiA1NTcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xCiA1NTguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yCiA1NTkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjExCiA1NjAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xMAogNTYxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjZmVycnN0cmluZwogNTYyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi41CiA1NjMuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Mi4xLjEwCiA1NjQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4OS4xCiA1NjUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMwogNTY2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjMKIDU2Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyCiA1NjguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS42CiA1NjkuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMwogNTcwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMjQKIDU3MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjI0CiA1NzIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yLjMKIDU3My4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEyCiA1NzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny45CiA1NzUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNTc2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEuMwogNTc3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEuMwogNTc4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQogNTc5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNwogNTgwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNwogNTgxLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMi44LjQKIDU4Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjIuNQogNTgzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuOAogNTg0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuOS4xCiA1ODUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNTg2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTkKIDU4Ny4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjE2CiA1ODguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny45LjEKIDU4OS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjUKIDU5MC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjMKIDU5MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjExLjMKIDU5Mi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjUuMQogNTkzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAKIDU5NC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjEwCiA1OTUuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41CiA1OTYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4Ny4yMwogNTk3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNwogNTk4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuNwogNTk5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMTEuMwogNjAwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTAuMTEKIDYwMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkKIDYwMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjMKIDYwMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjMKIDYwNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjkuMgogNjA1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDYwNi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjE3LjIKIDYwNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyCiA2MDguIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC43LjEKIDYwOS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjIyCiA2MTAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4zCiA2MTEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC45CiA2MTIuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS4yMgogNjEzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDEuNgogNjE0LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQogNjE1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQogNjE2LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTkKIDYxNy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjkuMQogNjE4LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDkuMwogNjE5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuNQogNjIwLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tiMi5odG0KIDYyMS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjQKIDYyMi4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjIwLjIKIDYyMy4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjUKIDYyNC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g3LjEwLjkKIDYyNS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3gxLjEwCiA2MjYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4MS41CiA2MjcuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC43LjEKIDYyOC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2lrc2QuaHRtbAogNjI5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMTkKIDYzMC4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2NrZXJtaXQ3MC5odG1sI3g0LjEwCiA2MzEuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4xMQogNjMyLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDQuMwogNjMzLiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZ2tlcm1pdC5odG1sCiA2MzQuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0NzAuaHRtbCN4NC4yMAogNjM1LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvZ2tlcm1pdC5odG1sCiA2MzYuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2IyLmh0bQogNjM3LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjeDcuMwogNjM4LiBtYWlsdG86a2VybWl0QGNvbHVtYmlhLmVkdQogNjM5LiBodHRwOi8vd3d3LmNvbHVtYmlhLmVkdS9rZXJtaXQvY2tlcm1pdDcwLmh0bWwjdG9wCiA2NDAuIGh0dHA6Ly93d3cuY29sdW1iaWEuZWR1L2tlcm1pdC9ja2VybWl0Lmh0bWwKIDY0MS4gaHR0cDovL3d3dy5jb2x1bWJpYS5lZHUva2VybWl0L2luZGV4Lmh0bWwK