Qm9vc3QuV2F2ZTogQSBTdGFuZGFyZCBjb21wbGlhbnQgQysrIHByZXByb2Nlc3NvciBsaWJyYXJ5Cmh0dHA6Ly93d3cuYm9vc3Qub3JnLwoKQ29weXJpZ2h0IChjKSAyMDAxLTIwMTAgSGFydG11dCBLYWlzZXIuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdApTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZQpMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRPRE8gKGtub3duIGlzc3Vlcyk6Ci0gRml4IGV4cGFuc2lvbiBvZiBtYWNyb3MsIHdoaWNoIHJlcGxhY2VtZW50LWxpc3QgdGVybWluYXRlcyBpbiBhIHBhcnRpYWwgCiAgbWFjcm8gZXhwYW5zaW9uLgotIEZpeCB0aGUgcmUyYyBsZXhlciBmb3IgaXRlcmF0b3JzIG90aGVycyB0aGVuIHN0cmluZzo6aXRlcmF0b3IgKG9yIG1vcmUgCiAgZ2VuZXJhbGx5IGZvciBpdGVyYXRvcnMsIHdoaWNoIGFyZW4ndCByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycykKLSBUcnkgdG8gcmVtb3ZlIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGZyb20gdGhlIHBwX2l0ZXJhdG9yPD46OmZvcmNlX2luY2x1ZGUKICBmdW5jdGlvbi4KLSBGaXggdGhlIHRyaWdyYXBoIGJhY2tzbGFzaCBwcm9ibGVtIGluIHRoZSByZTJjIChDL0MrKyBhbmQgSURMKSBzY2FubmVycywgaWYgCiAgdGhlcmUgaXMgdGhlIGVuZCBvZiB0aGUgKGludGVybmFsKSBidWZmZXIganVzdCBpbiBiZXR3ZWVuIGEgJz8/LycgYW5kIGEgJ1xuJy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkNIQU5HRUxPRwoKQm9vc3QgVjEuNDUuMAotIFYyLjEuMAotIFRva2VuIHBhc3RpbmcgaXMgd2VsbCBmb3JtZWQgb25seSBhcyBsb25nIGFzIHRoZSBmb3JtZWQgdG9rZW4ocykgYXJlIAogIHBwX3Rva2VucyBhcyBkZWZpbmVkIGJ5IHRoZSBDKysweCBTdGFuZGFyZC4gVW50aWwgbm93LCBXYXZlIGFsbG93ZWQgZm9yIAogIG5vbi1wcF90b2tlbnMgdG8gYmUgZm9ybWVkIGluIC0tdmFyaWFkaWNzIG1vZGUuIAotIEZpeGVkIGEgcHJvYmxlbSwgd2hpY2ggcHJldmVudGVkIHJlcG9ydGluZyAvIyMvIGluIGEgbWFjcm8gZGVmaW5pdGlvbiBhcyAKICBpbnZhbGlkIHRva2VuIHBhc3RpbmcuCi0gRml4ZWQgcHJvYmxlbSBwcmV2ZW50aW5nIHRoZSBza2lwcGVkX3Rva2VuIGhvb2sgdG8gYmUgY2FsbGVkIGZvciAnaW5hY3RpdmUnCiAgY29uZGl0aW9uYWwgcHJlcHJvY2Vzc2luZyBkaXJlY3RpdmUgdG9rZW5zLiBJbXByb3ZlZCBvdmVyYWxsIGNvbnNpc3RlbmN5IGluCiAgcmVwb3J0aW5nIHNraXBwZWQgdG9rZW5zIHRvIHRoZSBob29rcyBmdW5jdGlvbiB3aGVuIHByb2Nlc3NpbmcgY29uZGl0aW9uYWwKICBwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZXMuIEFkZGVkIGEgbmV3IHRlc3QgY2FzZSB2ZXJpZnlpbmcgdGhlIHNraXBwZWRfdG9rZW4KICBob29rIGdldHMgY2FsbGVkIHJlcHJvZHVjaWJseSAodF8yXzAyMC5jcHApLgotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBwcCBob29rcyAnZXhwYW5kaW5nX29iamVjdF9saWtlX21hY3JvJyBhbmQgCiAgJ2V4cGFuZGluZ19mdW5jdGlvbl9saWtlX21hY3JvJywgd2hpY2ggd2hlbiByZXR1cm5pbmcgdHJ1ZSB3ZXJlIHN0b3BwaW5nIGFsbAogIHByZXByb2Nlc3NpbmcgaW5zdGVhZCBvZiBqdXN0IGluaGliaXRpbmcgdGhlIGV4cGFuc2lvbiBvZiB0aGUgbWFjcm8uCi0gRml4ZWQgYSBkdXBsaWNhdGVkIGNhbGwgdG8gdGhlIHBwIGhvb2sgc2tpcHBlZF90b2tlbiBmb3IgcHJlcHJvY2Vzc2luZyAKICBkaXJlY3RpdmVzIGluc2lkZSBpbmFjdGl2ZSBjb25kaXRpb25hbCBicmFuY2hlcy4KCkJvb3N0IFYxLjQ0LjAKLSBWMi4wLjYKLSBBZGRlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSB0eXBlIHRvIGl0ZXJhdGlvbiBjb250ZXh0LiBUaGlzIGNhbiBiZSAKICBlaXRoZXIgbWFpbl9maWxlLCBzeXN0ZW1faGVhZGVyLCBvciB1c2VyX2hlYWRlciBkZXBlbmRpbmcgd2hldGhlciB0aGUgaGFuZGxlZCAKICBmaWxlIGlzIHRoZSBtYWluIGZpbGUgdG8gcHJlcHJvY2VzcywgYSBpbmNsdWRlIGZpbGUgb3BlbmVkIGZyb20gYCNpbmNsdWRlIDw+YCwgCiAgb3IgYSBpbmNsdWRlIGZpbGUgb3BlbmVkIGZyb20gYCNpbmNsdWRlICIiYC4gCi0gQWRkZWQgc3VwcG9ydCBmb3IgbmV3IEJvb3N0IHZpc2liaWxpdHkgbWFjcm9zLiBQcm9wZXJseSBleHBvcnRlZCBhbGwgCiAgZXhjZXB0aW9ucywgZXRjLgoKQm9vc3QgVjEuNDMuMAotIFYyLjAuNQotIEZpeGVkIHRoZSB3YXZlIGRyaXZlciBhcHBsaWNhdGlvbiB0byBzdHJpcCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgZnJvbSBtYWNybyBuYW1lcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSB1c2luZyAtVS4KLSBGaXhlZCBsaW5lIG51bWJlciBjb3VudGluZyBmb3IgbGluZXMgY29udGFpbmluZyBub3RoaW5nIGJ1dCB3aGl0ZXNwYWNlIAogIGZvbGxvd2VkIGJ5IGEgQysrIGNvbW1lbnQgaWYgdGhlIG5leHQgbGluZSBpcyBhIHBwIGRpcmVjdGl2ZS4KLSBGaXhlZCBlbWl0dGluZyBvZiBhICNsaW5lIGRpcmVjdGl2ZSBhZnRlciByZXR1cm5lZCBmcm9tIGFuIGluY2x1ZGUgZmlsZS4KLSBBIGNvdXBsZSBvZiBmaXhlcyBhbGxvd2luZyB0byBwcm9wZXJseSByZXBvcnQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIgaW4gCiAgI2xpbmUgZGlyZWN0aXZlcyBmb3IgZGlmZmVyZW50IHdoaXRlc3BhY2UgcHJlc2VydmUgbW9kZXMgKHNlZSAtLXByZXNlcnZlLy1wKS4KLSBBZGRlZCBuZXcgcHJlcHJvY2Vzc2luZyBob29rOiBlbWl0X2xpbmVfZGlyZWN0aXZlLCBhbGxvd2luZyB0byBjdXN0b21pemUgdGhlIAogIGZvcm1hdCBvZiB0aGUgZ2VuZXJhdGVkICNsaW5lIGRpcmVjdGl2ZS4KLSBDaGFuZ2VkIC0tbGluZS8tbCBjb21tYW5kIGxpbmUgb3B0aW9uIG9mIHRoZSB3YXZlIGRyaXZlciBhcHBsaWNhdGlvbiB0byAKICBhY2NlcHQgMCwgMSwgYW5kIDIgYXMgb3B0aW9ucy4gVGhlIG9wdGlvbiB2YWx1ZXMgMCBhbmQgMSBiZWhhdmUgYXMgYmVmb3JlIAogIChkaXNhYmxlL2VuYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiAjbGluZSBkaXJlY3RpdmVzKSwgd2hpbGUgdGhlIG9wdGlvbiB2YWx1ZSAyCiAgd2lsbCBnZW5lcmF0ZSB0aGUgI2xpbmUgZGlyZWN0aXZlIHVzaW5nIHRoZSByZWxhdGl2ZSBmaWxlbmFtZSAoaW5zdGVhZCBvZiB0aGUKICBhYnNvbHV0ZSBmaWxlbmFtZSBlbWl0dGVkIGZyb20gb3B0aW9uIDEpLiBUaGUgZGVmYXVsdCBvcHRpb24gaXMgdmFsdWUgMS4KLSBBZGRlZCBuZXcgZXhhbXBsZTogZW1pdF9jdXN0b21fbGluZV9kaXJlY3RpdmVzLCBkZW1vbnN0cmF0aW5nIHRoZSB1c2Ugb2YgdGhlIAogIG5ldyBwcmVwcm9jZXNzaW5nIGhvb2suCi0gQWRkZWQgbmV3IHByZXByb2Nlc3NpbmcgaG9vazogZm91bmRfdW5rbm93bl9kaXJlY3RpdmUsIHdoaWNoIGlzIGJlaW5nIGludm9rZWQgCiAgd2hlbmV2ZXIgYW4gdW5rbm93biBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIChpLmUuICcjJyBmb2xsb3dlZCBieSBzb21lIAogIGlkZW50aWZpZXIpIGlzIGRldGVjdGVkLiBJdCBhbGxvd3MgdG8gaW50ZXJwcmV0IHRoZSBkaXJlY3RpdmUgYW5kIHRvIHByb3ZpZGUgCiAgc29tZSByZXBsYWNlbWVudCB0ZXh0LgotIEFkZGVkIG5ldyBleGFtcGxlOiBjdXN0b21fZGlyZWN0aXZlcyBkZW1vbnN0cmF0aW5nIHRoZSB1c2FnZSBvZiB0aGUgbmV3IAogIHByZXByb2Nlc3NpbmcgaG9vay4KLSBGaXhlZCAjNDExMzogY3BwX2xleGVyIGRvZXMgbm90IGhhbmRsZSBxdWFsaWZpZWQgYmFja3NsYXNoZXMgY29ycmVjdGx5LgotIEZpeGVkICMzMTA2OiB3YXZlIG9uIFZTMjAxMCBiZXRhIGNvbXBpbGVyIGdlbmVyYXRlcyBlcnJvci4KCkJvb3N0IFYxLjQyLjAKLSBWMi4wLjQKLSBGaXhlZCBXYXZlIGZvciBsYXRlc3QgY2hhbmdlcyBpbiBtdWx0aV9wYXNzIGl0ZXJhdG9yLgoKQm9vc3QgVjEuNDEuMAotIFYyLjAuMwotIFN3aXRjaGVkIHRvIFJlMkMgVjAuMTMuNQotIEZpeGVkIC0tbGlzdF9pbmNsdWRlcy8tbCBjb21tYW5kIGxpbmUgb3B0aW9uIG9mIHRoZSB3YXZlIGRyaXZlciB0b29sIHRvIAogIGNvcnJlY3RseSBpbmRlbnQgdGhlIGdlbmVyYXRlZCBsaXN0IG9mIGluY2x1ZGVkIGZpbGVzLgotIEZpbmFsbHkgZml4ZWQgYWxsIHJlbWFpbmluZyBleGFtcGxlcy4gRXZlcnl0aGluZyBzZWVtcyB0byB3b3JrIGZpbmUgbm93LgotIFNwZWNpZnlpbmcgYSBjdXN0b20gdG9rZW4gdHlwZSBub3cgd29ya3MgYXMgZXhwZWN0ZWQuIFRoZSBuZXcgbGV4ZXIgaW50ZXJmYWNlCiAgaW50cm9kdWNlZCBpbiBWMi4wIGJyb2tlIHRoaXMgcGFydC4KLSBSZW1vdmVkIG9sZCBjb2RlIHJlbGF0ZWQgdG8gcHJlIEJvb3N0IFYxLjMxIChyZWxhdGVkIHRvIFYxIG9mIGl0ZXJhdG9yIAogIGxpYnJhcnkpLgotIEFkZGVkIGEgbmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtLW1hY3JvY291bnRzLy1jIHRvIHRoZSBXYXZlIGRyaXZlciBhcHBsaWNhdGlvbgogIHdoaWNoIGxpc3RzIGFsbCBtYWNybyBpbnZvY2F0aW9uIGNvdW50cyB0byBhbiBvcHRpb25hbGx5IHNwZWNpZmllZCBmaWxlIAogIChkZWZhdWx0IGlzIGNvdXQpLgotIEZpeGVkIGNvbXBpbGF0aW9uIHByb2JsZW1zIGNhdXNlZCBieSByZWNlbnQgY2hhbmdlcyB0byB0aGUgbXVsdGlfcGFzcyBpdGVyYXRvcgogIGZyb20gU3Bpcml0IFYyLjEuCi0gQWRkZWQgdGhlIG5ldyBwcmVwcm9jZXNzaW5nIGhvb2tzIGRldGVjdGVkX3ByYWdtYV9vbmNlKCkgYW5kIAogIGRldGVjdGVkX2luY2x1ZGVfZ3VhcmQoKSB3aGljaCBhcmUgZ2V0dGluZyBjYWxsZWQgd2hlbmV2ZXIgZWl0aGVyIGEgI3ByYWdtYSAKICBvbmNlIGhhcyBiZWVuIGRldGVjdGVkIG9yIGlmIHRoZSBpbmNsdWRlIGd1YXJkIGhldXJpc3RpY3MgZGV0ZWN0ZWQgYW4gCiAgaW5jbHVkZSBndWFyZCBmb3IgYSBwYXJ0aWN1bGFyIGluY2x1ZGUgZmlsZS4KLSBBZGRlZCBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRoZSB3YXZlIGRyaXZlciB0b29sOiAtLWxpc3RndWFyZHMvLWcgCiAgYWxsb3dpbmcgdG8gdHJhY2UgYWxsIGluY2x1ZGUgZmlsZXMgd2hpY2ggYXJlIGVpdGhlciBjb250YWluIGEgI3ByYWdtYSBvbmNlIAogIG9yIGNvbnRhaW4gaW5jbHVkZSBndWFyZHMuCi0gU3RhcnRlZCB0byBlbG1pbmF0ZSBnKysgc3RydWN0IGFsaWFzaW5nIHdhcm5pbmdzIChtb3JlIHRvIGZpeCwgbW9zdGx5IGluIAogIGZsZXhfc3RyaW5nKS4KCkJvb3N0IFYxLjQwLjAKLSBWMi4wLjIKLSBGaXhlZCBhIGxvbmcgc3RhbmRpbmcgcmFjZSBjb25kaXRpb24gaW5oaWJpdGluZyB0byB1c2UgV2F2ZSBpbiBtdWx0aSB0aHJlYWRlZCAKICBlbnZpcm9ubWVudHMuCi0gSW5jb3Jwb3JhdGVkIHRoZSBjaGFuZ2VzIGZyb20gbGF0ZXN0IHZlcnNpb24gb2YgdGhlIGZsZXhfc3RyaW5nIGNsYXNzICgjMjk0NikuCi0gRml4ZWQgYW5vdGhlciByYWNlIGNvbmRpdGlvbiB0cmlnZ2VyaW5nIHByb2JsZW1zIHVzaW5nIFdhdmUgaW4gbXVsdGktdGhyZWFkZWQKICBlbnZpcm9ubWVudHMuCgpCb29zdCBWMS4zOS4wCi0gVjIuMC4xCi0gRml4ZWQgV2F2ZSB0byBjb21waWxlIHdpdGggQk9PU1RfRklMRVNZU1RFTV9OT19ERVBSRUNBVEVEIGRlZmluZWQgKGkuZS4gdGhlIAogIGxpYnJhcnkgZG9lc24ndCB1c2UgdGhlIGRlcHJlY2F0ZWQgZmlsZXN5c3RlbSBpbnRlcmZhY2UgYW55bW9yZSkuCgpCb29zdCBWMS4zNy4wCi0gVXBkYXRlZCBleGFtcGxlcyB0byByZWZsZWN0IHRoZSByZWNlbnQgY2hhbmdlcyBpbiB0aGUgdXNlZCBtdWx0aV9wYXNzIAogIGl0ZXJhdG9yLgotIEZpeGVkIGRvY3VtZW50YXRpb24gbGlua3Mgc3RpbGwgcG9pbnRpbmcgdG8gdGhlIG9sZCBCb29zdCBDVlMgKHRoYW5rcyB0byAKICBK/HJnZW4gSHVub2xkIGZvciBwcm92aWRpbmcgdGhlIHBhdGNoKS4KCkJvb3N0IFYxLjM2LjAKLSBXYXZlIFZlcnNpb24gMi4wIGlzIGEgbmV3IG1ham9yIHJlbGVhc2UgaW50cm9kdWNpbmcgc29tZSBicmVha2luZyBBUEkgY2hhbmdlcywgCiAgcHJldmVudGluZyBpdCB0byBiZSB1c2VkIHdpdGggQm9vc3QgdmVyc2lvbnMgZWFybGllciB0aGFuIFYxLjM2LjAuIFRoZSBBUEkgCiAgYW5kIGhvb2sgaW50ZXJmYWNlIGhhdmUgYmVlbiBzdHJlYW1saW5lZCBmb3IgbW9yZSBjb25zaXN0ZW5jeS4gU2VlIHRoZSAKICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCgotIEFkZGVkIGFuIGFkZGl0aW9uYWwgdGVtcGxhdGUgcGFyYW1ldGVyIHRvIHRoZSBjb250ZXh0IG9iamVjdCwgYWxsb3dpbmcgdG8gCiAgc3BlY2lmeSBhbnkgcG9zc2libHkgZGVyaXZlZCB0eXBlLiBUaGlzIGNoYW5nZSBwcm9wYWdhdGVzIHRvIHRoZSBwcmVwcm9jZXNzaW5nCiAgaG9va3MsIHdoaWNoIG5vdyBnZXQgcGFzc2VkIHRoZSBtb3N0IGRlcml2ZWQgY29udGV4dCB0eXBlIGFzIGl0cyBmaXJzdCAKICBhcmd1bWVudCBhbGxvd2luZyB0byBhY2Nlc3MgcHJvdGVjdGVkIG1lbWJlcnMgaW4gdGhlIG9yaWdpbmFsIGNvbnRleHQgdHlwZS4KICBUaGlzIGZpeGVzIHRpY2tldCAjMTc1Mi4KLSBGaXhlZCBhIHByb2JsZW0gZHVyaW5nIHBhcnNpbmcgb2YgI3ByYWdtYSB3YXZlIGRpcmVjdGl2ZSwgd2hlcmUgdGhlIHZhbHVlIAogIHNlcXVlbmNlIGNvbnRhaW5lZCBhIGNsb3NpbmcgcGFyZW50aGVzaXMuIFRoaXMgY2F1c2VkIGEgcHJlbWF0dXJlIGVuZCBvZiB0aGUKICBwcmFnbWEgdmFsdWUgcGFyc2luZy4KLSBGaXhlZCBoYW5kbGluZyBvZiBzdXBwb3J0X29wdGlvbl9zaW5nbGVfbGluZSwgd2hpY2ggd2FzIGlnbm9yZWQgdW5kZXIgY2VydGFpbiAKICBjaXJjdW1zdGFuY2VzLgotIEZpeGVkIHRpY2tldCAjMTc2NjogV3JvbmcgZXZhbHVhdGlvbiBvZiBjb25kaXRpb25hbCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyAKICB3aXRoIHByZWRlZmluZWQgbWFjcm9zIF9fRklMRV9fLCBfX0xJTkVfXyBhbmQgX19JTkNMVURFX0xFVkVMX18uIFRoaXMgYnVnIAogIHRyaWdnZXJlZCBhbiBlcnJvciBpbiBjb25zdHJ1Y3RzIGxpa2UgI2lmbmRlZiBfX0ZJTEVfXy4gVGhhbmtzIHRvIERhbmllbCAKICBXYWRlaG4gZm9yIHJlcG9ydGluZyBhbmQgc3VwcGx5aW5nIGEgcGF0Y2guIEFkZGVkIGNvcnJlc3BvbmRpbmcgcmVncmVzc2lvbgogIHRlc3Q6IHRfMl8wMTguY3BwLgotIEZpeGVkIGEgYnVnIHdoaWNoIHJlcG9ydGVkIGEgdmFsaWQgbWFjcm8gcmVkZWZpbml0aW9uIGFzIGludmFsaWQgaWYgdGhlIG1hY3JvCiAgcmVwbGFjZW1lbnQgdGV4dCByZWZlcnJlZCB0byBhIHNlY29uZCBvciBoaWdoZXIgcGFyYW1ldGVyIG9mIHRoaXMgbWFjcm8uCi0gRml4ZWQgYSBwcm9ibGVtIGluIHRoZSB3YXZlIHRvb2wgdG8gYWxsb3cgdHdvIGVycm9ycyB0byBvY2N1ciB3aGlsZSAKICBwcmVwcm9jZXNzaW5nIHR3byBjb25zZWN1dGl2ZSB0b2tlbnMuCi0gQWRqdXN0ZWQgU3Bpcml0IGhlYWRlciBpbmNsdWRlcyB0byBwb2ludCB0byBjb25mb3JtIHRvIHRoZSBuZXcgZGlyZWN0b3J5IAogIHN0cnVjdHVyZSwgcmVtb3ZlZCBzdXBwb3J0IGZvciBTcGlyaXQgdmVyc2lvbnMgZWFybGllciB0aGFuIFYxLjcuCi0gU3RhcnRlZCB0byBtaWdyYXRlIHRvIG5ldyBtdWx0aV9wYXNzIGl0ZXJhdG9ycyBmcm9tIFNwaXJpdCBWMi4wLgoKQm9vc3QgVjEuMzUuMAotIFdhdmUgVmVyc2lvbiAxLjMKLSBDaGFuZ2VkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlICdldmFsdWF0ZWRfY29uZGl0aW9uYWxfZXhwcmVzc2lvbigpJyBwcCBob29rCiAgdG8gJ2Jvb2wnIGFsbG93aW5nIHRvIGZvcmNlIFdhdmUgdG8gcmUtZXZhbHVhdGUgdGhlIGN1cnJlbnQgY29uZGl0aW9uYWwKICBleHByZXNzaW9uLiBUaGlzIHdhcyBzdWdnZXN0ZWQgYnkgRmVsaXBlIE1hZ25vIGRlIEFsbWVpZGEuCi0gQWRkZWQgYSB3YXZlOjpjb250ZXh0IG9iamVjdCBhcyBmaXJzdCBwYXJhbWV0ZXIgdG8gYWxsIHBwIGhvb2sgZnVuY3Rpb25zLiAKICBUaGlzIGlzIGFuIGludGVyZmFjZSBjb21wYXRpYmlsaXR5IGJyZWFraW5nIGNoYW5nZS4gVGhlIG5ldyBwcC1ob29rcyBjYW4gYmUgCiAgZGlzYWJsZWQgYnkgZGVmaW5pbmcgdGhlIEJPT1NUX1dBVkVfVVNFX0RFUFJFQ0lBVEVEX1BSRVBST0NFU1NJTkdfSE9PS1MgCiAgY29tcGlsZSB0aW1lIGNvbnN0YW50IHRvIHNvbWV0aGluZyBub3QgZXF1YWwgdG8gemVyby4gQnkgZGVmYXVsdCB0aGlzIAogIGNvbnN0YW50IHdpbGwgYmUgZGVmaW5lZCB0byB6ZXJvIGZvciBCb29zdCBWMS4zNS4wIGFuZCBuZXdlciwgc3dpdGNoaW5nIHRvCiAgdGhlIG5ldyBpbnRlcmZhY2UgYnkgZGVmYXVsdC4KLSBBZGRlZCBvcHRpb25hbCBzdXBwb3J0IGZvciB0aGUgaW1wb3J0IGtleXdvcmQgKG5lZWRlZCBmb3IgdGhlIEMrKyBtb2R1bGUKICBwcm9wb3NhbCkuIFRoZSBpZGVudGlmaWVyIGltcG9ydCB3aWxsIGJlIHJlY29nbml6ZWQgYXMgYSBrZXl3b3JkLCBpZiAKICB0aGUgY29tcGlsZSB0aW1lIGNvbnN0YW50IEJPT1NUX1dBVkVfU1VQUE9SVF9JTVBPUlRfS0VZV09SRCBpcyBkZWZpbmVkIHRvIAogIHNvbWV0aGluZyBub3QgZXF1YWwgemVyby4KLSBBZGRlZCBuZXcgcHJlcHJvY2Vzc2luZyBob29rIGZ1bmN0aW9uczogZm91bmRfZXJyb3JfZGlyZWN0aXZlKCkgYW5kIAogIGZvdW5kX3dhcm5pbmdfZGlyZWN0aXZlKCkgdG8gYmUgY2FsbGVkIHdoZW4gI2Vycm9yLyN3YXJuaW5nIGRpcmVjdGl2ZXMgYXJlCiAgZW5jb3VudGVyZWQuIFRoaXMgd2FzIHN1Z2dlc3RlZCBieSBBbmRyZWFzIFPmYmr4cm5zZW4uCi0gQWRkZWQgYSBuZXcgc2FtcGxlIHRvIFdhdmU6IGhhbm5pYmFsLCBhIHBhcnRpYWwgQysrIHBhcnNlciBpbXBsZW1lbnRhdGlvbgogIGluaXRpYWxseSB3cml0dGVuIGJ5IERhbm55IEhhdmVuaXRoIChodHRwOi8vaGF2ZW5pdGgtdmVybGluZGVuLm5sL2hhbm5pYmFsLykKICB3aG8gYWdyZWVkIHRvIGFkZCB0aGlzIGhlcmUuIFRoYW5rcyEKLSBBZGRlZCBuZXcgcHJlcHJvY2Vzc2luZyBob29rIGZ1bmN0aW9uOiBmb3VuZF9saW5lX2RpcmVjdGl2ZSgpIHRvIGJlIGNhbGxlZCAKICB3aGVuIGEgI2xpbmUgZGlyZWN0aXZlIGlzIGVuY291bnRlcmVkLiBUaGlzIHdhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcwogIFPmYmr4cm5zZW4uCi0gSW1wcm92ZWQgY29tbWFuZCBsaW5lIGhhbmRsaW5nIGZvciB0aGUgd2F2ZSBhcHBsZXQuCi0gSW5jb3Jwb3JhdGVkIGxhdGVzdCBidWcgZml4ZXMgZm9yIHRoZSBIYW5uaWJhbCBzYW1wbGUgcHJvdmlkZWQgYnkgRGFubnkgCiAgSGF2ZW5pdGguIAotIEFkZGVkIGxvYWRpbmcgb2YgYSB3YXZlLmNmZyBmaWxlIGZyb20gYW55d2hlcmUgdXAgdGhlIGZpbGVzeXN0ZW0gaGllcmFyY2h5IAogIHN0YXJ0aW5nIGZyb20gdGhlIG1haW4gaW5wdXQgZmlsZSBmb3IgdGhlIHdhdmUgZHJpdmVyIGFwcGxldCB1cCB0byB0aGUgCiAgcm9vdCBvZiB0aGUgZmlsZSBzeXN0ZW0uCi0gQWRkZWQgc3VwcG9ydF9vcHRpb25fZW1pdF9wcmFnbWFfZGlyZWN0aXZlIHRvIGFsbG93IHRvIGNvbnRyb2wgYXQgcnVudGltZSwKICB3aGV0aGVyIHVua25vd24gI3ByYWdtYSBkaXJlY3RpdmVzIHNob3VsZCBiZSBlbWl0dGVkIG9yIG5vdC4gVG8gbWFpbnRhaW4gCiAgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIgdmVyc2lvbnMgdGhpcyBvcHRpb24gaXMgYnkgZGVmYXVsdCBvbiBpZiB0aGUKICBjb21waWxlIHRpbWUgY29uc3RhbnQgQk9PU1RfV0FWRV9FTUlUX1BSQUdNQV9ESVJFQ1RJVkVTIHdhcyBkZWZpbmVkIHRvIAogIGJlIG5vdCBlcXVhbCB0byB6ZXJvIGFuZCBpdCBpcyBvZmYgb3RoZXJ3aXNlLgotIEVuYWJsZWQgWE1MIHNlcmlhbGl6YXRpb24gc3VwcG9ydC4KLSBBZGRlZCB0aGUgdGhyb3dfZXhjZXB0aW9uIHByZXByb2Nlc3NpbmcgaG9vaywgd2hpY2ggZ2V0cyBjYWxsZWQgZm9yIGV2ZXJ5IAogIG9jY3VycmluZyBlcnJvciAod2hlbmV2ZXIgYW4gZXhjZXB0aW9uIHdvdWxkIGhhdmUgYmVlbiB0aHJvd24pLiBUaGUgZGVmYXVsdAogIG9mIHRoaXMgbmV3IGhvb2sgZnVuY3Rpb24gaXMgdG8gdGhyb3cgdGhlIGNvcnJlc3BvbmRpbmcgZXhjZXB0aW9uLCB3aGljaCAKICByZXByb2R1Y2VzIHRoZSBvbGQgYmVoYXZpb3IuCi0gSW1wbGVtZW50ZWQgYSBuZXcgcHJlcHJvY2Vzc2luZyBob29rOiBnZW5lcmF0ZWRfdG9rZW4oKSwgd2hpY2ggZ2V0J3MgY2FsbGVkCiAgd2hlbmV2ZXIgYSB0b2tlbiBpcyBhYm91dCB0byBiZSByZXR1cm5lZCBmb3JtIHRoZSBsaWJyYXJ5LiBUaGlzIGZ1bmN0aW9uIG1heQogIGJlIHVzZWQgdG8gYWx0ZXIgdGhlIHRva2VuIGJlZm9yZSBpdCBnZXRzIHJldHVybmVkIHRvIHRoZSBjYWxsaW5nIAogIGFwcGxpY2F0aW9uLgotIEFkZGVkIGEgbmV3IHNhbXBsZSAncmVhbF9wb3NpdGlvbnMnIGRlbW9uc3RyYXRpbmcgdGhlIG5ldyBnZW5lcmF0ZWRfdG9rZW4oKQogIHByZXByb2Nlc3NpbmcgaG9vayBhbmQgc2hvd2luZyBob3cgdG8gdXNlIFdhdmUgd2l0aCBhIG5ldyB0b2tlbiB0eXBlIHdpdGhvdXQgCiAgdXNpbmcgYSBuZXcgbGV4ZXIgdHlwZS4KLSBGYWN0b3JlZCBvdXQgdGhlIHB1cmUgbGV4X2lucHV0X2ludGVyZmFjZSB0byBzaW1wbGlmeSB3cml0aW5nIGRpZmZlcmVudCBsZXhlciAKICB0eXBlcyBmb3IgV2F2ZS4KLSBBZGRlZCB0aGUgdG9rZW5fc3RhdGlzdGljcyBzYW1wbGUgc2hvd2luZyBob3cgdG8gdXNlIFhwcmVzc2l2ZSB0byBidWlsZCBhIAogIGxleGVyIGZvciBXYXZlLgotIENoYW5nZWQgdGhlIGxpc3RfaW5jbHVkZXMgc2FtcGxlIHRvIHVzZSBhIGxleGVyIHdoaWNoIGlzIGJhc2VkIG9uIHRoZSBsZXhlcnRsIAogIGxpYnJhcnkgd3JpdHRlbiBieSBCZW4gSGFuc29uIChodHRwOi8vd3d3LmJlbmhhbnNvbi5uZXQvbGV4ZXJ0bC5odG1sKS4KLSBBZGRlZCBhIG5ldyBzdXBwb3J0X29wdGlvbjogaW5zZXJ0X3doaXRlc3BhY2UsIGFsbG93aW5nIHRvIHN3aXRjaCBvZmYgCiAgd2hpdGVzcGFjZSBpbnNlcnRpb24gd2hpY2ggaXMgbm9ybWFsbHkgKGJ5IGRlZmF1bHQpIGluIHBsYWNlIHRvIGRpc2FtYml1Z2F0ZQogIEMrKyB0b2tlbnMsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBmb3JtIGRpZmZlcmVudCB0b2tlbnMgaW4gdGhlIG91dHB1dC4KLSBBZGRlZCBhIG5ldyBjb21tYW5kbGluZSBvcHRpb24gdG8gdGhlIFdhdmUgYXBwbGV0OiAtLWRpc2FtYmlndWF0ZSwgYWxsb3dpbmcKICB0byBjb250cm9sIHdoaXRlc3BhY2UgaW5zZXJ0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhpcyBvcHRpb24gaXMgCiAgLS1kaXNhbWJpZ3VhdGU9MSwgcmVzZW1ibGluZyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLiBTcGVjaWZ5aW5nIHRoZSBvcHRpb24KICAtLWRpc2FtYmlndWF0ZT0wIGFsbG93cyB0byBzdXBwcmVzcyB3aGl0ZXNwYWNlIGluc2VydGlvbiBhbGx0b2dldGhlci4KLSBBZGRlZCBwcmFnbWEgb3B0aW9uIHZhbHVlcyBwdXNoIGFuZCBwb3AgdG8gdGhlIGxpbmUsIHByZXNlcnZlIGFuZCBvdXRwdXQgCiAgb3B0aW9ucyBhbGxvd2luZyB0byBzdG9yZSBhbmQgcmVzdG9yZSB0aGUgY3VycmVudCBvcHRpb24uIFRoZSBzeW50YXggaXM6CiAgICAjcHJhZ21hIHdhdmUgb3B0aW9ucyg8b3B0aW9uPjogcHVzaCkgYW5kCiAgICAjcHJhZ21hIHdhdmUgb3B0aW9ucyg8b3B0aW9uPjogcG9wKQogIHdoZXJlIDxvcHRpb24+IG1heSBiZSBsaW5lLCBwcmVzZXJ2ZSBvciBvdXRwdXQuIFRoYW5rcyB0byBFcmljIE5pZWJsZXIgZm9yIAogIHN1Z2dlc3RpbmcgdGhpcyBmZWF0dXJlLgotIEFkZGVkIHRoZSBwb3NzaWJpbGl0eSB0byB1c2Ugc3RhdGljIHByZS1jb21waWxlZCBERkEgdGFibGVzIGZvciB0aGUgbGV4ZXJ0bCAKICBiYXNlZCBsZXhlci4KLSBJbmNvcnBvcmF0ZWQgdGhlIGNoYW5nZXMgZnJvbSBBbmRyZWkncyBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgZmxleF9zdHJpbmcgCiAgY2xhc3MuCi0gQWRkZWQgdGhlIGlzX21hY3JvX2RlZmluZWQobmFtZSkgZnVuY3Rpb24gdG8gdGhlIGNvbnRleHQgb2JqZWN0IGFzIGRlc2NyaWJlZCAKICBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2FibGUgd2l0aCBhbnkgc3RyaW5nIHR5cGUgY29tcGF0aWJsZSAKICB3aXRoIHN0ZDo6c3RyaW5nLgotIENoYW5nZWQgYmVoYXZpb3Igb2YgdGhlIC0tZm9yY2VfaW5jbHVkZSBmdW5jdGlvbmFsaXR5LCB3aGljaCBub3cgbG9va3MgZm9yIAogIHRoZSBmaWxlIHRvIGJlIChmb3JjZS0paW5jbHVkZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGZpcnN0LgotIFN3aXRjaGVkIHRvIFJlMkMgVjAuMTEuMgotIEFkZGVkIGNvbnN0IHNwZWNpZmllcnMgdG8gc29tZSBvZiB0aGUgY29udGV4dCBtZW1iZXIgZnVuY3Rpb25zLgotIEZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgU0xleCBDKysgbGV4ZXIgKGNwcF90b2tlbnMgZXhhbXBsZSkuCi0gRml4ZWQgYSBydW50aW1lIHByb2JsZW0gaW4gdGhlIFJlMkMgZ2VuZXJhdGVkIGxleGVycyB3aGVuIGZlZWRlZCB3aXRoCiAgZW1wdHkgaW5wdXQgZmlsZXMgKHRoYW5rcyB0byBMZW8gRGF2aXMgZm9yIHJlcG9ydGluZyBhbmQgcHJvdmlkaW5nIGEgcGF0Y2gpLgotIEFkZGVkIHRoZSBpc19lb2koKSBmdW5jdGlvbiB0byB0b2tlbiBjbGFzc2VzLCByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUgdG9rZW4KICBoYXMgYmVlbiBpbml0aWFsaXplZCB0byBiZSB0aGUgZW5kIG9mIGlucHV0IHRva2VuIChUX0VPSSkgKHRoYW5rcyB0byBPdmFuZXMgCiAgTWFya2FyaWFuIGZvciBzdWdnZXN0aW5nIHRoaXMpLgotIEFkZGVkIG1pc3NpbmcgI2luY2x1ZGVzIDxjc3RyaW5nPiwgPGNzdGRsaWI+LCBhbmQgPG5ldz4gdG8gZmxleF9zdHJpbmcuaHBwLgotIEFkZGVkIG1pc3NpbmcgI2luY2x1ZGUgPGNsaW1pdHM+IHRvIGNwcF9jaGxpdF9ncmFtbWFyLmhwcC4KLSBDaGFuZ2VkIGZvdW5kX2luY2x1ZGVfZGlyZWN0aXZlIGhvb2sgZnVuY3Rpb24gdG8gcmV0dXJuIGEgYm9vbCBpbmRpY2F0aW5nLCAKICB3aGV0aGVyIHRoZSBmaWxlIHNob3VsZCBiZSBpbmNsdWRlZCAodHJ1ZSkgb3Igc2tpcHBlZCAoZmFsc2UpLiBUaGFua3MgdG8gCiAgRmVsaXBlIE1hZ25vIGRlIEFsbWVpZGEgZm9yIHN1Z2dlc3RpbmcgdGhpcyBmZWF0dXJlLgotIEFkZGVkIGNvZGUgdG8gdGhlIHdhdmUgZHJpdmVyIGFwcGxldCBpZ25vcmluZyBhICNpbXBvcnQgZGlyZWN0aXZlICh0aGUgd2hvbGUKICBkaXJlY3RpdmUgaXMgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG91dHB1dCkgd2hlbmV2ZXIgdGhlIHBwIGNvbnN0YW50IAogIEJPT1NUX1dBVkVfU1VQUE9SVF9NU19FWFRFTlNJT05TIGlzIGRlZmluZWQgdG8gc29tZXRoaW5nIG5vdCBlcXVhbCB0byB6ZXJvLgotIEZpeGVkIHRoZSB3YXZlIGRyaXZlciBhcHBsZXQgdG8gY29ycmVjdGx5IGNvbnRpbnVlIGFmdGVyIGEgZXJyb3Igb3Igd2FybmluZy4KLSBBZGRlZCBhIG1hY3JvIGludHJvc3BlY3Rpb24gZmFjaWxpdHkgYWxsb3dpbmcgdG8gaXRlcmF0ZSBvbiBhbGwgZGVmaW5lZCBtYWNybyAKICBuYW1lcy4KLSBBZGRlZCBhIG5ldyBjb21tYW5kbGluZSBvcHRpb24gLS1tYWNyb25hbWVzLy1tIHRvIHRoZSBXYXZlIGRyaXZlciBhcHBsaWNhdGlvbgogIHdoaWNoIGxpc3RzIGFsbCBkZWZpbmVkIG1hY3JvcyBhbmQgdGhlaXIgZGVmaW5pdGlvbnMgdG8gYW4gb3B0aW9uYWxseSAKICBzcGVjaWZpZWQgZmlsZSAoZGVmYXVsdCBpcyBjb3V0KS4KLSBGaXhlZCBjb25maWd1cmF0aW9uIHRvIHRha2UgaW50byBhY2NvdW50IHRocmVhZCByZWxhdGVkIGJ1aWxkIHNldHRpbmdzLgotIEFkZGVkIHRoZSBCT09TVF9XQVZFX1NVUFBPUlRfTE9OR0xPTkdfSU5URUdFUl9MSVRFUkFMUyBwcCBjb25zdGFudCBhbGxvd2luZwogIHRvIHJlY29nbml6ZSBsYXJnZSBpbnRlZ2VyIGxpdGVyYWxzIChsYXJnZXIgaW4gc2l6ZSB0aGFuIGxvbmcvdW5zaWduZWQgbG9uZykgCiAgZXZlbiBpZiB0aGVzZSBkbyBub3QgaGF2ZSBhICdsbCcgc3VmZml4LiBUaGlzIHBwIGNvbnN0YW50IGlzIGVmZmVjdGl2ZSBvbmx5LCAKICBpZiB0aGUgdGFyZ2V0IHBsYXRmb3JtIHN1cHBvcnRzIGxvbmcgbG9uZyBpbnRlZ2VycyAoQk9PU1RfSEFTX0xPTkdfTE9ORyBpcyAKICBkZWZpbmVkKS4KLSBUaGUgZm9sbG93aW5nIHByZXByb2Nlc3NpbmcgaG9va3Mgbm93IHJldHVybiBhIGJvb2xlYW4gdmFsdWUsIHdoaWNoIHdoZW4gCiAgcmV0dXJuaW5nICd0cnVlJyBjYXVzZSB0aGUgV2F2ZSBsaWJyYXJ5IHRvIHNraXAgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcmVsYXRlZCAKICBwcmVwcm9jZXNzaW5nIGFjdGlvbjoKICAgIC4gZm91bmRfZGlyZWN0aXZlOiBhbGxvd3MgdG8gc2tpcCB0aGUgd2hvbGUgZGlyZWN0aXZlIGl0IGlzIGNhbGxlZCBmb3IKICAgIC4gZXhwYW5kaW5nX29iamVjdF9saWtlX21hY3JvOiBhbGxvd3MgdG8gc2tpcCBleHBhbnNpb24gb2YgdGhlIGdpdmVuIG9iamVjdAogICAgICAgIGxpa2UgbWFjcm8sIHRoZSBtYWNybyBzeW1ib2wgaXMgY29waWVkIHRvIHRoZSBvdXRwdXQKICAgIC4gZXhwYW5kaW5nX2Z1bmN0aW9uX2xpa2VfbWFjcm86IGFsbG93cyB0byBza2lwIHRoZSBleHBhbnNpb24gb2YgdGhlIGdpdmVuCiAgICAgICAgZnVuY3Rpb24gbGlrZSBtYWNybywgdGhlIHdob2xlIG1hY3JvIGludm9jYXRpb24gKGluY2x1ZGluZyBhbGwgCiAgICAgICAgbWFjcm8gaW52b2NhdGlvbiBwYXJhbWV0ZXJzKSBhcmUgY29waWVkIHRvIHRoZSBvdXRwdXQgd2l0aG91dCBhbnkgCiAgICAgICAgZnVydGhlciBwcm9jZXNzaW5nLgotIENoYW5nZWQgdGhlIGludGVycHJldGF0aW9uIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZvdW5kX2luY2x1ZGVfZGlyZWN0aXZlIAogIHByZXByb2Nlc3NpbmcgaG9vazogYSByZXR1cm4gdmFsdWUgb2YgJ2ZhbHNlJyBub3cgcHJvY2Vzc2VzIHRoZSBmaWxlIAogIHRvIGJlIGluY2x1ZGVkIG5vcm1hbGx5IGFuZCBhIHJldHVybiB2YWx1ZSBvZiAndHJ1ZScgbm93IHNraXBzIHRoZSBwcm9jZXNzaW5nIAogIG9mIHRoZSBpbmNsdWRlIGZpbGUgZGlyZWN0aXZlICh0aGUgZmlsZSBkb2Vzbid0IGdldCBpbmNsdWRlZCkuIAogIFRoaXMgY2hhbmdlIHdhcyBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlcyBvZiB0aGUgcHJlcHJvY2Vzc2luZyAKICBob29rcyBjb25zaXN0ZW50LiBOb3cgcmV0dXJuICdmYWxzZScgZ2VuZXJhbGx5IG1lYW5zOiBub3JtYWwgZXhlY3V0aW9uIGFuZCAKICByZXR1cm4gJ3RydWUnIGdlbmVyYWxseSBtZWFuczogc2tpcCBleGVjdXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgCiAgcHJlcHJvY2Vzc29yIGFjdGlvbi4KLSBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyBvbiBnY2MsIGZpeGVkIGFtYmlndWl0eSB3aXRoIGJvb3N0IGNvZGUgKGRldGFpbCAKICBuYW1lc3BhY2Ugd2FzIGFtYmlnaW91cykuCi0gRml4ZWQgcHJlZGVmaW5lZCBtYWNybyBzdXBwb3J0IHRvIGJlIHRocmVhZCBzYWZlLgotIEFkZGVkIG1pc3NpbmcgZmlsZSB0byByZWFsX3Bvc2l0aW9ucyBleGFtcGxlLiBUaGFua3MgdG8gTHVkb3ZpYyBBdWJlcnQgZm9yIAogIHNwb3R0aW5nIHRoZSBwcm9ibGVtLgotIFVudGVybWluYXRlZCBDKysvQyBjb21tZW50IGRpYWdub3N0aWNzIGFyZSBub3cgYSB3YXJuaW5nIGFuZCBub3QgYW4gZXJyb3IgCiAgYW55bW9yZS4KLSBBcHBsaWVkIHBhdGNoIHByb3ZpZGVkIGJ5IEplbnMgU2VpZGVsIG1ha2luZyBzdXJlIGV2ZXJ5IGhlYWRlciBjb21waWxlcyBvbiAKICBpdHMgb3duLgotIFVwZGF0ZXMgdG8gdGhlIGRvY3VtZW50YXRpb24uCi0gRml4ZWQgYSBwcm9ibGVtIGluIGZsZXhfc3RyaW5nOjpjb21wYXJlKCkgKCNpbmNsdWRlX25leHQgd2FzIG5vbi1mdW5jdGlvbmFsKS4KLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgcHAgaG9vayBleHBhbmRpbmdfZnVuY3Rpb25fbGlrZV9tYWNybygpLCB3aGVyZSB0aGUgc2VxZW5kCiAgcGFyYW1ldGVyIHdhcyBzZXQgdG8gdGhlIGZpcnN0IHRva2VuIGFmdGVyIHRoZSBjbG9zaW5nIHBhcmVudGhlc2lzIGluc3RlYWQgb2YKICBwb2ludGluZyBhdCBpdC4KLSBBZGRlZCB0aGUgQk9PU1RfV0FWRV9TVVBQT1JUX1RIUkVBRElORyBhbGxvd2luZyB0byBleHBsaWNpdGVseSBjb250cm9sIAogIHdoZXRoZXIgdGhlIFdhdmUgbGlicmFyeSBpcyBidWlsdCB3aXRoIHRocmVhZGluZyBzdXBwb3J0IGVuYWJsZWQuIElmIG5vdCAKICBkZWZpbmVkIHRoZSBidWlsZCBzZXR0aW5ncyB3aWxsIGJlIHBpY2tlZCB1cCBmcm9tIHRoZSBCb29zdCBidWlsZCBlbnZpcm9ubWVudAogIChCT09TVF9IQVNfVEhSRUFEUykuCi0gRml4ZWQgYSB3aGl0ZXNwYWNlIGluc2VydGlvbiBnbGl0Y2gsIHdoZXJlIHdoaXRlc3BhY2UgZ290IGluc2VydGVkIAogIHVuY29uZGl0aW9uYWxseSBiZXR3ZWVuIHR3byBvcGVyYXRvcnMgZXZlbiBpZiBvbmUgb2YgdGhlc2Ugd2FzIGEgY29tbWEuCi0gRml4ZWQgI2xpbmUgZGlyZWN0aXZlIGFmdGVyIGEgbWFjcm8gaW52b2NhdGlvbiBjb250YWluaW5nIG5ld2xpbmVzIHRvIAogIGNvcnJlY3RseSByZWZlcmVuY2UgdGhlIGxpbmUgbnVtYmVyLgotIFBvc2l0aW9ucyBvZiBtYWNyb3MgZGVmaW5lZCBvbiB0aGUgY29tbWFuZCBsaW5lIG5vdyBnZXQgcHJvcGVybHkgcmVwb3J0ZWQgYXMgCiAgIjxjb21tYW5kIGxpbmU+IjoxOi4uLgotIEFkZGVkIHRlc3Rpbmcgb2YgdGhlIHByZXByb2Nlc3NvciBob29rcy4KCkJvb3N0IFYxLjM0LjAKLSBXYXZlIFZlcnNpb24gMS4yLjQKLSBBZGRlZCB0aGUgcG9zc2liaWxpdHkgdG8gZXhwbGljaXRseSBlbmFibGUvZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiAjbGluZSAKICBkaXJlY3RpdmVzLiBBZGRlZCBhIGNvcnJlc3BvbmRpbmcgY29tbWFuZGxpbmUgYXJndW1lbnQgdG8gdGhlIFdhdmUgZHJpdmVyIAogIHRvb2wgKC0tbGluZS8tTCkgd2hpY2ggdGFrZXMgZWl0aGVyIDAgb3IgMSBhcyBpdHMgcGFyYW1ldGVyLgotIEFkZGVkIHN1cHBvcnQgZm9yICNwcmFnbWEgd2F2ZSBvcHRpb24oY29tbWFuZDogdmFsdWUpIGRpcmVjdGl2ZXMsIHdoaWNoIAogIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6CiAgIC4gI3ByYWdtYSB3YXZlIG9wdGlvbihsaW5lOiBbMHwxXSkgIAogICAgICAgIEVuYWJsZS9kaXNhYmxlIGdlbmVyYXRpb24gb2YgI2xpbmUgZGlyZWN0aXZlcwogICAuICNwcmFnbWEgd2F2ZSBvcHRpb24ocHJlc2VydmU6IFswfDF8Ml0pICAKICAgICAgICBDb250cm9sIHdoaXRlc3BhY2UgcHJlc2VydmF0aW9uCiAgIC4gI3ByYWdtYSB3YXZlIG9wdGlvbihvdXRwdXQ6IFsiZmlsZW5hbWUiIHwgbnVsbCB8IGRlZmF1bHRdKQogICAgICAgIFJlZGlyZWN0IG91dHB1dCB0byB0aGUgZ2l2ZW4gZmlsZSAob3Igbm8gb3V0cHV0LCBpZiAnbnVsbCcgaXMgc3BlY2lmaWVkLAogICAgICAgIG9yIG91dHB1dCB0byB0aGUgZmlsZSBhcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCBpZiAnZGVmYXVsdCcgaXMgCiAgICAgICAgc3BlY2lmaWVkKS4KICAgICAgICBUaGUgZmlsZW5hbWUgaXMgcmVzb2x2ZWQgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBvZiB0aGUgcHJvY2Vzc2VkCiAgICAgICAgZmlsZS4KICBUaGVzZSBuZXcgI3ByYWdtYSBkaXJlY3RpdmVzIGFyZSBpbXBsZW1lbnRlZCBpbiB0aGUgV2F2ZSBkcml2ZXIgdG9vbCBvbmx5LgogIEl0IGlzIHBvc3NpYmxlIHRvIGNvbWJpbmUgc2V2ZXJhbCBvcHRpb25zIGluIG9uZSAjcHJhZ21hIGRpcmVjdGl2ZSwgaS5lLgogICNwcmFnbWEgd2F2ZSBvcHRpb24obGluZTogMCwgcHJlc2VydmU6IDIpLgotIENoYW5nZWQgdGhlIHNpZ25hdHVyZSBvZiB0aGUgbWF5X3NraXBfd2hpdGVzcGFjZSgpIHByZXByb2Nlc3NpbmcgaG9vayB0byAKICBhZGRpdGlvbmFsbHkgdGFrZSB0aGUgcHJlcHJvY2Vzc2luZyBjb250ZXh0IGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXIuCi0gQWRkZWQgdGhlIHBvc3NpYmlsaXR5IHRvIHRoZSBXYXZlIHRvb2wgdG8gZGlzYWJsZSBpbml0aWFsIG91dHB1dCBieSAKICBzcGVjaWZ5aW5nIGEgJy0nIGFzIHRoZSBvdXRwdXQgZmlsZS4gVGhpcyBpcyB1c2VmdWwgZm9yIHN5bnRheCBjaGVja3Mgb25seSBvcgogIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlICNwcmFnbWEgd2F2ZSBvcHRpb24ob3V0cHV0OiAuLi4pIHRvIHJlc3RyaWN0IHRoZQogIGdlbmVyYXRlZCBvdXRwdXQuCi0gSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5nIGluIHRoZSBXYXZlIHRvb2wgb24gYmFkIG91dHB1dCBmaWxlIHN0cmVhbSBzdGF0ZS4KLSBTd2l0Y2hlZCB0byBSZTJDIFYwLjEwLjAKLSBGaXhlZCBzb21lIG9mIHRoZSBWQzcuMSAvVzQgd2FybmluZ3MuCi0gVGhlIFdhdmUgdG9vbCBub3cgY3JlYXRlcyB0aGUgZGlyZWN0b3J5IGhpZXJhcmNoeSBvZiBvdXRwdXQgZmlsZXMgYXMgbmVlZGVkLgotIEFwcGxpZWQgc29tZSBvcHRpbWl6YXRpb24sIHdoaWNoIGNhdXNlcyBza2lwcGluZyBvZiB0aGUgcGFyc2luZyBmb3IgYWxtb3N0IAogIGFsbCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB3aGVuIHRoZSBpZiBibG9jayBzdGF0dXMgaXMgZmFsc2UuIFRoaXMgZ2FpbnMKICB1cHRvIDEwLTIwJSBpbiBzcGVlZCBmb3IgYXZlcmFnZSBhcHBsaWNhdGlvbnMuCi0gQWRkZWQgZXJyb3IgZGlhZ25vc3RpYyBmb3IgI2VsaWYgd2l0aG91dCBtYXRjaGluZyAjaWYsIHdoaWNoIHdhcyBtaXNzaW5nIAogIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcy4KLSBBdm9pZGVkIHRoZSBldmFsdWF0aW9uIG9mICNlbGlmIGV4cHJlc3Npb25zIGlmIG9uZSBvZiB0aGUgcHJldmlvdXMgI2lmLyNlbGlmCiAgYmxvY2tzIG9mIHRoZSBzYW1lIGxldmVsIHdhcyB0cnVlLiBUaGlzIGdhaW5zIHVwdG8gYW5vdGhlciA1JSBvZiBzcGVlZCBmb3IKICBhdmVyYWdlIGFwcGxpY2F0aW9ucy4KLSBUaGUgTVMgc3BlY2lmaWMgaW50ZWdlciBzdWZmaXggJ2k2NCcgaXMgbm93IGNvcnJlY3RseSBzdXBwb3J0ZWQgYnkgdGhlIFJlMkMKICBhbmQgU0xleCBsZXhlciBjb21wb25lbnRzIChvbmx5IHdoZW4gQk9PU1RfV0FWRV9TVVBQT1JUX01TX0VYVEVOU0lPTlMgaXMgCiAgZGVmaW5lZCBkdXJpbmcgY29tcGlsYXRpb24pLgotIENoYW5nZWQgdGhlIFdhdmUgdG9vbCB0byBwcmludCB0aGUgY29sdW1uIG51bWJlciBvZiBhbiBlcnJvci93YXJuaW5nIGFsb25nCiAgd2l0aCB0aGUgbGluZSBudW1iZXIuIFRoZSBuZXcgZm9ybWF0IGlzOiAnZmlsZW5hbWU6bGluZTpjb2x1bW46IGVycm9yIHRleHQnLgotIEl0IGlzIG5vdyBwb3NzaWJsZSB0byByZWNvdmVyIGZyb20gdGhlIHVuYmFsYW5jZWQgI2lmLyNlbmRpZiBzdGF0ZW1lbnQgCiAgd2FybmluZyBpbiBhIHByb3BlciB3YXkuCi0gVGhlIFdhdmUgbGlicmFyeSBub3cgYXV0b21hdGljYWx5IHJlY29nbml6ZXMgaW5jbHVkZSBndWFyZHMgaW4gaGVhZGVycyBmaWxlcwogIGFuZCB1c2VzIHRoaXMgaW5mb3JtYXRpb24gdG8gYXZvaWQgb3BlbmluZyB0aGVzZSBoZWFkZXIgZmlsZXMgbW9yZSB0aGFuIG9uY2UuCiAgVGhpcyBzcGVlZHMgdXAgdGhpbmdzIGJ5IHVwdG8gMTAtMjAlIGRlcGVuZGluZyBvbiB0aGUgY29uY3JldGUgaW5jbHVkZSBmaWxlcy4KLSBGaXhlZCB0aGUgZmFpbGluZyB0ZXN0IHRfNl8wMjMuY3BwLiBFcnJvciByZXBvcnRpbmcgZm9yIGlsbGZvcm1lZCAjZWxzZSAKICBkaXJlY3RpdmVzIHdhcyBicm9rZW4gKGJlY2F1c2Ugb2Ygc29tZSByZWNlbnQgY2hhbmdlcykuCi0gRml4ZWQgdGhlIGZhaWxpbmcgdGVzdCB0XzVfMDA3LmNwcC4gVGhpcyB3YXMgY2F1c2VkIGJ5IHRoZSBhdXRvbWF0aWMgaW5jbHVkZSAKICBndWFyZCBkZXRlY3Rpb24sIHdoaWNoIHByZXZlbnRlZCB0aGUgc2Vjb25kIGluY2x1c2lvbiBvZiB0aGUgc3BlY2lmaWVkCiAgaW5jbHVkZSBmaWxlIHRoZSB0ZXN0IHdhcyByZWx5aW5nIG9uLgotIEFkZGVkIHRoZSBwb3NzaWJpbGl0eSB0byBzd2l0Y2ggb2ZmIHRoZSBhdXRvbWF0aWMgaW5jbHVkZSBndWFyZCBkZXRlY3Rpb24uCi0gQWRkZWQgYSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiB0byB0aGUgV2F2ZSB0b29sOiAtLW5vZ3VhcmQvLUcsIHdoaWNoCiAgZGlzYWJsZXMgdGhlIGF1dG9tYXRpYyBpbmNsdWRlIGd1YXJkIGRldGVjdGlvbi4KLSBOb3cgYSBoZWFkZXIgd2l0aCBpbmNsdWRlIGd1YXJkcyB3aWxsIGJlIGluY2x1ZGVkIGNvcnJlY3RseSBmb3IgYSBzZWNvbmQgdGltZQogIGFmdGVyIGl0cyBpbmNsdWRlIGd1YXJkIHN5bWJvbCBnZXRzIHVuZGVmaW5lZC4KLSBBZGRlZCB0aGUgZ2VuZXJhdGluZyBwbGF0Zm9ybSB0byBXYXZlJ3MgZnVsbCB2ZXJzaW9uIHN0cmluZy4KLSBNYWRlIHRoZSBXYXZlIHRvb2wgZnVsbHkgaW50ZXJhY3RpdmUgd2hlbiBzdGFydGVkIHdpdGggaW5wdXQgZnJvbSBzdGRpbiBhbmQKICBhbmQgb3V0cHV0IHRvIHN0ZG91dC4gSW4gdGhpcyBtb2RlIHRoZSBXYXZlIHRvb2wgcHJlcHJvY2Vzc2VzIHRoZSBpbnB1dCAKICBsaW5lIGJ5IGxpbmUgYW5kIG5vdCBvbmx5IGFmdGVyIHJlY2VpdmluZyB0aGUgZnVsbCBpbnB1dCBhcyBub3JtYWxseS4KLSBBZGRlZCBzZXJpYWxpemF0aW9uIHN1cHBvcnQgZm9yIHRoZSB3YXZlOjpjb250ZXh0IG9iamVjdCwgd2hpY2ggc3RvcmVzIAogIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBkZWZpbmVkIG1hY3JvcyBhbmQgYWxsICNwcmFnbWEgb25jZSBoZWFkZXIgaW5mb3JtYXRpb24uCi0gQWRkZWQgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gLS1zdGF0ZSAoLXMpIHRvIHRoZSBXYXZlIHRvb2wsIHdoaWNoIHRyaWVzIHRvIAogIGxvYWQgdGhlIHNlcmlhbGl6ZWQgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmlsZSBnaXZlbiBhcyB0aGUgYXJndW1lbnQgdG8gCiAgLS1zdGF0ZSBhbmQgc2F2ZSB0aGUgc3RhdGUgaW5mb3JtYXRpb24gYXQgdGhlIGVuZCB0byB0aGUgc2FtZSBmaWxlLiAKICBUaGlzIG9wdGlvbiBpcyBhdmFpbGFibGUgaW4gaW50ZXJhY3RpdmUgbW9kZSBvbmx5LiAKLSBBZGRlZCBwb3NzaWJpbGl0eSB0byB2ZXJpZnkgdGhlIGNvbXBhdGliaWxpdHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdXNlZCAKICBkdXJpbmcgY29tcGlsYXRpb24gb2YgdGhlIFdhdmUgbGlicmFyeSB3aXRoIHRoZSBjb25maWcgaW5mbyB1c2VkIGZvciB0aGUgCiAgYXBwbGljYXRpb24uIEFkZGVkIGEgY29ycmVzcG9uZGluZyB0ZXN0IHRvIHRoZSBXYXZlIHRvb2wuCi0gQWRkZWQgYSBuZXcgcHJlZGVmaW5lZCBtYWNybyBfX1dBVkVfQ09ORklHX18gd2hpY2ggZXhwYW5kcyB0byBhbiBpbnRlZ2VyCiAgbGl0ZXJhbCBjb250YWluZyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiB0aGUgbGlicmFyeSB3YXMgY29tcGlsZWQKICB3aXRoLgotIEFkZGVkIHByb3BlciB2ZXJzaW9uaW5nIHN1cHBvcnQgdG8gdGhlIHNlcmlhbGl6YXRpb24gb2Ygc3RhdGUuCi0gRml4ZWQgdGhlIG1hY3JvIHRyYWNpbmcgaW5mb3JtYXRpb24gdG8gY29udGFpbiB0aGUgY29sdW1uIG51bWJlcnMgb2YgdGhlIG1hY3JvCiAgZGVmaW5pdGlvbnMgYXMgd2VsbCAodGhlIGZvcm1hdCB1c2VkIGlzIHRoZSBzYW1lIGFzIGZvciBlcnJvciBtZXNzYWdlcykuCi0gRml4ZWQgYSBtZW1vcnkgbGVhayBpbiB0aGUgZmxleF9zdHJpbmcgY29weSBvbiB3cml0ZSBjb2RlICh0aGFua3MgdG8gVG9iaWFzIAogIFNjaHdpbmdlciBmb3IgcmVwb3J0aW5nIHRoaXMgYnVnKS4KLSBGaXhlZCBhIG1lbW9yeSBjb3JydXB0aW9uIGJ1ZyBpbiB0aGUgUmUyQyBzY2FubmVyIGJ1ZmZlciBtYW5hZ2VtZW50IGNvZGUKICAodGhhbmtzIHRvIEFuZHJlYXMgU+ZiavhybnNlbiBmb3Igc3BvdHRpbmcgdGhlIGJ1ZykuCi0gRml4ZWQgYSBtYWpvciBwZXJmb3JtYW5jZSBib3R0bGVuZWNrIGluIHRoZSBsZXhfdG9rZW4gY2xhc3MuIFRoaXMgc3BlZWRzIHVwIAogIFdhdmUgZm9yIHVwdG8gYW5vdGhlciAyMC00MCUgZGVwZW5kaW5nIG9uIHRoZSBhbW91bnQgb2YgbWFjcm8gZXhwYW5zaW9ucyB0byAKICBwZXJmb3JtLgotIEFkZGVkIHRoZSBCT09TVF9TUElSSVRfVVNFX0JPT1NUX0FMTE9DQVRPUl9GT1JfVFJFRVMgYW5kIHRoZQogIEJPT1NUX1NQSVJJVF9VU0VfTElTVF9GT1JfVFJFRVMgU3Bpcml0IGNvbmZpZ3JhdGlvbiBjb25zdGFudHMgdG8gdGhlIAogIHdhdmVfY29uZmlnLmhwcCB0byBhbGxvdyB0byBmaW5lIHR1bmUgdGhlIGdlbmVyYXRlZCBTcGlyaXQgdHJlZSBjb2RlLiBWQzcuMQogIGdpdmVzIGJlc3QgcmVzdWx0cyB3aGVuIGJvdGggYXJlIGRlZmluZWQuCi0gRml4ZWQgYSBtZW1vcnkgY29ycnVwdGlvbiBidWcgdHJpZ2dlcmVkIGJ5IGEgcG9zc2libGUgZGFuZ2xpbmcgcmVmZXJlbmNlLgotIEZpeGVkIFdhdmUgdG9vbHMgc3RhcnR1cCBjcmFzaCB3aGVuIGNvbXBpbGVkIHdpdGggVkM4LgotIEFkZGVkIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0aW5nIGNvbXBpbGVyIChCT09TVF9DT01QSUxFUikgdG8gdGhlIGZ1bGwgCiAgV2F2ZSB2ZXJzaW9uIGluZm8uCi0gRml4ZWQgYWxsIEphbWZpbGUudjIgdG8gY29ycmVjdGx5IGRpc2FibGUgUlRUSSBmb3IgVkM3LjEuCi0gQWRkZWQgI3ByYWdtYSBtZXNzYWdlKCIuLi4iKSB0byBiZSBvcHRpb25hbGx5IHN1cHBvcnRlZCBieSB0aGUgV2F2ZSBsaWJyYXJ5LgogIFRoaXMgbWF5IGJlIGVuYWJsZWQgYnkgZGVmaW5pbmcgdGhlIEJPT1NUX1dBVkVfU1VQUE9SVF9QUkFHTUFfTUVTU0FHRSBwcAogIGNvbnN0YW50IHRvIHNvbWUgdmFsdWUgZGlmZmVyZW50IGZyb20gemVyby4KLSBGaXhlZCBhIGNvdXBsZSBvZiB0eXBvcyBpbiB0aGUgZmlsZSBjcHAuY3BwIHByZXZlbnRpbmcgaXQgdG8gY29tcGlsZSBvbiAKICBnY2MgNC4xLjAgKHRoYW5rcyB0byBSaWNoYXJkIEd1ZW50aGVyIGZvciByZXBvcnRpbmcgdGhlc2UpLgotIFJpY2hhcmQgR3VlbnRoZXIgZml4ZWQgYW5vdGhlciBidWZmZXIgb3ZlcnJ1biBwcm9ibGVtIGluIHRoZSBSZTJDIHNjYW5uZXIuCi0gRml4ZWQgSmFtZmlsZS52MiBmaWxlcyBmb3IgYWxsIHNhbXBsZSBhcHBsaWNhdGlvbnMuCi0gRml4ZWQgYSBidWcgd2hpY2ggbGVhZCB0byByZXBvcnRpbmcgb2YgYW4gaWxsZWdhbCBwcmVwcm9jZXNzaW5nIGRpcmVjdGl2ZQogIGluc2lkZSBub3QtZXZhbHVhdGVkIGNvbmRpdGlvbmFsIGJsb2NrcyB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMgKHRoYW5rcwogIHRvIFRvYmlhcyBTY2h3aW5nZXIgZm9yIHJlcG9ydGluZykuCi0gRml4ZWQgJyNkZWZpbmUgdHJ1ZSAuLi4nLCAnI2RlZmluZSBmYWxzZSAuLi4nIGFuZCBvdGhlciBjb25zdHJ1Y3RzLCBpLmUuIHRoZSAKICB1c2FnZSBvZiB0aGUgYm9vbGVhbiBrZXl3b3JkcyBhcyBpZGVudGlmaWVycyBkdXJpbmcgdGhlIHByZXByb2Nlc3NpbmcuIEFkZGVkCiAgYSBjb3JyZXNwb25kaW5nIHRlc3QgY2FzZSAodF85XzAxNy5jcHApLiBUaGFua3MgdG8gQW5kcmVhcyBT5mJq+HJuc2VuIGZvcgogIHJlcG9ydGluZy4KLSBDb3JyZWN0ZWQgdGhlIEphbWZpbGVbLnYyXSBvZiB0aGUgd2F2ZWlkbCBzYW1wbGUgdG8gcmVmZXIgdG8gY29ycmVjdCBmaWxlIAogIG5hbWVzICh0aGFua3MgdG8gSnVlcmdlbiBIdW5vbGQgZm9yIHN1Ym1pdHRpbmcgYSBwYXRjaCkuCi0gRml4ZWQgYSBidWcgd2hpY2ggcHJldmVudGVkIHRoZSBtYWluIGl0ZXJhdG9yIGZyb20gcmV0dXJuaW5nIGEgVF9FT0YgdG9rZW4gCiAgYXQgdGhlIG92ZXJhbGwgZW5kIG9mIHRoZSBpbnB1dC4gCi0gRml4ZWQgYSBwcm9ibGVtLCB3aGVyZSBub24tZXZhbHVhdGVkICNlbGlmIGRpcmVjdGl2ZXMgbmV2ZXIgZ290IHBhc3NlZCB0byB0aGUgCiAgc2tpcHBlbl90b2tlbigpIHBwIGhvb2sgKHRoYW5rcyB0byBBbmRyZWFzIFPmYmr4cm5zZW4gZm9yIHJlcG9ydGluZykuCi0gRml4ZWQgYSBwcm9ibGVtIGluIHRoZSBnZXRfdG9rZW5uYW1lKCkgZnVuY3Rpb24uCi0gQWRkZWQgYSBtaXNzaW5nICNkZWZpbmUgQk9PU1RfV0FWRV9TT1VSQ0UgMSB0byB0aGUgd2F2ZV9jb25maWdfY29uc3RhbnQuY3BwCiAgZmlsZS4KLSBGaXhlZCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgdG8gY2F0Y2ggYWxsIGV4Y2VwdGlvbnMgYnkgY29uc3QmLgotIEZpeGVkIHByZWRlZmluZWQgbWFjcm9zIHRvIGFwcGVhciB0byBiZSBkZWZpbmVkIGF0IGEgcG9zaXRpb24gcmVmZXJyaW5nIHRvIAogIGEgZmlsZSBuYW1lZCAiPGJ1aWx0LWluPiIuIFRoYW5rcyB0byBBbmRyZWFzIFPmYmr4cm5zZW4gZm9yIHJlcG9ydGluZy4KLSBGaXhlZCB0aGUgUmUyQyBsZXhlciBub3QgdG8gc2VnZmF1bHQgb24gZW1wdHkgZmlsZXMgYW55bW9yZS4KLSBTdHJpcHBlZCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZvciBhbGwgbGluZXMgaW4gYSBjb25maWcgZmlsZSAoV2F2ZQogIGRyaXZlciB0b29sKS4KLSBGaXhlZCBSVFRJIGJ1aWxkIGlzc3VlIGZvciBWQzcuMS9iamFtIC0tdjIgKHRoYW5rcyB0byBSZW5lIFJpdmVyYSBmb3IgCiAgc3VibWl0dGluZyBhIHBhdGNoIGZvciB0aGUgV2F2ZSBKYW1maWxlLnYyKS4KLSBGaXhlZCBjZXJ0YWluIHByb2JsZW1zIHJlcG9ydGVkIGJ5IHRoZSBCb29zdCBpbnNwZWN0aW9uIHRvb2wuCi0gRml4ZWQgYSBjb3VwbGUgb2YgU3VuUHJvNS44IHdhcm5pbmdzLgotIEZpeGVkIGEgYnVnIHJlc3VsdGluZyBpbiBhIGNyYXNoIGlmIGEgbWFjcm8gd2FzIHJlZGVmaW5lZCB3aXRoIGEgc2hvcnRlcgogIGV4cGFuc2lvbiBsaXN0IGFzIGl0IHdhcyBkZWZpbmVkIGluaXRpYWxseS4gQWRkZWQgYSBjb3JyZXNwb25kaW5nIHRlc3QgY2FzZS4KLSBGaXhlZCBhIGJ1ZyBjYXVzaW5nIGFuIGluZmluaXRlIGxvb3Agd2hlbiB0aGVyZSB3YXMgYSBtaXNzaW5nIGVuZGlmIGluIHRoZSAKICBtYWluIHByZXByb2Nlc3NlZCBmaWxlLgotIEltcHJvdmVkIGVycm9yIHJlY292ZXJ5IGZvciBpbGxlZ2FsIHByZXByb2Nlc3NpbmcgZGlyZWN0aXZlIGVycm9ycy4KLSBJbXByb3ZlZCBlcnJvciBoYW5kbGluZyBhbmQgZXJyb3IgcmVjb3ZlcnkgZm9yIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zIAogICgjaWYvI2VsaWYgZXhwcmVzc2lvbnMpLgotIFdhdmUgbm93IHBhc3NlcyAxNjAgb3V0IG9mIDE2MSB0ZXN0cyBmcm9tIHRoZSBNQ1BQIFYyLjYuMSB2YWxpZGF0aW9uIAogIHRlc3RzdWl0ZSEKLSBBZGRlZCBuZXcgd2FybmluZyBmb3IgaW52YWxpZCAjbGluZSBudW1iZXIgYW5kIGZpbGVuYW1lIGFyZ3VtZW50cwotIEltcHJvdmVkIGVycm9yIGRpYWdub3N0aWNzIGZvciBpbnZhbGlkICNsaW5lIGRpcmVjdGl2ZXMgY29udGFpbmluZyBhcmJpdHJhcnkKICB0b2tlbnMgYWZ0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4KLSBJbXByb3ZlZCBlcnJvciBoYW5kbGluZyB3cnQgdGhlIG1pc3VzZSBvZiB0aGUgX19WQV9BUkdfXyB0b2tlbiBpbiBtYWNybyAKICBkZWZpbml0aW9ucy4KLSBUaGUgd2FybmluZywgdGhhdCBhIGZpbGUgaXMgbm90IHRlcm1pbmF0ZWQgYnkgYSBuZXdsaW5lIGlzIG5vdyBpc3N1ZWQgZm9yIGFsbAogIGZpbGVzLCBub3Qgb25seSBmb3IgdGhlIG1haW4gZmlsZSAoYXMgcHJldmlvdXMpLgotIEFkZGVkIGEgY291cGxlIG9mIG5ldyB0ZXN0IGNhc2VzIHRvIHZlcmlmeSB2YXJpb3VzIGRpYWdub3N0aWNzLgotIEZpeGVkIHdhdmUgYXBwbGV0IG5vdCB0byByZXBvcnQgbWlzc2luZyAjZW5kaWYncyB3aGVuIGluIGludGVyYWN0aXZlIG1vZGUuCi0gQ2xlYW5lZCB1cCB0aGUgUmUyQyBsZXhlciBjb2RlLgotIEZpeGVkIGEgYnVnLCB3aGVyZSBhIGVtcHR5IGxpbmUgZm9sbG93ZWQgYnkgYW4gYXJiaXRyYXJ5IHRva2VuIGFuZCBmb2xsb3dlZCAKICBieSBhIHByZXByb2Nlc3NpbmcgZGlyZWN0aXZlIGludGVycHJldGVkIHRoZSBwcmVwcmNlc3NpbmcgZGlyZWN0aXZlIGFzIGlmIGl0CiAgd2VyZSB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgdG9rZW4gb24gdGhlIGxpbmUuIFRoaXMgZXJyb3Igb2NjdXJlZCBvbmx5CiAgaWYgdGhlICNsaW5lIGRpcmVjdGl2ZSBnZW5lcmF0aW9uIHdhcyBzdXBwcmVzc2VkLiBUaGFua3MgdG8gSm9hbiBHcmFudCBmb3IKICByZXBvcnRpbmcgdGhpcyBwcm9ibGVtLgotIEZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgV2F2ZSBhcHBsZXQgd2hpY2ggcHJldmVudGVkIHRoZSBjb3JyZWN0IHJlY29nbml0aW9uIG9mIAogIFdpbmRvd3MgZmlsZSBwYXRocyBpbiBhIGNvbmZpZ3VyYXRpb24gZmlsZSwgaWYgdGhpcyBwYXRoIHdhcyBlbmNsb3NlZCBpbiAKICBxdW90ZXMuCi0gRXh0ZW5kZWQgdGhlIGNvcHlyaWdodCBub3RpY2UgdG8gaW5jbHVkZSB0aGUgeWVhciAyMDA3LgotIEZpeGVkIGEgcHJvYmxlbSBpbiBwcmVzZXJ2ZT0xIG1vZGUsIHdoZW4gYSBDIHN0eWxlIGNvbW1lbnQgdHJpZ2dlcmVkIHRoZSAKICBnZW5lcmF0aW9uIG9mIGEgI2xpbmUgZGlyZWN0aXZlLgotIFdvcmtlZCBhcm91bmQgYSBsaW5rZXIgaXNzdWUgZm9yIHRoZSBUcnVlNjQvQ1hYIGNvbXBpbGVyLCBjb21wbGFpbmluZyBhYm91dAogIG11bHRpcGxlIGRlZmluZWQgc3ltYm9scyB3aGVuIHVzaW5nIHRoZSBmbGV4X3N0cmluZyBjbGFzcy4KLSBBZGRlZCBtaXNzaW5nIGRvY3VtZW50YXRpb24gZm9yIHRoZSBjb250ZXh0OjpnZXRfbWFjcm9fZGVmaW5pdGlvbiBmdW5jdGlvbi4KClNhdCBGZWIgMTggMjAwNQotIFZlcnNpb24gMS4yLjMKLSBBZGRlZCBhIG1pc3NpbmcgdGhyb3coKSBzcGVjaWZpY2F0aW9uIHRvIHRoZSBmdW5jdGlvbiAKICBjcHBfZXhjZXB0aW9uOjpnZXRfcmVsYXRlZF9uYW1lKCkuCi0gRml4IEJvb3N0IGJ1ZyAoWyBib29zdC1CdWdzLTEzOTU4NTcgXSB3YXZlIHJlZGVmaW5lcyBCU0laRSkuCi0gQWRkZWQgbWlzc2luZyBjYWxscyB0byB0aGUgc2tpcHBlZF90b2tlbigpIHByZXByb2Nlc3NpbmcgaG9vayB3aGljaCB3YXNuJ3QKICBjYWxsZWQgZm9yIHBwIGRpcmVjdGl2ZXMgaW5zaWRlIGRpc2FibGVkICNpZiBibG9ja3MuCi0gTWFkZSB0aGUgY29udGV4dDw+IHR5cGUgbm9uY29weWFibGUuCi0gSW50cm9kdWNlZCB0aGUgLS1leHRlbmRlZC8teCBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRoZSB3YXZlIGRyaXZlciAKICBleGVjdXRhYmxlLCB3aGljaCBlbmFibGVzIHRoZSAjcHJhZ21hIHdhdmUgc3lzdGVtKCkgZGlyZWN0aXZlLiBUaGlzIGRpcmVjdGl2ZQogIGlzIG5vdyBkaXNhYmxlZCBieSBkZWZhdWx0IGJlY2F1c2UgaXQgbWF5IGNhdXNlIGEgcG90ZW50aWFsIHNlY3VyaXR5IHRocmVhdC4KLSBDaGFuZ2VkIHRoZSB3aGF0KCkgZnVuY3Rpb24gb2YgdGhlIG1hY3JvX2hhbmRsaW5nX2V4Y2VwdGlvbiBjbGFzcywgd2hpY2ggbm93CiAgY29ycmVjdGx5IHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGV4Y2VwdGlvbiB0eXBlIGl0c2VsZi4KLSBBZGRlZCBhIGRpYWdub3N0aWMgbWVzc2FnZSB0byB0aGUgd2F2ZSBkcml2ZXIgZXhlY3V0YWJsZSwgd2hpY2ggaXMgaXNzdWVkIAogIHdoZW5ldmVyIGEgI3ByYWdtYSB3YXZlIHN5c3RlbSgpIGRpcmVjdGl2ZSBpcyBmb3VuZCwgYnV0IHRoZSAteCAoLS1leHRlbmRlZCkgCiAgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdhcyBub3QgZ2l2ZW4uCi0gRml4ZWQgbG9uZyBpbnRlZ2VyIHN1ZmZpeCB0byBiZSBhbGxvd2VkIHRvIGJlIG1peGVkIGNhc2UgKDFMbCBvciAybEwpLgotIEZpeGVkIHRoZSBCT09TVF9QUF9DQVQoMWUsIC0xKSBwcC10b2tlbiBidWcuIFdhdmUgbm93IGNvcnJlY3RseSByZWNvZ25pemVzCiAgcHAtbnVtYmVyIHRva2Vucywgd2hpY2ggYXJlIGNvbnZlcnRlZCB0byBDKysgdG9rZW5zIHJpZ2h0IGJlZm9yZSB0aGV5IGFyZSAKICByZXR1cm5lZCBmcm9tIHRoZSBsaWJyYXJ5LgotIE1vdmVkIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdG9rZW5faWQgcXVlcnkgZnVuY3Rpb25zIChnZXRfdG9rZW5fbmFtZSgpLCAKICBnZXRfdG9rZW5fdmFsdWUoKSkgdG8gYSBzZXBhcmF0ZSBzb3VyY2UgZmlsZS4KLSBGaXhlZCBhIGJ1Zywgd2hpY2ggcHJldmVudGVkIHRvIHByZWZlciBwcC1udW1iZXJzIGluIGZpbGVzIHByZXByb2Nlc3NlZCBhcwogIGEgcmVzdWx0IG9mICNpbmNsdWRlIGRpcmVjdGl2ZXMuCi0gRml4ZWQgYSBidWcsIHdoaWNoIHByZXZlbnRlZCB0byBvcGVuICNpbmNsdWRlJ2QgZmlsZXMgc3BlY2lmaWVkIGJ5IGFuIAogIGFic29sdXRlIHBhdGguCi0gRml4ZWQgYSBwcm9ibGVtIGluIHRoZSBleHByZXNzaW9uIHBhcnNlciB2YWx1ZSB0eXBlLgotIEZpeGVkIGEgZHluYWxvYWQgY29tcGlsYXRpb24gcHJvYmxlbSB3aXRoIFZDNy4xIG9mIHRoZSByZTJjIGxleGVyIHRlc3RzLgoKU2F0IERlYyAyNCAxMzozMzo1MyBDU1QgMjAwNQotIFZlcnNpb24gMS4yLjIKLSBBZGRlZCB0aHJlZSBuZXcgcHJlcHJvY2Vzc2luZyBob29rczogJ2ZvdW5kX2RpcmVjdGl2ZScsICdza2lwcGVkX3Rva2VuJyBhbmQgCiAgJ2V2YWx1YXRlZF9jb25kaXRpb25hbF9leHByZXNzaW9uJyAodGhhbmtzIHRvIEFuZHJlYXMgU+ZiavhybnNlbiBmb3IgdGhlIAogIHN1Z2dlc3Rpb25zKS4KLSBSZW1vdmVkIGhvb2sgZm9yd2FyZGluZyBmdW5jdGlvbnMgaW4gdGhlIGNvbnRleHRfdHlwZS4KLSBBZGRlZCBtaXNzaW5nIGluY2x1ZGVfbmV4dCBjYXNlIGJyYW5jaGVzIGZvciBnZXRfZGlyZWN0aXZlbmFtZSgpIGZ1bmN0aW9uLgotIEFkZGVkIG5ldyBzYW1wbGU6IGFkdmFuY2VkX2hvb2tzLgotIEZpeGVkIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93IGluIHRoZSBjcHBsZXhlciBhbmQgY3BwIGV4Y2VwdGlvbiBjbGFzc2VzLgotIE1hZGUgdGhlIGNwcF9ncmFtbWFyIHRocmVhZCBzYWZlLgotIFJlbW92ZWQgdGhlIG5lZWQgZm9yIHRoZSBnZXRfZGlyZWN0aXZlbmFtZSgpIGZ1bmN0aW9uLiBGaXhlZCB0eXBvcyBpbiB0aGUgCiAgcHJlZGVmaW5lZCB0b2tlbiB0YWJsZS4KLSBSZW1vdmVkIGFzc2VydGlvbnMgZnJvbSBnZXRfdG9rZW5fbmFtZSgpIGFuZCBnZXRfdG9rZW5fdmFsdWUoKSBhbmQgcmVwbGFjZWQgCiAgdGhlc2Ugd2l0aCBtb3JlIG1lYW5pbmdmdWwgY29kZS4KLSBBZGRlZCB0aGUgQk9PU1RfV0FWRV9VU0VfU1RSSUNUX0xFWEVSIGNvbmZpZ3VyYXRpb24gY29uc3RhbnQgd2hpY2ggYWxsb3dzIHRvCiAgZGVjaWRlLCB3aGV0aGVyIHRoZSAnJCcgY2hhcmFjdGVyIHdpbGwgYmUgcmVjb2duaXplZCBhcyBhIHBhcnQgb2YgaWRlbnRpZmllcnMKICBvciBub3QgKHRoZSBkZWZhdWx0IGlzIEJPT1NUX1dBVkVfVVNFX1NUUklDVF9MRVhFUiA9PSAwLCBpLmUuICckJyB3aWxsIGJlCiAgcmVjb2duaXplZCBhcyBwYXJ0IG9mIGlkZW50aWZpZXJzKS4KLSBBZGRlZCB0aGUgcG9zc2liaWxpdHkgdG8gdGVzdHdhdmUgdG8gZXh0cmFjdCBhIHRhZ2dlZCBjb21tZW50IGJhc2VkIG9uIGEKICBwcmVwcm9jZXNzb3IgY29uc3RhbnQgKHRlc3R3YXZlIFYwLjQuMCkuCi0gTWFkZSB0aGUgcHJlZGVmaW5lZF9tYWNyb3NfZ3JhbW1hciB0aHJlYWQgc2FmZS4KLSBBZGRlZCBkbGwgc3VwcG9ydCBmb3IgdGhlIGdlbmVyYXRlZCBXYXZlIGxpYnJhcmllcy4KLSBBZGRlZCB0aGUgY29uc3RfaXRlcmF0b3IgYmFzZWQgZXhsaWNpdCBpbnN0YW50aWF0aW9ucyBmb3IgdGhlIFJlMkMgbGV4ZXIgdG8gCiAgdGhlIGJ1aWx0IFdhdmUgbGlicmFyeSBhbmQgZGxsLgotIEFkZGVkIHRoZSB3aGl0ZXNwYWNlIGhhbmRsaW5nIHBvbGljeSB0byB0aGUgY29udGV4dCBvYmplY3QuIFRoaXMgYWN0dWFsbHkgaXMgCiAgbm8gc2VwYXJhdGUgcG9saWN5LCBpdCdzIGEgbmV3IHByZXByb2Nlc3NpbmcgaG9vayBhbGxvd2luZyB0byBkZWNpZGUsIHdoZXRoZXIKICBhIGNvbmNyZXRlIHRva2VuIGhhcyB0byBiZSBza2lwcGVkLgotIENoYW5nZWQgdGhlIC0tcHJlc2VydmUgb3B0aW9uIG9mIHRoZSB3YXZlIHRvb2wgdG8gdGFrZSBhIHNpbmdsZSBpbnRlZ2VyIAogIGFyZ3VtZW50ICgwOiBubyB3aGl0ZXNwYWNlIGlzIHByZXNlcnZlZCwgMTogb25seSBjb21tZW50cyBhcmUgcHJlc2VydmVkLCAKICAyOiBhbGwgd2hpdGVzcGFjZSBpcyBwcmVzZXJ2ZWQpCi0gRWRpdGVkIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIGRlc2NyaXB0aW9ucyBvZiB0aGUgd2F2ZSBkcml2ZXIuCi0gRml4ZWQgYnJva2VuIHRhZ3MgaW4gZG9jdW1lbnRhdGlvbiAobWFnaWNhbGx5IGluc2VydGVkIGJ5IERyZWFtV2VhdmVyKS4KLSBNZXJnZWQgdGhlIG5ldyB3aGl0ZXNwYWNlX2hhbmRsaW5nIHBvbGljeSB3aXRoIHRoZSBleGlzdGluZyBwcmVwcm9jZXNzaW5nIAogIGhvb2tzLiBUaGUgbmFtZSBvZiB0aGUgbmV3IHByZXByb2Nlc3NpbmcgaG9vayBpc3QgbWF5X3NraXBfd2hpdGVzcGFjZSgpLgotIEZpeGVkIGNvbXBhdGliaWxpdHkgaXNzdWVzIGZvciBDVzkuNCBpbiB0aGUgV2F2ZSB0ZXN0IGFwbGljYXRpb24uCi0gQWRkZWQgZ2V0X2Vycm9yY29kZSgpIG1lbWJlciB0byB0aGUgd2F2ZSBleGNlcHRpb24gY2xhc3NlcyBhbGxvd2luZyB0byAKICBnZXQgYmFjayB0aGUgcmVhc29uIGZvciB0aGUgZXhjZXB0aW9uLgotIEFkZGVkIGJvb3N0Ojp3YXZlOjppc19yZWNvdmVyYWJsZShjcHBfZXhjZXB0aW9uIGNvbnN0JikgYWxvd2luZyB0byBkZWNpZGUsCiAgd2hldGhlciBpdCBpcyBwb3NzaWJsZSB0byBjb250aW51ZSBhZnRlciBhIGNwcF9leGNlcHRpb24gaGFzIGJlZW4gdGhyb3duLgogIFRoaXMgaXMgYSB0ZW1wb3JhcnkgaGFjayB0byBvdmVyY29tZSB0aGUgY3VycmVudCBsaW1pdGF0aW9uIG9mIHRoZSBsaWJyYXJ5CiAgbm90IGFsbG93aW5nIHRvIGRvIGdlbmVyaWMgZXJyb3IgcmVjb3ZlcnkuIEl0IGFsbG93cyB0byByZWNvdmVyIGZyb20gNzUlIG9mCiAgdGhlIGdlbmVyYXRlZCBlcnJvcnMgdHlwZXMuCi0gVGhlIC0tdGltZXIgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgdGhlIFdhdmUgZHJpdmVyIG5vdyBwcmludHMgdGhlIGVsYXBzZWQgCiAgdGltZSBjb3JyZWN0bHkgZXZlbiBpZiBhIHByZXByY2Vzc2luZyBlcnJvciBvY2N1cmVkLgotIEZpeGVkIGFuIGVycm9yIHJlY292ZXJ5IHByb2JsZW0gd2hpY2ggc2tpcHBlZCBvbmUgdG9rZW4gYWZ0ZXIgY29udGludWluZyBpbgogIGNhc2UgdGhpcyB3YXMgYSBwcCBkaXJlY3RpdmUuCi0gQWRkZWQgdGhlIC0tYXV0b291dHB1dCAoLUUpIG9wdGlvbiB0byB0aGUgV2F2ZSBkcml2ZXIgYXBwbGV0IHdoaWNoIHJlZGlyZWN0cyAKICB0aGUgZ2VuZXJhdGVkIG91dHB1dCB0byBhIGZpbGUgbmFtZWQgYWZ0ZXIgdGhlIGlucHV0IGZpbGUgY2hhbmdpbmcgdGhlIGZpbGUgCiAgZXh0ZW5zaW9uIHRvICcuaScuCi0gQ2hhbmdlZCBhbGwgdGhyb3cncyB0byBib29zdDo6dGhyb3dfZXhjZXB0aW9uLgotIEFkZGVkIHRoZSBwb3NzaWJpbGl0eSB0byBjb25maWd1cmUgdGhlIGNvbW1hbmQga2V5d29yZCBmb3IgdGhlIHdhdmUgc3BlY2lmaWMgCiAgI3ByYWdtYSBkaXJlY3RpdmVzLiBJdCBpcyBub3cgcG9zc2libGUgdG8gZGVmaW5lIGEgc3RyaW5nIGxpdGVyYWwgdmlhCiAgQk9PU1RfV0FWRV9QUkFHTUFfQ09NTUFORCwgd2hpY2ggd2lsbCBiZSByZWNvZ25pemVkIGFuZCBhbGwgY29ycmVzcG9uZGluZwogICNwcmFnbWEncyBhcmUgZGlzcGF0Y2hlZCB0byB0aGUgaW50ZXJwcmV0X3ByYWdtYSgpIHByZXByb2Nlc3NpbmcgaG9vay4KICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgQk9PU1RfV0FWRV9QUkFHTUFfQ09NTUFORCBpcyAid2F2ZSIsIGp1c3QgdG8gZW5zdXJlIAogIGNvbXBsZXRlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi0gQWRkZWQgbWlzc2luZyAjcHJhZ21hIHdhcm5pbmcocG9wKSBkaXJlY3RpdmVzLgotIEZpeGVkIGEgYnVnIHdydCBlcnJvciBwcm9wYWdhdGlvbiBpbiB0aGUgZXhwcmVzc2lvbiBwYXJzZXIuCi0gRml4ZWQgYW4gYXNzZXJ0aW9uIGZpcmVkIHdoZW4gY3BwX3Rva2VuIGlzIHVzZWQgdG8gcHJvY2VzcyB0aGUgcXVpY2tfc3RhcnQgCiAgc2FtcGxlLgotIEZpeGVkIGEgKFdpbmRvd3Mgc3BlY2lmaWMpIGJ1ZyB3aGljaCB0cmlnZ2VyZWQgYSBib29zdDo6ZmlsZV9zeXN0ZW0gZXhjZXB0aW9uCiAgdW5kZXIgY2VydGFpbiBjb25kaXRpb25zLgotIFN3aXRjaGVkIHRvIFJlMkMgVjAuOS4xMQotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBuZXcgJy1FJyAoLS1hdXRvb3V0cHV0KSBvcHRpb24uCi0gQWRkZWQgYmV0dGVyIGVycm9yIHJlcG9ydGluZyBmb3IgZHVwbGljYXRlIG1hY3JvIGRlZmluaXRpb25zIHRvIHRoZSBXYXZlIAogIHRvb2wuIEFkZGVkIHRoZSBtYWNyb19oYW5kbGluZ19leGNlcHRpb24gdHlwZSBjb250YWluaW5nIHRoZSBjb3JyZXNwb25kaW5nIAogIG1hY3JvIG5hbWUgdmlhIHRoZSBuZXcgKHZpcnR1YWwpIGdldF9yZWxhdGVkX25hbWUoKSBmdW5jdGlvbi4KLSBBZGRlZCB0aGUgZ2V0X3NldmVyaXR5KCkgZnVuY3Rpb24gdG8gdGhlIGV4Y2VwdGlvbnMgdGhyb3duIGJ5IHRoZSBXYXZlCiAgbGlicmFyeS4KLSBFeHRlbmRlZCB0aGUgY29weXJpZ2h0IG5vdGljZSB0byBpbmNsdWRlIHRoZSB5ZWFyIDIwMDYuCiAgCk1vbiBEZWMgIDUgMjI6MDU6MjIgQ1NUIDIwMDUKQm9vc3QgVjEuMzMuMQotIFZlcnNpb24gMS4yLjEKLSBGaXhlZCBidWcgcmVwb3J0ZWQgYXMgU291cmNlZm9yZ2UgYnVnIDEyNzQ1ODQuCi0gU3dpdGNoZWQgdG8gUmUyQyBWMC45LjkuCi0gRml4ZWQgYSBidWcgd2hlcmUgdGhlICdwYXJhbWV0ZXJzJyBhbmQgJ2RlZmluaXRpb24nIHBhcmFtZXRlcnMgdG8gdGhlIAogIGRlZmluZWRfbWFjcm8gY2FsbGJhY2sgb2YgdGhlIHByZXByb2Nlc3NpbmcgaG9va3Mgd2VyZSBhbHdheXMgZW1wdHkgKHRoYW5rcwogIHRvIFN0ZWZhbiBTZWVmZWxkIGZvciByZXBvcnRpbmcpLgotIEZpeGVkIG1pc3NpbmcgbmFtZXNwYWNlIHNwZWNpZmllcnMgaW4gdG9rZW4gZGVmaW5pdGlvbiBtYWNyb3MgKHRoYW5rcyB0byAKICBKb3pzZWYgTWloYWxpY3phIGZvciByZXBvcnRpbmcpLgotIEVuYWJsZWQgLS1wcmVzZXJ2ZWQgYW5kIC0tbG9uZ19sb25nIG1vZGVzIGJ5IGRlZmF1bHQgZm9yIHRoZSBjcHBfdG9rZW5zIAogIHNhbXBsZS4KLSBOZXdsaW5lIHRva2VucyByZXBvcnRlZCBhIHdyb25nIGxpbmUgbnVtYmVyIChvZmZzZXQgYnkgb25lKSB3aGVuIHVzaW5nIHRoZQogIFJlMkMgZ2VuZXJhdGVkIGxleGVyICh0aGFua3MgdG8gSm96c2VmIE1paGFsaWN6YSBmb3IgcG9pbnRpbmcgdGhpcyBvdXQpLgotIENoYW5nZWQgZmlsZSBwb3NpdGlvbnMgdG8gY2FycnkgJ3Vuc2lnbmVkIGludCcgbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gRml4ZWQgdG9rZW5zIG9mIGEgZ2VuZXJhdGVkICNsaW5lIGRpcmVjdGl2ZSB0byBjYXJyeSB0aGUgY29ycmVjdCBjb2x1bW4gCiAgbnVtYmVycy4KLSBUb2tlbnMgbm93IGNvbnRhaW4gdGhlIGNvcnJlY3QgZmlsZW5hbWUsIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGV2ZW4gaWYKICBhICNsaW5lIGRpcmVjdGl2ZSB3YXMgZW5jb3VudGVyZWQuCi0gRml4ZWQgd3JvbmcgbGluZSBudW1iZXJpbmcgaW4gcmVmZXJlbmNlIGNvbW1lbnRzIG9mIHRoZSB0ZXN0cyB0XzVfMDAyLmNwcCBhbmQgCiAgdF81XzAzNS5jcHAuCi0gTWFkZSBzdXJlLCB0aGF0IHByZXByb2Nlc3NvciBleHByZXNzaW9uIGVycm9ycyBnZXQgaWdub3JlZCBmb3IgJ3Bhc3NpdmUnIAogICNlbGlmIGJyYW5jaGVzLgotIEZpeGVkIGFuIGlzc3VlIHJlcG9ydGVkIGJ5IHRoZSBnY2MgZGVidWcgc3RsLgotIEFkZGVkIHRoZSA8dmMtN18xLXN0bHBvcnQ+PCo+PHJ0dGk+b2ZmIGRpcmVjdGl2ZSB0byBhbGwgb2YgdGhlIFYxIEphbWZpbGVzLgoKV2VkIEF1ZyAxNyAyMDoyMTowMCBDU1QgMjAwNQpCb29zdCBWMS4zMy4wClZlcnNpb24gMS4yCi0gRml4ZWQgbmFtZSBjbGFzaCB3cnQgVF9ESVZJREUgb24gRnJlZUJTRC4KLSBGaXhlZCBkb2N1bWVudGF0aW9uIG9mIHRoZSBkaWZmZXJlbnQgbGFuZ3VhZ2Vfc3VwcG9ydCBmbGFncy4KLSBUaGUgc3VwcG9ydCBmb3IgbG9uZyBsb25nIHN1ZmZpeGVzIGlzIG5vIGxvbmdlciBib3VuZCB0byB0aGUgdmFyaWFkaWNzIG1vZGUsCiAgaXQgaGFzIHRvIGJlIGVuYWJsZWQgYnkgdGhlIG5ldyBsb25nX2xvbmcgbW9kZSAoZGVmYXVsdCBpbiBDOTkpLgotIEZpeGVkIGNvbXBpbGF0aW9uIGlmIEJPT1NUX1dBVkVfRFVNUF9QQVJTRV9UUkVFIGlzIGRlZmluZWQuCi0gRml4ZWQgbGV4ZXIgZXJyb3IgbWVzc2FnZSB3cnQgbG9uZ19sb25nIG1vZGUuCi0gU3RlZmFuIFNlZWZlbGQgZml4ZWQgYSBidWcgaW4gdGhlIGxleGVyLCB3aGVyZSBpbmNsdWRlX25leHQgd2FzIGFzc3VtZWQgZm9yCiAgaW5jbHVkZWQgZmlsZXMgY29udGFpbmcgYSAiaW5jbHVkZV8iIGluIHRoZWlyIG5hbWUuCi0gRml4ZWQgc29tZSB0cmlncmFwaCB0b2tlbiBpZCdzIGluIHRoZSBsZXhlcnMuCi0gQWRkZWQgY29sdW1uIGluZm9ybWF0aW9uIHRvIHRoZSByZTJjIGdlbmVyYXRlZCBsZXhlci4KLSBBZGRlZCB0ZXN0cyBmb3IgdGhlIGRpZmZlcmVudCBsZXhlcnMuCi0gRml4ZWQgdGhlIGZvdW5kX2luY2x1ZGVfZGlyZWN0aXZlIHByZXByb2Nlc3NpbmcgaG9vayB0byBjYXJyeSB0aGUgaW5mb3JtYXRpb24KICBhYm91dCAjaW5jbHVkZV9uZXh0IGRpcmVjdGl2ZXMgYXMgd2VsbC4KLSBTZXBhcmF0ZWQgdGhlIGRpZmZlcmVudCBsZXhlciB0ZXN0cy4KLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgd2hpdGVzcGFjZSBlYXRlci4KLSBGaXhlZCBhIGJ1ZyB3aGVyZSBXYXZlIGVtaXR0ZWQgdGhlIGZvdW5kIEMrKyBjb21tZW50cyBpbiAtLXByZXNlcnZlIG1vZGUgZXZlbgogIGlmIHRoZXNlIHdlcmUgZm91bmQgaW5zaWRlIG9mIGRpc2FibGVkICNpZi8jZW5kaWYgYmxvY2tzLgotIFJlbW92ZWQgdGhlIGZ1bmN0aW9uIGxvY2FsIHN0YXRpYyBncmFtbWFycyB0byBhdm9pZCBwb3NzaWJsZSByYWlzZSBjb25kaXRpb25zCiAgYW5kIHRvIG1ha2UgQ1c4LjMgaGFwcHkuCi0gVW5pZmllZCBsZXhlciBpbnRlcmZhY2UsIGFkanVzdGVkIG5hbWVzcGFjZXMuCi0gQWRkZWQgbGV4ZXIgdGVzdGNhc2VzIHRvIHRoZSByZWdyZXNzaW9uIHRlc3RzLgotIEZpeGVkIHRlc3QgY2FzZXMgdG8gc2NhbGUgdG8gNjQgYml0IHBsYXRmb3Jtcy4KLSBEaXNhYmxlZCB0aGUgTVMgc3BlY2lmaWMgZXh0ZW5zaW9ucyBpbiB0aGUgbGV4ZXIgdGVzdHMgaW4gYSBwbGF0Zm9ybSByZWxhdGVkCiAgd2F5LgotIEFkZGVkIHNwZWNpYWwgaGFuZGxpbmcgb2YgdGhlIGVvZiB0b2tlbnMgaW5zaWRlIHRoZSBsZXhlciBpdGVyYXRvciBjbGFzc2VzCiAgZm9yIENvbWVhdS4KLSBBcHBsaWVkIGEgd29ya2Fyb3VuZCBwcm9wb3NlZCBieSBEYXZpZCBBYnJhaGFtcyB0byBtYWtlIHRoZSBzbGV4IGxleGVyIHdvcmsgCiAgb24gdGhlIENvZGVXYXJyaW9yIHBsYXRmb3Jtcy4KICAKU3VuIE1heSAgOCAxNzoyMjo1OSBXRURUIDIwMDUKVmVyc2lvbiAxLjEuMTcKLSBBZGRlZCBpbGxfZm9ybWVkX2NoYXJhY3Rlcl9saXRlcmFsIGFuZCBpbGxfZm9ybWVkX2ludGVnZXJfbGl0ZXJhbCBlcnJvcnMuCi0gSW1wcm92ZWQgZXJyb3IgaGFuZGxpbmcgYW5kIGRpYWdub3N0aWNzIGZvciBpbnRlZ2VyIG92ZXJmbG93IGluICNpZi8jZWxpZgogIGV4cHJlc3Npb25zLgotIEZpeGVkIGEgYnVnIGluIHRoZSB0ZXN0d2F2ZSBhcHBsaWNhdGlvbiB3aGljaCBwcmV2ZW50ZWQgdGhlIGNvcnJlY3QgCiAgcmVjb2duaXRpb24gb2YgZXhwZWN0ZWQgZXJyb3JzIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcy4KLSBGaXhlZCBhIHBvcnRhYmlsaXR5IHByb2JsZW0gKGZvciBnY2MgMy4zLngpIGluIHRoZSB0ZXN0d2F2ZSBhcHBsaWNhdGlvbi4KLSBFbmZvcmNlZCB0aGF0ICNpZi8jZW5kaWYgYXJlIGJhbGFuY2VkIGZpbGUgd2lzZS4KLSBDaGFuZ2VkIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciB0aGUgV2F2ZSB0ZXN0cnVuIHRvIHVzZSBhYnNvbHV0ZSAKICBkaXJlY3Rvcmllcy4KLSBDaGFuZ2VkIHRoZSB0ZXN0IGFwcGxpY2F0aW9uIHRvIHJldHVybiBhIHZhbHVlICE9IHplcm8gaWYgb25lIG9mIHRoZSBnaXZlbiAKICBjb25maWcgZmlsZXMgd2VyZSBub3QgZm91bmQuCi0gRml4ZWQgYSBjb21tYW5kIGxpbmUgcGFyc2luZyBwcm9ibGVtIGNhdXNlZCBieSBhIGNoYW5nZSBpbiB0aGUgcGFyYW1ldGVyCiAgaGFuZGxpbmcgaW5zaWRlIGluIHRoZSBwcm9ncmFtX29wdGlvbnMgbGlicmFyeS4KLSBTd2l0Y2hlZCB0byB0aGUgbW9zdCByZWNlbnQgdmVyc2lvbiBvZiByZTJjIChWMC45LjcuZGV2KS4KLSBGaXhlZCBhIGNvbW8gY29tcGlsYXRpb24gZXJyb3IgYW5kIHNldmVyYWwgY29tbyAtLWEgd2FybmluZ3MuCi0gVGhlIFRfRU9GIHRva2VuIGRvZXNuJ3QgY2FycnkgdGhlIHZhbHVlIG9mIHRoZSBwcmV2aW91cyB0b2tlbiBhbnltb3JlLgotIEFkZGVkIG9wZXJhdG9yPT0oKSB0byB0aGUgdG9rZW4gY2xhc3NlcyB0byBmaXggdGhlIGFtYmlndWl0eSBlcnJvciByZXBvcnRlZAogIGJ5IHRoZSBUcnVlNjQgY29tcGlsZXIuCi0gSW1wcm92ZWQgdGhlIGVycm9yIG1lc3NhZ2UsIHdoZW4gZW1wdHkgYXJndW1lbnRzIGFyZSB1c2VkIGluIHB1cmUgQysrIG1vZGUuCi0gQWRkZWQgY2hhcmFjdGVyIGxpdGVyYWwgb3V0IG9mIHJhbmdlIHRlc3RpbmcgYW5kIGFuIGFkZGl0aW9uYWwgY29ycmVzcG9uZGluZyAKICBlcnJvciBtZXNzYWdlLgotIEZpeGVkIHBhcnNpbmcgb2YgbG9uZyBjaGFyYWN0ZXIgbGl0ZXJhbHMgKHN1Y2ggYXMgJ1x4MTIzNCcpLgotIEZpeGVkIGFsbW9zdCBhbGwgcHJvYmxlbXMgZGlhZ25vc2VkIGJ5IHRoZSBCb29zdCBpbnNwZWN0aW9uIHJlcG9ydC4KLSBTZXZlcmFsIGZpeGVzIHRvIG1ha2UgdGhlIFRydWU2NCBjb21waWxlciBoYXBweS4KLSBBZGRlZCB0aGUgbG9uZyBsb25nIHN1ZmZpeCBoYW5kbGluZyB0byB0aGUgQzk5IG1vZGUgKExML2xsKS4KLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgc2xleCByZWdleCBzcGVjaWZpY2F0aW9ucy4KClRodSBBcHIgIDcgMTA6MDc6NDUgV0VEVCAyMDA1ClZlcnNpb24gMS4xLjE2Ci0gRml4ZWQgYSBidWcgaW4gdGhlIHdoaXRlIHNwYWNlIGVhdGluZyBjb21wb25lbnQsIHdoaWNoIHByZXZlbnRlZCBhIEMrKyAKICBjb21tZW50IHRvIGJlIHN1cHByZXNzZWQgaWYgaXQgZm9sbG93ZWQgYWZ0ZXIgYW5vdGhlciB3aGl0ZXNwYWNlLgotIEZpeGVkIHRoZSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIGJlaGF2aW91ciB3cnQgdGhlIAogIGRpZmZlcmVudCBpbmNsdWRlIHNlYXJjaCBwYXRocy4gU2VlIHRoZSBXYXZlIGRyaXZlciBkb2NzIGZvciBkZXRhaWxzIG9mIGhvdwogIHRoZSAnLUknLCAnLUktJywgYW5kICctUycgb3B0aW9ucyB3b3JrLgotIEFsbG93ZWQgdG8gc3BlY2lmeSBtb3JlIHRoYW4gb25lIGNvbmZpZyBmaWxlICgnQCcgc3ludGF4KSBvbiB0aGUgY29tbWFuZCBsaW5lCiAgb2YgdGhlIHdhdmUgZHJpdmVyIGV4ZWN1dGFibGUuCi0gQ2hhbmdlZCBjb3B5cmlnaHRzIGluIGFsbCBmaWxlcyB0byByZWZsZWN0IHRoZSBhY2NlcHRhbmNlIG9mIFdhdmUgaW50byBCb29zdC4KLSBVbmtub3duIHByZXByb2Nlc3NpbmcgZGlyZWN0aXZlcyB3ZXJlIG5vdCByZWNvZ25pc2VkIGFzIHN1Y2ggYW55bW9yZS4KLSBJZiBjb21tZW50cyBzaG91bGRuJ3QgYmUgcHJlc2VydmVkIGFsbCBDKysgY29tbWVudHMgYXJlIHJlcGxhY2VkIGJ5IG5ld2xpbmUKICB0b2tlbnMgKGluc3RlYWQgb2YgYmVlaW5nIGlnb3JlZCBjb21wbGV0ZWx5KS4KLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgd2hpdGUgc3BhY2UgZWF0ZXIgY29tcG9uZW50LgotIEZpeGVkIGEgYnVnIHdoaWNoIHJlcG9ydGVkIHdyb25nIGxpbmUgbnVtYmVycyBmb3IgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIAogIHJldG9rZW5pc2F0aW9uIChjb25jYXRpbmF0aW9uKS4KLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgdW5lc2NhcGluZyBjb2RlLgotIEZpeGVkIGEgY29tcGlsYXRpb24gZXJyb3Igb2YgdGhlIHRlc3R3YXZlIGV4ZWN1dGFibGUgKGFkZGVkIGEgbWlzc2luZyAKICBuYW1lc3BhY2Ugc3BlY2lmaWVyKS4KLSBBZGRlZCBhIG1pc3NpbmcgaGVhZGVyIHRvIG1ha2UgY3BwLnJlLmNwcCBjb21waWxlIG9uIENXLgotIFRoZSBwcmVkZWZpbmVkIG1hY3JvIF9fQkFTRV9GSUxFX18gbm93IHJldHVybnMgYSBwcm9wZXJseSBlc2NhcGVkIGZpbGUgbmFtZSAKICBzdHJpbmcuCi0gRml4ZWQgdGhlIGZ1bmN0aW9uIGJvb3N0Ojp3YXZlOjp1dGlsOjppbXBsOjp1bmVzY2FwZV9saXQoKS4KLSBBZGRlZCB0aGUgV2F2ZSB1bml0IHRlc3QgZnJhbWV3b3JrLiBGb3Igbm93IGl0IGNvbnRhaW5zIGFib3V0IDYwIHVuaXQgdGVzdHMKICBleGVjdXRlZCBieSBhIHNwZWNpYWwgdGVzdCBkcml2ZXIgKHRlc3R3YXZlKS4KLSBBZGRlZCB0aGUgJyRGJyByZXBsYWNlbWVudCBzdHJpbmcgdG8gdGhlIHRlc3R3YXZlIGFwcGxpY2F0aW9uLiBUaGlzIGFsbG93cwogIHRvIGhhbmRsZSBmaWxlIHBhdGhzIHNlbnNpdGl2ZSBjb21wYXJpc29uIG9mIHRoZSBleHBlY3RlZCBhbmQgcmVhbCByZXN1bHRzLgotIEZpeGVkIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgd2hpdGVzcGFjZSBlYXRpbmcgY29tcG9uZW50LgotIEFkZGVkIG9wdGlvbmFsIHRyaWdyYXBoIGNvbnZlcnNpb24uCi0gQ2hhbmdlZCBhbGwgc2l6ZV90LCB0aW1lX3QgZXRjLiB0byBzdGQ6OnNpemVfdCwgc3RkOjp0aW1lX3QgZXRjIChmb3IgQ1cpLgotIElmIHRoZSBjb21tZW50cyBzaG91bGQgbm90IGJlIHByZXNlcnZlZCBldmVyeSBDIGNvbW1lbnQgY29udGFpbmluZyBhdCBtaW5pbXVtIAogIG9uZSBuZXdsaW5lIGlzIG5vdyBjb252ZXJ0ZWQgdG8gYSBuZXdsaW5lIHRva2VuLgotIEFkZGVkIHRoZSBsZXhlZF90b2tlbnMgc2FtcGxlLgotIEZpeGVkIHdhcm5pbmdzIGFuZCBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhlIENvZGVXYXJyaW9yIGNvbXBpbGVyLgotIEFkZGVkIHRoZSAnJFYnIHJlcGxhY2VtZW50IHN0cmluZyB0byB0aGUgdGVzdHdhdmUgYXBwbGljYXRpb24uIEl0IGV4cGFuZHMgdG8gCiAgdGhlIGN1cnJlbnQgQk9PU1RfTElCX1ZFUlNJT04uCi0gRGlhZ25vc2VkIHRoZSBhdHRlbXB0IHRvIHJlZGVmaW5lIHRoZSBhbHRlcm5hdGl2ZSBvcGVyYXRvcnMgYXMgYW5kLCBvciBldGMuCi0gSW1wcm92ZWQgZXJyb3IgaGFuZGxpbmcuCi0gRGlzYWJsZWQgdGhlIGZsZXhfc3RyaW5nIGNsYXNzIGZvciBWQzcsIGVuYWJsZWQgdG8gZmFsbGJhY2sgdG8gc3RkOjpzdHJpbmcgCiAgZm9yIHRoaXMgY29tcGlsZXIuCi0gUmVuYW1lZCBmaWxlcyB0byBjb21wbHkgd2l0aCB0aGUgQm9vc3QgcnVsZXMuCi0gQWRkZWQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIE1DUFAgdmFsaWRhdGlvbiBzdWl0ZSB0byB0aGUgV2F2ZSB1bml0IHRlc3RzLgotIEFkZGVkIGV2ZW4gbW9yZSBtaXNzaW5nICJ1c2luZyBuYW1lc3BhY2Ugc3RkOyIgc3RhdGVtZW50cyBmb3IgZnVuY3Rpb25zIGZyb20KICB0aGUgQyBydW50aW1lIGxpYnJhcnkuIFRoZSBXYXZlIHRlc3Qgc3VpdGUgbm93IGNvbnRhaW5zIG1vcmUgdGhhbiAxMDAgdW5pdAogIHRlc3RzLgotIEFkZGVkIHRoZSAkUC8kUChiYXNlbmFtZSkgcmVwbGFjZW1lbnQgc3RyaW5nIHRvIHRoZSB0ZXN0d2F2ZSBhcHBsaWNhdGlvbiAKICB3aGljaCBleHBhbmRzIHRvIHRoZSBmdWxsIHBhdGggb2YgdGhlIGN1cnJlbnQgZmlsZSAoJFApIG9yIHRvIHRoZSBjdXJyZW50IAogIGRpcmVjdG9yeS9iYXNlbmFtZSAoJFAoYmFzZW5hbWUpKS4KLSBGaXhlZCBhIGJ1bmNoIG9mIHBvcnRhYmlsaXR5IHByb2JsbWVzIHJldmVhbGVkIGJ5IHRoZSByZWdyZXNzaW9uIHRlc3RzIG9uCiAgZGlmZmVyZW50IHBsYXRmb3Jtcy4gVGhhbmtzIHRvIFN0ZWZhbiBTbGFwZWRhIGZvciBoaXMgc3VwcG9ydCB0byBtYWtlIGl0IHdvcmsKICBvbiB0aGUgY3ctOV80IHRvb2xzZXQgKHdpbjMyKS4KICAKVHVlIE1hciAyMiAxNDo1Mjo0NSBXRVNUIDIwMDUKVmVyc2lvbiAxLjEuMTUKLSBGaXhlZCBhIGJ1ZyB3aGVyZSB0aGUgY29tcGxldGUgc2V0IG9mIEM5OSBwcmVkZWZpbmVkIG1hY3JvcyB3ZXJlIHByZS1kZWZpbmVkCiAgd2hlbiBpbiBDKysgbW9kZSBhbmQgdmFyaWFkaWNzIHdlcmUgZW5hYmxlZC4KLSBXaGVuIGluIHZhcmlhZGljcyBvciBDOTkgbW9kZSB0aGUgX19CQVNFX0ZJTEVfXyBwcmVkZWZpbmVkIG1hY3JvIGV4cGFuZGVkIHRvCiAgPFVua25vd24+LgotIEFkZGVkIHRoZSAtLWxpc3RpbmNsdWRlcyBvcHRpb24gdG8gdGhlIFdhdmUgZHJpdmVyIGV4ZWN1dGFibGUgd2hpY2ggYWxsb3dzIHRvCiAgbG9nIHRoZSBmaWxlIG5hbWVzIG9mIHRoZSBpbmNsdWRlIGZpbGVzIG9wZW5lZC4KLSBGaXhlZCBhIGdjYyB3YXJuaW5nIGluIHRva2VuX2NhY2hlLmhwcCAodW51c2VkIHZhcmlhYmxlIGVuZCkuCi0gQ2hhbmdlZCB0aGUgbG9naWMgYmVoaW5kICNpbmNsdWRlX25leHQuIEl0IG5vdyBzdGFydHMgc2VhcmNoaW5nIHdpdGggdGhlIAogIG5leHQgZGlyZWN0b3J5IGFmdGVyIHRoZSBkaXJlY3RvcnkgdGhlIGN1cnJlbnQgZmlsZSAodGhlIGZpbGUgY29udGFpbmluZyB0aGUgCiAgI2luY2x1ZGVfbmV4dCBkaXJlY3RpdmUpIGlzIGxvY2F0ZWQgaW4uCi0gQ2hhbmdlZCB0aGUgc2lnbmF0dXJlIG9mIHRoZSB1bmRlZmluZWRfbWFjcm8gcHJlcHJvY2Vzc2luZyBob29rIHRvIHRha2UgdGhlIAogIHRva2VuIGl0c2VsZiBhbmQgbm90IHRoZSBtYWNybyBuYW1lIG9ubHkuIFRoaXMgaXMgaW1wb3J0YW50IHRvIHBhc3MgdGhlIGZ1bGwKICBjb250ZXh0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgI3VuZGVmIGRpcmVjdGl2ZSB0byB0aGUgCiAgdXNlciBwcm92aWRlZCBob29rICh0aGFua3MgdG8gU3RlZmFuIFNlZWZlbGQgZm9yIHBvaW50aW5nIHRoYXQgb3V0KS4KLSBGaXhlZCBzZXZlcmFsIGJyb2tlbiBsaW5rcyBpbiB0aGUgQ29udGV4dCBQb2xpY3kgdG9waWMuCi0gRml4ZWQgYSBidWcgaW4gdGhlIGhhbmRsaW5nIG9mIHRoZSAjaW5jbHVkZV9uZXh0IGRpcmVjdGl2ZSBpbnNpZGUgb2YgCiAgbm9uLWV2YWx1YXRlZCAjaWYgYmxvY2tzLgotIEZpeGVkIGEgYnVnIGluIHRoZSAjaW5jbHVkZV9uZXh0IGhhbmRsaW5nIGNvZGUgKHRoYW5rcyB0byBTdGVmYW4gU2VlZmVsZCkuCi0gQ2hhbmdlZCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBvcGVuZWRfaW5jbHVkZV9maWxlKCkgcHJlcHJvY2Vzc2luZyBob29rIHdoaWNoIAogIG5vdyByZWNlaXZlcyBub3Qgb25seSB0aGUgYWJzb2x1dGUgZmlsZSBuYW1lIG9mIHRoZSBvcGVuZW5kIGluY2x1ZGUgZmlsZSBidXQKICBhZGRpdGlvbmFsbHkgZ2V0cyBwYXNzZWQgdGhlIChwb3NzaWJseSkgcmVsYXRpdmUgcGF0aCBvZiB0aGUgb3BlbmVuZCBpbmNsdWRlCiAgZmlsZS4gVGhpcyBjb25jcmV0ZSBmb3JtYXQgb2YgdGhlIHJlbGF0aXZlIHBhdGggZGVwZW5kcyBvbiB0aGUgZm9ybWF0IG9mIHRoZQogIGluY2x1ZGUgc2VhcmNoIGRpcmVjdG9yeSBnaXZlbiB0byB0aGUgbGlicmFyeS4KLSBBZGRlZCBhIG5ldyBwcmVwcm9jZXNzaW5nIGhvb2sgJ2ZvdW5kX2luY2x1ZGVfZGlyZWN0aXZlKCknIHdoaWNoIGdldHMgY2FsbGVkCiAgZm9yIGV2ZXJ5ICNpbmNsdWRlIGRpcmVjdGl2ZSAoZXZlbiBmb3IgdGhvc2Ugd2hlcmUgdGhlIGZpbGUgdG8gaW5jbHVkZSAKICBkb2Vzbid0IGV4aXN0KSBhbmQgd2hpY2ggZ2V0cyBwYXNzZWQgdGhlIChleHBhbmRlZCkgdG9rZW4gc2VxdWVuY2UgZm91bmQgCiAgYWZ0ZXIgdGhlICNpbmNsdWRlIGRpcmVjdGl2ZSB0b2tlbi4KLSBUaGUgZmlsZSBuYW1lcyBwYXNzZWQgdG8gdGhlIHByZXByb2Nlc3NpbmcgaG9va3MgYXJlIG5vdyBub3JtYWxpc2VkLgotIENoYW5nZWQgdGhlIG9wZW5lZF9pbmNsdWRlX2ZpbGUoKSBwcmVwcm9jZXNzaW5nIGhvb2sgdG8gcmVjZWl2ZSB0aGUgY29ycmVjdAogIHJlbGF0aXZlIHBhdGggZXZlbiBpZiB0aGUgaW5jbHVkZWQgZmlsZSB3YXMgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotIEZpeGVkIGEgYnVnIHdoaWNoIHJlcG9ydGVkICdkZWZpbmVkKG9yKScgYXMgaW52YWxpZCAoc2ltaWxhcmx5IGFsbCB0aGUgb3RoZXIKICBhbHRlcm5hdGl2ZSBiaXQgb3BlcmF0aW9uIHRva2VuIHR5cGVzKS4KLSBGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgdG8gZGVmaW5lIHZhcmlhZGljIG1hY3JvcyBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gQWRkZWQgYSAncHJlc2VydmUgY29tbWVudHMnIG1vZGUgdG8gcHJlc2VydmUgdGhlIGNvbW1lbnRzIGluIHRoZSBpbnB1dCBzdHJlYW0KICBub3QgaW5zZXJ0ZWQgaW50byBtYWNybyBkZWZpbml0aW9ucy4KLSBBZGRlZCBhIG5ldyAtLXByZXNlcnZlICgtcCkgY29tbWFuZCBsaW5lIHN3aXRjaCB0byB0aGUgd2F2ZSBkcml2ZXIgCiAgYXBwbGljYXRpb24gdG8gYWxsb3cgY29tbWVudHMgdG8gYmUgcHJlc2VydmVkIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0IHN0cmVhbS4KICAKTW9uIEZlYiAyMSAwOTozMDowNCBXRVNUIDIwMDUKVmVyc2lvbiAxLjEuMTQgKEZpeGVzIGluIHJlc3BvbnNlIHRvIHRoZSBCb29zdCByZXZpZXcpCgpXYXZlIHdhcyBhY2NlcHRlZCBpbnRvIEJvb3N0ISAKCldpdGggc3BlY2lhbCB0aGFua3MgdG8gVG9tIEJyaW5rbWFuLCB3aG8gdm9sdW50ZWVyZWQgdG8gYmUgdGhlIHJldmlldyBtYW5hZ2VyLgoKV2l0aCB0aGFua3MgdG8gRGF2aWQgQWJyYWhhbXMsIEJlbWFuIERld2VzLCBSZWVjZSBEdW5uLCBMYXJyeSBFdmFucywgCkRvdWcgR3JlZ29yLCBKb2VsIGRlIEd1em1hbiwgQmFwdGlzdGUgTGVwaWxsZXVyLCBBbmR5IExpdHRsZSwgUGF1bCBNZW5zb25pZGVzLCAKRGFuIE51ZmZlciwgQW5kcmVhcyBQb2tvcm55LCBWbGFkaW1pciBQcnVzLCBHZW5uYWRpeSBSb3plbnRhbCwgTWljaGllbCBTYWx0ZXJzLCAKSm9uYXRoYW4gVHVya2FuaXMsIENocmlzIFV6ZGF2aW5pcywgUGF2ZWwgVm96ZW5pbGVrLCBNaWNoYWVsIFdhbHRlciBmb3IgYnVnIApyZXBvcnRzLCBmaXhlcyBhbmQgaGludHMuCgotIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBNUyBleHRlbnNpb25zICNyZWdpb24gYW5kICNlbmRyZWdpb24sIHdoaWNoIHNpbXBseSBnZXQKICBpZ25vcmVkIGJ5IFdhdmUuIFRoZSBzdXBwb3J0IGZvciB0aGVzZSBpcyBlbmFibGVkIG9ubHksIHdoZW4gdGhlIHBwIGNvbnN0YW50CiAgQk9PU1RfV0FWRV9TVVBQT1JUX01TX0VYVEVOU0lPTlMgaXMgZGVmaW5lZC4gT3RoZXJ3aXNlIHRoZXNlIGdldCBmbGFnZ2VkIGFzIAogIGFuIGlsbGVnYWwgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSAoYXMgYmVmb3JlKS4KLSBGaXhlZCBhIHByb2JsZW0sIHdoZXJlIHRoZSByZXBsYWNlbWVudCB0ZXh0IGZvciBhICNwcmFnbWEgZGlyZWN0aXZlIGdvdCBsb3N0CiAgaWYgdGhpcyBkaXJlY3RpdmUgd2FzIG9uIHRoZSBsYXN0IGxpbmUgb2YgYSBwcm9jZXNzZWQgKGluY2x1ZGUtKWZpbGUuCi0gQ2hhbmdlZCB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgQk9PU1RfV0FWRV9TVVBQT1JUX01TX0VYVEVOU0lPTlMgZm9yIG5vbi0KICBXaW5kb3dzIHN5c3RlbXMgdG8gemVyby4KLSBVcGRhdGVkIG91dGRhdGVkIGV4dGVybmFsIGxpbmtzIGluIHRoZSBkb2N1bWVudGF0aW9uLgotIEZpeGVkIGNlcnRhaW4gZ3JhbW1hdGljYWwgYW5kIHN0eWxpc3RpYyBxdWlya3MgaW4gdGhlIGRvY3VtZW50YXRpb24uCi0gRml4ZWQgYSBwcm9ibGVtIGluIGxpYnMvd2F2ZS9idWlsZC9KYW1maWxlLnYyIChhcyByZXBvcnRlZCBieSBMYXJyeSBFdmFucykuCiAgRml4ZWQgdGhlIEphbWZpbGUudjIgaW4gdGhlIHNhbXBsZXMgZGlyZWN0b3JpZXMgYWNjb3JkaW5nbHkuCi0gQWRkZWQgdGhlICc8dG9vbHNldD52Yy03XzE6PHJ0dGk+b2ZmJyB0byBhbGwgSmFtZmlsZS52MiBmaWxlcyB0byBhZGp1c3QgZm9yIAogIHRoZSBpbnRlcm5hbCBidWZmZXIgb3ZlcmZsb3cgYnVnIGluIHRoZSBWQzcuMSBjb21waWxlciAocmVwb3J0ZWQgYnkgSm9lbCBkZSAKICBHdXptYW4pLgotIENoYW5nZWQgdGhlICc8dG9vbHNldD52Yy03XzE6PHJ0dGk+b2ZmJyB0byAnPHRvb2xzZXQ+dmMtNy4xOjxydHRpPm9mZicgYXMKICByZXF1aXJlZCBieSB0aGUgQm9vc3QuQnVpbGQudjIgbGlicmFyeSAoc3VnZ2VzdGVkIGJ5IFZsYWRpbWlyIFBydXMpLgotIEZpbmFsbHkgZml4ZWQgdGhlIEphbWZpbGUudjIgZmlsZSAoYWZ0ZXIgYSBzdWdnZXN0aW9uIGZyb20gUmVlY2UgRHVubikKLSBGaXhlZCB0aGUgY29sdW1uIG51bWJlciByZXBvcnRlZCBmb3IgdG9rZW5zIGZvciBTbGV4IGxleGVyIGJhc2VkIAogIGNvbmZpZ3VyYXRpb25zIChyZXBvcnRlZCBieSBCYXB0aXN0ZSBMZXBpbGxldXIpLgotIEFkZGVkIHRoZSBfX0JBU0VfRklMRV9fIHByZWRlZmluZWQgbWFjcm8sIHdoaWNoIGNvbnRhaW5zIGEgc3RyaW5nIGxpdGVyYWwgCiAgb2YgdGhlIG1haW4gZmlsZSBuYW1lIHRvIHByZXByb2Nlc3MgKHRoZSBvbmUgdGhlIGNvbnRleHQ8PiB0ZW1wbGF0ZSB3YXMKICBjcmVhdGVkIHdpdGgpLiAoc3VnZ2VzdGVkIGJ5IFBhdmVsIFZvemVuaWxlaykKLSBVc2VkIHRoZSBib29zdDo6cmV2ZXJzZV9pdGVyYXRvciBpbnN0ZWFkIG9mIHRoZSBzdGQ6OnJldmVyc2VfaXRlcmF0b3IKICBmb3IgdGhlIGZsZXhfc3RyaW5nIGNsYXNzIHRvIGFsbG93IGNvbXBpbGF0aW9uIG9mIFdhdmUgd2l0aCBWQzcuMAogIChhcyBzdWdnZXN0ZWQgYnkgUmVlY2UgRHVubikuCi0gRml4ZWQgYSBwcm9ibGVtIGluIHRoZSBpbmNsdWRlX3BhdGggdGVtcGxhdGUsIHdoaWNoIHRocm93ZWQgYSAKICBib29zdDo6ZmlsZXN5c3RlbSBleGNlcHRpb24gd2hlbmV2ZXIgYSBjaGFyYWN0ZXIgd2FzIHVzZWQgaW4gYSBmaWxlIG5hbWUKICB0byBpbmNsdWRlLCB3aGljaCBpcyBtYXJrZWQgYXMgaWxsZWdhbCBieSB0aGUgZGVmYXVsdCBuYW1lIGNoZWNrZXIgb2YgdGhlCiAgYm9vc3Q6OmZpbGVzeXN0ZW06OnBhdGguCiAgClZlcnNpb24gMS4xLjEzIChCb29zdCByZXZpZXcgY2FuZGlkYXRlIDIsIGJ1ZyBmaXhlZCB2ZXJzaW9uKQotIEZpeGVkIGEgcHJvYmxlbSwgd2hlcmUgdGhlIGNvbnRleHQ8PiB0ZW1wbGF0ZSByZWZlcmVuY2VkIHRlbXBvcmFyeSBpdGVyYXRvcgogIG9iamVjdHMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0gKHRoYW5rcyB0byBNaWNoaWVsIFNhbHRlcnMgZm9yIHJlcG9ydGluZwogIHRoaXMpLgotIEZpeGVkIGEgYnVnIGluIHRoZSByZTJjIGxleGVyLCB3aGljaCBhbGxvd2VkIHRvIGRlcmVmZXJlbmNlIHRoZSBlbmQgaXRlcmF0b3IgCiAgb2YgdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtICh0aGFua3MgdG8gRG91ZyBHcmVnb3IgZm9yIHBvaW50aW5nIHRoaXMgb3V0KS4KLSBGaXhlZCBzZXZlcmFsIGFzc2VydGlvbnMgZmlyZWQgYnkgdGhlIGl0ZXJhdG9yIGNoZWNraW5nIGNvZGUgb2YgdGhlIFZDOCBzdGwuCgpWZXJzaW9uIDEuMS4xMiAoQm9vc3QgcmV2aWV3IGNhbmRpZGF0ZSkKLSBBIHJvdWdoIHBlcmZvcm1hbmNlIGFuYWx5c2lzIHNob3dlZCwgdGhhdCAzMCUgb2YgdGhlIHRpbWUgaXMgc3BlbnQgcGFyc2luZyAKICB0aGUgaW5wdXQgZm9yIHBwIGRpcmVjdGl2ZXMgKGNwcF9ncmFtbWFyKSwgMzUlIG9mIHRoZSB0aW1lIGlzIHNwZW50IGluc2lkZQogIHRoZSBmbGV4X3N0cmluZyBjb2RlLCBtYWlubHkgaW4gdGhlIGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgCiAgb3BlcmF0b3IsIDE1JSBvZiB0aGUgdGltZSBpcyBzcGVudCBpbnNpZGUgdGhlIGxpc3QgYW5kIHZlY3RvciBtZW1iZXIgCiAgZnVuY3Rpb25zLCAxMCUgaXMgc3BlbnQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGJ1dCBvbmx5IDElIG9mIHRoZSB0aW1lIGlzIAogIHNwZW50IGluIHRoZSByZTJjIGxleGVyLgotIElkZW50aWZpZWQgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLCB3aGVyZSB0aGUgdG9rZW5fY2FjaGUgd2FzIGluc3RhbnRpYXRlZAogIGZvciBldmVyeSBjcmVhdGVkIGxleGVyIG9iamVjdCwgYnV0IG5lZWRlZCB0byBiZSBpbml0aWFsaXNlZCBvbmx5IG9uY2UuCi0gQWRkZWQgI2luY2x1ZGUgPHdhdmVfdmVyc2lvbi5ocHA+IHRvIHdhdmVfY29uZmlnLmhwcAotIEZpeGVkIHByb2JsZW1zIHJlcG9ydGVkIGJ5IHRoZSBnY2MgMy40LjEgY29tcGlsZXIuCi0gQWRqdXN0ZWQgSmFtZmlsZXMgZm9yIHRoZSBuZXcgdG9vbHNldCBuYW1lcyBpbnRyb2R1Y2VkIGluIEJvb3N0IFYxLjMyLgoKVmVyc2lvbiAxLjEuMTEKLSBVcGRhdGVkIGNvcHlyaWdodHMuCi0gRml4ZWQgc29tZSBidWdzIGludHJvZHVjZWQgYnkgdGhlIGxhdGVzdCByZWZhY3RvcmluZy4KLSBUcmllZCB0byBmaXggdGhlIGV4cGFuc2lvbiBvZiBtYWNyb3MsIHdoaWNoIHJlcGxhY2VtZW50LWxpc3QgdGVybWluYXRlcyBpbiBhIAogIHBhcnRpYWwgbWFjcm8gZXhwYW5zaW9uLiBObyBzdWNjZXNzIHNvIGZhci4KClZlcnNpb24gMS4xLjEwCi0gUmVmYWN0b3JlZCBzb21lIG9mIHRoZSBtYWNybyBtYXAgKG1hY3JvIG5hbWVzcGFjZSkgY29kZSAoYWRkZWQgY29tbWVudHMsIAogIHNwbGl0dGVkIGludG8gc2VwYXJhdGUgZmlsZXMpLAotIEZpeGVkIHNvbWUgdHlwZW5hbWUgZXJyb3JzIGluIGNwcF9tYWNyb21hcC5ocHAgKHRoYW5rcyB0byBWbGFkaW1pciBQcnVzKS4KLSBGaXhlZCB0aGUgQm9vc3RCdWlsZCBWMiBKYW1maWxlcyAodGhhbmtzIHRvIFZsYWRpbWlyIFBydXMpLgoKVmVyc2lvbiAxLjEuOQotIE1vdmVkIGFsbCBvZiB0aGUgI3ByYWdtYSB3YXZlIG9wdGlvbih2YWx1ZSkgb3BlcmF0b3JzIG91dCBvZiB0aGUgd2F2ZWxpYiBpbnRvIAogIHRoZSB3YXZlIGRyaXZlciBwcm9ncmFtLiBSZW1vdmVkIGVuYWJsZV90cmFjZSgpIGFuZCB0cmFjZV9mbGFncygpIHBvbGljeQogIGZ1bmN0aW9ucy4gUmVuYW1lZCB0cmFjZV9wb2xpY3kgaW50byBjb250ZXh0X3BvbGljeS4KLSBBZGRlZCB0aGUgZGVmaW5lZF9tYWNybygpIGFuZCB1bmRlZmluZWRfbWFjcm8oKSBwcmVwcm9jZXNzaW5nIGhvb2tzIHRvIGFsbG93CiAgZWFzaWx5IHRvIGJ1aWxkIG1hY3JvIGNyb3NzIHJlZmVyZW5jZXJzIGFuZCBzdWNoLgoKVmVyc2lvbiAxLjEuOAotIFJlcGxhY2VkIHRoZSB1c2FnZSBvZiB0aGUgc3RyaW5nOjplcmFzZSgpIGFuZCBzdHJpbmc6Omluc2VydCgpIGZ1bmN0aW9ucywgCiAgd2hpY2ggd2VyZSB0aGUgb25seSBub24tY29uc3Qgc3RyaW5nIG1lbWJlciBmdW5jdGlvbnMgdXNlZC4KLSBUb2tlbiBwYXN0aW5nIGlzIG5vdyB3ZWxsIGRlZmluZWQgaW4gdmFyaWFkaWNzIG1vZGUgKHdhcyBpbiBDKysweCBtb2RlIG9ubHkpLgotIENoYW5nZWQgdGhlIHRpbWluZyBjb2RlIGluIHRoZSB3YXZlIGRyaXZlciB0byBpbmNsdWRlIHRoZSBwYXJzaW5nIG9mIAogIGZpbGVzIGluY2x1ZGVkIGJ5IHRoZSAtLWZvcmNlaW5jbHVkZSBjb21tYW5kIGxpbmUgc3dpdGNoLgotIFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cyAodmVyeSBpbmZvcm1hbCkgW3NlY10sIHRoZSBmaWxlcyBhcmUgc29tZSBvZiB0aGUKICBwcmVwcm9jZXNzb3Igc3BlY2lmaWMgdGVzdCBjYXNlcyBmcm9tIFBhdWwgTWVuc29uaWRlcyBjaGFvc19wcCBsaWJyYXJ5LgoKICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgICBmbGV4X3N0cmluZyAgIGNvbnN0X3N0cmluZyAgIGNvbnN0X3N0cmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiBCeXRlICAgICAgICAyOCBCeXRlCiAgICBhcml0aG1ldGljLmNwcCAgICAgICAgMi41NDMgICAgICAgICAgMS43NDIgICAgICAgICAwLjk1MSAgICAgICAgICAgMS4wMDEKICAgIGFycmF5LmNwcCAgICAgICAgICAgICAyLjQ1MyAgICAgICAgICAxLjc2MiAgICAgICAgIDAuOTUxICAgICAgICAgICAxLjAxMQogICAgY29tcGFyaXNvbi5jcHAgICAgICAgIDAuNTYwICAgICAgICAgIDAuMzQwICAgICAgICAgMC4yNzAgICAgICAgICAgIDAuMjgwCiAgICBjb250cm9sLmNwcCAgICAgICAgICAgMC41OTAgICAgICAgICAgMC4zNDAgICAgICAgICAwLjI5MCAgICAgICAgICAgMC4zMDAKICAgIGRlYnVnLmNwcCAgICAgICAgICAgICAwLjM3MCAgICAgICAgICAwLjMxMCAgICAgICAgIDAuMTkwICAgICAgICAgICAwLjE5MAogICAgZGV0ZWN0aW9uLmNwcCAgICAgICAgIDAuMDUwICAgICAgICAgIDAuMDYwICAgICAgICAgMC4wMzAgICAgICAgICAgIDAuMDMwCiAgICBleHRlbmRlZC5jcHAgICAgICAgICAgMC4zNzAgICAgICAgICAgMC4yNjAgICAgICAgICAwLjE5MCAgICAgICAgICAgMC4xOTAKICAgIGZhY2lsaXRpZXMuY3BwICAgICAgICAwLjYxMCAgICAgICAgICAwLjM0MCAgICAgICAgIDAuMjkwICAgICAgICAgICAwLjMwMAogICAgaXRlcmF0aW9uLmNwcCAgICAgICAgIDEuMDgxICAgICAgICAgIDAuNTUwICAgICAgICAgMC40MTAgICAgICAgICAgIDAuNDUwCiAgICBsaXN0LmNwcCAgICAgICAgICAgICAgMS43NDIgICAgICAgICAgMS4xNDEgICAgICAgICAwLjgxMSAgICAgICAgICAgMC44NTEKICAgIGxvZ2ljYWwuY3BwICAgICAgICAgICAwLjA3MCAgICAgICAgICAwLjIwMCAgICAgICAgIDAuMDQwICAgICAgICAgICAwLjA0MAogICAgcHVuY3R1YXRpb24uY3BwICAgICAgIDAuMDMwICAgICAgICAgIDAuMDgwICAgICAgICAgMC4wMjAgICAgICAgICAgIDAuMDIwCiAgICByZXBldGl0aW9uLmNwcCAgICAgICAgMS4zOTIgICAgICAgICAgMC44NTEgICAgICAgICAwLjY1MCAgICAgICAgICAgMC42OTAKICAgIHNlbGVjdGlvbi5jcHAgICAgICAgICAwLjQ0MCAgICAgICAgICAwLjI3MCAgICAgICAgIDAuMjEwICAgICAgICAgICAwLjIyMAogICAgc2xvdC5jcHAgICAgICAgICAgICAgIDAuNjgwICAgICAgICAgIDAuMzUwICAgICAgICAgMC4yNDAgICAgICAgICAgIDAuMjcwCiAgICB0dXBsZS5jcHAgICAgICAgICAgICAgMC40MjAgICAgICAgICAgMC4yNDAgICAgICAgICAwLjE5MCAgICAgICAgICAgMC4yMTAKICAgICAgICAgICAgICAgICAgICAgIAoKV2VkIEF1ZyAyNSAxMzoyMzoyNyBXRURUIDIwMDQKVmVyc2lvbiAxLjEuNwotIEJyYW5jaGVkIGZvciBCb29zdCBSZWxlYXNlLgotIFJlbW92ZWQgc2V2ZXJhbCBmZWF0dXJlcyBmcm9tIHRoZSBjb2RlIGJhc2U6CiAgLiByZW1vdmVkIEMrKzB4IHN1cHBvcnQKICAuIHJlbW92ZWQgVFNUIHN1cHBvcnQKLSBGaXhlZCB0aGUgcHJvZ3JhbV9vcHRpb24gdmFsaWRhdG9yIHN5bnRheCwgd2hpY2ggaGFzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgCiAgdXBkYXRlLgotIFJlbW92ZWQgbWlzbGVhZGluZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZnJvbSB0aGUgY3BwX2NvbmZpZy5ocHAgZmlsZSwgCiAgYmVjYXVzZSB0aGUgYXBwbGljYXRpb24gd2lsbCBoYXZlIHRvIHVzZSB0aGUgc2FtZSBjb25maWcgb3B0aW9ucyBhcyB3ZXJlIHVzZWQKICBkdXJpbmcgdGhlIGNvbXBpbGF0aW9uIG9mIHRoZSBsaWJyYXJ5LgotIENoYW5nZWQgdGhlIG5hbWluZyBjb252ZW50aW9uIG9mIHR5cGVkZWYnZCB0eXBlcyBpbiB0aGUgbGlicmFyeS4gUmVtb3ZlZCB0aGUgCiAgX3Qgc3VmZml4LCB3aGVyZXZlciBwb3NzaWJsZS4KLSBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgdGhlIHJlbW92YWwgb2YgdGhlIEMrKzB4IGZlYXR1cmVzLgoKLSBDaGFuZ2VkIHRoZSBsaWNlbnNpbmcgc2NoZW1lIHRvOgovLyBDb3B5cmlnaHQgMjAwNCBKb2UgQ29kZXIuIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdAovLyBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcgZmlsZQovLyBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCgpNb24gTWF5IDI0IDEwOjAyOjQ3IFdFRFQgMjAwNApWZXJzaW9uIDEuMS42Ci0gRml4ZWQgYSBpbmNvbXBhdGliaWxpdHkgd2l0aCB0aGUgbmV3IHByb2dyYW1fb3B0aW9ucyB2ZXJzaW9uLgoKVmVyc2lvbiAxLjEuNQpWZXJzaW9uIDEuMC42Ci0gRml4ZWQgYSBidWcsIHdoaWNoIHJlcG9ydGVkIGFuICNpbmNsdWRlIHN0YXRlbWVudCBhcyBpbGwgZm9ybWVkLCBpZiBpdCB3YXMgCiAgZm9sbG93ZWQgYnkgYW4gZW1wdHkgQyBjb21tZW50IG9ubHkuIFRoaXMgd2FzIGFuIGVycm9yIGluIHRoZSBjcHAucmUgcmVndWxhciAKICBleHByZXNzaW9uIGZvciBDIGNvbW1lbnRzLiBBZGRpdGlvbmFsbHksIHNpbmNlIHRoaXMgY2hhbmdlIHNpbXBsaWZpZWQgdGhlIAogIFJlMkMgZ2VuZXJhdGVkIGxleGVyIGEgbG90IGl0IHdhcyBwb3NzaWJsZSB0byByZW1vdmUgdGhlIGNvbXBpbGVyIHdvcmthcm91bmQgCiAgZm9yIHRoZSBWQzcuMSBjb21waWxlciB3aGljaCBwcmV2ZW50ZWQgdGhlIG9wdGltaXphdGlvbiBvZiB0aGlzIGxleGVyLgogIApNb24gTWFyIDI5IDA5OjM2OjU5IFdFRFQgMjAwNAotIENvcnJlY3RlZCB0aGUgc2lnbmF0dXJlIG9mIHRoZSBtYWluKCkgZnVuY3Rpb25zICh3YXMgbWFpbihpbnQsIGNoYXIgY29uc3QqW10pKS4KClN1biBNYXIgMjggMTI6NTU6NTkgV0VEVCAyMDA0ClZlcnNpb24gMS4xLjQKLSBGaXhlZCBhIHByb2JsZW0sIHdoZXJlIHRoZSBmaXJzdCByZXR1cm5lZCB0b2tlbiB3YXMgbG9zdCwgd2hlbmV2ZXIgYSAKICAtLWZvcmNlaW5jbHVkZSBmaWxlIHdhcyBnaXZlbi4KLSBBZGp1c3RlZCB0aGUgV2F2ZSBkcml2ZXIgYW5kIHRoZSBvdGhlciBzYW1wbGVzIHRvIHVzZSB0aGUgbmV3IHByb2dyYW1fb3B0aW9ucyAKICBsaWJyYXJ5IHN5bnRheCAoVjEuMS54IG9ubHkpLgogIApNb24gTWFyICAxIDE5OjE0OjIxIFdFU1QgMjAwNApWZXJzaW9uIDEuMS4yClZlcnNpb24gMS4wLjQKLSBGaXhlZCBhIHByb2JsZW0sIHdoaWNoIGRvZXMgbm90IHJlcG9ydCBhbiBlcnJvciwgaWYgaW4gYSAjZGVmaW5lIHN0YXRlbWVudCBpbiAKICBiZXR3ZWVuIGEgbWFjcm8gbmFtZSBhbmQgaXRzIHJlcGxhY2VtZW50IGxpc3Qgd2VyZSBubyB3aGl0ZXNwYWNlIGdpdmVuLgotIEZpeGVkIGEgYnVnLCB3aGljaCBnZW5lcmF0ZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gb2YgdGhlICQgY2hhcmFjdGVyIGluIHRoZSAKICBpbnB1dC4KLSBNYWNybyBkZWZpbml0aW9ucywgd2hpY2ggZGlmZmVyIGJ5IHdoaXRlc3BhY2Ugb25seSAob25lIGRlZmluaXRpb24gY29udGFpbnMgCiAgd2hpdGVzcGFjZSBhdCBhIGNlcnRhaW4gcG9zaXRpb24sIHRoZSBvdGhlciBkZWZpbml0aW9uIGRvZXMgbm90KSBhcmUgY29ycmVjdGx5IAogIHJlcG9ydGVkIGFzIGEgd2FybmluZyBub3cuCi0gRml4ZWQgYSBwcm9ibGVtLCB3aGVyZSBkaWZmZXJlbnQgZm9ybWFsIGFyZ3VtZW50IG5hbWVzIGR1cmluZyBtYWNybyAKICByZWRlZmluaXRpb24gd2VyZSBub3QgZmxhZ2dlZCBhcyBhIHdhcm5pbmcuCi0gQSB3aWRlIGNoYXJhY3RlciBzdHJpbmcgdXNlZCBpbiBhICNsaW5lIGRpcmVjdGl2ZSB3YXNuJ3QgZmxhZ2dlZCBhcyBhbiBlcnJvci4gCiAgClN1biBGZWIgMjkgMTk6MTA6MTQgV0VTVCAyMDA0ClVzZWQgdGhlIHRlc3Qgc3VpdGUgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgbWNwcCBWMi40IHByZXByb2Nlc3NvciB0byBmaXggYSBidW5jaApvZiBtb3N0bHkgbWlub3IgaXNzdWVzOgotIEZpeGVkIHRyaWdyYXBoIGJhY2tzbGFzaCBmb2xsb3dlZCBieSBhIG5ld2xpbmUgaGFuZGxpbmcgKD8/LyBcbikgaW4gdGhlIAogIHJlMmMgKEMvQysrIGFuZCBJREwpIHNjYW5uZXJzLgotIEZpeGVkIGEgZGlncmFwaC90cmlncmFwaCB0b2tlbiB0eXBlIGhhbmRsaW5nIHByb2JsZW0gZHVyaW5nIG1hY3JvIGV4cGFuc2lvbi4KLSBGaXhlZCBhIGRpZ3JhcGgvdHJpZ3JhcGggdG9rZW4gdHlwZSBwcm9ibGVtIGR1cmluZyBoYW5kbGluZyBvZiB0aGUgbnVsbCAKICBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlLgotIEZpeGVkIHNldmVyYWwgc2lnbmVkL3Vuc2lnbmVkIGNvbnZlcnNpb24gYnVncyBpbiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0b3IuCi0gRml4ZWQgdGhlIHx8IGFuZCAmJiBvcGVyYXRvcnMgaW4gdGhlIGV4cHJlc3Npb24gZXZhbHVhdG9yIHRvIHN0b3AgZXZhbHVhdGlvbiwKICBhcyBvbmx5IHRoZSBvdXRjb21lIG9mIHRoZSBvdmVyYWxsIGV4cHJlc3Npb24gaXMgZGV0ZXJtaW5lZC4KLSBGaXhlZCB0aGUgZXhwcmVzc2lvbiBldmFsdWF0aW9uIGVuZ2luZSB0byBkZXRlY3QgZGl2aWRlIGJ5IHplcm8gZXJyb3JzLgotIEZpeGVkIGEgYnVnIHdpdGggb3BlcmF0b3IgfHwgYW5kICYmIGFyaXRobWV0aWMgKHRoZSBkZWR1Y2VkIHR5cGUgd2FzIHdyb25nKS4KLSBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSB1bmFyeSBvcGVyYXRvcnMgISBhbmQgLSB3aGljaCBJTiBjb25qdW5jdGlvbiB3aXRoIGFuIAogIGFyaXRobWV0aWMgb3BlcmF0aW9uIHlpZWxkZWQgQSB3cm9uZyByZXN1bHQgdHlwZS4KLSBGaXhlZCBhIGJ1Zywgd2hpY2ggcmVwb3J0ZWQgYSBtYWNybyBkZWZpbml0aW9uIGFzIGFuIGludmFsaWQgcmVkZWZpbml0aW9uLCBpZgogIGl0IHdhcyBkaWZmZXJlbnQgZnJvbSB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbiBvbmx5IGJ5IGRpZmZlcmVudCB3aGl0ZXNwYWNlcy4KLSBGaXhlZCBhIGJ1Zywgd2hpY2ggcmVwb3J0ZWQgdGhlIHJlZGVmaW5pdGlvbiBvZiBvbmUgb2YgdGhlIGFsdGVybmF0aXZlIHRva2VucwogIGFzICdhbmQnLCAnYml0X2FuZCcgZXRjLiBhcyBpbnZhbGlkLgotIEZpeGVkIGEgYnVnIGluIHRoZSBjaGFyYWN0ZXIgbGl0ZXJhbCBwYXJzZXIsIHdoaWNoIHByZXZlbnRlZCB0aGUgcmVjb2duaXRpb24KICBvZiBtdWx0aWJ5dGUgY2hhcmFjdGVyIGxpdGVyYWxzLgoKLSBNb3ZlZCB0aGUgY3BwX3Rva2VuX2lkcy5ocHAgaGVhZGVyIGludG8gdGhlIG1haW4gd2F2ZS5ocHAgaGVhZGVyLCBiZWNhdXNlIHRoZQogIHZhbHVlcyBkZWZpbmVkIHRoZXJlaW4gYXJlbid0IGNoYW5nZWFibGUgYnkgdGhlIHVzZXIgYW55d2F5LgotIEZpeGVkIHNvbWUgc3BlbGxpbmcgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uICh0aGFua3MgdG8gUm9iIFN0ZXdhcnQpLgoKVHVlIEZlYiAgMyAyMDoyMDoxNiBXRVNUIDIwMDQKLSBGaXhlZCB0aGUgcHJvYmxlbSwgdGhhdCBtYWNybyBkZWZpbml0aW9ucyBpbiBhIGNvbmZpZyBmaWxlIHdlcmUgZmxhZ2dlZCBhcyAKICBhbiBlcnJvciwgaWYgdGhlcmUgd2FzIGFueSB3aGl0ZXNwYWNlIGluIGJldHdlZW4gdGhlIC1EIGFuZCB0aGUgbWFjcm8gbmFtZQogIChzYW1lIHByb2JsZW0gZXhpc3RlZCBmb3IgLVApLgogIApGcmkgSmFuIDMwIDIwOjI4OjI3IFdFU1QgMjAwNAotIEZpeGVkIGEgbWlzc2luZyBib29zdGlmaWNhdGlvbiBpbiB0aGUgdHJhY2Ugc3VwcG9ydCBoZWFkZXIuCi0gQWRkZWQgYSBtaXNzaW5nIHN0ZDo6IG5hbWVzcGFjZSBxdWFsaWZpY2F0aW9uIHRvIHRoZSBsaXN0X2luY2x1ZGVzLmNwcCBzYW1wbGUgCiAgZmlsZS4KLSBGaXhlZCBsaW5lIGVuZGluZyBwcm9ibGVtcyB3aXRoIHRoZSBjcHAucmUgYW5kIGlkbC5yZSBmaWxlcy4KLSBBZGRlZCBxdWlja19zdGFydCBzYW1wbGUuCgpTdW4gSmFuIDI1IDIwOjI2OjQ1IFdFU1QgMjAwNApUaGlzIHZlcnNpb24gd2FzIHN1Ym1pdHRlZCB0byBCb29zdCBhcyB0aGUgcmV2aWV3IGNhbmRpZGF0ZSAoVjEuMS4wKQotIEZpeGVkIGludmFsaWQgZXhwbGljaXQgaW5zdGFudGlhdGlvbiBzeW50YXggYXMgcmVwb3J0ZWQgYnkgdGhlIENvbWVhdSAKICBjb21waWxlci4KLSBBZGRlZCBhIG1pc3NpbmcgaGVhZGVyIHRvIGZsZXhfc3RyaW5nLmhwcC4KClNhdCBKYW4gMjQgMTk6NDc6NDQgV0VTVCAyMDA0Ci0gQ29tcGxldGVseSBkZWNvdXBsZWQgdGhlIHVzZWQgbGV4ZXIgZnJvbSB0aGUgcHJlcHJvY2Vzc29yLgotIFVuZm9ydHVuYXRlbHkgaGFkIHRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgaW50ZXJmYWNlIG9mIHRoZSBjb250ZXh0IGNsYXNzLiBJdCAKICBub3cgaW5zdGVhZCBvZiB0aGUgdG9rZW4gdHlwZSB0YWtlcyB0aGUgdHlwZSBvZiB0aGUgbGV4ZXIgdG8gdXNlLgotIFJlaW50cm9kdWNlZCB0aGUgY3BwX3Rva2VucywgbGlzdF9pbmNsdWRlcyBhbmQgd2F2ZWlkbCBzYW1wbGVzLiAKICAuIGNwcF90b2tlbnMgaXMgYmFzZWQgb24gdGhlIFNMZXggbGV4ZXIKICAuIGxpc3RfaW5jbHVkZXMgc2hvd3MgdGhlIHVzYWdlIG9mIHRoZSBpbmNsdWRlIGZpbGUgdHJhY2luZyBjYXBhYmlsaXR5CiAgLiB3YXZlaWRsIHVzZXMgdGhlIFJlMkMgYmFzZWQgSURMIGxleGVyIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIGRlZmF1bHQgdG9rZW4KICAgIHR5cGUKICAKVHVlIEphbiAxMyAyMDo0MzowNCBXRVNUIDIwMDQKLSBGaXhlZCBzZXZlcmFsIGNvbXBpbGF0aW9uIGlzc3VlcyB1bmRlciBsaW51eCAoZ2NjIDMuMi4zLCBnY2MgMy4zLCBnY2MgMy4zLjIsIAogIGdjYyAzLjQsIEludGVsIFY3LjEpCi0gRml4ZWQgYSBjb21wYXRpYmlsaXR5IHByb2JsZW0gd2l0aCBTcGlyaXQgdmVyc2lvbnMgb2xkZXIgdGhhbiBWMS43LgoKTW9uIEphbiAxMiAyMDozOTo1MCBXRVNUIDIwMDQKLSBCb29zdGlmaWVkIHRoZSBjb2RlIGJhc2U6CiAgLiBNb3ZlZCBjb2RlIGludG8gbmFtZXNwYWNlIGJvb3N0LgogIC4gUHJlZml4ZWQgYWxsIHBwIGNvbnN0YW50cyB3aXRoICJCT09TVF8iLgogIC4gUmVmYWN0dXJlZCB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZS4KLSBSZW1vdmVkIElETCBtb2RlIGFuZCBTTGV4IGxleGVyIGZyb20gdGhlIGNvZGUgYmFzZS4gVGhlc2Ugd2lsbCBiZSByZS1hZGRlZCBhcyAKICBzYW1wbGVzLgotIENoYW5nZWQgdGhlIFdhdmUgY29uZmlndXJhdGlvbiBzeXN0ZW0gdG8gYmUgbW9yZSBmbGV4aWJsZSAoYWxsIAogICAgICNpZiBkZWZpbmVkKEJPT1NUX1dBVkVfLi4uKSBjaGFuZ2VkIHRvICNpZiBCT09TVF9XQVZFXy4uLiAhPSAwKSwKICB3aGljaCBhbGxvd3MgdG8gY29uZmlndXJlIHRoZSBsaWJyYXJ5IHdpdGhvdXQgY2hhbmdpbmcgdGhlIGNvZGUgYmFzZSBpdHNlbGYKICAKU2F0IEphbiAxMCAxODoxNzo1MCBXRVNUIDIwMDQKLSBJbmNvcnBvcmF0ZWQgQW5kcmVpIEFsZXhhbmRyZXNjdSdzIGxhdGVzdCBjaGFuZ2VzIHRvIHRoZSBmbGV4X3N0cmluZyBjbGFzcywgCiAgd2hpY2ggcmVzdWx0ZWQgaW4gYW4gb3ZlcmFsbCBzcGVkZCBnYWluIG9mIGFib3V0IDUtMTAlLgogIApXZWQgSmFuICA3IDE3OjQ2OjQ1IFdFU1QgMjAwNAotIEZvdW5kIGEgbWFqb3IgcGVyZm9ybWFuY2UgaG9sZSEgVGhlIGFjaGlldmVkIGdlbmVyYWwgc3BlZWR1cCBpcyBhYm91dCA1MC03MCUuCi0gQWRkZWQgbWlzc2luZyBvbGQgTVMgc3BlY2lmaWMgZXh0ZW5zaW9ucyB0byB0aGUgcmUyYyBsZXhlciAoX2Jhc2VkLCAKICBfZGVjbHNwZWMsIF9jZGVjbCwgX2Zhc3RjYWxsLCBfc3RkY2FsbCwgX2lubGluZSBhbmQgX2FzbSkuCi0gQWRkZWQgc3VwcG9ydCBmb3IgI2luY2x1ZGVfbmV4dCAoYXMgaW1wbGVtZW50ZWQgYnkgZ2NjKS4KLSBGaXhlZCBjb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIGdjYyAzLjMuMQotIEF2b2lkIHRvIGxvb2sgdXAgaW4gc3ltYm9sIHRhYmxlIG9mIGEgcG90ZW50aWFsIG1hY3JvIG5hbWUgdHdpY2UuCi0gQWRkZWQgdGhlIFNwaXJpdCBTTGV4IGxleGVyIHNhbXBsZSB0byB0aGUgV2F2ZSBzb3VyY2UgdHJlZSwgYmVjYXVzZSBpdCB3YXMgCiAgcmVtb3ZlZCBmcm9tIHRoZSBTcGlyaXQgZGlzdHJpYnV0aW9uLgotIFJlbW92ZWQgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9uLCB3aGljaCBhbGxvd2VkIHRvIHJldmVyc2UgdGhlIG5hbWVzIHN0b3JlZCAKICBpbiB0aGUgc3ltYm9sIHRhYmxlcy4KLSBJbXBsZW1lbnRlZCBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgdXNpbmcgYSBUU1QgKHRlcm5hcnkgc2VhcmNoIHRyZWUpIGFzIHRoZQogIGNvbnRhaW5lciBmb3IgdGhlIHN5bWJvbCB0YWJsZXMuCiAgIApTdW4gSmFuICA1IDEyOjMwOjUwICAgICAyMDA0Ci0gUmVsZWFzZWQgVjEuMC4wCgpTdW4gSmFuICA0IDAwOjExOjUwICAgICAyMDA0Ci0gUmVtb3ZlZCB0YWJzIGZyb20gdGhlIGZsZXhfc3RyaW5nLmhwcCBmaWxlLgotIE1vZGlmaWVkIHRoZSBpbnB1dF9mdW5jdG9yLmhwcCBmaWxlIHRvIHNxZWV6ZSBvdXQgc29tZSBtaWxsaXNlY29uZHMgYXQgCiAgcnVudGltZS4KLSBUaGUgLS10aW1lciBvcHRpb24gbm93IHByaW50cyB0aGUgb3ZlcmFsbCBlbGFwc2VkIHRpbWUgZXZlbiBpZiBhbiBlcnJvciAKICBvY2N1cmVkLgotIEFkZGVkIHN1cHBvcnQgZm9yICNwcmFnbWEgb25jZS4KCkZyaSBKYW4gIDIgMjI6NTg6NTQgICAgIDIwMDQKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgY29kZSwgd2hpY2ggcHJlZGVmaW5lcyB0aGUgcHJlcHJvY2Vzc29yIGNvbnN0YW50cy4KLSBGaXhlZCBhIGJ1ZyBpbiBpbnRsaXRfZ3JhbW1hcjw+IGluaXRpYWxpc2F0aW9uIGNvZGUuCgpUaHUgSmFuICAxIDIxOjE1OjAzICAgICAyMDA0Ci0gRml4ZWQgYSBidWcgd2hpbGUgcHJlZGVmaW5pbmcgYSBtYWNybyB3aXRoIGEgdmFsdWUgdGhyb3VnaCB0aGUgY29tbW1hbmQgbGluZS4KLSBGaXhlZCBhIGJ1Zywgd2hpY2ggcmVwb3J0ZWQgYSBtYWNybyBkZWZpbml0aW9uIGFzIGlsbGVnYWwsIGlmIHRoZSByZWRlZmluZWQgCiAgbWFjcm8gd2FzIGEgZnVuY3Rpb24gbGlrZSBtYWNybyB3aXRoIHBhcmFtZXRlcnMuCi0gRml4ZWQgYSBidWcsIGlmIGNvbmNhdGVuYXRpb24gb2YgdHdvIHRva2VucyByZXN1bHRlZCBpbiBhIEMrKyBjb21tZW50IHN0YXJ0IAogIHRva2VuLgogIApUaHUgSmFuICAxIDE1OjAxOjU0ICAgICAyMDA0Ci0gRmluaXNoZWQgbGljZW5zZSBtaWdyYXRpb24uCgpXZWQgRGVjIDMxIDEyOjIzOjU1ICAgICAyMDAzCi0gQ2hhbmdlZCB0aGUgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcgcG9saWNpeSB0byBiZSBCb29zdCBjb21wYXRpYmxlLgoKV2VkIERlYyAzMSAxMjowMToxNCAgICAgMjAwMwotIEZpeGVkIGEgcHJvYmxlbSB3aGlsZSBjb21waWxpbmcgY2VydGFpbiBoZWFkZXJzIGZyb20gdGhlIE1pY3Jvc29mdCBXaW5kb3dzIAogIFNESzoKICAgICAgICAjZGVmaW5lIENyZWF0ZVdpbmRvd0EobHBDbGFzc05hbWUsIGxwV2luZG93TmFtZSwgZHdTdHlsZSwgeCwgeSxcCiAgICAgICAgbldpZHRoLCBuSGVpZ2h0LCBoV25kUGFyZW50LCBoTWVudSwgaEluc3RhbmNlLCBscFBhcmFtKVwKICAgICAgICBDcmVhdGVXaW5kb3dFeEEoMEwsIGxwQ2xhc3NOYW1lLCBscFdpbmRvd05hbWUsIGR3U3R5bGUsIHgsIHksXAogICAgICAgIG5XaWR0aCwgbkhlaWdodCwgaFduZFBhcmVudCwgaE1lbnUsIGhJbnN0YW5jZSwgbHBQYXJhbSkKICB3aGVyZSBlc3NlbnRpYWxseSBpcyBubyB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIHBhcmFtZXRlciBsaXN0IGFuZCB0aGUgbWFjcm8KICByZXBsYWNlbWVudCBsaXN0LgotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBNUyBleHRlbnNpb24gX19kZWNsc3BlYywgd2hpY2ggbm93IGlzIHJlY29nbml6ZWQKICBjb3JyZWN0bHkuCiAgClNhdCBEZWMgMjcgMTQ6NDg6MjkgICAgIDIwMDMKLSBGaXhlZCByZW1haW5pbmcgcHJvYmxlbXMgd2l0aCBhc3NpZ24vYXNzaWduX2EuCi0gRml4ZWQgc29tZSBnY2Mgd2FybmluZ3MgYWJvdXQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzaW9uIG1pc21hdGNoLgoKVHVlIE5vdiAxMSAyMDo1MTo0MSBXRVNUIDIwMDMKLSBDaGFuZ2VkIHRoZSBJREwgbW9kZSB0byByZWNvZ25pemUgaWRlbnRpZmllcnMgb25seS4gQWxsIGtleXdvcmRzIChleGNlcHQgCiAgJ3RydWUnIGFuZCAnZmFsc2UnKSBhcmUgcmV0dXJuZWQgYXMgaWRlbnRpZmllcnMuIFRoaXMgYWxsb3dzIGZvciBlYXN5IAogIGV4dGVuc2lvbiBvZiB0aGUgSURMIGxhbmd1YWdlLiBUaGUgZHJhd2JhY2sgaXMsIHRoYXQgYWZ0ZXIgcHJlcHJvY2Vzc2luZyAKICB0aGVyZSBuZWVkcyB0byBiZSBqdXN0IGFub3RoZXIgbGV4aW5nIHN0YWdlLCB3aGljaCByZWNvZ25pemVzIHRoZSBrZXl3b3Jkcy4KLSBGaXhlZCBhIHBvc3NpYmxlIHByb2JsZW0sIHdoZW4gaW4gYmV0d2VlbiBhICNpZi8jZWxpZiBkaXJlY3RpdmUgYW5kIGEgCiAgc3Vic2VxdWVudCBvcGVuaW5nIHBhcmVudGhlc2lzIFdhdmUgZmluZHMgbm8gd2hpdGVzcGFjZToKICAgICNpZihfV0lOX1ZFUiA+PSAweDA1MDApCiAgaXMgbm93IHJlY29nbml6ZWQgY29ycmVjdGx5LiAKICAoVGhpcyBwcm9ibGVtIHdhcyBwb2ludGVkIG91dCBieSBQb3J0ZXIgU2NoZXJtZXJob3JuKS4KICAKU3VuIE5vdiAgOSAyMTowNToyMyBXRVNUIDIwMDMKLSBTdGFydGVkIHRvIHdvcmsgb24gaW1wbGVtZW50YXRpb24gb2YgYW4gSURMIGxleGVyIGZvciB0aGUgVEFPIGlkbCBjb21waWxlci4KICAuIEJyYW5jaGVkIG9mZiB0aGUgUmUyQyBDKysgbGV4ZXIgYW5kIHJlbGF0ZWQgZmlsZXMgYXMgYSBzdGFydGluZyBwb2ludCBmb3IgCiAgICB0aGUgbmV3IElETCBsZXhlci4gQWRkZWQgY29ubmZpZ3VyYXRpb24gbWVhbnMgdG8gYWxsb3cgY29tcGlsZSB0aW1lCiAgICBkZWNpc2lvbiwgaW4gd2hpY2ggbW9kZSB0byBvcGVyYXRvZSAoQysrIG9yIElETCkuCiAgLiBJbXBsZW1lbnRlZCB0aGUgUmUyQyBiYXNlZCBJREwgbGV4aW5nIGNvbXBvbmVudC4KICAuIEZpeGVkIGFsbCBvY2N1cmVuY2VzIG9mIG5vbi1JREwgdG9rZW5zIChhcyBUX0NPTE9OX0NPTE9OIGFuZCBUX0VMTElQU0lTKQoKU2F0IE5vdiAgOCAyMDowNTo1MiBXRVNUIDIwMDMKLSBWZXJzaW9uIDEuMC4wCi0gTXVuZ2VkIHRoZSBlbWFpbCBhZGRyZXNzZXMgZW1iZWRkZWQgd2l0aGluIHRoZSBzb3VyY2UgZmlsZXMuCi0gQWRqdXN0ZWQgZm9yIHRoZSBuZXcgYWN0b3IgbmFtZXMgaW4gU3Bpcml0IChhc3NpZ25fYSBhbmQgYXBwZW5kX2EpLgoKVGh1IEF1ZyAyMSAxNjo1NDoyMCAgICAgMjAwMwotIFJlbW92ZWQgdGhlIGludGVybmFsbHkgdXNlZCBtYWNybyAnY291bnRvZigpJyB0byBhdm9pZCBwb3NzaWJsZSBuYW1lY2xhc2hlcyAKICB3aXRoIHVzZXIgY29kZS4KLSBGaXhlZCBhIGJ1Zywgd2hpY2ggcHJldmVudGVkIHRoZSBleGVjdXRpb24gb2YgdGhlIGNvbmNhdGluYXRpb24gb3BlcmF0b3IgJyMjJwogIHdoaWxlIGV4cGFuZGluZyBvYmplY3QtbGlrZSBtYWNyb3MuCiAgClR1ZSBBdWcgIDUgMTA6MDQ6MDAgICAgIDIwMDMKLSBGaXhlZCBhIGZhbHNlIGFzc2VydGlvbiwgaWYgYSAjcHJhZ21hIGRpcmVjdGl2ZSBzdGFydGVkIHdpdGggc29tZSB3aGl0ZXNwYWNlIAogIG9uIHRoZSBsaW5lLgotIEFkZGVkIHRoZSAjcHJhZ21hIHdhdmUgdGltZXIoKSBkaXJlY3RpdmUgdG8gYWxsb3cgcm91Z2ggdGltaW5ncyBkdXJpbmcgCiAgcHJvY2Vzc2luZy4gVGhpcyBpcyBkb25lIG9uIHRvcCBvZiBhIG5ldyBjYWxsYmFjayBob29rIGZvciB1bnJlY29nbml6ZWQgCiAgI3ByYWdtYSdzLCB3aGljaCBhbGxvd3MgdG8gZWFzaWx5IGFkZCBuZXcgcHJhZ21hIGNvbW1hbmRzIHdpdGhvdXQgY2hhbmdpbmcgCiAgdGhlIFdhdmUgbGlicmFyeS4KLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgd2hpdGVzcGFjZSBpbnNlcnRpb24gZW5naW5lLCB3aGljaCBwcmV2ZW50ZWQgdGhlIGluc2VydGlvbiAKICBvZiBhIHdoaXRlc3BhY2UgdG9rZW4gaW4gYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgaWRlbnRpZmllciB0b2tlbnMgb3IgYSAKICBpbnRlZ2VyIGxpdGVyYWwgdG9rZW4gZm9sbG93ZWQgYnkgYW4gaWRlbnRpZmllciB0b2tlbi4KLSBGaXhlZCBhIGJ1ZyBkdXJpbmcgbWFjcm8gY29uY2F0ZW5hdGlvbiwgd2hpY2ggYWxsb3dlZCB0byBjb25jYXRlbmF0ZSAKICB1bnJlbGF0ZWQgdG9rZW5zIGZyb20gdGhlIGlucHV0IHN0cmVhbToKICAgICNkZWZpbmUgQ0FUKGEsIGIpIFBSSU1JVElWRV9DQVQoYSwgYikKICAgICNkZWZpbmUgUFJJTUlUSVZFX0NBVChhLCBiKSBhICMjIGIKICAgICNkZWZpbmUgWCgpIEIKICAgICNkZWZpbmUgQUJDIDEKICAgIENBVChBLCBYKCkgQykgLy8gQUIgQwogICAgQ0FUKEEsIFgoKUMpICAvLyBjb3JyZWN0OiBBQiBDLCB3YXMgMQotIEZpeGVkIGEgNjQgYml0IHBvcnRhYmlsaXR5IHByb2JsZW0uCi0gQWRkZWQgcHJhZ21hIHdhdmUgdGltZXIoc3VzcGVuZCkgYW5kIHdhdmUgdGltZXIocmVzdW1lKQotIEZpeGVkIGEgT0RSIHByb2JsZW0gd2l0aCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gZGF0YSBmb3IgcHJlZGVmaW5lZCBtYWNyb3MuCi0gUG9ydGVkIHRoZSBpdGVyYXRvcnMgdG8gdGhlIG5ldyBpdGVyYXRvcl9hZGFwdG9ycy4KLSBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgdGhlIHJlY2VudCBjaGFuZ2VzCgpTdW4gSnVuIDI5IDEyOjM1OjAwICAgICAyMDAzCi0gRml4ZWQgNjQgYml0IGNvbXBhdGliaWxpdHkgd2FybmluZ3MuCi0gRml4ZWQgYSBidWcsIHdoaWNoIHByZXZlbnRlZCB0aGUgY29ycmVjdCByZWNvZ25pdGlvbiBvZiBhICNsaW5lIGRpcmVjdGl2ZSwgaWYKICBvbmx5IHRoZSBmaWxlbmFtZSBwYXJ0IG9mIHRoaXMgZGlyZWN0aXZlIHdhcyBnZW5lcmF0ZWQgYnkgYSBtYWNybyBleHBhbnNpb24uCi0gRml4ZWQgYSBidWcgZHVyaW5nIG1hY3JvIGV4cGFuc2lvbiBvZiBjb25kaXRpb25hbCBleHByZXNzaW9ucywgd2hpY2ggCiAgcHJldmVudGVkIHRoZSBjb3JyZWN0IGV4cGFuc2lvbiBvZiBjZXJ0YWluIHNjb3BlZCBtYWNyb3MuCiAgCkZyaSBKdW4gMjcgMDk6NTA6MTQgICAgIDIwMDMKLSBDaGFuZ2VkIHRoZSBvdXRwdXQgb2YgdGhlIG92ZXJhbGwgZWxhcHNlZCB0aW1lIChvcHRpb24gLS10aW1lcikgdG8gY2Vyci4KLSBBZGRlZCBhIGNvbmZpZ3VyYXRpb24gY29uc3RhbnQgV0FWRV9SRVZFUlNFX01BQ1JPTkFNRVNfRk9SX1NZTUJPTFRBQkxFLCB3aGljaAogIHJldmVyc2VzIHRoZSBtYWNybyBuYW1lcyB3aGlsZSBzdG9yaW5nIHRoZW0gaW50byB0aGUgc3ltYm9sIHRhYmxlLCB3aGljaCAKICBhbGxvd3MgdG8gc3BlZWQgdXAgbmFtZSBsb29rdXAgZXNwZWNpYWxseSwgaWYgdGhlIG1hY3JvIG5hbWVzIGFyZSB2ZXJ5IGxvbmcKICBhbmQgaWYgdGhlc2Ugc2hhcmUgYSBjb21tb24gcHJlZml4LgotIEZpeGVkIGEgdmVyeSBzdWJ0bGUgYnVnLCB3aGljaCBwcmV2ZW50ZWQgdGhlIHJlY29nbml0aW9uIG9mIGZ1bGx5IHF1YWxpZmllZAogIG1hY3JvIG5hbWVzIGR1cmluZyB0aGUgbWFjcm8gZXhwYW5zaW9uIG9mIGNvbmRpdGlvbmFscyBleHByZXNzaW9ucyAoZm9yIAogICNpZi8jZWxpZikuCi0gSW1wcm92ZWQgdGhlIGVycm9yIG91dHB1dCBmb3IgdGhlIGlsbGZvcm1lZCBwcCBleHByZXNzaW9uIGVycm9yLgogIApUaHUgSnVuIDI2IDA4OjIwOjMwICAgICAyMDAzCi0gRG9uZSBhIGNvbXBsZXRlIHNwZWxsIGNoZWNrIG9mIHRoZSBzb3VyY2UgY29kZSBjb21tZW50cy4KCldlZCBKdW4gMjUgMjA6MzM6NTIgICAgIDIwMDMKLSBDaGFuZ2VkIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIGVuZ2luZSB0byB3b3JrIHdpdGggaW50ZWdlciBudW1lcmljIAogIGxpdGVyYWxzIG9ubHkuIERpc3Rpbmd1aXNoZWQgc2lnbmVkIGFuZCB1bnNpZ25lZCBsaXRlcmFscy4KLSBJbXBvcnRpbmcgYSByZWdpb24gdHdpY2UgaXMgYWxsb3dlZCBub3cuCi0gRml4ZWQgYSBidWcsIHdoaWNoIGRvZXMgbm90IHJlbW92ZWQgYWxsIHBsYWNlaG9sZGVyIHRva2VucyBmcm9tIGEgZXhwYW5kZWQgCiAgdG9rZW4gc2VxdWVuY2Ugd2hpbGUgZXZhbHVhdGluZyBjb25kaXRpb25hbCBleHByZXNzaW9ucyAoQysrMHggbW9kZSBvbmx5KS4KCldlZCBKdW4gMjUgMTU6MDE6NTEgICAgIDIwMDMKLSBDaGFuZ2VkIHRoZSBjb25kaXRpb25hbCBleHByZXNzaW9uIGVuZ2luZSB0byByZXNwZWN0IHRoZSB0eXBlIG9mIG51bWVyaWMgCiAgbGl0ZXJhbHMsIG5vdyBleHByZXNzaW9ucyBsaWtlICcjaWYgMSAvIDEwID09IDAnIGV2YWx1YXRlIGNvcnJlY3RseSAodG8gdHJ1ZQogIDotKQotIEZpeGVkIGEgYnVnLCB3aGVyZSBtYWNybyBuYW1lcyByZWZlcnJpbmcgdG8gZ2xvYmFsIG1hY3JvcyAoYXMgOjpBOjpCKSB3ZXJlIAogIG5vdCBjb3JyZWN0bHkgcmVjb2duaXplZCB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuCi0gRW1wdHkgcGFyYW1ldGVyIGxpc3RzIGZvciBtYWNyb3Mgd2l0aCBlbGxpcHNlcyBvbmx5IHNvbWV0aW1lcyBnZW5lcmF0ZWQgYSAKICBwbGFjZW1hcmtlciB0b2tlbiBpbiB0aGUgb3V0cHV0OgogICAgI2RlZmluZSBTVFIoLi4uKSAjX19WQV9BUkdTX18KICAgIFNUUigpICAgLy8gcmVzdWx0ZWQgaW4gIqciIGluc3RlYWQgb2YgIiIgLgoKV2VkIEp1biAyNSAwODozNTowNiAgICAgMjAwMwotIEZpeGVkIHNldmVyYWwgZ2NjIGNvbXBpbGF0aW9uIGVycm9ycyAobWlzc2luZyB0eXBlbmFtZSdzIGV0Yy4pCi0gRml4ZWQgYSBjb21waWxhdGlvbiBwcm9ibGVtLCBpZiBXYXZlIGlzIGJ1aWx0IG9uIHRvcCBvZiB0aGUgU0xFWCBzY2FubmVyLgotIFJlZm9ybWF0dGVkIHRoZSAtLXRpbWVyIG91dHB1dCBmcm9tIHB1cmUgc2Vjb25kcyB0byBhIG1vcmUgcmVhc29uYWJsZSBmb3JtYXQuCgpGcmkgSnVuIDIwIDE5OjMzOjMwICAgICAyMDAzCi0gQ2hhbmdlZCB0aGUgZW5hYmxlX3RyYWNpbmcgZnVuY3Rpb24gb2YgdGhlIHRyYWNpbmdfcG9saWNpZXMgdG8gdGFrZSBhIAogIHRyYWNlX2ZsYWdzIHZhcmlhYmxlIGluc3RlYWQgb2YgYSBib29sLCB0byBhbGxvdyB0byBjb250cm9sIHRyYWNpbmcgd2l0aCBtb3JlCiAgZ3JhbnVsYXRpb24uCi0gQWRkZWQgdGhlIHRyYWNpbmdfZW5hYmxlZCBmdW5jdGlvbiB0byB0aGUgdHJhY2luZ19wb2xpY2llcywgd2hpY2ggcmV0dXJucyB0aGUgCiAgY3VycmVudCB0cmFjaW5nIHN0YXR1cy4KLSBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSB0cmFjaW5nIHBvbGljaWVzLgoKVGh1IEp1biAxOSAyMTo0NTozOSAgICAgMjAwMwotIFJlYWN0aXZhdGVkIHRoZSBsaXN0X2luY2x1ZGVzIHNhbXBsZSB3aXRoIHRoZSBoZWxwIG9mIHRoZSBuZXcgaW5jbHVkZSBmaWxlIAogIHRyYWNpbmcgZmFjaWxpdHkuCgpUaHUgSnVuIDE5IDE3OjU1OjM1ICAgICAyMDAzCi0gRWxpbWluYXRlZCB0aGUgVHJhY2VUIHRlbXBsYXRlIHBhcmFtZXRlciBmcm9tIHRoZSBtYWNyb21hcDw+IHRlbXBsYXRlLgotIEFkZGVkIHR3byBob29rcyB0byB0aGUgdHJhY2UgcG9saWN5IHRvIGFsbG93IHRvIHRyYWNlIHRoZSBvcGVuaW5nIGFuZCAKICBjbG9zaW5nIG9mIGluY2x1ZGUgZmlsZXMuCgpUaHUgSnVuIDE5IDE0OjA4OjEwICAgICAyMDAzCi0gQWRkZWQgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gLS10aW1lciwgd2hpY2ggZW5hYmxlcyB0aGUgb3V0cHV0IHRvIHN0ZDo6Y291dAogIG9mIHRoZSBvdmVyYWxsIGVsYXBzZWQgdGltZSBkdXJpbmcgdGhlIHByZXByb2Nlc3Npbmcgb2YgdGhlIGdpdmVuIGZpbGUuCgpGcmkgSnVuIDEzIDA5OjExOjI5ICAgICAyMDAzCi0gRW1pdHRlZCBhbiBlcnJvciBtZXNzYWdlLCBpZiBhbiBlbGxpcHNlcyB3YXMgZm91bmQgYXMgYSBmb3JtYWwgbWFjcm8gCiAgcGFyYW1ldGVyIGFuZCB2YXJpYWRpY3Mgd2VyZSBkaXNhYmxlZC4KLSBGaXhlZCBhIGZhbHNlIGVycm9yIG1lc3NhZ2UsIHRoYXQgdGhlIGxhc3QgbGluZSB3YXMgbm90IHRlcm1pbmF0ZWQgd2l0aCBhIAogIG5ld2xpbmUsIHdoaWNoIG9jY3VyZWQsIGlmIG5vIG91dHB1dCB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBsYXN0IGxpbmUgb2YgdGhlCiAgc291cmNlIGZpbGUuCiAgClRodSBKdW4gMTIgMTU6MjA6MjIgICAgIDIwMDMKLSBGaXhlZCB0aGUgcmVjZW50IGNoYW5nZSBpbiBhcmd1bWVudCBleHBhbnNpb24gZm9yIHRoZSB2YXJpYWRpY3MvQzk5L0MrKzB4IAogIG1vZGUuCi0gRml4ZWQgYSBwcm9ibGVtLCB3aGVyZSBhbiBhZGRpdGlvbmFsIHdoaXRlc3BhY2UgYmV0d2VlbiBfUHJhZ21hIGFuZCB0aGUgCiAgb3BlbmluZyBwYXJlbnRoZXNpcyByZXN1bHRlZCBpbiBhIGZhbHNlIGVycm9yIG1lc3NhZ2UuCi0gVXNlZCBhIHBvb2wgYWxsb2NhdG9yIGZvciB0aGUgdG9rZW4gc2VxdWVuY2UgY29udGFpbmVycyAoc3RkOjpsaXN0PD4ncyksCiAgd2hpY2ggZ2l2ZXMgYSBzcGVlZCBnYWluIG9mIG1vcmUgdGhhbiA2MCUgKHdoaWxlIHByb2ZpbGluZyB0aGUgT3JkZXIgCiAgbGlicmFyeSkuCiAgCldlZCBKdW4gMTEgMjI6MTg6NTQgICAgIDIwMDMKLSBGaXhlZCBhIG1hY3JvIHNjb3BpbmcvZXhwYW5zaW9uIHByb2JsZW0sIHdoZW4gYSBtYWNybyByZXR1cm5lZCBhIGZ1bGwgc2NvcGUKICB3aGljaCBpcyBjb250aW51ZWQgb24gdGhlIGNhbGwgc2l0ZSB0byBmb3JtIGEgZnVsbCBxdWFsaWZpZWQgbmFtZSwgdGhlIG5hbWUgCiAgd2Fzbid0IHJlY29nbml6ZWQgY29ycmVjdGx5OgogICAgIyByZWdpb24gQQogICAgIyAgZGVmaW5lIE1BQ1JPIDEKICAgICMgIHJlZ2lvbiBCCiAgICAjICAgZGVmaW5lIE1BQ1JPIDIKICAgICMgIGVuZHJlZ2lvbgogICAgIyBlbmRyZWdpb24KICAgICMgZGVmaW5lIElEKHgpIHgKICAgIElEKEEpOjpNQUNSTyAgICAgLy8gMQogICAgSUQoQTo6Qik6Ok1BQ1JPICAvLyAyLCB3YXMgZXhwYW5kZWQgdG8gQTo6Qjo6TUFDUk8KLSBDaGFuZ2VkIHRoZSBleHBhbnNpb24gb2YgbWFjcm8gYXJndW1lbnRzIHN1Y2gsIHRoYXQgdGhlc2Ugd2lsbCBiZSBleHBhbmRlZCAKICBvbmx5LCBpZiB0aGUgcmVzdWx0IGlzIHRvIGJlIHVzZWQgZm9yIHN1YnN0aXR1dGlvbiBkdXJpbmcgdGhlIGV4cGFuc2lvbgogIG9mIHRoZSByZXBsYWNlbWVudCBsaXN0LgogIApXZWQgSnVuIDExIDE0OjQwOjI5ICAgICAyMDAzCi0gSW5jbHVkZWQgYSB3aGl0ZXNwYWNlIGVhdGluZyBmaW5pdGUgc3RhdGUgbWFjaGluZSAoRlNNKSBmb3IgbWluaW1hbCAKICB3aGl0ZXNwYWNlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LiBUaGlzIHdhcyBzdWdnZXN0ZWQgYnkgUGF1bCBNZW5zb25pZGVzLgotIFVwZGF0ZWQgdGhlIGFja25vd2xlZGdlbWVudCBzZWN0aW9uCgpXZWQgSnVuICA0IDA4OjAzOjA0ICAgICAyMDAzCi0gRml4ZWQgYSBidWcgcmVwb3J0ZWQgYnkgRmFpc2FsIFZhbGksIHdoaWNoIHByZXZlbnRlZCB0aGUgY29ycmVjdCBldmFsdWF0aW9uIAogIG9mIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zLCBpZiB0aGVzZSByZWZlcmVuY2VkIG1hY3JvIG5hbWVzLCB3aGljaCBleHBhbmRlZCAKICB0byBhIHNlcXVlbmNlIGNvbnRhaW5pbmcgbm9uLWV4cGFuZGFibGUgdG9rZW5zLgotIEZpeGVkIHRoZSBhYm92ZSBidWcgZm9yICNlbGlmIGRpcmVjdGl2ZXMgdG9vIChpbiB0aGUgZmlyc3QgcGxhY2UgdGhpcyB3YXMgCiAgZml4ZWQgZm9yICNpZiBkaXJlY3RpdmVzIG9ubHkpCiAgCk1vbiBNYXkgMjYgMjI6MTU6NDAgICAgIDIwMDMKLSBBZGRlZCBtaXNzaW5nIGNvcHlyaWdodHMgaW4gc2V2ZXJhbCBmaWxlcy4KLSBGaXhlZCBmYWxzZSBvdXRwdXQsIGlmIGEgdW5rbm93biBfUHJhZ21hIHdlcmUgZW5jb3VudGVyZWQuCi0gRml4ZWQgYSBtYWNybyBleHBhbnNpb24gcHJvYmxlbSB3aXRoIHF1YWxpZmllZCBuYW1lcywgd2VyZSBjb25zdHJ1Y3RzIGxpa2UKICB0aGUgZm9sbG93aW5nIHdlcmUgbm90IGV4cGFuZGVkIGNvcnJlY3RseToKICAgICNkZWZpbmUgSUQoeCkgeAogICAgI3JlZ2lvbiBTQ09QRQogICAgIyAgZGVmaW5lIFRFU1QgMQogICAgI2VuZHJlZ2lvbgogICAgSUQoU0NPUEU6OikgVEVTVCAgICAvLyBzaG91bGQgZXhwYW5kIHRvIDEKLSBDaGFuZ2VkICNpbXBvcnQgc2VtYW50aWNzIGZvciBtYWNyb3MgZnJvbSBjb3B5IHNlbWFudGljcyB0byByZWZlcmVuY2UgCiAgc2VtYW50aWNzLCBpLmUuIG1hY3JvcyBhcmUgbm93IGNvbnNpZGVyZWQgdG8gYmUgaW1wbGljaXRseSBpbXBvcnRlZCBpbnRvIHRoZSAKICBzY29wZSwgd2hlcmUgdGhleSBhcmUgZGVmaW5lZC4gSWYgYSBtYWNybyBpcyBpbXBvcnRlZCBpbnRvIGFub3RoZXIgc2NvcGUgYW5kIAogIHRoZSBvcmlnaW5hbCBtYWNybyBpcyB1bmRlZmluZWQsIHRoZSBpbXBvcnRlZCBtYWNybyBzdGlsbCBleGlzdHMuIEZ1cnRoZXIsIAogIGlmIHRoZSBpbXBvcnRlZCBtYWNybyBpcyBleHBhbmRlZCwgdGhlbiB3aGlsZSByZXNjYW5uaW5nIHRoZSBvcmlnaW5hbCBtYWNybyAKICBpcyBkaXNhYmxlZCB0b286CiAgICAjcmVnaW9uIEEKICAgICMgIGRlZmluZSBCKHgpIHgKICAgICNlbmRyZWdpb24KICAgICNpbXBvcnQgQQogICAgQiAgICAoQTo6QikgKCopIC8vIEE6OkIoKikKICAgIEE6OkIgKEIpICAgICgqKSAvLyBCKCopCiAgICBCICAgIChCKSAgICAoKikgLy8gQigqKQogICAgQTo6QiAoQTo6QikgKCopIC8vIEE6OkIoKikKLSBGaXhlZCBhIHJlY2VudGx5IGludHJvZHVjZWQgcHJvYmxlbSwgd2hlcmUgcGxhY2VtYXJrZXIgdG9rZW5zIHNsaXBwZWQgdGhyb3VnaCAKICB0byB0aGUgb3V0cHV0IHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucyAoaW4gdmFyaWFkaWNzL0M5OS9DKysweCBtb2RlcyBvbmx5KS4KCk1vbiBNYXkgMTkgMTY6MzA6NDkgICAgIDIwMDMKLSBGaXhlZCBhIGJ1Zywgd2hpY2ggcHJldmVudGVkIHRoZSByZWNvZ25pdGlvbiBvZiB0aGUgX19scGFyZW5fXywgX19ycGFyZW5fXyBvciAKICBfX2NvbW1hX18gYWx0ZXJuYXRpdmUgdG9rZW5zLCBpZiB0aGVzZSB3ZXJlIHRoZSBmaXJzdCB0b2tlbiBhZnRlciBhbiBlbWl0dGVkCiAgI2xpbmUgZGlyZWN0aXZlIChyZXBvcnRlZCBieSBWZXNhIEthcnZvbmVuKS4KLSBBZGRlZCBhbiBvcHRpbWl6YXRpb24sIHRoYXQgb25seSB0aG9zZSB0b2tlbnMgYXJlIGNvbnNpZGVyZWQgZm9yIGEgbWFjcm8gCiAgZXhwYW5zaW9uLCB3aGljaCBtYXkgcmVzdWx0IGluIGFuIGV4cGFuc2lvbi4KICAKVHVlIE1heSAxMyAxODoxNjoyNiAgICAgMjAwMwotIEZpeGVkIGEgbmV3bHkgaW50cm9kdWNlZCBwcm9ibGVtLCB3aGVyZSBhIG9taXR0ZWQgYXJndW1lbnQgY29uc2lzdGluZyBvdXQgCiAgb2Ygd2hpdGVzcGFjZSBvbmx5IHdlcmUgZmFpbGVkIHRvIGJlIHJlcGxhY2VkIGJ5IGEgcGxhY2VtYXJrZXIgdG9rZW4uIFRoaXMgCiAgbGVhZCB0byBwcm9ibGVtcyB3aXRoIGNvbnN0cnVjdHMgbGlrZSB0aGUgZm9sbG93aW5nOgogICAgI2RlZmluZSBwYXN0ZShhLCBiLCBjKSBhICMjIGIgIyMgYwogICAgcGFzdGUoMSwgLCAzKSAgLy8gc2hvdWxkIGV4cGFuZCB0byAxMywgYnV0IGV4cGFuZGVkIHRvIDEjIyAzCi0gRml4ZWQgYSBwcm9ibGVtIHdpdGggdGhlIHRyYWNpbmcgc3VwcG9ydCwgd2hpY2ggdGhyb3dlZCBhbiB1bmV4cGVjdGVkIAogIGV4Y2VwdGlvbiBpZiB0aGVyZSB3ZXJlIHRvbyBmZXcgYXJndW1lbnRzIGdpdmVuIHdoaWxlIGV4cGFuZGluZyBhIG1hY3JvLgotIEFsbG93ZWQgdG8gb3BlbiBhbmQgdG8gaW1wb3J0IHRoZSBnbG9iYWwgc2NvcGUgKCcjcmVnaW9uIDo6JyBhbmQgCiAgJyNpbXBvcnQgOjonKS4KLSBGaXhlZCBhIGJ1ZywgaWYgbW9yZSB0aGFuIG9uZSBmaWxlIHdhcyBnaXZlbiB3aXRoIGEgLS1mb3JjZWluY2x1ZGUgY29tbWFuZCAKICBsaW5lIG9wdGlvbi4KClNhdCBNYXkgMTAgMjE6MzA6MjkgICAgIDIwMDMKLSBBZGRlZCBfX1NURENfRlVMTF9SRUdJT05fXyBhbmQgX19TVERDX0NVUlJFTlRfUkVHSU9OX18gdG8gdGhlIGxpc3Qgb2Ygbm90IAogIHVuZGVmaW5hYmxlIG1hY3Jvcy4KLSBJbiBub3JtYWwgQysrIG1vZGUgYW5kIEM5OSBtb2RlIHRoZSAjaWZkZWYvI2lmbmRlZiBhbmQgdGhlIG9wZXJhdG9yIGRlZmluZWQoKQogIHNob3VsZCBub3Qgc3VwcG9ydCBxdWFsaWZpZWQgbmFtZXMuIFRoaXMgaXMgZml4ZWQgbm93LgotIFVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24uCi0gRml4ZWQgbWlub3IgZ2NjIC1XYWxsIGNvbXBpbGF0aW9uIHdhcm5pbmdzLgotIEFkZGVkIGJldHRlciBlcnJvciBzdXBwb3J0IGZvciBxdWFsaWZpZWQgbmFtZXMgdXNlZCBhcyBhcmd1bWVudHMgZm9yICNpZmRlZiwKICAjaWZuZGVmIGFuZCBvcGVyYXRvciBkZWZpbmVkKCkuCiAgClNhdCBNYXkgMTAgMDk6NTE6MTggICAgIDIwMDMKLSBSZW1vdmVkIHRoZSBmZWF0dXJlLCB0aGF0IHRoZSBjb21tYSBiZWZvcmUgdGhlIGVsbGlwc2lzIHBhcmFtZXRlciBpbiBhIG1hY3JvCiAgZGVmaW5pdGlvbiBtYXkgYmUgb21pdHRlZC4KLSBSZXNvbHZlZCBhbiBpc3N1ZSB3aXRoIHRoZSBleHBhbnNpb24gb2YgcXVhbGlmaWVkIG1hY3Jvcywgd2hlbiB0aGVzZSAKICBxdWFsaWZpZWQgbmFtZXMgd2VyZSBwYXJ0aWFsbHkgZ2VuZXJhdGVkIGJ5IGEgcHJldmlvdXMgbWFjcm8gZXhwYW5zaW9uCi0gQWxsb3dlZCB0byBzcGVjaWZ5IGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBhcyBhcmd1bWVudHMgdG8gdGhlICNyZWdpb24gZGlyZWN0aXZlCiAgCldlZCBNYXkgIDcgMjI6NDQ6MjEgICAgIDIwMDMKLSBDaGFuZ2VkIHRoZSBuYW1lcyBvZiBfX1NDT1BFX18gYW5kIF9fRlVMTF9TQ09QRV9fIHByZWRlZmluZWQgbWFjcm9zIHRvIAogIF9fU1REQ19DVVJSRU5UX1JFR0lPTl9fIGFuZCBfX1NURENfRlVMTF9SRUdJT05fXyByZXNwLiBUaGUgbmFtZXMgYXJlIHN1YmplY3QgCiAgdG8gY2hhbmdlIGlmIHRoZSAjcmVnaW9uIGtleXdvcmQgYWN0dWFsbHkgd2lsbCBiZSByZW5hbWVkIHRvICNzY29wZS8jbW9kdWxlCiAgb3Igd2hhdGV2ZXIuCi0gSW4gQysrMHggbW9kZSBpdCBpcyBub3cgcG9zc2libGUgdG8gb21pdCB0aGUgbGFzdCBjb21tYSBiZWZvcmUgYSB2YXJpYWRpY3MKICBlbGxpcHNpcyBpbiBhIG1hY3JvIGRlZmluaXRpb246CiAgICAjZGVmaW5lIGNhdF9pKGEsIGIsIGMsIGQsIGUgLi4uKSBhICMjIGIgIyMgYyAjIyBkICMjIGUgCi0gRml4ZWQgYSBidWcgaW4gdGhlIHN0cmluZ2l6ZSBjb2RlLCB3aGVyZSBhbiBlbGxpcHNpcyB0byBzdHJpbmdpemUgcmVzdWx0ZWQgaW4KICBzdHJpbmdpemluZyBvZiB0aGUgZmlyc3QgZWxsaXBzaXMgcGFyYW1ldGVyIG9ubHkuIFByZXNlcnZlZCB0aGUgb3JpZ2luYWwgCiAgd2hpdGVzcGFjZSBkZWxpbWl0aW5nIGluIGJldHdlZW4gdGhlIGVsbGlwc2lzIGFyZ3VtZW50cy4KLSBJbnRyb2R1Y2VkIHRoZSB3YXZlOjpsYW5ndWFnZV9zdXBwb3J0IGVudW0gZm9yIGNvbnZlbmllbnQgc3dpdGNoaW5nIG9mIHRoZSAKICBzdXBwb3J0ZWQgbGFuZ3VhZ2UgZmVhdHVyZXMgdGhyb3VnaG91dCB0aGUgbGlicmFyeS4KLSBGaXhlZCBhIGJ1Zywgd2hpY2ggcHJldmVudGVkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBwcmVkZWZpbmVkIG1hY3JvIAogIF9fV0FWRV9IQVNfVkFSUklBRElDU19fLCBpZiAtLXZhcmlhZGljcyB3ZXJlIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgClR1ZSBNYXkgIDYgMTU6NDk6NDUgICAgIDIwMDMKLSBNYWRlIHByZWRlZmluZWQgbWFjcm9zIGF2YWlsYWJsZSBhdCBldmVyeSBtYWNybyBzY29wZSB3aXRob3V0IHF1YWxpZmljYXRpb24uCi0gUHJlZGVmaW5lZCBhIG5ldyBtYWNybyBpbiBDKysweCBtb2RlOiBfX1NURENfR0xPQkFMX18sIHdoaWNoIGlzIGRlZmluZWQgYXQgCiAgZ2xvYmFsIG1hY3JvIHNjb3BlIG9ubHkgYW5kIGVxdWFscyB0byAnMScgKGludGVnZXIgbGl0ZXJhbCkuCi0gSW4gQysrMHggbW9kZSB0aGVyZSBhcmUgdHdvIG5ldyBwcmVkZWZpbmVkIG1hY3JvczogCiAgICBfX1NDT1BFX186ICAgICAgZXhwYW5kcyB0byB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgCiAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtYWNybyBzY29wZQogICAgX19GVUxMX1NDT1BFX186IGV4cGFuZHMgdG8gdGhlIGZ1bGwgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGN1cnJlbnQgbWFjcm8gCiAgICAgICAgICAgICAgICAgICAgc2NvcGUgCiAgICAKTW9uIE1heSAgNSAyMzowMjo0OCAgICAgMjAwMwotIEZpeGVkIGEgcHJvYmxlbSBpbiB0aGUgbmV3IHdlbGwgZGVmaW5lZCB0b2tlbiBwYXN0aW5nIGNvZGUsIHdoaWNoIG9jY3VyZWQgZm9yCiAgY29uc3RydWN0cyBsaWtlIHRoZSBmb2xsb3dpbmc6CiAgICAjZGVmaW5lIGlzX2VtcHR5KC4uLikgaXNfZW1wdHlfICMjIF9fVkFfQVJHU19fICMjIF9vdGhlcgogIGkuZS4gd2hlcmUgdHdvIG9yIG1vcmUgJyMjJyBvcGVyYXRvcnMgd2VyZSBjb250YWluZWQgaW4gdGhlIHJlcGxhY2VtZW50IHRleHQuCi0gSW1wbGVtZW50ZWQgX19jb21tYV9fLCBfX2xwYXJlbl9fIGFuZCBfX3JwYXJlbl9fIGFsdGVybmF0aXZlIHBwLXRva2Vucywgd2hpY2ggCiAgbWF5IGJlIHVzZWQgYXMgdGhlICcsJywgJygnIGFuZCAnKScgdG9rZW5zIGR1cmluZyBwcmVwcm9jZXNzaW5nLiBUaGVzZSBhcmUgCiAgb25seSBjb252ZXJ0ZWQgdG8gdGhlcmUgcmVzcGVjdGl2ZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gaW4gYSBzcGVjaWFsIAogIHRyYW5zbGF0aW9uIHBoYXNlIGFmdGVyIHByZXByb2Nlc3NpbmcuIFRoaXMgd2FzIHByb3Bvc2VkIGJ5IFZlc2EgS2Fydm9uZW4uCi0gQ2hhbmdlZCB0aGUgbWFjcm8gc2NvcGluZyBydWxlcyB0bzogIklmIGEgcXVhbGlmaWVkIG5hbWUgZG9lcyBub3QgZmluZCBhIAogIG5lc3RlZCBuYW1lLCBpdCBpcyBub3QgYSBxdWFsaWZpZWQgbmFtZSB0byB0aGUgcHJlcHJvY2Vzc29yLiIgVGhpcyBzZWVtcyB0byAKICBiZSB0aGUgc2ltcGxlc3QgdXNhYmxlIHNvbHV0aW9uIGZvciB0aGUgcG9zc2libGUgYW1iaWd1aXRpZXMuCi0gRml4ZWQgYSBidWcgaW4gdGhlIG1hY3JvIGV4cGFuc2lvbiBlbmdpbmUgaW4gQysrMHggbW9kZSwgd2hlcmUgdGhlIHNraXBwaW5nIAogIG9mIHdoaXRlc3BhY2UgaW5zaWRlIG9mIGEgcXVhbGlmaWVkIG5hbWUgd2Fzbid0IGNvbnNpc3RlbnQuCgpTdW4gTWF5ICA0IDEwOjQ4OjUzICAgICAyMDAzCi0gRml4ZWQgYSBidWcgaW4gdGhlIGV4cHJlc3Npb24gZ3JhbW1hciwgd2hpY2ggcHJldmVudGVkICdub3QnIHRvIGJlIHJlY29nbml6ZWQKICBhcyBhIHZhbGlkIG9wZXJhdG9yLgotIFF1YWxpZmllZCBuYW1lcyBhcmUgbm93IHN1cHBvcnRlZCBhcyBwYXJhbWV0ZXJzIHRvICNpZmRlZiBhbmQgI2lmbmRlZiB0b28uCi0gUmVtb3ZlIG9uZSBzcGVjaWFsaXphdGlvbiBvZiB0aGUgbWFjcm8gZXhwYW5zaW9uIGVuZ2luZS4gSXQgZ2V0cyBpbnN0YW50aWF0ZWQKICBvbmx5IHR3aWNlIG5vdyAoZm9yIHRoZSBtYWluIGlucHV0IGl0ZXJhdG9yIGFuZCBmb3IgbGlzdDw+J3MgIG9mIHRva2Vucy4KLSBTaW1wbGlmaWVkIHRoZSByZXF1aXJlZCBleHBsaWNpdCBzcGVjaWFsaXphdGlvbiBvZiB0aGUgZGVmaW5lZF9ncmFtbWFyCiAgdGVtcGxhdGUuIEl0IGhhcyB0byBiZSBleHBsaWNpdGVseSBpbnN0YW50aWF0ZWQgYnkgcHJvdmlkaW5nIHRoZSB0b2tlbiB0eXBlCiAgb25seSAoanVzdCBhcyBmb3IgdGhlIGV4cGxpY2l0IGluc3RhbnRpYXRpb25zIG9mIHRoZSBvdGhlciBncmFtbWFycykuCgpGcmkgTWF5ICAyIDIyOjQ0OjI3ICAgICAyMDAzCi0gUXVhbGlmaWVkIG5hbWVzIGFyZSBub3cgYWxsb3dlZCBhcyBwYXJhbWV0ZXJzIHRvIHRoZSBvcGVyYXRvciBkZWZpbmVkKCkgaW4gCiAgQysrMHggbW9kZS4KLSBTZXBhcmF0ZWQgdGhlIGRlZmluZWQoKSBmdW5jdGlvbmFsaXR5IGludG8gYSBzZXBhcmF0ZSB0cmFuc2xhdGlvbiB1bml0IHRvIAogIHdvcmsgYXJvdW5kIGEgVkM3LjEgSUNFLgogIApGcmkgTWF5ICAyIDE1OjM4OjI2ICAgICAyMDAzCi0gVGhlIEMrKzB4IG1vZGUgbm93IGhhcyBhIHNwZWNpYWwgc2V0IG9mIHByZWRlZmluZWQgbWFjcm9zLgotIFRoZSBwcmVkZWZpbmVkIG1hY3JvIF9fV0FWRV9IQVNfVkFSSUFESUNTX18gaXMgbm93IGRlZmluZWQgaW4gQzk5IGFuZCBDKysweCAKICBtb2RlcyB0b28gKC0tdmFyaWFkaWNzIGlzIGltcGxpZWQgZm9yIHRoZXNlIG1vZGVzKS4KLSBVcGRhdGVkIHRoZSBkb2N1bWVudGF0aW9uIHRvIHJlZmxlY3QgdGhlIHJlY2VudCBjaGFuZ2VzIGFuZCBhZGRpdGlvbnMuCi0gSW4gQysrMHggbW9kZSBXYXZlIG5vdyBzdXBwb3J0cyBtYWNybyBzY29wZXM6CiAgICAtIG5ldyBrZXl3b3JkcyAjcmVnaW9uLyNlbmRyZWdpb24vI2ltcG9ydAogICAgLSBxdWFsaWZpZWQgbWFjcm8gbmFtZXMKLSBJbiBDKysweCBtb2RlIFdhdmUgbm93IHN1cHBvcnRzIHRva2VuIHBhc3Rpbmcgb2YgdW5yZWxhdGVkIHRva2Vucy4gVGhlc2UgYXJlCiAgY29uY2F0ZW5hdGVkLCB0aGUgcmVzdWx0IGlzIHJlLXRva2VuaXplZCBhbmQgaW5zZXJ0ZWQgaW50byB0aGUgb3V0cHV0IHN0cmVhbS4KLSBGaXhlZCBhIG1pbm9yIGJ1ZyBpbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGVuZ2luZSwgaWYgYSBxdWFsaWZpZWQgZnVuY3Rpb24tbGlrZQogIG1hY3JvIHdhcyBmb3VuZCBpbiBhbiBvYmplY3QtbGlrZSBjb250ZXh0LgotIEZpeGVkIGFuIGlzc3VlIHdpdGggd2VsbCBkZWZpbmVkIHRva2VuIHBhc3Rpbmcgb2YgdW5yZWxhdGVkIHRva2Vucy4KClR1ZSBBcHIgMjkgMDg6NDc6MzcgICAgIDIwMDMKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGVuZ2luZSwgd2hpY2ggcHJldmVudGVkIHRoZSBleHBhbnNpb24gCiAgb2YgYSBjZXJ0YWluIG1hY3JvIHVuZGVyIHNwZWNpZmljIGNvbmRpdGlvbnMgKGlmIHRoZSBsZWZ0IG9mIHR3byB0b2tlbnMgdG8gCiAgY29uY2F0ZW5hdGUgd2VyZSBhIGRpc2FibGVkIG9uZSAoVF9OT05SRVBMQUNBQkxFX0lERU5USUZJRVIpLCB0aGVuIHRoZSAKICByZXN1bHRpbmcgdG9rZW4gd2FzIGRpc2FibGVkIHRvbykuCi0gQWRkZWQgYWRkaXRpb25hbCBkaWFnbm9zdGljcyB0byB0aGUgV2F2ZSBkcml2ZXIgdG8gZGlzYW1iaWd1YXRlIHRoZSBDOTkgYW5kIAogIEMrKzB4IG1vZGVzLgotIEltcGxlbWVudGVkIGEgbmV3IEFQSSBmdW5jdGlvbiBhbmQgYSBjb3JyZXNwb25kaW5nIFdhdmUgZHJpdmVyIGNvbW1hbmQgbGluZQogIG9wdGlvbiwgd2hpY2ggYWxsb3dzIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgaW5jbHVkZSBmaWxlcyB0byBiZSBwcmVwcm9jZXNzZWQKICBiZWZvcmUgdGhlIHJlZ3VsYXIgZmlsZSBpcyBwcmVwcm9jZXNzZWQgKHRoZSBmaWxlcyBhcmUgcHJvY2Vzc2VkIGFzIG5vcm1hbAogIGlucHV0IGFuZCBhbGwgdGhlIHJlc3VsdGluZyBvdXRwdXQgaXMgaW5jbHVkZWQsIGJlZm9yZSBwcm9jZXNzaW5nIHRoZSByZWd1bGFyIAogIGlucHV0IGZpbGUpLiBUaGUgV2F2ZSBkcml2ZXIgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyAtLWZvcmNlaW5jbHVkZSAoLUYpLgotIFdhdmUgbm93IGNvbXBpbGVzIHRoZSBPcmRlciBsaWJyYXJ5IGZyb20gVmVzYSBLYXJ2b25lbi4KICAKTW9uIEFwciAyOCAwNzo1NzoxMCAgICAgMjAwMwotIEZpeGVkIGEgYnVnIGluIHRoZSBtYWNybyBleHBhbnNpb24gZW5naW5lLgotIFJlbW92ZWQgYSBsb3Qgb2YgKG5vdCBuZWVkZWQpIHdoaXRlc3BhY2UgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQgKGJ1dCBzdGlsbCAKICBub3Qgb3B0aW1hbCkuCgpTYXQgQXByIDI2IDIwOjMwOjUzICAgICAyMDAzCi0gRml4ZWQgYSBidWcgaW4gdGhlIGluaXRpYWxpemF0aW9uIGNvZGUgb2YgdGhlIFNsZXggbGV4ZXIgd2hpbGUgd29ya2luZyBpbiAKICBDOTkgbW9kZSAocmVwb3J0ZWQgYnkgUmVlY2UgRHVubikuCgpGcmkgQXByIDE4IDA4OjM3OjM1ICAgICAyMDAzCi0gRml4ZWQgdGhlIGhhbmRsaW5nIG9mIG9wdGlvbl92YWx1ZSdzIGluc2lkZSBvZiBwcmFnbWEgZGlyZWN0aXZlczoKICAgIF9QcmFnbWEoIndhdmUgb3B0aW9uKG9wdGlvbl92YWx1ZSkiKQogIGluc2lkZSB3aGljaCBhbGwgYWxsIHdoaXRlc3BhY2VzIHdlcmUgZGVsZXRlZC4KLSBTdGFydGVkIHRvIGltcGxlbWVudCBleHBlcmltZW50YWwgbWFjcm8gc2NvcGluZy4KClRodSBBcHIgMTAgMTA6MjA6MDcgICAgIDIwMDMKLSBGaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgI3ByYWdtYSB3YXZlIHN0b3AoKSwgd2hlcmUgb25seSB0aGUgZmlyc3QgdG9rZW4gCiAgaW5zaWRlIHRoZSBzdG9wIGRpcmVjdGl2ZSB3YXMgb3V0cHV0LCB3aGVuIHRoZSBwcmVwcm9jZXNzb3Igc3RvcHMgaW4gcmVzdWx0CiAgb2YgdGhpcyBwcmFnbWEuCi0gSW1wbGVtZW50ZWQgYSBuZXcgI3ByYWdtYSB3YXZlIHN5c3RlbShjb21tYW5kKSwgd2hpY2ggc3Bhd25zIGEgbmV3IG9wZXJhdGlvbgogIHN5c3RlbSBjb21tYW5kIGV4YWN0bHkgYXMgc3BlY2lmaWVkIGluc2lkZSB0aGUgc3lzdGVtIGRpcmVjdGl2ZSwgaW50ZXJjZXB0cwogIHRoZSBzdGRvdXQgb3V0cHV0IG9mIHRoaXMgcHJvY2VzcywgcmV0b2tlbml6ZXMgdGhpcyBvdXRwdXQgYW5kIGluc2VydHMgdGhlCiAgZ2VuZXJhdGVkIHRva2VuIHNlcXVlbmNlIGluIHBsYWNlIG9mIHRoZSBvcmlnaW5hbCAjcHJhZ21hIG9yIG9wZXJhdG9yIF9QcmFnbWEuCiAgUGxlYXNlIG5vdGUgdGhhdCB0aGUgZ2VuZXJhdGVkIG91dHB1dCBpcyBfbm90XyBzdWJqZWN0IHRvIGFueSBtYWNybyBleHBhbnNpb24KICBiZWZvcmUgaXRzIGluc2VydGlvbiBhcyB0aGUgcmVwbGFjZW1lbnQgb2YgdGhlIHByYWdtYSBpdHNlbGYuIElmIHlvdSBuZWVkIHRvIAogIG1hY3JvIGV4cGFuZCB0aGUgcmVwbGFjZW1lbnQgdGV4dCwgeW91IGFsd2F5cyBtYXkgZm9yY2UgdGhpcyBieSB3cml0aW5nOgogICAgI2RlZmluZSBTQ0FOKHgpIHgKICAgIFNDQU4oX1ByYWdtYSgid2F2ZSBzeXN0ZW0oLi4uKSIpKQogIHdoaWNoIHJlLXNjYW5zIHRoZSByZXBsYWNlbWVudCBvbmNlLgotIFJlcGxhY2VkIHRoZSBXYXZlIHBvc2l0aW9uX2l0ZXJhdG9yIHdpdGggdGhlIGJvb3N0OjpzcGlyaXQ6OnBvc2l0aW9uX2l0ZXJhdG9yCiAgKHdpdGhvdXQgYW55IHByb2JsZW1zISkuCiAgCk1vbiBBcHIgIDcgMTA6NDU6MzAgICAgIDIwMDMKLSBGaXhlZCBtYWNyb190cmFjZV9wb2xpY2llczo6ZXhwYW5kX29iamVjdF9saWtlX21hY3JvIG5vdCB0byBiZSBjYWxsZWQgd2l0aCAKICB0aGUgZm9ybWFsIGFyZ3VtZW50cyBhcyBvbmUgb2YgaXRzIHBhcmFtZXRlcnMuCi0gVXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbiB0byByZWZsZWN0IHRoZSBjaGFuZ2VzIG5lZWRlZCBmb3IgdGhlIHRyYWNpbmcgCiAgc3R1ZmYuCiAgCk1vbiBNYXIgMzEgMTk6MDc6MDUgICAgIDIwMDMKLSBGaXhlZCB2YXJpYWRpY3Mgc3VwcG9ydCBpbiB0aGUgdHJhY2Ugb3V0cHV0LgotIEZpeGVkIHByZXByb2Nlc3Npbmcgb2Ygb3BlcmF0b3IgX1ByYWdtYSgpIGJlZm9yZSBpdCdzIGV4ZWN1dGlvbi4KLSBBZGRlZCBfUHJhZ21hKCJ3YXZlIHN0b3AoZXJybXNnKSIpICgjcHJhZ21hIHdhdmUgc3RvcChlcnJtc2cpKSB0byBhbGxvdyAKICBkaWFnbm9zdGljcyBvdXRwdXQgZnJvbSBpbnNpZGUgbWFjcm8gZXhwYW5zaW9uLgotIEZpeGVkIG9wZXJhdG9yIF9QcmFnbWEgZm9yIHVua25vd24gcHJhZ21hcyAodGhlc2UgYXJlIHNpbXBseSBwdXQgdGhyb3VnaCB0bwogIHRoZSBvdXRwdXQpLgotIEltcGxlbWVudGVkIGEgbWF4aW1hbCBwb3NzaWJsZSBpbmNsdWRlIG5lc3RpbmcgZGVwdGggdG8gYXZvaWQgYW4gb3V0IG9mIAogIG1lbW9yeSBlcnJvci4gVGhlIGluaXRpYWwgdmFsdWUgZm9yIHRoaXMgaXMgY29uZmlndXJhYmxlIHRocm91Z2ggdGhlIGNvbXBpbGUgCiAgdGltZSBjb25zdGFudCBXQVZFX01BWF9JTkNMVURFX0xFVkVMX0RFUFRILCB3aGljaCBkZWZhdWx0cyB0byAxMDI0LCBpZiBub3QgCiAgZ2l2ZW4uCiAgQWRkaXRpb25hbGx5IHRoaXMgbWF5IGJlIGVubGFyZ2VkIHRocm91Z2ggYSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbjoKICAtbi8tLW5lc3RpbmcgKFdhdmUgZHJpdmVyIG9ubHkpLgoKU3VuIE1hciAzMCAyMDo0MDoxNyAgICAgMjAwMwotIEltcGxlbWVudGVkIHRoZSBwcmVkZWZpbmVkIG1hY3JvIF9fSU5DTFVERV9MRVZFTF9fLCB3aGljaCBleHBhbmRzIHRvIGEgCiAgZGVjaW1hbCBpbnRlZ2VyIGNvbnN0YW50IHRoYXQgcmVwcmVzZW50cyB0aGUgZGVwdGggb2YgbmVzdGluZyBpbiBpbmNsdWRlIAogIGZpbGVzLiBUaGUgdmFsdWUgb2YgdGhpcyBtYWNybyBpcyBpbmNyZW1lbnRlZCBvbiBldmVyeSAnI2luY2x1ZGUnIGRpcmVjdGl2ZSAKICBhbmQgZGVjcmVtZW50ZWQgYXQgZXZlcnkgZW5kIG9mIGZpbGUuIAotIEltcGxlbWVudGVkIHRoZSBvcGVyYXRvciBfUHJhZ21hKCkuIEl0IGlzIHJlY29nbml6ZWQgaW4gQzk5IG1vZGUgYW5kIHdoZW5ldmVyIAogIHZhcmlhZGljcyBhcmUgZW5hYmxlZC4KICAKU3VuIE1hciAzMCAwODozMDoxMiAgICAgMjAwMwotIENoYW5nZWQgdGhlIHRyYWNpbmcgZm9ybWF0IHRvIGJlIG1vcmUgcmVhZGFibGUuCi0gQ2hhbmdlZCB0aGUgdHJhY2luZyAjcHJhZ21hJ3MgdG8KICAgIGVuYWJsZSB0cmFjaW5nOiAgICAgI3ByYWdtYSB3YXZlIHRyYWNlKGVuYWJsZSkKICAgIGRpc2FibGUgdHJhY2luZzogICAgI3ByYWdtYSB3YXZlIHRyYWNlKGRpc2FibGUpCiAgb3IKICAgIGVuYWJsZSB0cmFjaW5nOiAgICAgI3ByYWdtYSB3YXZlIHRyYWNlKDEpCiAgICBkaXNhYmxlIHRyYWNpbmc6ICAgICNwcmFnbWEgd2F2ZSB0cmFjZSgwKQotIENoYW5nZWQgdGhlIHNlbWFudGljcyBvZiB0aGUgLXQgKC0tdHJhY2V0bykgc3dpdGNoLiBXaXRob3V0IGFueSAtdCBzd2l0Y2ggCiAgdGhlcmUgaXNuJ3QgZ2VuZXJhdGVkIGFueSB0cmFjZSBvdXRwdXQgYXQgYWxsLCBldmVuLCBpZiB0aGUgY29ycmVzcG9uZGluZwogICNwcmFnbWEgZGlyZWN0aXZlcyBhcmUgZm91bmQuIFRvIG91dHB1dCB0aGUgdHJhY2UgaW5mbyB0byBhIGZpbGUsIHRoZSAKICAnLXQgZmlsZScgc3ludGF4IG1heSBiZSB1c2VkLCB0byBvdXRwdXQgdG8gc3RkOjpjZXJyLCB0aGUgJy10LScgKG9yICctdCAtJykKICBzeW50YXggbWF5IGJlIHVzZWQuCgpGcmkgTWFyIDI4IDE3OjI3OjI1ICAgICAyMDAzCi0gQWRkZWQgYSBuZXcgdGVtcGxhdGUgcGFyYW1ldGVyIHRvIHRoZSB3YXZlOjpjb250ZXh0PD4gb2JqZWN0LCB3aGljaCBhbGxvd3MKICB0byBzcGVjaWZ5IGEgcG9saWN5IGZvciBjb250cm9sbGluZyB0aGUgbWFjcm8gZXhwYW5zaW9uIHRyYWNpbmcuIFRoZSBkZWZhdWx0CiAgbWFjcm9fdHJhY2VfcG9saWN5IGRvZXMgbm8gdHJhY2luZyBhdCBhbGwuIFRoaXMgd2F5IG9uZSBjYW4gYWRkIHNwZWNpZmljCiAgbWFjcm8gZXhwYW5zaW9uIHRyYWNpbmcgZmFjaWxpdGllcyB0byB0aGUgbGlicmFyeS4KLSAjcHJhZ21hIGRpcmVjdGl2ZXMgc3RhcnRpbmcgd2l0aCBhIFNUREMgaWRlbnRpZmllciBhcmUgbm8gbG9uZ2VyIG5vdCBtYWNybyAKICBleHBhbmRlZCBpbiBDKysgbW9kZSwgaW4gQysrIG1vZGUgdGhlc2UgYXJlIG5vdyBleHBhbmRlZCBhcyB1c3VhbCwgaW4gQzk5IAogIG1vZGUgbm90LgotIFRoZSB0cmFjaW5nIGNhbiBiZSBlbmFibGVkL2Rpc2FibGVkIGZyb20gaW5zaWRlIHRoZSBwcmVwcm9jZXNzZWQgc3RyZWFtIGJ5CiAgaW5zZXJ0aW5nIGEgc3BlY2lhbCAjcHJhZ21hIGRpcmVjdGl2ZToKICAgIGVuYWJsZSB0cmFjaW5nOiAgICAgI3ByYWdtYSB3YXZlX29wdGlvbih0cmFjZTogZW5hYmxlKQogICAgZGlzYWJsZSB0cmFjaW5nOiAgICAjcHJhZ21hIHdhdmVfb3B0aW9uKHRyYWNlOiBkaXNhYmxlKQotIFRoZSBXYXZlIGRyaXZlciBub3cgYWxsb3dzIHRvIHNwZWNpZnkgYSBkZXN0aW5hdGlvbiBmb3IgdGhlIG1hY3JvIGV4cGFuc2lvbiAKICB0cmFjaW5nIHRyb3VnaCBhIG5ldyBjb21tYW5kIGxpbmUgc3dpdGNoOiAnLXQgcGF0aCcgb3IgJy0tdHJhY2V0byBwYXRoJy4gSWYKICB0aGlzIG9wdGlvbiBpc24ndCBnaXZlbiwgdGhlIHRyYWNlIG91dHB1dCBnb2VzIHRvIHN0ZGVyci4KLSBUaGUgV2F2ZSBkcml2ZXIgbm93IGFsbG93cyB0byBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBmaWxlLCB3aGVyZSB0aGUgCiAgcHJlcHJvY2Vzc2VkIHJlc3VsdCBzdHJlYW0gaXMgdG8gYmUgc2F2ZWQ6ICctbyBwYXRoJyBvciAnLS1vdXRwdXQgcGF0aCcuIElmIAogIHRoaXMgb3B0aW9uIGlzIG5vdCBnaXZlbiwgdGhlIG91dHB1dCBnb2VzIHRvIHN0ZG91dC4KICAKV2VkIE1hciAyNiAyMDozOToxMSAgICAgMjAwMwotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGFsdGVybmF0aXZlIHRva2VucyAoYXMgJ2FuZCcsICdvcicgZXRjLikgYW5kIHRyaWdyYXBoCiAgdG9rZW5zLCB3aGljaCB3ZXJlIG5vdCBjb3JyZWN0bHkgcmVjb2duaXplZCBpbnNpZGUgI2lmLyNlbGlmIGV4cHJlc3Npb25zLgotIEFsdGVybmF0aXZlIHRva2VucyAoJ2FuZCcsICdvcicgZXRjLikgYXJlIG5vIGxvbmdlciBzdWJqZWN0IHRvIGEgcG9zc2libGUgCiAgbWFjcm8gcmVkZWZpbml0aW9uLgotIEZpeGVkIHRoZSBzcGVjaWFsIGhhbmRsaW5nIG9mICd0cnVlJyBhbmQgJ2ZhbHNlJyBkdXJpbmcgdGhlIG1hY3JvIGV4cGFuc2lvbiAKICBvZiAjaWYvI2VsaWYgZXhwcmVzc2lvbnMuCgpUdWUgTWFyIDI1IDEyOjEyOjM1ICAgICAyMDAzCi0gUmVsZWFzZWQgV2F2ZSBWMC45LjEKCk1vbiBNYXIgMjQgMTM6MzQ6MjcgICAgIDIwMDMKLSBJbXBsZW1lbnRlZCBwbGFjZW1hcmtlcnMsIGkuZS4gV2F2ZSBub3cgc3VwcG9ydHMgZW1wdHkgYXJndW1lbnRzIGR1cmluZyBtYWNybyAKICBpbnZvY2F0aW9ucy4gVGhpcyBtdXN0IGJlIGVuYWJsZWQgYnkgbWVhbnMgb2YgYSBuZXcgcHAgY29uc3RhbnQ6CiAgV0FWRV9TVVBQT1JUX1ZBUklBRElDU19QTEFDRU1BUktFUlMgd2hpY2ggbXVzdCBiZSBkZWZpbmVkIHRvIGVuYWJsZSB0aGUgCiAgcGxhY2VtYXJrZXIgYW5kIHZhcmlhZGljcyBjb2RlIGFuZCBieSBkZWZpbmluZyB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiAKICAnLS12YXJpYWRpY3MnIChXYXZlIGRyaXZlciBvbmx5KS4KLSBJbXBsZW1lbnRlZCB2YXJpYWRpY3MsIGkuZS4gV2F2ZSBub3cgc3VwcG9ydHMgbWFjcm9zIHdpdGggdmFyaWFibGUgcGFyYW1ldGVyIAogIGNvdW50cy4gVGhpcyBtdXN0IGJlIGVuYWJsZWQgYnkgbWVhbnMgb2YgdGhlIHBwIGNvbnN0YW50OgogIFdBVkVfU1VQUE9SVF9WQVJJQURJQ1NfUExBQ0VNQVJLRVJTIHdoaWNoIG11c3QgYmUgZGVmaW5lZCB0byBlbmFibGUgdGhlIAogIHBsYWNlbWFya2VyIGFuZCB2YXJpYWRpY3MgY29kZSBhbmQgYnkgZGVmaW5pbmcgdGhlIGNvbW1hbmQgbGluZSBvcHRpb24gCiAgJy0tdmFyaWFkaWNzJyAoV2F2ZSBkcml2ZXIgb25seSkuCi0gSW1wbGVtZW50ZWQgYSBDOTkgbW9kZS4gVGhpcyBtb2RlIGVuYWJsZXMgdmFyaWFkaWNzIGFuZCBwbGFjZW1hcmtlcnMgYnkgCiAgZGVmYXVsdCBhbmQgcmVqZWN0cyBzb21lIHNwZWNpZmljIEMrKyB0b2tlbnMgKGFzIHRoZSBhbHRlcm5hdGUga2V5d29yZHMgYW5kIAogICc6OicsICctPionLCAnLionKS4gVGhpcyBtb2RlIG11c3QgYmUgZW5hYmxlZCBieSB0aGUgbWVhbnMgb2YgdGhlIHBwIGNvbnN0YW50CiAgV0FWRV9TVVBQT1JUX1ZBUklBRElDU19QTEFDRU1BUktFUlMgKHNlZSBhYm92ZSkuIFRoZSBDOTkgbW9kZSBpcyBlbmFibGVkIGJ5IAogIHRoZSBjb21tYW5kIGxpbmUgc3dpdGNoICctLWM5OScgKFdhdmUgZHJpdmVyIG9ubHkpLgogIFRoaXMgaW52b2x2ZWQgc29tZSBjaGFuZ2VzIGluIHRoZSBDOTkvQysrIGxleGVycy4KICAKRnJpIE1hciAyMSAxNjowMjoxMCAgICAgMjAwMwotIEZpeGVkIGEgYnVnIGluIHRoZSBtYWNybyBleHBhbnNpb24gZW5naW5lLCB3aGljaCBwcmV2ZW50ZWQgdGhlIGV4cGFuc2lvbiBvZgogIG1hY3Jvcywgd2hpY2ggbmFtZSB3YXMgY29uY2F0ZW5hdGVkIG91dCBvZiBhIGlkZW50aWZpZXIgYW5kIGEgaW50ZWdlciAKICBmb2xsb3dlZCBkaXJlY3RseSBieSBhbm90aGVyIGlkZW50aWZpZXI6CiAgICAjZGVmaW5lIFgoKSBYXyAjIyAwUigpICAvLyBub3RlOiBfemVyb18gZm9sbG93ZWQgYnkgJ1InCiAgICAjZGVmaW5lIFhfMFIoKSAuLi4KICAgIFgoKSAvLyBleHBhbmRlZCB0bzogIFhfMFIoKSwgYnV0IHNob3VsZCBleHBhbmQgdG8gLi4uCiAgVGhpcyBpcyBhIHByb2JsZW0gcmVzdWx0aW5nIGZyb20gdGhlIGZhY3QsIHRoYXQgdGhlIFN0YW5kYXJkIHJlcXVpcmVzIHRoZSAKICBwcmVwcm9jZXNzb3IgdG8gYWN0IG9uIHNvIGNhbGxlZCBwcC10b2tlbnMsIGJ1dCBXYXZlIGFjdHMgb24gQysrIHRva2Vucy4KICAKVGh1IE1hciAyMCAyMTozOToyMSAgICAgMjAwMwotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGV4cHJlc3Npb24gcGFyc2luZyAoI2lmLyNlbGlmIGNvbnN0YW50IGV4cHJlc3Npb25zKSwgCiAgd2hpY2ggZmFpbGVkIHRvIHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBmb3IgZXhwcmVzc2lvbnMgbGlrZQogICAgI2lmIDEgMiAzIDQgNQogIGkuZS4gd2hlcmUgdGhlIHRva2VuIHNlcXVlbmNlIHN0YXJ0cyB3aXRoIGEgdmFsaWQgY29uc3RhbnQgZXhwcmVzc2lvbiwgYnV0IAogIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpbmUgY29udGFpbmVkIG90aGVyIHRva2VucyB0aGFuIHdoaXRlc3BhY2UuCi0gSW50ZWdyYXRlZCB0aGUgZmxleF9zdHJpbmcgY2xhc3MgZnJvbSBBbmRyZWkgQWxleGFuZHJlc2N1IChwdWJsaXNoZWQgb24gdGhlCiAgQ1VKIHNpdGUpIHRvIGdldCBDT1ctc3RyaW5nIGJlaGF2aW91ciBmb3IgdGhlIHRva2VuIHZhbHVlcyBhbmQgcG9zaXRpb24gCiAgZmlsZW5hbWUgc3RyaW5ncy4gVGhpcyByZXN1bHRlZCBpbiBhIG1ham9yIG92ZXJhbGwgc3BlZWR1cCAoYWJvdXQgMi0zIHRpbWVzIAogIGZhc3RlciBpbiBkZXBlbmRlbmN5IG9mIHRoZSBjb21wbGV4aXR5IG9mIHBwIHVzYWdlIGluIHRoZSBpbnB1dCBzdHJlYW0pLgotIEZpeGVkIGEgYnVnLCB3aGljaCByZXBvcnRlZCBpbGwgZm9ybWVkICNpZi8jZWxzZSBleHByZXNzaW9ucyBhcyBlcnJvcnMsIGV2ZW4gCiAgaWYgdGhlIGN1cnJlbnQgaWYgYmxvY2sgc3RhdHVzIChjb25kaXRpb25hbCBjb21waWxhdGlvbiBzdGF0dXMpIGlzIGZhbHNlLgotIEFkZGVkIGEgd2FybmluZywgaWYgdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUgZG9lcyBub3QgZW5kIHdpdGggYSBuZXdsaW5lLgotIEltcHJvdmVkIGVycm9yIHJlY29nbml0aW9uIGFuZCBoYW5kbGluZyBmb3IgbWFsZm9ybWVkIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzCgpNb24gTWFyIDE3IDE5OjUzOjI5ICAgICAyMDAzCi0gRml4ZWQgYSBjb25jYXRlbmF0aW9uIHByb2JsZW06IGNvbnN0cnVjdHMgbGlrZSBhIyNiIyNjIHdoZXJlIGV4cGFuZGVkIAogIGluY29ycmVjdGx5LgotIE9wdGltaXplZCB0aGUgcmVjb2duaXRpb24gb2YgcHAgZGlyZWN0aXZlczogCiAgICAtIHRoZSBwYXJzZXIgaXMgdXNlZCBvbmx5LCBpZiB0aGUgbmV4dCBub24td2hpdGVzcGFjZSB0b2tlbiBzdGFydHMgYSBwcCAKICAgICAgZGlyZWN0aXZlIAogICAgLSBudWxsIGRpcmVjdGl2ZXMgbm93IGFyZSByZWNvZ25pemVkIHdpdGhvdXQgY2FsbGluZyB0aGUgcGFyc2VyCiAgICAtIHRoZSBwYXJzZXIgaXNuJ3QgY2FsbGVkIGFueW1vcmUsIGlmIHRoZSBpZl9ibG9ja19zdGF0dXMgaXMgZmFsc2UgYW5kIG5vCiAgICAgIGNvbmRpdGlvbmFsIHBwIGRpcmVjdGl2ZSAoI2lmIGV0Yy4pIGlzIHRvIGJlIHJlY29nbml6ZWQuCiAgVGhlc2Ugb3B0aW1pemF0aW9ucyBnaXZlIGEgc3BlZWQgaW1wcm92ZW1lbnQgYnkgdXB0byA0MCUuCi0gUmVtb3ZlZCBhZGphY2VudCB3aGl0ZXNwYWNlIGR1cmluZyBtYWNybyBleHBhbnNpb24gKG5lZWRzIHRvIGJlIHJldmlzZWQsIAogIHNpbmNlIHRoZXJlIGlzIHNvbWUgd2hpdGVzcGFjZSBsZWZ0LCB3aGljaCBtYXkgYmUgcmVtb3ZlZCkKICAgIApTdW4gTWFyIDE2IDIzOjE5OjExICAgICAyMDAzCi0gRml4ZWQgYSBwcm9ibGVtIHdpdGggaW5jbHVkZSBwYXRocyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLCBpZiB0aGUgZmlsZQogIHRvIHByZXByb2Nlc3Mgd2FzIG5vdCBnaXZlbiBhcyBhIGZ1bGwgcGF0aCAoZHJpdmVyIGV4ZWN1dGFibGUpLgotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHBhdGggbmFtZXMgY29udGFpbmluZyBibGFua3MgKGRyaXZlciBleGVjdXRhYmxlKS4KLSBDbGVhbmVkIGNvbW1hbmQgbGluZSBhbmQgYXJndW1lbnQgaGFuZGxpbmcgKGRyaXZlciBleGVjdXRhYmxlKS4KLSBGaXhlZCBhIHNldmVyZSBtZW1vcnkgbGVhay4KLSBGaXhlZCBhIGJ1ZywgaWYgYSBDKysga2V5d29yZCB3YXMgdXNlZCBhcyBhIG1hY3JvIG5hbWUgb3IgbWFjcm8gcGFyYW1ldGVyIAogIG5hbWUsIHdoaWNoIHByZXZlbnRlZCB0aGUgbWFjcm8gcmVjb2duaXRpb24gYW5kIGV4cGFuc2lvbiB0byBmdW5jdGlvbiAKICBwcm9wZXJseS4KLSBJbXBsZW1lbnRlZCB0aGUgV0FWRV9TVVBQT1JUX01TX0VYVEVOU0lPTlMgY29tcGlsZXIgc3dpdGNoIGZvciB0aGUgcmUyYyAKICBnZW5lcmF0ZWQgbGV4ZXIgdG9vLgotIEZpeGVkIGEgcHJvYmxlbSwgd2hpY2ggY2F1c2VkIGFuIGludGVybmFsIFRfUExBQ0VIT0xERVIgdG9rZW4gdG8gc2hvdyB1cCAKICBvdXRzaWRlIHRoZSBtYWNybyByZXBsYWNlbWVudCBlbmdpbmUuCi0gRml4ZWQgYSBwcm9ibGVtIHdpdGggbWFjcm8gI2luY2x1ZGUgZGlyZWN0aXZlcywgd2hpY2ggcHJldmVudHMgdG8gZmluZCB0aGUgCiAgZmlsZSB0byBpbmNsdWRlLCBpZiBhZnRlciB0aGUgbWFjcm8gZXhwYW5zaW9uIHRoZSB0b2tlbiBzZXF1ZW5jZSByZXByZXNlbnRpbmcgCiAgdGhlIGZpbGVuYW1lIGJlZ2FuIG9yIGVuZGVkIHdpdGggYXQgbGVhc3Qgb25lIHdoaXRlc3BhY2UgdG9rZW4uCi0gRml4ZWQgYSBwcm9ibGVtLCB3aGljaCBjYXVzZWQgYSBmYWxzZSBlcnJvciBtZXNzYWdlIGlmIHRoZSAnIycgY2hhcmFjdGVyIHdhcwogIHRvIGJlIGNvbmNhdGVuYXRlZCB3aXRoIGFuIGFyYml0cmFyeSBvdGhlciB0b2tlbi4KLSBUaGUgY29uY2F0ZW5hdGlvbiBvZiBhIHdoaXRlc3BhY2UgdG9rZW4gd2l0aCBhbiBhcmJpdHJhcnkgb3RoZXIgdG9rZW4gd2FzIAogIHJlcG9ydGVkIGFzIGlsbGVnYWwgdG9rZW4gcGFzdGluZyAoYnV0IGl0IGlzIGNlcnRhaW5seSBub3QpLgogICAKU2F0IE1hciAxNSAyMTo0Mzo1NiAgICAgMjAwMwotIEFkZGVkIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciB0byB0aGUgd2F2ZTo6dXRpbDo6ZmlsZV9wb3NpdGlvbiB0ZW1wbGF0ZS4KLSBSZXBvcnQgdGhlIGNvbmNhdGVuYXRpb24gb2YgdW5yZWxhdGVkIHRva2VucyBhcyBhbiBlcnJvci4KLSBGaW5pc2hlZCB0aGUgZG9jdW1lbnRhdGlvbi4KCkZyaSBNYXIgMTQgMjA6MTQ6MTggICAgIDIwMDMKLSBNb3JlIHdvcmsgb24gZG9jdW1lbnRhdGlvbgotIENoYW5nZWQgZmlsZV9wb3NpdGlvbiB0byBleHBvc2UgYWNjZXNzb3IgZnVuY3Rpb25zICh0aGUgbWVtYmVyIHZhcmlhYmxlcyBhcmUKICBtYXJrZWQgYXMgcHJpdmF0ZSBub3cpLiBUaGlzIG9wZW5zIHVwIHRoZSBwb3NzaWJpbGl0eSB0byBwcm92aWRlIGFub3RoZXIgCiAgZmlsZV9wb3NpdGlvbiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggbWF5IGJlIG9wdGltaXplZCBpbiBzb21lIHdheS4KLSBGaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgdG9rZW4gbmFtZSB0YWJsZSwgdGhlIGFsdGVybmF0ZSBhbmQgdHJpZ3JhcGggdG9rZW4KICBuYW1lcyB3ZXJlIHByaW50ZWQgaW5jb3JyZWN0bHkuCi0gRml4ZWQgYSBidWcsIHdoaWNoIHByZXZlbnRlZCB0aGUgY29ycmVjdCByZWNvZ25pdGlvbiBvZiAnZGVmaW5lZCBYJyAod2l0aG91dCAKICBwYXJlbnRoZXNpc2VzKS4KLSBGaXhlZCBhIGJ1Zywgd2hpY2ggYWxsb3dlZCB0byByZWRlZmluZSBhbmQgdW5kZWZpbmUgdGhlIHByZWRlZmluZWQgbmFtZSAKICAnZGVmaW5lZCcuCi0gRml4ZWQgYSBidWcsIHdoaWNoIHByZXZlbnRzIHRoZSBjb3JyZWN0IHJlY29nbml0aW9uIG9mIGEgbWFjcm8gYmFzZWQgI2luY2x1ZGUgCiAgZGlyZWN0aXZlLCBpZiBpdCBleHBhbmRzIHRvIHNvbWV0aGluZyBsaWtlICNpbmNsdWRlIDwuLi4+LgotIEZpeGVkIGEgYnVnLCB3aGljaCBwcmV2ZW50ZWQgdGhlIHJlY29nbml0aW9uIG9mIGR1cGxpY2F0ZSBtYWNybyBwYXJhbWV0ZXIKICBuYW1lcy4KLSBSZW1vdmVkIHRoZSBpbnNlcnRpb24gb2YgYWRkaXRpb25hbCB3aGl0ZXNwYWNlIGluc2lkZSBvZiBzdHJpbmcgbGl0ZXJhbHMgCiAgKGR1cmluZyBzdHJpbmdpemluZykuCiAgCldlZCBNYXIgMTIgMTk6MTY6NDAgICAgIDIwMDMKLSBGaXhlZCBhIGJ1Zywgd2hpY2ggcHJldmVudGVkIHRoZSBpbnN0YW50aWF0aW9uIG9mIHRoZSB3YXZlOjpjb250ZXh0IG9iamVjdCAKICB3aXRoIGF1eGlsaWFyeSBpdGVyYXRvcnMuIFRoZSB0b2tlbiB0eXBlIGlzbid0IGNvdXBsZWQgYW55bW9yZSB3aXRoIHRoZSAKICBpdGVyYXRvciB0eXBlLgogIFRoaXMgcmVxdWlyZWQgc29tZSBjaGFuZ2VzIGluIHRoZSBpbnRlcmZhY2U6CiAgICAtIFRoZSB3YXZlOjpjb250ZXh0IG9iamVjdCBub3cgaGFzIHRocmVlIHRlbXBsYXRlIHBhcmFtZXRlcnMgKHRoZSBpdGVyYXRvcgogICAgICB0eXBlLCB0aGUgdG9rZW4gdHlwZSBhbmQgdGhlIGlucHV0IHBvbGljeSB0eXBlKQogICAgLSBUaGUgdG9rZW4gdHlwZSBkb2VzIG5vdCBoYXZlIHRoZSBpdGVyYXRvciB0eXBlIGFzIGl0J3MgdGVtcGxhdGUgcGFyYW1ldGVyCiAgICAgIGFueW1vcmUuCi0gSW1wbGVtZW50ZWQgYSBuZXcgcG9zaXRpb25faXRlcmF0b3IgdGVtcGxhdGUgb24gdG9wIG9mIHRoZSBpdGVyYXRvcl9hZGFwdG9yPD4KICB0ZW1wbGF0ZSB0byBtYWtlIGl0IHdvcmsgZXZlbiBmb3IgaW5wdXRfaXRlcmF0b3IgdHlwZSBpdGVyYXRvcnMuCi0gRml4ZWQgYSBidWcgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZm9yIHRoZSBTbGV4IGxleGVyLgotIFRoZSBmdW5jdGlvbiAnc2V0X3N5c19pbmNsdWRlX2RlbGltaXRlcigpJyB3YXMgcmVuYW1lZCB0byAKICAnc2V0X3N5c2luY2x1ZGVfZGVsaW1pdGVyKCknIHRvIGJldHRlciBmaXQgdGhlIG5hbWluZyBzY2hlbWUgb2YgdGhlIG90aGVyIAogIGZ1bmN0aW9ucy4KLSBXcm90ZSBtb3JlIGRvY3VtZW50YXRpb24KLSBVbmlmaWVkIHRoZSBkaWZmZXJlbnQgdG9rZW4gZGVmaW5pdGlvbnMgb2YgdGhlIGxleGVycywgc28gdGhhdCB0aGVyZSBpcyBvbmx5CiAgb25lIHRva2VuIHR5cGUgbGVmdC4gVGhpcyByZXF1aXJlZCBzb21lIGNoYW5nZXMgaW4gdGhlIGludGVyZmFjZToKICAgIC0gVGhlcmUgaXMgbm8gbmVlZCBhbnltb3JlIHRvIGV4cGxpY2l0bHkgc3BlY2lmeSB0aGUgbmFtZXNwYWNlIG9mIHRoZSB0b2tlbgogICAgICB0eXBlIHRvIHVzZS4KLSBBZGRlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiAtUCB0byB0aGUgV2F2ZSBkcml2ZXIgcHJvZ3JhbSwgd2hpY2ggcHJlZGVmaW5lcyAKICBhIG1hY3JvIChpLmUuIGRlZmluZXMgaXQgc3VjaCwgdGhhdCBpcyBfbm90XyB1bmRlZmluYWJsZSB0aHJvdWdoIGFuICN1bmRlZgogIGRpcmVjdGl2ZSBmcm9tIGluc2lkZSB0aGUgcHJlcHJvY2Vzc2VkIHByb2dyYW0pLgoKU2F0IE1hciAgOCAwNzo0Njo0MyAgICAgMjAwMwotIFJlbGVhc2VkIFdhdmUgMC45LjAKClRodSBNYXIgIDYgMjA6MDI6NDQgICAgIDIwMDMKLSBDb21waWxlZCBXYXZlIHdpdGggSW50ZWxWNy4wL0Rpbmt1bXdhcmVTVEwgKGZyb20gVkM2c3A1KQotIEZpeGVkIG5ldyBjb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIGdjYyAtV2FsbAotIEZpeGVkIHRoZSBsaXN0X2luY2x1ZGVzIGFuZCBjcHBfdG9rZW5zIHNhbXBsZXMgdG8gY29tcGlsZSBhbmQgbGluayBjb3JyZWN0bHkuCi0gRml4ZWQgYSBidWcsIHdoZXJlIGEgd3JvbmcgZmlsZW5hbWUgd2FzIHJlcG9ydGVkIGJ5IHRoZSBnZW5lcmF0ZWQgI2xpbmUgCiAgZGlyZWN0aXZlLgotIEZpeGVkIGEgYnVnLCB3aGVyZSB0aGUgX19GSUxFX18gbWFjcm8gd2FzIGV4cGFuZGVkIHdpdGhvdXQgJ1wiJyBhcm91bmQgdGhlCiAgZmlsZW5hbWUuCi0gVGhlIGdlbmVyYXRlZCAjbGluZSBkaXJlY3RpdmVzIGFuZCB0aGUgZXhwYW5kZWQgX19GSUxFX18gbWFjcm8gbm93IHJlcG9ydAogIHRoZSBmaWxlbmFtZSBpbiBhIG5hdGl2ZSAodG8gdGhlIHN5c3RlbSkgZm9ybWF0LiBBZGRpdGlvbmFsbHkgdGhlIGdlbmVyYXRlZAogIHN0cmluZyBsaXRlcmFscyBhcmUgbm93IGVzY2FwZWQgY29ycmVjdGx5LgoKV2VkIE1hciAgNSAyMToxMToxNCAgICAgMjAwMwotIFJlb3JnYW5pemVkIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIHRvIG1pcnJvciB0aGUgbmFtZXNwYWNlIHN0cnVjdHVyZSBvZiB0aGUKICBsaWJyYXJ5Ci0gRml4ZWQgYSBidWcsIHdoZXJlIHRoZSBjb21wbGV0ZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgZm91bmQgI2luY2x1ZGUgCiAgZGlyZWN0aXZlIHdlcmUgZWF0ZW4gdXAuCi0gRml4ZWQgYSBidWcsIHdoZXJlIHRoZSBfX0xJTkVfXyBtYWNybyBleHBhbmRlZCB0byBhIGluY29ycmVjdCBsaW5lbnVtYmVyLCBpZgogIHRoZSBfX0xJTkVfXyBtYWNybyB3YXMgZW5jb3VudGVyZWQgb24gYSBsaW5lIGFmdGVyIGEgJ1xcJyAnXG4nIHNlcXVlbmNlLgoKVHVlIE1hciAgNCAxMTo1MDoyNCAgICAgMjAwMwotIFRoZSBuZXcgbmFtZSBvZiB0aGUgcHJvamVjdCBpcyAnV2F2ZScuCi0gQWRqdXN0ZWQgbmFtZXNwYWNlcywgY29tbWVudHMgZXRjLiB0byByZWZsZWN0IHRoZSBuZXcgbmFtZS4KLSBBZGRlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiAtVSBbLS11bmRlZmluZV0sIHdoaWNoIGFsbG93cyB0byByZW1vdmUgb25lIG9mIAogIHRoZSBwcmVkZWZpbmVkIG1hY3JvcyAoZXhjZXB0IF9fTElORV9fLCBfX0ZJTEVfXywgX19EQVRFX18sIF9fVElNRV9fLCAKICBfX1NURENfXyBhbmQgX19jcGx1c3BsdXMpCgpTdW4gTWFyICAyIDIwOjEwOjA0ICAgICAyMDAzCi0gRml4ZWQgYSBidWcgd2hpbGUgZXhwYW5kaW5nIG1hY3JvcyB3aXRob3V0IGFueSBkZWZpbml0aW9uIHBhcnQgKGVtcHR5IG1hY3JvcykKLSBUaGUgcHAtaXRlcmF0b3Igd2lsbCBub3QgZW1pdCBhIG5ld2xpbmUgZm9yIGV2ZXJ5IHJlY29nbml6ZWQgcHJlcHJvY2Vzc2luZwogIGRpcmVjdGl2ZSBhbnltb3JlLiBUaGUgZ2VuZXJhdGVkIG91dHB1dCBpcyBtdWNoIG1vcmUgY29uZGVuc2VkIHRoaXMgd2F5LiAKLSBUaGUgcHAtaXRlcmF0b3Igbm93IGVtaXRzICNsaW5lIGRpcmVjdGl2ZXMgYXQgYXBwcm9wcmlhdGUgcGxhY2VzLgotIEFkZGVkIGFuIGFkZGl0aW9uYWwgcGFyc2VyIHRvIHRoZSBsaWJyYXJ5LCB3aGljaCBtYXkgYmUgdXNlZCB0byBwYXJzZSBtYWNyb3MKICBnaXZlbiBpbiB0aGUgY29tbWFuZCBsaW5lIHN5bnRheCwgaS5lLiBzb21ldGhpbmcgbGlrZSAnTUFDUk8oeCk9ZGVmaW5pdGlvbicuCi0gQWRkZWQgdGhlIHBvc3NpYmlsaXR5IHRvIHRoZSBjcHAgZHJpdmVyIHNhbXBsZSwgdG8gYWRkIG1hY3JvcyBmcm9tIHRoZSAKICBjb21tYW5kIGxpbmUgdGhyb3VnaCB0aGUgLUQgY29tbWFuZCBsaW5lIHN3aXRjaC4KLSBNYXJ0aW4gV2lsbGUgY29udHJpYnV0ZWQgYSB0ZXN0IHNjcmlwdCB0byBhbGxvdyBhdXRvbWF0aWMgdGVzdGluZyBvZiB0aGUgCiAgY3BwIGRyaXZlciBzYW1wbGUgYnkgZmVlZGluZyBhbGwgZmlsZXMgY29udGFpbmVkIGluIHRoZSB0ZXN0X2ZpbGVzIGRpcmVjdG9yeQogIHRocm91Z2ggdGhlIGNwcCBkcml2ZXIgYW5kIGNvbXBhcmluZyB0aGUgZ2VuZXJhdGVkIG91dHB1dCB3aXRoIHRoZSAKICBjb3JyZXNwb25kaW5nIGV4cGVjdGF0aW9ucy4KLSBBZGRlZCBjb25maWcgZmlsZSBzdXBwb3J0IHRvIGFsbG93IGZvciBwcmVkZWZpbmVkIG9wdGlvbiBzZXRzIChmb3IgaW5zdGFuY2UKICBmb3IgdGhlIGVtdWxhdGlvbiBvZiBvdGhlciBjb21waWxlcnMpCi0gQ2hhbmdlZCB0aGUgd2F5LCBob3cgaW5jbHVkZSBwYXRocyBhcmUgZGVmaW5lZC4gSXQgcmVzZW1ibGVzIG5vdyB0aGUgCiAgYmVoYXZpb3VyIG9mIGdjYy4gCiAgQW55IGRpcmVjdG9yaWVzIHNwZWNpZmllZCB3aXRoICctSScgb3B0aW9ucyBiZWZvcmUgYW4gZXZlbnR1YWxseSBnaXZlbiAnLUktJyAKICBvcHRpb24gYXJlIHNlYXJjaGVkIG9ubHkgZm9yIHRoZSBjYXNlIG9mICcjaW5jbHVkZSAiZmlsZSInLCB0aGV5IGFyZSBub3QgCiAgc2VhcmNoZWQgZm9yICcjaW5jbHVkZSA8ZmlsZT4nIGRpcmVjdGl2ZXMuIElmIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgYXJlIAogIHNwZWNpZmllZCB3aXRoICctSScgb3B0aW9ucyBhZnRlciBhICctSS0nIG9wdGlvbiB3YXMgZ2l2ZW4sIHRoZXNlIGRpcmVjdG9yaWVzIAogIGFyZSBzZWFyY2hlZCBmb3IgYWxsICcjaW5jbHVkZScgZGlyZWN0aXZlcy4gSW4gYWRkaXRpb24sIHRoZSAnLUktJyBvcHRpb24gCiAgaW5oaWJpdHMgdGhlIHVzZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkgYXMgdGhlIGZpcnN0IHNlYXJjaCBkaXJlY3RvcnkgZm9yIAogICcjaW5jbHVkZSAiZmlsZSInLiBUaGVyZWZvcmUsIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZCBvbmx5IGlmIGl0IGlzIAogIHJlcXVlc3RlZCBleHBsaWNpdGx5IHdpdGggJy1JLicuIFNwZWNpZnlpbmcgYm90aCAnLUktJyBhbmQgJy1JLicgYWxsb3dzIHRvIAogIGNvbnRyb2wgcHJlY2lzZWx5IHdoaWNoIGRpcmVjdG9yaWVzIGFyZSBzZWFyY2hlZCBiZWZvcmUgdGhlIGN1cnJlbnQgb25lIAogIGFuZCB3aGljaCBhcmUgc2VhcmNoZWQgYWZ0ZXIuCi0gQWRkZWQgY29uZmlnIGZpbGUgc3VwcG9ydCB0byB0aGUgY3BwIGRyaXZlci4KLSBzdG9yZWQgbm90IG9ubHkgdGhlIGN1cnJlbnQgJ25hbWUnIG9mIGEgZmlsZSAoZ2l2ZW4gZXZlbnR1YWxseSBieSBhICNsaW5lCiAgZGlyZWN0aXZlKSBidXQgaW4gcGFyYWxsZWwgdGhlIGFjdHVhbCBmdWxsIGZpbGUgc3lzdGVtIG5hbWUgb2YgdGhpcyBmaWxlIHRvby4KICAKVHVlIEZlYiAyNSAyMTo0NDoxOSAgICAgMjAwMwotIEZpeGVkIHRoZSB3YXJuaW5ncyBlbWl0dGVkIGJ5IGdjYyAtV2FsbC4KLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgY3BwIGdyYW1tYXIsIHdoaWNoIGNhdXNlcyB0byBmYWlsaW5nIHRoZSByZWNvZ25pdGlvbiBvZiAKICBjZXJ0YWluIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGlmIGF0IHRoZSBlbmQgb2YgdGhpcyBkaXJlY3RpdmUgd2VyZSBwbGFjZWQgCiAgYSBDKysgY29tbWVudC4KLSBTaW1wbGlmaWVkIGFuZCBleHRlbmRlZCB0aGUgaW5zZXJ0aW9uIG9mIHdoaXRlc3BhY2UgdG9rZW5zIGF0IHBsYWNlcywgd2hlcmUKICBvdGhlcndpc2UgdHdvIGFkamFjZW50IHRva2VucyB3b3VsZCBmb3JtIGEgbmV3IGRpZmZlcmVudCB0b2tlbiwgaWYgCiAgcmV0b2tlbml6ZWQuCgpNb24gRmViIDI0IDE5OjEzOjQ2ICAgICAyMDAzCi0gZGVmaW5lZCgpIGZ1bmN0aW9uYWxpdHkgd2FzIGJyb2tlbgotIGFkZGVkIG1pc3NpbmcgdHlwZW5hbWUga2V5d29yZHMKLSBhZGRlZCBtaXNzaW5nIHVzaW5nIG5hbWVzcGFjZSBzdGF0ZW1lbnRzLCB3aGVyZSBhcHByb3ByaWF0ZQotIGFkZGVkIGEgd2FybmluZywgd2hlbiBhIHByZWRlZmluZWQgbWFjcm8gaXMgdG8gYmUgdW5kZWZpbmVkIChieSBhbiAjdW5kZWYgCiAgZGlyZWN0aXZlKQotIHJlbW92ZWQgdGhlICdjb21waWxlIGluIEMgbW9kZScgaGFjayBmb3IgdGhlIHJlMmMgZ2VuZXJhdGVkIGxleGVyIChWQzcuMSAKICAoZmluYWwgYmV0YSkgaXMgbm90IGFibGUgdG8gY29tcGlsZSBpdCB3aXRoIG9wdGltaXphdGlvbnMgc3dpdGNoZWQgb24gCiAgYW55d2F5IDooICkKLSBjb21waWxlZCB3aXRoIGdjYyAzLjIgYW5kIEludGVsIFY3LjAgKDIwMDMwMTI5WikKClN1biBGZWIgMjMgMjM6Mzk6MzMgIDIwMDMKLSBGaXhlZCBhIGNvdXBsZSBvZiAnbWlzc2luZyB0eXBlbmFtZScgYnVncyAodGhhbmtzIHRvIE1hcnRpbiBXaWxsZSkKLSBBZGRlZCBjb2RlIHRvIGluc2VydCB3aGl0ZXNwYWNlIGF0IHBsYWNlcywgd2hlcmUgb3RoZXJ3aXNlIHR3byBhZGphY2VudCAKICB0b2tlbnMgd291bGQgZm9ybSBhIG5ldyBkaWZmZXJlbnQgdG9rZW4sIGlmIHJldG9rZW5pemVkLgotIEZpeGVkIGEgc2V2ZXJlIG1hY3JvIGV4cGFuc2lvbiBidWcuCi0gQWRkZWQgdGhlIGhhbmRsaW5nIG9mIGludmFsaWQgb3Igbm90IGFsbG93ZWQgdW5pdmVyc2FsIGNoYXJhY3RlciB2YWx1ZXMgCiAgaW5zaWRlIG9mIHN0cmluZyBsaXRlcmFscyBhbmQgY2hhcmFjdGVyIGxpdGVyYWxzLgoKU2F0IEZlYiAyMiAyMDo1MjowNiAgMjAwMwotIEJ1bXBlZCB2ZXJzaW9uIHRvIDAuOS4wCi0gQWRkZWQgdGVzdCBmb3IgaW52YWxpZCBvciBub3QgYWxsb3dlZCB1bml2ZXJzYWwgY2hhcmFjdGVyIHZhbHVlcyAoc2VlCiAgQysrIFN0YW5kYXJkIDIuMi4yIFtsZXguY2hhcnNldF0gYW5kIEFubmV4IEUpCi0gRml4ZWQgYSBidWcgd2l0aCBuZXdsaW5lcyBiZXR3ZWVuIGEgbWFjcm8gbmFtZSBhbmQgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMgCiAgZHVyaW5nIHRoZSBtYWNybyBleHBhbnNpb24gYW5kIGEgYnVnIHdpdGggbmV3bGluZXMgaW5zaWRlIHRoZSBwYXJhbWV0ZXIgbGlzdAogIGR1cmluZyB0aGUgbWFjcm8gZXhwYW5zaW9uLgotIEFkZGVkIHRoZSBmb2xsb3dpbmcgcHJlZGVmaW5lZCBtYWNyb3M6CiAgICBfX1NQSVJJVF9QUF9fCiAgICAgICAgZXhwYW5kcyB0byB0aGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBwLWl0ZXJhdG9yIGxpYiAoaS5lLiAweDAwOTAgZm9yIAogICAgICAgIFYwLjkuMCkKICAgIF9fU1BJUklUX1BQX1ZFUlNJT05fXwogICAgICAgIGV4cGFuZHMgdG8gdGhlIGZ1bGwgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHBwLWl0ZXJhdG9yIGxpYiAoaS5lLgogICAgICAgIDB4MDA5MDA0MzYgZm9yIFYwLjkuMC40MzYpCiAgICBfX1NQSVJJVF9QUF9WRVJTSU9OX1NUUl9fCiAgICAgICAgZXhwYW5kcyB0byB0aGUgZnVsbCB2ZXJzaW9uIHN0cmluZyBvZiB0aGUgcHAtaXRlcmF0b3IgbGliIChpLmUuIAogICAgICAgICIwLjkuMC40MzYiKQogIApGcmkgRmViIDIxIDIyOjA5OjA0ICAyMDAzIChmZWF0dXJlIGNvbXBsZXRlISkKLSBBbGxvd2VkIHRvIG9wdGlvbmFsbHkgY29tcGlsZSB0aGUgUmUyYyBnZW5lcmF0ZWQgbGV4ZXIgaW4gJ0MnIG1vZGUsIGJlY2F1c2UgCiAgYXQgbGVhc3QgdGhlIFZDNy4xIChmaW5hbCBiZXRhKSBjb21waWxlciBoYXMgcHJvYmxlbXMgdG8gY29tcGlsZSBpdCBpbiAnQysrJwogIG1vZGUgd2l0aCBvcHRpbWl6YXRpb25zIHN3aXRjaCBvbgotIEltcGxlbWVudGVkICNlcnJvciBhbmQgI3dhcm5pbmcgKG9wdGlvbmFsKSBkaXJlY3RpdmVzIChDKysgc3RhbmRhcmQgMTYuNSkuIAogIEFkZGl0aW9uYWxseSB0aGVyZSBhcmUgbm93IGFsbG93ZWQgdGhlIGZvbGxvd2luZyBwcmVwcm9jZXNzb3IgY29uZmlndXJhdGlvbiAKICBjb25zdGFudHM6CiAgICBDUFBfUFJFUFJPQ0VTU19FUlJPUl9NRVNTQUdFX0JPRFkKICAgICAgICBpZiBkZWZpbmVkLCBwcmVwcm9jZXNzZXMgdGhlIG1lc3NhZ2UgYm9keSBvZiAjZXJyb3IgYW5kICN3YXJuaW5nICAKICAgICAgICBkaXJlY3RpdmVzIHRvIGFsbG93IGZvciBiZXR0ZXIgZGlhZ25vc3RpY3MuCiAgICBDUFBfU1VQUE9SVF9XQVJOSU5HX0RJUkVDVElWRQogICAgICAgIGlmIGRlZmluZWQsIHRoZW4gdGhlICN3YXJuaW5nIGRpcmVjdGl2ZSB3aWxsIGJlIHJlY29nbml6ZWQgc3VjaCwgdGhhdAogICAgICAgIGEgd2FybmluZyB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIHdpbGwgYmUgaXNzdWVkCi0gQWRqdXN0ZWQgdGhlIGVycm9yIGhhbmRsaW5nIGZvciB0aGUgUmUyYyBnZW5lcmF0ZWQgQysrIGxleGVyLCBzbyB0aGF0IGFueQogIGVycm9yIGluc2lkZSB0aGUgbGV4ZXIgaXMgbm93IHByb3BhZ2F0ZWQgYXMgYW4gY3BwbGV4ZXJfZXhjZXB0aW9uLgotIEltcGxlbWVudGVkIHRoZSAjbGluZSBkaXJlY3RpdmUgKEMrKyBzdGFuZGFyZCAxNi40KQotIEltcGxlbWVudGVkICNwcmFnbWEgZGlyZWN0aXZlIChDKysgc3RhbmRhcmQgMTYuNikKICBBZGRpdGlvbmFsbHkgdGhlcmUgYXJlIG5vdyBhbGxvd2VkIHRoZSBmb2xsb3dpbmcgcHJlcHJvY2Vzc29yIGNvbmZpZ3VyYXRpb24gCiAgY29uc3RhbnRzOgogICAgQ1BQX1JFVFVSTl9QUkFHTUFfRElSRUNUSVZFUwogICAgICAgIGlmIGRlZmluZWQsIHRoZW4gdGhlIHdob2xlIHByYWdtYSBkaXJlY3RpdmUgaXMgcmV0dXJuZWQgYXMgYSB0b2tlbgogICAgICAgIHNlcXVlbmNlIHRvIHRoZSBjYWxsZXIsIGlmIG5vdCBkZWZpbmVkIHRoZSB3aG9sZSBwcmFnbWEgZGlyZWN0aXZlIGlzIAogICAgICAgIHNraXBwZWQKICAgIENQUF9QUkVQUk9DRVNTX1BSQUdNQV9CT0RZCiAgICAgICAgaWYgZGVmaW5lZCwgdGhlbiB0aGUgI3ByYWdtYSBib2R5IHdpbGwgYmUgcHJlcHJvY2Vzc2VkIAotIEltcGxlbWVudGVkICNpbmNsdWRlIGRpcmVjdGl2ZSB3aXRoIG1hY3JvIGFyZ3VtZW50cyAoQysrIHN0YW5kYXJkIDE2LjIuNCkKLSBNYWRlIHRoZSBuYW1lc3BhY2Ugc3RydWN0dXJlIGZpbmVyIGdyYW51bGF0ZWQgdG8gbGVhdmUgb25seSB0aGUgbWFpbiAKICBpbnRlcmZhY2UgY2xhc3NlcyBpbiB0aGUgbWFpbiBuYW1lc3BhY2UgY3BwLiBBbGwgb3RoZXIgY2xhc3NlcyBhcmUgbW92ZWQgaW50bwogIHN1Yi1uYW1lc3BhY2VzIHRvIHJlZmxlY3QgdGhlIGxvZ2ljYWwgZGVwZW5kZW5jaWVzCi0gUmVvcmdhbml6ZWQgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgdGhlIGNvbnRleHQ8PiB0ZW1wbGF0ZSBjbGFzcywgbWFkZSBhbGwKICBub24gcmVsZXZhbnQgZnVuY3Rpb25zIGludG8gdGhlIHByb3RlY3RlZC4KLSBJbXBsZW1lbnRlZCBwcmVkZWZpbmVkIG1hY3JvcyAoX19MSU5FX18gZXQuYWwuKSAoQysrIHN0YW5kYXJkIDE2LjgpCi0gRnVydGhlciBkb2N1bWVudGF0aW9uIHdvcmsKICAKV2VkIEZlYiAxOSAyMzo0NDo0NyAgMjAwMwotIENvcnJlY3RlZCBhIGxvdCBvZiBidWdzIGluIHRoZSBtYWNybyBleHBhbnNpb24gZW5naW5lLCB3aGljaCBub3cgc2hvdWxkIGJlIAogIGNvbmZvcm1hbnQgdG8gdGhlIEMrKyBzdGFuZGFyZC4KLSAjIChudWxsKSBkaXJlY3RpdmUgKEMrKyBzdGFuZGFyZCAxNi43KQoKU3VuIEZlYiAxNiAwODo0MDozOCAgMjAwMwotIEFkZGVkIGEgbWFjcm8gZXhwYW5zaW9uIGVuZ2luZSB3aGljaCBleHBhbmRzIG1hY3JvcyB3aXRoIGFyZ3VtZW50cyAKICBDKysgc3RhbmRhcmQgMTYuMyBbY3BwLnJlcGxhY2VdCi0gQWRkZWQgYSBuZXcgc2FtcGxlOiBjcHBfdG9rZW5zLiBUaGlzIHNhbXBsZSBwcmVwcm9jZXNzZXMgYSBnaXZlbiBmaWxlIGFuZAogIHByaW50cyBvdXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgYWxsIHRva2VucyByZXR1cm5lZCBmcm9tIHRoZSBwcCAKICBpdGVyYXRvcgotIEFkZGVkIGRvY3VtZW50YXRpb24gKHRvIGJlIGNvbnRpbnVlZCEpCi0gQWRkZWQgYSBjb3VwbGUgb2Ygc21hbGwgdGVzdCBmaWxlcyB0byB0ZXN0IGVsZW1lbnRhcnkgZnVuY3Rpb25hbGl0eQogICh0aGUgdGVzdHMgbWFpbmx5IHdlcmUgY29udHJpYnV0ZWQgYnkgUGF1bCBNZW5zb25pZGVzKQotIFRoZSBtYWluIGNwcCBzYW1wbGUgaXMgbm93IGEgc2ltcGxlIHByZXByb2Nlc3NvciBkcml2ZXIgcHJvZ3JhbSwgd2hpY2ggCiAgb3V0cHV0cyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcmVwcm9jZXNzZWQgaW5wdXQgc3RyZWFtLiBVc2UgCiAgY3BwIC0taGVscCB0byBnZXQgYSBoaW50LCBob3cgdG8gdXNlIGl0LgotIEZpeGVkIGEgYnVnIGluIHRoZSBwcmVwcm9jZXNzb3IgZ3JhbW1hciB3aGljaCBmYWlsZWQgdG8gcmVjb2duaXplIGEgcHAgCiAgc3RhdGVtZW50LCBpZiB0aGVyZSB3YXMgYSBDKysgY29tbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lCi0gQWRkZWQgJyMnIG9wZXJhdG9yIChDKysgc3RhbmRhcmQgMTYuMy4yKSBbY3BwLnN0cmluZ2l6ZV0KLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgc2xleCBiYXNlZCBDKysgbGV4ZXIgdG8gaGFuZGxlIHRoZSBjb25jYXRlbmF0aW9uIAogIGNoYXJhY3RlcnMgY29ycmVjdGx5ICgnXFwnIGZvbGxvd2VkIGJ5IGEgJ1xuJykKClN1biBGZWIgIDkgMjM6MDE6MDAgIDIwMDMKLSBJbXByb3ZlZCBlcnJvciBoYW5kbGluZyBmb3IgI2lmIGV0LmFsLgotIEZpeGVkIGEgcGFpciBvZiBsZXhlciBlcnJvcnMKLSBJbXBsZW1lbnRlZCB0aGUgI2lmLyNlbGlmIHN0YXRlbWVudHMsIHRoZSBzYW1wbGUgbm93IGNvbnRhaW5zIGEgY29tcGxldGUgQysrIAogIGV4cHJlc3Npb24gZXZhbHVhdGlvbiBlbmdpbmUgKGZvciB0aGUgY2FsY3VsYXRpb24gb2YgdGhlIG91dGNvbWUgb2YgdGhlIAogICNpZi8jZWxpZiBzdGF0ZW1lbnQgY29uZGl0aW9ucykKLSBJbXBsZW1lbnRlZCBtYWNybyByZXBsYWNlbWVudCAod2l0aCBwYXJhbWV0ZXJzKQotIEltcGxlbWVudGVkIHRoZSAnIyMnIFtjcHAuY29uY2F0XSBvcGVyYXRvcgotIEltcGxlbWVudGVkIHRoZSBkZWZpbmVkKCkgW2NwcC5jb25kXSBvcGVyYXRvcgoKU3VuIEZlYiAgMiAyMzoyODoyNCAgMjAwMwotIEltcGxlbWVudGVkIHRoZSAgI2RlZmluZSwgI3VuZGVmLCAjaWZkZWYsICNpZm5kZWYsICNlbHNlIGFuZCAjZW5kaWYgCiAgc3RhdGVtZW50cwotIEFkZGVkIG9wdGlvbmFsIHBhcnNlIHRyZWUgb3V0cHV0IGFzIHhtbCBzdHJlYW0gKGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgY29uZmlnCiAgcHAgY29uc3RhbnQgQ1BQX0RVTVBfUEFSU0VfVFJFRSkKCkZyaSBKYW4gMzEgMjE6MzA6NTUgIDIwMDMKLSBGaXhlZCBkaWZmZXJlbnQgbWlub3IgaXNzdWVzIGFuZCBhIGJvcmRlciBjYXNlICgjaW5jbHVkZSBzdGF0ZW1lbnQgYXQgdGhlIAogIGxhc3QgbGluZSBvZiBhIGluY2x1ZGVkIGZpbGUpCgpXZWQgSmFuIDI5IDIxOjEzOjMyICAyMDAzCi0gRml4ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIHRvIHJlcG9ydCB0aGUgY29ycmVjdCBlcnJvciBwb3NpdGlvbgotIEZpeGVkIGFub3RoZXIgYnVnIGluIHRoZSBzdHJlYW0gcG9zaXRpb24gY2FsY3VsYXRpb24gc2NoZW1lCi0gQWRkZWQgYSBtb3JlIGVsYWJvcmF0ZSBzYW1wbGUgJ2xpc3RfaW5jbHVkZXMnIHdoaWNoIGxpc3RzIHRoZSBkZXBlbmRlbmN5CiAgaW5mb3JtYXRpb24gZm9yIGEgZ2l2ZW4gc291cmNlIGZpbGUgKHNlZSB0ZXN0L2xpc3RfaW5jbHVkZXMvcmVhZG1lLnR4dCkuCgpTYXQgSmFuIDE4IDIyOjAxOjAzICAyMDAzCi0gRml4ZWQgYSBidWcgaW4gdGhlIHN0cmVhbSBwb3NpdGlvbiBjYWxjdWxhdGlvbiBzY2hlbWUKLSBNYWRlIGNwcDo6ZXhjZXB0aW9ucyBtb3JlIHN0YW5kYXJkIGNvbmZvcm1hbnQgKGFkZGVkICd0aHJvdygpJyBhdCBhcHByb3ByaWF0ZSAKICBwbGFjZXMpCi0gT3ZlcmFsbCBob3VzZWtlZXBpbmcgOi0pCgpXZWQgSmFuIDE1IDIxOjU0OjIwICAyMDAzCkNoYW5nZXMgc2luY2UgcHJvamVjdCBzdGFydCAoc3RpbGwgMC41LjApCi0gQWRkZWQgI2luY2x1ZGUgPC4uLj4gYW5kICNpbmNsdWRlICIuLi4iIGZ1bmN0aW9uYWxpdHkKLSBwcCBkaXJlY3RpdmVzIGFyZSBub3cgZ2VuZXJhbGx5IHJlY29nbml6ZWQgCi0gRGVjb3VwbGVkIHRoZSBDKysgbGV4ZXJzIGFuZCB0aGUgcHAgZ3JhbW1hciB0byBzZXBhcmF0ZSBjb21waWxhdGlvbgogIHVuaXRzIChvcHRpb25hbGx5KSB0byBzcGVlZCB1cCBjb21waWxhdGlvbiAoYSBsb3QhKQoKVGh1IEphbiAgMiAxMjozOTozMCAgMjAwMwpBIGNvbXBsZXRlbHkgbmV3IHZlcnNpb24gMC41LjAgb2YgdGhlIEMgcHJlcHJvY2Vzc29yIHdhcyBzdGFydGVkLiBJdCdzIGEgCmNvbXBsZXRlIHJld3JpdGUgb2YgdGhlIGV4aXN0aW5nIGNvZGUgYmFzZS4gVGhlIG1haW4gZGlmZmVyZW5jZXMgYXJlOgotIFRoZSBwcmVwcm9jZXNzb3IgaXMgbm93IGltcGxlbWVudGVkIGFzIGFuIGl0ZXJhdG9yLCB3aGljaCByZXR1cm5zIHRoZSAKICBjdXJyZW50IHByZXByb2Nlc3NlZCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCi0gVGhlIHByZXByb2Nlc3Npbmcgb2YgaW5jbHVkZSBmaWxlcyBpc24ndCBpbXBsZW1lbnRlZCB0aHJvdWdoIHJlY3Vyc2lvbgogIGFueW1vcmUuIFRoaXMgZm9sbG93cyBkaXJlY3RseSBmcm9tIHRoZSBmaXJzdCBjaGFuZ2UuIEFzIGEgcmVzdWx0IG9mIHRoaXMKICBjaGFuZ2UgdGhlIGludGVybmFsIGVycm9yIGhhbmRsaW5nIGlzIHNpbXBsaWZpZWQuCi0gVGhlIEMgcHJlcHJvY2Vzc29yIGl0ZXJhdG9yIGl0c2VsZiBpcyBmZWVkZWQgYnkgYSBuZXcgdW5pZmllZCBDKysgbGV4ZXIgCiAgaXRlcmF0b3IuIEJUVywgdGhpcyBDKysgbGV4ZXIgaXRlcmF0b3IgY291bGQgYmUgdXNlZCBzdGFuZGFsb25lIGFuZCBpcyBub3QgCiAgdGllZCB0byB0aGUgQyBwcmVwcm9jZXNzb3IuIFRoZXJlIGFyZSB0d28gZGlmZmVyZW50IEMrKyBsZXhlcnMgaW1wbGVtZW50ZWQgCiAgbm93LCB3aGljaCBhcmUgZnVuY3Rpb25hbGx5IGNvbXBsZXRlbHkgaWRlbnRpY2FsLiBUaGVzZSBleHBvc2UgYSBzaW1pbGFyCiAgaW50ZXJmYWNlLCBzbyB0aGUgQyBwcmVwcm9jZXNzb3IgY291bGQgYmUgdXNlZCB3aXRoIGJvdGggb2YgdGhlbS4KLSBUaGUgQysrIGxleGVycyBpbnRlZ3JhdGVkIGludG8gdGhlIEMgcHJlcHJvY2Vzc29yIGJ5IG5vdyBhcmU6CiAgICBTbGV4OiAgIEEgc3Bpcml0IGJhc2VkIHRhYmxlIGRyaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gbGV4ZXIgKHRoZSBzbGV4IAogICAgICAgICAgICBlbmdpbmUgb3JpZ2luYWxseSB3YXMgd3JpdHRlbiBieSBEYW4gTnVmZmVyIGFuZCBpcyBhdmFpbGFibGUgYXMgYQogICAgICAgICAgICBzZXBhcmF0ZSBTcGlyaXQgc2FtcGxlKS4KICAgIFJlMmM6ICAgQSBDKysgbGV4ZXIgZ2VuZXJhdGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIHJlMmMgdG9vbC4gVGhpcyBDKysKICAgICAgICAgICAgbGV4ZXIgd2FzIHdyaXR0ZW4gYXMgYSBzYW1wbGUgYnkgRGFuIE51ZmZlciB0b28uCiAgSXQgaXNuJ3QgaGFyZCB0byBwbHVnIGluIGFkZGl0aW9uYWwgZGlmZmVyZW50IEMrKyBsZXhlcnMuIFRoZXJlIGFyZSBwbGFucyB0bwogIGludGVncmF0ZSBhIHRoaXJkIG9uZSB3cml0dGVuIGJ5IEp1YW4gQ2FybG9zIEFyZXZhbG8tQmFlemEsIHdoaWNoIGlzIAogIGF2YWlsYWJsZSBhcyBhIFNwaXJpdCBzYW1wbGUuCiAgCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVHVlIEZlYiAxMiAyMjoyOTo1MCAgMjAwMgpDaGFuZ2VzIGZyb20gMC4yLjMgdG8gMC4yLjQ6Ci0gTW92ZWQgWE1MIGR1bXBpbmcgZnVuY3Rpb25zIHRvIHRoZSBtYWluIFNwaXJpdCBkaXJlY3RvcnkKLSBGaXhlZCBvcGVyYXRvciAnIyMnLCBpdCB3YXMgbm90IGNvcnJlY3RseSBpbXBsZW1lbnRlZCBzb21laG93IDotKAoKU3VuIEZlYiAxMCAyMTowNzoxOSAgMjAwMgpDaGFuZ2VzIGZyb20gMC4yLjIgdG8gMC4yLjM6Ci0gSW1wbGVtZW50ZWQgY29uY2F0ZW5hdGlvbiBvcGVyYXRvciAnIyMnIChjcHAuY29uY2F0KQotIFJlbW92ZWQgZGVmaW5lZCgpIGZ1bmN0aW9uYWxpdHkgZm9yIEludGVsIGNvbXBpbGVyIChpdCBJQ0UncykgdW50aWwgdGhpcyAKICBpc3N1ZSBpcyByZXNvbHZlZAotIFNlcGFyYXRlZCBjb2RlIGZvciBkdW1waW5nIGEgcGFyc2UgdHJlZSB0byBYTUwgZm9yIGluY2x1c2lvbiBpbiB0aGUgbWFpbgogIFNwaXJpdCBoZWFkZXJzCgpUaHUgSmFuIDE3IDIzOjUxOjIxICAyMDAyCkNoYW5nZXMgZnJvbSAwLjIuMSB0byAwLjIuMjoKLSBGaXhlcyB0byBjb21waWxlIHdpdGggZ2NjIDIuOTUuMiBhbmQgZ2NjIDMuMC4yICh0aGFua3MgRGFuIE51ZmZlcikKLSBSZWZvcm1hdHRlZCB0aGUgZ3JhbW1hcnMgdG8gY29uZm9ybSB0byBhIHNpbmdsZSBmb3JtYXR0aW5nIGd1aWRlbGluZQotIEFzc2lnbmVkIGV4cGxpY2l0IHJ1bGVfaWQncyB0byB0aGUgcnVsZXMgb2YgY3BwX2dyYW1tYXIsIHNvIHRoYXQgdGhlIAogIGFjY2VzcyBjb2RlIHRvIHRoZSBlbWJlZGRlZCBkZWZpbml0aW9uIGNsYXNzIGlzIG5vdCBuZWVkZWQgYW55bW9yZQotIEZpeGVkIGEgcmVtYWluaW5nIGNvbnN0IHByb2JsZW0KClR1ZSBKYW4gMTUgMjM6NDA6NDAgIDIwMDIKQ2hhbmdlcyBmcm9tIDAuMi4wIHRvIDAuMi4xOgotIENvcnJlY3RlZCBoYW5kbGluZyBvZiBkZWZpbmVkKCkgb3BlcmF0b3IKLSBJbiBwcmVwcm9jZXNzaW5nIGNvbmRpdGlvbmFscyB1bmRlZmluZWQgaWRlbnRpZmllcnMgbm93IGNvcnJlY3RseQogIHJlcGxhY2VkIGJ5ICcwJwotIEZpeGVkIHNldmVyYWwgY29uc3QgcHJvYmxlbXMKLSBBZGRlZCBwYXJzZV9ub2RlX2l0ZXJhdG9yIGZvciB0cmF2ZXJzaW5nIG9uZSBub2RlIGluIGEgcGFyc2VfdHJlZQogIHdpdGhvdXQgZ29pbmcgZGVlcGVyIGRvd24gdGhlIGhpZXJhcmNoeSB0aGFuIG9uZSBsZXZlbCAodGhpcyBpcyB1c2VmdWwsCiAgaWYgYWxsIGluc3BlY3RlZCB0b2tlbnMgYXJyYW5nZWQgYWxvbmcgYSBzaW5nbGUgbm9kZSBpbiB0aGUgcGFyc2UgdHJlZS4KICBUaGUgbWFpbiBkaWZmZXJlbmNlIHRvIHRoZSBwYXJzZV90cmVlX2l0ZXJhdG9yIGlzLCB0aGF0IHRoZSB1bmRlcmx5aW5nCiAgaXRlcmF0b3IgZ2VuZXJhbGx5IGNhbiBiZSBhZGp1c3RlZCBjb3JyZWN0bHkgYWZ0ZXIgYWR2YW5jaW5nIHRoZSBhdHRhY2hlZAogIHBhcnNlX25vZGVfaXRlcmF0b3IKLSBGaXhlZCBhIHByb2JsZW0gd2l0aCBnY2MgMi45NS4yLCB3aGljaCBkb2Vzbid0IGhhdmUgYSA8c3N0cmVhbT4gaGVhZGVyCi0gUHJlcGFyZWQgdXNhZ2Ugb2Ygc2xleCBmb3IgbGV4ZXIgc3RhdGVzCgpTdW4gSmFuIDEzIDEwOjIxOjE2ICAyMDAyCkNoYW5nZXMgZnJvbSAwLjEuMCB0byAwLjIuMDoKLSBBZGRlZCBvcGVyYXRvciAnZGVmaW5lZCgpJwotIEFkZGVkIGRpcmVjdGl2ZSAnI3dhcm5pbmcnCi0gQ29ycmVjdGVkIGVycm9yIHJlcG9ydGluZwotIEFkZGVkIGNvbW1hbmQgbGluZSBvcHRpb24gLUktIGZvciBmaW5lciBjb250cm9sIG9mIHRoZSBzZWFyY2hlZCBpbmNsdWRlCiAgZGlyZWN0b3JpZXMgKC1JIGFuZCAtSS0gc2hvdWxkIG5vdyB3b3JrIGFzIGluIGdjYywgc2VlIHJlYWRtZS5odG1sIGZvciAKICBtb3JlIGluZm8pCi0gQ29ycmVjdGVkIGNvbmRpdGlvbmFsIHByZXByb2Nlc3NpbmcgKHNob3VsZCBiZSBmdWxseSBmdW5jdGlvbmFsIG5vdykKLSBGaXhlZCBleGlzdGluZyBjb2RlIGJhc2UgZm9yIGNoYW5nZXMgbWFkZSBpbiBwYXJzZSB0cmVlIHN1cHBvcnQKLSBNb3ZlZCBwYXJzZSB0cmVlIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGEgc2VwYXJhdGUgaGVhZGVyIChwcmVwYXJlZCBmb3IgCiAgaW5jbHVzaW9uIHRvIHRoZSBTcGlyaXQgbWFpbiBsaWJyYXJ5KQo=