IwojIEZyZWVUeXBlIDIgaG9zdCBwbGF0Zm9ybSBkZXRlY3Rpb24gcnVsZXMKIwoKCiMgQ29weXJpZ2h0IDE5OTYtMjAwMCBieQojIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCiMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAojIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91CiMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKIyBmdWxseS4KCgojIFRoaXMgc3ViLU1ha2VmaWxlIGlzIGluIGNoYXJnZSBvZiBkZXRlY3RpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBJdCBzZXRzCiMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CiMKIyAgIEJVSUxEICAgICAgICBUaGUgY29uZmlndXJhdGlvbiBhbmQgc3lzdGVtLXNwZWNpZmljIGRpcmVjdG9yeS4gIFVzdWFsbHkKIyAgICAgICAgICAgICAgICBgZnJlZXR5cGUvYnVpbGRzLyQoUExBVEZPUk0pJyBidXQgY2FuIGJlIGRpZmZlcmVudCBmb3IKIyAgICAgICAgICAgICAgICBjdXN0b20gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LgojCiMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHN5c3RlbSBzcGVjaWZpYyBgZGV0ZWN0Lm1rJwojIGZpbGVzOgojCiMgICBQTEFURk9STSAgICAgVGhlIGRldGVjdGVkIHBsYXRmb3JtLiAgVGhpcyB3aWxsIGRlZmF1bHQgdG8gYGFuc2knIGlmCiMgICAgICAgICAgICAgICAgYXV0by1kZXRlY3Rpb24gZmFpbHMuCiMgICBDT05GSUdfRklMRSAgVGhlIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlIHRvIHVzZS4gIFRoaXMgdXN1YWxseSBkZXBlbmRzCiMgICAgICAgICAgICAgICAgb24gdGhlIGNvbXBpbGVyIGRlZmluZWQgaW4gdGhlIGBDQycgZW52aXJvbm1lbnQgdmFyaWFibGUuCiMgICBERUxFVEUgICAgICAgVGhlIHNoZWxsIGNvbW1hbmQgdXNlZCB0byByZW1vdmUgYSBnaXZlbiBmaWxlLgojICAgQ09QWSAgICAgICAgIFRoZSBzaGVsbCBjb21tYW5kIHVzZWQgdG8gY29weSBvbmUgZmlsZS4KIyAgIFNFUCAgICAgICAgICBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvci4KIyAgIENDICAgICAgICAgICBUaGUgY29tcGlsZXIgdG8gdXNlLgojCiMgWW91IG5lZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGUocykgYmVmb3JlIGNhbGxpbmcgaXQ6CiMKIyAgIFRPUF9ESVIgICAgICBUaGUgdG9wLW1vc3QgZGlyZWN0b3J5IGluIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHNvdXJjZQojICAgICAgICAgICAgICAgIGhpZXJhcmNoeS4gIElmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gYC4nLgoKIyBJZiBUT1BfRElSIGlzIG5vdCBkZWZpbmVkLCBkZWZhdWx0IGl0IHRvIGAuJwojCmlmbmRlZiBUT1BfRElSCiAgVE9QX0RJUiA6PSAuCmVuZGlmCgojIFNldCBhdXRvLWRldGVjdGlvbiBkZWZhdWx0IHRvIGBhbnNpJyByZXNwLiBVTklYLWxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMuCiMgTm90ZSB0aGF0IHdlIGRlbGF5IGV2YWx1YXRpb24gb2YgJChCVUlMRF9DT05GSUdfKSwgJChCVUlMRCksIGFuZAojICQoQ09ORklHX1JVTEVTKS4KIwpQTEFURk9STSA6PSBhbnNpCkRFTEVURSAgIDo9ICQoUk0pCkNPUFkgICAgIDo9IGNwClNFUCAgICAgIDo9IC8KCkJVSUxEX0NPTkZJR18gPSAkKFRPUF9ESVIpJChTRVApYnVpbGRzJChTRVApCkJVSUxEICAgICAgICAgPSAkKEJVSUxEX0NPTkZJR18pJChQTEFURk9STSkKQ09ORklHX1JVTEVTICA9ICQoQlVJTEQpJChTRVApJChDT05GSUdfRklMRSkKCiMgV2UgZGVmaW5lIHRoZSBCQUNLU0xBU0ggdmFyaWFibGUgdG8gaG9sZCBhIHNpbmdsZSBiYWNrLXNsYXNoIGNoYXJhY3Rlci4KIyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIGEgbGluZSBsaWtlCiMKIyAgIFNFUCA6PSBcCiMKIyBkb2VzIG5vdCB3b3JrIHdpdGggR05VIE1ha2UgKHRoZSBiYWNrc2xhc2ggaXMgaW50ZXJwcmV0ZWQgYXMgYSBsaW5lCiMgY29udGludWF0aW9uKS4gIFdoaWxlIGEgbGluZSBsaWtlCiMKIyAgIFNFUCA6PSBcXAojCiMgcmVhbGx5IGRlZmluZXMgJChTRVApIGFzIGBcJyBvbiBVbml4LCBhbmQgYFxcJyBvbiBEb3MgYW5kIFdpbmRvd3MhCiMKQkFDS1NMQVNIIDo9ICQoc3RyaXAgXCApCgojIEZpbmQgYWxsIGF1dG8tZGV0ZWN0YWJsZSBwbGF0Zm9ybXMuCiMKUExBVEZPUk1TXyA6PSAkKG5vdGRpciAkKHN1YnN0IC9kZXRlY3QubWssLCQod2lsZGNhcmQgJChCVUlMRF9DT05GSUdfKSovZGV0ZWN0Lm1rKSkpCi5QSE9OWTogJChQTEFURk9STVNfKSBhbnNpCgojIEZpbHRlciBvdXQgcGxhdGZvcm0gc3BlY2lmaWVkIGFzIHNldHVwIHRhcmdldC4KIwpQTEFURk9STSA6PSAkKGZpcnN0d29yZCAkKGZpbHRlciAkKE1BS0VDTURHT0FMUyksJChQTEFURk9STVNfKSkpCgojIElmIG5vIHNldHVwIHRhcmdldCBwbGF0Zm9ybSB3YXMgc3BlY2lmaWVkLCBlbmFibGUgYXV0by1kZXRlY3Rpb24vCiMgZGVmYXVsdCBwbGF0Zm9ybS4KIwppZmVxICgkKFBMQVRGT1JNKSwpCiAgUExBVEZPUk0gOj0gYW5zaQplbmRpZgoKIyBJZiB0aGUgdXNlciBoYXMgZXhwbGljaXRseSBhc2tlZCBmb3IgYGFuc2knIG9uIHRoZSBjb21tYW5kIGxpbmUsCiMgZGlzYWJsZSBhdXRvLWRldGVjdGlvbi4KIwppZmVxICgkKGZpbmRzdHJpbmcgYW5zaSwkKE1BS0VDTURHT0FMUykpLCkKICAjIE5vdywgaW5jbHVkZSBhbGwgZGV0ZWN0aW9uIHJ1bGUgZmlsZXMgZm91bmQgaW4gdGhlIGBidWlsZHMvPHN5c3RlbT4nCiAgIyBkaXJlY3Rvcmllcy4gIE5vdGUgdGhhdCB0aGUgY2FsbGluZyBvcmRlciBvZiB0aGUgdmFyaW91cyBgZGV0ZWN0Lm1rJwogICMgZmlsZXMgaXNuJ3QgcHJlZGljdGFibGUuCiAgIwogIGluY2x1ZGUgJCh3aWxkY2FyZCAkKEJVSUxEX0NPTkZJR18pKi9kZXRlY3QubWspCmVuZGlmCgojIEluIGNhc2Ugbm8gZGV0ZWN0aW9uIHJ1bGUgZmlsZSB3YXMgc3VjY2Vzc2Z1bCwgdXNlIHRoZSBkZWZhdWx0LgojCmlmbmRlZiBDT05GSUdfRklMRQogIENPTkZJR19GSUxFIDo9IGFuc2kubWsKICBzZXR1cDogc3RkX3NldHVwCiAgLlBIT05ZOiBzZXR1cAplbmRpZgoKIyBUaGUgZm9sbG93aW5nIHRhcmdldHMgYXJlIGVxdWl2YWxlbnQsIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZXkgdXNlCiMgYSBzbGlnaHRseSBkaWZmZXJlbnQgc3ludGF4IGZvciB0aGUgYGVjaG8nIGNvbW1hbmQuCiMKIyBzdGRfc2V0dXA6IGRlZmluZWQgZm9yIG1vc3QgKGkuZS4gVW5peC1saWtlKSBwbGF0Zm9ybXMKIyBkb3Nfc2V0dXA6IGRlZmluZWQgZm9yIERvcy1pc2ggcGxhdGZvcm1zIGxpa2UgRG9zLCBXaW5kb3dzICYgT1MvMgojCi5QSE9OWTogc3RkX3NldHVwIGRvc19zZXR1cAoKc3RkX3NldHVwOgoJQGVjaG8gIiIKCUBlY2hvICIkKFBST0pFQ1RfVElUTEUpIGJ1aWxkIHN5c3RlbSAtLSBhdXRvbWF0aWMgc3lzdGVtIGRldGVjdGlvbiIKCUBlY2hvICIiCglAZWNobyAiVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgdXNlZDoiCglAZWNobyAiIgoJQGVjaG8gIiAgcGxhdGZvcm0gICAgICAgICAgICAgICAgICAgICQoUExBVEZPUk0pIgoJQGVjaG8gIiAgY29tcGlsZXIgICAgICAgICAgICAgICAgICAgICQoQ0MpIgoJQGVjaG8gIiAgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkgICAgICQoQlVJTEQpIgoJQGVjaG8gIiAgY29uZmlndXJhdGlvbiBydWxlcyAgICAgICAgICQoQ09ORklHX1JVTEVTKSIKCUBlY2hvICIiCglAZWNobyAiSWYgdGhpcyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHlvdXIgc3lzdGVtIG9yIHNldHRpbmdzIHBsZWFzZSByZW1vdmUgdGhlIGZpbGUiCglAZWNobyAiXGAkKENPTkZJR19NSyknIGZyb20gdGhpcyBkaXJlY3RvcnkgdGhlbiByZWFkIHRoZSBJTlNUQUxMIGZpbGUgZm9yIGhlbHAuIgoJQGVjaG8gIiIKCUBlY2hvICJPdGhlcndpc2UsIHNpbXBseSB0eXBlIFxgJChNQUtFKScgYWdhaW4gdG8gYnVpbGQgdGhlIGxpYnJhcnkuIgoJQGVjaG8gIiIKCUAkKENPUFkpICQoQ09ORklHX1JVTEVTKSAkKENPTkZJR19NSykKCgojIFNwZWNpYWwgY2FzZSBmb3IgRG9zLCBXaW5kb3dzLCBPUy8yLCB3aGVyZSBlY2hvICIiIGRvZXNuJ3Qgd29yayBjb3JyZWN0bHkhCiMKZG9zX3NldHVwOgoJQHR5cGUgYnVpbGRzXG5ld2xpbmUKCUBlY2hvICQoUFJPSkVDVF9USVRMRSkgYnVpbGQgc3lzdGVtIC0tIGF1dG9tYXRpYyBzeXN0ZW0gZGV0ZWN0aW9uCglAdHlwZSBidWlsZHNcbmV3bGluZQoJQGVjaG8gVGhlIGZvbGxvd2luZyBzZXR0aW5ncyBhcmUgdXNlZDoKCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAZWNobyAgIHBsYXRmb3Jt////////////////////////////JChQTEFURk9STSkKCUBlY2hvICAgY29tcGlsZXL///////////////////////////8kKENDKQoJQGVjaG8gICBjb25maWd1cmF0aW9uIGRpcmVjdG9yef///////yQoQlVJTEQpCglAZWNobyAgIGNvbmZpZ3VyYXRpb24gcnVsZXP/////////////JChDT05GSUdfUlVMRVMpCglAdHlwZSBidWlsZHNcbmV3bGluZQoJQGVjaG8gSWYgdGhpcyBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIHlvdXIgc3lzdGVtIG9yIHNldHRpbmdzIHBsZWFzZSByZW1vdmUgdGhlIGZpbGUKCUBlY2hvICckKENPTkZJR19NSyknIGZyb20gdGhpcyBkaXJlY3RvcnkgdGhlbiByZWFkIHRoZSBJTlNUQUxMIGZpbGUgZm9yIGhlbHAuCglAdHlwZSBidWlsZHNcbmV3bGluZQoJQGVjaG8gT3RoZXJ3aXNlLCBzaW1wbHkgdHlwZSAnbWFrZScgYWdhaW4gdG8gYnVpbGQgdGhlIGxpYnJhcnkuCglAdHlwZSBidWlsZHNcbmV3bGluZQoJQCQoQ09QWSkgJChzdWJzdCAvLFwsJChDT05GSUdfUlVMRVMpICQoQ09ORklHX01LKSkgPiBudWwKCiMgRU9GCg==