ClJFQURNRSBmb3IgdGhlIGJ1aWxkcy9hbWlnYSBzdWJkaXJlY3RvcnkuCgpDb3B5cmlnaHQgMjAwNS0yMDE1IGJ5Cldlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgbW9kaWZpZWQsCmFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEZyZWVUeXBlIHByb2plY3QgbGljZW5zZSwKTElDRU5TRS5UWFQuICBCeSBjb250aW51aW5nIHRvIHVzZSwgbW9kaWZ5LCBvciBkaXN0cmlidXRlIHRoaXMgZmlsZSB5b3UKaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgaXQKZnVsbHkuCgoKVGhlIG1ha2VmaWxlLm9zNCBpcyBmb3IgdGhlIEFtaWdhT1M0IFNESy4gIFRvIHVzZSBpdCwgdHlwZQoibWFrZSAtZiBtYWtlZmlsZS5vczQiLCBpdCBwcm9kdWNlcyBhIGxpbmsgbGlicmFyeSBsaWJmdDJfcHBjLmEuCgpUaGUgbWFrZWZpbGUgaXMgZm9yIHBwYy1tb3JwaG9zLWdjYy0yLjk1LjMtYmluLnRneiAoZ2NjIDIuOTUuMyBob3N0ZWQgb24KNjhrLUFtaWdhIHByb2R1Y2luZyBNb3JwaE9TLVBQQy1iaW5hcmllcyBmcm9tIGh0dHA6Ly93d3cubW9ycGhvcy5kZSkuClRvIHVzZSBpdCwgdHlwZSAibWFrZSBhc3NpZ24iLCB0aGVuICJtYWtlIjsgaXQgcHJvZHVjZXMgYSBsaW5rIGxpYnJhcnkKbGliZnQyX3BwYy5hLgoKVGhlIHNtYWtlZmlsZSBpcyBhIG1ha2VmaWxlIGZvciBBbWlnYSBTQVMvQyA2LjU4IChubyBsb25nZXIgYXZhaWxhYmxlLApsYXRlc3Qgc29sZCB2ZXJzaW9uIHdhcyA2LjUwLCB1cGRhdGVzIGNhbiBiZSBmb3VuZCBpbiBBbWluZXQpLiAgSXQgaXMKYmFzZWQgb24gdGhlIHZlcnNpb24gZm91bmQgaW4gdGhlIHNvdXJjZWNvZGUgb2YgdHRmLmxpYnJhcnkgMC44M2IgZm9yCkZyZWVUeXBlIDEuMy4xIGZyb20gUmljaGFyZCBHcmlmZml0aCAocmFncmlmZmlAc3ByeW5ldC5jb20sCmh0dHA6Ly9yYWdyaWZmaS5ob21lLnNwcnluZXQuY29tKS4KCllvdSB3aWxsIGFsc28gbmVlZCB0aGUgbGF0ZXN0IGluY2x1ZGUgZmlsZXMgYW5kIGFtaWdhLmxpYiBmcm9tIHRoZQpBbWlnYSB3ZWIgc2l0ZSAoaHR0cDovL3d3dy5hbWlnYS5jb20vMy45L2Rvd25sb2FkL05ESzMuOS5saGEpIGZvcgpBbWlnYU9TIDMuOTsgdGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCB3b3JrIHVuZGVyIEFtaWdhT1MgMi4wNCBhbmQgdXAuCgpUbyB1c2UgaXQsIGNhbGwgInNtYWtlIGFzc2lnbiIgYW5kIHRoZW4gInNtYWtlIiBmcm9tIHRoZSBidWlsZHMvYW1pZ2EKZGlyZWN0b3J5LiAgVGhlIHJlc3VsdHMgYXJlOgoKLSBBIGxpbmsgbGlicmFyeSAiZnQyXzY4MHgwLmxpYiIgKHdoZXJlIHggZGVwZW5kcyBvbiB0aGUgc2V0dGluZyBvZgogIHRoZSBDUFUgZW50cnkgaW4gdGhlIHNtYWtlZmlsZSkgY29udGFpbmluZyBhbGwgRnJlZVR5cGUyIHBhcnRzCiAgZXhjZXB0IG9mIHRoZSBpbml0IGNvZGUsIGRlYnVnZ2luZyBjb2RlLCBhbmQgdGhlIHN5c3RlbSBpbnRlcmZhY2UKICBjb2RlLgoKLSBmdHN5c3RlbS5vLCBhbiBvYmplY3QgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIHN0YW5kYXJkIHZlcnNpb24gb2YgdGhlCiAgc3lzdGVtIGludGVyZmFjZSBjb2RlIHdoaWNoIHVzZXMgZm9wZW4oKSBmY2xvc2UoKSBmcmVhZCgpIGZzZWVrKCkKICBmdGVsbCgpIG1hbGxvYygpIHJlYWxsb2MoKSBhbmQgZnJlZSgpIGZyb20gbGliOnNjLmxpYiAobm90IHB1cmUpLgoKLSBmdHN5c3RlbXB1cmUubywgYW4gb2JqZWN0IG1vZHVsZSBjb250YWluaW5nIHRoZSBwdXJlIHZlcnNpb24gb2YgdGhlCiAgc3lzdGVtIGludGVyZmFjZSBjb2RlIHdoaWNoIHVzZXMgT3BlbigpIENsb3NlKCkgUmVhZCgpIFNlZWsoKQogIEV4YW1pbmVGSCgpIEFzbUFsbG9jUG9vbGVkKCkgQXNtRnJlZVBvb2xlZCgpIGV0Yy4gIFRoaXMgdmVyc2lvbiBjYW4KICBiZSB1c2VkIGluIGJvdGggbm9ybWFsIHByb2dyYW1zIGFuZCBpbiBBbWlnYSBydW4tdGltZSBzaGFyZWQgc3lzdGVtCiAgbGlicmFyeXMgKGNhbiBiZSBsaW5rZWQgd2l0aCBsaWI6bGliaW5pdC5vLCBubyBjb3B5aW5nIG9mIERBVEEgYW5kCiAgQlNTIGh1bmtzIGZvciBlYWNoIE9wZW5MaWJyYXJ5KCkgbmVjZXNzYXJ5KS4gIFNvdXJjZSBjb2RlIGlzIGluCiAgc3JjL2Jhc2UvZnRzeXN0ZW0uYy4KCi0gZnRkZWJ1Zy5vLCBhbiBvYmplY3QgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIHN0YW5kYXJkIHZlcnNpb24gb2YgdGhlCiAgZGVidWdnaW5nIGNvZGUgd2hpY2ggdXNlcyB2cHJpbnRmKCkgYW5kIGV4aXQoKSAobm90IHB1cmUpLgogIERlYnVnZ2luZyBjYW4gYmUgdHVybmVkIG9uIGluIEZUOmluY2x1ZGUvY29uZmlnL2Z0b3B0aW9uLmggYW5kIHdpdGgKICBGVF9TZXRUcmFjZUxldmVsKCkuCgotIGZ0ZGVidWdwdXJlLm8sIGFuIG9iamVjdCBtb2R1bGUgY29udGFpbmluZyB0aGUgcHVyZSB2ZXJzaW9uIG9mIHRoZQogIGRlYnVnZ2luZyBjb2RlIHdoaWNoIHVzZXMgS1ZQcmludGYoKSBmcm9tIGxpYjpkZWJ1Zy5saWIgYW5kIG5vCiAgZXhpdCgpLiAgRm9yIGRlYnVnZ2luZyBvZiBBbWlnYSBydW4tdGltZSBzaGFyZWQgc3lzdGVtIGxpYnJhcmllcy4KICBTb3VyY2UgY29kZSBpcyBpbiBzcmMvYmFzZS9mdGRlYnVnLmMuCgotIE5PIGZ0aW5pdC5vLiAgQmVjYXVzZSBsaW5raW5nIHdpdGggYSBsaW5rIGxpYnJhcnkgc2hvdWxkIHJlc3VsdCBpbgogIGxpbmtpbmcgb25seSB0aGUgbmVlZGVkIG9iamVjdCBtb2R1bGVzIGluIGl0LCBidXQgc3RhbmRhcmQKICBmdHN5c3RlbS5vIHdvdWxkIGZvcmNlIEFMTCBGcmVlVHlwZTIgbW9kdWxlcyB0byBiZSBsaW5rZWQgdG8geW91cgogIHByb2dyYW0sIEkgZGVjaWRlZCB0byB1c2UgYSBkaWZmZXJlbnQgc2NoZW1lOiBZb3UgbXVzdCAjaW5jbHVkZQogIEZUOnNyYy9iYXNlL2Z0aW5pdC5jIGluIHlvdXIgc291cmNlY29kZSBhbmQgc3BlY2lmeSB3aXRoICNkZWZpbmUKICBzdGF0ZW1lbnRzIHdoaWNoIG1vZHVsZXMgeW91IG5lZWQuICBTZWUgaW5jbHVkZS9jb25maWcvZnRtb2R1bGUuaC4KCgpUbyB1c2UgaW4geW91ciBvd24gcHJvZ3JhbXM6CgotIEluc2VydCB0aGUgI2RlZmluZSBhbmQgI2luY2x1ZGUgc3RhdGVtZW50cyBmcm9tIHRvcCBvZgogIGluY2x1ZGUvY29uZmlnL2Z0bW9kdWxlLmggaW4geW91ciBzb3VyY2UgY29kZSBhbmQgdW5jb21tZW50IHRoZQogICNkZWZpbmUgc3RhdGVtZW50cyBmb3IgdGhlIEZyZWVUeXBlMiBtb2R1bGVzIHlvdSBuZWVkLgoKLSBZb3UgY2FuIHVzZSBlaXRoZXIgUEFSQU1FVEVSUz1SRUdJU1RFUiBvciBQQVJBTUVURVJTPVNUQUNLIGZvcgogIGNhbGxpbmcgdGhlIEZyZWVUeXBlMiBmdW5jdGlvbnMsIGJlY2F1c2UgdGhlIGxpbmsgbGlicmFyeSBhbmQgdGhlCiAgb2JqZWN0IGZpbGVzIGFyZSBjb21waWxlZCB3aXRoIFBBUkFNRVRFUlM9Qk9USC4KCi0gInNtYWtlIGFzc2lnbiIgKGFzc2lnbiAiRlQ6IiB0byB0aGUgRnJlZVR5cGUyIG1haW4gZGlyZWN0b3J5KS4KCi0gQ29tcGlsZSB5b3VyIHByb2dyYW0uCgotIExpbmsgd2l0aCBlaXRoZXIgZnRzeXN0ZW0ubyBvciBmdHN5c3RlbXB1cmUubywgaWYgZGVidWdnaW5nIGVuYWJsZWQKICB3aXRoIGVpdGhlciBmdGRlYnVnLm8gb3IgKGZ0ZGVidWdwdXJlLm8gYW5kIGxpYjpkZWJ1Zy5saWIpLCBhbmQgd2l0aAogIGZ0Ml82ODB4MC5saWIgYXMgbGluayBsaWJyYXJ5LgoKClRvIGFkYXB0IHRvIG90aGVyIGNvbXBpbGVyczoKCi0gVGhlIHN0YW5kYXJkIEFOU0kgQyBtYXhpbXVtIGxlbmd0aCBvZiAzMSBzaWduaWZpY2FudCBjaGFyYWN0ZXJzIGluCiAgaWRlbnRpZmllcnMgaXMgbm90IGVub3VnaCBmb3IgRnJlZVR5cGUyLiAgQ2hlY2sgaWYgeW91ciBjb21waWxlciBoYXMKICBhIG1pbmltdW0gbGVuZ3RoIG9mIDQwIHNpZ25pZmljYW50IGNoYXJhY3RlcnMgb3IgY2FuIGJlIHN3aXRjaGVkIHRvCiAgaXQuICAiaWRsZW49NDAiIGlzIHRoZSBvcHRpb24gZm9yIFNBUy9DLiAgU2V0dGluZyAjZGVmaW5lCiAgSEFWRV9MSU1JVF9PTl9JREVOVFMgaW4gYW4gaW5jbHVkZSBmaWxlIG1heSBhbHNvIHdvcmsgKG5vdCB0ZXN0ZWQpLgoKLSBNYWtlIHN1cmUgdGhhdCB0aGUgaW5jbHVkZSBkaXJlY3RvcnkgaW4gYnVpbGRzL2FtaWdhIGlzIHNlYXJjaGVkCiAgYmVmb3JlIHRoZSBub3JtYWwgRnJlZVR5cGUyIGluY2x1ZGUgZGlyZWN0b3J5LCBzbyB5b3UgYXJlIGFibGUgdG8KICByZXBsYWNlIHByb2JsZW1hdGljIGluY2x1ZGUgZmlsZXMgd2l0aCB5b3VyIG93biB2ZXJzaW9uIChzYW1lIG1heSBiZQogIHVzZWZ1bCBmb3IgdGhlIHNyYyBkaXJlY3RvcnkpLgoKLSBBbiBleGFtcGxlIG9mIGhvdyB0byByZXBsYWNlL3dvcmthcm91bmQgYSBwcm9ibGVtYXRpYyBpbmNsdWRlIGZpbGUKICBpcyBpbmNsdWRlL2NvbmZpZy9mdGNvbmZpZy5oOyBpdCBjaGFuZ2VzIGEgI2RlZmluZSB0aGF0IHdvdWxkCiAgcHJldmVudCBTQVMvQyBmcm9tIGdlbmVyYXRpbmcgWERFRidzIHdoZXJlIGl0IHNob3VsZCBkbyB0aGF0IGFuZAogIHRoZW4gaW5jbHVkZXMgdGhlIHN0YW5kYXJkIEZyZWVUeXBlMiBpbmNsdWRlIGZpbGUuCgpMb2NhbCBWYXJpYWJsZXM6CmNvZGluZzogbGF0aW4tMQpFbmQ6Cg==