IwojIEZyZWVUeXBlIDIgaG9zdCBwbGF0Zm9ybSBkZXRlY3Rpb24gcnVsZXMKIwoKCiMgQ29weXJpZ2h0IDE5OTYtMjAwMCBieQojIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIGFuZCBXZXJuZXIgTGVtYmVyZy4KIwojIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCiMgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRnJlZVR5cGUgcHJvamVjdCBsaWNlbnNlLAojIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSB0aGlzIGZpbGUgeW91CiMgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKIyBmdWxseS4KCgojIFRoaXMgc3ViLU1ha2VmaWxlIGlzIGluIGNoYXJnZSBvZiBkZXRlY3RpbmcgdGhlIGN1cnJlbnQgcGxhdGZvcm0uICBJdCBzZXRzCiMgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXM6CiMKIyAgIEJVSUxEICAgICAgICBUaGUgY29uZmlndXJhdGlvbiBhbmQgc3lzdGVtLXNwZWNpZmljIGRpcmVjdG9yeS4gIFVzdWFsbHkKIyAgICAgICAgICAgICAgICBgZnJlZXR5cGUvYnVpbGRzLyQoUExBVEZPUk0pJyBidXQgY2FuIGJlIGRpZmZlcmVudCBmb3IKIyAgICAgICAgICAgICAgICBjdXN0b20gYnVpbGRzIG9mIHRoZSBsaWJyYXJ5LgojCiMgVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbXVzdCBiZSBkZWZpbmVkIGluIHN5c3RlbSBzcGVjaWZpYyBgZGV0ZWN0Lm1rJwojIGZpbGVzOgojCiMgICBQTEFURk9STSAgICAgVGhlIGRldGVjdGVkIHBsYXRmb3JtLiAgVGhpcyB3aWxsIGRlZmF1bHQgdG8gYGFuc2knIGlmCiMgICAgICAgICAgICAgICAgYXV0by1kZXRlY3Rpb24gZmFpbHMuCiMgICBDT05GSUdfRklMRSAgVGhlIGNvbmZpZ3VyYXRpb24gc3ViLW1ha2VmaWxlIHRvIHVzZS4gIFRoaXMgdXN1YWxseSBkZXBlbmRzCiMgICAgICAgICAgICAgICAgb24gdGhlIGNvbXBpbGVyIGRlZmluZWQgaW4gdGhlIGBDQycgZW52aXJvbm1lbnQgdmFyaWFibGUuCiMgICBERUxFVEUgICAgICAgVGhlIHNoZWxsIGNvbW1hbmQgdXNlZCB0byByZW1vdmUgYSBnaXZlbiBmaWxlLgojICAgQ09QWSAgICAgICAgIFRoZSBzaGVsbCBjb21tYW5kIHVzZWQgdG8gY29weSBvbmUgZmlsZS4KIyAgIFNFUCAgICAgICAgICBUaGUgcGxhdGZvcm0tc3BlY2lmaWMgZGlyZWN0b3J5IHNlcGFyYXRvci4KIyAgIENDICAgICAgICAgICBUaGUgY29tcGlsZXIgdG8gdXNlLgojCiMgWW91IG5lZWQgdG8gc2V0IHRoZSBmb2xsb3dpbmcgdmFyaWFibGUocykgYmVmb3JlIGNhbGxpbmcgaXQ6CiMKIyAgIFRPUCAgICAgICAgICBUaGUgdG9wLW1vc3QgZGlyZWN0b3J5IGluIHRoZSBGcmVlVHlwZSBsaWJyYXJ5IHNvdXJjZQojICAgICAgICAgICAgICAgIGhpZXJhcmNoeS4gIElmIG5vdCBkZWZpbmVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gYC4nLgoKIyBJZiBUT1AgaXMgbm90IGRlZmluZWQsIGRlZmF1bHQgaXQgdG8gYC4nCiMKaWZuZGVmIFRPUAogIFRPUCA6PSAuCmVuZGlmCgojIFNldCBhdXRvLWRldGVjdGlvbiBkZWZhdWx0IHRvIGBhbnNpJyByZXNwLiBVTklYLWxpa2Ugb3BlcmF0aW5nIHN5c3RlbXMuCiMgTm90ZSB0aGF0IHdlIGRlbGF5IGV2YWx1YXRpb24gb2YgJChCVUlMRF9DT05GSUdfKSwgJChCVUlMRCksIGFuZAojICQoQ09ORklHX1JVTEVTKS4KIwpQTEFURk9STSA6PSBhbnNpCkRFTEVURSAgIDo9ICQoUk0pCkNPUFkgICAgIDo9IGNwClNFUCAgICAgIDo9IC8KCkJVSUxEX0NPTkZJR18gPSAkKFRPUCkkKFNFUClidWlsZHMkKFNFUCkKQlVJTEQgICAgICAgICA9ICQoQlVJTERfQ09ORklHXykkKFBMQVRGT1JNKQpDT05GSUdfUlVMRVMgID0gJChCVUlMRCkkKFNFUCkkKENPTkZJR19GSUxFKQoKIyBXZSBkZWZpbmUgdGhlIEJBQ0tTTEFTSCB2YXJpYWJsZSB0byBob2xkIGEgc2luZ2xlIGJhY2stc2xhc2ggY2hhcmFjdGVyLgojIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgYSBsaW5lIGxpa2UKIwojICAgU0VQIDo9IFwKIwojIGRvZXMgbm90IHdvcmsgd2l0aCBHTlUgTWFrZSAodGhlIGJhY2tzbGFzaCBpcyBpbnRlcnByZXRlZCBhcyBhIGxpbmUKIyBjb250aW51YXRpb24pLiAgV2hpbGUgYSBsaW5lIGxpa2UKIwojICAgU0VQIDo9IFxcCiMKIyByZWFsbHkgZGVmaW5lcyAkKFNFUCkgYXMgYFwnIG9uIFVuaXgsIGFuZCBgXFwnIG9uIERvcyBhbmQgV2luZG93cyEKIwpCQUNLU0xBU0ggOj0gJChzdHJpcCBcICkKCiMgRmluZCBhbGwgYXV0by1kZXRlY3RhYmxlIHBsYXRmb3Jtcy4KIwpQTEFURk9STVNfIDo9ICQobm90ZGlyICQoc3Vic3QgL2RldGVjdC5taywsJCh3aWxkY2FyZCAkKEJVSUxEX0NPTkZJR18pKi9kZXRlY3QubWspKSkKLlBIT05ZOiAkKFBMQVRGT1JNU18pIGFuc2kKCiMgRmlsdGVyIG91dCBwbGF0Zm9ybSBzcGVjaWZpZWQgYXMgc2V0dXAgdGFyZ2V0LgojClBMQVRGT1JNIDo9ICQoZmlyc3R3b3JkICQoZmlsdGVyICQoTUFLRUNNREdPQUxTKSwkKFBMQVRGT1JNU18pKSkKCiMgSWYgbm8gc2V0dXAgdGFyZ2V0IHBsYXRmb3JtIHdhcyBzcGVjaWZpZWQsIGVuYWJsZSBhdXRvLWRldGVjdGlvbi8KIyBkZWZhdWx0IHBsYXRmb3JtLgojCmlmZXEgKCQoUExBVEZPUk0pLCkKICBQTEFURk9STSA6PSBhbnNpCmVuZGlmCgojIElmIHRoZSB1c2VyIGhhcyBleHBsaWNpdGx5IGFza2VkIGZvciBgYW5zaScgb24gdGhlIGNvbW1hbmQgbGluZSwKIyBkaXNhYmxlIGF1dG8tZGV0ZWN0aW9uLgojCmlmZXEgKCQoZmluZHN0cmluZyBhbnNpLCQoTUFLRUNNREdPQUxTKSksKQogICMgTm93LCBpbmNsdWRlIGFsbCBkZXRlY3Rpb24gcnVsZSBmaWxlcyBmb3VuZCBpbiB0aGUgYGJ1aWxkcy88c3lzdGVtPicKICAjIGRpcmVjdG9yaWVzLiAgTm90ZSB0aGF0IHRoZSBjYWxsaW5nIG9yZGVyIG9mIHRoZSB2YXJpb3VzIGBkZXRlY3QubWsnCiAgIyBmaWxlcyBpc24ndCBwcmVkaWN0YWJsZS4KICAjCiAgaW5jbHVkZSAkKHdpbGRjYXJkICQoQlVJTERfQ09ORklHXykqL2RldGVjdC5taykKZW5kaWYKCiMgSW4gY2FzZSBubyBkZXRlY3Rpb24gcnVsZSBmaWxlIHdhcyBzdWNjZXNzZnVsLCB1c2UgdGhlIGRlZmF1bHQuCiMKaWZuZGVmIENPTkZJR19GSUxFCiAgQ09ORklHX0ZJTEUgOj0gYW5zaS5tawogIHNldHVwOiBzdGRfc2V0dXAKICAuUEhPTlk6IHNldHVwCmVuZGlmCgojIFRoZSBmb2xsb3dpbmcgdGFyZ2V0cyBhcmUgZXF1aXZhbGVudCwgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhleSB1c2UKIyBhIHNsaWdodGx5IGRpZmZlcmVudCBzeW50YXggZm9yIHRoZSBgZWNobycgY29tbWFuZC4KIwojIHN0ZF9zZXR1cDogZGVmaW5lZCBmb3IgbW9zdCAoaS5lLiBVbml4LWxpa2UpIHBsYXRmb3JtcwojIGRvc19zZXR1cDogZGVmaW5lZCBmb3IgRG9zLWlzaCBwbGF0Zm9ybXMgbGlrZSBEb3MsIFdpbmRvd3MgJiBPUy8yCiMKLlBIT05ZOiBzdGRfc2V0dXAgZG9zX3NldHVwCgpzdGRfc2V0dXA6CglAZWNobyAiIgoJQGVjaG8gIiQoUFJPSkVDVF9USVRMRSkgYnVpbGQgc3lzdGVtIC0tIGF1dG9tYXRpYyBzeXN0ZW0gZGV0ZWN0aW9uIgoJQGVjaG8gIiIKCUBlY2hvICJUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSB1c2VkOiIKCUBlY2hvICIiCglAZWNobyAiICBwbGF0Zm9ybSAgICAgICAgICAgICAgICAgICAgJChQTEFURk9STSkiCglAZWNobyAiICBjb21waWxlciAgICAgICAgICAgICAgICAgICAgJChDQykiCglAZWNobyAiICBjb25maWd1cmF0aW9uIGRpcmVjdG9yeSAgICAgJChCVUlMRCkiCglAZWNobyAiICBjb25maWd1cmF0aW9uIHJ1bGVzICAgICAgICAgJChDT05GSUdfUlVMRVMpIgoJQGVjaG8gIiIKCUBlY2hvICJJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZSIKCUBlY2hvICJcYCQoQ09ORklHX01LKScgZnJvbSB0aGlzIGRpcmVjdG9yeSB0aGVuIHJlYWQgdGhlIElOU1RBTEwgZmlsZSBmb3IgaGVscC4iCglAZWNobyAiIgoJQGVjaG8gIk90aGVyd2lzZSwgc2ltcGx5IHR5cGUgXGBtYWtlJyBhZ2FpbiB0byBidWlsZCB0aGUgbGlicmFyeS4iCglAZWNobyAiIgoJQCQoQ09QWSkgJChDT05GSUdfUlVMRVMpICQoQ09ORklHX01LKQoKCiMgU3BlY2lhbCBjYXNlIGZvciBEb3MsIFdpbmRvd3MsIE9TLzIsIHdoZXJlIGVjaG8gIiIgZG9lc24ndCB3b3JrIGNvcnJlY3RseSEKIwpkb3Nfc2V0dXA6CglAdHlwZSBidWlsZHNcbmV3bGluZQoJQGVjaG8gJChQUk9KRUNUX1RJVExFKSBidWlsZCBzeXN0ZW0gLS0gYXV0b21hdGljIHN5c3RlbSBkZXRlY3Rpb24KCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAZWNobyBUaGUgZm9sbG93aW5nIHNldHRpbmdzIGFyZSB1c2VkOgoJQHR5cGUgYnVpbGRzXG5ld2xpbmUKCUBlY2hvICAgcGxhdGZvcm3///////////////////////////8kKFBMQVRGT1JNKQoJQGVjaG8gICBjb21waWxlcv///////////////////////////yQoQ0MpCglAZWNobyAgIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5////////JChCVUlMRCkKCUBlY2hvICAgY29uZmlndXJhdGlvbiBydWxlc/////////////8kKENPTkZJR19SVUxFUykKCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAZWNobyBJZiB0aGlzIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8geW91ciBzeXN0ZW0gb3Igc2V0dGluZ3MgcGxlYXNlIHJlbW92ZSB0aGUgZmlsZQoJQGVjaG8gJyQoQ09ORklHX01LKScgZnJvbSB0aGlzIGRpcmVjdG9yeSB0aGVuIHJlYWQgdGhlIElOU1RBTEwgZmlsZSBmb3IgaGVscC4KCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAZWNobyBPdGhlcndpc2UsIHNpbXBseSB0eXBlICdtYWtlJyBhZ2FpbiB0byBidWlsZCB0aGUgbGlicmFyeS4KCUB0eXBlIGJ1aWxkc1xuZXdsaW5lCglAJChDT1BZKSAkKHN1YnN0IC8sXCwkKENPTkZJR19SVUxFUykgJChDT05GSUdfTUspKSA+IG51bAoKIyBFT0YK