CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjMuNDoKCkNvcnJlY3Rpb25zOgoJSGVhZGVyIG9mIHhpb3Rlcm1pb3Nfc3BlZWQoKSBkZWNsYXJlZCBwYXJhbWV0ZXIgdW5zaWduZWQgaW50IGluc3RlYWQgb2YKCXNwZWVkX3QsIHRodXMgY29tcGlsaW5nIGZhaWxlZCBvbiBNYWNPUwoJVGhhbmtzIHRvIEpvZSBTdHJvdXQgYW5kIG90aGVycyBmb3IgcmVwb3J0aW5nIHRoaXMgYnVnLgoJVGhhbmtzIHRvIEFuZHJldyBDaGlsZHMgYW5kIG90aGVycyBmb3Igc2VuZGluZyBhIHBhdGNoLgoKCVVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdGVybWlvcyBvcHRpb25zIG9mIHRoZSBmaXJzdCBhZGRyZXNzIHdlcmUKCWFwcGxpZWQgdG8gdGhlIHNlY29uZCBhZGRyZXNzLCByZXN1bHRpbmcgaW4gZXJyb3IKCSJJbmFwcHJvcHJpYXRlIGlvY3RsIGZvciBkZXZpY2UiIAoJVGhpcyBhZmZlY3RlZCB2ZXJzaW9uIDEuNy4zLjMgb25seS4KCVRlc3Q6IFRFUk1JT1NfUEhfQUxMCglUaGFua3MgdG8gSXZhbiBKLiBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgoJU29jYXQgZmFpbGVkIHRvIGNvbXBpbGUgd2hlbiBubyBwb2xsKCkgc3lzdGVtIGNhbGwgd2FzIGZvdW5kIGJ5Cgljb25maWd1cmUuCglUaGFua3MgdG8gSmFzb24gV2hpdGUgZm9yIHNlbmRpbmcgYSBwYXRjaC4KCglEdWUgdG8gdXNlIG9mIFNTTF9DVFhfY2xlYXJfbW9kZSgpIFNvY2F0IGZhaWxlZCB0byBjb21waWxlIG9uIG9sZAoJc3lzdGVtcyB3aXRoLCBlLmcuLCBPcGVuU1NMLTAuOS44LiBUaGFua3MgdG8gU2ltb24gTWF0dGVyIGFuZCBNb3JpdHogQi4KCWZvciByZXBvcnRpbmcgdGhpcyBwcm9ibGVtIGFuZCBzZW5kaW5nIGluaXRpYWwgcGF0Y2hlcy4KCglnZXRhZGRyaW5mbygpIGluIElQNC1TRU5EVE8gYW5kIElQNi1TRU5EVE8gYWRkcmVzc2VzIGZhaWxlZCB3aXRoCgkiYWlfc29ja3R5cGUgbm90IHN1cHBvcnRlZCIgd2hlbiBwcm90b2NvbCA2IHdhcyBhZGRyZXNzZWQuCglUaGUgZml4IHJlbW92ZXMgdGhlIHBvc3NpYmlsaXR5IHRvIHVzZSBzZXJ2aWNlIG5hbWVzIHdpdGggU0NUUC4KCVRlc3Q6IElQX1NFTkRUT182CglUaGFua3MgdG8gU/ZyZW4gZm9yIHNlbmRpbmcgYW4gaW5pdGlhbCBwYXRjaC4KCglVbmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIFNvY2F0IHByaW50ZWQgdGhlICJzb2NrZXQgLi4uIGlzIGF0IEVPRiIKCW11bHRpcGxlIHRpbWVzLgoJVGVzdDogTVVMVElQTEVfRU9GCgoJTmV3ZXIgcGFydHMgb2YgdGVzdC5zaCB1c2VkIHN1YnN0aXR1dGlvbnMgJHt4LCwqfSBvciAke3heXip9IHRoYXQgYXJlCglub3QgaW1wbGVtZW50ZWQgaW4gb2xkZXIgYmFzaCB2ZXJzaW9ucy4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjMuMzoKCkNvcnJlY3Rpb25zOgoJTWFrZWZpbGUuaW4gZGlkIG5vdCBzcGVjaWZ5IGRlcGVuZGVuY2llcyBvZiBmaWxhbiBvbiB2c25wcmludGZfci5vCglhbmQgc25wcmludGVyci5vCglBZGRlZCBkZWZpbml0aW9uIG9mIEZJTEFOX09CSlMKCVRoYW5rcyB0byBDcmFpZyBMZXJlcywgQ2xheXRvbiBTaG90d2VsbCwgYW5kIENocmlzIFBhY2toYW0gZm9yCglwcm92aWRpbmcgcGF0Y2hlcy4KCgljb25maWd1cmUgb3B0aW9uIC0tZW5hYmxlLW1zZ2xldmVsIGRpZCBub3Qgd29yayB3aXRoIG51bWJlcnMKCglUaGUgYXV0b2NvbmYgbWVjaGFuaXNtIGZvciBkZXRlcm1pbmluZyBTSElGVF9PRkZTRVQgZGlkIG5vdCB3b3JrIHdoZW4KCWNyb3NzIGNvbXBpbGluZy4KCVRoYW5rcyB0byBNYXggRnJlaXNpbmdlciBmcm9tIEdlbnRvbyBmb3Igc2VuZGluZyBhIHBhdGNoLgoKCVNvY2F0IHN0aWxsIGRlcGVuZGVkIG9uIG9ic29sZXRlIGdldGhvc3RieW5hbWUoKSBmdW5jdGlvbiwgdGh1cwoJY29tcGlsaW5nIHdpdGggTVVTTCBsaWJjIGZhaWxlZC4KCVByb2JsZW0gcmVwb3J0ZWQgYnkgS2VubmVkeTMzLgoKCVRoZSBhc3luYyBzaWduYWwgc2FmZSBkaWFnbm9zdGljIHN5c3RlbSB1c2VkIEZEcyAzIGFuZCA0IGludGVybmFsbHksIHNvCgl1c2Ugb2YgYXBwcm9wcmlhdGUgZmRpbiBvciBmZG91dCBsZWQgdG8gZmFpbHVyZXMuCglUZXN0OiBESUFHX0ZESU4KCVByb2JsZW0gcmVwb3J0ZWQgYnkgT251ciBTZW50/HJrLgoKCVRoZSBzb2NrZXQgYmFzZWQgbWVjaGFuaXNtIGZvciBwYXNzaW5nIG1lc3NhZ2VzIGFuZCBzaWduYWwgaW5mb3JtYXRpb24KCWZyb20gc2lnbmFsIGhhbmRsZXIgdG8gcHJvY2VzcyBjb3VsZCByZWFjaCBhbmQga2lsbCB0aGUgd3JvbmcgcHJvY2Vzcy4KCUludHJvZHVjZXMgZnVuY3Rpb25zIGRpYWdfc29ja19wYWlyKCksIGRpYWdfZm9yaygpCglUaGFua3MgdG8gRGFycmVuIFpoYW8gZm9yIGFuYWx5c2luZyBhbmQgcmVwb3J0aW5nIHRoaXMgcHJvYmxlbS4KCglPcHRpb24gaXB2Ni1qb2luLWdyb3VwIGRpZCBub3Qgd29yayBiZWNhdXNlIGl0IHdhcyBhcHBsaWVkIGluIHRoZSB3cm9uZwoJcGhhc2UKCVRlc3Q6IFVEUDZNVUxUSUNBU1RfVU5JRElSCglUaGFua3MgdG8gQW5ndXMgR3JhdHRvbiBmb3Igc2VuZGluZyBhIHBhdGNoLgoKCVNldHRpbmcgaXNwZWVkIGFuZCBvc3BlZWQgZmFpbGVkIGZvciBzb21lIHNlcmlhbCBkZXZpY2VzIGJlY2F1c2UgdGhlCgl0d28gc2V0dGluZ3Mgd2VyZSBhcHBsaWVkIHdpdGggdHdvIGRpZmZlcmVudCBnZXQvc2V0IGN5Y2xlcywgVGhhbmtzIHRvCglBbGV4YW5kcmUgRmVueW8gZm9yIHByb3ZpZGluZyBhbiBpbml0aWFsIHBhdGNoLgoJSG93ZXZlciwgdGhlIGFjdHVhbCBmaXggaXMgcGFydCBvZiBhIGNvbmNlcHR1YWwgY2hhbmdlIG9mIHRoZSB0ZXJtaW9zCgltb2R1bGUgdGhhdCBhaW1zIGZvciBhcHBseWluZyBhbGwgY2hhbmdlcyBpbiBhIHNpbmdsZSB0Y3NldGFkZHIgY2FsbC4KCUZpeGVzIEZyZWVCU0QgQnVnIDE5ODQ0MQoKCVRlcm1pb3Mgb3B0aW9ucyBUQUIwLFRBQjEsVEFCMixUQUIzLCBhbmQgWFRBQlMgZGlkIG5vdCBoYXZlIGFuIGVmZmVjdC4KCVRoYW5rcyB0byBBbGFuIFdhbHRlcnMgZm9yIHJlcG9ydGluZyB0aGlzIGJ1Zy4KCglTdWJzdGl0dXRlZCBjdW1iZXJzb20gSVNQRUVEX09GRlNFVCBtZWNoYW5pc20gZm9yIGNmc2V0aXNwZWVkKCkgY2FsbHMKCglXaXRoIFRDUDYtTElTVEVOIGFuZCB0aGUgb3RoZXIgcGFzc2l2ZSBJUHY2IGFkZHJlc3NlcyB0aGUgcmFuZ2Ugb3B0aW9uCglqdXN0IGZhaWxlZDogZHVlIHRvIGEgYnVnIGluIHRoZSBzeW50YXggcGFyc2VyIGFuZCB0d28gbW9yZSBidWdzIGluCgl0aGUgeGlvY2hlY2tyYW5nZV9pcDYoKSBmdW5jdGlvbi4KCVRoZSBzeW50YXggaGFzIG5vdyBiZWVuIGNoYW5nZWQgZnJvbSAiWzo6MS8xMjhdIiB0byAiWzo6MV0vMTI4IiEKCVRoYW5rcyBMZWFoIE5ldWtpcmNoZW4gZm9yIHNlbmRpbmcgYW4gaW5pdGlhbCBmaXguCgoJRm9yIG5hbWUgcmVzb2x1dGlvbiBTb2NhdCBvbmx5IGNoZWNrZWQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgaG9zdAoJbmFtZSB0byBkZWNpZGUgaWYgaXQgaXMgYW4gSVB2NCBhZGRyZXNzLiBUaGlzIHdhcyBub3QgUkZDIGNvbmZvcm0uIFRoaXMKCWZpeCByZW1vdmVzIHRoZSBwb3NzaWJpbGl0eSBmb3IgdXNlIG9mIElQdjQgYWRkcmVzc2VzIHdpdGggSVB2NiwgZS5nLgoJVENQNjoxMjcuMC4wLjE6ODAKCURlYmlhbiBpc3N1ZSA2OTU4ODUKCVRoYW5rcyB0byBOaWNvbGFzIEZvdXJuaWwgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgoKCVByaW50IGEgdXNlZnVsIGVycm9yIG1lc3NhZ2Ugd2hlbiBzaW5nbGUgY2hhcmFjdGVyIG9wdGlvbnMgYXBwZWFyIHRvIGJlCgltZXJnZWQgaW4gU29jYXQgaW52b2NhdGlvbgogICAgICAgIFRlc3Q6IFNPQ0NBVF9PUFRfSElOVAoKCUZpeGVkIHNvbWUgZG9jdSB0eXBvcy4KCVRoYW5rcyB0byBUcmF2aXMgV2VsbG1hbiwgVGhvbWFzIDx0anBzNjM2PiwgRGFuIEtlbmlnc2JlcmcsCglKdWxpYW4gWmlubiwgYW5kIFNpbW9uIE1hdHRlcgoKUG9ydGluZzoKCU9wZW5TU0wgZnVuY3Rpb25zIFRMUzFfY2xpZW50X21ldGhvZCgpIGFuZCBzaW1pbGFyIGFyZSAKCWRlcHJlY2F0ZWQuIFNvY2F0IG5vdyB1c2VzIHJlY29tbWVuZGVkIFRMU19jbGllbnRfbWV0aG9kKCkuIFRoZSBvbGQKCWZ1bmN0aW9ucyBhbmQgZGVwZW5kZW5kIG9wdGlvbiBvcGVuc3NsLW1ldGhvZCBjYW4gc3RpbGwgYmUKCXVzZWQgd2hlbiBjb25maWd1cmluZyBzb2NhdCB3aXRoIC0tZW5hYmxlLW9wZW5zc2wtbWV0aG9kCgoJU2hlbGwgc2NyaXB0cyBpbiBzb2NhdCBkaXN0cmlidXRpb24gYXJlIG5vdyBoZWFkZWQgd2l0aDoKCSMhIC91c3IvYmluL2VudiBiYXNoCgl0byBtYWtlIHRoZW0gYmV0dGVyIHBvcnRhYmxlIHRvIHN5c3RlbXMgd2l0aG91dCAvYmluL2Jhc2gKCVRoYW5rcyB0byBNYXlhIFJhc2hpc2ggZm9yIHNlbmRpbmcgYSBwYXRjaAoKCVJFU19BQU9OTFksIFJFU19QUklNQVJZIGFyZSBkZXByZWNhdGVkLiBZb3UgY2FuIHN0aWxsIGVuYWJsZSB0aGVtIHdpdGgKCWNvbmZpZ3VyZSBvcHRpb24gLS1lbmFibGUtcmVzLWRlcHJlY2F0ZWQuCgoJTmV3IHZlcnNpb25zIG9mIE9wZW5TU0wgcHJlc2V0IFNTTF9NT0RFX0FVVE9fUkVUUlkgd2hpY2ggbWF5IGhhbmcgc29jYXQuCglTb2x1dGlvbjogY2xlYXIgU1NMX01PREVfQVVUT19SRVRSWSB3aGVuIGl0IGlzIHNldC4KCglSZW5hbWVkIGNvbmZpZ3VyZS5pbiB0byBjb25maWd1cmUuYWMgYW5kIHNldCBhbiBhcHByb3ByaWF0ZSBzeW1saW5rIGZvcgoJb2xkZXIgZW52aXJvbm1lbnRzLgoJUmVsYXRlZCBHZW50b28gYnVnIDQyNjI2MjogV2FybmluZyBvbiBjb25maWd1cmUuaW4KCVRoYW5rcyB0byBGcmFuY2VzY28gVHVyY28gZm9yIHJlcG9ydGluZyB0aGF0IHdhcm5pbmcuCgoJRml4ZWQgbmV3IElQdjYgcmFuZ2UgY29kZSBmb3IgcGxhdGZvcm1zIHdpdGhvdXQgczZfYWRkcjMyIGNvbXBvbmVudC4KClRlc3Rpbmc6Cgl0ZXN0LnNoOiBTaG93IGEgd2FybmluZyB3aGVuIHBoYXNlLTEgKGluc2VjdXJlIHBoYXNlKSBvZiBhIHNlY3VyaXR5Cgl0ZXN0IGZhaWxzCgoJT3BlblNTTCB0ZXN0cyBmYWlsZWQgb24gYWN0dWFsIExpbnV4IGRpc3RyaWJ1dGlvbnMuIE1lYXN1cmVzOgoJSW5jcmVhc2VkIGtleSBsZW5ndGhzIGZyb20gNzY4IHRvIDEwMjQgYml0cwoJQWRkZWQgdGVzdC5zaCBvcHRpb24gLUMgdG8gZGVsZXRlIHRlbXAgY2VydHMgZnJvbSBwcmV2c2lvdXMgcnVucwoJUHJvdmlkZSBESC1wYXJhbWV0ZXIgaW4gY2VydGlmaWNhdGUgaW4gUEVNCglPcGVuU1NMIHNfc2VydmVyIG9wdGlvbiAtdmVyaWZ5IDAgbXVzdCBiZSBvbWl0dGVkCglPcGVuU1NMIGF1dGhlbnRpY2F0aW9uIG1ldGhvZCBhTlVMTCBubyBsb25nZXIgd29ya3MKCUZhaWx1cmUgb2YgY2lwaGVyIGFOVUxMIGlzIG5vdCBhIGZhaWx1cmUKCUZhaWx1cmUgb2YgbWV0aG9kcyBTU0wzIGFuZCBTU0wyMyBpcyBkZXNpcmVkCgoJdGVzdC5zaCBkZXBlbmRlZCBvbiBpZmNvbmZpZyBhbmQgbmV0c3RhdCB1dGlsaXRpZXMgd2hpY2ggYXJlIG5vIGxvbmdlcgoJYXZhaWxhYmllIGluIHNvbWUgZGlzdHJpYnV0aW9ucy4gdGVzdC5zaCBub3cgY2hlY2tzIGZvciBhbmQgcHJlZmVycwoJaXAgYW5kIHNzLgoJVGhhbmtzIHRvIFJ1ZWRpZ2VyIE1laWVyIGZvciByZXBvcnRpbmcgdGhpcyBwcm9ibGVtLgoKCU1vcmUgY29ycmVjdGlvbnMgdG8gdGVzdC5zaDoKCUxhbmd1YWdlIHNldHRpbmdzIGNvdWxkIHN0aWxsIGluZmx1ZW5jZSB0ZXN0IHJlc3VsdHMKCW5ldHN0YXQgd2FzIHN0aWxsIHJlcXVpcmVkCglTdXBwcmVzcyB1c2xlZXAgZGVwcmVjYXRlZCBtZXNzYWcKCUZvcmNlIHVzZSBvZiBJUHY0IHdpdGggc29tZSBjZXJ0aWZpY2F0ZXMKCVNldCB0aW1lb3V0IGZvciBVRFB4TUFYQ0hJTERSRU4gdGVzdHMKCkdpdDoKCUFkZGVkIG1pc3NpbmcgQ29uZmlnL01ha2VmaWxlLkRyYWdvbkZseS0yLTgtMiwKCUNvbmZpZy9jb25maWcuRHJhZ29uRmx5LTItOC0yLmgKCVJlbW92ZWQgdGVzdGNlcnQuY29uZiAodG8gYmUgZ2VuZXJhdGVkIGJ5IHRlc3Quc2gpCgpDb3NtZXRpY3M6CglTaW1wbGlmaWVkIGhhbmRsaW5nIG9mIG1pc3NpbmcgdGVybWlvcyBkZWZpbmVzLgoKTmV3IGZlYXR1cmVzOgoJUGVybWl0IGNvbWJpbmVkIC1kIG9wdGlvbnMgYXMgLWRkIGV0Yy4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjMuMjoKCmNvcnJlY3Rpb25zOgoJU0lHU0VHViBhbmQgb3RoZXIgc2lnbmFscyBjb3VsZCBsZWFkIHRvIGEgMTAwJSBDUFUgbG9vcAoKCUZhaWxpbmcgbmFtZSByZXNvbHV0aW9uIGNvdWxkIGxlYWQgdG8gU0lHU0VHVgoJVGhhbmtzIHRvIE1heCBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgoJSW5jbHVkZSA8c3RkZGVmLmg+IGZvciBwdHJkaWZmX3QKCVRoYW5rcyB0byBKZXJvZW4gUm9vdmVycyBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgoJQnVpbGRpbmcgd2l0aCAtLWRpc2FibGUtc3ljbHMgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNzbGNscy5oIGRlZmluZXMKCglTb2NhdCBodW5nIHdoZW4gY29uZmlndXJlZCB3aXRoIC0tZGlzYWJsZS1zeWNscy4KCglTb21lIG1pbm9yIGNvcnJlY3Rpb25zIHdpdGggaW5jbHVkZXMgZXRjLgoKCU9wdGlvbiBzby1yZXVzZXBvcnQgZGlkIG5vdCB3b3JrLiBUaGFua3MgdG8gU29tZSBSYWdoYXZlbmRyYSBQcmFiaHUKCWZvciBzZW5kaW5nIGEgcGF0Y2guCgoJUHJvZ3JhbXMgaW52b2tlZCB3aXRoIEVYRUMsIG5vZm9yaywgYW5kIC11IG9yIC1VIGhhZCBzdGRpbiBhbmQgc3Rkb3V0CglpbmNvcnJlY3RseSBhc3NpZ25lZAoJVGVzdDogRVhFQ19OT0ZPUktfVU5JRElSCglUaGFua3MgdG8gRGF2aWQgUmVpc3MgZm9yIHJlcG9ydGluZyB0aGlzIHByb2JsZW0uCgoJU29jYXQgZXhpdGVkIHdpdGggc3RhdHVzIDAgZXZlbiB3aGVuIGEgcHJvZ3JhbSBpbnZva2VkIHdpdGggU1lTVEVNIG9yCglFWEVDIGZhaWxlZC4KCVRlc3RzOiBTWVNURU1fUkMgRVhFQ19SQwoJSXNzdWUgcmVwb3J0ZWQgYnkgRmVsaXggV2lua2VsbWFubi4KCglBZGRyZXNzU2FuaXRpemVyIHJlcG9ydGVkIGEgZmV3IGJ1ZmZlciBvdmVyZmxvd3MgKGZhbHNlIHBvc2l0aXZlcykuCglOZXZlcnRoZWxlc3MgZml4ZWQgU29jYXQgc291cmNlLgoJSXNzdWUgcmVwb3J0ZWQgYnkgSGFubm8gQvZjay4KCglTb2NhdCBkaWQgbm90IHVzZSBvcHRpb24gaXB2Ni1qb2luLWdyb3VwLgoJVGVzdDogVVNFX0lQVjZfSk9JTl9HUk9VUAoJVGhhbmtzIHRvIExpbnVzIEz8c3NpbmcgZm9yIHNlbmRpbmcgYSBwYXRjaC4KCglVRFAtTElTVEVOIGRpZCBub3QgaG9ub3IgdGhlIG1heC1jaGlsZHJlbiBvcHRpb24uCglUZXN0OiBVRFA0TUFYQ0hJTERSRU4gVURQNk1BWENISUxEUkVOCglUaGFua3MgdG8gTGVhbmRlciBCZXJ3ZXJzIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KCglPcHRpb25zIHNvLXJjdnRpbWVvIGFuZCBzby1zbmR0aW1lbyBkbyBub3Qgd29yayB3aXRoIHBvbGwoKS9zZWxlY3QoKQoJYW5kIHRoZXJlZm9yZSB3ZXJlIHVzZWxlc3MuCglUaGFua3MgdG8gU3RldmUgQm9yZW5zdGVpbiBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgoJT3B0aW9uIGRocGFyYW0gd2FzIGRvY3VtZW50ZWQgYXMgZGhwYXJhbXMuIEFkZGVkIHRoZSBhbGlhcyBuYW1lCglkaHBhcmFtcyB0byBmaXggdGhpcy4KCVRoYW5rcyB0byBBbGV4YW5kZXIgTmV1bWFubiBmb3Igc2VuZGluZyBhIHBhdGNoLgoKCU9wdGlvbnMgc2h1dC1kb3duIGFuZCBzaHV0LWNsb3NlIGRpZCBub3Qgd29yay4KCVRoYW5rcyB0byBTdGVmYW4gU2NoaW1hbnNraSBmb3IgcHJvdmlkaW5nIGEgcGF0Y2guCgoJVGhlcmUgd2FzIGEgYnVnIGluIHByaW50aW5nIHJlYWRsaW5lIGxvZyBtZXNzYWdlIGNhdXNlZCBieSBhIG1pc2xlYWRpbmcKCWluZGVudGF0aW9uLgoJVGhhbmtzIHRvIFBhdWwgV291dGVycyBmb3IgcmVwb3J0aW5nLgoKCVRoZSBpbnRlcm5hbCB2c25wcmludGZfciBmdW5jdGlvbiBsb29wZWQgb3IgY3Jhc2hlZCBvbiBzaXplIHBhcmFtZXRlcgoJd2l0aCBoZXhhZGVjaW1hbCBvdXRwdXQuCgoJSWdub3JlIGV4aXQgY29kZSBvZiBjaGlsZCBwcm9jZXNzIHdoZW4gaXQgd2FzIGtpbGxlZCBieSBtYXN0ZXIgZHVlIHRvCglFT0YKCglDb3JyZWN0ZWQgYnl0ZSBvcmRlciBvbiByZWFkIG9mIElQVjZfVENMQVNTIHZhbHVlIGZyb20gYW5jaWxsYXJ5CgltZXNzYWdlCgoJRml4ZWQgdHlwZSBvZiB0aGUgYm9vbCBlbGVtZW50IGluIG9wdGlvbnMuIFRoaXMgaGFkIGJ1ZyBjYXVzZWQgZmFpbHVyZXMKCWUuZy4gb2YgaWdub3JlZW9mIG9uIGJpZy1lbmRpYW4gc3lzdGVtcyB3aGVuIGJvb2wgd2FzIG5vdCBiYXNlZCBvbiBpbnQuCgoJT24gc3lzdGVtcyB3aXRoIHByZWRlZmluZWQgYm9vbCB0eXBlIHdob3NlIHNpemUgZGlmZmVycyBmcm9tIGludCBzb21lCglJUHY2IGFuZCBUQ1Agb3B0aW9ucyAocGVyIHNldHNvY2tvcHQoKSkgZmFpbGVkLgoKCUxlbmd0aCBvZiBpbnRlZ3JhbCBkYXRhIGluIGFuY2lsbGFyeSBtZXNzYWdlcyB2YXJpZXMgKFRPUzogMSBieXRlLAoJVFRMOiA0IGJ5dGVzKSwgdGhlIG9sZCBpbXBsZW1lbnRhdGlvbiBmYWlsZWQgZm9yIFRUTCBvbiBiaWctZW5kaWFuCglob3N0cy4KCglGaXhlZCBhbiBpc3N1ZSBpbiBvcHRpb25zIHByb2Nlc3Npbmc6IFRVTiBhbmQgRE5TIGZsYWdzIGhhZCBmYWlsZWQgb24KCWJpZy1lbmRpYW4gc3lzdGVtcyBhbmQgdGhlIE5PLSBmb3JtcyBoYWQgcHJvYmFibGUgbmV2ZXIgd29ya2VkLgoKcG9ydGluZzoKCVR5cGUgY29uZmxpY3QgYmV0d2VlbiBpbnQgYW5kIHNpZ19hdG9taWNfdCBiZXR3ZWVuIGRlY2xhcmF0aW9uIGFuZAoJZGVmaW5pdGlvbiBvZiBkaWFnX2ltbWVkaWF0ZV90eXBlIGFuZCBkaWFnX2ltbWVkaWF0ZV9leGl0IGJyb2tlCgljb21waWxhdGlvbiBvbiBGcmVlQlNEIDEwLjEgd2l0aCBjbGFuZy4gVGhhbmtzIHRvIEVtYW51ZWwgSGF1cHQgZm9yCglyZXBvcnRpbmcgdGhpcyBidWcuCgoJU29jYXQgZmFpbGVkIHRvIGNvbXBpbGUgb24gcGxhdGZvcm1zIHdpdGggT3BlblNTTCB3aXRob3V0CglEVExTdjFfY2xpZW50X21ldGhvZCBvciBEVExTdjFfc2VydmVyX21ldGhvZC4KCVRoYW5rcyB0byBTaW1vbiBNYXR0ZXIgZm9yIHNlbmRpbmcgYSBwYXRjaC4KCglOdXR0WCBPUyBoZWFkZXJzIGRvIG5vdCBwcm92aWRlIHN0cnVjdCBpcCwgdGh1cyBzb2NhdCBkaWQgbm90IGNvbXBpbGUuCglNYWRlIHN0cnVjdCBpcCBzdWJqZWN0IHRvIGNvbmZpZ3VyZS4KCVRoYW5rcyB0byBTUCBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgoJU29jYXQgZmFpbGVkIHRvIGNvbXBpbGUgd2l0aCBPcGVuU1NMIHZlcnNpb24gMS4wLjJkIHdoZXJlCglTU0x2M19zZXJ2ZXJfbWV0aG9kIGFuZCBTU0x2M19jbGllbnRfbWV0aG9kIGFyZSBubyBsb25nZXIgZGVmaW5lZC4KCVRoYW5rcyB0byBNaXNjaGEgdGVyIFNtaXR0ZW4gZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlIGFuZCBwcm92aWRpbmcKCWEgcGF0Y2guCgoJY29uZmlndXJlIGNoZWNrZWQgZm9yIE9wZW5TU0wgRUNfS0VZIGFzc3VtaW5nIGl0IGlzIGEgZGVmaW5lIGJ1dCBpdAoJaXMgYSB0eXBlLCB0aHVzIE9wZW5TU0wgRUNESEUgY2lwaGVycyBmYWlsZWQgZXZlbiBvbiBMaW51eC4KCVRoYW5rcyB0byBBbmRyZXkgQXJhcG92IGZvciByZXBvcnRpbmcgdGhpcyBidWcuCgoJQ2hhbmdlcyB0byBtYWtlIHNvY2F0IGNvbXBpbGUgd2l0aCBPcGVuU1NMIDEuMS4gCglUaGFua3MgdG8gU2ViYXN0aWFuIEFuZHJ6ZWogU2lld2lvciBlLmEuIGZyb20gdGhlIERlYmlhbiB0ZWFtIGZvcgoJcHJvdmlkaW5nIHRoZSBiYXNlIHBhdGNoLgoJRGViaWFuIEJ1ZyM4Mjg1NTAKCglNYWtlIFNvY2F0IGNvbXBhdGlibGUgd2l0aCBCb3JpbmdTU0wuCglUaGFua3MgdG8gTWF0dCBCcmFpdGh3YWl0ZSBmb3IgcHJvdmlkaW5nIGEgcGF0Y2guCgoJT3BlblNTTDogVXNlIFJBTkRfc3RhdHVzIHRvIGRldGVybWluZSBQUk5HIHN0YXRlCglUaGFua3MgdG8gQWRhbSBMYW5nbGV5IGZvciBwcm92aWRpbmcgYSBwYXRjaAoKCUFJWC03IHVzZXMgYW4gZXh0ZW5kZWQgT19BQ0NNT0RFIHRoYXQgZG9lcyBub3QgZml0IHNvY2F0J3MgaW50ZXJuYWwKCXJlcXVpcmVtZW50cy4gVGhhbmtzIHRvIEdhcnJpY2sgVHJvd3NkYWxlIGZvciBwcm92aWRpbmcgYSBwYXRjaAoKCUxpYnJlU1NMIHN1cHBvcnQ6IGNoZWNrIGZvciBPUEVOU1NMX05PX0NPTVAKCVRoYW5rcyB0byBCZXJuYXJkIFNwaWwgZm9yIHByb3ZpZGluZyBhIHBhdGNoCgp0ZXN0aW5nOgoJc29ja3M0ZWNoby5zaCBhbmQgc29ja3M0YS1lY2hvLnNoIGh1bmcgd2l0aCBuZXcgYmFzaCB3aXRoIHJlYWQgLW4KCgl0ZXN0LnNoOiBzdGRlcnI7IG9wdGlvbiAtdiAodmVyYm9zZSk7IEZET1VUX0VSUk9SIGRlc2NyaXB0aW9uCgoJaW1wcm92ZWQgcHJveHkuc2ggLSBpdCBub3cgYWxzbyB0YWtlcyBob3N0bmFtZXMKCglBIGZldyBjb3JyZWN0aW9ucyBpbiB0ZXN0LnNoCgoJRFRMUzEgdGVzdCBoYW5ncyBvbiBzb21lIGRpc3RyaWJ1dGlvbnMuIFRlc3QgaXMgbm93IG9ubHkgcGVyZm9ybWVkCgl3aXRoIE9wZW5TU0wgMS4wLjIgb3IgaGlnaGVyLgoKCU1vcmUgY29ycmVjdGlvbnMgdG8gdGVzdC5zaCB0aGF0IHJldmVhbCBhIG1pc3Rha2Ugd2l0aCBJUFY2X1RDTEFTUwoKZG9jdToKCUNvcnJlY3RlZCBzb3VyY2Ugb2Ygc29jYXQgbWFuIHBhZ2UgdG8gY29ycmVjdGx5IHNob3cgbWFuIHJlZmVyZW5jZXMKCWxpa2Ugc29ja2V0KDIpOyByZW1vdmVkIG9ic2VvbGV0ZSBlbnRyaWVzIGZyb20gU2VlIEFsc28KCglEb2N1IGFuZCBzb21lIGNvbW1lbnRzIG1lbnRpb25lZCBhZGRyZXNzZXMgU1NMLUxJU1RFTiBhbmQgU1NMLUNPTk5FQ1QKCXRoYXQgZG8gbm90IGV4aXN0IChPUEVOU1NMLUxJU1RFTiwgU1NMLUw7IGFuZCBPUEVOTlNTTC1DT05ORUNULCBTU0wKCWFyZSBjb3JyZWN0KS4KCVRoYW5rcyB0byBaaGlnYW5nIFdhbmcgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgoKCUZpeGVkIGEgY291cGxlIG9mIEVuZ2xpc2ggc3BlbGxpbmcgYW5kIGdyYW1tYXIgbWlzdGFrZXMuCglUaGFua3MgdG8gSmFrdWIgV2lsZCBmb3Igc2VuZGluZyB0aGUgcGF0Y2hlcy4KCglOT0VYUEFORCgpIHdhcyBub3QgcmVzb2x2ZWQgMiB0aW1lcy4KCglNb3JlIG1pbm9yIGRvY3UgY29ycmVjdGlvbnMKCmxlZ2FsOgoJQWRkZWQgY29udHJpYnV0b3JzIHRvIGNvcHlyaWdodCBub3RpY2VzLiBTdWdnZXN0ZWQgYnkgTWF0dCBCcmFpdGh3YWl0ZS4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjMuMToKCnNlY3VyaXR5OgoJU29jYXQgc2VjdXJpdHkgYWR2aXNvcnkgOAoJQSBzdGFjayBvdmVyZmxvdyBpbiB2dWxuZXJhYmlsaXR5IHdhcyBmb3VuZCB0aGF0IGNhbiBiZSB0cmlnZ2VyZWQgd2hlbgoJY29tbWFuZCBsaW5lIGFyZ3VtZW50cyAoY29tcGxldGUgYWRkcmVzcyBzcGVjaWZpY2F0aW9ucywgaG9zdCBuYW1lcywKCWZpbGUgbmFtZXMpIGFyZSBsb25nZXIgdGhhbiA1MTIgYnl0ZXMuCglTdWNjZXNzZnVsIGV4cGxvaXRhdGlvbiBtaWdodCBhbGxvdyBhbiBhdHRhY2tlciB0byBleGVjdXRlIGFyYml0cmFyeQoJY29kZSB3aXRoIHRoZSBwcml2aWxlZ2VzIG9mIHRoZSBzb2NhdCBwcm9jZXNzLgoJVGhpcyB2dWxuZXJhYmlsaXR5IGNhbiBvbmx5IGJlIGV4cGxvaXRlZCB3aGVuIGFuIGF0dGFja2VyIGlzIGFibGUgdG8KCWluamVjdCBkYXRhIGludG8gc29jYXQncyBjb21tYW5kIGxpbmUuCglBIHZ1bG5lcmFibGUgc2NlbmFyaW8gd291bGQgYmUgYSBDR0kgc2NyaXB0IHRoYXQgcmVhZHMgZGF0YSBmcm9tIGNsaWVudHMKCWFuZCB1c2VzIChwYXJ0cyBvZikgdGhpcyBkYXRhIGFzIGhvc3RuYW1lIGZvciBhIFNvY2F0IGludm9jYXRpb24uCglUZXN0OiBORVNURURPVkZMCglDcmVkaXRzIHRvIFRha3VtaSBBa2l5YW1hIGZvciBmaW5kaW5nIGFuZCByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KCglTb2NhdCBzZWN1cml0eSBhZHZpc29yeSA3CglNU1ZSLTE0OTkKCUluIHRoZSBPcGVuU1NMIGFkZHJlc3MgaW1wbGVtZW50YXRpb24gdGhlIGhhcmQgY29kZWQgMTAyNCBiaXQgREggcAoJcGFyYW1ldGVyIHdhcyBub3QgcHJpbWUuIFRoZSBlZmZlY3RpdmUgY3J5cHRvZ3JhcGhpYyBzdHJlbmd0aCBvZiBhIGtleQoJZXhjaGFuZ2UgdXNpbmcgdGhlc2UgcGFyYW1ldGVycyB3YXMgd2Vha2VyIHRoYW4gdGhlIG9uZSBvbmUgY291bGQgZ2V0IGJ5Cgl1c2luZyBhIHByaW1lIHAuIE1vcmVvdmVyLCBzaW5jZSB0aGVyZSBpcyBubyBpbmRpY2F0aW9uIG9mIGhvdyB0aGVzZQoJcGFyYW1ldGVycyB3ZXJlIGNob3NlbiwgdGhlIGV4aXN0ZW5jZSBvZiBhIHRyYXBkb29yIHRoYXQgbWFrZXMgcG9zc2libGUKCWZvciBhbiBlYXZlc2Ryb3BwZXIgdG8gcmVjb3ZlciB0aGUgc2hhcmVkIHNlY3JldCBmcm9tIGEga2V5IGV4Y2hhbmdlCgl0aGF0IHVzZXMgdGhlbSBjYW5ub3QgYmUgcnVsZWQgb3V0LgoJRnV0aGVybW9yZSwgMTAyNGJpdCBpcyBub3QgY29uc2lkZXJlZCBzdWZmaWNpZW50bHkgc2VjdXJlLgoJRml4OiBnZW5lcmF0ZWQgYSBuZXcgMjA0OGJpdCBwcmltZS4KCVRoYW5rcyB0byBTYW50aWFnbyBaYW5lbGxhLUJlZ3VlbGluIGFuZCBNaWNyb3NvZnQgVnVsbmVyYWJpbGl0eQoJUmVzZWFyY2ggKE1TVlIpIGZvciBmaW5kaW5nIGFuZCByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjMuMDoKCnNlY3VyaXR5OgoJU29jYXQgc2VjdXJpdHkgYWR2aXNvcnkgNgoJQ1ZFLTIwMTUtMTM3OTogUG9zc2libGUgRG9TIHdpdGggZm9yawoJRml4ZWQgcHJvYmxlbXMgd2l0aCBzaWduYWwgaGFuZGxpbmcgY2F1c2VkIGJ5IHVzZSBvZiBub3QgYXN5bmMgc2lnbmFsCglzYWZlIGZ1bmN0aW9ucyBpbiBzaWduYWwgaGFuZGxlcnMgdGhhdCBjb3VsZCBmcmVlemUgc29jYXQsIGFsbG93aW5nCglkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2tzLgoJTWFueSBjaGFuZ2VzIGluIHNpZ25hbCBoYW5kbGluZyBhbmQgdGhlIGRpYWdub3N0aWMgbWVzc2FnZXMgc3lzdGVtIHdlcmUKCWFwcGxpZWQgdG8gbWFrZSB0aGUgY29kZSBhc3luYyBzaWduYWwgc2FmZSBidXQgc3RpbGwgcHJvdmlkZSBkZXRhaWxsZWQKCWxvZ2dpbmcgZnJvbSBzaWduYWwgaGFuZGxlcnM6CglDb2RlZCBmdW5jdGlvbiB2c25wcmludGZfcigpIGFzIGFzeW5jIHNpZ25hbCBzYWZlIGluY29tcGxldGUgc3Vic3RpdHV0ZQoJb2YgbGliYyB2c25wcmludGYoKQoJQ29kZWQgZnVuY3Rpb24gc25wcmludGVycigpIHRvIHJlcGxhY2UgJW0gaW4gc3RyaW5ncyB3aXRoIGEgc3lzdGVtIGVycm9yCgltZXNzYWdlCglJbnN0ZWFkIG9mIGdldHRpbWVvZmRheSgpIHVzZSBjbG9ja19nZXR0aW1lKCkgd2hlbiBhdmFpbGFibGUKCVBhc3MgRGlhZ25vc3RpYyBtZXNzYWdlcyBmcm9tIHNpZ25hbCBoYW5kbGVyIHBlciB1bml4IHNvY2tldCB0byB0aGUgbWFpbgoJcHJvZ3JhbSBmbG93CglVc2Ugc2lnYWN0aW9uKCkgaW5zdGVhZCBvZiBzaWduYWwoKSBmb3IgYmV0dGVyIGNvbnRyb2wKCVR1cm4gb2ZmIG5lc3RlZCBzaWduYWwgaGFuZGxlciBpbnZvY2F0aW9ucwoJVGhhbmtzIHRvIFBldGVyIExvYnNpbmdlciBmb3IgcmVwb3J0aW5nIGFuZCBleHBsYWluaW5nIHRoaXMgaXNzdWUuCgoJUmVkIEhhdCBpc3N1ZSAxMDE5OTc1OiBhZGQgVExTIGhvc3QgbmFtZSBjaGVja3MKCU9wZW5TU0wgY2xpZW50IGNoZWNrcyBpZiB0aGUgc2VydmVyIGNlcnRpZmljYXRlcyBuYW1lcyBpbgoJZXh0ZW5zaW9ucy9zdWJqZWN0QWx0TmFtZS9ETlMgb3IgaW4gc3ViamVjdC9jb21tb25OYW1lIG1hdGNoIHRoZSBuYW1lCgl1c2VkIHRvIGNvbm5lY3Qgb3IgdGhlIHZhbHVlIG9mIHRoZSBvcGVuc3NsLWNvbW1vbm5hbWUgb3B0aW9uLgoJVGVzdDogT1BFTlNTTF9DTl9DTElFTlRfU0VDVVJJVFkKCglPcGVuU1NMIHNlcnZlciBjaGVja3MgaWYgdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZXMgbmFtZXMgaW4KCWV4dGVuc2lvbnMvc3ViamVjdEFsdE5hbWVzL0ROUyBvciBzdWJqZWN0L2NvbW1vbk5hbWUgbWF0Y2ggdGhlIHZhbHVlIG9mCgl0aGUgb3BlbnNzbC1jb21tb25uYW1lIG9wdGlvbiB3aGVuIGl0IGlzIHVzZWQuCglUZXN0OiBPUEVOU1NMX0NOX1NFUlZFUl9TRUNVUklUWQoKCVJlZCBIYXQgaXNzdWUgMTAxOTk2NDogc29jYXQgbm93IHVzZXMgdGhlIHN5c3RlbSBjZXJ0aWZpY2F0ZSBzdG9yZSB3aXRoCglPUEVOU1NMIHdoZW4gbmVpdGhlciBvcHRpb25zIGNhZmlsZSBub3IgY2FwYXRoIGFyZSB1c2VkCgoJUmVkIEhhdCBpc3N1ZSAxMDE5OTcyOiBuZWVkcyB0byBzcGVjaWZ5IE9wZW5TU0wgY2lwaGVyIHN1aXRlcwoJRGVmYXVsdCBjaXBoZXJsaXN0IGlzIG5vdyAiSElHSDotTlVMTDotUFNLOi1hTlVMTCIgaW5zdGVhZCBvZiBlbXB0eSB0bwoJcHJldmVudCBkb3duZ3JhZGUgYXR0YWNrcwoKbmV3IGZlYXR1cmVzOgoJT3BlblNTTCBhZGRyZXNzZXMgc2V0IGNvdXBsZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSB2YWx1ZXMgaW4KCXBlZXIgY2VydGlmaWNhdGUsIGUuZy46IAoJU09DQVRfT1BFTlNTTF9YNTA5X1NVQkpFQ1QsIFNPQ0FUX09QRU5TU0xfWDUwOV9JU1NVRVIsCglTT0NBVF9PUEVOU1NMX1g1MDlfQ09NTU9OTkFNRSwgCglTT0NBVF9PUEVOU1NMX1g1MDlWM19TVUJKRUNUQUxUTkFNRV9ETlMKCVRlc3RzOiBFTlZfT1BFTlNTTF97Q0xJRU5ULFNFUlZFUn1fWDUwOV8qCgoJQWRkZWQgc3VwcG9ydCBmb3IgbWV0aG9kcyBUTFN2MSwgVExTdjEuMSwgVExTdjEuMiwgYW5kIERUTFMxCglUZXN0czogT1BFTlNTTF9NRVRIT0RfKgoKCUVuYWJsZWQgT3BlblNTTCBzZXJ2ZXIgc2lkZSB1c2Ugb2YgRUNESEUgY2lwaGVycy4gRmVhdHVyZSBzdWdnZXN0ZWQKCWJ5IEFuZHJleSBBcmFwb3YuCgoJQWRkZWQgYSBuZXcgb3B0aW9uIHRlcm1pb3MtcmF3ZXIgZm9yIHB0eXMuCglUaGFua3MgdG8gQ2hyaXN0aWFuIFZvZ2VsZ3NhbmcgZm9yIHBvaW50aW5nIG1lIHRvIHRoaXMgcmVxdWlyZW1lbnQKCmNvcnJlY3Rpb25zOgoJQmluZCB3aXRoIEFCU1RSQUNUIGNvbW1hbmRzIHVzZWQgbm9uLWFic3RyYWN0IG5hbWVzcGFjZSAoTGludXgpLgoJVGVzdDogQUJTVFJBQ1RfQklORAoJVGhhbmtzIHRvIERlbmlzIFNoYXRvdiBmb3IgcmVwb3J0aW5nIHRoaXMgYnVnLgoKCUZpeGVkIHJldHVybiB2YWx1ZSBvZiBuZXN0bGV4KCkKCglPcHRpb24gaWdub3JlZW9mIG9uIHRoZSByaWdodCBhZGRyZXNzIGh1bmcuCglUZXN0OiBJR05PUkVFT0ZfUkVWCglUaGFua3MgdG8gRnJhbnogRmFzY2hpbmcgZm9yIHJlcG9ydGluZyB0aGlzIGJ1Zy4KCglBZGRyZXNzIFNZU1RFTSwgd2hlbiB0ZXJtaW5hdGluZywgc2h1dCBkb3duIGl0cyBwYXJlbnQgYWRkcmVzc2VzLAoJZS5nLiBhbiBTU0wgY29ubmVjdGlvbiB3aGljaCB0aGUgcGFyZW50IGFzc3VtZWQgdG8gc3RpbGwgYmUgYWN0aXZlLgoJVGVzdDogU1lTVEVNX1NIVVRET1dOCgoJUGFzc2l2ZSAobGlzdGVuaW5nIG9yIHJlY2VpdmluZykgYWRkcmVzc2VzIHdpdGggZW1wdHkgcG9ydCBmaWVsZCBib3VuZAoJdG8gYSByYW5kb20gcG9ydCBpbnN0ZWFkIG9mIHRlcm1pbmF0aW5nIHdpdGggZXJyb3IuCglUZXN0OiBUQ1A0X05PUE9SVAoKCWNvbmZpZ3VyZSB3aXRoIHNvbWUgY29tYmluYXRpb24gb2YgZGlzYWJsZSBvcHRpb25zIHByb2R1Y2VkIGNvbmZpZwoJZmlsZXMgdGhhdCBmYWlsZWQgdG8gY29tcGlsZSBkdWUgdG8gbWlzc2luZyBJUFBST1RPX1RDUC4KCVRoYW5rcyB0byBUaGllcnJ5IEZvdXJuaWVyIGZvciByZXBvcnQgYW5kIHBhdGNoLgoKCWZpeGVkIGEgZmV3IG1pbm9yIGJ1Z3Mgd2l0aCBPcGVuU1NMIGluIGNvbmZpZ3VyZSBhbmQgd2l0aCBtZXNzYWdlcwoKCVNvY2F0IGRpZCBub3Qgd29yayBpbiBGSVBTIG1vZGUgYmVjYXVzZSAxMDI0IGluc3RlYWQgb2YgNTEyIGJpdCBESCBwcmltZQoJaXMgcmVxdWlyZWQuIFRoYW5rcyB0byBaaGlnYW5nIFdhbmcgZm9yIHJlcG9ydGluZyBhbmQgc2VuZGluZyBhIHBhdGNoLgoKCUNocmlzdG9waGUgTGVyb3kgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGZpeGVzIG1lbW9yeSBsZWFrcyByZXBvcnRlZCBieQoJdmFsZ3JpbmQKCglIZWxwIGZvciBmaWxhbiAtTCB3YXMgYmFkLCBpcyBub3cgY29ycmVjdGVkIHRvOgoJImZvbGxvdyBzeW1ib2xpYyBsaW5rcyBpbnN0ZWFkIG9mIHNob3dpbmcgdGhlaXIgcHJvcGVydGllcyIKCglBZGRyZXNzIG9wdGlvbnMgZmRpbiBhbmQgZmRvdXQgd2VyZSBzaWxlbnRseSBpZ25vcmVkIHdoZW4gbm90IGFwcGxpY2FibGUKCWR1ZSB0byAtdSBvciAtVSBvcHRpb24uIE5vdyB0aGVzZSBjb21iaW5hdGlvbnMgYXJlIGNhdWdodCBhcyBlcnJvcnMuCglUZXN0OiBGRE9VVF9FUlJPUgoJSXNzdWUgcmVwb3J0ZWQgYnkgSGVuZHJpay4KCglBZGRlZCBvcHRpb24gdGVybWlvcy1jZm1ha2VyYXcgdGhhdCBjYWxscyBjZm1ha2VyYXcoKSBhbmQgaXMgcHJlZmVycmVkCglvdmVyIG9wdGlvbiByYXcgd2hpY2ggaXMgbm93IG9ic29sb3RlLiBPbiBTeXNWIHN5c3RlbXMgdGhpcyBjYWxsIGlzCglzaW11bGF0ZWQgYnkgYXBwcm9wcmlhdGUgc2V0dGluZy4KCVRoYW5rcyB0byBZb3VmdSBaaGFuZyBmb3IgcmVwb3J0aW5nIGlzc3VlIHdpdGggb3B0aW9uIHJhdy4KCnBvcnRpbmc6CglTb2NhdCBpbmNsdWRlZCA8c3lzL3BvbGwuaD4gaW5zdGVhZCBvZiBQT1NJWCA8cG9sbC5oPgoJVGhhbmtzIHRvIEpvaG4gU3BlbmNlciBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgoJVmVyc2lvbiAxLjcuMi40IGNoYW5nZWQgdGhlIGNoZWNrIGZvciBnY2MgaW4gY29uZmlndXJlLmFjOyB0aGlzCglicm9rZSBjcm9zcyBjb21waWxpbmcuIFRoZSBwYXJ0aWN1bGFyIGNoZWNrIGdldHMgcmV2ZXJ0ZWQuCglUaGFua3MgdG8gUm9zcyBCdXJ0b24gYW5kIERhbm9taSBNYW5jaGVnbyBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCgoJRGViaWFuIEJ1ZyM3NjQyNTE6IFNldCB0aGUgYnVpbGQgdGltZXN0YW1wIHRvIGEgZGV0ZXJtaW5pc3RpYyB0aW1lOgoJc3VwcG9ydCBleHRlcm5hbCBCVUlMRF9EQVRFIGVudiB2YXIgdG8gYWxsb3cgdG8gYnVpbGQgcmVwcm9kdWNhYmxlCgliaW5hcmllcwoKCUpvYWNoaW0gRmVua2VzIHByb3ZpZGVkIGFuIG5ldyBhZGFwdGVkIHNwZWMgZmlsZS4KCglUeXBlIGJvb2wgYW5kIG1hY3JvcyBNaW4gYW5kIE1heCBhcmUgZGVmaW5lZCBieSBzb2NhdCB3aGljaCBsZWQgdG8KCWNvbXBpbGUgZXJyb3JzIHdoZW4gdGhleSB3ZXJlIGFscmVhZHkgcHJvdmlkZWQgYnkgYnVpbGQgZnJhbWV3b3JrLgoJVGhhbmtzIHRvIExpeXUgTGl1IGZvciBwcm92aWRpbmcgYSBwYXRjaC4KCglEYXZpZCBBcm5zdGVpbiBjb250cmlidXRlZCBhIHBhdGNoIGZvciBOZXRCU0QgNS4xIGluY2x1ZGluZyBzdGRib29sLmgKCXN1cHBvcnQgYW5kIGFwcHJvcHJpYXRlIGZpbGVzIGluIENvbmZpZy8KCglMYXVyaSBUaXJra29uZW4gY29udHJpYnV0ZWQgYSBwYXRjaCByZWdhcmRpbmcgbmV0aW5ldC9pZl9ldGhlci5oCglvbiBJbGx1bW9zCgoJQ2hhbmdlcyBmb3IgT3BlbmluZGlhbmE6IGRlZmluZSBfWFBHNF8yLCBfX0VYVEVOU0lPTlNfXywKCV9QT1NJWF9QVEhSRUFEX1NFTUFOVElDUzsgYW5kIG1pbm9yIGNoYW5nZXMKCglSZWQgSGF0IGlzc3VlIDExODIwMDU6IHNvY2F0IDEuNy4yLjQgYnVpbGQgZmFpbHVyZSBtaXNzaW5nCglsaW51eC9lcnJxdWV1ZS5oCglTb2NhdCBmYWlsZWQgdG8gY29tcGlsZSBvbiBvbiBQUEMgZHVlIHRvIG5ldyByZXF1aXJlbWVudHMgZm9yCglpbmNsdWRpbmcgPGxpbnV4L2VycnF1ZXVlLmg+IGFuZCBhIHdlYWtuZXNzIGluIHRoZSBjb25kaXRpb25hbCBjb2RlLgoJVGhhbmtzIHRvIE1pY2hlbCBOb3JtYW5kIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KCmRvYzoKCUluIHRoZSBtYW4gcGFnZSB0aGUgUFRZIGV4YW1wbGUgd2FzIGJhZGx5IGZvcm1hdHRlZC4gVGhhbmtzIHRvCglKLkYuU2ViYXN0aWFuIGZvciBzZW5kaW5nIGEgcGF0Y2guCgoJQWRkZWQgbWlzc2luZyBDVkUgaWRzIHRvIHNlY3VyaXR5IGlzc3VlcyBpbiBDSEFOR0VTCgp0ZXN0aW5nOgoJRG8gbm90IGRpc3RyaWJ1dGUgdGVzdGNlcnQuY29uZiB3aXRoIHNvY2F0IHNvdXJjZSBidXQgZ2VuZXJhdGUgaXQKCShhbmQgbmV3IHRlc3RjZXJ0Ni5jb25mKSBkdXJpbmcgdGVzdC5zaCBydW4uCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuNy4yLjQ6Cgpjb3JyZWN0aW9uczoKCUxJU1RFTiBiYXNlZCBhZGRyZXNzZXMgYXBwbGllZCBzb21lIGFkZHJlc3Mgb3B0aW9ucywgZS5nLiBzby1rZWVwYWxpdmUsCgl0byB0aGUgbGlzdGVuaW5nIGZpbGUgZGVzY3JpcHRvciBpbnN0ZWFkIG9mIHRoZSBjb25uZWN0ZWQgZmlsZQoJZGVzY3JpcHRvcgoJVGhhbmtzIHRvIFVsaXNlcyBBbG9uc28gZm9yIHJlcG9ydGluZyB0aGlzIGJ1ZwoKCW1ha2UgZmFpbGVkIGFmdGVyIGNvbmZpZ3VyZSB3aXRoIG5vbiBnY2MgY29tcGlsZXIgZHVlIHRvIG1pc3NpbmcKCWluY2x1ZGUuIFRoYW5rcyB0byBIb3JhY2lvIE1pamFpbCBmb3IgcmVwb3J0aW5nIHRoaXMgcHJvYmxlbQoKCWNvbmZpZ3VyZSBjaGVja2VkIGZvciAtLWRpc2FibGUtcmF3c29ja2V0IGJ1dCBwcmludGVkCgktLWRpc2FibGUtZ2VuZXJpY3NvY2tldCBpbiB0aGUgaGVscCB0ZXh0LiBUaGFua3MgdG8gQmVuIEdhcmRpbmVyIGZvcgoJcmVwb3J0aW5nIGFuZCBwYXRjaGluZyB0aGlzIGJ1ZwoKCUluIHhpb3NodXRkb3duKCkgYSB3cm9uZyBicmFuY2ggd2FzIGNob3NlbiBhZnRlciBSRUNWRlJPTSB0eXBlIGFkZHJlc3Nlcy4KCVByb2JhYmx5IG5vIGltcGFjdC4KCVRoYW5rcyB0byBEYXZpZCBCaW5kZXJtYW4gZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgoKCXByb2NhbiBjb3VsZCBub3QgY2xlYW5seSBmb3JtYXQgdWxpbWl0IHZhbHVlcyBsb25nZXIgdGhhbiAxNiBkZWNpbWFsCglkaWdpdHMuIFRoYW5rcyB0byBGcmFuayBEYW5hIGZvciBwcm92aWRpbmcgYSBwYXRjaCB0aGF0IGluY3JlYXNlcyBmaWVsZAoJd2lkdGggdG8gMjQgZGlnaXRzLgoKCU9QRU5TU0wtQ09OTkVDVCB3aXRoIGJpbmQgb3B0aW9uIGZhaWxlZCBvbiBzb21lIHN5c3RlbXMsIGVnLkZyZWVCU0QsIHdpdGgKCSJJbnZhbGlkIGFyZ3VtZW50IgoJVGhhbmtzIHRvIEVtaWxlIGRlbiBUZXggZm9yIHJlcG9ydGluZyB0aGlzIGJ1Zy4KCglDaGFuZ2VkIHNvbWUgdmFyaWFibGUgZGVmaW5pdGlvbnMgdG8gbWFrZSBnY2MgLU8yIGFsaWFzaW5nIGNoZWNrZXIgaGFwcHkKCVRoYW5rcyB0byBJbHlhIEdvcmRlZXYgZm9yIHJlcG9ydGluZyB0aGVzZSB3YXJuaW5ncwoKCU9uIGJpZyBlbmRpYW4gcGxhdGZvcm1zIHdpdGggdHlwZSBsb25nID4zMmJpdCB0aGUgcmFuZ2Ugb3B0aW9uIGFwcGxpZWQgYQoJYmFkIGJhc2UgYWRkcmVzcy4gVGhhbmtzIHRvIGhlamlhIGhlamlhIGZvciByZXBvcnRpbmcgYW5kIGZpeGluZyB0aGlzIGJ1Zy4KCglSZWQgSGF0IGlzc3VlIDEwMjIwNzA6IG1pc3NpbmcgbGVuZ3RoIGNoZWNrIGluIHhpb2xvZ19hbmNpbGxhcnlfc29ja2V0KCkKCglSZWQgSGF0IGlzc3VlIDEwMjIwNjM6IG91dC1vZi1yYW5nZSBzaGlmdHMgb24gbmV0IG1hc2sgYml0cwoKCVJlZCBIYXQgaXNzdWUgMTAyMjA2Mjogc3RyY3B5IG1pc3VzZSBpbiB4aW9zZXRzb2NrYWRkcmVudl9pcDQoKQoKCVJlZCBIYXQgaXNzdWUgMTAyMjA0ODogc3RybmNweSBoYXJkZW5pbmc6IGNvcnJlY3RlZCBzdXNwaWNpb3VzIHN0cm5jcHkoKQoJdXNlcwoKCVJlZCBIYXQgaXNzdWUgMTAyMTk1ODogZml4ZWQgYSBidWcgd2l0aCBmYXVsdHkgYnVmZmVyL2RhdGEgbGVuZ3RoCgljYWxjdWxhdGlvbiBpbiB4aW8tYXNjaWkuYzpfeGlvZHVtcCgpCgoJUmVkIEhhdCBpc3N1ZSAxMDIxOTcyOiBmaXhlZCBhIG1pc3NpbmcgTlVMIHRlcm1pbmF0aW9uIGluIHJldHVybiBzdHJpbmcKCW9mIHN5c3V0aWxzLmM6c29ja2FkZHJfaW5mbygpIGZvciB0aGUgQUZfVU5JWCBjYXNlCgoJZml4ZWQgc29tZSB0eXBvcyBhbmQgbWlub3IgaXNzdWVzLCBpbmNsdWRpbmc6CglSZWQgSGF0IGlzc3VlIDEwMjE5Njc6IGZvcm1hdHRpbmcgZXJyb3IgaW4gbWFudWFsIHBhZ2UKCglVTklYLUxJU1RFTiB3aXRoIGZvcmsgb3B0aW9uIGRpZCBub3QgcmVtb3ZlIHRoZSBzb2NrZXQgZmlsZSBzeXN0ZW0gZW50cnkKCXdoZW4gZXhpdGluZy4gT3RoZXIgZmlsZSBzeXN0ZW0gYmFzZWQgcGFzc2l2ZSBhZGRyZXNzIHR5cGVzIGhhZCBzaW1pbGFyCglpc3N1ZXMgb3IgZmFpbGVkIHRvIGFwcGx5IG9wdGlvbnMgdW1hc2ssIHVzZXIgZS5hLgoJVGhhbmtzIHRvIExvcmVuem8gTW9udGkgZm9yIHBvaW50aW5nIG1lIHRvIHRoaXMgaXNzdWUKCnBvcnRpbmc6CglSZWQgSGF0IGlzc3VlIDEwMjAyMDM6IGNvbmZpZ3VyZSBjaGVja3MgZmFpbCB3aXRoIHNvbWUgY29tcGlsZXJzLgoJVXNlIGNhc2U6IGNsYW5nCgoJUGVyZm9ybWVkIGNoYW5nZXMgZm9yIEZlZG9yYSByZWxlYXNlIDE5CgoJQWRhcHRlZCwgaW1wcm92ZWQgdGVzdC5zaCBzY3JpcHQKCglSZWQgSGF0IGlzc3VlIDEwMjE0Mjk6IGdldGdyb3VwZW50IGZhaWxzIHdpdGggbGFyZ2UgbnVtYmVyIG9mIGdyb3VwczsKCXVzZSBnZXRncm91cGxpc3QoKSB3aGVuIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIHNlcXVlbmNlIG9mIGNhbGxzIHRvCglnZXRncmVudCgpCgoJUmVkIEhhdCBpc3N1ZSAxMDIxOTQ4OiBzbnByaW50ZiBBUEkgY2hhbmdlOwoJSW1wbGVtZW50ZWQgeGlvX3NucHJpbnRmKCkgZnVuY3Rpb24gYXMgd3JhcHBlciB0aGF0IHRyaWVzIHRvIGVtdWxhdGUgQzk5CgliZWhhdmlvdXIgb24gb2xkIGdsaWJjIHN5c3RlbXMsIGFuZCBhZGFwdGVkIGFsbCBhZmZlY3RlZCBjYWxscwoJYXBwcm9wcmlhdGVseQoKCU1pa2UgRnJ5c2luZ2VyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBzdXBwb3J0cyBsb25nIGxvbmcgZm9yIHRpbWVfdCwKCXNvY2tsZW5fdCBhbmQgYSBmZXcgb3RoZXIgbGliYyB0eXBlcy4KCglBcnRlbSBNeWdhaWV2IGV4dGVuZGVkIENlZHJpbCBQcmlzY2FscyBBbmRyb2lkIGJ1aWxkIHNjcmlwdCB3aXRoIHB0eSBjb2RlCgoJVGhlIGNoZWNrIGZvciBmaXBzLmggcmVxdWlyZWQgc3RkZGVmLmgKCVRoYW5rcyB0byBNYXR0IEhpbHQgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlIGFuZCBzZW5kaW5nIGEgcGF0Y2gKCglDaGVjayBmb3IgbGludXgvZXJycXVldWUuaCBmYWlsZWQgb24gc29tZSBzeXN0ZW1zIGR1ZSB0byBsYWNrIG9mCglsaW51eC90eXBlcy5oIGluY2x1c2lvbi4gVGhhbmtzIHRvIE1pY2hhZWwgVmFzdG9sYSBmb3Igc2VuZGluZyBhIHBhdGNoLgoKCWF1dG9jb25mIG5vdyBwcmVmZXJzIGNvbmZpZ3VyZS5hYyBvdmVyIGNvbmZpZ3VyZS5pbgoJVGhhbmtzIHRvIE1pY2hhZWwgVmFzdG9sYSBmb3Igc2VuZGluZyBhIHBhdGNoLgoKCXR5cGUgb2Ygc3RydWN0IGNtc2doZHIuY21zZyBpcyBzeXN0ZW0gZGVwZW5kZW5kLCBkZXRlcm1pbmUgaXQgd2l0aAoJY29uZmlndXJlOyBzb21lIG1vcmUgcHJpbnQgZm9ybWF0IGNvcnJlY3Rpb25zCgpkb2N1OgoJbGlid3JhcCBhbHdheXMgbG9ncyB0byBzeXNsb2cKCglhZGRlZCBhY3R1YWwgdGV4dCB2ZXJzaW9uIG9mIEdQTHYyCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuNy4yLjM6CgpzZWN1cml0eToKCVNvY2F0IHNlY3VyaXR5IGFkdmlzb3J5IDUKCUNWRS0yMDE0LTAwMTk6IHNvY2F0cyBQUk9YWS1DT05ORUNUIGFkZHJlc3Mgd2FzIHZ1bG5lcmFibGUgdG8gYSBidWZmZXIKCW92ZXJmbG93IHdpdGggZGF0YSBmcm9tIGNvbW1hbmQgbGluZSAoc2VlIHNvY2F0LXNlY2FkdjUudHh0KQoJQ3JlZGl0cyB0byBGbG9yaWFuIFdlaW1lciBvZiB0aGUgUmVkIEhhdCBQcm9kdWN0IFNlY3VyaXR5IFRlYW0KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjIuMjoKCnNlY3VyaXR5OgoJU29jYXQgc2VjdXJpdHkgYWR2aXNvcnkgNAoJQ1ZFLTIwMTMtMzU3MToKCWFmdGVyIHJlZnVzaW5nIGEgY2xpZW50IGNvbm5lY3Rpb24gZHVlIHRvIGJhZCBzb3VyY2UgYWRkcmVzcyBvciBzb3VyY2UKCXBvcnQgc29jYXQgc2h1dGRvd24oKSB0aGUgc29ja2V0IGJ1dCBkaWQgbm90IGNsb3NlKCkgaXQsIHJlc3VsdGluZyBpbgoJYSBmaWxlIGRlc2NyaXB0b3IgbGVhayBpbiB0aGUgbGlzdGVuaW5nIHByb2Nlc3MsIHZpc2libGUgd2l0aCBsc29mIGFuZAoJcG9zc2libHkgcmVzdWx0aW5nIGluIEVNRklMRSBUb28gbWFueSBvcGVuIGZpbGVzLiBUaGlzIGlzc3VlIGNvdWxkIGJlCgltaXN1c2VkIGZvciBhIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjay4KCUZ1bGwgY3JlZGl0cyB0byBDYXRhbGluIE1pdHJvZmFuIGZvciBmaW5kaW5nIGFuZCByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjIuMToKCnNlY3VyaXR5OgoJU29jYXQgc2VjdXJpdHkgYWR2aXNvcnkgMwoJQ1ZFLTIwMTItMDIxOToKCWZpeGVkIGEgcG9zc2libGUgaGVhcCBidWZmZXIgb3ZlcmZsb3cgaW4gdGhlIHJlYWRsaW5lIGFkZHJlc3MuIFRoaXMgYnVnCgljb3VsZCBiZSBleHBsb2l0ZWQgd2hlbiBhbGwgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIHdlcmUgbWV0OgoJMSkgb25lIG9mIHRoZSBhZGRyZXNzZXMgaXMgUkVBRExJTkUgd2l0aG91dCB0aGUgbm9wcm9tcHQgYW5kIHdpdGhvdXQgdGhlCglwcm9tcHQgb3B0aW9ucy4KCTIpIHRoZSBvdGhlciAoYWxtb3N0IGFyYml0cmFyeSBhZGRyZXNzKSByZWFkcyBtYWxpY2lvdXMgZGF0YSAod2hpY2ggaXMKCXRoZW4gdHJhbnNmZXJyZWQgYnkgc29jYXQgdG8gUkVBRExJTkUpLgoJV29ya2Fyb3VuZDogd2hlbiB1c2luZyB0aGUgUkVBRExJTkUgYWRkcmVzcyBhcHBseSBvcHRpb24gcHJvbXB0IG9yCglub3Byb21wdC4KCUZ1bGwgY3JlZGl0cyB0byBKb2hhbiBUaGlsbGVtYW5uIGZvciBmaW5kaW5nIGFuZCByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjIuMDoKCmNvcnJlY3Rpb25zOgoJd2hlbiBVTklYLUxJU1RFTiB3YXMgYXBwbGllZCB0byBhbiBleGlzdGluZyBmaWxlIGl0IGZhaWxlZCBhcyBleHBlY3RlZAoJYnV0IHJlbW92ZWQgdGhlIGZpbGUuIFRoYW5rcyB0byBCam9lcm4gQm9zc2VsbWFubiBmb3IgcmVwb3J0aW5nIHRoaXMKCXByb2JsZW0KCglmaXhlZCBhIGJ1ZyB3aGVyZSBzb2NhdCBtaWdodCBjcmFzaCB3aGVuIGNvbm5lY3RpbmcgdG8gYSB1bml4IGRvbWFpbgoJc29ja2V0IHVzaW5nIGFkZHJlc3MgR09QRU4uIFRoYW5rcyB0byBNYXJ0aW4gRm9yc3NlbiBmb3IgYnVnIHJlcG9ydCBhbmQKCXBhdGNoLgoKCVVEUC1MSVNURU4gd291bGQgYWx3YXkgc2V0IFNPX1JFVVNFQUREUiBldmVuIHdpdGhvdXQgZm9yayBvcHRpb24gYW5kCgl3aGVuIHVzZXIgc2V0IGl0IHRvIDAuIFRoYW5rcyB0byBNaWNoYWwgU3ZvYm9kYSBmb3IgcmVwb3J0aW5nIHRoaXMgYnVnLgoKCVVOSVgtQ09OTkVDVCBkaWQgbm90IHN1cHBvcnQgaGFsZi1jbG9zZS4gVGhhbmtzIHRvIEdyZWcgSHVnaGVzIHdobwoJcG9pbnRlZCBtZSB0byB0aGF0IGJ1ZwoKCVRDUC1DT05ORUNUIHdpdGggb3B0aW9uIG5vbmJsb2NrIHJlcG9ydGVkIHN1Y2Nlc3NmdWwgY29ubmVjdCBldmVuIHdoZW4KCWl0IHdhcyBzdGlsbCBwZW5kaW5nCgoJYWRkcmVzcyBvcHRpb24gaW9jdGwtaW50cCBmYWlsZWQgd2l0aCAidW5pbXBsZW1lbnRlZCB0eXBlIDI2Ii4gVGhhbmtzCgl0byBKZXJlbXkgVy4gU2hlcm1hbiBmb3IgcmVwb3J0aW5nIGFuZCBmaXhpbmcgdGhhdCBidWcKCglzb2NhdCBvcHRpb24gLXggZGlkIG5vdCBwcmludCBwYWNrZXQgZGlyZWN0aW9uLCB0aW1lc3RhbXAgZXRjOyB0aGFua3MKCXRvIEFudGhvbnkgU2hhcm9iYWlrbyBmb3Igc2VuZGluZyBhIHBhdGNoCgoJYWRkcmVzcyBQVFkgZG9lcyBub3QgdGFrZSBhbnkgcGFyYW1ldGVycyBidXQgZGlkIG5vdCByZXBvcnQgYW4gZXJyb3IKCXdoZW4gc29tZSB3ZXJlIGdpdmVuCgoJTWFyY3VzIE1laXNzbmVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBmaXhlcyBpbnZhbGlkIG91dHB1dCBhbmQgcG9zc2libGUKCXByb2Nlc3MgY3Jhc2ggd2hlbiBzb2NhdCBwcmludHMgaW5mbyBhYm91dCBhbiB1bm5hbWVkIHVuaXggZG9tYWluCglzb2NrZXQKCglNaWNoYWwgU29sdHlzIHJlcG9ydGVkIHRoZSBmb2xsb3dpbmcgcHJvYmxlbSBhbmQgcHJvdmlkZWQgYW4gaW5pdGlhbAoJcGF0Y2g6IHdoZW4gc29jYXQgd2FzIGludGVycnVwdGVkLCBlLmcuIGJ5IFNJR1NUT1AsIGFuZCByZXN1bWVkIGR1cmluZwoJZGF0YSB0cmFuc2ZlciBvbmx5IHBhcnRzIG9mIHRoZSBkYXRhIG1pZ2h0IGhhdmUgYmVlbiB3cml0dGVuLgoKCU9wdGlvbiBvLW5vbmJsb2NrIGluIGNvbWJpbmF0aW9uIHdpdGggbGFyZ2UgdHJhbnNmZXIgYmxvY2sgc2l6ZXMKCW1heSByZXN1bHQgaW4gcGFydGlhbCB3cml0ZXMgYW5kL29yIEVBR0FJTiBlcnJvcnMgdGhhdCB3ZXJlIG5vdCBoYW5kbGVkCglwcm9wZXJseSBidXQgcmVzdWx0ZWQgaW4gZGF0YSBsb3NzIG9yIHByb2Nlc3MgdGVybWluYXRpb24uCgoJRml4ZWQgYSBidWcgdGhhdCBjb3VsZCBmcmVlemUgc29jYXQgd2hlbiBkdXJpbmcgYXNzZW1ibHkgb2YgYSBsb2cKCW1lc3NhZ2UgYSBzaWduYWwgd2FzIGhhbmRsZWQgdGhhdCBhbHNvIHByaW50ZWQgYSBsb2cgbWVzc2FnZS4gc29jYXQKCWRldmVsb3BtZW50IGhhZCBiZWVuIGF3YXJlIHRoYXQgbG9jYWx0aW1lKCkgaXMgbm90IHRocmVhZCBzYWZlIGJ1dCBoYWQKCW9ubHkgZXhwZWN0ZWQgYnJva2VuIG1lc3NhZ2VzLCBub3QgY29ycnVwdGVkIHN0YWNrIChnbGliYyAyLjExLjEsCglVYnVudHUgMTAuNCkKCglhbiBpbnRlcm5hbCBzdG9yZSBmb3IgY2hpbGQgcGlkcyB3YXMgc3VzY2VwdGlibGUgdG8gcGlkIHJldXNlIHdoaWNoCgljb3VsZCBsZWFkIHRvIHNwb3JhZGljIGRhdGEgbG9zcyB3aGVuIGJvdGggZm9yayBvcHRpb24gYW5kIGV4ZWMgYWRkcmVzcwoJd2VyZSB1c2VkLiBUaGFua3MgdG8gVGV0c3V5YSBTb2RvIGZvciByZXBvcnRpbmcgdGhpcyBwcm9ibGVtIGFuZAoJc2VuZGluZyBhIHBhdGNoCgoJT3BlblNTTCBzZXJ2ZXIgZmFpbGVkIHdpdGggIm5vIHNoYXJlZCBjaXBoZXIiIHdoZW4gdXNpbmcgY2lwaGVyIGFOVUxMLgoJRml4ZWQgYnkgcHJvdmlkaW5nIHRlbXBvcmFyeSBESCBwYXJhbWV0ZXJzLiBUaGFua3MgdG8gUGhpbGlwIFJvd2xhbmRzCglmb3IgZHJhd2luZyBteSBhdHRlbnRpb24gdG8gdGhpcyBpc3N1ZS4KCglVRFAtTElTVEVOIHNsZXB0IDFzIGFmdGVyIGFjY2VwdGluZyBhIGNvbm5lY3Rpb24uIFRoaXMgaXMgbm90IHJlcXVpcmVkLgoJVGhhbmtzIHRvIFBldGVyIFZhbGRlbWFyIE1vcmNoIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZQoKCWZpeGVkIGEgYnVnIHRoYXQgY291bGQgbGVhZCB0byBlcnJvciBvciBzb2NhdCBjcmFzaCBhZnRlciBhIGNsaWVudAoJY29ubmVjdGlvbiB3aXRoIG9wdGlvbiByZXRyeSBoYWQgYmVlbiBlc3RhYmxpc2hlZAoKCWZpeGVkIGNvbmZpZ3VyZS5pbiBidWcgb24gbmV0L2lmLmggY2hlY2sgdGhhdCBjYXVzZWQgSUZfTkFNRVNJWkUgdG8gYmUKCXVuZGVmaW5lZAoKCWltcHJvdmVkIGRldl90IHByaW50IGZvcm1hdCBkZWZpbml0aW9uCgpwb3J0aW5nOgoJQ2VkcmlsIFByaXNjYWwgcG9ydGVkIHNvY2F0IHRvIEFuZHJvaWQgKHVzaW5nIEdvb2dsZXMgY3Jvc3MgY29tcGlsZXIpLgoJVGhlIHBvcnQgaW5jbHVkZXMgdGhlIHNvY2F0X2J1aWxkc2NyaXB0X2Zvcl9hbmRyb2lkLnNoIHNjcmlwdAoKCWFkZGVkIGNoZWNrIGZvciBjb21wb25lbnQgaXBpX3NwZWNfZHN0IGluIHN0cnVjdCBpbl9wa3RpbmZvIHNvCgljb21waWxhdGlvbiBkb2VzIG5vdCBmYWlsIG9uIEN5Z3dpbiAodGhhbmtzIHRvIFBldGVyIFdhZ2VtYW5zIGZvcgoJcmVwb3J0aW5nIHRoaXMgcHJvYmxlbSkKCglidWlsZCBmYWlsZWQgb24gUkhFTDYgZHVlIHRvIHByZXNlbmNlIG9mIGZpcHMuaDsgY29uZmlndXJlIG5vdyBjaGVja3MKCWZvciBmaXBzbGQgdG9vLiBUaGFua3MgdG8gQW5kcmVhcyBHcnVlbmJhY2hlciBmb3IgcmVwb3J0aW5nIHRoaXMKCXByb2JsZW0KCgljaGVjayBmb3IgbmV0aW5ldDYvaW42Lmggb25seSB3aGVuIElQdjYgaXMgYXZhaWxhYmxlIGFuZCBlbmFibGVkCgoJZG9uJ3QgZmFpbCB0byBjb21waWxlIHdoZW4gdGhlIGZvbGxvd2luZyBkZWZpbmVzIGFyZSBtaXNzaW5nOgoJSVBWNl9QS1RJTkZPIElQVjZfUlRIRFIgSVBWNl9EU1RPUFRTIElQVjZfSE9QT1BUUyBJUFY2X0hPUExJTUlUCglUaGFua3MgdG8gSmVycnkgSmFjb2JzIGZvciByZXBvcnRpbmcgdGhpcyBwcm9ibGVtIChNYWMgT1MgWCBMaW9uIDEwLjcpCgoJY2hlY2sgaWYgZGVmaW5lIF9fQVBQTEVfVVNFX1JGQ18yMjkyIGhlbHBzIHRvIGVuYWJsZSBJUFY2XyogKE1hY09TWAoJTGlvbiA3LjEpOyB0aGFua3MgdG8gSmVycnkgSmFjb2JzIHRvIHJlcG9ydGluZyB0aGlzIHByb2JsZW0gYW5kCglwcm9wb3NpbmcgYSBzb2x1dGlvbgoKCWZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIE1hYyBPUyBYIDY0Yml0LiBUaGFua3MgdG8gR3V5IEhhcnJpcyBmb3IKCXByb3ZpZGluZyB0aGUgcGF0Y2guCgoJY29ycmVjdGlvbnMgZm9yIE9wZW5FbWJlZGRlZCwgZXNwZWNpYWxseSB0ZXJtaW9zIFNISUZUIHZhbHVlcyBhbmQKCUlTUEVFRC9PU1BFRUQuIFRoYW5rcyB0byBKb2huIEZhaXRoIGZvciBwcm92aWRpbmcgdGhlIHBhdGNoCgoJbWlub3IgY29ycmVjdGlvbnMgdG8gZG9jdSBhbmQgdGVzdC5zaCByZXN1bHRpbmcgZnJvbSBsb2NhbCBjb21waWxhdGlvbgoJb24gT3Blbm1va28gU0hSCgoJZml4ZWQgc2FfZmFtaWx5X3QgY29tcGlsZSBlcnJvciBvbiBEcmFnb25GbHkuIFRoYW5rcyB0byBUb255IFlvdW5nIGZvcgoJcmVwb3J0aW5nIHRoaXMgaXNzdWUgYW5kIHNlbmRpbmcgYSBwYXRjaC4KCglVYnVudHUgT25laXJpYzogT3BlblNTTCBubyBsb25nZXIgcHJvdmlkZXMgU1NMdjIgZnVuY3Rpb25zOyBsaWJ1dGlsLnNoCglpcyBub3cgYnNkL2xpYnV0aWwuaDsgY29tcGlsZXIgd2FybnMgb24gdmFycyB0aGF0IGlzIG9ubHkgd3JpdHRlbiB0bwoKbmV3IGZlYXR1cmVzOiAKCWFkZGVkIG9wdGlvbiBtYXgtY2hpbGRyZW4gdGhhdCBsaW1pdHMgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGNoaWxkCglwcm9jZXNzZXMuIFRoYW5rcyB0byBTYW0gTGlkZGljb3R0IGZvciBwcm92aWRpbmcgdGhlIHBhdGNoLgoKCVRpbGwgTWFhcyBhZGRlZCBzdXBwb3J0IGZvciB0dW4vdGFwIGFkZHJlc3NlcyB3aXRob3V0IElQIGFkZHJlc3MKIAoJYWRkZWQgYW4gb3B0aW9uIG9wZW5zc2wtY29tcHJlc3MgdGhhdCBhbGxvd3MgdG8gZGlzYWJsZSB0aGUgY29tcHJlc3Npb24KCWZlYXR1cmUgb2YgbmV3ZXIgT3BlblNTTCB2ZXJzaW9ucy4gVGhhbmtzIHRvIE1pY2hhZWwgSGFuc2VsbWFubiBmb3IKCXByb3ZpZGluZyB0aGlzIGNvbnRyaWJ1dGlvbiAoc3BvbnNvcmVkIGJ5IEdvb2dsZSBJbmMuKQoKZG9jdToKCW1pbm9yIGNvcnJlY3Rpb25zIGluIGRvY3UgKHRoYW5rcyB0byBQYWdnYXMpCgoJY2xpZW50IHByb2Nlc3MgLT4gY2hpbGQgcHJvY2VzcwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjcuMS4zOgoKc2VjdXJpdHk6CglTb2NhdCBzZWN1cml0eSBhZHZpc29yeSAyCglDVkUtMjAxMC0yNzk5OgoJZml4ZWQgYSBzdGFjayBvdmVyZmxvdyB2dWxuZXJhYmlsaXR5IHRoYXQgb2NjdXJyZWQgd2hlbiBjb21tYW5kCglsaW5lIGFyZ3VtZW50cyAod2hvbGUgYWRkcmVzc2VzLCBob3N0IG5hbWVzLCBmaWxlIG5hbWVzKSB3ZXJlIGxvbmdlcgoJdGhhbiA1MTIgYnl0ZXMuCglOb3RlIHRoYXQgdGhpcyBjb3VsZCBvbmx5IGJlIGV4cGxvaXRlZCB3aGVuIGFuIGF0dGFja2VyIHdhcyBhYmxlIHRvCglpbmplY3QgZGF0YSBpbnRvIHNvY2F0J3MgY29tbWFuZCBsaW5lLgoJRnVsbCBjcmVkaXRzIHRvIEZlbGl4IEdy9mJlcnQsIEdvb2dsZSBTZWN1cml0eSBUZWFtLCBmb3IgZmluZGluZyBhbmQKCXJlcG9ydGluZyB0aGlzIGlzc3VlCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuNy4xLjI6Cgpjb3JyZWN0aW9uczoKCXVzZXItbGF0ZSBhbmQgZ3JvdXAtbGF0ZSwgd2hlbiBhcHBsaWVkIHRvIGEgcHR5LCBhZmZlY3RlZCB0aGUgc3lzdGVtCglkZXZpY2UgL2Rldi9wdG14IGluc3RlYWQgb2YgdGhlIHB0eSAodGhhbmtzIHRvIE1hdHRoZXcgQ2xva2UgZm9yCglwb2ludGluZyBtZSB0byB0aGlzIGJ1ZykKCglzb2NhdHMgb3BlbnNzbCBhZGRyZXNzZXMgZmFpbGVkIHdpdGggIm5vbmJsb2NraW5nIG9wZXJhdGlvbiBkaWQgbm90Cgljb21wbGV0ZSIgd2hlbiB0aGUgcGVlciBwZXJmb3JtZWQgYSByZW5lZ290aWF0aW9uLiBUaGFua3MgdG8gQmVuamFtaW4KCURlbHB5IGZvciByZXBvcnRpbmcgdGhpcyBidWcuCgoJaW5mbyBtZXNzYWdlIGR1cmluZyBzb2NrcyBjb25uZWN0IHNob3dlZCBiYWQgcG9ydCBudW1iZXIgb24gbGl0dGxlCgllbmRpYW4gc3lzdGVtcyBkdWUgdG8gd3JvbmcgYnl0ZSBvcmRlciAodGhhbmtzIHRvIFBldGVyIE0uIEdhbGJhdnkgZm9yCglidWcgcmVwb3J0IGFuZCBwYXRjaCkKCglEZWJpYW4gYnVnIDUzMTA3ODogc29jYXQgZXhlY3MgY2hpbGRyZW4gd2l0aCBTSUdDSExEIGlnbm9yZWQ7IGNvcnJlY3RlZAoJdG8gZGVmYXVsdC4gVGhhbmtzIHRvIE1hcnRpbiBEb3JleSBmb3IgcmVwb3J0aW5nIHRoaXMgYnVnLgoKcG9ydGluZzoKCWJ1aWxkaW5nIHNvY2F0IG9uIHN5c3RlbXMgdGhhdCBwcmVkZWZpbmVkIHRoZSBDRkxBR1MgZW52aXJvbm1lbnQgdG8KCWNvbnRhaW4gLVdhbGwgZmFpbGVkIChlc3AuUmVkSGF0KS4gVGhhbmtzIHRvIFBhdWwgV291dGVycyBmb3IgcmVwb3J0aW5nCgl0aGlzIHByb2JsZW0gYW5kIHRvIFNpbW9uIE1hdHRlciBmb3IgcHJvdmlkaW5nIHRoZSBwYXRjaAoKCXN1cHBvcnQgZm9yIFNvbGFyaXMgOCBhbmQgU3VuIFN0dWRpbyBzdXBwb3J0ICh0aGFua3MgdG8gU2ViYXN0aWFuCglLYXlzZXIgZm9yIHByb3ZpZGluZyB0aGUgcGF0Y2hlcykKCglvbiBzb21lIDY0Yml0IHN5c3RlbXMgYSBjb21waWxlciB3YXJuaW5nICJjYXN0IGZyb20gcG9pbnRlciB0byBpbnRlZ2VyCglvZiBkaWZmZXJlbnQgc2l6ZSIgd2FzIGlzc3VlZCBvbiBzb21lIG9wdGlvbiBkZWZpbml0aW9ucwoKCWFkZGVkIHN0cnVjdCBzb2NrYWRkcl9sbCB0byB1bmlvbiBzb2NrYWRkcl91bmlvbiB0byBhdm9pZCAic3RyaWN0CglhbGlhc2luZyIgd2FybmluZ3MgKHByb2JsZW0gcmVwb3J0ZWQgYnkgUGF1bCBXb3V0ZXJzKQoKZG9jdToKCW1pbm9yIGNvcnJlY3Rpb25zIGluIGRvY3UKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjEuMToKCmNvcnJlY3Rpb25zOgoJY29ycmVjdGVkIHRoZSAiZml4ZWQgcG9zc2libGUgU0lHU0VHViIgZml4IGJlY2F1c2UgU0lHU0VHViBzdGlsbCBtaWdodAoJb2NjdXIgdW5kZXIgdGhvc2UgY29uZGl0aW9ucy4gVGhhbmtzIHRvIFRvbmkgTWF0dGlsYSBmb3IgZmlyc3QKCXJlcG9ydGluZyB0aGlzIHByb2JsZW0uCgoJZnRydW5jYXRlNjQgY3V0IGl0cyBhcmd1bWVudCB0byAzMiBiaXRzIG9uIHN5c3RlbXMgd2l0aCAzMiBiaXQgbG9uZyB0eXBlCgoJc29jYXQgY3Jhc2hlZCBvbiBzeXN0ZW1zIHdpdGhvdXQgc2V0ZW52KCkgKGVzcC4gU3VuT1MgdXAgdG8gU29sYXJpcyA5KTsKCXRoYW5rcyB0byBUb2RkIFN0YW5zZWxsIGZvciByZXBvcnRpbmcgdGhpcyBidWcKCgl3aXRoIHVuaWRpcmVjdGlvbmFsIEVYRUMgYW5kIFNZU1RFTSBhIGNsb3NlKCkgb3BlcmF0aW9uIHdhcyBwZXJmb3JtZWQKCW9uIGEgcmFuZG9tIG51bWJlciB3aGljaCBjb3VsZCByZXN1bHQgaW4gaGFuZ2luZyBlLmEuCgoJZml4ZWQgYSBjb21waWxlIHByb2JsZW0gY2F1c2VkIGJ5IHNpemVfdC9zb2NrbGVuX3QgbWlzbWF0Y2ggb24gNjRiaXQKCXN5c3RlbXMKCglkb2N1IG1lbnRpb25lZCBvcHRpb24gc28tYmluZHRvZGV2IGJ1dCBjb3JyZWN0IG5hbWUgaXMgc28tYmluZHRvZGV2aWNlLiAKCVRoYW5rcyB0byBKaW0gWmltbWVybWFuIGZvciByZXBvcnRpbmcuCgpkb2N1IGNoYW5nZXM6CglhZGRlZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZXhhbXBsZSB0byBkb2Mvc29jYXQtbXVsdGljYXN0Lmh0bWwKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS43LjEuMDoKCm5ldyBmZWF0dXJlczoKCWFkZHJlc3Mgb3B0aW9ucyBzaHV0LW5vbmUsIHNodXQtZG93biwgYW5kIHNodXQtY2xvc2UgYWxsb3cgdG8gY29udHJvbAoJc29jYXQncyBoYWxmIGNsb3NlIGJlaGF2aW91cgoKCXdpdGggYWRkcmVzcyBvcHRpb24gc2h1dC1udWxsIHNvY2F0IHNlbmRzIGFuIGVtcHR5IHBhY2tldCB0byB0aGUgcGVlcgoJdG8gaW5kaWNhdGUgRU9GCgoJb3B0aW9uIG51bGwtZW9mIGNoYW5nZXMgdGhlIGJlaGF2aW91ciBvZiBzb2NrZXRzIHRoYXQgcmVjZWl2ZSBhbiBlbXB0eQoJcGFja2V0IHRvIHNlZSBFT0YgaW5zdGVhZCBvZiBpZ25vcmluZyBpdAoKCWludHJvZHVjZWQgb3B0aW9uIG5hbWVzIHN1YnN0dXNlci1lYXJseSBhbmQgc3UtZSwgY3VycmVudGx5IGVxdWl2YWxlbnQKCXRvIG9wdGlvbiBzdWJzdHVzZXIgKHRoYW5rcyB0byBNaWtlIFBlcnJ5IGZvciBwcm92aWRpbmcgdGhlIHBhdGNoKQoKY29ycmVjdGlvbnM6CglmaXhlZCBzb21lIHR5cG9zIGFuZCBpbXByb3ZlZCBzb21lIGNvbW1lbnRzCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuNy4wLjE6Cgpjb3JyZWN0aW9uczoKCWZpeGVkIHBvc3NpYmxlIFNJR1NFR1YgaW4gbGlzdGVuaW5nIGFkZHJlc3NlcyB3aGVuIGEgbmV3IGNvbm5lY3Rpb24gd2FzCglyZXNldCBieSBwZWVyIGJlZm9yZSB0aGUgc29ja2V0IGFkZHJlc3NlcyBjb3VsZCBiZSByZXRyaWV2ZWQuIFRoYW5rcyB0bwoJTWlrZSBQZXJyeSBmb3Igc2VuZGluZyBhIHBhdGNoLgoKCWZpeGVkIGEgYnVnLCBpbnRyb2R1Y2VkIHdpdGggdmVyc2lvbiAxLjcuMC4wLCB0aGF0IGxldCBjbGllbnQKCWNvbm5lY3Rpb25zIHdpdGggb3B0aW9uIGNvbm5lY3QtdGltZW91dCBmYWlsIHdoZW4gdGhlIGNvbm5lY3Rpb25zCglzdWNjZWVkZWQuIFRoYW5rcyB0byBCcnVubyBEZSBGcmFpbmUgZm9yIHJlcG9ydGluZyB0aGlzIGJ1Zy4KCglvcHRpb24gZW5kLWNsb3NlICJkaWQgbm90IGFwcGx5IiB0byBhZGRyZXNzZXMgUFRZLCBTT0NLRVQtQ09OTkVDVCwKCWFuZCBtb3N0IFVOSVgtKiBhbmQgQUJTVFJBQ1QtKgoKCWhhbGYgY2xvc2Ugb2YgRVhFQyBhbmQgU1lTVEVNIGFkZHJlc3NlcyBkaWQgbm90IHdvcmsgZm9yIHBpcGVzIGFuZAoJc29tZXRpbWVzIHNvY2tldHBhaXIKCgloZWxwIGRpc3BsYXllZCBmb3Igc29tZSBvcHRpb24gYSB3cm9uZyB0eXBlCgoJdW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzIHNodXRkb3duIHdhcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZQoJc2FtZSBmZAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjcuMC4wOgoKbmV3IGZlYXR1cmVzOgoJbmV3IGFkZHJlc3MgdHlwZXMgU0NUUC1DT05ORUNUIGFuZCBTQ1RQLUxJU1RFTiBpbXBsZW1lbnQgU0NUUCBzdHJlYW0KCW1vZGUgZm9yIElQdjQgYW5kIElQdjY7IG5ldyBhZGRyZXNzIG9wdGlvbnMgc2N0cC1tYXhzZWcgYW5kCglzY3RwLW5vZGVsYXkgKHN1Z2dlc3RlZCBieSBEYXZpZCBBLiBNYWRvcmU7IHRoYW5rcyB0byBKb25hdGhhbiBCcmFubmFuCglmb3IgcHJvdmlkaW5nIGFuIGluaXRpYWwgcGF0Y2gpCgoJbmV3IGFkZHJlc3MgIklOVEVSRkFDRSIgZm9yIHRyYW5zcGFyZW50IG5ldHdvcmsgaW50ZXJmYWNlIGhhbmRsaW5nCgkoc3VnZ2VzdGVkIGJ5IFN0dWFydCBOaWNob2xzb24pCgoJYWRkZWQgZ2VuZXJpYyBzb2NrZXQgYWRkcmVzc2VzOiBTT0NLRVQtQ09OTkVDVCwgU09DS0VULUxJU1RFTiwKCVNPQ0tFVC1TRU5EVE8sIFNPQ0tFVC1SRUNWRlJPTSwgU09DS0VULVJFQ1YsIFNPQ0tFVC1EQVRBR1JBTSBhbGxvdwoJcHJvdG9jb2wgaW5kZXBlbmRlbnQgc29ja2V0IGhhbmRsaW5nOyBhbGwgcGFyYW1ldGVycyBhcmUgZXhwbGljaXRlbHkKCXNwZWNpZmllZCBhcyBudW1iZXJzIG9yIGhleCBkYXRhCgoJYWRkZWQgYWRkcmVzcyBvcHRpb25zIGlvY3RsLXZvaWQsIGlvY3RsLWludCwgaW9jdGwtaW50cCwgaW9jdGwtc3RyaW5nLAoJaW9jdGwtYmluIGZvciBnZW5lcmljIGlvY3RsKCkgY2FsbHMuCgoJYWRkZWQgYWRkcmVzcyBvcHRpb25zIHNldHNvY2tvcHQtaW50LCBzZXRzb2Nrb3B0LWJpbiwgYW5kCglzZXRzb2Nrb3B0LXN0cmluZyBmb3IgZ2VuZXJpYyBzZXRzb2Nrb3B0KCkgY2FsbHMKCglvcHRpb24gc28tdHlwZSBub3cgb25seSBhZmZlY3RzIHRoZSBzb2NrZXQoKSBhbmQgc29ja2V0cGFpcigpIGNhbGxzLAoJbm90IHRoZSBuYW1lIHJlc29sdXRpb24uIHNvLXR5cGUgYW5kIHNvLXByb3RvdHlwZSBjYW4gbm93IGJlIGFwcGxpZWQgdG8KCWFsbCBzb2NrZXQgYmFzZWQgYWRkcmVzc2VzLgoKCW5ldyBhZGRyZXNzIG9wdGlvbiAiZXNjYXBlIiBhbGxvd3MgdG8gYnJlYWsgYSBzb2NhdCBpbnN0YW5jZSBldmVuIHdoZW4KCXJhdyB0ZXJtaW5hbCBtb2RlIHByZXZlbnRzIF5DIGV0Yy4gKGZlYXR1cmUgc3VnZ2VzdGVkIGJ5IEd1aWRvIFRyb3R0ZXIpCgoJc29jYXQgc2V0cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgU09DQVRfVkVSU0lPTiwgU09DQVRfUElELCBTT0NBVF9QUElECglmb3IgdXNlIGluIGV4ZWN1dGVkIHNjcmlwdHMKCglzb2NhdCBzZXRzIGVudmlyb25tZW50IHZhcmlhYmxlcyBTT0NBVF9TT0NLQUREUiwgU09DQVRfU09DS1BPUlQsCglTT0NBVF9QRUVSQUREUiwgU09DQVRfUEVFUlBPUlQgaW4gTElTVEVOIHR5cGUgYWRkcmVzc2VzIChmZWF0dXJlCglzdWdnZXN0ZWQgYnkgRWQgU2F3aWNraSkKCglzb2NhdCByZWNlaXZlcyBhbGwgYW5jaWxsYXJ5IG1lc3NhZ2VzIHdpdGggZWFjaCByZWNlaXZlZCBwYWNrZXQgb24KCWRhdGFncmFtIHJlbGF0ZWQgYWRkcmVzc2VzLiBUaGUgbWVzc2FnZXMgYXJlIGxvZ2dlZCBpbiByYXcgZm9ybSB3aXRoCglkZWJ1ZyBsZXZlbCwgYW5kIGJyb2tlbiBkb3duIHdpdGggaW5mbyBsZXZlbC4gbm90ZTogZWFjaCB0eXBlIG9mCglhbmNpbGxhcnkgbWVzc2FnZSBtdXN0IGJlIGVuYWJsZWQgYnkgYXBwcm9wcmlhdGUgYWRkcmVzcyBvcHRpb25zLiAKCglzb2NhdCBwcm92aWRlcyB0aGUgY29udGVudHMgb2YgYW5jaWxsYXJ5IG1lc3NhZ2VzIHJlY2VpdmVkIG9uIFJFQ1ZGUk9NCglhZGRyZXNzZXMgaW4gYXBwcm9wcmlhdGUgZW52aXJvbm1lbnQgdmFyaWFibGVzOgoJU09DQVRfVElNRVNUQU1QLCBTT0NBVF9JUF9EU1RBRERSLCBTT0NBVF9JUF9JRiwgU09DQVRfSVBfTE9DQUREUiwKCVNPQ0FUX0lQX09QVElPTlMsIFNPQ0FUX0lQX1RPUywgU09DQVRfSVBfVFRMLCBTT0NBVF9JUFY2X0RTVEFERFIsCglTT0NBVF9JUFY2X0hPUExJTUlULCBTT0NBVF9JUFY2X1RDTEFTUwoKCXRoZSBmb2xsb3dpbmcgYWRkcmVzcyBvcHRpb25zIHdlcmUgYWRkZWQgdG8gZW5hYmxlIGFuY2lsbGFyeSBtZXNzYWdlczoKCXNvLXRpbWVzdGFtcCwgaXAtcGt0aW5mbyAobm90IEJTRCksIGlwLXJlY3Zkc3RhZGRyIChCU0QpLCBpcC1yZWN2ZXJyLAoJaXAtcmVjdmlmIChCU0QpLCBpcC1yZWN2b3B0cywgaXAtcmVjdnRvcywgaXAtcmVjdnR0bCwgaXB2Ni1yZWN2ZHN0b3B0cywKCWlwdjYtcmVjdmVyciwgaXB2Ni1yZWN2aG9wbGltaXQsIGlwdjYtcmVjdmhvcG9wdHMsIGlwdjYtcmVjdnBhdGhtdHUsCglpcHY2LXJlY3Zwa3RpbmZvLCBpcHY2LXJlY3ZydGhkciwgaXB2Ni1yZWN2dGNsYXNzCgoJbmV3IGFkZHJlc3Mgb3B0aW9ucyBpcHY2LXRjbGFzcyBhbmQgaXB2Ni11bmljYXN0LWhvcHMgc2V0IHRoZSByZWxhdGVkCglzb2NrZXQgb3B0aW9ucy4KCglTVFJFQU1TIChVTklYIFN5c3RlbSBWIFNUUkVBTVMpIGNhbiBiZSBjb25maWd1cmVkIHdpdGggdGhlIG5ldyBhZGRyZXNzCglvcHRpb25zIGktcG9wLWFsbCBhbmQgaS1wdXNoICh0aGFua3MgdG8gTWljaGFsIFJ5c2F2eSBmb3IgcHJvdmlkaW5nIGEKCXBhdGNoKQoKY29ycmVjdGlvbnM6Cglzb21lIHJhdyBJUCBhbmQgVU5JWCBkYXRhZ3JhbSBtb2RlcyBmYWlsZWQgb24gQlNEIHN5c3RlbXMKCgl3aGVuIFVEUC1MSVNURU4gY29udGludWVkIHRvIGxpc3RlbiBhZnRlciBwYWNrZXQgZHJvcHBlZCBieSwgZS5nLiwKCXJhbmdlIG9wdGlvbiwgdGhlIG9sZCBsaXN0ZW4gc29ja2V0IHdvdWxkIG5vdCBiZSBjbG9zZWQgYnV0IGEgbmV3IG9uZQoJY3JlYXRlZC4gb3BlbiBzb2NrZXRzIGNvdWxkIGFjY3VtdWxhdGUuCgoJdGhlcmUgd2FzIGEgYnVnIGluIGlwKi1yZWN2IHdpdGggYmluZCBvcHRpb246IGl0IGRpZCBub3QgYmluZCwgYW5kCgl3aXRoIHRoZSBmaXJzdCByZWNlaXZlZCBwYWNrZXQgYW4gZXJyb3Igb2NjdXJyZWQ6Cglzb2NrZXRfaW5pdCgpOiB1bmtub3duIGFkZHJlc3MgZmFtaWx5IDAKCXRlc3Q6IFJBV0lQNFJFQ1ZCSU5ECgoJUkVDVkZST00gYWRkcmVzc2VzIHdpdGggRk9SSyBvcHRpb24gaHVuZyBhZnRlciBwcm9jZXNzaW5nIHRoZSBmaXJzdAoJcGFja2V0LiB0ZXN0OiBVRFA0UkVDVkZST01fRk9SSwoKCWNvcnJlY3RlZCBhIGZldyBtaXN0YWtlcyB0aGF0IGNhdXNlZCBjb21waWxlciB3YXJuaW5ncyBvbiA2NGJpdCBob3N0cwoJKHRoYW5rcyB0byBKb25hdGhhbiBCcmFubmFuIGUuYS4gZm9yIHByb3ZpZGluZyBhIHBhdGNoKQoKCUVYRUMgYW5kIFNZU1RFTSB3aXRoIHN0ZGVyciBpbmplY3RlZCBzb2NhdCBtZXNzYWdlcyBpbnRvIHRoZSBkYXRhCglzdHJlYW0uIHRlc3Q6IEVYRUNTVERFUlJMT0cKCgl3aGVuIHRoZSBFWEVDIGFkZHJlc3MgZ290IGEgc3RyaW5nIHdpdGggY29uc2VjdXRpdmUgc3BhY2VzIGl0IGNyZWF0ZWQKCWFkZGl0aW9uYWwgZW1wdHkgYXJndW1lbnRzICh0aGFua3MgdG8gT2xpdmllciBIZXJ2aWV1IGZvciByZXBvcnRpbmcKCXRoaXMgYnVnKS4gdGVzdDogRVhFQ1NQQUNFUwoKCWluIGlnbm9yZWVvZiBwb2xsaW5nIG1vZGUgc29jYXQgYWxzbyBibG9ja2VkIGRhdGEgdHJhbnNmZXIgaW4gdGhlIG90aGVyCglkaXJlY3Rpb24gZHVyaW5nIHRoZSAxcyB3YWl0IGludGVydmFsbHMgKHRoYW5rcyB0byBKb3JnZW4gQ2VkZXJsb2YgZm9yCglyZXBvcnRpbmcgdGhpcyBidWcpCgoJY29ycmVjdGVkIGFscGhhYmV0aWNhbCBvcmRlciBvZiBvcHRpb25zIChwcm94eS1hdXRoKQoKCXNvbWUgbWlub3IgY29ycmVjdGlvbnMKCglpbXByb3ZlZCB0ZXN0LnNoIHNjcmlwdDogbW9yZSBzdGFibGUgdGltaW5nLCBjb3JyZWN0aW9ucyBmb3IgQlNECgoJcmVwbGFjZWQgdGhlIHNlbGVjdCgpIGNhbGxzIGJ5IHBvbGwoKSB0byBjbGVhbmx5IGZpeCB0aGUgcHJvYmxlbXMgd2l0aAoJbWFueSBmaWxlIGRlc2NyaXB0b3JzIGFscmVhZHkgb3BlbgoKCXNvY2F0IG9wdGlvbiAtbGYgZGlkIG5vdCBsb2cgdG8gZmlsZSBidXQgdG8gc3RkZXJyCgoJc29jYXQgZGlkIG5vdCBjb21waWxlIG9uIFNvbGFyaXMgd2hlbiBjb25maWd1cmVkIHdpdGhvdXQgdGVybWlvcwoJZmVhdHVyZSAodGhhbmtzIHRvIFBhdmFuIEdhZGkgZm9yIHJlcG9ydGluZyB0aGlzIGJ1ZykKCnBvcnRpbmc6Cglzb2NhdCBjb21waWxlcyBhbmQgcnVucyBvbiBBSVggd2l0aCBnY2MgKHRoYW5rcyB0byBBbmRpIE1hdGhlciBmb3IgaGlzCgloZWxwKQoKCXNvY2F0IGNvbXBpbGVzIGFuZCBydW5zIG9uIEN5Z3dpbiAodGhhbmtzIHRvIEphbiBKdXN0IEtlaWpzZXIgZm9yIGhpcwoJaGVscCkKCglzb2NhdCBjb21waWxlcyBhbmQgcnVucyBvbiBIUC1VWCB3aXRoIGdjYyAodGhhbmtzIHRvIE1pY2hhbCBSeXNhdnkgZm9yCgloaXMgaGVscCkKCglzb2NhdCBjb21waWxlcyBhbmQgcnVucyBvbiBNYWNPUyBYICh0aGFua3MgdG8gQ2FtaWxsbyBMdWdhcmVzaSBmb3IgaGlzCgloZWxwKQoKZnVydGhlciBjaGFuZ2VzOgoJZmlsYW4gLXMgcHJlZml4ZXMgb3V0cHV0IHdpdGggRkQgbnVtYmVyIGlmIG1vcmUgdGhhbiBvbmUgRkQKCglNYWtlZmlsZSBub3cgc3VwcG9ydHMgZGF0YXJvb3RkaXIgKHRoYW5rcyB0byBDYW1pbGxvIEx1Z2FyZXNpIGZvcgoJcHJvdmlkaW5nIHRoZSBwYXRjaCkKCgljbGVhbnVwIGluIHhpby11bml4LmMKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS42LjAuMToKCm5ldyBmZWF0dXJlczoKCW5ldyBtYWtlIHRhcmdldCAiZ2l0Y2xlYW4iCgoJZG9jdSBzb3VyY2UgZG9jL3NvY2F0LnlvIHJlbGVhc2VkCgpjb3JyZWN0aW9uczoKCWV4ZWM6Li4uLHB0eSBkaWQgbm90IGtpbGwgY2hpbGQgcHJvY2VzcyB1bmRlciBzb21lIGNpcmN1bXN0YW5jZXM7IGZpeGVkCglieSBjb3JyZWN0aW5nIHR5cG8gaW4geGlvLXByb2djYWxsLmMgKHRoYW5rcyB0byBSYWxwaCBGb3JzeXRoZSBmb3IKCXJlcG9ydGluZyB0aGlzIHByb2JsZW0pIAoKCXNlcnZpY2UgbmFtZSByZXNvbHV0aW9uIGZhaWxlZCBkdWUgdG8gYnl0ZSBvcmRlciBtaXN0YWtlCgkodGhhbmtzIHRvIEphbWVzIFNhaW5zYnVyeSBmb3IgcmVwb3J0aW5nIHRoaXMgcHJvYmxlbSkKCglzb2NhdCB3b3VsZCBoYW5nIHdoZW4gaW52b2tlZCB3aXRoIG1hbnkgZmlsZSBkZXNjcmlwdG9ycyBhbHJlYWR5IG9wZW5lZAoJZml4OiByZXBsYWNlZCBGT1BFTl9NQVggd2l0aCBGRF9TRVRTSVpFCgl0aGFua3MgdG8gRGFuaWVsIEx1Y3EgZm9yIHJlcG9ydGluZyB0aGlzIHByb2JsZW0uCgoJZml4ZWQgYnVncyB3aGVyZSBzdWIgcHJvY2Vzc2VzIHdvdWxkIGJlY29tZSB6b21iaWVzIGJlY2F1c2UgdGhlIG1hc3RlcgoJcHJvY2VzcyBkaWQgbm90IGNhdGNoIFNJR0NITEQuIHRoaXMgYWZmZWN0ZWQgYWRkcmVzc2VzIFVEUC1MSVNURU4sCglVRFAtQ09OTkVDVCwgVENQLUNPTk5FQ1QsIE9QRU5TU0wsIFBST1hZLCBVTklYLUNPTk5FQ1QsIFVOSVgtQ0xJRU5ULAoJQUJTVFJBQ1QtQ09OTkVDVCwgQUJTVFJBQ1QtQ0xJRU5ULCBTT0NLU0EsIFNPQ0tTNEEKCSh0aGFua3MgdG8gRmVybmFuZGEgRyBXZWlkZW4gZm9yIHJlcG9ydGluZyB0aGlzIHByb2JsZW0pCgoJZml4ZWQgYSBidWcgd2hlcmUgc3ViIHByb2Nlc3NlcyB3b3VsZCBiZWNvbWUgem9tYmllcyBiZWNhdXNlIHRoZSBtYXN0ZXIKCXByb2Nlc3MgY2F1Z2h0IFNJR0NITEQgYnV0IGRpZCBub3Qgd2FpdCgpLiB0aGlzIGFmZmVjdGVkIGFkZHJlc3NlcwoJVURQLVJFQ1ZGUk9NLCBJUC1SRUNWRlJPTSwgVU5JWC1SRUNWRlJPTSwgQUJTVFJBQ1QtUkVDVkZST00KCSh0aGFua3MgdG8gRXZhbiBCb3Jnc3Ryb20gZm9yIHJlcG9ydGluZyB0aGlzIHByb2JsZW0pCgoJY29ycmVjdGVkIG9wdGlvbiBoYW5kbGluZyB3aXRoIFNURElPOyB1c2VjYXNlOiBjb29sLXdyaXRlCgoJY29uZmlndXJlIC0tZGlzYWJsZS1wdHkgIGFsc28gZGlzYWJsZWQgb3B0aW9uIHdhaXRsb2NrCgoJZml4ZWQgc21hbGwgYnVncyBvbiBzeXN0ZW1zIHdpdGggc3RydWN0IGlwX21yZXEgd2l0aG91dCBzdHJ1Y3QgaXBfbXJlcW4KCSh0aGFua3MgdG8gUm9sYW5kIElsbGlnIGZvciBzZW5kaW5nIGEgcGF0Y2gpCgoJY29ycmVjdGVkIG5hbWUgb2Ygb3B0aW9uIGludGVydmFsbCB0byBpbnRlcnZhbCAob2xkIGZvcm0gc3RpbGwgdmFsaWQKCWZvciB1cyBHZXJtYW4gc3BlYWtpbmcgZ3V5cykKCgljb3JyZWN0ZWQgc29tZSBwcmludCBzdGF0ZW1lbnRzIGFuZCB2YXJpYWJsZSBuYW1lcwoKCW1ha2UgdW5pbnN0YWxsICBkaWQgbm90IHVuaW5zdGFsbCBwcm9jYW4KCglmaXhlZCBsb3RzIG9mIHdlYWtuZXNzZXMgaW4gdGVzdC5zaAoKCWNvcnJlY3RlZCBzb21lIGJ1Z3MgYW5kIHR5cG9zIGluIGRvYy9zb2NhdC55bywgRVhBTVBMRVMsIEMgY29tbWVudHMKCmZ1cnRoZXIgY2hhbmdlczoKCXByb2NhbiAtYyBwcmludHMgQyBkZWZpbmVzIGltcG9ydGFudCBmb3Igc29jYXQKCglhZGRlZCB0ZXN0IE9QRU5TU0xFT0YgZm9yIE9wZW5TU0wgaGFsZiBjbG9zZQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjYuMC4wOgoKbmV3IGZlYXR1cmVzOgoJbmV3IGFkZHJlc3NlcyBJUC1EQVRBR1JBTSBhbmQgVURQLURBVEFHUkFNIGFsbG93IHZlcnNhdGlsZSBicm9hZGNhc3QKCWFuZCBtdWx0aWNhc3QgbW9kZXMgCgoJbmV3IG9wdGlvbiBpcC1hZGQtbWVtYmVyc2hpcCBmb3IgY29udHJvbCBvZiBtdWx0aWNhc3QgZ3JvdXAgbWVtYmVyc2hpcAoKCW5ldyBhZGRyZXNzIFRVTiBmb3IgZ2VuZXJhdGlvbiBvZiBMaW51eCBUVU4vVEFQIHBzZXVkbyBuZXR3b3JrCglpbnRlcmZhY2VzIChzdWdnZXN0ZWQgYnkgTWF0IENhdWdocm9uKTsgYXNzb2NpYXRlZCBvcHRpb25zIHR1bi1kZXZpY2UsCgl0dW4tbmFtZSwgdHVuLXR5cGU7IGlmZi11cCwgaWZmLXByb21pc2MsIGlmZi1ub2FycCwgaWZmLW5vLXBpIGV0Yy4KCgluZXcgYWRkcmVzc2VzIEFCU1RSQUNULUNPTk5FQ1QsIEFCU1RSQUNULUxJU1RFTiwgQUJTVFJBQ1QtU0VORFRPLAoJQUJTVFJBQ1QtUkVDViwgYW5kIEFCU1RSQUNULVJFQ1ZGUk9NIGZvciBhYnN0cmFjdCBVTklYIGRvbWFpbiBhZGRyZXNzZXMKCW9uIExpbnV4IChyZXF1ZXN0ZWQgYnkgWmVlc2hhbiBBbGkpOyBvcHRpb24gdW5peC10aWdodHNvY2tsZW4gY29udHJvbHMKCXNvY2tsZW4gcGFyYW1ldGVyIG9uIHN5c3RlbSBjYWxscy4KCglvcHRpb24gZW5kLWNsb3NlIGZvciBjb250cm9sIG9mIGNvbm5lY3Rpb24gY2xvc2luZyBhbGxvd3MgRkQgc2hhcmluZwoJYnkgc3ViIHByb2Nlc3NlcwoKCXJhbmdlIG9wdGlvbiBzdXBwb3J0cyBmb3JtIGFkZHJlc3M6bWFzayB3aXRoIElQdjQKCgljaGFuZ2VkIGJlaGF2aW91ciBvZiBPUEVOU1NMLUxJU1RFTiB0byByZXF1aXJlIGFuZCB2ZXJpZnkgY2xpZW50CgljZXJ0aWZpY2F0ZSBwZXIgZGVmYXVsdAoKCW9wdGlvbnMgZi1zZXRsa3ctcmQsIGYtc2V0bGt3LXdyLCBmLXNldGxrLXJkLCBmLXNldGxrLXdyIGFsbG93IGZpbmVyCglncmFpbmVkIGxvY2tpbmcgb24gcmVndWxhciBmaWxlcwoKCXVuaW5zdGFsbCB0YXJnZXQgaW4gTWFrZWZpbGUgKGxhY2sgcmVwb3J0ZWQgYnkgWmVlc2hhbiBBbGkpCgpjb3JyZWN0aW9uczoKCWZpeGVkIGJ1ZyB3aGVyZSBvbmx5IGZpcnN0IHRjcHdyYXAgb3B0aW9uIHdhcyBhcHBsaWVkOyBmaXhlZCBidWcgd2hlcmUKCXRjcHdyYXAgSVB2NiBjaGVjayBhbHdheXMgZmFpbGVkICh0aGFua3MgdG8gUnVkb2xmIENlamthIGZvciByZXBvcnRpbmcKCWFuZCBmaXhpbmcgdGhpcyBidWcpIAoKCWZpbGFuIChhbmQgc29jYXQgLUQpIGNvdWxkIGhhbmcgd2hlbiBhIHNvY2tldCB3YXMgaW52b2x2ZWQKCgljb3JyZWN0ZWQgUFRZcyBvbiBIUC1VWCAoYW5kIG1heWJlIG90aGVycykgdXNpbmcgU1RSRUFNUyAoaW5zcGlyZWQgYnkKCVJvYmVydG8gTWFja3VuKQoKCWNvcnJlY3QgYmluZCB3aXRoIHVkcDYtbGlzdGVuICh0aGFua3MgdG8gSmFuIEhvcmFrIGZvciByZXBvcnRpbmcgdGhpcwoJYnVnKQoKCWNvcnJlY3RlZCBmaWxhbi5jIHBlZWtidWZmWzBdIHdoaWNoIGRpZCBub3QgY29tcGlsZSB3aXRoIFN1biBTdHVkaW8gUHJvCgkodGhhbmtzIHRvIExlbyBaaGFkYW5vdnNreSBmb3IgcmVwb3J0aW5nIHRoaXMgcHJvYmxlbSkKCgljb3JyZWN0ZWQgcHJvYmxlbSB3aXRoIHJlYWQgZGF0YSBidWZmZXJlZCBpbiBPcGVuU1NMIGxheWVyICh0aGFua3MgdG8KCUpvbiBOZWxzb24gZm9yIHJlcG9ydGluZyB0aGlzIGJ1ZykKCgljb3JyZWN0ZWQgcHJvYmxlbSB3aXRoIG9wdGlvbiByZWFkYnl0ZXMgd2hlbiBpbnB1dCBzdHJlYW0gc3RheWVkIGlkbGUKCWFmdGVyIHNvIG1hbnkgYnl0ZXMKCglmaXhlZCBhIGJ1ZyB3aGVyZSBhIGRhdGFncmFtIHJlY2VpdmVyIHdpdGggb3B0aW9uIGZvcmsgY291bGQgZm9yayB0d28KCXN1YiBwcm9jZXNzZXMgcGVyIHBhY2tldAoKZnVydGhlciBjaGFuZ2VzOgoJbW92ZWQgZG9jdW1lbnRhdGlvbiB0byBuZXcgZG9jLyBzdWJkaXIKCgluZXcgZG9jdW1lbnRzIChraW5kIG9mIG1pbmkgdHV0b3JpYWxzKSBhcmUgcHJvdmlkZWQgaW4gZG9jLwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjUuMC4wOgoKbmV3IGZlYXR1cmVzOgoJbmV3IGRhdGFncmFtIG1vZGVzIGZvciB1ZHAsIHJhd2lwLCB1bml4IGRvbWFpbiBzb2NrZXRzCgoJc29jYXQgb3B0aW9uIC1UIHNwZWNpZmllcyBpbmFjdGl2aXR5IHRpbWVvdXQKCglyZXdyb3RlIGxleGljYWwgYW5hbHlzaXMgdG8gYWxsb3cgbmVzdGVkIHNvY2F0IGNhbGxzCgoJYWRkcmVzc2VzIHRjcCwgdWRwLCB0Y3AtbCwgdWRwLWwsIGFuZCByYXdpcCBub3cgc3VwcG9ydCBJUHY0IGFuZCBJUHY2CgoJc29jYXQgb3B0aW9ucyAtNCwgLTYgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlcyBTT0NBVF9ERUZBVUxUX0xJU1RFTl9JUCwKCVNPQ0FUX1BSRUZFUlJFRF9SRVNPTFZFX0lQIGZvciBjb250cm9sIG9mIHByb3RvY29sIHNlbGVjdGlvbgoKCWFkZHJlc3NlcyBzc2wsIHNzbC1sLCBzb2NrcywgcHJveHkgbm93IHN1cHBvcnQgSVB2NCBhbmQgSVB2NgoKCW9wdGlvbiBwcm90b2NvbC1mYW1pbHkgKHBmKSwgZXNwLiBmb3Igb3BlbnNzbC1saXN0ZW4KCglyYW5nZSBvcHRpb24gc3VwcG9ydHMgSVB2NiAtIHN5bnRheDogcmFuZ2U9Wzo6MS8xMjhdCgoJb3B0aW9uIGlwdjYtdjZvbmx5IChpcHY2b25seSkKCgluZXcgdGNwLXdyYXBwZXJzIG9wdGlvbnMgYWxsb3ctdGFibGUsIGRlbnktdGFibGUsIHRjcHdyYXAtZXRjCgoJRklQUyB2ZXJzaW9uIG9mIE9wZW5TU0wgY2FuIGJlIGludGVncmF0ZWQgLSBpbml0aWFsIHBhdGNoIHByb3ZpZGVkIGJ5CglEYXZpZCBBY2tlci4gU2VlIFJFQURNRS5GSVBTCgoJc3VwcG9ydCBmb3IgcmVzb2x2ZXIgb3B0aW9ucyByZXMtZGVidWcsIGFhb25seSwgdXNldmMsIHByaW1hcnksIGlnbnRjLAoJcmVjdXJzZSwgZGVmbmFtZXMsIHN0YXlvcGVuLCBkbnNyY2gKCglvcHRpb25zIGZvciBmaWxlIGF0dHJpYnV0ZXMgb24gYWR2YW5jZWQgZmlsZXN5c3RlbXMgKGV4dDIsIGV4dDMsCglyZWlzZXIpOiBzZWNybSwgdW5ybSwgY29tcHIsIGV4dDItc3luYywgaW1tdXRhYmxlLCBleHQyLWFwcGVuZCwgbm9kdW1wLAoJZXh0Mi1ub2F0aW1lLCBqb3VybmFsLWRhdGEgZXRjLgoKCW9wdGlvbiBjb29sLXdyaXRlIGNvbnRyb2xzIHNldmVyZW5lc3Mgb2Ygd3JpdGUgZmFpbHVyZSAoRVBJUEUsCglFQ09OTlJFU0VUKQoKCW9wdGlvbiBvLW5vYXRpbWUKCglzb2NhdCBvcHRpb24gLWxoIGZvciBob3N0bmFtZSBpbiBsb2cgb3V0cHV0CgoJdHJhZmZpYyBkdW1waW5nIHByb3ZpZGVzIHBhY2tldCBoZWFkZXJzCgoJY29uZmlndXJlLmluIGJlY2FtZSBwYXJ0IG9mIGRpc3RyaWJ1dGlvbgoKCXNvY2F0cyB1bnBhY2sgZGlyZWN0b3J5IG5vdyBoYXMgZnVsbCB2ZXJzaW9uLCBlLmcuIHNvY2F0LTEuNS4wLjAvCgoJY29ycmVjdGVkIGRvY3Ugb2Ygb3B0aW9uIHZlcmlmeQoKY29ycmVjdGlvbnM6CglmaXhlZCB0Y3B3cmFwcGVycyBpbnRlZ3JhdGlvbiAtIGluaXRpYWwgZml4IHByb3ZpZGVkIGJ5IFJ1ZG9sZiBDZWprYQoKCWV4ZWMgd2l0aCBwaXBlcyxzdGRlcnIgcHJvZHVjZWQgZXJyb3IKCglzZXR1aWQtZWFybHkgd2FzIGlnbm9yZWQgd2l0aCBtYW55IGFkZHJlc3MgdHlwZXMKCglzb21lIG1pbm9yIGNvcnJlY3Rpb25zCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuNC4zLjE6Cgpjb3JyZWN0aW9uczoKCVBST0JMRU06IFVOSVggc29ja2V0IGxpc3RlbiBhY2NlcHRlZCBvbmx5IG9uZSAob3IgYSBmZXcpIGNvbm5lY3Rpb25zLgoJRklYOiBkbyBub3QgcmVtb3ZlIGxpc3RlbmluZyBVTklYIHNvY2tldCBpbiBjaGlsZCBwcm9jZXNzCgoJUFJPQkxFTTogU0lHU0VHViB3aGVuIFRDUCBwYXJ0IG9mIFNTTCBjb25uZWN0IGZhaWxlZAoJRklYOiBjaGVjayBzc2wgcG9pbnRlciBiZWZvcmUgY2FsbGluZyBTU0xfc2h1dGRvd24KCglJbiBkZWJ1ZyBtb2RlLCBzaG93IGNvbm5lY3QgY2xpZW50IHBvcnQgZXZlbiB3aGVuIGNvbm5lY3QgZmFpbHMKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS40LjMuMDoKCm5ldyBmZWF0dXJlczoKCXNvY2F0IG9wdGlvbnMgLUwsIC1XIGZvciBhcHBsaWNhdGlvbiBsZXZlbCBsb2NraW5nCgoJb3B0aW9ucyAibG9ja2ZpbGUiLCAid2FpdGxvY2siIGZvciBhZGRyZXNzIGxldmVsIGxvY2tpbmcKCShTdGVmYW4gTHVldGhqZSkKCglvcHRpb24gInJlYWRieXRlcyIgbGltaXRzIHJlYWQgbGVuZ3RoIChBZGFtIE9zdWNob3dza2kpCgoJb3B0aW9uICJyZXRyeSIgZm9yIHVuaXgtY29ubmVjdCwgdW5peC1saXN0ZW4sIHRjcDYtbGlzdGVuIChEYWxlIER1ZGUpCgoJcHR5IHN5bWxpbmssIHVuaXggbGlzdGVuIHNvY2tldCwgYW5kIG5hbWVkIHBpcGUgYXJlIHBlciBkZWZhdWx0IHJlbW92ZWQKCWFmdGVyIHVzZTsgb3B0aW9uIHVubGluay1jbG9zZSBvdmVycmlkZXMgdGhpcyBuZXcgYmVoYXZpb3VyIGFuZCBhbHNvCgljb250cm9scyByZW1vdmFsIG9mIG90aGVyIHNvY2F0IGdlbmVyYXRlZCBmaWxlcyAoU3RlZmFuIEx1ZXRoamUpCgpjb3JyZWN0aW9uczoKCW9wdGlvbiAicmV0cnkiIGRpZCBub3Qgd29yayB3aXRoIHRjcC1saXN0ZW4KCglFUElQRSBjb25kaXRpb24gY291bGQgcmVzdWx0IGluIGEgMTAwJSBDUFUgbG9vcAoKZnVydGhlciBjaGFuZ2VzOgoJc3VwcG9ydCBzeXN0ZW1zIHdpdGhvdXQgU0hVVF9SRCBldGMuCgloYW5kbGUgbW9yZSBzaXplX3QgdHlwZXMKCXRyeSB0byBmaW5kIG1ha2VkZXBlbmQgb3B0aW9ucyB3aXRoIGdjYyAzIChyaWNoYXJkL09wZW5NYWNOZXdzKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjQuMi4wOgoKbmV3IGZlYXR1cmVzOgoJb3B0aW9uICJjb25uZWN0LXRpbWVvdXQiIGxpbWl0cyB3YWl0IHRpbWUgZm9yIGNvbm5lY3Qgb3BlcmF0aW9ucwoJKHJlcXVlc3RlZCBieSBHaXVsaW8gT3JzZXJvKQoKCW9wdGlvbiAiZGhwYXJhbSIgZm9yIGV4cGxpY2l0IERpZmZpZS1IZWxsbWFuIHBhcmFtZXRlciBmaWxlCgpjb3JyZWN0aW9uczoKCXN1cHBvcnQgZm9yIE9wZW5TU0wgRFNBIGNlcnRpZmljYXRlcyAoTWlpa2EgS29tdSkKCgljcmVhdGUgaW5zdGFsbCBkaXJlY3RvcmllcyBiZWZvcmUgY29weWluZyBmaWxlcyAoTWlpa2EgS29tdSkKCgl3aGVuIGV4aXRpbmcgb24gc2lnbmFsLCByZXR1cm4gc3RhdHVzIDEyOCtzaWdudW0gaW5zdGVhZCBvZiAxCgoJb24gRVBJUEUgYW5kIEVDT05OUkVTRVQsIG9ubHkgaXNzdWUgYSB3YXJuaW5nIChTYW50aWFnbyBHYXJjaWEKCU1hbnRpbmFuKQoKCS1sdSBjb3VsZCBjYXVzZSBhIGNvcmUgZHVtcCBvbiBsb25nIG1lc3NhZ2VzCgpmdXJ0aGVyIGNoYW5nZXM6Cgltb2RpZmljYXRpb25zIHRvIHNpbXBsaWZ5IHVzaW5nIHNvY2F0cyBmZWF0dXJlcyBpbiBhcHBsaWNhdGlvbnMKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS40LjEuMDoKCm5ldyBmZWF0dXJlczoKCW9wdGlvbiAid2FpdC1zbGF2ZSIgYmxvY2tzIG9wZW4gb2YgcHR5IG1hc3RlciBzaWRlIHVudGlsIGEgY2xpZW50Cgljb25uZWN0cywgInB0eS1pbnRlcnZhbGwiIGNvbnRyb2xzIHBvbGxpbmcKCglvcHRpb24gLWggYXMgc3lub255bSB0byAtPyBmb3IgaGVscCAoY29udHJpYnV0ZWQgYnkgQ2hyaXN0aWFuCglMYWRlbWFubikKCglmaWxhbiBwcmludHMgZm9ybWF0dGVkIHRpbWUgc3RhbXBzIGFuZCByZGV2IChkaXNhYmxlIHdpdGggLXIpCgoJcmVkaXJlY3QgZmlsYW4ncyBvdXRwdXQsIHNvIHN0ZG91dCBpcyBub3QgYWZmZWN0ZWQgKGNvbnRyaWJ1dGVkIGJ5CglMdWlnaSBJb3R0aSkgCgoJZmlsYW4gb3B0aW9uIC1MIHRvIGZvbGxvdyBzeW1ib2xpYyBsaW5rcwoKCWZpbGFuIHNob3dzIHRlcm1pb3MgY29udHJvbCBjaGFyYWN0ZXJzCgpjb3JyZWN0aW9uczoKCXByb3h5IGFkZHJlc3Mgbm8gbG9uZ2VyIHBlcmZvcm1zIHVuc29saWNpdGVkIHJldHJpZXMKCglmaWxhbiAtZiBubyBsb25nZXIgbmVlZHMgcmVhZCBwZXJtaXNzaW9uIHRvIGFuYWx5emUgYSBmaWxlIChidXQgc3RpbGwKCW5lZWRzIGFjY2VzcyBwZXJtaXNzaW9uIHRvIGRpcmVjdG9yeSwgb2YgY291cnNlKQoKcG9ydGluZzoKCU9wdGlvbiBkc3VzcAoJRnJlZUJTRCBvcHRpb25zIG5vb3B0LCBub3B1c2gsIG1kNXNpZwoJT3BlbkJTRCBvcHRpb25zIHNhY2stZGlzYWJsZSwgc2lnbmF0dXJlLWVuYWJsZQoJSFAtVVgsIFNvbGFyaXMgb3B0aW9ucyBhYm9ydC10aHJlc2hvbGQsIGNvbm4tYWJvcnQtdGhyZXNob2xkCglIUC1VWCBvcHRpb25zIGI5MDAsIGIzNjAwLCBiNzIwMAoJVHJ1NjQvT1NGMSBvcHRpb25zIGtlZXBpbml0LCBwYXdzLCBzYWNrZW5hLCB0c29wdGVuYQoKZnVydGhlciBjb3JyZWN0aW9uczoKCWFkZHJlc3MgcHR5IG5vdyB1c2VzIHB0bXggYXMgZGVmYXVsdCBpZiBvcGVucHR5IGlzIGFsc28gYXZhaWxhYmxlCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuNC4wLjM6CgpzZWN1cml0eToKCVNvY2F0IHNlY3VyaXR5IGFkdmlzb3J5IDEKCUNWRS0yMDA0LTE0ODQ6CglmaXggdG8gYSBzeXNsb2coKSBiYXNlZCBmb3JtYXQgc3RyaW5nIHZ1bG5lcmFiaWxpdHkgdGhhdCBjYW4gbGVhZCB0bwoJcmVtb3RlIGNvZGUgZXhlY3V0aW9uLiBTZWUgYWR2aXNvcnkgc29jYXQtYWR2LTEudHh0CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuNC4wLjI6Cgpjb3JyZWN0aW9uczoKCWV4ZWMnZCB3cml0ZS1vbmx5IGFkZHJlc3NlcyBnZXQgYSBjaGFuY2UgdG8gZmx1c2ggYmVmb3JlIGJlaW5nIGtpbGxlZAoKCWVycm9yIGhhbmRsZXI6IHByaW50IG5vdGljZSBvbiBlcnJvci1leGl0CgoJZmlsYW4gcHJpbnRlZCB3cm9uZyBmaWxlIHR5cGUgaW5mb3JtYXRpb24KCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS40LjAuMToKCmNvcnJlY3Rpb25zOgoJc29ja3M0YSBjb25zdHJ1Y3RlZCBpbnZhbGlkIGhlYWRlci4gUHJvYmxlbSBmb3VuZCwgcmVwb3J0ZWQsIGFuZCBmaXhlZAoJYnkgVGhvbWFzIFRoZW1lbCwgYnkgUGV0ZXIgUGFsZnJhZGVyLCBhbmQgYnkgcmlrCgoJd2l0aCBub2ZvcmssIGRvbid0IGZvcmdldCB0byBhcHBseSBzb21lIHByb2Nlc3MgcmVsYXRlZCBvcHRpb25zCgkoY2hyb290LCBzZXRzaWQsIHNldHBnaWQsIC4uLikKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS40LjAuMDoKCm5ldyBmZWF0dXJlczoKCXNpbXBsZSBvcGVuc3NsIHNlcnZlciAoc3NsLWwpLCBleHBlcmltZW50YWwgb3BlbnNzbCB0cnVzdAoKCW5ldyBvcHRpb25zICJjYWZpbGUiLCAiY2FwYXRoIiwgImtleSIsICJjZXJ0IiwgImVnZCIsIGFuZCAicHNldWRvIiBmb3IKCW9wZW5zc2wKCgluZXcgb3B0aW9ucyAicmV0cnkiLCAiZm9yZXZlciIsIGFuZCAiaW50ZXJ2YWxsIgoKCW9wdGlvbiAiZm9yayIgZm9yIGFkZHJlc3MgVENQIGltcHJvdmVzIGBnZW5kZXIgY2hhbmdlcrQKCglvcHRpb25zICJzaWdpbnQiLCAic2lncXVpdCIsIGFuZCAic2lnaHVwIiBjb250cm9sIHBhc3Npbmcgb2Ygc2lnbmFscyB0bwoJc3ViIHByb2Nlc3MgKHRoYW5rcyB0byBEYXZpZCBTaGVhIHdobyBjb250cmlidXRlZCB0byB0aGlzIGlzc3VlKQoKCXJlYWRsaW5lIHRha2VzIHJlc3BlY3QgdG8gdGhlIHByb21wdCBpc3N1ZWQgYnkgdGhlIHBlZXIgYWRkcmVzcwoKCW9wdGlvbnMgInByb21wdCIgYW5kICJub3Byb21wdCIgYWxsb3cgdG8gb3ZlcnJpZGUgcmVhZGxpbmUncyBuZXcKCWRlZmF1bHQgYmVoYXZpb3VyCgoJcmVhZGxpbmUgc3VwcG9ydHMgaW52aXNpYmxlIHBhc3N3b3JkIHdpdGggb3B0aW9uICJub2VjaG8iCgoJc29jYXQgb3B0aW9uIC1scCBhbGxvd3MgdG8gc2V0IGhvc3RuYW1lIGluIGxvZyBvdXRwdXQKCglzb2NhdCBvcHRpb24gLWx1IHR1cm5zIG9uIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24gaW4gbG9nIG91dHB1dAoKCmNvcnJlY3Rpb25zOgoJYmVmb3JlIHJlYWRpbmcgYXZhaWxhYmxlIGRhdGEsIGNoZWNrIGlmIHdyaXRpbmcgb24gb3RoZXIgY2hhbm5lbCBpcwoJcG9zc2libGUKCgl0Y3A2LCB1ZHA2OiBzdXBwb3J0IGhvc3RuYW1lIHNwZWNpZmljYXRpb24gKG5vdCBvbmx5IElQIGFkZHJlc3MpLCBhbmQKCW1hcCBJUDQgbmFtZXMgdG8gSVA2IGFkZHJlc3NlcwoKCW9wZW5zc2wgY2xpZW50IGNoZWNrcyBzZXJ2ZXIgY2VydGlmaWNhdGUgcGVyIGRlZmF1bHQKCglzdXBwb3J0IHVuaWRpcmVjdGlvbmFsIGNvbW11bmljYXRpb24gd2l0aCBleGVjL3N5c3RlbSBzdWJwcm9jZXNzCgoJdHJ5IHRvIHJlc3RvcmUgb3JpZ2luYWwgdGVybWluYWwgc2V0dGluZ3Mgd2hlbiB0ZXJtaW5hdGluZwoKCXRlc3Quc2ggdXNlcyB0bXAgZGlyIC90bXAvJFVTRVIvJCQgaW5zdGVhZCBvZiAvdG1wLyQkIAoKCXNvY2tzNCBmYWlsZWQgb24gcGxhdGZvcm1zIHdoZXJlIGxvbmcgZG9lcyBub3QgaGF2ZSAzMiBiaXRzCgkodGhhbmtzIHRvIFBldGVyIFBhbGZyYWRlciBhbmQgVGhvbWFzIFNleXJhdCkKCgloc3RyZXJyb3Igc3Vic3RpdHV0ZSB3cm90ZSB3cm9uZyBtZXNzYWdlcyAoSFAtVVgsIFNvbGFyaXMpCgoJcHJveHkgZXJyb3IgbWVzc2FnZSB3YXMgdHJ1bmNhdGVkIHdoZW4gYW5zd2VyIGNvbnRhaW5lZCBtdWx0aXBsZSBzcGFjZXMKCgpwb3J0aW5nOgoJY29tcGlsZXMgd2l0aCBBSVggeGxjLCBIUC1VWCBjYywgVHJ1NjQgY2MgKGJ1dCBtaWdodCBub3QgbGluaykKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS4zLjIuMjoKCmNvcnJlY3Rpb25zOgoJUFJPWFkgQ09OTkVDVCBmYWlsZWQgd2hlbiB0aGUgc3RhdHVzIHJlcGx5IGZyb20gdGhlIHByb3h5IHNlcnZlcgoJY29udGFpbmVkIG1vcmUgdGhhbiBvbmUgY29uc2VjdXRpdmUgc3BhY2VzLiBQcm9ibGVtIHJlcG9ydGVkIGJ5CglBbGV4YW5kcmUgQmV6cm91dGNoa28KCglkbyBub3QgU0lHU0VHViB3aGVuIHByb3h5IGFkZHJlc3MgZmFpbHMgdG8gcmVzb2x2ZSBzZXJ2ZXIgbmFtZQoKCXVkcC1saXN0ZW4gZmFpbGVkIG9uIHN5c3RlbXMgd2hlcmUgQUZfSU5FVCAhPSBTT0NLX0RHUkFNIChlLmcuIFN1bk9TKS4KCVByb2JsZW0gcmVwb3J0ZWQgYnkgQ2hyaXN0b3BoIFNjaGl0dGVsCgoJdGVzdC5zaCBvbmx5IHRlc3RzIGF2YWlsYWJsZSBmZWF0dXJlcwoKCWFkZGVkIG1pc3NpbmcgSVAgYW5kIFRDUCBvcHRpb25zIGluIGZpbGFuIGFuYWx5emVyCgoJZG8gbm90IGFwcGx5IHN0ZGlvIGFkZHJlc3Mgb3B0aW9ucyB0byBib3RoIGRpcmVjdGlvbnMgd2hlbiBpbiAKCXVuaWRpcmVjdGlvbmFsIG1vZGUKCglvbiBzeXN0ZW1zIGxhY2tpbmcgL2Rldi8qcmFuZG9tIGFuZCBlZ2QsIHByb3ZpZGUgKHdlYWspIGVudHJvcHkgZnJvbQoJbGliYyByYW5kb20oKQoKCnBvcnRpbmc6CgljaGFuZ2VzIGZvciBIUC1VWCAoVlJFUFJJTlQsIGhfTkVUREJfSU5URVJOQUwpCgoJY29tcGlsZXMgb24gVHJ1ZTY0LCBGcmVlQlNEIChhZ2FpbiksIE5ldEJTRCwgT3BlbkJTRAoKCXN1cHBvcnQgZm9yICBsb25nIGxvbmcgIGFzICBzdF9pbm8gdHlwZSAoQ3lnd2luIDEuNSkKCgljb21waWxlIG9uIHN5c3RlbXMgd2hlcmUgcHR5IGNhbiBub3QgYmUgZmVhdHVyZWQKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS4zLjIuMToKCmNvcnJlY3Rpb25zOgoJImZpbmFsIiBzb2x1dGlvbiBmb3IgdGhlIEVOT0NITEQgcHJvYmxlbQoKCWNvcnJlY3RlZCAibWFrZSBzdHJpcCIKCglkZWZhdWx0IGdjYyBkZWJ1Zy9vcHQgaXMgIi1PIiBhZ2FpbgoKCWNoZWNrIGZvciAvcHJvYyBhdCBydW50aW1lLCBldmVuIGlmIGNvbmZpZ3VyZSBmb3VuZCBpdAoKCXNyYy5ycG0gYWNjaWRlbnRseSBzdXBwb3J0ZWQgU3VTRSBpbnN0ZWFkIG9mIFJlZEhhdAoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjMuMi4wOgoKbmV3IGZlYXR1cmVzOgoJb3B0aW9uICJub2ZvcmsiIGNvbm5lY3RzIGFuIGV4ZWMnZCBzY3JpcHQgb3IgcHJvZ3JhbSBkaXJlY3RseQoJdG8gdGhlIGZpbGUgZGVzY3JpcHRvcnMgb2YgdGhlIG90aGVyIGFkZHJlc3MsIGNpcmN1bXZlbnRpbmcgdGhlIHNvY2F0Cgl0cmFuc2ZlciBlbmdpbmUKCglzdXBwb3J0IGZvciBmaWxlcyA+MkdCLCB1c2luZyBmdHJ1bmNhdGU2NCgpLCBsc2VlazY0KCksIHN0YXQ2NCgpCgoJZmlsYW4gaGFzIG5ldyAic2ltcGxlIiBvdXRwdXQgc3R5bGUgKGZpbGFuIC1zKQoKCnBvcnRpbmc6CglvcHRpb25zICJiaW5hcnkiIGFuZCAidGV4dCIgZm9yIGNvbnRyb2xsaW5nIGxpbmUgdGVybWluYXRpb24gb24gQ3lnd2luCglmaWxlIHN5c3RlbSBhY2Nlc3MgKGhpbnQgZnJvbSBZYW5nIFd1LVpob3UpCgoJZml4IGJ5IFlhbmcgV3UtWmhvdSBmb3IgdGhlIEN5Z3dpbiAiTm8gQ2hpbGRyZW4iIHByb2JsZW0KCglpbXByb3ZlZCBzdXBwb3J0IGZvciBPU1I6IF9TVklEMzsgbm8gSVNfU09DSywgbm8gRl9HRVRPV04gKHRoYW5rcyB0bwoJSm9obiBEdUJvaXMpCgoJbWlub3IgY29ycmVjdGlvbnMgdG8gYXZvaWQgd2FybmluZ3Mgd2l0aCBnY2MgMwoKCmZ1cnRoZXIgY29ycmVjdGlvbnMgYW5kIG1pbm9yIGltcHJvdmVtZW50czoKCWNvbmZpZ3VyZSBzY3JpcHQgaXMgZ2VuZXJhdGVkIHdpdGggYXV0b2NvbmYgMi41NyAobm8gbG9uZ2VyIDIuNTIpCgoJY29uZmlndXJlIHBhc3NlcyBDRkxBR1MgdG8gTWFrZWZpbGUKCglvcHRpb24gLT8/PyBmb3IgY29tcGxldGUgbGlzdCBvZiBhZGRyZXNzIG9wdGlvbnMgYW5kIHRoZWlyIHNob3J0IGZvcm1zCgoJcHJvZ3JhbSBuYW1lIGluIHN5c2xvZyBtZXNzYWdlcyBpcyBkZXJpdmVkIGZyb20gYXJndlswXQoKCVNJR0hVUCBub3cgcHJpbnRzIG5vdGljZSBpbnN0ZWFkIG9mIGVycm9yCgoJRUlPIGR1cmluZyByZWFkIG9mIHB0eSBub3cgZ2l2ZXMgTm90aWNlIGluc3RlYWQgb2YgRXJyb3IsIGFuZAoJdHJpZ2dlcnMgRU9GCgoJdXNlIG9mIGhzdHJlcnJvcigpIGZvciBwcmludGluZyByZXNvbHZlciBlcnJvciBtZXNzYWdlcwoKCXNldGdyZW50KCkgZ290IHJlcXVpcmVkIGVuZGdyZW50KCkKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS4zLjEuMDoKCm5ldyBmZWF0dXJlczoKCWludGVncmF0aW9uIG9mIFdpZXRzZSBWZW5lbWEncyB0Y3B3cmFwcGVyIGxpYnJhcnkgKGxpYndyYXApCgoJd2l0aCAicHJveHkiIGFkZHJlc3MsIG9wdGlvbiAicmVzb2x2ZSIgY29udHJvbHMgaWYgaG9zdG5hbWUgb3IgSVAKCWFkZHJlc3MgaXMgc2VudCBpbiByZXF1ZXN0CgoJb3B0aW9uICJsb3dwb3J0IiBlc3RhYmxpc2hlcyBsaW1pdGVkIGF1dGhvcml6YXRpb24gZm9yIFRDUCBhbmQgVURQCgljb25uZWN0aW9ucyAKCglpbXByb3ZlbWVudCBvZiAuc3BlYyBmaWxlIGZvciBSUE0gY3JlYXRpb24gKHRoYW5rcyB0byBHZXJkIHYuIEVnaWR5KQoJQW4gYWNjb21wYW55aW5nIGNoYW5nZSBpbiB0aGUgbnVtYmVyaW5nIHNjaGVtZSByZXN1bHRzIGluIGFuIAoJaW5jb21wYXRpYmlsaXR5IHdpdGggZWFybGllciBzb2NhdCBSUE1zIQoKCnNvbHZlZCBwcm9ibGVtcyBhbmQgYnVnczoKCVBST0JMRU06IHNvY2F0IGRhZW1vbiB0ZXJtaW5hdGVkIHdoZW4gdGhlIGFkZHJlc3Mgb2YgYSBjb25uZWN0aW5nCgljbGllbnQgZGlkIG5vdCBtYXRjaCByYW5nZSBvcHRpb24gdmFsdWUgaW5zdGVhZCBvZiBjb250aW51ZSBsaXN0ZW5pbmcKCVNPTFZFRDogaW4gdGhpcyBjYXNlLCBwcmludCB3YXJuaW5nIGluc3RlYWQgb2YgZXJyb3IgdG8ga2VlcCBkYWVtb24KCWFjdGl2ZSAKCglQUk9CTEVNOiB0Y3AtbGlzdGVuIHdpdGggZm9yayBzb21ldGltZXMgbGVmdCBleGNlc3NpdmUgbnVtYmVyIG9mIHpvbWJpZQoJcHJvY2Vzc2VzCglTT0xWRUQ6IGRvbnQgYXNzdW1lIHRoYXQgZWFjaCBleGl0aW5nIGNoaWxkIHByb2Nlc3MgZ2VuZXJhdGVzIFNJR0NITEQKCgl3aGVuIGNvbnZlcnRpbmcgQ1JOTCB0byBDUiwgc29jYXQgY29udmVydGVkIHRvIE5MCgoKZnVydGhlciBjb3JyZWN0aW9uczoKCWNvbmZpZ3VyZSBzY3JpcHQgbm93IGRpc2FibGVzIGZlYXR1cmVzIHRoYXQgZGVwZW5kIG9uIG1pc3NpbmcgZmlsZXMKCW1ha2luZyBpdCBtb3JlIHJvYnVzdCBpbiAidW5zdXBwb3J0ZWQiIGVudmlyb25tZW50cwoKCXNlcnZlci5wZW0gcGVybWlzc2lvbnMgY29ycmVjdGVkIHRvIDYwMAoKCSJtYWtlIGluc3RhbGwiIG5vdyBkb2VzIG5vdCBzdHJpcDsgdXNlICJtYWtlIHN0cmlwOyBtYWtlIGluc3RhbGwiCglpZiB5b3UgbGlrZSBzdHJpcCAoc3VnZ2VzdGVkIGJ5IFBldGVyIEJyYXkpCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuMy4wLjE6Cgpzb2x2ZWQgcHJvYmxlbXMgYW5kIGJ1Z3M6CglQUk9CTEVNOiBPUEVOU1NMIGRpZCBub3QgYXBwbHkgdGNwLCBpcCwgYW5kIHNvY2tldCBvcHRpb25zCglTT0xWRUQ6IE9QRU5TU0wgbm93IGNvcnJlY3RseSBoYW5kbGVzIHRoZSBvcHRpb25zIGxpc3QKCglQUk9CTEVNOiBDUk5MIHRvIE5MIGFuZCBDUk5MIHRvIENSIGNvbnZlcnNpb25zIGZhaWxlZCB3aGVuIENSTkwgY3Jvc3NlZAoJYmxvY2sgYm91bmRhcnkKCVNPTFZFRDogdGhlc2UgY29udmVyc2lvbnMgbm93IHNpbXBseSBzdHJpcCBhbGwgQ1IncyBvciBOTCdzIGZyb20gaW5wdXQKCXN0cmVhbSAKCgpwb3J0aW5nOgoJU3VuT1MgcHR5cyBub3cgd29yayBvbiB4ODYsIHRvbyAodGhhbmtzIHRvIFBldGVyIEJyYXkpCgoJY29uZmlndXJlIGxvb2tzIGZvciBmcmVld2FyZSBsaWJzIGluIC9wa2dzL2xpYi8gKHRoYW5rcyB0byBQZXRlciBCcmF5KQoKCmZ1cnRoZXIgY29ycmVjdGlvbnM6CglhZGRlZCBXSVRIX1BST1hZIHZhbHVlIHRvIC1WIG91dHB1dAoKCWFkZGVkIGNvbXBpbGUgZGVwZW5kZW5jaWVzIG9mIFdJVEhfUFRZIGFuZCBXSVRIX1BST1hZCgoJLT8/IGRpZCBub3QgcHJpbnQgb3B0aW9uIGdyb3VwIG9mIHByb3h5IG9wdGlvbnMKCgljb3JyZWN0ZWQgc3ludGF4IGZvciBiaW5kIG9wdGlvbiBpbiBkb2N1CgoJY29ycmVjdGVkIGFuIGlzc3VlIHdpdGggc3RkaW8gaW4gdW5pZGlyZWN0aW9uYWwgbW9kZQoKCW9wdGlvbnMgc29ja3Nwb3J0IGFuZCBwcm94eXBvcnQgc3VwcG9ydCBzZXJ2aWNlIG5hbWVzCgoJZnRwLnNoIHNjcmlwdCBzdXBwb3J0cyBwcm94eSBhZGRyZXNzCgoJbWFuIHBhZ2Ugbm8gbG9uZ2VyIGluc3RhbGxlZCB3aXRoIGV4ZWN1dGUgcGVybWlzc2lvbnMgKHRoYW5rcyB0byBQZXRlcgoJQnJheSkgCgoJZml4ZWQgYSBtYWxsb2MgY2FsbCBidWcgdGhhdCBjb3VsZCBjYXVzZSBTSUdTRUdWIG9yIGZhbHNlICJvdXQgb2YKCW1lbW9yeSIgZXJyb3JzIG9uIEVYRUMgYW5kIFNZU1RFTSwgZGVwZW5kaW5nIG9uIHByb2dyYW0gbmFtZSBsZW5ndGggYW5kCglsaWJjLgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjMuMC4wOgoKbmV3IGZlYXR1cmVzOgoJcHJveHkgY29ubmVjdCB3aXRoIG9wdGlvbmFsIHByb3h5IGF1dGhlbnRpY2F0aW9uCgoJY29tYmluZWQgaGV4IGFuZCB0ZXh0IGR1bXAgbW9kZSwgY3JlZGl0cyB0byBHcmVnb3J5IE1hcmdvCgoJYWRkcmVzcyBwdHkgYXBwbGllcyBvcHRpb25zIHVzZXIsIGdyb3VwLCBhbmQgcGVybSB0byBkZXZpY2UKCgpzb2x2ZWQgcHJvYmxlbXMgYW5kIGJ1Z3M6CglQUk9CTEVNOiBvcHRpb24gcmV1c2Vwb3J0IHdhcyBub3QgYXBwbGllZCAoQlNELCBBSVgpCglTT0xWRUQ6CW9wdGlvbiByZXVzZXBvcnQgbm93IGluIHBoYXNlIFBBU1RTT0NLRVQgaW5zdGVhZCBvZiBQUkVCSU5ELAoJCWNyZWRpdHMgdG8gSmVhbi1CYXB0aXN0ZSBNYXJjaGFuZAoKCVBST0JMRU06IGlnbm9yZWVvZiB3aXRoIHN0ZGlvIHdhcyBpZ25vcmVkCglTT0xWRUQ6IGlnbm9yZWVvZiBub3cgd29ya3MgY29ycmVjdGx5IHdpdGggYWRkcmVzcyBzdGRpbwoKCVBST0JMRU06IGZ0cC5zaCBkaWQgbm90IHVzZSB1c2VyIHN1cHBsaWVkIHBhc3N3b3JkCglTT0xWRUQ6IGZ0cC5zaCBub3cgY29ycmVjdGx5IHBhc3NlcyBwYXNzd29yZCBmcm9tIGNvbW1hbmQgbGluZQoKCVBST0JMRU06IHNlcnZlci5wZW0gaGFkIGV4cGlyZWQKCVNPTFZFRDogbmV3IHNlcnZlci5wZW0gdmFsaWQgZm9yIHRlbiB5ZWFycwoKCVBST0JMRU06IHNvY2tzIG5vdGljZSBwcmludGVkIHdyb25nIHBvcnQgb24gc29tZSBwbGF0Zm9ybXMKCVNPTFZFRDogc29ja3Mgbm93IHVzZXMgY29ycmVjdCBieXRlLW9yZGVyIGZvciBwb3J0IG51bWJlciBpbiBub3RpY2UKCgpmdXJ0aGVyIGNvcnJlY3Rpb25zOgoJb3B0aW9uIG5hbWUgb190cnVuYyBjb3JyZWN0ZWQgdG8gby10cnVuYwoKCWNvbWJpbmVkIHVzZSBvZiAtdSBhbmQgLVUgaXMgbm93IGRldGVjdGVkIGFuZCBwcmV2ZW50ZWQKCgltYWRlIG1lc3NhZ2Ugc3lzdGVtIGEgbGl0dGxlIG1vcmUgcm9idXN0IGFnYWluc3QgZm9ybWF0IHN0cmluZyBhdHRhY2tzCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjIuMC4wOgoKbmV3IGZlYXR1cmVzOgoJYWRkcmVzcyBwdHkgZm9yIHB1dHRpbmcgc29jYXQgYmVoaW5kIGEgbmV3IHBzZXVkbyB0ZXJtaW5hbCB0aGF0IG1heQoJZmFrZSBhIHNlcmlhbCBsaW5lLCBtb2RlbSBldGMuCgoJZXhwZXJpbWVudGFsIG9wZW5zc2wgaW50ZWdyYXRpb24KCShpdCBkb2VzIG5vdCBwcm92aWRlIGFueSB0cnVzdCBiZXR3ZWVuIHRoZSBwZWVycyBiZWNhdXNlIGlzIGRvZXMgbm90CgkgY2hlY2sgY2VydGlmaWNhdGVzISkKCglvcHRpb25zIGZsb2NrLWV4LCBmbG9jay1leC1uYiwgZmxvY2stc2gsIGZsb2NrLXNoLW5iIHRvIGNvbnRyb2wgYWxsCglsb2NraW5nIG1lY2hhbmlzbSBwcm92aWRlZCBieSBmbG9jaygpCgoJb3B0aW9ucyBzZXRzaWQgYW5kIHNldHBnaWQgbm93IGF2YWlsYWJsZSB3aXRoIGFsbCBhZGRyZXNzIHR5cGVzCgoJb3B0aW9uIGN0dHkgKGNvbnRyb2xsaW5nIHRlcm1pbmFsKSBub3cgYXZhaWxhYmxlIGZvciBhbGwgVEVSTUlPUwoJYWRkcmVzc2VzIAoKCW9wdGlvbiB0cnVuY2F0ZSAoYSBoeWJyaWQgb2Ygb3BlbiguLiwgT19UUlVOQykgYW5kIGZ0cnVuY2F0ZSgpKSBpcwoJcmVwbGFjZWQgYnkgb3B0aW9ucyBvLXRydW5jIGFuZCBmdHJ1bmNhdGU9b2Zmc2V0CgoJb3B0aW9uIHNvdXJjZXBvcnQgbm93IGF2YWlsYWJsZSB3aXRoIFRDUCBhbmQgVURQIGxpc3RlbiBhZGRyZXNzZXMgdG8KCXJlc3RyaWN0IGluY29taW5nIGNsaWVudCBjb25uZWN0aW9ucwoKCXVuaWRpcmVjdGlvbmFsIG1vZGUgcmlnaHQtdG8tbGVmdCAoLVUpCgoKc29sdmVkIHByb2JsZW1zIGFuZCBidWdzOgoJUFJPQkxFTTogYWRkcmVzc2VzIHdpdGhvdXQgcmVxdWlyZWQgcGFyYW1ldGVycyBidXQgYW4gb3B0aW9uIGNvbnRhaW5pbmcKCQlhICcvJyB3ZXJlIGluY29ycmVjdGx5IGludGVycHJldGVkIGFzIGltcGxpY2l0IEdPUEVOIGFkZHJlc3MKCVNPTFZFRDogaWYgYW4gYWRkcmVzcyBkb2VzIG5vdCBoYXZlICc6JyBzZXBhcmF0b3IgYnV0IGNvbnRhaW5zICcvJywKCQljaGVjayBpZiB0aGUgc2xhc2ggaXMgYmVmb3JlIHRoZSBmaXJzdCAnLCcgYmVmb3JlIGFzc3VtaW5nCgkJaW1wbGljaXQgR09QRU4uCgoKcG9ydGluZzoKCXB0eXMgdW5kZXIgU3VuT1Mgd29yayBub3cgZHVlIHRvIHVzZSBvZiBzdHJlYW0gb3B0aW9ucwoKCmZ1cnRoZXIgY29ycmVjdGlvbnM6Cgl3aXRoIC1kIC1kIC1kIC1kIC1ELCBkb24ndCBwcmludCBkZWJ1ZyBpbmZvIGR1cmluZyBmaWxlIGFuYWx5c2lzCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjEuMC4xOgoKbmV3IGZlYXR1cmVzOgoJLnNwZWMgZmlsZSBmb3IgUlBNIGdlbmVyYXRpb24KCgpzb2x2ZWQgcHJvYmxlbXMgYW5kIGJ1Z3M6CglQUk9CTEVNOiBHT1BFTiBvbiBzb2NrZXQgZGlkIG5vdCBhcHBseSBvcHRpb24gdW5saW5rLWxhdGUKCVNPTFVUSU9OOiBHT1BFTiBmb3Igc29ja2V0IG5vdyBhcHBsaWVzIGdyb3VwIE5BTUVELCBwaGFzZSBQQVNUT1BFTgoJCW9wdGlvbnMgCgoJUFJPQkxFTTogd2l0aCB1bmlkaXJlY3Rpb25hbCBtb2RlLCBhbiB1bm5lY2Vzc2FyeSBjbG9zZSB0aW1lb3V0IHdhcwoJCWFwcGxpZWQKCVNPTFVUSU9OOiBpbiB1bmlkaXJlY3Rpb25hbCBtb2RlLCB0ZXJtaW5hdGUgd2l0aG91dCB3YWl0IHRpbWUKCglQUk9CTEVNOiB1c2luZyBHT1BFTiBvbiBhIHVuaXggZG9tYWluIHNvY2tldCBmYWlsZWQgZm9yIGRhdGFncmFtCgkJc29ja2V0cwoJU09MVVRJT046IHdoZW4gY29ubmVjdCgpIGZhaWxzIHdpdGggRVBST1RPVFlQRSwgdXNlIGEgZGF0YWdyYW0gc29ja2V0CgoKZnVydGhlciBjb3JyZWN0aW9uczoKCglvcGVuKCkgZmxhZyBvcHRpb25zIGhhZCBuYW1lcyBzdGFydGluZyB3aXRoICJvXyIsIG5vdyBjb3JyZWN0ZWQgdG8gIm8tIgoKCWluIGRvY3UsICotbGlzdGVuIGFkZHJlc3NlcyB3ZXJlIGNhbGxlZCAqX2xpc3RlbgoKCWFkZHJlc3MgdW5peCBub3cgY2FsbGVkIHVuaXgtY29ubmVjdCBiZWNhdXNlIGl0IGRvZXMgbm90IGhhbmRsZSB1bml4CglkYXRhZ3JhbSBzb2NrZXRzCgoJaW4gdGVzdC5zaCwgYXBwbHkgZ2xvYmFsIGNvbW1hbmQgbGluZSBvcHRpb25zIHdpdGggYWxsIHRlc3RzCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjEuMC4wOgoKbmV3IGZlYXR1cmVzOgoJcmVndWxhciBtYW4gcGFnZSBhbmQgaHRtbCBkb2MgLSB0aGFua3MgdG8ga3JvbUp4IGZvciBwcm90b3R5cGUKCgluZXcgYWRkcmVzcyB0eXBlICJyZWFkbGluZSIsIHV0aWxpemluZyBHTlUgcmVhZGxpbmUgYW5kIGhpc3RvcnkgbGlicwoKCWFkZHJlc3Mgb3B0aW9uICJoaXN0b3J5LWZpbGUiIGZvciByZWFkbGluZQoKCW5ldyBvcHRpb24gImRhc2giIHRvICJleGVjIiBhZGRyZXNzIHRoYXQgYWxsb3dzIHRvIHN0YXJ0IGxvZ2luIHNoZWxscwoKCXN5c2xvZyBmYWNpbGl0eSBjYW4gYmUgc2V0IHBlciBjb21tYW5kIGxpbmUgb3B0aW9uCgoJbmV3IGFkZHJlc3Mgb3B0aW9uICJ0Y3AtcXVpY2thY2siLCBmb3VuZCBpbiBMaW51eCAyLjQKCglvcHRpb24gLWcgcHJldmVudHMgb3B0aW9uIGdyb3VwIGNoZWNraW5nCgoJZmlsYW4gYW5kIHByb2NhbiBjYW4gcHJpbnQgdXNhZ2UKCglwcm9jYW4gcHJpbnRzIHJsaW1pdCBpbmZvcwoKCnNvbHZlZCBwcm9ibGVtcyBhbmQgYnVnczoKCVBST0JMRU06IHJhdyBJUCBzb2NrZXQgU0lHU0VHVidlZCB3aGVuIGl0IGhhZCBiZWVuIHNodXQgZG93bi4KCVNPTFZFRDogc2V0IGVvZiBmbGFnIG9mIGNoYW5uZWwgb24gc2h1dGRvd24uCgoJUFJPQkxFTTogaWYgY2hhbm5lbCAyIHVzZXMgYSBzaW5nbGUgbm9uLXNvY2tldCBGRCBpbiBiaWRpcmVjdGlvbmFsIG1vZGUKCQlhbmQgaGFzIGRhdGEgYXZhaWxhYmxlIHdoaWxlIGNoYW5uZWwgMSByZWFjaGVzIEVPRiwgdGhlIGRhdGEgaXMKCQlsb3N0LiAKCVNPTFZFRDogZHVyaW5nIG9uZSBsb29wIHJ1biwgZmlyc3QgaGFuZGxlIGFsbCBkYXRhIHRyYW5zZmVycyBhbmQKCQlfYWZ0ZXJ3YXJkc18gaGFuZGxlIEVPRi4gCgoJUFJPQkxFTTogZGVzcGl0ZSB0byBvcHRpb24gTk9OQkxPQ0ssIHRoZSBjb25uZWN0KCkgY2FsbCBibG9ja2VkCglTT0xWRUQ6IG9wdGlvbiBOT05CTE9DSyBpcyBub3cgYXBwbGllZCBpbiBwaGFzZSBGRCBpbnN0ZWFkIG9mIExBVEUKCglQUk9CTEVNOiBVTkxJTksgb3B0aW9ucyBpc3N1ZWQgZXJyb3Igd2hlbiBmaWxlIGRpZCBub3QgZXhpc3QsCgkJdGVybWluYXRpbmcgc29jYXQKCVNPTFZFRDogZmFpbHVyZSBvZiB1bmxpbmsoKSBpcyBvbmx5IHdhcm5pbmcgaWYgZXJybm89PUVOT0VOVAoKCVBST0JMRU06IFRDUDYtTElTVEVOIHJlcXVpcmVkIG51bWVyaWMgcG9ydCBzcGVjaWZpY2F0aW9uCglTT0xWRUQ6IG5vdyB1c2VzIGNvbW1vbiBUQ1Agc2VydmljZSByZXNvbHZlcgoKCVBST0JMRU06IHdpdGggUElQRSwgd3JvbmcgRkRzIHdlcmUgc2hvd24gZm9yIGRhdGEgdHJhbnNmZXIgbG9vcAoJU09MVkVEOiByZXRyaWV2YWwgb2YgRkRzIG5vdyBwYXlzIHJlc3BlY3QgdG8gUElQRSBwZWN1bGFyaXRpZXMKCglQUk9CTEVNOiB1c2luZyBhZGRyZXNzIEVYRUMgYWdhaW5zdCBhbiBhZGRyZXNzIHdpdGggSUdOT1JFRU9GLCBzb2NhdAoJCW5ldmVyIHRlcm1pbmF0ZWQKCVNPTFZFRDogY29ycmVjdGVkIEVPRiBoYW5kbGluZyBvZiBzaWdjaGxkCgoKcG9ydGluZzoKCU1hY09TIGFuZCBvbGQgQUlYIHZlcnNpb25zIG5vdyBoYXZlIHB0eQoKCWZsb2NrKCkgbm93IGF2YWlsYWJsZSBvbiBMaW51eCAoY29uZmlndXJlIGNoZWNrIHdhcyB3cm9uZykKCgluYW1lZCBwaXBlIHdlcmUgZ2VuZXJhdGVkIHVzaW5nIG1rbm9kKCksIHdoaWNoIHJlcXVpcmVzIHJvb3QgdW5kZXIgQlNECglub3cgdGhleSBhcmUgZ2VuZXJhdGVkIHVzaW5nIG1rZmlmbwoKCmZ1cnRoZXIgY29ycmVjdGlvbnM6Cglsb3RzIG9mIGFkZHJlc3Mgb3B0aW9ucyB0aGF0IHdlcmUgImZvcmdvdHRlbiIgYXQgcnVudGltZSBhcmUgbm93CglhdmFpbGFibGUgCgoJb3B0aW9uIEJJTkRUT0RFVklDRSBub3cgYWxzbyBjYWxsZWQgU08tQklORFRPREVWSUNFLCBJRgoKCSJtYWtlIGluc3RhbGwiIG5vdyBpbnN0YWxscyBiaW5hcmllcyB3aXRoIG93bmVyc2hpcCAwOjAKCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyBWIDEuMC40LjI6Cgpzb2x2ZWQgcHJvYmxlbXMgYW5kIGJ1Z3M6CglQUk9CTEVNOiBFT0Ygb2Ygb25lIHN0cmVhbSBjYXVzZWQgY2xvc2Ugb2Ygb3RoZXIgc3RyZWFtLCBnaXZpbmcgaXQgbm8KCWNoYW5jZSB0byBnbyBkb3duIHJlZ3VsYXJseQoJU09MVkVEOiBFT0Ygb2Ygb25lIHN0cmVhbSBub3cgY2F1c2VzIHNodXRkb3duIG9mIHdyaXRlIHBhcnQgb2Ygb3RoZXIKCXN0cmVhbQoKCVBST0JMRU06IHNlbmRpbmcgbWFpbCB2aWEgc29ja3MgYWRkcmVzcyB0byBxbWFpbCBzaG93ZWQgdGhhdCBjcmxmCglvcHRpb24gZG9lcyBub3Qgd29yawoJU09MVkVEOiBzb2NrcyBhZGRyZXNzIGFwcGxpZXMgUEhfTEFURSBvcHRpb25zCgoJUFJPQkxFTTogaW4gZGVidWcgbW9kZSwgbm8gaW5mbyBhYm91dCBzb2NhdCBhbmQgcGxhdGZvcm0gd2FzIGlzc3VlZAoJU09MVkVEOiBwcmludCBzb2NhdCB2ZXJzaW9uIGFuZCB1bmFtZSBvdXRwdXQgaW4gZGVidWcgbW9kZQoKCVBST0JMRU06IGludm9raW5nIHNvY2F0IHdpdGggLXQgYW5kIG5vIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGNhdXNlZAoJU0lHU0VHVgoJU09MVkVEOiAtdCBhbmQgLWIgbm93IGNoZWNrIG5leHQgYXJndiBlbnRyeQoKCVBST0JMRU06IHdoZW4gb3BlbmluZyBvZiBsb2dmaWxlICgtbGYpIGZhaWxlZCwgbm8gZXJyb3Igd2FzIHJlcG9ydGVkCglhbmQgbm8gZnVydGhlciBtZXNzYWdlcyB3ZXJlIHByaW50ZWQKCVNPTFZFRDogY2hlY2sgcmVzdWx0IG9mIGZvcGVuIGFuZCBwcmludCBlcnJvciBtZXNzYWdlIGlmIGl0IGZhaWxlZAoKbmV3IGZlYXR1cmVzOgoJYWRkcmVzcyB0eXBlIFVEUC1MSVNURU4gbm93IHN1cHBvcnRzIG9wdGlvbiBmb3JrOiBpdCBpbnRlcm5hbGx5IGFwcGxpZXMKCXNvY2tldCBvcHRpb24gU09fUkVVU0VBRERSIHNvIGEgbmV3IFVEUCBzb2NrZXQgY2FuIGJpbmQgdG8gcG9ydCBhZnRlcgoJYGFjY2VwdGluZ7QgYSBjb25uZWN0aW9uIChjaGlsZCBwcm9jZXNzZXMgbWlnaHQgbGl2ZSBmb3JldmVyIHRob3VnaCkKCShzdWdnZXN0aW9uIGZyb20gRGFtamFuIExhbmdvKQoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS4wLjQuMToKCnNvbHZlZCBwcm9ibGVtcyBhbmQgYnVnczoKCVBST0I6IGFzc2VydCBpbiBsaWJjIGNhdXNlZCBhbiBlbmRsZXNzIHJlY3Vyc2lvbgoJU09MVkVEOiBubyBsb25nZXIgY2F0Y2ggU0lHQUJSVAoKCVBST0I6IHNvY2F0IHByaW50ZWQgd3JvbmcgdmVyYm9zZSBwcmVmaXggZm9yICJyaWdodCB0byBsZWZ0IiBwYWNrZXRzCglTT0xWRUQ6IG5ldyBwYXJhbWV0ZXIgZm9yIHhpb3RyYW5zZmVyKCkgcGFzc2VzIGNvcnJlY3QgcHJlZml4CgpuZXcgZmVhdHVyZXM6CglpbiBkZWJ1ZyBtb2RlLCBzb2NhdCBwcmludHMgaXRzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKCWluIHZlcmJvc2UgbW9kZSwgZXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBhbmQgcmVwbGFjZSB1bnByaW50YWJsZXMKCQl3aXRoICcuJy4gUGF0Y2ggZnJvbSBBZHJpYW4gVGh1cnN0b24uCgoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgViAxLjAuNC4wOgoKc29sdmVkIHByb2JsZW1zIGFuZCBidWdzOgoJRGVidWcgb3V0cHV0IGZvciBsc3RhdCBhbmQgZnN0YXQgc2FpZCAic3RhdCIKCmZ1cnRoZXIgY29ycmVjdGlvbnM6CglGcmVlQlNEIG5vdyBpbmNsdWRlcyBsaWJ1dGlsLmgKCm5ldyBmZWF0dXJlczoKCW9wdGlvbiBzZXRzaWQgd2l0aCBleGVjL3B0eQoJb3B0aW9uIHNldHBnaWQgd2l0aCBleGVjL3B0eQoJb3B0aW9uIGN0dHkgd2l0aCBleGVjL3B0eQoJVENQIFY2IGNvbm5lY3QgdGVzdAoJZ2V0dGltZW9mZGF5IGluIHN5Y2xzLmMgKG5vIHVzZSB5ZXQpCgpwb3J0aW5nOgoJYmVmb3JlIEdldGhvc3RieW5hbWUsIGludm9rZSBpbmV0X2F0b24gZm9yIE1hY09TWAoKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIFYgMS4wLjMuMDoKCnNvbHZlZCBwcm9ibGVtcyBhbmQgYnVnczoKCglQUk9COiB0ZXN0IDkgb2YgdGVzdC5zaCAoZWNobyB2aWEgZmlsZSkgZmFpbGVkIG9uIHNvbWUgcGxhdGZvcm1zLAoJc29jYXQgZXhpdGVkIHdpdGhvdXQgZXJyb3IgbWVzc2FnZQoJU09MVkVEOiBfeGlvb3Blbl9uYW1lZF9lYXJseSgpOiBwcmVzZXQgc3RhdGJ1Zi5zdF9tb2RlIHdpdGggMAoKCVBST0I6IHRlc3QgMTcgaHVuZyBmb3JldmVyCglSRUFTT046IGNoaWxkIGRlYXRoIGJlZm9yZSBzZWxlY3QgbG9vcCBkaWQgbm90IHJlc3VsdCBpbiBFT0YKCVNPTFZFRDogY2hlY2sgb2YgZXhpc3RlbmNlIG9mIGNoaWxkcmVuIGJlZm9yZSBzdGFydGluZyBzZWxlY3QgbG9vcAoKCVBST0I6IHRlc3QgMTcgZmFpbGVkCglSRUFTT046IGNoaWxkIGRlYWQgdHJpZ2dlcmVkIEVPRiBiZWZvcmUgbGFzdCBkYXRhIHdhcyByZWFkCglTT0xWRUQ6IGFmdGVyIGNoaWxkIGRlYXRoLCByZWFkIGxhc3QgZGF0YSBiZWZvcmUgc2V0dGluZyBFT0YKCglQUk9COiBmaWxhbiBzaG93ZWQgdGhhdCBleGVjIHByb2Nlc3NlcyBpbmNvcnJlY3RseSBoYWQgZmQzIG9wZW4KCVJFQVNPTjogaW5oZXJpdGVkIG9wZW4gZmQzIGZyb20gbWFpbiBwcm9jZXNzCglTT0xWRUQ6IHNldCBDTE9FWEVDIGZsYWcgb24gcHR5IGZkIGluIG1haW4gcHJvY2VzcwoKCVBST0I6IGhlbHAgcHJpbnRlZCAidW5kZWYiIGluc3RlYWQgb2YgZ3JvdXAgIkZPUksiCglTT0xWRUQ6IGFkZGVkICJGT1JLIiB0byBncm91cCBuYW1lIGFycmF5CgoJUFJPQjogZmF0YWwgbWVzc2FnZXMgZGlkIG5vdCBpbmNsdWRlIHNldmVyaXR5IGNsYXNzaWZpZXIKCVNPTFZFRDogYWRkZWQgIkYiIHRvIHNldmVyaXR5IGNsYXNzaWZpZXIgYXJyYXkgCgoJUFJPQjogSVA2IGFkZHJlc3NlcyB3aGVyZSBwcmludGVkIGluY29ycmVjdGx5CglTT0xWRUQ6IHJlbW92ZWQgdHlwZSBjYXN0cyB0byB1bnNpZ25lZCBzaG9ydCAqCgpmdXJ0aGVyIGNvcnJlY3Rpb25zOgoJc29jYXQgY2F0Y2hlcyBpbGxlZ2FsIC1sIG1vZGVzCgljb3JyZWN0ZWQgZXJyb3IgbWVzc2FnZSBvbiBzZXRzb2Nrb3B0KGxpbmdlcikKCW9wdGlvbiB0YWJkbHkgaXMgb2YgdHlwZSB1aW50Cgljb3JyZWN0aW9uIGZvciBVRFAgb3ZlciBJUDYKCW1vcmUgY3BwIGNvbmRpdGlvbmFscywgZXNwLiBmb3IgSVA2IHNpdHVhdGlvbnMKCWJldHRlciBoYW5kbGluZyBvZiBncm91cCBOQU1FRCBvcHRpb25zIHdpdGggbGlzdGVuaW5nIFVOSVggc29ja2V0cwoJYXBwbHlvcHRzMiBub3cgaW5jbHVkZXMgbGFzdCBnaXZlbiBwaGFzZQoJY29ycmVjdGVkIG9wdGlvbiBncm91cCBoYW5kbGluZyBmb3IgbW9zdCBhZGRyZXNzIHR5cGVzCglpbnRyb2R1Y2UgZHJvcHBpbmcgb2YgdW5hcHBsaWFibGUgb3B0aW9ucyAoZHJvcG9wdHMsIGRyb3BvcHRzMikKCWdvcGVuIG5vdyBhY2NlcHRzIHNvY2tldCBhbmQgdW5peC1zb2NrZXQgb3B0aW9ucwoJZXhlYyBhbmQgc3lzdGVtIG5vdyBhY2NlcHQgYWxsIHNvY2tldCBhbmQgdGVybWlvcyBvcHRpb25zCgljaGlsZCBwcm9jZXNzIGZvciBleGVjIGFuZCBzeXN0ZW0gYWRkcmVzc2VzIHdpdGggb3B0aW9uIHB0eQoJaW1wcm92ZWQgZGVzY3JpcHRpb25zIGFuZCBvcHRpb25zIGZvciBFWEFNUExFUwoJcHJpbnRmIGZvcm1hdCBmb3IgZmlsZSBtb2RlIGNoYW5nZWQgdG8gIjAlMDNvIiB3aXRoIGxlbmd0aCBzcGVjLgoJYWRkZWQgdmFfZW5kKCkgaW4gYnJhbmNoIG9mIG1zZygpCgljaGFuZ2VkIHBoYXNlIG9mIGxvY2sgb3B0aW9ucyBmcm9tIFBBU1RPUEVOIHRvIEZECglzdXBwb3J0IHVwIHRvIGZvdXIgZWFybHkgZHlpbmcgcHJvY2Vzc2VzCgpzdHJ1Y3R1cmFsIGNoYW5nZXM6Cgl4aW9zeXNpbmNsdWRlcyBub3cgaW5jbHVkZXMgc3lzaW5jbHVkZXMuaCBmb3Igbm9uIHhpbyBmaWxlcwoKbmV3IGZlYXR1cmVzOgoJb3B0aW9uIHVtYXNrCglDSEFOR0VTIGZpbGUKCVRZUEVfRE9VQkxFLCB1X2RvdWJsZQoJT0ZVTkNfT0ZGU0VUCglhZGRlZCBnZXRzaWQoKSwgc2V0c2lkKCksIHNlbmQoKSB0byBzeWNscwoJcHJvY2FuIHByaW50cyBzaWQgKHNlc3Npb24gaWQpCgltYWlsLnNoIGdldHMgLWYgKGZyb20pIG9wdGlvbgoJbmV3IEVYQU1QTEVzIGZvciBmaWxlIGNyZWF0aW9uCglnYXRoZXJpbmZvLnNoIG5vdyB0ZWxscyBhYm91dCBmYWlsdXJlcwoJdGVzdC5zaCBjYW4gY2hlY2sgZm9yIG11Y2ggbW9yZSBhZGRyZXNzL29wdGlvbiBjb21iaW5hdGlvbnMKCnBvcnRpbmc6Cglpc3BlZWQsIG9zcGVlZCBmb3IgdGVybWlvcyBvbiBGcmVlQlNECglnZXRwZ2lkKCkgY29uZGl0aW9uYWwgZm9yIE1hY09TIDEwCglhZGRlZCByYW5saWIgaW4gTWFrZWZpbGUuaW4gZm9yIE1hY09TIDEwCglkaXNhYmxlIHB0eSBvcHRpb24gaWYgbm8gcHR5IG1lY2hhbmlzbSBpcyBhdmFpbGFibGUgKE1hY09TIDEwKQoJbm93IGNvbXBpbGVzIGFuZCBydW5zIG9uIE1hY09TIDEwIChzdGlsbCBzb21lIHRlc3RzIGZhaWwpCglzZXRncm91cHMoKSBjb25kaXRpb25hbCBmb3IgY3lnd2luCglzaWdoYW5kbGVyX3QgZGVmaW5lZCBjb25kaXRpb25hbGx5Cgl1c2UgZ2NjIG9wdGlvbiAtRF9HTlVfU09VUkNFCg==