U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCklzc3VlICMgbnVtYmVycyBtZW50aW9uZWQgYmVsb3cgY2FuIGJlIGZvdW5kIG9uIEdpdGh1Yi4gRm9yIG1vcmUgZGV0YWlscywgYWRkCnRoZSBpc3N1ZSBudW1iZXIgdG8gdGhlIGVuZCBvZiB0aGUgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vc3dpZy9zd2lnL2lzc3Vlcy8KClZlcnNpb24gNC4wLjEgKDIxIEF1ZyAyMDE5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTktMDgtMjA6IFRla3VDb25jZXB0CiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSAjMTUzNSBBZGQgJW5hdGl2ZSBzdXBwb3J0IHRvIEphdmFzY3JpcHQuCgoyMDE5LTA4LTIwOiBia290enoKICAgICAgICAgICAgW0phdmFdICMxNjE2IEFkZCBTV0lHX0phdmFJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdG8gc3VwcG9ydCB0aHJvd2luZwogICAgICAgICAgICBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGZyb20gSk5JIGNvZGUuCgoyMDE5LTA4LTE5OiBzam1sCiAgICAgICAgICAgIFtMdWFdICMxNTk2IHRvc3RyaW5nIG91dHB1dCBjaGFuZ2VzIHRvIHNob3cgdGhlIHVuZGVybHlpbmcgQy9DKysgcG9pbnRlci4KCjIwMTktMDgtMDg6IHJva3VwcwogICAgICAgICAgICBbQyMsIEphdmFdICMxNjAxIEZpeCBpbnZhbGlkIGNvZGUgZ2VuZXJhdGVkIGZvciAiJWNvbnN0YW50IGVudW0gRW51bVR5cGUuCgoyMDE5LTA4LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggbWV0aG9kIG92ZXJsb2FkaW5nIG9mIG1ldGhvZHMgdGhhdCB0YWtlIFNUTCBjb250YWluZXJzIG9mIGRpZmZlcmVudAogICAgICAgICAgICB0eXBlcy4gVGhlIGZvbGxvd2luZyB1c2FnZSAodXNpbmcgc3RkOjp2ZWN0b3IpIHdvdWxkIGZhaWwgd2hlbiB1c2luZyAtYnVpbHRpbjoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9zdHJpbmcuaT4KICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3ZlY3Rvci5pPgoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RvclgpIHN0ZDo6dmVjdG9yPFg+OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0b3JJbnQpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgICAgICAgICAgIHN0cmluZyBWZWN0b3JPdmVybG9hZCh2ZWN0b3I8WD4gdik7CiAgICAgICAgICAgICAgc3RyaW5nIFZlY3Rvck92ZXJsb2FkKHZlY3RvcjxpbnQ+IHYpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIHdvdWxkIGluY29ycmVjdGx5IGZhaWw6CgogICAgICAgICAgICAgIHMgPSBWZWN0b3JPdmVybG9hZChbMSwgMiwgM10pCgogICAgICAgICAgICBXaXRoOgoKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgICAgICAgICBGaWxlICJydW5tZTMucHkiLCBsaW5lIDIwLCBpbiA8bW9kdWxlPgogICAgICAgICAgICAgICAgICByZXQgPSBWZWN0b3JPdmVybG9hZChbMSwgMiwgM10pCiAgICAgICAgICAgICAgVHlwZUVycm9yOiBXcm9uZyBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb24gJ1ZlY3Rvck92ZXJsb2FkJy4KICAgICAgICAgICAgICAgIFBvc3NpYmxlIEMvQysrIHByb3RvdHlwZXMgYXJlOgogICAgICAgICAgICAgICAgICBWZWN0b3JPdmVybG9hZChzdGQ6OnZlY3RvcjwgTnVtYmVyLHN0ZDo6YWxsb2NhdG9yPCBOdW1iZXIgPiA+KQogICAgICAgICAgICAgICAgICBWZWN0b3JPdmVybG9hZChzdGQ6OnZlY3RvcjwgaW50LHN0ZDo6YWxsb2NhdG9yPCBpbnQgPiA+KQoKICAgICAgICAgICAgVGhlIHByb2JsZW0gd2FzIGR1ZSB0byBzb21lIGVycm9yIGhhbmRsaW5nIHRoYXQgd2FzIG5vdCBjbGVhcmVkIGR1cmluZyB0eXBlaGVja2luZy4KICAgICAgICAgICAgSW4gdGhpcyBjYXNlIGFuIGVycm9yIHdhcyBub3QgY2xlYXJlZCB3aGVuIHRoZSBlbGVtZW50cyBpbiB0aGUgbGlzdCBmYWlsZWQgdGhlCiAgICAgICAgICAgIHR5cGVjaGVjayBmb3IgY29udmVydGluZyB0byBYLiBPbmx5IG9jY3VycyBpbiBQeXRob24gMysuCgogICAgICAgICAgICBJbiBzb21lIGNvbWJpbmF0aW9ucyBvZiBvdmVybG9hZGVkIG1ldGhvZHMsIHRoZSBmb2xsb3dpbmcgdHlwZSBvZiBlcnJvciBtZXNzYWdlIHdvdWxkCiAgICAgICAgICAgIG9jY3VyOgoKICAgICAgICAgICAgICBSdW50aW1lRXJyb3I6IGluIHNlcXVlbmNlIGVsZW1lbnQgMAoKICAgICAgICAgICAgICBUaGUgYWJvdmUgZXhjZXB0aW9uIHdhcyB0aGUgZGlyZWN0IGNhdXNlIG9mIHRoZSBmb2xsb3dpbmcgZXhjZXB0aW9uOgoKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgICAgICAgICAgICAgICBGaWxlICJydW5tZTMucHkiLCBsaW5lIDIzLCBpbiA8bW9kdWxlPgogICAgICAgICAgICAgICAgICBjaGVjayhWZWN0b3JPdmVybG9hZCh2KSwgInZlY3RvcjxYPiIpCiAgICAgICAgICAgICAgU3lzdGVtRXJyb3I6IDxidWlsdC1pbiBmdW5jdGlvbiBWZWN0b3JPdmVybG9hZD4gcmV0dXJuZWQgYSByZXN1bHQgd2l0aCBhbiBlcnJvciBzZXQKCjIwMTktMDgtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNjAyIEZpeCByZWdyZXNzaW9uIGluIDQuMC4wIHdoZXJlIGEgdGVtcGxhdGUgZnVuY3Rpb24gY29udGFpbmluZyBhIHBhcmFtZXRlcgogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGZ1bmN0aW9uIG5hbWUgbGVkIHRvIHRoZSBwYXJhbWV0ZXIgbmFtZSB1c2VkIGluIHRoZQogICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UgYmVpbmcgaW5jb3JyZWN0bHkgbW9kaWZpZWQuCgoyMDE5LTA3LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgYWxsIGdlbmVyYXRlZCBmaWxlcyBvbiBlcnJvci4gUHJldmlvdXNseSBnZW5lcmF0ZWQgZmlsZXMgd2VyZSBub3QgcmVtb3ZlZCwKICAgICAgICAgICAgcG90ZW50aWFsbHkgYnJlYWtpbmcgTWFrZWZpbGVzIHVzaW5nIGZpbGUgZGVwZW5kZW5jaWVzLCBlc3BlY2lhbGx5IHdoZW4gLVdlcnJvcgogICAgICAgICAgICAod2FybmluZ3MgYXMgZXJyb3JzKSB3YXMgdXNlZC4KCjIwMTktMDctMjM6IHNtaXRoeAogICAgICAgICAgICBbQyNdICMxNTMwICMxNTMyIEZpeCBtYXJzaGFsbGluZyBvZiBzdGQ6OndzdHJpbmcgdG8gQyMuCgoyMDE5LTA3LTE4OiBnaWNtbwogICAgICAgICAgICBbUHl0aG9uXSAjMTU4NyBQeXRob24gMy44IHN1cHBvcnQgLSByZW1vdmUgdXNlIG9mIGRlcHJlY2F0ZWQgUHlPYmplY3RfR0NfVW5UcmFjay4KCjIwMTktMDctMTg6IGNoZXItbm92CiAgICAgICAgICAgIFtQeXRob25dICMxNTczIEdlbmVyYXRlZCBQeXRob24gY29kZSB1c2VzIGNvbnNpc3RlbnQgc3RyaW5nIHF1b3Rpbmcgc3R5bGUgLSBkb3VibGUKICAgICAgICAgICAgcXVvdGVzLgoKMjAxOS0wNy0xNjogZ2VlZnIKICAgICAgICAgICAgW0MjXSAjNjE2ICMxNTc2IEZpeCBDIyBib29sIElOUFVUW10sIGJvb2wgT1VUUFVUW10sIGJvb2wgSU5PVVRbXSB0eXBlbWFwcyB0byBtYXJzaGFsbAogICAgICAgICAgICBhcyAxLWJ5dGUuCgoyMDE5LTA3LTEyOiB2YWR6CiAgICAgICAgICAgIFtDIywgSmF2YV0gIzE1NjggIzE1ODMgRml4IHN0ZDo6c2V0PD4gdHlwZW1hcHMgZm9yIHByaW1pdGl2ZSB0eXBlcy4KCjIwMTktMDctMTI6IHZhZHoKICAgICAgICAgICAgIzE1NjYgIzE1ODQgUmVncmVzc2lvbiBpbiA0LjAuMCAtIGZpeCBtaXNzaW5nIHZhbHVlIGZvciBmaXJzdCBpdGVtIG9mIGVudW1zIHdpdGgKICAgICAgICAgICAgdHJhaWxpbmcgY29tbWEuCgoyMDE5LTA3LTExOiBtY2ZhcmxqbQogICAgICAgICAgICAjMTU0OCAjMTU3OCBGaXggc2VnZmF1bHQgaW4gRG94eWdlbiBwYXJzZXIgcGFyc2luZyBlbXB0eSBsaW5lcyBpbiBzb21lIGNvbW1hbmRzIGxpa2UKICAgICAgICAgICAgXGNvZGUuCgoyMDE5LTA3LTA5OiBJc2FhY1Bhc2N1YWwKICAgICAgICAgICAgW0MjLCBKYXZhXSAjMTU3MCBGaXggbmFtZSBvZiBnZW5lcmF0ZWQgQyMvSmF2YSBjbGFzc2VzIGZvciAlaW50ZXJmYWNlIG1hY3JvcwogICAgICAgICAgICBpbiBzd2lnaW50ZXJmYWNlLmkgd2hlbiB3cmFwcGluZyBuZXN0ZWQgQysrIGNsYXNzZXMuCgoyMDE5LTA3LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTU0NyBXaGl0ZXNwYWNlIGZpeGVzIGluIERveHlnZW4gdHJhbnNsYXRlZCBjb21tZW50cyBpbnRvIHB5ZG9jIGNvbW1lbnRzCiAgICAgICAgICAgIGZvciBTcGhpbnggY29tcGF0aWJpbGl0eS4KCjIwMTktMDYtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNelNjaGVtZSwgT0NhbWxdICMxNTU5ICRhcmcgYW5kICRpbnB1dCB3ZXJlIGluY29ycmVjdGx5IHN1YnN0aXR1dGVkIGluIHRoZQogICAgICAgICAgICBhcmdvdXQgdHlwZW1hcCB3aGVuIHR3byBvciBtb3JlIGFyZ3VtZW50cyB3ZXJlIHByZXNlbnQuCgoyMDE5LTA2LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5XSAjMTUzOCBSZW1vdmUgdGhlIFVua25vd25FeGNlcHRpb25IYW5kbGVyIGNsYXNzIGluIG9yZGVyIHRvIGJlCiAgICAgICAgICAgIEMrKzE3IGNvbXBsaWFudCBhcyBpdCB1c2VzIHN0ZDo6dW5leHBlY3RlZF9oYW5kbGVyIHdoaWNoIHdhcyByZW1vdmVkIGluIEMrKzE3LgogICAgICAgICAgICBUaGlzIGNsYXNzIHdhcyBpbnRlbmRlZCBmb3IgZGlyZWN0b3IgZXhjZXB0aW9uIGhhbmRsaW5nIGJ1dCB3YXMgbmV2ZXIgdXNlZCBieQogICAgICAgICAgICBTV0lHIGFuZCB3YXMgbmV2ZXIgZG9jdW1lbnRlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOS0wNi0wNjogYmtvdHp6CiAgICAgICAgICAgIFtKYXZhXSAjMTU1MiBJbXByb3ZlIHBlcmZvcm1hbmNlIGluIEphdmEgc3RkOjp2ZWN0b3IgY29uc3RydWN0b3Igd3JhcHBlciB0aGF0IHRha2VzCiAgICAgICAgICAgIGEgbmF0aXZlIEphdmEgYXJyYXkgYXMgaW5wdXQuCgoyMDE5LTA2LTAzOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHJlZ3Jlc3Npb24gaW4gaW1wbGljaXRfY29udiBoYW5kbGluZyBvZiB0dXBsZXMsCgkgICAgaW50cm9kdWNlZCBpbiBTV0lHIDQuMC4wLiAgRml4ZXMgIzE1NTMsIHJlcG9ydGVkIGJ5IEFsZXhhbmRyZQoJICAgIER1cmV0LUx1dHouCgoyMDE5LTA1LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBGaXggZGV0ZWN0aW9uIG9mIE9jdGF2ZSBvbiBNYWNPUy4KCjIwMTktMDUtMjQ6IG9wb3BsYXdza2kKICAgICAgICAgICAgW09jdGF2ZV0gIzE1MjIgQWRhcHQgT0NUQVZFX0xERkxBR1MgZm9yIE9jdGF2ZSA1LjEuCgoyMDE5LTA1LTIyOiBmZXJkeW5hdG9yCgkgICAgW1BIUF0gIzE1MjggRG9uJ3QgYWRkIGEgY2xvc2luZyAnPz4nIFBIUCB0YWcgdG8gZ2VuZXJhdGVkIGZpbGVzLgoJICAgIFBTUi0yIHNheXMgaXQgTVVTVCBiZSBvbWl0dGVkIGZvciBmaWxlcyBjb250YWluaW5nIG9ubHkgUEhQLgpWZXJzaW9uIDQuMC4wICgyNyBBcHIgMjAxOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE5LTA0LTI0OiB2YWR6CiAgICAgICAgICAgICMxNTE3IEZpeCBjcmFzaCBpZiAiQHJldHVybiIgRG94eWdlbiB0YWcgd2FzIHVzZWQgb24gYSBub2RlIHdpdGhvdXQgYW55IHJldHVybiB0eXBlLgoKMjAxOS0wNC0yNDogdmFkegogICAgICAgICAgICAjMTUxNSBGaXggcGFyc2luZyBvZiBlbnVtcyB3aXRoIHRyYWlsaW5nIGNvbW1hIHdoZW4gdXNpbmcgLWRveHlnZW4uCgoyMDE5LTA0LTE5OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dICMxMDU1IFdoZW4gZ2VuZXJhdGluZyBHbyBjb2RlLCBtYWtlIC1jZ28gdGhlIGRlZmF1bHQuIEFkZCBuZXcgLW5vLWNnbyBvcHRpb24KICAgICAgICAgICAgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdC4KCjIwMTktMDQtMTk6IHBiZWNoZXJlcgogICAgICAgICAgICBbVGNsXSAjMTUwOCBGaXggVmlzdWFsIFN0dWRpbyAyMDE1IGFuZCBsYXRlciBjb21waWxhdGlvbiBlcnJvcnMgZHVlIHRvIHNucHJpbnRmIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb24uCgoyMDE5LTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBGeENvcCB3YXJuaW5nIENBMjAwMiBpbiBTV0lHUGVuZGluZ0V4Y2VwdGlvbiAtIGEgbG9jayBvbiBhIHJlZmVyZW5jZSBvZgogICAgICAgICAgICB0eXBlICdUeXBlJy4KCjIwMTktMDMtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBEXSBBZGQgdGhlIHBhcmFtZXRlcnMgdHlwZW1hcCBhdHRyaWJ1dGUgdG8gdGhlIGphdmFkZXN0cnVjdCwKICAgICAgICAgICAgamF2YWRlc3RydWN0X2Rlcml2ZWQsIGRkaXNwb3NlLCBkZGlzcG9zZV9kZXJpdmVkIHR5cGVtYXBzIHRvIG1pcnJvciBlbmhhbmNlZAogICAgICAgICAgICBmbGV4aWJpbGl0eSBpbiB0aGUgY3NkaXNwb3NpbmcgYW5kIGNzZGlzcG9zaW5nX2Rlcml2ZWQgKEMjKSB0eXBlbWFwcy4gSWYgcHJvdmlkZWQKICAgICAgICAgICAgdGhlIGNvbnRlbnRzIGFyZSBnZW5lcmF0ZWQgYXMgdGhlIGRlbGV0ZS9kaXNwb3NlIG1ldGhvZCdzIHBhcmFtZXRlcnMgZGVjbGFyYXRpb24uCgoyMDE5LTAzLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdICM0MjEgRml4IEZ4Q29wIHdhcm5pbmcgQ0ExMDYzIGJ5IGltcGxlbWVudGluZyB0aGUgcmVjb21tZW5kZWQgRGlzcG9zZSBtZXRob2RzIGZvcgogICAgICAgICAgICB0aGUgSURpc3Bvc2FibGUgaW50ZXJmYWNlLiBQcmV2aW91c2x5IGp1c3QgdGhlIERpc3Bvc2UoKSBtZXRob2Qgd2FzIGdlbmVyYXRlZC4KICAgICAgICAgICAgTm93IHRoZSBEaXNwb3NlKCkgYW5kIERpc3Bvc2UoYm9vbCBkaXNwb3NpbmcpIG1ldGhvZHMgYXJlIGdlbmVyYXRlZC4KICAgICAgICAgICAgQ2hhbmdlcyBhcmUgcmVxdWlyZWQgaWYgY3VzdG9tICJjc2ZpbmFsaXplIiwgImNzZGVzdHJ1Y3QiIG9yICJjc2Rlc3RydWN0X2Rlcml2ZWQiCiAgICAgICAgICAgIHR5cGVtYXBzIGFyZSBiZWluZyB1c2VkLiBEZXRhaWxzIGluICM0MjEgb24gR2l0aHViLiBTV0lHIHdpbGwgZXJyb3Igb3V0IGlmIG9uZSBvZgogICAgICAgICAgICB0aGUgImNzZmluYWxpemUsICJjc2Rlc3RydWN0IiBvciAiY3NkZXN0cnVjdF9kZXJpdmVkIiB0eXBlbWFwcyBhcmUgZm91bmQuIEV4YW1wbGUKICAgICAgICAgICAgZXJyb3IgbWVzc2FnZToKCiAgICAgICAgICAgICAgZm9vLmg6NjA6IEVycm9yOiBBIGRlcHJlY2F0ZWQgY3NmaW5hbGl6ZSB0eXBlbWFwIHdhcyBmb3VuZCBmb3IgRm9vLCBwbGVhc2UgcmVtb3ZlCiAgICAgICAgICAgICAgaXQgYW5kIHJlcGxhY2UgYWxsIGNzZGVzdHJ1Y3QsIGNzZGVzdHJ1Y3RfZGVyaXZlZCBhbmQgY3NmaW5hbGl6ZSB0eXBlbWFwcyBieSB0aGUKICAgICAgICAgICAgICBjc2Rpc3Bvc2UsIGNzZGlzcG9zZV9kZXJpdmVkLCBjc2Rpc3Bvc2luZyBhbmQgY3NkaXNwb3NpbmdfZGVyaXZlZCB0eXBlbWFwcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOS0wMy0yNTogTGlyeW5hCiAgICAgICAgICAgIFtDI10gIzExNDMgQWRkIHN0ZF9saXN0LmkgZm9yIHN0ZDo6bGlzdCBzdXBwb3J0LgogICAgICAgICAgICBUaGUgQyMgc3RkOjpsaXN0PFQ+IHdyYXBwZXJzIGFyZSBtYWRlIHRvIGxvb2sgYW5kIGZlZWwgbGlrZSBhIEMjCiAgICAgICAgICAgIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLkxpbmtlZExpc3Q8PiBjb2xsZWN0aW9uLgogICAgICAgICAgICBUaGUgSUVudW1lcmFibGU8PiBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIHByb3h5IGNsYXNzLgogICAgICAgICAgICBUaGUgSUNvbGxlY3Rpb248PiBpbnRlcmZhY2UgY2FuIGFsc28gYmUgaW1wbGVtZW50ZWQgdG8gcHJvdmlkZSBlbmhhbmNlZCBmdW5jdGlvbmFsaXR5CiAgICAgICAgICAgIHdoZW5ldmVyIGEgQysrIG9wZXJhdG9yPT0gaXMgYXZhaWxhYmxlLiBUaGlzIGlzIHRoZSBjYXNlIGZvciB3aGVuIFQgaXMgYQogICAgICAgICAgICBwcmltaXRpdmUgdHlwZSBvciBhIHBvaW50ZXIuIElmIFQgZG9lcyBkZWZpbmUgYW4gb3BlcmF0b3I9PSwgdGhlbiB1c2UgdGhlCiAgICAgICAgICAgIFNXSUdfU1REX0xJU1RfRU5IQU5DRUQgbWFjcm8gdG8gb2J0YWluIHRoaXMgZW5oYW5jZWQgZnVuY3Rpb25hbGl0eSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfU1REX0xJU1RfRU5IQU5DRUQoU29tZU5hbWVzcGFjZTo6S2xhc3MpCiAgICAgICAgICAgICAgJXRlbXBsYXRlKExpc3RLbGFzcykgc3RkOjpsaXN0PFNvbWVOYW1lc3BhY2U6OktsYXNzPjsKCjIwMTktMDMtMTg6IHJpY2hhcmRiZWFyZQogICAgICAgICAgICBbUl0gIzEzMjggTm9uLXRyaXZpYWwgZW51bXMgYXJlIHdvcmtpbmcgbm93LiBUaGUgZW51bSB2YWx1ZXMgYXJlIG5vdyBvYnRhaW5lZCBmcm9tCiAgICAgICAgICAgIHRoZSBDL0MrKyBsYXllci4gY29uc3QgcmVmZXJlbmNlIGVudW1zIGFuZCBDKysxMSBlbnVtIGNsYXNzZXMgYXJlIGFsc28gbm93IHdvcmtpbmcuCgoyMDE5LTAzLTE0OiBtb2NoaXprCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSAjMTUwMCBGaXggY29tcGlsYXRpb24gZXJyb3JzIGR1ZSB0byBkZXByZWNhdGluZyBWOCBBUEkgaW4gTm9kZS5qcy4KICAgICAgICAgICAgTmV3IFY4IEFQSSBpcyB1c2VkIGlmIG5vZGUuanMgPj0gdjEwLjEyLCBvciBpZiBWOCA+PSB2Ny4wLgoKMjAxOS0wMy0xMjogdmFkegogICAgICAgICAgICBbQyNdICMxNDk1IEFkZCBzdGRfc2V0LmkgZm9yIHN0ZDo6c2V0IHN1cHBvcnQuCgoyMDE5LTAzLTExOiBkaXJ0ZWF0LG9wb3BsYXdza2kKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGNvbXBpbGF0aW9uIGVycm9ycyBpbiBPY3RhdmUgNS4xLgoKICAgICAgICAgICAgICBlcnJvcjogZm9ybWF0IG5vdCBhIHN0cmluZyBsaXRlcmFsIGFuZCBubyBmb3JtYXQgYXJndW1lbnRzIFstV2Vycm9yPWZvcm1hdC1zZWN1cml0eV0KCjIwMTktMDItMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OnZlY3RvciBpbXByb3ZlbWVudHMgZm9yIHR5cGVzIHRoYXQgZG8gbm90IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgVGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIGhhdmUgYmVlbiBjaGFuZ2VkIHRvIHdvcmsgYnkgZGVmYXVsdCBmb3IgZWxlbWVudHMgdGhhdCBhcmUKICAgICAgICAgICAgbm90IGRlZmF1bHQgaW5zZXJ0YWJsZSwgaS5lLiBoYXZlIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuIFRoaXMgaGFzIGJlZW4gYWNoaWV2ZWQgYnkKICAgICAgICAgICAgbm90IHdyYXBwaW5nOgoKICAgICAgICAgICAgICB2ZWN0b3Ioc2l6ZV90eXBlIG4pOwoKICAgICAgICAgICAgUHJldmlvdXNseSB0aGUgYWJvdmUgaGFkIHRvIGJlIGlnbm9yZWQgdmlhICVpZ25vcmUuCgogICAgICAgICAgICBJZiB0aGUgYWJvdmUgY29uc3RydWN0b3IgaXMgc3RpbGwgcmVxdWlyZWQgaXQgY2FuIGJlIGFkZGVkIGJhY2sgaW4gYWdhaW4gdmlhICVleHRlbmQ6CgogICAgICAgICAgICAgICVleHRlbmQgc3RkOjp2ZWN0b3IgewogICAgICAgICAgICAgICAgdmVjdG9yKHNpemVfdHlwZSBjb3VudCkgeyByZXR1cm4gbmV3IHN0ZDo6dmVjdG9yPCBUID4oY291bnQpOyB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdGhlIGZvbGxvd2luZyB3cmFwcGVkIGNvbnN0cnVjdG9yIGNvdWxkIGJlIHVzZWQgYXMgaXQgcHJvdmlkZXMgbmVhci1lbm91Z2gKICAgICAgICAgICAgZXF1aXZhbGVudCBmdW5jdGlvbmFsaXR5OgoKICAgICAgICAgICAgICB2ZWN0b3IoamludCBjb3VudCwgY29uc3QgdmFsdWVfdHlwZSYgdmFsdWUpOwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE5LTAyLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggY29tcGlsZSBlcnJvcnMgd3JhcHBpbmcgb3ZlcmxvYWRlZCBmdW5jdGlvbnMvY29uc3RydWN0b3JzIHdoZXJlIGEgdmFyYXJnCiAgICAgICAgICAgIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGFmdGVyIGEgbm9uLXZhcmFyZyBmdW5jdGlvbi4KCjIwMTktMDItMjM6IHpwaGVuc2xleTQyCiAgICAgICAgICAgIFVzZSBmdWxseSBxdWFsaWZpZWQgbmFtZSAnamF2YS5sYW5nLk9iamVjdCcgaW5zdGVhZCBvZiAnT2JqZWN0JyBpbiBnZW5lcmF0ZWQgY29kZSB0bwogICAgICAgICAgICBhdm9pZCBjbGFzaGVzIHdpdGggd3JhcHBlZCBDKysgY2xhc3NlcyBjYWxsZWQgJ09iamVjdCcuCgoyMDE5LTAyLTIzOiBndGJYCiAgICAgICAgICAgIFtKYXZhXSAjMTAzNSBBZGQgKGNvbnN0IGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMgaW4gYWRkaXRpb24gdG8gdGhlIG5vbi1jb25zdAogICAgICAgICAgICB0eXBlbWFwcyAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB3aGljaCBkb2VzIG5vdCBhdHRlbXB0IHRvIHdyaXRlIGJhY2sgdG8gdGhlIGNvbnN0CiAgICAgICAgICAgIHN0cmluZy4KCjIwMTktMDItMjI6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzk4NCBBZGQgc3VwcG9ydCBmb3IgUlR5cGVkRGF0YSBpbnRyb2R1Y2VkIGluIFJ1YnkgMS45LjMuCgoyMDE5LTAyLTIyOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgIzE0ODMgRml4IGNvbXBpbGF0aW9uIGZhaWx1cmVzIHdoZW4gYSBkaXJlY3RvciBjbGFzcyBoYXMgZmluYWwgbWV0aG9kcy4KCjIwMTktMDItMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMTI0MCBTdXBwcmVzcyBKYXZhIDkgZGVwcmVjYXRpb24gd2FybmluZ3Mgb24gZmluYWxpemUgbWV0aG9kLgoKMjAxOS0wMi0yMTogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxNDgwIEZpeCBzb21lIHJlamVjdGlvbnMgb2YgdmFsaWQgZmxvYXRpbmctcG9pbnQgbGl0ZXJhbHMuCgoyMDE5LTAyLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICAjMTQ3NSBGaXggcmVncmVzc2lvbiBwYXJzaW5nIGdjYyBwcmVwcm9jZXNzb3IgbGluZW1hcmtlcnMgaW4gdGhlIGZvcm06CgogICAgICAgICAgICAjIGxpbmVudW0gZmlsZW5hbWUgZmxhZ3MKCjIwMTktMDItMTg6IGpha2Vjb2JiCiAgICAgICAgICAgIFtQeXRob25dICM5NDUgIzEyMzQgRWxlbWVudHMgaW4gc3RkOjp2ZWN0b3IgbWVtb3J5IGFjY2VzcyBmaXguCgogICAgICAgICAgICBBY2Nlc3NpbmcgYW4gZWxlbWVudCBpbiBhIHN0ZDo6dmVjdG9yIG9idGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgdmlhIGFuCiAgICAgICAgICAgIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbGVtZW50IGluIHRoZSBjb250YWluZXIuIElmIHRoZSB2ZWN0b3IgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQsCiAgICAgICAgICAgIHRoZSBTV0lHIHdyYXBwZXIgY29udGFpbmluZyB0aGUgcG9pbnRlciB0byB0aGUgZWxlbWVudCBiZWNvbWVzIGludmFsaWQuIFRoZSBmaXggaXMKICAgICAgICAgICAgdG8gb2J0YWluIGEgYmFjay1yZWZlcmVuY2UgdG8gdGhlIGNvbnRhaW5lciBieSB0aGUgd3JhcHBlciB0byB0aGUgZWxlbWVudCBpbiB0aGUgUHl0aG9uCiAgICAgICAgICAgIGxheWVyIHRvIHByZXZlbnQgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGZyb20gZGVzdHJveWluZyB0aGUgdW5kZXJseWluZyBjb250YWluZXIuCgoyMDE5LTAyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZW1hcCBtYXRjaGluZyB0byBleHBhbmQgdGVtcGxhdGUgcGFyYW1ldGVycyB3aGVuIHRoZSBuYW1lIGNvbnRhaW5zCiAgICAgICAgICAgIHRlbXBsYXRlIHBhcmFtZXRlcnMuIEluIHRoZSAldHlwZW1hcCBiZWxvdyB0aGUgdHlwZSBpcyBUIGFuZCB0aGUgbmFtZSBpcyBYPFQ+OjptYWtlCiAgICAgICAgICAgIGFuZCB0aGUgbmFtZSBub3cgZXhwYW5kcyBjb3JyZWN0bHkgdG8gWDwgaW50ID46Om1ha2UKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFggewogICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBUIFg8VD46Om1ha2UgIi4uLiIKICAgICAgICAgICAgICAgIFQgbWFrZSgpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShYaW50KSBYPGludD47CgoyMDE5LTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2VyIGVycm9yIGNvbnRhaW5pbmcgbXVsdGlwbGUgI2RlZmluZSBzdGF0ZW1lbnRzIGluc2lkZSBhbiBlbnVtLgoKICAgICAgICAgICAgVGhlIHNlY29uZCAjZGVmaW5lIGZhaWxzIHRvIHBhcnNlOgoKICAgICAgICAgICAgICBlbnVtIEZvb0VudW0gewogICAgICAgICAgICAgICAgRU5VTTEgPSAwLAogICAgICAgICAgICAgICAgRU5VTTIgPSAxLAoKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPX0RFRjEgIkhlbGxvIgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk9fREVGMiAiV29ybGQhIgoKICAgICAgICAgICAgICAgIEVOVU0zID0gMiwKICAgICAgICAgICAgICAgIEVOVU00ID0gMywKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQnVnIG1lbnRpb25lZCBhdCBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvcGF0Y2hlcy8zMzMvCgoyMDE5LTAyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc29tZSBtaXNzaW5nIGNvcHkgY29uc3RydWN0b3JzIGludG8gU1RMIGNvbnRhaW5lcnMuCgoyMDE5LTAyLTE0OiBia290enoKICAgICAgICAgICAgW0phdmFdICMxMzU2IEFkZCBTVEwgY29udGFpbmVyczoKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQKICAgICAgICAgICAgICBzdGQ6OnNldAoKMjAxOS0wMi0xNDogYmtvdHp6CiAgICAgICAgICAgIFtKYXZhXSAjMTM1NiBzdGQ6Om1hcCB3cmFwcGVycyBoYXZlIGJlZW4gbW9kaWZpZWQuIE5vdyB0aGUgSmF2YSBwcm94eSBjbGFzcwogICAgICAgICAgICBleHRlbmRzIGphdmEudXRpbC5BYnN0cmFjdE1hcC4gVGhlIHN0ZDo6bWFwIGNvbnRhaW5lciBsb29rcyBhbmQgZmVlbHMgbXVjaCBsaWtlCiAgICAgICAgICAgIGEgamF2YS51dGlsLkhhc2hNYXAgZnJvbSBKYXZhLgoKICAgICAgICAgICAgQSBmZXcgbWVtYmVycyBoYXZlIGNoYW5nZWQgdGhlaXIgbmFtZXMuIElmIHRoZSBvbGQgbWV0aG9kIHNpZ25hdHVyZXMgYXJlIG5lZWRlZCwKICAgICAgICAgICAgdGhlbiBjb3B5IHN0ZF9tYXAuaSBmcm9tIHN3aWctMy4wLjEyIGFuZCB1c2UgdGhhdCBpbnN0ZWFkLiBBbHRlcm5hdGl2ZWx5LAogICAgICAgICAgICBhZGQgdGhlIG9sZCBtaXNzaW5nIG1ldGhvZHMgdG8gdGhlIG5ldyBtZXRob2RzIGJ5IHVzaW5nIHRoZSBmb2xsb3dpbmcgJXByb3h5Y29kZToKCiAgICAgICAgICAgICAgJWV4dGVuZCBzdGQ6Om1hcCB7CiAgICAgICAgICAgICAgJXByb3h5Y29kZSAlewogICAgICAgICAgICAgICAgLy8gT2xkIEFQSQogICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBpc0VtcHR5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXQoJHR5cGVtYXAoamJveHR5cGUsIEspIGtleSwgJHR5cGVtYXAoamJveHR5cGUsIFQpIHgpIHsKICAgICAgICAgICAgICAgICAgcHV0KGtleSwgeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkZWwoJHR5cGVtYXAoamJveHR5cGUsIEspIGtleSkgewogICAgICAgICAgICAgICAgICByZW1vdmUoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc19rZXkoJHR5cGVtYXAoamJveHR5cGUsIEspIGtleSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gY29udGFpbnNLZXkoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOS0wMi0xMzogWmFja2VyeVNweXR6CiAgICAgICAgICAgICMxNDY5IEFkZCBzdXBwb3J0IGZvciBDKysxNyBoZXhhZGVjaW1hbCBmbG9hdGluZyBsaXRlcmFscy4KCjIwMTktMDItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPQ2FtbF0gIzE0MzcgT0NhbWwgaGFzIGJlZW4gZ2l2ZSB0aGUgJ0V4cGVyaW1lbnRhbCcgbGFuZ3VhZ2Ugc3RhdHVzLiBUaGUgZXhhbXBsZXMgd29yawogICAgICAgICAgICBhbmQgbW9zdCBvZiB0aGUgdGVzdC1zdWl0ZSBpcyBhbHNvIHdvcmtpbmcsIHNvIGl0IGlzIHF1aXRlIGNsb3NlIHRvIGJlaW5nIGEgJ1N1cHBvcnRlZCcgbGFuZ3VhZ2UuCgoyMDE5LTAyLTEwOiBaYWNrZXJ5U3B5dHoKCSAgICAjMTQ2NCBBZGQgc3VwcG9ydCBmb3IgQysrMTQgYmluYXJ5IGludGVnZXIgbGl0ZXJhbHMuCgoyMDE5LTAyLTEwOiBaYWNrZXJ5U3B5dHoKCSAgICAjMTQ1MCBBZGQgc3VwcG9ydCBmb3IgQysrMTEgVUNTLTIgYW5kIFVDUy00IGNoYXJhY3RlciBsaXRlcmFscy4gQWxzbywgYWRkIHN1cHBvcnQgZm9yCiAgICAgICAgICAgIEMrKzE3IFVURi04IGNoYXJhY3RlciBsaXRlcmFscy4KCjIwMTktMDItMTA6IHdzZnVsdG9uCgkgICAgW016U2NoZW1lXSAjMTQzNyBNelNjaGVtZS9SYWNrZXQgaXMgbm93IGFuICdFeHBlcmltZW50YWwnIGxhbmd1YWdlLiBUaGUgZXhhbXBsZXMgd29yawogICAgICAgICAgICBhbmQgYSBsYXJnZSBwb3J0aW9uIG9mIHRoZSB0ZXN0LXN1aXRlIGlzIGFsc28gd29ya2luZy4KCjIwMTktMDItMTA6IHdzZnVsdG9uCgkgICAgW016U2NoZW1lXSBEZXN0cnVjdG9yIHdyYXBwZXJzIHdlcmUgbm90IGJlaW5nIGdlbmVyYXRlZC4KCjIwMTktMDItMTA6IHdzZnVsdG9uCgkgICAgW016U2NoZW1lXSBTdGF0aWMgdmFyaWFibGUgd3JhcHBlcnMgZml4ZWQgLSAkYXJnbnVtIHdhcyBub3QgZXhwYW5kZWQuCgoyMDE5LTAyLTEwOiBzZXRocmoKCSAgICAjMTQ1MiBGaXggJWFwcGx5IGZvciBhbm9ueW1vdXMgdGVtcGxhdGUgaW5zdGFudGlhdGlvbnMKCjIwMTktMDItMDk6IG9sbHkKCSAgICBbUEhQXSBGaXggYWNjZXNzIHRvIGFscmVhZHkgcmVsZWFzZWQgbWVtb3J5IGR1cmluZyBQSFAgbW9kdWxlCgkgICAgc2h1dGRvd24sIHdoaWNoIG9mdGVuIGRpZG4ndCBjYXVzZSB2aXNpYmxlIHByb2JsZW1zLCBidXQgY291bGQKCSAgICByZXN1bHQgaW4gc2VnbWVudGF0aW9uIGZhdWx0cywgYnVzIGVycm9ycywgZXRjLiAgRml4ZXMgIzExNzAsCgkgICAgcmVwb3J0ZWQgYnkgSml0a2EgUGxlc27ta2924S4KCjIwMTktMDItMDk6IG9sbHkKCSAgICBbUEhQXSBBIHJlbmFtZWQgY29uc3RydWN0b3IgaXMgbm93IHdyYXBwZWQgYXMgYSBzdGF0aWMgbWV0aG9kIGluCgkgICAgUEhQLgoKMjAxOS0wMi0wODogb2xseQoJICAgIFtQSFBdIERvbid0IGdlbmVyYXRlIGNvZGUgd2hpY2ggcmVmZXJlbmNlcyAkciB3aGVuICRyIGhhc24ndCBiZWVuCgkgICAgZGVmaW5lZC4gIFRoaXMgY291bGQgaGFwcGVuIGluIG92ZXJsb2FkZWQgbWV0aG9kcyB3aGljaCByZXR1cm5lZAoJICAgIHZvaWQgYW5kIHRvb2sgYXQgbGVhc3Qgb25lIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJhbWV0ZXIuCgoyMDE5LTAyLTA4OiBvbGx5CgkgICAgW1BIUF0gVGhlIGdlbmVyYXRlZCBjb2RlIGlzIG5vdyBjb21wYXRpYmxlIHdpdGggUEhQIDcuMywgYW5kIHRoZQoJICAgIHRlc3RzdWl0ZSBub3cgcnVucyBjbGVhbmx5IHdpdGggdGhpcyB2ZXJzaW9uIHRvby4KCjIwMTktMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNDM3IFNXSUcgbm93IGNsYXNzaWZpZXMgdGhlIHN0YXR1cyBvZiB0YXJnZXQgbGFuZ3VhZ2VzIGludG8gZWl0aGVyICdFeHBlcmltZW50YWwnIG9yCiAgICAgICAgICAgICdTdXBwb3J0ZWQnLiBUaGlzIHN0YXR1cyBpcyBwcm92aWRlZCB0byBpbmRpY2F0ZSB0aGUgbGV2ZWwgb2YgbWF0dXJpdHkgdG8gZXhwZWN0IHdoZW4gdXNpbmcKICAgICAgICAgICAgYSBwYXJ0aWN1bGFyIHRhcmdldCBsYW5ndWFnZSBhcyBub3QgYWxsIHRhcmdldCBsYW5ndWFnZXMgYXJlIGZ1bGx5IGRldmVsb3BlZC4gRGV0YWlscyBhcmUKICAgICAgICAgICAgaW4gdGhlIEludHJvZHVjdGlvbi5odG1sIGNoYXB0ZXIgb2YgdGhlIGRvY3VtZW50YXRpb24uCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtDRkZJXSAjMTQ0NyBDb21tb24gTGlzcCBDRkZJIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW0FsbGVncm9jbF0gIzE0NDcgQWxsZWdybyBDb21tb24gTGlzcCBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtDaGlja2VuXSAjMTQ0NyBDSElDS0VOIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW0NMSVNQXSAjMTQ0NyBHTlUgQ29tbW9uIExpc3AgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbUy1FWFBdICMxNDQ3IENvbW1vbiBMaXNwIFMtRXhwIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDQ6IHdzZnVsdG9uCgkgICAgW1VGRkldICMxNDQ3IENvbW1vbiBMaXNwIFVGRkkgaGFzIGJlZW4gZGlzYWJsZWQgYXMgYSB0YXJnZXQgbGFuZ3VhZ2UgaW4gU1dJRyBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgY2xlYW4gdXAgdG8gcmVtb3ZlIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBoYXZlIGJlZW4gbmVnbGVjdGVkL25vdCBmdW5jdGlvbmFsLgoKMjAxOS0wMi0wNDogd3NmdWx0b24KCSAgICBbUGlrZV0gIzE0NDcgUGlrZSBoYXMgYmVlbiBkaXNhYmxlZCBhcyBhIHRhcmdldCBsYW5ndWFnZSBpbiBTV0lHIGFzIHBhcnQgb2YgYQogICAgICAgICAgICBjbGVhbiB1cCB0byByZW1vdmUgdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGhhdmUgYmVlbiBuZWdsZWN0ZWQvbm90IGZ1bmN0aW9uYWwuCgoyMDE5LTAyLTA0OiB3c2Z1bHRvbgoJICAgIFtNb2R1bGEzXSAjMTQ0NyBNb2R1bGEzIGhhcyBiZWVuIGRpc2FibGVkIGFzIGEgdGFyZ2V0IGxhbmd1YWdlIGluIFNXSUcgYXMgcGFydCBvZiBhCiAgICAgICAgICAgIGNsZWFuIHVwIHRvIHJlbW92ZSB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgaGF2ZSBiZWVuIG5lZ2xlY3RlZC9ub3QgZnVuY3Rpb25hbC4KCjIwMTktMDItMDI6IGFobm9sZHMKCSAgICBbUHl0aG9uXSBEb2N1bWVudGF0aW9uIGVuaGFuY2VtZW50cyBmb3IgUHl0aG9uOgoKICAgICAgICAgICAgIzcyOCBGaXhlZCB0aGUgaGFuZGxpbmcgb2YgYXV0b2RvYyB3aGVuIHVzaW5nIC1mYXN0cHJveHkuCgogICAgICAgICAgICAjMTM2NyBBZGRlZCBkb2N1bWVudGF0aW9uIHRvIHdyYXBwZWQgbWVtYmVyIHZhcmlhYmxlcyB1c2luZyB0aGUKICAgICAgICAgICAgcHJvcGVydHkoLi4uIGRvYz0iLi4uIikgY29uc3RydWN0LgoKICAgICAgICAgICAgT25seSBzaG93IGEgc2luZ2xlIGRvY3VtZW50YXRpb24gZW50cnkgZm9yIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHdoZW4KICAgICAgICAgICAgdXNpbmcgYXV0b2RvYy4KCiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdoZXJlIGEgY2FjaGVkIGRveHlnZW4gZG9jc3RyaW5nIGNvdWxkIGJlIGRlbGV0ZWQgd2hpbGUgc3RpbGwgaW4gdXNlLAogICAgICAgICAgICBjYXVzaW5nIHN3aWcgdG8gc2VnZmF1bHQuCgoyMDE5LTAxLTMxOiBvbGx5CgkgICAgU1dJRyBub3cgcmVxdWlyZXMgYSB0YXJnZXQgbGFuZ3VhZ2UgdG8gYmUgc3BlY2lmaWVkIGluc3RlYWQgb2YKCSAgICBkZWZhdWx0aW5nIHRvIHdyYXBwaW5nIGZvciBUY2wuICBTcGVjaWZ5aW5nIHN3aWcgLS1oZWxwIHdpdGhvdXQKCSAgICBhIHRhcmdldCBsYW5ndWFnZSBub3cganVzdCBzaG93cyB0aGUgZ2VuZXJpYyBoZWxwLiAgVGhlIC1ub2xhbmcKCSAgICBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4KCjIwMTktMDEtMjg6IFphY2tlcnlTcHl0egogICAgICAgICAgICBbT0NhbWxdICMxNDI5IFJlbW92ZSBzdXBwb3J0IGZvciBPQ2FtbCB2ZXJzaW9ucyA8IDMuMTIuMC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOS0wMS0yMjogdmFkegogICAgICAgICAgICBbUnVieSwgT2N0YXZlXSAjMTQyNCBJbXByb3ZlIGF1dG9kb2MgcGFyYW1ldGVyIG5hbWluZy4KCjIwMTktMDEtMjI6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gIzEyNzEgIzE0MjMgQWx3YXlzIGluY2x1ZGUgZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWVzIGluIGF1dG9kb2Mgc3RyaW5ncy4KCjIwMTktMDEtMTk6IHZhZHoKICAgICAgICAgICAgIzEyNzIsICMxNDIxIFdoZW4gYSBmdW5jdGlvbidzIHBhcmFtZXRlciBpcyBhIGtleXdvcmQsIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWF0ZXIgaXMKICAgICAgICAgICAgbm8gbG9uZ2VyIHNpbXBseSBjaGFuZ2VkIHRvIGFyZ04sIHdoZXJlIE4gaXMgdGhlIGFyZ3VtZW50IG51bWJlci4gSW5zdGVhZCB0aGUKICAgICAgICAgICAgcGFyYW1ldGVyIG5hbWUgaXMgY2hhbmdlZCB0byB0aGUgcmVuYW1pbmcgcnVsZXMgZm9yIGtleXdvcmRzIHRoYXQgbm9ybWFsbHkgYXBwbHkgdG8KICAgICAgICAgICAgc3ltYm9scyBzdWNoIGFzIGNsYXNzZXMvZnVuY3Rpb25zIGV0Yy4gTm90ZSB0aGF0IHVubGlrZSBvdGhlciBzeW1ib2wgcmVuYW1pbmcsCiAgICAgICAgICAgIHBhcmFtZXRlciByZW5hbWluZyBkb2VzIG5vdCBpc3N1ZSBhIHdhcm5pbmcgd2hlbiB0aGUgcGFyYW1ldGVyIGlzIHJlbmFtZWQuIFRoaXMKICAgICAgICAgICAgY2hhbmdlIG9ubHkgYWZmZWN0cyBsYW5ndWFnZXMgd2hlcmUgdGhlIHBhcmFtZXRlciBuYW1lcyBhcmUgYWN0dWFsbHkgdXNlZCwgZm9yIGV4YW1wbGUsCiAgICAgICAgICAgIEphdmEgZnVuY3Rpb24gcGFyYW1ldGVyIGxpc3RzIGluIHRoZSBwcm94eSBjbGFzcyBvciBQeXRob24gZG9jdW1lbnRhdGlvbiBjb21tZW50cy4KCjIwMTktMDEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgICMxNDIwIEZpeCBnZGIgZGVidWdnZXIgZnVuY3Rpb25zICdzd2lncHJpbnQnIGFuZCAnbG9jc3dpZ3ByaW50JyBmcm9tIHN3aWcuZ2RiIHRvCiAgICAgICAgICAgIHdvcmsgd2l0aCBuZXdlciB2ZXJzaW9ucyBvZiBnZGItOC4gRml4ZXMgZXJyb3JzIHdoZW4gZGVidWdnaW5nIFNXSUcgc291cmNlIHdpdGggZ2RiOgoKICAgICAgICAgICAgICAoZ2RiKSBzd2lncHJpbnQgbgogICAgICAgICAgICAgIFVuZGVmaW5lZCBjb21tYW5kOiAiUHJpbnRmIi4gIFRyeSAiaGVscCIuCgoyMDE5LTAxLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBQeXRob24gc3RhdGljIG1ldGhvZCB3cmFwcGVyIGNoYW5nZXMKCiAgICAgICAgICAgIC0gU3RhdGljIG1ldGhvZCB3cmFwcGVycyB3ZXJlIHVzaW5nIHRoZSAnZmFzdHByb3h5JyBhcHByb2FjaCBieSBkZWZhdWx0LgogICAgICAgICAgICAgIFRoaXMgaXMgaW5jb25zaXN0ZW50IHdpdGggaW5zdGFuY2UgbWV0aG9kIHdyYXBwZXJzLiBUaGUgZmFzdHByb3h5IGFwcHJvYWNoCiAgICAgICAgICAgICAgaXMgbm93IHR1cm5lZCBvZmYgYnkgZGVmYXVsdCB0byBiZSBjb25zaXN0ZW50IHdpdGggaW5zdGFuY2UgbWV0aG9kcy4KICAgICAgICAgICAgICBTdGF0aWMgbWV0aG9kIHdyYXBwZXJzIGNhbiBub3cgYWxzbyBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSAtZmFzdHByb3h5IGFuZAogICAgICAgICAgICAgIC1vbGRkZWZzIG9wdGlvbnMuCgogICAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBzdGF0bWV0aG9kKGludCBhID0gMik7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBnZW5lcmF0ZXMgYnkgZGVmYXVsdDoKCiAgICAgICAgICAgICAgY2xhc3MgS2xhc3Mob2JqZWN0KToKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIEBzdGF0aWNtZXRob2QKICAgICAgICAgICAgICAgICAgZGVmIHN0YXRtZXRob2QoYT0yKToKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZXhhbXBsZS5LbGFzc19zdGF0bWV0aG9kKGEpCgogICAgICAgICAgICAgIGluc3RlYWQgb2YgdGhlIGZvbGxvd2luZyAod2hpY2ggY2FuIGJlIHJlc3RvcmVkIGJ5IHVzaW5nIC1mYXN0cHJveHkpOgoKICAgICAgICAgICAgICAgIGNsYXNzIEtsYXNzKG9iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBzdGF0bWV0aG9kID0gc3RhdGljbWV0aG9kKF9leGFtcGxlLktsYXNzX3N0YXRtZXRob2QpCgogICAgICAgICAgICAgIC0gTW9kZXJuaXNlIHdyYXBwZXJzIGZvciBzdGF0aWMgbWV0aG9kcyB0byB1c2UgZGVjb3JhdG9yIHN5bnRheCAtIEBzdGF0aWNtZXRob2QuCgogICAgICAgICAgICAgIC0gQWRkIG1pc3NpbmcgcnVudGltZSB0ZXN0IGZvciBzdGF0aWMgY2xhc3MgbWV0aG9kcyBhbmQgdXNpbmcgdGhlIGFjdHVhbCBjbGFzcyBtZXRob2QuCgoyMDE5LTAxLTEyOiBaYWNrZXJ5U3B5dHoKICAgICAgICAgICAgW09DYW1sXSAjMTQwMyAjMTE5NCBGaXggY29tcGlsYXRpb24gcHJvYmxlbXMgZm9yIE9DYW1sID49IDQuMDMuMCBkdWUgdG8gT0NhbWwgdXNpbmcKICAgICAgICAgICAgaW50NjRfdCBpbnN0ZWFkIG9mIGludDY0LgoKMjAxOS0wMS0xMTogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtPQ2FtbF0gIzE0MDAgRml4IHRoZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIG9mIG5vbi1zdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4KCjIwMTktMDEtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgICMzNTggQWRkIFZPSUQgdG8gd2luZG93cy5pCgoyMDE5LTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICAjOTQ4ICMxMDE5ICMxMjczIEZpeCBmb3IgQysrMTEgcmF3IHN0cmluZ3Mgd2hlcmUgdGhlIGRlbGltaXRlcnMgd2VyZSBtaXN0YWtlbmx5IGxlZnQKICAgICAgICAgICAgaW4gdGhlIHN0cmluZyBjb250ZW50cyBpbiBzaXR1YXRpb25zIHdoZXJlIHRoZSBzdHJpbmcgd2FzIGNvcGllZCBpbnRvIGdlbmVyYXRlZCBjb2RlLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgJWNvbnN0YW50LCB0aGUgImRvY3N0cmluZyIgZmVhdHVyZSBhbmQgZm9yIEMjL0phdmEvRCBjb25zdGFudHMgdHVybmVkIG9uCiAgICAgICAgICAgIHdpdGggJWphdmFjb25zdC8lY3Njb25zdC8lZG1hbmlmZXN0Y29uc3QuCgoyMDE5LTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gIzUzOC4gRml4IFJ1Ynkgc3VwcG9ydCBmb3IgJWZlYXR1cmUoImRvY3N0cmluZyIpLgoKMjAxOS0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgIzEyMDIgRml4IG92ZXJsb2FkaW5nIG9mIG5vbi1wb2ludGVyIGNsYXNzIHR5cGVzIGluIHNjcmlwdGluZyBsYW5ndWFnZXMgd2hlbiBvdmVybG9hZGVkCiAgICAgICAgICAgIHdpdGggYSBwb2ludGVyIGFuZCBhIE5VTEwgc2NyaXB0aW5nIGxhbmd1YWdlIGVxdWl2YWxlbnQgaXMgdXNlZCwgZWcgTm9uZSBpbiBQeXRob24uCgogICAgICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gY2hhbmdlcyB0aGUgU1dJR1RZUEUsIFNXSUdUWVBFJiBhbmQgU1dJR1RZUEUmJiB0eXBlY2hlY2sgdHlwZW1hcHMgdG8KICAgICAgICAgICAgcHJldmVudCBhY2NlcHRpbmcgYSBjb252ZXJzaW9uIHRvIGEgTlVMTCBwb2ludGVyLgoKMjAxOS0wMS0wMzogWmFja2VyeVNweXR6CiAgICAgICAgICAgIFtPQ2FtbF0gIzEzODYgRml4IHRoZSBPQ2FtbCBleGFtcGxlcyBhbmQgdGVzdCBzdWl0ZSBmb3Igb3V0LW9mLXNvdXJjZSBidWlsZHMuCgoyMDE5LTAxLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNjM5IHJlbW92ZSBkdXBsaWNhdGUgcHJveHkgbWV0aG9kIGRlZmluaXRpb25zIGZvciBnbG9iYWwgZnVuY3Rpb24gd3JhcHBlcnMuCgogICAgICAgICAgICBHbG9iYWwgZnVuY3Rpb25zIHByZXZpb3VzbHkgZ2VuZXJhdGVkIHR3byBkZWZpbml0aW9ucywgZWc6CgogICAgICAgICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgICAgICAgcmV0dXJuIF9leGFtcGxlLmZvbygpCiAgICAgICAgICAgICAgZm9vID0gX2V4YW1wbGUuZm9vCgogICAgICAgICAgICBUaGUgZmlyc3QgZGVmaW5pdGlvbiBpcyByZXBsYWNlZCBieSB0aGUgc2Vjb25kIGRlZmluaXRpb24gYW5kIHNvIHRoZSBzZWNvbmQgZGVmaW5pdGlvbgogICAgICAgICAgICBpcyB0aGUgb25lIHVzZWQgd2hlbiB0aGUgbWV0aG9kIGlzIGFjdHVhbGx5IGNhbGxlZC4gTm93IGp1c3QgdGhlIGZpcnN0IGRlZmluaXRpb24gaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgYW5kIGlmIHRoZSAtZmFzdHByb3h5IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgdXNlZCwganVzdCB0aGUgc2Vjb25kCiAgICAgICAgICAgIGRlZmluaXRpb24gaXMgZ2VuZXJhdGVkLiBUaGUgc2Vjb25kIGRlZmluaXRpb24gaXMgZmFzdGVyIGFzIGl0IGF2b2lkcyB0aGUgcHJveHkgUHl0aG9uCiAgICAgICAgICAgIG1ldGhvZCBhcyBpdCBjYWxscyB0aGUgbG93LWxldmVsIEMgd3JhcHBlciBkaXJlY3RseS4gVXNpbmcgYm90aCAtZmFzdHByb3h5IGFuZCAtb2xkZGVmcwogICAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9ucyB3aWxsIHJlc3RvcmUgdGhlIHByZXZpb3VzbHkgZ2VuZXJhdGVkIGNvZGUgYXMgaXQgd2lsbCBnZW5lcmF0ZSBib3RoCiAgICAgICAgICAgIG1ldGhvZCBkZWZpbml0aW9ucy4KCiAgICAgICAgICAgIFdpdGggdGhpcyBjaGFuZ2UsIHRoZSB3cmFwcGVycyBmb3IgZ2xvYmFsIEMvQysrIGZ1bmN0aW9ucyBhbmQgQysrIGNsYXNzIG1ldGhvZHMgbm93IHdvcmsKICAgICAgICAgICAgaW4gdGhlIHNhbWUgd2F5IHdydCB0byBnZW5lcmF0aW5nIGp1c3QgYSBwcm94eSBtZXRob2QgYnkgZGVmYXVsdCBhbmQgY29udHJvbCB2aWEKICAgICAgICAgICAgLWZhc3Rwcm94eS8tb2xkZGVmcyBvcHRpb25zLgoKMjAxOC0xMi0yMDogaGFzaW5vZmYsd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMxMzM0IFNldCBKYXZhIHRocmVhZCBuYW1lIHRvIG5hdGl2ZSB0aHJlYWQgbmFtZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCiAgICAgICAgICAgIERlZmF1bHQgaXMgdG8gdXNlIG5hbWUgIlRocmVhZC1YWFgiIGFuZCBpcyBzdGlsbCB3b3JrcyBsaWtlIHRoaXMgYnkgZGVmYXVsdC4gSG93ZXZlciwKICAgICAgICAgICAgYWRkaW5nIHRoZSBmb2xsb3dpbmcgd2lsbCB0dXJuIG9uIHRoZSB0aHJlYWQgbmFtZSBzZXR0aW5nICh3b3JrcyBmb3IgbW9yZSByZWNlbnQKICAgICAgICAgICAgdmVyc2lvbnMgb2YgTGludXggYW5kIE1hY09TKToKCiAgICAgICAgICAgICViZWdpbiAlewogICAgICAgICAgICAjZGVmaW5lIFNXSUdfSkFWQV9VU0VfVEhSRUFEX05BTUUKICAgICAgICAgICAgJX0KCjIwMTgtMTItMjA6IGNobGFuZHNpCiAgICAgICAgICAgIFtQeXRob25dICMxMzU3LiBGaXggb3ZlcnJpZGluZyBfX25ld19fIGluIFB5dGhvbiAzLjYuCgogICAgICAgICAgICBGaXhlcyBTeXN0ZW1FcnJvcjogT2JqZWN0cy90dXBsZW9iamVjdC5jOjgxOiBiYWQgYXJndW1lbnQgdG8gaW50ZXJuYWwgZnVuY3Rpb24iCgoyMDE4LTEyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjODQ4ICMxMzQzIFRoZSBtb2R1bGUgaW1wb3J0IGxvZ2ljIGhhcyBjaGFuZ2VkIHRvIHN0b3Agb2JmdXNjYXRpbmcgcmVhbCBJbXBvcnRFcnJvcgogICAgICAgICAgICBwcm9ibGVtcy4gT25seSBvbmUgaW1wb3J0IG9mIHRoZSBsb3ctbGV2ZWwgQy9DKysgbW9kdWxlIGZyb20gdGhlIHB1cmUgUHl0aG9uIG1vZHVsZSBpcwogICAgICAgICAgICBhdHRlbXB0ZWQgbm93LiBQcmV2aW91c2x5IGEgc2Vjb25kIGltcG9ydCBvZiB0aGUgbG93LWxldmVsIEMvQysrIG1vZHVsZSB3YXMgYXR0ZW1wdGVkCiAgICAgICAgICAgIGFmdGVyIGFuIEltcG9ydEVycm9yIG9jY3VycmVkIGFuZCB3YXMgZG9uZSB0byBzdXBwb3J0ICdzcGxpdCBtb2R1bGVzJy4gQSAnc3BsaXQgbW9kdWxlJyBpcwogICAgICAgICAgICBhIGNvbmZpZ3VyYXRpb24gd2hlcmUgdGhlIHB1cmUgUHl0aG9uIG1vZHVsZSBpcyBhIG1vZHVsZSB3aXRoaW4gYSBQeXRob24gcGFja2FnZSBhbmQgdGhlCiAgICAgICAgICAgIGxvdy1sZXZlbCBDL0MrKyBtb2R1bGUgaXMgYSBnbG9iYWwgUHl0aG9uIG1vZHVsZS4gTm93IGEgJ3NwbGl0IG1vZHVsZScgY29uZmlndXJhdGlvbiBpcwogICAgICAgICAgICBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IGRlZmF1bHQuIFRoaXMgY29uZmlndXJhdGlvbiBjYW4gYmUgc3VwcG9ydGVkIHdpdGggYSBzaW1wbGUKICAgICAgICAgICAgY3VzdG9taXphdGlvbiwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJW1vZHVsZShwYWNrYWdlPSJteXBhY2thZ2UiLCBtb2R1bGVpbXBvcnQ9ImltcG9ydCAkbW9kdWxlIikgZm9vCgogICAgICAgICAgICBvciBpZiB1c2luZyAtYnVpbHRpbjoKCiAgICAgICAgICAgICAgJW1vZHVsZShwYWNrYWdlPSJteXBhY2thZ2UiLCBtb2R1bGVpbXBvcnQ9ImZyb20gJG1vZHVsZSBpbXBvcnQgKiIpIGZvbwoKICAgICAgICAgICAgaW5zdGVhZCBvZgoKICAgICAgICAgICAgICAlbW9kdWxlKHBhY2thZ2U9Im15cGFja2FnZSIpIGZvbwoKICAgICAgICAgICAgU2VlIHRoZSB1cGRhdGVkIFB5dGhvbiBjaGFwdGVyIHRpdGxlZCAiTG9jYXRpb24gb2YgbW9kdWxlcyIgaW4gdGhlIGRvY3VtZW50YXRpb24uCgoyMDE4LTEyLTExOiB0bGJ5CiAgICAgICAgICAgIFtQZXJsXSAjMTM3NCByZXBhaXIgRVhURU5EKCkgaGFuZGxpbmcgaW4gdHlwZW1hcHMKCjIwMTgtMTItMDY6IHZhZHoKICAgICAgICAgICAgIzEzNTkgIzEzNjQgQWRkIG1pc3NpbmcgbmVzdGVkIGNsYXNzIGRlc3RydWN0b3Igd3JhcHBlciB3aGVuIHRoZSBuZXN0ZWQgY2xhc3MgaXMKICAgICAgICAgICAgaW5zaWRlIGEgdGVtcGxhdGUuIFJlbW92ZXMgYXNzb2NpYXRlZCBib2d1cyAnSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUnIHdhcm5pbmcuIE9ubHkKICAgICAgICAgICAgb2NjdXJyZWQgd2hlbiB0aGUgbmVzdGVkIGNsYXNzJyBkZXN0cnVjdG9yIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgoKMjAxOC0xMi0wNDogYWRyMjYKICAgICAgICAgICAgW1B5dGhvbl0gIzEzNjggIzEzNjkgQWNjZXNzIFZpb2xhdGlvbiBpbiB0cF9wcmludCBjYXVzZWQgYnkgbWlzbWF0Y2hlZCBQeXRob24vZXh0ZW5zaW9uCiAgICAgICAgICAgIENSVCB1c2FnZQoKICAgICAgICAgICAgUmVtb3ZlIGFsbCB1c2Ugb2YgdHBfcHJpbnQsIGFzIHRoaXMgQVBJIHVzZXMgYSBGSUxFKiwgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIG1pc21hdGNoZWQgd2hlbiBtb2R1bGVzIGFyZSBidWlsdCB3aXRoIGRpZmZlcmVudCBDIGxpYnJhcmllcyBmcm9tCiAgICAgICAgICAgIHRoZSBtYWluIHB5dGhvbiBleGVjdXRhYmxlLgoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBicmluZ3MgY29uc2lzdGVudCBvdXRwdXQgYmV0d2VlbiBQeXRob24gMiBhbmQgMyBmb3IgdGhlICdjdmFyJyBTV0lHCiAgICAgICAgICAgIG9iamVjdCAodGhhdCBjb250YWlucyB0aGUgZ2xvYmFsIHZhcmlhYmxlcykgYW5kIFNXSUcgcGFja2VkIG9iamVjdHMgKHN1Y2ggYXMgY2FsbGJhY2sKICAgICAgICAgICAgY29uc3RhbnRzKS4KCjIwMTgtMTItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjgyIEZpeCBydW5uaW5nICdweXRob24gLW0nICB3aGVuIHVzaW5nICdzd2lnIC1idWlsdGluJwoKICAgICAgICAgICAgU2ltaWxhciB0byB0aGUgZWFybGllciBQRVAgMzY2IGNvbmZvcm1pbmcgZml4IGZvciBub24tYnVpbHRpbi4KCjIwMTgtMTEtMjk6IGFkcjI2CiAgICAgICAgICAgIFtQeXRob25dICMxMzYwIExlYWsgb2YgU1dJRyB2YXIgbGluayBvYmplY3QKCiAgICAgICAgICAgIEZpeCByZWZlcmVuY2UgY291bnRpbmcgb24gX1NXSUdfZ2xvYmFscyB0byBhbGxvdyB2YXIgbGluayB0byBiZSBmcmVlZCBvbiBtb2R1bGUgdW5sb2FkLgoKMjAxOC0xMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiB1c2luZyAtYnVpbHRpbiwgdGhlIHR3byBzdGVwIEMtZXh0ZW5zaW9uIG1vZHVsZSBpbXBvcnQgaXMgbm93CiAgICAgICAgICAgIG9uZSBzdGVwIGFuZCB0aGUgd3JhcHBlZCBBUEkgaXMgb25seSBhdmFpbGFibGUgb25jZSBhbmQgbm90IGluIGFuIHVuZGVybHlpbmcKICAgICAgICAgICAgbW9kdWxlIGF0dHJpYnV0ZSBsaWtlIGl0IGlzIHdpdGhvdXQgLWJ1aWx0aW4uIFRvIHVuZGVyc3RhbmQgdGhpcywgY29uc2lkZXIgYQogICAgICAgICAgICBtb2R1bGUgbmFtZWQgJ2V4YW1wbGUnICh1c2luZzogJW1vZHVsZSBleGFtcGxlKS4gVGhlIEMtZXh0ZW5zaW9uIGlzIGNvbXBpbGVkIGludG8KICAgICAgICAgICAgYSBQeXRob24gbW9kdWxlIGNhbGxlZCAnX2V4YW1wbGUnIGFuZCBhIHB1cmUgUHl0aG9uIG1vZHVsZSBwcm92aWRlcyB0aGUgYWN0dWFsCiAgICAgICAgICAgIEFQSSBmcm9tIHRoZSBtb2R1bGUgY2FsbGVkICdleGFtcGxlJy4gSXQgd2FzIHByZXZpb3VzbHkgcG9zc2libGUgdG8gYWRkaXRpb25hbGx5CiAgICAgICAgICAgIGFjY2VzcyB0aGUgQVBJIGZyb20gdGhlIG1vZHVsZSBhdHRyaWJ1dGUgJ2V4YW1wbGUuX2V4YW1wbGUnLiBUaGUgbGF0dGVyIHdhcyBhbgogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgYW5kIGlzIG5vIGxvbmdlciBhdmFpbGFibGUuIEl0IHNob3VsZG4ndCBoYXZlIGJlZW4gdXNlZCwgYnV0CiAgICAgICAgICAgIGlmIG5lY2Vzc2FyeSBpdCBjYW4gYmUgcmVzdXJyZWN0ZWQgdXNpbmcgdGhlIG1vZHVsZWltcG9ydCBhdHRyaWJ1dGUgZGVzY3JpYmVkIGluIHRoZQogICAgICAgICAgICBQeXRob24gY2hhcHRlciBvZiB0aGUgZG9jdW1lbnRhdGlvbi4gSWYgYm90aCBtb2R1bGVzIGFyZSBwcm92aWRlZCBpbiBhIFB5dGhvbgogICAgICAgICAgICBwYWNrYWdlLCB0cnk6CgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJmcm9tIC4gaW1wb3J0IF9leGFtcGxlXG5mcm9tIC5fZXhhbXBsZSBpbXBvcnQgKiIpIGV4YW1wbGUKICAgICAgICAgICAgb3IgbW9yZSBnZW5lcmljYWxseToKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iZnJvbSAuIGltcG9ydCAkbW9kdWxlXG5mcm9tIC4kbW9kdWxlIGltcG9ydCAqIikgZXhhbXBsZQoKICAgICAgICAgICAgYW5kIGlmIGJvdGggYXJlIHByb3ZpZGVkIGFzIGdsb2JhbCBtb2R1bGVzLCB0cnk6CgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJpbXBvcnQgX2V4YW1wbGVcbmZyb20gX2V4YW1wbGUgaW1wb3J0ICoiKSBleGFtcGxlCiAgICAgICAgICAgIG9yIG1vcmUgZ2VuZXJpY2FsbHk6CiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImltcG9ydCAkbW9kdWxlXG5mcm9tICRtb2R1bGUgaW1wb3J0ICoiKSBleGFtcGxlCgogICAgICAgICAgICBUaGUgbW9kdWxlIGltcG9ydCBjb2RlIHNob3duIHdpbGwgYXBwZWFyIGluIHRoZSBleGFtcGxlLnB5IGZpbGUuCgoyMDE4LTExLTI0OiB2YWR6CiAgICAgICAgICAgICMxMzU4IEZpeCBoYW5kbGluZyBvZiBhYnN0cmFjdCBiYXNlIGNsYXNzZXMgbmVzdGVkIGluc2lkZSB0ZW1wbGF0ZXMKCiAgICAgICAgICAgIENvcnJlY3QgZGV0ZWN0aW5nIG9mIHdoZXRoZXIgYSBkZXJpdmVkIGNsYXNzIG1ldGhvZCBvdmVycmlkZXMgYSBwdXJlIHZpcnR1YWwKICAgICAgICAgICAgYmFzZSBjbGFzcyBtZXRob2Qgd2hlbiBib3RoIGNsYXNzZXMgYXJlIG5lc3RlZCBpbnNpZGUgYSB0ZW1wbGF0ZSBjbGFzczogdGhpcwogICAgICAgICAgICBub3RhYmx5IGRpZG4ndCB3b3JrIGNvcnJlY3RseSBmb3IgbWV0aG9kcyB0YWtpbmcgcGFyYW1ldGVycyBvZiB0aGUgYmFzZSBjbGFzcwogICAgICAgICAgICB0eXBlLgoKMjAxOC0xMS0yMjogcnVwZXJ0bmFzaAogICAgICAgICAgICBbUHl0aG9uXSAjMTI4MiBNYWtlIGdlbmVyYXRlZCBtb2R1bGUgcnVubmFibGUgdmlhIHB5dGhvbiAtbSAoUEVQIDM2NiBjb25mb3JtaW5nKQoKICAgICAgICAgICAgUHJldmlvdXNseSBhbnkgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyBpbiBhIHBhY2thZ2Ugd291bGQgZmFpbCB3aXRoIGFuIEltcG9ydEVycm9yCiAgICAgICAgICAgIHdoZW4gdXNpbmcgJ3B5dGhvbiAtbScgZm9yIGV4YW1wbGUgJ3B5dGhvbiAtbSBteXBrZy5teW1vZHVsZScuCgogICAgICAgICAgICBUaGlzIGZpeCBhbHNvIGFsbG93cyB0aGUgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlIHRvIGJlIHBsYWNlZCBpbnRvIGEgZGlyZWN0b3J5IGFuZAogICAgICAgICAgICB0aGVuIHJlbmFtZWQgX19pbml0X18ucHkgdG8gY29udmVydCB0aGUgbW9kdWxlIGludG8gYSBwYWNrYWdlIGFnYWluLiBUaGlzIGFiaWxpdHkKICAgICAgICAgICAgc3RvcHBlZCB3b3JraW5nIGluIHN3aWctMy4wLjkuIEhvd2V2ZXIsIG9ubHkgUHl0aG9uIDIuNyBvciAzLjMgYW5kIGxhdGVyIHdvcmsuIElmCiAgICAgICAgICAgIFB5dGhvbiAzLjIgc3VwcG9ydCBpcyBuZWVkZWQsIHVzZSBtb2R1bGVpbXBvcnQgaW4gJW1vZHVsZSB0byBjdXN0b21pc2UgdGhlIGltcG9ydAogICAgICAgICAgICBjb2RlLgoKMjAxOC0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgIzEzNDAgUmVtb3ZlIC1jcHBjYXN0IGFuZCAtbm9jcHBjYXN0IGNvbW1hbmQgbGluZSBvcHRpb25zICh0aGlzIHdhcyBhbiBvcHRpb24KICAgICAgICAgICAgYXZhaWxhYmxlIHRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgdGFyZ2V0cykuCgogICAgICAgICAgICBUaGUgLWNwcGNhc3Qgb3B0aW9uIGlzIHN0aWxsIHR1cm5lZCBvbiBieSBkZWZhdWx0LiBUaGUgLW5vY3BwY2FzdCBvcHRpb24KICAgICAgICAgICAgdG8gdHVybiBvZmYgdGhlIHVzZSBvZiBjKysgY2FzdHMgKGNvbnN0X2Nhc3QsIHN0YXRpY19jYXN0IGV0YykgaGFzIGJlZW4KICAgICAgICAgICAgcmVtb3ZlZC4gSG93ZXZlciwgZGVmaW5pbmcgU1dJR19OT19DUExVU1BMVVNfQ0FTVCB3aWxsIHN0aWxsIGdlbmVyYXRlIEMgY2FzdHMKICAgICAgICAgICAgaW5zdGVhZCBvZiBDKysgY2FzdHMgZm9yIEMrKyB3cmFwcGVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzNDAgUmVtb3ZlIC1vdXRwdXR0dXBsZSBhbmQgLW5vb3V0cHV0dHVwbGUgY29tbWFuZCBsaW5lIG9wdGlvbnMuCgogICAgICAgICAgICBCb3RoIHRoZSBjb21tYW5kIGxpbmUgYW5kICVtb2R1bGUgb3B0aW9ucyBvZiB0aGUgc2FtZSBuYW1lIGhhdmUgYmVlbgogICAgICAgICAgICByZW1vdmVkLiBUaGVzZSB3ZXJlIHVuZG9jdW1lbnRlZC4gVGhlIC1vdXRwdXR0dXBsZSBvcHRpb24gcmV0dXJuZWQgYQogICAgICAgICAgICBQeXRob24gdHVwbGUgaW5zdGVhZCBvZiBhIGxpc3QsIG1vc3RseSB0eXBpY2FsbHkgaW4gdGhlIE9VVFBVVAogICAgICAgICAgICB0eXBlbWFwIGltcGxlbWVudGF0aW9ucy4KCiAgICAgICAgICAgIEl0IHVuY2xlYXIgd2h5IGEgdHVwbGUgaW5zdGVhZCBvZiBhIGxpc3QgcmV0dXJuIHR5cGUgaXMgbmVlZGVkIGFuZAogICAgICAgICAgICBoZW5jZSB0aGlzIG9wdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFzIHBhcnQgb2YgdGhlIHNpbXBsaWZpY2F0aW9uIG9mCiAgICAgICAgICAgIHRoZSBTV0lHIFB5dGhvbiBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgU1dJRyA0LgoKMjAxOC0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzNDAgUmVtb3ZlIC1ub3Byb3h5aW1wb3J0IGNvbW1hbmQgbGluZSBvcHRpb24uCgogICAgICAgICAgICBUaGlzIG9wdGlvbiB0dXJuZWQgb2ZmIHRoZSBpbnNlcnRpb24gb2YgUHl0aG9uIGltcG9ydCBzdGF0ZW1lbnRzCiAgICAgICAgICAgIGRlcml2ZWQgZnJvbSBhICVpbXBvcnQgZGlyZWN0aXZlLiBGb3IgZXhhbXBsZSBnaXZlbjoKCiAgICAgICAgICAgICAgJW1vZHVsZSBtb2R1bGVfYgogICAgICAgICAgICAgICVpbXBvcnQgIm1vZHVsZV9hLmkiCgogICAgICAgICAgICB0aGVuIG1vZHVsZV9iLnB5IHdpbGwgY29udGFpbjoKCiAgICAgICAgICAgICAgaW1wb3J0IG1vZHVsZV9hCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMTAtMjk6IEFsZXhhbmRlckdhYnJpZWwKCSAgICBbUEhQXSBUaGUgZm9sbG93aW5nIFBIUDcgcmVzZXJ2ZWQga2V5d29yZHMgYXJlIG5vdyBvbmx5IHJlbmFtZWQgYnkKCSAgICBTV0lHIHdoZW4gdXNlZCBhcyBmdW5jdGlvbiBuYW1lcyBpbiB0aGUgQVBJIGJlaW5nIHdyYXBwZXI6CgkgICAgX19oYWx0X2NvbXBpbGVyIGFycmF5IGRpZSBlY2hvIGVtcHR5IGV2YWwgZXhpdCBpbmNsdWRlIGluY2x1ZGVfb25jZQoJICAgIGlzc2V0IGxpc3QgcHJpbnQgcmVxdWlyZSByZXF1aXJlX29uY2UgcmV0dXJuIHVuc2V0CgoyMDE4LTEwLTIyOiBvbGx5LHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMjYxICMxMzQwIFR1cm4gb24gbWFueSBvcHRpbWlzYXRpb24gb3B0aW9ucyBieSBkZWZhdWx0IGFuZCByYXRpb25hbGlzZSB0aGUKICAgICAgICAgICAgbnVtYmVyIG9mIGNvbW1hbmQgbGluZSBvcHRpb25zLgoKICAgICAgICAgICAgVGhlcmUgd2VyZSBhbiB1bm5lY2Vzc2FyeSBudW1iZXIgb2YgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIG1hbnkgb2YgdGhlc2UgaGF2ZSBub3cKICAgICAgICAgICAgYmVlbiByZW1vdmVkIGluIGEgZHJpdmUgZm9yIHNpbXBsaWZpY2F0aW9uLiBTb21lIHdlcmUgbmVlZGVkIHRvIHN1cHBvcnQgb2xkZXIgdmVyc2lvbnMKICAgICAgICAgICAgb2YgUHl0aG9uICgyLjYgYW5kIGVhcmxpZXIpLgoKICAgICAgICAgICAgTWFueSBvZiB0aGUgb3B0aW9ucyBjb3VsZCBiZSB0dXJuZWQgb24gaW5kaXZpZHVhbGx5IGFuZCB3aGVuIHVzaW5nIC1PLiBQcmV2aW91c2x5IC1PCiAgICAgICAgICAgIHJlc3VsdGVkIGluIHR1cm5pbmcgb24gYSBzZXQgb2Ygb3B0aW9uczoKCiAgICAgICAgICAgICAgLW1vZGVybiAtZmFzdGRpc3BhdGNoIC1ub3NhZmVjc3RyaW5ncyAtZnZpcnR1YWwgLW5vcHJveHlkZWwKICAgICAgICAgICAgICAtZmFzdHByb3h5IC1mYXN0aW5pdCAtZmFzdHVucGFjayAtZmFzdHF1ZXJ5IC1tb2Rlcm5hcmdzIC1ub2J1aWxkbm9uZQoKICAgICAgICAgICAgTm93IC1PIHJlc3VsdHMgaW4gdHVybmluZyBvbiB0aGlzIHJlZHVjZWQgc2V0OgoKICAgICAgICAgICAgICAtZmFzdGRpc3BhdGNoIC1mYXN0cHJveHkgLWZ2aXJ0dWFsCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIG5vdyBvbiBieSBkZWZhdWx0LCBhIGRlcHJlY2F0ZWQgd2FybmluZyBpcyBkaXNwbGF5ZWQgaWYgdGhleQogICAgICAgICAgICBhcmUgdXNlZDoKICAgICAgICAgICAgICAtZmFzdGluaXQgICAgIENsYXNzIGluaXRpYWxpc2F0aW9uIGNvZGUgZG9uZSBpbiBDL0MrKyByYXRoZXIgdGhhbiBpbiBQeXRob24gY29kZS4KICAgICAgICAgICAgICAtZmFzdHF1ZXJ5ICAgIFB5dGhvbiBkaWN0aW9uYXJ5IHVzZWQgZm9yIGxvb2t1cCBvZiB0eXBlcy4KICAgICAgICAgICAgICAtZmFzdHVucGFjayAgIEZhc3RlciB1bnBhY2tpbmcgb2YgZnVuY3Rpb24gYXJndW1lbnRzIGluIEMvQysrIHdyYXBwZXJzLgogICAgICAgICAgICAgIC1tb2Rlcm4gICAgICAgVXNlIFB5dGhvbiAyLjMgZmVhdHVyZXMgc3VjaCBhcyBvYmplY3QgYW5kIHByb3BlcnR5LgogICAgICAgICAgICAgIC1tb2Rlcm5hcmdzICAgVXNlIFB5dGhvbiAyLjMgQyBBUElzIGZvciB1bnBhY2tpbmcgYXJndW1lbnRzIGluIHR1cGxlcy4KICAgICAgICAgICAgICAtbm9wcm94eWRlbCAgIFN0b3AgZ2VuZXJhdGluZyBhIHByb3h5IF9fZGVsX18gbWV0aG9kIGZvciBiYWNrd2FyZHMgY29tcGF0aWJsaXR5LgogICAgICAgICAgICAgIC1zYWZlY3N0cmluZ3MgTm8gZGlzY2VybmFibGUgZGlmZmVyZW5jZQoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBvcHRpb25zIGhhdmUgYmVlbiByZW1vdmVkIGFsdG9nZXRoZXI6CiAgICAgICAgICAgICAgLWFsaWFzb2JqMAogICAgICAgICAgICAgIC1idWlsZG5vbmUKICAgICAgICAgICAgICAtY2xhc3NwdHIKICAgICAgICAgICAgICAtbmV3X3JlcHIKICAgICAgICAgICAgICAtbmV3cmVwcgogICAgICAgICAgICAgIC1ub2FsaWFzb2JqMAogICAgICAgICAgICAgIC1ub2J1aWxkbm9uZQogICAgICAgICAgICAgIC1ub2Nhc3Rtb2RlCiAgICAgICAgICAgICAgLW5vZGlydnRhYmxlCiAgICAgICAgICAgICAgLW5vZXh0cmFuYXRpdmUKICAgICAgICAgICAgICAtbm9mYXN0aW5pdAogICAgICAgICAgICAgIC1ub2Zhc3Rwcm94eQogICAgICAgICAgICAgIC1ub2Zhc3RxdWVyeQogICAgICAgICAgICAgIC1ub21vZGVybgogICAgICAgICAgICAgIC1ub21vZGVybmFyZ3MKICAgICAgICAgICAgICAtbm9vdXRwdXR0dXBsZQogICAgICAgICAgICAgIC1ub3NhZmVjc3RyaW5ncwogICAgICAgICAgICAgIC1vbGRfcmVwcgogICAgICAgICAgICAgIC1vbGRyZXByCiAgICAgICAgICAgICAgLXByb3h5ZGVsCgogICAgICAgICAgICAtbmV3X3Z3bSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgdGhlIC1uZXd2d20gYWxpYXMgaW5zdGVhZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0xMC0yMjogb2xseQogICAgICAgICAgICBbUHl0aG9uXSAjMTI2MSBSZW1vdmUgY29tbWFuZCBsaW5lIG9wdGlvbiBubyBsb25nZXIgbmVlZGVkIGFzIFB5dGhvbiAyLjMgYW5kIGVhcmxpZXIKICAgICAgICAgICAgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQ6CgogICAgICAgICAgICAgIC1jbGFzc2ljCgoyMDE4LTEwLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbRCwgR28sIEd1aWxlLCBMdWEsIE16c2NoZW1lLCBPY2FtbCwgUGVybDUsIFBocCwgU2NpbGFiLCBUY2xdCiAgICAgICAgICAgIEFsbG93IHdyYXBwaW5nIG9mIHN0ZDo6bWFwIHVzaW5nIG5vbi1kZWZhdWx0IGNvbXBhcmlzb24gZnVuY3Rpb24uCgoyMDE4LTEwLTA5OiB2YWR6CiAgICAgICAgICAgIFtKYXZhXSAjMTI3NCBBbGxvdyB3cmFwcGluZyBvZiBzdGQ6Om1hcCB1c2luZyBub24tZGVmYXVsdCBjb21wYXJpc29uIGZ1bmN0aW9uLgoKMjAxOC0xMC0wNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzExMjYgRml4IEMgZGVmYXVsdCBhcmd1bWVudHMgd2l0aCAtYnVpbHRpbiBhbmQgLWZhc3R1bnBhY2sgYW5kIC1tb2Rlcm5hcmdzLgogICAgICAgICAgICBQcm9ibGVtIG9jY3VycmVkIHdoZW4gdGhlcmUgaXMganVzdCBvbmUgKGRlZmF1bHRlZCkgcGFyYW1ldGVyIGluIHRoZSBwYXJhbWV0ZXIgbGlzdC4KCjIwMTgtMDktMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMzE5IEMrKzExIGhhc2ggdGFibGVzIGltcGxlbWVudGF0aW9uIGlzIGZpbmlzaGVkIG5vdyAoaW5jbHVkaW5nIGZvciAtYnVpbHRpbik6CiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0CiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldAoKMjAxOC0wOS0yMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHdoZW4gdXNpbmcgLWJ1aWx0aW4gYW5kIHdyYXBwaW5nIHN0ZDo6bWFwLCBzdGQ6OnNldCwgc3RkOjp1bm9yZGVyZWRfbWFwIG9yCiAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldCB0byBlbnN1cmUgX19jb250YWluc19fIGlzIGNhbGxlZC4gVGhpcyBpcyBhIHdyYXBwZXIgZm9yIHRoZSBTVEwKICAgICAgICAgICAgY29udGFpbmVyJ3MgZmluZCBtZXRob2QuIFdpdGhvdXQgaXQsIFB5dGhvbiB3aWxsIGRvIGl0cyBvd24gc2xvd2VyIHNlcXVlbmNlIHNlYXJjaC4KCjIwMTgtMDktMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBmdW5jdG9ycyAod3JhcHBlZCBhcyBfX2NhbGxfXykgd2hlbiB1c2luZyAtYnVpbHRpbiAtbW9kZXJuIC1mYXN0dW5wYWNrLgoKMjAxOC0wOS0wMjogYW5kcmVhcy5nYWVlcix0a3Jhc251a2hhCiAgICAgICAgICAgIFtQeXRob25dICMxMzIxIEZpeCBhc3NlcnQgaW4gUHlUdXBsZV9HRVRfU0laRSBpbiBkZWJ1ZyBpbnRlcnByZXRlciBidWlsZHMgb2YgcHl0aG9uLTMuNwogICAgICAgICAgICB3aGVuIGNhbGxpbmcgdHBfbmV3LgoKMjAxOC0wOS0wMTogQ2hyaXN0b3BoZXJIb2dhbgogICAgICAgICAgICBbR3VpbGVdICMxMjg4IEZpeCBnYXJiYWdlIGNvbGxlY3Rpb24gZm9yIGd1aWxlID49IDIuMC4xMi4KCjIwMTgtMDgtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMxMzE5IEMrKzExIGhhc2ggdGFibGVzIHN1cHBvcnQ6CiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0CiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldAogICAgICAgICAgICBpcyBub3cgY29tcGlsaW5nIGFuZCB3b3JraW5nIChzb3J0aW5nIHVzaW5nIC1idWlsdGluIG5vdCBmdWxseSBmdW5jdGlvbmFsIHlldCB0aG91Z2gpLgoKMjAxOC0wOC0yMDogd2thbGluaW4KICAgICAgICAgICAgIzEzMDUgRml4IG5lc3RlZCBzdHJ1Y3R1cmUgc3ltYm9sIHRhYmxlcyBpbiBDIG1vZGUgdG8gZml4IG1lbWJlciBuYW1lIGNvbmZsaWN0cwogICAgICAgICAgICBpbiBkaWZmZXJlbnQgc3RydWN0cyB3aXRoIHRoZSBzYW1lIG5lc3RlZCBzdHJ1Y3QgbWVtYmVyIG5hbWUuCgoyMDE4LTA4LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNjg4IEZpeCBtYWtlZmlsZSByZWN1cnNpb24gd2hlbiBydW5uaW5nIHB5dGhvbiB0ZXN0LXN1aXRlLgoKMjAxOC0wOC0xODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEzMTAgUmUtaW1wbGVtZW50IFB5dGhvbiAtZmFzdHByb3h5IG9wdGlvbi4KCiAgICAgICAgICAgIFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbiBmYWlsZWQgd2l0aCBQeXRob24gMyBhbmQgYWJzdHJhY3QgYmFzZSBjbGFzZXMuCiAgICAgICAgICAgIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gcmVwbGFjZXMgdGhlIFB5dGhvbiAyIGltcGxlbWVudGF0aW9uIHVzaW5nCiAgICAgICAgICAgIG5ldy5pbnN0YW5jZW1ldGhvZCB3aXRoIHRoZSBDIEFQSSBQeU1ldGhvZF9OZXcgdG8gbWF0Y2ggdGhlIGVxdWl2YWxlbnQgUHl0aG9uIDMKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlcyBQeUluc3RhbmNlTWV0aG9kX05ldy4KCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggcnVucyBzbGlnaHRseSBmYXN0ZXIuIFNlZSAjMTMxMC4KCjIwMTgtMDgtMTI6IGdtYXp6YW11dG8KICAgICAgICAgICAgW1B5dGhvbl0gIzEyODMgVXBkYXRlIHB5YnVmZmVyLmkgbGlicmFyeSB0byB1c2UgbmV3LXN0eWxlIFB5dGhvbiBidWZmZXIgQyBBUEkuCgoyMDE4LTA4LTEyOiBicmlhbmhhdHdvb2Qsd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdICMxMzAzICMxMzA0IEZpeCBjcmFzaCBpbiBkaXJlY3RvcnMgd2hlbiB1c2luZyBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgYW5kCiAgICAgICAgICAgIHBhc3NpbmcgTlVMTCBwb2ludGVycyBpbiBDKysgdG8gZGlyZWN0b3IgbWV0aG9kIG92ZXJsb2FkZWQgYW5kIGltcGxlbWVudGVkIGluIEphdmEuCgoyMDE4LTA4LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMTI5MyBJbXByb3ZlIFR5cGVFcnJvciBtZXNzYWdlIGluY29uc2lzdGVuY2llcyBiZXR3ZWVuIGRlZmF1bHQgYW5kIGZhc3RkaXNwYXRjaAogICAgICAgICAgICBtb2RlIHdoZW4gaGFuZGxpbmcgb3ZlcmxvYWRlZCBDKysgZnVuY3Rpb25zLiBQcmV2aW91c2x5IHRoZSBlcnJvciBtZXNzYWdlIGRpZCBub3QgYWx3YXlzCiAgICAgICAgICAgIGRpc3BsYXkgdGhlIHBvc3NpYmxlIEMvQysrIHByb3RvdHlwZXMgaW4gZmFzdGRpc3BhdGNoIG1vZGUuCgoyMDE4LTA4LTAyOiBmdXJ5bHlueCxqYWNvYndnaWxsZXNwaWUscDJrCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSAjMTI5MCwgIzk2OC4gQWRkIHN1cHBvcnQgZm9yIE5vZGVKUyB2ZXJzaW9ucyAyLTEwLgoKMjAxOC0wNy0zMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEyOTMgT3ZlcmxvYWRlZCBDKysgZnVuY3Rpb24gd3JhcHBlcnMgbm93IHJhaXNlIGEgVHlwZUVycm9yIGluc3RlYWQKICAgICAgICAgICAgb2YgTm90SW1wbGVtZW50ZWRFcnJvciB3aGVuIHRoZSB0eXBlcyBwYXNzZWQgYXJlIGluY29ycmVjdC4gVGhpcyBjaGFuZ2UgbWVhbnMKICAgICAgICAgICAgdGhlcmUgaXMgbm93IGNvbnNpc3RlbmN5IHdpdGggbm9uLW92ZXJsb2FkZWQgZnVuY3Rpb24gd3JhcHBlcnMgd2hpY2ggaGF2ZSBhbHdheXMKICAgICAgICAgICAgcmFpc2VkIFR5cGVFcnJvciB3aGVuIHRoZSBpbmNvcnJlY3QgdHlwZXMgYXJlIHBhc3NlZC4gVGhlIGVycm9yIG1lc3NhZ2UgcmVtYWlucwogICAgICAgICAgICB0aGUgc2FtZSBhbmQgaXMgZm9yIGV4YW1wbGUgbm93OgoKICAgICAgICAgICAgICBUeXBlRXJyb3I6IFdyb25nIG51bWJlciBvciB0eXBlIG9mIGFyZ3VtZW50cyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbiAnZicuCiAgICAgICAgICAgICAgICBQb3NzaWJsZSBDL0MrKyBwcm90b3R5cGVzIGFyZToKICAgICAgICAgICAgICAgICAgZihpbnQpCiAgICAgICAgICAgICAgICAgIGYoY2hhciBjb25zdCAqKQoKICAgICAgICAgICAgaW5zdGVhZCBvZjoKCiAgICAgICAgICAgICAgTm90SW1wbGVtZW50ZWRFcnJvcjogV3JvbmcgbnVtYmVyIG9yIHR5cGUgb2YgYXJndW1lbnRzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9uICdmJy4KICAgICAgICAgICAgICAgIFBvc3NpYmxlIEMvQysrIHByb3RvdHlwZXMgYXJlOgogICAgICAgICAgICAgICAgICBmKGludCkKICAgICAgICAgICAgICAgICAgZihjaGFyIGNvbnN0ICopCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDYtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM3MTggRml4IHB5dGhvbm5vbmR5bmFtaWMgZmVhdHVyZSBmb3IgbW9kZXJuIGNsYXNzZXMKCiAgICAgICAgICAgIEZpeGVzIG5vbmR5bmFtaWMgbW9kZSB3aGVuIGFuIGluc3RhbmNlIHZhcmlhYmxlIGlzIHNldCB3aXRoIHRoZSBzYW1lCiAgICAgICAgICAgIG5hbWUgYXMgYSBjbGFzcyB2YXJpYWJsZSBpbiBhIGNsYXNzIGRlcml2ZWQgZnJvbSBhIFNXSUcgcHJveHkgY2xhc3MuCiAgICAgICAgICAgIFRoaXMgY29ybmVyIGNhc2Ugc2V0IGFuIGluc3RhbmNlIHZhcmlhYmxlIGluc3RlYWQgb2YgcmFpc2luZyBhbiBBdHRyaWJ1dGVFcnJvci4KCiAgICAgICAgICAgIEFsc28gZml4ICVweXRob25ub25keW5hbWljIGluIFB5dGhvbiAzIHdpdGggLW1vZGVybi4gVGhlIG1ldGFjbGFzcwogICAgICAgICAgICBjb250YWluaW5nIHRoZSBpbXBsZW1lbnRhdGlvbiB3YXMgcHJldmlvdXNseSBub3QgYmVpbmcgYXBwbGllZCBpbiBQeXRob24gMy4KCjIwMTgtMDctMTc6IHBldHJtaXRyaWNoZXYsd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzEyNzUgIzEyNzkgSW5pdGlhbGl6ZSBmdW5jdGlvbi1sb2NhbCBzdGF0aWNzIChzaW5nbGV0b25zKSB0aGF0IGNhbGwgUHl0aG9uCiAgICAgICAgICAgIGNvZGUgZHVyaW5nIFB5dGhvbiBtb2R1bGUgaW5pdGlhbGl6YXRpb24gaW4gb3JkZXIgdG8gYXZvaWQgZGVhZGxvY2tzIHdpdGggc3Vic2VxdWVudAogICAgICAgICAgICBtdWx0aS10aHJlYWRlZCB1c2FnZS4KCjIwMTgtMDYtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzZWcgZmF1bHQgdXNpbmcgUHl0aG9uIDIgd2hlbiBwYXNzaW5nIGEgUHl0aG9uIHN0cmluZywgY29udGFpbmluZwogICAgICAgICAgICBpbnZhbGlkIHV0Zi04IGNvbnRlbnQsIHRvIGEgd3N0cmluZyBvciB3Y2hhciAqIHBhcmFtZXRlci4gQSBUeXBlRXJyb3IgaXMgdGhyb3duIGluc3RlYWQsIGVnOgoKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3dzdHJpbmcuaT4KICAgICAgICAgICAgICB2b2lkIGluc3RyaW5nKGNvbnN0IHN0ZDo6d3N0cmluZyYgcyk7CgogICAgICAgICAgICAgIGluc3RyaW5nKGIiaFx4ZTlsbG9vbyIpICMgUHl0aG9uCgoyMDE4LTA2LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMy43IHN1cHBvcnQ6IFJlcGxhY2UgdXNlIG9mIGRlcHJlY2F0ZWQgUHlVbmljb2RlX0dldFNpemUgd2l0aAogICAgICAgICAgICBQeVVuaWNvZGVfR2V0TGVuZ3RoIHRvIHJlbW92ZSBkZXByZWNhdGVkIHdhcm5pbmdzIGNvbXBpbGluZyB0aGUgQy9DKysgd3JhcHBlcnMuCgoyMDE4LTA2LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQeXRob24gMy43IHN1cHBvcnQ6IFRoZSAlcHl0aG9uYWJjIGZlYXR1cmUgaW4gcHlhYmMuaSBub3cgdXNlcyBiYXNlIGNsYXNzZXMKICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5hYmMuTXV0YWJsZVNlcXVlbmNlCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLk11dGFibGVNYXBwaW5nCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuYWJjLk11dGFibGVTZXQKICAgICAgICAgICAgaW5zdGVhZCBvZgogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLk11dGFibGVTZXF1ZW5jZQogICAgICAgICAgICAgIGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nCiAgICAgICAgICAgICAgY29sbGVjdGlvbnMuTXV0YWJsZVNldAogICAgICAgICAgICBhcyB0aGUgbGF0dGVyIGFyZSBkZXByZWNhdGVkIGluIFB5dGhvbiAzLjcgYW5kIGFyZSBkdWUgdG8gYmUgcmVtb3ZlZCBpbiBQeXRob24gMy44LgogICAgICAgICAgICBUaGUgY2xhc3NlcyBpbiBjb2xsZWN0aW9ucy5hYmMuKiBhcmUgYXZhaWxhYmxlIGZyb20gUHl0aG9uIDMuMyBvbndhcmRzLiBJZiB5b3UKICAgICAgICAgICAgcmVxdWlyZSBzdXBwb3J0IGZvciBQeXRob24gMy4yLCB0aGVuIGNvcHkgdGhlIHB5YWJjLmkgZmlsZSBhbmQgbW9kaWZ5IGJ5IHJlbW92aW5nCiAgICAgICAgICAgIHRoZSBmZXcgaW5zdGFuY2VzIG9mIHRoZSAuYWJjIHN1Yi1tb2R1bGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDYtMTI6IG9sbHksd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzcwMSBSZW1vdmUgc3VwcG9ydCBmb3IgUHl0aG9uIHZlcnNpb25zIDwgMi43IGFuZCAzLjAgYW5kIDMuMS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wNi0xMTogb2xseQogICAgICAgICAgICBbUHl0aG9uXSBGaXggbmV3IEdDQzggd2FybmluZ3MgaW4gZ2VuZXJhdGVkIGNvZGUgYnkgYXZvaWRpbmcgY2FzdHMKICAgICAgICAgICAgYmV0d2VlbiBpbmNvbXBhdGlibGUgZnVuY3Rpb24gdHlwZXMgd2hlcmUgcG9zc2libGUsIGFuZCBieQogICAgICAgICAgICBzdXBwcmVzc2luZyB0aGUgd2FybmluZyB3aGVuIGl0J3MgZHVlIHRvIHRoZSBkZXNpZ24gb2YgUHl0aG9uJ3MgQwogICAgICAgICAgICBBUEkuICBGaXhlcyAjMTI1OS4KCjIwMTgtMDYtMDg6IHBoaWxpcHBrcmFmdAoJICAgIFtQeXRob25dIFN0b3AgZXhwb3NpbmcgPENMQVNTPl9zd2lncmVnaXN0ZXIgdG8gUHl0aG9uLiAgSXQncyBub3QKCSAgICB1c2VmdWwgZm9yIHVzZXIgUHl0aG9uIGNvZGUgdG8gY2FsbCB0aGlzLCBhbmQgaXQganVzdCBjbHV0dGVycyB0aGUKCSAgICBBUEkgdW5uZWNlc3NhcmlseS4gIEZpeGVzICMxMjI1LgoKMjAxOC0wNi0wNzogY21mb2lsLCBrYWJiaSwgSmFtaWUgS2lya3BhdHJpY2ssIG1hcmtvazMxNCwgdmFkeiwgd3NmdWx0b24sIFlhbm4gRGlvcmNldAogICAgICAgICAgICAjMTcwIERveHlnZW4gZG9jdW1lbnRhdGlvbiBzdXBwb3J0IGFkZGVkLiBUaGlzIGFsbG93cyB0cmFuc2xhdGlvbiBvZiBEb3h5Z2VuIGNvbW1lbnRzCiAgICAgICAgICAgIGludG8gSmF2YURvYyBhbmQgUHlEb2MgZG9jdW1lbnRhdGlvbi4gSXQgaXMgZW5hYmxlZCB2aWEgdGhlIC1kb3h5Z2VuIGNvbW1hbmQgbGluZQogICAgICAgICAgICBvcHRpb24uIFNlZSB0aGUgRG94eWdlbi5odG1sIGNoYXB0ZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCgoyMDE4LTA2LTA3OiBvbGx5CgkgICAgW1BIUF0gV2UndmUgZmluYWxseSByZW1vdmVkIHN1cHBvcnQgZm9yICVwcmFnbWEocGhwNCkgd2hpY2ggd2FzCgkgICAgZGVwcmVjYXRlZCBiYWNrIGluIDIwMDguICBVc2UgJXByYWdtYShwaHApIGluc3RlYWQsIHdoaWNoIGhhcyBiZWVuCgkgICAgc3VwcG9ydGVkIHNpbmNlIGF0IGxlYXN0IDIwMDUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTgtMDYtMDc6IG9sbHkKCSAgICBbUEhQNV0gU3VwcG9ydCBmb3IgUEhQNSBoYXMgYmVlbiByZW1vdmVkLiAgUEhQNSBpcyBubyBsb25nZXIKCSAgICBhY3RpdmVseSBzdXBwb3J0ZWQgYnkgdGhlIFBIUCBkZXZlbG9wZXJzIGFuZCBzZWN1cml0eSBzdXBwb3J0IGZvcgoJICAgIGl0IGVuZHMgY29tcGxldGVseSBhdCB0aGUgZW5kIG9mIDIwMTgsIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZQoJICAgIHRvIGluY2x1ZGUgc3VwcG9ydCBmb3IgaXQgaW4gdGhlIHVwY29taW5nIFNXSUcgNC4wLjAgcmVsZWFzZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wNi0wNjogb2xseQoJICAgIFtMdWFdIEltcHJvdmUgY29uZmlndXJlIHByb2JlcyBmb3IgTHVhIGhlYWRlcnMgYW5kIGxpYnMgdXNlZCBpbiB0ZXN0c3VpdGUuCgoyMDE4LTA1LTE1OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIGFkZCBzdXBwb3J0IGZvciB2ZXJzaW9uIDQuNAogICAgICAgICAgICAtIFNob3VsZCBub3QgaW50cm9kdWNlIGFueSB1c2VyLXZpc2libGUgaW5jb21wYXRpYmlsaXRpZXMKCjIwMTgtMDUtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRCwgSmF2YV0gRml4IGxvb2t1cCBvZiBjc2NvbnN0cnVjdCwgZGNvbnN0cnVjdCBhbmQgamF2YWNvbnN0cnVjdCB0eXBlbWFwcy4KICAgICAgICAgICAgVGhlIEMrKyBuYW1lc3BhY2Ugd2FzIHByZXZpb3VzbHkgaWdub3JlZCB3aGVuIGxvb2tpbmcgdXAgdGhlIHR5cGVtYXAuCgoyMDE4LTA1LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gRml4IGdlbmVyYXRlZCBDKysgY29kZSB3aGVuIHVzaW5nICVuc3BhY2Ugb24gbmFtZXNwYWNlcyB0aGF0IGFyZSBtb3JlCiAgICAgICAgICAgIHRoYW4gdHdvIGxldmVscyBkZWVwLgoKMjAxOC0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzEyNTEgQWRkIHN1cHBvcnQgZm9yIEMrKzE3IG5lc3RlZCBuYW1lc3BhY2UgZGVmaW5pdGlvbnMsCiAgICAgICAgICAgIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIG5hbWVzcGFjZSBBOjpCIHsgLi4uIH0KCjIwMTgtMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRCwgSmF2YV0gQWRkIHN1cHBvcnQgc28gdGhhdCB0aGUgJWNzbWV0aG9kbW9kaWZpZXJzLCAlZG1ldGhvZG1vZGlmaWVycywKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgY2FuIG1vZGlmeSB0aGUgbWV0aG9kIG1vZGlmaWVycyBmb3IgdGhlIGRlc3RydWN0b3Igd3JhcHBlcnMKICAgICAgICAgICAgaW4gdGhlIHByb3h5IGNsYXNzOiBkaXNwb3NlLCBEaXNwb3NlLCBkZWxldGUuIFdpdGggdGhpcyBmZWF0dXJlLCBpdCBpcyBub3cgcG9zc2libGUKICAgICAgICAgICAgdG8gbWFrZSBhIEMjIHByb3h5IGNsYXNzIHNlYWxlZCwgZWcgd2hlbiB3cmFwcGluZyBhIGNsYXNzIFgsIHRoZSB2aXJ0dWFsIG1ldGhvZCBtb2RpZmllcnMKICAgICAgICAgICAgY2FuIGJlIHJlbW92ZWQgdXNpbmc6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIFggInB1YmxpYyBzZWFsZWQgY2xhc3MiCiAgICAgICAgICAgICAgJWNzbWV0aG9kbW9kaWZpZXJzIFg6On5YICJwdWJsaWMgLyp2aXJ0dWFsKi8iOwoKMjAxOC0wNC0xODogb2xseQoJICAgIFtQeXRob25dIFN1cHByZXNzIG5ldyBweWNvZGVzdHlsZSB3YXJuaW5nOgoJICAgIEUyNTIgbWlzc2luZyB3aGl0ZXNwYWNlIGFyb3VuZCBwYXJhbWV0ZXIgZXF1YWxzCgoyMDE4LTA0LTA3OiBnb2F0c2hyaWVrCiAgICAgICAgICAgIFtSdWJ5XSAjMTIxMyBGaXggcnVieSAlYWxpYXMgZGlyZWN0aXZlIGZvciBnbG9iYWwgQy9DKysgZnVuY3Rpb25zLgoKMjAxOC0wNC0wMzogb2xseQoJICAgIFtSdWJ5XSBGaXggdG8gcGFzcyBRbmlsIGluc3RlYWQgb2YgTlVMTCB0byByYl9mdW5jYWxsKCksIHdoaWNoIHNpbGVuY2VzIEdDQwoJICAgIC1XY29udmVyc2lvbi1udWxsIHdhcm5pbmcgKG9uIGJ5IGRlZmF1bHQgd2l0aCByZWNlbnQgR0NDKS4KCjIwMTgtMDMtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMTE4NCBGaXggc3dpZ1JlbGVhc2VPd25lcnNoaXAoKSBhbmQgc3dpZ1Rha2VPd25lcnNoaXAoKSByZWdyZXNzaW9uCiAgICAgICAgICAgIGZvciBub24tZGlyZWN0b3IgY2xhc3Nlcy4gUmVzdG9yZXMgYSBkeW5hbWljX2Nhc3Qgd2hpY2ggd2FzIHByZXZpb3VzbHkgcmVtb3ZlZC4KCjIwMTgtMDMtMDc6IGxsb25naQoJICAgIEdpdGh1YiBQUiAjMTE2NiAtIEZpeCBwcmVwcm9jZXNzb3IgaGFuZGxpbmcgb2YgbWFjcm9zIHdpdGggY29tbWFzCgkgICAgaW4gYSAvLyBjb21tZW50LgoKMjAxOC0wMi0xODogSlBFV2RldgogICAgICAgICAgICBQYXRjaCAjMTE2NCAtIEFkZCBzdXBwb3J0IGZvciBhIGNvbW1hbmQtbGluZSBvcHRpb25zIGZpbGUsIGFsc28gc29tZXRpbWVzCiAgICAgICAgICAgIGNhbGxlZCBhIHJlc3BvbnNlIGZpbGUuIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBjb21tYW5kLWxpbmUgb3B0aW9ucyBleGNlZWQKICAgICAgICAgICAgdGhlIHN5c3RlbSBjb21tYW5kLWxpbmUgbGVuZ3RoIGxpbWl0LiBUbyB1c2UsIHB1dCB0aGUgY29tbWFuZC1saW5lIG9wdGlvbnMKICAgICAgICAgICAgaW50byBhIGZpbGUsIHRoZW4gcHJvdmlkZSB0aGUgZmlsZSBuYW1lIHByZWZpeGVkIHdpdGggQCwgZm9yIGV4YW1wbGUgdXNpbmcKICAgICAgICAgICAgYSBmaWxlIGNhbGxlZCBhcmdzLnR4dDoKCiAgICAgICAgICAgICAgc3dpZyBAYXJncy50eHQKCjIwMTgtMDItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSAjMTE4NyBGaXggY29tcGlsYXRpb24gZXJyb3Igd3JhcHBpbmcgc3RkOjpjb21wbGV4IHZpYQogICAgICAgICAgICBzdGRfY29tcGxleC5pLgoKMjAxOC0wMS0zMDogc21hcmNoZXR0bwogICAgICAgICAgICBbU2NpbGFiXSBhZGQgdHlwZSBuYW1lIGFyZ3VtZW50IGluIFNXSUdfcHRyKCkgZnVuY3Rpb24gdG8gY2FzdCBmcm9tIHBvaW50ZXIgYWRkcmVzcyB0byB0eXBlZCBwb2ludGVycwoKMjAxOC0wMS0xNjogd3NmdWx0b24KICAgICAgICAgICAgRXhwcmVzc2lvbnMgZm9sbG93aW5nIGEgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBtdXN0IG5vdyBiZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZQogICAgICAgICAgICBvciBub24tbnVtZXJpYyBjaGFyYWN0ZXJzLiBUaGlzIHN5bnRheCBjaGFuZ2UgbWFrZXMgdGhlIFNXSUcgcHJlcHJvY2Vzc29yIHdvcmsgbGlrZQogICAgICAgICAgICB0aGUgQyBwcmVwcm9jZXNzb3IgaW4gdGhpcyBhcmVhLgoKICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgY29kZSB1c2VkIGJlIGFjY2VwdGVkIGFzIHZhbGlkIHN5bnRheDoKICAgICAgICAgICAgICAjaWYxCiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMTIzCiAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBOb3cgeW91IGdldCBhbiBlcnJvcjoKICAgICAgICAgICAgICBleGFtcGxlLmg6MTogRXJyb3I6IFVua25vd24gU1dJRyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlOiBpZjEgKGlmIHRoaXMgaXMgYSBibG9jayBvZgogICAgICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSBjb2RlLCBkZWxpbWl0IGl0IHdpdGggJXsgYW5kICV9KQogICAgICAgICAgICAgIGV4YW1wbGUuaDozOiBFcnJvcjogRXh0cmFuZW91cyAjZW5kaWYuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIHRoZSBjb3JyZWN0IHN5bnRheDoKICAgICAgICAgICAgICAjaWYgMQogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDEyMwogICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBvZiBjb3Vyc2UgYWxzbyB3b3JrczoKICAgICAgICAgICAgICAjaWYoMSkKICAgICAgICAgICAgICAjZGVmaW5lIEFCQyAxMjMKICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxOC0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGlzc3VlICMxMTgzLiBGbG9hdGluZyBwb2ludCBleGNlcHRpb24gZXZhbHVhdGluZyBwcmVwcm9jZXNzb3IgZXhwcmVzc2lvbnMKICAgICAgICAgICAgcmVzdWx0aW5nIGluIGRpdmlzaW9uIGJ5IHplcm8uCgoyMDE4LTAxLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaXNzdWUgIzExNzIuIFNlZyBmYXVsdCBwYXJzaW5nIGludmFsaWQgZXhwb25lbnRzIGluIHRoZSBwcmVwcm9jZXNzb3IuCgoyMDE4LTAxLTEyOiBMaXJ5bmEKICAgICAgICAgICAgW0MjXSBQYXRjaCAjMTEyOC4gQWRkIFRvQXJyYXkgZnVuY3Rpb24gdG8gc3RkOjp2ZWN0b3Igd3JhcHBlcnMuCgoyMDE4LTAxLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGlzc3VlICMxMTU2LiBBZGQgbWlzc2luZyB0aHJvd3MgY2xhdXNlIGZvciBpbnRlcmZhY2VzIHdoZW4gdXNpbmcgdGhlCiAgICAgICAgICAgICVpbnRlcmZhY2UgZmFtaWx5IG9mIG1hY3Jvcy4KCjIwMTgtMDEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkZWZhdWx0IGFyZ3VtZW50cyB1c2luZyBleHByZXNzaW9ucyBjb250YWluaW5nIC0+IHN5bnRheCBlcnJvci4gUHJvYmxlbSByZXBvcnRlZCBvbgogICAgICAgICAgICBzd2lnLXVzZXIgbWFpbGluZyBsaXN0LgoKMjAxNy0xMi0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUmVwbGFjZSBwZXA4IHdpdGggcHljb2Rlc3R5bGUgZm9yIGNoZWNraW5nIHRoZSBQeXRob24gY29kZSBzdHlsZSB3aGVuCiAgICAgICAgICAgIHJ1bm5pbmcgUHl0aG9uIHRlc3RzLgoKMjAxNy0xMi0zMDogZGF2ZWRpc3NpYW4KICAgICAgICAgICAgRml4ZWQgYSBzeW1ib2wgbG9va3VwIGlzc3VlIHdoZW4gZW5jb3VudGVyaW5nIGEgdHlwZWRlZiBvZiBhIHN5bWJvbCBmcm9tIHRoZSB0YWcKICAgICAgICAgICAgbmFtZXNwYWNlIHRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlIHdoZW4gdGhlIG5hbWVzIGFyZSBpZGVudGljYWwsIHN1Y2ggYXMgJ3R5cGVkZWYKICAgICAgICAgICAgc3RydWN0IEZvbyBGb287Jy4KCjIwMTctMTItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBhZGQgbWlzc2luZyBzdXBwb3J0IGZvciBkaXJlY3RvcmZyZWUgdHlwZW1hcHMuCgoyMDE3LTEyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjMTE2NyBGaXggZGlyZWN0b3JvdXQgdHlwZW1hcHMgd2hpY2ggd2VyZSBjYXVzaW5nIHVuZGVmaW5lZCBiZWhhdmlvdXIgd2hlbgogICAgICAgICAgICByZXR1cm5pbmcgcG9pbnRlcnMgYnkgcmVmZXJlbmNlLgoKMjAxNy0xMi0wODogb2xseQoJICAgIFtQSFBdIFVzZSBaRU5EX01PRFVMRV9HTE9CQUxTX0FDQ0VTU09SIHRvIGFjY2VzcyBnbG9iYWxzIHNvIHRoZQoJICAgIGdlbmVyYXRlZCBjb2RlIGJ1aWxkcyB3aGVuIFBIUCB3YXMgYnVpbHQgd2l0aCBaVFMgZW5hYmxlZC4KCjIwMTctMTItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBtaXNzaW5nIGNoZWNrcyBmb3IgZmFpbHVyZXMgaW4gY2FsbHMgdG8gUHlVbmljb2RlX0FzVVRGOFN0cmluZy4gUHJldmlvdXNseSBhCiAgICAgICAgICAgIHNlZyBmYXVsdCBjb3VsZCBvY2N1ciB3aGVuIHBhc3NpbmcgaW52YWxpZCBVVEY4IHN0cmluZ3MgKGxvdyBzdXJyb2dhdGVzKSwgZWcgcGFzc2luZwogICAgICAgICAgICB1Ilx1ZGNmZiIgdG8gdGhlIEMgbGF5ZXIgKFB5dGhvbiAzKS4KCjIwMTctMTEtMjQ6IGpvZXF1YW50CgkgICAgW1JdIEZpeCAjMTEyNCBhbmQgcmV0dXJuIFJfTmlsVmFsdWUgZm9yIG51bGwgcG9pbnRlcnMKCjIwMTctMTEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBkaXJlY3RvciBleGNlcHRpb24gaGFuZGxpbmcgaW1wcm92ZW1lbnRzLgoKICAgICAgICAgICAgV2hlbiBhIGRpcmVjdG9yIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uIGFuZCBpdCBpcyBjYXVnaHQgYnkgRGlyZWN0b3JFeGNlcHRpb24KICAgICAgICAgICAgYW5kIHBhc3NlZCBiYWNrIHRvIEphdmEgdXNpbmcgU3dpZzo6RGlyZWN0b3JFeGNlcHRpb246OnRocm93RXhjZXB0aW9uLCB0aGUgSmF2YQogICAgICAgICAgICBzdGFjayB0cmFjZSBub3cgY29udGFpbnMgdGhlIG9yaWdpbmFsIHNvdXJjZSBsaW5lIHRoYXQgdGhyZXcgdGhlIGV4Y2VwdGlvbi4KCiAgICAgICAgICAgIERlcHJlY2F0ZSBTd2lnOjpEaXJlY3RvckV4Y2VwdGlvbjo6cmFpc2VKYXZhRXhjZXB0aW9uLCBwbGVhc2UgcmVwbGFjZSB1c2FnZSB3aXRoCiAgICAgICAgICAgIFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uOjp0aHJvd0V4Y2VwdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIEMrKzExIHJlZi1xdWFsaWZpZXJzIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMjAxNy0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdlbmVyYXRlZCBjb2RlIHdoZW4gdXNpbmcgZGlyZWN0b3JzIGFuZCBtZXRob2RzIHJldHVybmluZyBjb25zdCByZWYgcG9pbnRlcnMuCgoyMDE3LTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEQsIEphdmEsIE9jdGF2ZSwgUiwgU2NpbGFiXSBQb3J0IGRpcmVjdG9yIHR5cGVtYXBzIHRvIHRoZXNlIGFkZGl0aW9uYWwgbGFuZ3VhZ2VzLgogICAgICAgICAgICBJc3N1ZSAjNzAwLgoKMjAxNy0xMC0yNjogcmFkYXJzYXQxCiAgICAgICAgICAgIFtSdWJ5IFB5dGhvbl0gUGF0Y2ggIzEwMjkgLSBDb3JyZWN0IGhhbmRsaW5nIG9mIG51bGwgdXNpbmcgZGlyZWN0b3JzIGFuZCBzaGFyZWRfcHRyLgoKMjAxNy0xMC0xMDogam9lcXVhbnQKCSAgICBbUl0gcGFzcyBlbnVtIGV4cHJlc3Npb25zIHRvIFIuICBUaGlzIHdpbGwgZ2VuZXJhdGUKCSAgICBpbmNvcnJlY3QgZmlsZXMgd2hlbiB0aGVyZSBpcyBhbiBhcml0aG1ldGljIGV4cHJlc3Npb24KCSAgICBpbiB0aGUgZW51bSwgYnV0IHRoaXMgaXMgYmV0dGVyIHRoYW4gc2lsZW50bHkgZ2VuZXJhdGluZwoJICAgIGluY29ycmVjdCBjb2RlCgoyMDE3LTEwLTA5OiBvbGx5CgkgICAgW1BIUF0gRml4IGluY29ycmVjdCB3cmFwcGVyIGNvZGUgZ2VuZXJhdGVkIHdoZW4gdGhlcmUncyBhCgkgICAgY29tYmluYXRpb24gb2Ygb3ZlcmxvYWRpbmcsIHBhcmFtZXRlcnMgd2l0aCBhIGRlZmF1bHQgdmFsdWUKCSAgICBhbmQgJW5ld29iamVjdC4gIEZpeGVzIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzEzNTAvCgoyMDE3LTEwLTA5OiBvbGx5CgkgICAgUmVtb3ZlIEdDSiBzdXBwb3J0LiAgSXQgaXNuJ3QgaW4gYSBnb29kIHN0YXRlIGFuZCBkb2Vzbid0IHNlZW0gdG8KCSAgICBiZSB1c2VkLCBhbmQgR0NDNyBkcm9wcGVkIEdDSi4gIENsb3NlcwoJICAgIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9idWdzLzgyMy8KCjIwMTctMTAtMDc6IG9sbHkKCSAgICBGaXggcHJlcHJvY2Vzc29yIGhhbmRsaW5nIG9mIGVtcHR5IG1hY3JvIGFyZ3VtZW50cyB0byBtYXRjaCB0aGF0IG9mCgkgICAgQy9DKysgY29tcGlsZXJzLiAgRml4ZXMgaXNzdWUgIzExMTEgYW5kCgkgICAgaHR0cHM6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9zd2lnL2J1Z3MvODI2LwoKMjAxNy0xMC0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzExMDguIEZpeCBwbGF0Zm9ybSBpbmNvbnNpc3RlbmN5IGluIFB5dGhvbiBkZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nLgogICAgICAgICAgICAzMiBiaXQgYW5kIDY0IGJpdCBjb21waWxlZCB2ZXJzaW9ucyBvZiBTV0lHIGdlbmVyYXRlZCBkaWZmZXJlbnQgUHl0aG9uIGZpbGVzCiAgICAgICAgICAgIHdoZW4gZGVmYXVsdCBhcmd1bWVudHMgd2VyZSBvdXRzaWRlIHRoZSByYW5nZSBvZiAzMiBiaXQgc2lnbmVkIGludGVnZXJzLgogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcmd1bWVudHMgc3BlY2lmaWVkIGluIFB5dGhvbiBhcmUgbm93IG9ubHkgdGhvc2UgdGhhdCBhcmUgaW4gdGhlCiAgICAgICAgICAgIHJhbmdlIG9mIGEgMzIgYml0IHNpZ25lZCBpbnRlZ2VyLCBvdGhlcndpc2UgdGhlIGRlZmF1bHQgaXMgb2J0YWluZWQgZnJvbSBDL0MrKyBjb2RlLgoKMjAxNy0xMC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggc3RkOjpjb21wbGV4IHR5cGVzIHBhc3NlZCBieSB2YWx1ZS4KCjIwMTctMTAtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhc2NyaXB0LCBQeXRob24sIFJ1YnldIElzc3VlICM3MzIgLSBNaXNzaW5nIHR5cGUgaW5mb3JtYXRpb24gZm9yIHN0ZDo6Y29tcGxleAogICAgICAgICAgICBpbiBzdGRfY29tcGxleC5pIG1lYW50IHRoYXQgcHJldmlvdXNseSBzdGQ6OmNvbXBsZXggYWx3YXlzIGhhZCB0byBiZSBmdWxseSBxdWFsaWZpZWQKICAgICAgICAgICAgaW4gb3JkZXIgdG8gYmUgd3JhcHBlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSB0eXBlbWFwcy4KCjIwMTctMTAtMDE6IGpvZXF1YW50CiAgICAgICAgICAgIGFsbG93IFIgcGFja2FnZSBuYW1lcyB3aXRoIGRvY3MKCSAgICBhbGxvd2luZyBtdWx0aXBsZSBnZXQgYWNjZXNzb3JzIGluIFIKCSAgICBmaXggc21hcnQtcG9pbnRlciBhbmQgTkFNRVNQQUNFIHN1cHBvcnQKCSAgICBjb25zdHJ1Y3RvcnMgbm93IHJldHVybmluZyBzbWFydCBwb2ludGVycyAoaWYgY2xhc3MKCSAgICBkZWNsYXJlZCBhcyBzdWNoKQoJICAgIHNtYXJ0LXBvaW50ZXIgY2xhc3NlcyBkZXJpdmluZyBmcm9tIHBhcmVudCBzbWFydC1wb2ludGVycwoKMjAxNy0wOS0yOTogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzExMDAgLSBBbGxvdyBhbiBpbnN0YW50aWF0ZWQgdGVtcGxhdGUgdG8gaGF2ZSB0aGUgc2FtZSBuYW1lIGluIHRoZSB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2UgYXMgdGhlIEMrKyB0ZW1wbGF0ZSBuYW1lLCBmb3IgZXhhbXBsZSwgdGhpcyBpcyBub3cgcG9zc2libGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBYIHsgLi4uIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFgpIFg8aW50PjsKCjIwMTctMDktMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMDk4LiBGaXggb3ZlcmxvYWRpbmcgb2Ygc2hhcmVkX3B0ciB3aXRoIHVuZGVybHlpbmcgcG9pbnRlciB0eXBlcywgZWc6CgogICAgICAgICAgICAgIHZvaWQgbShzdGQ6OnNoYXJlZF9wdHI8VD4gcCk7CiAgICAgICAgICAgICAgdm9pZCBtKFQgJnApOwogICAgICAgICAgICAgIHZvaWQgbShUICpwKTsKCiAgICAgICAgICAgIE9ubHkgdGhlIGZpcnN0IG1ldGhvZCBpcyB3cmFwcGVkIGFuZCB0aGUgb3RoZXJzIGFyZSBpZ25vcmVkL3NoYWRvd2VkLgogICAgICAgICAgICBUaGUgaW1wbGVtZW50YXRpb24gaXMgZG9uZSB2aWEgYSBuZXcgYXR0cmlidXRlIGluIHRoZSAndHlwZWNoZWNrJyB0eXBlbWFwIGNhbGxlZAogICAgICAgICAgICAnZXF1aXZhbGVudCcuIElmIHNwZWNpZmllZCwgaXQgbXVzdCBjb250YWluIHRoZSBlcXVpdmFsZW50IHBvaW50ZXIgdHlwZSBmb3Igb3ZlcmxvYWRpbmcKICAgICAgICAgICAgYW5kIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHRoZSBzcGVjaWFsIFNXSUdfVFlQRUNIRUNLX1BPSU5URVIgcHJlY2VkZW5jZSBsZXZlbC4KICAgICAgICAgICAgVGhlIHNoYXJlZF9wdHIgJ3R5cGVjaGVjaycgdHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIGFjY29yZGluZ2x5LgogICAgICAgICAgICBIZXJlIGlzIGEgc2ltcGxpZmllZCB2ZXJzaW9uOgoKICAgICAgICAgICAgICAldHlwZW1hcCh0eXBlY2hlY2ssIHByZWNlZGVuY2U9U1dJR19UWVBFQ0hFQ0tfUE9JTlRFUiwgZXF1aXZhbGVudD0iVCAqIikKICAgICAgICAgICAgICAgIFQsCiAgICAgICAgICAgICAgICBUIENPTlNUICYsCiAgICAgICAgICAgICAgICBUIENPTlNUICosCiAgICAgICAgICAgICAgICBUICpDT05TVCYsCiAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8IFQgPiwKICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjwgVCA+ICYsCiAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8IFQgPiAqLAogICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPCBUID4gKiYKICAgICAgICAgICAgICAgIHsgLi4uIH0KCiAgICAgICAgICAgIE92ZXJsb2FkaW5nIHdpdGggYW55IG9mIHRoZXNlIHR5cGVzIHdpbGwgcmVzdWx0IGluIFNXSUcgaWdub3JpbmcgYWxsIGJ1dCB0aGUgZmlyc3QKICAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2QgYnkgZGVmYXVsdC4gV2l0aG91dCB0aGUgJ2VxdWl2YWxlbnQnIGF0dHJpYnV0ZSwgd3JhcHBpbmcgdGhlIG92ZXJsb2FkZWQKICAgICAgICAgICAgbWV0aG9kcyByZXN1bHRlZCBpbiB0eXBlcyBiZWluZyBzaGFkb3dlZCAoc2NyaXB0aW5nIGxhbmd1YWdlcykgb3IgY29kZSB0aGF0IGRpZCBub3QKICAgICAgICAgICAgY29tcGlsZSAoc3RhdGljYWxseSB0eXBlZCBsYW5ndWFnZXMpLgoKMjAxNy0wOS0xOTogZnV0YXR1a2kKICAgICAgICAgICAgW1B5dGhvbl0gIzEwMDMgQWRkIC0td2l0aC0ydG8zPS9wYXRoL3RvLzJ0bzMgb3B0aW9uIHRvIGNvbmZpZ3VyZS4KCjIwMTctMDktMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlIHByb21vdGlvbiB3cmFwcGluZyBjb25zdGFudCBleHByZXNzaW9ucyBvZiB0aGUgZm9ybToKICAgICAgICAgICAgICAjIGRlZmluZSBFWFBSX01JWEVEMSAgICAoMHg4MCArIDExLjEpIC0gMQogICAgICAgICAgICBUaGlzIHdhcyBwcmV2aW91c2x5IGFuIGludGVncmFsIHR5cGUgaW5zdGVhZCBvZiBhIGZsb2F0aW5nIHBvaW50IHR5cGUuCgoyMDE3LTA5LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIGNvbnN0YW50IGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgd2NoYXJfdCBMIGxpdGVyYWxzIHN1Y2ggYXM6CiAgICAgICAgICAgICAgIyBkZWZpbmUgX19XQ0hBUl9NQVggICAgKDB4N2ZmZmZmZmYgKyBMJ1wwJykKICAgICAgICAgICAgICAjIGRlZmluZSBfX1dDSEFSX01JTiAgICAoLV9fV0NIQVJfTUFYIC0gMSkKCjIwMTctMDktMTA6IG1sYW1hcnJlCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMxMDgzLiBEZWZpbmVfREVCVUcgdG8gMSB0byBkbyBleGFjdGx5IGxpa2UgVmlzdWFsIFN0dWRpbwogICAgICAgICAgICAvTERkLCAvTURkIG9yIC9NVGQgY29tcGlsZXIgb3B0aW9ucy4KCjIwMTctMDgtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlICMxMDU5LiBBZGQgc3VwcG9ydCBmb3IgQysrMTEgcmVmLXF1YWxpZmllcnMgb24gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgICBNZW1iZXJzIHdpdGggbHZhbHVlIHJlZi1xdWFsaWZpZXJzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHN0cnVjdCBSUSB7CiAgICAgICAgICAgICAgICB2b2lkIG0xKGludCB4KSAmOwogICAgICAgICAgICAgICAgdm9pZCBtMihpbnQgeCkgY29uc3QgJjsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgYXJlIHdyYXBwZWQgbGlrZSBhbnkgb3RoZXIgbWVtYmVyIGZ1bmN0aW9uLiBNZW1iZXIgZnVuY3Rpb25zIHdpdGggcnZhbHVlIHJlZi1xdWFsaWZpZXJzCiAgICAgICAgICAgIGFyZSBpZ25vcmVkIGJ5IGRlZmF1bHQsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHN0cnVjdCBSUSB7CiAgICAgICAgICAgICAgICB2b2lkIG0zKGludCB4KSAmJjsKICAgICAgICAgICAgICAgIHZvaWQgbTQoaW50IHgpIGNvbnN0ICYmOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIGV4YW1wbGUuaTo3OiBXYXJuaW5nIDQwNTogTWV0aG9kIHdpdGggcnZhbHVlIHJlZi1xdWFsaWZpZXIgbTMoaW50KSAmJiBpZ25vcmVkLgogICAgICAgICAgICAgIGV4YW1wbGUuaTo4OiBXYXJuaW5nIDQwNTogTWV0aG9kIHdpdGggcnZhbHVlIHJlZi1xdWFsaWZpZXIgbTQoaW50KSBjb25zdCAmJiBpZ25vcmVkLgoKICAgICAgICAgICAgVGhlc2UgY2FuIGJlIHVuaWdub3JlZCBhbmQgZXhwb3NlZCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLCBzZWUgZnVydGhlciBkb2N1bWVudGF0aW9uIGluCiAgICAgICAgICAgIENQbHVzUGx1czExLmh0bWwuCgoyMDE3LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzEwNjMuIEFkZCB1c2luZyBkZWNsYXJhdGlvbnMgdG8gdGVtcGxhdGVzIGludG8gdHlwZWRlZiB0YWJsZS4KCiAgICAgICAgICAgIFVzaW5nIGRlY2xhcmF0aW9ucyB0byB0ZW1wbGF0ZXMgd2VyZSBtaXNzaW5nIGluIFNXSUcncyBpbnRlcm5hbCB0eXBlZGVmIHRhYmxlcy4KICAgICAgICAgICAgVGhpcyBsZWQgdG8gYSBmZXcgcHJvYmxlbXMsIHN1Y2ggYXMsIHRlbXBsYXRlcyB0aGF0IGRpZCBub3QgaW5zdGFudGlhdGUgYW5kIGdlbmVyYXRlZAogICAgICAgICAgICBDKysgY29kZSB0aGF0IGRpZCBub3QgY29tcGlsZSBhcyBTV0lHIGRpZCBub3Qga25vdyB3aGF0IHNjb3BlIHRoZSB0ZW1wbGF0ZSB3YXMKICAgICAgICAgICAgaW4uIFRoaXMgaGFwcGVuZWQgbW9zdGx5IHdoZW4gYSB1c2luZyBkZWNsYXJhdGlvbiB3YXMgdXNlZCBvbiBhIHRlbXBsYXRlIHR5cGUgaW4gYQogICAgICAgICAgICBjb21wbGV0ZWx5IHVucmVsYXRlZCBuYW1lc3BhY2UuCgoyMDE3LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZSBsb29rdXAgaW4gdGhlIHByZXNlbmNlIG9mIHVzaW5nIGRpcmVjdGl2ZXMgYW5kIHVzaW5nIGRlY2xhcmF0aW9ucy4KCiAgICAgICAgICAgIEZpeCBzb21lIGNhc2VzIG9mIHR5cGUgbG9va3VwIGZhaWx1cmUgdmlhIGEgY29tYmluYXRpb24gb2YgYm90aCB1c2luZyBkaXJlY3RpdmVzIGFuZAogICAgICAgICAgICB1c2luZyBkZWNsYXJhdGlvbnMgcmVzdWx0aW5nIGluIEMrKyBjb2RlIHRoYXQgZGlkIG5vdCBjb21waWxlIGFzIHRoZSBnZW5lcmF0ZWQgdHlwZSB3YXMKICAgICAgICAgICAgbm90IGZ1bGx5IHF1YWxpZmllZCBmb3IgdXNlIGluIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBFeGFtcGxlIGJlbG93OgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2U1IHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTdWJTcGFjZTUgewogICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3ViU3ViU3BhY2U1IHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRiB7fTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIFN1YlNwYWNlNTsKICAgICAgICAgICAgICAgIHVzaW5nIFN1YlN1YlNwYWNlNTo6RjsKICAgICAgICAgICAgICAgIHZvaWQgZnVuYyhTdWJTdWJTcGFjZTU6OkYgZik7CiAgICAgICAgICAgICAgfQoKMjAxNy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzEwNTEuICV0ZW1wbGF0ZSBzY29wZSBlbmZvcmNlbWVudCBhbmQgY2xhc3MgZGVmaW5pdGlvbiBmaXhlcy4KCiAgICAgICAgICAgIFRoZSBzY29waW5nIHJ1bGVzIGFyb3VuZCAldGVtcGxhdGUgaGF2ZSBiZWVuIHNwZWNpZmllZCBhbmQgZW5mb3JjZWQuCiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGZvciBhIGNsYXNzIHRlbXBsYXRlIGlzIHRoZSBlcXVpdmFsZW50IHRvIGFuCiAgICAgICAgICAgIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgYSBDKysgY2xhc3MgdGVtcGxhdGUuIFRoZSBzY29wZSBmb3IgYSB2YWxpZAogICAgICAgICAgICAldGVtcGxhdGUgaW5zdGFudGlhdGlvbiBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIHNjb3BlIHJlcXVpcmVkIGZvciBhCiAgICAgICAgICAgIHZhbGlkIGV4cGxpY2l0IGluc3RhbnRpYXRpb24gb2YgYSBDKysgdGVtcGxhdGUuIEEgZGVmaW5pdGlvbiBvZiB0aGUKICAgICAgICAgICAgdGVtcGxhdGUgZm9yIHRoZSBleHBsaWNpdCBpbnN0YW50aWF0aW9uIG11c3QgYmUgaW4gc2NvcGUgd2hlcmUgdGhlCiAgICAgICAgICAgIGluc3RhbnRpYXRpb24gaXMgZGVjbGFyZWQgYW5kIG11c3Qgbm90IGJlIGVuY2xvc2VkIHdpdGhpbiBhIGRpZmZlcmVudAogICAgICAgICAgICBuYW1lc3BhY2UuCgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgYSBmZXcgJXRlbXBsYXRlIGFuZCBDKysgZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgb2Ygc3RkOjp2ZWN0b3IKICAgICAgICAgICAgYXJlIHNob3duIGJlbG93OgoKICAgICAgICAgICAgICAvLyB2YWxpZAogICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIC8vIHZhbGlkCiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgICAgLy8gdmFsaWQKICAgICAgICAgICAgICB1c2luZyBzdGQ6OnZlY3RvcjsKICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgICAgLy8gaWxsLWZvcm1lZAogICAgICAgICAgICAgIG5hbWVzcGFjZSB1bnJlbGF0ZWQgewogICAgICAgICAgICAgICAgdXNpbmcgc3RkOjp2ZWN0b3I7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmluKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gaWxsLWZvcm1lZAogICAgICAgICAgICAgIG5hbWVzcGFjZSB1bnJlbGF0ZWQgewogICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aW4pIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgY2xhc3MgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBpbGwtZm9ybWVkCiAgICAgICAgICAgICAgbmFtZXNwYWNlIHVucmVsYXRlZCB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gaWxsLWZvcm1lZAogICAgICAgICAgICAgIG5hbWVzcGFjZSB1bnJlbGF0ZWQgewogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgc3RkOjp2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHN0ZDo6dmVjdG9yPGludD47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgV2hlbiB0aGUgc2NvcGUgaXMgaW5jb3JyZWN0LCBhbiBlcnJvciBub3cgb2NjdXJzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGNwcF90ZW1wbGF0ZV9zY29wZS5pOjM0OiBFcnJvcjogJ3ZlY3RvcicgcmVzb2x2ZXMgdG8gJ3N0ZDo6dmVjdG9yJyBhbmQKICAgICAgICAgICAgICB3YXMgaW5jb3JyZWN0bHkgaW5zdGFudGlhdGVkIGluIHNjb3BlICd1bnJlbGF0ZWQnIGluc3RlYWQgb2Ygd2l0aGluIHNjb3BlICdzdGQnLgoKICAgICAgICAgICAgUHJldmlvdXNseSBTV0lHIGFjY2VwdGVkIHRoZSBpbGwtZm9ybWVkIGV4YW1wbGVzIGFib3ZlIGJ1dCB0aGlzIGxlZCB0bwogICAgICAgICAgICBudW1lcm91cyBzdWJ0bGUgdGVtcGxhdGUgc2NvcGUgcHJvYmxlbXMgZXNwZWNpYWxseSBpbiB0aGUgcHJlc2VuY2Ugb2YKICAgICAgICAgICAgdXNpbmcgZGVjbGFyYXRpb25zIGFuZCB1c2luZyBkaXJlY3RpdmVzIGFzIHdlbGwgYXMgd2l0aCAlZmVhdHVyZSBhbmQgJXR5cGVtYXAuCgogICAgICAgICAgICBBY3R1YWxseSwgYSB2YWxpZCBpbnN0YW50aWF0aW9uIGlzIG9uZSB3aGljaCBjb25mb3JtcyB0byB0aGUgQysrMDMKICAgICAgICAgICAgc3RhbmRhcmQgYXMgQysrMTEgbWFkZSBhIGNoYW5nZSB0byBkaXNhbGxvdyB1c2luZyBkZWNsYXJhdGlvbnMgYW5kCiAgICAgICAgICAgIHVzaW5nIGRpcmVjdGl2ZXMgdG8gZmluZCBhIHRlbXBsYXRlLgoKICAgICAgICAgICAgICAvLyB2YWxpZCBDKyswMywgaWxsLWZvcm1lZCBDKysxMQogICAgICAgICAgICAgIHVzaW5nIHN0ZDo6dmVjdG9yOwogICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgU2ltaWxhciBmaXhlcyBmb3IgZGVmaW5pbmcgY2xhc3NlcyB1c2luZyBmb3J3YXJkIGNsYXNzIHJlZmVyZW5jZXMgaGF2ZQogICAgICAgICAgICBhbHNvIGJlZW4gcHV0IGluIHBsYWNlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UxOjpBIHsKICAgICAgICAgICAgICAgICAgdm9pZCB4KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBub3cgZXJyb3Igb3V0IHdpdGg6CgogICAgICAgICAgICAgIGNwcF9jbGFzc19kZWZpbml0aW9uLmk6NTogRXJyb3I6ICdTcGFjZTE6OkEnIHJlc29sdmVzIHRvICdTcGFjZTE6OkEnIGFuZAogICAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBpbnN0YW50aWF0ZWQgaW4gc2NvcGUgJ1NwYWNlMicgaW5zdGVhZCBvZiB3aXRoaW4gc2NvcGUgJ1NwYWNlMScuCgogICAgICAgICAgICBQcmV2aW91c2x5IHNvbWUgc3ltYm9scyB3b3VsZCBoYXZlIGJlZW4gaW5zdGFudGlhdGVkIGluIHRoZSB3cm9uZyBzY29wZSBhbmQgbGVkCiAgICAgICAgICAgIHRvIGxvdHMgb2Ygc2NvcGUgcHJvYmxlbXMgaW52b2x2aW5nIFNXSUcgdHlwZW1hcHMsIGZlYXR1cmVzLCByZW5hbWVzIGV0Yy4KICAgICAgICAgICAgWW91IHdpbGwgbmVlZCB0byBjb3JyZWN0IHRoZSBzY29wZSB1c2VkIGluIG90aGVyIFNXSUcgZGlyZWN0aXZlcyB3aGljaCBkbyBub3QKICAgICAgICAgICAgc3VwcG9ydCAndXNpbmcgZGVjbGFyYXRpb25zJyBhbmQgJ3VzaW5nIGRpcmVjdGl2ZXMnLiBGb3IgZXhhbXBsZSwgaWYgeW91IHByZXZpb3VzbHkgaGFkOgoKICAgICAgICAgICAgICAlcmVuYW1lKFphcCkgdmVjdG9yPGludD46OmNsZWFyOwogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RvckludCkgdmVjdG9yPGludD47CgogICAgICAgICAgICBQcmlvciB2ZXJzaW9ucyBvZiBTV0lHIGluY29ycmVjdGx5IGluc3RhbnRpYXRlZCB2ZWN0b3I8aW50PiBpbiB0aGUgZ2xvYmFsIG5hbWVzcGFjZQogICAgICAgICAgICBhbmQgc28gdGhlICVyZW5hbWUgbWF0Y2hlZC4gTm93IHRoZSB0ZW1wbGF0ZSBpcyBpbnN0YW50aWF0ZWQgaW4gdGhlIGNvcnJlY3QgbmFtZXNwYWNlLAogICAgICAgICAgICBzbyBpcyBmdWxseSBxdWFsaWZpZWQgYXMgc3RkOjp2ZWN0b3I8aW50Pi4gVGhlIG90aGVyIFNXSUcgZGlyZWN0aXZlcyBuZWVkIGNvcnJlY3RpbmcgYXMKICAgICAgICAgICAgdGhleSBkbyBub3QgZm9sbG93ICd1c2luZyBkZWNsYXJhdGlvbnMnIGFuZCAndXNpbmcgZGlyZWN0aXZlcycuIENoYW5nZSBpdCB0bzoKCiAgICAgICAgICAgICAgJXJlbmFtZShaYXApIHN0ZDo6dmVjdG9yPGludD46OmNsZWFyOwogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpbikgdmVjdG9yPGludD47CgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2NvcGUgbG9va3VwIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGNvbnRhaW5pbmcgdW5hcnkgc2NvcGUgb3BlcmF0b3JzLgoKICAgICAgICAgICAgRml4ZXMgY2FzZXMgbGlrZToKCiAgICAgICAgICAgIG5hbWVzcGFjZSBBbGxvYyB7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFJlYmluZCB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJXRlbXBsYXRlKFJlYmluZEJ1Y2tldCkgQWxsb2M6OlJlYmluZDwgQnVja2V0ID47CiAgICAgICAgICAgIE9SCiAgICAgICAgICAgICV0ZW1wbGF0ZShSZWJpbmRCdWNrZXQpIEFsbG9jOjpSZWJpbmQ8IDo6QnVja2V0ID47CgogICAgICAgICAgICBBbGxvYzo6UmViaW5kPCBCdWNrZXQgPjo6SW50ZWdlciBCdWNrZXQxKCk7CiAgICAgICAgICAgIEFsbG9jOjpSZWJpbmQ8IDo6QnVja2V0ID46OkludGVnZXIgQnVja2V0MigpOwogICAgICAgICAgICBBbGxvYzo6UmViaW5kPDo6dGVtcGxhdGUgVGVtcGxhdGVCdWNrZXQ8ZG91YmxlPj46OkludGVnZXIgQnVja2V0MygpOwoKMjAxNy0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgRm9yIHRlbXBsYXRlcyBvbmx5LCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgZnVsbHkgcmVzb2x2ZWQgd2hlbgogICAgICAgICAgICBoYW5kbGluZyB0eXBlbWFwcy4gV2l0aG91dCB0aGlzLCBpdCBpcyB0b28gaGFyZCB0byBoYXZlIGRlY2VudCBydWxlcwogICAgICAgICAgICB0byBhcHBseSB0eXBlbWFwcyB3aGVuIHBhcmFtZXRlciB0eXBlcyBhcmUgdHlwZWRlZidkIGFuZCB0ZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzIGhhdmUgZGVmYXVsdCB2YWx1ZXMuCgogICAgICAgICAgICBGaXhlcyAlY2xlYXIgZm9yIHR5cGVkZWZzIGluIHRlbXBsYXRlcywgZWc6CgogICAgICAgICAgICAgICV0eXBlbWFwKCJpbiIpIFhYWDxpbnQ+OjpMb25nICIuLi4iCiAgICAgICAgICAgICAgdGVtcGxhdGUgdHlwZW5hbWU8VD4gc3RydWN0IFhYWCB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIGxvbmcgTG9uZzsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICVjbGVhciBYWFg8aW50Pjo6TG9uZzsKCiAgICAgICAgICAgIGFzIHRoZSB0eXBlbWFwIHdhcyBwcmV2aW91c2x5IGluY29ycmVjdGx5IHN0b3JlZCBhcyBhIHR5cGVtYXAgZm9yIGxvbmcKICAgICAgICAgICAgaW5zdGVhZCBvZiBYWFg8aW50Pjo6TG9uZy4KCjIwMTctMDgtMDU6IG9sbHkKCSAgICBbQysrMTFdIEFsbG93IHN0YXRpY19hc3NlcnQgYXQgdGhlIHRvcCBsZXZlbCAoYW5kIGRpc2FsbG93IGl0IHJpZ2h0CgkgICAgYWZ0ZXIgdGVtcGxhdGU8VD4pLiAgRml4ZXMgaXNzdWUgMTAzMSByZXBvcnRlZCBieSBBcnRlbSBWIEwuCgoyMDE3LTA4LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb3JyZWN0bHkgc2hvd24gd2FybmluZyB3aGVuIGFuIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gd2FzIHVzZWQgb24gYQogICAgICAgICAgICBjbGFzcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBhbmQgdGhhdCBiYXNlIGNsYXNzIHdhcyBleHBsaWNpdGx5IGlnbm9yZWQgd2l0aCAlaWdub3JlLgogICAgICAgICAgICBFeGFtcGxlIG9mIHRoZSB3YXJuaW5nIHdoaWNoIHdpbGwgbm8gbG9uZ2VyIGFwcGVhcjoKCiAgICAgICAgICAgICAgV2FybmluZyA0MDE6IEJhc2UgY2xhc3MgJ0Z1bmN0b3I8IGludCxpbnQgPicgaGFzIG5vIG5hbWUgYXMgaXQgaXMgYW4gZW1wdHkKICAgICAgICAgICAgICB0ZW1wbGF0ZSBpbnN0YW50aWF0ZWQgd2l0aCAnJXRlbXBsYXRlKCknLiBJZ25vcmVkLgoKMjAxNy0wNy0xNzogZmZsZXhvCiAgICAgICAgICAgIFtKYXZhXSAjNjc0IEFkZCBzdGRfbGlzdC5pIHRvIGFkZCBzdXBwb3J0IGZvciBzdGQ6Omxpc3QgY29udGFpbmVycy4gVGhlIEphdmEgcHJveHkKICAgICAgICAgICAgZXh0ZW5kcyBqYXZhLnV0aWwuQWJzdHJhY3RTZXF1ZW50aWFsTGlzdCBhbmQgbWFrZXMgdGhlIEMrKyBzdGQ6Omxpc3QgY29udGFpbmVyIGxvb2sKICAgICAgICAgICAgYW5kIGZlZWwgbXVjaCBsaWtlIGEgamF2YS51dGlsLkxpbmtlZExpc3QgZnJvbSBKYXZhLgoKMjAxNy0wNy0wNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGRpc3BsYXkgb2YgZG9jdW1lbnRlZCB0ZW1wbGF0ZSB0eXBlcyB3aGVuIHVzaW5nIHRoZSBhdXRvZG9jCiAgICAgICAgICAgIGZlYXR1cmUuIEZvciBleGFtcGxlIHdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJhdXRvZG9jIik7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgWD4gc3RydWN0IFQge307CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFRJbnRlZ2VyKSBUPGludD47CgogICAgICAgICAgICB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gY29udGFpbnM6CiAgICAgICAgICAgICAgIiIiUHJveHkgb2YgQysrIFQ8IGludCA+IGNsYXNzLiIiIgogICAgICAgICAgICBpbnN0ZWFkIG9mOgogICAgICAgICAgICAgICIiIlByb3h5IG9mIEMrKyBUPChpbnQpPiBjbGFzcy4iIiIKICAgICAgICAgICAgYW5kCiAgICAgICAgICAgICAgIiIiX19pbml0X18oVEludGVnZXIgc2VsZikgLT4gVEludGVnZXIiIiIKICAgICAgICAgICAgaW5zdGVhZCBvZgogICAgICAgICAgICAgICIiIl9faW5pdF9fKFQ8KGludCk+IHNlbGYpIC0+IFRJbnRlZ2VyIiIiCgoyMDE3LTA2LTI3OiBuaWhhbG4KCSAgICBbUEhQXSBVcGRhdGUgdGhlIE9VVFBVVCBUeXBlbWFwIHRvIGFkZCByZXR1cm4gc3RhdGVtZW50IHRvIHRoZQoJICAgIFBIUCBXcmFwcGVyLgoKMjAxNy0wNi0yNzogbmloYWxuCgkgICAgW1BIUF0gVXBkYXRlIHRoZSBlbnVtIGFuZCB2YWx1ZSBleGFtcGxlcyB0byB1c2UgdGhlIE9PIHdyYXBwZXJzCgkgICAgcmF0aGVyIHRoYW4gdGhlIGZsYXQgZnVuY3Rpb25zIHByb2R1Y2VkIHdpdGggLW5vcHJveHkuICBUaGVyZSdzCgkgICAgbm90IGJlZW4gYSBnb29kIHJlYXNvbiB0byB1c2UgLW5vcHJveHkgZm9yIHNpbmNlIFBIUDUgT08gd3JhcHBpbmcKCSAgICB3YXMgZml4ZWQgYmFjayBpbiAyMDA1LgoKMjAxNy0wNi0yMzogbTd0aG9uCiAgICAgICAgICAgIFtQeXRob25dIGZpeCBhbmQgaW1wcm92ZSBkZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nOgoKICAgICAgICAgICAgMS4gRml4IG5lZ2F0aXZlIG9jdGFscy4gQ3VycmVudGx5IG5vdCBoYW5kbGVkIGNvcnJlY3RseSBieSBgLXB5M2AKICAgICAgICAgICAgICAgKHVudXN1YWwgY2FzZSwgYnV0IGluY29ycmVjdCkuCiAgICAgICAgICAgIDIuIEZpeCBhcmd1bWVudHMgb2YgdHlwZSAib2N0YWwgKyBzb21ldGhpbmciIChlLmcuIGAwNjQwIHwgMDRgKS4KICAgICAgICAgICAgICAgQ3VycmVudGx5IGRyb3BzIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0IG9jdGFsLiBOYXN0eSEKICAgICAgICAgICAgMy4gRml4IGJvb2wgYXJndW1lbnRzICIwICsgc29tZXRoaW5nIiAoZS5nLiBgMCB8IDFgKSBhcmUgYWx3YXlzCiAgICAgICAgICAgICAgICJGYWxzZSIgKHVudXN1YWwgY2FzZSwgYnV0IGluY29ycmVjdCkuCiAgICAgICAgICAgIDQuIFJlbW92ZSBzcGVjaWFsIGhhbmRsaW5nIG9mICJUUlVFIiBhbmQgIkZBTFNFIiBmcm9tCiAgICAgICAgICAgICAgIGBjb252ZXJ0VmFsdWVgIHNpbmNlIHRoZXJlJ3Mgbm8gcmVhc29uIHRoZXNlIGhhdmUgdG8gbWF0Y2gKICAgICAgICAgICAgICAgInRydWUiIGFuZCAiZmFsc2UiLgogICAgICAgICAgICA1LiBSZW1vdmUgdGhlIFB5dGhvbiAyIHZzLiBQeXRob24gMyBkaXN0aW5jdGlvbiBiYXNlZCBvbiB0aGUKICAgICAgICAgICAgICAgYC1weTNgIGZsYWcuIE5vdyB0aGUgc2FtZSBweXRob24gY29kZSBpcyBwcm9kdWNlZCBmb3IgZGVmYXVsdAogICAgICAgICAgICAgICBhcmd1bWVudHMgZm9yIFB5dGhvbiAyIGFuZCBQeXRob24gMy4gRm9yIHRoaXMsIG9jdGFsIGRlZmF1bHQKICAgICAgICAgICAgICAgYXJndW1lbnRzLCBlLmcuIDA2NDQsIGFyZSBub3cgd3JhcHBlZCBhcyBgaW50KCc2NDQnLCA4KWAuIFRoaXMKICAgICAgICAgICAgICAgaXMgcmVxdWlyZWQsIGFzIFB5dGhvbiAyIGFuZCBQeXRob24gMyBoYXZlIGluY29tcGF0aWJsZSBzeW50YXgKICAgICAgICAgICAgICAgZm9yIG9jdGFsIGxpdGVyYWxzLgoKICAgICAgICAgICAgRml4ZXMgIzcwNwoKMjAxNy0wNi0yMTogZnV0YXR1a2kKICAgICAgICAgICAgIzEwMDQgLSBGaXggY2NhY2hlLXN3aWcgZXhlY3V0YWJsZSBuYW1lIHRvIHJlc3BlY3QgY29uZmlndXJlJ3MgLS1wcm9ncmFtLXByZWZpeCBhbmQKICAgICAgICAgICAgLS1wcm9ncmFtLXN1ZmZpeCB2YWx1ZXMgaWYgdXNlZC4KCjIwMTctMDYtMjE6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzkxMSAtIEFkZCBzdGQ6OndzdHJpbmcgc3VwcG9ydC4KCjIwMTctMDYtMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBoYW5kbGluZyBvZiByaWNoIGNvbXBhcmlzb25zIHdoZW4gd3JhcHBpbmcgb3ZlcmxvYWRlZCBvcGVyYXRvcnM6CgogICAgICAgICAgICAgIG9wZXJhdG9yPCAgb3BlcmF0b3I8PSAgb3BlcmF0b3I+ICBvcGVyYXRvcj49ICBvcGVyYXRvcj09ICBvcGVyYXRvciE9CgogICAgICAgICAgICBQcmV2aW91c2x5IGEgVHlwZUVycm9yIHdhcyBhbHdheXMgdGhyb3duIGlmIHRoZSB0eXBlIHdhcyBub3QgY29ycmVjdC4gTm90SW1wbGVtZW50ZWQKICAgICAgICAgICAgaXMgbm93IHJldHVybmVkIGZyb20gdGhlc2Ugd3JhcHBlZCBmdW5jdGlvbnMgaWYgdGhlIHR5cGUgYmVpbmcgY29tcGFyZWQgd2l0aCBpcwogICAgICAgICAgICBub3QgY29ycmVjdC4gVGhlIHN1YnNlcXVlbnQgYmVoYXZpb3VyIHZhcmllcyBiZXR3ZWVuIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBQeXRob24KICAgICAgICAgICAgYW5kIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIGJlaW5nIHVzZWQsIGJ1dCBpcyBub3cgY29uc2lzdGVudCB3aXRoIG5vcm1hbCBQeXRob24KICAgICAgICAgICAgYmVoYXZpb3VyLiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmaXJzdCA0IG9wZXJhdG9yIG92ZXJsb2FkcyBhYm92ZSwgYSBUeXBlRXJyb3IKICAgICAgICAgICAgJ3Vub3JkZXJhYmxlIHR5cGVzJyBpcyB0aHJvd24gaW4gUHl0aG9uIDMsIGJ1dCBQeXRob24gMiB3aWxsIHJldHVybiBUcnVlIG9yIEZhbHNlLgogICAgICAgICAgICBOb3RJbXBsZW1lbnRlZCBzaG91bGQgYmUgcmV0dXJuZWQgd2hlbiB0aGUgY29tcGFyaXNvbiBjYW5ub3QgYmUgZG9uZSwgc2VlIFBFUCAyMDcgYW5kCiAgICAgICAgICAgIGh0dHBzOi8vZG9jcy5weXRob24ub3JnLzMvbGlicmFyeS9jb25zdGFudHMuaHRtbCNOb3RJbXBsZW1lbnRlZAoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBidWcgd2FzIG9ubHkgcHJlc2VudCB3aGVuIG92ZXJsb2FkZWQgb3BlcmF0b3JzIGRpZCBub3QgYWxzbyBoYXZlIGEKICAgICAgICAgICAgZnVuY3Rpb24gb3ZlcmxvYWQuCgogICAgICAgICAgICBGaXhlcyBTRiBidWcgIzEyMDggKDM0NDEyNjIpIGFuZCBTRiBwYXRjaCAjMzAzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTA2LTE3OiBmYWJyaWNlMTAyCiAgICAgICAgICAgIFtHb10gRml4IEdvIGNhbGxiYWNrIGV4YW1wbGUuICBGaXhlcyBnaXRodWIgIzYwMCwgIzk1NSwgIzEwMDAuCgoyMDE3LTA2LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBNYWtlIHN1cmUgd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMgYXJlIG5vdCBzcGxpdCB1cCBieSBvdGhlciBwcm9jZXNzZXMgd3JpdGluZyB0bwogICAgICAgICAgICBzdGRvdXQgYXQgdGhlIHNhbWUgdGltZS4KCjIwMTctMDYtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggd3JhcHBpbmcgZnVuY3Rpb24gcG9pbnRlcnMgY29udGFpbmluZyBydmFsdWUgYW5kIGx2YWx1ZSByZWZlcmVuY2UgcGFyYW1ldGVycy4KCjIwMTctMDYtMTM6IG9sbHkKCSAgICBbUGVybF0gRml4IHRlc3RzdWl0ZSB0byB3b3JrIHdpdGhvdXQgLiBpbiBASU5DIC0gaXQgd2FzIHJlbW92ZWQgaW4KCSAgICBQZXJsIDUuMjYgZm9yIHNlY3VyaXR5IHJlYXNvbnMsIGFuZCBoYXMgYWxzbyBiZWVuIHJlbW92ZWQgZnJvbQoJICAgIG9sZGVyIHZlcnNpb25zIGluIHNvbWUgZGlzdHJvcy4gIEZpeGVzICM5OTcgcmVwb3J0ZWQgYnkgbGZhbS4KCjIwMTctMDYtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaW1wb3J0IG9uIGEgZmlsZSBjb250YWluaW5nIGEgZmlsZSBzY29wZSAlZnJhZ21lbnQgZm9yY2VkIGluY2x1c2lvbiB0byBub3QKICAgICAgICAgICAgZ2VuZXJhdGUgdGhlIGZyYWdtZW50IGNvbnRlbnRzIGFzICVpbXBvcnQgc2hvdWxkIG5vdCByZXN1bHQgaW4gY29kZSBiZWluZyBnZW5lcmF0ZWQuCiAgICAgICAgICAgIFRoZSBiZWhhdmlvdXIgaXMgbm93IHRoZSBzYW1lIGFzIGltcG9ydGluZyBjb2RlIGluc2VydGlvbiBibG9ja3MuCiAgICAgICAgICAgIFdyYXBwaW5nIEZpbGVDLmkgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIHdpbGwgcmVzdWx0IGluIG5vIGdlbmVyYXRlZCBjb2RlLCB3aGVyZWFzCiAgICAgICAgICAgIHByZXZpb3VzbHkgIiNpbmNsdWRlIDxsaW1pdHMuaD4iIHdhcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIC8vIEZpbGVBLmkKICAgICAgICAgICAgICAlZnJhZ21lbnQoIjxsaW1pdHMuaD4iLCAiaGVhZGVyIikgJXsKICAgICAgICAgICAgICAgICNpbmNsdWRlIDxsaW1pdHMuaD4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAlZnJhZ21lbnQoIjxsaW1pdHMuaD4iKTsKCiAgICAgICAgICAgICAgLy8gRmlsZUMuaQogICAgICAgICAgICAgICVpbXBvcnQgIkZpbGVBLmkiCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMDUtMjY6IFZvbGtlciBEaWVscy1HcmFic2NoLCB2YWR6CiAgICAgICAgICAgIFtKYXZhXSAjODQyIEV4dGVuZCBmcm9tIGphdmEudXRpbC5BYnN0cmFjdExpc3Q8PiBhbmQgaW1wbGVtZW50IGphdmEudXRpbC5SYW5kb21BY2Nlc3MgZm9yCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLiBUaGlzIG5vdGFibHkgYWxsb3dzIHRvIGl0ZXJhdGUgb3ZlciB3cmFwcGVkIHZlY3RvcnMgaW4gYSBuYXR1cmFsIHdheS4KICAgICAgICAgICAgTm90ZSB0aGF0IGJveGVkIHR5cGVzIGFyZSBub3cgdXNlZCBpbiB0aGUgSmF2YSBsYXllciB3aGVuIHdyYXBwaW5nIHZlY3RvciBvZiBDIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcywgZm9yIGV4YW1wbGUuIFRoaXMgbWF5IGludHJvZHVjZSBzb21lIHN1YnRsZSBpbmNvbXBhdGliaWxpdGllcyBkdWUgdG8gc29tZQogICAgICAgICAgICBkaWZmZXJlbmNlcyBpbiBob3cgSmF2YSBjb252ZXJ0cyBib3hlZCB0eXBlcyBhbmQgdW5ib3hlZCB0eXBlcy4gRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgIGludCBpPTA7CiAgICAgICAgICAgICAgZG91YmxlIGQxID0gaTsgLy8gb2sKICAgICAgICAgICAgICBEb3VibGUgZDIgPSBpOyAvLyBlcnJvcjogaW5jb21wYXRpYmxlIHR5cGVzOiBpbnQgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBEb3VibGUKCiAgICAgICAgICAgIFRoaXMgY2FuIGJlIGEgcHJvYmxlbSB3aGVuIGNhbGxpbmcgdGhlIGFkZCBhbmQgc2V0IGZ1bmN0aW9ucy4gQSBzdWdnZXN0ZWQgYmFja3dhcmRzCiAgICAgICAgICAgIGNvbXBhdGlibGUgd29ya2Fyb3VuZCBpcyB0byB1c2Ugc29tZXRoaW5nIGxpa2UgKHNob3duIGZvciBzdGQ6OnZlY3Rvcjxkb3VibGU+OgoKICAgICAgICAgICAgICAjaWYgZGVmaW5lZChTV0lHSkFWQSkKICAgICAgICAgICAgICAvLyBBZGQgaW4gb2xkIGFwaSB0aGF0IHVzZXMgbm9uLWJveGVkIHR5cGVzCiAgICAgICAgICAgICAgJWV4dGVuZCBzdGQ6OnZlY3Rvcjxkb3VibGU+IHsKICAgICAgICAgICAgICAlcHJveHljb2RlICV7CiAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGQoZG91YmxlIHgpIHsKICAgICAgICAgICAgICAgICAgYWRkKERvdWJsZS52YWx1ZU9mKHgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChpbnQgaSwgZG91YmxlIHZhbCkgewogICAgICAgICAgICAgICAgICBzZXQoaSwgRG91YmxlLnZhbHVlT2YodmFsKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfdmVjdG9yLmkiCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RvckRvdWJsZSkgc3RkOjp2ZWN0b3I8ZG91YmxlPjsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNy0wNS0zMDogZGF2aWRjbAogICAgICAgICAgICBbU2NpbGFiXSAjOTk0IFVuZGVmaW5lZCBzeW1ib2wgZXJyb3Igd2hlbiBsb2FkaW5nIGluIFNjaWxhYiA2CgoyMDE3LTA1LTI1OiBhc2licm9zcwogICAgICAgICAgICBbSmF2YV0gIzM3MCAjNDE3IE1pc3Npbmcgc21hcnQgcG9pbnRlciBoYW5kbGluZyBpbiBKYXZhIGRpcmVjdG9yIGV4dHJhIG1ldGhvZHMKICAgICAgICAgICAgc3dpZ1JlbGVhc2VPd25lcnNoaXAoKSBhbmQgc3dpZ1Rha2VPd25lcnNoaXAoKS4KCjIwMTctMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSAjMjMwICM3NTkgRml4IEphdmEgc2hhcmVkX3B0ciBhbmQgZGlyZWN0b3JzIGZvciBkZXJpdmVkIGNsYXNzZXMgamF2YSBjb21waWxhdGlvbgogICAgICAgICAgICBlcnJvci4KCiAgICAgICAgICAgIEZvciBzaGFyZWRfcHRyIHByb3h5IHByb3h5IGNsYXNzZXMsIGFkZCBhIHByb3RlY3RlZCBtZXRob2Qgc3dpZ1NldENNZW1Pd24gZm9yIG1vZGlmeWluZwogICAgICAgICAgICB0aGUgc3dpZ0NNZW1Pd24gYW5kIHN3aWdDTWVtT3duRGVyaXZlZCBtZW1iZXIgdmFyaWFibGVzIHdoaWNoIGFyZSB1c2VkIGJ5IHZhcmlvdXMgb3RoZXIKICAgICAgICAgICAgbWV0aG9kcyBmb3IgY29udHJvbGxpbmcgbWVtb3J5IG93bmVyc2hpcC4KCjIwMTctMDUtMjE6IFNnaGlyYXRlCiAgICAgICAgICAgIFtKYXZhLCBDIywgRF0gIzQ0OSBSZW1vdmUgdW5uZWNlc3NhcnkgdXNlIG9mIGR5bmFtaWNfY2FzdCBpbiBkaXJlY3RvcnMgdG8gZW5hYmxlCiAgICAgICAgICAgIG5vbi1SVFRJIGNvbXBpbGF0aW9uLgoKMjAxNy0wNS0yMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gIzk5MyBGaXggaGFuZGxpbmcgb2YgZGVmYXVsdCAtdmUgdW5zaWduZWQgdmFsdWVzLCBzdWNoIGFzOgogICAgICAgICAgICAgIHZvaWQgZih1bnNpZ25lZCA9IC0xVSk7CgoyMDE3LTA1LTIwOiBqc2NodWVsbGVyCiAgICAgICAgICAgIFtQeXRob25dICM5OTEgRml4IEU3MzEgUEVQOCB3YXJuaW5nOiBkbyBub3QgYXNzaWduIGEgbGFtYmRhIGV4cHJlc3Npb24KCjIwMTctMDUtMTY6IG5paGFsOTUKICAgICAgICAgICAgW1BIUF0gQWRkICVwcmFnbWEgdmVyc2lvbiBkaXJlY3RpdmUgdG8gYWxsb3cgdGhlIHZlcnNpb24gb2YgdGhlCiAgICAgICAgICAgIGV4dGVuc2lvbiB0byBiZSBzZXQuICBQYXRjaCAjOTcwLCBmaXhlcyAjMzYwLgoKMjAxNy0wNS0xMzogeWFnMDAKICAgICAgICAgICAgUGF0Y2ggIzk3NSAtIEFkZCBzdXBwb3J0IGZvciBub2V4Y2VwdCBvbiBkaXJlY3RvciBtZXRob2RzLgoKMjAxNy0wNC0yNzogcmVkYnJhaW4KICAgICAgICAgICAgSXNzdWUgIzk3NCwgUGF0Y2ggIzk3NiAtIEZpeCBwcmVwcm9jZXNzb3IgaGFuZGxpbmcgb2YgbWFjcm9zIHdpdGggY29tbWFzIGluIGEgY29tbWVudC4KCjIwMTctMDQtMjU6IGpsZXZlcXVlCiAgICAgICAgICAgIFtMdWFdICM5NTkgLSBGaXggVmlzdWFsIFN0dWRpbyBDNDI0NCBjb252ZXJzaW9uIHdhcm5pbmdzIGluIEx1YSB3cmFwcGVycy4KCjIwMTctMDQtMjE6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzk2NCAtIEFkZCBzaGFyZWRfcHRyIGRpcmVjdG9yIHR5cGVtYXBzLgoKMjAxNy0wNC0yMDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldICM1ODYsICM5MzUgQWRkIGFzc2VydCBmb3IgaW52YWxpZCBOVUxMIHR5cGUgcGFyYW1ldGVyIHdoZW4gY2FsbGluZyBTV0lHX1J1YnlfTmV3UG9pbnRlck9iai4KCjIwMTctMDQtMjA6IHRhbXVyYXRhawogICAgICAgICAgICBbUnVieV0gIzkzMCwgIzkzNyAtIEZpeCBjb250YWluZXJzIG9mIHN0ZDo6c2hhcmVkX3B0ci4KICAgICAgICAgICAgVXBjYXN0aW5nLCBjb25zdCB0eXBlcyAoZWcgdmVjdG9yPHNoYXJlZF9wdHI8Y29uc3QgVD4+KSBhbmQgTlVMTC9udWxscHRyIHN1cHBvcnQgYWRkZWQuCgoyMDE3LTA0LTEyOiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIE5ldyBwYXJhbWV0ZXIgdGFyZ2V0dmVyc2lvbiB0byBzcGVjaWZ5IHRoZSBTY2lsYWIgdGFyZ2V0IHZlcnNpb24gKDUsIDYsIC4uKSBmb3IgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgIFdpdGggU2NpbGFiIDYgdGFyZ2V0IHNwZWNpZmllZCwgaWRlbnRpZmllciBuYW1lcyB0cnVuY2F0aW9uIGlzIGRpc2FibGVkIChubyBsb25nZXIgbmVjZXNzYXJ5KQoKMjAxNy0wMy0yNDogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzkzOSAtIFdyYXBwaW5nIHN0ZDo6dmVjdG9yPGJvb2w+IGZpeCBkdWUgdG8gaW5jb3JyZWN0IG51bGwgY2hlY2tzCiAgICAgICAgICAgIG9uIFZBTFVFIG9iai4KCjIwMTctMDMtMTc6IHZhZHoKICAgICAgICAgICAgW0MjXSAjOTQ3IEFkZCBzdXBwb3J0IGZvciBzdGQ6OmNvbXBsZXg8VD4KCjIwMTctMDMtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHb10gRml4IGhhbmRsaW5nIG9mIHR5cGVkZWYnZCBmdW5jdGlvbiBwb2ludGVycyBhbmQgdHlwZWRlZidkIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycwogICAgICAgICAgICBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCAoKkZuUHRyX3RkKShpbnQsIGludCk7CiAgICAgICAgICAgICAgaW50IGRvX29wKGludCB4LCBpbnQgeSwgRm5QdHJfdGQgb3ApOwoKMjAxNy0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIG1lbWJlciBjb25zdCBmdW5jdGlvbiBwb2ludGVycyBzdWNoIGFzOgoKICAgICAgICAgICAgICBpbnQgZm4oc2hvcnQgKEZ1bmNzOjoqIHBhcm0pKGJvb2wpKSBjb25zdDsKCiAgICAgICAgICAgIEFsc28gZml4IHBhcnNpbmcgb2YgcmVmZXJlbmNlcy9wb2ludGVycyBhbmQgcXVhbGlmaWVycyB0byBtZW1iZXIKICAgICAgICAgICAgcG9pbnRlcnMgc3VjaCBhczoKCiAgICAgICAgICAgICAgaW50IGZuKHNob3J0IChGdW5jczo6KiBjb25zdCBwYXJtKShib29sKSk7CiAgICAgICAgICAgICAgaW50IGZuKHNob3J0IChGdW5jczo6KiAmIHBhcm0pKGJvb2wpKTsKCjIwMTctMDMtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEV4dGVuZCBDKysxMSBhbHRlcm5hdGUgZnVuY3Rpb24gc3ludGF4IHBhcnNpbmcgdG8gc3VwcG9ydCBjb25zdCBhbmQgbm9leGNlcHQsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGF1dG8gc3VtMShpbnQgeCwgaW50IHkpIGNvbnN0IC0+IGludCB7IHJldHVybiB4ICsgeTsgfQogICAgICAgICAgICAgIGF1dG8gc3VtMihpbnQgeCwgaW50IHkpIG5vZXhjZXB0IC0+IGludCB7IHJldHVybiB4ICsgeTsgfQoKMjAxNy0wMi0yOTogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSAjOTE3IC0gQWRkIEVudW1lcmFibGUgbW9kdWxlIHRvIGFsbCBjb250YWluZXIgY2xhc3Mgd3JhcHBlcnMuIEl0IHdhcyBtaXNzaW5nCiAgICAgICAgICAgIGZvciBzdGQ6Omxpc3QsIHN0ZDo6bXVsdGlzZXQsIHN0ZDo6dW5vcmRlcmVkX211bHRpc2V0IGFuZCBzdGQ6OnVub3JkZXJlZF9tYXAuCgoyMDE3LTAyLTI3OiBhc3NhbWJhcgogICAgICAgICAgICBbQysrMTFdIEV4dGVuZCBwYXJzZXIgdG8gc3VwcG9ydCB0aHJvdyBzcGVjaWZpZXIgaW4gY29tYmluYXRpb24KICAgICAgICAgICAgd2l0aCBvdmVycmlkZSBhbmQvb3IgZmluYWwuCgoyMDE3LTAyLTEwOiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldICM4ODMgLSBBZGQgc3VwcG9ydCBmb3IgQysrMTEgaGFzaCB0YWJsZXM6CiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwCiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0CiAgICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXAKICAgICAgICAgICAgICBzdGQ6OnVub3JkZXJlZF9tdWx0aXNldAoKMjAxNy0wMi0wODogamNzaGFycAogICAgICAgICAgICBbQyNdICM4ODcgSW1wcm92ZSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVyIGNvbnN0cnVjdG9ycyAtCiAgICAgICAgICAgIFJlcGxhY2UgY29uc3RydWN0b3IgdGFraW5nIElDb2xsZWN0aW9uIHdpdGggSUVudW1lcmFibGUgYW5kIGFsc28gYWRkIElFbnVtZXJhYmxlPFQ+CiAgICAgICAgICAgIGNvbnN0cnVjdG9yIHRvIGF2b2lkIHRoZSBib3hpbmcgYW5kIHVuYm94aW5nIG92ZXJoZWFkIG9mIHRoZSBvcmlnaW5hbCBjb25zdHJ1Y3RvciwKICAgICAgICAgICAgd2hlbiB0aGUgdHlwZSBwYXJhbWV0ZXIgaXMgYSB2YWx1ZSB0eXBlLgoKVmVyc2lvbiAzLjAuMTIgKDI3IEphbiAyMDE3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE3LTAxLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdICM4ODIgRml4IG1pc3NpbmcgZmlsZW5hbWUgaW4gZXJyb3IgbWVzc2FnZXMgd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0KICAgICAgICAgICAgd3JpdGluZyBvdXQgQyMgZmlsZXMuCgoyMDE3LTAxLTI3OiBicmlhbmNhaW5lCiAgICAgICAgICAgIFtHdWlsZV0gIzc0NCBGaXggY29tcGlsYXRpb24gZXJyb3JzIGluIEd1aWxlIHdyYXBwZXJzIC0gcmVncmVzc2lvbgogICAgICAgICAgICBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjExLgoKMjAxNy0wMS0yNDogYW5kcmV5LXN0YXJvZHVidHNldgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgIzcwNCAtIGRpcmVjdG9yIHR5cGVtYXAgaW1wcm92ZW1lbnRzLgogICAgICAgICAgICBNZW1vcnkgbGVhayBmaXhlcywgYWRkIHN1cHBvcnQgZm9yICJkaXJlY3RvcmFyZ291dCIgdHlwZW1hcCBhbmQKICAgICAgICAgICAgYWRkIGRpcmVjdG9yIHN1cHBvcnQgdG8gdHlwZW1hcHMuaS4KCjIwMTctMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEVuaGFuY2UgJWV4dGVuZCB0byBleHRlbmQgYSBjbGFzcyB3aXRoIHRlbXBsYXRlIGNvbnN0cnVjdG9ycywgZWc6CgogICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiAgICAgICAgICAgICAgICAgIEZvbyhpbnQgYSwgVCBiKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb28pIEZvbzo6Rm9vPGRvdWJsZT47CgoyMDE3LTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZSAjODc2IEVuaGFuY2UgJWV4dGVuZCB0byBleHRlbmQgYSBjbGFzcyB3aXRoIHRlbXBsYXRlIG1ldGhvZHMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgICAgICAgICAgICB2b2lkIGRvX3N0dWZmKGludCBhLCBUIGIpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGRvX3N0dWZmX2luc3QpIEZvbzo6ZG9fc3R1ZmY8ZG91YmxlPjsKCiAgICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBzdGF0aWMgdGVtcGxhdGUgbWV0aG9kcy4KCjIwMTctMDEtMjI6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gYWRkIHN1cHBvcnQgZm9yIHZlcnNpb24gNC4yCiAgICAgICAgICAgIC0gVGhlIE9jdGF2ZSBBUEkgbm93IHVzZXMgc29tZSBDKysxMSBmZWF0dXJlcy4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlCiAgICAgICAgICAgICAgdGhlIG1rb2N0ZmlsZSBwcm9ncmFtIHN1cHBsaWVkIGJ5IE9jdGF2ZSB0byBjb21waWxlIHRoZSBTV0lHLWdlbmVyYXRlZAogICAgICAgICAgICAgIHdyYXBwZXIgY29kZSwgYXMgbWtvY3RmaWxlIHdpbGwgZW5zdXJlIHRoZSBjb3JyZWN0IEMrKyBjb21waWxlci9vcHRpb25zCiAgICAgICAgICAgICAgYXJlIHVzZWQuIE90aGVyd2lzZSwgdGhlIHZhbHVlIG9mIGBta29jdGZpbGUgLXAgQ1hYYCBzaG91bGQgYmUgcGFyc2VkCiAgICAgICAgICAgICAgZm9yIGFueSAtc3RkPSogZmxhZ3Mgd2hpY2ggbWlnaHQgYmUgcHJlc2VudC4KICAgICAgICAgICAgLSBPY3RhdmUgaGFzIGRyb3BwZWQgc3VwcG9ydCBmb3IgPDwgYW5kID4+IG9wZXJhdG9ycywgc28gU1dJRyBub3cKICAgICAgICAgICAgICBpZ25vcmVzIHRoZW0uCiAgICAgICAgICAgIC0gVGhlIE9jdGF2ZSBlcnJvcigpIGZ1bmN0aW9uIG5vdyByYWlzZXMgQysrIGV4Y2VwdGlvbnMgdG8gcHJvcGFnYXRlCiAgICAgICAgICAgICAgT2N0YXZlIGVycm9ycywgc28gJWV4Y2VwdGlvbiBkaXJlY3RpdmVzIG1heSBuZWVkIHRvIGJlIG1vZGlmaWVkLgogICAgICAgICAgICAgIEZvciBjb252ZW5pZW5jZSB0aGUgU1dJR19SRVRIUk9XX09DVEFWRV9FWENFUFRJT05TIG1hY3JvIGNhbiBiZSB1c2VkCiAgICAgICAgICAgICAgdG8gcmV0aHJvdyBhbnkgT2N0YXZlIGV4Y2VwdGlvbnMgZm9yIE9jdGF2ZSBpdHNlbGYgdG8gaGFuZGxlLCBlLmcuOgoKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICRhY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXkgY2FsbCBlcnJvcigpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBTV0lHX1JFVEhST1dfT0NUQVZFX0VYQ0VQVElPTlMgICAvLyBlcnJvcigpIGV4Y2VwdGlvbnMgYXJlIHJldGhyb3duCiAgICAgICAgICAgICAgICBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBvdGhlciBleGNlcHRpb25zCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTctMDEtMTY6IHdrYWxpbmluCiAgICAgICAgICAgIFtDI10gRml4ICM3MzMgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjkuCiAgICAgICAgICAgIE1pc3NpbmcgdmlydHVhbCBmdW5jdGlvbiBvdmVycmlkZSBpbiBDIyBsYXllciB3aGVuIHVzaW5nICVpbXBvcnQuCgoyMDE3LTAxLTE2OiBmc2NobGltYgogICAgICAgICAgICBGaXggIzgxMyB0ZW1wbGF0ZSBzeW1ib2wgbmFtZSBsb29rdXAgYnVnIHdoZW4gdHlwZWRlZiBuYW1lcyBhcmUgdGhlIHNhbWUgYnV0IGluIGRpZmZlcmVudAogICAgICAgICAgICBuYW1lc3BhY2VzLgoKMjAxNy0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjIEQgSmF2YV0KICAgICAgICAgICAgVGhlIFNXSUcgbGlicmFyeSBubyBsb25nZXIgdXNlcyB0aGUgamF2YXR5cGUsIGR0eXBlIG9yIGNzdHlwZSB0eXBlbWFwcywgdGhlcmVieQogICAgICAgICAgICBjb21wbGV0ZWx5IGZyZWVpbmcgdGhlbSB1cCBmb3IgdXNlcnMgdG8gdXNlIHdpdGhvdXQgaGF2aW5nIHRvIHJlcGxpY2F0ZSB0aGUgbGlicmFyeQogICAgICAgICAgICBjb2RlIHRoYXQgdGhleSBwcmV2aW91c2x5IGFkZGVkLiBUaGUgY29kZSBwcmV2aW91c2x5IGdlbmVyYXRlZCBieSB0aGVzZSB0eXBlbWFwcwogICAgICAgICAgICBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgbmV3ICVwcm94eWNvZGUgZGlyZWN0aXZlLiBUaGVpciB1c2UgaW4gdGhlIGxpYnJhcnkgY29kZQogICAgICAgICAgICB3YXMgZmFpcmx5IG1pbmltYWw6CgogICAgICAgICAgICAgIEMjICAgY3N0eXBlOiAgIHN0ZF9hcnJheS5pIHN0ZF9tYXAuaSBzdGRfdmVjdG9yLmkKICAgICAgICAgICAgICBEICAgIGR0eXBlOiAgICBzdGRfdmVjdG9yLmkKICAgICAgICAgICAgICBKYXZhIGphdmF0eXBlOiBhcnJheXNfamF2YS5pCgoyMDE3LTAxLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgJWV4dGVuZCBkaXJlY3RpdmUgY2FuIG5vdyBvcHRpb25hbGx5IHN1cHBvcnQgb25lIG9mIHRoZSAnY2xhc3MnLCAnc3RydWN0JyBvciAndW5pb24nCiAgICAgICAgICAgIGtleXdvcmRzIGJlZm9yZSB0aGUgaWRlbnRpZmllciBuYW1lLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IFggeyAuLi4gfTsKICAgICAgICAgICAgICAlZXh0ZW5kIHN0cnVjdCBYIHsgLi4uIH0KCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhpcyBoYWQgdG8gc3BlY2lmaWVkIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7IC4uLiB9OwogICAgICAgICAgICAgICVleHRlbmQgWCB7IC4uLiB9CgoyMDE3LTAxLTEzOiB3c2Z1bHRvbgoJICAgIFtDIyBEIEphdmFdIEFkZCBuZXcgJXByb3h5Y29kZSBkaXJlY3RpdmUgd2hpY2ggaXMgYSBtYWNybyBmb3IgJWluc2VydCgicHJveHljb2RlIikuCiAgICAgICAgICAgIFRoaXMgaXMgYSB3YXkgb2YgYWRkaW5nIHB1cmUgQyMvRC9KYXZhIGNvZGUgaW50byB0aGUgYXBwcm9wcmlhdGUgcHJveHkgY2xhc3MsIGVnOgoKICAgICAgICAgICAgICAlZXh0ZW5kIFByb3h5MiB7CiAgICAgICAgICAgICAgJXByb3h5Y29kZSAlewogICAgICAgICAgICAgICAgcHVibGljIGludCBwcm94eWNvZGUyKGludCBpKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBpKzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBzdHJ1Y3QgUHJveHkyIHt9OwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGVyZSB3aWxsIHRoZW4gYmUgYSBwdXJlIEphdmEvQyMvRCBtZXRob2QgY2FsbGVkIHByb3h5Y29kZTIgaW4gdGhlIFByb3h5MiBjbGFzcy4KCjIwMTYtMTItMzE6IGFqcmhlYWRpbmcxCgkgICAgSXNzdWUgIzg2MCAtIFJlbW92ZSB1c2Ugb2Ygc3RkOjp1bmFyeV9mdW5jdGlvbiBhbmQgc3RkOjpiaW5hcnlfZnVuY3Rpb24KICAgICAgICAgICAgd2hpY2ggaXMgZGVwcmVjYXRlZCBpbiBDKysxMS4KCjIwMTYtMTItMzA6IG9sbHkKCSAgICBbUEhQN10gUmVnaXN0ZXIgaW50ZXJuYWwgJ3N3aWdfcnVudGltZV9kYXRhX3R5cGVfcG9pbnRlcicgY29uc3RhbnQKCSAgICBhcyAiQ09OU1RfUEVSU0lTVEVOVCIgdG8gYXZvaWQgc2VnbWVudGF0aW9uIGZhdWx0IG9uIG1vZHVsZSB1bmxvYWQuCgkgICAgRml4ZXMgIzg1OSByZXBvcnRlZCBieSBUaW1vdGhldXMgUG9rb3JyYS4gVGhhbmtzIGFsc28gdG8gSmF2aWVyIFRvcnJlcwoJICAgIGZvciBhIG1pbmltYWwgcmVwcm9kdWNlci4KClZlcnNpb24gMy4wLjExICgyOSBEZWMgMjAxNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNi0xMi0yNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgJWZlYXR1cmUoImNzZGlyZWN0b3JkZWxlZ2F0ZW1vZGlmaWVycyIpIHRvIGVuYWJsZSBjdXN0b21pemF0aW9uCiAgICAgICAgICAgIG9mIHRoZSBkZWxlZ2F0ZSBhY2Nlc3MgbW9kaWZpZXJzIGdlbmVyYXRlZCBpbiBkaXJlY3RvciBjbGFzc2VzLgogICAgICAgICAgICBGaXhlcyBpc3N1ZSAjNzQ4LgoKMjAxNi0xMi0yMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGJ1aWx0aW4gInB5dGhvbjpzbG90IiBmZWF0dXJlIGZhaWxpbmcgZm9yIHRwX2hhc2ggd2hlbiB1c2luZwogICAgICAgICAgICBoYXNoZnVuYyBjbG9zdXJlIHdpdGggYSAiV3JvbmcgdHlwZSBmb3IgaGFzaCBmdW5jdGlvbiIgZm9yIFB5dGhvbiAyLgogICAgICAgICAgICBJc3N1ZSAjODQzLgoKMjAxNi0xMi0yMTogam9lcXVhbXQKICAgICAgICAgICAgQ2hhbmdlZCBnZW5lcmF0aW9uIG9mIGZ1bmN0aW9ucyBzbyB0aGF0IG9ubHkgZnVuY3Rpb25zCiAgICAgICAgICAgIHRoYXQgZW5kIGluIF9zZXQgZ2VuZXJhdGUgYWNjZXNzb3IgZnVuY3Rpb25zIHJhdGhlciB0aGFuCgkgICAgbG9va2luZyBmb3IgInNldCIuCgkgICAgQ2hhbmdlIGdlbmVyYXRpb24gb2Ygb3BlcmF0b3JzIHRvIG5vdCBoYXZlIHVuZGVyc2NvcmVzCgkgICAgdG8gc3RhcnQgaW4gUi4gVXNlcnMgbmVlZCB0byBwcm92aWRlIGN1c3RvbSBuYW1lcyBmb3IgdGhlc2Ugb3BlcmF0b3Igb3ZlcmxvYWRzLgoKMjAxNi0xMi0yMTogb2xseQoJICAgIEZpeCBpc2Zpbml0ZSgpIGNoZWNrcyB0byB3b3JrIHdpdGggYWxsIEMrKzExIGNvbXBpbGVycy4KCSAgICBGaXhlcyBpc3N1ZXMgIzYxNSwgIzc4OCBhbmQgIzg0OS4KCjIwMTYtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgICVuYW1ld2FybiB1bm5lY2Vzc2FyaWx5IGNhdXNlZCBrZXl3b3JkIHdhcm5pbmdzIGZvciBub24taW5zdGFudGlhdGVkIHRlbXBsYXRlIGNsYXNzZXMKICAgICAgICAgICAgYW5kIGR1cGxpY2F0ZSB3YXJuaW5ncyBmb3IgaW5zdGFudGlhdGVkIHRlbXBsYXRlIGNsYXNzZXMgd2hlbiBrZXl3b3JkcyB3ZXJlIHVzZWQuCiAgICAgICAgICAgIElzc3VlICM4NDUuCgoyMDE2LTEyLTE4OiBlenJhbGFuZ2xvaXMgCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jdGF2ZV0gTWVtb3J5IGxlYWsgZml4IG9uIGVycm9yIGluIHN0ZDo6cGFpciB3cmFwcGVycy4KICAgICAgICAgICAgSXNzdWUgIzg1MS4KCjIwMTYtMTItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFplcm8gaW5pdGlhbGl6ZSBhcnJheXMgd2hlbiB1c2luZyAlYXJyYXlfY2xhc3MgYW5kICVhcnJheV9mdW5jdGlvbnMuCgoyMDE2LTEyLTE4OiB0LWlrZWdhbWkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICM0NDYKICAgICAgICAgICAgUHl0aG9uICVhcnJheV9jbGFzcyBvZiBjYXJyYXlzLmkgZmFpbGVkIHdpdGggLWJ1aWx0aW4gb3B0aW9uLgoKMjAxNi0xMi0xNjogYnJpYW5jYWluZQogICAgICAgICAgICBbR3VpbGVdIFBhdGNoICM3NDQgQWRkZWQgc3VwcG9ydCBmb3IgR3VpbGUncyBuYXRpdmUgcG9pbnRlciBmdW5jdGlvbmFsaXR5CgoyMDE2LTEyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjNzY5LgogICAgICAgICAgICBBZGQgb3B0aW9uYWwgbW9kdWxlaW1wb3J0IGF0dHJpYnV0ZSB0byAlbW9kdWxlIHNvIHRoYXQgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgbW9kdWxlIGltcG9ydCBjb2RlIGNhbiBiZSBvdmVycmlkZGVuLiBTZWUgdGhlICJTZWFyY2hpbmcgZm9yIHRoZSB3cmFwcGVyIG1vZHVsZSIKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiBpbiBQeXRob24uaHRtbC4gRXhhbXBsZToKCiAgICAgICAgICAgICAgJW1vZHVsZShtb2R1bGVpbXBvcnQ9ImltcG9ydCBfZm9vIikgZm9vCgogICAgICAgICAgICAkbW9kdWxlIGFsc28gZXhwYW5kcyB0byB0aGUgbG93LWxldmVsIEMvQysrIG1vZHVsZSBuYW1lLCBzbyB0aGUgZm9sbG93aW5nIGlzIHRoZQogICAgICAgICAgICBzYW1lIGFzIGFib3ZlCgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJpbXBvcnQgJG1vZHVsZSIpIGZvbwoKMjAxNi0xMS0zMDogb2xseQoJICAgIFtQSFBdIEFkZCBzdXBwb3J0IGZvciBQSFA3LiAgUEhQNSdzIEMgZXh0ZW5zaW9uIEFQSSBoYXMgY2hhbmdlZAoJICAgIHN1YnN0YW50aWFsbHkgc28geW91IG5lZWQgdG8gdXNlIC1waHA3IHRvIHNwZWNpZnkgeW91IHdhbnQgUEhQNwoJICAgIGNvbXBhdGlibGUgd3JhcHBlcnMuICBUaGUgZGVmYXVsdCBleHRlbnNpb24gZm9yIGdlbmVyYXRlZCB3cmFwcGVycwoJICAgIGlzIG5vdyAuY3h4ICh0byBtYXRjaCBTV0lHJ3MgZGVmYXVsdCBmb3IgZXZlcnkgb3RoZXIgbGFuZ3VhZ2UgLSB0bwoJICAgIGdlbmVyYXRlIGZvb193cmFwLmNwcCB5b3UgY2FuIHJ1biBTV0lHIHdpdGggLWNwcGV4dCBjcHApLiAgRml4ZXMKCSAgICBpc3N1ZSAjNTcxLgoKCSAgICBBcyBwYXJ0IG9mIHRoaXMgY2hhbmdlLCB0aGUgbGFuZ3VhZ2Ugc3ViZGlyZWN0b3J5IGZvciBQSFA1IGhhcwoJICAgIGNoYW5nZWQgZnJvbSAicGhwIiB0byAicGhwNSIgLSBpZiB5b3UgYXJlIG1ha2luZyB1c2Ugb2YgdGhlIHNlYXJjaAoJICAgIHBhdGggZmVhdHVyZSB3aGVyZSB0aGUgbGFuZ3VhZ2Ugc3ViZGlyZWN0b3J5IG9mIGVhY2ggZGlyZWN0b3J5CgkgICAgaXMgYWxzbyBzZWFyY2hlZCwgeW91J2xsIG5lZWQgdG8gdXBkYXRlIHlvdXIgYmluZGluZ3MuICBBIHNpbXBsZQoJICAgIGZpeCB3aGljaCB3b3JrcyBmb3Igb2xkZXIgYW5kIG5ld2VyIFNXSUcgaXMgdG8gYWRkIGEgc3ltbGluazoKCSAgICBsbiAtcyBwaHAgcGhwNQoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMTEtMzA6IG9sbHkKCSAgICBbUEhQXSBPbmx5IGVtaXQgb25lIGNvcHkgb2YgZWFjaCBkaXN0aW5jdCBhcmdpbmZvLiAgUHJldmlvdXNseSB3ZQoJICAgIGVtaXR0ZWQgYSBzZXBhcmF0ZSBvbmUgZm9yIGV2ZXJ5IHdyYXBwZWQgZnVuY3Rpb24sIGJ1dCB0eXBpY2FsbHkKCSAgICBtYW55IGZ1bmN0aW9ucyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBwYXJhbWV0ZXJzIGFuZCBjb21iaW5hdGlvbnMKCSAgICBvZiBwYXJhbWV0ZXJzIHBhc3NlZCBieSByZWZlcmVuY2Ugb3Igbm90LgoKCSAgICBUaGlzIGNoYW5nZSBzaWduaWZpY2FudGx5IHJlZHVjZXMgYm90aCB0aGUgc2l6ZSBvZiB0aGUgZ2VuZXJhdGVkCgkgICAgd3JhcHBlciwgYW5kIG9mIHRoZSBjb21waWxlZCBQSFAgZXh0ZW5zaW9uIG1vZHVsZSAoZS5nLiBieSB+NiUgZm9yCgkgICAgdGhlIHN0cmlwcGVkIGV4dGVuc2lvbiBtb2R1bGUgZm9yIFhhcGlhbidzIFBIUDcgYmluZGluZ3MpLgoKMjAxNi0xMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVyZW5hbWUgb3ZlcnJpZGUgb2Ygd2lsZGNhcmQgJXJlbmFtZSBmb3IgdGVtcGxhdGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShHbG9iYWxJbnRPcGVyYXRvcikgKjo6b3BlcmF0b3IgYm9vbDsgLy8gd2lsZGNhcmQgJXJlbmFtZQoKICAgICAgICAgICAgICAlcmVuYW1lKFhJbnRPcGVyYXRvcikgWDo6b3BlcmF0b3IgYm9vbDsgLy8gZml4IG5vdyBvdmVycmlkZXMgZmlyc3QgJXJlbmFtZSBhYm92ZQogICAgICAgICAgICAgIE9SCiAgICAgICAgICAgICAgJXJlbmFtZShYSW50T3BlcmF0b3IpIFg8aW50Pjo6b3BlcmF0b3IgYm9vbDsgLy8gZml4IG5vdyBvdmVycmlkZXMgZmlyc3QgJXJlbmFtZSBhYm92ZQoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBvcGVyYXRvciBib29sKCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShYaW50KSBYPGludD47CgogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgJXJlbmFtZSBvdmVycmlkZSBvZiBnbG9iYWwgJXJlbmFtZSBmb3IgdGVtcGxhdGVzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgLy8gR2xvYmFsIHJlbmFtZSB0byBtYWtlIGFsbCBmdW5jdGlvbnMgc3RhcnQgd2l0aCBhIGxvd2VyIGNhc2UgbGV0dGVyCiAgICAgICAgICAgICAgJXJlbmFtZSgiJShmaXJzdGxvd2VyY2FzZSlzIiwgJSRpc2Z1bmN0aW9uICkgIiI7CiAgICAgICAgICAgICAgJXJlbmFtZSh3b29ob28pIFc6OldvbzsgLy8gZml4IG5vdyBvdmVycmlkZXMgYWJvdmUgJXJlbmFtZQoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgVyB7CiAgICAgICAgICAgICAgICBXIFdvbygpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoV2ludCkgVzxpbnQ+OwoKICAgICAgICAgICAgVGhlIGFib3ZlIGFsc28gaW50cm9kdWNlcyBhIHBvc3NpYmx5IHVuZXhwZWN0ZWQgY2hhbmdlLiBNYW55IG9mIHRoZSBTVEwgY29udGFpbmVycwogICAgICAgICAgICBwcm92aWRlZCBieSBTV0lHIHVzZSAlcmVuYW1lIHRvIHJlbmFtZSBzb21lIG1ldGhvZHMsIGVnIGluIHN0ZDo6dmVjdG9yLCBwdXNoX2JhY2sKICAgICAgICAgICAgaXMgcmVuYW1lZCB0byBhZGQgaW4gSmF2YS4gUHJldmlvdXNseSB0aGlzIGludGVuZGVkIHJlbmFtZSBkaWQgbm90IGhhcHBlbiB3aGVuIHVzaW5nCiAgICAgICAgICAgIHVzaW5nIGdsb2JhbCAlcmVuYW1lIHJ1bGVzIGFuZCB0aGUgbWV0aG9kIHdvdWxkIHJlbWFpbiBhcyBwdXNoX2JhY2ssIGJ1dCBpcyBub3cKICAgICAgICAgICAgcmVuYW1lZCB0byBhZGQuIFNvbWUgbW9yZSBpbmZvIGluIGlzc3VlICM4NTYuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNi0xMS0yNjogbTd0aG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICM3MDkgLSBpbXByb3ZlZCB3cmFwcGluZyBvZiBkaXZpc2lvbiBvcGVyYXRvcnMKICAgICAgICAgICAgJ2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgZGl2aXNpb24nIG5vdyB3b3JrcyBpbiBQeXRob24gMiB3aGV0aGVyIG9yIG5vdCB0aGUKICAgICAgICAgICAgLXB5MyBmbGFnIGlzIHVzZWQuCgoyMDE2LTExLTEyOiBqb2VxdWFudAogICAgICAgICAgICBbUl0gSXNzdWUgIzY5NyAtIGZpeCBjb21tYSBpc3N1ZSB3aXRoIG92ZXJsb2FkIG1ldGhvZHMKCjIwMTYtMTEtMTI6IGpvZXF1YW50CgkgICAgW1JdIElzc3VlICM1NTUgLSBSIHJ1bnRpbWUgbmVlZHMgc3RkaW8uaAoKMjAxNi0xMS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzgxNiAtIGZpeCBjb21waWxhdGlvbiBlcnJvciB3aGVuIHVzaW5nIC1leHRyYW5hdGl2ZSBhbmQgLWJ1aWx0aW4uCgoyMDE2LTExLTAyOiBsaW9yZ29sZAogICAgICAgICAgICBQYXRjaCAjNzQxIC0gQWRkIHN1cHBvcnQgZm9yIEMrKzExIGFsaWFzIHRlbXBsYXRlcywgc2VlIHVwZGF0ZWQgQ1BsdXNQbHVzMTEuaHRtbAogICAgICAgICAgICBkb2N1bWVudGF0aW9uLgoKMjAxNi0xMC0zMDogbXlkNzM0OQogICAgICAgICAgICBbQyNdIFBhdGNoICM3NDAgQWRkIHN0ZF9hcnJheS5pIGZvciBDIyBmb3Igd3JhcHBpbmcgc3RkOjphcnJheS4KCiAgICAgICAgICAgIFBhdGNoIGFsc28gZW5oYW5jZXMgc3RkOjp2ZWN0b3I8c3RkOjp3c3RyaW5nPiBDIyB3cmFwcGVycyB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25zCiAgICAgICAgICAgIChDb250YWlucywgSW5kZXhPZiwgTGFzdEluZGV4T2YgYW5kIFJlbW92ZSkuCgoyMDE2LTEwLTMwOiB0b2JpbGF1CiAgICAgICAgICAgIFtKYXZhXSBGaXggd3JhcHBlcnMgZm9yIHdzdHJpbmcgcGFyYW1ldGVycyBpbiBkaXJlY3RvciBtZXRob2RzIHRvIGNsZWFudXAgbG9jYWwKICAgICAgICAgICAgcmVmIGFmdGVyIGRpcmVjdG9yIGNhbGxiYWNrIGhhcyBmaW5pc2hlZC4KCjIwMTYtMTAtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIG1pc3NpbmcgY3NkaXJlY3RvcmluIFZPSURfSU5UX1BUUiBhbmQgY3NkaXJlY3Rvcm91dCBWT0lEX0lOVF9QVFIgdHlwZW1hcHMuCgoyMDE2LTEwLTIzOiBqaXVsb25ndwogICAgICAgICAgICBQYXRjaCAjNzgxIC0gRml4IHdyYXBwaW5nIG9mIEMgY29tcG91bmQgZXhwcmVzc2lvbnMgY29udGFpbmluZyBjaGFyIGNvbnN0YW50cwogICAgICAgICAgICBpbiBxdW90ZXMgc3VjaCBhczoKCiAgICAgICAgICAgICAgI2RlZmluZSBIX1NVUFBSRVNTX1NDQUxJTkdfTUFHSUMgKCgncyc8PDI0KSB8ICgndSc8PDE2KSB8ICgncCc8PDgpIHwgJ3AnKQoKICAgICAgICAgICAgICBlbnVtIERpZmZlcmVudFR5cGVzIHsKICAgICAgICAgICAgICAgIHR5cGVjaGFyY29tcG91bmQ9J0EnKzEsCiAgICAgICAgICAgICAgICB0eXBlY2hhcmNvbXBvdW5kMj0nQicgPDwgMgogICAgICAgICAgICAgIH07CgoyMDE2LTEwLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjODA4IC0gZml4IFB5dGhvbiBwaWNrbGluZyBhbmQgbWV0YWNsYXNzIGZvciBidWlsdGluIHdyYXBwZXJzLgoKICAgICAgICAgICAgVGhlIG1ldGFjbGFzcyAoU3dpZ1B5T2JqZWN0VHlwZSkgZm9yIFNXSUcgb2JqZWN0cyB3YXMgbm90IGRlZmluZWQgaW4KICAgICAgICAgICAgYSB3YXkgdGhhdCBsZXQgaW1wb3J0bGliIHN1Y2Nlc3NmdWxseSBpbXBvcnQgdGhlIFB5dGhvbiB3cmFwcGVycy4KICAgICAgICAgICAgVGhlIHBpY2tsZSBtb2R1bGUgcHJldmlvdXNseSBmYWlsZWQgdG8gcGlja2xlIG9iamVjdHMgYmVjYXVzZSBpdCBjb3VsZG4ndAogICAgICAgICAgICBkZXRlcm1pbmUgd2hhdCBtb2R1bGUgdGhlIFNXSUcgd3JhcHBlZCBvYmplY3RzIHdlcmUgaW4uCgoyMDE2LTA5LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQWxsZWdyb2NsLCBDRkZJLCBHTywgSmF2YXNjcmlwdCwgT2NhbWwsIFIsIFNjaWxhYl0KICAgICAgICAgICAgQWRkIG1pc3Npbmcgc3VwcG9ydCBmb3IgdGhlICJyZXQiIHR5cGVtYXAgaW4gYSBmZXcgdGFyZ2V0IGxhbmd1YWdlcy4KICAgICAgICAgICAgVGhlIGRvY3VtZW50YXRpb24gYWxzbyBub3cgaGFzIGluZm8gb24gdGhlICJyZXQiIHR5cGVtYXAuCgoyMDE2LTA5LTI3OiBhaG1lZC11c21hbgogICAgICAgICAgICBbeG1sXSBIYW5kbGUgdGVtcGxhdGUgcGFyYW1ldGVycyBjb3JyZWN0bHkuCgoyMDE2LTA5LTI3OiBkb250cGFuaWM5MgogICAgICAgICAgICBbR29dIEZpeCBhcmd1bWVudCBuYW1lcyBpbiBpbmhlcml0ZWQgZnVuY3Rpb25zIHRha2luZyBtb3JlIHRoYW4gOAogICAgICAgICAgICBwYXJhbWV0ZXJzLiAgRml4ZXMgIzc5NS4KCjIwMTYtMDktMjY6IHNtYXJjaGV0dG8KICAgICAgICAgICAgW1NjaWxhYl0gbWxpc3RzIHRoYXQgbWFwIHBvaW50ZXJzIGNhbiBiZSBnaXZlbiBhIGN1c3RvbSB0eXBlIG5hbWUuCgoyMDE2LTA5LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjNzkzIGZyb20gcS1wIHRvIGV4cGFuZCBleGNlcHRpb24gaGFuZGxpbmcgdG8gaW5jbHVkZSBzdGQ6OmJhZF9jYXN0CiAgICAgICAgICAgIGluIHN0ZF9leGNlcHQuaS4KCjIwMTYtMDktMjQ6IG9sbHkKICAgICAgICAgICAgW1BIUF0gRml4IGNvZGUgZ2VuZXJhdGVkIGZvciBmZWF0dXJlKCJkaXJlY3RvcjpleGNlcHQiKSAtCiAgICAgICAgICAgIHByZXZpb3VzbHkgdGhlIHJldHVybiB2YWx1ZSBvZiBjYWxsX3VzZXJfZnVuY3Rpb24oKSB3YXMgaWdub3JlZCBhbmQKICAgICAgICAgICAgd2UgY2hlY2tlZCBhbiB1bmluaXRpYWxpc2VkIHZhbHVlIGluc3RlYWQuICBGaXhlcyAjNjI3LiAgQmFzZWQgb24KICAgICAgICAgICAgcGF0Y2ggZnJvbSBTZXJnZXkgU2Vyb3NodGFuLgoKMjAxNi0wOS0yMjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gTW9yZSBmbGV4aWJsZSBweXRob24gYnVpbHRpbiBzbG90cyBmb3Igb3ZlcmxvYWRlZCBDKysgZnVuY3Rpb24uCgogICAgICAgICAgICBUaGUgY2xvc3VyZSBuYW1lcyB1c2VkIGZvciBidWlsdGluIHNsb3RzIGFyZSBtYW5nbGVkIHdpdGggdGhlaXIgZnVuY3R5cGUgc28KICAgICAgICAgICAgdGhhdCBvdmVybG9hZGVkIEMrKyBtZXRob2QgbmFtZXMgY2FuIGJlIHVzZWQgZm9yIG11bHRpcGxlIHNsb3RzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInB5dGhvbjpzbG90IiwgIm1wX3N1YnNjcmlwdCIsIGZ1bmN0eXBlPSJiaW5hcnlmdW5jIikgU2ltcGxlQXJyYXk6Ol9fZ2V0aXRlbV9fOwogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246c2xvdCIsICJzcV9pdGVtIiwgZnVuY3R5cGU9InNzaXplYXJnZnVuYyIpIFNpbXBsZUFycmF5OjpfX2dldGl0ZW1fXyhQeV9zc2l6ZV90IG4pOwoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBjbG9zdXJlczoKCiAgICAgICAgICAgICAgU1dJR1BZX1NTSVpFQVJHRlVOQ19DTE9TVVJFKF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fKSAvKiBkZWZpbmVzIF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fX3NzaXplYXJnZnVuY19jbG9zdXJlICovCiAgICAgICAgICAgICAgU1dJR1BZX0JJTkFSWUZVTkNfQ0xPU1VSRShfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fXykgLyogZGVmaW5lcyBfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fX19iaW5hcnlmdW5jX2Nsb3N1cmUgKi8KCiAgICAgICAgICAgIFByZXZpb3VzbHkgb25seSBvbmUgbmFtZSB3YXMgZGVmaW5lZDogX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX19fY2xvc3VyZS4KICAgICAgICAgICAgSGVuY2UgdGhlIG92ZXJsb2FkZWQgX19nZXRpdGVtX18gbWV0aG9kIGNhbiBiZSB1c2VkIHRvIHN1cHBvcnQgYm90aCBtcF9zdWJzY3JpcHQgYW5kIHNxX2l0ZW0gc2xvdHMuCgoyMDE2LTA5LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggaXRlcmF0b3JzIGZvciBjb250YWluZXJzIG9mIE5VTEwgcG9pbnRlcnMgKG9yIFB5dGhvbiBOb25lKSB3aGVuIHVzaW5nCiAgICAgICAgICAgIC1idWlsdGluLiBQcmV2aW91c2x5IGl0ZXJhdGlvbiB3b3VsZCBzdG9wIGF0IHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgd2FzIE5VTEwuCgoyMDE2LTA5LTE2OiBvbGx5CiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBGaXggU1dJR19leGNlcHRpb24oKSBtYWNybyB0byByZXR1cm4gZnJvbSB0aGUgY3VycmVudAogICAgICAgICAgICBmdW5jdGlvbi4gIEZpeGVzICM3ODksIHJlcG9ydGVkIGJ5IEp1bGllbiBEdXRyaWF1eC4KCjIwMTYtMDktMTY6IG9sbHkKICAgICAgICAgICAgW1BIUF0gRml4IFNXSUdfZXhjZXB0aW9uKCkgbWFjcm8gdG8gcmV0dXJuIGZyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCiAgICAgICAgICAgIEZpeGVzICMyNDAsIHJlcG9ydGVkIGJ5IFNlcmdleSBTZXJvc2h0YW4uCgoyMDE2LTA5LTEyOiB4eXByb24KICAgICAgICAgICAgW0MjXSBQYXRjaCAjNzg2IEtleXdvcmQgcmVuYW1lIHRvIGJlIENMUyBjb21wbGlhbnQgYnkgYWRkaW5nIGFuIHVuZGVyc2NvcmUKICAgICAgICAgICAgc3VmZml4IGluc3RlYWQgb2YgYW4gdW5kZXJzY29yZSBwcmVmaXggdG8gdGhlIEMgc3ltYm9sIG5hbWUuIFBsZWFzZSB1c2UgYW4gZXhwbGljaXQKICAgICAgICAgICAgJXJlbmFtZSB0byByZW5hbWUgdGhlIHN5bWJvbCB3aXRoIGEgXyBwcmVmaXggaWYgeW91IHdhbnQgdGhlIG9sZCBzeW1ib2wgbmFtZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNi0wOS0wOTogb2xseQogICAgICAgICAgICBbUHl0aG9uXSBGaXggaW1wb3J0IGhhbmRsaW5nIGZvciBQeXRob24gMi42IHRvIHdvcmsgaW4gYSBmcm96ZW4KICAgICAgICAgICAgYXBwbGljYXRpb24uICBGaXhlcyAjMTQ1LCByZXBvcnRlZCBieSBUaG9tYXMgS2x1eXZlci4KCjIwMTYtMDktMDI6IHNtYXJjaGV0dG8KICAgICAgICAgICAgW1NjaWxhYl0gUG9pbnRlcnMgYXJlIG1hcHBlZCB0byBtbGlzdCBpbnN0ZWFkIG9mIHRsaXN0CiAgICAgICAgICAgIChtbGlzdCBiZXR0ZXIgZm9yIHNjaWxhYiBvdmVybG9hZGluZykKCjIwMTYtMDktMDI6IG9sbHkKICAgICAgICAgICAgW1BIUF0gRml4ICJvdXQiIHR5cGVtYXAgZm9yIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyBhbmQgImluIgogICAgICAgICAgICB0eXBlbWFwIGZvciBjaGFyIElOUFVUW0FOWV0uCgoyMDE2LTA5LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBNb3JlIGVmZmljaWVudCBQeXRob24gc2xpY2luZy4KICAgICAgICAgICAgQ2FsbCByZXNlcnZlIGZvciBjb250YWluZXIgdHlwZXMgdGhhdCBzdXBwb3J0IGl0IHRvIGF2b2lkIHJlcGVhdGVkCiAgICAgICAgICAgIG1lbW9yeSByZWFsbG9jYXRpb25zIGZvciBuZXcgc2xpY2VzIG9yIHNsaWNlcyB0aGF0IGdyb3cgaW4gc2l6ZS4KCjIwMTYtMDktMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM3NzEgLSBNYWtlIGJ1aWx0aW4gdHlwZXMgaGFzaGFibGUgYnkgZGVmYXVsdC4KICAgICAgICAgICAgRGVmYXVsdCBoYXNoIGlzIHRoZSB1bmRlcmx5aW5nIEMvQysrIHBvaW50ZXIuIFRoaXMgbWF0Y2hlcyB1cCB3aXRoIHRlc3RpbmcgZm9yCiAgICAgICAgICAgIGVxdWl2YWxlbmNlIChQeV9FUSBpbiBTd2lnUHlPYmplY3RfcmljaGNvbXBhcmUpIHdoaWNoIGNvbXBhcmVzIHRoZSBwb2ludGVycy4KCjIwMTYtMDgtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFRoZSBmb2xsb3dpbmcgYnVpbHRpbiBzbG90cyBjYW4gYmUgY3VzdG9taXplZCBsaWtlIG90aGVyIHNsb3RzIHZpYSB0aGUKICAgICAgICAgICAgInB5dGhvbjo8eD4iIGFuZCAicHl0aG9uOnNsb3QiIGZlYXR1cmVzIHdoZXJlIDx4PiBpcyB0aGUgYXBwcm9wcmlhdGUgc2xvdCBuYW1lOgogICAgICAgICAgICAgIHRwX2FsbG9jcwogICAgICAgICAgICAgIHRwX2Jhc2VzCiAgICAgICAgICAgICAgdHBfYmFzaWNzaXplCiAgICAgICAgICAgICAgdHBfY2FjaGUKICAgICAgICAgICAgICB0cF9kZWwKICAgICAgICAgICAgICB0cF9kZWFsbG9jCiAgICAgICAgICAgICAgdHBfZmxhZ3MKICAgICAgICAgICAgICB0cF9mcmVlcwogICAgICAgICAgICAgIHRwX2dldHNldAogICAgICAgICAgICAgIHRwX2lzX2djCiAgICAgICAgICAgICAgdHBfbWF4YWxsb2MKICAgICAgICAgICAgICB0cF9tZXRob2RzCiAgICAgICAgICAgICAgdHBfbXJvCiAgICAgICAgICAgICAgdHBfbmV3CiAgICAgICAgICAgICAgdHBfbmV4dAogICAgICAgICAgICAgIHRwX3ByZXYKICAgICAgICAgICAgICB0cF9yaWNoY29tcGFyZQogICAgICAgICAgICAgIHRwX3N1YmNsYXNzZXMKICAgICAgICAgICAgICB0cF93ZWFrbGlzdAogICAgICAgICAgICAgIHdhc19zcV9hc3Nfc2xpY2UKICAgICAgICAgICAgICB3YXNfc3Ffc2xpY2UKCiAgICAgICAgICAgIEEgZmV3IGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIGZvciBzbG90IGN1c3RvbWl6YXRpb24uCgoyMDE2LTA4LTA5OiBqb2VxdWFudAogICAgICAgICAgICBbUl0gUGF0Y2ggIzc2NSBGaXggZXh0ZXJuICJDIiBoZWFkZXIgaW5jbHVkZXMgZm9yIEMrKyBjb2RlLgoKMjAxNi0wOC0wNTogb2xseQogICAgICAgICAgICBbeG1sXSBGaXggaG93IHRoZSBvdXRwdXQgZmlsZW5hbWUgaXMgYnVpbHQgdG8gYXZvaWQgcHJvYmxlbXMgd2hlbgogICAgICAgICAgICBpdCBjb250YWlucyB0aGUgZW1iZWRkZWQgc3RyaW5ncyAiLmMiLCAiLmNwcCIgb3IgIi5jeHgiLgogICAgICAgICAgICBGaXhlcyAjNTQwIHJlcG9ydGVkIGJ5IGRqYWNrNDIuCgoyMDE2LTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY29ybmVyIGNhc2Ugb2Ygd3JhcHBpbmcgc3RkOjp2ZWN0b3Igb2YgVCBwb2ludGVycyB3aGVyZSBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIG9mIFQKICAgICAgICAgICAgYWxzbyBleGlzdHMgaW4gdGhlIHdyYXBwZWQgY29kZS4gU0YgQnVnIDIzNTk0MTcgKDk2NykuCgoyMDE2LTA2LTI2OiB3a2FsaW5pbgogICAgICAgICAgICBbSmF2YSwgQyNdIFBhdGNoICM2ODEgRml4IHNlZyBmYXVsdCB3aGVuIGlnbm9yaW5nIG5lc3RlZCBjbGFzc2VzLgoKMjAxNi0wNi0yNTogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gIzcxMSBGaXggLWNhc3Rtb2RlIGFuZCBjb252ZXJzaW9uIG9mIHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlciB0eXBlcy4KICAgICAgICAgICAgU2VlIDIwMTUtMTItMjMgQ0hBTkdFUyBlbnRyeSBmb3IgZGV0YWlscyBvZiB0aGVzZSBpbXByb3ZlbWVudHMgd2hlbiB0aGV5IHdlcmUKICAgICAgICAgICAgaW1wbGVtZW50ZWQgZm9yIHRoZSBkZWZhdWx0IG9wdGlvbnMgKGllIG5vdCB1c2luZyAtY2FzdG1vZGUpLgoKMjAxNi0wNi0yNTogYWhub2xkcwogICAgICAgICAgICBQYXRjaCAjNzMwIC0gRml4ICVpbXBsaWNpdGNvbnYgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHdoZW4gdXNpbmcKICAgICAgICAgICAgLWNhc3Rtb2RlIG9yIC1mYXN0ZGlzcGF0Y2ggb3B0aW9ucy4KCiAgICAgICAgICAgIFRoZSByZXN1bHQgaXMgdGhhdCBpbiBhbGwgb3ZlcmxvYWQgY2FzZXMgd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIHBvc3NpYmlsaXRpZXMKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzLCB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24gd2lsbCBmaXJzdCBjaGVjayBmb3IKICAgICAgICAgICAgZXhhY3QgKGFrYSBub24gaW1wbGljaXQpIG1hdGNoZXMsIGFuZCB0aGVuIHN1YnNlcXVlbnRseSBjaGVjayBmb3IgaW1wbGljaXQKICAgICAgICAgICAgY2FzdGluZyBtYXRjaGVzLiBUaGlzIHdhcyBhbHJlYWR5IGhhcHBlbmluZyBpbiB0aGUgbm9ybWFsIGRpc3BhdGNoIHNpdHVhdGlvbiwKICAgICAgICAgICAgYW5kIGluIHRoZSAtZmFzdGRpc3BhdGNoIGNhc2UgdHdvIHBhc3NlcyB0aHJvdWdoIHRoZSBjYW5kaWRhdGVzIHdlcmUgaGFwcGVuaW5nLAogICAgICAgICAgICBqdXN0IHdpdGggU1dJR19QT0lOVEVSX0lNUExJQ0lUX0NPTlYgYWx3YXlzIHNldC4gQWZ0ZXIgdGhpcyBwYXRjaCwgaXQgaXMgbm90IHNldAogICAgICAgICAgICBvbiB0aGUgZmlyc3QgcGFzcywgYW5kIHRoZW4gc2V0IG9uIHRoZSBzZWNvbmQgcGFzcy4KCjIwMTYtMDYtMjU6IGxpb3Jnb2xkCiAgICAgICAgICAgIFBhdGNoICM3MjcgLSBBZGQgc3VwcG9ydCBmb3IgQysrMTEgdHlwZSBhbGlhc2luZy4KClZlcnNpb24gMy4wLjEwICgxMiBKdW4gMjAxNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNi0wNi0wNjogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzY5OC4gQWRkIHN1cHBvcnQgZm9yIC1yZWxhdGl2ZWltcG9ydCBmb3IgcHl0aG9uIDIuNywgc28gLXB5MyBpcyBubwogICAgICAgICAgICBsb25nZXIgYWxzbyByZXF1aXJlZCBmb3IgcmVsYXRpdmUgaW1wb3J0IHN1cHBvcnQuCgoyMDE2LTA2LTA1OiBtcm9tYmVyZwogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjNjk0IC0gRml4IHBhY2thZ2UgaW1wb3J0IHJlZ3Jlc3Npb25zIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuOS4KCiAgICAgICAgICAgIDEpIFRoZSBjb2RlIGluIDMuMC45IGRpZCBub3QgZmFsbCBiYWNrIHRvICdpbXBvcnQgX2ZvbycgaWYgJ2ltcG9ydCBiYXIuX2ZvbycgZmFpbGVkCiAgICAgICAgICAgIChhc3N1bWluZyBiYXIuZm9vIHdhcyB0aGUgbWFpbiBtb2R1bGUpLiBFdmVyeSBwbGFjZSBfZm9vIGlzIGltcG9ydGVkIG5vdyBmaXJzdCB0cmllcwogICAgICAgICAgICBpdCBmcm9tIHRoZSBwYWNrYWdlIHdoZXJlIGZvbyB3YXMgZm91bmQgYW5kIGlmIHRoYXQgZmFpbHMgdHJpZXMgX2ZvbyBhcyBhIGdsb2JhbCBtb2R1bGUuCgogICAgICAgICAgICAyKSBUaGUgc2VwYXJhdGUgYmxvY2sgb2YgUHl0aG9uIGNvZGUgdGhhdCBpbmplY3RlZCBjb2RlIHRvIHB1bGwgaW4gdGhlIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZnJvbSBfZm9vIHdoZW4gLWJ1aWx0aW4gaXMgdXNlZCBtYWRlIHVzZSBvZiB0aGUgLXB5MyBzd2l0Y2ggdG8gZWl0aGVyIGRvCiAgICAgICAgICAgICdmcm9tIC5fZm9vIGltcG9ydCAqJyBvciAiZnJvbSBfZm9vIGltcG9ydCAqIi4gVGhpcyBibG9jayBvZiBjb2RlIG5vIGxvbmdlciBkb2VzIHRoaXMKICAgICAgICAgICAgYW5kIGluc3RlYWQgY2hlY2tzIHRoZSBQeXRob24gdmVyc2lvbiBhdCBydW50aW1lIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28gc3ludGF4ZXMuCgogICAgICAgICAgICBJbiBzdW1tYXJ5LCBzd2lnLTMuMC4xMCBoYXMgYmVlbiBtb2RpZmllZCB0byBlYXNlIHRoZSBjcmVhdGlvbiBvZiB3cmFwcGVyIG1vZHVsZXMKICAgICAgICAgICAgdGhhdCBjYW4gYmUgZnVsbHkgbWFkZSBwYXJ0IG9mIGEgUHl0aG9uIHBhY2thZ2UuICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgICBhc3N1bWVzIHRoZSBkeW5hbWljYWxseSBsaW5rZWQgQyBtb2R1bGUgaXMgYSBnbG9iYWwgbW9kdWxlLgogICAgICAgICAgICBUaGUgZHluYW1pYyBtb2R1bGUgY2FuIG5vdyBiZSBwbGFjZWQgaW50byBlaXRoZXIgdGhlIHNhbWUgcGFja2FnZSBhcyB0aGUgcHVyZSBQeXRob24KICAgICAgICAgICAgbW9kdWxlIG9yIGFzIGEgZ2xvYmFsIG1vZHVsZS4gIEJvdGggbG9jYXRpb25zIGFyZSB1c2VkIGJ5IHRoZSBQeXRob24gd3JhcHBlciB0bwogICAgICAgICAgICBsb2NhdGUgdGhlIEMgbW9kdWxlLgoKICAgICAgICAgICAgSG93ZXZlciwgdGhpcyBjb3VsZCBjYXVzZSBhIGJhY2t3YXJkcyBpbmNvbXBhdGliaWxpdHkgd2l0aCBzb21lIGNvZGUKICAgICAgICAgICAgdGhhdCB3YXMgcmVseWluZyBvbiB0aGUgYWJpbGl0eSBvZiAiZnJvbSBwYWNrYWdlIGltcG9ydCBfbW9kdWxlIiB0bwogICAgICAgICAgICBwdWxsIGF0dHJpYnV0ZXMgb3V0IG9mIHRoZSBwYWNrYWdlIGRpcmVjdGx5LiAgSWYgeW91ciBjb2RlIHBvcHVsYXRlcyBhCiAgICAgICAgICAgIG1vZHVsZSAod2hpY2ggaXMgYWxzbyBhIHBhY2thZ2UpIHdpdGggYXR0cmlidXRlcyB0aGF0IGFyZSBTV0lHCiAgICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzIHdoaWNoIHdlcmUgbm90IGxvYWRlZCBpbiBhIGNvbnZlbnRpb25hbCB3YXksCiAgICAgICAgICAgIHN3aWctMy4wLjggYW5kIGVhcmxpZXIgbWF5IGhhdmUgd29ya2VkIGR1ZSB0byAnZnJvbSBwYWNrYWdlIGltcG9ydAogICAgICAgICAgICBfbW9kdWxlJyBieXBhc3NpbmcgYSByZWFsIGltcG9ydCBhbmQgcHVsbGluZyB5b3VyIG1vZHVsZSBpbiBhcyBhbgogICAgICAgICAgICBhdHRyaWJ1dGUuIFRoaXMgd2lsbCBubyBsb25nZXIgd29yay4gIFNpbmNlIHRoaXMgaXMgbm90IGEgY29tbW9uIChvcgogICAgICAgICAgICBldmVuIHJlY29tbWVuZGVkKSBwcmFjdGljZSwgbW9zdCBmb2xrIHNob3VsZCBub3QgYmUgYWZmZWN0ZWQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMDUtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjkwIC0gU21hcnQgcG9pbnRlciB0byAlaWdub3JlZCBjbGFzcyBkb2Vzbid0IGV4cG9zZSBpbmhlcml0ZWQgbWV0aG9kcy4KICAgICAgICAgICAgUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjkuCgpWZXJzaW9uIDMuMC45ICgyOSBNYXkgMjAxNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE2LTA1LTI0OiBtcm9tYmVyZwogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjNjEyIC0gQWRkIHN1cHBvcnQgZm9yIFB5dGhvbidzIGltcGxpY2l0IG5hbWVzcGFjZSBwYWNrYWdlcy4KCjIwMTYtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzYwMiAtIEVycm9yIGhhbmRsaW5nIHJlZ3Jlc3Npb24gb2Ygb3BhcXVlIHBvaW50ZXJzIGludHJvZHVjZWQKICAgICAgICAgICAgaW4gc3dpZy0zLjAuOCB3aGVuIEMgZnVuY3Rpb25zIGV4cGxpY2l0bHkgcmVzZXQgYSBwb2ludGVyIHVzaW5nICdEQVRBX1BUUihzZWxmKSA9IDAnLgogICAgICAgICAgICBBbiBPYmplY3RQcmV2aW91c2x5RGVsZXRlZCBlcnJvciB3YXMgaW5jb3JyZWN0bHkgdGhyb3duIHdoZW4gdGhlIHBvaW50ZXIgd2FzIHVzZWQKICAgICAgICAgICAgYXMgYSBwYXJhbWV0ZXIuCgoyMDE2LTA1LTE3OiB0YW11cmF0YWsKICAgICAgICAgICAgW1J1YnldIFBhdGNoICM2NTEgLSBDb3JyZWN0IG92ZXJsb2FkZWQgZnVuY3Rpb24gZXJyb3IgbWVzc2FnZSB3aGVuIGZ1bmN0aW9uIGlzCiAgICAgICAgICAgIHVzaW5nICVuZXdvYmplY3QuCgoyMDE2LTA1LTE3OiBhdXJlbGoKICAgICAgICAgICAgW1J1YnldIFBhdGNoICM1ODIgLSBhZGQgc3VwcG9ydCBmb3IgZG9jc3RyaW5nIG9wdGlvbiBpbiAlbW9kdWxlKCkKCjIwMTYtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNDM0IC0gUGFzc2luZyBjbGFzc2VzIGJ5IHZhbHVlIGFzIHBhcmFtZXRlcnMgaW4gZGlyZWN0b3IgbWV0aG9kcyBkaWQgbm90IGNyZWF0ZQogICAgICAgICAgICBhIGNvcHkgb2YgdGhlIGFyZ3VtZW50IGxlYWRpbmcgdG8gaW52YWxpZCBtZW1vcnkgYWNjZXNzZXMgaWYgdGhlIG9iamVjdCB3YXMgdXNlZAogICAgICAgICAgICBhZnRlciB0aGUgdXBjYWxsIGludG8gdGhlIHRhcmdldCBsYW5ndWFnZS4gUGFzc2luZyBhcmd1bWVudHMgYnkgdmFsdWUgc2hvdWxkbid0IGdpdmUKICAgICAgICAgICAgcmlzZSB0byB0aGVzZSBzb3J0cyBvZiBtZW1vcnkgcHJvYmxlbXMgYW5kIHNvIHRoZSBvYmplY3RzIGFyZSBub3cgY29waWVkIGFuZCBvd25lcnNoaXAKICAgICAgICAgICAgb2YgdGhlaXIgbGlmZXRpbWUgaXMgY29udHJvbGxlZCBieSB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKMjAxNi0wNS0wNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM2MTEuIEZpeCBhc3NlcnRpb24gaGFuZGxpbmcgZGVmYXVsdGFyZ3Mgd2hlbiB1c2luZyAlZXh0ZW5kIGZvciBhIHRlbXBsYXRlCiAgICAgICAgICAgIGNsYXNzIGFuZCB0aGUgZXh0ZW5kZWQgbWV0aG9kcyBjb250YWluIGRlZmF1bHQgYXJndW1lbnRzLgoKMjAxNi0wNS0wNTogZWp1bGlhbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjNjE3LiBGaXggb3BlcmF0b3IvIHdyYXBwZXJzLgoKMjAxNi0wNS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM2NjkuIERvbid0IGlzc3VlIHdhcm5pbmcgYWJvdXQgaWdub3JpbmcgYmFzZSBjbGFzc2VzIHdoZW4gdGhlIGRlcml2ZWQgY2xhc3MgaXMKICAgICAgICAgICAgaXRzZWxmIGlnbm9yZWQuCgoyMDE2LTA0LTE4OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRml4IHVzZSBvZiBnb291dCB0eXBlbWFwIHdoZW4gY2FsbGluZyBiYXNlIG1ldGhvZCBieQoJICAgIGZvcmNpbmcgdGhlICJ0eXBlIiBhdHRyaWJ1dGUgdG8gdGhlIHZhbHVlIHdlIG5lZWQuCgoyMDE2LTA0LTE3OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRml4ZXMgZm9yIEdvIDEuNjogYXZvaWQgcmV0dXJuaW5nIEdvIHBvaW50ZXJzIGZyb20KCSAgICBkaXJlY3RvcnMgdGhhdCByZXR1cm4gc3RyaW5nIHZhbHVlczsgYWRkIGEgdHJhaWxpbmcgMCBieXRlCgkgICAgd2hlbiB0cmVhdGluZyBHbyBzdHJpbmcgYXMgQyBjaGFyKi4KCjIwMTYtMDQtMDY6IHNtYXJjaGV0dG8KICAgICAgICAgICAgW1NjaWxhYl0gIzU1MiBNYWtlIFNjaWxhYiBydW50aW1lIGtlZXAgdHJhY2sgb2YgcG9pbnRlciB0eXBlcwogICAgICAgICAgICBJbnN0ZWFkIG9mIGEgU2NpbGFiIHBvaW50ZXIgd2hpY2ggaGFzIG5vIHR5cGUsIFNXSUcgU2NpbGFiIG1hcHMgYQogICAgICAgICAgICBwb2ludGVyIHRvIGEgc3RydWN0dXJlIHRsaXN0IGNvbnRhaW5pbmcgdGhlIHBvaW50ZXIgYWRyZXNzIGFuZCBpdHMgdHlwZS4KCjIwMTYtMDQtMDI6IGFobm9sZHMKICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgIzU5OC4gRml4IG1pc2xlYWRpbmcgZXJyb3IgbWVzc2FnZSB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCBhIG5vbi1leGlzdGVudAogICAgICAgICAgICBhdHRyaWJ1dGUuIFRoZSBwcmV2aW91cyBjcnlwdGljIGVycm9yIG1lc3NhZ2U6CiAgICAgICAgICAgICAgQXR0cmlidXRlRXJyb3I6IHR5cGUgb2JqZWN0ICdvYmplY3QnIGhhcyBubyBhdHRyaWJ1dGUgJ19fZ2V0YXR0cl9fJwogICAgICAgICAgICBpcyBub3cgcmVwbGFjZWQgd2l0aCBvbmUgbWVudGlvbmluZyB0aGUgYXR0cmlidXRlIG5hbWUsIGVnOgogICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiAnRm9vJyBvYmplY3QgaGFzIG5vIGF0dHJpYnV0ZSAnYmFyJwoKMjAxNi0wNC0wMjogZGVya3VjaQogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjNjEwIHRvIGZpeCAjNjA3LgogICAgICAgICAgICBGaXggc2luZ2xlIGFyZ3VtZW50cyB3aGVuIHVzaW5nIHB5dGhvbiAtYnVpbHRpbiAtTyB3aXRoICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKQoKMjAxNi0wMy0zMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgIzU5NC4gRml4IGFzc2VydGlvbiBmb3Igc29tZSBsYW5ndWFnZXMgd2hlbiB3cmFwcGluZyBhIEMrKzExIGVudW0gY2xhc3MgdGhhdAogICAgICAgICAgICBpcyBwcml2YXRlIGluIGEgY2xhc3MuCgogICAgICAgICAgICBBbHNvIGRvbid0IHdyYXAgcHJpdmF0ZSBlbnVtcyBmb3IgYSBmZXcgbGFuZ3VhZ2VzIHRoYXQgYXR0ZW1wdGVkIHRvIGRvIHNvLgoKMjAxNi0wMy0zMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHVuc2lnbmVkIGxvbmcgbG9uZyBtYXJzaGFsbGluZyBpbXByb3ZlbWVudHMgd2hlbiBhIG5lZ2F0aXZlIG51bWJlcgogICAgICAgICAgICBpcyBwYXNzZWQgZnJvbSBKYXZhIHRvIEMuIEEgY2FzdCB0byBzaWduZWQgbG9uZyBsb25nIGluIHRoZSBDIGxheWVyIHdpbGwgbm93CiAgICAgICAgICAgIHJlc3VsdCBpbiB0aGUgZXhwZWN0ZWQgdmFsdWUuIE5vIGNoYW5nZSBmb3IgcG9zaXRpdmUgbnVtYmVycyBwYXNzZWQgdG8gQy4KICAgICAgICAgICAgRml4ZXMgIzYyMy4KCjIwMTYtMDMtMjI6IGFsZXh3YXJnCgkgICAgW0x1YV0gIzM5OCBGaXggbHVhIF9fZ2V0aXRlbSArIGluaGVyaXRhbmNlCiAgICAgICAgICAgIFRoZSBuZXcgaGFuZGxpbmcgb2YgY2xhc3NlcyBpbiBMdWEgKG5vdCBtZXJnaW5nIG1ldGhvZHMgaW50byB0aGUgZGVyaXZlZCBjbGFzc2VzKQogICAgICAgICAgICBicmVha3MgZm9yIGNsYXNzZXMgdGhhdCBwcm92aWRlIGEgX19nZXRpdGVtIGZ1bmN0aW9uLiBUaGUgX19nZXRpdGVtIGZ1bmN0aW9uCiAgICAgICAgICAgIHByZXZlbnRzIG1ldGhvZCBjYWxscyB0byBhbnkgbWV0aG9kIGRlZmluZWQgaW4gYSBiYXNlIGNsYXNzLiBUaGlzIGZpeCBjYWxscwogICAgICAgICAgICBfX2dldGl0ZW0gb25seSBpZiB0aGUgbWVtYmVyIGlzIG5vdCBmb3VuZCB1c2luZyByZWN1cnNpdmUgbG9va3VwLgoKMjAxNi0wMy0xODogcHRvbXVsaWsKCSAgICBbUHl0aG9uXSAjNTYzIFN0b3AgZ2VuZXJhdGluZyB1bm5lY2Vzc2FyeSBfc3dpZ2NvbnN0YW50IGhlbHBlcnMuCgoyMDE2LTAzLTE2OiByaWNoYXJkYmVhcmUKCSAgICBbUl0gIzYzNiBBZGQgZXh0cmEgc3RkOjp2ZWN0b3IgbnVtZXJpYyB0eXBlcwoKMjAxNi0wMy0xNDogd3NmdWx0b24KCSAgICBbSmF2YV0gQWRkIHN0ZF9hcnJheS5pIGZvciBDKysxMSBzdGQ6OmFycmF5IHN1cHBvcnQuCgoyMDE2LTAzLTEyOiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDIywgRF0gRml4IHN0YXRpYyBjb25zdCBjaGFyIG1lbWJlciB2YXJpYWJsZXMgd3JhcHBlcnMgd2l0aCAlamF2YWNvbnN0KDEpCiAgICAgICAgICAgICVjc2NvbnN0KDEpIG9yICVkbWFuaWZlc3Rjb25zdC4KICAgICAgICAgICAgVGhpcyBmaXhlcyB0aGUgY2FzZSB3aGVuIGFuIGludGVnZXIgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbGl6ZXIsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHN0cnVjdCBXIHsgc3RhdGljIGNvbnN0IGNoYXIgdyA9IDEwMDsgfTsKCgkgICAgRml4IGdlbmVyYXRlZCBjb2RlIHBhcnNpbmcgZW51bSB2YWx1ZXMgdXNpbmcgY2hhciBlc2NhcGUgc2VxdWVuY2VzCiAgICAgICAgICAgIHdoZW4gdGhlc2UgdmFsdWVzIGFwcGVhciBpbiB0aGUgSmF2YSBjb2RlICh1c3VhbGx5IHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKSkKICAgICAgICAgICAgc3VjaCBhczoKCiAgICAgICAgICAgICAgZW51bSBYIHsgeDEgPSAnXG4nLCB4MiA9ICdcMScgfTsKCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3Igc3RhdGljIGNvbnN0IG1lbWJlciBjaGFyIHZhcmlhYmxlcyBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWSB7IHN0YXRpYyBjb25zdCBjaGFyIHkgPSAnXG4nOyB9CgogICAgICAgICAgICBMaWtld2lzZSBmb3IgRCBhbmQgJWRtYW5pZmVzdGNvbnN0YW50LiBGb3IgQyMgYW5kICVjc2NvbnN0KDEpLCBjaGFyCiAgICAgICAgICAgIHZhbHVlcyBpbiBDIyBhcmUgbm93IGhleCBlc2NhcGVkIGFzIEMjIGRvZXNuJ3Qgc3VwcG9ydCBDIG9jdGFsIGVzY2FwaW5nLgoKMjAxNi0wMy0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEFkZCBzdXBwb3J0IGZvciB0cmVhdGluZyBDKysgYmFzZSBjbGFzc2VzIGFzIEphdmEgaW50ZXJmYWNlcwogICAgICAgICAgICBpbnN0ZWFkIG9mIEphdmEgcHJveHkgY2xhc3Nlcy4gVGhpcyBlbmFibGUgc29tZSBzb3J0IG9mIHN1cHBvcnQgZm9yCiAgICAgICAgICAgIG11bHRpcGxlIGluaGVyaXRhbmNlLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgaW4gc3dpZ2ludGVyZmFjZS5pIGFuZAogICAgICAgICAgICBwcm92aWRlcyBhZGRpdGlvbmFsIG1hY3JvcyAoc2VlIEphdmEuaHRtbCBmb3IgZnVsbCBkb2N1bWVudGF0aW9uKToKCiAgICAgICAgICAgICAgJWludGVyZmFjZShDVFlQRSkKICAgICAgICAgICAgICAlaW50ZXJmYWNlX2ltcGwoQ1RZUEUpCiAgICAgICAgICAgICAgJWludGVyZmFjZV9jdXN0b20oIlBST1hZIiwgIklOVEVSRkFDRSIsIENUWVBFKQoKMjAxNi0wMy0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHJzdHJpcCBlbmNvZGVyIGZvciB1c2UgaW4gJXJlbmFtZS4gVGhpcyBpcyBsaWtlIHRoZSBzdHJpcCBlbmNvZGVyIGJ1dAogICAgICAgICAgICBzdHJpcHMgdGhlIHN5bWJvbCdzIHN1ZmZpeCBpbnN0ZWFkIG9mIHRoZSBwcmVmaXguIFRoZSBleGFtcGxlIGJlbG93CiAgICAgICAgICAgIHdpbGwgcmVuYW1lIFNvbWVUaGluZ0NscyB0byBTb21lVGhpbmcgYW5kIEFub3RoZXJUaGluZ0NscyB0byBBbm90aGVyVGhpbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIiUocnN0cmlwOltDbHNdKXMiKSAiIjsKCiAgICAgICAgICAgICAgY2xhc3MgU29tZVRoaW5nQ2xzIHt9OwogICAgICAgICAgICAgIHN0cnVjdCBBbm90aGVyVGhpbmdDbHMge307CgoyMDE2LTAzLTAxOiBvbGx5CgkgICAgRml4IGlzZmluaXRlKCkgY2hlY2sgdG8gd29yayB3aXRoIEdDQzYuICBGaXhlcwoJICAgIGlzc3VlICM2MTUgcmVwb3J0ZWQgYnkganBsZXNuaWsuCgoyMDE2LTAyLTE3OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkIG1pc3Npbmcga2V5d29yZHMgJ2FzJyBhbmQgJ3dpdGgnIHRvIHB5dGhvbmt3LnN3Zy4KCjIwMTYtMDItMDc6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gcmVjb2duaXNlIHZhcmlvdXMgdW5hcnkgZnVuY3Rpb25zCiAgICAgICAgICAgICogVXNlIF9fZmxvYXRfXygpIGZvciBudW1lcmljIGNvbnZlcnNpb25zLCBlLmcuIHdoZW4gY2FsbGluZyBkb3VibGUoKQogICAgICAgICAgICAqIE1hcCB2YXJpb3VzIHVuYXJ5IGZ1bmN0aW9ucywgZS5nLiBhYnMoKSB0byBfX2Fic19fKCksIHNlZSBmdWxsIGxpc3QKICAgICAgICAgICAgICBpbiBzZWN0aW9uIDMyLjMuMTAgb2YgbWFudWFsOyBvbmx5IGF2YWlsYWJsZSBpbiBPY3RhdmUgMy44LjAgb3IgbGF0ZXIKCjIwMTYtMDItMDc6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gZXhwb3J0IGZ1bmN0aW9uIHN3aWdfb2N0YXZlX3ByZXJlcSgpIGZvciB0ZXN0aW5nIE9jdGF2ZSB2ZXJzaW9uCgoyMDE2LTAyLTA2OiBwam9oYW5ndXN0YXZzc29uCiAgICAgICAgICAgIFtDI10gRml4IGR1cGxpY2F0ZSBzeW1ib2wgcHJvYmxlbXMgd2hlbiBsaW5raW5nIHRoZSBzb3VyY2UgZ2VuZXJhdGVkCiAgICAgICAgICAgIGZyb20gbXVsdGlwbGUgU1dJRyBtb2R1bGVzIGludG8gb25lIHNoYXJlZCBsaWJyYXJ5IGZvciB0aGUgLW5hbWVzcGFjZQogICAgICAgICAgICBvcHRpb24uIFRoZSBuYW1lc3BhY2UgaXMgbm93IG1hbmdsZWQgaW50byB0aGUgZ2xvYmFsIFBJbnZva2UgZnVuY3Rpb24KICAgICAgICAgICAgbmFtZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMDEtMjc6IGFobm9sZHMKICAgICAgICAgICAgW1B5dGhvbl0gQWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gUHl0aG9uIEJ5dGVzCiAgICAgICAgICAgIGFuZCBVbmljb2RlIG9iamVjdHMgdXNpbmcgYnkgZGVmaW5pbmcgU1dJR19QWVRIT05fU1RSSUNUX0JZVEVfQ0hBUgogICAgICAgICAgICBhbmQgU1dJR19QWVRIT05fU1RSSUNUX1VOSUNPREVfV0NIQVIuCgoyMDE2LTAxLTI3OiBzdGVldmUKICAgICAgICAgICAgW0dvXSBFbnN1cmUgc3RydWN0cyBhcmUgcHJvcGVybHkgcGFja2VkIGJldHdlZW4gZ2MgYW5kIEdDQy9jbGFuZy4KCjIwMTYtMDEtMjU6IGFobm9sZHMKICAgICAgICAgICAgW1B5dGhvbl0gU3VwcG9ydCB0aGUgZnVsbCBQeXRob24gdGVzdCBzdWl0ZSBpbiAtY2xhc3NpYyBtb2RlCiAgICAgICAgICAgICogQ29udmVydCBsb25nL3Vuc2lnbmVkIGxvbmcvbG9uZyBsb25nL3Vuc2lnbmVkIGxvbmcgbG9uZyB0byBQeUludAogICAgICAgICAgICAgIHJhdGhlciB0aGFuIFB5TG9uZyB3aGVuIHBvc3NpYmxlLiBDZXJ0YWluIHB5dGhvbiBmdW5jdGlvbnMgbGlrZQogICAgICAgICAgICAgIGxlbigpIHJlcXVpcmUgYSBQeUludCB3aGVuIG9wZXJhdGluZyBvbiBvbGQtc3R5bGUgY2xhc3Nlcy4KICAgICAgICAgICAgKiBBZGQgc3VwcG9ydCBmb3Igc3RhdGljIG1ldGhvZHMgaW4gY2xhc3NpYyBtb2RlLCBpbmNsdWRpbmcgc3VwcG9ydAogICAgICAgICAgICAgIGZvciBweXRob25hcHBlbmQsIHB5dGhvbnByZXBlbmQsIGFuZCBkb2NzdHJpbmdzLgogICAgICAgICAgICAqIFJlbW92aW5nIHRoZSB1c2Ugb2YgX19zd2lnX2dldG1ldGhvZHNfXyBmb3Igc3RhdGljIG1lbWJlciBtZXRob2RzCiAgICAgICAgICAgICAgc2luY2UgdGhleSB3aWxsIGFsd2F5cyBiZSBmb3VuZCBieSB0aGUgc3RhbmRhcmQgYXJndW1lbnQgbG9va3VwCiAgICAgICAgICAgICogRml4IGEgYnVnIHdoZXJlIHRoZSB3cm9uZyB0eXBlIG9mIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IHdoZW4KICAgICAgICAgICAgICBjaGVja2luZyBmb3IgbmV3LXN0eWxlIGNsYXNzIHN1cHBvcnQKCjIwMTYtMDEtMjM6IGFobm9sZHMKICAgICAgICAgICAgW0dvXSBFbmFibGUgc3VwcG9ydCBmb3IgdGhlIEdvIHRlc3Qtc3VpdGUgb24gT1NYOgogICAgICAgICAgICAqIFRoZSBsaW5rZXIgb24gT1NYIHJlcXVpcmVzIHRoYXQgYWxsIHN5bWJvbHMgKGV2ZW4gd2VhayBzeW1ib2xzKQogICAgICAgICAgICAgIGFyZSBkZWZpbmVkIGF0IGxpbmsgdGltZS4gQmVjYXVzZSB0aGUgZnVuY3Rpb24gX2Nnb190b3BvZnN0YWNrIGlzCiAgICAgICAgICAgICAgb25seSBkZWZpbmVkIHN0YXJ0aW5nIGluIEdvIHZlcnNpb24gMS40LCB3ZSBleHBsaWNpdGx5IG1hcmsgaXQgYXMKICAgICAgICAgICAgICB1bmRlZmluZWQgZm9yIG9sZGVyIHZlcnNpb25zIG9mIEdvIG9uIE9TWC4KICAgICAgICAgICAgKiBBdm9pZCB3cml0aW5nIGVtcHR5IHN3aWdhcmdzIHN0cnVjdHMsIHNpbmNlIGVtcHR5IHN0cnVjdHMgYXJlIG5vdAogICAgICAgICAgICAgIGFsbG93ZWQgaW4gZXh0ZXJuICJDIiBibG9ja3MuCgoyMDE2LTAxLTEyOiBvbGx5CgkgICAgW0phdmFzY3JpcHRdIExvb2sgZm9yICJub2RlanMiIGFzIHdlbGwgYXMgIm5vZGUiLCBhcyBpdCdzIHBhY2thZ2VkCgkgICAgYXMgdGhlIGZvcm1lciBvbiBEZWJpYW4uCgoyMDE2LTAxLTEyOiBvbGx5CgkgICAgW0phdmFzY3JpcHRdIEZvciB2OCA+PSA0LjMuMCwgdXNlIFY4X01BSk9SX1ZFUlNJT04uCgkgICAgRml4ZXMgaXNzdWUgNTYxLgoKMjAxNi0wMS0xMDogYWhub2xkcwogICAgICAgICAgICBJbXByb3ZlZCBzaXplX3QgYW5kIHB0cmRpZmZfdCB0eXBlbWFwcyB0byBzdXBwb3J0IGxhcmdlIHZhbHVlcwogICAgICAgICAgICBvbiBwbGF0Zm9ybXMgd2hlcmUgc2l6ZW9mKHNpemVfdCkgPiBzaXplb2YodW5zaWduZWQgbG9uZykgYW5kCiAgICAgICAgICAgIHNpemVvZihwdHJkaWZmX3QpID4gc2l6ZW9mKGxvbmcpLgoKVmVyc2lvbiAzLjAuOCAoMzEgRGVjIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0xMi0zMDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHBkZiBkb2N1bWVudGF0aW9uIGlzIG5vdyBnZW5lcmF0ZWQgYnkgd2todG1sdG9wZGYgYW5kIGhhcyBjb2xvdXIKICAgICAgICAgICAgZm9yIHRoZSBjb2RlIHNuaXBwZXRzIGp1c3QgbGlrZSB0aGUgaHRtbCBkb2N1bWVudGF0aW9uIQoKMjAxNS0xMi0yMzogYWhub2xkcwogICAgICAgICAgICBbUHl0aG9uXSBGaXhlcyBmb3IgY29udmVyc2lvbiBvZiBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXIgdHlwZXM6CgogICAgICAgICAgICBObyBsb25nZXIgY2hlY2sgZm9yIFB5SW50IG9iamVjdHMgaW4gUHl0aG9uMy4gQmVjYXVzZSBQeUludF9DaGVjawogICAgICAgICAgICBhbmQgZnJpZW5kcyBhcmUgI2RlZmluZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHlMb25nIG1ldGhvZHMsIHRoaXMKICAgICAgICAgICAgaGFkIGNhdXNlZCBlcnJvcnMgaW4gUHl0aG9uMyB3aGVyZSB2YWx1ZXMgZ3JlYXRlciB0aGFuIHdoYXQgY291bGQgYmUKICAgICAgICAgICAgc3RvcmVkIGluIGEgbG9uZyB3ZXJlIGluY29ycmVjdGx5IGludGVycHJldGVkIGFzIHRoZSB2YWx1ZSAtMSB3aXRoCiAgICAgICAgICAgIHRoZSBQeXRob24gZXJyb3IgaW5kaWNhdG9yIHNldCB0byBPdmVyZmxvd0Vycm9yLiBUaGlzIGFwcGxpZXMgdG8KICAgICAgICAgICAgYm90aCB0aGUgY29udmVyc2lvbnMgUHlMb25nLT5sb25nIGFuZCBQeUxvbmctPmRvdWJsZS4KCiAgICAgICAgICAgIENvbnZlcnNpb24gZnJvbSBQeUxvbmcgdG8gbG9uZywgdW5zaWduZWQgbG9uZywgbG9uZyBsb25nLCBhbmQKICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIG5vdyByYWlzZSBPdmVyZmxvd0Vycm9yIGluc3RlYWQgb2YgVHlwZUVycm9yIGluCiAgICAgICAgICAgIGJvdGggUHl0aG9uMiBhbmQgUHl0aG9uMyBmb3IgUHlMb25nIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZQogICAgICAgICAgICBleHByZXNzaWJsZSBieSB0aGUgY29ycmVzcG9uZGluZyBDIHR5cGUuIFRoaXMgbWF0Y2hlcyB0aGUgZXhpc3RpbmcKICAgICAgICAgICAgYmVoYXZpb3IgZm9yIG90aGVyIGludGVncmFsIHR5cGVzIChzaWduZWQgYW5kIHVuc2lnbmVkIGludHMsIHNob3J0cywKICAgICAgICAgICAgYW5kIGNoYXJzKSwgYXMgd2VsbCBhcyB0aGUgY29udmVyc2lvbiBmb3IgUHlJbnQgdG8gYWxsIG51bWVyaWMKICAgICAgICAgICAgdHlwZXMuIFRoaXMgYWxzbyBpbmRpcmVjdGx5IGFwcGxpZXMgdG8gdGhlIHNpemVfdCBhbmQgcHRyZGlmZl90CiAgICAgICAgICAgIHR5cGVzLCB3aGljaCBkZXBlbmQgb24gdGhlIGNvbnZlcnNpb25zIGZvciB1bnNpZ25lZCBsb25nIGFuZCBsb25nLgoKMjAxNS0xMi0xOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDIgVW5pY29kZSBVVEYtOCBzdHJpbmdzIGNhbiBiZSB1c2VkIGFzIGlucHV0cyB0byBjaGFyICogb3IKICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZXMgaWYgdGhlIGdlbmVyYXRlZCBDL0MrKyBjb2RlIGhhcyBTV0lHX1BZVEhPTl8yX1VOSUNPREUgZGVmaW5lZC4KCjIwMTUtMTItMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIElzc3VlcyAjMjg2LCAjMTI4CiAgICAgICAgICAgIFJlbW92ZSBjY2FjaGUtc3dpZy4xIG1hbiBwYWdlIC0gcGxlYXNlIHVzZSB0aGUgQ0NhY2hlLmh0bWwgZG9jcyBpbnN0ZWFkLgogICAgICAgICAgICBUaGUgeW9kbDJtYW4gYW5kIHlvZGwyaHRtbCB0b29scyBhcmUgbm8gbG9uZ2VyIHVzZWQgYW5kIHNvIFNXSUcgbm8KICAgICAgICAgICAgbG9uZ2VyIGhhcyBhIGRlcGVuZGVuY3kgb24gdGhlc2UgcGFja2FnZXMgd2hpY2ggd2VyZSByZXF1aXJlZCB3aGVuCiAgICAgICAgICAgIGJ1aWxkaW5nIGZyb20gZ2l0LgoKMjAxNS0xMi0xNjogenR1cm5lci9jb2xlYgogICAgICAgICAgICBbUHl0aG9uXSBGaXggUHl0aG9uMy41IGludGVycHJldGVyIGFzc2VydGlvbnMgd2hlbiBvYmplY3RzIGFyZSBiZWluZwogICAgICAgICAgICBkZWxldGVkIGR1ZSB0byBhbiBleGlzdGluZyBleGNlcHRpb24uIE1vc3Qgbm90YWJseSBpbiBnZW5lcmF0b3JzCiAgICAgICAgICAgIHdoaWNoIHRlcm1pbmF0ZSB1c2luZyBhIFN0b3BJdGVyYXRpb24gZXhjZXB0aW9uLiBGaXhlcyAjNTU5ICM1NjAgIzU3My4KICAgICAgICAgICAgSWYgYSBmdXJ0aGVyIGV4Y2VwdGlvbiBpcyByYWlzZWQgZHVyaW5nIGFuIG9iamVjdCBkZXN0cnVjdGlvbiwKICAgICAgICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlIGlzIHVzZWQgb24gdGhpcyBzZWNvbmQgZXhjZXB0aW9uIGFuZCB0aGUKICAgICAgICAgICAgb3JpZ2luYWwgZXhjZXB0aW9uIGJ1YmJsZXMgdGhyb3VnaC4KCjIwMTUtMTItMTQ6IGFobm9sZHMvd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIGluIG1pc3NpbmcgaW5pdGlhbGl6ZXJzIGZvciB0cF9maW5hbGl6ZSwKICAgICAgICAgICAgbmJfbWF0cml4X211bHRpcGx5LCBuYl9pbnBsYWNlX21hdHJpeF9tdWx0aXBseSwgaHRfcXVhbG5hbWUKICAgICAgICAgICAgaHRfY2FjaGVkX2tleXMgYW5kIHRwX3ByZXYuCgoyMDE1LTEyLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU1RMIHdyYXBwZXJzIHRvIG5vdCBnZW5lcmF0ZSA8OiBkaWdyYXBocy4KICAgICAgICAgICAgRm9yIGV4YW1wbGUgc3RkOjp2ZWN0b3I8OjpYOjpZPiB3YXMgc29tZXRpbWVzIGdlbmVyYXRlZCwgbm93CiAgICAgICAgICAgIGNvcnJlY3RlZCB0byBzdGQ6OnZlY3RvcjwgOjpYOjpZID4uCgoyMDE1LTExLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU1RMIHJhbmdlcyBhbmQgc2xpY2VzIGZpeGVzLgoKICAgICAgICAgICAgUnVieSBTVEwgY29udGFpbmVyIHNldHRpbmcgc2xpY2VzIGZpeGVzOgoKICAgICAgICAgICAgU2V0dGluZyBhbiBTVEwgY29udGFpbmVyIHdyYXBwZXIgc2xpY2UgYmV0dGVyIG1hdGNoZXMgdGhlIHdheSBSdWJ5CiAgICAgICAgICAgIGFycmF5cyB3b3JrLiBUaGUgYmVoYXZpb3VyIGlzIG5vdyB0aGUgc2FtZSBhcyBSdWJ5IGFycmF5cy4gVGhlIG9ubHkKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRoZSBkZWZhdWx0IHZhbHVlIHVzZWQgd2hlbiBleHBhbmRpbmcgYSBjb250YWluZXIKICAgICAgICAgICAgY2Fubm90IGJlIG5pbCBhcyB0aGlzIGlzIG5vdCBhIHZhbGlkIHR5cGUvdmFsdWUgZm9yIEMrKyBjb250YWluZXIKICAgICAgICAgICAgZWxlbWVudHMuCgogICAgICAgICAgICBPYnRhaW5pbmcgYSBSdWJ5IFNUTCBjb250YWluZXIgcmFuZ2VzIGFuZCBzbGljZXMgZml4ZXM6CgogICAgICAgICAgICBBY2Nlc3MgdmlhIHJhbmdlcyBhbmQgc2xpY2VzIG5vdyBiZWhhdmUgaWRlbnRpY2FsbHkgdG8gUnVieSBhcnJheXMuCiAgICAgICAgICAgIFRoZSBmaXhlcyBhcmUgbW9zdGx5IGZvciBvdXQgb2YgcmFuZ2UgaW5kaWNlcyBhbmQgbGVuZ3Rocy4KICAgICAgICAgICAgLSBaZXJvIGxlbmd0aCBzbGljZSByZXF1ZXN0cyByZXR1cm4gYW4gZW1wdHkgY29udGFpbmVyIGluc3RlYWQgb2YgbmlsLgogICAgICAgICAgICAtIFNsaWNlcyB3aGljaCByZXF1ZXN0IGEgbGVuZ3RoIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVyCiAgICAgICAgICAgICAgbm8gbG9uZ2VyIGNob3Agb2ZmIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgICAgICAgIC0gUmFuZ2VzIHdoaWNoIHVzZWQgdG8gcmV0dXJuIG5pbCBub3cgcmV0dXJuIGFuIGVtcHR5IGFycmF5IHdoZW4gdGhlCiAgICAgICAgICAgICAgdGhlIHN0YXJ0IGVsZW1lbnQgaXMgYSB2YWxpZCBpbmRleC4KCiAgICAgICAgICAgIFJ1YnkgU1RMIGNvbnRhaW5lciBuZWdhdGl2ZSBpbmRleGluZyBzdXBwb3J0IGltcHJvdmVkLgoKICAgICAgICAgICAgVXNpbmcgbmVnYXRpdmUgaW5kZXhlcyB0byBzZXQgdmFsdWVzIHdvcmtzIHRoZSBzYW1lIGFzIFJ1YnkgYXJyYXlzLCBlZwoKICAgICAgICAgICAgJXRlbXBsYXRlKEludFZlY3Rvcikgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIGl2ID0gSW50VmVjdG9yLm5ldyhbMSwyLDMsNF0pCiAgICAgICAgICAgIGl2Wy00XSA9IDkgIyA9PiBbMSwyLDMsOV0KICAgICAgICAgICAgaXZbLTVdID0gOSAjID0+IEluZGV4RXJyb3IKCjIwMTUtMTEtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIEFkZCBzdGQ6OmFycmF5IGNvbnRhaW5lciB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZXNlIHdvcmsgbXVjaCBsaWtlIGFueSBvZiB0aGUgb3RoZXIgU1RMIGNvbnRhaW5lcnMgZXhjZXB0IFB5dGhvbi9SdWJ5IHNsaWNpbmcKICAgICAgICAgICAgaXMgc29tZXdoYXQgbGltaXRlZCBiZWNhdXNlIHRoZSBhcnJheSBpcyBhIGZpeGVkIHNpemUuIE9ubHkgc2xpY2VzIG9mCiAgICAgICAgICAgIHRoZSBmdWxsIHNpemUgYXJlIHN1cHBvcnRlZC4KCjIwMTUtMTAtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICM1MzkgLSBTdXBwb3J0IFB5dGhvbiAzLjUgYW5kIC1idWlsdGluLiAgUHlBc3luY01ldGhvZHMgaXMgYSBuZXcKICAgICAgICAgICAgbWVtYmVyIGluIFB5SGVhcFR5cGVPYmplY3QuCgoyMDE1LTEwLTA2OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRG9uJ3QgZW1pdCBhIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBhIGRpcmVjdG9yCgkgICAgY2xhc3Mgd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QsIHNpbmNlIHRoZSBmdW5jdGlvbiB3aWxsCgkgICAgYWx3YXlzIHBhbmljLgoKMjAxNS0xMC0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVzaGFyZWRfcHRyIHN1cHBvcnQgZm9yIHByaXZhdGUgYW5kIHByb3RlY3RlZCBpbmhlcml0YW5jZS4KICAgICAgICAgICAgLSBSZW1vdmUgdW5uZWNlc3NhcnkgV2FybmluZyA1MjA6IERlcml2ZWQgY2xhc3MgJ0Rlcml2ZWQnIG9mICdCYXNlJwogICAgICAgICAgICAgIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlcgogICAgICAgICAgICAtIERvIG5vdCBnZW5lcmF0ZSBjb2RlIHRoYXQgYXR0ZW1wdHMgdG8gY2FzdCB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gaW4gdGhlCiAgICAgICAgICAgICAgdHlwZSBzeXN0ZW0gcnVudGltZSBpbiBzdWNoIGNhc2VzIGFzIGl0IGRvZXNuJ3QgY29tcGlsZSBhbmQgY2FuJ3QgYmUgdXNlZC4KICAgICAgICAgICAgUmVtb3ZlIHVubmVjZXNzYXJ5IHdhcm5pbmcgNTIwIGZvciAlc2hhcmVkX3B0ciB3aGVuIHRoZSBiYXNlIGNsYXNzIGlzIGlnbm9yZWQuCgoyMDE1LTEwLTAxOiB2a2FsaW5pbgogICAgICAgICAgICBGaXggIzUwODogRml4IHNlZ2ZhdWx0IHBhcnNpbmcgYW5vbnltb3VzIHR5cGVkZWYgbmVzdGVkIGNsYXNzZXMuCgoyMDE1LTA5LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQWRkIHNoYXJlZF9wdHIgc3VwcG9ydAoKMjAxNS0wOS0xMzoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gUmVzb2x2ZSB0cmFja2luZyBidWcgLSBpc3N1ZSAjMjI1LgogICAgICAgICAgICBUaGUgYnVnIGlzIHRoYXQgdGhlIHRyYWNraW5nIGNvZGUgdXNlcyBhIHJ1YnkgaGFzaCBhbmQgdGh1cyBtYXkKICAgICAgICAgICAgYWxsb2NhdGUgb2JqZWN0cyAoQmlnbnVtKSB3aGlsZSBydW5uaW5nIHRoZSBHQy4gVGhpcyB3YXMgdG9sZXJhdGVkIGluCiAgICAgICAgICAgIDEuOCBidXQgaXMgaW52YWxpZCAocmFpc2VzIGFuIGV4Y2VwdGlvbikgaW4gMS45LgogICAgICAgICAgICBUaGUgcGF0Y2ggdXNlcyBhIEMgaGFzaCAoYWxzbyB1c2VkIGJ5IHJ1YnkpIGluc3RlYWQuCgoyMDE1LTA5LTA5OiBseXplCiAgICAgICAgICAgIFtDRkZJXSBFeHRlbmQgdGhlICJleHBvcnQiIGZlYXR1cmUgaW4gdGhlIENGRkkgbW9kdWxlIHRvIHN1cHBvcnQKICAgICAgICAgICAgZXhwb3J0aW5nIHRvIGEgc3BlY2lmaWVkIHBhY2thZ2UuCgoyMDE1LTA5LTA0OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGRvY3N0cmluZ3MgZm9yICVjYWxsYmFjayBmdW5jdGlvbnMuCgoyMDE1LTA5LTAzOiBkZW1pLXJsdWRkeQogICAgICAgICAgICBbR29dIFJlbW92ZWQgZ29sYW5nIHN0cmluZ2luZyBmb3Igc2lnbmVkL3Vuc2lnbmVkIGNoYXIKCiAgICAgICAgICAgIENoYW5nZWQgZGVmYXVsdCBoYW5kbGluZyBvZiBzaWduZWQgY2hhciogYW5kIHVuc2lnbmVkIGNoYXIqIHRvIGJlCiAgICAgICAgICAgIG9wYXF1ZSBwb2ludGVycyByYXRoZXIgdGhhbiBzdHJpbmdzLCBzaW1pbGFybHkgdG8gaG93IG90aGVyCiAgICAgICAgICAgIGxhbmd1YWdlcyB3b3JrLgoKICAgICAgICAgICAgQW55IGV4aXN0aW5nIGNvZGUgcmVseWluZyBvbiB0cmVhdGluZyBzaWduZWQgY2hhciogb3IgdW5zaWduZWQKICAgICAgICAgICAgY2hhciogYXMgYSBzdHJpbmcgY2FuIHJlc3RvcmUgdGhlIG9sZCBiZWhhdmlvciB3aXRoIHR5cGVtYXBzLmkgYnkKICAgICAgICAgICAgdXNpbmcgJWFwcGx5IHRvIGNvcHkgdGhlIFt1bmNoYW5nZWRdIGNoYXIqIGJlaGF2aW9yLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE1LTA4LTA3OiB0YWxieQogICAgICAgICAgICBbUGVybF0gdGlkeSAtV3RhdXRvbG9naWNhbC1jb25zdGFudC1vdXQtb2YtcmFuZ2UtY29tcGFyZSB3YXJuaW5ncyB3aGVuIGJ1aWxkaW5nIGdlbmVyYXRlZCBjb2RlIHVuZGVyIGNsYW5nCgoyMDE1LTA4LTA3OiB4YW50YXJlcwogICAgICAgICAgICBbUHl0aG9uXSBwZXAyNTcgJiBudW1weWRvYyBjb25mb3JtaW5nIGRvY3N0cmluZ3M6CiAgICAgICAgICAgIC0gTW9uby1saW5lIG1vZHVsZSBkb2Nzc3RyaW5nCiAgICAgICAgICAgIC0gUmV3cml0ZSBhdXRvZG9jIHBhcmFtZXRlcnMgc2VjdGlvbiBpbiBudW1weWRvYyBzdHlsZToKICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vbnVtcHkvbnVtcHkvYmxvYi9tYXN0ZXIvZG9jL0hPV1RPX0RPQ1VNRU5ULnJzdC50eHQKICAgICAgICAgICAgLSBPbmUgbGluZSBzdW1tYXJ5IHNob3VsZCBlbmQgd2l0aCAiLiIKICAgICAgICAgICAgLSBBZGRzIGEgYmxhbmsgbGluZSBhZnRlciBjbGFzcyBkb2NzdHJpbmcKCjIwMTUtMDgtMDU6IHZhZHoKICAgICAgICAgICAgW0phdmFdIE1ha2UgKGNoYXIqIFNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMgdXNhYmxlIGZvcgogICAgICAgICAgICBzdHJpbmdzIG9mIG90aGVyIHR5cGVzLCBlLmcuICJ1bnNpZ25lZCBjaGFyKiIuCgpWZXJzaW9uIDMuMC43ICgzIEF1ZyAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0wOC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBwb3RlbnRpYWwgc2VjdXJpdHkgZXhwbG9pdCBpbiBnZW5lcmF0ZWQgSmF2YSBjbGFzc2VzLgogICAgICAgICAgICBUaGUgc3dpZ0NQdHIgYW5kIHN3aWdDTWVtT3duIG1lbWJlciB2YXJpYWJsZXMgaW4gdGhlIGdlbmVyYXRlZCBKYXZhCiAgICAgICAgICAgIGNsYXNzZXMgYXJlIG5vdyBkZWNsYXJlZCAndHJhbnNpZW50JyBieSBkZWZhdWx0LiBGdXJ0aGVyIGRldGFpbHMgb2YgdGhlIGV4cGxvaXQKICAgICAgICAgICAgaW4gQW5kcm9pZCBpcyBiZWluZyBwdWJsaXNoZWQgaW4gYW4gYWNhZGVtaWMgcGFwZXIgYXMgcGFydCBvZiBVU0VOSVggV09PVCAnMTU6CiAgICAgICAgICAgIGh0dHBzOi8vd3d3LnVzZW5peC5vcmcvY29uZmVyZW5jZS93b290MTUvd29ya3Nob3AtcHJvZ3JhbS9wcmVzZW50YXRpb24vcGVsZXMuCgogICAgICAgICAgICBJbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCB5b3UgYXJlIHJlbHlpbmcgb24gdGhlc2UgbWVtYmVycyBiZWluZyBzZXJpYWxpemFibGUsCiAgICAgICAgICAgIHRoZW4geW91IHdpbGwgbmVlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBqYXZhYm9keSBhbmQgamF2YWJvZHlfZGVyaXZlZCB0eXBlbWFwcwogICAgICAgICAgICB0byBnZW5lcmF0ZSB0aGUgb2xkIGdlbmVyYXRlZCBjb2RlLiBUaGUgcmVsZXZhbnQgdHlwZW1hcHMgYXJlIGluIHRoZSBMaWIgZGlyZWN0b3J5CiAgICAgICAgICAgIGluIHRoZSBqYXZhLnN3ZywgYm9vc3Rfc2hhcmVkX3B0ci5pIGFuZCBib29zdF9pbnRydXNpdmVfcHRyLmkgZmlsZXMuIENvcHkgdGhlCiAgICAgICAgICAgIHJlbGV2YW50IGRlZmF1bHQgdHlwZW1hcHMgaW50byB5b3VyIGludGVyZmFjZSBmaWxlIGFuZCByZW1vdmUgdGhlICd0cmFuc2llbnQnIGtleXdvcmQuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTUtMDgtMDE6IHZhZHoKICAgICAgICAgICAgTWFrZSBjb25maWd1cmUgLS13aXRob3V0LWFsbGxhbmcgb3B0aW9uIG1vcmUgdXNlZnVsOiBpdCBjYW4gbm93IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGZvbGxvd2luZwogICAgICAgICAgICAtLXdpdGgteHh4IG9wdGlvbnMsIGFsbG93aW5nIHRvIGVhc2lseSBlbmFibGUganVzdCBvbmUgb3IgdHdvIGxhbmd1YWdlcy4KCjIwMTUtMDctMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNDQwIC0gSW5pdGlhbGlzZSBhbGwgbmV3bHkgY3JlYXRlZCBhcnJheXMgd2hlbiB1c2luZyAlYXJyYXlfZnVuY3Rpb25zIGFuZCAlYXJyYXlfY2xhc3MKICAgICAgICAgICAgaW4gdGhlIGNhcnJheXMuaSBsaWJyYXJ5IC0gYnVnIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiB1c2luZyBDKysuCgoyMDE1LTA3LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBJbXByb3ZlIGluZGVudGF0aW9uIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIGZvciBjb2RlIGluIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlczoKCiAgICAgICAgICAgICAgJXB5dGhvbnByZXBlbmQKICAgICAgICAgICAgICAlcHl0aG9uYXBwZW5kCiAgICAgICAgICAgICAgJXB5dGhvbmNvZGUKICAgICAgICAgICAgICAlcHl0aG9uYmVnaW4KICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikKCiAgICAgICAgICAgIE9sZCBlcnJvciBleGFtcGxlOgogICAgICAgICAgICAgIEVycm9yOiBMaW5lIGluZGVudGVkIGxlc3MgdGhhbiBleHBlY3RlZCAobGluZSAzIG9mIHB5dGhvbmNvZGUpCgogICAgICAgICAgICBOZXcgZXJyb3IgZXhhbXBsZToKICAgICAgICAgICAgICBFcnJvcjogTGluZSBpbmRlbnRlZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKGxpbmUgMyBvZiAlcHl0aG9uY29kZSBvciAlaW5zZXJ0KCJweXRob24iKSBibG9jaykKICAgICAgICAgICAgICBhcyBubyBsaW5lIHNob3VsZCBiZSBpbmRlbnRlZCBsZXNzIHRoYW4gdGhlIGluZGVudGF0aW9uIGluIGxpbmUgMQoKICAgICAgICAgICAgT2xkIHdhcm5pbmcgZXhhbXBsZToKICAgICAgICAgICAgICBXYXJuaW5nIDc0MDogV2hpdGVzcGFjZSBwcmVmaXggZG9lc24ndCBtYXRjaCAobGluZSAyIG9mICVweXRob25jb2RlIG9yICVpbnNlcnQoInB5dGhvbiIpIGJsb2NrKQoKICAgICAgICAgICAgTmV3IHdhcm5pbmcgZXhhbXBsZToKICAgICAgICAgICAgICBXYXJuaW5nIDc0MDogV2hpdGVzcGFjZSBpbmRlbnRhdGlvbiBpcyBpbmNvbnNpc3RlbnQgY29tcGFyZWQgdG8gZWFybGllciBsaW5lcyAobGluZSAzIG9mCiAgICAgICAgICAgICAgJXB5dGhvbmNvZGUgb3IgJWluc2VydCgicHl0aG9uIikgYmxvY2spCgogICAgICAgICAgICAKMjAxNS0wNy0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ICM0NzUuIEltcHJvdmUgZG9jc3RyaW5nIGluZGVudGF0aW9uIGhhbmRsaW5nLgogICAgICAgICAgICAKICAgICAgICAgICAgU1dJRy0zLjAuNSBhbmQgZWFybGllciBzb21ldGltZXMgdHJ1bmNhdGVkIHRleHQgcHJvdmlkZWQgaW4gdGhlIGRvY3N0cmluZyBmZWF0dXJlLgogICAgICAgICAgICBUaGlzIG9jY3VycmVkIHdoZW4gdGhlIGluZGVudGF0aW9uICh3aGl0ZXNwYWNlKSBpbiB0aGUgZG9jc3RyaW5nIHdhcyBsZXNzIGluIHRoZQogICAgICAgICAgICBzZWNvbmQgb3IgbGF0ZXIgbGluZXMgd2hlbiBjb21wYXJlZCB0byB0aGUgZmlyc3QgbGluZS4KICAgICAgICAgICAgU1dJRy0zLjAuNiBnYXZlIGEgJ0xpbmUgaW5kZW50ZWQgbGVzcyB0aGFuIGV4cGVjdGVkJyBlcnJvciBpbnN0ZWFkIG9mIHRydW5jYXRpbmcKICAgICAgICAgICAgdGhlIGRvY3N0cmluZyB0ZXh0LgogICAgICAgICAgICBOb3cgdGhlIGluZGVudGF0aW9uIGZvciB0aGUgJ2RvY3N0cmluZycgZmVhdHVyZSBpcyBzbWFydGVyIGFuZCBpcyBhcHByb3ByaWF0ZWx5CiAgICAgICAgICAgIGFkanVzdGVkIHNvIHRoYXQgbm8gdHJ1bmNhdGlvbiBvY2N1cnMuCgoyMDE1LTA3LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBTdXBwb3J0IGZvciBzcGVjaWFsIHZhcmlhYmxlIGV4cGFuc2lvbiBpbiB0eXBlbWFwIGF0dHJpYnV0ZXMuIEV4YW1wbGUgdXNhZ2UgZXhwYW5zaW9uCiAgICAgICAgICAgIGluIHRoZSAnb3V0JyBhdHRyaWJ1dGUgKEMjIHNwZWNpZmljKToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3R5cGUsIG91dD0iJCoxX2x0eXBlIikgdW5zaWduZWQgaW50JiAiJCoxX2x0eXBlIgoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGFzICQqMV9sdHlwZSBleHBhbmRzIHRvICd1bnNpZ25lZCBpbnQnOgoKICAgICAgICAgICAgICAldHlwZW1hcChjdHlwZSwgb3V0PSJ1bnNpZ25lZCBpbnQiKSB1bnNpZ25lZCBpbnQmICJ1bnNpZ25lZCBpbnQiCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlcyBjYW4gYmUgdXNlZCB3aXRoaW4gc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MgdG9vLiBFeGFtcGxlIHVzYWdlIGV4cGFuc2lvbjoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSB1bnNpZ25lZCBpbnQgInVpbnQiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9IiR0eXBlbWFwKGNzdHlwZSwgJCoxX2x0eXBlKSIpIHVuc2lnbmVkIGludCYgIiR0eXBlbWFwKGNzdHlwZSwgJCoxX2x0eXBlKSIKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGVzIGFyZSBleHBhbmRlZCBmaXJzdCBhbmQgaGVuY2UgdGhlIGFib3ZlIGlzIGVxdWl2YWxlbnQgdG86CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiKSB1bnNpZ25lZCBpbnQmICIkdHlwZW1hcChjc3R5cGUsIHVuc2lnbmVkIGludCkiCgogICAgICAgICAgICB3aGljaCB0aGVuIGV4cGFuZHMgdG86CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSJ1aW50IikgdW5zaWduZWQgaW50JiAidWludCIKCjIwMTUtMDctMjI6IGxpbmRsZXlmCgkgICAgQXBwbHkgcGF0Y2ggIzQzOSAtIHN1cHBvcnQgZm9yICR0eXBlbWFwKCkgKGFrYSBlbWJlZGRlZCB0eXBlbWFwcyBvciBzcGVjaWFsIHZhcmlhYmxlCiAgICAgICAgICAgIG1hY3JvcykgaW4gdHlwZW1hcCBhdHRyaWJ1dGVzLiBBIHNpbXBsZSBleGFtcGxlIHdoZXJlICR0eXBlbWFwKCkgaXMgZXhwYW5kZWQgaW4gdGhlCiAgICAgICAgICAgICdvdXQnIGF0dHJpYnV0ZSAoQyMgc3BlY2lmaWMpOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUpIHVuc2lnbmVkIGludCAidWludCIKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0iJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIikgdW5zaWduZWQgaW50JiAiJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIgoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0bzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9InVpbnQiKSB1bnNpZ25lZCBpbnQmICJ1aW50IgoKMjAxNS0wNy0xODogbTd0aG9uCgkgICAgW1B5dGhvbl0gRG9jc3RyaW5ncyBwcm92aWRlZCB2aWEgJWZlYXR1cmUoImRvY3N0cmluZyIpIGFyZSBub3cgcXVvdGVkIGFuZCBhZGRlZCB0bwogICAgICAgICAgICB0aGUgdHBfZG9jIHNsb3Qgd2hlbiB1c2luZyBweXRob24gYnVpbHRpbiBjbGFzc2VzICgtYnVpbHRpbikuIFdoZW4gbm8gZG9jc3RyaW5nIGlzCiAgICAgICAgICAgIHByb3ZpZGVkLCB0aGUgdHBfZG9jIHNsb3QgaXMgc2V0IHRvIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgY2xhc3MgbmFtZS4KICAgICAgICAgICAgR2l0aHViIGlzc3VlcyAjNDQ1IGFuZCAjNDYxLgoKMjAxNS0wNy0xNzoga3d3ZXR0ZQogICAgICAgICAgICBbb2N0YXZlXSBTdXBwb3J0IE9jdGF2ZSB2ZXJzaW9uIDQuMC4wICh0aGFua3MgdG8gcGF0Y2hlcyBmcm9tIE9yaW9uIFBvcGxhd3NraSkuCgoyMDE1LTA3LTA3OiB3c2Z1bHRvbgoJICAgIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyBhIHdyYXBwZXIgZm9yIGEgY2xhc3MnIGNvbnN0cnVjdG9yIGlmIHRoYXQgY2xhc3MgaGFzCiAgICAgICAgICAgIGFueSBiYXNlIGNsYXNzIHdpdGggYSBwcml2YXRlIGRlc3RydWN0b3IuIFRoaXMgaXMgYmVjYXVzZSB5b3VyIGNvbXBpbGVyIHNob3VsZAogICAgICAgICAgICBub3QgYWxsb3cgYSBjbGFzcyB0byBiZSBpbnN0YW50aWF0ZWQgaWYgYSBiYXNlIGhhcyBhIHByaXZhdGUgZGVzdHJ1Y3Rvci4gU29tZQogICAgICAgICAgICBjb21waWxlcnMgZG8sIHNvIGlmIHlvdSBuZWVkIHRoZSBvbGQgYmVoYXZpb3VyLCB1c2UgdGhlICJub3RhYnN0cmFjdCIgZmVhdHVyZSwgZWc6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJub3RhYnN0cmFjdCIpIERlcml2ZWQ7CiAgICAgICAgICAgICAgY2xhc3MgQmFzZSB7CiAgICAgICAgICAgICAgICB+QmFzZSgpIHt9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2Uge307CgpWZXJzaW9uIDMuMC42ICg1IEp1bCAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0wNy0wMjogd3NmdWx0b24KCSAgICBGaXggc3ludGF4IGVycm9yIHdoZW4gdGhlIHRlbXBsYXRlIGtleXdvcmQgaXMgdXNlZCBpbiB0eXBlcywgZWc6CgogICAgICAgICAgICAgIHN0ZDo6dGVtcGxhdGUgdmVjdG9yPGludD4gdjsKCjIwMTUtMDctMDI6IG5nbGFkaXR6CgkgICAgW0x1YV0gUHVzaCBjaGFyYWN0ZXJzIGFzIHVuZm9ybWF0dGVkIDEtY2hhcmFjdGVyIHN0cmluZ3MgdG8gYXZvaWQKCSAgICB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIHN1Y2ggYXMgKGNoYXIpMTI3IGJlaW5nIGNvbnZlcnRlZCB0bwoJICAgICI8XDEyNz4iIHdpdGggTHVhIDUuMyBhbmQgbGF0ZXIuICAoZ2l0aHViIFBSICM0NTIpCgoyMDE1LTA2LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gSW1wcm92ZSBoYW5kbGluZyBvZiB3aGl0ZXNwYWNlIGluICVweXRob25jb2RlLgoKCSAgICBQcmV2aW91c2x5IFNXSUcgbG9va2VkIGF0IHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgZmlyc3QgbGluZSBhbmQKCSAgICByZW1vdmVkIHRoYXQgbWFueSBjaGFyYWN0ZXJzIGZyb20gZWFjaCBzdWJzZXF1ZW50IGxpbmUsIHJlZ2FyZGxlc3MKCSAgICBvZiB3aGF0IHRob3NlIGNoYXJhY3RlcnMgd2VyZS4gIFRoaXMgd2FzIG1hZGUgd29yc2UgYmVjYXVzZSBTV0lHJ3MKCSAgICBwcmVwcm9jZXNzb3IgcmVtb3ZlcyBhbnkgd2hpdGVzcGFjZSBiZWZvcmUgYSAnIycuICBGaXhlcyBnaXRodWIKCSAgICBpc3N1ZSAjMzc5LCByZXBvcnRlZCBieSBKb2UgT3J0b24uCgoyMDE1LTA2LTEyOiB3c2Z1bHRvbgoJICAgIFtSXSBGaXggIzQzMCAtIGNhbGwgdG8gU1dJR19jcmVhdGVOZXdSZWYgaW4gY29weVRvQyB3YXMgaW5jb3JyZWN0bHkgbmFtZWQuCgoyMDE1LTA2LTExOiBzZ2hpcmF0ZQoJICAgIFtDI10gUGF0Y2ggIzQyNyBhZGRzIGluIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC1vdXRmaWxlIHRvIGNvbWJpbmUgYWxsIHRoZQogICAgICAgICAgICBnZW5lcmF0ZWQgQyMgY29kZSBpbnRvIGEgc2luZ2xlIGZpbGUuCgoyMDE1LTA2LTA5OiB3c2Z1bHRvbgoJICAgIEZpeCBzZWcgZmF1bHQgcHJvY2Vzc2luZyBDKysxMSB0eXBlIGFsaWFzaW5nLiBJc3N1ZSAjNDI0LgoKMjAxNS0wNS0yODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBBZGQgbmV3IGZlYXR1cmUgInB5dGhvbjpjZGVmYXVsdGFyZ3MiIHRvIGNvbnRyb2wgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICBjb2RlIGdlbmVyYXRpb24uIEJ5IGRlZmF1bHQsIFNXSUcgYXR0ZW1wdHMgdG8gY29udmVydCBDL0MrKyBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcwogICAgICAgICAgICBpbnRvIFB5dGhvbiB2YWx1ZXMgYW5kIGdlbmVyYXRlcyBjb2RlIGludG8gdGhlIFB5dGhvbiBsYXllciB3aXRoIHRoZXNlIHZhbHVlcy4KICAgICAgICAgICAgUmVjZW50IHZlcnNpb25zIG9mIFNXSUcgYXJlIGFibGUgdG8gY29udmVydCBtb3JlIG9mIHRoZXNlIHZhbHVlcywgaG93ZXZlciwgdGhlCiAgICAgICAgICAgIG5ldyBiZWhhdmlvdXIgY2FuIGJlIGNpcmN1bXZlbnRlZCBpZiBkZXNpcmVkIHZpYSB0aGlzIG5ldyBmZWF0dXJlLCBzdWNoIHRoYXQKICAgICAgICAgICAgdGhlIGRlZmF1bHQgYXJndW1lbnQgdmFsdWVzIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBDIGxheWVyIGFuZCBub3QgdGhlIFB5dGhvbiBsYXllci4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBDREEgewogICAgICAgICAgICAgICAgaW50IGZmZihpbnQgYSA9IDEsIGJvb2wgYiA9IGZhbHNlKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgY29kZSBnZW5lcmF0aW9uIGluIHRoZSBQeXRob24gbGF5ZXIgaXM6CgogICAgICAgICAgICAgIGNsYXNzIENEQShfb2JqZWN0KToKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGRlZiBmZmYoc2VsZiwgYT0xLCBiPUZhbHNlKToKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdF9hcmdzLkNEQV9mZmYoc2VsZiwgYSwgYikKCiAgICAgICAgICAgIEFkZGluZyB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInB5dGhvbjpjZGVmYXVsdGFyZ3MiKSBDREE6OmZmZjsKCiAgICAgICAgICAgIFJlc3VsdHMgaW46CgogICAgICAgICAgICAgIGNsYXNzIENEQShfb2JqZWN0KToKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGRlZiBmZmYoc2VsZiwgKmFyZ3MpOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZhdWx0X2FyZ3MuQ0RBX2ZmZihzZWxmLCAqYXJncykKCiAgICAgICAgICAgIFNvbWUgY29kZSBnZW5lcmF0aW9uIG1vZGVzLCBlZyAtYnVpbHRpbiBhbmQgLWZhc3Rwcm94eSwgYXJlIHVuYWZmZWN0ZWQgYnkgdGhpcyBhcwogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIGFsd2F5cyBvYnRhaW5lZCBmcm9tIHRoZSBDIGxheWVyLgoKMjAxNS0wNS0yNzogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBEZWFsIHdpdGggYW4gaW50ZWdlciBhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhIHR5cGVkZWYgdG8gYm9vbAoJICAgIHBhcmFtZXRlciBpbiB0aGUgQysrIHByb3RvdHlwZS4gIFNlZSAjMzI3LiBSZWdyZXNzaW9uIGZyb20gMy4wLjAgb253YXJkcy4KCjIwMTUtMDUtMTk6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggd2FybmluZyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgY29kZSB3aXRoIE1TVkMuCgkgICAgKEZpeGVzIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Avc3dpZy9wYXRjaGVzLzM1MS8gcmVwb3J0ZWQgYnkKCSAgICBNYXRldXN6IFN6eW1hv3NraSkuCgoyMDE1LTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IHdyYXBwaW5nIHNoYXJlZF9wdHIgb2YgY2xhc3NlcyB3aXRoIHByaXZhdGUgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4gCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyB0aGUgInVucmVmIiBmZWF0dXJlIHdoZW4gdXNlZCBvbiBjbGFzc2VzIHdpdGggcHJpdmF0ZSBkZXN0cnVjdG9ycy4KCjIwMTUtMDUtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggbXVsdGktYXJndW1lbnQgdHlwZW1hcHMgKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkKICAgICAgICAgICAgc28gdGhhdCB0aGV5IGNhbiBiZSBhcHBsaWVkIHRvIGEgd2lkZXIgcmFuZ2Ugb2YgdHlwZXMuIEZpeGVzICMzODUuCgoyMDE1LTA1LTA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRGVhbCB3aXRoIGFuIGludGVnZXIgYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBib29sCgkgICAgcGFyYW1ldGVyIGluIHRoZSBDKysgcHJvdG90eXBlLiAgRml4ZXMgZ2l0aHViICMzMjcsIHJlcG9ydGVkIGJ5CgkgICAgR3JlZyBBbGxlbi4KCjIwMTUtMDUtMDc6IExpbmRsZXlGCgkgICAgW0phdmFdIEFsbG93IGZlYXR1cmUoImRpcmVjdG9yIikgYW5kIGZlYXR1cmUoInJlZiIpIHRvIGJlIHVzZWQKCSAgICB0b2dldGhlci4gIEdpdGh1YiBQUiM0MDMuCgoyMDE1LTA1LTA1OiBvbGx5CgkgICAgU3VwcHJlc3Mgd2FybmluZyAzMjUgIk5lc3RlZCBjbGFzcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCAoRm9vCgkgICAgaWdub3JlZCkiIHdoZW4gRm9vIGhhcyBhbHJlYWR5IGJlZW4gZXhwbGljaXRseSBpZ25vcmVkIHdpdGggIiVpZ25vcmUiLgoKMjAxNS0wNS0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGZyaWVuZCB0ZW1wbGF0ZXMsIGluY2x1ZGluZyBvcGVyYXRvciBvdmVybG9hZGluZyAtIGZpeGVzICMxOTYuIENvbnNpZGVyaW5nCiAgICAgICAgICAgIHRoZSBleGFtcGxlIGJlbG93LCBwcmV2aW91c2x5IHRoZSBvcGVyYXRvciBnYXZlIGEgc3ludGF4IGVycm9yIGFuZCBmcmllbmRmdW5jIGluY29ycmVjdGx5CiAgICAgICAgICAgIHdhcm5lZCB3aXRoOgoKICAgICAgICAgICAgICJXYXJuaW5nIDUwMzogQ2FuJ3Qgd3JhcCAnZnJpZW5kZnVuYzwoVHlwZSk+JyB1bmxlc3MgcmVuYW1lZCB0byBhIHZhbGlkIGlkZW50aWZpZXIuIgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gY2xhc3MgTXlDbGFzcyB7CiAgICAgICAgICAgICAgICBmcmllbmQgaW50IGZyaWVuZGZ1bmMgPFR5cGU+KGRvdWJsZSBpcywgTXlDbGFzcyA8VHlwZT4gJiB4KTsKICAgICAgICAgICAgICAgIGZyaWVuZCBpbnQgb3BlcmF0b3I8PCA8VHlwZT4oZG91YmxlIHVuLCBjb25zdCBNeUNsYXNzIDxUeXBlPiAmeCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgYWxzbyBwcmV2aW91c2x5IGluY29ycmVjdGx5IHdhcm5lZCB3aXRoOgoKICAgICAgICAgICAgICAiV2FybmluZyAzMDI6IElkZW50aWZpZXIgJ3RlbXBsYXRlX2ZyaWVuZCcgcmVkZWZpbmVkIChpZ25vcmVkKSwiCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IFQgdGVtcGxhdGVfZnJpZW5kKFQpOwogICAgICAgICAgICAgIHN0cnVjdCBNeVRlbXBsYXRlIHsKICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGZyaWVuZCBUIHRlbXBsYXRlX2ZyaWVuZChUKTsKICAgICAgICAgICAgICB9OwoKMjAxNS0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGhhbmRsaW5nIG9mIGNvbnZlcnNpb24gb3BlcmF0b3JzIHdoZXJlIHRoZSBvcGVyYXRvciBpcyBzcGxpdCBvdmVyIG11bHRpcGxlCiAgICAgICAgICAgIGxpbmVzIG9yIGhhcyBjb21tZW50cyB3aXRoaW4gdGhlIG9wZXJhdG9yIHR5cGUuIEZpeGVzICM0MDEuCgogICAgICAgICAgICBBbHNvIGZpeCBzaW1pbGFyIHByb2JsZW0gd2l0aCBub3JtYWwgb3BlcmF0b3JzIHdoaWNoIGdhdmUgYSBzeW50YXggZXJyb3IgaWYgc3BsaXQgb3ZlcgogICAgICAgICAgICBtdWx0aXBsZSBsaW5lcyBvciBoYWQgYSBjb21tZW50IHdpdGhpbiB0aGUgb3BlcmF0b3IgZGVjbGFyYXRpb24uCgoyMDE1LTA0LTMwOiBvbGx5CgkgICAgSWdub3JlIHVua25vd24gcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgd2hpY2ggYXJlIGluc2lkZSBhbiBpbmFjdGl2ZQoJICAgIGNvbmRpdGlvbmFsIChnaXRodWIgaXNzdWUgIzM5NCwgcmVwb3J0ZWQgYnkgRGFuIFdpbGNveCkuCgkgICAgUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDMuMC4zLgoKMjAxNS0wNC0yNzogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBGaXggImRlZmF1bHQiIHR5cGVtYXAgdXNlZCBhZnRlciBhbiBhcmd1bWVudCB3aXRoICJudW1pbnB1dHM9MCIgKCMzNzcpLgoKMjAxNS0wNC0yNDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyNTYuIENvZGUgZ2VuZXJhdGVkIHdpdGggJy1idWlsdGluIC1tb2Rlcm5hcmdzJyBzZWdmYXVsdHMgZm9yIGFueQogICAgICAgICAgICBtZXRob2QgdGFraW5nIHplcm8gYXJndW1lbnRzLgoKICAgICAgICAgICAgQWxzbyBmaXhlczogIlN5c3RlbUVycm9yOiBlcnJvciByZXR1cm4gd2l0aG91dCBleGNlcHRpb24gc2V0IiBkdXJpbmcgZXJyb3IgY2hlY2tpbmcKICAgICAgICAgICAgd2hlbiB1c2luZyBqdXN0IC1idWlsdGluIGFuZCB0aGUgaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgaXMgcGFzc2VkIHRvIGEgY2xhc3MKICAgICAgICAgICAgbWV0aG9kIGV4cGVjdGluZyB6ZXJvIGFyZ3VtZW50cy4KCjIwMTUtMDQtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBCdWcgIzM4NiAtIE1lbW9yeSBsZWFrIGZpeCBpbiAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSB0eXBlbWFwcy4KCjIwMTUtMDQtMjM6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gTWFrZSAiZGVmYXVsdCIgdHlwZW1hcCB3b3JrIGFnYWluICgjMzMwLCAjMzc3KS4KCjIwMTUtMDQtMjM6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSB1c2Ugb2YgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZSBwb2ludGVyIHR5cGVzICgjMzY1LCAjMzc2KS4KCjIwMTUtMDQtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAnbWFrZSBjaGVjay1jY2FjaGUnIHdoaWNoIGlzIHBhcnQgb2YgJ21ha2UgY2hlY2snIHdoZW4gb25lIG9mIHRoZSBDQ0FDSEVfCiAgICAgICAgICAgIGVudmlyb25tZW50IHZhcmlhYmxlcywgZm9yIGV4YW1wbGUgQ0NBQ0hFX0RJU0FCTEUsIGlzIHNldC4KCjIwMTUtMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENsZWFyZXIgd2FybmluZyBtZXNzYWdlIGZvciBiYWRseSBjb25zdHJ1Y3RlZCB0eXBlY2hlY2sgdHlwZW1hcHMuIEZvciBleGFtcGxlLCB3YXM6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozOiBXYXJuaW5nIDQ2NzogT3ZlcmxvYWRlZCBmb28oaW50KSBub3Qgc3VwcG9ydGVkIChubyB0eXBlIGNoZWNraW5nCiAgICAgICAgICAgICAgcnVsZSBmb3IgJ2ludCcpLgoKICAgICAgICAgICAgTm93OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzogV2FybmluZyA0Njc6IE92ZXJsb2FkZWQgZm9vKGludCkgbm90IHN1cHBvcnRlZCAoaW5jb21wbGV0ZSB0eXBlIGNoZWNraW5nCiAgICAgICAgICAgICAgcnVsZSAtIG5vIHByZWNlZGVuY2UgbGV2ZWwgaW4gdHlwZWNoZWNrIHR5cGVtYXAgZm9yICdpbnQnKS4KCjIwMTUtMDQtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggIzM1MyAtIExpbmtlciBtdWx0aXBsZSBkZWZpbml0aW9uIG9mICdFeGNlcHRpb25NYXRjaGVzJyB3aGVuCiAgICAgICAgICAgIHVzaW5nIGRpcmVjdG9ycyBhbmQgbXVsdGlwbGUgbW9kdWxlcy4KCjIwMTUtMDQtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lcmdlICMzMjAgLSBNYWtlIF9fZGljdF9fIGFjY2Vzc2libGUgZm9yIFB5dGhvbiBidWlsdGluIGNsYXNzZXMuCgoyMDE1LTA0LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM3NSAtIHBhcnNpbmcgb2YgZXh0ZXJuICJDIiBhbmQgdHlwZWRlZiBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBleHRlcm4gIkMiIHR5cGVkZWYgdm9pZCAoKkhvb2syX3QpKGludCwgY29uc3QgY2hhciAqKTsKICAgICAgICAgICAgICBleHRlcm4gIkMiIHR5cGVkZWYgaW50IEludGVnZXI7CgoyMDE1LTAzLTEyOiBvbGx5CgkgICAgLURTV0lHX0RJUkVDVE9SX1NUQVRJQyBpcyBub3cgc3VwcG9ydGVkIGZvciBhbGwgbGFuZ3VhZ2VzIHdpdGgKCSAgICBkaXJlY3RvciBzdXBwb3J0LCBub3Qgb25seSBQeXRob24gYW5kIFBIUC4KCjIwMTUtMDMtMDI6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgLWNnbyBvcHRpb24sIHJlcXVpcmVkIGZvciBHbyB2ZXJzaW9ucyAxLjUgYW5kCgkgICAgbGF0ZXIuCgoyMDE1LTAyLTI2OiBvbGx5CgkgICAgRml4IHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIHRvcD09TlVMTCwgaW50cm9kdWNlZCBieSBuZXN0ZWQgY2xhc3MKCSAgICBoYW5kbGluZyAocmVwb3J0ZWQgaW4gaXNzdWUjMzQ2IGJ5IFBhd2W/IFRvbXVsaWspLgoKMjAxNS0wMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0d1aWxlXSBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIHN0YXRpYyBjb25zdCBjaGFyIG1lbWJlciB2YXJpYWJsZXMgd2hlbgogICAgICAgICAgICBkZWZpbmVkIGFuZCBkZWNsYXJlZCBpbmxpbmUuCgoyMDE1LTAyLTA5OiBtaXNoYXMKICAgICAgICAgICAgW0dvXSBGaXggJWltcG9ydCBvZiBmaWxlcyBpbiBzdWIgZGlyZWN0b3JpZXMuCgoyMDE1LTAyLTA1OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIElnbm9yZSBHbyBzcGVjaWZpYyB0eXBlIG1hcHMgKGdvaW4sIGdvb3V0LCBldGMuKSBpZiB0aGV5IGFyZSBlbXB0eS4KCjIwMTUtMDItMDU6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gR2VuZXJhdGVkIEdvIGNvZGUgbm8gbG9uZ2VyIGNhbGxzIF9zd2lnX2dvYWxsb2NhdGUgb3IKICAgICAgICAgICAgX3N3aWdfbWFrZWdvc3RyaW5nLCBhcyB0aGV5IHdpbGwgbm8gbG9uZ2VyIHdvcmsgYXMgb2YgR28gMS41LgoKVmVyc2lvbiAzLjAuNSAoMzEgSmFuIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IFB5dGhvbiAtY2xhc3NpYyBhbmQgcHJvcGVydHkgc2V0dGluZy4gU2V0dGluZyBwcm9wZXJ0aWVzIG9uIGNsYXNzaWMgY2xhc3NlcwogICAgICAgICAgICB3YXMgYnJva2VuIGluIHN3aWctMy4wLjMgYnkgYXR0ZW1wdGluZyB0byB1c2UgX19zZXRhdHRyX18uIFRoaXMgcmVncmVzc2lvbiBpcyBmaXhlZCBub3cKICAgICAgICAgICAgYnkgdXNpbmcgX19kaWN0X18gYWdhaW4gd2hlbiB1c2luZyAtY2xhc3NpYy4KICAgICAgICAgICAgRml4ZXMgcGF0Y2ggIzIzMi4KCjIwMTUtMDEtMjc6IHNtYXJjaGV0dG8KCSAgICBbU2NpbGFiXSBTdXBwb3J0IGZvciB0aGUgU2NpbGFiIGxhbmd1YWdlIGhhcyBiZWVuIGFkZGVkCgoyMDE1LTAxLTIzOiBvbGx5CgkgICAgW1BIUF0gV2hlbiB3cmFwcGluZyBhIHJldHVybmVkIHJlc291cmNlIGFzIGFuIG9iamVjdCwgY2hlY2sgaWYgYWxsCgkgICAgY2FzZXMgd3JhcCBpdCBpbiB0aGUgc2FtZSBjbGFzcywgYW5kIGlmIHNvIGVsaW1pbmF0ZSB0aGUgcG9pbnRsZXNzCgkgICAgc3dpdGNoIHN0YXRlbWVudCB3cmFwcGVyIHdlIHByZXZpb3VzbHkgZ2VuZXJhdGVkLgoKMjAxNS0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gTWVyZ2UgcGF0Y2ggIzI5NyBmb3IgU0YgYnVnICMxMjc3IC0gT2N0YXZlIHNoYXJlZF9wdHIgc3VwcG9ydAoKMjAxNS0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gTWVyZ2UgcGF0Y2ggIzI1MCAtIEZpeGVzIGZvciB1c2luZyAlY29uc3RhbnQgYW5kIG9iamVjdHMgKG5vbi1wcmltaXRpdmUgdHlwZXMpCgoyMDE1LTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgR29dIE1lcmdlIHBhdGNoICMzMDggYW5kIGZpeCAjMzA3IC0gQysrMTEgc3Ryb25nbHkgdHlwZWQgZW51bSBzdXBwb3J0CiAgICAgICAgICAgIGluIGRpcmVjdG9ycwoKMjAxNS0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gU2Vjb25kIGZpeCBmb3IgIzI5NCAjMjk2IC0gUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIFNXSUctMy4wLjMgd2hlbgogICAgICAgICAgICB3cmFwcGluZyBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cywgdGhpcyB0aW1lIHdoZW4gdXNpbmcga3dhcmdzLgoKVmVyc2lvbiAzLjAuNCAoMTQgSmFuIDIwMTUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNS0wMS0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBzZWdmYXVsdCBpbiBkaXJlY3RvciB1cGNhbGwgY2hlY2sgd2hlbiB1c2luZyBQSFAgYnVpbHQgd2l0aAoJICAgIFpUUyBlbmFibGVkLiAgRml4ZXMgIzE1NSwgcmVwb3J0ZWQgYnkgUGllcnJlIExhYmFzdGllLgoKMjAxNS0wMS0xMjogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI5NCAjMjk2IC0gUmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIFNXSUctMy4wLjMgd2hlbgogICAgICAgICAgICB3cmFwcGluZyBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4gSW52YWxpZCBvciBtaXNzaW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIHdlcmUgc29tZXRpbWVzIGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSBweXRob24gbGF5ZXIuCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgQWxsb3cgQysrMTEgImV4cGxpY2l0IGNvbnN0ZXhwciIuICBGaXhlcyBnaXRodWIgaXNzdWUgIzI4NCByZXBvcnRlZAoJICAgIGJ5IFBhd2VsIFRvbXVsaWsuICBBbHNvIGhhbmRsZSAiY29uc3RleHByIGV4cGxpY2l0IiBhbmQgImNvbnN0ZXhwcgoJICAgIHN0YXRpYyIuCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgV2hlbiByZXBvcnRpbmcgYW4gZXJyb3IgZm9yIGEgY29uc3RydWN0IHdoaWNoIGhhc24ndCBiZWVuCgkgICAgdGVybWluYXRlZCB3aGVuIHRoZSBlbmQgb2YgdGhlIGZpbGUgaXMgcmVhY2hlZCwgcmVwb3J0IGl0IGF0IHRoZQoJICAgIHN0YXJ0IGxpbmUgcmF0aGVyIHRoYW4gIkVPRiIgYXMgdGhlbiB0b29scyBsaWtlIGVkaXRvcnMgYW5kIElERXMKCSAgICB3aWxsIHRha2UgeW91IHRvIGEgZ2VuZXJhbGx5IG1vcmUgdXNlZnVsIHBsYWNlIGZvciBmaXhpbmcgdGhlCgkgICAgcHJvYmxlbS4KCjIwMTUtMDEtMDg6IG9sbHkKCSAgICBJbXByb3ZlIGVycm9yIG1lc3NhZ2VzIGZvciBhIGZldyBjYXNlcyB3aGljaCBwcmV2aW91c2x5IGdhdmUgdGhlCgkgICAgb25lIG9mIHRoZSBjcnlwdGljIGNhdGNoLWFsbCBlcnJvcnMgIlN5bnRheCBlcnJvciBpbiBpbnB1dCIuCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgUHJvdmlkZSAtY3BwZXh0IGFzIGEgZ2VuZXJhbCBjb21tYW5kIGxpbmUgb3B0aW9uIGZvciBzZXR0aW5nIHRoZQoJICAgIGV4dGVuc2lvbiB1c2VkIGZvciBnZW5lcmF0ZWQgQysrIGZpbGVzIChwcmV2aW91c2x5IGl0IHdhcyBzcGVjaWZpYwoJICAgIHRvIHRoZSBQSFAgYmFja2VuZCkuICBEZXByZWNhdGUgdGhlIGVxdWl2YWxlbnQgLXN1ZmZpeCBvcHRpb24KCSAgICBwcm92aWRlZCBieSB0aGUgT2NhbWwgYmFja2VuZCwgYnV0IGNvbnRpbnVlIHRvIHN1cHBvcnQgdGhhdCBmb3IKCSAgICBub3cuCgpWZXJzaW9uIDMuMC4zICgzMCBEZWMgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTEyLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI4MCAtIGFib3J0IHVzaW5nIGFsbCBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlcnMgd2l0aGluIG90aGVyIHRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlcnMuCgoyMDE0LTEyLTI3OiB0YWxieQogICAgICAgICAgICBbUGVybF0gSXNzdWUgIzI4MiBwZXJsNSBhcmNobGliIHZzIGFyY2hsaWJleHAKICAgICAgICAgICAgW1BlcmxdIHRpZHkgIndhcm5pbmc6IGR1cGxpY2F0ZSAnZXh0ZXJuJyBkZWNsYXJhdGlvbiBzcGVjaWZpZXIiIHdoZW4gYnVpbGRpbmcgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgdW5kZXIgY2xhbmcKCjIwMTQtMTItMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciAlY29uc3RhbnQgYW5kIHN0cnVjdHMvY2xhc3NlcyAtIGlzc3VlICMyNzIKCjIwMTQtMTItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjQ1IC0gcmVncmVzc2lvbiAoc2luY2Ugc3dpZy0zLjAuMCkgaW4gdGVtcGxhdGVkIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgVGVtcGxhdGVkIGNvbnN0cnVjdG9ycyBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIC0gdGhleSB3ZXJlIGluY29ycmVjdGx5IGlnbm9yZWQgd2l0aCBhIHdhcm5pbmcgNTA0OgogICAgICAgICAgICAiRnVuY3Rpb246IHh5eiBtdXN0IGhhdmUgYSByZXR1cm4gdHlwZS4gSWdub3JlZC4iCgoyMDE0LTEyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgQysrMTEgc3Ryb25nbHkgdHlwZWQgZW51bWVyYXRpb25zLgoKMjAxNC0xMS0yMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEZpeCBtdWx0aXBseSBkZWZpbmVkIGVycm9yIHdoZW4gdXNpbmcgJXJlbmFtZSBvZiBlbnVtIGl0ZW1zIHdoZW4gdXNpbmcgdGhlICJzaW1wbGUgZW51bSIKICAgICAgICAgICAgd3JhcHBlcnMuCgoyMDE0LTEwLTI4OiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMDEgVGhlIGdlbmVyYXRlZCAucHkgZmlsZSBubyBsb25nZXIgdXNlcyAqYXJncyBmb3IgYWxsIFB5dGhvbiBwYXJhbWV0ZXJzLgogICAgICAgICAgICBJbnN0ZWFkLCB0aGUgcGFyYW1ldGVycyBhcmUgbmFtZWQgdXNpbmcgdGhlIEMrKyBwYXJhbWV0ZXIgbmFtZXMuCgogICAgICAgICAgICAiY29tcGFjdGRlZmF1bHRhcmdzIiBmZWF0dXJlIGNhbiBiZSBlbmFibGVkIHRvIHJlc3RvcmUgdGhlIG9sZCBiZWhhdmlvdXIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTQtMTAtMjQ6IHRpbW90aGVlY291cgogICAgICAgICAgICBbRF0gUGF0Y2ggIzIwNCBVc2UgY29yZS5hdG9taWMuYXRvbWljT3AgdG8gbXV0YXRlIHNoYXJlZCB2YXJpYWJsZXMKCjIwMTQtMTAtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpc3N1ZSAjMjQyIC0gVXNlIG9mIHRoZSAia3dhcmdzIiBmZWF0dXJlIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IHR1cm5zIG9uIHRoZQogICAgICAgICAgICAiY29tcGFjdGRlZmF1bHRhcmdzIiBmZWF0dXJlIGlmIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZG9lcyBub3Qgc3VwcG9ydCBrd2FyZ3MuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFmZmVjdHMgYWxsIGxhbmd1YWdlcyBleGNlcHQgUHl0aG9uIGFuZCBSdWJ5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0xMC0xMDogZGlvcmNldHkKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIzMiBGaXggcHJvcGVydHkgYWNjZXNzIHVzaW5nIGRpcmVjdG9ycwoKMjAxNC0xMC0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4ZXMgd2hlbiB1c2luZyAtYnVpbHRpbiBhbmQgc3RkOjp2ZWN0b3Ivc3RkOjpsaXN0IHdyYXBwZXJzIHRvIGFsbG93IGRlbGV0aW9uCiAgICAgICAgICAgIG9mIHNpbmdsZSBlbGVtZW50cywgc3VjaCBhcyAnZGVsIHZlY1swXScuCgoyMDE0LTA5LTMwOiBvbGl2ZXJiCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBNZXJnZSBwYXRjaCAjMjE2IGJ5IFJpY2hpZTc2NSAtIEFkZGVkIHN1cHBvcnQgZm9yIG1hbnkgdmVyc2lvbnMgb2YgdjggamF2YXNjcmlwdC4KCjIwMTQtMDktMzA6IG9saXZlcmIKICAgICAgICAgICAgW0phdmFzY3JpcHRdIE1lcmdlIHBhdGNoICMxOTUgYnkgeml0dGl4IC0gRml4ZWQgSlNDbGFzc1JlZiBkZWNsYXJhdGlvbiBub3QgdXNpbmcgdGhlIHN0YXRpYyBvbmUuCgoyMDE0LTA5LTMwOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gSW4gY29uZmlndXJlIHNjcmlwdCwgcmVxdWlyZSBHbyAxLjEgb3IgbGF0ZXIuCgoyMDE0LTA5LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMjA3IC0gRml4IE5vIG1vZHVsZSBlcnJvciB3aXRoIC1yZWxhdGl2ZWltcG9ydCB3aGVuIHVzaW5nIHNpbmdsZQogICAgICAgICAgICBoZWFkZXIgZmlsZSBpbXBvcnQuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjMjA4IC0gSW5pdGlhbGlzZSBuZXdseSBjcmVhdGVkIGFycmF5IHdoZW4gdXNpbmcgYXJyYXlfZnVuY3Rpb25zIGluIHRoZQogICAgICAgICAgICBjYXJyYXlzLmkgbGlicmFyeSAoQysrIHVzYWdlKS4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjMTg3IC0gRml4IGNyYXNoIG9uIHNodXRkb3duIG9mIHRoZSBSdWJ5IGludGVycHJldGVyIGlmIG1vcmUgdGhhbiBvbmUKICAgICAgICAgICAgbW9kdWxlIHdhcyBsb2FkZWQgYXQgYSB0aW1lIHdoZW4gZGF0YSBpcyBiZWluZyBzaGFyZWQgYmV0d2VlbiBtb2R1bGVzLgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMxNjggLSBGaXggbGVhayBpbiBKYXZhIGRpcmVjdG9yIHN0cmluZyBoYW5kbGluZyBhZnRlciB0aGUgSmF2YQogICAgICAgICAgICB1cGNhbGwgd2hlbiBjYWxsZWQgZnJvbSBhIG5hdGl2ZSB0aHJlYWQuCgoyMDE0LTA5LTI1OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRqdXN0IGdlbmVyYXRlZCBjb2RlIHRvIHdvcmsgd2l0aCB1cGNvbWluZyBHbyAxLjQKCSAgICByZWxlYXNlLgoKMjAxNC0wOS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIHBhdGNoIGZyb20gVGhvbWFzIE1hc2xhY2ggdG8gZml4IGNyYXNoIGluIHdyYXBwZXJzIHdoZW4gdXNpbmcgLXRocmVhZHMgaW4KICAgICAgICAgICAgdGhlIFNUTCBpdGVyYXRvcnMgKFN3aWdQeUl0ZXJhdG9yIGRlc3RydWN0b3IpLgoKMjAxNC0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNZXJnZSBwYXRjaCAjMjI5IGZyb20gY29udHJlIC0gQWRkIGJvb2wgYXJyYXkgdHlwZXMgdG8gYXJyYXlzX2NzaGFycC5pCgoyMDE0LTA5LTEyOiBvbGx5CgkgICAgW1BIUF0gQWRkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYW55IFBIUCBpbnRlcmZhY2VzIGEgd3JhcHBlZCBjbGFzcwoJICAgIGltcGxlbWVudHMsIGUuZy46ICV0eXBlbWFwKCJwaHBpbnRlcmZhY2VzIikgTXlJdGVyYXRvciAiSXRlcmF0b3IiOwoKMjAxNC0wOS0xMTogb2xseQoJICAgIFtQSFBdIEZpeCB0aHJvd2luZyBhIFBIUCBleGNlcHRpb24gdGhyb3VnaCBDKysgZnJvbSBhIHN1YmNsYXNzZWQKCSAgICBkaXJlY3RvciBtZXRob2QgLSBQSFAgTlVMTCBnZXRzIHJldHVybmVkIGJ5IHRoZSBzdWJjbGFzc2VkIG1ldGhvZAoJICAgIGluIHRoaXMgY2FzZSwgc28gdGhlIGRpcmVjdG9yb3V0IHR5cGVtYXAgbmVlZHMgdG8gYWxsb3cgdGhhdCAoYXQKCSAgICBsZWFzdCBpZiBhbiBleGNlcHRpb24gaXMgYWN0aXZlKS4KCjIwMTQtMDktMDk6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgZ29hcmdvdXQgdHlwZW1hcC4KCjIwMTQtMDktMDk6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnbWVudGF0aW9uIGZhdWx0cyB3aXRoIGRpcmVjdG9ycyBpbiBQSFAgPj0gNS40LCBhbmQKCSAgICByZWVuYWJsZSBydW5tZSB0ZXN0cyBmb3IgZGlyZWN0b3JfYmFzaWMgdGVzdGNhc2UuICBGaXggZnJvbQoJICAgIHBhdmVsLWNoYXJ2YXQgaW4gaXNzdWUjMTY0LgoKMjAxNC0wOS0wNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBpbXR5cGUsIGdvaW4sIGdvb3V0LCBnb2RpcmVjdG9yaW4sIGFuZAoJICAgIGdvZGlyZWN0b3JvdXQgdHlwZW1hcHMsIHRvIHN1cHBvcnQgd3JpdGluZyBHbyBjb2RlIHRvCgkgICAgY29udmVydCBiZXR3ZWVuIHR5cGVzLgoKMjAxNC0wOS0wMjogb2xseQoJICAgIFtQeXRob25dIEZpeCByZWdyZXNzaW9uIGluIGluZGVudGF0aW9uIG9mIHB5dGhvbiBjb2RlIHByb2R1Y2VkIHdpdGgKCSAgICAtbW9kZXJuLCBpbnRyb2R1Y2VkIGJ5IGNoYW5nZXMgaW4gIzE4OC4gIFJlcG9ydGVkIGJ5IGZhYmllbmNhc3RhbgoJICAgIGluICMyMTguCgoyMDE0LTA5LTAxOiBvbGx5CgkgICAgSXNzdWUgYW4gZXJyb3IgZm9yIHVua25vd24gU1dJRyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcywgcmF0aGVyCgkgICAgdGhhbiBxdWlldGx5IGlnbm9yaW5nIHRoZW0uICBSZXBvcnRlZCBieSBqcmhlbHNleSBpbiBpc3N1ZSMyMTcuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTA4LTE1OiB0YWxieQogICAgICAgICAgICBbUGVybF0gSW5jbHVkZSBndWFyZCBmaXggZm9yIG5lc3RlZCBtb2R1bGVzIGZyb20gQW50aG9ueSBIZWFkaW5nIChTRiBQYXRjaCAjMzUwKS4KCjIwMTQtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTWVyZ2UgcGF0Y2ggIzIwMCBmcm9tIGdwZXRyb3UgLSBDaGFuZ2VkIENTaGFycCBsaWNlbnNlIGhlYWRlciB0byBpbmNsdWRlIGF1dG8tZ2VuZXJhdGVkCiAgICAgICAgICAgIHRhZyBzbyB0aGF0IFN0eWxlQ29wIGlnbm9yZXMgdGhlIGZpbGVzLgoKMjAxNC0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE1lcmdlIHBhdGNoICMxOTggZnJvbSBZdXZhbCBLYXNodGFuIC0gU3VwcG9ydCBmb3IgamF2YS5uaW8uQnl0ZUJ1ZmZlciBtYXBwaW5nIHRvCiAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKiBpbiB2YXJpb3VzLmkgaW4gTklPQlVGRkVSIHR5cGVtYXBzLgoKMjAxNC0wNy0xNDogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIENoYW5nZSBzdHJ1Y3QgZGVmaW5pdGlvbiB0byB1c2Ugdm9pZCAqLCBub3QgdWludDgsIHNvCgkgICAgdGhhdCB0aGUgdHlwZSBpcyByZWNvcmRlZCBhcyBwb3NzaWJseSBjb250YWluaW5nCgkgICAgcG9pbnRlcnMuICBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgMS4zIGdhcmJhZ2UgY29sbGVjdG9yCgkgICAgZG9lcyBub3QgY29sbGVjdCBwb2ludGVycyBwYXNzZWQgdG8gQysrIGNvZGUuCgoyMDE0LTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgQnVnICMxMzc1IC0gRXhwYW5zaW9uIG9mIHRoZSAkcGFyZW50Y2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGUgaW5jb3JyZWN0bHkgY29udGFpbnMKICAgICAgICAgICAgYnJhY2tldHMgaW4gdGhlIGV4cGFuZGVkIG5hbWUuCgpWZXJzaW9uIDMuMC4yICg0IEp1biAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wNi0wMjogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIFB1bGwgcmVxdWVzdCAjMTc2OgogICAgICAgICAgICBJZiBjbGFzcyBoYXMgbm8gX19lcSBpbXBsZW1lbnRlZCwgdGhlbiBkZWZhdWx0IF9fZXEgaXMgZ2VuZXJhdGVkLiAKICAgICAgICAgICAgRGVmYXVsdCBfX2VxIGNvbXBhcmVzIGFjdHVhbCBwb2ludGVycyBzdG9yZWQgaW5zaWRlIEx1YSB1c2VyZGF0YS4KCjIwMTQtMDYtMDI6IHZrYWxpbmluCiAgICAgICAgICAgIEZpeCAjMTgzIC0gJWV4dGVuZCBhbmQgdW5uYW1lZCBuZXN0ZWQgc3RydWN0cwoKMjAxNC0wNS0yODoga3d3ZXR0ZQogICAgICAgICAgICBGaXggaW5zdGFsbCBmYWlsdXJlIHdoZW4gdXNpbmcgYW4gJ291dCBvZiBzb3VyY2UnIGJ1aWxkIHVzaW5nIHRoZSBzaGlwcGVkCiAgICAgICAgICAgIHRhcmJhbGwgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0zLjAuMS4KCjIwMTQtMDUtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gUmVtb3ZlIGRlcHJlY2F0ZWQgLWdsb2JhbC8tbm9nbG9iYWwgY29tbWFuZC1saW5lIGFyZ3VtZW50cwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKVmVyc2lvbiAzLjAuMSAoMjcgTWF5IDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wNS0yNTogaGZhbGNpYwoJICAgIFtQeXRob25dIFB5dGhvbiAzIGJ5dGUgc3RyaW5nIG91dHB1dDogdXNlIGVycm9ycz0ic3Vycm9nYXRlZXNjYXBlIgogICAgICAgICAgICBpZiBhdmFpbGFibGUgb24gdGhlIHZlcnNpb24gb2YgUHl0aG9uIHRoYXQncyBpbiB1c2UuIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgb3JpZ2luYWwgYnl0ZSBzdHJpbmcgKGFuZCBwb3RlbnRpYWxseSB0cnlpbmcgYSBmYWxsYmFjawogICAgICAgICAgICBlbmNvZGluZykgaWYgdGhlIGJ5dGVzIGNhbid0IGJlIGRlY29kZWQgYXMgVVRGLTguCgogICAgICAgICAgICBQcmV2aW91c2x5LCBhIFVuaWNvZGVEZWNvZGVFcnJvciB3b3VsZCBiZSByYWlzZWQgd2l0aCBubyB3YXkgdG8gdHJlYXQKICAgICAgICAgICAgdGhlIGRhdGEgYXMgYnl0ZXMgb3IgdHJ5IGFub3RoZXIgY29kZWMuCgoyMDE0LTA1LTE4OiB2a2FsaW5pbgoJICAgIEJ1ZyAjMTc1IC0gUmVzdG9yZSAlZXh0ZW5kIHRvIHdvcmsgZm9yIHVubmFtZWQgbmVzdGVkIHN0cnVjdHVyZXMgYnkgdXNpbmcgYSBDCiAgICAgICAgICAgIHN5bWJvbCBjb21wcmlzaW5nIHRoZSBvdXRlciBzdHJ1Y3R1cmUgbmFtZSBhbmQgdW5uYW1lZCB2YXJpYWJsZSBpbnN0YW5jZSBuYW1lLgoKMjAxNC0wNS0xNToga3d3ZXR0ZQoJICAgIEFkZCAjMTY2IC0gJ21ha2UgY2hlY2snIG5vdyB3b3JrcyBvdXQgb2Ygc291cmNlLiBUaGlzIHJlcXVpcmVkIHRoZSBleGFtcGxlcyB0byBidWlsZAogICAgICAgICAgICBvdXQgb2Ygc291cmNlLiBUaGUgbWFpbiBsYW5ndWFnZXMgaGF2ZSBiZWVuIHRlc3RlZCAtIEMjLCBHbywgR3VpbGUsIEphdmEsIEphdmFzY3JpcHQsCiAgICAgICAgICAgIEx1YSwgT2N0YXZlLCBQZXJsLCBQSFAsIFB5dGhvbiwgUnVieSBhbmQgVGNsLgoKMjAxNC0wNS0wMTogT2xpdmVyIEJ1Y2h0YWxhCgkgICAgSmF2YXNjcmlwdCBzdXBwb3J0IGFkZGVkLCBzZWUgSmF2YXNjcmlwdCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uLgoKMjAxNC0wNS0wMTogb2xseQoJICAgIFtQSFBdIFRoZSBnZW5lcmF0ZWQgX19pc3NldCgpIG1ldGhvZCBub3cgcmV0dXJucyB0cnVlIGZvciByZWFkLW9ubHkgcHJvcGVydGllcy4KCjIwMTQtMDQtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgW0dvXSBGaXggZ28gLi9jb25maWd1cmUgcGFyc2luZyBvZiBnY2NnbyAtLXZlcnNpb24sIGFuZAogICAgICAgICAgICBnb3J1bnRpbWUuc3dnIHR5cG8gaW4gX19HTlVDX1BBVENITEVWRUxfXyAoU0YgQnVnICMxMjk4KQoKMjAxNC0wNC0yNDoga3d3ZXR0ZQogICAgICAgICAgICBGaXgge3B5dGhvbnxwZXJsNXxydWJ5fHRjbH0vamF2YSBleGFtcGxlcwoKICAgICAgICAgICAgSW4gTGliL2djai9jbmkuaSwgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBuZXdlciBnY2ogdmVyc2lvbnM6CgogICAgICAgICAgICAtIHJlbW92ZSBKdkFsbG9jT2JqZWN0KCkgd2hpY2ggZ2NqIG5vIGxvbmdlciBkZWZpbmVzLCBmcm9tIGdjaiBDaGFuZ2Vsb2c6CiAgICAgICAgICAgICAgMjAwNC0wNC0xNiAgQnJ5Y2UgTWNLaW5sYXkgIDxtY2tpbmxheUByZWRoYXQuY29tPgogICAgICAgICAgICAgICAgKiBnY2ovY25pLmggKEp2QWxsb2NPYmplY3QpOiBSZW1vdmUgdGhlc2Ugb2Jzb2xldGUsCiAgICAgICAgICAgICAgICB1bmRvY3VtZW50ZWQgQ05JIGNhbGxzLgoKICAgICAgICAgICAgLSBjaGFuZ2UgSnZDcmVhdGVKYXZhVk0oKSBhcmd1bWVudCBmcm9tIHZvaWQqIHRvIEp2Vk1Jbml0QXJncyosIGZyb20gZ2NqIENoYW5nZWxvZzoKICAgICAgICAgICAgICAyMDA1LTAyLTIzICBUaG9tYXMgRml0enNpbW1vbnMgIDxmaXR6c2ltQHJlZGhhdC5jb20+CiAgICAgICAgICAgICAgUFIgbGliZ2NqLzE2OTIzCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgKEp2Q3JlYXRlSmF2YVZNKTogRGVjbGFyZSB2bV9hcmdzIGFzIEp2Vk1Jbml0QXJncyogcmF0aGVyIHRoYW4gdm9pZCouCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTA0LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiBCdWcgIzEzNjYgLSBSZW1vdmUgZHVwbGljYXRlIGRlY2xhcmF0aW9ucyBvZiBzdHJ0b2ltYXggYW5kIHN0cnRvdW1heCBpbiBpbnR0eXBlcy5pCgoyMDE0LTA0LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRW51bXMgd2hpY2ggaGF2ZSBiZWVuIGlnbm9yZWQgdmlhICVpZ25vcmUgYW5kIGFyZSBzdWJzZXF1ZW50bHkKICAgICAgICAgICAgdXNlZCBhcmUgaGFuZGxlZCBzbGlnaHRseSBkaWZmZXJlbnRseS4gVHlwZSB3cmFwcGVyIGNsYXNzZXMgYXJlIG5vdyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hpY2ggYXJlIGVmZmVjdGl2ZWx5IGEgd3JhcHBlciBvZiBhbiBlbXB0eSBlbnVtLiBQcmV2aW91c2x5IGluIEphdmEgdW5jb21waWxhYmxlCiAgICAgICAgICAgIGNvZGUgd2FzIGdlbmVyYXRlZCBhbmQgaW4gQyMgYW4gaW50IHdhcyB1c2VkLgoKMjAxNC0wNC0wNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHJlZ3Jlc3Npb24gaW4gMy4wLjAgd2hlcmUgbGVnYWwgY29kZSBmb2xsb3dpbmcgYW4gb3BlcmF0b3I8PCBkZWZpbml0aW9uIG1pZ2h0CiAgICAgICAgICAgIGdpdmUgYSBzeW50YXggZXJyb3IuIFNGIEJ1ZyAjMTM2NS4KCjIwMTQtMDQtMDM6IG9sbHkKCSAgICBbUEhQXSBGaXggd3JhcHBpbmcgZGlyZWN0b3IgY29uc3RydWN0b3JzIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzCgkgICAgd2l0aCBhIFpUUy1lbmFibGVkIGJ1aWxkIG9mIFBIUC4KCjIwMTQtMDQtMDI6IG9sbHkKCSAgICBbUEhQXSBQYXNzIHRoZSBaVFMgY29udGV4dCB3ZSBhbHJlYWR5IGhhdmUgdG8gYXZvaWQgbmVlZGluZyB0bwoJICAgIGNhbGwgVFNSTUxTX0ZFVENILCB3aGljaCBpcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZS4KCjIwMTQtMDQtMDI6IG9sbHkKCSAgICBbUEhQXSBQYXNzIFpUUyBjb250ZXh0IHRocm91Z2ggdG8gdF9vdXRwdXRfaGVscGVyKCkgc28gaXQgd29ya3MKCSAgICB3aXRoIGEgWlRTLWVuYWJsZWQgYnVpbGQgb2YgUEhQLiAgUmVwb3J0ZWQgYnkgUGllcnJlIExhYmFzdGllIGluCgkgICAgZ2l0aHViIFBSIzE1NS4KCjIwMTQtMDMtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjIEQgR29dIEZpeGVzIGZvciBDIGVudW1zIHVzZWQgaW4gYW4gQVBJIGFuZCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bQogICAgICAgICAgICBoYXMgbm90IGJlZW4gcGFyc2VkLiBGb3IgRCwgdGhpcyBmaXhlcyBhIHNlZ2ZhdWx0IGluIFNXSUcuIFRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgbm93IHByb2R1Y2UgY29kZSB0aGF0IGNvbXBpbGVzLCBhbHRob3VnaCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgZW51bSBpcyBuZWVkZWQKICAgICAgICAgICAgaW4gb3JkZXIgdG8gdXNlIHRoZSBlbnVtIHByb3Blcmx5IGZyb20gdGhlIHRhcmdldCBsYW5ndWFnZS4KCjIwMTQtMDMtMjM6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBGaXggZm9yIHVzYWdlIG9mIHNucHJpbnRmIGluIEx1YSBydW50aW1lIHdoaWNoIFZpc3VhbCBTdHVkaW8gZG9lcyBub3QgaGF2ZS4KClZlcnNpb24gMy4wLjAgKDE2IE1hciAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKzExIHN1cHBvcnQgaW5pdGlhbGx5IGRldmVsb3BlZCBhcyBDKysweCBzdXBwb3J0IGJ5IE1hdGV2eiBKZWtvdmVjIGFzIGEgR29vZ2xlIFN1bW1lciBvZiBDb2RlCiAgICAgICAgICAgIHByb2plY3QgaGFzIGJlZW4gZnVydGhlciBleHRlbmRlZC4gVGhlIEMrKzExIHN1cHBvcnQgaXMgY29tcHJlaGVuc2l2ZSwgYnV0IGJ5IG5vIG1lYW5zIGNvbXBsZXRlCiAgICAgICAgICAgIG9yIHdpdGhvdXQgbGltaXRhdGlvbnMuIEZ1bGwgZGV0YWlscyBmb3IgZWFjaCBuZXcgZmVhdHVyZSBpbiBDKysxMSBpcyBjb3ZlcmVkIGluIHRoZQogICAgICAgICAgICBDUGx1c1BsdXMxMS5odG1sIGNoYXB0ZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gd2hpY2ggaXMgaW5jbHVkZWQgaW4gU1dJRyBhbmQgYWxzbyBhdmFpbGFibGUKICAgICAgICAgICAgb25saW5lIGF0IGh0dHA6Ly93d3cuc3dpZy5vcmcvRG9jMy4wL0NQbHVzUGx1czExLmh0bWwuCgoyMDE0LTAzLTE0OiB2LWZvci12YW5kYWwKICAgICAgICAgICAgW0x1YV0gTnVtZXJvdXMgTHVhIGltcHJvdmVtZW50czoKICAgICAgICAgICAgMS4gJW5zcGFjZSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkLiBOYW1lc3BhY2VzIGFyZSBtYXBwZWQgdG8gdGFibGVzIGluIHRoZSBtb2R1bGUsIHdpdGggdGhlIHNhbWUKICAgICAgICAgICAgICAgbmFtZSBhcyB0aGUgQysrIG5hbWVzcGFjZS4KICAgICAgICAgICAgMi4gSW5oZXJpdGFuY2UgaXMgbm93IGhhbmRsZWQgZGlmZmVyZW50bHkuIEVhY2ggY2xhc3MgbWV0YXRhYmxlIGtlZXBzIGEgbGlzdCBvZiBjbGFzcyBiYXNlcyBpbnN0ZWFkCiAgICAgICAgICAgICAgIG9mIG1lcmdpbmcgYWxsIG1lbWJlcnMgb2YgYWxsIGJhc2VzIGludG8gdGhlIGRlcml2ZWQgY2xhc3MuCiAgICAgICAgICAgIDMuIFRoZSBuZXcgbWV0YXRhYmxlcyByZXN1bHQgaW4gZGlmZmVyZW5jZXMgaW4gYWNjZXNzaW5nIGNsYXNzIG1lbWJlcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIGV4YW1wbGUKICAgICAgICAgICAgICAgICBzdHJ1Y3QgVGVzdCB7CiAgICAgICAgICAgICAgICAgICAgIGVudW0geyBURVNUMSA9IDEwLCBURVNUMiA9IDIwIH07CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgSUNPTlNUID0gMTI7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgTm93IHRoaXMgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdC5URVNUMSkKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdC5JQ09OU1QpCiAgICAgICAgICAgICAgICAgVGhlIG9sZCB3YXkgd2FzOgogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0X1RFU1QxKQogICAgICAgICAgICAgICAgICAgcHJpbnQoZXhhbXBsZS5UZXN0X0lDT05TVCkKCiAgICAgICAgICAgIDQuIFRoZSBzcGVjaWFsIGNsYXNzIG1ldGF0YWJsZSBtZW1iZXIgIi5jb25zdHJ1Y3RvciIgd2FzIHJlbW92ZWQuIE5vdyBTV0lHIGdlbmVyYXRlcyB0aGUgcHJveHkKICAgICAgICAgICAgICAgZnVuY3Rpb24gYnkgaXRzZWxmIGFuZCBhc3NpZ25zIGl0IGRpcmVjdGx5IHRvIHRoZSBjbGFzcyB0YWJsZSAiX19jYWxsIiBtZXRob2QuCiAgICAgICAgICAgIDUuIGVMdWEgc2hvdWxkIGFsc28gbm93IHN1cHBvcnQgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIDYuICdjb25zdCcgc3VidGFibGUgaW4gZUx1YSBpcyBjb25zaWRlcmVkIGRlcHJlY2F0ZWQuCgogICAgICAgICAgICBDaGFuZ2VzIGluIGJlaGF2aW91cjoKICAgICAgICAgICAgYS4gWW91IGNhbiBubyBsb25nZXIgYXNzaWduIHRvIG5vbi1leGlzdGluZyBjbGFzcyBtZW1iZXJzIGluIGNsYXNzZXMgd2l0aG91dCBhIF9fc2V0aXRlbV9fIG1ldGhvZC4KICAgICAgICAgICAgICAgSXQgd2lsbCBjYXVzZSBhIEx1YSBlcnJvci4KICAgICAgICAgICAgYi4gWW91IGNhbiBubyBsb25nZXIgaXRlcmF0ZSBvdmVyIGEgbW9kdWxlIHRhYmxlIGFuZCBjb3B5IGV2ZXJ5dGhpbmcgaW50byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KICAgICAgICAgICAgICAgQWN0dWFsbHksIHRoaXMgd2FzIG5ldmVyIHRoZSBjYXNlLCBidXQgaXQgaXMgbm93IGV4cGxpY2l0bHkgcHJvaGliaXRlZC4KICAgICAgICAgICAgYy4gTm93IGNoYW5naW5nIGEgYmFzZSBjbGFzcyB3aWxsIGltbWVkaWF0ZWx5IGFmZmVjdCBhbGwgZGVyaXZlZCBjbGFzc2VzLgogICAgICAgICAgICBkLiBUaGVyZSBtaWdodCBiZSBzb21lIGlzc3VlcyB3aXRoIGluaGVyaXRhbmNlLiBBbHRob3VnaCB0aGUgYmFzZXMgaXRlcmF0aW9uIHNjaGVtZSBpcyB0aGUgc2FtZQogICAgICAgICAgICAgICBhcyB3YXMgdXNlZCBmb3IgbWVyZ2luZyBiYXNlIGNsYXNzZXMgaW50byBkZXJpdmVkIG9uZSwgc29tZSB1bmtub3duIGlzc3VlcyBtYXkgYXJpc2UuCgogICAgICAgICAgICBUaGUgb2xkIG1ldGF0YWJsZSBiZWhhdmlvdXIgY2FuIGJlIHJlc3RvcmVkIGJ5IHVzaW5nIHRoZSAtbm8tb2xkLW1ldGF0YWJsZS1iaW5kaW5ncyBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBDaGFuZ2UgaW4gZGVmYXVsdCBiZWhhdmlvdXIgd3JhcHBpbmcgQysrIGJvb2wuIE9ubHkgYSBQeXRob24gVHJ1ZSBvciBGYWxzZQogICAgICAgICAgICB3aWxsIG5vdyB3b3JrIGZvciBDKysgYm9vbCBwYXJhbWV0ZXJzLiBUaGlzIGZpeGVzIG92ZXJsb2FkaW5nIGJvb2wgd2l0aCBvdGhlciB0eXBlcy4KICAgICAgICAgICAgUHl0aG9uIDIuMyBtaW5pbXVtIGlzIG5vdyByZXF1aXJlZCBmb3Igd3JhcHBpbmcgYm9vbC4KCiAgICAgICAgICAgIFdoZW4gd3JhcHBpbmc6CgogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG92ZXJsb2FkZWQoYm9vbCB2YWx1ZSkgeyByZXR1cm4gImJvb2wiOyB9CiAgICAgICAgICAgICAgY29uc3QgY2hhciogb3ZlcmxvYWRlZChpbnQgdmFsdWUpIHsgcmV0dXJuICJpbnQiOyB9CgogICAgICAgICAgICBQcmV2aW91cyBiZWhhdmlvdXI6CiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoRmFsc2UpCiAgICAgICAgICAgICAgJ2ludCcKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZChUcnVlKQogICAgICAgICAgICAgICdpbnQnCiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoMCkKICAgICAgICAgICAgICAnaW50JwoKICAgICAgICAgICAgTm93IHdlIGdldCB0aGUgZXhwZWN0ZWQgYmVoYXZpb3VyOgogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKEZhbHNlKQogICAgICAgICAgICAgICdib29sJwogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKDApCiAgICAgICAgICAgICAgJ2ludCcKCiAgICAgICAgICAgIFRoZSBjb25zZXF1ZW5jZSBpcyB3aGVuIHdyYXBwaW5nIGJvb2wgaW4gbm9uLW92ZXJsb2FkZWQgZnVuY3Rpb25zOgoKICAgICAgICAgICAgICBjb25zdCBjaGFyKiBib29sZnVuY3Rpb24oYm9vbCB2YWx1ZSkgeyByZXR1cm4gdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiOyB9CgogICAgICAgICAgICBUaGUgcHJldmlvdXMgYmVoYXZpb3VyIHdhcyB2ZXJ5IFB5dGhvbmljOgogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oIiIpCiAgICAgICAgICAgICAgJ2ZhbHNlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oImhpIikKICAgICAgICAgICAgICAndHJ1ZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDEyLjM0KQogICAgICAgICAgICAgICd0cnVlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMCkKICAgICAgICAgICAgICAnZmFsc2UnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigxKQogICAgICAgICAgICAgICd0cnVlJwoKICAgICAgICAgICAgTm93IHRoZSBuZXcgYmVoYXZpb3VyIG1vcmUgYWxvbmcgdGhlIGxpbmVzIG9mIEMrKyBkdWUgdG8gc3RyaWN0ZXIgdHlwZSBjaGVja2luZy4gVGhlCiAgICAgICAgICAgIGFib3ZlIGNhbGxzIHJlc3VsdCBpbiBhbiBleGNlcHRpb24gYW5kIG5lZWQgdG8gYmUgZXhwbGljaXRseSBjb252ZXJ0ZWQgaW50byBhIGJvb2wgYXMKICAgICAgICAgICAgZm9sbG93czoKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDApCiAgICAgICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgICAgICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPG1vZHVsZT4KICAgICAgICAgICAgICBUeXBlRXJyb3I6IGluIG1ldGhvZCAnYm9vbGZ1bmN0aW9uJywgYXJndW1lbnQgMSBvZiB0eXBlICdib29sJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oYm9vbCgwKSkKICAgICAgICAgICAgICAnZmFsc2UnCgogICAgICAgICAgICBUaGUgb2xkIGJlaGF2aW91ciBjYW4gYmUgcmVzdXJyZWN0ZWQgYnkgcGFzc2luZyB0aGUgLURTV0lHX1BZVEhPTl9MRUdBQ1lfQk9PTCBjb21tYW5kIGxpbmUKICAgICAgICAgICAgcGFyYW1ldGVyIHdoZW4gZXhlY3V0aW5nIFNXSUcuIFR5cGVtYXBzIGNhbiBvZiBjb3Vyc2UgYmUgd3JpdHRlbiB0byBjdXN0b21pc2UgdGhlIGJlaGF2aW91cgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgcGFyYW1ldGVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDMtMDY6IHdzZnVsdG9uCgkgICAgRml4IFNGIEJ1ZyAjMTM2MyAtIFByb2JsZW0gd2l0aCBtZXRob2Qgb3ZlcmxvYWRpbmcgd2hlbiBzb21lIG1ldGhvZHMgYXJlIGFkZGVkIGJ5ICVleHRlbmQKICAgICAgICAgICAgYW5kIG90aGVycyBhcmUgcmVhbCBtZXRob2RzIGFuZCB1c2luZyB0ZW1wbGF0ZSBkZWZhdWx0IHBhcmFtZXRlcnMgd2l0aCBzbWFydCBwb2ludGVycy4KICAgICAgICAgICAgVGhpcyBpcyBub3RpY2VhYmxlIGFzIGEgcmVncmVzc2lvbiBzaW5jZSAyLjAuMTIgd2hlbiB1c2luZyB0aGUgZGVmYXVsdCBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIGhhbmRsaW5nIGZvciBzb21lIGxhbmd1YWdlcyB3aGVuIHRoZSBzbWFydCBwb2ludGVyIHdyYXBzIHN0ZDo6bWFwIGFuZCBvdGhlciBTVEwgY29udGFpbmVycy4KCjIwMTQtMDMtMDI6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gU0YgUGF0Y2ggIzM0NiBmcm9tIEplbnMgS3J1ZWdlci4gQ29ycmVjdCBleGNlcHRpb24gdGhyb3duIGF0dGVtcHRpbmcgdG8KICAgICAgICAgICAgYWNjZXNzIGEgbm9uLWV4aXN0ZW50IEMvQysrIGdsb2JhbCB2YXJpYWJsZSBvbiB0aGUgJ2N2YXInIG9iamVjdC4gVGhlIGV4Y2VwdGlvbiB0aHJvd24KICAgICAgICAgICAgdXNlZCB0byBiZSBhIE5hbWVFcnJvci4gSG93ZXZlciwgYXMgdGhpcyBhY2Nlc3MgaXMgdmlhIGEgcHJpbWFyeSwgYW4gQXR0cmlidXRlRXJyb3IKICAgICAgICAgICAgaXMgbW9yZSBjb3JyZWN0IGFuZCBzbyB0aGUgZXhjZXB0aW9uIHRocm93biBub3cgaXMgYW4gQXR0cmlidXRlRXJyb3IuIFJlZmVyZW5jZToKICAgICAgICAgICAgaHR0cDovL2RvY3MucHl0aG9uLm9yZy8yL3JlZmVyZW5jZS9leHByZXNzaW9ucy5odG1sI2F0dHJpYnV0ZS1yZWZlcmVuY2VzCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAzLTAxOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFBhdGNoICMxNDMgRml4IHR5cGUgc2hvd24gd2hlbiB1c2luZyB0eXBlKCkgdG8gaW5jbHVkZSB0aGUgbW9kdWxlIGFuZCBwYWNrYWdlCiAgICAgICAgICAgIG5hbWUgd2hlbiB1c2luZyAtYnVpbHRpbi4KCjIwMTQtMDMtMDE6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gU0YgcGF0Y2ggIzM0NyBGaXggbWlzc2luZyBhcmd1bWVudCBjb3VudCBjaGVja2luZyB3aXRoIC1tb2Rlcm4uCiAgICAgICAgICAgIEZpeGVzIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCB3aGVuIGJ1aWx0aW4gY2hhbmdlcyB3ZXJlIGludHJvZHVjZWQgaW4gU1dJRy0yLjAuMy4KCjIwMTQtMDItMjE6IHdzZnVsdG9uCgkgICAgW1BIUF0gRml4IHdhcm5pbmcgc3VwcHJlc3Npb24gdXNpbmcgJXdhcm5maWx0ZXIgZm9yIFBIUCByZXNlcnZlZCBjbGFzcyBuYW1lcy4KCjIwMTQtMDItMTk6IG9sbHkKCSAgICBbTHVhXSBBZGQga2V5d29yZCB3YXJuaW5ncyBmb3IgTHVhIGtleXdvcmRzIGFuZCBCYXNpYyBGdW5jdGlvbnMuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgLVdhbGxrdyBub3cgaW5jbHVkZXMga2V5d29yZHMgZm9yIGFsbCBsYW5ndWFnZXMgd2l0aCBrZXl3b3JkCgkgICAgd2FybmluZ3MgKHByZXZpb3VzbHkgR28gYW5kIFIgd2VyZSBtaXNzaW5nKS4KCjIwMTQtMDItMTk6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgdGhlIGxpc3RzIG9mIFBIUCBrZXl3b3JkcyB3aXRoIG5ldyBvbmVzIGZyb20gUEhQIDUuNAoJICAgIGFuZCBuZXdlciAoYW5kIHNvbWUgbWlzc2luZyBvbmVzIGZyb20gNS4zKS4gIFJlc2VydmVkIFBIUCBjb25zdGFudHMKCSAgICBuYW1lcyBhcmUgbm93IGNoZWNrZWQgYWdhaW5zdCBlbnVtIHZhbHVlcyBhbmQgY29uc3RhbnRzLCBpbnN0ZWFkCgkgICAgb2YgYWdhaW5zdCBmdW5jdGlvbiBhbmQgbWV0aG9kIG5hbWVzLiAgQnVpbHQtaW4gUEhQIGZ1bmN0aW9uIG5hbWVzCgkgICAgbm8gbG9uZ2VyIG1hdGNoIG1ldGhvZHMgYWRkZWQgYnkgJWV4dGVuZC4gIEZ1bmN0aW9ucyBhbmQgbWV0aG9kcwoJICAgIG5hbWVkICdfX3NsZWVwJywgJ19fd2FrZXVwJywgJ25vdCcsICdwYXJlbnQnLCBvciAndmlydHVhbCcgYXJlIG5vCgkgICAgbG9uZ2VyIG5lZWRsZXNzbHkgcmVuYW1lZC4KCjIwMTQtMDItMTU6IHdzZnVsdG9uCgkgICAgRml4IHRoZSAlJGlzbWVtYmVyICVyZW5hbWUgcHJlZGljYXRlcyB0byBhbHNvIGFwcGx5IHRvIG1lbWJlcnMgYWRkZWQgdmlhICVleHRlbmQuCgogICAgICAgICAgICBBZGQgJSRpc2V4dGVuZG1lbWJlciBmb3IgJXJlbmFtZSBvZiBtZW1iZXJzIGFkZGVkIHZpYSAlZXh0ZW5kLiBUaGlzIGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICAgIGRpc3Rpbmd1aXNoIGJldHdlZW4gbm9ybWFsIGNsYXNzL3N0cnVjdCBtZW1iZXJzIGFuZCAlZXh0ZW5kIG1lbWJlcnMuIEZvciBleGFtcGxlCiAgICAgICAgICAgICclJGlzbWVtYmVyLCAlJG5vdCAlJGlzZXh0ZW5kbWVtYmVyJyB3aWxsIG5vdyBpZGVudGlmeSBqdXN0IGNsYXNzL3N0cnVjdCBtZW1iZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMi0xNjogaGZhbGNpYwogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMTM3IC0gZml4IGNyYXNoZXMvZXhjZXB0aW9ucyBpbiBleGNlcHRpb24gaGFuZGxpbmcgaW4gUHl0aG9uIDMuMwoKMjAxNC0wMi0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCBzdXBwb3J0IGZvciB0aGUgY2RhdGEgbGlicmFyeS4KCjIwMTQtMDItMDg6IHZrYWxpbmluCiAgICAgICAgICAgIE5lc3RlZCBjbGFzcyBzdXBwb3J0IGFkZGVkLiBUaGlzIHByaW1hcmlseSBhbGxvd3MgU1dJRyB0byBwcm9wZXJseSBwYXJzZSBuZXN0ZWQKICAgICAgICAgICAgY2xhc3NlcyBhbmQga2VlcCB0aGUgbmVzdGVkIGNsYXNzIGluZm9ybWF0aW9uIGluIHRoZSBwYXJzZSB0cmVlLiBKYXZhIGFuZCBDIwogICAgICAgICAgICBoYXZlIHV0aWxpc2VkIHRoaXMgaW5mb3JtYXRpb24gd3JhcHBpbmcgdGhlIEMrKyBuZXN0ZWQgY2xhc3NlcyBhcyBKYXZhL0MjCiAgICAgICAgICAgIG5lc3RlZCBjbGFzc2VzLiBUaGUgcmVtYWluaW5nIHRhcmdldCBsYW5ndWFnZXMgaWdub3JlIG5lc3RlZCBjbGFzc2VzIGFzIGluCiAgICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zLiBIZWxwIGlzIG5lZWRlZCBieSB1c2VycyBvZiB0aGVzZSByZW1haW5pbmcgbGFuZ3VhZ2VzIHRvCiAgICAgICAgICAgIGRlc2lnbiBob3cgQysrIG5lc3RlZCBjbGFzc2VzIGNhbiBiZSBiZXN0IHdyYXBwZWQuIFBsZWFzZSB0YWxrIHRvIHVzIG9uIHRoZQogICAgICAgICAgICBzd2lnLWRldmVsIG1haWxpbmcgbGlzdCBpZiB5b3UgdGhpbmsgeW91IGNhbiBoZWxwLgoKICAgICAgICAgICAgUHJldmlvdXNseSwgdGhlcmUgd2FzIGxpbWl0ZWQgbmVzdGVkIGNsYXNzIHN1cHBvcnQuIE5lc3RlZCBjbGFzc2VzIHdlcmUgdHJlYXRlZAogICAgICAgICAgICBhcyBvcGFxdWUgcG9pbnRlcnMuIEhvd2V2ZXIsIHRoZSAibmVzdGVkd29ya2Fyb3VuZCIgZmVhdHVyZSBwcm92aWRlZCBhIHdheSB0bwogICAgICAgICAgICB3cmFwIGEgbmVzdGVkIGNsYXNzIGFzIGlmIGl0IHdhcyBhIGdsb2JhbCBjbGFzcy4gVGhpcyBmZWF0dXJlIG5vIGxvbmdlciBleGlzdHMKICAgICAgICAgICAgYW5kIGlzIHJlcGxhY2VkIGJ5IHRoZSBuZXcgImZsYXRuZXN0ZWQiIGZlYXR1cmUuIFRoaXMgZWZmZWN0aXZlbHkgZG9lcyB0aGUgc2FtZQogICAgICAgICAgICB0aGluZyB3aXRoIGxlc3MgbWFudWFsIGNvZGUgdG8gYmUgd3JpdHRlbi4gUGxlYXNlIHNlZSB0aGUgJ05lc3RlZCBjbGFzc2VzJwogICAgICAgICAgICBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uIGluIFNXSUdQbHVzLmh0bWwgaWYgeW91IHdlcmUgcHJldmlvdXNseSB1c2luZyB0aGlzCiAgICAgICAgICAgIGZlYXR1cmUuCgogICAgICAgICAgICBTV0lHIG5vdyBwYXJzZXMgdGhlIGNvbnRlbnRzIG9mIG5lc3RlZCBjbGFzc2VzIHdoZXJlIHByZXZpb3VzbHkgaXQgZGlkIG5vdC4gWW91CiAgICAgICAgICAgIG1heSBmaW5kIHRoYXQgeW91IHdpbGwgbmVlZCB0byBtYWtlIGFkanVzdG1lbnRzIHRvIHlvdXIgaW50ZXJmYWNlIGZpbGUgYXMKICAgICAgICAgICAgZWZmZWN0aXZlbHkgZXh0cmEgY29kZSBpcyBiZWluZyB3cmFwcGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMi0wNjogZ2phbnNzZW5zCiAgICAgICAgICAgIFtHdWlsZV0gUGF0Y2ggIzEzMy4gTWFrZSBzY20gdG8gc3RyaW5nIGNvbnZlcnNpb24gd29yayB3aXRoIG5vbi1hc2NpaSBzdHJpbmdzLgogICAgICAgICAgICBHdWlsZSAyIGhhcyBhIGNvbXBsZXRlbHkgcmV3cml0dGVuIHN0cmluZyBpbXBsZW1lbnRhdGlvbi4gU1dJRyBtYWRlIHNvbWUgYXNzdW1wdGlvbnMKICAgICAgICAgICAgdGhhdCBhcmUgbm8gbG9uZ2VyIHZhbGlkIGFzIHRvIHRoZSBpbnRlcm5hbHMgb2YgZ3VpbGUncyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCgoyMDE0LTAxLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBuZXcgc3dpZ3R5cGVfaW5vdXQuaSBsaWJyYXJ5IGNvbnRhaW5pbmcgU1dJR1RZUEUgKiYgT1VUUFVUIHR5cGVtYXBzLgoKICAgICAgICAgICAgRXhhbXBsZSB1c2FnZSB3cmFwcGluZzoKCiAgICAgICAgICAgICAgdm9pZCBmKFhYWCAqJiB4KSB7IHggPSBuZXcgWFhYKDExMSk7IH0KCiAgICAgICAgICAgIHdvdWxkIGJlOgoKICAgICAgICAgICAgICBYWFggeCA9IG51bGw7CiAgICAgICAgICAgICAgZihvdXQgeCk7CiAgICAgICAgICAgICAgLy8gdXNlIHgKICAgICAgICAgICAgICB4LkRpc3Bvc2UoKTsgLy8gbWFudWFsbHkgY2xlYXIgbWVtb3J5IG9yIG90aGVyd2lzZSBsZWF2ZSBvdXQgYW5kIGxlYXZlIGl0IHRvIHRoZSBnYXJiYWdlIGNvbGxlY3RvcgoKMjAxNC0wMS0yMTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAlZ29faW1wb3J0IGRpcmVjdGl2ZS4KCjIwMTQtMDEtMjE6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgc3VwcG9ydCBmb3IgR28gMS4zLCBub3QgeWV0IHJlbGVhc2VkLgoKMjAxNC0wMS0yMDogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3IgZXhjZXB0aW9ucyAoU3dpZzo6RGlyZWN0b3JFeGNlcHRpb24pIG5vdyBkZXJpdmUgZnJvbSBzdGQ6OmV4Y2VwdGlvbgogICAgICAgICAgICBhbmQgaGVuY2UgcHJvdmlkZSB0aGUgd2hhdCgpIG1ldGhvZC4gSW4gUHl0aG9uIGFuZCBSdWJ5LCB0aGlzIHJlcGxhY2VzIHRoZSBub3cKICAgICAgICAgICAgZGVwcmVjYXRlZCBEaXJlY3RvckV4Y2VwdGlvbjo6Z2V0TWVzc2FnZSgpIG1ldGhvZC4KCjIwMTQtMDEtMTQ6IGRpb3JjZXR5CiAgICAgICAgICAgIFBhdGNoICMxMTIgLSBGaXggc3ltYm9sIHJlc29sdXRpb24gaW52b2x2aW5nIHNjb3BlcyB0aGF0IGhhdmUgbXVsdGlwbGUgbGV2ZWxzCiAgICAgICAgICAgIG9mIHR5cGVkZWZzIC0gZml4ZXMgc29tZSB0ZW1wbGF0ZSByZXNvbHV0aW9ucyBhcyB3ZWxsIGFzIHNvbWUgdHlwZW1hcCBzZWFyY2hlcy4KCjIwMTQtMDEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBhbmQgZG9jdW1lbnQgdGhlIG5hdHVyYWx2YXIgZmVhdHVyZSBvdmVycmlkZSBiZWhhdmlvdXIgLSB0aGUgbmF0dXJhbHZhcgogICAgICAgICAgICBmZWF0dXJlIGF0dGFjaGVkIHRvIGEgdmFyaWFibGUgbmFtZSBoYXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBuYXR1cmFsdmFyCiAgICAgICAgICAgIGZlYXR1cmUgYXR0YWNoZWQgdG8gdGhlIHZhcmlhYmxlJ3MgdHlwZS4gVGhlIG92ZXJyaWRpbmcgd2FzIG5vdCB3b3JraW5nCiAgICAgICAgICAgIHdoZW4gdHVybmluZyB0aGUgZmVhdHVyZSBvZmYgb24gdGhlIHZhcmlhYmxlJ3MgbmFtZS4KCiAgICAgICAgICAgIEZpeCBzbyB0aGF0IGFueSB1c2Ugb2YgdGhlIG5hdHVyYWx2YXIgZmVhdHVyZSB3aWxsIG92ZXJyaWRlIHRoZSBnbG9iYWwKICAgICAgICAgICAgc2V0dGluZy4gUHJldmlvdXNseSB3aGVuIHNldCBnbG9iYWxseSBieSAtbmF0dXJhbHZhciBvciAlbW9kdWxlKG5hdHVyYWx2YXI9MSksCiAgICAgICAgICAgIHVzZSBvZiB0aGUgbmF0dXJhbHZhciBmZWF0dXJlIHdhcyBub3QgYWx3YXlzIGhvbm91cmVkLgoKMjAxNC0wMS0wNjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeCBidWcgdGhhdCBicm9rZSB1c2luZyBkaXJlY3RvcnMgZnJvbSBhIHRocmVhZCBub3QKCSAgICBjcmVhdGVkIGJ5IEdvLgoKMjAxMy0xMi0yNDogcHRvbXVsaWsKICAgICAgICAgICAgW1B5dGhvbl0gU0YgQnVnICMxMjk3CgogICAgICAgICAgICBSZXNvbHZlIHNldmVyYWwgaXNzdWVzIHJlbGF0ZWQgdG8gcHl0aG9uIGltcG9ydHMuCiAgICAgICAgICAgIEZvciBleGFtcGxlLCBpdCdzIG5vdyBwb3NzaWJsZSB0byBpbXBvcnQgbW9kdWxlcyBoYXZpbmcgdGhlIHNhbWUgbW9kdWxlCiAgICAgICAgICAgIG5hbWVzLCBidXQgYmVsb25naW5nIGluIGRpZmZlcmVudCBwYWNrYWdlcy4KICAgICAgICAgICAgCiAgICAgICAgICAgIEZyb20gdGhlIHVzZXIncyB2aWV3cG9pbnQsIHRoaXMgcGF0Y2ggZ2l2ZXMgYSBsaXR0bGUgYml0IG1vcmUgY29udHJvbCBvbgogICAgICAgICAgICBpbXBvcnQgc3RhdGVtZW50cyBnZW5lcmF0ZWQgYnkgU1dJRy4gVGhlIHVzZXIgbWF5IGNob29zZSB0byB1c2UgcmVsYXRpdmUKICAgICAgICAgICAgb3IgYWJzb2x1dGUgaW1wb3J0cy4KICAgICAgICAgICAgCiAgICAgICAgICAgIFNvbWUgZGV0YWlsczoKICAgICAgICAgICAgICAtIHdlIChzdGlsbCkgZ2VuZXJhdGUgaW1wb3J0IHN0YXRlbWVudHMgaW4gdGhlIGZvcm0gJ2ltcG9ydCBhLmIuYycgd2hpY2gKICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIGFic29sdXRlIGltcG9ydHMgaW4gcHl0aG9uMyBhbmQgKHRoZSBvbmx5IGF2YWlsYWJsZSkKICAgICAgICAgICAgICAgIGFtYmlndW91cyBvbmUgaW4gcHl0aG9uMi4KICAgICAgICAgICAgICAtIGFkZGVkIC1yZWxhdGl2ZWltcG9ydCBvcHRpb24gdG8gdXNlIGV4cGxpY2l0IHJlbGF0aXZlIGltcG9ydCBzeW50YXgKICAgICAgICAgICAgICAgIChweXRob24zKSwKCiAgICAgICAgICAgIFRoZSAiUHl0aG9uIFBhY2thZ2VzIiBzZWN0aW9uIGluIHRoZSBkb2N1bWVudGF0aW9uIGRpc2N1c3NlcyBob3cgdG8gd29yawogICAgICAgICAgICB3aXRoIGltcG9ydGluZyBwYWNrYWdlcyBpbmNsdWRpbmcgdGhlIG5ldyAtcmVsYXRpdmVpbXBvcnQgY29tbWFuZCBsaW5lIG9wdGlvbi4KCjIwMTMtMTItMjM6IHZhZHoKICAgICAgICAgICAgW09jdGF2ZSwgUGVybCwgUHl0aG9uLCBSLCBSdWJ5LCBUY2xdIENoYW5nZSB0aGUgbGVuZ3RoIG9mIHN0cmluZ3MgY3JlYXRlZCBmcm9tIGZpeGVkLXNpemUgY2hhcgogICAgICAgICAgICBidWZmZXJzIGluIEMgY29kZS4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBwb3RlbnRpYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnJlYWs6IGEgImNoYXIgYnVmWzVdIiBjb250YWluaW5nICJob1wwbGEiIHdhcwogICAgICAgICAgICByZXR1cm5lZCBhcyBhIHN0cmluZyBvZiBsZW5ndGggNSBiZWZvcmUsIGJ1dCBpcyByZXR1cm5lZCBhcyBhIHN0cmluZyBvZiBsZW5ndGggMiBub3cuIEFsc28sCiAgICAgICAgICAgIGl0IHdhcyBwb3NzaWJsZSB0byBhc3NpZ24gYSAobm9uLU5VTC10ZXJtaW5hdGVkKSBzdHJpbmcgImhlbGxvIiB0byBzdWNoIGEgYnVmZmVyIGJlZm9yZSBidXQKICAgICAgICAgICAgbm93IHRoaXMgZmFpbHMgYW5kIG9ubHkgImhlbG8iIGNhbiBmaXQuCgogICAgICAgICAgICBBcHBseSAiY2hhciBGSVhTSVpFW0FOWV0iIHR5cGVtYXBzIHRvIGV4cGxpY2l0bHkgY2hvb3NlIHRoZSBvbGQgYmVoYXZpb3VyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0xMi0yMzogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEFkZCBzdXBwb3J0IGZvciBkaXJlY3RvcnMuCgoyMDEzLTEyLTE4OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gRG9uJ3QgcmVxdWlyZSB0aGF0IEdvIGVudmlyb25tZW50IHZhcmlhYmxlcyBiZSBzZXQKCSAgICB3aGVuIHJ1bm5pbmcgZXhhbXBsZXMgb3IgdGVzdHN1aXRlIHdoZW4gdXNpbmcgR28gMSBvcgoJICAgIGxhdGVyLgoKMjAxMy0xMi0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIFJlbW92ZSAtbG9uZ3NpemUgb3B0aW9uIChmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKCSAgICBpZ25vcmUgaXQgaWYgc2VlbikuCgoyMDEzLTEyLTE3OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIC1nby1wa2dwYXRoIG9wdGlvbi4KCjIwMTMtMTItMTY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBVcGRhdGUgZm9yIEdvIDEuMiByZWxlYXNlLiAgQWRkIHN1cHBvcnQgZm9yIGxpbmtpbmcKCSAgICBTV0lHIGNvZGUgZGlyZWN0bHkgaW50byBleGVjdXRhYmxlLCByYXRoZXIgdGhhbiB1c2luZyBhCgkgICAgc2hhcmVkIGxpYnJhcnkuCgoyMDEzLTEyLTEzOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIFNXSUcgc291cmNlIGZpbGUgbmFtZSBhcyBjb21tZW50cyBpbiBnZW5lcmF0ZWQKCSAgICBmaWxlcy4gIFRoaXMgY2FuIGJlIHVzZWQgYnkgR28gZG9jdW1lbnRhdGlvbiB0b29scy4KCjIwMTMtMTItMTI6IGpsZXZlcXVlCgkgICAgW0x1YV0gRml4IHR5cG8gKHdjaGFyIGluc3RlYWQgb2Ygd2NoYXJfdCkgd2hpY2ggbWFkZSB3Y2hhci5pCgkgICAgZm9yIEx1YSB1c2VsZXNzLgoKMjAxMy0xMi0xMjogdm1pa2xvcwoJICAgIFtQSFBdIFBIUCdzIHBlY3VsaWFyIGNhbGwtdGltZSBwYXNzLWJ5LXJlZmVyZW5jZSBmZWF0dXJlIHdhcwoJICAgIGRlcHJlY2F0ZWQgaW4gUEhQIDUuMyBhbmQgcmVtb3ZlZCBpbiBQSFAgNS40LCBzbyB1cGRhdGUgdGhlIFJFRgoJICAgIHR5cGVtYXBzIGluIHBocHBvaW50ZXJzLmkgdG8gc3BlY2lmeSBwYXNzLWJ5LXJlZmVyZW5jZSBpbiB0aGUKCSAgICBmdW5jdGlvbiBkZWZpbml0aW9uLiAgRXhhbXBsZXMvcGhwL3BvaW50ZXIgaGFzIGJlZW4gdXBkYXRlZAoJICAgIGFjY29yZGluZ2x5LgoKMjAxMy0xMi0xMjogb2xseQoJICAgIFtQSFBdIFRoZSB1c2FnZSBvZiAkaW5wdXQgaW4gUEhQIGRpcmVjdG9yb3V0IHR5cGVtYXBzIGhhcyBiZWVuCgkgICAgY2hhbmdlZCB0byBiZSBjb25zaXN0ZW50IHdpdGggb3RoZXIgbGFuZ3VhZ2VzLiAgVGhlIHR5cGVtYXBzCgkgICAgcHJvdmlkZWQgYnkgU1dJRyBoYXZlIGJlZW4gdXBkYXRlZCBhY2NvcmRpbmdseSwgYnV0IGlmIHlvdQoJICAgIGhhdmUgd3JpdHRlbiB5b3VyIG93biBkaXJlY3Rvcm91dCB0eXBlbWFwcywgeW91J2xsIG5lZWQgdG8KCSAgICB1cGRhdGUgJGlucHV0IHRvICYkaW5wdXQgKG9yIG1ha2UgZXF1aXZhbGVudCBjaGFuZ2VzKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMTEtMjc6IHZhZHoKICAgICAgICAgICAgW0MjLCBKYXZhLCBQeXRob25dIEFkZCBzdGRfYXV0b19wdHIuaSBkZWZpbmluZyB0eXBlbWFwcyBmb3IgcmV0dXJuaW5nIHN0ZDo6YXV0b19wdHI8Pi4KCjIwMTMtMTEtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggIzc5IGZyb20gQnJhbnQgS3lzZXIKICAgICAgICAgICAgICAtIFJlbW92ZSB1c2luZyBkaXJlY3RpdmVzIGZyb20gdGhlIGdlbmVyYXRlZCBDIyBjb2RlIGFuZCBmdWxseSBxdWFsaWZ5IHRoZSB1c2Ugb2YgYWxsIC5ORVQKICAgICAgICAgICAgICAgIGZyYW1ld29yayB0eXBlcyBpbiBvcmRlciB0byBtaW5pbWl6ZSBwb3RlbnRpYWwgbmFtZSBjb2xsaXNpb25zIGZyb20gaW5wdXQgZmlsZXMgZGVmaW5pbmcKICAgICAgICAgICAgICAgIHR5cGVzLCBuYW1lc3BhY2UsIGV0YyB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgLk5FVCBmcmFtZXdvcmsgbWVtYmVycy4KICAgICAgICAgICAgICAtIEdsb2JhbGx5IHF1YWxpZnkgdGhlIHVzZSBvZiAuTkVUIGZyYW1ld29yayB0eXBlcyBpbiB0aGUgU3lzdGVtIG5hbWVzcGFjZQogICAgICAgICAgICAgIC0gUmVtb3ZlIC5ORVQgMS4xIHN1cHBvcnQsIC5ORVQgMiBpcyB0aGUgbWluaW11bSBmb3IgdGhlIEMjIG1vZHVsZQoKICAgICAgICAgICAgVGhpcyBpcyBhIHBvdGVudGlhbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBicmVhayBpZiBjb2RlIGhhcyBiZWVuIGFkZGVkIHJlbHlpbmcgb24gdGhlc2UgdXNpbmcKICAgICAgICAgICAgc3RhdGVtZW50cyB0aGF0IHVzZWQgdG8gYmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB1c2luZyBTeXN0ZW07CiAgICAgICAgICAgICAgdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwoKICAgICAgICAgICAgVGhlIHF1aWNrIGZpeCB0byBhZGQgdGhlc2UgYmFjayBpbiBpcyB0byBhZGQgdGhlIC1EU1dJRzJfQ1NIQVJQIGNvbW1hbmQgbGluZSBvcHRpb24gd2hlbgogICAgICAgICAgICBleGVjdXRpbmcgU1dJRy4gU2VlIENTaGFycC5odG1sIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mby4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMTEtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggc29tZSBjb3JuZXIgY2FzZXMgZm9yIHRoZSAkcGFja2FnZXBhdGgvJGphdmFjbGFzc25hbWUgc3BlY2lhbCB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCgoyMDEzLTExLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzkxIGZyb20gTWFydmluIEdyZWVuYmVyZyAtIEFkZCBkaXJlY3RvcjpleGNlcHQgZmVhdHVyZSBmb3IgaW1wcm92ZWQKICAgICAgICAgICAgZXhjZXB0aW9uIGhhbmRsaW5nIGluIGRpcmVjdG9yIG1ldGhvZHMgZm9yIEphdmEuCgoyMDEzLTEwLTE1OiB2YWR6CiAgICAgICAgICAgIEFsbG93IHVzaW5nIFxsLCBcTCwgXHUsIFxVIGFuZCBcRSBpbiB0aGUgc3Vic3RpdHV0aW9uIHBhcnQgb2YgJShyZWdleDovcGF0dGVybi9zdWJzdC8pCiAgICAgICAgICAgIGluc2lkZSAlcmVuYW1lIHRvIGNoYW5nZSB0aGUgY2FzZSBvZiB0aGUgdGV4dCBiZWluZyByZXBsYWNlZC4KCjIwMTMtMTAtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBBcHBseSAjOTYgLSBzdXBlcmNsYXNzIG5vdCBsaXNwaWZ5CgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBNZXJnZSBpbiBDKysxMSBzdXBwb3J0IGZyb20gdGhlIGdzb2MyMDA5LW1hdGV2eiBicmFuY2ggd2hlcmUgTWF0ZXZ6IEpla292ZWMgZmlyc3QKICAgICAgICAgICAgc3RhcnRlZCB0aGUgQysrMHggYWRkaXRpb25zLiBEb2N1bWVudGF0aW9uIG9mIHRoZSBDKysxMSBmZWF0dXJlcyBzdXBwb3J0ZWQgaXMgaW4gYQogICAgICAgICAgICBuZXcgQ2hhcHRlciBvZiB0aGUgZG9jdW1lbnRhdGlvbiwgIlNXSUcgYW5kIEMrKzExIiBpbiBEb2MvTWFudWFsL0NQbHVzUGx1czExLmh0bWwuCgoyMDEzLTEwLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJW5hdHVyYWx2YXIgbm90IGhhdmluZyBhbnkgYWZmZWN0IG9uIHRlbXBsYXRlZCBjbGFzc2VzIGluc3RhbnRpYXRlZCB3aXRoIGFuCiAgICAgICAgICAgIGVudW0gYXMgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciB0eXBlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IFZhZGltIFplaXRsaW4uCgoyMDEzLTA5LTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGEgbWVtb3J5IGxlYWsgZm9yIHRoZSBqYXZhIGNoYXIgKipTVFJJTkdfQVJSQVkgdHlwZW1hcHMuCgpWZXJzaW9uIDIuMC4xMiAoOSBGZWIgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTAxLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUEhQXSBGaXggY29tcGlsYXRpb24gZXJyb3IgaW4gWlRTIG1vZGUgKDY0IGJpdCB3aW5kb3dzKSBkdWUgdG8gaW5jb3JyZWN0IHBsYWNlbWVudAogICAgICAgICAgICBvZiBUU1JNTFNfRkVUQ0goKSBpbiBTV0lHX1BocF9HZXRNb2R1bGUoKSBhcyByZXBvcnRlZCBieSBNYXJrIERhd3Nvbi1CdXR0ZXJ3b3J0aC4KCjIwMTQtMDEtMTM6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gdXBkYXRlIHN1cHBvcnQgdG8gT2N0YXZlIHZlcnNpb24gMy44LjAKCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIG5vIGxvbmdlciBkZWZpbmVzIE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIsIGJ1dCAzLjguMQogICAgICAgICAgICAgIHdpbGwgZGVmaW5lIE9DVEFWRV97TUFKT1IsTUlOT1IsUEFUQ0h9X1ZFUlNJT04gaW5zdGVhZDogc2VlCiAgICAgICAgICAgICAgICBodHRwOi8vaGcuc2F2YW5uYWguZ251Lm9yZy9oZ3dlYi9vY3RhdmUvcmV2L2I2YjZlMGRjNzAwZQogICAgICAgICAgICAgIFNvIHdlIG5vdyB1c2UgYSBuZXcgbWFjcm8gU1dJR19PQ1RBVkVfUFJFUkVRKG1ham9yLG1pbm9yLHBhdGNoKSB0bwogICAgICAgICAgICAgIGVuYWJsZSBmZWF0dXJlcyByZXF1aXJpbmcgT2N0YXZlIHZlcnNpb24gbWFqb3IubWlub3IucGF0Y2ggb3IgbGF0ZXIuCgogICAgICAgICAgICAgIEZvciBPY3RhdmUgdmVyc2lvbnMgcHJpb3IgdG8gMy44LjEsIHdlIHJlY29uc3RydWN0IHZhbHVlcyBmb3IKICAgICAgICAgICAgICBPQ1RBVkVfe01BSk9SLE1JTk9SLFBBVENIfV9WRVJTSU9OIGJhc2VkIG9uIE9DVEFWRV9BUElfVkVSU0lPTl9OVU1CRVIsCiAgICAgICAgICAgICAgZXh0cmFjdGVkIGZyb20gT2N0YXZlJ3MgQ2hhbmdlTG9ncy4gQW4gYWRkaXRpb25hbCBoYWNrIGlzIG5lZWRlZCB0bwogICAgICAgICAgICAgIGRpc3Rpbmd1aXNoIGJldHdlZW4gT2N0YXZlIDw9IDMuMi54IGFuZCAzLjguMCwgbmVpdGhlciBvZiB3aGljaCBkZWZpbmUKICAgICAgICAgICAgICBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLgoKICAgICAgICAgICAgLSBPY3RhdmUgMy44LjAgZGVwcmVjYXRlcyBzeW1ib2xfdGFibGU6OnZhcnJlZigpLCBzbyByZW1vdmUgaXRzIHVzZQogICAgICAgICAgICAgIGZvciB0aGlzIGFuZCBmdXR1cmUgdmVyc2lvbnMgb2YgT2N0YXZlLgoKICAgICAgICAgICAgLSBPY3RhdmUgMy44LjAgcmVtb3ZlcyBvY3RhdmVfdmFsdWU6OmlzX3JlYWxfbmRfYXJyYXkoKSwgdXNlZCBpbgogICAgICAgICAgICAgIG9jdGF2ZV9zd2lnX3R5cGU6OmRpbXMoKS4gSXRzIHVzZSBpcyBub3QgcmVxdWlyZWQgaGVyZSwgc28gcmVtb3ZlIGl0LgoKICAgICAgICAgICAgLSBSZXRlc3RlZCBhZ2FpbnN0IE9jdGF2ZSB2ZXJzaW9ucyAzLjAuNSwgMy4yLjQsIDMuNC4zLCAzLjYuNCwgYW5kIDMuOC4wLgoKICAgICAgICAgICAgLSBVcGRhdGVkIE9jdGF2ZSBkb2N1bWVudGF0aW9uIHdpdGggdGVzdGVkIE9jdGF2ZSB2ZXJzaW9ucywgYW5kIGFkZGVkIGEKICAgICAgICAgICAgICB3YXJuaW5nIGFnYWluc3QgdXNpbmcgdmVyc2lvbnMgPD0gMy54LngsIHdoaWNoIGFyZSBubyBsb25nZXIgdGVzdGVkLgoKMjAxMy0xMi0yMjogd3NmdWx0b24KICAgICAgICAgICAgQysrMTEgc3VwcG9ydCBmb3IgbmV3IHZlcnNpb25zIG9mIGVyYXNlIGFuZCBpbnNlcnQgaW4gdGhlIFNUTCBjb250YWluZXJzLgoKICAgICAgICAgICAgVGhlIGVyYXNlIGFuZCBpbnNlcnQgbWV0aG9kcyBpbiB0aGUgY29udGFpbmVycyB1c2UgY29uc3RfaXRlcmF0b3IgaW5zdGVhZAogICAgICAgICAgICBvZiBpdGVyYXRvciBpbiBDKysxMS4gIFRoZXJlIGFyZSB0aW1lcyB3aGVuIHRoZSBtZXRob2RzIHdyYXBwZWQgbXVzdCBtYXRjaAogICAgICAgICAgICB0aGUgcGFyYW1ldGVycyBleGFjdGx5LiBTcGVjaWZpY2FsbHkgd2hlbiBmdWxsIHR5cGUgaW5mb3JtYXRpb24gZm9yCiAgICAgICAgICAgIHRlbXBsYXRlIHR5cGVzIGlzIG1pc3Npbmcgb3IgU1dJRyBmYWlscyB0byBsb29rIHVwIHRoZSB0eXBlIGNvcnJlY3RseSwKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfdmVjdG9yLmk+CiAgICAgICAgICAgICAgdHlwZWRlZiBmbG9hdCBSZWFsOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShSZWFsVmVjdG9yKSBzdGQ6OnZlY3RvcjxSZWFsPjsKCiAgICAgICAgICAgIFNXSUcgZG9lcyBub3QgZmluZCBzdGQ6OnZlY3RvcjxSZWFsPjo6aXRlcmF0b3IgYmVjYXVzZSAldGVtcGxhdGUgdXNpbmcKICAgICAgICAgICAgdHlwZWRlZnMgZG9lcyBub3QgYWx3YXlzIHdvcmsgYW5kIHNvIFNXSUcgZG9lc24ndCBrbm93IGlmIHRoZSB0eXBlIGlzCiAgICAgICAgICAgIGNvcHlhYmxlIGFuZCBzbyB1c2VzIFN3aWdWYWx1ZVdyYXBwZXI8aXRlcmF0b3I+IHdoaWNoIGRvZXMKICAgICAgICAgICAgbm90IHN1cHBvcnQgY29udmVyc2lvbiB0byBhbm90aGVyIHR5cGUgKGNvbnN0X2l0ZXJhdG9yKS4gVGhpcyByZXN1bHRlZAogICAgICAgICAgICBpbiBjb21waWxhdGlvbiBlcnJvcnMgd2hlbiB1c2luZyB0aGUgQysrMTEgdmVyc2lvbiBvZiB0aGUgY29udGFpbmVycy4KCiAgICAgICAgICAgIENsb3NlcyAjNzMKCjIwMTMtMTAtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggU0YgIzEzNDAgLSBWaXN1YWwgU3R1ZGlvIGNvbXBpbGUgZXJyb3IgaW4gQysrIHdyYXBwZXJzIGR1ZSB0byAjaW5jbHVkZSA8ZXhjZXB0aW9uPgogICAgICAgICAgICB3aXRoaW4gZXh0ZXJuICJDIiBibG9jay4KCjIwMTMtMTAtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiAjMTM0NSAtIE1pc3NpbmcgI2luY2x1ZGUgPHN0ZGRlZi5oPiBmb3Igb2Zmc2V0b2Ygd2hlbiB1c2luZyAtYnVpbHRpbi4KCjIwMTMtMTAtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFwcGx5ICM5MiAtIG1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudHMgZm9yIFNXSUdfTHVhX2FkZF9uYW1lc3BhY2VfZGV0YWlscygpCiAgICAgICAgICAgIGFuZCBTV0lHX0x1YV9uYW1lc3BhY2VfcmVnaXN0ZXIoKS4KClZlcnNpb24gMi4wLjExICgxNSBTZXAgMjAxMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMy0wOS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCBhdHRlbXB0IHRvIGZyZWUgYSBub24taGVhcCBvYmplY3QgaW4gT1VUUFVUIHR5cGVtYXBzIGZvcjoKICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCAqT1VUUFVUCiAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyAqT1VUUFVUCiAgICAgICAgICAgICAgc2lnbmVkIGxvbmcgbG9uZyAqT1VUUFVUCiAgICAgICAgICAgICAgY2hhciAqT1VUUFVUCiAgICAgICAgICAgICAgc2lnbmVkIGNoYXIqT1VUUFVUCiAgICAgICAgICAgICAgdW5zaWduZWQgY2hhcipPVVRQVVQKCjIwMTMtMDktMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFB1bGwgR2l0IHBhdGNoICM2Mi4KICAgICAgICAgICAgICAxKSBTdGF0aWMgbWVtYmVycyBhbmQgc3RhdGljIGZ1bmN0aW9ucyBpbnNpZGUgY2xhc3MgY2FuIGJlIGFjY2Vzc2VkIGFzCiAgICAgICAgICAgICAgICAgTW9kdWxlTmFtZS5DbGFzc05hbWUuRnVuY3Rpb25OYW1lIChNZW1iZXJOYW1lIHJlc3BlY3RpdmVseSkuIE9sZCB3YXkgc3VjaCBhcwogICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUuQ2xhc3NOYW1lX0Z1bmN0aW9uTmFtZSBzdGlsbCB3b3Jrcy4KICAgICAgICAgICAgICAyKSBTYW1lIGdvZXMgZm9yIGVudW1zIGluc2lkZSBjbGFzc2VzOiBNb2R1bGVOYW1lLkNsYXNzTmFtZS5FbnVtVmFsdWUxIGV0Yy4KCjIwMTMtMDktMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtVVExdIEluZmluaXR5IGlzIG5vdyBieSBkZWZhdWx0IGFuIGFjY2VwdGFibGUgdmFsdWUgZm9yIHR5cGUgJ2Zsb2F0Jy4gVGhpcyBmaXggbWFrZXMKICAgICAgICAgICAgdGhlIGhhbmRsaW5nIG9mIHR5cGUgJ2Zsb2F0JyBhbmQgJ2RvdWJsZScgdGhlIHNhbWUuIFRoZSBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyB0aGUKICAgICAgICAgICAgQzk5IGlzZmluaXRlKCkgbWFjcm8sIG9yIG90aGVyd2lzZSBzb21lIHBsYXRmb3JtIGRlcGVuZGVudCBlcXVpdmFsZW50cywgdG8gYmUgYXZhaWxhYmxlLgoKICAgICAgICAgICAgVXNlcnMgcmVxdWlyaW5nIHRoZSBvbGQgYmVoYXZpb3VyIG9mIG5vdCBhY2NlcHRpbmcgaW5maW5pdHksIGNhbiBkZWZpbmUgYSAnY2hlY2snIHR5cGVtYXAKICAgICAgICAgICAgd2hlcmV2ZXIgYSBmbG9hdCBpcyB1c2VkLCBzdWNoIGFzOgoKICAgICAgICAgICAgICAldHlwZW1hcChjaGVjayxmcmFnbWVudD0iPGZsb2F0Lmg+IikgZmxvYXQsIGNvbnN0IGZsb2F0ICYgJXsKICAgICAgICAgICAgICAgIGlmICgkMSA8IC1GTFRfTUFYIHx8ICQxID4gRkxUX01BWCkgewogICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbl9mYWlsKFNXSUdfVHlwZUVycm9yLCAiT3ZlcmZsb3cgaW4gdHlwZSBmbG9hdCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTA4LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQdWxsIEdpdCBwYXRjaCAjODE6IEluY2x1ZGUgTHVhIGVycm9yIGxvY3VzIGluIFNXSUcgZXJyb3IgbWVzc2FnZXMuICAKICAgICAgICAgICAgVGhpcyBpcyBzdGFuZGFyZCBpbmZvcm1hdGlvbiBpbiBMdWEgZXJyb3IgbWVzc2FnZXMsIGFuZCBtYWtlcyBpdCBtdWNoCiAgICAgICAgICAgIGVhc2llciB0byBmaW5kIGJ1Z3MuCgoyMDEzLTA4LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBQdWxsIEdpdCBwYXRjaCAjNzU6IEhhbmRsZSBVVEYtOCBmaWxlcyB3aXRoIEJPTSBhdCBiZWdpbm5pbmcgb2YgZmlsZS4gV2FzIGdpdmluZyBhbgogICAgICAgICAgICAnSWxsZWdhbCB0b2tlbicgc3ludGF4IGVycm9yLgoKMjAxMy0wOC0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBQdWxsIEdpdCBwYXRjaCAjNzc6IEFsbG93IGV4cG9ydGluZyBzdGQ6Om1hcCB1c2luZyBub24tZGVmYXVsdCBjb21wYXJpc29uIGZ1bmN0aW9uLgoKMjAxMy0wOC0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gJWltcGxpY2l0Y29udiBpcyBpbXByb3ZlZCBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMuIExpa2UgaW4gQysrLCB0aGUgbWV0aG9kcwogICAgICAgICAgICB3aXRoIHRoZSBhY3R1YWwgdHlwZXMgYXJlIGNvbnNpZGVyZWQgYmVmb3JlIHRyeWluZyBpbXBsaWNpdCBjb252ZXJzaW9ucy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgJWltcGxpY2l0Y29udiBBOwogICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgIEEoaW50IGkpOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgY2xhc3MgQ0NDIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50IHh4KGludCBpKSB7IHJldHVybiAxMTsgfQogICAgICAgICAgICAgICAgICBpbnQgeHgoY29uc3QgQSYgaSkgeyByZXR1cm4gMjI7IH0KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBweXRob24gY29kZToKCiAgICAgICAgICAgICAgQ0NDKCkueHgoLTEpCgogICAgICAgICAgICB3aWxsIG5vdyByZXR1cm4gMTEgaW5zdGVhZCBvZiAyMiAtIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIG5vdCBkb25lLgoKMjAxMy0wOC0yMzogb2xseQoJICAgIFtQeXRob25dIEZpeCBjbGFuZysrIHdhcm5pbmcgaW4gZ2VuZXJhdGVkIHdyYXBwZXIgY29kZS4KCjIwMTMtMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICVpbXBsaWNpdGNvbnYgd2lsbCBub3cgYWNjZXB0IE5vbmUgd2hlcmUgdGhlIGltcGxpY2l0IGNvbnZlcnNpb24gdGFrZXMgYSBDL0MrKyBwb2ludGVyLgogICAgICAgICAgICBQcm9ibGVtIGhpZ2hsaWdodGVkIGJ5IEJvIFBlbmcuIENsb3NlcyBTRiBwYXRjaCAjMjMwLgoKMjAxMy0wOC0wNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gU0YgUGF0Y2ggIzMyNiBmcm9tIEtyaXMgVGhpZWxlbWFucyAtIFJlbW92ZSBTd2lnUHlPYmplY3RfcHJpbnQgYW5kIFN3aWdQeU9iamVjdF9zdHIgYW5kCiAgICAgICAgICAgIG1ha2UgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIHVzZSB0aGUgZGVmYXVsdCBweXRob24gaW1wbGVtZW50YXRpb25zLCB3aGljaCB3aWxsIGZhbGwgYmFjayB0byByZXByCiAgICAgICAgICAgIChmb3IgLWJ1aWx0aW4gb3B0aW9uKS4KCiAgICAgICAgICAgIEFkdmFudGFnZXM6CiAgICAgICAgICAgIC0gaXQgYXZvaWRzIHRoZSBzd2lnIHVzZXIgaGF2aW5nIHRvIGp1bXAgdGhyb3VnaCBob29wcyB0byBnZXQgcHJpbnQgdG8gd29yayBhcyBleHBlY3RlZCB3aGVuCiAgICAgICAgICAgICAgcmVkZWZpbmluZyByZXByL3N0ciBzbG90cy4KICAgICAgICAgICAgLSB0eXBpbmcgdGhlIG5hbWUgb2YgYSB2YXJpYWJsZSBvbiB0aGUgcHl0aG9uIHByb21wdCBub3cgcHJpbnRzIHRoZSByZXN1bHQgb2YgYSAocG9zc2libHkgcmVkZWZpbmVkKQogICAgICAgICAgICAgIHJlcHIsIHdpdGhvdXQgdGhlIHN3aWcgdXNlciBoYXZpbmcgdG8gZG8gYW55IGV4dHJhIHdvcmsuCiAgICAgICAgICAgIC0gd2hlbiByZWRlZmluaW5nIHJlcHIsIHRoZSBzd2lnIHVzZXIgZG9lc24ndCBuZWNlc3NhcmlseSBoYXZlIHRvIHJlZGVmaW5lIHN0ciBhcyBpdCB3aWxsIGNhbGwgdGhlCiAgICAgICAgICAgICAgcmVkZWZpbmVkIHJlcHIKICAgICAgICAgICAgLSB0aGUgYmVoYXZpb3VyIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2l0aG91dCB0aGUgLWJ1aWx0aW4gb3B0aW9uIHdoaWxlIHJlcXVpcmluZyBubyBleHRyYSB3b3JrCiAgICAgICAgICAgICAgYnkgdGhlIHVzZXIgKGFzaWRlIGZyb20gYWRkaW5nIHRoZSAlZmVhdHVyZSgicHl0aG9uOnNsb3QuLi4pIHN0YXRlbWVudHMgb2YgY291cnNlKQoKICAgICAgICAgICAgRGlzYWR2YW50YWdlOgogICAgICAgICAgICAtIGRlZmF1bHQgc3RyKCkgd2lsbCBnaXZlIGRpZmZlcmVudCAoYnV0IGNsZWFyZXI/KSBvdXRwdXQgb24gc3dpZ2dlZCBjbGFzc2VzCgoyMDEzLTA3LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5XSBGaXggIzY0ICM2NTogTWlzc2luZyBjb2RlIGluIHN0ZDo6bXVsdGltYXAgd3JhcHBlcnMuIFByZXZpb3VzbHkgYW4gaW5zdGFudGlhdGlvbgogICAgICAgICAgICBvZiBhIHN0ZDo6bWFwIHdhcyBlcnJvbmVvdXNseSByZXF1aXJlZCBpbiBhZGRpdGlvbiB0byBhbiBpbnN0YW50aWF0aW9uIG9mIHN0ZDo6bXVsdGltYXAgd2l0aCB0aGUKICAgICAgICAgICAgc2FtZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRvIHByZXZlbnQgY29tcGlsYXRpb24gZXJyb3JzIGZvciB0aGUgd3JhcHBlcnMgb2YgYSBzdGQ6Om11bHRpbWFwLgoKMjAxMy0wNy0xNDogam9lcXVhbnQKICAgICAgICAgICAgW1JdIENoYW5nZSB0eXBlcyBmaWxlIHRvIGFsbG93IGZvciBTRVhQIHJldHVybiB2YWx1ZXMKCjIwMTMtMDctMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCAlcHl0aG9uYmVnaW4gZGlyZWN0aXZlIHdoaWNoIHdvcmtzIGxpa2UgJXB5dGhvbmNvZGUsIGV4Y2VwdCB0aGUgc3BlY2lmaWVkIGNvZGUgaXMKICAgICAgICAgICAgYWRkZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZ2VuZXJhdGVkIC5weSBmaWxlLiBUaGlzIGlzIHByaW1hcmlseSBuZWVkZWQgZm9yIGltcG9ydGluZyBmcm9tCiAgICAgICAgICAgIF9fZnV0dXJlX18gc3RhdGVtZW50cyByZXF1aXJlZCB0byBiZSBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVweXRob25iZWdpbiAlewogICAgICAgICAgICAgIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgcHJpbnRfZnVuY3Rpb24KICAgICAgICAgICAgICBwcmludCgiTG9hZGluZyIsICJXaGl6eiIsICJCYW5nIiwgc2VwPScgLi4uICcpCiAgICAgICAgICAgICAgJX0KCjIwMTMtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IFNGIHBhdGNoICMzNDAgLSBVbmluaXRpYWxpemVkIHZhcmlhYmxlIGZpeCBpbiBTV0lHX1B5dGhvbl9Ob25EeW5hbWljU2V0QXR0cgogICAgICAgICAgICB3aGVuIHVzaW5nIC1idWlsdGluLgoKMjAxMy0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2NhbWxdIEFwcGx5IFNGIHBhdGNoICMzNDEgLSBmaXggYSBjb25zdF9jYXN0IGluIGdlbmVyYXRlZCBjb2RlIHRoYXQgd2FzIGdlbmVyYXRpbmcKICAgICAgICAgICAgYSA8OjogZGlncmFwaCB3aGVuIHVzaW5nIHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIChnbG9iYWwgc2NvcGUpIGluIGEgdGVtcGxhdGUgdHlwZS4KCjIwMTMtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBTRiBwYXRjaCAjMzQyIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHRvIGZpeCBzb21lIGRpcmVjdG9yIGNsYXNzZXMgY3Jhc2hpbmcgb24KICAgICAgICAgICAgb2JqZWN0IGRlbGV0aW9uIHdoZW4gdXNpbmcgLWJ1aWx0aW4uIEZpeGVzIFNGIGJ1ZyAjMTMwMS4KCjIwMTMtMDYtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBTV0lHX1BZVEhPTl9JTlRFUlBSRVRFUl9OT19ERUJVRyBtYWNybyB3aGljaCBjYW4gYmUgZGVmaW5lZCB0byB1c2UgdGhlIFJlbGVhc2UgdmVyc2lvbgogICAgICAgICAgICBvZiB0aGUgUHl0aG9uIGludGVycHJldGVyIGluIERlYnVnIGJ1aWxkcyBvZiB0aGUgd3JhcHBlcnMuIFRoZSBWaXN1YWwgU3R1ZGlvIC5kc3AgZXhhbXBsZQogICAgICAgICAgICBmaWxlcyBoYXZlIGJlZW4gbW9kaWZpZWQgdG8gdXNlIHRoaXMgc28gdGhhdCBEZWJ1ZyBidWlsZHMgd2lsbCBub3cgd29yayB3aXRob3V0IGhhdmluZwogICAgICAgICAgICB0byBpbnN0YWxsIG9yIGJ1aWxkIGEgRGVidWcgYnVpbGQgb2YgdGhlIGludGVycHJldGVyLgoKMjAxMy0wNi0wNzogd3NmdWx0b24KCSAgICBbUnVieV0gR2l0IGlzc3VlICM1Mi4gRml4IHJlZ3Jlc3Npb24gd2l0aCBtaXNzaW5nIHJiX2NvbXBsZXhfbmV3IGZ1bmN0aW9uIGZvciBSdWJ5CiAgICAgICAgICAgIHZlcnNpb25zIHByaW9yIHRvIDEuOSB1c2luZyBzdGQ6OmNvbXBsZXggd3JhcHBlcnMgaWYganVzdCB1c2luZyBzdGQ6OmNvbXBsZXggYXMgYW4gb3V0cHV0IHR5cGUuCiAgICAgICAgICAgIEFsc28gZml4IHRoZSBDb21wbGV4IGhlbHBlciBmdW5jdGlvbnMgZXh0ZXJuYWwgdmlzaWJpbGl0eSAodG8gc3RhdGljIGJ5IGRlZmF1bHQpLgoKMjAxMy0wNi0wNDogb2xseQoJICAgIFtQSFBdIEZpeCBTV0lHX1pUU19Db252ZXJ0UmVzb3VyY2VQdHIoKSBub3QgdG8gZGVyZWZlcmVuY2UgTlVMTAoJICAgIGlmIHRoZSB0eXBlIGxvb2t1cCBmYWlscy4KClZlcnNpb24gMi4wLjEwICgyNyBNYXkgMjAxMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMy0wNS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IFB5dGhvbiAzIGluY29uc2lzdGVuY3kgd2hlbiBuZWdhdGl2ZSBudW1iZXJzIGFyZSBwYXNzZWQKICAgICAgICAgICAgd2hlcmUgYSBwYXJhbWV0ZXIgZXhwZWN0cyBhbiB1bnNpZ25lZCBDIHR5cGUuIEFuIE92ZXJGbG93IGVycm9yIGlzCiAgICAgICAgICAgIG5vdyBjb25zaXN0ZW50bHkgdGhyb3duIGluc3RlYWQgb2YgYSBUeXBlRXJyb3IuCgoyMDEzLTA1LTI1OiBBcnRlbSBTZXJlYnJpeXNraXkKICAgICAgICAgICAgU1ZOIFBhdGNoIHRpY2tldCAjMzM4IC0gZml4ZXMgdG8gJWF0dHJpYnV0ZSBtYWNyb3MgZm9yIHRlbXBsYXRlIHVzYWdlCiAgICAgICAgICAgIHdpdGggJWFyZy4KCjIwMTMtMDUtMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjY2FjaGUtc3dpZyBpbnRlcm5hbCBlcnJvciBidWcgZHVlIHRvIHByZW1hdHVyZSBmaWxlIGNsZWFudXAuCgogICAgICAgICAgICBGaXhlcyBTRiBidWcgMTMxOSB3aGljaCBzaG93cyB1cCBhcyBhIGZhaWx1cmUgaW4gdGhlIGNjYWNoZSB0ZXN0cyBvbgogICAgICAgICAgICBEZWJpYW4gNjQgYml0IFdoZWV6eSwgcG9zc2libHkgYmVjYXVzZSBFTkFCTEVfWkxJQiBpcyBkZWZpbmVkLgoKICAgICAgICAgICAgVGhpcyBpcyBhIGNvcm5lciBjYXNlIHdoaWNoIHdpbGwgYmUgaGl0IHdoZW4gdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzCiAgICAgICAgICAgIGluIHRoZSBjYWNoZSBpcyBzZXQgdG8gYmUgcXVpdGUgbG93ICgtRiBvcHRpb24pLCByZXN1bHRpbmcgaW4gYSBjYWNoZSBtaXNzLgoKMjAxMy0wNS0wOToga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBGaXggYnVncyBpbiBPY3RhdmUgbW9kdWxlIGxvYWRpbmc6CiAgICAgICAgICAgIC0gZml4IGEgbWVtb3J5IGxlYWsgaW4gc2V0dGluZyBvZiBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICAgIC0gaW5zdGFsbCBmdW5jdGlvbnMgb25seSBvbmNlLCB0byBzcGVlZCB1cCBtb2R1bGUgbG9hZHMKCjIwMTMtMDQtMjg6IGdqYW5zc2VucwogICAgICAgICAgICBbR3VpbGVdIFVwZGF0ZXMgaW4gZ3VpbGUgbW9kdWxlOgogICAgICAgICAgICAtIEFkZCBzdXBwb3J0IGZvciBndWlsZSAyLjAKICAgICAgICAgICAgLSBEcm9wIHN1cHBvcnQgZm9yIGd1aWxlIDEuNgogICAgICAgICAgICAtIERyb3Agc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyB3cmFwcGVycyB1c2luZyBndWlsZSdzIGdoIGludGVyZmFjZS4KICAgICAgICAgICAgICBBbGwgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpbGwgdXNlIHRoZSBzY20gaW50ZXJmYWNlIGZyb20gbm93IG9uLgogICAgICAgICAgICAtIERlcHJlY2F0ZSAtZ2ggYW5kIC1zY20gb3B0aW9ucy4gVGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KICAgICAgICAgICAgICBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgd2hlbiB0aGVzZSBvcHRpb25zIGFyZSBzdGlsbCB1c2VkLgogICAgICAgICAgICAtIEZpeCBhbGwgdGVzdHMgYW5kIGV4YW1wbGVzIHRvIGhhdmUgYSBzdWNjZXNzZnVsIHRyYXZpcyB0ZXN0CgoyMDEzLTA0LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBQYXRjaCAjMzYgZnJvbSBKZXN1cyBMb3BleiB0byBhZGQgc3VwcG9ydCBmb3IgJGRlc2NyaXB0b3IoKSBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvIGV4cGFuc2lvbiAKICAgICAgICAgICAgaW4gZnJhZ21lbnRzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lRGVzY3JpcHRvciIsICJoZWFkZXIiKQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZURlc2NyaXB0b3IgPSAiJGRlc2NyaXB0b3IoTmFtZSkiOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICB3aGljaCB3aWxsIGdlbmVyYXRlIGludG8gdGhlIHdyYXBwZXIgaWYgdGhlIGZyYWdtZW50IGlzIHVzZWQ6CgogICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpuYW1lRGVzY3JpcHRvciA9ICJTV0lHVFlQRV9OYW1lIjsKCjIwMTMtMDQtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiBCdWcgIzQyOCAtIFN5bnRheCBlcnJvciB3aGVuIHByZXByb2Nlc3NvciBtYWNyb3MgYXJlIGRlZmluZWQgaW5zaWRlIG9mIGVudW0gbGlzdHMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bSB7CiAgICAgICAgICAgICAgICBlWmVybyA9IDAKICAgICAgICAgICAgICAjZGVmaW5lIE9ORSAxCiAgICAgICAgICAgICAgfSBFRm9vOwoKICAgICAgICAgICAgVGhlIG1hY3JvcyBhcmUgc2lsZW50bHkgaWdub3JlZC4KCjIwMTMtMDQtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHVsbCBwYXRjaCAjMzQgZnJvbSBCcmFudEt5c2VyIHRvIGZpeCBzbWFydCBwb2ludGVycyBpbiBjb25qdW5jdGlvbiB3aXRoIGRpcmVjdG9ycy4KCjIwMTMtMDQtMTU6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGJ1Z3MgaW4gb3V0cHV0IG9mIGNsZWFudXAgY29kZS4KICAgICAgICAgICAgLSBDbGVhbnVwIGNvZGUgaXMgbm93IHdyaXR0ZW4gYWxzbyBhZnRlciB0aGUgImZhaWw6IiBsYWJlbCwgc28gaXQgd2lsbCBiZSBjYWxsZWQgaWYKICAgICAgICAgICAgICBhIFNXSUdfZXhjZXB0aW9uIGlzIHJhaXNlZCBieSB0aGUgd3JhcHBpbmcgZnVuY3Rpb24sIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBtb2R1bGVzLgogICAgICAgICAgICAtIE9jdGF2ZSBtb2R1bGUgbm93IGFsc28gcmVjb2duaXNlcyB0aGUgIiRjbGVhbnVwIiBzcGVjaWFsIHZhcmlhYmxlLCBpZiBuZWVkZWQuCgoyMDEzLTA0LTA4OiBrd3dldHRlCiAgICAgICAgICAgIEFkZCAtTVAgb3B0aW9uIHRvIFNXSUcgZm9yIGdlbmVyYXRpbmcgcGhvbnkgdGFyZ2V0cyBmb3IgYWxsIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgLSBQcmV2ZW50cyBtYWtlIGZyb20gY29tcGxhaW5pbmcgaWYgaGVhZGVyIGZpbGVzIGhhdmUgYmVlbiBkZWxldGVkIGJlZm9yZQogICAgICAgICAgICAgIHRoZSBkZXBlbmRlbmN5IGZpbGUgaGFzIGJlZW4gdXBkYXRlZC4KICAgICAgICAgICAgLSBNb2RlbGxlZCBvbiBzaW1pbGFyIG9wdGlvbiBpbiBHQ0MuCgoyMDEzLTA0LTA5OiBvbGx5CgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgZGlyZWN0b3JpbiB0eXBlbWFwIGZvciBjaGFyKiBhbmQgY2hhcltdIHdoaWNoCgkgICAgZml4ZXMgZGlyZWN0b3Jfc3RyaW5nIHRlc3RjYXNlIGZhaWx1cmUuCgoyMDEzLTA0LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU0YgQnVnICMxMjkyIC0gUnVudGltZSBmaXhlcyBmb3IgUHJvYyBjaGFuZ2VzIGluIHJ1YnktMS45IHdoZW4gdXNpbmcgU1RMCiAgICAgICAgICAgIHdyYXBwZXJzIHRoYXQgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJlZGljYXRlLCBzdWNoIGFzOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoTWFwKSBzdGQ6Om1hcDxzd2lnOjpMQU5HVUFHRV9PQkosIHN3aWc6OkxBTkdVQUdFX09CSiwgc3dpZzo6QmluYXJ5UHJlZGljYXRlPD4gPjsKCjIwMTMtMDQtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBTRiBCdWcgIzExNTkgLSBDb3JyZWN0bHkgY2hlY2sgcmJfcmVzcG9uZF90byBjYWxsIHJldHVybiB2YWx1ZXMgdG8gZml4IHNvbWUKICAgICAgICAgICAgZnVydGhlciAxLjkgcHJvYmxlbXMgd2l0aCBmdW5jdG9ycyBhbmQgdXNlIG9mIENvbXBsZXggd3JhcHBlcnMuCgoyMDEzLTA0LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gUnVudGltZSBmaXhlcyBmb3Igc3RkOjpjb21wbGV4IHdyYXBwZXJzIGZvciBydWJ5LTEuOSAtIG5ldyBuYXRpdmUgUnVieSBjb21wbGV4IG51bWJlcnMgYXJlIHVzZWQuCgoyMDEzLTAzLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IHNlZyBmYXVsdCB3aGVuIHVzaW5nIFNUTCBjb250YWluZXJzIG9mIGdlbmVyaWMgUnVieSB0eXBlcywgR0NfVkFMVUUgb3IgTEFOR1VBR0VfT0JKRUNULAogICAgICAgICAgICBvbiBleGl0IG9mIHRoZSBSdWJ5IGludGVycHJldGVyLiBNb3JlIGZyZXF1ZW50bHkgb2JzZXJ2ZWQgaW4gcnVieS0xLjkuCgoyMDEzLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGRlbGV0ZV9pZiAocmVqZWN0ISkgZm9yIHRoZSBTVEwgY29udGFpbmVyIHdyYXBwZXJzIHdoaWNoIHByZXZpb3VzbHkgd291bGQKICAgICAgICAgICAgc29tZXRpbWVzIHNlZyBmYXVsdCBvciBub3Qgd29yay4KCjIwMTMtMDMtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzb21lIHVuZGVmaW5lZCBiZWhhdmlvdXIgZGVsZXRpbmcgc2xpY2VzIGluIHRoZSBTVEwgY29udGFpbmVycy4KCjIwMTMtMDMtMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YSwgRF0gRml4IHNlZyBmYXVsdCBpbiBTV0lHIHVzaW5nIGRpcmVjdG9ycyB3aGVuIGNsYXNzIGFuZCB2aXJ0dWFsIG1ldGhvZCBuYW1lcyBhcmUKICAgICAgICAgICAgdGhlIHNhbWUgZXhjZXB0IGJlaW5nIGluIGRpZmZlcmVudCBuYW1lc3BhY2VzIHdoZW4gdGhlICVuc3BhY2UgZmVhdHVyZSBpcyBub3QgYmVpbmcgdXNlZC4KCjIwMTMtMDItMTk6IGt3d2V0dGUKICAgICAgICAgICAgRml4IGJ1ZyBpbiBTV0lHJ3MgaGFuZGxpbmcgb2YgcXVhbGlmaWVkIChlLmcuIGNvbnN0KSB2YXJpYWJsZXMgb2YgYXJyYXkgdHlwZS4gR2l2ZW4gdGhlIHR5cGVkZWYKICAgICAgICAgICAgICBhKDcpLnEodm9sYXRpbGUpLmRvdWJsZSBteWFycmF5ICAgICAvLyB0eXBlZGVmIHZvbGF0aWxlIGRvdWJsZVs3XSBteWFycmF5OwogICAgICAgICAgICB0aGUgdHlwZQogICAgICAgICAgICAgIHEoY29uc3QpLm15YXJyYXkgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IG15YXJyYXkKICAgICAgICAgICAgYmVjb21lcwogICAgICAgICAgICAgIGEoNykucShjb25zdCB2b2xhdGlsZSkuZG91YmxlICAgICAgIC8vIGNvbnN0IHZvbGF0aWxlIGRvdWJsZVs3XQogICAgICAgICAgICBQcmV2aW91c2x5LCBTd2lnVHlwZV90eXBlZGVmX3Jlc29sdmUoKSBwcm9kdWNlcyB0aGUgdHlwZQogICAgICAgICAgICAgIHEoY29uc3QpLmEoNykucSh2b2xhdGlsZSkuZG91YmxlICAgIC8vIG5vbi1zZW5zaWNhbCB0eXBlCiAgICAgICAgICAgIHdoaWNoIHdvdWxkIG5ldmVyIG1hdGNoICV0eXBlbWFwIGRlY2xhcmF0aW9ucywgd2hvc2UgdHlwZXMgd2VyZSBwYXJzZWQgY29ycmVjdGx5LgogICAgICAgICAgICBBZGQgdHlwZW1hcF9hcnJheV9xdWFsaWZpZXJzLmkgdG8gdGhlIHRlc3Qgc3VpdGUgd2hpY2ggY2hlY2tzIGZvciB0aGUgY29ycmVjdCBiZWhhdmlvdXIuCgoyMDEzLTAyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgdHlwZWRlZiBuYW1lcyB1c2VkIGFzIGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yIG5hbWVzIGluICVleHRlbmQuIFRoZSByZWFsCiAgICAgICAgICAgIGNsYXNzL3N0cnVjdCBuYW1lIHNob3VsZCBiZSB1c2VkLgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB0YWdFU3RydWN0IHsKICAgICAgICAgICAgICAgIGludCBpdmFyOwogICAgICAgICAgICAgIH0gRVN0cnVjdDsKCiAgICAgICAgICAgICAgJWV4dGVuZCB0YWdFU3RydWN0IHsKICAgICAgICAgICAgICAgIEVTdHJ1Y3QoKSAvLyBpbGxlZ2FsIG5hbWUsIHNob3VsZCBiZSB0YWdFU3RydWN0KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgRVN0cnVjdCAqcyA9IG5ldyBFU3RydWN0KCk7CiAgICAgICAgICAgICAgICAgIHMtPml2YXIgPSBpdmFyMDsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB+RVN0cnVjdCgpIC8vIGlsbGVnYWwgbmFtZSwgc2hvdWxkIGJlIH50YWdFU3RydWN0KCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgZGVsZXRlICRzZWxmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEZvciBub3cgdGhlc2UgdHJpZ2dlciBhIHdhcm5pbmc6CgogICAgICAgICAgICAgIGV4dGVuZF9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yLmk6MTA3OiBXYXJuaW5nIDUyMjogVXNlIG9mIGFuIGlsbGVnYWwgY29uc3RydWN0b3IgbmFtZSAnRVN0cnVjdCcgaW4KICAgICAgICAgICAgICAlZXh0ZW5kIGlzIGRlcHJlY2F0ZWQsIHRoZSBjb25zdHJ1Y3RvciBuYW1lIHNob3VsZCBiZSAndGFnRVN0cnVjdCcuCiAgICAgICAgICAgICAgZXh0ZW5kX2NvbnN0cnVjdG9yX2Rlc3RydWN0b3IuaToxMTE6IFdhcm5pbmcgNTIzOiBVc2Ugb2YgYW4gaWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgJ0VTdHJ1Y3QnIGluCiAgICAgICAgICAgICAgJWV4dGVuZCBpcyBkZXByZWNhdGVkLCB0aGUgZGVzdHJ1Y3RvciBuYW1lIHNob3VsZCBiZSAndGFnRVN0cnVjdCcuCgogICAgICAgICAgICBUaGVzZSAlZXh0ZW5kIGRlc3RydWN0b3IgYW5kIGNvbnN0cnVjdG9yIG5hbWVzIHdlcmUgdmFsaWQgdXAgdG8gc3dpZy0yLjAuNCwgaG93ZXZlciBzd2lnLTIuMC41IGlnbm9yZWQKICAgICAgICAgICAgdGhlbSBhbHRvZ2V0aGVyIGZvciBDIGNvZGUgYXMgcmVwb3J0ZWQgaW4gU0YgYnVnICMxMzA2LiBUaGUgb2xkIGJlaGF2aW91ciBvZiB1c2luZyB0aGVtIGhhcyBiZWVuCiAgICAgICAgICAgIHJlc3RvcmVkIGZvciBub3csIGJ1dCBpcyBvZmZpY2lhbGx5IGRlcHJlY2F0ZWQuIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gYW5vbnltb3VzbHkgZGVmaW5lZCB0eXBlZGVmCiAgICAgICAgICAgIGNsYXNzZXMvc3RydWN0cyBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7Li4ufSBYOwoKMjAxMy0wMi0xNzoga3d3ZXR0ZQogICAgICAgICAgICBXaGVuIGdlbmVyYXRpbmcgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5ICVleHRlbmQsIHVzZSAiKHZvaWQpIiBmb3Igbm8tYXJndW1lbnQgZnVuY3Rpb25zCiAgICAgICAgICAgIGluc3RlYWQgb2YgIigpIi4gVGhpcyBwcmV2ZW50cyB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyB3aXRoICJnY2MgLVdzdHJpY3QtcHJvdG90eXBlcyIuCgoyMDEzLTAyLTE3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIE1pbm9yIGZpeCB0byBhdXRvZG9jIGdlbmVyYXRpb246IGdldCB0aGUgcmlnaHQgdHlwZSBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBzdHJ1Y3RzLgoKMjAxMy0wMi0xNTogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlIHR5cGVkZWYgbmFtZXMgdXNlZCBpbiAlZXh0ZW5kIHRoYXQgYXJlIG5vdCB0aGUgcmVhbCBjbGFzcy9zdHJ1Y3QgbmFtZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IFN0cnVjdEJOYW1lIHsKICAgICAgICAgICAgICAgIGludCBteWludDsKICAgICAgICAgICAgICB9IFN0cnVjdEI7CgogICAgICAgICAgICAgICVleHRlbmQgU3RydWN0QiB7CiAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZCgpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBub3cgdHJpZ2dlciBhIHdhcm5pbmc6CgogICAgICAgICAgICAgIHN3aWdfZXh0ZW5kLmk6MTk6IFdhcm5pbmcgMzI2OiBEZXByZWNhdGVkICVleHRlbmQgbmFtZSB1c2VkIC0gdGhlIHN0cnVjdCBuYW1lIFN0cnVjdEJOYW1lCiAgICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgdHlwZWRlZiBuYW1lIFN0cnVjdEIuCgogICAgICAgICAgICBUaGlzIGlzIG9ubHkgcGFydGlhbGx5IHdvcmtpbmcgYW55d2F5ICh0aGUgJWV4dGVuZCBvbmx5IHdvcmtlZCBpZiBwbGFjZWQgYWZ0ZXIgdGhlIGNsYXNzCiAgICAgICAgICAgIGRlZmluaXRpb24pLiAKCjIwMTMtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBBcHBseSBwYXRjaCAjMjIgLSBGaXggbWlzc2luZyBwYWNrYWdlIGJlZm9yZSAmYm9keQoKMjAxMy0wMS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEVuc3VyZSAnamF2YXBhY2thZ2UnIHR5cGVtYXAgaXMgdXNlZCBhcyBpdCBzdG9wcGVkIHdvcmtpbmcgZnJvbSB2ZXJzaW9uIDIuMC41LgoKMjAxMy0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggU0YgIzMzNCAtIEZpeCBkZWZhdWx0IHZhbHVlIGNvbnZlcnNpb25zICJUUlVFIi0+VHJ1ZSwgIkZBTFNFIi0+RmFsc2UuCgoyMDEzLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggU0YgIzMzNSAtIFRydWx5IGlnbm9yZSBjb25zdHJ1Y3RvcnMgaW4gZGlyZWN0b3JzIHdpdGggJWlnbm9yZS4KCjIwMTMtMDEtMTg6IEJyYW50IEt5c2VyCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTUgLSBBbGxvdyB0aGUgdXNlIG9mIHRoZSBuc3BhY2UgZmVhdHVyZSB3aXRob3V0IHRoZSAtcGFja2FnZSBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIFRoaXMgd29ya3MgYXMgbG9uZyBhbmQgdGhlIG5ldyBqbmljbGFzc3BhY2thZ2UgcHJhZ21hIGlzIHVzZWQgdG8gcGxhY2UgdGhlIEpOSSBpbnRlcm1lZGlhdGUgY2xhc3MKICAgICAgICAgICAgaW50byBhIHBhY2thZ2UgYW5kIHRoZSBuc3BhY2UgZmVhdHVyZSBpcyB1c2VkIHRvIHBsYWNlIGFsbCBleHBvc2VkIHR5cGVzIGludG8gYSBwYWNrYWdlLgoKMjAxMy0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IFZpc3VhbCBTdHVkaW8gZXhhbXBsZXMgdG8gd29yayB3aGVuIFNXSUcgaXMgdW56aXBwZWQgaW50byBhIGRpcmVjdG9yeSBjb250YWluaW5nIHNwYWNlcy4KCjIwMTMtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGNzdHlwZSB0eXBlbWFwIGxvb2t1cCBmb3IgbWVtYmVyIHZhcmlhYmxlcyBzbyB0aGF0IGEgZnVsbHkgcXVhbGlmaWVkIHZhcmlhYmxlIG5hbWUKICAgICAgICAgICAgbWF0Y2hlcy4gRm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBib29sIE1WYXI6Om12YXIgIk15Qm9vbCIKICAgICAgICAgICAgICBzdHJ1Y3QgTVZhciB7CiAgICAgICAgICAgICAgICBib29sIG12YXI7CiAgICAgICAgICAgICAgfTsKCjIwMTMtMDEtMTE6IEJyYW50IEt5c2VyCgkgICAgW0phdmEsIEMjLCBEXSBTRiBCdWcgIzEyOTkgLSBGaXggZ2VuZXJhdGVkIG5hbWVzIGZvciB3aGVuICVuc3BhY2UgaXMgdXNlZCBvbgogICAgICAgICAgICBjbGFzc2VzIHdpdGggdGhlIHNhbWUgbmFtZSBpbiB0d28gZGlmZmVyZW50IG5hbWVzcGFjZXMuCgoyMDEzLTAxLTExOiBWbGFkaW1pciBLYWxpbmluCgkgICAgW0MjXSBBZGQgc3VwcG9ydCBmb3IgY3NkaXJlY3RvcmluICdwcmUnLCAncG9zdCcgYW5kICd0ZXJtaW5hdG9yJyBhdHRyaWJ1dGVzLgoKMjAxMy0wMS0wODogb2xseQoJICAgIFtQSFBdIEZpeCB0byB3b3JrIHdpdGggYSBaVFMgYnVpbGQgb2YgUEhQIChicm9rZW4gaW4gMi4wLjcpLgoKMjAxMy0wMS0wNzogb2xseQoJICAgIEZpeCBiYXNoaXNtIGluIGNvbmZpZ3VyZSwgaW50cm9kdWNlZCBpbiAyLjAuOS4KCjIwMTMtMDEtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFB1bGwgcGF0Y2ggIzQgZnJvbSBwdG9tdWxpayB0byBmaXggU0YgQnVnICMxMjk2IC0gRml4IGluY29ycmVjdCB3YXJuaW5nIGZvciB2aXJ0dWFsIGRlc3RydWN0b3JzCiAgICAgICAgICAgIGluIHRlbXBsYXRlcywgc3VjaCBhczoKICAgICAgICAgICAgIFdhcm5pbmcgNTIxOiBJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSBCPCBBID46On5CKCkuIElnbm9yZWQuCgoyMDEzLTAxLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQdWxsIHBhdGNoICMzIGZyb20gcHRvbXVsaWsgdG8gZml4IFNGIEJ1ZyAjMTI5NSAtIHN0YW5kYXJkIGV4Y2VwdGlvbnMgYXMKICAgICAgICAgICAgY2xhc3NlcyB1c2luZyB0aGUgU1dJR19TVERfRVhDRVBUSU9OU19BU19DTEFTU0VTIG1hY3JvLgoKMjAxMy0wMS0wNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFB1bGwgcGF0Y2ggIzIgZnJvbSBCcmFudEt5c2VyIHRvIGZpeCBTRiBCdWcgIzEyODMgLSBmaXggc21hcnQgcG9pbnRlcnMgaW4gY29uanVjdGlvbgogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjIwMTMtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQdWxsIHBhdGNoICMxIGZyb20gQnJhbnRLeXNlciB0byBmaXggU0YgQnVnICMxMjc4IC0gZml4IGRpcmVjdG9ycyBhbmQgbnNwYWNlIGZlYXR1cmUgd2hlbgogICAgICAgICAgICBtdWx0aWxldmVsIG5hbWVzcGFjZXMgYXJlIHVzZWQuCgpWZXJzaW9uIDIuMC45ICgxNiBEZWNlbWJlciAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0xMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGdhcmJhZ2UgbGluZSBudW1iZXIgLyBlbXB0eSBmaWxlIG5hbWUgcmVwb3J0aW5nIGZvciBzb21lIG1pc3NpbmcKICAgICAgICAgICAgJ30nIG9yICcpJyBlcnJvciBtZXNzYWdlcy4KCjIwMTItMTItMTU6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIDM1MzA0NDQsIENsYXNzI21ldGhvZHMgYW5kIENsYXNzI2NvbnN0YW50cyByZXR1cm5zIGFycmF5IG9mCiAgICAgICAgICAgIHN5bWJvbHMgaW4gUnVieSAxLjkrCgoyMDEyLTEyLTE0OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAzNTMwNDM5IGFuZCBmaW5hbGx5IHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBTVFIyQ1NUUigpIG1hY3JvCiAgICAgICAgICAgIHdpdGggU3RyaW5nVmFsdWVQdHIoKS4gU1RSMkNTVFIgd2FzIGRlcHJlY2F0ZWQgc2luY2UgeWVhcnMgYW5kIGdvdCByZW1vdmVkIGluIFJ1YnkgMS45CgoyMDEyLTEyLTE0OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBsaWVkIHBhdGNoZXMgIzM1MzA0NDIgYW5kIDM1MzA0NDMgdG8gYWRhcHQgY29tcGlsZSBhbmQgcnVudGltZSBpbmNsdWRlCiAgICAgICAgICAgIHBhdGhzIHRvIG1hdGNoIFJ1YnkgMS45KwoKMjAxMi0xMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEZpeCAjMzE2MTYxNCAtIFNvbWUgc3RyaW5nIGNvbnN0YW50cyBhcmUgaW5jb3JyZWN0CgoyMDEyLTEyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gRml4ICMzNTI5NjkwIC0gRml4IGluY29ycmVjdCBjb25zdGFudCBuYW1lcy4KCjIwMTItMTItMTI6IGRyam9lCgkgICAgW1JdIGFkZCBmaXggdG8gZmluYWxpemVyIHRoYXQgd2FzIG1pc3NlZCBlYXJsaWVyCgoyMDEyLTEyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMzU5MDUyMiAtIGZ1bGx5IHF1YWxpZmllZCBwYWNrYWdlIHBhdGhzIGZvciBQeXRob24gMyBldmVuIGlmIGEgbW9kdWxlIGlzIGluIHRoZQogICAgICAgICAgICBzYW1lIHBhY2thZ2UuCgoyMDEyLTEyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBCdWcgIzM1NjM2NDcgLSBQeUludF9Gcm9tU2l6ZV90IHVuYXZhaWxhYmxlIHByaW9yIHRvIFB5dGhvbiAyLjUgZm9yIHVuc2lnbmVkIGludCB0eXBlcy4KCjIwMTItMTItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggYnVnICMzNTcxMzYxIC0gQysrIGNvbW1lbnQgaW4gQyB3cmFwcGVycy4KCjIwMTItMTItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQXBwbHkgcGF0Y2ggIzM1NzEwMjkgd2hpY2ggYWRkcyBtaXNzaW5nIGRpcmVjdG9yIHN1cHBvcnQgZm9yIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmLgoKMjAxMi0xMS0yODoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBTaW1wbGlmaWVkIG1vZHVsZSBsb2FkaW5nOiBub3cganVzdCB0aGUgc3ludGF4CiAgICAgICAgICAgICQgZXhhbXBsZTsKICAgICAgICAgICAgaXMgYWNjZXB0ZWQsIHdoaWNoIGxvYWRzIGZ1bmN0aW9ucyBnbG9iYWxseSBidXQgY29uc3RhbnRzIGFuZCB2YXJpYWJsZXMgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgc2NvcGUuCiAgICAgICAgICAgIFRoaXMgbWFrZSBtb2R1bGUgbG9hZGluZyBiZWhhdmlvdXIgcmVsaWFibHkgY29uc2lzdGVudCwgYW5kIHJlZHVjZXMgcHJvYmxlbXMgd2hlbiBsb2FkaW5nIG1vZHVsZXMgd2hpY2gKICAgICAgICAgICAgZGVwZW5kIG9uIG90aGVyIG1vZHVsZXMgd2hpY2ggbWF5IG5vdCBoYXZlIGJlZW4gcHJldmlvdXNseSBsb2FkZWQuCgoyMDEyLTExLTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2ZmaV0gRml4IGp1bmsgb3V0cHV0IHdoZW4gd3JhcHBpbmcgc2luZ2xlIGNoYXJhY3RlciBsaXRlcmFsIGNvbnN0YW50cy4KCjIwMTItMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2wsIE1vZHVsYTNdIEFkZCBtaXNzaW5nIHN1cHBvcnQgZm9yIC1vdXRkaXIuCgoyMDEyLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnZmF1bHRzIHdoZW4gdXNpbmcgZmlsZW5hbWUgcGF0aHMgZ3JlYXRlciB0aGFuIDEwMjQgY2hhcmFjdGVycyBpbiBsZW5ndGguCgoyMDEyLTExLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbY2NhY2hlLXN3aWddIEFwcGx5IHBhdGNoICMzNTg2MzkyIGZyb20gRnJlZGVyaWsgRGV3ZWVyZHQgdG8gZml4IHNvbWUgZXJyb3IgY2FzZXMgLSBpbmNvcnJlY3RseSB1c2luZwogICAgICAgICAgICBtZW1vcnkgYWZ0ZXIgaXQgaGFzIGJlZW4gZGVsZXRlZC4KCjIwMTItMTEtMDk6IHZ6ZWl0bGluCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBvdmVyZmxvdyB3aGVuIHBhc3NpbmcgdmFsdWVzIGdyZWF0ZXIgdGhhbiBMT05HX01BWCBmcm9tIFB5dGhvbiAzIGZvciBwYXJhbWV0ZXJzIHdpdGggdW5zaWduZWQgbG9uZyBDIHR5cGUuCgoyMDEyLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSBmZWF0dXJlIG1hdGNoaW5nIGlzc3VlcyBmb3IgaW1wbGljaXQgZGVzdHJ1Y3RvcnMgYW5kIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhbmQgaW1wbGljaXQKICAgICAgICAgICAgY29weSBjb25zdHJ1Y3RvcnMgYWRkZWQgd2l0aCAlY29weWN0b3IuIFByZXZpb3VzbHkgYSBmZWF0dXJlIGZvciB0aGVzZSBoYWQgdG8gYmUgZnVsbHkgcXVhbGlmaWVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIG1hdGNoLiBOb3cgdGhlIGZvbGxvd2luZyB3aWxsIGFsc28gbWF0Y2g6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJ4eXoiKSB+WFhYKCk7CiAgICAgICAgICAgICAgc3RydWN0IFhYWCB7fTsKCjIwMTItMTEtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZ1cnRoZXIgY29uc2lzdGVuY3kgaW4gbmFtZWQgb3V0cHV0IHR5cGVtYXAgbG9va3VwcyBmb3IgaW1wbGljaXQgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBhbmQKICAgICAgICAgICAgaW1wbGljaXQgY29weSBjb25zdHJ1Y3RvcnMgYWRkZWQgd2l0aCAlY29weWN0b3IuIFByZXZpb3VzbHkgb25seSB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgd2FzIGJlaW5nCiAgICAgICAgICAgIHVzZWQsIG5vdyB0aGUgdW5xdWFsaWZpZWQgbmFtZSB3aWxsIGFsc28gYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHByZXZpb3VzbHk6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozODogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZAoKICAgICAgICAgICAgTm93IHRoZSB1bnF1YWxpZmllZCBuYW1lIGlzIGFsc28gdXNlZDoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM4OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIH5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZAoKMjAxMi0xMS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgc3VidGxlIG5hbWVkIG91dHB1dCB0eXBlbWFwIGxvb2t1cCBtaXNzZXMsIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSB3YXMgbm90IGFsd2F5cyBiZWluZwogICAgICAgICAgICB1c2VkIGZvciB2YXJpYWJsZXMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgR2xvYiB7CiAgICAgICAgICAgICAgICBpbnQgTXlWYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIHNlYXJjaCBydWxlcyAoYXMgc2hvd24gYnkgLWRlYnVnLXRtc2VhcmNoKSBmb3IgdGhlIGdldHRlciB3cmFwcGVyIHdlcmU6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTo0NDogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiBpbnQgTXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQgTXlWYXIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBpbnQKCiAgICAgICAgICAgIE5vdyB0aGUgc2NvcGUgaXMgbmFtZWQgY29ycmVjdGx5OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6NDQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogaW50IEdsb2I6Ok15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IEdsb2I6Ok15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50CgoyMDEyLTEwLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZGlyZWN0b3IgdHlwZW1hcCBzZWFyY2hpbmcgc28gdGhhdCBhIHR5cGVtYXAgc3BlY2lmaWVkIHdpdGggYSBuYW1lIHdpbGwgYmUgY29ycmVjdGx5IG1hdGNoZWQuIFByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG5hbWUgd2FzIGlnbm9yZWQgZHVyaW5nIHRoZSB0eXBlbWFwIHNlYXJjaC4gQXBwbGllcyB0byB0aGUgZm9sbG93aW5nIGxpc3Qgb2YgdHlwZW1hcHM6IAogICAgICAgICAgICBkaXJlY3Rvcm91dCwgY3NkaXJlY3Rvcm91dCwgY3N0eXBlLCBpbXR5cGUsIGN0eXBlLCBkZGlyZWN0b3JvdXQsIGR0eXBlLCBnb3R5cGUsIGp0eXBlLCBqbmksIGphdmFkaXJlY3Rvcm91dC4KCjIwMTItMTAtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vc3Qgb2YgdGhlIHNwZWNpYWwgdmFyaWFibGVzIGF2YWlsYWJsZSBmb3IgdXNlIGluICVleGNlcHRpb24gYXJlIG5vdyBhbHNvIGF2YWlsYWJsZSBmb3IgZXhwYW5zaW9uIGluCiAgICAgICAgICAgICVleHRlbmQgYmxvY2tzLiBUaGVzZSBhcmU6ICRuYW1lICRzeW1uYW1lICRvdmVybmFtZSAkZGVjbCAkZnVsbGRlY2wgJHBhcmVudGNsYXNzbmFtZSAkcGFyZW50Y2xhc3NzeW1uYW1lLCBzZWUgZG9jcwogICAgICAgICAgICBvbiAiQ2xhc3MgZXh0ZW5zaW9uIiBpbiBTV0lHUGx1cy5odG1sLiBQYXRjaCBiYXNlZCBvbiBzdWJtaXNzaW9uIGZyb20gS3JpcyBUaGllbGVtYW5zLgoKMjAxMi0xMC0xMDogd3NmdWx0b24KICAgICAgICAgICAgQWRkaXRpb25hbCBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaW4gJWV4Y2VwdGlvbiBhcmUgZXhwYW5kZWQgYXMgZm9sbG93czoKICAgICAgICAgICAgICAkcGFyZW50Y2xhc3NuYW1lIC0gVGhlIHBhcmVudCBjbGFzcyBuYW1lIChpZiBhbnkpIGZvciBhIG1ldGhvZC4KICAgICAgICAgICAgICAkcGFyZW50Y2xhc3NzeW1uYW1lIC0gVGhlIHRhcmdldCBsYW5ndWFnZSBwYXJlbnQgY2xhc3MgbmFtZSAoaWYgYW55KSBmb3IgYSBtZXRob2QuCgoyMDEyLTEwLTA4OiBpYW50CgkgICAgW0dvXSBHZW5lcmF0aW5nIEdvIGNvZGUgbm93IHJlcXVpcmVzIHVzaW5nIHRoZSAtaW50Z29zaXplIG9wdGlvbiB0bwoJICAgIGluZGljYXRlIHRoZSBzaXplIG9mIHRoZSAnaW50JyB0eXBlIGluIEdvLiAgVGhpcyBpcyBiZWNhdXNlIHRoZQoJICAgIHNpemUgb2YgdGhlIHR5cGUgaXMgY2hhbmdpbmcgZnJvbSBHbyAxLjAgdG8gR28gMS4xIGZvciB4ODZfNjQuIAoKMjAxMi0wOS0xNDogd3NmdWx0b24KCSAgICBBZGQgbmV3IHdhcm5pbmcgaWYgdGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQmFzZSB7fTsKICAgICAgICAgICAgICAldGVtcGxhdGUoKSBCYXNlPGludD47CiAgICAgICAgICAgICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlPGludD4ge307CgogICAgICAgICAgICBnaXZlcyB0aGUgZm9sbG93aW5nIHdhcm5pbmcgaW5zdGVhZCBvZiBzaWxlbnRseSBpZ25vcmluZyB0aGUgYmFzZToKCiAgICAgICAgICAgIGNwcF9pbmhlcml0Lmk6NTI6IFdhcm5pbmcgNDAxOiBCYXNlIGNsYXNzICdCYXNlPCBpbnQgPicgaGFzIG5vIG5hbWUgYXMgaXQgaXMgYW4gZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGVkIHdpdGggJyV0ZW1wbGF0ZSgpJy4gSWdub3JlZC4KICAgICAgICAgICAgY3BwX2luaGVyaXQuaTo1MTogV2FybmluZyA0MDE6IFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIG11c3QgYmUgd3JpdHRlbiBiZWZvcmUgJ0Jhc2U8IGludCA+JyBpcyB1c2VkIGFzIGEgYmFzZSBjbGFzcyBhbmQgYmUgZGVjbGFyZWQgd2l0aCBhIG5hbWUuCgoKMjAxMi0wOS0xMTogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMzNTM1MzA0IC0gRGlyZWN0IHVzZSBvZiBhIHdlYWsgZ2xvYmFsIHJlZmVyZW5jZSBpbiBkaXJlY3RvcnMKICAgICAgICAgICAgc29tZXRpbWVzIGNhdXNpbmcgc2VnIGZhdWx0cyBlc3BlY2lhbGx5IG9uIEFuZHJvaWQuCgoyMDEyLTA5LTA2OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMgdG8gYWNjZXB0IE5VTEwgc3RyaW5nLgoKMjAxMi0wOC0yNjogZHJqb2UKCSAgICBbUl0gbWFrZSBFeHRlcm5hbFJlZmVyZW5jZSBzbG90IHJlZiB0byBjb250YWluIHJlZmVyZW5jZQoKMjAxMi0wOC0yNjogZHJqb2UKCSAgICBbUl0gZml4IEV4YW1wbGVzL01ha2VmaWxlIHRvIHVzZSBDIGluICQoQ0MpIHJhdGhlciB0aGFuICQoQ1hYKQoKVmVyc2lvbiAyLjAuOCAoMjAgQXVndXN0IDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFkZCBzaXplX3R5cGUsIHZhbHVlX3R5cGUsIGNvbnN0X3JlZmVyZW5jZSB0byB0aGUgU1RMIGNvbnRhaW5lcnMuCgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgZGlzY2FyZCBhbmQgYWRkIG1ldGhvZHMgdG8gc3RkOjpzZXQgd3JhcHBlcnMgc28gdGhhdCBweWFiYy5pIGNhbiBiZSB1c2VkIGVuc3VyaW5nCiAgICAgICAgICAgIE11dGFibGVTZXQgaXMgYSB2YWxpZCBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzdGQ6OnNldC4gQXMgcmVwb3J0ZWQgYnkgQWxleGV5IFNva29sb3YuCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3Igc3RkOjptdWx0aXNldC4KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMzU0MTc0NCAtIE1pc3NpbmcgUHlJbnRfRnJvbVNpemVfdCBjYWxscyBmb3IgUHl0aG9uIDMuCgoyMDEyLTA4LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBEYXZpZCBCYXVtIHRvIGFkZCB0aGUgYXNzdW1lb3ZlcnJpZGUgZmVhdHVyZSBmb3IgSmF2YSBkaXJlY3RvcnMgdG8KICAgICAgICAgICAgaW1wcm92ZSBwZXJmb3JtYW5jZSB3aGVuIGFsbCBvdmVycmlkZGVuIG1ldGhvZHMgY2FuIGJlIGFzc3VtZWQgdG8gYmUgb3ZlcnJpZGRlbi4KCjIwMTItMDgtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICMzNTMwMDIxIEZpeCB1bnVzZWQgdmFyaWFibGUgd2FybmluZy4KCjIwMTItMDgtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ICMzNTM2MzYwIC0gSW52YWxpZCBjb2RlIHNvbWV0aW1lcyBiZWluZyBnZW5lcmF0ZWQgZm9yIGRpcmVjdG9yIG1ldGhvZHMKICAgICAgICAgICAgd2l0aCBtYW55IGFyZ3VtZW50cy4KCjIwMTItMDgtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSAjMzU0NTg3NyAtIERvbid0IHVuZGVmaW5lIGJvb2wgaWYgZGVmaW5lZCBieSBDOTkgc3RkYm9vbC5oIC0gcHJvYmxlbSB1c2luZyAKICAgICAgICAgICAgUGVybCA1LjE2IGFuZCBsYXRlci4KCjIwMTItMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBpbmNvcnJlY3Qgd2FybmluZyAoMzE0KSBhYm91dCB0YXJnZXQgbGFuZ3VhZ2Uga2V5d29yZHMgd2hpY2ggd2VyZSB0cmlnZ2VyZWQKICAgICAgICAgICAgYnkgdXNpbmcgZGVjbGFyYXRpb25zIGFuZCB1c2luZyBkaXJlY3RpdmVzLiBGb3IgZXhhbXBsZSAnc3RyaW5nJyBpcyBhIGtleXdvcmQgaW4gQyM6CiAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7IGNsYXNzIHN0cmluZzsgfQogICAgICAgICAgICAgIHVzaW5nIHN0ZDo6c3RyaW5nOwoKMjAxMi0wNy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpc3BsYXkgb2YgcG9pbnRlcnMgaW4gdmFyaW91cyBwbGFjZXMgb24gNjQgYml0IHN5c3RlbXMgLSBvbmx5IDMyIGJpdHMgd2VyZSBiZWluZyBzaG93bi4KCjIwMTItMDctMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnZGIgZGVidWdnZXIgZnVuY3Rpb25zICdzd2lncHJpbnQnIGFuZCAnbG9jc3dpZ3ByaW50JyB0byBkaXNwbGF5IHRvIHRoZSBnZGIgb3V0cHV0IHdpbmRvdwogICAgICAgICAgICByYXRoZXIgdGhhbiBzdGRvdXQuIFRoaXMgZml4ZXMgZGlzcGxheSBwcm9ibGVtcyBpbiBnZGJ0dWkgYW5kIHRoZSBlbnN1cmVzIHRoZSBvdXRwdXQKICAgICAgICAgICAgYXBwZWFycyB3aGVyZSBleHBlY3RlZCBpbiBvdGhlciBnZGIgYmFzZWQgZGVidWdnZXJzIHN1Y2ggYXMgRWNsaXBzZSBDRFQuCgoyMDEyLTA3LTIwOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHNlZ2ZhdWx0LW9uLWV4aXQgcHJldmVudGlvbiBoYWNrIG5vdyBwcmVzZXJ2ZXMgZXhpdCBzdGF0dXMsIGFuZCB1c2VzIEM5OSBfRXhpdCgpLgoKMjAxMi0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IERlYmlhbiBidWcgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy82NzIwMzUsIHR5cGVtYXAgY29weSBmYWlsdXJlIC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIAogICAgICAgICAgICBpbiBzd2lnLTIuMC41OgogICAgICAgICAgICAgICVpbmNsdWRlPHN0bC5pPgogICAgICAgICAgICAgIHVzaW5nIHN0ZDo6cGFpcjsKICAgICAgICAgICAgICAldGVtcGxhdGUoU3RyUGFpcikgcGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+OwoKMjAxMi0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzaW5nIGRlY2xhcmF0aW9ucyBjb21iaW5lZCB3aXRoIHVzaW5nIGRpcmVjdGl2ZXMgd2l0aCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBzbyB0aGF0CiAgICAgICAgICAgIHR5cGVzIGFyZSBjb3JyZWN0bHkgZm91bmQgaW4gc2NvcGUgZm9yIHRlbXBsYXRlcy4gRXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgVGhpbmcyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOwogICAgICAgICAgICAgIHVzaW5nIFNwYWNlMjo6VGhpbmcyOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAvLyBTVElMTCBCUk9LRU4gdm9pZCB1c2VpdDIoVGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmEoT3V0ZXIyOjpTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJiKDo6T3V0ZXIyOjpTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJjKFNwYWNlMjo6VGhpbmcyPGludD4gdCkge30KICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIHZvaWQgdXNlaXQyZChTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldGVtcGxhdGUoVGhpbmcySW50KSBUaGluZzI8aW50PjsKCgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdGVtcGxhdGUgbmFtZXNwYWNlIHByb2JsZW1zIGZvciBzeW1ib2xzIGRlY2xhcmVkIHdpdGggYSBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucywgc3VjaCBhczoKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFlZWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBTcGFjZTI6OllZWSB7CiAgICAgICAgICAgICAgICAgIFQgeXl5KFQgaCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBoOwogICAgICAgICAgICAgICAgICB9ICAgIAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTEoU3BhY2UxOjpTcGFjZTI6OllZWTxpbnQ+IHl5KSB7fQogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMihTcGFjZTI6OllZWTxpbnQ+IHl5KSB7fQogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMyg6OlNwYWNlMTo6U3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShZWVlJbnQpIFNwYWNlMTo6U3BhY2UyOjpZWVk8aW50PjsKCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBuYW1lc3BhY2UgcHJvYmxlbXMgZm9yIHN5bWJvbHMgZGVjbGFyZWQgd2l0aCBhIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UxIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgWFhYOwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgWVlZOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHN0cnVjdCBTcGFjZTI6OllZWSB7fTsKICAgICAgICAgICAgICAgIHN0cnVjdCBTcGFjZTE6OlNwYWNlMjo6WFhYIHt9OwoKICAgICAgICAgICAgICAgIHZvaWQgdGVzdFhYWDIoU3BhY2UyOjpYWFggeHgpIHt9CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkyKFNwYWNlMjo6WVlZIHl5KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoZXJlIHh4IGFuZCB5eSB3ZXJlIG5vdCByZWNvZ25pc2VkIGFzIHRoZSBwcm94eSBjbGFzc2VzIFhYWCBhbmQgWVlZLgoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzaW5nIGRlY2xhcmF0aW9ucyBjb21iaW5lZCB3aXRoIHVzaW5nIGRpcmVjdGl2ZXMgd2l0aCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBzbyB0aGF0CiAgICAgICAgICAgIHR5cGVzIGFyZSBjb3JyZWN0bHkgZm91bmQgaW4gc2NvcGUuIAoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICBjbGFzcyBUaGluZzI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBPdXRlcjI7CiAgICAgICAgICAgICAgdXNpbmcgU3BhY2UyOjpUaGluZzI7CiAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgIC8vIE5vbmUgb2YgdGhlIG1ldGhvZHMgYmVsb3cgY29ycmVjdGx5IHVzZWQgdGhlIFRoaW5nMiBwcm94eSBjbGFzcwogICAgICAgICAgICAgIHZvaWQgdXNlaXQyKFRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYShPdXRlcjI6OlNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJiKDo6T3V0ZXIyOjpTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYyhTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgdm9pZCB1c2VpdDJkKFNwYWNlMjo6VGhpbmcyIHQpIHt9CiAgICAgICAgICAgICAgfQoKMjAxMi0wNi0yNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzaW5nIGRlY2xhcmF0aW9ucyBjb21iaW5lZCB3aXRoIHVzaW5nIGRpcmVjdGl2ZXMgc28gdGhhdCB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlLgogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTIgewogICAgICAgICAgICAgICAgICBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBPdXRlcjI7IC8vIHVzaW5nIGRpcmVjdGl2ZQogICAgICAgICAgICAgIHVzaW5nIFNwYWNlMjo6VGhpbmcyOyAvLyB1c2luZyBkZWNsYXJhdGlvbgogICAgICAgICAgICAgIHZvaWQgdXNlaXQyKFRoaW5nMiB0KSB7fQoKICAgICAgICAgICAgU2ltaWxhcmx5IGZvciB0ZW1wbGF0ZWQgY2xhc3Nlcy4KCjIwMTItMDUtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzUyOTYwMSAtIHNlZyBmYXVsdCB3aGVuIGEgcHJvdGVjdGVkIG1ldGhvZCBoYXMgdGhlICJkaXJlY3RvciIKICAgICAgICAgICAgZmVhdHVyZSBidXQgdGhlIHBhcmVudCBjbGFzcyBkb2VzIG5vdC4gQWxzbyBmaXggc2ltaWxhciBwcm9ibGVtcyB3aXRoCiAgICAgICAgICAgIHRoZSBhbGxwcm90ZWN0ZWQgZmVhdHVyZS4KCjIwMTItMDUtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgd2hlbiBhdHRlbXB0aW5nIHRvIHdhcm4gYWJvdXQgYW4gaWxsZWdhbCBkZXN0cnVjdG9yIC0gIzM1MzAwNTUsIDM1MzAwNzggYW5kICMzNTMwMTE4LgoKVmVyc2lvbiAyLjAuNyAoMjYgTWF5IDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoyMDEyLTA1LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBzdGQ6OnN0cmluZyB0eXBlbWFwIG1vZGlmaWNhdGlvbnMgc28gdGhleSBjYW4gYmUgdXNlZCB3aXRoICVhcHBseSBmb3Igb3RoZXIgc3RyaW5nCiAgICAgICAgICAgIGNsYXNzZXMuCgoyMDEyLTA1LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXhlcyBmb3IgLWV4dGVybmFsLXJ1bnRpbWUgdG8gd29yayBhZ2Fpbi4KCjIwMTItMDUtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIERpc2FtYmlndWF0ZSBTV0lHX0Zyb21fdW5zaWduZWRfU1NfaW50IGFuZCBTV0lHX0Zyb21fdW5zaWduZWRfU1NfbG9uZy4KCjIwMTItMDUtMTg6IG9sbHkKCSAgICBbUEhQXSBGaXggZ2V0dGVycyBmb3IgdGVtcGxhdGUgbWVtYmVycy4gKFNGIzM0Mjg4MzMsIFNGIzM1MjgwMzUpCgoyMDEyLTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSBsYW5ndWFnZSdzIHN0ZDo6bWFwIHdyYXBwZXJzIHRvIHJlY29nbmlzZSBkaWZmZXJlbmNlX3R5cGUsIHNpemVfdHlwZSwga2V5X3R5cGUKICAgICAgICAgICAgYW5kIG1hcHBlZF90eXBlLgoKMjAxMi0wNS0xNDoga3d3ZXR0ZSAoc2lnbmVkIG9mZiBieSB4YXZpZXI5OCkKICAgICAgICAgICAgW09jdGF2ZV0gUHJldmVudCBPY3RhdmUgZnJvbSBzZWctZmF1bHRpbmcgYXQgZXhpdCB3aGVuIFNXSUcKICAgICAgICAgICAgbW9kdWxlcyBhcmUgbG9hZGVkLCBkdWUgdG8gYnVncyBpbiBPY3RhdmUncyBjbGVhbnVwIGNvZGU6CiAgICAgICAgICAgICogV3JhcHBpbmcgZnVuY3Rpb25zIG5vdyBkZWNsYXJlZCB3aXRoIE9jdGF2ZSBERUZVTl9ETEQgbWFjcm8sCiAgICAgICAgICAgICAgYW5kIGxvYWRlZCB0aHJvdWdoIE9jdGF2ZSdzIGR5bmFtaWMgbW9kdWxlIGxvYWRlcgogICAgICAgICAgICAqIEdsb2JhbCB2YXJpYWJsZXMgb2Ygc3dpZ3JlZiB0eXBlIGFyZSBub3cgYXNzaWduZWQgYSBuZXcoKQogICAgICAgICAgICAgIGNvcHkgb2YgdGhlIHN3aWdyZWYgY2xhc3MsIHRvIHByZXZlbnQgZG91YmxlLWZyZWUgZXJyb3JzCiAgICAgICAgICAgICogU1dJRyBtb2R1bGUgYXQtZXhpdCBjbGVhbnVwIGZ1bmN0aW9uIG5vdyBjcmVhdGVkIGluIE9jdGF2ZQogICAgICAgICAgICAgIHRocm91Z2ggZXZhbCgpLCBzbyBub3QgZGVwZW5kZW50IG9uIGxvYWRlZCAub2N0IGxpYnJhcnkKICAgICAgICAgICAgKiBGb3IgT2N0YXZlIHZlcnNpb25zIDMuMS4qIHRvIDMuMy4qLCByZWdpc3RlciBDLWxldmVsIGF0LWV4aXQKICAgICAgICAgICAgICBmdW5jdGlvbiB3aGljaCB0ZXJtaW5hdGVzIE9jdGF2ZSBpbW1lZGlhdGVseSAod2l0aCBjb3JyZWN0CiAgICAgICAgICAgICAgc3RhdHVzIGNvZGUpIHdpdGhvdXQgcGVyZm9ybWluZyBtZW1vcnkgY2xlYW51cC4gVGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgIGNhbiBiZSBjb250cm9sbGVkIHdpdGggbWFjcm9zIGluIExpYi9vY3RhdmUvb2N0cnVudGltZS5zd2cKCiAgICAgICAgICAgIFtPY3RhdmVdIE5ldyBzeW50YXggZm9yIGRldGVybWluZyB3aGV0aGVyIFNXSUcgbW9kdWxlIHNob3VsZCBiZQogICAgICAgICAgICBsb2FkZWQgZ2xvYmFsbHkgb3Igbm9uLWdsb2JhbGx5LiBUbyBsb2FkIG1vZHVsZSAiZXhhbXBsZSIgZ2xvYmFsbHksCiAgICAgICAgICAgIHR5cGUgdGhlIG1vZHVsZSBuYW1lCiAgICAgICAgICAgICQgZXhhbXBsZTsKICAgICAgICAgICAgYXMgYmVmb3JlOyB0byBsb2FkIG1vZHVsZSBub24tZ2xvYmFsbHksIGFzc2lnbiBpdCB0byBhIHZhcmlhYmxlOgogICAgICAgICAgICAkIGV4YW1wbGUgPSBleGFtcGxlOwogICAgICAgICAgICBvcgogICAgICAgICAgICAkIGV4ID0gZXhhbXBsZTsKICAgICAgICAgICAgZm9yIGEgc2hvcnRlciAobG9jYWwpIG1vZHVsZSBuYW1lLiAtZ2xvYmFsLy1ub2dsb2JhbCBjb21tYW5kLWxpbmUKICAgICAgICAgICAgb3B0aW9ucyBhbmQgbW9kdWxlIGNvbW1hbmQgbGluZSBhcmUgZGVwcmVjYXRlZC4gQWRkZWQgdXNhZ2UgaW5mbwogICAgICAgICAgICB0byBtb2R1bGUsIHNvIHR5cGluZwogICAgICAgICAgICAkIGhlbHAgZXhhbXBsZQogICAgICAgICAgICBvciBpbmNvcnJlY3QgdXNhZ2Ugc2hvdWxkIGRpc3BsYXkgcHJvcGVyIHVzYWdlLCB3aXRoIGV4YW1wbGVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMi0wNS0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBtZW1vcnkgbGVhayBpbiBjb2RlIGdlbmVyYXRlZCBmb3IgYSBjYWxsYmFjay4gIFBhdGNoIGZyb20KCSAgICBTRiBidWcgIzM1MTA4MDYuCgoyMDEyLTA1LTEyOiBvbGx5CgkgICAgW1BIUF0gQXZvaWQgdXNpbmcgemVuZF9lcnJvcl9ub3JldHVybigpIGFzIGl0IGRvZXNuJ3Qgd29yayB3aXRoIGFsbAoJICAgIGJ1aWxkcyBvZiBQSFAgKFNGIGJ1ZyAjMzE2NjQyMykuICBJbnN0ZWFkIHdlIG5vdyB3cmFwIGl0IGluIGEKCSAgICBTV0lHX0ZBSUwoKSBmdW5jdGlvbiB3aGljaCB3ZSBhbm5vdGF0ZSBhcyAibm9yZXR1cm4iIGZvciBHQ0MgdG8KCSAgICBhdm9pZHMgd2FybmluZ3MuICBUaGlzIGFsc28gcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgY29tcGlsZWQKCSAgICB3cmFwcGVyIChlLmcuIHRoZSBzdHJpcHBlZCBzaXplIGlzIHJlZHVjZWQgYnkgNiUgZm9yIFhhcGlhbidzIFBIUAoJICAgIGJpbmRpbmdzKS4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiBwYXRjaCAjMzUyMjg1NSBGaXggdW5pbnRlbmRlZCB1bmluaXRpYWxpc2VkIG1lbW9yeSBhY2Nlc3MgaW4gT1VUUFVUIHR5cGVtYXBzLgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGIHBhdGNoICMzNTIyNjc0IEZpeCBwb3NzaWJsZSB1bmluaXRpYWxpc2VkIG1lbW9yeSBhY2Nlc3MgaW4gY2hhciAqKlNUUklOR19PVVQKICAgICAgICAgICAgdHlwZW1hcC4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiBwYXRjaCAjMzUyMjYxMSBGaXggdW5pbml0aWFsaXNlZCBzaXplIHJlZ3Jlc3Npb24gaW4gY2hhciAqKlNUUklOR19BUlJBWQogICAgICAgICAgICBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjYuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBTRiBidWcgIzM1MjUwNTAgLSBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjUgd2hlcmVieSBkZWZpbmluZyBvbmUgdHlwZW1hcAogICAgICAgICAgICBtZXRob2Qgc3VjaCBhcyBhbiAnb3V0JyB0eXBlbWFwIG1heSBoaWRlIGFub3RoZXIgdHlwZW1hcCBtZXRob2Qgc3VjaCBhcyBhbiAnaW4nIHR5cGVtYXAgLQogICAgICAgICAgICBvbmx5IG9jY3VycyB3aGVuIHRoZSB0eXBlIGlzIGEgdGVtcGxhdGUgdHlwZSB3aGVyZSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUKICAgICAgICAgICAgdmlhIGEgdHlwZWRlZi4KCjIwMTItMDUtMTA6IG9sbHkKCSAgICBbUEhQXSBGaXggdGhlIGNvbnN0YW50IHR5cGVtYXBzIGZvciBTV0lHVFlQRSwgZXRjIC0gcHJldmlvdXNseQoJICAgIHRoZXNlIHVzZWQgdGhlIHdyb25nIG5hbWUgZm9yIHJlbmFtZWQgY29uc3RhbnRzLiAgQWRkCgkgICAgYXV0b2RvY19ydW5tZS5waHAgdG8gdGhlIHRlc3RzdWl0ZSBhcyBhIHJlZ3Jlc3Npb24gdGVzdCBmb3IgdGhpcy4KCjIwMTItMDUtMDI6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBSZW1vdmUgY29tcGF0aWJpbGl0eSBzdXBwb3J0IGZvciBnY2NnbyA0LjYuICBVc2luZwoJICAgIFNXSUcgd2l0aCBnY2NnbyB3aWxsIG5vdyByZXF1aXJlIGdjY2dvIDQuNy4gIFVzaW5nIFNXSUcKCSAgICB3aXRoIHRoZSBtb3JlIGNvbW1vbmx5IHVzZWQgZ2MgY29tcGlsZXIgaXMgdW5hZmZlY3RlZC4KCjIwMTItMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnZW5lcmF0ZWQgY29kZSBmb3IgQyBmb3J3YXJkIGVudW0gZGVjbGFyYXRpb25zIGluIHNvbWUgbGFuZ3VhZ2VzLgoKVmVyc2lvbiAyLjAuNiAoMzAgQXByaWwgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMDQtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIGluIFNXSUdUWVBFICoqT1VUUFVUIHR5cGVtYXBzIGFzIHJlcG9ydGVkIGJ5IEppbSBBbmRlcnNvbi4KCjIwMTItMDQtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBjb21waWxhdGlvbiBlcnJvcnMgd2hlbiB3cmFwcGluZyBTVEwgY29udGFpbmVycyBvbiBNYWMgT1MgWCBhbmQgcG9zc2libHkgb3RoZXIgc3lzdGVtcy4KCjIwMTItMDQtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAzNTIxODExIGZyb20gTGVvIERhdmlzIC0gY2hhciAqKlNUUklOR19BUlJBWSB0eXBlbWFwcyBmaXhlZCB0byBoYW5kbGUKICAgICAgICAgICAgbnVsbCBwb2ludGVycy4KClZlcnNpb24gMi4wLjUgKDE5IEFwcmlsIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSBwYXRjaCAjMzUxNzQzNSBmcm9tIE1pbGVzIEJhZGVyIC0gcHJlZmVyIHRvIHVzZSBMdWFfcHVzaGdsb2JhbHRhYmxlCgoyMDEyLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzM1MTc3NjkgZnJvbSBSb2JpbiBTdG9ja2VyIHRvIGZpeCBjb21waWxlIGVycm9yIG9uIE1hY1J1YnkgdXNpbmcgUlNUUklOR19QVFIuCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzUxMTAwOSBmcm9tIExlaWYgTWlkZGVsc2NodWx0ZSBmb3Igc2xpZ2h0bHkgb3B0aW1pc2VkIGNoYXIgKiB2YXJpYWJsZSB3cmFwcGVycy4KCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFwcGx5ICMzMjE5Njc2IGZyb20gU2hhbmUgTGllc2VnYW5nIHdoaWNoIGFkZHM6CiAgICAgICAgICAgIC0gc3VwcG9ydCBmb3IgJWZhY3RvcnkKICAgICAgICAgICAgLSBhIF9fdG9zdHJpbmcgbWV0aG9kCiAgICAgICAgICAgIC0gYSBfX2Rpc293biBtZXRob2QKCjIwMTItMDQtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEFwcGx5ICMzNTEzNTY5IHdoaWNoIGFkZHMgYSBjYXRjaGxpc3QgdG8gdGhlIHhtbCBvdXRwdXQuCgoyMDEyLTA0LTA1OiBvbGx5CgkgICAgW0x1YV0gQWRkIHN1cHBvcnQgZm9yIEx1YSA1LjIgKHBhdGNoIFNGIzM1MTQ1OTMgZnJvbSBNaWxlcyBCYWRlcikKCjIwMTItMDMtMjY6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gQXBwbHkgcGF0Y2ggIzM0MjU5OTMgZnJvbSBqZ2lsbGlzOiBhZGQgZXh0cmEgbG9naWMgdG8gdGhlIG9jdGF2ZV9zd2lnX3R5cGU6OmRpbXModm9pZCkgbWV0aG9kOiBpdCBjaGVja3MgaWYgdGhlIHVzZXIgaGFzIGRlZmluZWQgYSBfX2RpbXNfXyBtZXRob2QgYW5kIHVzZXMgdGhpcyBpbiBzdGVhZCBvZiByZXR1cm5pbmcgKDEsMSkKCSAgICBbb2N0YXZlXSBBcHBseSBwYXRjaCAjMzQyNDgzMyBmcm9tIGpnaWxsaXM6IG1ha2UgaXNfb2JqZWN0IHJldHVybiB0cnVlIGZvciBzd2lnIHR5cGVzCgoyMDEyLTAzLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbRF0gQXBwbHkgIzM1MDI0MzEgdG8gZml4IGR1cGxpY2F0ZSBzeW1ib2xzIGluIG11bHRpcGxlIG1vZHVsZXMuCgoyMDEyLTAzLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0OTQ3OTEgLSAlJGlzZ2xvYmFsIGZvciAlcmVuYW1lIG1hdGNoaW5nLgoKMjAxMi0wMy0yMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDg3NzA2IGFuZCAjMzM5MTkwNiAtIG1pc3Npbmcgc3RkZGVmLmggaW5jbHVkZSBmb3IgcHRyZGlmZl90IHdoZW4gdXNpbmcgJWltcG9ydAogICAgICAgICAgICBmb3IgU1RMIGNvbnRhaW5lcnMgYW5kIGNvbXBpbGluZyB3aXRoIGcrKy00LjYuIEFuIGluY2x1ZGUgb2Ygc3RkZGVmLmggaXMgbm93IG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gU1dJRyBnZW5lcmF0ZXMgU1RMIGhlbHBlciB0ZW1wbGF0ZXMgd2hpY2ggcmVxdWlyZSBwdHJkaWZmX3QuIElmIHlvdSAKICAgICAgICAgICAgd2VyZSBwcmV2aW91c2x5IHJlbHlpbmcgb24gIiNpbmNsdWRlIDxzdGRkZWYuaD4iIGFsd2F5cyBiZWluZyBnZW5lcmF0ZWQgd2hlbiB1c2luZyBhCiAgICAgICAgICAgICVpbmNsdWRlIG9mIGFuIFNUTCBoZWFkZXIsIHlvdSBtYXkgbm93IG5lZWQgdG8gYWRkIHRoaXMgaW4gbWFudWFsbHkuCgoyMDEyLTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzM5MjI2NCBmcm9tIFNlYmFzdGllbiBCaW5lIHRvIHBhcnNlICh1bnNpZ25lZCkgbG9uZyBsb25nIHR5cGVzIGluIGVudW0gdmFsdWUgYXNzaWdubWVudC4KCjIwMTItMDMtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNTA1NTMwIGZyb20gS2FybCBXZXR0ZSB0byBhbGxvdyBjdXN0b20gYWxsb2NhdG9ycyBpbiBTVEwgc3RyaW5nIGNsYXNzZXMgZm9yIHRoZSBVVEwgbGFuZ3VhZ2VzLgoKMjAxMi0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM0NjgzNjIgZnJvbSBLYXJsIFdldHRlIHRvIGZpeCAlaW5jbHVkZSBpbnNpZGUgJWRlZmluZS4KCjIwMTItMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jdGF2ZSwgUl0gRml4ICMzNDc1NDkyIC0gaXRlcmF0aW5nIHRocm91Z2ggc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb2YgZW51bWVyYXRpb25zLgoKMjAxMi0wMi0yNzogeGF2aWVyOTggKHBhdGNoZXMgZnJvbSBLYXJsIFdldHRlKQoJICAgIFtPY3RhdmVdIFVzZSAtZ2xvYmFscyAuIHRvIGxvYWQgZ2xvYmFsIHZhcmlhYmxlcyBpbiBtb2R1bGUgbmFtZXNwYWNlCgkgICAgW09jdGF2ZV0gQ29tbWVudCBkZWNsYXJhdGlvbiBvZiB1bmltcGxlbWVudGVkIGZ1bmN0aW9uIHN3aWdfcmVnaXN0ZXJfZGlyZWN0b3IKCSAgICBbT2N0YXZlXSBGaXggT0NUQVZFX1BBVEggaW4gb2N0YXZlIE1ha2VmaWxlcwoJICAgIFtPY3RhdmVdIEFkZCBzdXBwb3J0IGZvciBzdGQ6Omxpc3QgLSBmaXggbGlfc3RkX2NvbnRhaW5lcnNfaW50IHRlc3QKCSAgICBbT2N0YXZlXSBGaXggaW1wb3J0cyB0ZXN0CgoyMDEyLTAyLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTWFrZSBnZW5lcmF0ZWQgc3VwcG9ydCBmdW5jdGlvbnMgaW4gYXJyYXlzX2phdmEuaSBzdGF0aWMgc28gdGhhdCBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICBmcm9tIG11bHRpcGxlIGluc3RhbmNlcyBvZiBTV0lHIGNhbiBiZSBjb21waWxlZCBhbmQgbGlua2VkIHRvZ2V0aGVyIC0gcHJvYmxlbSByZXBvcnRlZCBieQogICAgICAgICAgICBFdmFuIEtyYXVzZS4KCjIwMTItMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjcmFzaCB3aXRoIGJhZCByZWdleCAtIGJ1ZyAjMzQ3NDI1MC4KCjIwMTItMDEtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBQeXRob24gc3RlcHBlZCBzbGljaW5nIHN1cHBvcnQgdG8gdGhlIFNUTCB3cmFwcGVycyAoc3RkOjp2ZWN0b3IsIHN0ZDo6bGlzdCkuCiAgICAgICAgICAgIEFzc2lnbmluZyB0byBhIHNsaWNlLCByZWFkaW5nIGEgc2xpY2UgYW5kIGRlbGV0aW5nIGEgc2xpY2Ugd2l0aCBzdGVwcyBub3cgd29yay4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD4KCiAgICAgICAgICAgICAgdmkgPSB2ZWN0b3JfaShyYW5nZSgxMCkpCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICB2aVsxOjQ6Ml0gPSBbMTExLCAzMzNdCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aSkKICAgICAgICAgICAgICBkZWwgdmlbMzoxMDozXQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgcHJpbnQgbGlzdCh2aVs6Oi0xXSkKCiAgICAgICAgICAgIGdpdmVzIChzYW1lIGJlaGF2aW91ciBhcyBuYXRpdmUgUHl0aG9uIHNlcXVlbmNlcyBzdWNoIGFzIGxpc3QpOgoKICAgICAgICAgICAgICBbMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOV0KICAgICAgICAgICAgICBbMCwgMTExLCAyLCAzMzMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgICAgICAgICAgWzAsIDExMSwgMiwgNCwgNSwgNywgOF0KICAgICAgICAgICAgICBbOCwgNywgNSwgNCwgMiwgMTExLCAwXQoKMjAxMi0wMS0yMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIENvcnJlY3RseSBhbm5vdGF0ZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIEMgbGlua2FnZS4KICAgICAgICAgICAgW0RdIEV4Y2VwdGlvbiBhbmQgRXJyb3IgaGF2ZSBiZWNvbWUgYmxlc3NlZCBuYW1lczsgcmVtb3ZlZCBkX2V4Y2VwdGlvbl9uYW1lIHRlc3QgY2FzZS4KCjIwMTItMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzb21lIGluZGV4aW5nIGJ1Z3MgaW4gUHl0aG9uIFNUTCB3cmFwcGVycyB3aGVuIHRoZSBpbmRleCBpcyBuZWdhdGl2ZSwgZWc6CgogICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD4KCiAgICAgICAgICAgICAgaXY9dmVjdG9yX2koWzAsMSwyLDMsNCw1XSkKICAgICAgICAgICAgICBpdlstNzpdCgogICAgICAgICAgICBub3cgcmV0dXJucyBbMCwgMSwgMiwgMywgNCwgNV0gaW5zdGVhZCBvZiBbNV0uCgogICAgICAgICAgICAgIHZ2Wzc6OV0gPSBbMjIsMzNdCgogICAgICAgICAgICBub3cgcmV0dXJucyBbMCwgMSwgMiwgMywgNCwgNSwgMjIsIDMzXSBpbnN0ZWFkIG9mICJpbmRleCBvdXQgcmFuZ2UiIGVycm9yLgoKICAgICAgICAgICAgQWxzbyBmaXggc29tZSBzZWdmYXVsdHMgd2hlbiByZXBsYWNpbmcgcmFuZ2VzLCBlZyB3aGVuIGlsIGlzIGEgc3RkOjpsaXN0IHdyYXBwZXI6CgogICAgICAgICAgICAgIGlsWzA6Ml0gPSBbMTFdCgoyMDEyLTAxLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9uIHdpdGhpbiBhIGNsYXNzIHdoZW4gdXNlZCBhcyBhIGJhc2UuCgoyMDEyLTAxLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdXBwb3J0IGZvciAlbnNwYWNlIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgoKMjAxMi0wMS0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMzNDUyNTYwIGZyb20gQnJhbnQgS3lzZXIgLSBhZGQgc3VwcG9ydCBmb3IgJW5zcGFjZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTEtMTItMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSAnZGlyZWN0b3JpbicgdHlwZW1hcCBub3cgYWNjZXB0cyAkMSwgJDIgZXRjIGV4cGFuc2lvbnMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gdXNlIHdvcmthcm91bmRzIC0KICAgICAgICAgICAgJDFfbmFtZSwgJDJfbmFtZSBldGMuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIGRpcmVjdG9yIHR5cGVtYXBzLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBHbywgSmF2YSwgRF0gQWRkIHN1cHBvcnQgZm9yIHRoZSAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXAuCgoyMDExLTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWwsIE9jdGF2ZSwgUEhQLCBQeXRob24sIFJ1YnldIENvcnJlY3Qgc3BlY2lhbCB2YXJpYWJsZXMgaW4gJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIGNoYW5nZSB3aWxsIGJyZWFrIGFueSAnZGlyZWN0b3JhcmdvdXQnIHR5cGVtYXBzIHlvdSBtYXkgaGF2ZSB3cml0dGVuLiBQbGVhc2UgY2hhbmdlOgogICAgICAgICAgICAgICRyZXN1bHQgdG8gJDEKICAgICAgICAgICAgICAkaW5wdXQgdG8gJHJlc3VsdAoKICAgICAgICAgICAgQWxzbyBmaXggdGhlIG5hbWVkICdkaXJlY3RvcmFyZ291dCcgRElSRUNUT1JPVVQgdHlwZW1hcHMgZm9yIHRoZXNlIGxhbmd1YWdlcyB3aGljaCBkaWRuJ3QKICAgICAgICAgICAgcHJldmlvdXNseSBjb21waWxlIGFuZCBhZGQgaW4gJDEsICQyIGV0YyBleHBhbnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDExLTEyLTEwOiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNXSUdfZXJyb3IoKSBub3cgZ2V0cyBkZWNvcmF0ZWQgd2l0aCBwZXJsIHNvdXJjZSBmaWxlL2xpbmUgbnVtYmVyLgogICAgICAgICAgICBbcGVybDVdIGVycm9yIGhhbmRsaW5nIG5vdyBjb25mb3JtcyB0byBwdWJsaWMgWFMgYXBpIChmaXhlcyBwZXJsIHY1LjE0IGlzc3VlKS4KCjIwMTEtMTItMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtBbmRyb2lkL0phdmFdIEZpeCBkaXJlY3RvcnMgdG8gY29tcGlsZSBvbiBBbmRyb2lkLgoKICAgICAgICAgICAgQWRkZWQgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMgZm9yIEFuZHJvaWQuCgoyMDExLTEyLTA4OiB2YWR6CgkgICAgQnVnIGZpeDogSGFuZGxlIG1ldGhvZHMgcmVuYW1lZCBvciBpZ25vcmVkIGluIHRoZSBiYXNlIGNsYXNzIGNvcnJlY3RseSBpbiB0aGUgZGVyaXZlZCBjbGFzc2VzCgkgICAgKHRoZXkgY291bGQgYmUgc29tZXRpbWVzIG15c3RlcmlvdXNseSBub3QgcmVuYW1lZCBvciBpZ25vcmVkIHRoZXJlIGJlZm9yZSkuCgoyMDExLTEyLTAzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRml4IGV4Y2VwdGlvbiBnbHVlIGNvZGUgZm9yIG5ld2VyIERNRCAyIHZlcnNpb25zLgogICAgICAgICAgICBbRF0gRG8gbm90IGRlZmF1bHQgdG8gMzIgYml0IGdsdWUgY29kZSBmb3IgRE1EIGFueW1vcmUuCiAgICAgICAgICAgIFtEXSBVc2Ugc3RkYy5jb25maWcuY19sb25nL2NfdWxvbmcgdG8gcmVwcmVzZW50IEMgbG9uZyB0eXBlcy4KCjIwMTEtMTItMDE6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIGJ1ZyAzNDQ3NDI2OiBtZW1vcnkgbGVhayBpbiB2ZWN0b3IuX19nZXRpdGVtX18uCgoyMDExLTExLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUmVtb3ZlIEMrKyBjb21tZW50cyBmcm9tIGdlbmVyYXRlZCBDIGNvZGUuCgoyMDExLTExLTI3OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHNvbWUgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpdGgKCSAgICBjZXJ0YWluIEdDQyB3YXJuaW5nIG9wdGlvbnMgKERlYmlhbiBidWcgIzY1MDI0NikuCgoyMDExLTExLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM0MzM1NDEgJXR5cGVtYXAoaW4sIG51bWlucHV0cz0wKSB3aXRoIDEwKyBhcmd1bWVudHMuCgoyMDExLTExLTI4OiBvbGx5CgkgICAgW1BlcmxdIEZpeCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlcnMgd2l0aCBjZXJ0YWluCgkgICAgR0NDIHdhcm5pbmcgb3B0aW9ucyAoRGViaWFuIGJ1ZyAjNDM2NzExKS4KCjIwMTEtMTEtMjg6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUga2V5d29yZCBsaXN0IHRvIGluY2x1ZGUga2V5d29yZHMgYWRkZWQgaW4gUEhQIHJlbGVhc2VzIHVwIHRvIDUuMy4KCjIwMTEtMTEtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHJvdmlkZSBhbiBlYXN5IHdheSB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2aXNpYmlsaXR5IGZvciB0aGUgcHJveHkgY2xhc3MgcG9pbnRlcgogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGdldENQdHIoKSBtZXRob2QuIFRoZSB2aXNpYmlsaXR5IGlzICdpbnRlcm5hbCcgYnkgZGVmYXVsdCBhbmQgaWYgbXVsdGlwbGUKICAgICAgICAgICAgU1dJRyBtb2R1bGVzIGFyZSBiZWluZyB1c2VkIGFuZCBjb21waWxlZCBpbnRvIGRpZmZlcmVudCBhc3NlbWJsaWVzLCB0aGVuIHRoZXkgbmVlZCB0byBiZSAKICAgICAgICAgICAgJ3B1YmxpYycgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb25zdHJ1Y3RvciBvciBnZXRDUHRyKCkgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgYXNzZW1ibHkuCiAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBjaGFuZ2UgdGhlIHZpc2liaWxpdGllcyBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzczoKCiAgICAgICAgICAgICAgU1dJR19DU0JPRFlfUFJPWFkocHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQogICAgICAgICAgICAgIFNXSUdfQ1NCT0RZX1RZUEVXUkFQUEVSKHB1YmxpYywgcHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQoKICAgICAgICAgICAgW0phdmFdIFByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgdGhlIHByb3h5IGNsYXNzIHBvaW50ZXIKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBnZXRDUHRyKCkgbWV0aG9kLiBUaGUgdmlzaWJpbGl0eSBpcyAncHJvdGVjdGVkJyBieSBkZWZhdWx0IGFuZCBpZiBtdWx0aXBsZQogICAgICAgICAgICBTV0lHIG1vZHVsZXMgYXJlIGJlaW5nIHVzZWQgYW5kIGNvbXBpbGVkIGludG8gZGlmZmVyZW50IHBhY2thZ2VzLCB0aGVuIHRoZXkgbmVlZCB0byBiZSAKICAgICAgICAgICAgJ3B1YmxpYycgaW4gb3JkZXIgdG8gdXNlIHRoZSBjb25zdHJ1Y3RvciBvciBnZXRDUHRyKCkgbWV0aG9kIGZyb20gYSBkaWZmZXJlbnQgcGFja2FnZS4KICAgICAgICAgICAgVXNlIHRoZSBmb2xsb3dpbmcgbWFjcm9zIHRvIGNoYW5nZSB0aGUgdmlzaWJpbGl0aWVzIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzOgoKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1BST1hZKHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1RZUEVXUkFQUEVSKHB1YmxpYywgcHVibGljLCBwdWJsaWMsIFNXSUdUWVBFKQoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgZm9yIEphdmEgaGFzIGNoYW5nZWQgZnJvbSBwdWJsaWMgdG8gcHJvdGVjdGVkIGZvciB0aGUgcHJveHkgY2xhc3Nlcy4gVXNlIHRoZQogICAgICAgICAgICBTV0lHX0pBVkFCT0RZX1BST1hZIG1hY3JvIGFib3ZlIHRvIHJlc3RvcmUgdG8gdGhlIHByZXZpb3VzIHZpc2liaWxpdGllcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTEtMTEtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIEJ1ZyAzNDQwMDQ0OiAjaWZkZWYgb3V0IFNXSUdfUHl0aG9uX05vbkR5bmFtaWNTZXRBdHRyIGlmIC1idWlsdGluCgkgICAgaXNuJ3QgYmVpbmcgdXNlZCwgdG8gYXZvaWQgdW5uZWNlc3NhcnkgYmluYXJ5IGluY29tcGF0aWJpbGl0aWVzIGJldHdlZW4KCSAgICBweXRob24gaW5zdGFsbGF0aW9ucy4KCjIwMTEtMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1ZyBmaXg6IFJlbW92ZSByb290IGRpcmVjdG9yeSBmcm9tIGRpcmVjdG9yeSBzZWFyY2ggbGlzdCBpbiBXaW5kb3dzLgoKMjAxMS0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzNDIxODc2IGZyb20gUm9iaW4gU3RvY2tlciB0byBmaXggIzM0MTY4MTggLSBzYW1lIGNsYXNzIG5hbWUgaW4gCiAgICAgICAgICAgIGRpZmZlcmVudCBuYW1lc3BhY2VzIGNvbmZ1c2lvbiB3aGVuIHVzaW5nIG11bHRpcGxlIG1vZHVsZXMuCgoyMDExLTExLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGNyZS1idWlsZC5zaCB0byB3b3JrIHdpdGggbm9uLWNvbXByZXNzZWQgdGFyYmFsbHMgLSBwcm9ibGVtIHJlcG9ydGVkIGJ5IEFkcmlhbiBCbGFrZWx5LgoKMjAxMS0xMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRXhwYW5kIHNwZWNpYWwgdmFyaWFibGVzIGluIHR5cGVtYXAgd2FybmluZ3MsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbiwgd2FybmluZz0iMTAwMDpUZXN0IHdhcm5pbmcgZm9yICdpbicgdHlwZW1hcCBmb3IgJDFfdHlwZSAkMV9uYW1lIikgaW50ICIuLi4iCgoyMDExLTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbmFtZWQgb3V0cHV0IHR5cGVtYXBzIG5vdCBiZWluZyB1c2VkIHdoZW4gdGhlIHN5bWJvbCB1c2VzIGEgcXVhbGlmaWVyIGFuZCBjb250YWlucwogICAgICAgICAgICBhIG51bWJlciwgZWc6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgZG91YmxlIEFCQzo6bTEgIi4uLiIKCjIwMTEtMTAtMjQ6IHRhbGJ5CiAgICAgICAgICAgIFtwZXJsNV0gU0YgYnVnICMzNDIzMTE5IC0gb3ZlcmxvYWQgZGlzcGF0Y2ggc3RhY2sgY29ycnVwdGlvbiBmaXguICBCZXR0ZXIsIGJ1dCBtb3JlIHJlc2VhcmNoCiAgICAgICAgICAgIGlzIG5lZWRlZCBvbiBhIHN0YWJsZSBwYXRoIGZvciB0YWlsIGNhbGxzIGluIFhTLgoKICAgICAgICAgICAgQWxzbywgZml4IGZvciBsYXJnZSBsb25nIGxvbmdzIGluIDMyIGJpdCBwZXJsLgoKMjAxMS0xMC0xMzogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBBbGxvdyBPY3RhdmUgbW9kdWxlcyB0byBiZSByZS1sb2FkZWQgYWZ0ZXIgYSAiY2xlYXIgYWxsIi4KCjIwMTEtMDktMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gc3dpZy0yLjAuMSByZXBvcnRlZCBieSBUZWVtdSBJa29ub25lIGxlYWRpbmcgdG8gdW5jb21waWxhYmxlIGNvZGUKICAgICAgICAgICAgd2hlbiB1c2luZyB0eXBlZGVmIGFuZCBmdW5jdGlvbiBwb2ludGVyIHJlZmVyZW5jZXMsIGZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgRk4oY29uc3QgaW50ICZhLCBpbnQgYik7CiAgICAgICAgICAgICAgdm9pZCAqdHlwZWRlZl9jYWxsMShGTiAqJiBwcmVjYWxsYmFjaywgRk4gKiBwb3N0Y2FsbGJhY2spOwoKMjAxMS0wOS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUGF0Y2ggIzM0MDgwMTIgZnJvbSBSYW1hbiBHb3BhbGFuIC0gYWRkIHN1cHBvcnQgZm9yIGVtYmVkZGVkIEx1YSAoZUx1YSkKICAgICAgICAgICAgaW5jbHVkaW5nIG9wdGlvbnMgZm9yIHRhcmdldGluZyBMdWEgVGlueSBSQU0gKExUUikuCgoyMDExLTA5LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBib29zdF9pbnRydXNpdmVfcHRyLmkgbGlicmFyeSBjb250cmlidXRpb24gZnJvbSBwYXRjaCAjMzQwMTU3MS4KCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB3YXJuaW5ncyBmb3IgYmFkbHkgbmFtZWQgZGVzdHJ1Y3RvcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgS1N0cnVjdCB7CiAgICAgICAgICAgICAgICB+Tk9UX0tTdHJ1Y3QoKSB7fQogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBjcHBfZXh0ZW5kX2Rlc3RydWN0b3JzLmk6OTI6IFdhcm5pbmcgNTIxOiBJbGxlZ2FsIGRlc3RydWN0b3IgbmFtZSB+Tk9UX0tTdHJ1Y3QuIElnbm9yZWQuCgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWV4dGVuZCBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRlbXBsYXRlcy4gVGhlIGRlc3RydWN0b3IgaW4gJWV4dGVuZCB3YXMgbm90IGFsd2F5cyB3cmFwcGVkLAogICAgICAgICAgICBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4dGVuZCBGb29UIHsKICAgICAgICAgICAgICAgIH5Gb29UKCkgeyBkZWxldGUgJHNlbGY7IH0gLy8gd2FzIG5vdCB3cmFwcGVkIGFzIGV4cGVjdGVkCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb29UIHt9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29UaSkgRm9vVDxpbnQ+OwoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNwZWNpYWwgdmFyaWFibGVzIHN1Y2ggYXMgIiRkZWNsIiBhbmQgIiRmdWxsZGVjbCIgaW4gZGVzdHJ1Y3RvcnMgdG8gaW5jbHVkZSB0aGUgfiBjaGFyYWN0ZXIuCgoyMDExLTA5LTEwOiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNGIGJ1ZyAjMTQ4MTk1OCAtIEltcHJvdmUgcmFuZ2UgY2hlY2tpbmcgZm9yIGludGVnZXIgdHlwZXMuCiAgICAgICAgICAgIEVuaGFuY2UgbGlfdHlwZW1hcHNfcnVubWUucGwKCjIwMTEtMDktMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZXh0ZW5kIG9uIHR5cGVkZWYgY2xhc3NlcyBpbiBhIG5hbWVzcGFjZSB1c2luZyB0aGUgdHlwZWRlZiBuYW1lLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAlZXh0ZW5kIENTdHJ1Y3QgewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHRhZ0NTdHJ1Y3QgeyAuLi4gfSBDU3RydWN0OwogICAgICAgICAgICB9CgoyMDExLTA4LTMxOiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIHBhdGNoZXMgZnJvbSBLYXJsIFdldHRlOiBpbXByb3ZlbWVudHMgdG8gbW9kdWxlIGxvYWRpbmcgYmVoYXZpb3I7CgkgICAgYWRkZWQgZXhhbXBsZSBvZiBmcmllbmQgb3BlcmF0b3IgdG8gb3BlcmF0b3IgZXhhbXBsZTsgZml4ZWQgb2N0YXZlIHBhbmljL2NyYXNoIGluIDMuMC41OwoJICAgIGRvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzCgoyMDExLTA4LTMwOiBzemFnZXIKCSAgICBbcHl0aG9uXSBCdWcgMzQwMDQ4NiwgZml4IGVycm9yIHNpZ25hbGxpbmcgZm9yIGJ1aWx0LWluIGNvbnN0cnVjdG9ycy4KCjIwMTEtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHb10gRml4IGZpbGUvbGluZSBudW1iZXIgZGlzcGxheSBmb3IgImdvdHlwZSIgd2hlbiB1c2luZyB0eXBlbWFwIGRlYnVnZ2luZyBvcHRpb25zCiAgICAgICAgICAgIC10bXNlYXJjaCBhbmQgLXRtdXNlZC4KCjIwMTEtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgRF0gRml4ICVjYWxsYmFjayB3aGljaCB3YXMgZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgY29kZS4KCjIwMTEtMDgtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBjb25zdHJ1Y3RvcnMgaW4gbmFtZWQgdHlwZWRlZiBjbGFzcyBkZWNsYXJhdGlvbnMgYXMgcmVwb3J0ZWQgYnkgR3JlZ29yeSBCcm9ubmVyOgoKICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgQSgpe30gLy8gQ29uc3RydWN0b3Igd2hpY2ggd2FzIG5vdCBhY2NlcHRlZCBieSBTV0lHCiAgICAgICAgICAgICAgQigpe30gLy8gTk9UIGEgY29uc3RydWN0b3IgLS1pbGxlZ2FsLCBidXQgd2FzIGFjY2VwdGVkIGJ5IFNXSUcKICAgICAgICAgICAgfSBCOwoKICAgICAgICAgICAgRm9yIEMgY29kZSwgdGhlIGZpeCBub3cgcmVzdWx0cyBpbiB0aGUgdXNlIG9mICdzdHJ1Y3QgQSAqJyBpbnN0ZWFkIG9mIGp1c3QgJ0IgKicgaW4KICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBjb2RlIHdoZW4gd3JhcHBpbmcgbWVtYmVycyBpbiBBLCBidXQgdWx0aW1hdGVseSB0aGlzIGRvZXMgbm90IG1hdHRlciwgYXMKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgdGhpbmcuCgoyMDExLTA4LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJW5ld29iamVjdCB3aGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCAlZmVhdHVyZSgicmVmIikgYXMgcmVwb3J0ZWQgYnkgSmFuIEJlY2tlci4gVGhlCiAgICAgICAgICAgIGNvZGUgZnJvbSB0aGUgInJlZiIgZmVhdHVyZSB3YXMgbm90IGFsd2F5cyBiZWluZyBnZW5lcmF0ZWQgZm9yIHRoZSBmdW5jdGlvbiBzcGVjaWZpZWQgYnkgJW5ld29iamVjdC4KICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBmb3IgInJlZiIgYW5kICJ1bnJlZiIgbW92ZWQgZnJvbSBQeXRob24gdG8gdGhlIEMrKyBjaGFwdGVyLgoKMjAxMS0wOC0yMjogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4ZWQgbWVtb3J5IGxlYWsgd2l0aCAtLWJ1aWx0aW4gb3B0aW9uIChidWcgMzM4NTA4OSkuCgoyMDExLTA4LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBTRiBwYXRjaCAjMzM5NDMzOSBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZiAtIG5ldyBvcHRpb24gLW5vbW9kdWxlZ2xvYmFsIHRvIGRpc2FibGUgaW5zdGFsbGluZyAKICAgICAgICAgICAgdGhlIG1vZHVsZSB0YWJsZSBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBSZXF1aXJlIGNhbGwgYWxzbyByZXR1cm5zIHRoZSBtb2R1bGUgdGFibGUgaW5zdGVhZCAKICAgICAgICAgICAgb2YgYSBzdHJpbmcuCgoyMDExLTA4LTA5OiB4YXZpZXI5OAogICAgICAgICAgICBGaXggYnVnIDMzODczOTQ7IE9jdGF2ZSBwYXRjaGVzIGZvciAzLjQuMCBjb21wYXRpYmlsaXR5LCBldGMuIChmcm9tIEthcmwgV2V0dGUpCgoyMDExLTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gJHN5bW5hbWUgZXhwYW5zaW9uIGZvciBkaXJlY3RvciBtZXRob2RzLgoKMjAxMS0wNy0yOTogb2xseQoJICAgIFtQSFBdIERvbid0IGdlbmVyYXRlICJyZXR1cm4gJHI7IiBpbiBjYXNlcyB3aGVyZSAkciBoYXNuJ3QgYmVlbiBzZXQuCgkgICAgVGhpcyB3YXMgYmFzaWNhbGx5IGhhcm1sZXNzLCBleGNlcHQgaXQgZ2VuZXJhdGVkIGEgUEhQIEVfTk9USUNFIGlmCgkgICAgdGhlIGNhbGxpbmcgY29kZSBoYWQgZW5hYmxlZCB0aGVtLgoKMjAxMS0wNy0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNjb3Bpbmcgb2YgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgbmVzdGVkIHdpdGhpbiBhIGNsYXNzIChmb3IgQysrKS4gUHJldmlvdXNseSB0aGUgc3ltYm9sCiAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBwdXQgaW50byB0aGUgb3V0ZXIgbmFtZXNwYWNlLCBlZwoKICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgS2V5LCBjbGFzcyBUPiBzdHJ1Y3QgbWFwIHsKICAgICAgICAgICAgICAgIGNsYXNzIGl0ZXJhdG9yOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGl0ZXJhdG9yIHdhcyBzY29wZWQgYXMgc3RkOjppdGVyYXRvciwgYnV0IG5vdyBpdCBpcyBjb3JyZWN0bHkgc3RkOjptYXA8S2V5LCBUPjo6aXRlcmF0b3I7CgogICAgICAgICAgICBBbHNvIGZpeGVkIGlzICV0ZW1wbGF0ZSBhbmQgdGVtcGxhdGUgcGFyYW1ldGVycyB0aGF0IGFyZSBhIHR5cGVkZWYgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbnMKICAgICAgICAgICAgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCBlZzoKCiAgICAgICAgICAgIG5hbWVzcGFjZSBTdGQgewogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVCwgY2xhc3MgQyA9IGludD4gc3RydWN0IE1hcCB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIEtleSBrZXlfdHlwZTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgVCBtYXBwZWRfdHlwZTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIERPVUJMRTsKICAgICAgICAgICAgJXRlbXBsYXRlKE1NKSBTdGQ6Ok1hcDxpbnQsIERPVUJMRT47CgogICAgICAgICAgICBBbGwgc3ltYm9scyB3aXRoaW4gTWFwIHdpbGwgYmUgcmVzb2x2ZWQgY29ycmVjdGx5LCBlZyBrZXlfdHlwZSBhbmQgbWFwcGVkX3R5cGUgbm8gbWF0dGVyIGlmIHRoZQogICAgICAgICAgICB3cmFwcGVkIGNvZGUgdXNlcyBTdGQ6Ok1hcDxpbnQsIGRvdWJsZT4gb3Igc3RkOjpNYXA8aW50LCBET1VCTEU+IG9yIFN0ZDo6TWFwPGludCwgZG91YmxlLCBpbnQ+CgogICAgICAgICAgICBBbHNvIGZpeGVzIGJ1ZyAjMzM3ODE0NSAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAyLjAuNCAtICV0ZW1wbGF0ZSB1c2luZyB0cmFpdHMuCgoyMDExLTA3LTIwICBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXggY2xvc3VyZSBmb3IgdHBfY2FsbCBzbG90LgoKMjAxMS0wNy0xNjogd3NmdWx0b24KCSAgICBbcHl0aG9uXSBGaXggZGlyZWN0b3IgdHlwZW1hcCB1c2luZyBQeU9iamVjdCAqLgoKMjAxMS0wNy0xMzogc3phZ2VyCgkgICAgW3B5dGhvbl0gU0YgcGF0Y2ggIzMzNjU5MDggLSBBZGQgYWxsIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gbWFwIHN1cHBvcnQgY29kZSBpbiBzdGRfbWFwLmkKCjIwMTEtMDctMTM6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeCBmb3IgYnVnIDMzMjQ3NTM6ICVyZW5hbWUgbWVtYmVyIHZhcmlhYmxlcyB3aXRoIC1idWlsdGluLgoKMjAxMS0wNy0wMTogd3NmdWx0b24KCSAgICBGaXggc29tZSBzY29wZSBhbmQgc3ltYm9sIGxvb2t1cCBwcm9ibGVtcyB3aGVuIHRlbXBsYXRlIGRlZmF1bHQgcGFyYW1ldGVycyBhcmUgYmVpbmcKICAgICAgICAgICAgdXNlZCB3aXRoIHR5cGVkZWYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgWFgsIHR5cGVuYW1lIFRUID0gU29tZVR5cGU+IHN0cnVjdCBGb28gewogICAgICAgICAgICAgIHR5cGVkZWYgWFggWDsKICAgICAgICAgICAgICB0eXBlZGVmIFRUIFQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFRUPiBzdHJ1Y3QgVXNlc0ZvbyB7CiAgICAgICAgICAgICAgdm9pZCB4KHR5cGVuYW1lIEZvbzxUVD46OlQsIHR5cGVuYW1lIEZvbzxUVD46OlgpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICAgQWxzbyBmaXhlcyB1c2Ugb2Ygc3RkOjp2ZWN0b3I8aW50Pjo6c2l6ZV90eXBlIGZvciBQeXRob24gYXMgcmVwb3J0ZWQgYnkgQXVicmV5IEJhcm5hcmQuCgoyMDExLTA2LTIzOiBvbGx5CgkgICAgW1BIUF0gRml4IGRpcmVjdG9yIGNvZGUgdG8gd29yayB3aGVuIFBIUCBpcyBidWlsdCB3aXRoIFpUUyBlbmFibGVkLAoJICAgIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCBjb25maWd1cmF0aW9uIG9uIE1pY3Jvc29mdCBXaW5kb3dzLgoKMjAxMS0wNi0yMTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gdmFyaW91cyBzbWFsbCB0d2Vha3MgYW5kIGJ1ZyBmaXhlcy4KCSAgICAtIEF2b2lkIG5hbWUgY29uZmxpY3RzIGJldHdlZW4gc21hcnQgcG9pbnRlciB3cmFwcGVycyBhbmQgdGhlIHdyYXBwZXJzIGZvcgoJICAgIHRoZSBhY3R1YWwgY2xhc3MuCgkgICAgLSBGaXggZGVmYXVsdCB0eXBlbWFwcyBmb3IgQyBiaW5kaW5ncywgd2hpY2ggd2VyZSBpbmNvcnJlY3RseSBhdHRlbXB0aW5nIHRvCgkgICAgY2FsbCBub24tZXhpc3RlbnQgZGVzdHJ1Y3RvcnMgb24gdXNlci1kZWZpbmVkIHR5cGVzLgoJICAgIC0gTmV3IGZlYXR1cmUsIGZlYXR1cmU6YWNsbWl4aW5zLCBmb3IgYWRkaW5nIHN1cGVyY2xhc3MgdG8gdGhlIGZvcmVpZ24gY2xhc3MKCSAgICB3cmFwcGVycy4KCSAgICAtIEltcHJvdmUgbG9uZ2xvbmcgdHlwZW1hcHMuCgoyMDExLTA2LTE5OiB3c2Z1bHRvbgoJICAgIEZpeCBpbmNvcnJlY3QgdHlwZW1hcHMgYmVpbmcgdXNlZCBmb3IgYSBzeW1ib2wgd2l0aGluIGEgdGVtcGxhdGVkIHR5cGUsIGVnOgogICAgICAgICAgICBBPGludD46OnZhbHVlX3R5cGUgd291bGQgaW5jb3JyZWN0bHkgdXNlIGEgdHlwZW1hcCBmb3IgdHlwZSBBLgoKMjAxMS0wNi0xODogb2xseQoJICAgIFtUY2xdIEZpeCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgaW4gbWlkZGxlIG9mIGJsb2NrcyB3aGljaCBpc24ndAoJICAgIHBlcm1pdHRlZCBpbiBDOTAgKGlzc3VlIHByb2JhYmx5IGludHJvZHVjZWQgaW4gMi4wLjMgYnkgcGF0Y2ggIzMyMjQ2NjMpLgoJICAgIFJlcG9ydGVkIGJ5IFBhdWwgT2Jlcm1laWVyIGluIFNGIzMyODg1ODYuCgoyMDExLTA2LTE3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBTRiAjMzMxMjUwNSAtIHNsaWdodGx5IGVhc2llciB0byB3cmFwIGNoYXJbXSBvciBjaGFyW0FOWV0gd2l0aCBhIEphdmEgYnl0ZVtdCiAgICAgICAgICAgIHVzaW5nIGFycmF5c19qYXZhLmkuCgoyMDExLTA2LTEzOiB3c2Z1bHRvbgoJICAgIFtSdWJ5LCBPY3RhdmVdIFNGICMzMzEwNTI4IEF1dG9kb2MgZml4ZXMgc2ltaWxhciB0byB0aG9zZSBkZXNjcmliZWQgYmVsb3cgZm9yIFB5dGhvbi4KCjIwMTEtMDYtMTA6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRmV3IHN1YnRsZSBidWdmaXhlcyBpbiBhdXRvZG9jIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiwKICAgICAgICAgICAgLSBVbm5hbWVkIGFyZ3VtZW50IG5hbWVzIGZpeCBmb3IgYXV0b2RvYyBsZXZlbHMgPiAwLgogICAgICAgICAgICAtIERpc3BsYXkgb2YgdGVtcGxhdGUgdHlwZXMgZml4ZWQgZm9yIGF1dG9kb2MgbGV2ZWxzID4gMS4KICAgICAgICAgICAgLSBGaXggU0YgIzMzMTA1MjggLSBkaXNwbGF5IG9mIHR5cGVkZWYgc3RydWN0cyBmb3IgYXV0b2RvYyBsZXZlbHMgPiAxLgogICAgICAgICAgICAtIEFkZCBtaXNzaW5nIHR5cGUgZm9yIHNlbGYgZm9yIGF1dG9kb2MgbGV2ZWxzIDEgYW5kIDMuCiAgICAgICAgICAgIC0gYXV0b2RvYyBsZXZlbHMgMiBhbmQgMyBkb2N1bWVudGVkLgogICAgICAgICAgICAtIE1pbm9yIHR3ZWFrcyB0byBhdXRvZG9jIHN0eWxlIHRvIGNvbmZvcm0gd2l0aCBQRVA4LgoKMjAxMS0wNS0zMDogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBkaXJlY3RvcnMgd2hlbiAtcHJlZml4IGlzIHVzZWQuCgoyMDExLTA1LTI0OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIG1ldGhvZHMgb2YgY2xhc3NlcyB3aXRoIGEgdmlydHVhbCBiYXNlIGNsYXNzIChTRiMzMTI0NjY1KS4KClZlcnNpb24gMi4wLjQgKDIxIE1heSAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW0d1aWxlXSBQYXRjaCAjMzE5MTYyNSBmaXhpbmcgb3ZlcmxvYWRpbmcgb2YgaW50ZWdlciB0eXBlcy4KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW1BlcmxdIFBhdGNoICMzMjYwMjY1IGZpeGluZyBvdmVybG9hZGluZyBvZiBub24tcHJpbWl0aXZlIHR5cGVzIGFuZCBpbnRlZ2VycyBpbiAKICAgICAgICAgICAgUGVybCA1LjEyIGFuZCBsYXRlci4KCjIwMTEtMDUtMTk6IHdzZnVsdG9uCgkgICAgW1J1YnldIEZpeCAlaW1wb3J0IHdoZXJlIG9uZSBvZiB0aGUgaW1wb3J0ZWQgZmlsZXMgJWluY2x1ZGUgb25lIG9mIHRoZSBTVEwgaW5jbHVkZQogICAgICAgICAgICBmaWxlcyBzdWNoIGFzIHN0ZF92ZWN0b3IuaS4KCjIwMTEtMDUtMTc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFwcGx5ICMzMjg5ODUxIGZyb20gQWxhbiBIYXJkZXIgdG8gZml4IG1lbW9yeSBsZWFrIGluIGRpcmVjdG9ycyB3aGVuIGNoZWNraW5nCiAgICAgICAgICAgIGZvciBwZW5kaW5nIGV4Y2VwdGlvbnMuCgoyMDExLTA1LTE3OiB3c2Z1bHRvbgoJICAgIFtUY2xdIEFwcGx5ICMzMzAwMDcyIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHRvIGZpeCBtdWx0aXBsZSBtb2R1bGUgbG9hZGluZyBub3QKICAgICAgICAgICAgYWx3YXlzIHNoYXJpbmcgdmFyaWFibGVzIGFjcm9zcyBtb2R1bGVzLgoKMjAxMS0wNS0xNjogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBGaXggYW4gaW5jb21wYXRpYmlsaXR5IHdpdGggbmV2ZXIgdmVyc2lvbnMgb2YgT2N0YXZlLiBDYXNlIG9uIE9jdGF2ZQoJICAgIEFQSSA+PSA0MCB0byBoYW5kbGUgcmVuYW1lIG9mIE9jdGF2ZV9tYXAgdG8gb2N0YXZlX21hcC4KCSAgICBbb2N0YXZlXSBBZGQgc3VwcG9ydCBmb3IgeS5fX3JvcF9fKHgpIG9wZXJhdG9ycyB3aGVuIHguX19vcF9fKHkpIGRvZXNuJ3QgZXhpc3QuCgkgICAgW29jdGF2ZV0gQWxsb3cgZ2xvYmFsIG9wZXJhdG9ycyB0byBiZSBkZWZpbmVkIGJ5IFNXSUctd3JhcHBlZCBmdW5jdGlvbnMuCgkgICAgW29jdGF2ZV0gRml4IHNldmVyYWwgYnVncyBhcm91bmQgbW9kdWxlIG5hbWVzcGFjZXM7IGFkZCAtZ2xvYmFsLCAtbm9nbG9iYWwsCgkgICAgLWdsb2JhbHMgPG5hbWU+IGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIHRoZSBtb2R1bGUuCgoyMDExLTA1LTE0OiB3c2Z1bHRvbgoJICAgICV2YXJhcmdzIHdoZW4gdXNlZCB3aXRoIGEgbnVtZXJpYyBhcmd1bWVudCB1c2VkIHRvIGNyZWF0ZSBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IAogICAgICAgICAgICB3aGljaCB3YXMgaW50ZW5kZWQgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZWQgc2VudGluZWwgdmFsdWUuIFRoaXMgbmV2ZXIgd29ya2VkIGFuZCBub3cKICAgICAgICAgICAgdGhlIGFkZGl0aW9uYWwgYXJndW1lbnQgaXMgbm90IGdlbmVyYXRlZC4KCjIwMTEtMDUtMTM6IHdzZnVsdG9uCgkgICAgW3B5dGhvbl0gQWRkaXRpb25hbCBmaXhlcyBmb3IgcHl0aG9uMy4yIHN1cHBvcnQuCgoyMDExLTA1LTA3OiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBQeUdldFNldERlc2NyIGZvciBweXRob24zLjIuCgoyMDExLTA1LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhLCBQeXRob24sIFRjbF0gQy9DKysgcHJvdG90eXBlcyBzaG93biBpbiBlcnJvciBtZXNzYWdlIHdoZW4gY2FsbGluZyBhbiBvdmVybG9hZGVkCiAgICAgICAgICAgIG1ldGhvZCB3aXRoIGluY29ycmVjdCBhcmd1bWVudHMgaW1wcm92ZWQgdG8gc2hvdyBhbHdheXMgc2hvdyBmdWxseSBxdWFsaWZpZWQgbmFtZQogICAgICAgICAgICBhbmQgaWYgYSBjb25zdCBtZXRob2QuIAoKICAgICAgICAgICAgQWxzbyBmaXhlZCBvdGhlciBMdWEgZXJyb3IgbWVzc2FnZXMgaW4gZ2VuZXJhdGVkIGNvZGUgd2hpY2ggd2VyZW4ndCBjb25zaXN0ZW50bHkKICAgICAgICAgICAgdXNpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZCBDKysgbmFtZSAtIHJlcXVlc3RlZCBieSBHZWRhbGlhIFBhc3Rlcm5hay4KCjIwMTEtMDQtMjk6IHN6YWdlcgoJICAgIEJ1ZyAyNjM1OTE5OiBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29udmVydCBzdGQ6Om1hcCB0byBhIHB5dGhvbiBkaWN0LgoKMjAxMS0wNC0yOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgYnVnIDI4MTE1NDk6IHJldHVybiBub24tY29uc3QgaXRlcmF0b3JzIGZyb20gU1RMCgkgICAgbWV0aG9kcyBiZWdpbigpLCBlbmQoKSwgcmJlZ2luKCksIHJlbmQoKS4KCjIwMTEtMDQtMjU6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIGJ1ZyAxNDk4OTI5OiBBY2Nlc3MgdG8gbWVtYmVyIGZpZWxkcyBpbiBtYXAgZWxlbWVudHMKCjIwMTEtMDQtMjM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBuc3BhY2U6IENvcnJlY3RseSBnZW5lcmF0ZSBpZGVudGlmaWVycyBmb3IgYmFzZSBjbGFzc2VzIHdoZW4KICAgICAgICAgICAgbm90IGluIHNwbGl0IHByb3h5IG1vZGUuCgoyMDExLTA0LTEzOiBzemFnZXIKCSAgICBGaXhlZCBidWcgMzI4NjMzMzogaW5maW5pdGUgcmVjdXJzaW9uIHdpdGggbXV0dWFsICd1c2luZyBuYW1lc3BhY2UnIGNsYXVzZXMuCgoyMDExLTA0LTEyOiBzemFnZXIKCSAgICBGaXhlZCBidWcgMTE2MzQ0MDogdmFyYXJnIHR5cGVtYXBzLgoKMjAxMS0wNC0xMjogc3phZ2VyCgkgICAgRml4ZWQgYnVnICMzMjg1Mzg2OiBwYXJzZSBlcnJvciBmcm9tICdvcGVyYXRvciBUKiYoKScuICBBZGRlZCBvcGVyYXRvcl9wb2ludGVyX3JlZgoJICAgIHRlc3QgY2FzZSB0byBkZW1vbnN0cmF0ZS4KCjIwMTEtMDQtMTE6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIFB5VmFyT2JqZWN0X0hFQURfSU5JVCB0byBlbGltaW5hdGUgVkMrKyBjb21waWxlciBlcnJvcnMgYWJvdXQKCSAgICBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2Ygc3RydWN0IG1lbWJlcnMgd2l0aCBwb2ludGVycy4KCjIwMTEtMDQtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjg0MzI2IGZyb20gQ29saW4gTWNEb25hbGQgdG8gZml4IHNvbWUgY29tcGlsZXIgd2FybmluZ3MuCgoyMDExLTA0LTExOiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBQeVZhck9iamVjdF9IRUFEX0lOSVQgdG8gZWxpbWluYXRlIFZDKysgY29tcGlsZXIgZXJyb3JzIGFib3V0CgkgICAgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdCBtZW1iZXJzIHdpdGggcG9pbnRlcnMuCgoyMDExLTA0LTEwOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRml4ZWQgd3JhcHBpbmcgb2YgZW51bXMgdGhhdCBhcmUgdHlwZSBjaGFyLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgZW51bSB7IFggPSAnWCc7IH0gKHRoaXMgd2FzIGFscmVhZHkgaW4gMi4wLjMgZm9yIEMjIGFuZCBKYXZhKQoKMjAxMS0wNC0xMDoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIG5zcGFjZTogRml4ZWQgcmVmZXJlbmNpbmcgdHlwZXMgaW4gdGhlIHJvb3QgbmFtZXNwYWNlIHdoZW4KICAgICAgICAgICAgbm90IGluIHNwbGl0IHByb3h5IG1vZGUuCgoyMDExLTA0LTA5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBBcHBsaWVkIHBhdGNoICMxOTMyNDg0OiBtaWdyYXRlIFB5Q09iamVjdCB0byBQeUNhcHN1bGUuCgoyMDExLTA0LTA5OiBzemFnZXIKCSAgICBbUHl0aG9uXSBBZGRlZCBwcmVwcm9jZXNzb3IgZ3VhcmRzIGZvciBweXRob24gZnVuY3Rpb25zIFB5VW5pY29kZV9Bc1dpZGVDaGFyIGFuZAoJICAgIFB5U2xpY2VfR2V0SW5kaWNlcywgd2hpY2ggY2hhbmdlZCBzaWduYXR1cmVzIGluIHB5dGhvbjMuMi4KCjIwMTEtMDQtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBjb25zdCBhcnJheSB0eXBlZGVmcyB3aGljaCB3ZXJlIGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIGNvZGUgYXMKICAgICAgICAgICAgcmVwb3J0ZWQgYnkgS2FybCBXZXR0ZS4KCjIwMTEtMDQtMDM6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIHRoZSBiZWhhdmlvciBvZiAlcHl0aG9ubm9uZHluYW1pYyB0byBjb25mb3JtIHRvIHRoZSBzcGVjIGluIExpYi9weXVzZXJkaXIuc3dnLgoKMjAxMS0wNC0wMzogc3phZ2VyCgkgICAgW1B5dGhvbl0gTWVyZ2VkIGluIHRoZSBzemFnZXItcHl0aG9uLWJ1aWx0aW4gYnJhbmNoLCBhZGRpbmcgdGhlIC1idWlsdGluIGZlYXR1cmUKCSAgICBmb3IgcHl0aG9uLiAgVGhlIC1idWlsdGluIG9wdGlvbiBtYXkgcHJvdmlkZSBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGdhaW4KCSAgICBpbiBweXRob24gd3JhcHBlcnMuICBGb3IgZnVsbCBkZXRhaWxzIGFuZCBsaW1pdGF0aW9ucywgcmVmZXIgdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbC4KCSAgICBBIHNtYWxsIHRlc3Qgc3VpdGUgZGVzaWduZWQgdG8gZGVtb25zdHJhdGUgdGhlIHBlcmZvcm1hbmNlIGdhaW4gaXMgaW4KCSAgICBFeGFtcGxlcy9weXRob24vcGVyZm9ybWFuY2UuCgoyMDExLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gbWlzc2luZyB3cmFwcGVycyBmb3IgZnJpZW5kIGZ1bmN0aW9ucyBmb3Igc29tZSB0YXJnZXQgbGFuZ3VhZ2VzLCBtb3N0bHkKICAgICAgICAgICAgdGhlIG5vbi1zY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgSmF2YSBhbmQgQyMuCgpWZXJzaW9uIDIuMC4zICgyOSBNYXJjaCAyMDExKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFwcGx5IHBhdGNoICMzMjM5MDc2IGZyb20gTWFyaWUgV2hpdGUgZml4aW5nIHN0cmluZ3MgZm9yIFIgPj0gMi43LjAKCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5IHBhdGNoICMzMjQ4MjgwIGZyb20gQ2hyaXN0aWFuIERlbGJhZXJlIHdoaWNoIGFkZHMgYmV0dGVyIGVycm9yIG1lc3NhZ2VzIHdoZW4KICAgICAgICAgICAgdGhlIGluY29ycmVjdCBudW1iZXIgb3IgdHlwZSBvZiBhcmd1bWVudHMgYXJlIHBhc3NlZCB0byBvdmVybG9hZGVkIG1ldGhvZHMuCgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzIyNDY2MyBmcm9tIENocmlzdGlhbiBEZWxiYWVyZS4KICAgICAgICAgICAgMS4gRml4IHdoZW4gZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgdmFsdWUsIGEgIk5VTEwiIGNvbW1hbmQgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBUY2wgaW50ZXJwcmV0ZXIKICAgICAgICAgICAgYW5kIGNhbGxpbmcgdGhpcyBjb21tYW5kIHdpbGwgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQuIAoKICAgICAgICAgICAgMi4gUHJldmlvdXMgaW1wbGVtZW50YXRpb24gc2VhcmNoZXMgZm9yIGNsYXNzIG1ldGhvZHMgdXNpbmcgYSBsaW5lYXIgc2VhcmNoIGNhdXNpbmcgcGVyZm9ybWFuY2UgaXNzdWVzCiAgICAgICAgICAgIGluIHdyYXBwZXJzIGZvciBjbGFzc2VzIHdpdGggbWFueSBtZW1iZXIgZnVuY3Rpb25zLiBUaGUgcGF0Y2ggYWRkcyBhIG1ldGhvZCBoYXNoIHRhYmxlIHRvIGNsYXNzZXMgYW5kCiAgICAgICAgICAgIGNoYW5nZXMgbWV0aG9kIG5hbWUgbG9va3VwIHRvIHVzZSB0aGUgaGFzaCB0YWJsZSBpbnN0ZWFkIG9mIGRvaW5nIGEgbGluZWFyIHNlYXJjaC4KCjIwMTEtMDMtMjY6IHdzZnVsdG9uCgkgICAgW0MjLCBKYXZhXSBTRiBidWcgIzMxOTUxMTIgLSBmaXggd3JhcHBpbmcgb2YgZW51bXMgdGhhdCBhcmUgdHlwZSBjaGFyLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBlbnVtIHsgWCA9ICdYJzsgfQoKMjAxMS0wMy0yMTogdmFkegoJICAgIEFsbG93IHNldHRpbmcgUENSRV9DRkxBR1MgYW5kIFBDUkVfTElCUyBkdXJpbmcgY29uZmlndXJhdGlvbiB0byBvdmVycmlkZSB0aGUgdmFsdWVzIHJldHVybmVkIGJ5CgkgICAgcGNyZS1jb25maWcsIGUuZy4gdG8gYWxsb3cgdXNpbmcgYSBzdGF0aWMgdmVyc2lvbiBvZiBQQ1JFIGxpYnJhcnkuCgoyMDExLTAzLTE3OiB3c2Z1bHRvbgoJICAgIFtVVExdIEFkZCBtaXNzaW5nIGhlYWRlcnMgaW4gZ2VuZXJhdGVkIFNUTCB3cmFwcGVycyB0byBmaXggY29tcGlsYXRpb24gd2l0aCBnY2MtNC42LgoKMjAxMS0wMy0xNzogd3NmdWx0b24KCSAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjIgd2hlcmUgZmlsZW5hbWVzIHdpdGggc3BhY2VzIHdlcmUgbm90IGZvdW5kCgkgICAgd2hlbiB1c2VkIHdpdGggJWluY2x1ZGUgYW5kICVpbXBvcnQuIFJlcG9ydGVkIGJ5IFNoYW5lIExpZXNlZ2FuZy4KCjIwMTEtMDMtMTU6IHdzZnVsdG9uCgkgICAgW1VUTF0gRml4IG92ZXJsb2FkaW5nIHdoZW4gdXNpbmcgY29uc3QgY2hhcltdLCBwcm9ibGVtIHJlcG9ydGVkIGJ5IERhdmlkIE1heHdlbGwuCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgY2hhcltBTlldIGFuZCBjb25zdCBjaGFyW0FOWV0uCgoyMDExLTAzLTE1OiB3c2Z1bHRvbgoJICAgIFtDI10gQXBwbHkgcGF0Y2ggIzMyMTI2MjQgZml4aW5nIHN0ZDo6bWFwIEtleXMgcHJvcGVydHkuCgoyMDExLTAzLTE0OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcy9mdW5jdGlvbnMgd2hlcmUgc29tZQoJICAgIHJldHVybiB2b2lkIGFuZCBvdGhlcnMgZG9uJ3QgLSB3aGV0aGVyIHRoaXMgd29ya2VkIG9yIG5vdCBkZXBlbmRlZAoJICAgIG9uIHRoZSBvcmRlciB0aGV5IHdlcmUgZW5jb3VudGVyZWQgaW4gKFNGIzMyMDgyOTkpLgoJCjIwMTEtMDMtMTM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBFeHRlbmRlZCBzdXBwb3J0IGZvciBDKysgbmFtZXNwYWNlcyAobnNwYWNlIGZlYXR1cmUpLgoKMjAxMS0wMy0xMjogb2xseQoJICAgIFtQSFBdIEZpeCBzaGFyaW5nIG9mIHR5cGUgaW5mb3JtYXRpb24gYmV0d2VlbiBtdWx0aXBsZSBTV0lHLXdyYXBwZWQKCSAgICBtb2R1bGVzIChTRiMzMjAyNDYzKS4KCjIwMTEtMDMtMDk6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRml4IFNGICMzMTk0Mjk0IC0gY29ybmVyIGNhc2UgYnVnIHdoZW4gJ05VTEwnIGlzIHVzZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUKICAgICAgICAgICAgZm9yIGEgcHJpbWl0aXZlIHR5cGUgcGFyYW1ldGVyIGluIGEgbWV0aG9kIGRlY2xhcmF0aW9uLgoKMjAxMS0wMy0wNzogb2xseQoJICAgIFtQSFBdIERvbid0IHVzZSB6ZW5kX2Vycm9yX25vcmV0dXJuKCkgZm9yIGNhc2VzIHdoZXJlIHRoZSBmdW5jdGlvbgoJICAgIHJldHVybnMgdm9pZCAtIG5vdyB0aGlzIGlzc3VlIGNhbiBvbmx5IG1hdHRlciBpZiB5b3UgaGF2ZSBhIGZ1bmN0aW9uCgkgICAgb3IgbWV0aG9kIHdoaWNoIGlzIGRpcmVjdGVkIGFuZCByZXR1cm5zIG5vbi12b2lkLgoKMjAxMS0wMy0wNjogb2xseQoJICAgIFtQSFBdIEFkZCBjYXN0cyB0byB0aGUgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZwoJICAgIGxvbmcgdG8gYXZvaWQgaXNzdWVzIHdoZW4gdGhleSBhcmUgdXNlZCB3aXRoIHNob3J0ZXIgdHlwZXMgdmlhCgkgICAgJWFwcGx5LgoKMjAxMS0wMy0wMjogd3NmdWx0b24KCSAgICBUZW1wbGF0ZWQgc21hcnQgcG9pbnRlcnMgb3ZlcmxvYWRlZCB3aXRoIGJvdGggY29uc3QgYW5kIG5vbiBjb25zdCBvcGVyYXRvci0+IGdlbmVyYXRlZCB1bmNvbXBpbGFibGUKCSAgICBjb2RlIHdoZW4gdGhlIHBvaW50ZWUgd2FzIGEgY2xhc3Mgd2l0aCBlaXRoZXIgcHVibGljIG1lbWJlciB2YXJpYWJsZXMgb3Igc3RhdGljIG1ldGhvZHMuCgkgICAgUmVncmVzc2lvbiBpbiAyLjAueCByZXBvcnRlZCBhcyB3b3JraW5nIGluIDEuMy40MCBieSB4YW50YXJlcyBvbiBzd2lnLXVzZXIgbWFpbGluZyBsaXN0LgoKVmVyc2lvbiAyLjAuMiAoMjAgRmVicnVhcnkgMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDItMTk6IHdzZnVsdG9uCgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdGhlIHR5cGVtYXBzLmkgbGlicmFyeQogICAgICAgICAgICBmb3IgcHJpbWl0aXZlIHJlZmVyZW5jZSB0eXBlcyBhcyB3ZWxsIGFzIHNpZ25lZCBjaGFyICogYW5kIGJvb2wgKi4KCjIwMTEtMDItMTk6IG9sbHkKCSAgICBbUEhQXSBBZGRyZXNzIGJ1ZyBpbiBQSFAgb24gc29tZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyB3aGljaAoJICAgIHJlc3VsdHMgaW4gemVuZF9lcnJvcl9ub3JldHVybigpIG5vdCBiZWluZyBhdmFpbGFibGUgdXNpbmcKCSAgICBTV0lHX1pFTkRfRVJST1JfTk9SRVRVUk4gd2hpY2ggZGVmYXVsdHMgdG8gemVuZF9lcnJvcl9ub3JldHVybiBidXQKCSAgICBjYW4gYmUgb3ZlcnJpZGRlbiB3aGVuIGJ1aWxkaW5nIHRoZSBtb2R1bGUgYnkgcGFzc2luZwoJICAgIC1EU1dJR19aRU5EX0VSUk9SX05PUkVUVVJOPXplbmRfZXJyb3IgdG8gdGhlIGNvbXBpbGVyLiAgVGhpcyBtYXkKCSAgICByZXN1bHQgaW4gY29tcGlsZXIgd2FybmluZ3MsIGJ1dCBzaG91bGQgYXQgbGVhc3QgYWxsb3cgYSBtb2R1bGUKCSAgICB0byBiZSBidWlsdCBvbiB0aG9zZSBwbGF0Zm9ybXMvYXJjaGl0ZWN0dXJlcyAoU0YjMzE2NjQyMykuCgoyMDExLTAyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMxODQ1NDkgLSB2YXJhcmcgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBvdmVybG9hZGluZyB3aGVuIHVzaW5nIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbi4KCjIwMTEtMDItMTg6IG9sbHkKCSAgICBbUEhQXSBBbiBvdmVybG9hZGVkIG1ldGhvZCB3aGljaCBjYW4gcmV0dXJuIGFuIG9iamVjdCBvciBhCgkgICAgcHJpbWl0aXZlIHR5cGUgbm8gbG9uZ2VyIGNhdXNlcyBTV0lHIHRvIHNlZ2ZhdWx0LiAgUmVwb3J0ZWQgYnkgUGF1bAoJICAgIENvbGJ5IGluIFNGIzMxNjg1MzEuCgoyMDExLTAyLTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGludmFsaWQgZXJhc2UgZHVyaW5nIGl0ZXJhdGlvbiBvZiBzdGQ6Om1hcCBpbiBnZW5lcmF0ZWQKCSAgICBkaXJlY3RvciBjb2RlLiAgUmVwb3J0ZWQgYnkgQ29yeSBCZW5uZXR0IGluIFNGIzMxNzU4MjAuCgoyMDExLTAyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBQcmVwcm9jZXNzaW5nIG5vdyB3YXJucyBpZiBleHRyYSB0b2tlbnMgYXBwZWFyIGFmdGVyICNlbHNlIGFuZCAjZW5kLgoKMjAxMS0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNjUzMDkyIFByZXByb2Nlc3NvciBkb2VzIG5vdCBlcnJvciBvdXQgd2hlbiAjZWxpZiBpcyBtaXNzaW5nIGFuIGV4cHJlc3Npb24uCiAgICAgICAgICAgIFRoaXMgYW5kIG90aGVyIGNhc2VzIG9mIG1pc3NpbmcgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zIG5vdyByZXN1bHQgaW4gYW4gZXJyb3IuCgoyMDExLTAyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbT2NhbWxdIEFwcGx5IHBhdGNoICMzMTUxNzg4IGZyb20gSm9lbCBSZXltb250LiBCcmluZ3MgT2NhbWwgc3VwcG9ydCB1cCB0byBkYXRlIAogICAgICAgICAgICAodmVyIDMuMTEgYW5kIDMuMTIpLCBpbmNsdWRpbmcgc3RkOjpzdHJpbmcuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggIzMxNzYyNzQgZnJvbSBKYW1lcyBNYXN0ZXJzIC0gdHlwZWNoZWNrIHR5cGVtYXAgZm9yIHRpbWVfdC4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMTcxNzkzIGZyb20gc3phZ2VyIC0gcHJvdGVjdGVkIGRpcmVjdG9yIG1ldGhvZHMgZmFpbGluZyB3aGVuIC1mdmlydHVhbCBpcyB1c2VkLgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxOTI3ODUyIC0gI2luY2x1ZGUgZGlyZWN0aXZlcyBkb24ndCBwcmVwcm9jZXNzIHRoZSBmaWxlIHBhc3NlZCB0byBpdC4gVGhlIGZpeCBpcyBmb3IKICAgICAgICAgICAgI2luY2x1ZGUgd2l0aCAtaW1wb3J0YWxsIG9yIC1pbmNsdWRlYWxsLCAlaW5jbHVkZSBhbmQgJWltcG9ydCwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgI2RlZmluZSBGSUxFTkFNRSAiYWJjLmgiCiAgICAgICAgICAgICAgJWluY2x1ZGUgRklMRU5BTUUKCjIwMTEtMDItMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk0MDUzNiwgb3ZlcmFjdGl2ZSBwcmVwcm9jZXNzb3Igd2hpY2ggd2FzIGV4cGFuZGluZyBkZWZpbmVkKC4uLikgb3V0c2lkZSBvZiAjaWYgYW5kICNlbGlmCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBTRiAjMjk0Mjg5OSBBZGQgdXNlciBzdXBwbGllZCBkb2N1bWVudGF0aW9uIHRvIGhlbHAgZ2V0dGluZyBzdGFydGVkIHdpdGggTXpTY2hlbWUuCiAgICAgICAgICAgIFVwZGF0ZSBjaGFwdGVyIG5hbWUgdG8gTXpTY2hlbWUvUmFja2V0IGFjY291bnRpbmcgZm9yIHRoZSByZW5hbWUgb2YgTXpTY2hlbWUgdG8gUmFja2V0LgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTRiAjMzA4NTkwNiAtIFBvc3NpYmxlIGZpeCBydW5uaW5nIHRlc3Qtc3VpdGUgb24gTWFjIE9TIFguCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMzE3MzM2NyBCZXR0ZXIgaW5mb3JtYXRpb24gZHVyaW5nIGNvbmZpZ3VyZSBhYm91dCBCb29zdCBwcmVyZXF1aXNpdGUgZm9yIHJ1bm5pbmcKICAgICAgICAgICAgdGhlIHRlc3Qtc3VpdGUuCgoyMDExLTAyLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMzEyNzYzMyBGaXggaW5maW5pdGUgbG9vcCBpbiByZWN1cnNpdmUgdHlwZWRlZiByZXNvbHV0aW9uLgoKMjAxMS0wMi0wNDogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFNGICMzMTY4Njc2IEZpeCAlcmVuYW1lIG5vdCB3b3JraW5nIGZvciBtZW1iZXIgdmFyaWFibGVzIGFuZCBtZXRob2RzLgoKMjAxMS0wMi0wNDogd3NmdWx0b24KICAgICAgICAgICAgW2NsaXNwXSBTRiAjMzE0ODIwMCBGaXggc2VnZmF1bHQgcGFyc2luZyBuZXN0ZWQgdW5pb25zLgoKMjAxMS0wMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBEaXJlY3RvcnMgLSBhIGNhbGwgdG8gYSBtZXRob2QgYmVpbmcgZGVmaW5lZCBpbiB0aGUgYmFzZSBjbGFzcywgbm90CiAgICAgICAgICAgIG92ZXJyaWRkZW4gaW4gYSBzdWJjbGFzcywgYnV0IGFnYWluIG92ZXJyaWRkZW4gaW4gYSBjbGFzcyBkZXJpdmVkIGZyb20KICAgICAgICAgICAgdGhlIGZpcnN0IHN1YmNsYXNzIHdhcyBub3QgYmVpbmcgZGlzcGF0Y2hlZCBjb3JyZWN0bHkgdG8gdGhlIG1vc3QgZGVyaXZlZCBjbGFzcy4KICAgICAgICAgICAgU2VlIGRpcmVjdG9yX2FsdGVybmF0aW5nLmkgZm9yIGFuIGV4YW1wbGUuCgoyMDExLTAyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFueSAndXNpbmcnIHN0YXRlbWVudHMgaW4gdGhlIHByb3RlY3RlZCBzZWN0aW9uIG9mIGEgY2xhc3Mgd2VyZSBwcmV2aW91c2x5CiAgICAgICAgICAgIGlnbm9yZWQgd2l0aCBkaXJlY3RvciBwcm90ZWN0ZWQgKGRpcnByb3QpIG1vZGUuCgoyMDExLTAxLTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb3ZlcmxvYWRpbmcgd2l0aCBjb25zdCBwb2ludGVyIHJlZmVyZW5jZSAoU1dJR1RZUEUgKmNvbnN0JikgcGFyYW1ldGVycyBmb3IgYQogICAgICAgICAgICBudW1iZXIgb2Ygc2NyaXB0aW5nIGxhbmd1YWdlcy4KCjIwMTEtMDEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyB3YXJuaW5nIGZvciBzbWFydCBwb2ludGVycyBpZiBvbmx5IHNvbWUgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGNoYWluIGFyZSBtYXJrZWQgYXMgc21hcnQgcG9pbnRlciwgZWcsICVzaGFyZWRfcHRyIHNob3VsZCBiZSB1c2VkIGZvciBhbGwgY2xhc3NlcwogICAgICAgICAgICBpbiBhbiBpbmhlcml0YW5jZSBoaWVyYXJjaHksIHNvIHRoaXMgbmV3IHdhcm5pbmcgaGlnaGxpZ2h0cyBjb2RlIHdoZXJlIHRoaXMgaXMKICAgICAgICAgICAgbm90IHRoZSBjYXNlLgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MTI6IFdhcm5pbmcgNTIwOiBCYXNlIGNsYXNzICdBJyBvZiAnQicgaXMgbm90IHNpbWlsYXJseSBtYXJrZWQgYXMgYSBzbWFydCBwb2ludGVyLgogICAgICAgICAgICAgIGV4YW1wbGUuaToxNjogV2FybmluZyA1MjA6IERlcml2ZWQgY2xhc3MgJ0MnIG9mICdCJyBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIuCgoyMDExLTAxLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBzb21lIG1pc3NpbmcgbXVsdGktYXJndW1lbnQgdHlwZW1hcHM6IChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIGFuZCAKICAgICAgICAgICAgKGNoYXIgKlNUUklORywgaW50IExFTkdUSCkuIERvY3VtZW50YXRpb24gZm9yIHRoaXMgdXBkYXRlZC4gSmF2YSBwYXRjaCBmcm9tCiAgICAgICAgICAgIFZvbGtlciBHcmFic2NoLgoKMjAxMS0wMS0xMTogaWFudAoJICAgIFJlcXVpcmUgR28gdmVyc2lvbiA3MDc3IG9yIGxhdGVyLgoKMjAxMC0xMi0zMDoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0MjLCBELCBKYXZhXSBDaGVjayBmb3IgY29sbGlzaW9uIG9mIHBhcmFtZXRlciBuYW1lcyB3aXRoIHRhcmdldAogICAgICAgICAgICBsYW5ndWFnZSBrZXl3b3JkcyB3aGVuIGdlbmVyYXRpbmcgdGhlIGRpcmVjdG9yIGdsdWUgY29kZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSBzaXR1YXRpb24gaW4gd2hpY2ggdGhlIGdlbmVyYXRlZCBjb3VsZCB3b3VsZCBwcmV2aW91c2x5IGJlCiAgICAgICAgICAgIGludmFsaWQgaXMgaWxsdXN0cmF0ZWQgaW4gdGhlIG5ldyAnZGlyZWN0b3Jfa2V5d29yZHMnIHRlc3QgY2FzZS4KCjIwMTAtMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4ICRjc2lucHV0IHNwZWNpYWwgdmFyaWFibGUgbm90IGJlaW5nIGV4cGFuZGVkIGZvciBjc3ZhcmluIHR5cGVtYXBzCiAgICAgICAgICAgIHdoZW4gdXNlZCBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4gUmVwb3J0ZWQgYnkgVmFkaW0gWmVpdGxpbi4KCjIwMTAtMTItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkYmFzZW1hbmdsZSBleHBhbnNpb24gaW4gYXJyYXkgdHlwZW1hcHMuIEZvciBleGFtcGxlIGlmIHR5cGUgaXMgaW50ICpbM10sCiAgICAgICAgICAgICRiYXNlbWFuZ2xlIGV4cGFuZHMgdG8gX3BfaW50LgoKMjAxMC0xMi0wNzogaWFudAoJICAgIENoZWNrIHRoYXQgd2UgYXJlIHVzaW5nIGEgc3VmZmljaWVudGx5IG5ldyB2ZXJzaW9uIG9mIHRoZQoJICAgIDZnIG9yIDhnIEdvIGNvbXBpbGVyIGR1cmluZyBjb25maWd1cmUgdGltZS4gSWYgbm90LCBkaXNhYmxlIEdvLgogICAgICAgICAgICBNaW5pbXVtIHZlcnNpb24gaXMgbm93IDY3MDcuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0xMi0wNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMTI3Mzk0IC0gdXNlIG9mIG5ldHdvcmsgcGF0aHMgb24gV2luZG93cy9NU3lzLgoKMjAxMC0xMS0xODoga2xpY2t2ZXJib3QKCSAgICBbRF0gQWRkZWQgdGhlIEQgbGFuZ3VhZ2UgbW9kdWxlLgoKMjAxMC0xMS0xMjogdmFkegoJICAgIEZpeCBoYW5kbGluZyBvZiBtdWx0aXBsZSByZWdleC11c2luZyAlcmVuYW1lcyBhdHRhY2hlZCB0byB0aGUgc2FtZQoJICAgIGRlY2xhcmF0aW9uLiBGb3IgZXhhbXBsZSwgbm93CgoJICAgICAgJXJlbmFtZSgiJShyZWdleDovXlNldCguKikvcHV0XFwxLylzIikgIiI7CgkgICAgICAlcmVuYW1lKCIlKHJlZ2V4Oi9eR2V0KC4qKS9nZXRcXDEvKXMiKSAiIjsKCgkgICAgd29ya3MgYXMgZXhwZWN0ZWQgd2hlcmVhcyBiZWZvcmUgb25seSB0aGUgbGFzdCBhbm9ueW1vdXMgcmVuYW1lIHdhcwoJICAgIHRha2VuIGludG8gYWNjb3VudC4KCjIwMTAtMTAtMTc6IGRyam9lCgkgICAgW1JdIEZpeCBmYWlsdXJlIGluIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHdoaWNoIHdhcyBicmVha2luZwoJICAgIFF1YW50TGliLVNXSUcKCjIwMTAtMTAtMTQ6IG9sbHkKCSAgICBbUEhQXSBBbGxvdyBjb21waWxhdGlvbiBvbiBub24tY29uZm9ybWluZyBNaWNyb3NvZnQgQysrIGNvbXBpbGVycwoJICAgIHdoaWNoIGRvbid0IGFjY2VwdDogcmV0dXJuIGZ1bmN0aW9uX3JldHVybmluZ192b2lkKCk7CgkgICAgUmVwb3J0ZWQgYnkgRnJhbmsgVmFuZGVuIEJlcmdoZW4gb24gdGhlIFNXSUcgbWFpbGluZyBsaXN0LgoKMjAxMC0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgKGdsb2JhbCBzY29wZSkgcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDIuMC4wLCByZXBvcnRlZCBieQogICAgICAgICAgICBCZW4gV2Fsa2VyLiBUaGUgbWFuZ2xlZCBzeW1ib2wgbmFtZXMgd2VyZSBpbmNvcnJlY3QsIHNvbWV0aW1lcyByZXN1bHRpbmcgaW4gdHlwZXMgYmVpbmcKICAgICAgICAgICAgaW5jb3JyZWN0bHkgdHJlYXRlZCBhcyBvcGFxdWUgdHlwZXMuCgogICAgICAgICAgICBBbHNvIGZpeGVzICMyOTU4NzgxIGFuZCBzb21lIG90aGVyIHR5cGUgcHJvYmxlbXMgZHVlIHRvIGJldHRlciB0eXBlZGVmIHJlc29sdXRpb24sIGVnIAogICAgICAgICAgICBzdGQ6OnZlY3RvcjxUICo+Ojp2YWx1ZV90eXBlIGRpZG4ndCByZXNvbHZlIHRvIFQgKiB3aGVuIGl0IHNob3VsZCBoYXZlLiBUaGUgbWFuZ2xlZCB0eXBlCiAgICAgICAgICAgIHdhcyBpbmNvcnJlY3RseSBTV0lHVFlQRV9zdGRfX3ZlY3RvclRfVGVzdF9wX3N0ZF9fYWxsb2NhdG9yVF9UZXN0X3BfdF90X192YWx1ZV90eXBlIGFuZCBub3cKICAgICAgICAgICAgaXQgaXMgY29ycmVjdGx5IFNXSUdUWVBFX3BfVGVzdC4KClZlcnNpb24gMi4wLjEgKDQgT2N0b2JlciAyMDEwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTAtMTAtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzMDY2OTU4IGZyb20gTWlrYWVsIEpvaGFuc3NvbiB0byBmaXggZGVmYXVsdCBzbWFydCBwb2ludGVyCiAgICAgICAgICAgIGhhbmRsaW5nIHdoZW4gdGhlIHNtYXJ0IHBvaW50ZXIgY29udGFpbnMgYm90aCBhIGNvbnN0IGFuZCBub24tY29uc3Qgb3BlcmF0b3ItPi4KCjIwMTAtMTAtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAtcGNyZXZlcnNpb24gb3B0aW9uIHRvIGRpc3BsYXkgUENSRSB2ZXJzaW9uIGluZm9ybWF0aW9uLgoKMjAxMC0xMC0wMTogb2xseQoJICAgIFtSdWJ5XSBBdm9pZCBzZWdmYXVsdCB3aGVuIGEgbWV0aG9kIG5vZGUgaGFzIG5vIHBhcmVudE5vZGUKCSAgICAoU0YjMzAzNDA1NCkuCgoyMDEwLTEwLTAxOiBvbGx5CgkgICAgW1B5dGhvbl0gQWxsb3cgcmVpbml0aWFsaXNhdGlvbiB0byB3b3JrIHdpdGggYW4gZW1iZWRkZWQgUHl0aG9uCgkgICAgaW50ZXJwcmV0ZXIgKHBhdGNoIGZyb20gSmltIENhcnJvbGwgaW4gU0YjMzA3NTE3OCkuCgoyMDEwLTA5LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoIGZyb20gVG9tYXMgRGlydmFuYXVza2FzIGZvciBzdGQ6Om1hcCB3cmFwcGVycyB0byBhdm9pZAogICAgICAgICAgICB0aHJvd2luZyBleGNlcHRpb25zIHdpdGggbm9ybWFsIHVzYWdlIG9mIGl0ZXJhdG9ycy4KCjIwMTAtMDktMjc6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXByb3ZlIGVycm9yIG1lc3NhZ2UgZ2l2ZW4gd2hlbiBhIHBhcmFtZXRlciBvZiB0aGUgd3JvbmcKCSAgICB0eXBlIGlzIHBhc3NlZCB0byBhbiBvdmVybG9hZGVkIG1ldGhvZCAoU0YjMzAyNzM1NSkuCgoyMDEwLTA5LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBTRiBwYXRjaCAjMzA3NTE1MCAtIEphdmEgZGlyZWN0b3JzIHVzaW5nIHN0YXRpYyB2YXJpYWJsZXMgaW4KICAgICAgICAgICAgbmFtZWQgbmFtZXNwYWNlLgoKMjAxMC0wOS0yNDogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBmaWxlIGFuZCBsaW5lIGVycm9yL3dhcm5pbmcgcmVwb3J0aW5nIGZpeGVzIHdoZXJlIFNXSUcgbWFjcm9zCiAgICAgICAgICAgIGFyZSB1c2VkIHdpdGhpbiB7fSBicmFjZXMgKHdoZXJlIHRoZSBwcmVwcm9jZXNzb3IgZXhwYW5kcyBtYWNyb3MpLAogICAgICAgICAgICBmb3IgZXhhbXBsZSBtYWNyb3Mgd2l0aGluICVpbmxpbmUgey4uLn0gYW5kICVmcmFnbWVudCguLi4pIHsuLi59CiAgICAgICAgICAgIGFuZCBuZXN0ZWQgc3RydWN0cy4KCjIwMTAtMDktMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZmlsZSBhbmQgbGluZSBlcnJvci93YXJuaW5nIHJlcG9ydGluZyBmaXhlcyBmb3IgdmFyaW91cyBpbmhlcml0ZWQKICAgICAgICAgICAgY2xhc3MgcHJvYmxlbXMuCgoyMDEwLTA5LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBBIG11Y2ggaW1wcm92ZWQgZGVidWdnaW5nIG9mIFNXSUcgc291cmNlIGV4cGVyaWVuY2UgaXMgbm93IGF2YWlsYWJsZSBhbmQKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiB0aGUgIkRlYnVnZ2luZyBTV0lHIiBzZWN0aW9uIGluIHRoZSBEb2MvRGV2ZWwvaW50ZXJuYWxzLmh0bWwKICAgICAgICAgICAgZmlsZSwgaW5jbHVkaW5nIGEgc3dpZy5kYmcgc3VwcG9ydCBmaWxlIGZvciB0aGUgZ2RiIGRlYnVnZ2VyLgoKMjAxMC0wOS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzL3dhcm5pbmdzIHdoZW4gYSBtYWNybwogICAgICAgICAgICBkZWZpbml0aW9uIGVuZHMgd2l0aCAnLycgYW5kIGl0IGlzIG5vdCB0aGUgZW5kIG9mIGEgQyBjb21tZW50LgoKMjAxMC0wOS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzL3dhcm5pbmdzIGFmdGVyIHBhcnNpbmcKICAgICAgICAgICAgbWFjcm8gaW52b2NhdGlvbnMgd2l0aCBwYXJhbWV0ZXJzIGdpdmVuIG92ZXIgbW9yZSB0aGFuIG9uZSBsaW5lLgoKMjAxMC0wOS0xMDogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGV4dHJhbmVvdXMgZXh0cmEgbGluZSBpbiBwcmVwcm9jZXNzZWQgb3V0cHV0IGFmdGVyIGluY2x1ZGluZyBmaWxlcwogICAgICAgICAgICB3aGljaCB3b3VsZCBzb21ldGltZXMgbGVhZCB0byBlcnJvci93YXJuaW5nIG1lc3NhZ2VzIHR3byBsaW5lcyBhZnRlciB0aGUKICAgICAgICAgICAgZW5kIG9mIHRoZSBmaWxlLgoKMjAxMC0wOS0xMDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyMTQ5NTIzIC0gSW5jb3JyZWN0IGxpbmUgbnVtYmVyIHJlcG9ydGluZyBpbiBlcnJvcnMgYWZ0ZXIgcGFyc2luZyBtYWNyb3MKICAgICAgICAgICAgY29udGFpbmluZyBDKysgY29tbWVudHMuCgoyMDEwLTA5LTA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGhhbmRsaW5nIG9mIE9VVFBVVCB0eXBlbWFwcyAoUGF0Y2ggZnJvbSBSeWFuIGluIFNGIzMwNTgzOTQpLgoKMjAxMC0wOS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IGVycm9uZW91cyBsaW5lIG51bWJlcnMgaW4gZXJyb3IgbWVzc2FnZXMgZm9yIG1hY3JvIGV4cGFuc2lvbnMsIGZvciBleGFtcGxlLAogICAgICAgICAgICB0aGUgZXJyb3IgbWVzc2FnZSBub3cgcG9pbnRzIHRvIGluc3RhbnRpYXRpb24gb2YgdGhlIG1hY3JvLCBpZSB0aGUgbGFzdCBsaW5lIGhlcmU6CgogICAgICAgICAgICAgICNkZWZpbmUgTUFDUk8yKGEsIGIpIAoKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPMShOQU1FKSBNQUNSTzIoTkFNRSwyLDMpIAoKICAgICAgICAgICAgICBNQUNSTzEoYWJjKQoKMjAxMC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcyBmb3IgcHJlcHJvY2Vzc29yIG1lc3NhZ2VzIHdpdGhpbgogICAgICAgICAgICAlaW5saW5lLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICNkZWZpbmUgRk9PQkFSIDEKICAgICAgICAgICAgICAjZGVmaW5lIEZPT0JBUiAiaGkiCiAgICAgICAgICAgICAgJX0KCjIwMTAtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgd2hpY2ggd2VyZSBjdW11bGF0aXZlbHkgb25lCiAgICAgICAgICAgIGxlc3MgdGhhbiB0aGV5IHNob3VsZCBoYXZlIGJlZW4gYWZ0ZXIgcGFyc2luZyBlYWNoICVpbmNsdWRlLyVpbXBvcnQgLSBidWcKICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTEuMy4zMi4gQWxzbyBmaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgIHdoZW4gbmV3IGxpbmUgY2hhcmFjdGVycyBhcHBlYXIgYmV0d2VlbiB0aGUgJWluY2x1ZGUgLyAlaW1wb3J0IHN0YXRlbWVudCBhbmQKICAgICAgICAgICAgdGhlIGZpbGVuYW1lLgoKMjAxMC0wOC0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGxpbmUgbnVtYmVyIGFuZCBmaWxlIG5hbWUgcmVwb3J0aW5nIGZvciBzb21lIG1hY3JvIHByZXByb2Nlc3NvciB3YXJuaW5ncy4KICAgICAgICAgICAgVGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBtYWNybyBhcmd1bWVudCBoYXMgYmVlbiBjb3JyZWN0ZWQgYW5kIHRoZSBsaW5lIG51bWJlcgogICAgICAgICAgICBvZiB0aGUgc3RhcnQgb2YgdGhlIG1hY3JvIGluc3RlYWQgb2Ygb25lIHBhc3QgdGhlIGVuZCBvZiB0aGUgbWFjcm8gaXMgdXNlZC4KICAgICAgICAgICAgU29tZSBleGFtcGxlczoKICAgICAgICAgICAgICBmaWxlLmg6MTE6IEVycm9yOiBJbGxlZ2FsIG1hY3JvIGFyZ3VtZW50IG5hbWUgJy4uJwogICAgICAgICAgICAgIGZpbGUuaDoxOTogRXJyb3I6IE1hY3JvICdEVVBMSUNBVEUnIHJlZGVmaW5lZCwKICAgICAgICAgICAgICBmaWxlLmg6MTU6IEVycm9yOiBwcmV2aW91cyBkZWZpbml0aW9uIG9mICdEVVBMSUNBVEUnLgogICAgICAgICAgICAgIGZpbGUuaDoyNTogRXJyb3I6IFZhcmlhYmxlLWxlbmd0aCBtYWNybyBhcmd1bWVudCBtdXN0IGJlIGxhc3QgcGFyYW1ldGVyCiAgICAgICAgICAgICAgZmlsZS5oOjMyOiBFcnJvcjogSWxsZWdhbCBjaGFyYWN0ZXIgaW4gbWFjcm8gYXJndW1lbnQgbmFtZQogICAgICAgICAgICAgIGZpbGUuaTozNzogRXJyb3I6IE1hY3JvICdTSVQnIGV4cGVjdHMgMiBhcmd1bWVudHMKCjIwMTAtMDgtMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBfX0xJTkVfXyBhbmQgX19GSUxFX18gZXhwYW5zaW9uIHJlcG9ydGVkIGJ5IENhbWlsbGUgR2lsbG90LiBNb3N0bHkgdGhpcwogICAgICAgICAgICBkaWQgbm90IHdvcmsgYXQgYWxsLiBBbHNvIGZpeGVzIFNGICMyODIyODIyLgoKMjAxMC0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEZpeCBjb3JuZXIgY2FzZSBtYXJzaGFsbGluZyBvZiBkb3VibGVzIC0gZXJybm8gd2FzIG5vdCBiZWluZyBjb3JyZWN0bHkKICAgICAgICAgICAgc2V0IGJlZm9yZSBjYWxsaW5nIHN0cnRvZCAtIHBhdGNoIGZyb20gSnVzdGluIFZhbGxvbiAtIFNGIEJ1ZyAjMzAzODkzNi4KCjIwMTAtMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBtYWtlIGRpc3RjbGVhbiB3aGVuIHNvbWUgb2YgdGhlIG1vcmUgb2JzY3VyZSBsYW5ndWFnZXMgYXJlIGRldGVjdGVkIGJ5CiAgICAgICAgICAgIGNvbmZpZ3VyZSAtIGZpeGVzIGZyb20gVG9yc3RlbiBMYW5kc2Nob2ZmLgoKMjAxMC0wNy0yODogd3NmdWx0b24KICAgICAgICAgICAgUmVzdG9yZSBjb25maWd1cmluZyBvdXQgb2Ygc291cmNlIGZvciB0aGUgdGVzdC1zdWl0ZSBzaW5jZSBpdCBicm9rZSBpbiAxLjMuMzcuCiAgICAgICAgICAgIEFzIHByZXZpb3VzbHksIGlmIHJ1bm5pbmcgJ21ha2UgY2hlY2stdGVzdC1zdWl0ZScgb3V0IG9mIHNvdXJjZSwgaXQgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZG9uZSBieSBpbnZva2luZyBjb25maWd1cmUgd2l0aCBhIHJlbGF0aXZlIHBhdGguIEludm9raW5nIGNvbmZpZ3VyZSB3aXRoIGFuCiAgICAgICAgICAgIGFic29sdXRlIHBhdGggd2lsbCBub3Qgd29yay4gUnVubmluZyB0aGUgZnVsbCAnbWFrZSBjaGVjaycgc3RpbGwgbmVlZHMgdG8gYmUKICAgICAgICAgICAgZG9uZSBpbiB0aGUgc291cmNlIHRyZWUuCgoyMDEwLTA3LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgZnVuY3Rpb24gcG9pbnRlcnMgYW5kIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB3aGVuIHRoZSBmdW5jdGlvbgogICAgICAgICAgICByZXR1cm5zIGJ5IHJlZmVyZW5jZS4KCjIwMTAtMDctMTM6IHZhZHoKICAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciB0aGUgb2xkIGV4cGVyaW1lbnRhbCAicnhzcGVuY2VyIiBlbmNvZGVyIGFuZAogICAgICAgICAgICAiW25vdF1yeHNtYXRjaCIgaW4gJXJlbmFtZSAoc2VlIHRoZSAwMS8xNi8yMDA2IGVudHJ5KS4gVGhlIG5ldyBhbmQKICAgICAgICAgICAgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgInJlZ2V4IiBlbmNvZGVyIGFuZCAiW25vdF1yZWdleG1hdGNoIiBjaGVja3MKICAgICAgICAgICAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCAoc2VlIHRoZSB0d28gcHJldmlvdXMgZW50cmllcykuIFBsZWFzZQogICAgICAgICAgICByZXBsYWNlICIlKHJ4c3BlbmNlcjpbcGF0XVtzdWJzdF0pcyIgd2l0aCAiJShyZWdleDovcGF0L3N1YnN0LylzIgogICAgICAgICAgICB3aGVuIHVwZ3JhZGluZy4gTm90aWNlIHRoYXQgeW91IHdpbGwgYWxzbyBuZWVkIHRvIHJlcGxhY2UgdGhlIGJhY2stCiAgICAgICAgICAgIHJlZmVyZW5jZXMgb2YgZm9ybSAiQDEiIHdpdGggdGhlIG1vcmUgc3RhbmRhcmQgIlxcMSIgYW5kIG1heSBuZWVkIHRvCiAgICAgICAgICAgIGFkanVzdCB5b3VyIHJlZ3VsYXIgZXhwcmVzc2lvbnMgc3ludGF4IGFzIHRoZSBuZXcgcmVnZXggZW5jb2RlciB1c2VzCiAgICAgICAgICAgIFBlcmwtY29tcGF0aWJsZSBzeW50YXggYW5kIG5vdCAoZXh0ZW5kZWQpIFBPU0lYIHN5bnRheCBhcyB0aGUgb2xkIG9uZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBBZGQgInJlZ2V4bWF0Y2giLCAicmVnZXh0YXJnZXQiIGFuZCAibm90cmVnZXhtYXRjaCIgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHVzZWQgdG8gYXBwbHkgJXJlbmFtZSBkaXJlY3RpdmVzIHRvIHRoZSBkZWNsYXJhdGlvbnMgbWF0Y2hpbmcgdGhlCiAgICAgICAgICAgIHNwZWNpZmllZCByZWd1bGFyIGV4cHJlc3Npb24gb25seS4gVGhlIGZpcnN0IHR3byBjYW4gYmUgdXNlZAogICAgICAgICAgICBpbnRlcmNoYW5nZWFibHksIGJvdGggb2YgdGhlICVyZW5hbWVzIGJlbG93IGRvIHRoZSBzYW1lIHRoaW5nOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCByZWdleG1hdGNoJG5hbWU9Ik9sZCQiKSAiIjsKICAgICAgICAgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCByZWdleHRhcmdldD0xKSAiT2xkJCI7CgogICAgICAgICAgICAobmFtZWx5IGlnbm9yZSB0aGUgZGVjbGFyYXRpb25zIGhhdmluZyAiT2xkIiBzdWZmaXgpLgoKICAgICAgICAgICAgIm5vdHJlZ2V4bWF0Y2giIHJlc3RyaWN0cyB0aGUgbWF0Y2ggdG8gb25seSB0aGUgZGVjbGFyYXRpb25zIHdoaWNoCiAgICAgICAgICAgIGRvIG5vdCBtYXRjaCB0aGUgcmVndWxhciBleHByZXNzaW9uLCBlLmcuIGhlcmUgaXMgaG93IHRvIHJlbmFtZSB0bwogICAgICAgICAgICBsb3dlciBjYXNlIHZlcnNpb25zIGFsbCBkZWNsYXJhdGlvbnMgZXhjZXB0IHRob3NlIGNvbnNpc3RpbmcgZnJvbQogICAgICAgICAgICBjYXBpdGFsIGxldHRlcnMgb25seToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIkKGxvd2VyY2FzZSlzIiwgbm90cmVnZXhtYXRjaCRuYW1lPSJeW0EtWl0rJCIpICIiOwoKMjAxMC0wNy0xMzogdmFkegogICAgICAgICAgICBBZGQgdGhlIG5ldyAicmVnZXgiIGVuY29kZXIgdGhhdCBjYW4gYmUgdXNlZCBpbiAlcmVuYW1lLCBlLmcuCgogICAgICAgICAgICAgICAgJXJlbmFtZSgicmVnZXg6LyhcXHcrKV8oLiopL1xcMi8iKSAiIjsKCiAgICAgICAgICAgIHRvIHJlbW92ZSBhbnkgYWxwaGFiZXRpY2FsIHByZWZpeCBmcm9tIGFsbCBpZGVudGlmaWVycy4gVGhlIHN5bnRheAogICAgICAgICAgICBvZiB0aGUgcmVndWxhciBleHByZXNzaW9ucyBpcyBQZXJsLWxpa2UgYW5kIFBDUkUgbGlicmFyeQogICAgICAgICAgICAoaHR0cDovL3d3dy5wY3JlLm9yZy8pIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoaXMgZmVhdHVyZSBidXQgbm90aWNlCiAgICAgICAgICAgIHRoYXQgYmFja3NsYXNoZXMgbmVlZCB0byBiZSBlc2NhcGVkIGFzIHVzdWFsIGluc2lkZSBDIHN0cmluZ3MuCgogICAgICAgICAgICBPcmlnaW5hbCBwYXRjaCBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMTAtMDctMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzAyNDg3NSAtIHNoYXJlZF9wdHIgb2YgY2xhc3NlcyB3aXRoIG5vbi1wdWJsaWMgZGVzdHJ1Y3RvcnMuIFRoaXMgYWxzbyBmaXhlcwogICAgICAgICAgICB0aGUgInVucmVmIiBmZWF0dXJlIHdoZW4gdXNlZCBvbiBjbGFzc2VzIHdpdGggbm9uLXB1YmxpYyBkZXN0cnVjdG9ycy4KCjIwMTAtMDYtMTc6IGlhbmxhbmNldGF5bG9yCiAgICAgICAgICAgIFtHb10gQWRkIHRoZSBHbyBsYW5ndWFnZSBtb2R1bGUuCgoyMDEwLTA2LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggU1dJR19sdWFfaXNuaWxzdHJpbmcgbXVsdGlwbHkgZGVmaW5lZCB3aGVuIHVzaW5nIG11bHRpcGxlCiAgICAgICAgICAgIG1vZHVsZXMgYW5kIHdyYXBwaW5nIHN0cmluZ3MuIFBhdGNoIGZyb20gJ051bWJlciBDcnVuY2hlcicuCgoyMDEwLTA2LTEwOiBvbGx5CgkgICAgW1BIUF0gRml4IGRpcmVjdG9ycyB0byBjb3JyZWN0bHkgY2FsbCBhIG1ldGhvZCB3aXRoIGhhcyBhCgkgICAgZGlmZmVyZW50IG5hbWUgaW4gUEhQIHRvIEMrKyAod2Ugd2VyZSBhbHdheXMgdXNpbmcgdGhlIEMrKyBuYW1lCgkgICAgaW4gdGhpcyBjYXNlKS4KCjIwMTAtMDYtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1bmNvbXBpbGFibGUgY29kZSB3aGVuICVyZW5hbWUgcmVzdWx0cyBpbiB0d28gZW51bSBpdGVtcwogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUuIFJlcG9ydGVkIGJ5IFZhZGltIFplaXRsaW4uCgpWZXJzaW9uIDIuMC4wICgyIEp1bmUgMjAxMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEwLTA2LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQgbWFjcm8gdXNlZCBpbiBzdGQ6OnZlY3RvciB0byB3b3JrIHdpdGgKICAgICAgICAgICAgdHlwZXMgY29udGFpbmluZyBjb21tYXMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQoc3RkOjpwYWlyPCBkb3VibGUsIHN0ZDo6c3RyaW5nID4pCgoyMDEwLTA2LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgaW4gc3RkX3NoYXJlZF9wdHIuaSBmb3Igd3JhcHBpbmcgc3RkOjpzaGFyZWRfcHRyLiBSZXF1aXJlcyB0aGUgJXNoYXJlZF9wdHIKICAgICAgICAgICAgbWFjcm8gbGlrZSBpbiB0aGUgYm9vc3Rfc2hhcmVkX3B0ci5pIGxpYnJhcnkuIHN0ZDo6dHIxOjpzaGFyZWRfcHRyIGNhbiBhbHNvIGJlCiAgICAgICAgICAgIHdyYXBwZWQgaWYgdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZWZpbmVkOgoKICAgICAgICAgICAgICAjZGVmaW5lIFNXSUdfU0hBUkVEX1BUUl9TVUJOQU1FU1BBQ0UgdHIxCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9zaGFyZWRfcHRyLmk+CgogICAgICAgICAgICBzaGFyZWRfcHRyIGlzIGFsc28gZG9jdW1lbnRlZCBpbiBMaWJyYXJ5Lmh0bWwgbm93LgoKMjAxMC0wNS0yNzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBhYmlsaXR5IGZvciAkdHlwZW1hcCBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcyB0byBjYWxsIG90aGVyICR0eXBlbWFwCiAgICAgICAgICAgIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBDQyAiQ0MiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBCQiAiJHR5cGVtYXAoY3N0eXBlLCBDQykiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSBBQSAiJHR5cGVtYXAoY3N0eXBlLCBCQikiCiAgICAgICAgICAgICAgdm9pZCBoYWgoQUEgYWEpOwoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIEMjIHN0ZDo6dmVjdG9yIGNvbnRhaW5lcnMgb2Ygc2hhcmVkX3B0ciBhbmQgJXNoYXJlZF9wdHIuCgogICAgICAgICAgICBBbHNvIGFkZGVkIGRpYWdub3N0aWNzIGZvciAkdHlwZW1hcCB3aXRoIC1kZWJ1Zy10bXNlYXJjaCwgZm9yIGV4YW1wbGUsIHRoZQogICAgICAgICAgICBhYm92ZSBkaXNwbGF5cyBhZGRpdGlvbmFsIGRpYWdub3N0aWMgbGluZXMgc3RhcnRpbmcgIkNvbnRhaW5pbmc6ICI6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozNDogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBBQSBhYQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEFBIGFhCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQUEKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIEFBCiAgICAgICAgICAgICAgICBDb250YWluaW5nOiAkdHlwZW1hcChjc3R5cGUsIEJCKQogICAgICAgICAgICAgIGV4YW1wbGUuaTozMTogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdjc3R5cGUnIHR5cGVtYXAgZm9yOiBCQgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEJCCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBCQgogICAgICAgICAgICAgICAgQ29udGFpbmluZzogJHR5cGVtYXAoY3N0eXBlLCBDQykKICAgICAgICAgICAgICBleGFtcGxlLmk6Mjk6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQ0MKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBDQwogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQ0MKCjIwMTAtMDUtMjY6IG9sbHkKCSAgICBGaXggJWF0dHJpYnV0ZTJyZWYgbm90IHRvIHByb2R1Y2UgYSBzeW50YXggZXJyb3IgaWYgdGhlIGxhc3QKCSAgICBhcmd1bWVudCAoQWNjZXNzb3JNZXRob2QpIGlzIG9taXR0ZWQuICBQYXRjaCBmcm9tIERhdmlkIFBpZXBncmFzCgkgICAgaW4gU0YjMjIzNTc1Ni4KCjIwMTAtMDUtMjY6IG9sbHkKCSAgICBbUEhQXSBXaGVuIHVzaW5nICV0aHJvd3Mgb3IgJWNhdGNoZXMsIFNXSUctZ2VuZXJhdGVkIFBIUDUgd3JhcHBlcnMKCSAgICBub3cgdGhyb3cgUEhQIEV4Y2VwdGlvbiBvYmplY3RzIGluc3RlYWQgb2YgZ2l2aW5nIGEgUEhQIGVycm9yIG9mCgkgICAgdHlwZSBFX0VSUk9SLgoKCSAgICBUaGlzIGNoYW5nZSBzaG91bGRuJ3QgY2F1c2UgaW5jb21wYXRpYmlsaXR5IGlzc3Vlcywgc2luY2UgeW91IGNhbid0CgkgICAgc2V0IGFuIGVycm9yIGhhbmRsZXIgZm9yIEVfRVJST1IsIHNvIHByZXZpb3VzbHkgUEhQIHdvdWxkIGp1c3QgZXhpdAoJICAgIHdoaWNoIGFsc28gaGFwcGVucyBmb3IgdW5oYW5kbGVkIGV4Y2VwdGlvbnMuICBUaGUgYmVuZWZpdCBpcyB5b3UgY2FuCgkgICAgbm93IGNhdGNoIHRoZW0gaWYgeW91IHdhbnQgdG8uCgoJICAgIEZpeGVzIFNGIzI1NDU1NzggYW5kIFNGIzI5NTU1MjIuCgoyMDEwLTA1LTI1OiBvbGx5CgkgICAgW1BIUF0gQWRkIG1pc3NpbmcgZGlyZWN0b3JpbiB0eXBlbWFwIGZvciBjb25zdCBzdGQ6OnN0cmluZyAmLgoJICAgIEZpeGVzIFNGIzMwMDY0MDQgcmVwb3J0ZWQgYnkgdC1MZWdpYXcuCgoyMDEwLTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAjMjk1NzM3NSAtIFNXSUdTdHJpbmdIZWxwZXIgYW5kIFNXSUdFeGNlcHRpb25IZWxwZXIgbm90IGFsd2F5cyBiZWluZwogICAgICAgICAgICBpbml0aWFsaXplZCBiZWZvcmUgdXNlIGluIC5ORVQgNCBhcyB0aGUgY2xhc3NlcyB3ZXJlIG5vdCBtYXJrZWQgYmVmb3JlZmllbGRpbml0LgogICAgICAgICAgICBBIHN0YXRpYyBjb25zdHJ1Y3RvciBoYXMgYmVlbiBhZGRlZCB0byB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXByYWdtYShjc2hhcnApIGltY2xhc3Njb2RlPSV7CiAgICAgICAgICAgICAgICBzdGF0aWMgJGltY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBJZiB5b3UgaGFkIGFkZGVkIHlvdXIgb3duIGN1c3RvbSBzdGF0aWMgY29uc3RydWN0b3IgdG8gdGhlIGludGVybWVkaWFyeSBjbGFzcyBpbgogICAgICAgICAgICB0aGUgc2FtZSB3YXkgYXMgYWJvdmUsIHlvdSB3aWxsIGhhdmUgdG8gbW9kaWZ5IHlvdXIgYXBwcm9hY2ggdG8gdXNlIHN0YXRpYyB2YXJpYWJsZQogICAgICAgICAgICBpbml0aWFsaXphdGlvbiBvciBkZWZpbmUgU1dJR19DU0hBUlBfTk9fSU1DTEFTU19TVEFUSUNfQ09OU1RSVUNUT1IgLSBTZWUgY3NoYXJwaGVhZC5zd2cuCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNDA4MjMyLiBJbXByb3ZlIHNoYXJlZF9wdHIgYW5kIGludHJ1c2l2ZV9wdHIgd3JhcHBlcnMgZm9yIGNsYXNzZXMgaW4gYW4KICAgICAgICAgICAgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBObyBzcGVjaWFsIHRyZWF0bWVudCBpcyBuZWVkZWQgZm9yIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAgICAgICAgVGhlIHByb3h5IGNsYXNzIGFsc28gbm8gbG9uZ2VyIG5lZWRzIHRvIGJlIHNwZWNpZmllZCwgaXQgaXMgYXV0b21hdGljYWxseQogICAgICAgICAgICBkZWR1Y2VkLiBUaGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVwcmVjYXRlZDoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoUFJPWFlDTEFTUywgVFlQRSkKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChQUk9YWUNMQVNTLCBCQVNFQ0xBU1NUWVBFLCBUWVBFKQogICAgICAgICAgICBhbmQgaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgICAgJXNoYXJlZF9wdHIoVFlQRSkKICAgICAgICAgICAgU2ltaWxhcmx5IGZvciBpbnRydXNpdmVfcHRyIHdyYXBwZXJzLCB0aGUgZm9sbG93aW5nIG1hY3JvIGlzIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgICAgU1dJR19JTlRSVVNJVkVfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgICAgU1dJR19JTlRSVVNJVkVfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKICAgICAgICAgICAgYW5kIGhhdmUgYmVlbiByZXBsYWNlZCBieQogICAgICAgICAgICAgICVpbnRydXNpdmVfcHRyKFRZUEUpCgoyMDEwLTA1LTIxOiBvbGx5CgkgICAgW1BIUF0gU3RvcCBnZW5lcmF0aW5nIGEgYm9ndXMgbGluZSBvZiBjb2RlIGluIGNlcnRhaW4gY29uc3RydWN0b3JzLgoJICAgIFRoaXMgd2FzIG1vc3RseSBoYXJtbGVzcywgYnV0IGNhdXNlZCBhIFBIUCBub3RpY2UgdG8gYmUgaXNzdWVkLCBpZgoJICAgIGVuYWJsZWQgKFNGIzI5ODU2ODQpLgoKMjAxMC0wNS0xODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBtZW1iZXIgcG9pbnRlcnMgb24gNjQgYml0IHBsYXRmb3Jtcy4KCjIwMTAtMDUtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBvZiBDKysgZW51bSBib29sZWFuIHZhbHVlcyByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmY6CiAgICAgICAgICAgICAgdHlwZWRlZiBlbnVtIHsgUExBWSA9IHRydWUsIFNUT1AgPSBmYWxzZSB9IHBsYXlfc3RhdGU7CgoyMDEwLTA1LTE0OiBvbGx5CgkgICAgW1BIUF0gRml4IHdyYXBwaW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggd2FzIHByb2R1Y2luZwoJICAgIHVuY29tcGlsYWJsZSBjb2RlIGluIHNvbWUgY2FzZXMuCgoyMDEwLTA1LTEyOiBkcmpvZQoJICAgIFtSXSBBZGQgdHdvIG1vcmUgY2hhbmdlcyBmcm9tIFdpbCBOb2xhbi4gIEdldCBnYXJiYWdlCgkgICAgY29sbGVjdGlvbiB0byB3b3JrLiAgSW1wbGVtZW50IG5ld2ZyZWUKCjIwMTAtMDUtMDk6IGRyam9lCiAgICAgICAgICAgIEZpeCBidWcgcmVwb3J0ZWQgYnkgV2lsIE5vbGFuIGNoYW5nZSBjcmVhdGlvbiBvZiBzdHJpbmcgc28KICAgICAgICAgICAgdGhhdCBSIDIuNy4wKyBjYW4gdXNlIGNoYXIgaGFzaGVzCgoyMDEwLTA1LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMjk1NTE0NiBmcm9tIFNlcmdleSBTYXRza2l5IHRvIGZpeCBleHByZXNzaW9ucyBjb250YWluaW5nIGRpdmlkZSBieQogICAgICAgICAgICBvcGVyYXRvciBpbiBjb25zdHJ1Y3RvciBpbml0aWFsaXphdGlvbiBsaXN0cy4KCjIwMTAtMDUtMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBNZW1vcnkgbGVhayBmaXggaGFuZGxpbmcgY29uc3Qgc3RkOjpzdHJpbmcgJiBpbnB1dHMsIHJlcG9ydGVkIGJ5IFdpbGwgTm9sYW4uCgoyMDEwLTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBUeXBlbWFwIG1hdGNoaW5nIGVuaGFuY2VtZW50IGZvciBub24tZGVmYXVsdCB0eXBlbWFwcy4gUHJldmlvdXNseSBhbGwKICAgICAgICAgICAgcXVhbGlmaWVycyB3ZXJlIHN0cmlwcGVkIGluIG9uZSBzdGVwLCBub3cgdGhleSBhcmUgc3RyaXBwZWQgb25lIGF0IGEgdGltZQogICAgICAgICAgICBzdGFydGluZyB3aXRoIHRoZSBsZWZ0IG1vc3QgcXVhbGlmaWVyLiBGb3IgZXhhbXBsZSwgaW50IGNvbnN0KmNvbnN0IAogICAgICAgICAgICBpcyBmaXJzdCBzdHJpcHBlZCB0byBpbnQgKmNvbnN0IHRoZW4gaW50ICouCgoJICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxMC0wNC0yNTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjk4NTY1NSAtIGJyb2tlbiBjb25zdHJ1Y3RvciByZW5hbWluZy4KCjIwMTAtMDQtMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFR5cGVtYXAgZnJhZ21lbnRzIGFyZSBub3cgb2ZmaWNpYWwgYW5kIGRvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzIwNDgwNjQgYW5kICMyNDA4MDIwLgogICAgICAgICAgICBBcHBseSBVYnVudHUgcGF0Y2ggdG8gZml4IFJ1YnkgYW5kIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIHdpdGggLW1pbmhlcml0LgogICAgICAgICAgICBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9zd2lnMS4zLytidWcvNTIyODc0CgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbTXpzY2hlbWVdIEFwcGx5IFVidW50dSBwYXRjaCB0byBmaXggc3RkOjptYXAgd3JhcHBlcnM6CiAgICAgICAgICAgIGh0dHBzOi8vYnVncy5sYXVuY2hwYWQubmV0L3VidW50dS8rc291cmNlL3N3aWcxLjMvK2J1Zy8yMDM4NzYKCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMyOTUyMzc0IC0gZml4IGRpcmVjdG9ycyBhbmQgdGhlIC1ub3J0dGkgb3B0aW9uLgoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4ICMyODg3MjU0IGFuZCAjMjk0NjAzMiAtIFNXSUdfTHVhX3R5cGVuYW1lIHVzaW5nIHdyb25nIHN0YWNrIGluZGV4LgoKMjAxMC0wNC0wMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duIHdpdGggdGhlIC10aHJlYWRzIG9wdGlvbiBiYXNlZCBvbiBwYXRjaCBmcm9tIEFydG8gVnVvcmkuCiAgICAgICAgICAgIEZpeGVzIGJ1ZyAjMjgxODQ5OS4KCjIwMTAtMDQtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBNYWtlZmlsZSB0YXJnZXRzOiBkaXN0Y2xlYW4gYW5kIG1haW50YWluZXItY2xlYW4KCjIwMTAtMDQtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCBjaGFyIHBvaW50ZXJzLCB3Y2hhcl90IHBvaW50ZXJzIGFuZCBjaGFyIGFycmF5cyBzbyB0aGF0IG5pbCBjYW4gYmUgcGFzc2VkIGFzIGEKICAgICAgICAgICAgdmFsaWQgdmFsdWUuIEJ1ZyByZXBvcnRlZCBieSBHZWRhbGlhIFBhc3Rlcm5hay4KCjIwMTAtMDQtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIE51bWVyb3VzIHN1YnRsZSB0eXBlbWFwIG1hdGNoaW5nIHJ1bGUgZml4ZXMgd2hlbiB1c2luZyB0aGUgZGVmYXVsdCB0eXBlLiBUaGUgdHlwZW1hcAogICAgICAgICAgICBtYXRjaGluZyBydWxlcyBhcmUgdG8gdGFrZSBhIHR5cGUgYW5kIGZpbmQgdGhlIGJlc3QgZGVmYXVsdCB0eXBlbWFwIChTV0lHVFlQRSwgU1dJR1RZUEUqIGV0YyksCiAgICAgICAgICAgIHRoZW4gbG9vayBmb3IgdGhlIG5leHQgYmVzdCBtYXRjaCBieSByZWR1Y2luZyB0aGUgY2hvc2VuIGRlZmF1bHQgdHlwZS4gVGhlIHR5cGUgZGVkdWN0aW9uCiAgICAgICAgICAgIG5vdyBmb2xsb3dzIEMrKyBjbGFzcyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG1hdGNoaW5nIHJ1bGVzLgoKICAgICAgICAgICAgQmVsb3cgYXJlIHRoZSBzZXQgb2YgY2hhbmdlcyBtYWRlIHNob3dpbmcgdGhlIGRlZmF1bHQgdHlwZSBkZWR1Y3Rpb24KICAgICAgICAgICAgYWxvbmcgd2l0aCB0aGUgb2xkIHJlZHVjZWQgdHlwZSBhbmQgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSByZWR1Y2VkIHR5cGU6CgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgJltBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCAmW10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICgmKVtBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSBjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKltBTlldCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgY29uc3QgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QgW0FOWV0KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIGNvbnN0ICpbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICpjb25zdCAmCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QgJgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgY29uc3QgKiYKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgKgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgKgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKioKCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqY29uc3QgJgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgJgogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKiYKCiAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgYSBjb25zdCBTV0lHVFlQRSBsb29rdXAgaXMgdXNlZCBub3cgZm9yIGFueSBjb25zdGFudCB0eXBlLiBTb21lIGV4YW1wbGVzLCB3aGVyZQogICAgICAgICAgICBUIGlzIHNvbWUgcmVkdWNlZCB0eXBlLCBlZyBpbnQsIHN0cnVjdCBGb286CgogICAgICAgICAgICAgICAgICAgVCBjb25zdAogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFCgogICAgICAgICAgICAgICAgICAgVCAqY29uc3QKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICpjb25zdAogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKgoKICAgICAgICAgICAgICAgICAgIFQgY29uc3RbXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3RbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEVbXQoKICAgICAgICAgICAgICAgICAgIGVudW0gVCBjb25zdAogICAgICAgICAgICAgIG5ldzogZW51bSBTV0lHVFlQRSBjb25zdAogICAgICAgICAgICAgIG9sZDogZW51bSBTV0lHVFlQRQoKICAgICAgICAgICAgICAgICAgIFQgKCpjb25zdCApW10KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFICgqY29uc3QgKVtdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAoKilbXQoKICAgICAgICAgICAgUmVtaW5kZXI6IHRoZSB0eXBlbWFwIG1hdGNoaW5nIHJ1bGVzIGNhbiBub3cgYmUgc2VlbiBmb3IgYW55IHR5cGVzIGJlaW5nIHdyYXBwZWQgYnkgdXNpbmcKICAgICAgICAgICAgZWl0aGVyIHRoZSAtZGVidWctdG1zZWFyY2ggb3IgLWRlYnVnLXRtdXNlZCBvcHRpb25zLgoKICAgICAgICAgICAgSW4gcHJhY3RpY2UgdGhpcyBsZWFkcyB0byBzb21lIHN1YnRsZSBtYXRjaGluZyBydWxlIGNoYW5nZXMgYW5kIHRoZSBtYWpvcml0eSBvZiB1c2VycwogICAgICAgICAgICB3b24ndCBub3RpY2UgYW55IGNoYW5nZXMsIGV4Y2VwdCBpbiB0aGUgcHJpbWUgYXJlYSBvZiBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZTogSW1wcm92ZQogICAgICAgICAgICBTVEwgY29udGFpbmVycyBvZiBjb25zdCBwb2ludGVycyBhbmQgcGFzc2luZyBjb25zdCBwb2ludGVycyBieSByZWZlcmVuY2UuIFRoaXMgaXMgZml4ZWQKICAgICAgICAgICAgYmVjYXVzZSBtYW55IG9mIHRoZSBTVEwgY29udGFpbmVycyB1c2UgYSB0eXBlICdUIGNvbnN0JicgYXMgcGFyYW1ldGVycyBhbmQgd2hlbiBUIGlzIAogICAgICAgICAgICBhIGNvbnN0IHBvaW50ZXIsIGZvciBleGFtcGxlLCAnSyBjb25zdConLCB0aGVuIHRoZSBmdWxsIHR5cGUgaXMgJ0sgY29uc3QqY29uc3QmJy4gVGhpcwogICAgICAgICAgICBtZWFucyB0aGF0IHRoZSAnU1dJR1RZUEUgKmNvbnN0JicgdHlwZW1hcHMgbm93IG1hdGNoIHdoZW4gVCBpcyBlaXRoZXIgYSBub24tY29uc3Qgb3IKICAgICAgICAgICAgY29uc3QgcG9pbnRlci4gRnVydGhlcm1vcmUsIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcyBpbmNvcnJlY3RseSBoYWQgJ1NXSUdUWVBFIComJyB0eXBlbWFwcwogICAgICAgICAgICB3aGVuIHRoZXNlIHNob3VsZCBoYXZlIGJlZW4gJ1NXSUdUWVBFICpjb25zdCYnLiBUaGVzZSBoYXZlIGJlZW4gY29ycmVjdGVkIChKYXZhLCBDIywgTHVhLCBQSFApLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTb21lIHZlcnkgb2xkIGRlcHJlY2F0ZWQgcHJhZ21hIHdhcm5pbmdzIGFyZSBub3cgZXJyb3JzLgoKMjAxMC0wMy0xMzogd3NmdWx0b24KICAgICAgICAgICAgSW1wcm92ZSBoYW5kbGluZyBvZiBmaWxlIG5hbWVzIGFuZCBkaXJlY3RvcmllcyBjb250YWluaW5nIGRvdWJsZS9tdWx0aXBsZSBwYXRoIHNlcGFyYXRvcnMuCgoyMDEwLTAzLTEwOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gVXNlIGZ1bGx5IHF1YWxpZmllZCBzeW1ib2wgbmFtZSBvZiBjbDo6aWRlbnRpdHkgaW4gZW1pdF9kZWZ1bigpLgoKMjAxMC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFRoZSBpbnRlcm1lZGlhcnkgSk5JIGNsYXNzIG1vZGlmaWVycyBhcmUgbm93IHB1YmxpYyBieSBkZWZhdWx0IG1lYW5pbmcgdGhlc2UKICAgICAgICAgICAgaW50ZXJtZWRpYXJ5IGxvdyBsZXZlbCBmdW5jdGlvbnMgYXJlIG5vdyBhY2Nlc3NpYmxlIGJ5IGRlZmF1bHQgZnJvbSBvdXRzaWRlIGFueSBwYWNrYWdlCiAgICAgICAgICAgIHVzZWQuIFRoZSBwcm94eSBjbGFzcyBwb2ludGVyIGNvbnN0cnVjdG9yIGFuZCBnZXRDUHRyKCkgbWV0aG9kcyBhcmUgYWxzbyBub3cgcHVibGljLgogICAgICAgICAgICBUaGVzZSBhcmUgbmVlZGVkIGluIG9yZGVyIGZvciB0aGUgbnNwYWNlIG9wdGlvbiB0byB3b3JrIHdpdGhvdXQgYW55IG90aGVyIG1vZHMuCiAgICAgICAgICAgIFRoZSBwcmV2aW91cyBkZWZhdWx0IG9mIHByb3RlY3RlZCBhY2Nlc3MgY2FuIGJlIHJlc3RvcmVkIHVzaW5nOgoKICAgICAgICAgICAgICBTV0lHX0pBVkFCT0RZX01FVEhPRFMocHJvdGVjdGVkLCBwcm90ZWN0ZWQsIFNXSUdUWVBFKQogICAgICAgICAgICAgICVwcmFnbWEoamF2YSkgam5pY2xhc3NjbGFzc21vZGlmaWVycyA9ICJjbGFzcyIKCjIwMTAtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgdGhlIG5zcGFjZSBmZWF0dXJlIGZvciBDIy4gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIG5zcGFjZSBmZWF0dXJlIGlzIG5vdyBhdmFpbGFibGUuCgoyMDEwLTAzLTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbnNwYWNlIGZlYXR1cmUuIFRoaXMgYWRkcyBzb21lIGltcHJvdmVkIG5hbWVzcGFjZSBzdXBwb3J0LiBDdXJyZW50bHkgb25seSBKYXZhCiAgICAgICAgICAgIGlzIHN1cHBvcnRlZCBmb3IgdGFyZ2V0IGxhbmd1YWdlcywgd2hlcmUgQysrIG5hbWVzcGFjZXMgYXJlIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlZCBpbnRvCiAgICAgICAgICAgIEphdmEgcGFja2FnZXMuIFRoZSBmZWF0dXJlIG9ubHkgYXBwbGllcyB0byBjbGFzc2VzLHN0cnVjdCx1bmlvbnMgYW5kIGVudW1zIGRlY2xhcmVkIHdpdGhpbgogICAgICAgICAgICBhIG5hbWVzcGFjZS4gTWV0aG9kcyBhbmQgdmFyaWFibGVzIGRlY2xhcmVkIGluIG5hbWVzcGFjZXMgc3RpbGwgZWZmZWN0aXZlbHkgaGF2ZSB0aGVpcgogICAgICAgICAgICBuYW1lc3BhY2VzIGZsYXR0ZW5lZC4gRXhhbXBsZSB1c2FnZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUobnNwYWNlKSBPdXRlcjo6SW5uZXIxOjpDb2xvcjsKICAgICAgICAgICAgICAlZmVhdHVyZShuc3BhY2UpIE91dGVyOjpJbm5lcjI6OkNvbG9yOwoKICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIElubmVyMSB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb2xvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgSW5uZXIyIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IENvbG9yIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGb3IgSmF2YSwgdGhlIC1wYWNrYWdlIG9wdGlvbiBpcyBhbHNvIHJlcXVpcmVkIHdoZW4gdXNpbmcgdGhlIG5zcGFjZSBmZWF0dXJlLiBTYXkKICAgICAgICAgICAgd2UgdXNlIC1wYWNrYWdlIGNvbS5teWNvLCB0aGUgdHdvIGNsYXNzZXMgY2FuIHRoZW4gYmUgYWNjZXNzZWQgYXMgZm9sbG93cyBmcm9tIEphdmE6CgogICAgICAgICAgICAgIGNvbS5teWNvLk91dGVyLklubmVyMS5Db2xvciBhbmQgY29tLm15Y28uT3V0ZXIuSW5uZXIyLkNvbG9yLgoKMjAxMC0wMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUmVtb3ZlIC1kaXJ2dGFibGUgZnJvbSB0aGUgb3B0aW1pemF0aW9ucyBpbmNsdWRlZCBieSAtTyBhcyBpdCB0aGlzIG9wdGlvbgogICAgICAgICAgICBjdXJyZW50bHkgbGVhZHMgdG8gbWVtb3J5IGxlYWtzIGFzIHJlcG9ydGVkIGJ5IEpvaGFuIEJsYWtlLgoKMjAxMC0wMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgTGljZW5zZSBjb2RlIGNoYW5nZXM6IFNXSUcgU291cmNlIGlzIEdQTC12MyBhbmQgbGlicmFyeSBjb2RlIGxpY2Vuc2UgaXMgbm93IGNsZWFyZXIKICAgICAgICAgICAgYW5kIGlzIHByb3ZpZGVkIHVuZGVyIGEgdmVyeSBwZXJtaXNzaXZlIGxpY2Vuc2UuIFNlZSBodHRwOi8vd3d3LnN3aWcub3JnL2xlZ2FsLmh0bWwuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gQSBmZXcgZml4ZXMgZm9yIGNvbXBpbGluZyB1bmRlciBydWJ5LTEuOS54IGluY2x1ZGluZyBwYXRjaCBmcm9tICdOaWJibGUnLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoIGZyb20gUGF0cmljayBCZW5uZXR0IHRvIGZpeCBSQVJSQVlfTEVOIGFuZCBSQVJSQVlfUFRSIHVzYWdlIGZvciBSdWJ5IDEuOS54CiAgICAgICAgICAgIHVzZWQgaW4gdmFyaW91cyBTVEwgd3JhcHBlcnMuCgoyMDEwLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCBpbmNvcnJlY3QgbXVsdGlwbHkgZGVmaW5lZCBzeW1ib2wgbmFtZSBlcnJvciB3aGVuIGFuIGVudW0gaXRlbQogICAgICAgICAgICBhbmQgY2xhc3MgbmFtZSBoYXZlIHRoZSBzYW1lIG5hbWUsIGFzIHJlcG9ydGVkIGJ5IE5hdGhhbiBLcmllZ2VyLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBWZWN0b3Ige307CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFRleHQgewogICAgICAgICAgICAgICAgZW51bSBQcmVmZXJlbmNlIHsgVmVjdG9yIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzIG90aGVyIGluY29ycmVjdCBjb3JuZXIgY2FzZSB0YXJnZXQgbGFuZ3VhZ2Ugc3ltYm9sIG5hbWUgY2xhc2hlcy4KCjIwMTAtMDItMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgLWRlYnVnLWxzeW1ib2xzIG9wdGlvbiBmb3IgZGlzcGxheWluZyB0aGUgdGFyZ2V0IGxhbmd1YWdlIGxheWVyIHN5bWJvbHMuCgoyMDEwLTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggLU1NIGFuZCAtTU1EIG9wdGlvbnMgb24gV2luZG93cy4gVGhleSB3ZXJlIG5vdCBvbWl0dGluZyBmaWxlcyBpbiB0aGUgU1dJRyBsaWJyYXJ5IGFzCiAgICAgICAgICAgIHRoZXkgc2hvdWxkIGJlLgoKMjAxMC0wMi0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxODA3MzI5IC0gV2hlbiBNYWtlZmlsZSBkZXBlbmRlbmNpZXMgYXJlIGJlaW5nIGdlbmVyYXRlZCB1c2luZyB0aGUgLU0gZmFtaWx5IG9mIG9wdGlvbnMKICAgICAgICAgICAgb24gV2luZG93cywgdGhlIGZpbGUgcGF0aHMgaGF2ZSBiZWVuIGNvcnJlY3RlZCB0byB1c2Ugc2luZ2xlIGJhY2tzbGFzaGVzIHJhdGhlciB0aGFuIGRvdWJsZQogICAgICAgICAgICBiYWNrc2xhc2hlcyBhcyBwYXRoIHNlcGFyYXRvcnMuCgoyMDEwLTAyLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI5MTg5MDIgLSBsYW5ndWFnZSBzcGVjaWZpYyBmaWxlcyBub3QgYmVpbmcgZ2VuZXJhdGVkIGluIGNvcnJlY3QgZGlyZWN0b3J5IG9uCiAgICAgICAgICAgIFdpbmRvd3Mgd2hlbiB1c2luZyBmb3J3YXJkIHNsYXNoZXMgZm9yIC1vLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzd2lnIC1weXRob24gLWMrKyAtbyBzdWJkaXJlY3RvcnkvdGhlaW50ZXJmYWNlX3dyYXAuY3BwIHN1YmRpcmVjdG9yeS90aGVpbnRlcmZhY2UuaQoKMjAxMC0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyODk0NDA1IC0gYXNzZXJ0aW9uIHdoZW4gdXNpbmcgLXhtbG91dC4KCjIwMTAtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlbWFwIG1hdGNoaW5nIGJ1ZyB3aGVuIGEgdGVtcGxhdGVkIHR5cGUgaGFzIGEgdHlwZW1hcCBib3RoIHNwZWNpYWxpemVkIGFuZCBub3QKICAgICAgICAgICAgc3BlY2lhbGl6ZWQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgWFggeyAuLi4gfTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWFggJiAiLi4uIgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBYWDwgaW50ID4gJiAiLi4uIgoKICAgICAgICAgICAgcmVzdWx0ZWQgaW4gdGhlIDJuZCB0eXBlbWFwIGJlaW5nIGFwcGxpZWQgZm9yIGFsbCBUIGluIFhYPCBUID4uCgoyMDEwLTAxLTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI5MzMxMjkgLSB0eXBlbWFwcyBub3QgYmVpbmcgZm91bmQgd2hlbiB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBpcyB1c2VkIHRvIGRlbm90ZQogICAgICAgICAgICBnbG9iYWwgc2NvcGUsIHRoZSB0eXBlbWFwIGlzIG5vdyB1c2VkIGluIHNpdHVhdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7fTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWCAmICIuLi4iCiAgICAgICAgICAgICAgdm9pZCBtKGNvbnN0IDo6WCAmKTsKCiAgICAgICAgICAgIGFuZCB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7fTsKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgOjpYICYgIi4uLiIKICAgICAgICAgICAgICB2b2lkIG0oY29uc3QgWCAmKTsKCjIwMTAtMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgZGVub3RpbmcgZ2xvYmFsIHNjb3BlIHByb2JsZW1zIGluIHRoZSB0eXBlcyBnZW5lcmF0ZWQKICAgICAgICAgICAgaW50byB0aGUgQysrIGxheWVyLiBQcmV2aW91c2x5IHRoZSB1bmFyeSBzY29wZSBvcGVyYXRvciB3YXMgZHJvcHBlZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgaWYgdGhlIHR5cGUgaGFkIGFueSBzb3J0IG9mIHF1YWxpZmllciwgZm9yIGV4YW1wbGUgd2hlbiB1c2luZyBwb2ludGVycywgcmVmZXJlbmNlcywgbGlrZQogICAgICAgICAgICA6OmZvbyosIDo6Zm9vJiwgYmFyPCA6OmZvbyogPi4KCjIwMTAtMDEtMTM6IG9sbHkKCSAgICBbUEhQXSBBZGQgZGF0ZXRpbWUgdG8gdGhlIGxpc3Qgb2YgUEhQIHByZWRlZmluZWQgY2xhc3NlcyAocGF0Y2gKCSAgICBmcm9tIERhdmlkIEZsZXRjaGVyIGluIFNGIzI5MzEwNDIpLgoKMjAxMC0wMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgU2xpZ2h0IGNoYW5nZSB0byB3YXJuaW5nLCBlcnJvciBhbmQgZGlhZ25vc3RpYyByZXBvcnRpbmcuIFRoZSB3YXJuaW5nIG51bWJlciBpcyBubyAKICAgICAgICAgICAgbG9uZ2VyIHNob3duIHdpdGhpbiBicmFja2V0cy4gVGhpcyBpcyB0byBoZWxwIGRlZmF1bHQgcGFyc2luZyBvZiB3YXJuaW5nIG1lc3NhZ2VzIGJ5CiAgICAgICAgICAgIG90aGVyIHRvb2xzLCB2aW0gb24gVW5peCBpbiBwYXJ0aWN1bGFyLgoKICAgICAgICAgICAgRXhhbXBsZSBvcmlnaW5hbCBkaXNwbGF5IHVzaW5nIC1Gc3RhbmRhcmQ6CiAgICAgICAgICAgICAgZXhhbXBsZS5pOjIwOiBXYXJuaW5nKDQwMSk6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQicuIElnbm9yZWQuCiAgICAgICAgICAgIE5ldyBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaToyMDogV2FybmluZyA0MDE6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQicuIElnbm9yZWQuCgogICAgICAgICAgICBBbHNvIHN1YnRsZSBmaXggdG8gLUZtaWNyb3NvZnQgZm9ybWF0IGFkZGluZyBpbiBtaXNzaW5nIHNwYWNlLiBFeGFtcGxlIG9yaWdpbmFsIGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pKDIwKTogV2FybmluZyg0MDEpOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0Jhc2UnLiBJZ25vcmVkLgogICAgICAgICAgICBOZXcgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmkoMjApIDogV2FybmluZyA0MDE6IE5vdGhpbmcga25vd24gYWJvdXQgYmFzZSBjbGFzcyAnQmFzZScuIElnbm9yZWQuCgoyMDEwLTAxLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYSBmZXcgaW5jb25zaXN0ZW5jaWVzIGluIHJlcG9ydGluZyBvZiBmaWxlL2xpbmUgbnVtYmVyaW5ncyBpbmNsdWRpbmcgbW9kaWZ5aW5nCiAgICAgICAgICAgIHRoZSBvdmVybG9hZCB3YXJuaW5ncyA1MDksIDUxMiwgNTE2LCA0NzQsIDQ3NSB0byBub3cgYmUgdHdvIGxpbmUgd2FybmluZ3MuCgoyMDEwLTAxLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgLWRlYnVnLXRhZ3Mgb3V0cHV0IHRvIHVzZSBzdGFuZGFyZCBmaWxlIG5hbWUvbGluZSByZXBvcnRpbmcgc28gdGhhdCBlZGl0b3JzCiAgICAgICAgICAgIGNhbiBlYXNpbHkgbmF2aWdhdGUgdG8gdGhlIGFwcHJvcHJpYXRlIGxpbmVzLgogICAgICAgICAgICBXYXMgdHlwaWNhbGx5OgogICAgICAgICAgICAgIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgKC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnLnN3ZzozMTIpCiAgICAgICAgICAgICAgLiB0b3AgLiBpbmNsdWRlIC4gaW5jbHVkZSAuIGluY2x1ZGUgKC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnd2FybmluZ3Muc3dnOjM5KQogICAgICAgICAgICBub3c6CiAgICAgICAgICAgICAgL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWcuc3dnOjMxMjogIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUKICAgICAgICAgICAgICAvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZ3dhcm5pbmdzLnN3ZzozOTogIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgLiBpbmNsdWRlCgoyMDEwLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbWlzc2luZyBmaWxlL2xpbmUgbnVtYmVycyBmb3IgdHlwZW1hcCB3YXJuaW5ncyBhbmQgaW4gb3V0cHV0IGZyb20gdGhlCiAgICAgICAgICAgLWRlYnVnLXRtc2VhcmNoLy1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCjIwMTAtMDEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0eXBlbWFwcyB1c2VkIGRlYnVnZ2luZyBvcHRpb24gKC1kZWJ1Zy10bXVzZWQpLiBXaGVuIHVzZWQgZWFjaCBsaW5lIGRpc3BsYXlzCiAgICAgICAgICAgIHRoZSB0eXBlbWFwIHVzZWQgZm9yIGVhY2ggdHlwZSBmb3Igd2hpY2ggY29kZSBpcyBiZWluZyBnZW5lcmF0ZWQgaW5jbHVkaW5nIHRoZSBmaWxlCiAgICAgICAgICAgIGFuZCBsaW5lIG51bWJlciByZWxhdGVkIHRvIHRoZSB0eXBlLiBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgY29uZGVuc2VkIGZvcm0gb2YgdGhlCiAgICAgICAgICAgIC1kZWJ1Zy10bXNlYXJjaCBvcHRpb24uIERvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWphdmFleGNlcHRpb24gYW5kIGRpcmVjdG9ycyBzbyB0aGF0IGFsbCB0aGUgYXBwcm9wcmlhdGUgdGhyb3dzIGNsYXVzZXMgCiAgICAgICAgICAgIGFyZSBnZW5lcmF0ZWQuIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGV0ZXIgR3JlZW53b29kLgoKMjAwOS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIC1kZWJ1Zy10bXNlYXJjaCBvcHRpb24gZm9yIGRlYnVnZ2luZyB0aGUgdHlwZW1hcCBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGVzLgogICAgICAgICAgICBEb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTEyLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbT2N0YXZlXSBSZW1vdmUgdGhlIC1hcGkgb3B0aW9uIGFuZCB1c2UgdGhlIG5ldyBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSCiAgICAgICAgICAgIG1hY3JvIHByb3ZpZGVkIGluIHRoZSBvY3RhdmUgaGVhZGVycyBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwaSB2ZXJzaW9uIGluc3RlYWQuCgoyMDA5LTEyLTA0OiBvbGx5CgkgICAgW1J1YnldIEltcHJvdmUgc3VwcG9ydCBmb3IgUnVieSAxLjkgdW5kZXIgR0NDLiAgQWRkcmVzc2VzIHBhcnQgb2YKCSAgICBTRiMyODU5NjE0LgoKMjAwOS0xMi0wNDogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBtb2R1bG8gb3BlcmF0b3IgKCUpIGluIGNvbnN0YW50IGV4cHJlc3Npb25zCgkgICAgKFNGIzI4MTg1NjIpLgoKMjAwOS0xMi0wNDogb2xseQoJICAgIFtQSFBdICJlbXB0eSIgaXMgYSByZXNlcnZlZCB3b3JkIGluIFBIUCwgc28gcmVuYW1lIGVtcHR5KCkgbWV0aG9kCgkgICAgb24gU1RMIGNsYXNzZXMgdG8gImlzX2VtcHR5KCkiIChwcmV2aW91c2x5IHRoaXMgd2FzIGF1dG9tYXRpY2FsbHkKCSAgICByZW5hbWVkIHRvICJjX2VtcHR5KCkiKS4KCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMTItMDM6IG9sbHkKCSAgICBbUEhQXSBBZGQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLCBhbmQgZm9yCgkgICAgcG9pbnRlciB0byBtZXRob2QuCgoyMDA5LTEyLTAyOiBvbGx5CgkgICAgW1BIUF0gRml4IHdhcm5pbmcgYW5kIHJlbmFtZSBvZiByZXNlcnZlZCBjbGFzcyBuYW1lIHRvIGJlIGNhc2UKCSAgICBpbnNlbnNpdGl2ZS4KCjIwMDktMTItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFJldmVydCBzdXBwb3J0IGZvciAlZXh0ZW5kIGFuZCBtZW1iZXJpbiB0eXBlbWFwcyBhZGRlZCBpbiBzd2lnLTEuMy4zOS4gVGhlCgkgICAgbWVtYmVyaW4gdHlwZW1hcHMgYXJlIGlnbm9yZWQgYWdhaW4gZm9yIG1lbWJlciB2YXJpYWJsZXMgd2l0aGluIGEgJWV4dGVuZCBibG9jay4KICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBpbmNvbnNpc3RlbmN5IHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMDktMTEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGdlbmVyYXRlZCBxdW90aW5nIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKSBmb3IgCiAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1lbWJlciB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQTsKICAgICAgICAgICAgICAlY3Njb25zdCgxKSBBOwogICAgICAgICAgICAgIHN0cnVjdCBYIHsKICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIEEgPSAnQSc7IAogICAgICAgICAgICAgIH07CgoyMDA5LTExLTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpIGZvciBzdGF0aWMgY29uc3QgbWVtYmVyIHZhcmlhYmxlcyB0bwogICAgICAgICAgICB1c2UgdGhlIGFjdHVhbCBjb25zdGFudCB2YWx1ZSBpZiBpdCBpcyBzcGVjaWZpZWQsIHJhdGhlciB0aGFuIHRoZSBDKysgY29kZSB0bwogICAgICAgICAgICBhY2Nlc3MgdGhlIG1lbWJlci4KCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBFTjsKICAgICAgICAgICAgICAlY3Njb25zdCgxKSBFTjsKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IEVOID0gMjsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0yMzogd3NmdWx0b24KICAgICAgICAgICAgQysrIG5lc3RlZCB0eXBlZGVmIGNsYXNzZXMgY2FuIG5vdyBiZSBoYW5kbGVkIHRvbywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIHsgfSBGb29UeXBlZGVmMSwgRm9vVHlwZWRlZjI7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmb3IgQyBuZXN0ZWQgc3RydWN0cyBhcmUgbm93IGdlbmVyYXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBkZWNsYXJlZCAKICAgICAgICAgICAgaW4gdGhlIHBhcnNlZCBjb2RlLgoKMjAwOS0xMS0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICM0OTE0NzYgLSBtdWx0aXBsZSBkZWNsYXJhdGlvbnMgb2YgbmVzdGVkIHN0cnVjdHMsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICBpbnQgdmFsOwogICAgICAgICAgICAgICAgfSBpbm5lcjEsIGlubmVyMiwgKmlubmVyMywgaW5uZXI0WzFdOwogICAgICAgICAgICAgIH0gb3V0ZXI7CgoyMDA5LTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2luZyBvZiBlbnVtIGRlY2xhcmF0aW9uIGFuZCBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGVudW0gQUJDIHsKICAgICAgICAgICAgICAgIGEsCiAgICAgICAgICAgICAgICBiLAogICAgICAgICAgICAgICAgYwogICAgICAgICAgICAgIH0gQSA9IGEsICpwQyA9ICZDLCBhcnJheVszXSA9IHthLCBiLCBjfTsKCjIwMDktMTEtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwYXJzaW5nIG9mIHN0cnVjdCBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUyB7CiAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgfSBpbnN0YW5jZSA9IHsgMTAgfTsKCjIwMDktMTEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTk2MDk3NyAtIFN5bnRheCBlcnJvciBwYXJzaW5nIGRlcml2ZWQgbmVzdGVkIGNsYXNzIGRlY2xhcmF0aW9uIGFuZCBtZW1iZXIKICAgICAgICAgICAgdmFyaWFibGUgaW5zdGFuY2UuCgoyMDA5LTExLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzIzMTA0ODMgLSBmdW5jdGlvbiBwb2ludGVyIHR5cGVkZWYgd2l0aGluIGV4dGVybiAiQyIgYmxvY2suCgoyMDA5LTExLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNhZ2Ugb2YgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgd2l0aGluIHRlbXBsYXRlZCBjbGFzc2VzIHNvIHRoYXQgY29tcGlsYWJsZSBjb2RlIAogICAgICAgICAgICBpcyBnZW5lcmF0ZWQuCgoyMDA5LTExLTEzOiBvbGx5CgkgICAgW3BocF0gRml4IHBsYWNlIHdoZXJlIGNsYXNzIHByZWZpeCAoYXMgc3BlY2lmaWVkIHdpdGggLXByZWZpeCkKCSAgICB3YXNuJ3QgYmVpbmcgdXNlZC4gIFBhdGNoIGZyb20gZ3ZlcmJydWdnZW4gaW4gU0YjMjg5MjY0Ny4KCjIwMDktMTEtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2FnZSBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyBzbyB0aGF0IGNvbXBpbGFibGUgY29kZSBpcyBnZW5lcmF0ZWQgLSB0aGUgbmVzdGVkCiAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIGlzIG5vdyB0cmVhdGVkIGxpa2UgYSBub3JtYWwgbmVzdGVkIGNsYXNzZXMsIHRoYXQgaXMsIGFzIGFuIG9wYXF1ZSB0eXBlCiAgICAgICAgICAgIHVubGVzcyB0aGUgbmVzdGVkd29ya2Fyb3VuZCBmZWF0dXJlIGlzIHVzZWQuCgoyMDA5LTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXBsYWNlIFNXSUdXQVJOX1BBUlNFX05FU1RFRF9DTEFTUyB3aXRoIFNXSUdXQVJOX1BBUlNFX05BTUVEX05FU1RFRF9DTEFTUyBhbmQKICAgICAgICAgICAgU1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MgZm9yIG5hbWVkIGFuZCB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIHJlc3BlY3RpdmVseS4KCiAgICAgICAgICAgIE5hbWVkIG5lc3RlZCBjbGFzcyBpZ25vcmVkIHdhcm5pbmdzIGNhbiBub3cgYmUgc3VwcHJlc3NlZCBieSBuYW1lIHVzaW5nICV3YXJuZmlsdGVyLCBlZzoKCiAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoU1dJR1dBUk5fUEFSU0VfTkFNRURfTkVTVEVEX0NMQVNTKSBPdXRlcjo6SW5uZXI7CgogICAgICAgICAgICBidXQgY2xlYXJseSB1bm5hbWVkIG5lc3RlZCBjbGFzc2VzIGNhbm5vdCBhbmQgdGhlIGdsb2JhbCBzdXBwcmVzc2lvbiBpcyBzdGlsbCByZXF1aXJlZCwgZWc6CgogICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49U1dJR1dBUk5fUEFSU0VfVU5OQU1FRF9ORVNURURfQ0xBU1MKCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBuZXN0ZWR3b3JrYXJvdW5kIGZlYXR1cmUgYXMgYSB3YXkgdG8gdXNlIHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHkgb2YgYSBuZXN0ZWQgY2xhc3MgCiAgICAgICAgICAgIChDKysgbW9kZSBvbmx5KS4gSXQgcmVtb3ZlcyB0aGUgbmVzdGVkIGNsYXNzIGZyb20gU1dJRydzIHR5cGUgaW5mb3JtYXRpb24gc28gaXQgaXMgYXMgaWYgU1dJRwogICAgICAgICAgICBoYWQgbmV2ZXIgcGFyc2VkIHRoZSBuZXN0ZWQgY2xhc3MuIFRoZSBkb2N1bWVudGVkIG5lc3RlZCBjbGFzcyB3b3JrYXJvdW5kcyB1c2luZyBhIGdsb2JhbAogICAgICAgICAgICBmYWtlIGNsYXNzIHN0b3BwZWQgd29ya2luZyB3aGVuIFNXSUcgdHJlYXRlZCB0aGUgbmVzdGVkIGNsYXNzIGFzIGFuIG9wYXF1ZSBwb2ludGVyLCBhbmQKICAgICAgICAgICAgdGhpcyBmZWF0dXJlIHJldmVydHMgdGhpcyBiZWhhdmlvdXIuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBkZXRhaWxzIG9mIGhvdwogICAgICAgICAgICB0byB1c2UgYW5kIGltcGxlbWVudCBpdCwgc2VlIHRoZSAiTmVzdGVkIGNsYXNzZXMiIHNlY3Rpb24gaW4gU1dJR1BsdXMuaHRtbC4KCjIwMDktMTEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZXJlIHdlcmUgYSBudW1iZXIgb2YgQysrIGNhc2VzIHdoZXJlIG5lc3RlZCBjbGFzc2VzL3N0cnVjdHMvdW5pb25zIHdlcmUgYmVpbmcgaGFuZGxlZAogICAgICAgICAgICBhcyBpZiBDIGNvZGUgd2FzIGJlaW5nIHBhcnNlZCB3aGljaCB3b3VsZCBvZnRlbnRpbWVzIGxlYWQgdG8gdW5jb21waWxhYmxlIGNvZGUgYXMgYW4KICAgICAgICAgICAgYXR0ZW1wdCB3YXMgbWFkZSB0byB3cmFwIHRoZSBuZXN0ZWQgc3RydWN0cyBsaWtlIGl0IGlzIGRvY3VtZW50ZWQgZm9yIEMgY29kZS4gTm93IGFsbAogICAgICAgICAgICBuZXN0ZWQgc3RydWN0cy9jbGFzc2VzL3VuaW9ucyBhcmUgaWdub3JlZCBpbiBDKysgbW9kZSwgYXMgd2FzIGFsd2F5cyBkb2N1bWVudGVkLiBIb3dldmVyLAogICAgICAgICAgICB0aGVyZSBpcyBhbiBpbXByb3ZlbWVudCBhcyB1c2FnZSBvZiBuZXN0ZWQgc3RydWN0cy9jbGFzc2VzL3VuaW9ucyBpcyBub3cgYWx3YXlzIHRyZWF0ZWQKICAgICAgICAgICAgYXMgYW4gb3BhcXVlIHR5cGUgYnkgZGVmYXVsdCwgcmVzdWx0aW5nIGluIGdlbmVyYXRlZCBjb2RlIHRoYXQgc2hvdWxkIGFsd2F5cyBjb21waWxlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTExLTA5OiBkcmpvZQoJICAgIEZpeCBSIGZvciAtZmNvbXBhY3QgYW5kIGFkZCBzdGRfbWFwLmkKCjIwMDktMTEtMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvbnNpc3RlbmN5IGZvciBuZXN0ZWQgc3RydWN0cy91bmlvbnMvY2xhc3Nlcy4gVW5jb21waWxhYmxlIGNvZGUgd2FzIGJlaW5nCiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIGlubmVyIHN0cnVjdCBhbmQgdW5pb24gZGVjbGFyYXRpb25zIHdlcmUgdXNlZCBhcyB0eXBlcyB3aXRoaW4gdGhlCiAgICAgICAgICAgIGlubmVyIHN0cnVjdC4gVGhlIGlubmVyIHN0cnVjdC91bmlvbiBpcyBub3cgdHJlYXRlZCBhcyBhIGZvcndhcmQgZGVjbGFyYXRpb24gbWFraW5nIHRoZQogICAgICAgICAgICBiZWhhdmlvdXIgdGhlIHNhbWUgYXMgYW4gaW5uZXIgY2xhc3MuIChDKysgY29kZSksIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgc3RydWN0IElubmVyU3RydWN0IHsgaW50IHg7IH07CiAgICAgICAgICAgICAgICBJbm5lclN0cnVjdCogZ2V0SW5uZXJTdHJ1Y3QoKTsKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0wODogd3NmdWx0b24KCSAgICBJZ25vcmVkIG5lc3RlZCBjbGFzcy9zdHJ1Y3Qgd2FybmluZ3Mgbm93IGRpc3BsYXkgdGhlIG5hbWUgb2YgdGhlIGlnbm9yZWQgY2xhc3Mvc3RydWN0LgoKMjAwOS0xMS0wNzogd3NmdWx0b24KCSAgICBCdWcgIzE1MTQ2ODEgLSBGaXggbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgd2l0aGluIGEgbmFtZXNwYWNlIGdlbmVyYXRlZCB1bmNvbXBpbGFibGUKICAgICAgICAgICAgY29kZSBhbmQgaW50cm9kdWNlZCBzdHJhbmdlIHNpZGUgZWZmZWN0cyB0byBvdGhlciB3cmFwcGVyIGNvZGUgZXNwZWNpYWxseSBjb2RlCiAgICAgICAgICAgIGFmdGVyIHRoZSBuZXN0ZWQgdGVtcGxhdGUgY2xhc3MuIE5vdGUgdGhhdCBuZXN0ZWQgdGVtcGxhdGUgY2xhc3NlcyBhcmUgc3RpbGwgaWdub3JlZC4KCjIwMDktMTEtMDc6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIC1kZWJ1Zy1zeW10YWJzICAgIC0gRGlzcGxheSBzeW1ib2wgdGFibGVzIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgLWRlYnVnLXN5bWJvbHMgICAgLSBEaXNwbGF5IHRhcmdldCBsYW5ndWFnZSBzeW1ib2xzIGluIHRoZSBzeW1ib2wgdGFibGVzCiAgICAgICAgICAgICAgLWRlYnVnLWNzeW1ib2xzICAgLSBEaXNwbGF5IEMgc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlcwoKMjAwOS0xMS0wMzogd3NmdWx0b24KCSAgICBGaXggc29tZSB1c2FnZSBvZiB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBBQSB7IC8qIC4uLiAqLyB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6QUE7CgogICAgICAgICAgICBhbmQgYnVnICMxODE2ODAyIC0gU3dpZ1ZhbHVlV3JhcHBlciBzaG91bGQgYmUgdXNlZDoKCiAgICAgICAgICAgICAgc3RydWN0IENDIHsKICAgICAgICAgICAgICAgIENDKGludCk7IC8vIG5vIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIDo6Q0MgeCgpOwoKICAgICAgICAgICAgYW5kIGluIHRlbXBsYXRlIHBhcmFtZXRlciBzcGVjaWFsaXphdGlvbnM6CgogICAgICAgICAgICAgIHN0cnVjdCBTIHt9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgWCB7IHZvaWQgYSgpIHt9IH07CiAgICAgICAgICAgICAgdGVtcGxhdGUgPD4gc3RydWN0IFg8Uz4geyB2b2lkIGIoKSB7fSB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShNeVRDb25jcmV0ZSkgWDwgOjpTID47CgogICAgICAgICAgICBwbHVzIHByb2JhYmx5IHNvbWUgb3RoZXIgY29ybmVyIGNhc2UgdXNhZ2Ugb2YgOjouCgoyMDA5LTExLTAyOiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHBvdGVudGlhbCBtZW1vcnkgbGVhayBpbiBpbml0aWFsaXNhdGlvbiBjb2RlIGZvciB0aGUKCSAgICBnZW5lcmF0ZWQgbW9kdWxlLgoKMjAwOS0xMC0yMzogd3NmdWx0b24KCSAgICBGaXggc2VnIGZhdWx0IHdoZW4gdXNpbmcgYSBuYW1lZCBuZXN0ZWQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiB1c2luZyAldGVtcGxhdGUobmFtZSkgCiAgICAgICAgICAgIHdpdGhpbiBhIGNsYXNzLiBBIHdhcm5pbmcgdGhhdCB0aGVzZSBhcmUgbm90IHN1cHBvcnRlZCBpcyBub3cgaXNzdWVkIHBsdXMgcHJvY2Vzc2luZyAKICAgICAgICAgICAgY29udGludWVzIGFzIGlmIG5vIG5hbWUgd2FzIGdpdmVuLgoKMjAwOS0xMC0yMDogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGaXggc3RkOjp2ZWN0b3I8Y29uc3QgVCo+LiBUaGlzIHdvdWxkIHByZXZpb3VzbHkgY29tcGlsZSwgYnV0IG5vdCBydW4gY29ycmVjdGx5LgoKMjAwOS0xMC0yMDogd3NmdWx0b24KCSAgICBGaXhlZCBwcmV2aW91c2x5IGZhaXJseSBwb29yIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYW5kIGV4cGxpY2l0IAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBzdXBwb3J0LiBOdW1lcm91cyBidWdzIGluIHRoaXMgYXJlYSBoYXZlIGJlZW4gZml4ZWQgaW5jbHVkaW5nOgoKICAgICAgICAgICAgLSBUZW1wbGF0ZSBhcmd1bWVudCBkZWR1Y3Rpb24gaW1wbGVtZW50ZWQgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzLCBlZyB0aGlzIG5vdwogICAgICAgICAgICAgIHdvcmtzOgogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgWCAgICAgIHt9OwogICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgWDxUICo+IHt9OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKFgxKSBYPGNvbnN0IGludCAqPjsgLy8gQ2hvb3NlcyBUICogc3BlY2lhbGl6YXRpb24KCiAgICAgICAgICAgICAgYW5kIG1vcmUgY29tcGxleCBjYXNlcyB3aXRoIG11bHRpcGxlIHBhcmFtZXRlcnMgYW5kIGEgbWl4IG9mIHRlbXBsYXRlIGFyZ3VtZW50CiAgICAgICAgICAgICAgZGVkdWN0aW9uIGFuZCBleHBsaWNpdGx5IHNwZWNpYWxpc2VkIHBhcmFtZXRlcnMsIGVnOgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4gc3RydWN0IFR3b1Bhcm0gICAgICAgICAgICAgICB7IHZvaWQgYSgpIHt9IH07CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDE+ICAgICAgICAgICAgICBzdHJ1Y3QgVHdvUGFybTxUMSAqLCBpbnQgKj4gIHsgdm9pZCBlKCkge30gfTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShFKSBUd29QYXJtPGludCAqKiwgaW50ICo+OwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBwcmltYXJ5IHRlbXBsYXRlIG11c3Qgbm93IGJlIGluIHNjb3BlLCBsaWtlIGluIEMrKywgd2hlbgogICAgICAgICAgICBhbiBleHBsaWNpdCBvciBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzIGluc3RhbnRpYXRlZCB3aXRoICV0ZW1wbGF0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wOS0xNDogd3NmdWx0b24KCSAgICBbQyNdIEFkZCAlY3NhdHRyaWJ1dGVzIGZvciBhZGRpbmcgQyMgYXR0cmlidXRlcyB0byBlbnVtIHZhbHVlcywgc2VlIGRvY3MgZm9yIGV4YW1wbGUuCgoyMDA5LTA5LTExOiB3c2Z1bHRvbgoJICAgIEZpeCBtZW1tb3ZlIHJlZ3Jlc3Npb24gaW4gY2RhdGEuaSBhcyByZXBvcnRlZCBieSBBZHJpYWFuIFJlbnRpbmcuCgoyMDA5LTA5LTA3OiB3c2Z1bHRvbgoJICAgIEZpeCBjb25zdGFudCBleHByZXNzaW9ucyBjb250YWluaW5nIDw9IG9yID49LgoKMjAwOS0wOS0wMjogd3NmdWx0b24KCSAgICBUaGUgZm9sbG93aW5nIG9wZXJhdG9ycyBpbiBjb25zdGFudCBleHByZXNzaW9ucyBub3cgcmVzdWx0IGluIHR5cGUgYm9vbCBmb3IgQysrIAogICAgICAgICAgICB3cmFwcGVycyBhbmQgcmVtYWluIGFzIHR5cGUgaW50IGZvciBDIHdyYXBwZXJzLCBhcyBwZXIgZWFjaCBzdGFuZGFyZDogCgogICAgICAgICAgICAgICYmIHx8ID09ICE9IDwgPiA8PSA+PSAoQWN0dWFsbHkgdGhlIGxhc3QgNCBhcmUgc3RpbGwgYnJva2VuKS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICNkZWZpbmUgQSAxMAogICAgICAgICAgICAgICNkZWZpbmUgQiAxMAogICAgICAgICAgICAgICNkZWZpbmUgQV9FUV9CICBBID09IEIgLy8gbm93IHdyYXBwZWQgYXMgdHlwZSBib29sIGZvciBDKysKICAgICAgICAgICAgICAjZGVmaW5lIEFfQU5EX0IgQSAmJiBCIC8vIG5vdyB3cmFwcGVkIGFzIHR5cGUgYm9vbCBmb3IgQysrCgoyMDA5LTA5LTAyOiB3c2Z1bHRvbgoJICAgIEZpeCAjMjg0NTc0Ni4gdHJ1ZSBhbmQgZmFsc2UgYXJlIG5vdyByZWNvZ25pc2VkIGtleXdvcmRzIChvbmx5IHdoZW4gd3JhcHBpbmcgQysrKS4KICAgICAgICAgICAgQ29uc3RhbnRzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBhcmUgbm93IHdyYXBwZWQgKGFzIHR5cGUgYm9vbCk6CiAgICAgICAgICAgICAgI2RlZmluZSBGT08gdHJ1ZQogICAgICAgICAgICAgICNkZWZpbmUgQkFSIEZPTyAmJiBmYWxzZQoKVmVyc2lvbiAxLjMuNDAgKDE4IEF1Z3VzdCAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTA4LTE3OiBvbGx5CgkgICAgW1BlcmxdIEFkZCAiI3VuZGVmIGRvX2V4ZWMiIHRvIG91ciBjbGVhbiB1cCBvZiBQZXJsIGdsb2JhbAoJICAgIG5hbWVzcGFjZSBwb2xsdXRpb24uCgoyMDA5LTA4LTE3OiBvbGx5CgkgICAgW1BIUF0gRml4IHRvIHdyYXAgYSByZXNvdXJjZSByZXR1cm5lZCBieSBfX2dldCgpIGluIGEgUEhQIG9iamVjdCAoU0YjMjU0OTIxNykuCgoyMDA5LTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI3OTc0ODUgQWZ0ZXIgZG9pbmcgYSAnbWFrZSBjbGVhbicsIGluc3RhbGwgZmFpbHMgaWYgeW9kbDJtYW4gb3IgeW9kbDJodG1sIAogICAgICAgICAgICBpcyBub3QgYXZhaWxhYmxlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gQ2F1Z2h0IGV4Y2VwdGlvbnMgZGlzcGxheSB0aGUgdHlwZSBvZiB0aGUgQysrIGV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHRoZQogICAgICAgICAgICBnZW5lcmljICJjKystc2lkZSB0aHJldyBhbiBleGNlcHRpb24iIG1lc3NhZ2UuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gV2hlbiAlY2F0Y2hlcyBpcyB1c2VkLCBmaXggc28gdGhhdCBhbnkgY2xhc3NlcyBzcGVjaWZpZWQgaW4gdGhlICJ0aHJvd3MiCiAgICAgICAgICAgIGF0dHJpYnV0ZSBvZiB0aGUgInRocm93cyIgdHlwZW1hcCBhcmUgZ2VuZXJhdGVkIGludG8gdGhlIEphdmEgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGV4Y2VwdGlvbiBoYW5kbGluZyB3aGVuICVjYXRjaGVzIGlzIHVzZWQsIHJlcG9ydGVkIGJ5IEp1YW4gTWFudWVsIEFsdmFyZXouCgoyMDA5LTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJXRlbXBsYXRlIHNlZyBmYXVsdCBvbiBzb21lIGNhc2VzIG9mIG92ZXJsb2FkaW5nIHRoZSB0ZW1wbGF0ZWQgbWV0aG9kLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSmFuIEt1cGVjLgoKMjAwOS0wOC0xNTogd3NmdWx0b24KCSAgICBbUnVieV0gQWRkIG51bWVyb3VzIG1pc3Npbmcgd3JhcHBlZCBtZXRob2RzIGZvciBzdGQ6OnZlY3Rvcjxib29sPiBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICBhcyByZXBvcnRlZCBieSBZb3Vzc2VmIEpvbmVzLgoKMjAwOS0wOC0xNDogd3NmdWx0b24KCSAgICBbUGVybF0gQWRkIFNXSUdfQ29udmVydFB0ckFuZE93bigpIG1ldGhvZCBpbnRvIHRoZSBydW50aW1lIGZvciBzbWFydCBwb2ludGVyIAogICAgICAgICAgICBtZW1vcnkgb3duZXJzaGlwIGNvbnRyb2wuIHNoYXJlZF9wdHIgc3VwcG9ydCBzdGlsbCB0byBiZSBhZGRlZC4gUGF0Y2ggZnJvbSAKICAgICAgICAgICAgRGF2aWQgRmxldGNoZXIuCgoyMDA5LTA4LTE0OiBvbGx5CgkgICAgW1BIUF0gUEhQNSBub3cgd3JhcHMgc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgYXMgZG9jdW1lbnRlZC4KCjIwMDktMDgtMTQ6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgdGhlIFBIUCAiY2xhc3MiIGV4YW1wbGUgdG8gd29yayB3aXRoIFBIUDUgYW5kIHVzZQoJICAgIG1vZGVybiB3cmFwcGluZyBmZWF0dXJlcy4KCjIwMDktMDgtMTM6IHdzZnVsdG9uCgkgICAgW1BIUF0gc3RkOjp2ZWN0b3Igd3JhcHBlcnMgb3ZlcmhhdWwuIFRoZXkgbm8gbG9uZ2VyIHJlcXVpcmUgdGhlIAogICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF92ZWN0b3IoKSBtYWNyby4gQWRkZWQgd3JhcHBlcnMgZm9yIGNhcGFjaXR5KCkgYW5kIHJlc2VydmUoKS4KCjIwMDktMDgtMTM6IHdzZnVsdG9uCgkgICAgW1BIUF0gQWRkIGNvbnN0IHJlZmVyZW5jZSB0eXBlbWFwcy4gY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBhcmUKICAgICAgICAgICAgbm93IHBhc3NlZCBieSB2YWx1ZSByYXRoZXIgdGhhbiBwb2ludGVyIGxpa2UgdGhlIG90aGVyIHRhcmdldCBsYW5ndWFnZXMuCgkgICAgRml4ZXMgU0YjMjUyNDAyOS4KCjIwMDktMDgtMDg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gTW9yZSB1c2VyIGZyaWVuZGx5IEF0dHJpYnV0ZUVycm9yIGlzIHJhaXNlZCB3aGVuIHRoZXJlIGFyZQogICAgICAgICAgICBubyBjb25zdHJ1Y3RvcnMgZ2VuZXJhdGVkIGZvciB0aGUgcHJveHkgY2xhc3MgaW4gdGhlIGV2ZW50IHRoYXQgdGhlCiAgICAgICAgICAgIGNsYXNzIGlzIGFic3RyYWN0IC0gdGhlIGVycm9yIG1lc3NhZ2UgaXMgbm93IAogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCAtIGNsYXNzIGlzIGFic3RyYWN0IiB3aGVyZWFzIGlmIHRoZXJlIGFyZSBubwogICAgICAgICAgICBwdWJsaWMgY29uc3RydWN0b3JzIGZvciBhbnkgb3RoZXIgcmVhc29uIGFuZCB0aGUgY2xhc3MgaXMgbm90IGFic3RyYWN0LAogICAgICAgICAgICB0aGUgbWVzc2FnZSByZW1haW5zCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIi4KICAgICAgICAgICAgW3RjbF0gU2ltaWxhcmx5IGZvciB0Y2wgd2hlbiB1c2luZyAtaXRjbC4KCjIwMDktMDgtMDQ6IG9sbHkKCSAgICBbUEhQXSBGaXggZ2VuZXJhdGVkIGNvZGUgdG8gd29yayB3aXRoIFBIUCA1LjMuCgoyMDA5LTA4LTA0OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFZhcmlvdXMgbWF0aGVtYXRpY2FsIGZ1bmN0aW9ucyAod2hpY2ggd291bGQgY29uZmxpY3QKICAgICAgICAgICAgd2l0aCB0aGUgYnVpbHQtaW4gUEhQIG9uZXMpIGFyZSBub3cgYXV0b21hdGljYWxseSBoYW5kbGVkIGJ5CiAgICAgICAgICAgIGFkZGluZyBhICdjXycgcHJlZml4LgoKMjAwOS0wOC0wMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgc3RkOjp2ZWN0b3I8VD4gaW1wbGVtZW50YXRpb24gaXMgaW1wcm92ZWQgYW5kIG5vdyB1c2VzICR0eXBlbWFwIHN1Y2gKICAgICAgICAgICAgdGhhdCB0aGUgcHJveHkgY2xhc3MgZm9yIFQgbm8gbG9uZ2VyIGhhcyB0byBiZSBzcGVjaWZpZWQgaW4gc29tZSBtYWNyb3MKICAgICAgICAgICAgZm9yIGNvcnJlY3QgQyMgY29tcGlsYXRpb247IHRoZSBmb2xsb3dpbmcgbWFjcm9zIGFyZSBkZXByZWNhdGVkLCB3aGVyZQogICAgICAgICAgICBDU1RZUEUgd2FzIHRoZSBDIyB0eXBlIGZvciB0aGUgQysrIGNsYXNzIENUWVBFOgoKICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX1NQRUNJQUxJWkVfTUlOSU1VTShDU1RZUEUsIENUWVBFKQogICAgICAgICAgICAgIHVzYWdlIHNob3VsZCBiZSByZW1vdmVkIGFsdG9nZXRoZXIKCiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9TUEVDSUFMSVpFKENTVFlQRSwgQ1RZUEUpCiAgICAgICAgICAgICAgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGg6CiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9FTkhBTkNFRChDVFlQRSkKCiAgICAgICAgICAgIFNvbWUgbW9yZSBkZXRhaWxzIGluIGNzaGFycC9zdGRfdmVjdG9yLmkKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wNy0zMTogb2xseQoJICAgIFtQeXRob25dIEZpeCBpbmRlbnRhdGlvbiBzbyB0aGF0IHdlIGdpdmUgYSB1c2VmdWwgZXJyb3IgaWYgdGhlCgkgICAgbW9kdWxlIGNhbid0IGJlIGxvYWRlZC4gIFBhdGNoIGZyb20gR2FldGFuIExlaG1hbm4gaW4gU0YjMjgyOTg1My4KCjIwMDktMDctMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAkdHlwZW1hcChtZXRob2QsIHR5cGVsaXN0KSBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvLiBUaGlzIGFsbG93cwogICAgICAgICAgICB0aGUgY29udGVudHMgb2YgYSB0eXBlbWFwIHRvIGJlIGluc2VydGVkIHdpdGhpbiBhbm90aGVyIHR5cGVtYXAuCiAgICAgICAgICAgIEZ1bGx5IGRvY3VtZW50ZWQgaW4gVHlwZW1hcHMuaHRtbC4KCjIwMDktMDctMjk6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gU3RhdGljIG1lbWJlciB2YXJpYWJsZXMgYXJlIG5vdyBwcmVmaXhlZCB3aXRoIHRoZQogICAgICAgICAgICBjbGFzcyBuYW1lLiBUaGlzIGFsbG93cyBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcyB3aXRoIHRoZQogICAgICAgICAgICBzYW1lIG5hbWUgaW4gZGlmZmVyZW50IGNsYXNzZXMuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1B5dGhvbl0gQWRkIG1pc3NpbmcgbG9ja3MgdG8gc3RkOjptYXAgd3JhcHBlcnMuICBQYXRjaCBmcm9tIAoJICAgIFBhdWwgSGFtcHNvbiBpbiBTRiMyODEzODM2LgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQSFBdIEZpeCBtZW1vcnkgbGVhayBpbiBQSFAgT1VUUFVUIHR5cGVtYXBzLiAgUmVwb3J0ZWQgYnkgSGl0b3NoaQoJICAgIEFtYW5vIGluIFNGIzI4MjYzMjIuCgoyMDA5LTA3LTI5OiBvbGx5CgkgICAgW1BIUF0gRml4IG1lbW9yeSBsZWFrIGluIFBIUCByZXNvdXJjZSBkZXN0cnVjdG9yIGZvciBjbGFzc2VzCgkgICAgd2l0aG91dCBhIGRlc3RydWN0b3IgYW5kIG5vbi1jbGFzcyB0eXBlcy4gIFBhdGNoIGZyb20gSGl0b3NoaSBBbWFubwoJICAgIGluIFNGIzI4MjUzMDMuCgoyMDA5LTA3LTI4OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHdhcm5pbmdzIGFib3V0IGNsYXNoZXMgYmV0d2VlbiBpZGVudGlmaWVycyBhbmQgUEhQCgkgICAga2V5d29yZHMgYW5kIGF1dG9tYXRpYyByZW5hbWluZyB0byB3b3JrIHdpdGggdGhlIFBIUDUgY2xhc3MKCSAgICB3cmFwcGVycy4gIEZpeGVzIFNGIzE2MTM2NzkuCgoyMDA5LTA3LTI4OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIElmIGEgbWVtYmVyIGZ1bmN0aW9uIGlzIG5vdCBwdWJsaWMgYnV0IGl0IGhhcyBhIGJhc2UKICAgICAgICAgICAgd2hpY2ggaXMgcHVibGljLCB0aGVuIG5vdyBhIHdhcm5pbmcgaXMgaXNzdWVkIGFuZCB0aGUgbWVtYmVyCiAgICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgYmUgcHVibGljLCBhcyBQSFAgcmVxdWlyZXMgdGhpcy4KCjIwMDktMDctMjE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZC4KCjIwMDktMDctMTU6IG9sbHkKCSAgICBbUGVybF0gRG9uJ3Qgc3BlY2lmeSBQZXJsIHByb3RvdHlwZSAiKCkiIGZvciBhIGNvbnN0cnVjdG9yIHdpdGggYQoJICAgIGRpZmZlcmVudCBuYW1lIHRvIHRoZSBjbGFzcywgYXMgc3VjaCBjb25zdHJ1Y3RvcnMgY2FuIHN0aWxsIHRha2UKCSAgICBwYXJhbWV0ZXJzLgoKMjAwOS0wNy0xMjogeGF2aWVyOTgKCSAgICBbT2N0YXZlXSBBZGQgc3VwcG9ydCBmb3IgT2N0YXZlIDMuMiBBUEkKCjIwMDktMDctMDU6IG9sbHkKCSAgICBbUEhQXSBVcGRhdGUgdGhlIGxpc3Qgb2YgUEhQIGtleXdvcmRzIC0gImNmdW5jdGlvbiIgaXMgbm8gbG9uZ2VyIGEKCSAgICBrZXl3b3JkIGluIFBIUDUgYW5kIFBIUCA1LjMgYWRkZWQgImdvdG8iLCAibmFtZXNwYWNlIiwgIl9fRElSX18iLAoJICAgIGFuZCAiX19OQU1FU1BBQ0VfXyIuCgoyMDA5LTA3LTAzOiBvbGx5CgkgICAgW1RjbF0gVG8gY29tcGxlbWVudCBVU0VfVENMX1NUVUJTLCBhZGQgc3VwcG9ydCBmb3IgVVNFX1RLX1NUVUJTCgkgICAgYW5kIFNXSUdfVENMX1NUVUJTX1ZFUlNJT04uICBEb2N1bWVudCBhbGwgdGhyZWUgaW4gdGhlIFRjbCBjaGFwdGVyCgkgICAgb2YgdGhlIG1hbnVhbC4gIEJhc2VkIG9uIHBhdGNoIGZyb20gU0YjMjgxMDM4MCBieSBDaHJpc3RpYW4KCSAgICBHb2xsd2l0emVyLgoKMjAwOS0wNy0wMjogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBBZGRlZCBmYWN0b3J5LmkgZm9yIFBIUCwgc2VlIHRoZSBsaV9mYWN0b3J5IHRlc3RjYXNlCiAgICAgICAgICAgIGZvciBtb3JlIGluZm8gb24gaG93IHRvIHVzZSBpdC4KCjIwMDktMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAtV2FsbGt3IG9wdGlvbiBhcyByZXBvcnRlZCBieSBTb2xvbW9uIEdpYmJzLgoKMjAwOS0wNy0wMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHN5bnRheCBlcnJvciB3aGVuIGEgbmVzdGVkIHN0cnVjdCBjb250YWlucyBhIGNvbW1lbnQgY29udGFpbmluZyBhICogZm9sbG93ZWQgCiAgICAgICAgICAgIGV2ZW50dWFsbHkgYnkgYSAvLiBSZWdyZXNzaW9uIGZyb20gMS4zLjM3LCByZXBvcnRlZCBieSBTb2xvbW9uIEdpYmJzLgoKMjAwOS0wNy0wMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBVbmtub3duIHByb3BlcnRpZXMgYXJlIG5vIGxvbmdlciBpZ25vcmVkIGluIHByb3h5CiAgICAgICAgICAgIGNsYXNzZXMuCgoyMDA5LTA3LTAxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIEZpeGVkICVuZXdvYmplY3QgYmVoYXZpb3VyLCBwcmV2aW91c2x5IGFueSBtZXRob2QKICAgICAgICAgICAgbWFya2VkIHdpdGggJW5ld29iamVjdCB3YXMgaGFuZGxlZCBhcyBhIGNvbnN0cnVjdG9yLgoKMjAwOS0wNi0zMDogb2xseQoJICAgIFtSdWJ5XSBVbmRlZmluZSBjbG9zZSBhbmQgY29ubmVjdCBtYWNyb3MgZGVmaW5lZCBieSBSdWJ5IEFQSQoJICAgIGhlYWRlcnMgYXMgd2UgZG9uJ3QgbmVlZCB0aGVtIGFuZCB0aGV5IGNhbiBjbGFzaCB3aXRoIEMrKyBtZXRob2RzCgkgICAgYmVpbmcgd3JhcHBlZC4gIFBhdGNoIGZyb20gVml0IE9uZHJ1Y2ggaW4gU0YjMjgxNDQzMC4KCjIwMDktMDYtMjY6IG9sbHkKCSAgICBbUnVieV0gRml4IHRvIGhhbmRsZSBGSVhOVU0gdmFsdWVzIGdyZWF0ZXIgdGhhbiBNQVhJTlQgcGFzc2VkIGZvciBhCgkgICAgZG91YmxlIHBhcmFtZXRlci4KCjIwMDktMDYtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB3cmFwcGluZyBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIHRoZSBjb21wYWN0ZGVmYXVsdGFyZ3MgZmVhdHVyZSAKICAgICAgICAgICAgd2hlcmUgYSBjbGFzcyBpcyBwYXNzZWQgYnkgdmFsdWUgYW5kIGlzIGFzc2lnbmVkIGEgZGVmYXVsdCB2YWx1ZS4gVGhlIFN3aWdWYWx1ZVdyYXBwZXIKICAgICAgICAgICAgdGVtcGxhdGUgd29ya2Fyb3VuZCBmb3IgYSBtaXNzaW5nIGRlZmF1bHQgY29uc3RydWN0b3IgaXMgbm8gbG9uZ2VyIHVzZWQgYXMgdGhlIGNvZGUgCiAgICAgICAgICAgIGdlbmVyYXRlZCBkb2VzIG5vdCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgoKMjAwOS0wNi0xNjogd3NmdWx0b24KCSAgICBbSmF2YSxDI10gRml4IGVudW0gbWFyc2hhbGxpbmcgd2hlbiAlaWdub3JlIGlzIHVzZWQgb24gb25lIG9mIHRoZSBlbnVtIGl0ZW1zLgogICAgICAgICAgICBJbmNvcnJlY3QgZW51bSB2YWx1ZXMgd2VyZSBiZWluZyBwYXNzZWQgdG8gdGhlIEMrKyBsYXllciBvciBjb21waWxhdGlvbiBlcnJvcnMgcmVzdWx0ZWQuCgoyMDA5LTA2LTAyOiB0YWxieQoJICAgIFtQZXJsXSBSZXNvbHZlZCByZWZlcmVuY2UuaSBvdmVybG9hZCBzdXBwb3J0IHByb2JsZW0KCSAgICBpZGVudGlmaWVkIGJ5IEpvaG4gUG90b3dza3kuCgoyMDA5LTA1LTI2OiB3c2Z1bHRvbgoJICAgIFtDI10gSW1wcm92ZWQgc3RkOjptYXAgd3JhcHBlcnMgYmFzZWQgb24gcGF0Y2ggZnJvbSBZdXZhbCBCYXJvci4gVGhlIEMjIHByb3h5CiAgICAgICAgICAgIG5vdyBpbXBsZW1lbnRzIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljLklEaWN0aW9uYXJ5PD4uCgoJICAgIFRoZXNlIHN0ZDptYXAgd3JhcHBlcnMgaGF2ZSBhIG5vbi1iYWNrd2FyZHMgY29tcGF0aWJsZSBvdmVyaGF1bCB0byBtYWtlIHRoZW0KICAgICAgICAgICAgbGlrZSBhIC5ORVQgSURpY3Rpb25hcnkuIFNvbWUgbWV0aG9kIG5hbWVzIGhhdmUgY2hhbmdlZCBhcyBmb2xsb3dpbmc6CiAgICAgICAgICAgICAgc2V0IC0+IHNldGl0ZW0gKHVzZSB0aGlzW10gcHJvcGVydHkgbm93KQogICAgICAgICAgICAgIGdldCAtPiBnZXRpdGVtICh1c2UgdGhpc1tdIHByb3BlcnR5IG5vdykKICAgICAgICAgICAgICBoYXNfa2V5IC0+IENvbnRhaW5zS2V5CiAgICAgICAgICAgICAgZGVsIC0+IFJlbW92ZQogICAgICAgICAgICAgIGNsZWFyIC0+IENsZWFyCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyB1c2VkIGZvciBzdGQ6Om1hcCB3cmFwcGVycyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBubyBsb25nZXIgd29yazoKICAgICAgICAgICAgICBzcGVjaWFsaXplX3N0ZF9tYXBfb25fa2V5CiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX3ZhbHVlCiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX2JvdGgKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wNS0yMDogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBBZGQgdGhlICd0aGlzb3duJyBtZW1iZXIgdG8gY2xhc3Nlcy4gVGhlIHVzYWdlIG9mIGl0CiAgICAgICAgICAgIGlzIHRoZSBzYW1lIGFzIHRoZSBQeXRob24gdGhpc293biBvbmU6IGl0J3MgMSBieSBkZWZhdWx0IGFuZAogICAgICAgICAgICB5b3UgY2FuIHNldCBpdCB0byAwIGlmIHlvdSB3YW50IHRvIHByZXZlbnQgZnJlZWluZyBpdC4gKEZvcgogICAgICAgICAgICBleGFtcGxlIHRvIHByZXZlbnQgYSBkb3VibGUgZnJlZS4pCgoyMDA5LTA1LTE0OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IHRoZSB3cm9uZyBwb2ludGVyIHZhbHVlIHJldHVybmVkIGJ5IFN3aWdQeU9iamVjdF9yZXByKCkuCgoyMDA5LTA1LTEzOiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gTWlub3IgdHdlYWsgd2hlbiB3cmFwcGluZyBpbiAtbm9jd3JhcCBtb2RlLgoKMjAwOS0wNS0xMTogd3NmdWx0b24KCSAgICBbQyNdIEltcHJvdmVkIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG9uIHRoZSBDIyBwcm94eSBzaWRlIGZyb20gWXV2YWwgQmFyb3IuIFRoZXNlCgkgICAgaW1wbGVtZW50IElMaXN0PD4gaW5zdGVhZCBvZiBJRW51bWVyYWJsZTw+IHdoZXJlIHBvc3NpYmxlLgoKMjAwOS0wNC0yOTogd3NmdWx0b24KCSAgICBbSmF2YSwgQyNdIEFkZCB0aGUgJ25vdGRlcml2ZWQnIGF0dHJpYnV0ZSB0byB0aGUgamF2YWJhc2UgYW5kIGNzYmFzZSB0eXBlbWFwcy4KCSAgICBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIHNldCwgdGhlIHR5cGVtYXAgd2lsbCBub3QgYXBwbHkgdG8gY2xhc3NlcyB0aGF0IGFyZSBkZXJpdmVkCgkgICAgZnJvbSBhIEMrKyBiYXNlIGNsYXNzLCBlZyAKCSAgICAgICV0eXBlbWFwKGNzYmFzZSwgbm90ZGVyaXZlZD0iMSIpIFNXSUdUWVBFICJDb21tb25CYXNlIgoKMjAwOS0wNC0yOTogb2xseQoJICAgIFtQeXRob25dIERvbid0IGF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgR0lMIGluIHNpdHVhdGlvbnMgd2hlcmUgd2UKCSAgICBrbm93IHRoYXQgaXQgd2lsbCBhbHJlYWR5IGJlIGxvY2tlZC4gIFRoaXMgYXZvaWRzIHNvbWUgZGVhZC1sb2NrcwoJICAgIHdpdGggbW9kX3B5dGhvbiAoZHVlIHRvIG1vZF9weXRob24gYnVncyB3aGljaCBhcmUgYXBwYXJlbnRseQoJICAgIHVubGlrZWx5IHRvIGV2ZXIgYmUgZml4ZWQpLCBhbmQgcmVzdWx0cyBpbiBzbWFsbGVyIHdyYXBwZXJzIHdoaWNoCgkgICAgcnVuIGEgbGl0dGxlIGZhc3RlciAoaW4gdGVzdHMgd2l0aCBYYXBpYW4gb24geDg2LTY0IFVidW50dSA5LjA0LAoJICAgIHRoZSBzdHJpcHBlZCB3cmFwcGVyIGxpYnJhcnkgd2FzIDExJSBzbWFsbGVyIGFuZCByYW4gMi43JSBmYXN0ZXIpLgoKMjAwOS0wNC0yMTogd3NmdWx0b24KCSAgICBbQyNdIEZpeCAjMjc1MzQ2OSAtIGJvb2wgJk9VVFBVVCBhbmQgYm9vbCAqT1VUUFVUIHR5cGVtYXBzIGluaXRpYWxpc2F0aW9uLgoKMjAwOS0wNC0wOTogd3NmdWx0b24KCSAgICBGaXggIzI3NDY4NTggLSBDIG1hY3JvIGV4cHJlc3Npb24gdXNpbmcgZmxvYXRpbmcgcG9pbnQgbnVtYmVycwoKMjAwOS0wMy0zMDogb2xseQoJICAgIFtQSFBdIFRoZSBkZWZhdWx0IG91dCB0eXBlbWFwIGZvciBjaGFyW0FOWV0gbm93IHJldHVybnMgdGhlIHN0cmluZyB1cCB0byBhCgkgICAgemVybyBieXRlLCBvciB0aGUgZW5kIG9mIHRoZSBhcnJheSBpZiB0aGVyZSBpcyBubyB6ZXJvIGJ5dGUuICBUaGlzCgkgICAgaXMgdGhlIHNhbWUgYXMgUHl0aG9uIGRvZXMsIGFuZCBzZWVtcyBtb3JlIGdlbmVyYWxseSB1c2VmdWwgdGhhbgoJICAgIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIgb2YgcmV0dXJuaW5nIHRoZSB3aG9sZSBjb250ZW50cyBvZiB0aGUgYXJyYXkKCSAgICBpbmNsdWRpbmcgYW55IHplcm8gYnl0ZXMuICBJZiB5b3Ugd2FudCB0aGUgb2xkIGJlaGF2aW91ciwgeW91IGNhbiBwcm92aWRlCgkgICAgeW91ciBvd24gdHlwZW1hcCB0byBkbyB0aGlzOgoKCSAgICAldHlwZW1hcChvdXQpIGNoYXIgW0FOWV0KCSAgICAlewoJCVJFVFZBTF9TVFJJTkdMKCQxLCAkMV9kaW0wLCAxKTsKCSAgICAlfQoKVmVyc2lvbiAxLjMuMzkgKDIxIE1hcmNoIDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMy0xOTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgbWVtb3J5IGxlYWsgcmVsYXRlZCB0byBQeXRob24gMyB1bmljb2RlIGFuZCBDIGNoYXIqIGNvbnZlcnNpb24sCiAgICAgICAgICAgIHdoaWNoIGNhbiBiZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYmVmb3JlIHRoaXMgZml4OgogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgZnJvbSBsaV9jc3RyaW5nIGltcG9ydCAqCiAgICAgICAgICAgICAgICAgIGk9MAogICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgogICAgICAgICAgICAgICAgICAgICAgaSArPSAxCiAgICAgICAgICAgICAgICAgICAgICBuID0gc3RyKGkpKjEwCiAgICAgICAgICAgICAgICAgICAgICB0ZXN0MyhuKQoKICAgICAgICAgICAgVGhpcyBmaXggYWZmZWN0ZWQgU1dJR19Bc0NoYXJQdHJBbmRTaXplKCkgc28geW91IGNhbm5vdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aAogICAgICAgICAgICBhIG51bGwgYWxsb2MgYW5kIG5vbi1udWxsIGNwdHIgYXJndW1lbnQgaW4gUHl0aG9uIDMsIG90aGVyd2lzZSBhIHJ1bnRpbWUgZXJyb3IKICAgICAgICAgICAgd2lsbCBiZSByYWlzZWQuCgoyMDA5LTAzLTE4OiB3c2Z1bHRvbgoJICAgIFtDI10gc3RkOjp2ZWN0b3I8VD4gd3JhcHBlciBpbXByb3ZlbWVudHMgZm9yIC5ORVQgMiBhbmQgYWxzbyBwcm92aWRpbmcgdGhlCgkgICAgbmVjZXNzYXJ5IG1hY2hpbmVyeSB0byB1c2UgdGhlIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXJzIHdpdGggbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBzdWNoCgkgICAgYXMgTElOUSAtIHRoZSBDIyBwcm94eSBjbGFzcyBub3cgZGVyaXZlcyBmcm9tIElFbnVtZXJhYmxlPD4uIFRoZSBkZWZhdWx0IGlzIG5vdyB0byAKCSAgICBnZW5lcmF0ZSBjb2RlIHJlcXVpcmluZyAuTkVUIDIgYXMgYSBtaW5pbXVtLCBhbHRob3VnaCB0aGUgQyMgY29kZSBjYW4gYmUgY29tcGlsZWQgCgkgICAgZm9yIC5ORVQgMSBieSBkZWZpbmluZyB0aGUgU1dJR19ET1RORVRfMSBDIyBwcmVwcm9jZXNzb3IgY29uc3RhbnQuIFNlZSB0aGUgCgkgICAgc3RkX3ZlY3Rvci5pIGZpbGUgZm9yIG1vcmUgZGV0YWlscy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0wMy0xMjogd3NmdWx0b24KCSAgICBbUnVieV0gRml4ICMyNjc2NzM4IFNXSUcgZ2VuZXJhdGVkIHN5bWJvbCBuYW1lIGNsYXNoZXMuCgoyMDA5LTAzLTAxOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gU29tZSBmaXhlcyBmb3IgUHl0aG9uIDMuMC4xIGFuZCBoaWdoZXIgc3VwcG9ydC4gSW4gMy4wLjEsIHRoZSBDIEFQSSBmdW5jdGlvbgogICAgICAgICAgICBQeU9iamVjdF9Db21wYXJlIGlzIHJlbW92ZWQsIHNvIFB5T2JqZWN0X1JpY2hDb21wYXJlQm9vbCBpcyB1c2VkIGZvciByZXBsYWNlbWVudC4KICAgICAgICAgICAgU3RydWN0IGluaXRpbGl6YXRpb24gb2YgU3dpZ1B5T2JqZWN0IGFuZCBTd2lnUHlPYmplY3RfYXNfbnVtYmVyIGNoYW5nZWQgdG8gcmVmbGVjdAogICAgICAgICAgICB0aGUgZHJvcCBvZiB0cF9jb21wYXJlIGFuZCBuYl9sb25nLgoKMjAwOS0wMy0wMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTgzMTYwLiBOb3cgdGhlIGltcG9ydGVyIGluIFB5dGhvbiBzaGFkb3cgd3JhcHBlciB0YWtlIGNhcmUgb2YgdGhlCiAgICAgICAgICAgIGNhc2UgdGhhdCBtb2R1bGUgYWxyZWFkeSBpbXBvcnRlZCBhdCBvdGhlciBwbGFjZS4KCjIwMDktMDItMjg6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjYzNzM1Mi4gTW92ZSBzdHJ1Y3QgZGVjbGFyYXRpb24gb2YgU1dJR19tb2R1bGUgaW4gcHlpbml0LnN3ZyBiZWZvcmUKICAgICAgICAgICAgdGhlIG1ldGhvZCBjYWxscywgc2luY2Ugc29tZSBDIGNvbXBpbGVyIGRvbid0IGFsbG93IGRlY2xhcmF0aW9uIGluIG1pZGRsZSBvZiBmdW5jdGlvbgogICAgICAgICAgICBib2R5LgoKMjAwOS0wMi0yMTogd3NmdWx0b24KCSAgICBbQWxsZWdyb2NsXSBGaXggc2VnIGZhdWx0IHdyYXBwaW5nIHNvbWUgY29uc3RhbnQgdmFyaWFibGUgKCVjb25zdGFudCkgdHlwZXMuCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIFtDRkZJXSBGaXggc2VnIGZhdWx0cyB3aGVuIGZvciAlZXh0ZW5kIGFuZCB1c2luZyBzdGF0ZW1lbnRzLgoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBGaXggU0YgIzI2MDU5NTU6IC1jbyBvcHRpb24gd2hpY2ggYnJva2UgaW4gMS4zLjM3LiAKCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgTmV3ICVpbnNlcnQoImJlZ2luIikgc2VjdGlvbiBhZGRlZC4gQWxzbyBjYW4gYmUgdXNlZCBhcyAlYmVnaW4uIFRoaXMgaXMgYSBuZXcKCSAgICBjb2RlIHNlY3Rpb24gcmVzZXJ2ZWQgZW50aXJlbHkgZm9yIHVzZXJzIGFuZCB0aGUgY29kZSB3aXRoaW4gdGhlIHNlY3Rpb24gaXMgZ2VuZXJhdGVkCgkgICAgYXQgdGhlIHRvcCBvZiB0aGUgQy9DKysgd3JhcHBlciBmaWxlIGFuZCBzbyBwcm92aWRlcyBhIG1lYW5zIHRvIHB1dCBjdXN0b20gY29kZQoJICAgIGludG8gdGhlIHdyYXBwZXIgZmlsZSBiZWZvcmUgYW55dGhpbmcgZWxzZSB0aGF0IFNXSUcgZ2VuZXJhdGVzLgoKMjAwOS0wMi0xNzogd3NmdWx0b24KCSAgICAnbWFrZSBjbGVhbi10ZXN0LXN1aXRlJyB3aWxsIG5vdyBydW4gY2xlYW4gb24gQUxMIGxhbmd1YWdlcy4gUHJldmlvdXNseSBpdCBvbmx5CgkgICAgcmFuIHRoZSBjb3JyZWN0bHkgY29uZmlndXJlZCBsYW5ndWFnZXMuIFRoaXMgd2F5IGl0IGlzIG5vdyBwb3NzaWJsZSB0byBjbGVhbiB1cAoJICAgIHByb3Blcmx5IGFmdGVyIHJ1bm5pbmcgJ21ha2UgcGFydGlhbGNoZWNrLXRlc3Qtc3VpdGUnLgoKMjAwOS0wMi0xNDogd3NmdWx0b24KCSAgICBFeHRlbmQgYXR0cmlidXRlIGxpYnJhcnkgc3VwcG9ydCBmb3Igc3RydWN0cy9jbGFzc2VzIGFuZCB0aGUgYWNjZXNzb3IgZnVuY3Rpb25zIHVzZQoJICAgIHBhc3MvcmV0dXJuIGJ5IHZhbHVlIHNlbWFudGljcy4gVHdvIG5ldyBtYWNyb3MgYXJlIGF2YWlsYWJsZSBhbmQgdXNhZ2UgaXMgaWRlbnRpY2FsCgkgICAgdG8gJWF0dHJpYnV0ZS4gVGhlc2UgYXJlICVhdHRyaWJ1dGV2YWwgZm9yIHN0cnVjdHMvY2xhc3NlcyBhbmQgJWF0dHJpYnV0ZXN0cmluZyBmb3IKCSAgICBzdHJpbmcgY2xhc3NlcywgbGlrZSBzdGQ6OnN0cmluZy4gU2VlIGF0dHJpYnV0ZS5zd2cgZm9yIG1vcmUgZGV0YWlscy4KCjIwMDktMDItMTM6IHdzZnVsdG9uCgkgICAgQWRkIHN1cHBvcnQgZm9yICVleHRlbmQgYW5kIG1lbWJlcmluIHR5cGVtYXBzLiBQcmV2aW91c2x5IHRoZSBtZW1iZXJpbiB0eXBlbWFwcyB3ZXJlCgkgICAgaWdub3JlZCBmb3IgbWVtYmVyIHZhcmlhYmxlcyB3aXRoaW4gYSAlZXh0ZW5kIGJsb2NrLgoKMjAwOS0wMi0xMjogd3NmdWx0b24KCSAgICBSZW1vdmUgdW5uZWNlc3NhcnkgdGVtcG9yYXJ5IHZhcmlhYmxlIHdoZW4gd3JhcHBpbmcgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSByZWZlcmVuY2VzLiAKCSAgICBFeGFtcGxlIG9mIGdlbmVyYXRlZCBjb2RlIGZvciB3cmFwcGluZzoKCgkgICAgICBzdHJ1Y3QgWFlaIHsKCQlzdGQ6OnN0cmluZyYgcmVmUmV0dXJuKCk7CgkgICAgICB9OwoKCSAgICB1c2VkIHRvIGJlOgoKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqcmVzdWx0ID0gMCA7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJl9yZXN1bHRfcmVmID0gKGFyZzEpLT5yZWZSZXR1cm4oKTsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzdGQ6OnN0cmluZyAqKSAmX3Jlc3VsdF9yZWY7CiAgICAgICAgICAgICAgfQoKCSAgICAgTm93IGl0IGlzOgoKICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqcmVzdWx0ID0gMCA7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgcmVzdWx0ID0gKHN0ZDo6c3RyaW5nICopICYoYXJnMSktPnJlZlJldHVybigpOwoKMjAwOS0wMi0wODogYmh5CiAgICAgICAgICAgIENoYW5nZSB0aGUgU0laRSBtYXBwZWQgYnkgJXB5YnVmZmVyX211dGFibGVfYmluYXJ5IGFuZCAlcHlidWZmZXJfYmluYXJ5IGluIHB5YnVmZmVyLmkgZnJvbQogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBidWZmZXIgdG8gdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYnVmZmVyLgoKMjAwOS0wMi0wODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVmZWF0dXJlIG5vdCB3b3JraW5nIGZvciBjb252ZXJzaW9uIG9wZXJhdG9ycywgcmVwb3J0ZWQgYnkgTWF0dCBTcHJhZ3VlLCBmb3IgZXhhbXBsZToKCSAgICAgICVmZWF0dXJlKCJjczptZXRob2Rtb2RpZmllcnMiKSBvcGVyYXRvciBib29sICJwcm90ZWN0ZWQiOwoKMjAwOS0wMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgW016U2NoZW1lXSBBcHBseSAjMjA4MTk2NyBjb25maWd1cmUgY2hhbmdlcyBmb3IgZXhhbXBsZXMgdG8gYnVpbGQgd2l0aCByZWNlbnQgUExUIHZlcnNpb25zLgoJICAgIEFsc28gZml4ZXMgTWFrZWZpbGUgZXJyb3JzIGJ1aWxkaW5nIFNXSUcgZXhlY3V0YWJsZSB3aGVuIG16c2NoZW1lIHBhY2thZ2UgaXMgaW5zdGFsbGVkIAoJICAgICh2ZXJzaW9uIDMuNzIgYXBwcm94IGFuZCBsYXRlcikuCgoyMDA5LTAyLTA0OiB0YWxieQogICAgICAgICAgICBbUGVybF0gRml4IFNGIzI1NjQxOTIgcmVwb3J0ZWQgYnkgRGF2aWQgS29sb3ZyYXRuay4KICAgICAgICAgICAgU1dJR19Bc0NoYXJQdHJBbmRTaXplKCkgbm93IGhhbmRsZXMgImdldCIgbWFnaWMuCgpWZXJzaW9uIDEuMy4zOCAoMzEgSmFudWFyeSAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMS0zMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTUyNDg4IHJlcG9ydGVkIGJ5IEdhZXRhbiBMZWhtYW5uLiBOb3cgJXB5dGhvbnByZXBlbmQKICAgICAgICAgICAgYW5kICVweXRob25hcHBlbmQgaGF2ZSBjb3JyZWN0IGluZGVudGF0aW9uLgoKMjAwOS0wMS0zMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCBTRiMyNTUyMDQ4IHJlcG9ydGVkIGJ5IEdhZXRhbiBMZWhtYW5uLiBUaGUgcGFyYW1ldGVyIGxpc3QKICAgICAgICAgICAgb2Ygc3RhdGljIG1lbWJlciBmdW5jdGlvbiBpbiBnZW5lcmF0ZWQgcHJveHkgY29kZSBzaG91bGQgbm90IGhhdmUgdGhlCiAgICAgICAgICAgICdzZWxmJyBwYXJhbWV0ZXIuCgoyMDA5LTAxLTI5OiB3c2Z1bHRvbgoJICAgIEZpeCByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMS4zLjM3IHdoZXJlIHRoZSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkKCSAgICBmb3IgdGFyZ2V0IGxhbmd1YWdlIHNwZWNpZmljIGZpbGVzIChpbiB0aGUgYWJzZW5jZSBvZiAtb3V0ZGlyKSB3YXMgbm8KCSAgICBsb25nZXIgdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBnZW5lcmF0ZWQgYy9jKysgZmlsZS4KCjIwMDktMDEtMjg6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjXSBGaXggcHJveHkgY2xhc3Mgbm90IGJlaW5nIHVzZWQgd2hlbiB0aGUgZ2xvYmFsIHNjb3BlIG9wZXJhdG9yCgkgICAgd2FzIHVzZWQgZm9yIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHZhbHVlLiBSZXBvcnRlZCBieSBEYXZpZCBQaWVwZ3Jhc3MuCgoyMDA5LTAxLTE1OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggc2VnIGZhdWx0IHdoZW4gcnVubmluZyB3aXRoIC12IG9wdGlvbiwgcmVwb3J0ZWQgYnkgSm9obiBLeS4KClZlcnNpb24gMS4zLjM3ICgxMyBKYW51YXJ5IDIwMDkpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDA5LTAxLTEzOiBtZ29zc2FnZQoJICAgIFtMdWFdIEFkZGVkIGNvbnRyYWN0IHN1cHBvcnQgZm9yIHJlcXVpcmluZyB0aGF0IHVuc2lnbmVkIG51bWJlcnMgYXJlID49MAoJICAgIFJld3JvdGUgbXVjaCBvZiBFeGFtcGxlcy9MdWEvZW1iZWQzLiAKCSAgICBBZGRlZCBhIGxvdCB0byB0aGUgTHVhIGRvY3VtZW50YXRpb24uCgoyMDA5LTAxLTEzOiB3c2Z1bHRvbgoJICAgIEZpeCBjb21waWxhdGlvbiBlcnJvciB3aGVuIHVzaW5nIGRpcmVjdG9ycyBvbiBwcm90ZWN0ZWQgdmlydHVhbCBvdmVybG9hZGVkIAoJICAgIG1ldGhvZHMgcmVwb3J0ZWQgYnkgU2FtIEhlbmRsZXkuCgoyMDA5LTAxLTEyOiBkcmpvZQogICAgICAgICAgICBbUl0gRml4ZWQgaGFuZGxpbmcgb2YgaW50ZWdlciBhcnJheXMKCjIwMDktMDEtMTA6IGRyam9lCgkgICAgW1JdIEZpeCBpbnRlZ2VyIGhhbmRsaW5nIGluIHIgdG8gZGVhbCBjb3JyZWN0bHkgd2l0aCBzaWduZWQKCSAgICBhbmQgdW5zaWduZWQgaXNzdWVzCgoyMDA5LTAxLTEwOiB3c2Z1bHRvbgoJICAgIFBhdGNoICAjMTk5Mjc1NiBmcm9tIENvbGluIE1jRG9uYWxkIC0gJWNvbnRyYWN0IG5vdCB3b3JraW5nIGZvciBjbGFzc2VzIAoJICAgIGluIG5hbWVzcGFjZQoKMjAwOS0wMS0wNTogb2xseQoJICAgIE1hcmsgU1dJR1BFUkw1LCBTV0lHUEhQNSwgYW5kIFNXSUdUQ0w4IGFzIGRlcHJlY2F0ZWQgaW4gdGhlIHNvdXJjZQoJICAgIGNvZGUgYW5kIHJlbW92ZSBkb2N1bWVudGF0aW9uIG9mIHRoZW0uCgoyMDA4LTEyLTMwOiB3c2Z1bHRvbgoJICAgIEJ1ZyAjMjQzMDc1Ni4gQWxsIHRoZSBsYW5ndWFnZXMgbm93IGRlZmluZSBhIG1hY3JvIGluIHRoZSBnZW5lcmF0ZWQgQy9DKysKCSAgICB3cmFwcGVyIGZpbGUgaW5kaWNhdGluZyB3aGljaCBsYW5ndWFnZSBpcyBiZWluZyB3cmFwcGVkLiBUaGUgbWFjcm8gbmFtZSBpcyB0aGUKCSAgICBzYW1lIGFzIHRob3NlIGRlZmluZWQgd2hlbiBTV0lHIGlzIHJ1biwgZWcgU1dJR0pBVkEsIFNXSUdPQ1RBVkUsIFNXSUdDU0hBUlAgZXRjCgkgICAgYW5kIGFyZSBsaXN0ZWQgaW4gdGhlICJDb25kaXRpb25hbCBDb21waWxhdGlvbiIgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMDgtMTItMjM6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMjE1Mzc3MyAtICVub2phdmFleGNlcHRpb24gd2FzIGNsZWFyaW5nIHRoZSBleGNlcHRpb24gZmVhdHVyZQogICAgICAgICAgICBpbnN0ZWFkIG9mIGRpc2FibGluZyBpdC4gQ2xlYXJpbmcgY2hlY2tlZCBKYXZhIGV4Y2VwdGlvbnMgYWxzbyBkaWRuJ3Qgd29yay4gCgkgICAgVGhlIG5ldyAlY2xlYXJqYXZhZXhjZXB0aW9uIGNhbiBiZSB1c2VkIGZvciBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZlYXR1cmUuCgoyMDA4LTEyLTIyOiB3c2Z1bHRvbgoJICAgIEZpeCAjMjQzMjgwMSAtIE1ha2UgU3dpZ1ZhbHVlV3JhcHBlciBleGNlcHRpb24gc2FmZSBmb3Igd2hlbiBjb3B5IGNvbnN0cnVjdG9ycwoJICAgIHRocm93IGV4Y2VwdGlvbnMuCgoyMDA4LTEyLTIxOiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMyNDQwMDQ2IHdoaWNoIGZpeGVzIHBvc3NpYmxlIHNlZyBmYXVsdHMgZm9yIG1lbWJlciBhbmQgZ2xvYmFsCgkgICAgdmFyaWFibGUgY2hhciBhcnJheXMgd2hlbiB0aGUgc3RyaW5ncyBhcmUgbGFyZ2VyIHRoYW4gdGhlIHN0cmluZyBhcnJheSBzaXplLgoKMjAwOC0xMi0yMDogd3NmdWx0b24KCSAgICBUaGUgY2NhY2hlIGNvbXBpbGVyIGNhY2hlIGhhcyBiZWVuIGFkYXB0ZWQgdG8gd29yayB3aXRoIFNXSUcgYW5kCgkgICAgbmFtZWQgY2NhY2hlLXN3aWcuIEl0IG5vdyB3b3JrcyB3aXRoIEMvQysrIGNvbXBpbGVycyBhcyB3ZWxsIGFzIFNXSUcKCSAgICBhbmQgY2FuIHJlc3VsdCBpbiBpbXByZXNzaXZlIHNwZWVkdXBzIHdoZW4gdXNlZCB0byByZWNvbXBpbGUgdW5jaGFuZ2VkCgkgICAgY29kZSB3aXRoIGVpdGhlciBhIEMvQysrIGNvbXBpbGVyIG9yIFNXSUcuIERvY3VtZW50YXRpb24gaXMgaW4gQ0NhY2hlLmh0bWwKCSAgICBvciB0aGUgaW5zdGFsbGVkIGNjYWNoZS1zd2lnIG1hbiBwYWdlLgoKMjAwOC0xMi0xMjogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCBmcm9tIEthbHlhbm92IERtaXRyeSB3aGljaCBmaXhlcyBwYXJzaW5nIG9mIG5lc3RlZCBzdHJ1Y3RzCgkgICAgY29udGFpbmluZyBjb21tZW50cy4KCjIwMDgtMTItMTI6IHdzZnVsdG9uCgkgICAgRml4IGVycm9yIG1lc3NhZ2UgaW4gc29tZSBuZXN0ZWQgc3RydWN0IGFuZCAlaW5saW5lIHBhcnNpbmcgZXJyb3Igc2l0dWF0aW9ucwoJICAgIHN1Y2ggYXMgdW50ZXJtaW5hdGVkIHN0cmluZ3MgYW5kIGNvbW1lbnRzLgoKMjAwOC0xMi0wNzogb2xseQoJICAgIFtQSFBdIEZpeCB3YXJuaW5ncyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgd3JhcHBlciB3aXRoIEdDQyA0LjMuCgoyMDA4LTEyLTA2OiB3c2Z1bHRvbgoJICAgIFtQSFBdIERlcHJlY2F0ZSAlcHJhZ21hKHBocDQpLiBQbGVhc2UgdXNlICVwcmFnbWEocGhwKSBpbnN0ZWFkLgoJICAgIFRoZSBmb2xsb3dpbmcgdHdvIHdhcm5pbmdzIGhhdmUgYmVlbiByZW5hbWVkOgoJICAgIFdBUk5fUEhQNF9NVUxUSVBMRV9JTkhFUklUQU5DRSAtPiBXQVJOX1BIUF9NVUxUSVBMRV9JTkhFUklUQU5DRQoJICAgIFdBUk5fUEhQNF9VTktOT1dOX1BSQUdNQSAgICAgICAtPiBXQVJOX1BIUF9VTktOT1dOX1BSQUdNQQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA4LTEyLTA0OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gQXBwbGllZCBwYXRjaCBTRiMyMTU4OTM4OiBhbGwgdGhlIFNXSUcgc3ltYm9sIG5hbWVzIHN0YXJ0ZWQgd2l0aCBQeQogICAgICAgICAgICBhcmUgY2hhbmdlZCwgc2luY2UgdGhleSBhcmUgaW5hcHByb3ByaWF0ZSBhbmQgZGlzY291cmFnZWQgaW4gUHl0aG9uCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gKGZyb20gaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy8yLjUuMi9hcGkvaW5jbHVkZXMuaHRtbCk6CgogICAgICAgICAgICAiQWxsIHVzZXIgdmlzaWJsZSBuYW1lcyBkZWZpbmVkIGJ5IFB5dGhvbi5oIChleGNlcHQgdGhvc2UgZGVmaW5lZCBieQogICAgICAgICAgICB0aGUgaW5jbHVkZWQgc3RhbmRhcmQgaGVhZGVycykgaGF2ZSBvbmUgb2YgdGhlIHByZWZpeGVzICJQeSIgb3IgIl9QeSIuCiAgICAgICAgICAgIE5hbWVzIGJlZ2lubmluZyB3aXRoICJfUHkiIGFyZSBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24KICAgICAgICAgICAgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBleHRlbnNpb24gd3JpdGVycy4gU3RydWN0dXJlIG1lbWJlciBuYW1lcyBkbwogICAgICAgICAgICBub3QgaGF2ZSBhIHJlc2VydmVkIHByZWZpeC4KCiAgICAgICAgICAgIEltcG9ydGFudDogdXNlciBjb2RlIHNob3VsZCBuZXZlciBkZWZpbmUgbmFtZXMgdGhhdCBiZWdpbiB3aXRoICJQeSIgb3IgIl9QeSIuCiAgICAgICAgICAgIFRoaXMgY29uZnVzZXMgdGhlIHJlYWRlciwgYW5kIGplb3BhcmRpemVzIHRoZSBwb3J0YWJpbGl0eSBvZiB0aGUgdXNlcgogICAgICAgICAgICBjb2RlIHRvIGZ1dHVyZSBQeXRob24gdmVyc2lvbnMsIHdoaWNoIG1heSBkZWZpbmUgYWRkaXRpb25hbCBuYW1lcyBiZWdpbm5pbmcKICAgICAgICAgICAgd2l0aCBvbmUgb2YgdGhlc2UgcHJlZml4ZXMuIgoKICAgICAgICAgICAgSGVyZSBpcyBhIGJyaWVmIGxpc3Qgb2Ygd2hhdCBjaGFuZ2VkOgoKICAgICAgICAgICAgICAgIFB5U3dpZyogLT4gU3dpZ1B5KgogICAgICAgICAgICAgICAgUHlPYmplY3RfcHRyIC0+IFN3aWdQdHJfUHlPYmplY3QKICAgICAgICAgICAgICAgIFB5T2JqZWN0X3ZhciAtPiBTd2lnVmFyX1B5T2JqZWN0CiAgICAgICAgICAgICAgICBQeVNlcXVlbmNlX0Jhc2UsIFB5U2VxdWVuY2VfQ29udCwgUHlTZXF1ZW5jZV9SZWYgLT4KICAgICAgICAgICAgICAgICAgICAgICAgU3dpZ1B5U2VxdWVuY2VfQmFzZSwgU3dpZ1B5U2VxdWVuY2VfQ29udCwgU3dpZ1B5U2VxdWVuY2VfUmVmCiAgICAgICAgICAgICAgICBQeU1hcCogLT4gU3dpZ1B5TWFwKgoKICAgICAgICAgICAgV2UgcHJvdmlkZWQgYSBweW5hbWVfY29tcGF0LmkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFVzZXJzIHdob3NlIGNvZGUgaGF2aW5nCiAgICAgICAgICAgIHRoZXNlIHN5bWJvbHMgYW5kIGRvIG5vdCB3YW50IHRvIGNoYW5nZSBpdCBjb3VsZCBzaW1wbHkgaW5jbHVkZSB0aGlzIGZpbGUKICAgICAgICAgICAgYXQgZnJvbnQgb2YgeW91ciBjb2RlLiBBIGJldHRlciBzb2x1dGlvbiBpcyB0byBydW4gdGhlIGNvbnZlcnRpbmcgdG9vbCBvbgogICAgICAgICAgICB5b3VyIGNvZGUsIHdoaWNoIGhhcyBiZWVuIHB1dCBpbiBTV0lHJ3MgU1ZOIHRydW5rIChUb29scy9weW5hbWVfcGF0Y2gucHkpIGFuZAogICAgICAgICAgICB5b3UgY2FuIGRvd25sb2FkIGl0IGhlcmU6CiAgICAgICAgICAgIGh0dHBzOi8vc3dpZy5zdm4uc291cmNlZm9yZ2UubmV0L3N2bnJvb3Qvc3dpZy90cnVuay9Ub29scy9weW5hbWVfcGF0Y2gucHkgCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDgtMTItMDI6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzIxNDM3MjcgZnJvbSBTZXJnZSBNb25rZXdpdHogdG8gZml4IGltcG9ydGluZyBiYXNlIGNsYXNzZXMgCgkgICAgd2hlbiB0aGUgcGFja2FnZSBvcHRpb24gaXMgc3BlY2lmaWVkIGluICVtb2R1bGUgYW5kIHRoYXQgbW9kdWxlIGlzICVpbXBvcnQnZWQuCgoyMDA4LTExLTI4OiB3c2Z1bHRvbgoJICAgIFtVVExdIEZpeCAjMjA4MDQ5Ny4gU29tZSBpbmNvcnJlY3QgYWNjZXB0YW5jZSBvZiB0eXBlcyBpbiB0aGUgU1RMLCBlZyBhIGRvdWJsZSAqIGVsZW1lbnQKCSAgICBwYXNzZWQgaW50byBhIHZlY3RvcjxpbnQgKj4gY29uc3RydWN0b3Igd291bGQgYmUgYWNjZXB0ZWQsIGJ1dCB0aGUgZW5zdWluZyBiZWhhdmlvdXIKCSAgICB3YXMgdW5kZWZpbmVkLiBOb3cgdGhlIHR5cGUgY29udmVyc2lvbiBjb3JyZWN0bHkgcmFpc2VzIGFuIGV4Y2VwdGlvbi4KCjIwMDgtMTEtMjQ6IHdzZnVsdG9uCgkgICAgQWRkIC1vdXRjdXJyZW50ZGlyIG9wdGlvbi4gVGhpcyBzZXRzIHRoZSBkZWZhdWx0IG91dHB1dCBkaXJlY3RvcnkgdG8gdGhlIGN1cnJlbnQgCgkgICAgZGlyZWN0b3J5IGluc3RlYWQgb2YgdGhlIHBhdGggc3BlY2lmaWVkIGJ5IHRoZSBpbnB1dCBmaWxlLiBUaGlzIG9wdGlvbiBlbmFibGVzCgkgICAgYmVoYXZpb3VyIHNpbWlsYXIgdG8gYy9jKysgY29tcGlsZXJzLiBOb3RlIHRoYXQgdGhpcyBjb250cm9scyB0aGUgb3V0cHV0IGRpcmVjdG9yeSwKCSAgICBidXQgb25seSBpbiB0aGUgYWJzZW5jZSBvZiB0aGUgLW8gYW5kL29yIC1vdXRkaXIgb3B0aW9ucy4KCjIwMDgtMTEtMjM6IHdzZnVsdG9uCgkgICAgW3J1YnldIEFwcGx5IHBhdGNoICMyMjYzODUwIHRvIGZpeCBydWJ5L2ZpbGUuaSAuLi4gcnVieWlvLmggZmlsZW5hbWUgY2hhbmdlIGluIAoJICAgIHJ1YnkgMS45LgoKMjAwOC0xMS0yMzogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMjMxOTc5MCBmcm9tIEpvaGFuIEhha2UgdG8gZml4IHNoYXJlZF9wdHIgdXNhZ2UgaW4gc3RkOjp0cjEgbmFtZXNwYWNlLgoKMjAwOC0xMS0yMTogd3NmdWx0b24KCSAgICBUaGUgdXNlIG9mIHRoZSBpbmNsdWRlIHBhdGggdG8gZmluZCB0aGUgaW5wdXQgZmlsZSBpcyBub3cgZGVwcmVjYXRlZC4KCSAgICBUaGlzIG1ha2VzIHRoZSBiZWhhdmlvdXIgb2YgU1dJRyB0aGUgc2FtZSBhcyBDL0MrKyBjb21waWxlcnMgaW4gcHJlcGFyYXRpb24KCSAgICBmb3IgdXNlIHdpdGggY2NhY2hlLgoKMjAwOC0xMS0xNjogd3NmdWx0b24KCSAgICBGaXggLW5vcHJlcHJvY2VzcyBvcHRpb24gdG86CgkgICAgLSBjb3JyZWN0bHkgcmVwb3J0IGZpbGUgbmFtZXMgaW4gd2FybmluZyBhbmQgZXJyb3IgbWVzc2FnZXMuCgkgICAgLSB1c2UgdGhlIG9yaWdpbmFsIGlucHV0IGZpbGVuYW1lIHRoYXQgY3JlYXRlZCB0aGUgcHJlcHJvY2Vzc2VkIG91dHB1dCB3aGVuIAoJICAgICAgZGV0ZXJtaW5pbmcgdGhlIEMrKyB3cmFwcGVyIGZpbGUgbmFtZSAoaW4gdGhlIGFic2VuY2Ugb2YgLW8pLiBQcmV2aW91c2x5IAoJICAgICAgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGZpbGUgY29udGFpbmluZyB0aGUgcHJlcHJvY2Vzc2VkIG91dHB1dCB3YXMgdXNlZC4KCjIwMDgtMTEtMTE6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFkZCBwYXRjaCAjMjE1MjY5MSBmcm9tIE1BVFNVVVJBIFRha2Fub3JpIHdoaWNoIGZpeGVzIGNvbXBpbGVzIHVzaW5nIHRoZQoJICAgIEludGVsIGNvbXBpbGVyCgoyMDA4LTExLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgcGF0Y2ggIzIxMjgyNDkgZnJvbSBBbmF0b2x5IFRlY2h0b25payB3aGljaCBjb3JyZWN0cyB0aGUgQy9DKysgcHJveHkKICAgICAgICAgICAgY2xhc3MgYmVpbmcgcmVwb3J0ZWQgZm9yIFB5dGhvbiBkb2NzdHJpbmdzIHdoZW4gJXJlbmFtZSBpcyB1c2VkLgoKMjAwOC0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBzdHJpcCBlbmNvZGVyIHBhdGNoIGZyb20gQW5hdG9seSBUZWNodG9uaWsgIzIxMzAwMTYuIFRoaXMgZW5hYmxlcyBhbiAKICAgICAgICAgICAgZWFzeSB3YXkgdG8gcmVuYW1lIHN5bWJvbHMgYnkgc3RyaXBwaW5nIGEgY29tbW9ubHkgdXNlZCBwcmVmaXggaW4gYWxsIHRoZQogICAgICAgICAgICBmdW5jdGlvbi9zdHJ1Y3QgbmFtZXMuIEl0IHdvcmtzIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgb3RoZXIgZW5jb2RlcnMsIHN1Y2ggYXMKICAgICAgICAgICAgdGl0bGUsIGxvd2VyLCBjb21tYW5kIGV0YyBvdXRsaW5lZCBpbiBDSEFOR0VTIGZpbGUgZGF0ZWQgMTIvMzAvMjAwNS4gRXhhbXBsZQogICAgICAgICAgICBiZWxvdyB3aWxsIHJlbmFtZSB3eEFub3RoZXJXaWRnZXQgdG8gQW5vdGhlcldpZGdldCBhbmQgd3hEb1NvbWV0aGluZyB0byAKICAgICAgICAgICAgRG9Tb21ldGhpbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIiUoc3RyaXA6W3d4XSlzIikgIiI7IAoKICAgICAgICAgICAgICBzdHJ1Y3Qgd3hBbm90aGVyV2lkZ2V0IHsKICAgICAgICAgICAgICAgICAgdm9pZCB3eERvU29tZXRoaW5nKCk7CiAgICAgICAgICAgICAgfTsKCjIwMDgtMDktMjY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBMb3RzIG9mIHRlc3Qtc3VpdGUgd29yay4KCSAgICAtIEZpeCBvcmRlcmluZyBvZiB3cmFwcGVyIG91dHB1dCBhbmQgJXsgJX0gaGVhZGVyIG91dHB1dC4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbnMgb2YgbG9jYWwgdmFycyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gRml4IGRlY2xhcmF0aW9uIG9mIGRlZmluZWQgY29uc3RhbnRzIGluIEMgd3JhcHBlcnMuCgkgICAgLSBGaXggZGVjbGFyYXRpb24gb2YgRW51bVZhbHVlcyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gYWRkIHNvbWUgY29uc3QgdHlwZW1hcHMgdG8gYWxsZWdyb2NsLnN3ZwoJICAgIC0gYWRkIHJlbmFtZSBmb3Igb3BlcmF0b3IgYm9vbCgpIG92ZXJsb2Fkcy4KCQoyMDA4LTA5LTI1OiBvbGx5CgkgICAgW1BIUDVdIEZpbGwgaW4gdHlwZW1hcHMgZm9yIFNXSUdUWVBFIGFuZCB2b2lkICogKFNGIzIwOTUxODYpLgoKMjAwOC0wOS0yMjogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBTdXBwb3J0IHdyYXBwaW5nIG9mIHR5cGVzIHdob3NlIGRlZmluaXRpb25zIGFyZSBub3Qgc2VlbiBieQoJICAgIFNXSUcuIFRoZXkgYXJlIHRyZWF0ZWQgYXMgZm9yd2FyZC1yZWZlcmVuY2VkIGNsYXNzZXMgYW5kIGlmIGEKCSAgICBkZWZpbml0aW9uIGlzIG5vdCBzZWVuIGFyZSB0cmVhdGVkIGFzICgqIDp2b2lkKS4KCSAgICAtIERvbid0IHdyYXAgdGhlIGNvbnRlbnRzIG9mIHVubmFtZWQgbmFtZXNwYWNlcy4KCSAgICAtIE1vcmUgY29kZSBjbGVhbnVwLiBSZW1vdmVkIHNvbWUgZXh0cmFuZW91cyB3YXJuaW5ncy4KCSAgICAtIHN0YXJ0IHdvcmsgb24gaGF2aW5nIHRoZSBhbGxlZ3JvY2wgbW9kIHBhc3MgdGhlIGNwcCB0ZXN0LXN1aXRlLgoKMjAwOC0wOS0xOTogb2xseQoJICAgIFtQSFA1XSBBZGQgdHlwZW1hcHMgZm9yIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nLgoKMjAwOC0wOS0xODogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBDIyBhcnJheSB0eXBlbWFwcyBwcm92aWRlZCBieSBBbnR0aSBLYXJhbnRhLgogICAgICAgICAgICBUaGUgYXJyYXlzIHByb3ZpZGUgYSB3YXkgdG8gdXNlIE1hcnNoYWxBcyhVbm1hbmFnZWRUeXBlLkxQQXJyYXkpCiAgICAgICAgICAgIGFuZCBwaW5uaW5nIHRoZSBhcnJheSB1c2luZyAnZml4ZWQnLiBTZWUgYXJyYXlzX2NzaGFycC5pIGxpYnJhcnkgZmlsZQogICAgICAgICAgICBmb3IgZGV0YWlscy4KCjIwMDgtMDktMTg6IHdzZnVsdG9uCgkgICAgRG9jdW1lbnQgdGhlIG9wdGlvbmFsIG1vZHVsZSBhdHRyaWJ1dGUgaW4gdGhlICVpbXBvcnQgZGlyZWN0aXZlLAogICAgICAgICAgICBzZWUgTW9kdWxlcy5odG1sLiBBZGQgYSB3YXJuaW5nIGZvciBQeXRob24gd3JhcHBlcnMgd2hlbiB0aGUKICAgICAgICAgICAgbW9kdWxlIG5hbWUgZm9yIGFuIGltcG9ydGVkIGJhc2UgY2xhc3MgaXMgbWlzc2luZywgcmVxdWlyaW5nIHRoZQogICAgICAgICAgICBtb2R1bGUgYXR0cmlidXRlIHRvIGJlIGFkZGVkIHRvICVpbXBvcnQsIGVnIAoKICAgICAgICAgICAgICAlaW1wb3J0KG1vZHVsZT0iRm9vTW9kdWxlIikgZm9vLmgKCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gQ2hhbmdlIHRoZSBkZWZhdWx0IGlucHV0IHR5cGVtYXAgZm9yIGNoYXIgKiB0byB0dXJuIFBIUAoJICAgIE51bGwgaW50byBDIE5VTEwgKHByZXZpb3VzbHkgaXQgd2FzIGNvbnZlcnRlZCB0byBhbiBlbXB0eSBzdHJpbmcpLgoJICAgIFRoZSBuZXcgYmVoYXZpb3VyIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlIGNvcnJlc3BvbmRpbmcgb3V0cHV0CgkgICAgdHlwZW1hcCB3b3JrcyAoU0YjMjAyNTcxOSkuCgoJICAgIElmIHlvdSB3YW50IHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXIsIGFkZCB0aGUgZm9sbG93aW5nIHR5cGVtYXAKCSAgICB0byB5b3VyIGludGVyZmFjZSBmaWxlIChQSFAncyBjb252ZXJ0X3RvX3N0cmluZ19leCgpIGZ1bmN0aW9uIGRvZXMKCSAgICB0aGUgY29udmVydGluZyBmcm9tIFBIUCBOdWxsIHRvIGFuIGVtcHR5IHN0cmluZyk6CgoJICAgICV0eXBlbWFwKGluKSBjaGFyICogewoJCWNvbnZlcnRfdG9fc3RyaW5nX2V4KCRpbnB1dCk7CgkJJDEgPSBaX1NUUlZBTF9QUCgkaW5wdXQpOwoJICAgIH0KCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gRml4IGV4dHJhIGNvZGUgYWRkZWQgdG8gcHJveHkgY2xhc3MgY29uc3RydWN0b3JzIGluIHRoZSBjYXNlCgkgICAgd2hlcmUgdGhlIG9ubHkgY29uc3RydWN0b3IgdGFrZXMgbm8gYXJndW1lbnRzLgoKMjAwOC0wOS0xODogb2xseQoJICAgIFtQSFA1XSBGaXggd3JhcHBpbmcgb2YgYSByZW5hbWVkIGVudW1lcmF0ZWQgdmFsdWUgb2YgYW4gZW51bSBjbGFzcwoJICAgIG1lbWJlciAoU0YjMjA5NTI3MykuCgoyMDA4LTA5LTE3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEZpeCBob3cgZm9yd2FyZCByZWZlcmVuY2UgdHlwZWRlZnMgYXJlIGhhbmRsZWQsIHNvIGFzIG5vdCB0byBjb25mbGljdAoJICAgIHdpdGggb3RoZXIgbGVnaXQgdHlwZWRlZnMuCgkgICAgLSBEb24ndCAoZm9yIG5vdykgcGVyZm9ybSBhbiBmZml0eXBlIHR5cGVtYXAgbG9va3VwIHdoZW4gdHJ5aW5nIHRvCgkgICAgd2hlbiBjYWxsaW5nIGNvbXBvc2VfZm9yZWlnbl90eXBlKCkuIFRoaXMgaXMgYWN0dWFsbHkgYSB1c2VmdWwgdGhpbmcKCSAgICB0byBkbyBpbiBjZXJ0YWluIGNhc2VzLCB0aGUgdGVzdCBjYXNlcyBmb3Igd2hpY2ggSSBjYW4ndCBjdXJyZW50bHkKCSAgICBsb2NhdGUgOi8uIEl0J3MgYnJlYWtpbmcgc29tZSB3cmFwcGluZyBiZWhhdmlvciB0aGF0IGlzIG1vcmUgY29tbW9ubHkKCSAgICBzZWVuLCBob3dldmVyLiBJJ2xsIHJlYWRkIGluIGEgbW9yZSBhcHByb3ByaWF0ZSB3YXkgd2hlbiBJIGNhbgoJICAgIHJlY3JlYXRlIHRoZSBuZWVkZWQgdGVzdCBjYXNlLCBvciBhIHVzZXIgY29tcGxhaW5zICh3aGljaCBtZWFucwoJICAgIHRoZXkgcHJvYmFibHkgaGF2ZSBhIHRlc3QgY2FzZSkuCgkgICAgLSBkb2N1bWVudCB0aGUgLWlzb2xhdGUgY29tbWFuZC1saW5lIGFyZyBpbiB0aGUgJ3N3aWcgLWhlbHAnIG91dHB1dC4KCSAgICBJdCB3YXMgaW4gdGhlIGh0bWwgZG9jcywgYnV0IG5vdCB0aGVyZS4KCSAgICAtIHNtYWxsIGFtb3VudCBvZiBjb2RlIGNsZWFudXAsIHJlbW92ZWQgc29tZSB1bnVzZWQgY29kZS4KCSAgICAtIHNvbWUgbWlub3IgYWVzdGhldGljIGNoYW5nZXMuCgoyMDA4LTA5LTEyOiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIDMuMCBzdXBwb3J0IGJyYW5jaCBtZXJnZWQgaW50byBTV0lHIHRydW5rLiBUaGFua3MgdG8KICAgICAgICAgICAgR29vZ2xlIFN1bW1lciBvZiBDb2RlIDIwMDggZm9yIHN1cHBvcnRpbmcgdGhpcyBwcm9qZWN0ISBCeSBkZWZhdWx0CiAgICAgICAgICAgIFNXSUcgd2lsbCBnZW5lcmF0ZSBpbnRlcmZhY2UgZmlsZXMgY29tcGF0aWJsZSB3aXRoIGJvdGggUHl0aG9uIDIueAogICAgICAgICAgICBhbmQgMy4wLiBBbmQgdGhlcmUncyBhbHNvIHNvbWUgUHl0aG9uIDMgbmV3IGZlYXR1cmVzIHRoYXQgY2FuIGJlCiAgICAgICAgICAgIGVuYWJsZWQgYnkgcGFzc2luZyBhICItcHkzIiBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIFNXSUcuIFRoZXNlCiAgICAgICAgICAgIGZlYXR1cmVzIGFyZToKCiAgICAgICAgICAgICAgLSBGdW5jdGlvbiBhbm5vdGF0aW9uIHN1cHBvcnQKICAgICAgICAgICAgICAgICAgQWxzbywgdGhlIHBhcmFtZXRlciBsaXN0IG9mIHByb3h5IGZ1bmN0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkLAogICAgICAgICAgICAgICAgICBldmVuIHdpdGhvdXQgdGhlICItcHkzIiBvcHRpb24uIEhvd2V2ZXIsIHRoZSBwYXJhbWV0ZXIgbGlzdAogICAgICAgICAgICAgICAgICB3aWxsIGZhbGxiYWNrIHRvICphcmdzIGlmIHRoZSBmdW5jdGlvbiAob3IgbWV0aG9kKSBpcyBvdmVybG9hZGVkLgogICAgICAgICAgICAgIC0gQnVmZmVyIGludGVyZmFjZSBzdXBwb3J0CiAgICAgICAgICAgICAgLSBBYnN0cmFjdCBiYXNlIGNsYXNzIHN1cHBvcnQKCiAgICAgICAgICAgIEZvciBkZXRhaWxzIG9mIFB5dGhvbiAzIHN1cHBvcnQgYW5kIHRoZXNlIGZlYXR1cmVzLCBwbGVhc2Ugc2VlIHRoZQogICAgICAgICAgICAiUHl0aG9uIDMgU3VwcG9ydCIgc2VjdGlvbiBpbiB0aGUgIlNXSUcgYW5kIFB5dGhvbiIgY2hhcHRlciBvZiB0aGUgU1dJRwogICAgICAgICAgICBkb2N1bWVudGF0aW9uLgoKICAgICAgICAgICAgVGhlICItYXBwbHkiIGNvbW1hbmQgbGluZSBvcHRpb24gYW5kIHN1cHBvcnQgb2YgZ2VuZXJhdGluZyBjb2RlcwogICAgICAgICAgICB1c2luZyBhcHBseSgpIGlzIHJlbW92ZWQuIFNpbmNlIHRoaXMgaXMgb25seSByZXF1aXJlZCBieSB2ZXJ5IG9sZAogICAgICAgICAgICBQeXRob24uCgogICAgICAgICAgICBUaGlzIG1lcmdlIGFsc28gcGF0Y2hlZCBTV0lHJ3MgcGFyc2VyIHRvIHNvbHZlIGEgYnVnLiBCeSB0aGlzIHBhdGNoLAogICAgICAgICAgICBTV0lHIGZlYXR1cmVzIGFibGUgdG8gYmUgY29ycmVjdGx5IGFwcGxpZWQgb24gQysrIGNvbnZlcnNpb24gb3BlcmF0b3IsCiAgICAgICAgICAgIHN1Y2ggbGlrZSB0aGlzOgogICAgICAgICAgICAgIAogICAgICAgICAgICAgICVmZWF0dXJlKCJzaGFkb3ciKSAgKjo6b3BlcmF0b3IgYm9vbCAleyAuLi4gJX0KCjIwMDgtMDktMDI6IHJpY2hhcmRiCgkgICAgW1B5dGhvbl0gQ29tbWl0IHBhdGNoICMyMDg5MTQ5OiBEaXJlY3RvciBleGNlcHRpb24gaGFuZGxpbmcgbWFuZ2xlcwoJICAgIHJldHVybmVkIGV4Y2VwdGlvbi4gIEV4Y2VwdGlvbnMgcmFpc2VkIGJ5IFB5dGhvbiBjb2RlIGluIGRpcmVjdG9ycwoJICAgIGFyZSBub3cgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGNhbGxlciB3aXRob3V0IGNoYW5nZS4gIEFsc28sIHJlbW92ZQoJICAgIHRoZSAiOiAiIHByZWZpeCB3aGljaCB1c2VkIHRvIGJlIGFkZGVkIHRvIG90aGVyIGRpcmVjdG9yIGV4Y2VwdGlvbnMKCSAgICAoZWcsIHRob3NlIGR1ZSB0byBpbmNvcnJlY3QgcmV0dXJuIHR5cGVzKS4KCjIwMDgtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIENvbW1pdCBwYXRjaCAjMTk4ODI5NiBHQ0l0ZW0gbXVsdGlwbGUgbW9kdWxlIGxpbmtpbmcgaXNzdWUgd2hlbiB1c2luZyAKICAgICAgICAgICAgZGlyZWN0b3JzLgoKMjAwOC0wOS0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciAndXNpbmcnIGFuZCAnZml4ZWQnIGJsb2NrcyBpbiB0aGUgJ2NzaW4nIHR5cGVtYXAgaXMgbm93CiAgICAgICAgICAgIHBvc3NpYmxlIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgcHJlIGF0dHJpYnV0ZSBhbmQgdGhlIG5ldyB0ZXJtaW5hdG9yIGF0dHJpYnV0ZSwgZWcKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbiwgCiAgICAgICAgICAgICAgICAgICAgICAgcHJlPSIgICAgdXNpbmcgKENEYXRlIHRlbXAkY3NpbnB1dCA9IG5ldyBDRGF0ZSgkY3NpbnB1dCkpIHsiLAogICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmF0b3I9IiAgICB9IC8vIHRlcm1pbmF0ZSB0ZW1wJGNzaW5wdXQgdXNpbmcgYmxvY2siLAogICAgICAgICAgICAgICAgICAgICAgKSBjb25zdCBDRGF0ZSAmCiAgICAgICAgICAgICAgICAgICAgICAgIiRjc2NsYXNzbmFtZS5nZXRDUHRyKHRlbXAkY3NpbnB1dCkiCgogICAgICAgICAgICBTZWUgQ1NoYXJwLmh0bWwgZm9yIG1vcmUgaW5mby4KCjIwMDgtMDktMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBDb21taXQgcGF0Y2ggIzIwNzkzODEgc3VibWl0dGVkIGJ5IEJvcmlzIFNtaWxnYSAtIGNvbnN0YW50IGV4cHJzIHB1dCBpbnRvIAogICAgICAgICAgICBuby1ldmFsIGNvbnRleHQgaW4gREVGQ0VOVU0KCjIwMDgtMDgtMDI6IHd1enplYgogICAgICAgICAgICBbQ2hpY2tlbixBbGxlZ3JvXSBDb21taXQgUGF0Y2ggMjAxOTMxNAogICAgICAgICAgICBGaXhlcyBhIGJ1aWxkIGVycm9yIGluIGNoaWNrZW4sIGFuZCBzZXZlcmFsIGJ1aWxkIGVycm9ycyBhbmQgb3RoZXIgZXJyb3JzCiAgICAgICAgICAgIGluIEFsbGVncm8gQ0wKCjIwMDgtMDctMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWlsZGluZyBvZiBUY2wgZXhhbXBsZXMvdGVzdC1zdWl0ZSBvbiBNYWMgT1MgWCByZXBvcnRlZCBieSBHaWRlb24gU2ltcHNvbi4KCjIwMDgtMDctMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBTRiAjMjAxOTE1NiBDb25maWd1cmluZyB3aXRoIC0td2l0aG91dC1vY3RhdmUgb3IgLS13aXRob3V0LWFsbGxhbmcKICAgICAgICAgICAgZGlkIG5vdCBkaXNhYmxlIG9jdGF2ZS4KCjIwMDgtMDctMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGRpcmVjdG9yIHR5cGVtYXBzIGZvciBwb2ludGVycyBzbyB0aGF0IE5VTEwgcG9pbnRlcnMgYXJlIGNvcnJlY3RseSAKICAgICAgICAgICAgbWFyc2hhbGxlZCB0byBDIy9KYXZhIG51bGwgaW4gZGlyZWN0b3IgbWV0aG9kcy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBGb3Igc3RkX3ZlY3Rvci5pIGFuZCBzdGRfbWFwLmksIHJlbmFtZSBlbXB0eSgpIHRvIGlzX2VtcHR5KCkKCSAgICBzaW5jZSAiZW1wdHkiIGlzIGEgUEhQIHJlc2VydmVkIHdvcmQuICBCYXNlZCBvbiBwYXRjaCBmcm9tIE1hcmsgS2xlaW4KCSAgICBpbiBTRiMxOTQzNDE3LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1tYWtlIiBoYXMgYmVlbiByZW1vdmVkLiAgCgkgICAgU2VhcmNoZXMgb24gR29vZ2xlIGNvZGVzZWFyY2ggc3VnZ2VzdCB0aGF0IG5vYm9keSBpcyB1c2luZyBpdCBub3cKCSAgICBhbnl3YXkuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gVGhlIFNXSUcgY2RhdGEuaSBsaWJyYXJ5IG1vZHVsZSBpcyBub3cgc3VwcG9ydGVkLgoKMjAwOC0wNy0wMzogb2xseQoJICAgIFtQSFBdIFRoZSBkZXByZWNhdGVkIGNvbW1hbmQgbGluZSBvcHRpb24gIi1waHBmdWxsIiBoYXMgYmVlbgoJICAgIHJlbW92ZWQuICBXZSByZWNvbW1lbmQgYnVpbGRpbmcgeW91ciBleHRlbnNpb24gYXMgYSBkeW5hbWljYWxseQoJICAgIGxvYWRhYmxlIG1vZHVsZS4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUEhQNF0gU3VwcG9ydCBmb3IgUEhQNCBoYXMgYmVlbiByZW1vdmVkLiAgVGhlIFBIUCBkZXZlbG9wZXJzIGFyZQoJICAgIG5vIGxvbmdlciBtYWtpbmcgbmV3IFBIUDQgcmVsZWFzZXMsIGFuZCB3b24ndCBldmVuIGJlIHByb3ZpZGluZwoJICAgIHBhdGNoZXMgZm9yIGNyaXRpY2FsIHNlY3VyaXR5IGlzc3VlcyBhZnRlciAyMDA4LTA4LTA4LgoKMjAwOC0wNy0wMjogb2xseQoJICAgIFtQeXRob25dIEltcG9ydCB0aGUgQyBleHRlbnNpb24gZGlmZmVyZW50bHkgZm9yIFB5dGhvbiAyLjYgYW5kCgkgICAgbGF0ZXIgc28gdGhhdCBhbiBpbXBsaWNpdCByZWxhdGl2ZSBpbXBvcnQgZG9lc24ndCBwcm9kdWNlIGEKCSAgICBkZXByZWNhdGlvbiB3YXJuaW5nIGZvciAyLjYgYW5kIGEgZmFpbHVyZSBmb3IgMi43IGFuZCBsYXRlci4KCSAgICBQYXRjaCBmcm9tIFJpY2hhcmQgQm91bHRvbiBpbiBTRiMyMDA4MjI5LCBwbHVzIGZvbGxvdy11cCBwYXRjaGVzCgkgICAgZnJvbSBSaWNoYXJkIGFuZCBIYW95dSBCYWkuCgpWZXJzaW9uIDEuMy4zNiAoMjQgSnVuZSAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMjQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgUmVtb3ZlIGRlcHJlY2F0ZWQgLWMgY29tbWFuZGxpbmUgb3B0aW9uIChydW50aW1lIGxpYnJhcnkgZ2VuZXJhdGlvbikuCgowNi8yNC8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGFzc2VydGlvbiBmYWlsdXJlIHdoZW4gaGFuZGxpbmcgJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApCgkgICAgKHRlc3RjYXNlIGlnbm9yZV9wYXJhbWV0ZXIpLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBzZWdmYXVsdCB3aGVuIHdyYXBwaW5nIGEgbm9uLWNsYXNzIGZ1bmN0aW9uIG1hcmtlZCB3aXRoCgkgICAgJW5ld29iamVjdCAodGVzdGNhc2UgY2hhcl9zdHJpbmdzKS4KCjA2LzIyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgYSB3YXkgdG8gdXNlIEF0dGFjaEN1cnJlbnRUaHJlYWRBc0RhZW1vbiBpbnN0ZWFkIG9mIEF0dGFjaEN1cnJlbnRUaHJlYWQKICAgICAgICAgICAgaW4gZGlyZWN0b3IgY29kZS4gRGVmaW5lIHRoZSBTV0lHX0pBVkFfQVRUQUNIX0NVUlJFTlRfVEhSRUFEX0FTX0RBRU1PTiBtYWNybywgc2VlCiAgICAgICAgICAgIExpYi9qYXZhL2RpcmVjdG9yLnN3Zy4KCjA2LzIxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggY3Jhc2hpbmcgaW4gdGhlIFNUTCB3cmFwcGVycyAocmVqZWN0ISBhbmQgZGVsZXRlX2lmIG1ldGhvZHMpCgowNi8xOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEMjIGFuZCBKYXZhIGtleXdvcmRzIHdpbGwgYmUgcmVuYW1lZCBpbnN0ZWFkIG9mIGp1c3QgaXNzdWluZyBhIHdhcm5pbmcKICAgICAgICAgICAgYW5kIHRoZW4gZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgY29kZS4gV2FybmluZyAzMTQgZ2l2ZXMgdGhlIG5ldyBuYW1lIHdoZW4gYSAKICAgICAgICAgICAga2V5d29yZCBpcyBmb3VuZC4KCjA2LzE5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBLZXl3b3JkIGhhbmRsaW5nIGFkZGVkLiBSIEtleXdvcmRzIHdpbGwgYmUgcmVuYW1lZCBhcyBuZWNlc3NhcnkuCiAgICAgICAgICAgIFdhcm5pbmcgMzE0IGdpdmVzIHRoZSBuZXcgbmFtZSB3aGVuIGEga2V5d29yZCBpcyBmb3VuZC4KCjA2LzE3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIG1pc3Npbmcgc3VwcG9ydCBmb3IgYm9vbCYgYW5kIGJvb2wqLiBBZGRlZCBydW50ZXN0IGZvciBsaV90eXBlbWFwcyB0ZXN0Y2FzZS4KICAgICAgICAgICAgKEJ1ZyAjMTkzODE0MikKCjA2LzA3LzIwMDg6IGJoeQogICAgICAgICAgICBBZGRlZCB0ZXN0IGNhc2Uga2V5d29yZF9yZW5hbWUsIHRoZW4gbWFkZSB0aGUga2V5d29yZCByZW5hbWluZyB3b3JrcyBwcm9wZXJseQogICAgICAgICAgICBieSBmaXhpbmcgU3dpZ19uYW1lX21ha2UoKSBmb3IgYSBpbmNvbXBsZXRlIGNvbmRpdGlvbiBjaGVja2luZy4KCjA2LzAyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGVudW0gd3JhcHBlcnMgd2hlbiB1c2luZyAtbm9wcm94eS4KCjA1LzMwLzIwMDg6IGJoeQogICAgICAgICAgICBBZGRlZCBzdGQ6OndzdHJpbmcgaW50byBMaWIvdHlwZW1hcHMvcHJpbXR5cGVzLnN3Zywgc2luY2UgaXQgaXMgYWxzbyBhIHByaW1pdGl2ZSAKICAgICAgICAgICAgdHlwZSBpbiBTV0lHIC0gZml4ZWQgU0YgIzE5NzY5NzguCgowNS8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCB2YXJpYWJsZSB3cmFwcGVycyB3aGVuIHVzaW5nIC1ub3Byb3h5LgoKMDUvMjkvMjAwODogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGEgdHlwbyBvZiAlI2lmZGVmIGluIExpYi9weXRob24vcHljb250YWluZXIuc3dnLCB3aGljaCBpcyByZWxhdGVkIAogICAgICAgICAgICB0byAtZXh0cmFuYXRpdmUgU1dJRyBvcHRpb24gLSBTRiAjMTk3MTk3Ny4KCjA1LzIwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBwYXJ0aWFsY2hlY2sgbWFrZWZpbGUgdGFyZ2V0cyBmb3IgcGFydGlhbCB0ZXN0aW5nIG9mIHRoZSB0ZXN0LXN1aXRlLiBUaGVzZQogICAgICAgICAgICBqdXN0IGludm9rZSBTV0lHLCBpZSBubyBjb21waWxhdGlvbiBhbmQgbm8gcnVudGltZSB0ZXN0aW5nLiBJdCBjYW4gYmUgZmFzdGVyCiAgICAgICAgICAgIHdoZW4gZGV2ZWxvcGluZyBieSBqdXN0IGRvaW5nIGEgZGlyZWN0b3J5IGRpZmYgb2YgdGhlIGZpbGVzIFNXSUcgZ2VuZXJhdGVzCiAgICAgICAgICAgIGFnYWluc3QgdGhvc2UgZnJvbSBhIHByZXZpb3VzIHJ1bi4gRXhhbXBsZSB1c2FnZSBmcm9tIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5OgoKICAgICAgICAgICAgICBtYWtlIHBhcnRpYWxjaGVjay10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgbWFrZSBwYXJ0aWFsY2hlY2stamF2YS10ZXN0LXN1aXRlCgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIGVuY29tcGFzc2VzIG1vcmUgZmxleGliaWxpdHkgaW4gcnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgZWcKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gcHJlZml4IHRoZSBjb21tYW5kIGxpbmUgd2hpY2ggcnVucyBhbnkgdGFyZ2V0IGxhbmd1YWdlIHRlc3QKICAgICAgICAgICAgd2l0aCBhIHRvb2wuIFNlZSB0aGUgUlVOVE9PTCwgQ09NUElMRVRPT0wgYW5kIFNXSUdUT09MIHRhcmdldHMgaW4gdGhlIGNvbW1vbi5tawogICAgICAgICAgICBmaWxlIGFuZCBtYWtlZmlsZXMgaW4gdGhlIHRlc3Qtc3VpdGUgZGlyZWN0b3J5LiBGb3IgZXhhbXBsZSBpdCBpcyBwb3NzaWJsZSB0byAKICAgICAgICAgICAgcnVuIHRoZSBydW50aW1lIHRlc3RzIHRocm91Z2ggdmFsZ3JpbmQgdXNpbmc6CgogICAgICAgICAgICAgIG1ha2UgY2hlY2sgUlVOVE9PTD0idmFsZ3JpbmQgLS1sZWFrLWNoZWNrPWZ1bGwiCgogICAgICAgICAgICBvciBpbnZva2UgU1dJRyB1bmRlciB2YWxncmluZCB1c2luZzoKCiAgICAgICAgICAgICAgbWFrZSBjaGVjayBTV0lHVE9PTD0idmFsZ3JpbmQgLS10b29sPW1lbWNoZWNrIgoKMDUvMTkvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIEZpeGVkIGRlZmluZSB0aGF0IHdhcyBicmVha2luZyBwcmUtMi43LiAgQ2hlY2tlZCBpbgogICAgICAgICAgICBwYXRjaCBmcm9tIFNvcmVuIFNvbm5lbmJ1cmcgdGhhdCBjcmVhdGVzIHN0cmluZ3MgaW4gIAoJICAgIHZlcnNpb24gaW5kZXBlbmRlbnQgd2F5CgowNS8xNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHZhcmlhYmxlIG5hbWUgY2xhc2ggaW4gZGlyZWN0b3JzIC0gU0YgIzE5NjMzMTYgcmVwb3J0ZWQgYnkgVHJpc3Rhbi4KCjA1LzE0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBhbiBvcHRpbWlzYXRpb24gZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBvYmplY3RzIGJ5IHZhbHVlLCByZWR1Y2luZwogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGNvcGllcyBvZiB0aGUgb2JqZWN0IHRoYXQgYXJlIG1hZGUuIEltcGxlbWVudGVkIHVzaW5nIGFuCiAgICAgICAgICAgIG9wdGlvbmFsIGF0dHJpYnV0ZSBpbiB0aGUgIm91dCIgdHlwZW1hcCBjYWxsZWQgIm9wdGltYWwiLiBEZXRhaWxzIGluIAogICAgICAgICAgICBUeXBlbWFwcy5odG1sLgoKMDUvMTEvMjAwODogb2xseQoJICAgIFtQSFBdIENoZWNrIGZvciAlZmVhdHVyZSgibm90YWJzdHJhY3QiKSB3aGVuIGdlbmVyYXRpbmcgUEhQNSBjbGFzcwoJICAgIHdyYXBwZXIuCgowNS8xMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzE5NDM2MDggLSAkc2VsZiBzdWJzdGl0dXRpb24gaW4gJWNvbnRyYWN0LCBwYXRjaCBzdWJtaXR0ZWQgYnkKICAgICAgICAgICAgVG9vbiBWZXJzdHJhZWxlbi4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggY2hhciAqIHR5cGVtYXBzIHRvIHdvcmsgd2hlbiBhcHBsaWVkIHRvIHNpZ25lZCBjaGFyICogYW5kCgkgICAgdW5zaWduZWQgY2hhciAqICh1bmNvdmVyZWQgYnkgdGVzdGNhc2UgYXBwbHlfc3RyaW5ncykuCgowNS8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgY2hhciAqIG1lbWJlciB2YXJpYWJsZXMgd2hlbiB1c2luZyBhbGxwcm90ZWN0ZWQgbW9kZS4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IFdhcnJlbiBXYW5nLgoKMDUvMDkvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBiYWQgUEhQIGNvZGUgZ2VuZXJhdGVkIHdoZW4gd3JhcHBpbmcgYW4gZW51bSBpbiBhCgkgICAgbmFtZXNwYWNlICh1bmNvdmVyZWQgYnkgdGVzdGNhc2UgYXJyYXlzX3Njb3BlKS4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBTV0lHIG5vdyBydW5zIHRoZSBQSFAgdGVzdHN1aXRlIHVzaW5nIFBIUDUsIG5vdCBQSFA0LiAgUEhQNAoJICAgIGlzIGVzc2VudGlhbGx5IG9ic29sZXRlIG5vdywgc28gd2UgY2FyZSBtdWNoIG1vcmUgYWJvdXQgc29saWQgUEhQNQoJICAgIHN1cHBvcnQuCgowNS8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBTVEwgZml4ZXMgd2hlbiB1c2luZyAlaW1wb3J0IHJhdGhlciB0aGFuICVpbmNsdWRlIGFuZCB0aGUgU29sYXJpcyBXb3Jrc2hvcAogICAgICAgICAgICBjb21waWxlciBhbmQgdGhlIFJvZ3Vld2F2ZSBTVEwuCgowNS8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2Ygb3ZlcmxvYWRlZCBwcm90ZWN0ZWQgbWV0aG9kcyB3aGVuIHVzaW5nIGFsbHByb3RlY3RlZCBtb2RlLgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgV2FycmVuIFdhbmcuCgowNS8wMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBDb21taXQgcGF0Y2ggIzE5NTY2MDcgdG8gYWRkIC1NVCBzdXBwb3J0IGZyb20gUmljaGFyZCBCb3VsdG9uLgogICAgICAgICAgICBUaGlzIHBhdGNoIG1pcnJvcnMgdGhlIGdjYyAtTVQgb3B0aW9uIHdoaWNoIGFsbG93cyBvbmUgdG8gY2hhbmdlIHRoZSBkZWZhdWx0CiAgICAgICAgICAgIE1ha2VmaWxlIHRhcmdldCBiZWluZyBnZW5lcmF0ZWQgd2hlbiBnZW5lcmF0aW5nIG1ha2VmaWxlcyB3aXRoIHRoZSAtTSBmYW1pbHkKICAgICAgICAgICAgb2Ygb3B0aW9ucy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICQgc3dpZyAtamF2YSAtTU0gLU1UIG92ZXJyaWRkZW5uYW1lIC1jKysgIGV4YW1wbGUuaQogICAgICAgICAgICAgIG92ZXJyaWRkZW5uYW1lOiBcCiAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCjA0LzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgW0x1YV0gUmVtb3ZlZCBnZW5lcmF0aW9uIG9mIF93cmFwX2RlbGV0ZV9YWFhYWCAod3JhcHBlcmVkIGRlc3RydWN0b3IpCgkgICAgd2hpY2ggd2FzIHVudXNlZCBhbmQgY2F1c2luZyB3YXJuaW5nIHdpdGggZysrIC1XYWxsLgoJICAgIFJlbW92ZWQgb3RoZXIgdW51c2VkIHdhcm5pbmcgaW4gdHlwZW1hcHMuaSBhbmQgb3RoZXIgcGxhY2VzLgoJICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9lbWJlZDMsIGFuZCBydW4gdGVzdHMgYSBmZXcgdGVzdCBjYXNlcy4KCjA0LzI0LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIElCTSdzIEMrKyBjb21waWxlciBvbiBBSVggKHBhdGNoCgkgICAgZnJvbSBHb2VyYW4gVWRkZWJvcmcgaW4gU0YjMTkyODA0OCkuCgowNC8yNC8yMDA4OiBvbGx5CgkgICAgUmVuYW1lIEJTSVpFIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvYXJyYXlzX3Njb3BlLmkgdG8gQkJTSVpFIHRvCgkgICAgYXZvaWQgYSBjbGFzaCB3aXRoIEJTSVpFIGRlZmluZWQgYnkgaGVhZGVycyBvbiBBSVggd2l0aCBQZXJsCgkgICAgKHJlcG9ydGVkIGluIFNGIzE5MjgwNDgpLgoKMDQvMjAvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHRoZSBhYmlsaXR5IHRvIHdyYXAgYWxsIHByb3RlY3RlZCBtZW1iZXJzIHdoZW4gdXNpbmcgZGlyZWN0b3JzLgogICAgICAgICAgICBQcmV2aW91c2x5IG9ubHkgdGhlIHZpcnR1YWwgbWV0aG9kcyB3ZXJlIGF2YWlsYWJsZSB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICBOb3cgYWxsIHByb3RlY3RlZCBtZW1iZXJzLCAoc3RhdGljIGFuZCBub24tc3RhdGljIHZhcmlhYmxlcywgbm9uLXZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICBhbmQgc3RhdGljIG1ldGhvZHMpIGFyZSB3cmFwcGVkIHdoZW4gdXNpbmcgdGhlIGFsbHByb3RlY3RlZCBtb2RlLiBUaGUgYWxscHJvdGVjdGVkCiAgICAgICAgICAgIG1vZGUgaXMgdHVybmVkIG9uIGluIHRoZSBtb2R1bGUgZGVjbGFyYXRpb246CgogICAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIiwgYWxscHJvdGVjdGVkPSIxIikgbW9kdWxlbmFtZQoKVmVyc2lvbiAxLjMuMzUgKDcgQXByaWwgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEFkZCBtaXNzaW5nIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzCgowNC8wNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc3RhY2sgb3ZlcmZsb3cgd2hlbiB1c2luZyB0eXBlbWFwIHdhcm5pbmcgc3VwcHJlc3Npb24sIGVnIAogICAgICAgICAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX1RZUEVNQVBfQ0hBUkxFQUtfTVNHKQoKMDQvMDUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IHNoYXJlZF9wdHIgdHlwZW1hcHMgc28gdGhhdCAlcHl0aG9ubm9uZHluYW1pYyBjYW4gYmUgdXNlZC4gQWxzbyBjb3JyZWN0cwogICAgICAgICAgICBkaXNwbGF5IG9mIHRoZSBwcm94eSBjbGFzcyB0eXBlLiBSZXBvcnRlZCBieSBSb2JlcnQgTHVwdG9uLgoKMDQvMDQvMjAwODogb2xseQoJICAgIFtQeXRob25dIEFkZCAlbmV3b2JqZWN0IHJlZmVyZW5jZSB0byBweXRob24gbWVtb3J5IG1hbmFnZW1lbnQgc3Vic2VjdGlvbiBvZiBtYW51YWwKCSAgICAocGF0Y2ggZnJvbSBtZGJlYWNoeSBpbiBTRiMxODk0NjEwKS4KCjAzLzI3LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzaGFyZWRfcHRyIHR5cGVtYXBzIHdoZXJlIHRoZSBwb2ludGVyIHR5cGUgaXMgYSB0ZW1wbGF0ZWQgdHlwZSB3aXRoCiAgICAgICAgICAgIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJhbWV0ZXIuIFJlcG9ydGVkIGJ5IFJvYmVydCBMdXB0b24uCgowMy8yNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIHR5cGVtYXAgRElTT1dOIGZvciBTV0lHVFlQRSogYW5kIFNXSUdUWVBFW10sIGFuZCBzdXBwb3J0IGZvciAlZGVsb2JqZWN0IGZlYXR1cmUuCiAgICAgICAgICAgIEFkZGVkIEV4YW1wbGVzL2x1YS9vd25lciB3aGljaCBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUgbWVtb3J5IG1hbmFnZW1lbnQuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQXBwbHkgcGF0Y2ggIzE4NDQzMDEgZnJvbSBNb250eSBUYXlsb3IgdG8gc3VwcHJlc3MgZW51bSBjb25zdHJ1Y3RvcgogICAgICAgICAgICB1bnVzZWQgd2FybmluZ3MuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMTkyNDUyNCBmcm9tIENhc2V5IFJheW1vbmRzb24gd2hpY2ggZW5zdXJlcyB0aGUKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQiIG1lc3NhZ2UgaXMgZGlzcGxheWVkIHdoZW4gYXR0ZW1wdGluZyB0byBjYWxsIGEKICAgICAgICAgICAgY29uc3RydWN0b3Igb24gYSBjbGFzcyB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGNvbnN0cnVjdG9yIHdyYXBwZXIsIGVnIGlmCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgaXMgYWJzdHJhY3QuCgowMy8yNi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMTkyNTcwMiBmcm9tIENhc2V5IFJheW1vbmRzb24gd2hpY2ggcmVtb3ZlcyB3YXJuaW5nIDUxMgogICAgICAgICAgICBmb3Igc3RkOjp2ZWN0b3Igd3JhcHBlcnMuCgowMy8yNi8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gQXBwbHkgR0NDIDQuMyB3YXJuaW5ncyBwYXRjaCBmcm9tIFBoaWxpcHAgVGhvbWFzCgkgICAgKFNGIzE5MjUxMjIpLgoKMDMvMjEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gVGhyZWFkIHNhZmV0eSBwYXRjaCBmb3IgU1RMIGl0ZXJhdG9ycyBmcm9tIEFiaGluYW5kYW4gSmFpbi4KCjAzLzE3LzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkICVsdWFjb2RlIGZlYXR1cmUgdG8gYWRkIHNvdXJjZSBjb2RlIGludG8gd3JhcHBlcnMuCiAgICAgICAgICAgIFVwZGF0ZWQgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGlzLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvYXJyYXlzIHRvIHNob3cgaXRzIHVzZSAoYW5kIHR5cGVtYXBzKQoKMDMvMTcvMjAwODogb2xseQoJICAgIEZpeCBub25wb3J0YWJsZSBzZWQgdXNhZ2Ugd2hpY2ggZmFpbGVkIG9uIE1hYyBPUyBYIChhbmQgcHJvYmFibHkKCSAgICBvdGhlciBwbGF0Zm9ybXMpLiAgRml4ZXMgU0YjMTkwMzYxMi4KCjAzLzE3LzIwMDg6IG9sbHkKCSAgICBGaXggbWVtb3J5IGxlYWsgaW4gU1dJRydzIHBhcnNlciAoYmFzZWQgb24gcGF0Y2ggZnJvbSBSdXNzZWxsCgkgICAgQnJ5YW50IGluIFNGIzE5MTQwMjMpLgoKMDMvMTIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZyAjMTg3ODI4NSAtIHVubmVjZXNzYXJ5IGNhc3QgZm9yIEMgc3RydWN0IGNyZWF0aW9uIHdyYXBwZXJzLgoKMDMvMTIvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUmVtb3ZlIGRlYnVnZ2luZyBpbmZvIHdoZW4gdXNpbmcgc2hhcmVkX3B0ciBzdXBwb3J0CgowMy8wNi8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBVcGRhdGVkIGRvY3VtZW50YXRpb24gZm9yIEx1YSBleGNlcHRpb25zLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvZXhjZXB0aW9uIGFuZCBFeGFtcGxlcy9sdWEvZW1iZWQyLgogICAgICAgICAgICBTbWFsbCB1cGRhdGVzIHRvIHRoZSB0eXBlbWFwcy4KCjAzLzA0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQWRkIGNoYXIgKiYgdHlwZW1hcHMuCgowMy8wNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb2NjYXNpb25hbCBzZWcgZmF1bHQgd2hlbiBhdHRlbXB0aW5nIHRvIHJlcG9ydCBvdmVybG9hZGVkIG1ldGhvZHMgYXMgYmVpbmcgaWdub3JlZC4KCjAyLzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggIzE5MDQ1MzcgU3dpZyBjYXVzZXMgYSBQZXJsIHdhcm5pbmcgInggdXNlZCBvbmx5IG9uY2UiIGluIFBlcmwgNS4xMAogICAgICAgICAgICByZXBvcnRlZCBieSBBcmkgSm9sbWEKCjAyLzI5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzaGFyZWRfcHRyIHZhcmluL3Zhcm91dCB0eXBlbWFwcyBmb3Igd3JhcHBpbmcgZ2xvYmFsIHZhcmlhYmxlcy4KCjAyLzI1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAkd3JhcG5hbWUgdG8gd29yayBpbiAlZXhjZXB0aW9uIChmaXhlcyBzb21lIHdyYXA6bmFtZSBhc3NlcnRpb25zKQoKVmVyc2lvbiAxLjMuMzQgKDI3IEZlYnJ1YXJ5IDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDIvMTMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgZnVuY3Rpb24gcG9pbnRlciB2YXJpYWJsZXMuCgowMi8xMy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGZvciB1c2Ugd2l0aGluICVleGNlcHRpb246CiAgICAgICAgICAgICAgJHdyYXBuYW1lIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgd3JhcHBlciBuYW1lCiAgICAgICAgICAgICAgJG92ZXJuYW1lIC0gaWYgYSBtZXRob2QgaXMgb3ZlcmxvYWRlZCB0aGlzIGNvbnRhaW5zIHRoZSBleHRyYSBtYW5nbGluZyB1c2VkIG9uIAogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdmVybG9hZGVkIG1ldGhvZAogICAgICAgICAgICAgICRkZWNsICAgICAtIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgdGhlIHJldHVybiB0eXBlCiAgICAgICAgICAgICAgJGZ1bGxkZWNsIC0gdGhlIGZ1bGx5IHF1YWxpZmllZCBDL0MrKyBkZWNsYXJhdGlvbiBvZiB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSByZXR1cm4gdHlwZQoKMDIvMTIvMjAwODogZHJqb2UKICAgICAgICAgICAgW1JdIE5vdyBzZXR0aW5nIFM0IGZsYWcgaW4gU1dJRyBjcmVhdGVkIG9iamVjdHMuICBUaGlzCiAgICAgICAgICAgIGZpeGVzIFItU1dJRyBmb3IgMi42IGFuZCB3YXJuaW5nIGZvciAyLjYgZmFpbHVyZSBoYXMgYmVlbiByZW1vdmVkLgoKMDIvMTEvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSBwYXRjaCBieSBUb3JzdGVuIExhbmRzY2hvZmYgdG8gZml4IHRoZSB1bmFyeSBtaW51cyBpc3N1ZQogICAgICAgICAgICBSYW4gJ2FzdHlsZSAtLXN0eWxlPWtyIC0yJyBhY3Jvc3MgbHVhLmN4eCB0byBuZWF0ZW4gaXQgdXAKCjAyLzEwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1bXAgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gNC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSByZWNlbnRseSBpbnRyb2R1Y2VkIEFQSSAKICAgICAgICAgICAgY2hhbmdlIGluIHRoZSBjb252ZXJzaW9uIGZ1bmN0aW9ucywgaWUgY2hhbmdlIGluIGRlZmluaXRpb24gb2Ygc3dpZ19jb252ZXJ0ZXJfZnVuYy4KICAgICAgICAgICAgQW55b25lIGNhbGxpbmcgU1dJR19UeXBlQ2FzdCBtdXN0IHBhc3MgaW4gYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIG5ldyBhZGRpdGlvbmFsCiAgICAgICAgICAgICh0aGlyZCkgcGFyYW1ldGVyIGFuZCB0aGVuIGhhbmRsZSB0aGUgbmV3bHkgY3JlYXRlZCBtZW1vcnkgaWYgdGhlIHJldHVybmVkIHZhbHVlCiAgICAgICAgICAgIGlzIHNldCB0byBTV0lHX0NBU1RfTkVXX01FTU9SWSBlbHNlIGEgbWVtb3J5IGxlYWsgd2lsbCBlbnN1ZS4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEV4cGVyaW1lbnRhbCBzaGFyZWRfcHRyIHR5cGVtYXBzIGFkZGVkLiBVc2FnZSBpcyB0aGUgc2FtZSBhcyB0aGUgcmVjZW50bHkKICAgICAgICAgICAgYWRkZWQgSmF2YSBhbmQgQyMgc2hhcmVkX3B0ciB0eXBlbWFwcy4gVHdvIG1hY3JvcyBhcmUgYXZhaWxhYmxlLCBhbHRob3VnaCB0aGVzZQogICAgICAgICAgICBtYXkgd2VsbCBjaGFuZ2UgaW4gYSBmdXR1cmUgdmVyc2lvbjoKCiAgICAgICAgICAgIEZvciBiYXNlIGNsYXNzZXMgb3IgY2xhc3NlcyBub3QgaW4gYW4gaW5oZXJpdGFuY2UgY2hhaW46CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgIEZvciBkZXJpdmVkIGNsYXNzZXM6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKCiAgICAgICAgICAgIFRoZSBQUk9YWUNMQVNTIGlzIHRoZSBuYW1lIG9mIHRoZSBwcm94eSBjbGFzcywgYnV0IGlzIG9ubHkgcmVxdWlyZWQgZm9yIEphdmEvQyMuCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVpbmNsdWRlICJib29zdF9zaGFyZWRfcHRyLmkiCgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihLbGFzcywgU3BhY2U6OktsYXNzKQogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKEtsYXNzRGVyaXZlZCwgU3BhY2U6OktsYXNzLCBTcGFjZTo6S2xhc3NEZXJpdmVkKQoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzIHsgLi4uIH07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgS2xhc3NEZXJpdmVkIDogS2xhc3MgeyAuLi4gfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGdXJ0aGVyIGRldGFpbHMgdG8gZm9sbG93IGluIGZ1dHVyZSBkb2N1bWVudGF0aW9uLCBidXQgdGhlIGZvbGxvd2luZyBmZWF0dXJlcwogICAgICAgICAgICBzaG91bGQgYmUgbm90ZWQ6CgogICAgICAgICAgICAtIE5vdCByZXN0cmljdGVkIHRvIGJvb3N0OjpzaGFyZWRfcHRyLCBlZyBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZSB1c2VkLgogICAgICAgICAgICAtIEF2YWlsYWJsZSB0eXBlbWFwIGdyb3VwczoKICAgICAgICAgICAgICAoYSkgVHlwZW1hcHMgZm9yIHNoYXJlZF9wdHIgcGFzc2VkIGJ5IHZhbHVlLCByZWZlcmVuY2UsIHBvaW50ZXIgYW5kIHBvaW50ZXIgCiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4KICAgICAgICAgICAgLSAoYikgVHlwZW1hcHMgZm9yIHBhc3NpbmcgYnkgcmF3IHZhbHVlLCByYXcgcG9pbnRlciwgcmF3IHJlZmVyZW5jZSwgcmF3IHBvaW50ZXIKICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlLiAKICAgICAgICAgICAgLSBUaGUgY29kZSBiZWluZyB3cmFwcGVkIGRvZXMgbm90IGV2ZW4gaGF2ZSB0byB1c2Ugc2hhcmVkX3B0ciwgU1dJRyBjYW4gdXNlCiAgICAgICAgICAgICAgc2hhcmVkX3B0ciBhcyB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG1lY2hhbmlzbSBpbnN0ZWFkIG9mIGEgcmF3IHBvaW50ZXIgZHVlIHRvIAogICAgICAgICAgICAgIHRoZSB0eXBlbWFwcyBpbiBncm91cCAoYikgYWJvdmUuCiAgICAgICAgICAgIC0gTm8gYXJyYXkgc3VwcG9ydCBhcyBzaGFyZWRfcHRyIGRvZXMgbm90IHN1cHBvcnQgYXJyYXlzLgogICAgICAgICAgICAtIFRoaXMgd29ya3MgcXVpdGUgZGlmZmVyZW50bHkgdG8gdGhlIHVzdWFsIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IHdoZW4KICAgICAgICAgICAgICBvcGVyYXRvci0+IGlzIHBhcnNlZCBieSBTV0lHOgogICAgICAgICAgICAgIC0gQW4gYWRkaXRpb25hbCBzbWFydCBwb2ludGVyIGNsYXNzIGlzIG5vdCBnZW5lcmF0ZWQgcmVkdWNpbmcgY29kZSBibG9hdCBpbgogICAgICAgICAgICAgICAgdGhlIHdyYXBwZXJzLgogICAgICAgICAgICAgIC0gVXNpbmcgc21hcnQgcG9pbnRlcnMgYW5kIHJhdyBwb2ludGVycyBjYW4gYmUgbWl4ZWQgc2VhbWxlc3NseS4KICAgICAgICAgICAgICAtIE1pc3NpbmcgY29uc3RydWN0b3JzIGZvciB0aGUgc21hcnQgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIGEgcHJvYmxlbSBhbmQgc28KICAgICAgICAgICAgICAgIHNlcGFyYXRlIGZhY3RvcnkgdHlwZSBmdW5jdGlvbnMgZG8gbm90IGhhdmUgdG8gYmUgd3JpdHRlbiBhbmQgd3JhcHBlZC4KICAgICAgICAgICAgICAtIFRoZSBpbXBsaWNpdCBDKysgc2hhcmVkX3B0cjwgZGVyaXZlZCBjbGFzcyA+IHRvIHNoYXJlZF9wdHI8IGJhc2UgY2xhc3MgPgogICAgICAgICAgICAgICAgY2FzdCBhbHNvIHdvcmtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFRoaXMgbmVnYXRlcyB0aGUgbmVjZXNzaXR5IHRvIHdyaXRlCiAgICAgICAgICAgICAgICBhbiBleHBsaWNpdCBoZWxwZXIgY2FzdCBmdW5jdGlvbiBwcm92aWRpbmcgdGhlIHVwY2FzdCB3aGljaCB3b3VsZCBuZWVkCiAgICAgICAgICAgICAgICBjYWxsaW5nIHByaW9yIHRvIHBhc3NpbmcgYSBkZXJpdmVkIGNsYXNzIHRvIGEgbWV0aG9kIHRha2luZyBhIHNoYXJlZF9wdHIgdG8KICAgICAgICAgICAgICAgIGEgYmFzZSBjbGFzcy4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBjbGFzcyByZWdpc3RyYXRpb24gZnVuY3Rpb24gdmlhIGEgbmV3CiAgICAgICAgICAgICJzbWFydHB0ciIgZmVhdHVyZS4gVGhpcyBpcyBhIHZlcnkgbG93IGxldmVsIG9mIGN1c3RvbWlzYXRpb24gbW9zdCB1c2VycwogICAgICAgICAgICB3b3VsZCBuZXZlciBuZWVkIHRvIGtub3cuIFRoZSBmZWF0dXJlIHdpbGwgdHlwaWNhbGx5IGJlIHVzZWQgZm9yIGludHJ1c2l2ZSAKICAgICAgICAgICAgc21hcnQgcG9pbnRlcnMgYWxvbmcgd2l0aCBhZGRpdGlvbmFsIHR5cGVtYXBzLiBFeGFtcGxlIHVzYWdlIG9mIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic21hcnRwdHIiLCBub2Jsb2NrPTEpIEZvbyB7IGJvb3N0OjpzaGFyZWRfcHRyPCBGb28gPiB9CiAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBGb29fc3dpZ3JlZ2lzdGVyIGZ1bmN0aW9uIHdpbGwgdGhlbiByZWdpc3RlciBib29zdDo6c2hhcmVkIDwgRm9vID4KICAgICAgICAgICAgKFNXSUdUWVBFX3BfYm9vc3RfX3NoYXJlZF9wdHJURm9vX3QgaW5zdGVhZCBvZiBTV0lHVFlQRV9wX0ZvbykgYXMgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgdHlwZSBmb3IgaW5zdGFudGlhdGlvbnMgb2YgRm9vLgoKMDIvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRmVhdHVyZXMgbm93IHN1cHBvcnRzIHRoZSBvcHRpb25hbCAnbm9ibG9jaycgYXR0cmlidXRlIGZvciBhbGwgdXNhZ2Ugb2YgJWZlYXR1cmUuIAogICAgICAgICAgICBXaGVuIHNwZWNpZmllZCwgdGhlIHsgfSBicmFjZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgZmVhdHVyZSBjb2RlLiBUaGlzIGlzIGlkZW50aWNhbAogICAgICAgICAgICBpbiBiZWhhdmlvdXIgdG8gdXNhZ2Ugb2YgJ25vYmxvY2snIGluIHR5cGVtYXBzIGFuZCBpcyB1c2VkIHdoZW4gdGhlIHByZXByb2Nlc3NvcgogICAgICAgICAgICBpcyByZXF1aXJlZCB0byBvcGVyYXRlIG9uIHRoZSBjb2RlIGluIHRoZSBmZWF0dXJlIGFuZCB0aGUgZW5jbG9zaW5nIHsgfSBicmFjZXMKICAgICAgICAgICAgYXJlIG5vdCByZXF1aXJlZC4gRXhhbXBsZToKCiAgICAgICAgICAgICAgI2RlZmluZSBGT08gZm9vCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIiwgbm9ibG9jaz0iMSIpIHsgRk9POjpiYXIgfQoKICAgICAgICAgICAgVGhlIHByZXByb2Nlc3NvciB0aGVuIHJlZHVjZXMgdGhpcyBhcyBpZiB0aGlzIGhhZCBiZWVuIHVzZWQgaW5zdGVhZDoKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIikgImZvbzo6YmFyIgoKMDIvMDEvMjAwODogb2xseQoJICAgIFtQeXRob25dIEZpeCBmb3JtYXQgc3RyaW5nIGJ1ZyAoU0YjMTg4MjIyMCkuCgowMS8zMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRpdGlvbnMgdG8gdGhlICV0eXBlcyBkaXJlY3RpdmUuIE5vdyB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBjYW4gYmUKICAgICAgICAgICAgb3ZlcnJpZGRlbiB0byBzb21lIGN1c3RvbSBjb2RlIGluIHRoZSAldHlwZXMgZGlyZWN0aXZlLCBsaWtlIHNvOgoKICAgICAgICAgICAgICAldHlwZXMoZnJvbXR5cGUgPSB0b3R5cGUpICV7CiAgICAgICAgICAgICAgICAuLi4gY29kZSB0byBjb252ZXJ0IGZyb210eXBlIHRvIHRvdHlwZSBhbmQgcmV0dXJuIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgc3BlY2lhbCB2YXJpYWJsZSAkZnJvbSB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgb2YgdGhlCiAgICAgICAgICAgIHR5cGUgYmVpbmcgY29udmVydGVkIGZyb20uIFRoZSBjb2RlIG11c3QgcmV0dXJuIHRoZSB0b3R5cGUgY2FzdCB0byB2b2lkICouIEV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIFRpbWU7CiAgICAgICAgICAgICAgY2xhc3MgRGF0ZTsKICAgICAgICAgICAgICBEYXRlICZUaW1lOjpkYXRlRnJvbVRpbWUoKTsKCiAgICAgICAgICAgICAgJXR5cGVzKFRpbWUgPSBEYXRlKSAlewogICAgICAgICAgICAgICAgVGltZSAqdCA9IChUaW1lICopJGZyb207CiAgICAgICAgICAgICAgICBEYXRlICZkID0gdC0+ZGF0ZUZyb21UaW1lKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZvaWQgKikgJmQ7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIHJlc3VsdGluZyBpbiB0aGUgY29udmVyc2lvbiAvIGNhc3RpbmcgY29kZSBsb29raW5nIHNvbWV0aGluZyBsaWtlOgoKICAgICAgICAgICAgICBzdGF0aWMgdm9pZCAqX3BfVGltZVRvX3BfRGF0ZSh2b2lkICp4KSB7CiAgICAgICAgICAgICAgICBUaW1lICp0ID0gKFRpbWUgKil4OwogICAgICAgICAgICAgICAgRGF0ZSAmZCA9IHQtPmRhdGVGcm9tVGltZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopICZkOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaXMgYWR2YW5jZWQgdXNhZ2UsIHBsZWFzZSB1c2Ugb25seSBpZiB5b3UgdW5kZXJzdGFuZCB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4KCjAxLzMwLzIwMDg6IG1nb3NzYWdlCgkgICAgU21hbGwgdXBkYXRlIHRvIGRvY3VtZW50YXRpb24gaW4gVHlwZW1hcHMuaHRtbCwgdG8gd2FybiBhYm91dCB1c2Ugb2YgbG9jYWwgCgkgICAgdmFyaWFibGVzIGluIHR5cGVtYXBzIGZvciBtdWx0aXBsZSB0eXBlcy4KCjAxLzI1LzIwMDg6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCBidWcgcmVwb3J0ZWQgYnkgS2V2aW4gTWlsbHMgaW4gQVJSQVlTT0ZDTEFTU0VTIHR5cGVtYXBzIHdoZXJlIGFueQogICAgICAgICAgICBjaGFuZ2VzIG1hZGUgdG8gYW4gYXJyYXkgZWxlbWVudCBwYXNzZWQgZnJvbSBKYXZhIHRvIEMgYXJlIG5vdCByZWZsZWN0ZWQgYmFjawogICAgICAgICAgICBpbnRvIEphdmEuCgowMS8yNC8yMDA4OiBtZ29zc2FnZQoJICAgIE1vcmUgdXBkYXRlcyB0byB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3IgZGV0ZWN0aW5nIGx1YS4KCSAgICBBbHNvIGxvb2tzIGluIC91c3IvaW5jbHVkZS9sdWEqCgkgICAgQWxzbyBjaGFuZ2VkIHR5cGVtYXBzLmkgbm90IHRvIGNoZWNrIGZvciBOVUxMIGJlZm9yZSBmcmVlaW5nIGEgcG9pbnRlcgoKMDEvMjEvMjAwODogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBGb3IgU1RMIGNvbnRhaW5lcnMsIFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvIGNvbnZlcnQgZnJvbSBvbmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lciB0byBhbm90aGVyLCBlZyBmcm9tIHN0ZDo6dmVjdG9yPGludD4gdG8gc3RkOjp2ZWN0b3I8ZG91YmxlPgogICAgICAgICAgICBvciBzdGQ6Omxpc3Q8aW50PiB0byBzdGQ6OnZlY3RvcjxpbnQ+IG9yIGV2ZW4gc3RkOjp2ZWN0b3I8Rm9vPiB0bwogICAgICAgICAgICBzdGQ6OnZlY3RvcjxCYXI+IGFzIGl0IHByZXZpb3VzbHkgZGlkLiBJbiBmYWN0IFNXSUcgbm8gbG9uZ2VyIGF0dGVtcHRzIHRvCiAgICAgICAgICAgIGNvbnZlcnQgYW55IFNXSUcgd3JhcHBlZCBDKysgcHJveHkgY2xhc3MgdGhhdCBpcyBhbHNvIGEgUHl0aG9uIHNlcXVlbmNlLAogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQuIEFueSBub24tU1dJRyBQeXRob24gc2VxdWVuY2Ugd2lsbCBzdGlsbCBiZQogICAgICAgICAgICBhY2NlcHRlZCB3aGVyZXZlciBhbiBTVEwgY29udGFpbmVyIGlzIGFjY2VwdGVkLiBPdmVybG9hZGVkIG1ldGhvZHMgdXNpbmcKICAgICAgICAgICAgY29udGFpbmVycyBzaG91bGQgYmUgZmFzdGVyLgoKMDEvMTgvMjAwODogd3NmdWx0b24KCSAgICBbQyNdIEFkZCAnZGlyZWN0b3JpbmF0dHJpYnV0ZXMnIGFuZCAnZGlyZWN0b3JvdXRhdHRyaWJ1dGVzJyB0eXBlbWFwIGF0dHJpYnV0ZXMKICAgICAgICAgICAgZm9yIHRoZSBpbXR5cGUgdHlwZW1hcC4gVGhlc2Ugc2hvdWxkIGNvbnRhaW4gQyMgYXR0cmlidXRlcyB3aGljaCB3aWxsCiAgICAgICAgICAgIGJlIGdlbmVyYXRlZCBpbnRvIHRoZSBDIyBkaXJlY3RvciBkZWxlZ2F0ZSBtZXRob2RzLgoKMDEvMTgvMjAwODogb2xseQoJICAgIEZpeCBoYW5kbGluZyBvZiBieXRlIHZhbHVlIDI1NSBpbiBpbnB1dCBmaWxlcyBvbiBwbGF0Zm9ybXMgd2hlcmUKCSAgICBjaGFyIGlzIHNpZ25lZCAoaXQgd2FzIGdldHRpbmcgbWFwcGVkIHRvIEVPRikuICBGaXhlcyBTRiMxNTE4MjE5LgoKMDEvMTYvMjAwODogd3NmdWx0b24KCSAgICBGaXggdGVtcGxhdGUgbWVtYmVyIHZhcmlhYmxlcyB3cmFwcGVkIGJ5IGEgc21hcnQgcG9pbnRlci4gQnVnIHJlcG9ydGVkIAogICAgICAgICAgICBieSBSb2JlcnQgTHVwdG9uLgoKMDEvMTQvMjAwODogbWdvc3NhZ2UKCSAgICBTdWJzdGFudGlhbCBjaGFuZ2VzIHRvIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGRldGVjdGluZyBsdWEuCgkgICAgICBDb2RlIGNhbiBub3cgbGluayB0byBsaWJsdWEuYSwgbGlibHVhNTAuYSBvciBsaWJsdWE1MS5hCgkgICAgICBJdCdzIGFsc28gYSBsb3QgbmVhdGVyIG5vdy4KCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEJhY2tlZCBvdXQgIzE3OTg3MjggLSBudW1iZXJzIGNhbiBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRha2luZyBjaGFyICoKCjEyLzE2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODMyNjEzIC0gVGVtcGxhdGVzIGFuZCBzb21lIHR5cGVkZWZzIGludm9sdmluZyBwb2ludGVycyBvciBmdW5jdGlvbiBwb2ludGVycwoKMTIvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4ICMxNjMyNjI1IC0gQ29tcGlsYXRpb24gZXJyb3JzIG9uIFZpc3VhbCBDKysgNiB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCAjMTc5ODcyOCAtIG51bWJlcnMgY2FuIGJlIHBhc3NlZCB0byBmdW5jdGlvbnMgdGFraW5nIGNoYXIgKi4KCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxODE5ODQ3ICV0ZW1wbGF0ZSB3aXRoIGp1c3Qgb25lIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVyIAoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUID0gaW50PiBjbGFzcyBGb28gey4uLn07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0RlZmF1bHQpIEZvbzw+OwoKMTIvMTIvMjAwNzogbWdvc3NhZ2UKCSAgICBbTHVhXSBTbWFsbCBjb3JyZWN0aW9uIG9uIEx1YS5odG1sCgoxMi8wOS8yMDA3OiB3c2Z1bHRvbgoJICAgIEFwcGx5IHBhdGNoICMxODM4MjQ4IGZyb20gTW9udHkgVGF5bG9yIGZvciB2cGF0aCBidWlsZHMgb2YgU1dJRy4KCjEyLzA4LzIwMDc6IHdzZnVsdG9uCgkgICAgW0x1YV0gRml4ZXMgdG8gcmVtb3ZlIGdjYy00LjIgd2FybmluZ3MKCjEyLzA2LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICMxNzM0NDE1IC0gdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVycyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIHRfaXRlbSwgdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIHRfYWxsb2MgPSBwZmM6OmFsbG9jX2Zhc3QgPgogICAgICAgICAgICAgICAgY2xhc3MgbGlzdF90IDogcHVibGljIGxpc3RfaW1wbF90PHRfaXRlbSxwZmM6OmFycmF5X3Q8dF9pdGVtLHRfYWxsb2M+ID4geyAuLi4gfTsKCjEyLzA0LzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gRml4IGEgYnVnIGluIHRoZSBjbGFzcyBoaWVyYWNoeSBjb2RlLCB3aGVyZSB0aGUgbWV0aG9kcyB3ZXJlIG5vdCBwcm9wYWdhdGVkLCAKCSAgICBpZiB0aGUgbmFtZSBvcmRlcmluZyB3YXMgaW4gYSBjZXJ0YWluIG9yZGVyLgoJICAgIEFkZGVkIG5ldyBleGFtcGxlIHByb2dyYW1zIChkdWFsLCBlbWJlZCkgYW5kIHJ1bnRpbWUgdGVzdHMgZm9yIHRlc3Qtc3VpdGUuCgoxMS8zMC8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCB1c2luZyBzdGF0ZW1lbnRzIHVzaW5nIGEgYmFzZSBjbGFzcyBtZXRob2Qgd2hlcmUgdGhlIG1ldGhvZHMgd2VyZSBvdmVybG9hZGVkLgogICAgICAgICAgICBEZXBlbmRpbmcgb24gdGhlIG9yZGVyIG9mIHRoZSB1c2luZyBzdGF0ZW1lbnRzIGFuZCBtZXRob2QgZGVjbGFyYXRpb25zLCB0aGVzZQogICAgICAgICAgICB3ZXJlIHByZXZpb3VzbHkgZ2VuZXJhdGluZyB1bmNvbXBpbGFibGUgd3JhcHBlcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZ1bmsoKTsKICAgICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmZ1bms7CiAgICAgICAgICAgICAgfTsKClZlcnNpb24gMS4zLjMzIChOb3ZlbWJlciAyMywgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjEvMjAwNzogbWlrZWwKCSAgICBbYWxsZWdyb2NsXSBvbWl0IHByaXZhdGUgc2xvdCB0eXBlIGluZm8gaW4gdGhlIGNsYXNzZXMvdHlwZXMKCSAgICBkZWZpbmVkIG9uIHRoZSBsaXNwIHNpZGUuIEZpeCBidWcgaW4gbWFwcGluZyBvZiBDLysrIHR5cGVzCgkgICAgdG8gbGlzcCB0eXBlcy4gRml4IHR5cG8gaW4gbW9kdWxlcyBnZW5lcmF0ZWQgZGVmcGFja2FnZSBmb3JtLgoJICAgIEhhdmUgc3RkOjpzdHJpbmcgKidzIGF1dG9tYXRpY2FsbHkgbWFyc2hhbGxlZCBiZXR3ZWVuIGZvcmVpZ24KCSAgICBhbmQgbGlzcCBzdHJpbmdzLgoJCjExLzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaWxsIGluIFB5dGhvbiBEaWN0aW9uYXJ5IGZ1bmN0aW9ucyBsaXN0IChwYXRjaCBmcm9tCgkgICAgSmVsbWVyIFZlcm5vb2lqIHBvc3RlZCB0byBzd2lnLWRldmVsKS4KCjExLzIwLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgaW4gdGhlIEMgc2Nhbm5lciByZWxhdGVkIHRvIGJhY2tzbGFzaCBjaGFyYWN0ZXJzLgoKMTEvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IGJyb2tlbiBjb21waWxhdGlvbiBvZiBDKysgd3JhcHBlcnMgb24gc29tZSBjb21waWxlcnMuCgoxMS8xNi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRG9uJ3QgcGFzcyBQeV9zc2l6ZV90IGZvciBhICVkIHByaW50Zi1saWtlIGZvcm1hdCBhcwoJICAgIHRoYXQncyB1bmRlZmluZWQgYmVoYXZpb3VyIHdoZW4gc2l6ZW9mKFB5X3NzaXplX3QpICE9IHNpemVvZihpbnQpLgoKVmVyc2lvbiAxLjMuMzIgKE5vdmVtYmVyIDE1LCAyMDA3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gUGFja2FnZSBuYW1lIGFuZCBkbGwgbmFtZSBpcyBub3cgdGhlIHNhbWUgYXMgdGhlIFNXSUcgbW9kdWxlCiAgICAgICAgICAgIG5hbWUuIEl0IHVzZWQgdG8gYmUgdGhlIG1vZHVsZSBuYW1lIHdpdGggX3dyYXAgYXMgYSBzdWZmaXguIFRoZSBwYWNrYWdlCiAgICAgICAgICAgIGFuZCBkbGwgbmFtZXMgY2FuIGJlIG1vZGlmaWVkIHVzaW5nIHRoZSAtcGFja2FnZSBhbmQgLWRsbCBjb21tYW5kbGluZQogICAgICAgICAgICBvcHRpb25zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8xMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gQWRkIHN1cHBvcnQgZm9yIFdpbmRvd3MgKFZpc3VhbCBDKysgOCB0ZXN0ZWQpCgoxMS8xMC8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IG1ha2VmaWxlIGdlbmVyYXRlZCBieSAtbWFrZSAoU0YjMTYzMzY3OSkuICBVcGRhdGUKCSAgICBkb2N1bWVudGF0aW9uIHRvIG1hcmsgIi1tYWtlIiBhcyBkZXByZWNhdGVkIChub25lIG9mIHRoZSBvdGhlcgoJICAgIFNXSUcgYmFja2VuZHMgc2VlbSB0byBvZmZlciBzdWNoIGEgZmVhdHVyZSwgaXQgY2FuJ3QgcmVhbGlzdGljYWxseQoJICAgIGdlbmVyYXRlIGEgZnVsbHkgcG9ydGFibGUgbWFrZWZpbGUsIGFuZCB0aGUgY29tbWFuZHMgdG8gYnVpbGQgYW4KCSAgICBleHRlbnNpb24gYXJlIGVhc3kgZW5vdWdoIHRvIHdyaXRlIGZvciB0aGUgdXNlcidzIHByZWZlcnJlZCBidWlsZAoJICAgIHRvb2wpLiAgQWxzbyByZWNvbW1lbmQgYWdhaW5zdCB0aGUgdXNlIG9mICItcGhwZnVsbCIgKGl0J3Mgb25seQoJICAgIHJlYWxseSB1c2VmdWwgd2hlbiBzdGF0aWMgbGlua2luZywgYW5kIGEgZHluYW1pY2FsbHkgbG9hZGFibGUKCSAgICBtb2R1bGUgaXMgdmlydHVhbGx5IGFsd2F5cyB0aGUgYmV0dGVyIGFwcHJvYWNoKS4KCjExLzA5LzIwMDc6IG9sbHkKCSAgICBGaXggLS1oZWxwIG91dHB1dCB0byBub3RlIHRoYXQgYGV4cG9ydCBTV0lHX0ZFQVRVUkVTJyBpcyByZXF1aXJlZC4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggc2VnIGZhdWx0IG9uIFdpbmRvd3MKICAgICAgICAgICAgW1JdIEV4YW1wbGVzIFIgc2NyaXB0cyBhcmUgbm93IHBsYXRmb3JtIGluZGVwZW5kZW50CgoxMC8zMC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIGZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBjbGFzc2VzIHdoaWNoIGNhc2VzIHRlbXBsYXRlX2RlZmF1bHQyCgkgICAgYW5kIHRlbXBsYXRlX3NwZWNpYWxpemF0aW9uX2RlZmFyZyB0byBmYWlsLgoJICAgIEFkZGVkIHNldmVyYWwgd2FybmluZyBmaWx0ZXJzIGludG8gdGhlIG92ZXJsb2FkJ3MgdGVzdCBjYXNlcy4KCSAgICBBZGRlZCBydW50aW1lIHRlc3RzIGZvciBzZXZlcmFsIGNvZGVzLgoJICAgIFlvdSBjYW4gbm93IG1ha2UgY2hlY2stbHVhLXRlc3Qtc3VpdGUgd2l0aCBubyBlcnJvcnMgYW5kIG9ubHkgYSBmZXcgd2FybmluZ3MuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGNvbmZpZ3VyZSB0ZXN0IHRvIHB1dCBHVUlMRUxJTksgaW4gTElCUyBub3QgTERGTEFHUwoJICAgIChTRiMxODIyNDMwKS4KCjEwLzMwLzIwMDc6IG9sbHkKCSAgICBbZ3VpbGVdIEZpeCB0aGUgZ3VpbGUgZXhhbXBsZXMgb24gNjQtYml0IHBsYXRmb3Jtcy4KCjEwLzI5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IG1lbWJlciBwb2ludGVycyBvbiA2NCBiaXQgcGxhdGZvcm1zLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBzd2lnX2x1YV9jbGFzcyBpbnN0YW5jZXMgdG8gYmUgc3RhdGljIHRvIGFsbG93IG11bHRpcGxlCgkgICAgU1dJRyB3cmFwcGVycyB0byBiZSBjb21waWxlZCBpbnRvIHRoZSBzYW1lIGV4ZWN1dGFibGUgc3RhdGljYWxseS4KCSAgICBQYXRjaCBmcm9tIEFuZHJlYXMgRnJlZHJpa3Nzb24gKHBvc3RlZCB0byB0aGUgc3dpZyBtYWlsaW5nIGxpc3QpLgoKMTAvMjgvMjAwNzogb2xseQoJICAgIFtsdWFdIEZpeCBFeGFtcGxlcy9sdWEgdG8gcGFzcyBTUkNTIGZvciBDIHRlc3RzIHJhdGhlciB0aGFuIENYWFNSQ1MuCgkgICAgVGhlIGNvZGUgYXMgaXQgd2FzIGhhcHBlbmVkIHRvIHdvcmsgb24geDg2LCBidXQgYnJva2Ugb24geDg2XzY0IChhbmQKCSAgICBwcm9iYWJseSBhbnkgb3RoZXIgcGxhdGZvcm1zIHdoaWNoIHJlcXVpcmUgLWZQSUMpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgYXBwcm9hY2ggZm9yIGZpeGluZyB1bmluaXRpYWxpc2VkIHZhcmlhYmxlIHVzYWdlIG9uIGVycm9yIGluIGRpcmVjdG9yCiAgICAgICAgICAgIG1ldGhvZHMgdXNpbmcgdGhlIG5ldyB0ZW1wbGF0ZWQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gU3dpZ1ZhbHVlSW5pdCgpLgoKMTAvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFVzZSBtb3JlIGVmZmljaWVudCBTdlBWX25vbGVuKHgpIGluc3RlYWQgb2YgU3ZQVih4LFBMX25hKSBpZiBTdlBWX25vbGVuIGlzCiAgICAgICAgICAgIHN1cHBvcnRlZC4KCjEwLzI2LzIwMDc6IHd1enplYgoJICAgIFtDaGlja2VuXSBGaXggZ2xvYmFsIHZhcmlhYmxlcyBvZiBjbGFzcyBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgkgICAgT3RoZXIgbWlub3IgZml4ZXMsIHNvIGFsbCB0ZXN0cyBpbiB0aGUgY2hpY2tlbiB0ZXN0IHN1aXRlIG5vdyBwYXNzCgoxMC8yNS8yMDA3OiBvbGx5CgkgICAgRml4IFVUTCB0eXBlY2hlY2sgbWFjcm8gZm9yIGEgZnVuY3Rpb24gdGFraW5nIGNoYXJbXSBvciBjb25zdAoJICAgIGNoYXJbXSAoU0YjMTgyMDEzMikuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaWx0ZXIgb3V0IC1hbnNpIC1wZWRhbnRpYyBmcm9tIENGTEFHUyB3aGlsZSBjb21waWxpbmcgdGVzdCBwcm9ncmFtcyBmb3IgR3VpbGUKCSAgICBpbiBjb25maWd1cmUuICBUaGlzIGVuYWJsZXMgcnVubmluZyB0aGUgdGVzdCBzdWl0ZSBmb3IgR3VpbGUgaWYgaXQgaXMgaW5zdGFsbGVkIGFuZAoJICAgIHVzYWJsZS4KCjEwLzIyLzIwMDc6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gRml4IHRlc3RjYXNlcyBhcHBseV9zaWduZWRfY2hhciBhbmQgYXBwbHlfc3RyaW5ncwoJICAgIGJ5IGFkZGluZyBleHBsaWNpdCBjYXN0cyB0byB0aGUgYXBwcm9wcmlhdGUgJGx0eXBlLgoKMTAvMjIvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvciBtZXRob2RzLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBCdWcgIzE3OTQyNDcgLSBmaXggZ2VuZXJhdGVkIGNvZGUgZm9yIGRlcml2ZWQgY2xhc3NlcyB3aGVuIGNzYmFzZSBvciBqYXZhYmFzZQogICAgICAgICAgICB0eXBlbWFwcyBhcmUgdXNlZCB3aXRoIHRoZSByZXBsYWNlPSIxIiBhdHRyaWJ1dGUuCgoxMC8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBEb2NzIHVwZGF0ZWQgdG8gc3VnZ2VzdCB1c2luZyBkaXN0dXRpbHMuIFBhdGNoICMxNzk2NjgxIGZyb20gQ2hyaXN0b3BoZXIgQmFya2VyLgoKMTAvMTkvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gQ2xlYXIgZXJybm8gYmVmb3JlIGNhbGxzIHRvIHN0cnRvbCgpLCBzdHJ0b3VsKCksIHN0cnRvbGwoKQoJICAgIGFuZCBzdHJ0b3VsbCgpIHdoaWNoIHdlIGNoZWNrIGVycm5vIGFmdGVyIHRvIGF2b2lkIHNlZWluZyBhIGp1bmsKCSAgICB2YWx1ZSBvZiBlcnJubyBpZiB0aGVyZSBpc24ndCBhbiBlcnJvciBpbiB0aGUgY2FsbC4KCjEwLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSAlYXR0cmlidXRlX3JlZiBhbmQgcmVwbGFjZSB3aXRoICVhdHRyaWJ1dGVyZWYuIFRoZXJlIGlzIGp1c3QgYW4gYXJndW1lbnQKICAgICAgICAgICAgb3JkZXIgY2hhbmdlIGluIG9yZGVyIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggJWF0dHJpYnV0ZSwgZnJvbToKCiAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEFjY2Vzc29yTWV0aG9kLCBBdHRyaWJ1dGVOYW1lKQogICAgICAgICAgICB0bwogICAgICAgICAgICAgICVhdHRyaWJ1dGVyZWYoQ2xhc3MsIEF0dHJpYnV0ZVR5cGUsIEF0dHJpYnV0ZU5hbWUsIEFjY2Vzc29yTWV0aG9kKQoKMTAvMTYvMjAwNzogb2xseQoJICAgIFtUY2xdIEZpeCBzZXZlcmFsIG9jY3VycmVuY2VzIG9mICJ3YXJuaW5nOiBkZXByZWNhdGVkIGNvbnZlcnNpb24KCSAgICBmcm9tIHN0cmluZyBjb25zdGFudCB0byAnY2hhcionIiBmcm9tIEdDQyA0LjIgaW4gZ2VuZXJhdGVkIEMvQysrCgkgICAgY29kZS4KCjEwLzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQXSBGaXggbWFueSBvY2N1cnJlbmNlcyBvZiAid2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uIGZyb20KCSAgICBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyIgZnJvbSBHQ0MgNC4yIGluIGdlbmVyYXRlZCBDL0MrKyBjb2RlCgkgICAgd2hlbiBjb21waWxpbmcgd2l0aCBhIG5ldyBlbm91Z2ggdmVyc2lvbiBvZiBQSFAgNSAodGVzdGVkIHdpdGgKCSAgICBQSFAgNS4yLjMsIGJ1dCBQSFAgNS4yLjEgaXMgcHJvYmFibHkgdGhlIG1pbmltdW0gcmVxdWlyZW1lbnQpLgoKMTAvMTUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzE3OTcxMzMgZnJvbSBEYXZpZCBQaWVwZ3Jhc3MgZml4ZXMgJWF0dHJpYnV0ZSB3aGVuIHRoZSBnZXR0ZXIgaGFzIHRoZSBzYW1lIG5hbWUKICAgICAgICAgICAgYXMgdGhlIGF0dHJpYnV0ZSBuYW1lIGFuZCBubyBsb25nZXIgZ2VuZXJhdGUgbm9uLWZ1bmN0aW9uYWwgc2V0dGVyIGZvciByZWFkLW9ubHkgYXR0cmlidXRlcy4KCjEwLzE1LzIwMDc6IG9sbHkKCSAgICBbVGNsXSBQcmV2ZW50IFNXSUdfVGNsX0NvbnZlcnRQdHIgZnJvbSBjYWxsaW5nIHRoZSB1bmtub3duIHByb2MuCgkgICAgQWRkIEV4YW1wbGVzL3RjbC9zdGRfdmVjdG9yLyB3aGljaCB0aGlzIGNoYW5nZSBmaXhlcy4gIFBhdGNoCgkgICAgaXMgZnJvbSAiQ2xpZmYgQyIgaW4gU0YjMTgwOTgxOS4KCjEwLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgRGV0YWNoQ3VycmVudFRocmVhZCBiYWNrIGluIGZvciBkaXJlY3RvcnMuIFNlZSBlbnRyeSBkYXRlZCAwOC8xMS8yMDA2IGFuZAogICAgICAgICAgICBzZWFyY2ggZm9yIERldGFjaEN1cnJlbnRUaHJlYWQgb24gdGhlIG1haWxpbmcgbGlzdHMgZm9yIGRldGFpbHMuIFRoZSBjcmFzaGVzIG9uIFNvbGFyaXMKICAgICAgICAgICAgc2VlbSB0byBiZSBvbmx5IHByZXNlbnQgaW4gamRrLTEuNC4yIGFuZCBsb3dlciAoamRrLTEuNS4wIGFuZCBqZGstMS42LjAgYXJlIG9rYXkpLCBzbwogICAgICAgICAgICBhbnlvbmUgdXNpbmcgZGlyZWN0b3JzIHNob3VsZCB1c2UgYSByZWNlbnQgamRrIG9uIFNvbGFyaXMsIG9yIGRlZmluZSAoc2VlIGRpcmVjdG9yLnN3ZykKICAgICAgICAgICAgU1dJR19KQVZBX05PX0RFVEFDSF9DVVJSRU5UX1RIUkVBRCB0byB0aGUgQysrIGNvbXBpbGVyIHRvIGdldCBvbGQgYmVoYXZpb3VyLgoKMTAvMTIvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRW5zdXJlIHRoZSBwcmVtYXR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIChwZ2NwcCkgaXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoZW4gdGhlcmUgYXJlIEMgY29tbWVudHMgaW4gdGhlIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMuCgoxMC8xMi8yMDA3OiB3dXp6ZWIKCSAgICBBZGRlZCBhIHRlc3RzdWl0ZSBlbnRyeSBmb3IgQnVnICMxNzM1OTMxCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgQXV0b21hdGljYWxseSByZXJ1biBhdXRvZ2VuLnNoIGlmIGNvbmZpZ3VyZS5pbiBpcyBtb2RpZmllZC4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBFbmhhbmNlIGNoZWNrLSUtdGVzdC1zdWl0ZSBydWxlIGFuZCBmcmllbmRzIHRvIGdpdmUgYSBtb3JlIGhlbHBmdWwKCSAgICBlcnJvciBtZXNzYWdlIGlmIHlvdSB0cnkgdGhlbSBmb3IgYSBsYW5ndWFnZSB3aGljaCBkb2Vzbid0IGV4aXN0CgkgICAgKGUuZy4gIm1ha2UgY2hlY2stcGhwLXRlc3Qtc3VpdGUiIHJhdGhlciB0aGFuIHRoZSBjb3JyZWN0CgkgICAgIm1ha2UgY2hlY2stcGhwNC10ZXN0LXN1aXRlIikuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgQWRkIG1ha2UgcnVsZSB0byByZWdlbmVyYXRlIE1ha2VmaWxlIGZyb20gTWFrZWZpbGUuaW4gaWYgaXQgaGFzCgkgICAgY2hhbmdlZC4KCjEwLzA5LzIwMDc6IG9sbHkKCSAgICBbcGhwXSBGaXggbG9uZy1zdGFuZGluZyBtZW1vcnkgbGVhayBpbiB3cmFwcGVkIGNvbnN0cnVjdG9ycyBhbmQKCSAgICB3cmFwcGVkIGZ1bmN0aW9ucy9tZXRob2RzIHdoaWNoIHJldHVybiBhbiBvYmplY3QuCgoxMC8wOC8yMDA3OiBvbGx5CgkgICAgRml4IE1ha2VmaWxlLmluIHRvIHJlYWQgY2hlY2subGlzdCBmaWxlcyBjb3JyZWN0bHkgaW4gYSBWUEFUSAoJICAgIGJ1aWxkLgoKMTAvMDcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBFeHBlcmltZW50YWwgc2hhcmVkX3B0ciB0eXBlbWFwcyBhZGRlZAoKMDkvMjcvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBhZGRlZCBtb3JlIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMgZm9yIGluY29ycmVjdCB0eXBlY2hlY2tzLgoJICAgIEFkZGVkIGEgcm91dGluZSB3aGljaCBjaGVja3MgdGhlIGV4YWN0IG51bWJlciBvZiBwYXJhbWV0ZXJzIHBhc3NlZCB0byBhIGZ1bmN0aW9uCgkgICAgKGJyZWFrcyBvcGVyYXRvcl9vdmVybG9hZGluZyBmb3IgdW5hcnkgbWludXMgb3BlcmF0b3IsIGN1cnJlbnRseSBkaXNhYmxlZCkuCgkgICAgUmVvcmdhbmlzZWQgdGhlIGx1YXR5cGVtYXBzLnN3ZyB0byB0aWR5IGl0IHVwLgoJICAgIEFkZGVkIGEgbG90IG9mICVpZ25vcmVzIG9uIHRoZSBvcGVyYXRvcnMgbm90IHN1cHBvcnRlZCBieSBsdWEuCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgY29uc3RhbnQgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzICYgcnVudGVzdCBmb3IgbWVtYmVyX3BvaW50ZXIuaQoJICAgIEFkZGVkIGZpcnN0IHZlcnNpb24gb2Ygd2NoYXIuaQoKMDkvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSB0aHJvd3MgdHlwZW1hcHMgZm9yIHN0ZDo6d3N0cmluZyB1c2luZyBDIyBwYXRjaCAjMTc5OTA2NCBmcm9tIERhdmlkIFBpZXBncmFzcwoKMDkvMjQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgIzE3NzEzMTMgdG8gZml4IGJ1ZyAjMTY1MDIyOSAtIGZpeGVzIGxvbmcgbG9uZyBhbmQgdW5zaWduZWQgbG9uZyBsb25nCiAgICAgICAgICAgIGhhbmRsaW5nLgoKMDkvMjAvMjAwNzogb2xseQoJICAgIFtKYXZhXSBFbGltaW5hdGUgc29tZSB1bm5lY2Vzc2FyeSB1c2VzIG9mIGEgdGVtcG9yYXJ5IGJ1ZmZlcgoJICAgIGFsbG9jYXRlZCB1c2luZyBuZXdbXS4gIFNGIzE3OTY2MDkuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSAkY3NpbnB1dCBzcGVjaWFsIHZhcmlhYmxlIGNhbiBiZSB1c2VkIGluIHRoZSBjc3ZhcmluIHR5cGVtYXAgd2hlcmUgaXQgaXMgYWx3YXlzCiAgICAgICAgICAgIGV4cGFuZGVkIHRvICd2YWx1ZScuCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBidWcgcmVwb3J0ZWQgYnkgR2xlbm4gQSBXYXRzb24gYW5kICMxNzk1MjYwIHdoZXJlIHRoZSBjc3R5cGUgdHlwZW1hcCB1c2VkIHRoZSAncmVmJwogICAgICAgICAgICBrZXl3b3JkIGluIHRoZSB0eXBlbWFwIGJvZHksIGl0IHByb2R1Y2VkIHVuY29tcGlsYWJsZSBDIyBwcm9wZXJ0aWVzICh2YXJpYWJsZSB3cmFwcGVycykuCiAgICAgICAgICAgIFRoZSB0eXBlIGZvciB0aGUgcHJvcGVydHkgbm93IGNvcnJlY3RseSBjb21lcyBmcm9tIHRoZSAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGNzdHlwZSB0eXBlbWFwLgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBjb25zdCBzdGQ6OndzdHJpbmcmIHR5cGVtYXBzCgowOS8xOS8yMDA3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBFbnN1cmUgdGhlIHByZW1hdHVyZSBnYXJiYWdlIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgKHBnY3BwKSBpcyBnZW5lcmF0ZWQKICAgICAgICAgICAgd2hlcmUgYSBwYXJhbWV0ZXIgaXMgcGFzc2VkIGJ5IHBvaW50ZXIgcmVmZXJlbmNlLCBlZyBpbiB0aGUgc3RkOjp2ZWN0b3Igd3JhcHBlcnMuIFRoZSBwZ2NwcAogICAgICAgICAgICBpcyBhbHNvIGdlbmVyYXRlZCBub3cgd2hlbiB1c2VyJ3MgY3VzdG9tIHR5cGVtYXBzIHVzZSBhIHByb3h5IGNsYXNzIGluIHRoZSBqc3R5cGUgdHlwZW1hcAogICAgICAgICAgICBhbmQgYSAnbG9uZycgaW4gdGhlIGp0eXBlIHR5cGVtYXAuCgowOS8xOC8yMDA3OiBvbGx5CgkgICAgW3BocF0gQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBwYXJhbWV0ZXJzIG9mIHR5cGUgc3RkOjpzdHJpbmcgJgoJICAgIHdoaWNoIGFyZSBtb2RpZmllZCBieSB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcHl0aG9uXSBTcGxpdCBwb3RlbnRpYWxseSBsb25nIHN0cmluZyBsaXRlcmFscyB0byBhdm9pZCBoaXR0aW5nCgkgICAgTVNWQydzIGxvdyBmaXhlZCBsaW1pdCBvbiBzdHJpbmcgbGl0ZXJhbCBsZW5ndGggLSBwYXRjaCBmcm9tCgkgICAgU0YjMTcyMzc3MCwgYWxzbyByZXBvcnRlZCBhcyBTRiMxNjMwODU1LgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtvY2FtbF0gRml4IHJlbmFtaW5nIG9mIG92ZXJsb2FkZWQgbWV0aG9kcyBpbiB0aGUgbWV0aG9kX3RhYmxlIC0KCSAgICBteSBwYXRjaCBmcm9tIFNGIzk0MDM5OS4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbcHl0aG9uXSBTaW1wbGVyIGNvZGUgZm9yIFNXSUdfQXNWYWxfYm9vbCgpIHdoaWNoIGZpeGVzIGEgInN0cmljdAoJICAgIGFsaWFzaW5nIiB3YXJuaW5nIGZyb20gR0NDIC0gcGF0Y2ggZnJvbSBTRiMxNzI0NTgxIGJ5IEFuZHJldwoJICAgIEJhdW1hbm4uCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3Blcmw1XSBVc2Ugc3Zfc2V0cHZuKCkgdG8gc2V0IGEgc2NhbGFyIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGgKCSAgICAtIHBhdGNoIGZyb20gU0YjMTc0NDYwIGJ5ICJtYXRzdWJhcmF5Ii4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBXaGVuIHdyYXBwaW5nIEMrKyBjb2RlLCBnZW5lcmF0ZSBjb2RlIHdoaWNoIHVzZXMKCSAgICBzdGQ6OnN0cmluZzo6YXNzaWduKFBUUiwgTEVOKSByYXRoZXIgdGhhbiBhc3NpZ25pbmcKCSAgICBzdGQ6OnN0cmluZyhQVFIsIExFTikuICBVc2luZyBhc3NpZ24gZ2VuZXJhdGVzIG1vcmUgZWZmaWNpZW50IGNvZGUKCSAgICAodGVzdGVkIHdpdGggR0NDIDQuMS4yKS4KCjA5LzA3LzIwMDc6IHdzZnVsdG9uCgkgICAgRml4ICVpZ25vcmUgb24gY29uc3RydWN0b3JzIHdoaWNoIGFyZSBub3QgZXhwbGljaXRseSBkZWNsYXJlZCBbU0YgIzE3Nzc3MTJdCgowOS8wNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICAtIENoYW5nZSByX2x0eXBlIGluIHR5cGVzeXMuYyB0byBzdG9yZSBhIGhhc2h0YWJsZSBpbnN0ZWFkIG9mIGEgc2luZ2xlIHZhbHVlLgoJICAgICAgc2V2ZXJhbCB2ZXJ5IHN1YnRsZSBidWdzIHdlcmUgYmVpbmcgY2F1c2VkIGJ5IG11bHRpcGxlIGx0eXBlcyBiZWluZyBtYXBwZWQKCSAgICAgIHRvIGEgc2luZ2xlIG1hbmdsZWQgdHlwZSwgbW9zdGx5IHdoZW4gdXNpbmcgdHlwZWRlZmVkIHRlbXBsYXRlIHBhcmFtZXRlcnMuCgkgICAgICBOb3csIHJfbHR5cGUgc3RvcmVzIGEgaGFzaHRhYmxlIG9mIHBvc3NpYmxlIGx0eXBlcywgYW5kIHdoZW4gZ2VuZXJhdGluZyB0aGUKCSAgICAgIHR5cGUgdGFibGUsIGFsbCB0aGUgbHR5cGVzIGFyZSBhZGRlZCBpbnRvIHRoZSBzd2lnX3R5cGVfaW5mbyBzdHJ1Y3R1cmUuCgowOC8zMS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBTRiAjMTc1NDk2NyBmcm9tIEphbWVzIEJpZ2xlci4KICAgICAgICAgICAgLSBGaXggYnVnIGluIHR1cm5pbmcgb24gd2FybmluZ3MgdGhhdCB3ZXJlIHR1cm5lZCBvZmYgYnkgZGVmYXVsdC4gRWcgJ3N3aWcgLXcrMzA5JyB3aWxsIG5vdwogICAgICAgICAgICAgIHR1cm4gb24gdGhlIG5vcm1hbGx5IHN1cHByZXNzZWQgd2FybmluZyAzMDkuCgogICAgICAgICAgICAtIE5ldyAtV2V4dHJhIGNvbW1hbmRsaW5lIG9wdGlvbiB3aGljaCBlbmFibGVzIHRoZSBleHRyYSB3YXJuaW5nIG51bWJlcnM6CiAgICAgICAgICAgICAgMjAyLDMwOSw0MDMsNTEyLDMyMSwzMjIgKHRoaXMgaXMgdGhlIGxpc3Qgb2Ygd2FybmluZ3MgdGhhdCBoYXZlIGFsd2F5cyBiZWVuIHN1cHByZXNzZWQgYnkKICAgICAgICAgICAgICBkZWZhdWx0KS4gQnkgc3BlY2lmeWluZyAtV2V4dHJhLCBhbGwgd2FybmluZ3Mgd2lsbCBiZSB0dXJuZWQgb24sIGJ1dCB1bmxpa2UgLVdhbGwsCiAgICAgICAgICAgICAgd2FybmluZ3MgY2FuIHN0aWxsIGJlIHNlbGVjdGl2ZWx5IHR1cm5lZCBvbi9vZmYgdXNpbmcgJXdhcm5maWx0ZXIsCiAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2FybiBvciBmdXJ0aGVyIC13IGNvbW1hbmRsaW5lIG9wdGlvbnMsIGVnOgogICAgICAgICAgICAgICAgc3dpZyAtV2V4dHJhIC13MzA5CiAgICAgICAgICAgICAgd2lsbCB0dXJuIG9uIGFsbCB3YXJuaW5ncyBleGNlcHQgMzA5LgoKMDgvMjgvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgLSBOZXcgZGVidWdnaW5nIG9wdGlvbnMsIC1kZWJ1Zy1tb2R1bGUgPG4+IGFuZCAtZGVidWctdG9wIDxuPiB0byBkaXNwbGF5IHRoZSBwYXJzZSB0cmVlIGF0CiAgICAgICAgICAgICAgdmFyaW91cyBzdGFnZXMsIHdoZXJlIDxuPiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIHN0YWdlcyAxLTQuRm9yIGV4YW1wbGUsIHRvCiAgICAgICAgICAgICAgZGlzcGxheSB0b3Agb2YgcGFyc2UgdHJlZSBhdCBzdGFnZXMgMSBhbmQgMzoKICAgICAgICAgICAgICAgIHN3aWcgLWRlYnVnLXRvcCAxLDMKCiAgICAgICAgICAgIC0gRGVwcmVjYXRlIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3aGljaCBoYXZlIGVxdWl2YWxlbnRzIGJlbG93OgogICAgICAgICAgICAgIC1kdW1wX3BhcnNlX21vZHVsZSAgICA9PiAgIC1kZWJ1Zy1tb2R1bGUgMQogICAgICAgICAgICAgIC1kdW1wX21vZHVsZSAgICAgICAgICA9PiAgIC1kZWJ1Zy1tb2R1bGUgNAogICAgICAgICAgICAgIC1kdW1wX3BhcnNlX3RvcCAgICAgICA9PiAgIC1kZWJ1Zy10b3AgMQogICAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAgICAgICA9PiAgIC1kZWJ1Zy10b3AgNAoKICAgICAgICAgICAgLSBSZW5hbWVkIHNvbWUgY29tbWFuZGxpbmUgb3B0aW9ucyBmb3IgbmFtaW5nIGNvbnNpc3RlbmN5IGFjcm9zcyBhbGwgb3B0aW9uczoKICAgICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgID0+ICAgLWRlYnVnLXRlbXBsYXRlCiAgICAgICAgICAgICAgLWRlYnVnX3R5cGVtYXAgICA9PiAgIC1kZWJ1Zy10eXBlbWFwCiAgICAgICAgICAgICAgLWR1bXBfY2xhc3NlcyAgICA9PiAgIC1kZWJ1Zy1jbGFzc2VzCiAgICAgICAgICAgICAgLWR1bXBfdGFncyAgICAgICA9PiAgIC1kZWJ1Zy10YWdzCiAgICAgICAgICAgICAgLWR1bXBfdHlwZWRlZiAgICA9PiAgIC1kZWJ1Zy10eXBlZGVmCiAgICAgICAgICAgICAgLWR1bXBfbWVtb3J5ICAgICA9PiAgIC1kZWJ1Zy1tZW1vcnkKCjA4LzI1LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhhbmRsaW5nIG9mIGRvdWJsZSBvciBmbG9hdCBwYXJhbWV0ZXJzIHdpdGggYW4gaW50ZWdlcgoJICAgIGRlZmF1bHQgdmFsdWUuCgowOC8yNS8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEdlbmVyYXRlIF9faXNzZXQoKSBtZXRob2RzIGZvciBzZXR0ZXJzIGZvciBQSFAgNS4xIGFuZCBsYXRlci4KCjA4LzIwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBGaXggZGlyZWN0b3IgYnVnICMxNzc2NjUxIHJlcG9ydGVkIGJ5IFN0ZXBoYW5lIFJvdXRlbG91cyB3aGljaCBvY2N1cnJlZCB3aGVuCiAgICAgICAgICAgIHRoZSBkaXJlY3RvciBjbGFzcyBuYW1lIGlzIHRoZSBzYW1lIGFzIHRoZSBzdGFydCBvZiBzb21lIG90aGVyIHN5bWJvbHMgdXNlZCB3aXRoaW4KICAgICAgICAgICAgdGhlIGRpcmVjdG9yIGNsYXNzLgoKMDgvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgQ29ycmVjdCBiZWhhdmlvdXIgZm9yIHRlbXBsYXRlZCBtZXRob2RzIHVzZWQgd2l0aCAlcmVuYW1lIG9yICVpZ25vcmUgYW5kIHRoZSBlbXB0eQogICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbiAtICV0ZW1wbGF0ZSgpLiBBIHdhcm5pbmcgaXMgaXNzdWVkIGlmIHRoZSBtZXRob2QgaGFzIG5vdCBiZWVuCiAgICAgICAgICAgIHJlbmFtZWQuCgowOC8xNi8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0gTmFtZSBnZW5lcmF0ZWQgY2wgZmlsZSBiYXNlZCBvbiBpbnB1dCBmaWxlIHJhdGhlciB0aGFuIGJ5CgkgICAgbW9kdWxlIG5hbWUuIEl0IHdhcyBwb3NzaWJsZSB0byBlbmQgdXAgd2l0aCBhIG15cGFja2FnZS5jbCBhbmQgYSB0ZXN0X3dyYXAuYwoJICAgIHdoZW4gcGFyc2luZyBhIHRlc3QuaSBpbnB1dCBmaWxlLiBDb25mdXNpbmcuIEFsc28sIGluY2x1ZGUgZXh0ZXJuYWwtZm9ybWF0CgkgICAgdGVtcGxhdGVzIGZvciA6ZmF0IGFuZCA6ZmF0LWxlIGF1dG9tYXRpY2FsbHkgdG8gYXZvaWQgdGhlc2UgYmVpbmcgY29tcGlsZWQKCSAgICBhdCBydW50aW1lLgoKMDgvMTUvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtjZmZpXSBBcHBseSBwYXRjaCAjMTc2NjA3NiBmcm9tIExlaWdoIFNtaXRoIGFkZGluZyBzdXBwb3J0IGZvciBuZXdseSBpbnRyb2R1Y2VkCiAgICAgICAgICAgIGluIGNmZmkgOmxvbmctbG9uZyBhbmQgOnVuc2lnbmVkLWxvbmctbG9uZy4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgZG9jdW1lbnRhdGlvbiBwYXRjaCAjMTc0MzU3MyBmcm9tIEplZmZyZXkgU29yZW5zZW4uIEl0IGNvbnRhaW5zIGEgbmVhdAogICAgICAgICAgICBpZGVhIHdpdGggcmVzcGVjdCB0byBiZXR0ZXIgbWVtb3J5IG1hbmFnZW1lbnQgYnkgdGhlIEpWTSBvZiBDKysgYWxsb2NhdGVkIG1lbW9yeS4KCjA4LzEwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBseSBwYXRjaCAjMTc3MTQxMCBmcm9tIFdhZGUgQnJhaW5lcmQgdG8gZml4IHR5cGVkZWYgWFMoU3dpZ1BlcmxXcmFwcGVyKSBpbgogICAgICAgICAgICBwZXJscnVuLnN3ZyBmb3IgQWN0aXZlU3RhdGUgUGVybCBidWlsZCA4MjIgYW5kIFBlcmwgNS44LjkgYW5kIDUuMTAgYnJhbmNoZXMuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBjb25zdCBlbnVtIHJlZmVyZW5jZSB0eXBlbWFwcyBmaXhlZC4KCjA4LzA5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgbWlzc2luZyBzdXBwb3J0IGZvciBDKysgY2xhc3MgbWVtYmVyIHBvaW50ZXJzLgoKMDgvMDkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBZGQgc3VwcG9ydCBmb3IgJG93bmVyIGluIHRoZSAib3V0IiB0eXBlbWFwcyBsaWtlIGluIHRoZSBzY3JpcHRpbmcKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gTm90ZSB0aGF0ICRvd25lciBoYXMgYWx3YXlzIGJlZW4gc3VwcG9ydGVkIGluIHRoZSAiamF2YW91dCIgLyAiY3NvdXQiCiAgICAgICAgICAgIHR5cGVtYXBzLgoKMDgvMDEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNtYXJ0IHBvaW50ZXIgaGFuZGxpbmcgZm9yIGNsYXNzZXMgdGhhdCBoYXZlIHRlbXBsYXRlZCBtZXRob2RzIHdpdGhpbiB0aGUgc21hcnQKICAgICAgICAgICAgcG9pbnRlciB0eXBlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IGNyYWlnZG8gYXQgZWUud2FzaGluZ3Rvbi5lZHUuCgowNy8zMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW2NmZmldIGZpeGVkIG1lbW9yeSBhY2Nlc3MgYWZ0ZXIgYmVpbmcgZnJlZWQgYnVnLiB0aGFua3MgdG8gTWFydGluIFBlcmNvc3NpLgogICAgICAgICAgICBwYWNrYWdlIG5hbWUgY2xvcyBjaGFuZ2VkIHRvIGNsLiB0aGFua3MgdG8gUmFsZiBNYXR0ZXMKCjA3LzI0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhcmFsbGVsIG1ha2Ugc3VwcG9ydCBhZGRlZCBmb3IgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlIGZvciBkZXZlbG9wZXJzIHdobyBoYXZlCiAgICAgICAgICAgIG1vcmUgdGhhbiBvbmUgQ1BVLiBOb3cgcGFyYWxsZWwgbWFrZSBjYW4gYmUgdXNlZCBmb3IgY2hlY2tpbmcgaW4gYWRkaXRpb24gdG8gYnVpbGRpbmcKICAgICAgICAgICAgdGhlIFNXSUcgZXhlY3V0YWJsZS4gU29tZSB0eXBpY2FsIGNoZWNraW5nIGV4YW1wbGVzOgoKICAgICAgICAgICAgICBtYWtlIC1qOCAtayBjaGVjawogICAgICAgICAgICAgIG1ha2UgLWo0IGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgLWoyIGNoZWNrLWphdmEtZXhhbXBsZXMKCjA3LzE5LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIEZpeGVkIGJ1ZyB0aGF0IHN0b3BwZWQgY29uZmlndXJlIHdvcmtpbmcgb24gbWluZ3cgKGFwcGxpZWQgZG9zMnVuaXggdG8gY29uZmlndXJlLmluKQoKMDcvMTAvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gRXh0cmEgY29tcGF0aWJpbGl0eSB3aXRoIEx1YSA1LjEgKHVwZGF0ZWQgU1dJR19pbml0LCBkb2NzLCBleGFtcGxlcywgdGVzdCBzdWl0ZSkKCSAgICBSZW1vdmVkIG5hbWUgY2xhc2ggZm9yIHN0YXRpYyBsaW5rIG9mIG11bHRpcGxlIG1vZHVsZXMKCjA3LzA1LzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEZpeCBhIGJ1ZyBpbiBTV0lHX0FMTE9DX0FSUkFZKCkKICAgICAgICAgICAgaW1wcm92ZWQgdGhlIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvcnJlY3QgYXJndW1lbnRzLgogICAgICAgICAgICBDaGFuZ2VkIHRoZSBvdXRwdXQgb2Ygc3dpZ190eXBlKCkgdG8gdXNlIHRoZSBodW1hbiByZWFkYWJsZSBmb3JtIG9mIHRoZSB0eXBlLAoJICAgIHJhdGhlciB0aGFuIHRoZSByYXcgc3dpZyB0eXBlLgoKMDcvMDMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3JzIGZvciBzb21lIG92ZXJsb2FkZWQgbWV0aG9kcyB3aGVyZSB0aGUgaW10eXBlIHJlc3VsdGVkIGluIGlkZW50aWNhbAogICAgICAgICAgICBtZXRob2RzIGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgQyMgZGlyZWN0b3IgY2xhc3MsIGVnIHZvaWQgZm9vKGludCAqKSBhbmQgdm9pZCBmb28oZG91YmxlICopCiAgICAgICAgICAgIHVzZWQgdG8gZ2VuZXJhdGVkIHR3byBvZiB0aGVzZToKCiAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIFN3aWdEaXJlY3RvcmZvbyhJbnRQdHIgcCkgeyAuLi4gfQoKMDYvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIHBhcmFtZXRlciBuYW1lIGNoYW5nZXMgaW4gc3RkX3ZlY3Rvci5pIGFsbG93aW5nIGJldHRlciB0YXJnZXRpbmcKICAgICAgICAgICAgb2YgdHlwZW1hcHMgZm9yIG1ldGhvZCBwYXJhbWV0ZXJzIChmb3IgbWVtb3J5IG1hbmFnZW1lbnQgb2YgY29udGFpbmVycyBvZiBwb2ludGVycykuCgowNi8wNy8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggZm9yZWlnbi10eXBlIGNvbnN0cnVjdG9yIHRvIHByb3Blcmx5IGxvb2sgZm9yIGZmaXR5cGUgdHlwZW1hcAoJICAgIGJpbmRpbmdzLiBmaXggaW5vdXRfdHlwZW1hcHMuaSBmb3Igc3RyaW5ncy4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUnVieV0KCSAgICBVc2Ugd2hpY2hldmVyIG9mICJsb25nIiBvciAibG9uZyBsb25nIiBpcyB0aGUgc2FtZSBzaXplIGFzICJ2b2lkKiIKCSAgICB0byBob2xkIHBvaW50ZXJzIGFzIGludGVnZXJzLCByYXRoZXIgdGhhbiB3aGljaGV2ZXIgbWF0Y2hlcyBvZmZfdC4KCSAgICBGaXhlcyBjb21waWxhdGlvbiBvbiBPUyBYIGFuZCBHQ0Mgd2FybmluZ3Mgb24gcGxhdGZvcm1zIHdoZXJlCgkgICAgc2l6ZW9mKHZvaWQqKSA8IHNpemVvZihvZmZfdCkgKFNGIHBhdGNoICMxNzMxOTc5KS4KCjA2LzA2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggaGFuZGxpbmcgb2YgYSBwYXJ0aWN1bGFyIGNhc2UgaW52b2x2aW5nIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgd2l0aCBkZWZhdWx0IHBhcmFtZXRlcnMuCgowNi8wNS8yMDA3OiBtdXRhbmRpeiAoTWlrZWwgQmFuY3JvZnQpCgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggY2FzZSB3aGVyZSB3ZSdkIHBhc3MgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXJzCgkgICAgKGkuZS4gTlMxOjpOUzI6OkZPTykgdG8gc3dpZy1pbnNlcnQtaWQuIEFsbCBuYW1lc3BhY2VzCgkgICAgc2hvdWxkIGJlIHN0cmlwcGVkLgoKCSAgICBGaXggYnVnIGluIFR5cGVkZWZIYW5kbGVyIGludHJvZHVjZWQgYnkgbGFzdCBmaXguCgowNi8wNS8yMDA3OiBvbGx5CgkgICAgRml4IHJlcG9ydGluZyBvZiBmaWxlbmFtZXMgaW4gZXJyb3JzIGFmdGVyICVpbmNsdWRlIChwYXRjaCBmcm9tCgkgICAgTGVpZ2ggU21pdGggaW4gIzE3MzEwNDA7IGFsc28gcmVwb3J0ZWQgYXMgIzE2OTk5NDApLgoKMDUvMzEvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4ICJtaXNzaW5nIGluaXRpYWxpc2VyIiB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCBDL0MrKwoJICAgIHdyYXBwZXIgY29kZSB3aXRoIFB5dGhvbiAyLjUgd2l0aCB3YXJuaW5ncyBlbmFibGVkIChwYXRjaCBmcm9tCgkgICAgYnVnIzE3Mjc2NjggZnJvbSBMdWtlIE1vb3JlKS4KCjA1LzI5LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIFNwbGl0IGRvY3N0cmluZ3MgaW50byBzZXBhcmF0ZSBzdHJpbmcgbGl0ZXJhbHMgYXQgZWFjaCBuZXdsaW5lIHdoZW4KCSAgICBnZW5lcmF0aW5nIEMvQysrIHdyYXBwZXIgY29kZSAodGhlIEMvQysrIGNvbXBpbGVyIHdpbGwganVzdCBjb21iaW5lCgkgICAgdGhlbSBiYWNrIGludG8gYSBzaW5nbGUgc3RyaW5nIGxpdGVyYWwpLiAgVGhpcyBhdm9pZHMgTVNWQwoJICAgIGNvbXBsYWluaW5nIHRoYXQgdGhlIHN0cmluZ3MgYXJlIHRvbyBsb25nIChwcm9ibGVtIHJlcG9ydGVkIGJ5CgkgICAgQm8gUGVuZyBvbiB0aGUgbWFpbGluZyBsaXN0KS4KCjA1LzI4LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEVzY2FwZSBiYWNrc2xhc2hlcyBpbiBkb2NzdHJpbmdzLgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgRml4IGF1dG9kb2MgZ2VuZXJhdGlvbiBvZiBlbnVtcyB0byBiZSBtb3JlIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlCgkgICAgZW51bXMgYXJlIHdyYXBwZWQgLSBwYXRjaCAjMTY5NzIyNiBmcm9tIEpvc2ggQ2hlcnJ5LgoKMDUvMjYvMjAwNzogb2xseQoJICAgIFtQSFA1XQoJICAgIEZpeCB3cmFwcGluZyBvZiBtZXRob2RzIGFuZCBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIGEgcG9pbnRlciB0byBhCgkgICAgY2xhc3MgKGJ1ZyMxNzAwNzg4KSBhbmQgdGhvc2Ugd2hpY2ggaGF2ZSBvdmVybG9hZGVkIGZvcm1zIHJldHVybmluZwoJICAgIGJvdGggY2xhc3NlcyBhbmQgbm9uLWNsYXNzZXMgKGJ1ZyMxNzEyNzE3LCB0aGFua3MgdG8gU2ltb24KCSAgICBCZXJ0aGlhdW1lIGZvciB0aGUgcGF0Y2gpLgoKMDUvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXJlbmFtZSBpbmNvbnNpc3RlbmN5IGluIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFzIHJlcG9ydGVkIGJ5IFpob25nIFJlbi4gVGhlIG1hdGNoaW5nCiAgICAgICAgICAgIGlzIG5vdyBkb25lIG9uIHRoZSBvcGVyYXRvciBuYW1lIGluIHRoZSBzYW1lIHdheSBhcyBpdCBpcyBkb25lIGZvciBwYXJhbWV0ZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShvcEFCQykgU3BhY2U6OkFCQzo6b3BlcmF0b3IgQUJDKCkgY29uc3Q7CiAgICAgICAgICAgICAgJXJlbmFtZShtZXRob2RBQkMpIFNwYWNlOjpBQkM6Om1ldGhvZChBQkMgYSkgY29uc3Q7CiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIGNsYXNzIEFCQyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZChBQkMgYSkgY29uc3Qge30KICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBBQkMoKSBjb25zdCB7IEFCQyBhOyByZXR1cm4gYTsgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlIHRoYXQgcXVhbGlmeWluZyB0aGUgY29udmVyc2lvbiBvcGVyYXRvciBwcmV2aW91c2x5IG1heSBvciBtYXkgbm90IGhhdmUgbWF0Y2hlZC4KICAgICAgICAgICAgTm93IGl0IGRlZmluaXRlbHkgd29uJ3QsIHNvIHRoaXMgd2lsbCBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIFNwYWNlOjpBQkMoKSBjb25zdDsKCiAgICAgICAgICAgIGluIHRoZSBzYW1lIHdheSB0aGF0IHRoaXMgZG9lcyBub3QgbWF0Y2g6CgogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoU3BhY2U6OkFCQyBhKSBjb25zdDsKCiAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGltcHJvdmVkIHdpdGggcmVzcGVjdCB0byAlcmVuYW1lLCBuYW1lc3BhY2VzIGFuZCB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIENvbnZlcnNpb24gb3BlcmF0b3JzIGRvY3VtZW50YXRpb24gdG9vLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNS8xNi8yMDA3OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJhZCBnZW5lcmF0aW9uIG9mIGxvY2FsIHZhciBsdHlwZSdzIGluIGZ1bmN0aW9uV3JhcHBlcigpLgoJICAgIFRyeSB0byB3b3JrIGJldHRlciB3aXRoIHRoZSBiYWNrd2FyZCBvcmRlciBpbiB3aGljaCBzd2lnCgkgICAgdW5yb2xscyBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMuCgkgICAgY2xlYW5lZCB1cCBhIGxpdHRsZSB1bm5lY2Vzc2FyeSBjb2RlL2RlYnVnIHByaW50ZidzLgoJICAgIFJlbW92ZSB3YXJuaW5nIHdoZW4gcmVwbGFjaW5nICRsZGVzdHJ1Y3RvciBmb3IgZmY6Zm9yZWlnbi1wb2ludGVyCgowNS8xMi8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBzd2lnIC1weXRob24gLXRocmVhZHMgbm93IGdlbmVyYXRlcyBDL0MrKyBjb2RlIHdoaWNoIHVzZXMgUHl0aG9uJ3MKCSAgICBvd24gdGhyZWFkaW5nIGFic3RyYWN0aW9uIChmcm9tIHB5dGhyZWFkLmgpIHJhdGhlciB0aGFuIE9TIHNwZWNpZmljCgkgICAgY29kZS4gIFRoZSBvbGQgY29kZSBmYWlsZWQgdG8gY29tcGlsZSBvbiBNUyBXaW5kb3dzLiAgKFNlZSBTRiBwYXRjaAoJICAgIHRyYWNrZXIgIzE3MTAzNDEpLgoKMDUvMDQvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBTVEwgcmVuYW1lcyB0byBiZSBnbG9iYWwgcmVuYW1lcy4gIFRoaXMgZml4ZXMKCSAgICBTVEwgZnVuY3Rpb25zIG5vdCBiZWluZyByZW5hbWVkIHdoZW4gYXV0b3JlbmFtZSBpcyBvbi4KICAgICAgICAgICAgVGhpcyBpcyBhIG5vdCBhIHRvdGFsbHkgcGVyZmVjdCB3b3JrLWFyb3VuZCwgYnV0IGJldHRlci4KCSAgICBTb21lb25lIHJlYWxseSBuZWVkcyB0byBmaXggdGhlIHRlbXBsYXRlIHJlbmFtaW5nIGNvZGUuCgkgICAgKFNlZSBidWcgIzE1NDU2MzQpCgowNS8wNC8yMDA3ICBnZ2EKCSAgICBbQWxsXQogICAgICAgICAgICBDaGFuZ2VkICVyZW5hbWUoIiUodW5kZXJjYXNlKXMiKSBhIGxpdHRsZSBzbyB0aGF0IHNpbmdsZQoJICAgIG51bWJlcnMgYXQgdGhlIGVuZCBvZiBhIGZ1bmN0aW9uIGFyZSBub3QgdW5kZXJjYXNlZC4gIFRoYXQgaXM6CgkJZ2V0U29tZXRoaW5nIC0+IGdldF9zb21ldGhpbmcKCQlnZXQyRAkgICAgIC0+IGdldF8yZAoJCWdldDIzNAkgICAgIC0+IGdldF8yMzQKCSAgICBCVVQ6CgkJYXNGbG9hdDIgICAgIC0+IGFzX2Zsb2F0MgoJICAgIChCdWcgIzE2OTk3MTQpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIF9fc3dpZ3R5cGVfXyA9PiBAX19zd2lndHlwZV9fIHNvIGl0IGNhbiBiZSBhY2Nlc3NlZAoJICAgIGZyb20gdGhlIHNjcmlwdGluZyBsYW5ndWFnZSAoYW5kIGZvbGxvd3MgUnVieSdzIG9mZmljaWFsCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24sIGp1c3QgaW4gY2FzZSkuCgkgICAgTWFkZSB0cmFja2luZyA9PiBAX190cmFja2luZ3NfXyBmb3Igc2FtZSByZWFzb24uCgkgICAgQ3VycmVudGx5IHN0b3JpbmcgaXZhcnMgd2l0aG91dCB0aGUgQCBzZWVtcyB2YWxpZCwgYnV0CgkgICAgdGhlIFBpY2tBeGUgc2F5cyB0aGlzIGlzIG5vdCBjb3JyZWN0LCBzbyBqdXN0IGluIGNhc2UuLi4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEFwcGxpZWQgcGF0Y2ggZm9yIC1taW5oZXJpdCBidWcgYW5kIGV4Y2VwdGlvbiBjbGFzc2VzLgoJICAgIFRoaXMgaXNzdWUgc2hvdWxkIGJlIHJldmlzaXRlZCBtb3JlIGNsb3NlbHksIGFzIE11bHRpcGxlCgkgICAgSW5oZXJpdGFuY2UgaW4gUnVieSBpcyBzdGlsbCBwcm9ibGVtYXRpYy4KCSAgICAocGF0Y2gvYnVnICMxNjA0ODc4KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMgaW4gcnVieSB3aWxsIG5vdyByZXBvcnQgdG8gdGhlIHVzZXIKICAgICAgICAgICAgdGhlIHBvc3NpYmxlIHByb3RvdHlwZXMgd2hlbiB0aGUgdXNlciBtaXN0eXBlcyB0aGUgbnVtYmVyIG9yCiAgICAgICAgICAgIHR5cGUgb2YgYSBwYXJhbWV0ZXIuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGb3Jnb3QgdG8gZG9jdW1lbnQgdGhlIGJ1ZyBmaXhpbmcgb2YgYW4gb2xkIGJ1ZyByZWdhcmRpbmcKCSAgICBleGNlcHRpb25zLgoJICAgIChidWcgIzE0NTgyNDcpCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBSdWJ5IGRvY3VtZW50YXRpb24gdG8gdXNlIHRoZSBwcm9wZXIgY3NzIHN0eWxlcyBmb3IKCSAgICBlYWNoIHNlY3Rpb24uIEFkZGVkIGF1dG9kb2Mgc2VjdGlvbiB0byBSdWJ5J3MgZG9jcyB0bwoJICAgIGRvY3VtZW50IHRoZSBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgUnVieSBpbiBkb2N1bWVudGluZyBpdHMgbW9kdWxlcy4KCSAgICBNYWRlIHJkb2MgZG9jdW1lbnRhdGlvbiBzcGl0IG91dCB0aGUgZnVsbCBuYW1lIG9mIHRoZSBjbGFzcyArCgkgICAgbWV0aG9kIG5hbWUuICBBbGJlaXQgdGhpcyB3aWxsIG1ha2UgdGhlIGN1cnJlbnQgcmRvYyBub3QgcmVjb2duaXplCiAgICAgICAgICAgIHRoZSBtZXRob2QsIHRoaXMgaXMgc3RpbGwgbmVlZGVkIHRvIGRpc2FtYmlndWF0ZSBiZXR3ZWVuIGRpZmZlcmVudAogICAgICAgICAgICBjbGFzc2VzIHdpdGggc2ltaWxhciBtZXRob2RzIChyZG9jIHdhcyBjcmVhdGVkIHRvIGRvY3VtZW50IHRoZQoJICAgIHJ1Ynkgc291cmNlIHdoaWNoIG9ubHkgY29udGFpbnMgb25lIGNsYXNzIHBlciBjIGZpbGUsIHVubGlrZSBzd2lnKQogICAgICAgICAgICBJIGhhdmUgcGF0Y2hlZCByZG9jIHRvIG1ha2UgaXQgbW9yZSBmcmllbmRseSB0byBzd2lnLiAgVGhpcwogICAgICAgICAgICBwYXRjaCBuZWVkcyB0byBiZSBtZXJnZWQgaW4gdGhlIHJ1Ynkgc3RkIGxpYnJhcnkgbm93LgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCBmbGFnIC1mZWF0dXJlIHRvIGJlIC1pbml0X25hbWUgdG8gYmV0dGVyIHJlZmxlY3QgaXRzCgkgICAgcHVycG9zZSBhbmQgYXZvaWQgY29uZnVzaW9uIHdpdGggLWZlYXR1cmVzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgYXV0b2RvYyBnZW5lcmF0aW9uLgoJICAgIEFkZGVkIGF1dG9kb2MgLnN3ZyBmaWxlcyB0byBSdWJ5IGxpYnJhcnkgZm9yIGVhc2lseSBhZGRpbmcKCSAgICBkb2N1bWVudGF0aW9uIHRvIGNvbW1vbiBSdWJ5IG1ldGhvZHMgYW5kIFNUTCBtZXRob2RzLgoJICAgIEZpeGVkIGF1dG9kb2MgZG9jdW1lbnRpbmcgb2YgZ2V0dGVycyBhbmQgc2V0dGVycyBhbmQgbW9kdWxlLgoJICAgIE1hZGUgdGVzdCBzdWl0ZSBhbHdheXMgZ2VuZXJhdGUgYXV0b2RvY3MuCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSZW1vdmVkIHNvbWUgd2FybmluZ3MgZnJvbSBTVEwgYW5kIHRlc3Qgc3VpdGUuCgowNS8wMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBpc3N1ZXMgd2l0aCBDKysgY2xhc3NlcyBhbmQgaGllcmFjaGllcyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBzb3VyY2UgZmlsZXMuIEZpeGVkIGltcG9ydHMgdGVzdCBjYXNlICYgYWRkZWQgcnVuIHRlc3QuCgkgICAgQWRkZWQgRXhhbXBsZXMvaW1wb3J0cy4KCSAgICBBZGRlZCB0eXBlbmFtZSBmb3IgcmF3IGx1YV9TdGF0ZSoKCSAgICBBZGRlZCBkb2N1bWVudGF0aW9uIG9uIG5hdGl2ZSBmdW5jdGlvbnMuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBEb2NzdHJpbmdzIGFyZSBub3cgc3VwcG9ydGVkLgoJICAgICVmZWF0dXJlKCJhdXRvZG9jIikgYW5kICVmZWF0dXJlKCJkb2NzdHJpbmciKSBhcmUgbm93CgkgICAgcHJvcGVybHkgc3VwcG9ydGVkIGluIFJ1YnkuICBUaGVzZSBmZWF0dXJlcyB3aWxsIGdlbmVyYXRlCgkgICAgYSBfd3JhcC5jeHggZmlsZSB3aXRoIHJkb2MgY29tbWVudHMgaW4gdGhlbS4KCjA1LzAyLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFNUTCBmaWxlcyBoYXZlIGJlZW4gdXBncmFkZWQgdG8gZm9sbG93IHRoZSBuZXcgc3dpZy9weXRob24KCSAgICBMaWIvc3RkIGNvbnZlbnRpb25zLgoJICAgIFRoaXMgbWVhbnMgc3RkOjp2ZWN0b3IsIHN0ZDo6c2V0LCBzdGQ6Om1hcCwgc2V0OjptdWx0aW1hcCwKCSAgICBzdGQ6Om11bHRpc2V0LCBzdGQ6OmRlcXVlIGFuZCBzdGQ6OnN0cmluZyBhcmUgbm93IHByb3Blcmx5CgkgICAgc3VwcG9ydGVkLCBpbmNsdWRpbmcgdGhlaXIgaXRlcmF0b3JzLCBzdXBwb3J0IGZvciBjb250YWluaW5nCgkgICAgcnVieSBvYmplY3RzIChzd2lnOjpHQ19WQUxVRSkgYW5kIHNldmVyYWwgb3RoZXIgcnVieQoJICAgIGVuaGFuY2VtZW50cy4KCSAgICBzdGQ6OmNvbXBsZXgsIHN0ZDo6aW9zLCBzdGQ6Omlvc3RyZWFtLCBzdGQ6Omlvc3RyZWFtYnVmIGFuZAoJICAgIHN0ZDo6c3N0cmVhbSBhcmUgbm93IGFsc28gc3VwcG9ydGVkLgoJICAgIHN0ZDo6d3N0cmluZywgc3RkOjp3aW9zLCBzdGQ6Ondpb3N0cmVhbSwgc3RkOjp3aW9zdHJlYW1idWYKCSAgICBhbmQgc3RkOjp3c3N0cmVhbSBhcmUgc3VwcG9ydGVkIHZlcmJhdGltIHdpdGggbm8gdW5pY29kZQoJICAgIGNvbnZlcnNpb24uCgoJICAgIHN0ZF92ZWN0b3IuaSBub3cgbWltaWNzIHRoZSBiZWhhdmlvciBvZiBSdWJ5IEFycmF5cyBtdWNoIG1vcmUKCSAgICBjbG9zZWx5LCBzdXBwb3J0aW5nIHNsaWNpbmcsIHNoaWZ0aW5nLCB1bnNoaWZ0aW5nLAogICAgICAgICAgICBtdWx0aXBsZSBpbmRleGluZyBhbmQgcHJvcGVyIHJldHVybiB2YWx1ZXMgb24gYXNzaWdubWVudC4KCgkgICAgQ09NUEFUQUJJTElUWSBOT1RFOiB0aGlzIGNoYW5nZXMgdGhlIG9sZGVyIGFwaSBhIGxpdHRsZSBiaXQgaW4KCSAgICB0aGF0IGltcHJvcGVyIGluZGV4aW5nIHdvdWxkIHByZXZpb3VzbHkgKGluY29ycmVjdGx5KSByYWlzZQoJICAgIGV4Y2VwdGlvbnMuICBOb3csIG5pbCBpcyByZXR1cm5lZCBpbnN0ZWFkLCBmb2xsb3dpbmcgcnVieSdzCgkgICAgc3RhbmRhcmQgQXJyYXkgYmVoYXZpb3IuCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBDaGFuZ2VkIHRoZSB2YWx1ZSBvZiBTV0lHX1RZUEVDSEVDS19CT09MIHRvIGJlIDEwMDAwIChpZS4gaGlnaGVyCgkgICAgdGhhbiB0aGF0IG9mIGFsbCBpbnRlZ2VycykuCgkgICAgVGhpcyBpcyBiZWNhdXNlIFJ1YnkgYWxsb3dzIHR5cGVjYXN0aW5nCgkgICAgaW50ZWdlcnMgZG93biB0byBib29sZWFucyB3aGljaCBjYW4gbWFrZSBvdmVybG9hZGVkIGZ1bmN0aW9ucyBvbgoJICAgIGJvb2xzIGFuZCBpbnRlZ2VycyB0byBmYWlsLgoJICAgIChidWcjIDE0ODgxNDIpCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBhIHN1YnRsZSBidWcgaW4gbXVsdGlwbGUgYXJnb3V0cyB0aGF0IGNvdWxkIGdldCB0cmlnZ2VyZWQgaWYKCSAgICB0aGUgdXNlciByZXR1cm5lZCB0d28gb3IgbW9yZSBhcmd1bWVudHMgYW5kIHRoZSBmaXJzdCBvbmUgd2FzIGFuCgkgICAgYXJyYXkuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiB0byBkb2N1bWVudCB0aGUgbmV3IGZlYXR1cmVzCiAgICAgICAgICAgIGFkZGVkLCBhZGQgZGlyZWN0b3Jpbi9vdXQvYXJnb3V0IHR5cGVtYXBzLCBldGMuCgowNS8wMS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBZGRlZCAlaW5pdHN0YWNrIGFuZCAlaWdub3Jlc3RhY2sgZGlyZWN0aXZlcyBmb3IgZGlyZWN0b3IKCSAgICBmdW5jdGlvbnMuICBUaGVzZSBhbGxvdyB5b3UgdG8gY29udHJvbCB3aGV0aGVyIGEgZGlyZWN0b3IKCSAgICBmdW5jdGlvbiBzaG91bGQgcmUtaW5pdCB0aGUgUnVieSBzdGFjay4KCSAgICBUaGlzIGlzIHNvbWV0aW1lcyBuZWVkZWQgZm9yIGFuIGVtYmVkZGVkIFJ1Ynkgd2hlcmUgdGhlCgkgICAgZGlyZWN0b3IgbWV0aG9kIGlzIHVzZWQgYXMgYSBDKysgY2FsbGJhY2sgYW5kIG5vdCBjYWxsZWQKICAgICAgICAgICAgYnkgdGhlIHVzZXIgZnJvbSBydWJ5IGNvZGUuCgkgICAgRXhwbGFuYXRpb246CgkgICAgUnVieSdzIEdDIG5lZWRzIHRvIGJlIGF3YXJlIG9mIHRoZSBydW5uaW5nIE9TIHN0YWNrIGluIG9yZGVyIHRvCgkgICAgbWFyayBhbnkgVkFMVUUgKFJ1Ynkgb2JqZWN0cykgaXQgZmluZHMgdGhlcmUgdG8gYXZvaWQgY29sbGVjdGlvbgoJICAgIG9mIHRoZW0uICBUaGlzIGFsbG93cyB0aGUgcnVieSBBUEkgdG8gYmUgdmVyeSBzaW1wbGUgYW5kIGFsbG93cwoJICAgIHlvdSB0byB3cml0ZSBjb2RlIGxpa2UgIlZBTFVFIGEgPSBzdGgiIGFueXdoZXJlIHdpdGhvdXQgbmVlZGluZwoJICAgIHRvIGRvIHRoaW5ncyBsaWtlIHJlZmNvdW50aW5nIGxpa2UgcHl0aG9uLgoJICAgIEJ5IGRlZmF1bHQsIHRoZSBzdGFydCBvZiB0aGUgc3RhY2sgaXMgc2V0IHdoZW4gcnVieV9pbml0KCkgaXMKCSAgICBjYWxsZWQuICAgSWYgcnVieSBpcyBpbml0ZWQgd2l0aGluIG1haW4oKSwgYXMgaXQgdXN1YWxseSBpcyB0aGUKCSAgICBjYXNlIHdpdGggdGhlIG1haW4gcnVieSBleGVjdXRhYmxlLCBydWJ5IHdpbGwgYmUgYWJsZSB0byBjYWxjdWxhdGUKCSAgICBpdHMgc3RhY2sgcHJvcGVybHkuICBIb3dldmVyLCB3aGVuIHRoaXMgaXMgbm90IHBvc3NpYmxlLCBhcyB3aGVuCgkgICAgcnVieSBpcyBlbWJlZGRlZCBhcyBhIHBsdWdpbiB0byBhbiBhcHBsaWNhdGlvbiB3aGVyZSBtYWluIGlzIG5vdAoJICAgIGF2YWlsYWJsZSwgcnVieV9pbml0KCkgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIHdyb25nIHBsYWNlLCBhbmQKCSAgICBydWJ5IHdpbGwgYmUgaW5jb3JyZWN0bHkgdHJhY2tpbmcgdGhlIHN0YWNrIGZyb20gdGhlIGZ1bmN0aW9uCgkgICAgdGhhdCBjYWxsZWQgcnVieV9pbml0KCkgZm9yd2FyZHMgb25seSwgd2hpY2ggY2FuIGxlYWQgdG8KCSAgICBhbGwgc29ydHMgb2Ygd2VpcmQgY3Jhc2hlcyBvciB0byBydWJ5IHRoaW5raW5nIGl0IGhhcyBydW4gb3V0IG9mCgkgICAgc3RhY2sgc3BhY2UgaW5jb3JyZWN0bHkuCgkgICAgVG8gYXZvaWQgdGhpcywgZGlyZWN0b3IgKGNhbGxiYWNrKSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB0YWdnZWQKCSAgICB0byB0cnkgdG8gcmVzZXQgdGhlIHJ1Ynkgc3RhY2ssIHdoaWNoIHdpbGwgc29sdmUgdGhlIGlzc3Vlcy4KCSAgICBOT1RFOiBydWJ5MS44LjYgc3RpbGwgY29udGFpbnMgYSBidWcgaW4gaXQgaW4gdGhhdCBpdHMgZnVuY3Rpb24KCSAgICB0byByZXNldCB0aGUgc3RhY2sgd2lsbCBub3QgYWx3YXlzIGRvIHNvLiAgVGhpcyBidWcgaXMgdHJpZ2dlcmVkCgkgICAgdmVyeSByYXJlbHksIHdoZW4gcnVieSBpcyBjYWxsZWQgZnJvbSB0d28gdmVyeSBkaXN0aW5jdCBwbGFjZXMKCSAgICBpbiBtZW1vcnksIGxpa2UgYSBicmFuY2ggb2YgbWFpbigpIGFuZCBhbm90aGVyIGRzby4gIFRoaXMgYnVnCgkgICAgaGFzIG5vdyBiZWVuIHJlcG9ydGVkIHRvIHJ1YnktY29yZSBhbmQgaXMgcGVuZGluZyBmdXJ0aGVyCgkgICAgaW52ZXN0aWdhdGlvbi4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzMwLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTcwNzU4MiAtIFJlc3RvcmUgYnVpbGRpbmcgZnJvbSByZWFkLW9ubHkgc291cmNlIGRpcmVjdG9yaWVzLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSB3aWxsIG5vdyByZXBvcnQgdGhlIHBhcmFtZXRlciBpbmRleCBwcm9wZXJseSBvbiB0eXBlCgkgICAgZXJyb3JzIGFzIHdlbGwgYXMgdGhlIGNsYXNzIGFuZCB2YWx1ZSBvZiB0aGUgaW5jb3JyZWN0CgkgICAgYXJndW1lbnQgcGFzc2VkLgoJICAgIChmZWF0dXJlIHJlcXVlc3QgIzE2OTk2NzApCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBSdWJ5IG5vIGxvbmdlciBjcmVhdGVzIHRoZSBmcmVlX0NsYXNzIGZ1bmN0aW9uIGlmIHRoZSBjbGFzcwoJICAgIGNvbnRhaW5zIGl0cyBvd24gdXNlciBkZWZpbmVkIGZyZWUgZnVuY3Rpb24gKCVmcmVlZnVuYykuCgkgICAgKGJ1ZyAjMTcwMjg4MikKCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE1hZGUgZGlyZWN0b3JzIHJhaXNlIGEgcnVieSBleGNlcHRpb24gZm9yIGluY29ycmVjdCBhcmdvdXQKCSAgICByZXR1cm5lZCB2YWx1ZXMgaWYgUlVCWV9FTUJFRERFRCBpcyBzZXQsIGluc3RlYWQgb2YgdGhyb3dpbmcKCSAgICBhbiBhY3R1YWwgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCSAgICBUaGlzIHdpbGwgcHJldmVudCBjcmFzaGVzIHdoZW4gcnVieSBpcyBlbWJlZGRlZCBhbmQgdW5hd2FyZQoJICAgIG9mIHRoZSBTd2lnRGlyZWN0b3IgZXhjZXB0aW9uLgoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCB0aGUgbmVlZCBmb3IgLURTV0lHRVhURVJOLgoJICAgIENoYW5nZWQgc3dpZ19ydWJ5X3RyYWNraW5ncyB0byBiZSBhIHN0YXRpYyB2YXJpYWJsZSwgYnV0IGFsc28KCSAgICBiZSBrZXB0IHdpdGhpbiBhIGhpZGRlbiBpbnN0YW5jZSB2YXJpYWJsZSBpbiB0aGUgU1dJRyBtb2R1bGUuCgkgICAgVGhpcyBhbGxvd3MgcHJvcGVybHkgZGVhbGluZyB3aXRoIHRyYWNraW5ncyBhY3Jvc3MgbXVsdGlwbGUKCSAgICBEU09zLCB3aGljaCB3YXMgcHJldmlvdXNseSBicm9rZW4uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgaW1wcm92ZW1lbnQgdG8gcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0gRml4ZWQgR0MgbWVtb3J5IGlzc3VlcyB3aXRoIHRyYWNraW5ncyB0aGF0IGNvdWxkIGxlYWQKCSAgICB0byBzZWdmYXVsdHMgd2hlbiBkZWFsaW5nLCBtYWlubHksIHdpdGggc3RhdGljIHZhcmlhYmxlcy4KCSAgICAoYnVnICMxNzAwNTM1IGFuZCBwYXRjaCAjMTcwMjkwNykKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEZpeGVkIFN0cmluZyBjb252ZXJzaW9uIHVzaW5nIG9sZCBydWJ5MS42IG1hY3Jvcy4gIE5vdwoJICAgIFN0cmluZ1ZhbHVlUHRyKCkgaXMgdXNlZCBpZiBhdmFpbGFibGUuICBUaGlzIHJlbW92ZXMgd2FybmluZ3MKCSAgICB3aGVuIGNvbnZlcnRpbmcgc3RyaW5ncyB3aXRoIFwwIGluIHRoZW0uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCB0aGUgYXJnb3V0IGNvdW50IGluIGRpcmVjdG9ycyBmb3IgUnVieS4gIFByZXZpb3VzbHksCgkgICAgaWdub3JlZCBvciAibnVtaW5wdXRzPTAiIHR5cGVtYXBzIHdvdWxkIGluY29ycmVjdGx5IG5vdCBnZXQKCSAgICBjb3VudGVkIHRvd2FyZHMgdGhlIGFyZ291dCBjb3VudC4KCSAgICAoYnVnL3BhdGNoICMxNTQ1NTg1KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgVXBncmFkZWQgUnVieSBjb252ZXJ0ZXIgdG8gcmVjb2duaXplICJudW1pbnB1dHM9MCIuICBQcmV2aW91c2x5LAoJICAgIG9ubHkgdGhlIG9sZCAiaWdub3JlIiBmbGFnIHdhcyBjaGVja2VkICh3aGljaCB3b3VsZCBjdXJyZW50bHkKCSAgICBzdGlsbCB3b3JrIHByb3Blcmx5LCBidXQgaXMgZGVwcmVjYXRlZCkuCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieSAtIGJ1dCBzaG91bGQgYmUgbWFkZSBnZW5lcmljXQoKCSAgICAlZmVhdHVyZSgibnVtb3V0cHV0cyIsIjAiKSBhZGRlZC4KCgkgICAgVGhpcyBmZWF0dXJlIGFsbG93cyB5b3UgdG8gaWdub3JlIHRoZSBvdXRwdXQgb2YgYSBmdW5jdGlvbiBzbwoJICAgIHRoYXQgaXQgaXMgbm90IGFkZGVkIHRvIGEgbGlzdCBvZiBvdXRwdXQgdmFsdWVzCgkgICAgKCBpZS4gYXJnb3V0cyApLgoJICAgIFRoaXMgc2hvdWxkIGFsc28gYmVjb21lIGEgZmVhdHVyZSBvZiAldHlwZW1hcChkaXJlY3Rvcm91dCkKCSAgICBhcyAibnVtb3V0cHV0cyI9MCwganVzdCBsaWtlICJudW1pbnB1dHMiPTAgZXhpc3RzLgoKCSAgICAlZmVhdHVyZSgiZGlyZWN0b3JzIj0xKQoKCSAgICAlaW5jbHVkZSA8dHlwZW1hcHMuaT4KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgeyBDbGFzczo6bWVtYmVyX2Z1bmN0aW9uMSB9OwoJICAgICV0eXBlbWFwKG91dCkgTVN0YXR1cyB7IC8vIHNvbWUgY29kZSwgbGlrZSBjaGVjayBtc3RhdHVzCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHJhaXNlIGV4Y2VwdGlvbiBpZiB3cm9uZyB9OwoKCSAgICAlaW5saW5lICV7CgkgICAgICB0eXBlZGVmIGludCBNU3RhdHVzOwoJICAgICAgY2xhc3MgQ2xhc3MgewoKCSAgICAgIC8vIG9uZSBhcmd1bWVudCByZXR1cm5lZCwgYnV0IGRpcmVjdG9yIG91dCBjb2RlIGFkZGVkCgkgICAgICAvLyBNU3RhdHVzIGlzIGRpc2NhcmRlZCBhcyBhIHJldHVybiAob3V0KSBwYXJhbWV0ZXIuCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMSggaW50JiBPVVRQVVQgKTsKCgkgICAgICAvLyB0d28gYXJndW1lbnRzIHJldHVybmVkLCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBub3QgZGlzY2FyZGVkCgkgICAgICB2aXJ0dWFsIE1TdGF0dXMgbWVtYmVyX2Z1bmN0aW9uMiggaW50JiBPVVRQVVQgKTsKCSAgICAgIH07CiAgICAgICAgICAgICV9CgoKMDQvMjEvMjAwNzogb2xseQoJICAgIEZpeCBwYXJzaW5nIG9mIGZsb2F0IGNvbnN0YW50cyB3aXRoIGFuIGV4cG9uZW50IChlLmcuIDFlLTAyZikKCSAgICAoYnVnICMxNjk5NjQ2KS4KCjA0LzIwLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggbGFjayBvZiBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3Mgd2hlbiAtTyBpcyB1c2VkLgoJICAgIEFsc28sIGZpeCBnZW5lcmF0aW9uIG9mIGRvY3N0cmluZ3MgY29udGFpbmluZyBhIGRvdWJsZSBxdW90ZQoJICAgIGNoYXJhY3Rlci4gIFBhdGNoIGZyb20gUmljaGFyZCBCb3VsdG9uIGluIGJ1ZyMxNzAwMTQ2LgoKMDQvMTcvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTdXBwb3J0IGZvciBhZGRpbmcgaW4gSmF2YS9DIyBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGludGVybWVkaWFyeSBjYWxsLAogICAgICAgICAgICBzcGVjaWZpY2FsbHkgcmVsYXRlZCB0byB0aGUgbWFyc2hhbGxpbmcgb2YgdGhlIHByb3h5IHR5cGUgdG8gdGhlIGludGVybWVkaWFyeSB0eXBlLgogICAgICAgICAgICBUaGUgamF2YWluL2NzaW4gdHlwZW1hcCBub3cgc3VwcG9ydHMgdGhlICdwcmUnIGFuZCAncG9zdCcgYXR0cmlidXRlcyB0byBhY2hpZXZlIHRoaXMuCiAgICAgICAgICAgIFRoZSBqYXZhaW4gdHlwZW1hcCBhbHNvIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdwZ2NwcG5hbWUnIGF0dHJpYnV0ZSBmb3IgcHJlbWF0dXJlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciBuYW1pbmcgYW5kIHRoZSBjc2luIHR5cGVtYXAgc3VwcG9ydHMgYW4gb3B0aW9uYWwgJ2NzaGluJwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBwYXJhbWV0ZXIgdHlwZSB1c2VkIGluIGEgY29uc3RydWN0b3IgaGVscGVyIGdlbmVyYXRlZCB3aGVuIHRoZSB0eXBlIGlzIHVzZWQKICAgICAgICAgICAgaW4gYSBjb25zdHJ1Y3Rvci4gRGV0YWlscyBpbiB0aGUgSmF2YS5odG1sIGFuZCBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uLgoKMDQvMTYvMjAwNzogb2xseQoJICAgIERvbid0IHRyZWF0IGByZXN0cmljdCcgYXMgYSByZXNlcnZlZCBpZGVudGlmaWVyIGluIEMrKyBtb2RlCgkgICAgKGJ1ZyMxNjg1NTM0KS4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gRml4IGhvdyB6ZW5kX3Rocm93X2V4Y2VwdGlvbigpIGlzIGNhbGxlZCAoYnVnICMxNzAwNzg1KS4KCjA0LzEwLzIwMDc6IG9sbHkKCSAgICBEZWZpbmUgU1dJR1RFTVBMQVRFRElTQU1CSUdVQVRPUiB0byB0ZW1wbGF0ZSBmb3IgYUNDIChyZXBvcnRlZCBvbgoJICAgIHN3aWctdXNlciB0aGF0IHRoaXMgaXMgbmVlZGVkKS4KCjA0LzA0LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0gSWYgWlRTIGlzIGVuYWJsZWQsIHJlbGVhc2UgPG1vZHVsZT5fZ2xvYmFsc19pZCBpbiBNU0hVVERPV04KCSAgICB0byBhdm9pZCBQSFAgaW50ZXJwcmV0ZXIgY3Jhc2ggb24gc2h1dGRvd24uICBUaGlzIHNvbHV0aW9uIHdhcwoJICAgIHN1Z2dlc3RlZCBoZXJlOiBodHRwOi8vYnVncy5waHAubmV0L2J1Zy5waHA/aWQ9NDA5ODUKCjA0LzAzLzIwMDc6IG9sbHkKCSAgICBbUEhQNF0gQWRkIG1pc3NpbmcgWlRTIGFubm90YXRpb25zIHRvIGdlbmVyYXRlZCBDKysgd3JhcHBlciBjb2RlCgkgICAgdG8gZml4IGNvbXBpbGF0aW9uIGZhaWx1cmVzIHdoZW4gdXNpbmcgWlRTIGVuYWJsZWQgU1dJRyAoTGludXgKCSAgICBkaXN0cmlidXRpb25zIHRlbmQgdG8gZGlzYWJsZSBaVFMsIGJ1dCBub3RhYmx5IHRoZSBXaW5kb3dzIGJ1aWxkCgkgICAgdXNlcyBpdCBieSBkZWZhdWx0KS4KCjA0LzAxLzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2ODQyNjE6IGZpeGVzIGhhbmRsaW5nIG9mIHVuc2lnbmVkIGludCBsaXRlcmFscywgdGhhbmtzIExlaWdoIFNtaXRoLgogICAgICAgICAgICBBbHNvLCBpbXByb3ZlZCBkb2N1bWVudGF0aW9uLgoKMDMvMzAvMjAwNzogb2xseQoJICAgIEF2b2lkIGdlbmVyYXRpbmcgJzw6JyB0b2tlbiB3aGVuIHVzaW5nIFN3aWdWYWx1ZVdyYXBwZXI8PiBvbiBhIHR5cGUKCSAgICB3aGljaCBzdGFydHMgd2l0aCAnOjonIChwYXRjaCAjMTY5MDk0OCkuCgowMy8yNS8yMDA3OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbcGVybDVdIEFkZCBTV0lHX2ZhaWwgdG8gdGhlIFNXSUdfZXhjZXB0aW9uIG1hY3JvLiAgRml4ZXMgYSBmZXcgcHJvYmxlbXMgcmVwb3J0ZWQKCSAgICBvbiB0aGUgbWFpbGluZyBsaXN0LgoKMDMvMjMvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgU3RyaW5nIGNvcHlpbmcgcGF0Y2ggZnJvbSBKb3NoIENoZXJyeSByZWR1Y2luZyBtZW1vcnkgY29uc3VtcHRpb24gYnkgYWJvdXQgMjUlLgoKMDMvMjEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxNjMxOTg3IGZyb20gVWxyaWsgUGV0ZXJzb24gLSBib29sIElOT1VUIHR5cGVtYXBzCiAgICAgICAgICAgIGZhaWwgb24gYmlnIGVuZGlhbiBtYWNoaW5lcy4KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHQgZ2l2ZW4gZG9kZ3kgQysrIGNvZGU6IG5hbWVzcGFjZSBhYmM6OmRlZiB7IH0KCjAzLzE2LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBzbyB0aGF0IEFSUkFZU09GQ0xBU1NFUyBhbmQgQVJSQVlTT0ZFTlVNUyBpbiBhcnJheXNfamF2YS5pIGNhbiBiZSBhcHBsaWVkCiAgICAgICAgICAgIHRvIHBvaW50ZXIgdHlwZXMuCgowMy8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIFdoZW4gd2Uga25vdyB0aGUgbGl0ZXJhbCBudW1lcmljIHZhbHVlIGZvciBhIGNvbnN0YW50LCB1c2UKCSAgICB0aGF0IHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0IG1lbWJlciBpbiB0aGUgUEhQIHdyYXBwZXIgY2xhc3MuCgowMy8wMi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBQSFAgd3JhcHBlciBjb2RlIGdlbmVyYXRlZCBmb3IgY2VydGFpbiBjYXNlcyBvZgoJICAgIG92ZXJsb2FkZWQgZm9ybXMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cy4KCjAyLzI2LzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gUGF0Y2ggIzE2NTYzOTU6IGZpeGVkIGhleCBhbmQgb2N0YWwgdmFsdWVzIGJ1ZywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuCgowMi8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXhlZCBidWcgaW4gdHlwZW1hcHMgd2hpY2ggY2F1c2VkIGRlcml2ZWRfYnl2YWx1ZSBhbmQgcm5hbWUgdGVzdCBjYXNlcyB0byBmYWlsLgoJICAgIFVwZGF0ZWQgZGVyaXZlZF9ieXZhbHVlLmkgdG8gZXhwbGFpbiBob3cgdG8gZmluZCBhbmQgZml4IHRoZSBwcm9ibGVtCgowMS8yNS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1Mzg1MjIgYW5kICMxMzM4NTI3LCBmb3J3YXJkIHRlbXBsYXRlZCBjbGFzcyBkZWNsYXJhdGlvbnMgd2l0aG91dCBhCiAgICAgICAgICAgIG5hbWUgZm9yIHRoZSB0ZW1wbGF0ZWQgY2xhc3MgcGFyYW1ldGVycywgc3VjaCBhczoKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lLCBjbGFzcz4gY2xhc3MgWDsKCjAxLzIzLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMxNjQwODYyOiA8bWFsbG9jLmg+IHJlcGxhY2VkIGJ5IDxzdGRsaWIuaD4KCSAgICBQYXRjaCAjMTU5ODA2MyBUeXBvIGluIHR5cGVtYXBzLmkKCjAxLzIyLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgbHVhIHNwZWNpZmljIGNhcnJheXMuaSB3aGljaCBhZGRzIHRoZSBvcGVyYXRvcltdIHN1cHBvcnQuCgkgICAgbW9kaWZpZWQgdGhlIG1haW4gY29kZSB0byBtYWtlIGl0IG5vdCBlbWl0IGFsbCB0aGUgY2xhc3MgbWVtYmVyIGZ1bmN0aW9ucyAmIGFjY2Vzc29ycwoJICAgIE5vdGU6IEMgc3RydWN0cyBhcmUgY3JlYXRlZCB1c2luZyBuZXdfWFhYKCkgd2hpbGUgQysrIGNsYXNzZXMgdXNlIFhYWCgpIChzaG91bGQgYmUgc3RhbmRhcmRpc2VkKQoJICAgIFVwZGF0ZWQgdGVzdCBjYXNlOiBsaV9jYXJyYXlzCgkgICAgVXBkYXRlZCB0aGUgZG9jdW1lbnRhdGlvbi4KCjAxLzEyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZCBzdXBwb3J0IGZvciBuZXdmcmVlIHR5cGVtYXBzIChzb21ldGltZXMgdXNlZCBieSAlbmV3b2JqZWN0KQoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBOZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAtbWFjcm9lcnJvcnMuICAgV2hlbiBzdXBwbGllZCwgdGhpcyB3aWxsIGZvcmNlCiAgICAgICAgICAgIHRoZSBDIHNjYW5uZXIvcGFyc2VyIHRvIHJlcG9ydCBwcm9wZXIgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIGNvZGUgY29udGFpbmVkCiAgICAgICAgICAgIGluc2lkZSBTV0lHIG1hY3JvcyAoZGVmaW5lZCB3aXRoICVkZWZpbmUpLiAgQnkgZGVmYXVsdCwgU1dJRyBtZXJlbHkgcmVwb3J0cwogICAgICAgICAgICBlcnJvcnMgb24gdGhlIGxpbmUgYXQgd2hpY2ggYSBtYWNybyBpcyB1c2VkLiAgV2l0aCB0aGlzIG9wdGlvbiwgeW91CiAgICAgICAgICAgIGNhbiBleHBhbmQgdGhlIGVycm9yIGJhY2sgdG8gaXRzIHNvdXJjZS0tLXNvbWV0aGluZyB3aGljaCBtYXkgc2ltcGxpZnkKICAgICAgICAgICAgZGVidWdnaW5nLgoKMDEvMTIvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXSBNYWpvciBvdmVyaGF1bCBvZiBDL0MrKyBzY2FubmluZyBpbXBsZW1lbnRhdGlvbi4gIEZvciBxdWl0ZQogICAgICAgICAgICBzb21lIHRpbWUsIFNXSUcgY29udGFpbmVkIHR3byBjb21wbGV0ZWx5IGluZGVwZW5kZW50IEMvQysrIHRva2VuaXplcnMtLQogICAgICAgICAgICB0aGUgbGVnYWN5IHNjYW5uZXIgaW4gQ1BhcnNlL2NzY2FubmVyLmMgYW5kIGEgZ2VuZXJhbCBwdXJwb3NlIHNjYW5uZXIKICAgICAgICAgICAgaW4gU3dpZy9zY2FubmVyLmMuIFNXSUcgc3RpbGwgaGFzIHR3byBzY2FubmluZyBtb2R1bGVzLCBidXQgdGhlIEMgcGFyc2VyCiAgICAgICAgICAgIHNjYW5uZXIgKENQYXJzZS9jc2Nhbm5lci5jKSBub3cgcmVsaWVzIHVwb24gdGhlIGdlbmVyYWwgcHVycG9zZQogICAgICAgICAgICBzY2FubmVyIGZvdW5kIGluIFN3aWcvc2Nhbm5lci5jLiAgQXMgYSByZXN1bHQsIGl0IGlzIG11Y2ggc21hbGxlciBhbmQKICAgICAgICAgICAgbGVzcyBjb21wbGljYXRlZC4gIFRoaXMgY2hhbmdlIGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gbWFpbnRhaW4gYWxsCiAgICAgICAgICAgIG9mIHRoZSBsb3ctbGV2ZWwgQyB0b2tlbml6aW5nIGluIG9uZSBjZW50cmFsIGxvY2F0aW9uIGluc3RlYWQgb2YgdHdvCiAgICAgICAgICAgIHBsYWNlcyBhcyBiZWZvcmUuCgogICAgICAgICAgICAqKipQT1RFTlRJQUwgRkxBS0lORVNTKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBjYXVzZSBwcm9ibGVtcyB3aXRoIGFjY3VyYXRlIGxpbmUgbnVtYmVyIHJlcG9ydGluZwogICAgICAgICAgICBhcyB3ZWxsIGFzIGVycm9yIHJlcG9ydGluZyBtb3JlIGdlbmVyYWxseS4gSSBoYXZlIHRyaWVkIHRvIHJlc29sdmUgdGhpcwogICAgICAgICAgICBhcyBtdWNoIGFzIHBvc3NpYmxlLCBidXQgdGhlcmUgbWlnaHQgYmUgc29tZSBjb3JuZXIgY2FzZXMuCgowMS8xMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCB0eXBlbWFwIHRocm93cyBmb3Igc3RkOjpzdHJpbmcqLCB0eXBlbWFwIGZvciBTV0lHVFlQRSBEWU5BTUlDLAoJICAgIGNoYW5nZWQgdGhlIGV4aXN0aW5nIHRocm93cyB0eXBlbWFwIHRvIHRocm93IGEgc3RyaW5nIGluc3RlYWQgb2YgbWFraW5nIGEgY29weSBvZgoJICAgIHRoZSBvYmplY3QgKHVwZGF0aW5nIGEgZmV3IHRlc3QgY2FzZXMgdG8gZGVhbCB3aXRoIHRoZSBjaGFuZ2UpLgoJICAgIGZpeGVkIHRlc3QgY2FzZTogZHluYW1pY19jYXN0cywgZXhjZXB0aW9uX3BhcnRpYWxfaW5mbywgbGlfc3RkX3N0cmluZywgc2l6ZV90CgowMS8wMy8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIFtJbnRlcm5hbHNdLiAgVXNlIG9mIHN3aWdrZXlzLmMvLmggdmFyaWFibGVzIGlzIHJldm9rZWQuICBQbGVhc2UgdXNlCiAgICAgICAgICAgIHNpbXBsZSBzdHJpbmdzIGZvciBhdHRyaWJ1dGUgbmFtZXMuCgoxMi8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIEFQSSBmdW5jdGlvbnMgSGFzaEdldEF0dHIoKSBhbmQgSGFzaENoZWNrQXR0cigpIGhhdmUgYmVlbiByZXZva2VkLgogICAgICAgICAgICBQbGVhc2UgdXNlIEdldGF0dHIoKSB0byByZXRyaWV2ZSBhdHRyaWJ1dGVzLiAgVGhlIGZ1bmN0aW9uIENoZWNrYXR0cigpIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIGNoZWNrIGF0dHJpYnV0ZXMuICBOb3RlOiAgVGhlc2UgZnVuY3Rpb25zIGhhdmUgYmVlbiByZXZva2VkCiAgICAgICAgICAgIGJlY2F1c2UgdGhleSBvbmx5IGFkZGVkIGEgbWFyZ2luYWwgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYXQgdGhlIGV4cGVuc2UKICAgICAgICAgICAgY29kZSBjbGFyaXR5LgoKMTIvMjYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgbW9yZSBTVEwgKG1vcmUgZXhjZXB0aW9ucywgbWFwLCBzaXplX3QpLAoJICAgIGZpeGVkIHRlc3QgY2FzZTogY29udmVyc2lvbl9uc190ZW1wbGF0ZS4KCjEyLzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIFVwZGF0ZSB0byB0aHJvdyBlcnJvcnMgd2hlbiBzZXR0aW5nIGltbXV0YWJsZXMsCgkgICAgYW5kIGFsbG93aW5nIHVzZXIgYWRkaXRpb24gb2YgbW9kdWxlIHZhcmlhYmxlcy4KCjEyLzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB0eXBlZGVmJ2QgdmFyaWFibGUgd3JhcHBlcnMgdGhhdCB1c2UgJW5hdHVyYWx2YXIsIGVnLCBzdGQ6OnN0cmluZy4KCjEyLzE0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCB0eXBlbWFwcwoKMTIvMTQvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCBidWcgIzE2MTM2NzMgKGJhZCBQSFA1IGNvZGUgZ2VuZXJhdGVkIGZvciBnZXR0ZXJzIGFuZAoJICAgIHNldHRlcnMpLgoKMTIvMDIvMjAwNjogd3NmdWx0b24sIEpvaG4gTGVueiwgRGF2ZSBCZWF6bGV5CiAgICAgICAgICAgIE1vdmUgZnJvbSBjdnMgdG8gU3VidmVyc2lvbiBmb3Igc291cmNlIGNvbnRyb2wKCjExLzMwLzIwMDY6IGJlYXpsZXkKICAgICAgICAgICAgQ2xlYW5lZCB1cCBzd2lnd2FybmluZ3Muc3dnIGZpbGUgbm90IHRvIHVzZSBuZXN0ZWQgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbnMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBmb3IgJWV4dGVuZCB0byB3b3JrIGZvciBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlcy4KClZlcnNpb24gMS4zLjMxIChOb3ZlbWJlciAyMCwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTIvMjAwNjogTHVpZ2kgQmFsbGFiaW8KICAgICAgICAgICAgW1B5dGhvbl0gQWx0ZXJuYXRlIGZpeCBmb3IgUHl0aG9uIGV4Y2VwdGlvbnMgYnVnICMxNTc4MzQ2ICh0aGUgcHJldmlvdXMgb25lIGJyb2tlIFB5dGhvbgogICAgICAgICAgICBwcm9wZXJ0aWVzIGluIG1vZGVybiBjbGFzc2VzKQoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgLWZha2V2ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbiBub3cgZ2VuZXJhdGVzIHRoZSBmYWtlIHZlcnNpb24gaW50byB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzCiAgICAgICAgICAgIGFzIHdlbGwgYXMgZGlzcGxheWluZyBpdCB3aGVuIHRoZSAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gaXMgdXNlZC4KCjE0LzExLzIwMDY6IG1nb3NzYWdlCgkgICAgW2x1YV0gdXBkYXRlIHRvIHR5cGVtYXAgZm9yIG9iamVjdCBieSB2YWx1ZSwgdG8gbWFrZSBpdCBjODkgY29tcGxpYW50CgpWZXJzaW9uIDEuMy4zMCAoTm92ZW1iZXIgMTMsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtqYXZhXSBSZW1vdmUgRGV0YWNoQ3VycmVudFRocmVhZCBwYXRjaCBmcm9tICAwOC8xMS8yMDA2IC0gaXQgY2F1c2VzIHNlZ2ZhdWx0cwogICAgICAgICAgICBvbiBzb21lIHN5c3RlbXMuCgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbcHl0aG9uXSBGaXggIzE1NzgzNDYgLSBQeXRob24gZXhjZXB0aW9ucyB3aXRoIC1tb2Rlcm4KCjExLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTU5MzI5MSAtIFNtYXJ0IHBvaW50ZXJzIGFuZCBpbmhlcml0aW5nIGZyb20gdGVtcGxhdGVzIAoKMTEvMDkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpcmVjdG9yIG9wZXJhdG9yIHBvaW50ZXIvcmVmZXJlbmNlIGNhc3RzIC0gIzE1OTIxNzMuCgoxMS8wNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgJHNlbGYgc3BlY2lhbCB2YXJpYWJsZSBmb3IgJWV4dGVuZCBtZXRob2RzLiBQbGVhc2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBqdXN0ICdzZWxmJwogICAgICAgICAgICBhcyB0aGUgQysrICd0aGlzJyBwb2ludGVyLgoKMTEvMDcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXSAKCSAgICBhbGxlZ3JvY2wuc3dnOiBzd2lnLWRlZnZhciB1cGRhdGVkIHRvIGFsbG93IHNwZWNpZnlpbmcgb2YKCSAgICAJCSAgIG5vbi1kZWZhdWx0IGZvcmVpZ24gdHlwZSAodmlhIDpmdHlwZSBrZXl3b3JkIGFyZykuCgkgICAgYWxsZWdyb2NsLmN4eDogU3BlY2lmeSBwcm9wZXIgYWNjZXNzIHR5cGUgZm9yIGVudW0gdmFsdWVzLgoKMTEvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEvQyNdIEZpeCBjb25zdCBzdGQ6OnN0cmluZyYgcmV0dXJuIHR5cGVzIGZvciBkaXJlY3RvcnMgYXMgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgTWFyayBEb25zZWx6bWFubgoKMTAvMjkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlbW92ZSBEZWxldGVMb2NhbFJlZiBmcm9tIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIGZvciBub3cgYXMgaXQgaXMgY2F1c2luZyBhCiAgICAgICAgICAgIHNlZyBmYXVsdCB3aGVuIHJ1biBvbiBTb2xhcmlzIDguCgoxMC8yOS8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbR3VpbGVdIFBhdGNoIGZyb20gQ2hyaXMgU2hvZW1ha2VyIHRvIGNsZWFuIHVwIHNvbWUgd2FybmluZ3MgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLgoKMTAvMjkvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEltcG9ydGFudCBmaXggdG8gcHJldmVudCBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb24gb2YgdGhlIEphdmEgcHJveHkgY2xhc3MKICAgICAgICAgICAgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBpbiBhIG5hdGl2ZSBtZXRob2QuIFRoZSBmaW5hbGl6ZXIgY291bGQgZGVzdHJveSB0aGUgdW5kZXJseWluZwogICAgICAgICAgICBDKysgb2JqZWN0IHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkLiBUaGUgcHJvYmxlbSBvY2N1cnMgd2hlbiB0aGUgcHJveHkgY2xhc3MgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIHN0cm9uZ2x5IHJlYWNoYWJsZSBhZnRlciBhIG5hdGl2ZSBjYWxsLiAgVGhlIHByb2JsZW0gc2VlbXMgdG8gb2NjdXIgaW4KICAgICAgICAgICAgbWVtb3J5IHN0cmVzcyBzaXR1YXRpb25zIG9uIHNvbWUgSlZNcy4gSXQgZG9lcyBub3Qgc2VlbSB0byBvY2N1ciBvbiB0aGUKICAgICAgICAgICAgU3VuIGNsaWVudCBKVk0gdXAgdG8gamRrIDEuNS4gSG93ZXZlciB0aGUgMS42IGNsaWVudCBqZGsgaGFzIGEgbW9yZSBhZ2dyZXNzaXZlIGdhcmJhZ2UKICAgICAgICAgICAgY29sbGVjdG9yIGFuZCBzbyB0aGUgcHJvYmxlbSBkb2VzIG9jY3VyLiBJdCBkb2VzIG9jY3VyIG9uIHRoZSBTdW4gc2VydmVyCiAgICAgICAgICAgIEpWTXMgKGNlcnRhaW5seSAxLjQgb253YXJkcykuIFRoZSBmaXggZW50YWlscyBwYXNzaW5nIHRoZSBwcm94eSBjbGFzcyBpbnRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIGFkZGl0aW9uIHRvIHRoZSBDKysgcG9pbnRlciBpbiB0aGUgbG9uZyBwYXJhbWV0ZXIsIGFzIEphdmEgY2xhc3NlcyBhcmUgbm90CiAgICAgICAgICAgIGNvbGxlY3RlZCB3aGVuIHRoZXkgYXJlIHBhc3NlZCBpbnRvIEpOSSBtZXRob2RzLiBUaGUgZXh0cmEgcGFyYW1ldGVyIGNhbiBiZSBzdXBwcmVzc2VkCiAgICAgICAgICAgIGJ5IHNldHRpbmcgdGhlIG5vcGdjcHAgYXR0cmlidXRlIGluIHRoZSBqdHlwZSB0eXBlbWFwIHRvICIxIiBvciB1c2luZyB0aGUgbmV3IC1ub3BnY3BwCiAgICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgIFNlZSBKYXZhLmh0bWwjamF2YV9wZ2NwcCBmb3IgZnVydGhlciBkZXRhaWxzIG9uIHRoaXMgdG9waWMuCgoxMC8yNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBzbWFydCBwb2ludGVyIHdyYXBwZXJzLiBUaGUgdmlydHVhbC9vdmVycmlkZS9uZXcga2V5d29yZCBpcyBub3QgZ2VuZXJhdGVkCiAgICAgICAgICAgIGZvciBlYWNoIG1ldGhvZCBhcyB0aGUgc21hcnQgcG9pbnRlciBjbGFzcyBkb2VzIG5vdCBtaXJyb3IgdGhlIHVuZGVybHlpbmcgcG9pbnRlcgogICAgICAgICAgICBjbGFzcyBpbmhlcml0YW5jZSBoaWVyYXJjaHkuIFNGICMxNDk2NTM1CgoxMC8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBuYXRpdmUgbWV0aG9kcyAmIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KICAgICAgICAgICAgZml4ZWQgdGVzdCBjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcyAmIGNwcF9iYXNpYy4gQWRkZWQgbmV3IGV4YW1wbGUgKGZ1bmN0b3IpLgogICAgICAgICAgICB0aWRpZWQgdXAgYSBsaXR0bGUgb2YgdGhlIGNvZGUgKGFyb3VuZCBjbGFzc0hhbmRsZXIpLgoKMTAvMTcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBkaXJlY3Rvcm91dCB0eXBlbWFwIGNoYW5nZXMgdG8gZmFsbCBpbiBsaW5lIHdpdGggdGhlIG90aGVyIGRpcmVjdG9yCiAgICAgICAgICAgIGxhbmd1YWdlcy4gJHJlc3VsdCBpcyBub3cgdXNlZCB3aGVyZSAkMSB1c2VkIHRvIGJlIHVzZWQuIFBsZWFzZSBjaGFuZ2UgeW91ciB0eXBlbWFwcwogICAgICAgICAgICBpZiB5b3UgaGF2ZSBhIGN1c3RvbSBkaXJlY3Rvcm91dCB0eXBlbWFwLgoKMTAvMTgvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU29tZSBmaXhlcyBmb3IgYXBwbHlpbmcgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMgdG8gdW5zaWduZWQgY2hhciBhcnJheXMuCgoxMC8xNy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEFkZCBpbiBjb25zdCBzaXplX3QmIGFuZCBjb25zdCBzdGQ6OnNpemVfdCYgdHlwZW1hcHMuCgoxMC8xNS8yMDA2OiBlZnV6enlvbmUgCiAgICAgICAgICAgIFtDRkZJXSBTdXBwcmVzcyBnZW5lcmF0aW5nIGRlZmN0eXBlIGZvciBlbnVtcywgdGhhbmtzIHRvIEFydGh1ciBTbXlsZXMuIFBhdGNoIDE1NjA5ODMuIAoKMTAvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSBNaW5vciBmaXggdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCB0aGUgKGFzIHlldCB1bnJlbGVhc2VkKSBjaGlja2VuIDIuNQoKICAgICAgICAgICAgW0d1aWxlLENoaWNrZW5dIEZpeCBTRiBCdWcgMTU3Mzg5Mi4gIEFkZGVkIGFuIGV4dF90ZXN0IHRvIHRoZSB0ZXN0IHN1aXRlIHRvIHRlc3QKICAgICAgICAgICAgdGhpcyBidWcsIGJ1dCB0aGlzIHRlc3QgY2FuIG5vdCByZWFsbHkgYmUgbWFkZSBnZW5lcmljIGJlY2F1c2UgdGhlIGV4dGVybmFsIGNvZGUgbXVzdAogICAgICAgICAgICBwbHVnIGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBpbnRlcnByZXRlciBkaXJlY3RseS4KICAgICAgICAgICAgU2VlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvY2hpY2tlbi9leHRfdGVzdC5pIGFuZCBleHRfdGVzdF9leHRlcm5hbC5jeHgKCiAgICAgICAgICAgIEFkZGVkIGEgJS5leHRlcm5hbHRlc3QgdG8gY29tbW9uLm1rLCBhbmQgYW55IGludGVyZXN0ZWQgbGFuZ3VhZ2UgbW9kdWxlcyBjYW4KICAgICAgICAgICAgY29weSBhbmQgc2xpZ2h0bHkgbW9kaWZ5IGVpdGhlciB0aGUgY2hpY2tlbiBvciB0aGUgZ3VpbGUgZXh0X3Rlc3QuaQoKMTAvMTQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gYWRkZWQgT1VUUFVUJiBmb3IgYWxsIG51bWJlciB0eXBlcywgYWRkZWQgYSBsb25nIGxvbmcgdHlwZQogICAgICAgICAgICBmaXhlZCBzZXZlcmFsIHRlc3QgY2FzZXMuCiAgICAgICAgICAgIHVwZGF0ZTogY2hhbmdlZCB0eXBlbWFwcyB0byB1c2UgU1dJR19Db252ZXJ0UHRyIHJhdGhlciB0aGFuIFNXSUdfTXVzdEdldFBvaW50ZXIKICAgICAgICAgICAgc3RhcnRlZCBzcGxpdGluZyBsdWEuc3dnIGludG8gc21hbGxlciBwYXJ0cyB0byBtYWtlIGl0IG5lYXRlcgoKMTAvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBNYXJnaW5hbGx5IGJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSBvbmx5IGluIHRoYXQgeW91IGNhbgogICAgICAgICAgICBjb250cm9sIHdoYXQgdGhlIGJhc2UgY2xhc3MgaXMuIFRoaXMgaXMgZG9uZSB1c2luZyB0aGUgbmV3ICdyZXBsYWNlJyBhdHRyaWJ1dGUgaW4gdGhlIAogICAgICAgICAgICBqYXZhYmFzZS9jc2Jhc2UgdHlwZW1hcCwgZWcgaW4gdGhlIGZvbGxvd2luZywgJ01lJyB3aWxsIGJlIHRoZSBiYXNlIGNsYXNzLAogICAgICAgICAgICBubyBtYXR0ZXIgd2hhdCBGb28gaXMgcmVhbGx5IGRlcml2ZWQgZnJvbSBpbiB0aGUgQysrIGxheWVyLgoKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYmFzZSwgcmVwbGFjZT0iMSIpIEZvbyAiTWUiOwogICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSwgcmVwbGFjZT0iMSIpIEZvbyAiTWUiOwoKICAgICAgICAgICAgUHJldmlvdXNseSBpdCB3YXMgbm90IHBvc3NpYmxlIGZvciB0aGUgamF2YWJhc2UvY3NiYXNlIHR5cGVtYXBzIHRvIG92ZXJyaWRlIHRoZSBDKysgYmFzZS4KCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZW1vdmUgcG90ZW50aWFsIHJhY2UgY29uZGl0aW9uIG9uIHRoZSBwcm94eSBjbGFzcycgZGVsZXRlKCkgbWV0aG9kIAogICAgICAgICAgICAoaXQgaXMgbm93IGEgc3luY2hyb25pemVkIG1ldGhvZCwgYnV0IGlzIG5vdyBjdXN0b21pc2FibGUgYnkgY2hhbmdpbmcgdGhlIAogICAgICAgICAgICBtZXRob2Rtb2RpZmllcnMgYXR0cmlidXRlIGluIHRoZSBqYXZhZGVzdHJ1Y3Qgb3IgamF2YWRlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcCkKCiAgICAgICAgICAgIFtDI10gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIERpc3Bvc2UoKSBtZXRob2QsIAogICAgICAgICAgICBzaW1pbGFyIHRvIEphdmEncyBkZWxldGUoKSBhYm92ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gUmVtb3ZlIHJlZHVuZGFudCBkaXJlY3RvciBjb2RlIGluICVleHRlbmQgbWV0aG9kcyAoJWV4dGVuZAogICAgICAgICAgICBtZXRob2RzIGNhbm5vdCBiZSBkaXJlY3RvciBtZXRob2RzKQoKMTAvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbl0gRml4ICMxNTA1NTk0IC0gZGlyZWN0b3Igb2JqZWN0cyBub3QgcmV0dXJuZWQgYXMgZGlyZWN0b3Igb2JqZWN0cwogICAgICAgICAgICBpbiAlZXh0ZW5kIG1ldGhvZHMuCgoxMC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ICMxMjM4Nzk4IC0gRGlyZWN0b3JzIHVzaW5nIHVuc2lnbmVkIGxvbmcgbG9uZyBvciBhbnkgb3RoZXIgdHlwZQogICAgICAgICAgICBtYXJzaGFsbGVkIGFjcm9zcyB0aGUgSk5JIGJvdW5kYXJ5IHVzaW5nIGEgSmF2YSBjbGFzcyAod2hlcmUgdGhlIGpuaSB0eXBlbWFwIAogICAgICAgICAgICBjb250YWlucyBqb2JqZWN0KS4KCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTE2MjE5NCAtICNpbmNsdWRlLyVpbmNsdWRlIHdpdGhpbiBhIHN0cnVjdHVyZQoKMTAvMDYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDUwNjYxLCBzdHJpbmcgdHJ1bmNhdGlvbiBpbiBTdHJpbmdfc2VlayB0cnVuY2F0aW5nIEphdmEvQyMgZW51bXMuCgoxMC8wNi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBGaXggIzE1Njk1ODcuIFRoZSBuYW1lIGlzIG5vdyBjb3JyZWN0LgoKMTAvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3IgZml4ZXMgZm9yIHZpcnR1YWwgY29udmVyc2lvbiBvcGVyYXRvcnMKCjEwLzA0LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggIzE1Njk1ODcgZm9yIFBIUC4gIERvbid0IHVzZSBzaXplb2YoKSBleGNlcHQgd2l0aCBzdHJpbmcKCSAgICBsaXRlcmFscy4gIENoYW5nZSBzb21lICIvLyIgY29tbWVudHMgdG8gIi8qICovIiBmb3IgcG9ydGFiaWxpdHkuCgoxMC8wNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBQYXJ0aWFsIEZpeCAjMTU2OTU4Ny4gVGhlIHR5cGUgaXMgbm93IGNvcnJlY3QsIGJ1dCB0aGUgbmFtZSBpcyBzdGlsbCBub3QgY29ycmVjdC4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggIzE1Mjc4ODUgLSBPdmVybG9hZGVkIGRpcmVjdG9yIHZpcnR1YWwgbWV0aG9kcyBzb21ldGltZXMgcHJvZHVjZWQKICAgICAgICAgICAgdW5jb21waWxhYmxlIGNvZGUgd2hlbiB1c2VkIHdpdGggdGhlIGRpcmVjdG9yOmV4Y2VwdCBmZWF0dXJlLgoKMTAvMDMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRGlyZWN0b3JzOiBEaXJlY3RvcnMgYXJlIG91dHB1dCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZGVjbGFyZWQgaW4gCiAgICAgICAgICAgIHRoZSBDKysgY2xhc3MgcmF0aGVyIHRoYW4gaW4gc29tZSBwc2V1ZG8tcmFuZG9tIG9yZGVyLgoKMTAvMDMvMjAwNjogbW1hdHVzCiAgICAgICAgICAgIEZpeCAjMTQ4NjI4MSBhbmQgIzE0NzEwMzkuCgoxMC8wMy8yMDA2OiBvbGx5CgkgICAgW1BlcmxdIEZpeCBmb3IgaGFuZGxpbmcgc3RyaW5ncyB3aXRoIHplcm8gYnl0ZXMgZnJvbSBTdGVwaGVuIEh1dHNhbC4KCjA5LzMwLzIwMDY6IGVmdXp6eW9uZQogICAgICAgICAgICBbQ0ZGSV0gQml0ZmllbGQgc3VwcG9ydCBhbmQgdmFyYXJnIHN1cHBvcnQgZHVlIHRvIEFydGh1ciBTbXlsZXMuCiAgICAgICAgICAgIEMgZXhwcmVzc2lvbiB0byBMaXNwIGNvbnZlcnNpb24sIHRoYW5rcyB0byBBcnRodXIgU215bGVzIGZvciB0aGUgaW5pdGlhbAogICAgICAgICAgICBpZGVhLCBpdCBub3cgc3VwcG9ydHMgY29udmVyc2lvbiBmb3IgYSB3aG9sZSByYW5nZSBvZiBDIGV4cHJlc3Npb25zLiAKCjA5LzI4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTUwODMyNyAtIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgaGlkZGVuIHdoZW4gdXNpbmcgLWZ2aXJ0dWFsIG9wdGltaXNhdGlvbi4KICAgICAgICAgICAgT3ZlcmxvYWRlZCBtZXRob2RzIGFyZSBubyBsb25nZXIgY2FuZGlkYXRlcyBmb3IgZWxpbWluYXRpb24gLSB0aGlzIG1pbWljcwogICAgICAgICAgICBDKysgYmVoYXZpb3VyIHdoZXJlIGFsbCBvdmVybG9hZGVkIG1ldGhvZHMgbXVzdCBiZSBkZWZpbmVkIGFuZCBpbXBsZW1lbnRlZAogICAgICAgICAgICBpbiBhIGRlcml2ZWQgY2xhc3MgaW4gb3JkZXIgZm9yIHRoZW0gdG8gYmUgYXZhaWxhYmxlLgoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnksIFB5dGhvbiwgT2NhbWxdIEZpeCAjMTUwNTU5MSBUaHJvd2luZyBleGNlcHRpb25zIGluIGV4dGVuZGVkIGRpcmVjdG9ycwoKMDkvMjUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDU2MTAwIC0gdmlydHVhbCBvcGVyYXRvcnMuIAoKMDkvMjQvMjAwNjogb2xseQoJICAgIERvbid0IGFjY2lkZW50YWxseSBjcmVhdGUgYSAiPDoiIHRva2VuICh3aGljaCBpcyB0aGUgc2FtZSBhcyAiWyIgaW4gQysrKS4KCSAgICBGaXhlcyBidWcgIyAxNTIxNzg4LgoKMDkvMjMvMjAwNjogb2xseQoJICAgIFtSdWJ5XSBTdXBwb3J0IGJ1aWxkaW5nIHdpdGggcmVjZW50IHZlcnNpb25zIG9mIHRoZSBSdWJ5IDEuOQoJICAgIGRldmVsb3BtZW50IGJyYW5jaC4gIEZpeGVzIGJ1ZyAjMTU2MDA5Mi4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBUZW1wbGF0ZXMgY2FuIG5vdyBiZSBpbnN0YW50aWF0ZWQgdXNpbmcgbmVnYXRpdmUgbnVtYmVycyBhbmQKCSAgICBjb25zdGFudCBleHByZXNzaW9ucywgZS5nLjoKCgkgICAgdGVtcGxhdGU8aW50IHE+IGNsYXNzIHgge307CgkgICAgJXRlbXBsYXRlKHhfbWludXMxKSB4PC0xPjsKCSAgICAldGVtcGxhdGUoeF8xcGx1czIpIHg8MSsyPjsKCgkgICAgQWxzbywgY29uc3RhbnQgZXhwcmVzc2lvbnMgY2FuIG5vdyBpbmNsdWRlIGNvbXBhcmlzb25zICg+LCA8LCA+PSwKCSAgICA8PSwgIT0sID09KSwgbW9kdWx1cyAoJSksIGFuZCB0ZXJuYXJ5IGNvbmRpdGlvbmFscyAoYSA/IGIgOiBjKS4KCgkgICAgRml4ZXMgYnVncyAjNjQ2Mjc1LCAjOTI1NTU1LCAjOTU2MjgyLCAjOTk0MzAxLgoKMDkvMjIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgbWV0aG9kcyAtIEJ1Z3MgIzE1NDYyNTQsICMxNTQzNTMzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWlnbm9yZSBvbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMKCjA5LzIwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzZWcgZmF1bHRzIGFuZCBhc3NlcnRzIHdoZW4gZGlyZWN0b3IgbWV0aG9kcyBhcmUgaWdub3JlZCAoIzE1NDM1MzMpCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggb3V0IG9mIHNvdXJjZSBidWlsZHMgLSBidWcgIzE1NDQ3MTgKCjA5LzIwLzIwMDY6IG9sbHkKCSAgICBUcmVhdCBhIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9uIGFzIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiByYXRoZXIKCSAgICB0aGFuIGlnbm9yaW5nIGl0IGNvbXBsZXRlbHksIHNvIHRoYXQgd2UgZ2VuZXJhdGUgY29ycmVjdCBjb2RlIGZvcgoJICAgIHBhc3Npbmcgb3BhcXVlIHBvaW50ZXJzIHRvIHRoZSBuZXN0ZWQgY2xhc3MgKGZpeGVzIFNGIGJ1ZyAjOTA5Mzg3KS4KCjA5LzIwLzIwMDY6IG9sbHkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgW3BocF0gT3ZlcmxvYWQgcmVzb2x1dGlvbiBub3cgd29ya3MuICBIb3dldmVyIHRvIGFsbG93IHRoaXMsIFNXSUcKCSAgICBnZW5lcmF0ZWQgd3JhcHBlcnMgbm8gbG9uZ2VyIGNvZXJjZSBQSFAgdHlwZXMgKHdoaWNoIHJldmVydHMgYSBjaGFuZ2UKCSAgICBtYWRlIGluIDEuMy4yNikuICBTbyBmb3IgZXhhbXBsZSwgaWYgYSBtZXRob2QgdGFrZXMgYSBzdHJpbmcsIHlvdQoJICAgIGNhbiBubyBsb25nZXIgcGFzcyBhIG51bWJlciB3aXRob3V0IGV4cGxpY2l0bHkgY29udmVydGluZyBpdCB0byBhCgkgICAgc3RyaW5nIGluIFBIUCB1c2luZzogKHN0cmluZyl4CgowOS8xOC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbQUxMXSBmaXggb24gc3dpZ2luaXQuc3dnLCBoYXMgYmVlbiByZXBvcnRlZCB0byBjcmFzaCBvbiBzZXZlcmFsIHRlc3QgY2FzZXMKCSAgICBmb3VuZCBhbmQgZml4ZWQgcHJvYmxlbSBpbiBpbXBvcnRzIHVuZGVyIHB5dGhvbiAobWluZ3cpCgowOS8xNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCBmcm9tIE1pY2hhbCBNYXJlayBmb3IgUHl0aG9uIDIuNSB0byBmaXggNjQgYml0IGFycmF5IGluZGV4ZXMgb24KICAgICAgICAgICAgNjQgYml0IG1hY2hpbmVzLgoKMDkvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGV4cGxpY2l0Y2FsbCBmZWF0dXJlIGhhcyBiZWVuIHNjcmFwcGVkLiBUaGlzIGZlYXR1cmUgd2FzIGludHJvZHVjZWQgcHJpbWFyaWx5CiAgICAgICAgICAgIHRvIHNvbHZlIHJlY3Vyc2l2ZSBkaXJlY3RvciBtZXRob2QgY2FsbHMuIERpcmVjdG9yIHVwY2FsbCBpbXByb3ZlbWVudHMgbWFkZSBpbnN0ZWFkOgoKICAgICAgICAgICAgW1B5dGhvbiwgUnVieSwgT2NhbWxdIFRoZSBzd2lnX3VwIGZsYWcgaXMgbm8gbG9uZ2VyIHVzZWQuIFRoZSByZXF1aXJlZCBtdXRleGVzCiAgICAgICAgICAgIHdyYXBwaW5nIHRoaXMgZmxhZyBhcmUgYWxzbyBubyBsb25nZXIgbmVlZGVkLiBUaGUgcmVjdXJzaXZlIGNhbGxzIGdvaW5nIGZyb20gQysrCiAgICAgICAgICAgIHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgYW5kIGJhY2sgYWdhaW4gZXRjIGFyZSBub3cgYXZvaWRlZCBieSBhIHN1YnRsZWx5IGRpZmZlcmVudAogICAgICAgICAgICBhcHByb2FjaC4gSW5zdGVhZCBvZiB1c2luZyB0aGUgc3dpZ191cCBmbGFnIGluIGVhY2ggZGlyZWN0b3IgbWV0aG9kIHRvIGluZGljYXRlCiAgICAgICAgICAgIHdoZXRoZXIgdGhlIGV4cGxpY2l0IEMrKyBjYWxsIHRvIHRoZSBhcHByb3ByaWF0ZSBiYXNlIGNsYXNzIG1ldGhvZCBvciBhIG5vcm1hbAogICAgICAgICAgICBwb2x5bW9ycGhpYyBDKysgY2FsbCBzaG91bGQgYmUgbWFkZSwgdGhlIG5ldyBhcHByb2FjaCBtYWtlcyBvbmUgb2YgdGhlc2UgY2FsbHMKICAgICAgICAgICAgZGlyZWN0bHkgZnJvbSB0aGUgd3JhcHBlciBtZXRob2QuCgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSByZWN1cnNpdmUgY2FsbCBwcm9ibGVtIHdoZW4gY2FsbGluZyBhIEMrKyBiYXNlIGNsYXNzIG1ldGhvZCBmcm9tCiAgICAgICAgICAgIEphdmEvQyMgaXMgbm93IGZpeGVkLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgc2xpZ2h0bHkgZGlmZmVyZW50IHRvIHRoZSBvdGhlciBsYW5ndWFnZXMKICAgICAgICAgICAgYXMgdGhlIGRldGVjdGlvbiBhcyB0byB3aGV0aGVyIHRoZSBleHBsaWNpdCBjYWxsIG9yIGEgbm9ybWFsIHBvbHltb3JwaGljIGNhbGwgaXMgbWFkZQogICAgICAgICAgICBpbiB0aGUgSmF2YS9DIyBsYXllciByYXRoZXIgdGhhbiBpbiB0aGUgQysrIGxheWVyLgoKMDkvMTEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gdXBkYXRlZCBzd2lnaW5pdC5zd2cgdG8gYWxsb3cgbXVsdGlwbGUgaW50ZXJwcmV0ZXJzIHRvIHVzZSBtdWx0aXBsZQoJICAgIHN3aWcgbW9kdWxlcyBhdCBvbmNlLiBUaGlzIGhhcyBiZWVuIHRlc3RlZCBpbiBMdWEgKG1pbmd3ICYgbGludXgpLAoJICAgIHBlcmw1ICYgcHl0aG9uIChsaW51eCkgb25seS4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIGFkZGVkIHN1cHBvcnQgZm9yIHBhc3NpbmcgZnVuY3Rpb24gcG9pbnRlcnMgYXMgd2VsbCBhcyBuYXRpdmUgbHVhIG9iamVjdAogICAgICAgICAgICBpbnRvIHdyYXBwZXJlZCBmdW5jdGlvbi4KICAgICAgICAgICAgQWRkZWQgZXhhbXBsZSBmdW5jcHRyMyB0byBkZW1vbnN0cmF0ZSB0aGlzIGZlYXR1cmUKCjA5LzA1LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBSZW5hbWUgRXJyb3JDb2RlIGFuZCBFcnJvck1zZyAjZGVmaW5lLXMgdG8gU1dJR19FcnJvckNvZGUKCSAgICBhbmQgU1dJR19FcnJvck1zZyB0byBhdm9pZCBjbGFzaGVzIHdpdGggY29kZSB0aGUgdXNlciBtaWdodCBiZQoJICAgIHdyYXBwaW5nIChwYXRjaCBmcm9tIERhcnJlbiBXYXJuZXIgaW4gU0YgYnVnICMxNDY2MDg2KS4gIEFueQoJICAgIHVzZXIgdHlwZW1hcHMgd2hpY2ggdXNlIEVycm9yQ29kZSBhbmQvb3IgRXJyb3JNc2cgZGlyZWN0bHkgd2lsbAoJICAgIG5lZWQgYWRqdXN0aW5nIC0geW91IGNhbiBlYXNpbHkgZml4IHRoZW0gdG8gd29yayB3aXRoIGJvdGggb2xkCgkgICAgYW5kIG5ldyBTV0lHIGJ5IGNoYW5naW5nIHRvIHVzZSBTV0lHX0Vycm9yTXNnIGFuZCBhZGRpbmc6CgoJCSNpZm5kZWYgU1dJR19FcnJvck1zZwoJCSNkZWZpbmUgU1dJR19FcnJvck1zZygpIEVycm9yTXNnKCkKCQkjZW5kaWYKCjA4LzI5LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBNb3ZlIGNvbnN0YW50IGluaXRpYWxpc2F0aW9uIGZyb20gUklOSVQgdG8gTUlOSVQgdG8gZml4IGEKCSAgICB3YXJuaW5nIHdoZW4gdXNpbmcgQXBhY2hlIGFuZCBtb2RfcGhwLiAgV2Ugb25seSBuZWVkIHRvIGNyZWF0ZQoJICAgIFBIUCBjb25zdGFudHMgb25jZSB3aGVuIHdlJ3JlIGZpcnN0IGluaXRpYWxpc2VkLCBub3QgZm9yIGV2ZXJ5IEhUVFAKCSAgICByZXF1ZXN0LgoKMDgvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1NDI0NjYgYWRkZWQgY29kZSB0byBhbGxvdyBtYXBwaW5nIEx1YSBuaWwncyA8LT4gQy9DKysgTlVMTCdzCgkgICAgdXBkYXRlZCB2YXJpb3VzIHR5cGVtYXBzIHRvIHdvcmsgY29ycmVjdGx5IHdpdGggdGhlIGNoYW5nZXMKCSAgICBhZGRlZCB2b2lkdGVzdF9ydW5tZS5sdWEgdG8gc2hvdyB0aGUgZmVhdHVyZXMgd29ya2luZwoKMDgvMTkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBBZGQgZmVhdHVyZTpjb25zdGFzdmFyIHRvIGV4cG9ydCBjb25zdGFudHMgYXMgdmFyaWFibGVzIGluc3RlYWQgb2YgZnVuY3Rpb25zCiAgICAgICAgICAgIHRoYXQgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZS4KCjA4LzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBEZXRhY2hDdXJyZW50VGhyZWFkIGNhbGxzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IG5hdGl2ZWx5IGNyZWF0ZWQgdGhyZWFkcwogICAgICAgICAgICBubyBsb25nZXIgcHJldmVudCB0aGUgSlZNIGZyb20gZXhpdGluZy4gQnVnIHJlcG9ydGVkIGJ5IFRob21hcyBEdWR6aWFrIGFuZAogICAgICAgICAgICBQYXVsIE5vbGwuCgowOC8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBzbyB0aGV5IHdvcmsKCjA3LzI1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtb3JlIGFkZGl0aW9ucyB0byBzdGQ6OnN0cmluZywgc29tZSB0d2Vha3MgYW5kIHNtYWxsIGJ1ZyBmaXhlcwoJICAgIC1ub2N3cmFwIG1vZGUuCgowNy8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIEJ1Z2ZpeCAjMTUyNjAyMiBwZGF0ZWQgc3RkOjpzdHJpbmcgdG8gc3VwcG9ydCBzdHJpbmdzIHdpdGggJ1wwJyBpbnNpZGUgdGhlbQoJICAgIHVwZGF0ZWQgdHlwZW1hcHMuaSB0byBhZGQgc3VwcG9ydCBmb3IgcG9pbnRlciB0byBwb2ludGVycwoKMDcvMTkvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gQWRkIHN0ZF9zdHJpbmcuaSBzdXBwb3J0LgoJICAgIC0gQWRkIG5ld29iamVjdCBwYXRjaCBzdWJtaXR0ZWQgYnkgbWtvZXBwZSAodGhhbmtzISkKCSAgICAtIEZpeCB0eXBlIG5hbWUgbWlzbWF0Y2ggaXNzdWUgZm9yIG5lc3RlZCB0eXBlIGRlZmluaXRpb25zLgoJICAgICAgc3BlY2lmaWNhbGx5IHR5cGVkZWZzIGluIHRlbXBsYXRlZCBjbGFzcyBkZWZucy4KCjA3LzE4LzIwMDY6IG1nb3NzYWdlCgkgICAgQnVnZml4ICMxNTIyODU4CgkgICAgdXBkYXRlZCBsdWEuY3h4IHRvIHN1cHBvcnQgLWV4dGVybmFsLXJ1bnRpbWUgY29tbWFuZAoKMDcvMTQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgSW5jcmVtZW50IHRoZSBTV0lHX1JVTlRJTUVfVkVSU0lPTiB0byAzLCBiZWNhdXNlIG9mIHRoZQoJICAgIGFkZGl0aW9uIG9mIHRoZSBvd25kYXRhIG1lbWJlciBpbiBzd2lnX3R5cGVfaW5mby4KCSAgICBSZXBvcnRlZCBieTogUHJhYmh1IFJhbWFjaGFuZHJhbgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgU2VhcmNoIHBhdGggZml4ZXM6CiAgICAgICAgICAgIC0gRml4IHNlYXJjaCBwYXRoIGZvciBsaWJyYXJ5IGZpbGVzIHRvIGJlaGF2ZSBhcyBkb2N1bWVudGVkIGluIExpYnJhcnkuaHRtbC4KICAgICAgICAgICAgLSBGaXggbWluZ3cvbXN5cyBidWlsZHMgd2hpY2ggZGlkIG5vdCBmaW5kIHRoZSBTV0lHIGxpYnJhcnkgd2hlbiBpbnN0YWxsZWQuCiAgICAgICAgICAgIC0gV2luZG93cyBidWlsZHMgYWxzbyBvdXRwdXQgdGhlIG1pbmd3L21zeXMgaW5zdGFsbCBsb2NhdGlvbiB3aGVuIHJ1bm5pbmcKICAgICAgICAgICAgICBzd2lnIC1zd2lnbGliLgogICAgICAgICAgICAtIFRoZSBub24tZXhpc3RlbnQgYW5kIHVuZG9jdW1lbnRlZCBjb25maWcgZGlyZWN0b3J5IGluIHRoZSBzZWFyY2ggcGF0aCBoYXMKICAgICAgICAgICAgICBiZWVuIHJlbW92ZWQuCgowNy8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHN5bW5hbWUgc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24uCgowNy8wNC8yMDA2OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBBZGQgJWZlYXR1cmUoImNvbnN0YXN2YXIiKSwgd2hpY2ggaW5zdGVhZCBvZiBleHBvcnRpbmcgYSBjb25zdGFudCBhcyBhCgkgICAgc2NoZW1lIGZ1bmN0aW9uLCBleHBvcnRzIHRoZSBjb25zdGFudCBhcyBhIHNjaGVtZSB2YXJpYWJsZS4gIFVwZGF0ZSB0aGUKCSAgICBkb2N1bWVudGF0aW9uIGFzIHdlbGwuCgowNy8wNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbU2VlIGVudHJ5IG9mIDA5LzEzLzIwMDYgLSBleHBsaWNpdGNhbGwgZmVhdHVyZSBhbmQgZG9jdW1lbnRhdGlvbiB0byBpdCByZW1vdmVkXQogICAgICAgICAgICBOZXcgZXhwbGljaXRjYWxsIGZlYXR1cmUgd2hpY2ggZ2VuZXJhdGVzIGFkZGl0aW9uYWwgd3JhcHBlcnMgZm9yIHZpcnR1YWwgbWV0aG9kcwogICAgICAgICAgICB0aGF0IGNhbGwgdGhlIG1ldGhvZCBleHBsaWNpdGx5LCBub3QgcmVseWluZyBvbiBwb2x5bW9ycGhpc20gdG8gbWFrZSB0aGUgbWV0aG9kCiAgICAgICAgICAgIGNhbGwuIFRoZSBmZWF0dXJlIGlzIGEgZmVhdHVyZSBmbGFnIGFuZCBpcyBlbmFibGVkIGxpa2UgYW55IG90aGVyIGZlYXR1cmUgZmxhZy4KICAgICAgICAgICAgSXQgYWxzbyByZWNvZ25pc2VzIGFuIGF0dHJpYnV0ZSwgInN1ZmZpeCIgZm9yIG1hbmdsaW5nIHRoZSBmZWF0dXJlIG5hbWUsIHNlZQogICAgICAgICAgICBTV0lHUGx1cy5odG1sI1NXSUdQbHVzX2V4cGxpY2l0Y2FsbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBpcyBhbHNvIGEgd29ya2Fyb3VuZCBmb3Igc29sdmluZyB0aGUgcmVjdXJzaXZlIGNhbGxzCiAgICAgICAgICAgIHByb2JsZW0gd2hlbiBhIGRpcmVjdG9yIG1ldGhvZCBtYWtlcyBhIGNhbGwgdG8gYSBiYXNlIGNsYXNzIG1ldGhvZC4gU2VlCiAgICAgICAgICAgIEphdmEuaHRtbCNqYXZhX2RpcmVjdG9yc19leHBsaWNpdGNhbGwgZm9yIHVwZGF0ZWQgZG9jdW1lbnRhdGlvbi4KCjA2LzI4LzIwMDY6IGpvZSAoSm9zZXBoIFdhbmcpCgkgICAgW3JdIEluaXRpYWwgc3VwcG9ydCBmb3IgUgoKMDYvMjAvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCiAgICAgICAgICAgIE1pbm9yIGZpeGVzIHRvIGdldCBhcHBseV9zdHJpbmdzLmkgdGVzdHN1aXRlIHRvIHBhc3MKCSAgICBSZW1vdmUgaW50ZWdlcnNfcnVubWUuc2NtIGZyb20gdGhlIHRlc3RzdWl0ZSwgYmVjYXVzZSBTV0lHIGFuZCBDaGlja2VuIGRvZXMKICAgICAgICAgICAgaGFuZGxlIG92ZXJmbG93cy4KCjA2LzE5LzIwMDU6IG9sbHkKCSAgICBbcGhwXSBBZGQgc3VwcG9ydCBmb3IgZ2VuZXJhdGluZyBQSFA1IGNsYXNzIHdyYXBwZXJzIGZvciBDKysKCSAgICBjbGFzc2VzICh1c2UgInN3aWcgLXBocDUiKS4KCjA2LzE3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBBZGRlZCBzb21lIG1pc3Npbmcga2V5d29yZHMgdG8gdGhlIFBIUDQga2V5d29yZCBsaXN0LCBhbmQKCSAgICBmaXhlZCBfX0xJTkVfXyBhbmQgX19GSUxFX18gd2hpY2ggd2VyZSBpbiB0aGUgd3JvbmcgY2F0ZWdvcnkuCgkgICAgQWxzbyBhZGRlZCBhbGwgdGhlIGtleXdvcmRzIG5ldyBpbiBQSFA1LCBhbmQgYWRkZWQgY29tbWVudHMKCSAgICBub3RpbmcgdGhlIFBIUDQga2V5d29yZHMgd2hpY2ggYXJlbid0IGtleXdvcmRzIGluIFBIUDUuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gRG9uJ3Qgc2VnZmF1bHQgaWYgUEhQIE51bGwgaXMgcGFzc2VkIGFzIHRoaXMgcG9pbnRlciAoZS5nLgoJICAgIENsYXNzX21ldGhvZChOdWxsKSkgLSBnaXZlIGEgUEhQIEVycm9yIGluc3RlYWQuCgowNi8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IGNvbnRhaW5lciBjbGFzcy4KCSAgICBGaXggYSBmZXcgYnVncyBpbiBoZWxwZXIgZnVuY3Rpb25zLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFJlcGxhY2UgSk5JRVhQT1JUIHdpdGggU1dJR0VYUE9SVCwgdGhlcmVieSBlbmFibGluZyB0aGUgcG9zc2liaWxpdHkKICAgICAgICAgICAgb2YgdXNpbmcgZ2NjIC1mdmlzaWJpbGl0eT1oaWRkZW4gZm9yIHBvdGVudGlhbGx5IHNtYWxsZXIgZmFzdGVyIGxvYWRpbmcgd3JhcHBlcnMuCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIE1ha2VmaWxlcyBmb3IgYXV0b2NvbmYtMi42MCBiZXRhCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBWbGFkaW1pciBNZW5zaGFrb3YgcGF0Y2ggZm9yIGNvbXBpbGluZyB3cmFwcGVycyB3aXRoIHB5dGhvbi0yLjUgYWxwaGEuCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVmZmVyIG92ZXJmbG93IGVycm9yIHdoZW4gdXNpbmcgbGFyZ2UgJWZlYXR1cmUoZG9jc3RyaW5nKSByZXBvcnRlZAogICAgICAgICAgICBieSBKb3NlcGggV2luc3Rvbi4KCjA1LzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBPcGVyYXRvciBvdmVybG9hZCBmaXggZnJvbSBEYW5pZWwgTW9vcmUuCgowNS8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBnZW5lcmF0aW9uIG9mIENMT1MgdHlwZSBkZWNsYXJhdGlvbnMgZm9yIHVuaW9ucwoJICAgIGFuZCBlcXVpdmFsZW50IHR5cGVzLgoKMDUvMjQvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIERvbid0IHJlcXVpcmUgYSBmdWxsIGNsYXNzIGRlZmluaXRpb24gdG8gZ2VuZXJhdGUgYSBDTE9TIHdyYXBwZXIuCgowNS8yMC8yMDA2OiBvbGx5CgkgICAgW3BocF0gR0NDIFZpc2liaWxpdHkgc3VwcG9ydCBub3cgd29ya3Mgd2l0aCBQSFAuCgowNS8xOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVtb3ZlZCBzdXBwb3J0IGZvciAtZGxuYW1lICh1c2UgLW1vZHVsZSBpbnN0ZWFkKS4gIEZpeGVkCgkgICAgbmFtaW5nIG9mIFBIUCBleHRlbnNpb24gbW9kdWxlIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCBQSFAKCSAgICBjb252ZW50aW9ucyAobm8gInBocF8iIHByZWZpeCBvbiBVbml4OyBvbiBQSFAgPj0gNC4zLjAsIGhhbmRsZSBVbml4CgkgICAgcGxhdGZvcm1zIHdoaWNoIHVzZSBzb21ldGhpbmcgb3RoZXIgdGhhbiAiLnNvIiBhcyB0aGUgZXh0ZW5zaW9uLikKCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3Igc3VwcG9ydCBhZGRlZAoKMDUvMDcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCB3aGVyZSBhIEMrKyByZWZlcmVuY2UKCSAgICBpcyB3YW50ZWQuCgowNS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4IHdyYXBwZXJzIGdlbmVyYXRlZCBmb3IgZ2xvYmFsICdjaGFyJyB2YXJpYWJsZXMgdG8gbm90CgkgICAgaW5jbHVkZSBhIHRlcm1pbmF0aW5nIHplcm8gYnl0ZSBpbiB0aGUgUEhQIHN0cmluZy4KCjA1LzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmeSB0eXBlbWFwcyBzbyB0aGF0IGNoYXIgKiBjYW4gYmUgYXBwbGllZCB0byB1bnNpZ25lZCBjaGFyICogb3Igc2lnbmVkIGNoYXIgKgogICAgICAgICAgICB0eXBlcyBhbmQgdmlzYSB2ZXJzYS4KCjA1LzAzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXVRoYW5rcyB0byBMdWtlIEogQ3Jvb2sgZm9yIHRoaXMgaWRlYS4KICAgICAgICAgICAgIC0gYSBzdHJ1Y3QvZW51bS91bmlvbiBpcyByZXBsYWNlZCB3aXRoIDpwb2ludGVyIG9ubHkgaWYKICAgICAgICAgICAgICAgdGhhdCBzbG90IGlzIGFjdHVhbGx5IGEgcG9pbnRlciB0byB0aGF0IHR5cGUuIFNvLDogCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFfc3RydWN0IHsgaW50IHg7IH0gYW5kCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJfc3RydWN0IHsgYV9zdHJ1Y3Qgc3RydWN0XzE7IH07IAogICAgICAgICAgICAgICB3aWxsIGJlIGNvbnZlcnRlZCBhczoKICAgICAgICAgICAgICAgICAgIChjZmZpOmRlZmNzdHJ1Y3QgYl9zdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdF8xIGFfc3RydWN0KSkKICAgICAgICAgICAgIC0gT3RoZXIgbWlub3IgZml4ZXMgaW4gbGlzcGlmeWluZyBuYW1lcy4KCjA1LzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBwb3NzaWJsZSByZWRlZmluaXRpb24gb2YgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIGZvciBWQysrLgoKMDQvMTQvMjAwNjogZWZ1enp5b25lCgkgICAgW2NmZmldCiAgICAgICAgICAgIFRoYW5rcyB0byBUaG9tYXMgV2VpZG5lciBmb3IgdGhlIHBhdGNoLgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBleHBvcnQgaXMgc2V0IChleHBvcnQgJ2ZvbykgaXMgCiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBldmVyeSBzeW1ib2wKICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW5saW5lIGlzIHNldCAoZGVjbGFpbSAoaW5saW5lIGZvbykpIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBiZWZvcmUgZXZlcnkgZnVuY3Rpb24gZGVmaW5pdGlvbgogICAgICAgICAgICAtIHdoZW4gZmVhdHVyZSBpbnRlcm5fZnVuY3Rpb24gaXMgc2V0IAogICAgICAgICAgICAgICMuKHZhbHVlLW9mLWludGVybi1mdW5jdGlvbiAibmFtZSIgIm5vZGVUeXBlIiBwYWNrYWdlKQogICAgICAgICAgICAgIGlzIGVtaXR0ZWQgaW5zdGVhZCBvZiB0aGUgcGxhaW4gc3ltYm9sLiBBIHNhbXBsZSBzd2lnLWxpc3BpZnkgCiAgICAgICAgICAgICAgaXMgcHJvdmlkZWQuCiAgICAgICAgICAgIC0gZXZlcnkgc3ltYm9sIGlzIHByZWZpeGVkIGJ5IGl0J3MgcGFja2FnZS4KCjA0LzEzLzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQoJICAgIEZpeGVkIHRoZSBnZW5lcmF0aW9uIG9mIHdyYXBwZXJzIGZvciBnbG9iYWwgdmFyaWFibGVzLiAKICAgICAgICAgICAgQWRkZWQgdGhlIG9wdGlvbiBbbm9dc3dpZy1saXNwIHdoaWNoIHR1cm5zIG9uL29mZiBnZW5lcmF0aW9uIAogICAgICAgICAgICBvZiBjb2RlIGZvciBzd2lnIGhlbHBlciBsaXNwIG1hY3JvLCBmdW5jdGlvbnMsIGV0Yy4KClZlcnNpb24gMS4zLjI5IChNYXJjaCAyMSwgMjAwNikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDQvMDUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBvdXRwdXQgdHlwZW1hcCBvZiBjaGFyIHNvIGl0IHByb2R1Y2VzIGEgY2hhcmFjdGVyIGluc3RlYWQKCSAgICBvZiBhbiBpbnRlZ2VyLiBBbHNvIGFkZHMgaW5wdXQvb3V0cHV0IHR5cGVtYXBzIGZvciAnY2hhciAqJy4KCgkgICAgYWRkIGNvbW1hbmQtbGluZSBhcmd1bWVudCAtaXNvbGF0ZSB0byBnZW5lcmF0ZSBhbiBpbnRlcmZhY2UKCSAgICBmaWxlIHRoYXQgd29uJ3QgaW50ZXJmZXJlIHdpdGggb3RoZXIgU1dJRyBnZW5lcmF0ZWQgZmlsZXMgdGhhdAoJICAgIG1heSBiZSB1c2VkIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLgoKMDMvMjAvMjAwNTogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIE1vcmUgdHdlYWtzIHRvIElOUFVUL09VVFBVVCB0eXBlbWFwcyBmb3IgYm9vbC4KCgkgICAgRml4IGNvbnN0YW50V3JhcHBlciBmb3IgY2hhciBhbmQgc3RyaW5nIGxpdGVyYWxzLgoKCSAgICBmaW5kLWRlZmluaXRpb24ga2V5YmluZGluZ3Mgc2hvdWxkIHdvcmsgaW4gRUxJL1NMSU1FLgoJICAgIE91dHB1dCAoaW4tcGFja2FnZSA8bW9kdWxlLW5hbWU+KSB0byBsaXNwIHdyYXBwZXIKCSAgICBpbnN0ZWFkIG9mIChpbi1wYWNrYWdlICMuKnN3aWctbW9kdWxlLW5hbWUqKS4KCgkgICAgc2xpZ2h0IHJld29yayBvZiBtdWx0aXBsZSByZXR1cm4gdmFsdWVzLgoKCSAgICBkb2MgdXBkYXRlcy4KCjAzLzE3LzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBtYW5nbGUgbmFtZXMgb2YgY29uc3RhbnRzIGdlbmVyYXRlZCB2aWEgY29uc3RhbnRXcmFwcGVyLgoJICAgIAoJICAgIFdoZW4gdXNpbmcgT1VUUFVUIHR5cGVtYXBzIGFuZCB0aGUgZnVuY3Rpb24gaGFzIGEgbm9uLXZvaWQKCSAgICByZXR1cm4gdmFsdWUsIGl0IHNob3VsZCBiZSBmaXJzdCBpbiB0aGUgdmFsdWVzLWxpc3QsIGZvbGxvd2VkCgkgICAgYnkgdGhlIE9VVFBVVCBtYXBwZWQgdmFsdWVzLgoKCSAgICBGaXggYnVnIHdpdGggYm9vbGVhbiBwYXJhbWV0ZXJzLCB3aGljaCBuZWVkZWQgdG8gYmUKCSAgICBwYXNzZWQgaW4gYXMgaW50IHZhbHVlcywgcmF0aGVyIHRoYW4gVCBvciBOSUwuCgowMy8xNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgR2VuZXJhdGUgd3JhcHBlcnMgZm9yIGNvbnN0YW50cyB3aGVuIGluIEMrKyBvciAtY3dyYXAgbW9kZS4KCSAgICBNYWtlIC1jd3JhcCB0aGUgZGVmYXVsdCwgc2luY2UgaXQgaXMgbW9zdCBjb3JyZWN0LiBVc2VycwoJICAgIGNhbiB1c2UgdGhlIC1ub2N3cmFwIG9wdGlvbiB0byBhdm9pZCB0aGUgY3JlYXRpb24gb2YgYSAuY3h4CgkgICAgZmlsZSB3aGVuIGludGVyZmFjaW5nIHRvIEMgY29kZS4KCgkgICAgV2hlbiBpbiAtbm9jd3JhcCBtb2RlLCBpbXByb3ZlIHRoZSBoYW5kbGluZyBvZiBjb252ZXJ0aW5nCiAJICAgIGluZml4IGxpdGVyYWxzIHRvIHByZWZpeCBub3RhdGlvbiBmb3IgbGlzcC4gVGhpcyBpcyB2ZXJ5CgkgICAgYmFzaWMgYW5kIG5vdCBsaWtlbHkgdG8gYmUgaW1wcm92ZWQgdXBvbiBzaW5jZSB0aGlzIG9ubHkKCSAgICBhcHBsaWVzIHRvIHRoZSAtbm9jd3JhcCBjYXNlLiBMaXRlcmFscyB3ZSBjYW4ndCBmaWd1cmUgb3V0CgkgICAgd2lsbCByZXN1bHQgaW4gYSB3YXJuaW5nIGFuZCBiZSBpbmNsdWRlZCBpbiB0aGUgZ2VuZXJhdGVkCgkgICAgY29kZS4KCgkgICAgdmFsaWRJZGVudGlmaWVyIG5vdyBtb3JlIGNsb3NlbHkgYXBwcm94aW1hdGVzIHdoYXQgbWF5IGJlCgkgICAgYSBsZWdhbCBjb21tb24gbGlzcCBzeW1ib2wuCgoJICAgIEZpeCB0eXBlbWFwIGVycm9yIGluIGFsbGVncm9jbC5zd2cKCSAgICAKMDMvMTIvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIGZpeCB1cCBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgkgICAgR2VuZXJhdGUgYysrIHN0eWxlIHdyYXBwZXIgZnVuY3Rpb25zIGZvciBzdHJ1Y3QvdW5pb24gbWVtYmVycwoJICAgIHdoZW4gLWN3cmFwIG9wdGlvbiBzcGVjaWZpZWQuCgowMy8xMC8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGJ1ZyBpbiBDIHdyYXBwZXIgZ2VuZXJhdGlvbiBpbnRyb2R1Y2VkIGJ5IGxhc3QgYWxsZWdyb2NsCgkgICAgY29tbWl0LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIENvbW1pdCAjMTQ0NzMzNyAtIERlbGV0ZSBMb2NhbFJlZnMgYXQgdGhlIGVuZCBvZiBkaXJlY3RvciBtZXRob2RzIHRvIGZpeCBwb3RlbnRpYWwgbGVhawoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNDQ0OTQ5IC0gY29uZmlndXJlIGRvZXMgbm90IGhvbm9yIC0tcHJvZ3JhbS1wcmVmaXguCiAgICAgICAgICAgIFJlbW92ZWQgbm9uLXN0YW5kYXJkIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4LiBGaXggdGhlIGF1dG9jb25mIHN0YW5kYXJkCiAgICAgICAgICAgIG9wdGlvbnMgLS1wcm9ncmFtLXByZWZpeCBhbmQgLS1wcm9ncmFtLXN1ZmZpeCB3aGljaCB3ZXJlIGJlaW5nIHNob3duIGluIHRoZSBoZWxwLAogICAgICAgICAgICBidXQgd2VyZSBiZWluZyBpZ25vcmVkLiBVc2UgLS1wcm9ncmFtLXN1ZmZpeCBpbnN0ZWFkIG9mIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBub3cuCgowMy8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgRml4ICMxNDQ2MzE5IHdpdGggcGF0Y2ggZnJvbSBhbmRyZWFzdGggLSBtb3JlIHRoYW4gb25lIHdzdHJpbmcgcGFyYW1ldGVyIGluIGRpcmVjdG9yIG1ldGhvZHMKCjAzLzA3LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGVdIAoJICAgIEZpeCBmb3IgbW9kdWxlIG5hbWVzIGNvbnRhaW5pbmcgYSAiLSIgaW4gbm9uLSJzaGFkb3ciIG1vZGUuCgkgICAgUGF0Y2ggZnJvbSBBYXJvbiBWYW5EZXZlbmRlciAoIzE0NDE0NzQpLgoKMDMvMDQvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgLU8gdG8gdGhlIG1haW4gcHJvZ3JhbSwgd2hpY2ggbm93IGVuYWJsZXMgLWZhc3RkaXNwYXRjaAoJICAgIAoJICAgIFtQeXRob25dCgoJICAgIC0gQWRkIHRoZSAtZmFzdGluaXQgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgX19pbml0X18KICAgICAgICAgICAgICBtZXRob2RzLiBTZXR0aW5nICd0aGlzJyBhcyAnc2VsZi50aGlzLmFwcGVuZCh0aGlzKScgaW4gdGhlIHB5dGhvbgoJICAgICAgY29kZSBjb25mdXNlcyBQeUx1Y2VuZS4gTm93IHRoZSBpbml0aWFsaXphdGlvbiBpcyBkb25lIGluIHRoZQoJICAgICAgdGhlIEMrKyBzaWRlLCBhcyByZXBvcnRlZCBieSBBbmRpIGFuZCBSb2Jpbi4KCgkgICAgLSBBZGQgdGhlIC1mYXN0cXVlcnkgb3B0aW9uIHRvIGVuYWJsZSBmYXN0ZXIgU1dJR19UeXBlUXVlcnkgdmlhIGEKICAgICAgICAgICAgICBweXRob24gZGljdCBjYWNoZSwgYXMgcHJvcG9zZWQgYnkgQW5kaSBWYWpkYQoKCSAgICAtIEF2b2lkIHRvIGNhbGwgUHlPYmplY3RfR2V0QXR0ciBpbnNpZGUgU1dJR19QeXRob25fR2V0U3dpZ1RoaXMsCgkgICAgICBzaW5jZSB0aGlzIGNvbmZ1c2VzIFB5THVjZW5lLCBhcyByZXBvcnRlZCBieSBBbmRpIFZhamRhLgoJICAgIAowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0KICAgICAgICAgICAgUmVtb3ZlZCBleHRyYSAodm9pZCAqKSBjYXN0IHdoZW4gY2FzdGluZyBwb2ludGVycyB0byBhbmQgZnJvbSBqbG9uZyBhcyB0aGlzCiAgICAgICAgICAgIHdhcyBzdXBwcmVzc2luZyBnY2MncyAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5nLiBUaGlzIHdhcm5pbmcgY291bGQgYmUgaWdub3JlZCBpbiB2ZXJzaW9ucyBvZiBnY2MgcHJpb3IgdG8gNC4wLCBidXQgbm93IHRoZQogICAgICAgICAgICB3YXJuaW5nIGlzIHVzZWZ1bCBhcyBnY2MgLU8yIGFuZCBoaWdoZXIgb3B0aW1pc2F0aW9uIGxldmVscyBpbmNsdWRlcyAtZnN0cmljdC1hbGlhc2luZyB3aGljaAogICAgICAgICAgICBnZW5lcmF0ZXMgY29kZSB0aGF0IGRvZXNuJ3Qgd29yayB3aXRoIHRoZXNlIGNhc3RzLiBUaGUgYXNzaWdubWVudCBpcyBzaW1wbHkgbmV2ZXIgbWFkZS4KICAgICAgICAgICAgUGxlYXNlIHVzZSAtZm5vLXN0cmljdC1hbGlhc2luZyB0byBib3RoIHN1cHByZXNzIHRoZSB3YXJuaW5nIGFuZCBmaXggdGhlIGJhZCBhc3NlbWJseQogICAgICAgICAgICBjb2RlIGdlbmVyYXRlZC4gTm90ZSB0aGF0IHRoZSB3YXJuaW5nIGlzIG9ubHkgZ2VuZXJhdGVkIGJ5IHRoZSBDIGNvbXBpbGVyLCBidXQgbm90CiAgICAgICAgICAgIHRoZSBDKysgY29tcGlsZXIsIHlldCB0aGUgQysrIGNvbXBpbGVyIHdpbGwgYWxzbyBnZW5lcmF0ZSBicm9rZW4gY29kZS4gQWx0ZXJuYXRpdmVseSB1c2UgCiAgICAgICAgICAgIC1Xbm8tc3RyaWN0LWFsaWFzaW5nIHRvIHN1cHByZXNzIHRoZSB3YXJuaW5nIGZvciBnY2MtMy54LiBUaGUgdHlwZW1hcHMgYWZmZWN0ZWQKICAgICAgICAgICAgYXJlIHRoZSAiaW4iIGFuZCAib3V0IiB0eXBlbWFwcyBpbiBqYXZhLnN3ZyBhbmQgYXJyYXlzX2phdmEuc3dnLiBVc2VycyBvdWdodCB0byBmaXgKICAgICAgICAgICAgdGhlaXIgb3duIHR5cGVtYXBzIHRvIGRvIHRoZSBzYW1lLiBOb3RlIHRoYXQgcmVtb3ZhbCBvZiB0aGUgdm9pZCAqIGNhc3Qgc2ltcGx5IHByZXZlbnRzCiAgICAgICAgICAgIHN1cHByZXNzaW9uIG9mIHRoZSB3YXJuaW5nIGZvciB0aGUgQyBjb21waWxlciBhbmQgbm90aGluZyBlbHNlLiBUeXBpY2FsIGNoYW5nZToKCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogJXsgJDEgPSAqKCQmMV9sdHlwZSkodm9pZCAqKSYkaW5wdXQ7ICV9CiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpJiRpbnB1dDsgJX0KCiAgICAgICAgICAgIEZyb206CiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBTV0lHVFlQRSAqICV7ICooJCYxX2x0eXBlKSh2b2lkICopJiRyZXN1bHQgPSAkMTsgJX0gCiAgICAgICAgICAgIFRvOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkmJHJlc3VsdCA9ICQxOyAlfSAKCjAzLzAyLzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0KCSAgICBBZGQgdHlwZW1hcHMgZm9yICJsb25nIGxvbmciOyB3aGV0aGVyIHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcywgaG93ZXZlciwgZGVwZW5kcwoJICAgIG9uIHRoZSB2ZXJzaW9uIGFuZCBjb25maWd1cmF0aW9uIG9mIEd1aWxlLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgaW5uZXIgZXhjZXB0aW9ucy4gSWYgYW55IG9mIHRoZSBkZWxlZ2F0ZXMgYXJlIGNhbGxlZCB3aGljaCBjb25zdHJ1Y3QKICAgICAgICAgICAgYSBwZW5kaW5nIGV4Y2VwdGlvbiBhbmQgdGhlcmUgaXMgYWxyZWFkeSBhIHBlbmRpbmcgZXhjZXB0aW9uLCBpdCB3aWxsIGNyZWF0ZSB0aGUgbmV3CiAgICAgICAgICAgIGV4Y2VwdGlvbiB3aXRoIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBhcyBhbiBpbm5lciBleGNlcHRpb24uCgowMy8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBQaHA1IGV4Y2VwdGlvbnMgaWYgY29tcGlsaW5nIGFnYWluc3QgUGhwNSAocGF0Y2ggZnJvbSBPbGx5IEJldHRzKS4KCjAzLzAxLzIwMDY6IG1tYXR1cwoJICAgIFVzZSB0aGUgR0NDIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIFNXSUdFWFBPUlQuCgoJICAgIE5vdyB5b3UgY2FuIGNvbXBpbGUgKHdpdGggZ2NjIDMuNCBvciBsYXRlcikgdXNpbmcKCSAgICBDRkxBR1M9Ii1mdmlzaWJpbGl0eT1oaWRkZW4iLgoJICAgIAoJICAgIENoZWNrIHRoZSBkaWZmZXJlbmNlIGZvciB0aGUgJ3N0ZF9jb250YWluZXJzLmknIHB5dGhvbiAKCSAgICB0ZXN0IGNhc2U6CiAKICAgICAgICAgICAgU2l6ZXM6CgoJICAgICAgMzMwNTQzMiBfc3RkX2NvbnRhaW5lcnMuc28KCSAgICAgIDIzODM5OTIgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBFeHBvcnRlZCBzeW1ib2xzIChubSAtRCA8ZmlsZT4uc28gfCB3YyAtbCk6CgogICAgICAgICAgICAgIDYxNDYgX3N0ZF9jb250YWluZXJzLnNvIAogICAgICAgICAgICAgIDE3NCAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbiAKCgkgICAgRXhlY3V0aW9uIHRpbWVzOgoKCSAgICAgIHJlYWwgMG0wLjA1MHMgdXNlciAwbTAuMDM5cyBzeXMgMG0wLjAwNXMgICBfc3RkX2NvbnRhaW5lcnMuc28KICAgICAgICAgICAgICByZWFsIDBtMC4wMzlzIHVzZXIgMG0wLjAyNnMgc3lzIDBtMC4wMDdzICAgX3N0ZF9jb250YWluZXJzLnNvLmhpZGRlbgoKCSAgICBSZWFkIGh0dHA6Ly9nY2MuZ251Lm9yZy93aWtpL1Zpc2liaWxpdHkgZm9yIG1vcmUgZGV0YWlscy4KCgowMi8yNy8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgQWRkIHN1cHBvcnQgZm9yIElOUFVULCBPVVRQVVQsIGFuZCBJTk9VVCB0eXBlbWFwcy4KCSAgICBGb3IgT1VUUFVUIHZhcmlhYmxlcywgdGhlIGxpc3Agd3JhcHBlciByZXR1cm5zIG11bHRpcGxlCgkgICAgdmFsdWVzLgoKMDIvMjYvMjAwNjogbW1hdHVzCgoJICAgIFtSdWJ5XSBhZGQgYXJnY2FyZ3YuaSBsaWJyYXJ5IGZpbGUuCgkgICAgCgkgICAgVXNlIGl0IGFzIGZvbGxvdzoKCgkJJWluY2x1ZGUgYXJnY2FyZ3YuaQoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlYXBwbHkgKGludCBBUkdDLCBjaGFyICoqQVJHVikgeyAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSB9IAoJICAgICAgCQkJCQkJCQkJIAogICAJICAgICAgICAlaW5saW5lIHsJCQkJCiAgIAkgICAgICAgICAgaW50IG1haW5BcHAoc2l6ZV90IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KSAJCiAgIAkgICAgICAgICAgewkJCQkJCQogICAJICAgICAgICAgICAgcmV0dXJuIGFyZ2M7CQkJCQkKICAgCSAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CQkJCQkJCQoJICAgICAgCQkJCQkJCQogICAJICAgIHRoZW4gaW4gdGhlIHJ1Ynkgc2lkZToJCQkJCQoJICAgICAgCQkJCQkJCQkKICAgCSAgICAgICAgYXJncyA9IFsiYXNkZiIsICJhc2RmMiJdCQkJCQogICAJICAgICAgICBuID0gbWFpbkFwcChhcmdzKTsKCQoKCSAgICBUaGlzIGlzIHRoZSBzaW1pbGFyIHRvIHRoZSBweXRob24gdmVyc2lvbiBMaWIvcHl0aG9uL2FyZ2Nhcmd2LmkKCjAyLzI0LzIwMDY6IG1nb3NzYWdlCgoJICAgIFNtYWxsIHVwZGF0ZSBMdWEgZG9jdW1lbnRzIG9uIHRyb3VibGVzaG9vdGluZyBwcm9ibGVtcwoJICAgIAowMi8yMi8yMDA2OiBtbWF0dXMgCgoJICAgIEZpeCBhbGwgdGhlIGVycm9ycyByZXBvcnRlZCBmb3IgMS4zLjI4LgoJICAgIC0gZml4IGJ1ZyAjMTE1ODE3OAoJICAgIC0gZml4IGJ1ZyAjMTA2MDc4OQoJICAgIC0gZml4IGJ1ZyAjMTI2MzQ1NwoJICAgIC0gZml4ICdjb25zdCAgY2hhciomJyB0eXBlbWFwIGluIHRoZSBVVEwsIHJlcG9ydGVkIGJ5IEdlb2ZmIEh1dGNoaXNvbgoJICAgIC0gZml4ZXMgZm9yIHB5dGhvbiAyLjEgYW5kIHRoZSBydW50aW1lIGxpYnJhcnkKCSAgICAtIGZpeCBjb3B5Y3RvciArIHRlbXBsYXRlIGJ1ZyAjMTQzMjEyNQoJICAgIC0gZml4IFsgMTQzMjE1MiBdICVyZW5hbWUgZnJpZW5kIG9wZXJhdG9ycyBpbiBuYW1lc3BhY2UKCSAgICAtIGZpeCBnY2Mgd2FybmluZyByZXBvcnRlZCBieSBSLiBCZXJuc3RlaW4KCSAgICAtIGF2b2lkIGFzc2VydCB3aGVuIGZpbmRpbmcgYSByZWN1cnNpdmUgc2NvcGUgaW5oZXJpdGFuY2UsCgkgICAgICBlbWl0IGEgd2FybmluZyBpbiB0aGUgd29yc3QgY2FzZSwgcmVwb3J0ZWQgYnkgTml0cm8gCgkgICAgLSBmaXggcHJlbWF0dXJlIG9iamVjdCBkZWxldGlvbiByZXBvcnRlZCBieSBQYXVsIGluIHRjbDNkCgkgICAgLSBmaXggd2FybmluZyByZXBvcnRlZCBieSBOaXRybyBpbiBWQzcKCSAgICAtIG1vcmUgZml4ZXMgZm9yIG9sZCBTb2xhcmlzIGNvbXBpbGVyCgkgICAgLSBmaXggZm9yIHB5dGhvbiAyLjMgYW5kIGdjX3JlZnMgaXNzdWUgcmVwb3J0ZWQgYnkgTHVpZ2kKCSAgICAtIGZpeCBmYXN0cHJveHkgZm9yIG1ldGhvZHMgdXNpbmcga3dhcmdzCgkgICAgLSBmaXggb3ZlcmxvYWQgKyBwcm90ZWN0ZWQgbWVtYmVyIGlzc3VlIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggc2V0ZXJyb3Jtc2cgYXMgcmVwb3J0ZWQgYnkgQ29saW4gTWNEb25hbGQKCSAgICAtIGZpeCBkaXJlY3RvcnMsIG5vdyB0aGUgdGVzdC1zdWl0ZSBydW5zIGFnYWluIHVzaW5nIC1kaXJlY3RvcnMKCSAgICAtIGZpeCBmb3IgZnJpZW5kIG9wZXJhdG9yIGFuZCBWaXN1YWwgc3R1ZGlvIGFuZCBidWcgMTQzMjE1MgoJICAgIC0gZml4IGJ1ZyAjMTQzNTA5MAoJICAgIC0gZml4IHVzaW5nICsgJWV4dGVuZCBhcyByZXBvcnRlZCBieSBXaWxsaWFtCgkgICAgLSBmaXggYnVnICMxMDk0OTY0CgkgICAgLSBmaXggZm9yIFB5X05vdEltcGxlbWVudGVkIGFzIHJlcG9ydGVkIGJ5IE9sbHkgYW5kIEFtYXVyeQoJICAgIC0gZml4IG5lc3RlZCBuYW1lc3BhY2UgaXNzdWUgcmVwb3J0ZWQgYnkgQ2hhcmxpZQoKCSAgICBhbmQgYWxzbzoKCSAgICAKCSAgICAtIGFsbG93IGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzIGJ5IGRlZmF1bHQKCSAgICAtIGRlbGV0ZSBleHRyYSBuZXcgbGluZXMgaW4gc3dpZ21hY3Jvc1tVVExdCgkgICAgLSBjb3NtZXRpYyBmb3IgZ2VuZXJhdGVkIHB5dGhvbiBjb2RlCgkgICAgLSBhZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBVVEwKCSAgICAtIGFkZCBzd2lncmVnaXN0ZXIgcHJveHkgbWV0aG9kIGFuZCBtb3ZlIF9fcmVwcl9fIHRvIGEKCSAgICAgIHNpbmdsZSBnbG9iYWwgbW9kdWxlICBbcHl0aG9uXQoKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBXaGVuIHVzaW5nIGRpcmVjdG9ycywgbm93IHN3aWcgd2lsbCBlbWl0IGFsbCB0aGUgdmlydHVhbAoJICAgIHByb3RlY3RlZCBtZXRob2RzIGJ5IGRlZmF1bHQuIAoKCSAgICBJbiBwcmV2aW91cyByZWxlYXNlcywgeW91IG5lZWRlZCB0byB1c2UgdGhlICdkaXJwcm90JwoJICAgIG9wdGlvbiB0byBhY2hpZXZlIHRoZSBzYW1lLgoKCSAgICBJZiB5b3Ugd2FudCwgeW91IGNhbiBkaXNhYmxlIHRoZSBuZXcgZGVmYXVsdCBiZWhhdmlvdXIsCgkgICAgdXNlIHRoZSAnbm9kaXJwcm90JyBvcHRpb246IAoKCSAgICAgICBzd2lnIC1ub2RpcnByb3QgLi4uCgoJICAgIGFuZC9vciB0aGUgJW5vZGlyZWN0b3IgZmVhdHVyZSBmb3Igc3BlY2lmaWMgbWV0aG9kcywgaS5lLjoKCgkgICAgICAgJW5vZGlyZWN0b3IgRm9vOjpiYXI7CgoJICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgICAgdmlydHVhbCB+Rm9vKCk7CgoJICAgICAgIHByb3RlY3RlZDoKCSAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIoKTsKCSAgICAgICB9OwoJICAgIAoKCSAgICBBcyBiZWZvcmUsIHB1cmUgYWJzdHJhY3QgcHJvdGVjdGVkIG1lbWJlcnMgYXJlIGFsbHdheXMKCSAgICBlbWl0dGVkLCBpbmRlcGVuZGVudCBvZiB0aGUgJ2RpcnByb3Qvbm9kaXJwcm90JyBvcHRpb25zLgoKCjAyLzIyLzIwMDY6IG1tYXR1cwoJICAgIEFkZCB0aGUgZmFjdG9yeS5pIGxpYnJhcnkgZm9yIGxhbmd1YWdlcyB1c2luZyB0aGUgVVRMIChweXRob24sdGNsLHJ1YnkscGVybCkuCgkgICAgCiAgICAgICAgICAgIGZhY3RvcnkuaSBpbXBsZW1lbnRzIGEgbW9yZSBuYXR1cmFsIHdyYXAgZm9yIGZhY3RvcnkgbWV0aG9kcy4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZToJCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgLS0tLSAgZ2VvbWV0cnkuaCAtLS0tLS0tLQkJCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgR2VvbWV0cnkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZW51bSBHZW9tVHlwZXsJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgICAgIFBPSU5ULAkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgICAgQ0lSQ0xFCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgfkdlb21ldHJ5KCkge30gICAgCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIHZpcnR1YWwgaW50IGRyYXcoKSA9IDA7CQkJCSAgICAKICAJICAgIAkgCQkJCQkJCSAgICAKICAJICAgIAkgLy8JCQkJCQkJICAgIAogIAkgICAgCSAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgICBzdGF0aWMgR2VvbWV0cnkgKmNyZWF0ZShHZW9tVHlwZSBpKTsgICAgIAkJICAgIAogIAkgICAgICAgICB9OwkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkgICAgIAkJCSAgICAKICAJICAgICAgICAgc3RydWN0IFBvaW50IDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAxOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSB3aWR0aCgpIHsgcmV0dXJuIDEuMDsgfSAgICAJICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBDaXJjbGUgOiBHZW9tZXRyeSAgewkJICAgICAJCSAgICAKICAJICAgICAgICAgICBpbnQgZHJhdygpIHsgcmV0dXJuIDI7IH0JCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZG91YmxlIHJhZGl1cygpIHsgcmV0dXJuIDEuNTsgfSAgICAgICAgICAJCSAgICAKICAJICAgICAgICAgfTsgCQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8JCQkJCQkJICAgIAogIAkgICAgICAgICAvLyBGYWN0b3J5IG1ldGhvZCBmb3IgYWxsIHRoZSBHZW9tZXRyeSBvYmplY3RzCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgR2VvbWV0cnkgKkdlb21ldHJ5OjpjcmVhdGUoR2VvbVR5cGUgdHlwZSkgewkJICAgIAogIAkgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgY2FzZSBQT0lOVDogcmV0dXJuIG5ldyBQb2ludCgpOwkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgQ0lSQ0xFOiByZXR1cm4gbmV3IENpcmNsZSgpOyAJICAgICAJCSAgICAKICAJICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gMDsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH0JCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH0JCQkJCSAgICAJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKCSAgICBZb3UgY2FuIHVzZSB0aGUgJWZhY3Rvcnkgd2l0aCB0aGUgR2VvbWV0cnk6OmNyZWF0ZSBtZXRob2QgYXMgZm9sbG93czoKCSAgICAJCQkJCQkJCSAgICAKICAJICAgICAgJW5ld29iamVjdCBHZW9tZXRyeTo6Y3JlYXRlOwkJCQkgICAgCiAgCSAgICAgICVmYWN0b3J5KEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlLCBQb2ludCwgQ2lyY2xlKTsJICAgIAogIAkgICAgICAlaW5jbHVkZSAiZ2VvbWV0cnkuaCIJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIGFuZCBHZW9tZXRyeTo6Y3JlYXRlIHdpbGwgcmV0dXJuIGEgJ1BvaW50JyBvciAnQ2lyY2xlJyBpbnN0YW5jZSAgIAogIAkgICAgaW5zdGVhZCBvZiB0aGUgcGxhaW4gJ0dlb21ldHJ5JyB0eXBlLiBGb3IgZXhhbXBsZSwgaW4gcHl0aG9uOgkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgIGNpcmNsZSA9IEdlb21ldHJ5LmNyZWF0ZShHZW9tZXRyeS5DSVJDTEUpCQkJICAgIAogIAkgICAgICByID0gY2lyY2xlLnJhZGl1cygpCQkJCQkJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgd2hlcmUgJ2NpcmNsZScgbm93IGlzIGEgQ2lyY2xlIHByb3h5IGluc3RhbmNlLgkgICAgCQkgICAgCgoKMDIvMTcvMjAwNjogbWtvZXBwZQoJICAgIFtNelNjaGVtZV0gVHlwZW1hcHMgZm9yIGFsbCBpbnRlZ3JhbCB0eXBlcyBub3cgYWNjZXB0IHRoZSBmdWxsIHJhbmdlIG9mIGludGVncmFsCgkgICAgdmFsdWVzLCBhbmQgdGhleSBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIGlzIHBhc3NlZC4KCSAgICBbR3VpbGVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IHNpZ25hbCBhbiBlcnJvciB3aGVuIGEgdmFsdWUgb3V0c2lkZQoJICAgIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgowMi8xMy8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbRG9jdW1lbnRzXSB1cGRhdGVkIHRoZSBleHRlbmRpbmcgZG9jdW1lbnRzIHRvIGdpdmUgYSBza2VsZXRvbiBzd2lnZ2luZyBjb2RlCiAgICAgICAgICAgIHdpdGggYSBmZXcgdHlwZW1hcHMuCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIGFuIGV4dHJhIHR5cGVtYXAgZm9yIHZvaWQqIFtpbl0sIHNvIGEgZnVuY3Rpb24gd2hpY2ggcmVxdWlyZXMgYSB2b2lkKgogICAgICAgICAgICBjYW4gdGFrZSBhbnkga2luZCBvZiBwb2ludGVyCgpWZXJzaW9uIDEuMy4yOCAoRmVicnVhcnkgMTIsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAyLzExLzIwMDY6IG1tYXR1cwoJICAgIEZpeCBtYW55IGlzc3VlcyB3aXRoIGxpbmUgY291bnRpbmcgYW5kIGVycm9yIHJlcG9ydHMuCgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBCZXR0ZXIgc3RhdGljIGRhdGEgbWVtYmVyIHN1cHBvcnQsIGlmIHlvdSBoYXZlCgkgICAgCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXI7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgdGhlbiBub3cgaXMgdmFsaWQgdG8gYWNjZXNzIHRoZSBzdGF0aWMgZGF0YSBtZW1iZXIsIGllOgoKICAgICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgICAgZi5iYXIgPSAzCgoJICAgIGp1c3QgYXMgaW4gQysrLgoKCjAyLzExLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gdG8gd29yayBhZ2FpbiB3aXRoIG9sZCB2ZXJzaW9ucyBvZiBQZXJsCiAgICAgICAgICAgICg1LjAwNCBhbmQgbGF0ZXIgdGVzdGVkKQoKMDIvMDQvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoKSBkaXJlY3RpdmUgdG8gZXh0ZW5kCgkgICAgU1dJRyBzbWFydCBwb2ludGVyIHN1cHBvcnQgaW4gcHl0aG9uLiAKCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc21hcnQgcG9pbnRlciBhczoKCSAgICAKCSAgICAgIHRlbXBsYXRlIDxjbGFzcyBUeXBlPiBjbGFzcyBSQ1B0ciB7CgkgICAgICBwdWJsaWM6CgkgICAgICAgIC4uLgoJICAgICAgICBSQ1B0cihUeXBlICpwKTsKCQlUeXBlICogb3BlcmF0b3ItPigpIGNvbnN0OwoJCS4uLgoJICAgICAgfTsKCSAgICAgIAoJICAgIHlvdSB1c2UgdGhlICVleHRlbmRfc21hcnRfcG9pbnRlciBkaXJlY3RpdmUgYXM6CgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpICBSQ1B0cjxBPjsKCSAgICAKCSAgICB0aGVuLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICBSQ1B0cjxBPiBtYWtlX3B0cigpOwoJICAgICAgaW50IGZvbyhBICopOwoKCSAgICB5b3UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6CgoJICAgICAgYSA9IG1ha2VfcHRyKCk7CgkgICAgICBiID0gZm9vKGEpOwoKICAgICAgICAgICAgaWUsIHN3aWcgd2lsbCBhY2NlcHQgYSBSQ1B0cjxBPiBvYmplY3Qgd2hlcmUgYSAnQSAqJyBpcwogICAgICAgICAgICBleHBlY3RlZC4KCgkgICAgQWxzbywgd2hlbiB1c2luZyB2ZWN0b3JzCgkgICAgCgkgICAgICAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIoUkNQdHI8QT4pOwoJICAgICAgJXRlbXBsYXRlKFJDUHRyX0EpIFJDUHRyPEE+OwoJICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9BKSBzdGQ6OnZlY3RvcjxSQ1B0cjxBPiA+OwoJCQoJICAgIHlvdSBjYW4gdHlwZQoKCSAgICAgIGEgPSBBKCk7CgkgICAgICB2ID0gdmVjdG9yX0EoMikKCSAgICAgIHZbMF0gPSBhCgogICAgICAgICAgICBpZSwgYW4gJ0EgKicgb2JqZWN0IGlzIGFjY2VwdGVkLCB2aWEgaW1wbGljaXQgY29udmVyc2lvbiwgCgkgICAgd2hlcmUgYSBSQ1B0cjxBPiBvYmplY3QgaXMgZXhwZWN0ZWQuIEFkZGl0aW9uYWxseQoKCSAgICAgIHggPSB2WzBdCgoJICAgIHJldHVybnMgKGFuZCBzZXRzICd4JyBhcykgYSBjb3B5IG9mIHZbMF0sIG1ha2luZyByZWZlcmVuY2UKCSAgICBjb3VudGluZyBwb3NzaWJsZSBhbmQgY29uc2lzdGVudC4KCgkgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyIGlzIGp1c3QgYSBjb2xsZWN0aW9ucyBvZiBuZXcvb2xkCgkgICAgdHJpY2tzLCBpbmNsdWRpbmcgJXR5cGVtYXBzIGFuZCB0aGUgbmV3ICVpbXBsaWNpdGNvbnYKCSAgICBkaXJlY3RpdmUuCgowMi8wMi8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBidWdmaXggIzEzNTY1NzcsIGNoYW5nZWQgZG91YmxlPT5sdWFfbnVtYmVyIGluIGEgZmV3IHBsYWNlcy4KICAgICAgICAgICAgYWRkZWQgdGhlIHN0ZDo6cGFpciB3cmFwcGluZwoKMDEvMzAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgYW5kIHN0ZDo6d3N0cmluZyBtZW1iZXIgdmFyaWFibGVzIGFuZCBnbG9iYWwgdmFyaWFibGVzIG5vdyB1c2UKICAgICAgICAgICAgJW5hdHVyYWx2YXIgYnkgZGVmYXVsdCwgbWVhbmluZyB0aGV5IHdpbGwgbm93IGJlIHdyYXBwZWQgYXMgZXhwZWN0ZWQgaW4gYWxsIGxhbmd1YWdlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGVzZSB3ZXJlIHdyYXBwZWQgYXMgYSBwb2ludGVyIHJhdGhlciB0aGFuIGEgdGFyZ2V0IGxhbmd1YWdlIHN0cmluZy4KICAgICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBhZGQgdGhlIGZvbGxvd2luZyB3b3JrYXJvdW5kIHRvIHdyYXAgdGhlc2UgYXMgc3RyaW5nczoKCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMDEvMjgvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZSAtc2NtXSAKCSAgICBBZGQgdHlwZW1hcHMgZm9yIGhhbmRsaW5nIG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycy4KCjAxLzI0LzIwMDY6IG1tYXR1cwoJICAgIC0gQmV0dGVyIHN1cHBvcnQgZm9yIHRoZSAlbmF0dXJhbHZhciBkaXJlY3RpdmUsIG5vdyBpdAoJICAgICAgd29ya3Mgd2l0aCB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlcyBhcyB3ZWxsIGFzCgkgICAgICBKYXZhL0MjLgoJICAgICAgCgkgICAgICBOb3csIGl0IGNhbiBhbHNvIGJlIGFwcGxpZWQgdG8gY2xhc3MgdHlwZXM6CgoJICAgICAgICAlbmF0dXJhbHZhciBzdGQ6OnN0cmluZzsKCSAgICAgICAgJWluY2x1ZGUgPHN0ZF9zdHJpbmcuaT4KCSAgICAgIAogICAgICAgICAgICAgIHRoYXQgd2lsbCB0ZWxsIHN3aWcgdG8gdXNlIHRoZSAnbmF0dXJhbCcgd3JhcHBpbmcKICAgICAgICAgICAgICBtZWNoYW5pc20gdG8gYWxsIHN0ZDo6c3RyaW5nIGdsb2JhbCBhbmQgbWVtYmVyCiAgICAgICAgICAgICAgdmFyaWFibGVzLgoKCSAgICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgJWFsbG93ZXhjZXB0IGZlYXR1cmUgYWxvbmcgdGhlCiAgICAgICAgICAgICAgc2NyaXB0aW5nIGxhbmd1YWdlcywgd2hpY2ggYWxsb3dzIHRoZSAlZXhjZXB0aW9uIGZlYXR1cmUKICAgICAgICAgICAgICB0byBiZSBhcHBsaWVkIHRvIHRoZSB2YXJpYWJsZSBhY2Nlc3MgbWV0aG9kcy4gQWxzbywgYWRkCiAgICAgICAgICAgICAgdGhlICVleGNlcHRpb252YXIgZGlyZWN0aXZlIHRvIHNwZWNpZnkgYSBkaXN0aW50aWMKICAgICAgICAgICAgICBleGNlcHRpb24gbWVjaGFuaXNtIG9ubHkgZm9yIHZhcmlhYmxlcy4KCSAgICAgIAoJICAgIAoJICAgIC0gQWRkIG1vcmUgZG9jcyBmb3IgdGhlICVkZWxvYmplY3QgZGlyZWN0aXZlIHRvIG1hcmsgYSBtZXRob2QgYXMgYQoJICAgICAgZGVzdHJ1Y3RvciwgJ2Rpc293bmluZycgdGhlIGZpcnN0IGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCgkgICAgICAgICVuZXdvYmplY3QgY3JlYXRlX2ZvbzsKCSAgICAgICAgJWRlbG9iamVjdCBkZXN0cm95X2ZvbzsKCgkgICAgICAgIEZvbyAqY3JlYXRlX2ZvbygpIHsgcmV0dXJuIG5ldyBGb28oKTsgfQoJICAgICAgICB2b2lkIGRlc3Ryb3lfZm9vKEZvbyAqZm9vKSB7IGRlbGV0ZSBmb287IH0KCgkgICAgICBvciBpbiBhIG1lbWJlciBtZXRob2QgYXM6CgoJICAgICAgICAlZGVsb2JqZWN0IEZvbzo6ZGVzdHJveTsKCgkgICAgICAgIGNsYXNzIEZvbyB7CgkgICAgICAgIHB1YmxpYzoKCSAgICAgICAgICB2b2lkIGRlc3Ryb3koKSB7IGRlbGV0ZSB0aGlzO30KCgkgICAgICAgIHByaXZhdGU6CgkgICAgICAgICAgfkZvbygpOwogICAgICAgICAgICAgICB9OwoKCjAxLzI0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgLSBSZW1vdmVkIHRoZSB0eXBlIHN3aWdfbHVhX2NvbW1hbmRfaW5mbyAmIHJlcGxhY2Ugd2l0aCBsdWFMX3JlZwoJICAgICAgKHdoaWNoIHRoZW4gYnJva2UgdGhlIGNvZGUpLCBmaXhlZCB0aGlzCgkgICAgLSBhZGRlZCBhbiBhZGRpdGlvbmFsIGNhc3QgaW4gdGhlIHR5cGVtYXBzIGZvciBlbnVtJ3MKCSAgICAgIGR1ZSB0byB0aGUgaXNzdWUgdGhhdCBWQy5OZXQgd2lsbCBub3QgYWxsb3cgY2FzdGluZyBvZgoJICAgICAgYSBkb3VibGUgdG8gYW4gZW51bSBkaXJlY3RseS4gVGhlcmVmb3JlIGNhc3QgdG8gaW50IHRoZW4gdG8gZW51bQoJICAgICAgKHRoYW5rcyB0byBKYXNvbiBSZWdvIGZvciB0aGlzIG9ic2VydmF0aW9uKQoKMDEvMTYvMjAwNjogbW1hdHVzIChDaGFuZ2UgZGlzYWJsZWQuLi4gd2lsbCBiZSBiYWNrIGluIENWUyBzb29uKQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHJlZ2V4cCB2aWEgdGhlIGV4dGVybmFsIGxpYnJhcnkKCSAgICBSeFNwZW5jZXIuIFNXSUcgZG9lc24ndCByZXF1aXJlIHRoaXMgbGlicmFyeSB0byBjb21waWxlCgkgICAgYW5kL29yIHJ1bi4gQnV0IGlmIHlvdSBzcGVjaWZ5IC0td2l0aC1yeHNwZW5jZXIsIGFuZCB0aGUKCSAgICBsaWJyYXJ5IGlzIGZvdW5kIGR1cmluZyBpbnN0YWxsYXRpb24sIHRoZW4gc3dpZyB3aWxsIHVzZQoJICAgIGl0IGluIHRocmVlIHBsYWNlczoKCgkgICAgLSBJbiAlcmVuYW1lcyBydWxlcywgdmlhIHRoZSBuZXcgcnhzbWF0Y2ggcnVsZXMsIGZvciBleGFtcGxlOgoJICAgIAkgIAoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbmFtZT0iR1NMXy4qIikgIiI7CgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHNtYXRjaCRub2RlVHlwZT0iZW51bSBHU0xfLioiKSAiIjsKCSAgICAJIAogICAgICAgICAgICAgIHJ4c21hdGNoIGlzIHNpbWlsYXIgdG8gdGhlIG1hdGNoIHJ1bGUsIGl0IGp1c3QgdXNlcwogICAgICAgICAgICAgIHRoZSBSeFNwZW5jZXIgcmVnZXhwIGxpYnJhcnkgdG8gZGVjaWRlIGlmIHRoZXJlIGlzIGEKICAgICAgICAgICAgICBtYXRjaCB3aXRoIHRoZSBwcm92aWRlZCByZWdleHAuIEFzIHdpdGggdGhlIG1hdGNoCiAgICAgICAgICAgICAgcnVsZSwgeW91IGNhbiBhbHNvIHVzZSB0aGUgbmVnYXRlIHJ1bGUgbm90cnhzbWF0Y2guCgoJICAgIC0gSW4gdGhlICVyZW5hbWUgdGFyZ2V0IG5hbWUgdmlhIHRoZSByeHN0YXJnZXQgb3B0aW9uLCBmb3IgZXhhbXBsZToKCSAgICAJCSAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c3RhcmdldD0xKSAiR1NMXy4qIjsKCgkgICAgCXdoZXJlIHRoZSB0YXJnZXQgbmFtZSAiR1NMLioiIGlzIG5vdyB1bmRlcnN0b29kIGFzIGEKCSAgICAJcmVnZXhwIHRvIGJlIG1hdGNoZWQuICAKCSAgICAJIAogICAgICAgICAgICAtIEluIHRoZSBuZXcgZW5jb2RlciAicnhzcGVuY2VyIiwgd2hpY2ggbG9va3MgbGlrZToKCgkgICAgCSAgJShyeHNwZW5jZXI6W3JlZ2V4cF1bcmVwbGFjZV0pcwoKCSAgICAJd2hlcmUgInJlZ2V4cCIgaXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBhbmQgInJlcGxhY2UiCgkgICAgCWlzIGEgc3RyaW5nIHVzZWQgYXMgYSByZXBsYWNlbWVudCwgd2hlcmUgdGhlIEAwLEAxLC4uLixAOQoJICAgIAlwc2V1ZG8gYXJndW1lbnRzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUKCSAgICAJY29ycmVzcG9uZGluZyBtYXRjaGluZyBpdGVtcyBpbiB0aGUgcmVnIGV4cHJlc3Npb24uCgoJICAgIAlGb3IgZXhhbXBsZToKCSAgICAJCSAgICAgIAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEhlbGxvICAgIC0+IAoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMLipdW0AwXSlzICAgICAgIDwtIEdTTEhlbGxvIC0+IEdTTEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtAMV0pcyAgICAgPC0gR1NMSGVsbG8gLT4gSGVsbG8KCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTCguKildW2dzbEAxXSlzICA8LSBHU0xIZWxsbyAtPiBnc2xIZWxsbwoKCSAgICAJQW5vdGhlciBleGFtcGxlIGNvdWxkIGJlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoIiUobG93ZXJjYXNlKXMiLHNvdXJjZWZtdD0iJShyeHNwZW5jZXI6W0dTTF8oLiopXVtAMV0pcyIsJSRpc2Z1bmN0aW9uKSAiIjsKCgkgICAgCXdoaWNoIHRha2Ugb3V0IHRoZSBwcmVmaXggIkdTTF8iIGFuZCByZXR1cm5zIGFsbCB0aGUKCSAgICAJZnVuY3Rpb24gbmFtZXMgaW4gbG93ZXIgY2FzZXMsIGFzIGZvbGxvd2luZzoKCgkgICAgCSAgICB2b2lkIEdTTF9IZWxsbygpOyAgIC0+ICAgaGVsbG8oKTsKCSAgICAJICAgIHZvaWQgR1NMX0hpKCk7ICAgICAgLT4gICBoaSgpOwoJICAgIAkgICAgY29uc3QgaW50IEdTTF9NQVg7ICAtPiAgIEdTTF9NQVg7ICAvLyBubyBjaGFuZ2UsIGlzIG5vdCBhIGZ1bmN0aW9uCgkKCSAgICBXZSB1c2UgdGhlIFJ4U3BlbmNlciBhcyBhbiBpbml0aWFsIHRlc3QgYmVkIHRvCiAgICAgICAgICAgIGltcGxlbWVudGlvbiB3aGlsZSB3ZSBkZWNpZGUgd2hpY2ggbGlicmFyeSB3aWxsIGJlCiAgICAgICAgICAgIGZpbmFsbHkgYWRkZWQgdG8gc3dpZy4KCiAgICAgICAgICAgIFlvdSBjYW4gb2J0YWluIHRoZSBSeFNwZW5jZXIgbGlicmFyeSBmcm9tIAoJICAgIAoJICAgICAgaHR0cDovL2FyZ2xpc3QuY29tL3JlZ2V4IChVbml4KQoKCSAgICBvcgoJICAgICAKCSAgICAgIGh0dHA6Ly9nbnV3aW4zMi5zb3VyY2Vmb3JnZS5uZXQvcGFja2FnZXMuaHRtbCAoV2luZG93cykKCgkgICAgT25jZSBpbnN0YWxsZWQsIHVzZSAibWFuIHJ4c3BlbmNlciIgdG8gZ2V0IG1vcmUgaW5mbwoJICAgIGFib3V0IHRoZSByZWdleHAgZm9ybWF0LCBvciBqdXN0IGdvb2dsZSByeHNwZW5jZXIuCgoJICAgIFNpbmNlIG5vdyB5b3UgY2FuIGVuYWJsZSB0aGUgcnhzbWF0Y2ggcnVsZXMgKHNlZSBhYm92ZSksCiAgICAgICAgICAgIHRoZSBzaW1wbGUgb3IgJ3wnIHN1cHBvcnQgZm9yIHRoZSBtYXRjaCBydWxlcwogICAgICAgICAgICAoMDEvMTIvMjAwNjogbW1hdHVzKSBpcyBkaXNhYmxlZC4gU3RpbGwsIGlmIHlvdSBoYXZlCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggdGhlIHJ4c3BlbmNlciBsaWJyYXJ5LCB5b3UgY2FuIHJlLWVuYWJsZQogICAgICAgICAgICB0aGUgc2ltcGxlICdtYXRjaCBvcicgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAtRFNXSUdfVVNFX1NJTVBMRV9NQVRDSE9SLgoJICAKCjAxLzE2LzIwMDY6IG1tYXR1cwoJICAgIENoYW5nZSB0aGUgJXJlbmFtZSBwcmVkaWNhdGVzIHRvIHVzZSB0aGUgcHJlZml4ICclJCcsIGFzIGluOgoJICAgIAoJICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJSRpc2Z1bmN0aW9uLCUkaXNtZW1iZXIpICIiOyAKCSAgIAkKICAgICAgICAgICAgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIG90aGVyIHN3aWcgbWFjcm9zL2RpcmVjdGl2ZXMuCgowMS8xNC8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgQWRkZWQgc3VwcG9ydCBmb3IgUnVieSBiYW5nISBtZXRob2RzIHZpYSBhIG5ldyAlYmFuZyBmZWF0dXJlLgoJICAgIEJhbmcgbWV0aG9kcyBlbmQgaW4gZXhjbGFtYXRpb24gcG9pbnRzIGFuZCBpbmRpY2F0ZSB0aGF0IHRoZQoJICAgIG9iamVjdCBiZWluZyBwcm9jZXNzZWQgd2lsbCBiZSBtb2RpZmllZCBpbi1wbGFjZSBhcyAKCSAgICBvcHBvc2VkIHRvIGJlaW5nIGNvcGllZC4KCjAxLzEyLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBVcGRhdGVkIHRoZSBSdWJ5IG1vZHVsZSB0byBhdXRvbWF0aWNhbGx5IGNvbnZlcnQKCSAgICBtZXRob2QgbmFtZXMgdG8gbG93ZXJfY2FzZV93aXRoX3VuZGVyc2NvcmVzIHVzaW5nIHRoZQoJICAgIG5ldyAlcmVuYW1lIGZ1bmN0aW9uYWxpdHkuCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBhbGlhc2VzIGZvciAnY2FzZScgZW5jb2RlcnMgdXNlZCB3aXRoICVyZW5hbWUvJW5hbWV3YXJuCgoJICAgICAgJSh1cHBlcmNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhFTExPX1dPUkxECgkgICAgICAlKGxvd2VyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG93b3JsZAoJICAgICAgJShjYW1lbGNhc2UpcyAgIGhlbGxvX3dvcmxkIC0+IEhlbGxvV29ybGQKCSAgICAgICUodW5kZXJjYXNlKXMgICBIZWxsb1dvcmxkICAtPiBoZWxsb193b3JsZAoKCjAxLzEyLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAtZHVtcF9wYXJzZV9tb2R1bGUgYW5kIC1kdW1wX3BhcnNlX3RvcCBvcHRpb25zLAoJICAgIHdoaWNoIGFyZSBzaW1pbGFyIHRvIC1kdW1wX21vZHVsZSBhbmQgLWR1bXBfdG9wLCBidXQgdGhleQoJICAgIGR1bXAgdGhlIG5vZGUgdHJlZXMganVzdCBhZnRlciBwYXJzaW5nLCBzaG93aW5nIG9ubHkgdGhlIAoJICAgIGF0dHJpYnV0ZXMgdmlzaWJsZSBhdCB0aGUgcGFyc2luZyBzdGFnZSwgYW5kIG5vdCB0aGUgYWRkZWQKCSAgICBsYXRlciBpbiB0eXBlbWFwLmN4eCwgYWxsb2NhdGUuY3h4LCBsYW5nLmN4eCBvciBlbHNld2hlcmUuCgkgICAgCgkgICAgQmVzaWRlcyBkZWJ1Z2dpbmcgcG9ycHVzZXMsIHRoZXNlIG9wdGlvbnMgYXJlIHZlcnkgdXNlZnVsCgkgICAgaWYgeW91IHBsYW4gdG8gdXNlICVyZW5hbWUgaW4gYW4gImFkdmFuY2Ugd2F5Iiwgc2luY2UgaXQKCSAgICBzaG93cyBvbmx5IGFuZCBhbGwgdGhlIG5vZGUncyBhdHRyaWJ1dGVzIHlvdSBjYW4gdXNlCgkgICAgaW5zaWRlIHRoZSBtYXRjaCBydWxlcy4KCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCBwcmVkaWNhdGVzIHRvICVyZW5hbWUsIHNvLCB5b3UgZG9uJ3QgbmVlZCB0bwoJICAgICAgcmVtZW1iZXIsIGZvciBleGFtcGxlLCBob3cgdG8gbWF0Y2ggYSBtZW1iZXIgZnVuY3Rpb24uCgoJICAgICAgTm93IGl0IGlzIGVhc3ksIGZvciBleGFtcGxlIHRvIHVzZSB0aGUgJ3V0aXRsZScgZW5jb2RlciAKCSAgICAgIGluIGFsbCB0aGUgbWVtYmVyIG1ldGhvZHMsIHlvdSB0eXBlOgoKCSAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIsJWlzZnVuY3Rpb24sJWlzbWVtYmVyKSAiIjsKCgkgICAgICBvciB0byBpZ25vcmUgYWxsIHRoZSBlbnVtaXRlbXMgaW4gYSBnaXZlbiBjbGFzczoKCgkgICAgICAgICVyZW5hbWUoIiRpZ25vcmUiLCAlaXNlbnVtaXRlbSwgJWNsYXNzbmFtZT0iTXlDbGFzcyIpICIiOyAgCgoJICAgICAgQXZhaWxhYmxlIHByZWRpY2F0ZXMgYXJlIChzZWUgc3dpZy5zd2cpOgoKICAgICAgICAgICAgICAgICVpc2VudW0gICAgICAgICAKCQklaXNlbnVtaXRlbSAgICAgCgkJJWlzYWNjZXNzICAgICAgIAoJCSVpc2NsYXNzICAgICAgICAKCQklaXNleHRlbmQgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2NvbnN0cnVjdG9yICAKCQklaXNkZXN0cnVjdG9yICAgCgkJJWlzbmFtZXNwYWNlICAgIAoJCSVpc3RlbXBsYXRlICAgICAKCQklaXNjb25zdGFudCAgICAgCgkJCQkJCgkJJWlzdW5pb24gICAgICAgIAoJCSVpc2Z1bmN0aW9uICAgICAKCQklaXN2YXJpYWJsZSAgICAgCgkJJWlzaW1tdXRhYmxlICAgIAoJCQkJCQoJCSVpc3N0YXRpYyAgICAgICAKCQklaXNmcmllbmQgICAgICAgCgkJJWlzdHlwZWRlZiAgICAgIAoJCSVpc3ZpcnR1YWwgICAgICAKCQklaXNleHBsaWNpdCAgICAgCgkJJWlzZXh0ZXJuICAgICAgIAoJCQkJCQoJCSVpc21lbWJlciAgICAgICAKCQklaXNnbG9iYWwgCgkJJWlubmFtZXNwYWNlCgoJCSVpc3B1YmxpYyAgICAKCQklaXNwcm90ZWN0ZWQgCgkJJWlzcHJpdmF0ZSAgIAoJCQkJICAgICAKCQklY2xhc3NuYW1lICAgCgogICAgICAgICAgICAgIFRoZXNlIHByZWRpY2F0ZXMgY29ycmVzcG9uZCB0byBzcGVjaWZpYyAnbWF0Y2gnCiAgICAgICAgICAgICAgZGVjbGFyYXRpb25zLCB3aGljaCBzb21ldGltZXMgYXJlIG5vdCBhcyBldmlkZW50IGFzIHRoZQogICAgICAgICAgICAgIHByZWRpY2F0ZXMgbmFtZXMuCgoKICAgICAgICAgICAgLSBBZGQgdGhlIG9yICd8JyBvcGVyYXRpb24gaW4gJXJlbmFtZSBtYXRjaCwgZm9yCiAgICAgICAgICAgICAgZXhhbXBsZSB0byBjYXBpdGFsaXplIGFsbCB0aGUgY29uc3RhbnRzICglY29uc3RhbnQgb3IKICAgICAgICAgICAgICBjb25zdCBjZGVjbCk6CgogICAgICAgICAgICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIsbWF0Y2g9ImNkZWNsfGNvbnN0YW50IiwlaXNpbW11dGFibGUpICIiOwogICAgICAgICAgICAgICAgCgoKMDEvMTIvMjAwNjogbWdvc3NhZ2UKCSAgICAtCVBhcnRpYWwgZml4ZWQgb2YgZXJyb3JzIHVuZGVyIEM4OSwgYnVnICMxMzU2NTc0CgkgICAgCShjb252ZXJ0ZWQgQysrIHN0eWxlIGNvbW1lbnRzIHRvIEMgc3R5bGUpCgkgICAgLQlBZGRlZCBwYXRjaGVzIGZyb20gbmVvbWFudHJhQHVzZXJzLnNmLm5ldCAjMTM3OTk4OCBhbmQgIzEzODgzNDMKCSAgICAJbWlzc2luZyBhICdyZXR1cm4nIHN0YXRlbWVudCBmb3IgZXJyb3IgY29uZGl0aW9ucwoJICAgIAlhbHNvIHVwZGF0ZWQgdGhlICVpbml0IGJsb2NrIGJ1ZyAjMTM1NjU4NgoJCSAKMDEvMTAvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgdGhlICd1dGl0bGUnIGVuY29kZXIsIGFzIGFuIGV4YW1wbGUgb2YgaG93IHRvIGFkZAoJICAgICAgeW91ciBvd24gZW5jb2Rlci4gSSBhZGRlZCB0aGUgZW5jb2RlciBtZXRob2QgaW4gbWlzYy5jIAoJICAgICAgYnV0IGRldmVsb3BlcnMgY2FuIGFkZCBvdGhlcnMsIHRoZSBzYW1lIHdheSwgaW5zaWRlIGFueQoJICAgICAgdGFyZ2V0IGxhbmd1YWdlLgoJICAgICAgCgkgICAgICBXZWxsLCAndXRpdGxlJyBpcyB0aGUgcmV2ZXJzZSBvZiAnY3RpdGxlJywgaWU6CgoJICAgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7ICAtPiBDYW1lbENhc2U7CgkgICAgICAgICAlcmVuYW1lKCIlKHV0aXRsZSlzIikgQ2FtZWxDYXNlOyAgIC0+IGNhbWVsX2Nhc2U7CgkJIAoKMDEvMTAvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQogICAgICAgICAgICBVcGRhdGVkIFJ1YnkgRXhjZXB0aW9uIGhhbmRsaW5nLiAgQ2xhc3NlcyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhyb3dzIGNsYXVzZXMsIAogICAgICAgICAgICBvciBhcmUgbWFya2VkIGFzICVleGNlcHRpb25jbGFzcywgYXJlIG5vdyBpbmhlcml0ZWQgZnJvbSByYl9lUnVudGltZUVycm9yLiAKICAgICAgICAgICAgVGhpcyBhbGxvd3MgaW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzZXMgdG8gYmUgcmV0dXJuZWQgdG8gUnVieSBhcyBleGNlcHRpb25zLiAKICAgICAgICAgICAgVGh1cyBpZiBhIEMrKyBtZXRob2QgdGhyb3dzIGFuIGluc3RhbmNlIG9mIE15RXhjZXB0aW9uLCB0aGUgY2FsbGluZyBSdWJ5IAogICAgICAgICAgICBtZXRob2Qgd2lsbCBnZXQgYmFjayBhIE15RXhjZXB0aW9uIG9iamVjdC4gIFRvIHNlZSBhbiBleGFtcGxlLCAKICAgICAgICAgICAgbG9vayBhdCBydWJ5L2V4YW1wbGVzL2V4Y2VwdGlvbl9jbGFzcy4KCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIAogICAgICAgICAgICAtIEFkZCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlLCB3aGljaCBjb21wbGVtZW50cyB0aGUgJWV4Y2VwdGlvbgoJICAgIGRpcmVjdGl2ZSBpbiBhIG1vcmUgYXV0b21hdGljIHdheS4gRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEUxKTsKCiAgICAgICAgICAgIHN3aWcgZ2VuZXJhdGVzIHRoZSBwcm9wZXIgdHJ5L2NhdGNoIGNvZGUgdG8gZGlzcGF0Y2ggRTEuCgkgICAgCgkgICAgQnV0IGlmIHlvdSBoYXZlOgoKCgkgICAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpID09IDEpIHsKCSAgICAgICAgICAgICAgIHRocm93IEUxKCk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCSAgICAgICAgICAgICAgdGhyb3cgRTIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGllLCB3aGVyZSB0aGVyZSBpcyBubyBleHBsaWNpdCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBpbiB0aGUgZGVjbCwgeW91IAoJICAgIGVuZCB1cCBkb2luZzoKCQkgIAogICAgICAgICAgICAgICAlZXhjZXB0aW9uIGJhcmZvbyB7CQkJCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFMSkgewkuLi4gfQkJCQkgIAoJICAgICAgICAgfSBjYXRjaChFMikgewkuLi4gfQkJCQkgIAoJICAgICAgIH0JCQkJCgkgICAgCgkgICAgd2hpY2ggaXMgdmVyeSB0ZWRpb3VzLiBXZWxsLCB0aGUgJWNhdGNoZXMgZGlyZWN0aXZlIGRlZmluZXMKCSAgICB0aGUgbGlzdCBvZiBleGNlcHRpb25zIHRvIGNhdGNoLCBhbmQgZnJvbSBzd2lnOgogCQoJICAgICAgICVjYXRjaGVzKEUxLEUyKSBiYXJmb28oaW50IGkpOwoJICAgICAgIGludCBiYXJmb28oaW50IGkpOwoKICAgICAgICAgICAgaXMgZXF1aXZhbGVudCB0byAKCgkgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKCSAgICBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSAlY2F0Y2hlcyBsaXN0IGRvZXNuJ3QgaGF2ZSB0bwoJICAgIGNvcnJlc3BvbmQgdG8gdGhlIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHlvdQoJICAgIGhhdmU6CgoJCXN0cnVjdCBFIHt9OwoJCXN0cnVjdCBFMSA6IEUge307CgkJc3RydWN0IEUyIDogRSB7fTsKCiAgCSAgICAgICAgaW50IGJhcmZvbyhpbnQgaSkgdGhyb3coRTEsRTIpOwoKICAgICAgICAgICAgeW91IGNhbiBkZWZpbmUKCSAgICAgICAgCgkJJWNhdGNoZXMoRSkgYmFyZm9vKGludCBpKTsKCQoJICAgIGFuZCBzd2lnIHdpbGwgZ2VuZXJhdGUgYW4gYWN0aW9uIGNvZGUgZXF1aXZhbGVudCB0bwoKCSAgICAgICAgIHRyeSB7CQkJCQoJICAgICAgICAgICAkYWN0aW9uCQkJCgkgICAgICAgICB9IGNhdGNoKEUgJl9lKSB7IAoJCSAgIDxyYWlzZSBfZT47CgkJIH0JCgogICAgICAgICAgICBPZiBjb3Vyc2UsIHlvdSBzdGlsbCBoYXZlIHRvIHNhdGlzZnkgdGhlIEMrKyByZXN0cmljdGlvbnMsCgkgICAgYW5kIHRoZSBjYXRjaGVzIGxpc3QgbXVzdCBiZSBjb21wYXRpYmxlIChub3QgdGhlIHNhbWUpCgkgICAgYXMgdGhlIG9yaWdpbmFsIGxpc3Qgb2YgdHlwZXMgaW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLgoKCSAgICBBbHNvLCB5b3UgY2FuIG5vdyBzcGVjaWZ5IHRoYXQgeW91IHdhbnQgdG8gY2F0Y2ggdGhlCgkgICAgdW5rbm93biBleGNlcHRpb24gJy4uLicsIGZvciBleGFtcGxlOgoKCSAgICAgICAlY2F0Y2hlcyhFMSxFMiwuLi4pIGJhcmZvbyhpbnQpOwoKCSAgICBJbiBhbnkgY2FzZSwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSB3aWxsIGVtaXQgdGhlCgkgICAgY29kZSB0byBjb252ZXJ0IGludG8gdGhlIHRhcmdldCBsYW5ndWFnZSBlcnJvci9leGNlcHRpb24KICAgICAgICAgICAgdXNpbmcgdGhlICd0aHJvd3MnIHR5cGVtYXAuCgoJICAgIEZvciB0aGUgJy4uLicgY2FzZSB0byB3b3JrLCB5b3UgbmVlZCB0bwoJICAgIHdyaXRlIHRoZSBwcm9wZXIgdHlwZW1hcCBpbiB5b3VyIHRhcmdldCBsYW5ndWFnZS4gSW4gdGhlCgkgICAgVVRMLCB0aGlzIGxvb2tzIGxpa2U6CgoJICAgICAgJXR5cGVtYXAodGhyb3dzKSAoLi4uKSB7CgkgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfUnVudGltZUVycm9yLCJ1bmtub3duIGV4Y2VwdGlvbiIpOwogICAgICAgICAgICAgIH0KCjAxLzA5LzIwMDY6IG11dGFuZGl6CgkgICAgW0FsbGVncm9jbF0KCiAgICAgICAgICAgIEZpeGVzIGEgbnVtYmVyIG9mIFNFR1ZzIHByaW1hcmlseSBpbiB0aGUgaGFuZGxpbmcgb2YKICAgICAgICAgICAgdmFyaW91cyBhbm9ueW1vdXMgdHlwZXMuIEZvdW5kIGluIGEgcGFzcyB0aHJvdWdoIHRoZQogICAgICAgICAgICBzd2lnIHRlc3Qtc3VpdGUuIFN0aWxsIG1vcmUgdG8gZG8gaGVyZSwgYnV0IHRoaXMgaXMgYQogICAgICAgICAgICBnb29kIGNoZWNrcG9pbnQuCgogICAgICAgICAgICBBZGRzIC1jd3JhcCBhbmQgLW5vY3dyYXAgYXMgYW4gYWxsZWdyb2NsIHNwZWNpZmljCiAgICAgICAgICAgIGNvbW1hbmQtbGluZSBhcmd1bWVudC4gQ29udHJvbHMgZ2VuZXJhdGluZyBvZiBhIEMKICAgICAgICAgICAgd3JhcHBlciBmaWxlIHdoZW4gd3JhcHBpbmcgQyBjb2RlLiBCeSBkZWZhdWx0IG9ubHkgYQogICAgICAgICAgICBsaXNwIGZpbGUgaXMgY3JlYXRlZCBmb3IgQyBjb2RlIHdyYXBwaW5nLgoKICAgICAgICAgICAgRG9jIHVwZGF0ZXMgZm9yIHRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzIGFuZCBmaXhlcyBhcwogICAgICAgICAgICBwb2ludGVkIG91dCBvbiBzd2lnLWRldmVsCgowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHVuc2lnbmVkIGxvbmcgbG9uZyBhbmQgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICYgdHlwZW1hcHMKICAgICAgICAgICAgLSBCdWcgIzEzOTgzOTQgIHdpdGggcGF0Y2ggZnJvbSBEcmllcyBEZWNvY2sKCjAxLzA2LzIwMDY6IG1tYXR1cwoJICAgIEFkZCAnbmFtZWQnIHdhcm5pbmcgY29kZXMsIG5vdyBpbiBhZGRpdGlvbiB0bzoKCSAgICAKCSAgICAgICV3YXJuZmlsdGVyKDgxMyk7CgkgICAKCSAgICB5b3UgY2FuIHVzZQoKCSAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX0pBVkFfTVVMVElQTEVfSU5IRVJJVEFOQ0UpOwoKCSAgICBqdXN0IHVzZSB0aGUgc2FtZSBjb2RlIG5hbWUgZm91bmQgaW4gIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmggCgkgICAgcGx1cyB0aGUgJ1NXSUcnIHByZWZpeC4KCgkgICAgSWYgYSBkZXZlbG9wZXIgYWRkcyBhIG5ldyB3YXJuaW5nIGNvZGUsIHRoZSBMaWIvc3dpZ3dhcm4uc3dnIGZpbGUKICAgICAgICAgICAgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBydW5uaW5nIHRoZSB0b3AgbGV2ZWwgbWFrZS4KCjAxLzA1LzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KCSAgICBSZWltcGxlbWVudGVkIG9iamVjdCB0cmFja2luZyBmb3IgUnVieS4gIFRoZSBuZXcgaW1wbGVtZW50YXRpb24gd29ya3MKCSAgICBieSBleHBhbmRpbmcgdGhlIHN3aWdfY2xhc3Mgc3RydWN0dXJlIGZvciBSdWJ5IGJ5IGFkZGluZyBhIHRyYWNrT2JqZWN0cwoJICAgIGZpZWxkLiAgVGhpcyBmaWVsZCBjYW4gYmUgc2V0L3Vuc2V0IHZpYSAldHJhY2tvYmplY3RzIGFzIGV4cGxhaW5lZAoJICAgIGluIHRoZSBSdWJ5IGRvY3VtZW50YXRpb24uICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIGlzIG1vcmUgcm9idXN0CgkgICAgYW5kIHRha2VzIGxlc3MgY29kZSB0byBpbXBsZW1lbnQuCgkJCjAxLzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgJWV4dGVuZCBhbmQgc3RhdGljIGNvbnN0IGludGVncmFsIHR5cGVzLCBlZzoKCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgYmFyID0gNDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsgCgoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluZm8gZm9yIG9sZCBhbmQgbmV3IGRlYnVnIG9wdGlvbnM6CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC1kdW1wX3RvcCAgICAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBlbnRpcmUgbm9kZSB0cmVlLCBpbmNsdWRpbmcgc3lzdGVtIG5vZGVzICAgIAogICAgIAkgICAgLWR1bXBfbW9kdWxlICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gb2YgdGhlIG1vZHVsZSBub2RlIHRyZWUsIGF2b2lkaW5nIHN5c3RlbSBub2RlcyAgICAgCiAgICAgCSAgICAtZHVtcF9jbGFzc2VzICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3NlcyBmb3VuZCBpbiB0aGUgaW50ZXJmYWNlCSAgICAgICAKICAgICAJICAgIC1kdW1wX3R5cGVkZWYgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlcyBhbmQgdHlwZWRlZnMgZm91bmQgaW4gdGhlIGludGVyZmFjZQogICAgIAkgICAgLWR1bXBfdGFncyAgICAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ3MgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZGVidWdfdHlwZW1hcCAgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHR5cGVtYXBzCQkJICAgICAgIAogICAgICAgICAgICAtZGVidWdfdGVtcGxhdGUgLSBQcmludCBpbmZvcm1hdGlvbiBmb3IgZGVidWdnaW5nIHRlbXBsYXRlcwkJCSAgICAgICAgCgoJICAtIEFkZCB0aGUgZmFrZXZlcnNpb24uIElmIHlvdSBoYXZlIGEgcHJvamVjdCB0aGF0IHVzZXMKICAgICAgICAgICAgY29uZmlndXJlL3NldHVwLnB5LCBvciBhbm90aGVyIGF1dG9tYXRpYyBidWlsZGluZyBzeXN0ZW0KICAgICAgICAgICAgYW5kIHJlcXVpcmVzIGEgc3BlY2lmaWMgc3dpZyB2ZXJzaW9uLCBsZXQgc2F5IDEuMy4yMiAKCSAgICB5b3UgY2FuIHVzZToKCgkgICAgICAgU1dJR19GRUFUVVJFUz0iLWZha2V2ZXJzaW9uIDEuMy4yMiIKCgkgICAgIG9yCiAKICAgICAgICAgICAgICAgc3dpZyAtZmFrZXZlcnNpb24gMS4zLjIyCgogICAgICAgICAgICAgYW5kIHRoZW4gc3dpZyAtdmVyc2lvbiB3aWxsIHJlcG9ydCAxLjMuMjIgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgIGN1cnJlbnQgdmVyc2lvbi4KCgkgICAgIFR5cGljYWwgdXNlIHdvdWxkIGJlCgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiIC4vY29uZmlndXJlIAkgICAgIAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBvcHRpb24vZm9ybWF0IHN1cHBvcnQgdG8gJXJlbmFtZSBhbmQgJW5hbWV3YXJuLgkKCSAgICBOb3cgJW5hbWV3YXJuIGNhbiBmb3JjZSByZW5hbWluZywgZm9yIGV4YW1wbGU6CgoJICAgICAgJW5hbWV3YXJuKCIzMTQ6IGltcG9ydCBpcyBhIGtleXdvcmQiLHJlbmFtZT0iXyVzIikgImltcG9ydCI7CgkgICAgCgkgICAgYW5kIHJlbmFtZSBjYW4gYWxzbyBzdXBwb3J0IGZvcm1hdCBmb3JtczoKCgkgICAgICAgJXJlbmFtZSgic3dpZ18lcyIpIGltcG9ydDsKCgkgICAgTm93LCBzaW5jZSB0aGUgZm9ybWF0IGlzIHByb2Nlc3NlZCB2aWEgc3dpZyBQcmludGYsIHlvdQoJICAgIGNhbiB1c2UgZW5jb2RlcnMgYXMgZm9sbG93czoKCgkgICAgICAgJXJlbmFtZSgiJSh0aXRsZSlzIikgIGltcG9ydDsgICAgIC0+IEltcG9ydAoJICAgICAgICVyZW5hbWUoIiUodXBwZXIpcyIpICBpbXBvcnQ7ICAgICAtPiBJTVBPUlQKCSAgICAgICAlcmVuYW1lKCIlKGxvd2VyKXMiKSAgSW1wb3J0OyAgICAgLT4gaW1wb3J0CgkgICAgICAgJXJlbmFtZSgiJShjdGl0bGUpcyIpIGNhbWVsX2Nhc2U7IC0+IENhbWVsQ2FzZQoJICAgICAgIAoJICAgIFRoaXMgd2lsbCBhbGxvdyB1cyB0byBhZGQgbW9yZSBlbmNvZGVycywgYXMgdGhlIAoJICAgIGV4cGVjdGVkIG9uZSBmb3IgcmVndWxhciBleHByZXNzaW9ucy4gCgoJICAtIEFkZCB0aGUgYWJvdmUgJ2N0aXRsZScgZW5jb2Rlciwgd2hpY2ggZG9lcyB0aGUgY2FtZWwgY2FzZToKCgkgICAgICAgIGNhbWVsX2Nhc2UgLT4gQ2FtZWxDYXNlCiAgCgkgIC0gQWxzbywgd2hpbGUgd2UgZ2V0IHRoZSByZWdleHAgc3VwcG9ydCwgYWRkIHRoZSAnY29tbWFuZCcgZW5jb2RlciwKICAgICAgICAgICAgeW91IGNhbiB1c2UgaXQgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOnNlZCAtZSAncy9cKFthLXpdXCkvXFVcXDEvJyA8PDwgKXMiKSBpbXBvcnQ7IAoKCSAgICB0aGVuIHN3aWcgd2lsbCBwb3BlbiB0aGUgY29tbWFuZAoJICAgIAoJCSJzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IGltcG9ydCIKCQkKICAgICAgICAgICAgc2VlIGJlbG93IGZvciBhbm9ueW1vdXMgcmVuYW1lcyBmb3IgYmV0dGVyIGV4YW1wbGVzLgkJCgogICAgICAgICAgLSBUaGUgcmVuYW1lIGRpcmVjdGl2ZSBub3cgYWxzbyBhbGxvd3M6CgoJICAgIC0gc2ltcGxlIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgYSB0eXBlIG1hdGNoCgkgICAgICBoYXBwZW4sIGZvciBleGFtcGxlCgoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaD0iZW51bWl0ZW0iKSBoZWxsbzsKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgkJIGludCBoZWxsbygpICAtPiAgaGVsbG87IAoKCSAgICAtIGV4dGVuZGVkIG1hdGNoOiBvbmx5IGFwcGx5IHRoZSByZW5hbWUgaWYgdGhlICdleHRlbmRlZCBhdHRyaWJ1dGUnIG1hdGNoCgkgICAgICBvY2N1cnJlZCwgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHNhbWUgYXMgc2ltcGxlIG1hdGNoIAkJCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpIGhlbGxvOyAKCgkJIGVudW0gSGVsbG8gewoJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgCgkJIH07CgoJICAgICAgIE5vdGUgdGhhdCB0aGUgc3ltYm9sICckJyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgYXR0cmlidXRlIG5hbWUgaW4KCSAgICAgICBhICdyZWN1cnNpdmUnIHdheSwgZm9yIGV4YW1wbGU6CgoJCSAvLyBtYXRjaCBvbmx5IGhlbGxvIGluICdlbnVtIEhlbGxvJwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIEhlbGxvICAgLy8gbWF0Y2gKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoKICAgICAgICAgICAgICAgaGVyZSwgZm9yIEhlbGxvOjpoaSwgdGhlICJwYXJlbnROb2RlIiBpcyAiSGVsbG8iLCBhbmQgaXRzICJ0eXBlIgogICAgICAgICAgICAgICBpcyAiZW51bSBIZWxsbyIuCgkgICAgICAgCgkgICAgICAgCiAgICAgICAgICAgIC0gQW5vbnltb3VzIHJlbmFtZXM6IHlvdSBjYW4gdXNlICdhbm9ueW1vdXMnIHJlbmFtZSBkaXJlY3RpdmVzLCBmb3IgZXhhbXBsZTogCgoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyBpbiBIZWxsbwoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRwYXJlbnROb2RlJHR5cGU9ImVudW0gSGVsbG8iKSAiIjsgCgoJCSBlbnVtIEhlbGxvIHsKIAkJICAgaGksIGhlbGxvICAtPiAgSGksIEhlbGxvICAgLy8gbWF0Y2ggYm90aAoJCSB9OwoKCQkgZW51bSBIaSB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBoZWxsbyAgIC8vIG5vIG1hdGNoCgkJIH07CgkJIAoJICAgICAgICAgLy8gcmVuYW1lIGFsbCB0aGUgZW51bSBpdGVtcyAKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkbm9kZVR5cGU9ImVudW1pdGVtIikgIiI7IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGl0ZW1zIGluIGdpdmVuIGNvbW1hbmQgKHNsb29vb3csIGJ1dC4uLikKCQkgJXJlbmFtZSglKGNvbW1hbmQ6PG15IGV4dGVybmFsIGNtZD4pcykgIiI7IAoKCQoJICAgICAgQW5vbnltb3VzIHJlbmFtZXMgd2l0aCBjb21tYW5kcyBjYW4gYmUgdmVyeSBwb3dlcmZ1bCwgc2luY2UgeW91CgkgICAgICBjYW4gJ291dHNvdXJjZScgYWxsIHRoZSByZW5hbWluZyBtZWNoYW5pc20gKG9yIHBhcnQgb2YgaXQpIHRvIGFuCgkgICAgICBleHRlcm5hbCBwcm9ncmFtOgoJICAgICAgCgkgICAgICAgIC8vIFVwcGVyY2FzZSBhbGwgKGFuZCBvbmx5KSB0aGUgbmFtZXMgdGhhdCBzdGFydCB3aXRoICdpJwoJICAgICAgICAlcmVuYW1lKCIlKGNvbW1hbmQ6YXdrICcvXmkve3ByaW50IHRvdXBwZXIoJDEpfScgPDw8KXMiKSAiIjsgICAKCSAgICAgICAKCSAgICAgICAgaW50IGltcG9ydGVkKCkgLT4gSU1QT1JURUQ7CgkgICAgICAgIGludCBoZWxsbygpICAgIC0+IGhlbGxvCgoJICAgICAgTm90ZSB0aGF0IGlmIHRoZSAnY29tbWFuZCcgZW5jb2RlciByZXR1cm5zIGFuIGVtcHR5IHN0cmluZywgc3dpZwoJICAgICAgdW5kZXJzdGFuZHMgdGhhdCBubyByZW5hbWUgaXMgbmVjZXNzYXJ5LgoKCSAgICAgIEFsc28gbm90ZSB0aGF0ICVyZW5hbWUgJ3Bhc3NlcycgdGhlIG1hdGNoZWQgbmFtZS4gRm9yIGV4YW1wbGUsIGluCgkgICAgICB0aGlzIGNhc2UKCgkgICAgICAgIG5hbWVzcGFjZSBuczEgewoJCSAgaW50IGZvbygpOwoJCX0KCgkgICAgICAgIG5hbWVzcGFjZSBuczIgewoJCSAgaW50IGJhcigpOwoJCX0KCgkgICAgICB0aGUgZXh0ZXJuYWwgcHJvZ3JhbSBvbmx5IHJlY2VpdmVzICJmb28iIGFuZCAiYmFyIi4gSWYgbmVlZGVkLAoJICAgICAgaG93ZXZlciwgeW91IGNhbiByZXF1ZXN0IHRoZSAnZnVsbG5hbWUnIAoJICAgICAgIAkKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnYXdrICcvbnMxOjove2w9c3BsaXQoJDEsYSwiOjoiKTsgcHJpbnQgdG91cHBlcihhW2xdKX0nJyA8PDwpcyIsZnVsbG5hbWU9MSkgIiI7ICAgCiAgICAgICAgICAgICAgICAKCQluczE6OmZvbyAtPiBGT08KCQluczI6OmJhciAtPiBiYXIJCgkKCSAgICAtIE1peGluZyBlbmNvZGVycyBhbmQgbWF0Y2hpbmc6IG9mIGNvdXJzZSwgeW91IGNhbiBkbyBtaXggY29tbWFuZHMKCSAgICAgIGFuZCBtYXRjaCBmaWVsZHMsIGZvciBleGFtcGxlOgoKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZm5jcz4pIixtYXRjaD0iY2RlY2wiKSAiIjsKCSAgICAgICAgJXJlbmFtZSgiJSg8bXkgZW5jb2RlciBmb3IgZW51bXM+KSIsbWF0Y2g9ImVudW1pdGVtIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zIGluc2lkZSBhIGNsYXNzPikiLG1hdGNoPSJlbnVtaXRlbSIsCgkJICAgICAgICBtYXRjaCRwYXJlbnROb2RlJHBhcmVudE5vZGUkbm9kZVR5cGU9ImNsYXNzIikgIiI7CgkJCgkgICAgICBVc2UgInN3aWcgLWR1bXBfcGFyc2VfbW9kdWxlIiB0byBzZWUgdGhlIGF0dHJpYnV0ZSBuYW1lcyB5b3UgY2FuIHVzZSB0bwoJICAgICAgbWF0Y2ggYSBzcGVjaWZpYyBjYXNlLgoJCiAgICAgICAgICAgIC0gJ3NvdXJjZWZtdCcgYW5kICd0YXJnZXRmbXQnOiBzb21ldGltZXMgeW91IG5lZWQgdG8KICAgICAgICAgICAgICBwcm9jZXNzIHRoZSAnc291cmNlJyBuYW1lIGJlZm9yZSBjb21wYXJpbmcsIGZvciBleGFtcGxlCgoJICAgICAgICAlbmFtZXdhcm4oIjMxNDogZW1wdHkgaXMgYSBrZXl3b3JkIixzb3VyY2VmbXQ9IiUobG93ZXIpcyIpICJlbXB0eSI7CgoJICAgICAgdGhlbiBpZiB5b3UgaGF2ZQoKCSAgICAgICAgaW50IEVtcHR5KCk7ICAvLyAiRW1wdHkiIGlzIHRoZSBzb3VyY2UgCgkJCgkgICAgICB5b3Ugd2lsbCBnZXQgdGhlIGtleXdvcmQgd2FybmluZyBzaW5jZSAnRW1wdHknIHdpbGwgYmUKCSAgICAgIGxvd2VyIGNhc2VkLCB2aWEgdGhlIHNvdXJjZWZtdD0iJShsb3dlcilzIiBvcHRpb24sCgkgICAgICBiZWZvcmUgYmVlbiBjb21wYXJlZCB0byB0aGUgJ3RhcmdldCcgImVtcHR5Ii4KCgkgICAgICBUaGVyZSBpcyBhbiBhZGRpdGlvbmFsICd0YXJnZXRmbXQnIG9wdGlvbiB0byBwcm9jZXNzIHRoZQoJICAgICAgJ3RhcmdldCcgYmVmb3JlIGNvbXBhcmluZy4KCgkgICAgLSBjb21wbGVtZW50aW5nICdtYXRjaCc6IHlvdSBjYW4gdXNlICdub3RtYXRjaCcsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiLG5vdG1hdGNoPSJuYW1lc3BhY2UiKSAiZW1wdHkiOwoKCSAgICAgIGhlcmUsIHRoZSBuYW1lIHdhcm5pbmcgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCB0aGUgc3ltYm9scyBleGNlcHQgbmFtZXNwYWNlcy4KCSAgICAKICAgICAgCQoxMi8zMC8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgZ2NqIGFuZCBKYXZhIC0+IDx0YXJnZXQgbGFuZ3VhZ2U+IG1lY2hhbmlzbS4KCgkgICAgU2VlCWV4YW1wbGVzIGluOiAgCgkgIAoJCUV4YW1wbGVzL3B5dGhvbi9qYXZhCgkJRXhhbXBsZXMvcnVieS9qYXZhCgkJRXhhbXBsZXMvdGNsL2phdmEKCiAgICAgICAgICAgIHRvIHNlZSBob3cgdG8gdXNlIGdjaitzd2lnIHRvIGV4cG9ydCBqYXZhIGNsYXNzZXMgaW50bwogICAgICAgICAgICBweXRob24vcnVieS90Y2wuCgkgICAgCgkgICAgVGhlIGlkZWEgaXMgdG8gcHV0IGFsbCB0aGUgY29tbW9uIGNvZGUgZm9yIGdjaiBpbnNpZGUKCgkgICAgICAgICAgTGliL2djagoKICAgICAgICAgICAgYW5kIGxvY2FsaXplIHNwZWNpZmljIHR5cGVzIHN1Y2ggYXMganN0cmluZywgYXMgY2FuIGJlIGZvdW5kCiAgICAgICAgICAgIGluCgoJICAgICAgICAgTGliL3B5dGhvbi9qc3RyaW5nLmkKCSAgICAgICAgIExpYi9ydWJ5L2pzdHJpbmcuaQoJICAgICAgICAgTGliL3RjbC9qc3RyaW5nLmkKCiAgICAgICAgICAgIFVzaW5nIHRoZSBVVEwsIHRoaXMgaXMgdmVyeSBlYXN5LCBhbmQgdGhlIHBlcmwgdmVyc2lvbiBmb3IKICAgICAgICAgICAganN0cmluZy5pIHdpbGwgYmUgbmV4dC4KCQkgCSAgICAKCjEyLzI5LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgY29weWN0b3IgZmVhdHVyZS9kaXJlY3RpdmUvb3B0aW9uIHRvIGVuYWJsZSB0aGUgYXV0b21hdGljCgkgICAgZ2VuZXJhdGlvbiBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gVXNlIGFzIGluOgoKCSAgICAgICVjb3B5Y3RvciBBOwoKCSAgICAgIHN0cnVjdCBBIHsKCiAgICAgICAgICAgICAgfTsKCgkgICAgdGhlbiB0aGlzIHdpbGwgd29yawoKCSAgICAgIGExID0gQSgpOwoJICAgICAgYTIgPSBBKGExKTsKCgkgICAgQWxzbywgc2luY2UgaXQgaXMgYSBmZWF0dXJlLCBpZiB5b3UganVzdCB0eXBlCgoJICAgICAgJWNvcHljdG9yOwoKCSAgICB0aGF0IHdpbGwgIGVuYWJsZSB0aGUgYXV0b21hdGljIGdlbmVyYXRpb24gZm9yIGFsbCB0aGUKCSAgICBjbGFzc2VzLiBJdCBpcyBhbHNvIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgc3dpZyAtY29weWN0b3IgLWMrKyAuLi4KCgkgICAgTm90ZXM6IAoKCSAgICAxLi0gVGhlIGZlYXR1cmUgb25seSB3b3JrcyBpbiBDKysgbW9kZS4KCgkgICAgMi4tIFRoZSBhdXRvbWF0aWMgY3JlYXRpb24gb2YgdGhlIGNvcHkgY29uc3RydWN0b3Igd2lsbAoJICAgICAgICB1c3VhbGx5IHByb2R1Y2Ugb3ZlcmxvYWRpbmcuIEhlbmNlLCBpZiB0aGUgdGFyZ2V0CgkgICAgICAgIGxhbmd1YWdlIGRvZXNuJ3Qgc3VwcG9ydCBvdmVybG9hZGluZywgYSBzcGVjaWFsIG5hbWUKCSAgICAgICAgd2lsbCBiZSB1c2VkIChBX2NvcHkpLgoJICAgIAoJICAgIDMuLSBGb3IgdGhlIG92ZXJsb2FkaW5nIHJlYXNvbnMgYWJvdmUsIGl0IGlzIHByb2JhYmx5IG5vdAogICAgICAgICAgICAgICAgYSBnb29kIGlkZWEgdG8gdXNlIHRoZSBmbGFnIHdoZW4sIGZvciBleGFtcGxlLCB5b3UgYXJlCgkJdXNpbmcga2V5d29yZHMgaW4gUHl0aG9uLgoKICAgICAgICAgICAgNC4tIFRoZSBjb3B5Y3RvciBhdXRvbWF0aWMgbWVjaGFuaXNtIGZvbGxvd3MgbW9yZSBvciBsZXNzCgkgICAgICAgIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIG1lY2hhbmlzbSwKCSAgICAgICAgaS5lLiwgYSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwgbm90IGJlIGFkZGVkIGlmIHRoZQoJICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCBvciBpZiB0aGVyZSBpcyBhIHBlcnRpbmVudCBub24tcHVibGljIAoJCWNvcHkgY3RvciBpbiB0aGUgY2xhc3Mgb3IgaXRzIGhpZXJhcmNoeS4KCgkJSGVuY2UsIGl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSBmb3IgeW91IHRvIGNvbXBsZXRlIHRoZQoJCWNsYXNzIGRlY2xhcmF0aW9uIHdpdGggdGhlIHByb3BlciBub24tcHVibGljIGNvcHkgY3RvcgoJCXRvIGF2b2lkIGEgd3JvbmcgY29uc3RydWN0b3IgYWRkaXRpb24uCgkJCiAgICAgICAgICAtIEZpeCBmZWF0dXJlcy9yZW5hbWUgZm9yIHRlbXBsYXRlcyBjdG9yL2R0b3IgYW5kIG90aGVyCiAgICAgICAgICAgIHRoaW5ncyBhcm91bmQgd2hpbGUgYWRkaW5nIHRoZSBjb3B5Y3RvciBtZWNoYW5pc20uCgkgICAgCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlICdtYXRjaCcgb3B0aW9uIHRvIHR5cGVtYXBzLiBBc3N1bWUgeW91IGhhdmU6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICogKGludCByZXMpIHsuLn0KCSAgICAgICV0eXBlbWFwKGZyZWVhcmcpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoKCSAgICB0aGVuIGlmIHlvdSBkbwogCgkgICAgICAldHlwZW1hcChpbikgQSAqIHsuLi59CgoJICAgIHN3aWcgd2lsbCAnb3ZlcmxvYWQgdGhlICdpbicgdHlwZW1hcCwgYnV0IHRoZSAnZnJlZWFyZycgCgkgICAgdHlwZW1hcCB3aWxsIGJlIGFsc28gYXBwbGllZCwgZXZlbiB3aGVuIHRoaXMgaXMgd3JvbmcuIFRoZSBvbGQKCSAgICBzb2x1dGlvbnMgaXMgdG8gd3JpdGU6CgoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQogIAkgICAgICAldHlwZW1hcChmcmVlYWcpIEEgKiAiIjsKCgkgICAgb3ZlcmxvYWQgJ2ZyZWVhcmcnIHdpdGggYW4gZW1wdHkgZGVmaW5pdGlvbi4KCgkgICAgVGhlIHByb2JsZW0gaXMsIGhvd2V2ZXIsIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IHlvdSBuZWVkCgkgICAgdG8gZG8gdGhhdCB1bnRpbCB5b3Ugc3RhcnQgZ2V0dGluZyBicm9rZW4gQysrIGNvZGUsIG9yCgkgICAgd29yc2UsIGJyb2tlbiBydW50aW1lIGNvZGUuCgoJICAgIFRoZSBzYW1lIGFwcGxpZXMgdG8gdGhlIGluZmFtb3VzICd0eXBlY2hlY2snIHR5cGVtYXAsCgkgICAgd2hpY2ggYWx3YXlzIGNvbmZ1c2VzIHBlb3BsZSwgc2luY2UgdGhlIGZpcnN0IHRoaW5nIHlvdSBkbwoJICAgIGlzIHRvIGp1c3Qgd3JpdGUgdGhlICdpbicgdHlwZW1hcC4KCgkgICAgVGhlICdtYXRjaCcgb3B0aW9uIHNvbHZlcyB0aGUgcHJvYmxlbSwgYW5kIGlmIGluc3RlYWQgeW91IHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnLG1hdGNoPSJpbiIpIFNXSUdUWVBFICogeyBpZiAocmVzJGFyZ251bSkgLi4ufQoJICAgICAgJXR5cGVtYXAodHlwZWNoZWNrLG1hdGNoPSJpbiIscHJlY2VkZW5jZS4uLikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoJICAgIGl0IHdpbGwgdGVsbCBzd2lnIHRvIGFwcGx5IHRoZSAnZnJlZWFyZy90eXBlY2hlY2snCgkgICAgdHlwZW1hcHMgb25seSBpZiB0aGV5ICdtYXRjaCcgdGhlIHR5cGUgb2YgdGhlICdpbicKCSAgICB0eXBlbWFwLiBUaGUgc2FtZSBjYW4gYmUgZG9uZSB3aXRoIG90aGVyIHR5cGVtYXBzIGFzOgoKCSAgICAgICV0eXBlbWFwKGRpcmVjdG9yb3V0KSBTV0lHVFlQRSAqIHsuLi59CgkgICAgICAldHlwZW1hcChkaXJlY3RvcmZyZWUsbWF0Y2g9ImRpcmVjdG9yb3V0IikgU1dJR1RZUEUgKiB7Li4ufQoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uL21vZGUvZmVhdHVyZSB0byB0cmVhdCBtZW1iZXIKCSAgICB2YXJpYWJsZXMgaW4gYSBtb3JlIG5hdHVyYWwgd2F5LCBpZSwgc2ltaWxhciB0byB0aGUgZ2xvYmFsCgkgICAgdmFyaWFibGUgYmVoYXZpb3IuCgoJICAgIFlvdSBjYW4gdXNlIGl0IGluIGEgZ2xvYmFsIHdheSB2aWEgdGhlIGNvbW1hbmQgbGluZQoKCSAgICAgIHN3aWcgLW5hdHVyYWx2YXIgLi4uCgoJICAgIG9yIHRoZSBtb2R1bGUgbW9kZSBvcHRpb24KIAoJICAgICAgJW1vZHVsZShuYXR1cmFsdmFyPTEpCgoJICAgIGJvdGggZm9ybXMgbWFrZSBzd2lnIHRyZWF0IGFsbCB0aGUgbWVtYmVyIHZhcmlhYmxlcyBpbiB0aGUKCSAgICBzYW1lIHdheSBpdCB0cmVhdHMgZ2xvYmFsIHZhcmlhYmxlcy4gCgoJICAgIEFsc28sIHlvdSBjYW4gdXNlIGl0IGluIGEgY2FzZSBieSBjYXNlIGFwcHJvYWNoIGZvcgoJICAgIHNwZWNpZmljIG1lbWJlciB2YXJpYWJsZXMgdXNpbmcgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICVuYXR1cmFsdmFyIEJhcjo6czsKCSAgICAKCSAgICBUaGVuLCBpbiB0aGUgZm9sbG93aW5nIGNhc2UgZm9yIGV4YW1wbGU6CgoJICAgICAgIHN0ZDo6c3RyaW5nIHM7CgkgICAgICAgc3RydWN0IEJhciB7CgkJIHN0ZDo6c3RyaW5nIHM7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB5b3UgY2FuIGRvOiAgCgoJICAgICAgIGIgPSBCYXIoKQoJICAgICAgIGIucyA9ImhlbGxvIgoJICAgICAgIGN2YXIucyA9ICJoZWxsbyIKCSAgICAgICAKCSAgICAgICBpZiAoYi5zICE9IGN2YXIucyk6CgkgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yCgoJCSAgCiAgICAgICAgICAgIFRoaXMgaXMgdmFsaWQgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgdGhlCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIGZvcmNpbmcgdGhlIHVzZSBvZiB0aGUgCiAgICAgICAgICAgIGNvbnN0IFNXSUdUWVBFJiAoQysrKS9TV0lHVFlQRSAoQykgdHlwZW1hcHMgZm9yIHRoZQogICAgICAgICAgICBnZXQvc2V0IG1ldGhvZHMgaW5zdGVhZCBvZiB0aGUgU1dJR1RZUEUgKiB0eXBlbWFwcy4KCSAgICBIZW5jZSwgZm9yICduYXR1cmFsdmFyJyB0byB3b3JrLCBlYWNoIHRhcmdldCBsYW5ndWFnZQoJICAgIG11c3QgaW1wbGVtZW50ICd0eXBlbWFwKGluL291dCkgY29uc3QgVHlwZSYnIHByb3Blcmx5LgoKCSAgICBUaGUgJ25hdHVyYWx2YXInIG9wdGlvbiByZXBsYWNlcyBvciBtYWtlcyB3b3JrYXJvdW5kcyBzdWNoICBhczoKCSAgICAKCQklYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp9CgogICAgICAgICAgICB1bm5lY2Vzc2FyeS4KCgkgICAgTm90ZTE6IElmIHlvdXIgaW50ZXJmYWNlIGhhcyBvdGhlciBraW5kcyBvZiB3b3JrYXJvdW5kcyB0bwoJICAgIGRlYWwgd2l0aCB0aGUgb2xkICd1bm5hdHVyYWwnIHdheSB0byBkZWFsIHdpdGggbWVtYmVyCgkgICAgdmFyaWFibGVzIChyZXR1cm5pbmcvZXhwZWN0aW5nIHBvaW50ZXJzKSwgdGhlCgkgICAgJ25hdHVyYWx2YXInIG9wdGlvbiBjb3VsZCBicmVhayB0aGVtLgoJICAgIAoJICAgIE5vdGUyOiB0aGUgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gdW5uYW1lZCB0eXBlcywgc3VjaAoJICAgIGFzIHVubmFtZWQgbmVzdGVkIHVuaW9ucy4KCSAgICAKCSAgCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBtb3JlICdleHByZXNzaXZlJyByZXN1bHQgc3RhdGVzIGZvciB0aGUgdHlwZW1hcAogICAgICAgICAgICBsaWJyYXJpZXMuCgoJICAgIEluIHRoZSBwYXN0LCBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlcywgeW91IHdvdWxkIGRvIGNoZWNraW5nIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgIGlmIChDb252ZXJ0UHRyKG9iaiwmdnB0cix0eSxmbGFncykgIT0gLTEpIHsKCSAgICAgICAgLy8gc3VjY2VzcwogICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgIC8vIGVycm9yCgkgICAgICB9CgoJICAgIE5vdyB0aGUgcmVzdWx0IHN0YXRlIGNhbiBjYXJyeSBtb3JlIGluZm9ybWF0aW9uLAoJICAgIGluY2x1ZGluZzoKCgkgICAgICAtIEVycm9yIHN0YXRlOiBsaWtlIHRoZSBvbGQgLTEvMCwgYnV0IHdpdGggZXJyb3IgY29kZXMgZnJvbSBzd2lnZXJyb3JzLnN3Zy4KCgkgICAgICAgICBpbnQgcmVzID0gQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpOwoJCSBpZiAoU1dJR19Jc09LKHJlcykpIHsKCQkgICAvLyBzdWNjZXNzIGNvZGUKICAgICAgICAgICAgICAgICB9IGVsc2UgewoJCSAgIFNXSUdfRXJyb3IocmVzKTsgLy8gcmVzIGNhcnJpZXMgdGhlIGVycm9yIGNvZGUKICAgICAgICAgICAgICAgICB9CgoJICAgICAgLSBDYXN0IHJhbms6IHdoZW4gcmV0dXJuaW5nIGEgc2ltcGxlIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgIGNvbnZlcnNpb24sIHlvdSBqdXN0IHJldHVybiBTV0lHX09LLCBidXQgaWYgeW91IG5lZWQKICAgICAgICAgICAgICAgIHRvIGRvIGEgJ2Nhc3QnLCB5b3UgY2FuIGFkZCB0aGUgY2FzdGluZyByYW5rLCBpZToKCQkKCQkgIGlmIChQeUZsb2F0X0NoZWNrKG9iaikpIHsKCQkgICAgdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKG9iaik7CgkJICAgIHJldHVybiBTV0lHX09LOwoJCSAgfSBlbHNlIGlmIChQeUludF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gKGRvdWJsZSkgUHlJbnRfQXNMb25nKG9iaik7CgkJICAgIHJldHVybiBTV0lHX0FkZENhc3QoU1dJR19PSyk7CQkgICAgCiAgICAgICAgICAgICAgICAgIH0KCQkKCQlsYXRlciwgdGhlIGNhc3RpbmcgcmFuayBpcyB1c2VkIHRvIHByb3Blcmx5IGRpc3BhdGNoCgkJdGhlIG92ZXJsb2FkZWQgZnVuY3Rpb24sIGZvciBleGFtcGxlLiBUaGlzIG9mIGNvdXJzZQoJCXJlcXVpcmVzIHlvdXIgbGFuZ3VhZ2UgdG8gc3VwcG9ydCBhbmQgdXNlIHRoZSBuZXcKCQlkaXNwYXRjaCBjYXN0L3JhbmsgbWVjaGFuaXNtIChOb3cgbWFpbmx5IHN1cHBvcnRlZCBpbgoJCXBlcmwgYW5kIHB5dGhvbiwgYW5kIGVhc2lseSBleHBhbmRhYmxlIHRvIHJ1YnkgYW5kIHRjbCkuCgkgICAgICAKCSAgLSBbVVRMXSBBZGQgc3VwcG9ydCBmb3IgdGhlIG5ldyAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcy4KCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCBzdXBwb3J0IGZvciB0aGUgQysrIGltcGxpY2l0IGNvbnZlcnNpb24gbWVjaGFuaXNtLCB3aGljaAogICAgICAgICAgICByZXF1aXJlZCBzb21lIG1vZGlmaWNhdGlvbnMgaW4gcGFyc2VyLnkgKHRvIHJlY29nbml6ZQogICAgICAgICAgICAnZXhwbGljaXQnKSBhbmQgb3ZlcmxvYWQuY3h4ICh0byByZXBsYWNlICRpbXBsaWNpdGNvbnYgYXMKICAgICAgICAgICAgbmVlZGVkKS4KCSAgICAKCSAgICBTdGlsbCwgcmVhbCBzdXBwb3J0IGluIGVhY2ggdGFyZ2V0IGxhbmd1YWdlIHJlcXVpcmVzIGVhY2gKCSAgICB0YXJnZXQgbGFuZ3VhZ2UgdG8gYmUgbW9kaWZpZWQuIFB5dGhvbiBwcm92aWRlcyBhbiBleGFtcGxlLAogICAgICAgICAgICBzZWUgYmVsb3cuCgoKCSAgLSBBZGQgc3VwcG9ydCBmb3IgbmF0aXZlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9ucywgaWUsIGlmIHlvdQogICAgICAgICAgICBoYXZlCgoJICAgICAgICAlaW1wbGljaXRjb252IEE7CgoJICAgICAgICBzdHJ1Y3QgQSB7CgkJICAgaW50IGlpOwoJCSAgIEEoKSB7aWkgPSAxO30KCQkgICBBKGludCkge2lpID0gMjt9CgkJICAgQShkb3VibGUpIHtpaSA9IDM7fQoJCSAgIGV4cGxpY2l0IEEoY2hhciAqcykge2lpID0gNDt9CgkJfTsKCQkKCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgogICAgICAgICAgICB5b3UgY2FuIGNhbGw6CgoJICAgICAgICBhID0gQSgpCgkgICAgICAgIGFpID0gQSgxKQoJICAgICAgICBhZCA9IEEoMS4wKQoJICAgICAgICBhcyA9IEEoImhlbGxvIikKCQkKCQkjIG9sZCBmb3JtcwoJICAgICAgICBnZXQoYSkgIC0+IDEKCSAgICAgICAgZ2V0KGFpKSAtPiAyCgkgICAgICAgIGdldChhZCkgLT4gMwoJICAgICAgICBnZXQoYXMpIC0+IDQKCQkKCQkjaW1wbGljaXQgY29udmVyc2lvbnMKCSAgICAgICAgZ2V0KDEpICAgICAgIC0+IDIKCSAgICAgICAgZ2V0KDEuMCkgICAgIC0+IDMKCSAgICAgICAgZ2V0KCJoZWxsbyIpIC0+IEVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKICAgICAgICAgICAgQWxzbywgYXMgaW4gQysrLCBub3cgaW1wbGljaXQgY29udmVyc2lvbnMgYXJlIHN1cHBvcnRlZCBpbgogICAgICAgICAgICB2YXJpYWJsZSBhc3NpZ21lbnRzLCBhbmQgaWYgeW91IGhhdmU6CgoJICAgICAgQSBnYTsKCSAgICAgIHN0cnVjdCBCYXIgewoJICAgICAgICBBIGE7CiAgICAgICAgICAgICAgfTsKCgkgICAgeW91IGNhbiBkbzoKCgkgICAgICBjdmFyLmdhID0gQSgxKQoJICAgICAgY3Zhci5nYSA9IDEKCSAgICAgIGN2YXIuZ2EgPSAxLjAKCSAgICAgIGN2YXIuZ2EgPSBBKCJoZWxsbyIpIAoJICAgICAgY3Zhci5nYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgICAgYiA9IEJhcigpCgkgICAgICBiLmEgPSBBKCJoZWxsbyIpCgkgICAgICBiLmEgPSAxCgkgICAgICBiLmEgPSAxLjAKCSAgICAgIGIuYSA9ICJoZWxsbyIgLT4gZXJyb3IsIGV4cGxpY2l0IGNvbnN0cnVjdG9yCgoJICAgIE5vdGUgdGhhdCB0aGUgbGFzdCBjYXNlLCBhc3NpZ25pbmcgYSBtZW1iZXIgdmFyIGRpcmVjdGx5LCAKCSAgICBhbHNvIHJlcXVpcmVzIHRoZSAnbmF0dXJhbHZhcicgb3B0aW9uLgoKCSAgICBUaGlzIHN1cHBvcnQgbm93IG1ha2VzIHRoZSBvbGQgJyVpbXBsaWNpdCcgbWFjcm8sIHdoaWNoCgkgICAgd2FzIGZvdW5kIGluICdpbXBsaWNpdC5pJyBhbmQgaXQgd2FzIGZyYWdpbGUgaW4gbWFueSB3YXlzLAoJICAgIG9ic29sZXRlLCBhbmQgeW91IHNob3VsZCB1c2UgdGhlIG5ldyAnJWltcGxpY2l0Y29udicKCSAgICBkaXJlY3RpdmUgaW5zdGVhZC4KCgkgICAgTm90ZSB0aGF0IHdlIGZvbGxvdyB0aGUgQysrIGNvbnZlbnRpb25zLCBpZSwgaW4gdGhlCgkgICAgZm9sbG93aW5nIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIGlzIGFsbG93ZWQ6CgoJCWludCBnZXQoQSBhKSB7cmV0dXJuIGEuaWk7fQoJCWludCBnZXQoY29uc3QgQSYgYSkge3JldHVybiBhLmlpO30KCSAgICAKCSAgICBidXQgbm90IGluIHRoZXNlIGNhc2VzOgoKCQlpbnQgZ2V0KEEgKmEpIHtyZXR1cm4gYS0+aWk7fQoJCWludCBnZXQoQSYgYSkge3JldHVybiBhLmlpO30KCQkKCSAgICBBbHNvLCBpdCB3b3JrcyBmb3IgZGlyZWN0b3IgbWV0aG9kcyB0aGF0IHJldHVybiBhIGJ5IHZhbHVlCgkgICAgcmVzdWx0LCBpZSwgdGhlIGZvbGxvd2luZyB3aWxsIHdvcms6CgogICAgICAgICAgICAgICAgdmlydHVhbCBBIGdldF9hKCkgPSAwOwoKCQlkZWYgZ2V0X2Eoc2VsZik6CgkJICAgcmV0dXJuIDEKCiAgICAgICAgICAgIGJ1dCBub3QgaW4gdGhpcyBjYXNlOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgY29uc3QgQSYgZ2V0X2EoKSA9IDA7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBKiBnZXRfYSgpID0gMDsKCSAgICAKCSAgTm90ZXM6CgoJICAtIHRoZSBpbXBsaWNpdGNvbnYgbWVjaGFuaXNtIGlzIGltcGxlbWVudGVkIGJ5IGRpcmVjdGx5CgkgICAgY2FsbGluZy9kaXNwYXRjaGluZyB0aGUgcHl0aG9uIGNvbnN0cnVjdG9yLCB0cmlnZ2VyaW5nIGEKCSAgICBjYWxsIHRvIHRoZSBfX2luaXRfX21ldGhvZC4gSGVuY2UsIGlmIHlvdSBleHBhbmRlZCB0aGUKCSAgICBfX2luaXRfXyBtZXRob2QsIGxpa2UgaW46CgoJICAgICAgICBjbGFzcyBBOgoJCSAgIGRlZiBfX2luaXRfXyhzZWxmLGFyZ3MpOgoJCSAgICAgIDxzd2lnIGNvZGU+CgkJICAgICAgPG15IGNvZGUgaGVyZT4KCiAgICAgICAgICAgIHRoZW4gJ215IGNvZGUnIHdpbGwgYWxzbyBiZSBleGVjdXRlZC4KCSAgICAKCSAgLSBTaW5jZSB0aGUgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgaXMgYSBTV0lHIGZlYXR1cmUsIGlmIHlvdSB0eXBlOgoJICAgIAogIAkgICAgICAgJWltcGxpY2l0Y29udjsgIAoKCSAgICB0aGF0IHdpbGwgZW5hYmxlIGltcGxpY2l0IGNvbnZlcnNpb24gZm9yIGFsbCB0aGUgY2xhc3NlcyBpbgoJICAgIHlvdXIgbW9kdWxlLgoKCSAgICBCdXQgaWYgeW91IGFyZSB3b3JyaWVkIGFib3V0IHBlcmZvcm1hbmNlLCBtYXliZSB0aGF0IHdpbGwgYmUKCSAgICB0b28gbXVjaCwgZXNwZWNpYWxseSBpZiB5b3UgaGF2ZSBvdmVybG9hZGVkIG1ldGhvZHMsIHNpbmNlCgkgICAgdG8gcmVzb2x2ZSB0aGUgZGlzcGF0Y2hpbmcgcHJvYmxlbSwgcHl0aG9uIHdpbGwgZWZlY3RpdmVseQoJICAgIHRyeSB0byBjYWxsIGFsbCB0aGUgaW1wbGljaXQgY29uc3RydWN0b3JzIGFzIG5lZWRlZC4KCgkgIC0gRm9yIHRoZSBzYW1lIHJlYXNvbiwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgeW91IHVzZQogICAgICAgICAgICB0aGUgbmV3ICdjYXN0bW9kZScgd2hlbiBtaXhpbmcgaW1wbGljaXQgY29udmVyc2lvbiBhbmQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcuCgoJIC0gW3B5dGhvbl0gVGhlICVpbXBsaWNpdCBkaXJlY3RpdmUgaXMgZGVjbGFyZWQgb2Jzb2xldGUsIGFuZAogICAgICAgICAgIHlvdSBzaG91bGQgdXNlICVpbXBsaWNpdGNvbnYgaW5zdGVhZC4gSWYgeW91IGluY2x1ZGUKCSAgIHRoZSBpbXBsaWNpdC5pIGZpbGUsIGEgd2FybmluZyB3aWxsIHJlbWluZCB5b3Ugb2YgdGhpcy4KCgkgICBOb3RlOiBTaW5jZSAlaW1wbGljaXQgaXMgZnJhZ2lsZSwganVzdCByZXBsYWNpbmcgaXQgYnkKCSAgICVpbXBsaWNpdGNvbnYgY291bGQgbGVhZCB0byBkaWZmZXJlbnQgYmVoYXZpb3IuIEhlbmNlLCB3ZQoJICAgZG9uJ3QgYXV0b21hdGljYWxseSBzd2l0Y2ggZnJvbSB0byB0aGUgb3RoZXIsIGFuZCB0aGUgdXNlcgoJICAgbXVzdCBtaWdyYXRlIHRvIHRoZSBuZXcgJWltcGxpY2l0Y29udiBkaXJlY3RpdmUgbWFudWFsbHkuCgoKMTIvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXQogICAgICAgICAgICBNb2RpZnkgc3RkOjp2ZWN0b3Igd3JhcHBlcnMgdG8gdXNlIHN0ZDo6dmVjdG9yOjp2YWx1ZV90eXBlIGFzIHRoaXMgaXMKICAgICAgICAgICAgY2xvc2VyIHRvIHRoZSByZWFsIFNUTCBkZWNsYXJhdGlvbnMgZm9yIHNvbWUgbWV0aG9kcywgZWcgZm9yIHB1c2hfYmFjaygpLgogICAgICAgICAgICBGaXhlcyBzb21lIGNvbXBpbGF0aW9uIGVycm9ycyBmb3Igc29tZSBjb21waWxlcnMgZWcgd2hlbiB0aGUgdGVtcGxhdGVkCiAgICAgICAgICAgIHR5cGUgaXMgYSBwb2ludGVyLgoKICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yIGltcHJvdmVtZW50cyAtIGEgZmV3IG1vcmUgbWV0aG9kcyBhcmUgd3JhcHBlZCBhbmQgc3BlY2lhbGl6YXRpb25zIGFyZQogICAgICAgICAgICBubyBsb25nZXIgcmVxdWlyZWQuIFRoZSBzcGVjaWFsaXplX3N0ZF92ZWN0b3IgbWFjcm8gaXMgbm8gbG9uZ2VyIG5lZWRlZCAoYQogICAgICAgICAgICB3YXJuaW5nIGlzIGlzc3VlZCBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gdXNlIGl0KS4KCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgQWRkIGluIHBvaW50ZXIgcmVmZXJlbmNlIHR5cGVtYXBzLiBUaGlzIGFsc28gZW5hYmxlcyBvbmUgdG8gZWFzaWx5IHdyYXAKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gd2hlcmUgVCBpcyBhIHBvaW50ZXIuCgoxMi8yNC8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFRoZSBjZmZpIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEZ1bGx5IHN1cHBvcnRzIEMsIGJ1dCBwcm92aWRlcyBsaW1pdGVkIHN1cHBvcnRzIGZvciBDKyssIGluCiAgICAgICAgICAgICAgIHBhcnRpY3VsYXIgQysrIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyBhbmQgb3ZlcmxvYWRpbmcgbmVlZHMgdG8KICAgICAgICAgICAgICAgYmUgd29ya2VkIHVwb24uIAoKMTIvMjMvMjAwNTogbW1hdHVzCgkgICAgW3B5dGhvbl0gQWRkIHRoZSBjYXN0bW9kZSB0aGF0IGFsbG93cyB0aGUgcHl0aG9uCgkgICAgdHlwZSBjYXN0aW5nIHRvIG9jY3VyLgoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgJ2ludCBmb28oaW50KScsIG5vdwoJICAgIAoJICAgICAgY2xhc3MgQWkoKToKCSAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLHgpOiAKCQkgICAgc2VsZi54ID0geAoJICAgICAgICAgZGVmIF9faW50X18oc2VsZik6IAoJCSAgICByZXR1cm4gc2VsZi54CgoJICAgICAgZm9vKDEpICAgLy8gT2sKCSAgICAgIGZvbygxLjApIC8vIE9rCgkgICAgICBmb28oMS4zKSAvLyBFcnJvcgoJICAgICAgYSA9IEFpKDQpCiAgICAgICAgICAgICAgZm9vKGFpKSAgLy8gT2sKCiAgICAgICAgICAgIFRoZSBjYXN0bW9kZSwgd2hpY2ggY2FuIGJlIGVuYWJsZWQgZWl0aGVyIHdpdGggdGhlCiAgICAgICAgICAgICctY2FzdG1vZGUnIG9wdGlvbiBvciB0aGUgJW1vZHVsZSgiY2FzdG1vZGUiKSBvcHRpb24sIHVzZXMKICAgICAgICAgICAgdGhlIG5ldyBjYXN0L3JhbmsgZGlzcGF0Y2ggbWVjaGFuaXNtLiBIZW5jZSwgbm93IGlmIHlvdQogICAgICAgICAgICBoYXZlICdpbnQgZm9vKGludCk7IGludCBmb28oZG91YmxlKTsnLCB0aGUgZm9sbG93aW5nIHdvcmtzCiAgICAgICAgICAgIGFzIGV4cGVjdGVkOgoKCSAgICAgIGZvbygxKSAgIC0+IGZvbyhpbnQpCgkgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQoJICAgICAgYWkgPSBBaSg0KQoJICAgICAgZm9vKGFpKSAgLT4gZm9vKGludCkKCgkgICAgTm90ZTE6IHRoZSAnY2FzdG1vZGUnIGNvdWxkIGRpc3J1cHQgc29tZSBzcGVjaWFsaXplZAoJICAgIHR5cGVtYXBzLiBJbiBwYXJ0aWN1bGFyLCB0aGUgImltcGxpY2l0LmkiIGxpYnJhcnkgc2VlbXMgdG8KCSAgICBoYXZlIHByb2JsZW0gd2l0aCB0aGUgY2FzdG1vZGUuIEJ1dCBiZXNpZGVzIHRoYXQgb25lLCB0aGUKCSAgICBlbnRpcmUgdGVzdC1zdWl0ZSBjb21waWxlcyBmaW5lIHdpdGggYW5kIHdpdGhvdXQgdGhlCgkgICAgY2FzdG1vZGUuCgogCSAgICBOb3RlMjogdGhlIGNhc3QgbW9kZSBjYW4ndCBiZSBjb21iaW5lZCB3aXRoIHRoZSBmYXN0CgkgICAgZGlzcGF0Y2ggbW9kZSwgaWUsIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiBoYXMgbm8gZWZmZWN0CgkgICAgd2hlbiB0aGUgY2FzdCBtb2RlIGlzIHNlbGVjdGVkLiBUaGUgcGVuYWx0aWVzLCBob3dldmVyLAoJICAgIGFyZSBtaW5pbXVtIHNpbmNlIHRoZSBjYXN0IGRpc3BhdGNoIGNvZGUgaXMgYWxyZWFkeSBiYXNlZAoJICAgIG9uIHRoZSBzYW1lIGZhc3QgZGlzcGF0Y2ggbWVjaGFuaXNtLgoKCSAgICBTZWUgdGhlIGZpbGUgb3ZlcmxvYWRfZGlzcGF0Y2hfY2FzdF9ydW5tZS5weSBmaWxlIGZvcgoJICAgIG5ldyBjYXNlcyBhbmQgZXhhbXBsZXMuCgoxMi8yMi8yMDA1OiBtbWF0dXMKCSAgICBBZGQgdGhlIGNhc3QgYW5kIHJhbmsgbWVjaGFuaXNtIHRvIGRpc3BhdGNoIG92ZXJsb2FkaW5nCgkgICAgZnVuY3Rpb25zLiBUaGUgVVRGIHN1cHBvcnRzIGl0IG5vdywgYnV0IGZvciBlYWNoIGxhbmd1YWdlCgkgICAgaXQgbXVzdCBiZSBkZWNpZGVkIGhvdyB0byBpbXBsZW1lbnQgYW5kL29yIHdoZW4gdG8gdXNlIGl0LgoKCSAgICBbcGVybF0gTm93IHBlcmwgdXNlcyB0aGUgbmV3IGNhc3QgYW5kIHJhbmsgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIHdoaWNoIHNvbHZlcyBhbGwgdGhlIHBhc3QgcHJvYmxlbXMga25vd24gCgkgICAgaW4gcGVybCwgc3VjaCBhcyB0aGUgb2xkICcrIDEnIHByb2JsZW06CgoJICAgICAgICBpbnQgZm9vKGludCk7CgkgICAgCgkJJG4gPSAxCiAgICAgICAgICAgICAgICAkbiA9ICRuICsgMQogICAgICAgICAgICAgICAgJHIgPSBmb28obikKCiAgICAgICAgICAgIGFsc28gd29ya3M6CgogICAgICAgICAgICAgICAgIGZvbygxKTsKICAgICAgICAgICAgICAgICBmb28oIjEiKTsKICAgICAgICAgICAgICAgICBmb28oMS4wKTsKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpOwoKICAgICAgICAgICAgIGJ1dCBmYWlscwoKICAgICAgICAgICAgICAgICBmb28oImwiKTsKCiAgICAgICAgICAgICBhbmQgd2hlbiBvdmVybG9hZGluZyAgZm9vKGludCkgYW5kIGZvbyhkb3VibGUpOwoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGVycm9yCgkJIGZvbygkbikgLT4gZm9vKGludCkgIGZvciBnb29kIHBlcmwgdmVyc2lvbnMKCQkgZm9vKCRuKSAtPiBmb28oZG91YmxlKSAgZm9yIG9sZCBiYWQgcGVybCB2ZXJzaW9ucwoKCSAgICAgd2hlbiBvdmVybG9hZGluZyBmb28oaW50KSwgZm9vKGNoYXIqKSBhbmQgZm9vKGRvdWJsZSk6CgogICAgICAgICAgICAgICAgIGZvbygxKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygxLjApIC0+IGZvbyhkb3VibGUpCiAgICAgICAgICAgICAgICAgZm9vKCIxIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGNoYXIqKQogICAgICAgICAgICAgICAgIGZvbygibCIpIC0+IGZvbyhjaGFyKikKCiAgICAgICAgICAgICBOb3RlOiBJbiBwZXJsIHRoZSBvbGQgZGlzcGF0Y2ggbWVjaGFuaXNtIHdhcyBicm9rZW4sCiAgICAgICAgICAgICBzbywgd2UgZG9uJ3QgcHJvdmlkZSBhbiBvcHRpb24gdG8gZW5hYmxlIHRoZSBvbGQgb25lCgkgICAgIHNpbmNlLCBhZ2FpbiwgaXQgd2FzIHJlYWxseSByZWFsbHkgYnJva2VuLgoKCSAgICAgU2VlICdvdmVybG9hZF9zaW1wbGVfcnVubWUucGwnIGZvciBtb3JlIGNhc2VzIGFuZCB0ZXN0cy4KCgkgICAgIFBTOiBhbGwgdGhlIG9sZCBrbm93biBpc3N1ZXMgYXJlIGRlY2xhcmVkIHJlc29sdmVkLCBhbnkKCSAgICAgbmV3ICJwcm9ibGVtIiB0aGF0IGNvdWxkIGJlIGRpc2NvdmVyZWQgaXMgZGVjbGFyZWQsIAoJICAgICBhIHByaW9yaSwgYXMgImZlYXR1cmVzIiBvZiB0aGUgbmV3IGRpc3BhdGNoIG1lY2hhbmlzbQoJICAgICAodW50aWwgd2UgZmluZCBhbm90aGVyIHNvbHV0aW9uIGF0IGxlYXN0KS4KCSAgICAgCgkgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoJICAgIEFzIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiB0aGUgVVRGLCBzb21lIHRoaW5ncyBjb3VsZAoJICAgIG5vdyBzdGFydCB0byB3b3JrIGFzIGV4cGVjdGVkLCBhbmQgcGVvcGxlIHVzZWQgdG8gZGVhbCBvcgoJICAgIHdvcmthcm91bmQgcHJldmlvdXMgYnVncyByZWxhdGVkIHRvIHRoZSBkaXNwYXRjaAoJICAgIG1lY2hhbmlzbSwgY291bGQgc2VlIG5vdyBhIGRpZmZlcmVuY2UgaW4gcGVybCBiZWhhdmlvci4KCjEyLzIxLzIwMDU6IG1tYXR1cwoJICAtIFRoZSAnLW5vZGVmYXVsdCcgZmxhZyAocHJhZ21hIGFuZCBmZWF0dXJlKSBub3cgZ2VuZXJhdGVzCgkgICAgYSB3YXJuaW5nLCBhbmQgcmVjb21tZW5kcyB0byB1c2UgdGhlIGV4cGxpY2l0CgkgICAgLW5vZGVmYXVsdGN0b3IgYW5kICAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoJICAgIFRoZSByZWFzb24gdG8gc3BsaXQgdGhlICdub2RlZmF1bHQnIGJlaGF2aW9yIGlzIHRoYXQsIGluCgkgICAgZ2VuZXJhbCwgaWdub3JpbmcgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciBnZW5lcmF0ZXMgbWVtb3J5CgkgICAgbGVha3MgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gSGVuY2UsIGlzIHRvbyByaXNreSBqdXN0IHRvCgkgICAgZGlzYWJsZSBib3RoIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9yCgkgICAgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgSWYgeW91IG5lZWQgdG8gZGlzYWJsZSB0aGUgZGVmYXVsdCBkZXN0cnVjdG9yLCBpdCBpcwoJICAgIGFsc28gcmVjb21tZW5kZWQgeW91IHVzZSB0aGUgZGlyZWN0aXZlIGZvcm06CgoJICAgICAgICVub2RlZmF1bHRkdG9yICBNeVZlcnlTcGVjaWFsQ2xhc3M7CgogICAgICAgICAgICBmb3Igc3BlY2lmaWMgY2xhc3NlcywgYW5kIGFsd2F5cyBhdm9pZCB1c2luZyB0aGUgZ2xvYmFsCiAgICAgICAgICAgIC1ub2RlZmF1bHQgYW5kIC1ub2RlZmF1bHRkdG9yIG9wdGlvbnMuCgkgICAgCjEyLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgRml4IGluY29ycmVjdCBjb2RlIGdlbmVyYXRpb24gd2hlbiB0aGUgaW50ZXJtZWRpYXJ5IGNsYXNzbmFtZSBpcyBjaGFuZ2VkCiAgICAgICAgICAgIGluIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGZyb20gaXRzIGRlZmF1bHQuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbW9kdWxlKGpuaWNsYXNzbmFtZT0ibXlpbWNsYXNzbmV3bmFtZSIpICJteW1vZHVsZSIgLy8gSmF2YQogICAgICAgICAgICAgICVtb2R1bGUoaW1jbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEMjCgogICAgICAgICAgICBBZGQgaW4gbmV3IHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lLiBTZWUgZG9jcy4KCjEyLzE3LzIwMDU6IG1tYXR1cwoJICBbUHl0aG9uXQoJICAtIEFkZCB0aGUgLWFsaWFzb2JqMC8tbm9hbGlhc29iajAgb3B0aW9ucyB0byB1c2Ugd2l0aAoJICAgIC1mYXN0dW5wYWNrIGFuZC9vciAtTyBhbmQgb2xkIHR5cGVtYXBzIHRoYXQgdXNlICdvYmowJwoJICAgIGRpcmVjdGx5LgoKCSAgICBTbywgaWYgeW91IGNvbXBpbGUgeW91ciBjb2RlIHVzaW5nIC1PIGFuZCBnZXQgZXJyb3JzIGFib3V0CgkgICAgdGhlIHVuZGVjbGFyZWQgJ29iajAnIHZhcmlhYmxlLCBydW4gYWdhaW4gdXNpbmcgCgoJCXN3aWcgLU8gLWFsaWFzb2JqMCAtcHl0aG9uIC4uLi4KCSAgICAKCSAgICBGb3IgbmV3IHR5cGVtYXBzLCBuZXZlciB1c2UgJ29iajAnIGRpcmVjdGx5LCBpZiBuZWVkZWQsCgkgICAgdXNlIHRoZSAnJHNlbGYnIG5hbWUgdGhhdCB3aWxsIGJlIHByb3Blcmx5ICBleHBhbmRlZCB0bwoJICAgICdvYmowJyAobm9mYXN0dW5wYWNrKSBvciAnc3dpZ19vYmpbMF0nIChmYXN0dW5wYWNrKS4gCiAgCgkgICAgSWYgeW91IGhhdmUgbm8gaWRlYSB3aGF0IEkgYW0gdGFsa2luZyBhYm91dCwgYmV0dGVyLCB0aGF0CgkgICAgbWVhbnMgeW91IGhhdmUgbm8gdHlwZW1hcCB3aXRoIHRoaXMgcHJvYmxlbS4KCgoxMi8xNC8yMDA1OiBtbWF0dXMgCSAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1mYXN0dW5wYWNrLy1ub2Zhc3R1bnBhY2sgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSB1c2Ugb2YgdGhlIGludGVybmFsIFVucGFja1R1cGxlIG1ldGhvZCwgaW5zdGVhZCBvZgoJICAgIGNhbGxpbmcgdGhlIG9uZSBmcm9tIHRoZSBweXRob24gQyBBUEkuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtZmFzdHVucGFjay4KCSAgICAKCjEyLzExLzIwMDU6IG1tYXR1cyAKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1wcm94eWRlbC8tbm9wcm94eWRlbCBvcHRpb25zIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgdGhlIGdlbmVyYXRpb24gb2YgcHJveHkvc2hhZG93IF9fZGVsX18gbWV0aG9kcywgZXZlbgoJICAgIHdoZW4gbm93IHRoZXkgYXJlIHJlZHVuZGFudCwgc2luY2UgdGhleSBhcmUgZW1wdHkuCgkgICAgSG93ZXZlciwgb2xkIGludGVyZmFjZXMgY291bGQgcmVseSBvbiBjYWxsaW5nIHRoZW0uCgoJICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYXRlIHRoZSBfX2RlbF9fIG1ldGhvZHMKCSAgICBhcyBpbiAxLjMuMjcgb3Igb2xkZXIgc3dpZyB2ZXJzaW9ucy4KCgkgICAgVGhlIG9wdGlvbiAtTyBub3cgYWxzbyBpbXBsaWVzIC1ub3Byb3h5ZGVsLgoKMTIvMTAvMjAwNTogbW1hdHVzIAoJICBbVVRGXQogICAgICAgICAgLSBGaXggdW5uZWNlc3NhcnkgY2FsbHMgdG8gU1dJR19UeXBlUXVlcnkgZm9yICdjaGFyIConCgkgICAgYW5kICd3Y2hhcl90IConLCBwcm9ibGVtIGZvdW5kIGJ5IENsYXkgQ3VsdmVyIHdoaWxlCgkgICAgcHJvZmlsaW5nIHRoZSBQeU9ncmUgcHJvamVjdC4KCgkgIAoJICBbUHl0aG9uXSAKCSAgLSBBZGQgdGhlIC1kaXJ2dGFibGUvLW5vZGlydnRhYmxlIHRvIGVuYWJsZS9kaXNhYmxlCgkgICAgYSBwc2V1ZG8gdmlydHVhbCB0YWJsZSB1c2VkIGZvciBkaXJlY3RvcnMsIGF2b2lkaW5nCgkgICAgdGhlIG5lZWQgdG8gcmVzb2x2ZSB0aGUgcHl0aG9uIG1ldGhvZCBhdCBlYWNoIGNhbGwuCgkgICAgCgkgIC0gQWRkIHRoZSAtc2FmZWNzdHJpbmdzLy1ub3NhZmVjc3RyaW5ncyBvcHRpb25zIHRvCgkgICAgZW5hYmxlL2Rpc2FibGUgdGhlIHVzZSBvZiBzYWZlIGNvbnZlcnNpb25zIGZyb20gUHlTdHJpbmcKCSAgICB0byBjaGFyICouIFB5dGhvbiByZXF1aXJlcyB5b3UgdG8gbmV2ZXIgY2hhbmdlIHRoZSBpbnRlcm5hbAoJICAgIGJ1ZmZlciBkaXJlY3RseSwgYW5kIGhlbmNlICdzYWZlY3RyaW5ncycgd2FycmFudGllcyB0aGF0CgkgICAgYnV0IHJldHVybmluZyBhIGNvcHkgb2YgdGhlIGludGVybmFsIHB5dGhvbiBzdHJpbmcgYnVmZmVyLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcHJldmlvdXMgcmVsZWFzZXMsIGlzIHRvIHJldHVybiBhCgkgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIChub3NhZmVjc3RyaW5ncyksIHNvLCBpdCBpcyB0aGUgdXNlcidzCgkgICAgcmVzcG9uc2liaWxpdHkgdG8gYXZvaWQgaXRzIG1vZGlmaWNhdGlvbi4KCSAgICAKCSAgLSBBZGQgdGhlIC1PIG9wdGlvbiB0byBlbmFibGUgYWxsIHRoZSBvcHRpbWl6YXRpb24gb3B0aW9ucwoJICAgIGF0IG9uY2UsIGluaXRpYWxseSBlcXVpdmFsZW50IHRvCgoJICAgIC1tb2Rlcm4gLWZhc3RkaXNwYXRjaCAtZGlydnRhYmxlIC1ub3NhZmVjc3RyaW5ncyAtZnZpcnR1YWwKCjEyLzA4LzIwMDU6IG1tYXR1cyAKCgkgIC0gQWRkIHRoZSAtZmFzdGRpc3BhdGNoIG9wdGlvbiAoZmFzdGRpc3BhdGNoIGZlYXR1cmUpLiBUaGlzCgkgICAgZW5hYmxlcyB0aGUgImZhc3QgZGlzcGF0Y2giIG1lY2hhbmlzbSBmb3Igb3ZlcmxvYWRlZAoJICAgIG1ldGhvZHMgcHJvdmlkZWQgYnkgU2FsdmFkb3IgRmFuZGl+bm8gR2FyYydpYSAoIzkzMDU4NikuCgoJICAgIFRoZSByZXN1bHRpbmcgY29kZSBpcyBzbWFsbGVyIGFuZCBmYXN0ZXIgc2luY2UgbGVzcyB0eXBlCgkgICAgY2hlY2tpbmcgaXMgcGVyZm9ybWVkLiBIb3dldmVyLCB0aGUgZXJyb3IgbWVzc2FnZXMgeW91CgkgICAgZ2V0IHdoZW4gdGhlIG92ZXJsb2FkaW5nIGlzIG5vdCByZXNvbHZlZCBjb3VsZCBiZQoJICAgIGRpZmZlcmVudCBmcm9tIHdoYXQgdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCByZXR1cm5zLgoKCSAgICBXaXRoIHRoZSBvbGQgbWV0aG9kIHlvdSBhbHdheXMgZ2V0IGFuIGVycm9yIHN1Y2ggYXMgCgoJICAgICAgICJObyBtYXRjaGluZyBmdW5jdGlvbiBmb3Igb3ZlcmxvYWRlZCAuLi4iCgogICAgICAgICAgICB3aXRoIHRoZSBuZXcgbWV0aG9kIHlvdSBjYW4gYWxzbyBnZXQgZXJyb3JzIHN1Y2ggYXMKCgkgICAgICAgIlR5cGUgZXJyb3IgaW4gYXJndW1lbnQgMSBvZiB0eXBlIC4uLiIKCgkgICAgU2VlIGJ1ZyByZXBvcnQgIzkzMDU4NiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgICAKICAJICAgIFNvLCB0aGlzIG9wdGltaXphdGlvbiBtdXN0IGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBieSB1c2Vycy4KCgkgICAgVGhlIG5ldyBtZWNoYW5pc20gY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgIHN3aWcgLWZhc3RkaXNwYXRjaAoKICAgICAgICAgICAgb3IgdXNpbmcgdGhlIGZlYXR1cmUgZm9ybQoKCSAgICAgICVmZWF0dXJlKCJmYXN0ZGlzcGF0Y2giKSBtZXRob2Q7CiAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgJWZhc3RkaXNwYXRjaCBtZXRob2Q7CgkgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMgCgogICAgICAgICAgLSBTZXZlcmFsIG1lbW9yeSBhbmQgc3BlZWQgaW1wcm92ZW1lbnRzLCBzcGVjaWFsbHkgZm9yCgkgICAgdGVtcGxhdGVzLiBOb3cgc3dpZyBpcyB1cCB0byAyMCBmYXN0ZXIgdGhhbiBiZWZvcmUgZm9yCgkgICAgbGFyZ2UgdGVtcGxhdGUgaW50ZXJmYWNlcywgc3VjaCBhcyB0aGUgc3RkX2NvbnRhaW5lcnMuaQoJICAgIGFuZCB0ZW1wbGF0ZV9tYXRyaXguaSBmaWxlcyBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUuCgoJICAgIE1lbW9yeSBmb290cHJpbnQgaXMgYWxzbyByZWR1Y2VkIGluIGNvbnNpZGVyYXRpb24gb2Ygc21hbGwKCSAgICBwY3MvYXJjaGl0ZWN0dXJlcy4KCgkgIC0gYWRkIGNvbW1hbmRsaW5lIG9wdGlvbnMgLWNwcGVycmFzd2FybiBhbmQgLW5vY3BwZXJyYXN3YXJuIiB0byBmb3JjZQogICAgICAgICAgICB0aGUgc3dpZyBwcmVwcm9jZXNzb3IgdG8gdHJlYXQgdGhlICNlcnJvciBkaXJlY3RpdmUgYXMgYSAjd2FybmluZy4KCSAgICAKCSAgICB0aGUgcHJhZ21hcwoKICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIGNwcGVycmFzd2Fybj0xCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MAoJICAgICAgIAoJICAgIGFyZSBlcXVpdmFsZW50IHRvIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LgogICAgICAgICAgICAgCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBUaGUgZ2VuZXJhdGVkIGNvZGUgaXMgbm93IG1vcmUgcG9ydGFibGUsIGVzcGVjaWFsbHkKCSAgICBmb3IgV2luZG93cy4gRm9sbG93aW5nIAoKICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnB5dGhvbi5vcmcvZG9jL2ZhcS93aW5kb3dzLmh0bWwKCiAgICAgICAgICAgIFB5X05vbmUgaXMgbmV2ZXIgYWNjZXNzZWQgYXMgYSBzdHJ1Y3R1cmUsIHBsdXMgb3RoZXIKICAgICAgICAgICAgdHJpY2tzIG1lbnRpb25lZCB0aGVyZS4KCjEyLzA2LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZGVkIGluaXRpYWwgc3VwcG9ydCBmb3IgdGhyZWFkcyBiYXNlZCBpbiB0aGUKCSAgICBwcm9wb3NhbCBieSBKb3NlcGggV2luc3Rvbi4KCgkgICAgVGhlIHVzZXIgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CgoJICAgIDEuLSB0aGUgbW9kdWxlIHRocmVhZCBzdXBwb3J0IGlzIGVuYWJsZSB2aWEgdGhlICJ0aHJlYWRzIiBtb2R1bGUKICAgICAgICAgICAgICAgIG9wdGlvbiwgaS5lLgoKICAgICAgICAgICAgICAgICAgJW1vZHVsZSgidGhyZWFkcyI9MSkKCiAgICAgICAgICAgIDIuLSBFcXVpdmFsZW50IHRvIHRoYXQsIGlzIHRoZSBuZXcgJy10aHJlYWRzJyBzd2lnIG9wdGlvbgoKICAgICAgICAgICAgICAgICAgc3dpZyAtdGhyZWFkcyAtcHl0aG9uIC4uLgoKICAgICAgICAgICAgMy4tIFlvdSBjYW4gcGFydGlhbGx5IGRpc2FibGUgdGhyZWFkIHN1cHBvcnQgZm9yIGEgZ2l2ZW4KICAgICAgICAgICAgICAgIG1ldGhvZCB1c2luZzoKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZCIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWQgbWV0aG9kOwoKICAgICAgICAgICAgICAgIGFsc28sIHlvdSBjYW4gZGlzYWJsZSBzZWN0aW9ucyBvZiB0aGUgdGhyZWFkIHN1cHBvcnQsIAogICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGJsb2NrIikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGJsb2NrIG1ldGhvZDsKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3RocmVhZGFsbG93IikgbWV0aG9kOwogICAgICAgICAgICAgICAgb3IKCQkgICVub3RocmVhZGFsbG93IG1ldGhvZDsKCiAgICAgICAgICAgICAgICB0aGUgZmlyc3QgZGlzYWJsZXMgdGhlIEMrKy9weXRob24gdGhyZWFkIHByb3RlY3Rpb24sIGFuZCB0aGUKICAgICAgICAgICAgICAgIHNlY29uZCBkaXNhYmxlcyB0aGUgcHl0aG9uL0MrKyB0aHJlYWQgcHJvdGVjdGlvbi4gCgogICAgICAgICAgICA0Li0gVGhlIGN1cnJlbnQgdGhyZWFkIHN1cHBvcnQgaXMgYmFzZWQgaW4gdGhlIFB5R0lMCiAgICAgICAgICAgICAgICBleHRlbnNpb24gcHJlc2VudCBpbiBweXRob24gdmVyc2lvbiAyLjMgb3IgbGF0ZXIsIGJ1dAogICAgICAgICAgICAgICAgeW91IGNhbiBwcm92aWRlIHRoZSB0aHJlYWQgY29kZSBmb3Igb2xkZXIgdmVyc2lvbnMgYnkKICAgICAgICAgICAgICAgIGRlZmluaW5nIHRoZSBtYWNyb3MgaW4gcHl0aHJlYWRzLnN3Zy4KCgkJSWYgeW91IGdldCBhIHdvcmtpbmcgaW1wbGVtZW50YXRpb24gZm9yIG9sZGVyIHZlcnNpb25zLAoJCXBsZWFzZSBzZW5kIHVzIGEgcGF0Y2guCgogICAgICAgICAgICBGb3IgdGhlIGN1cmlvdXMgYWJvdXQgcGVyZm9ybWFuY2UsIGhlcmUgYXJlIHNvbWUgbnVtYmVycwogICAgICAgICAgICBmb3IgdGhlIHByb2ZpbGV0ZXN0LmkgdGVzdCwgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB0aGUgc3BlZWQKCSAgICBvZiB0aGUgd3JhcHBlZCBjb2RlOgoKCSAgICAgICAgbm90aHJlYWQgICAgICAgICAgIDkuNnMgIChubyB0aHJlYWQgY29kZSkKCQlub3RocmVhZGJsb2NrICAgICAxMi4ycyAgKG9ubHkgJ2FsbG93JyBjb2RlKQoJCW5vdGhyZWFkYWxsb3cgICAgIDEzLjZzICAob25seSAnYmxvY2snIGNvZGUpCiAgICAgICAgICAgICAgICBmdWxsIHRocmVhZCAgICAgICAxNS41cyAgKCdhbGxvdycgKyAnYmxvY2snIGNvZGUpCgkgICAgCgkgICAgaS5lLiwgZnVsbCB0aHJlYWQgY29kZSBkZWNyZWFzZXMgdGhlIHdyYXBwaW5nIHBlcmZvcm1hbmNlIGJ5CgkgICAgYXJvdW5kIDYwJS4gSWYgdGhhdCBpcyBpbXBvcnRhbnQgdG8geW91ciBhcHBsaWNhdGlvbiwgeW91CgkgICAgY2FuIHR1bmUgZWFjaCBtZXRob2QgdXNpbmcgdGhlIGRpZmZlcmVudCAnbm90aHJlYWQnLAoJICAgICdub3RocmVhZGJsb2NrJyBvciAnbm90aHJlYWRhbGxvdycgZmVhdHVyZXMgYXMKCSAgICBuZWVkZWQuIE5vdGUgdGhhdCBmb3Igc29tZSBtZXRob2RzIGRlYWN0aXZhdGluZyB0aGUKCSAgICAndGhyZWFkIGJsb2NrJyBvciAndGhyZWFkIGFsbG93JyBjb2RlIGlzIG5vdCBhbiBvcHRpb24sCgkgICAgc28sIGJlIGNhcmVmdWwuCgkgICAgCgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgdXNlIHN5c3RlbSBhbmdsZSBicmFja2V0cyBldmVyeXdoZXJlIGZvciAlaW5jbHVkZSwgZWcKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX2NvbW1vbi5pIgogICAgICAgICAgICBiZWNvbWVzCiAgICAgICAgICAgICAgJWluY2x1ZGUgPHN0ZF9jb21tb24uaT4KCjExLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10KICAgICAgICAgICAgVHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcyBoYXZlIGFuIGV4dHJhIGNvbnN0cnVjdG9yIHNvIHRoYXQgZW51bSBpdGVtIHZhbHVlcyB0aGF0CiAgICAgICAgICAgIGFyZSBpbml0aWFsaXNlZCBieSBhbm90aGVyIGVudW0gaXRlbSB2YWx1ZSBjYW4gYmUgd3JhcHBlZCB3aXRob3V0IGhhdmluZyB0byB1c2UgJWphdmFjb25zdHZhbHVlLwogICAgICAgICAgICAlY3Njb25zdHZhbHVlIGZvciB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkuIFN1Z2dlc3Rpb24gYnkKICAgICAgICAgICAgQm9iIE1hcmluaWVyL0RvdWdsYXMgUGVhcnNvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bQogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB4eXosCiAgICAgICAgICAgICAgICAgbGFzdCA9IHh5egogICAgICAgICAgICAgIH0gcmVwZWF0OwoKMTEvMjEvMjAwNTogbW1hdHVzCgkgICAgW3J1YnkgKyBweXRob25dCgoJICAgIEZpeGVzIGZvciBkaXJlY3RvcnMgKyBwb2ludGVycy4gVGhpcyBpcyBhbiB1Z2x5IHByb2JsZW0gd2l0aG91dCBhbiBlYXN5CgkgICAgc29sdXRpb24uIEJlZm9yZSB3ZSBpZGVudGlmaWVkIHRoaXMgY2FzZSBhcyBwcm9ibGVtYXRpYzoKCgkgICAgICAgICAgdmlydHVhbCBjb25zdCBNeUNsYXNzJiBteV9tZXRob2QoKTsKCiAgICAgICAgICAgIGJ1dCBpdCB0dXJucyBvdXQgdGhhdCBhbGwgdGhlIGNhc2VzIHdoZXJlIGEgcG9pbnRlciwgYXJyYXkgb3IKICAgICAgICAgICAgcmVmZXJlbmNlIGlzIHJldHVybmVkLCBhcmUgcHJvYmxlbWF0aWMsIGV2ZW4gZm9yIAoJICAgIHByaW1pdGl2ZSB0eXBlcyAoYXMgaW50LCBkb3VibGUsIGNoYXIqLCBldGMpLgoKCSAgICBUbyB0cnkgdG8gZml4IHRoZSBpc3N1ZSwgYSBuZXcgdHlwZW1hcCB3YXMgYWRkZWQsCgkgICAgJ2RpcmVjdG9yZnJlZScsIHdoaWNoIGlzIHVzZWQgdG8gJ2ZyZWUnIHRoZSByZXNvdXJjZXMKCSAgICBhbGxvY2F0ZWQgZHVyaW5nIHRoZSAnZGlyZWN0b3JvdXQnIHBoYXNlLiBBdCB0aGUgc2FtZQoJICAgIHRpbWUsIGEgcHJpbWl0aXZlIGdhcmJhZ2UgY29sbGVjdG9yIGVuZ2luZSB3YXMgYWRkZWQgdG8KCSAgICBkZWFsIHdpdGggb3JwaGFuZWQgYWRkcmVzc2VzLCB3aGVuIG5lZWRlZC4KCSAgICAKCSAgICBUaGUgc2l0dWF0aW9uIGlzIG11Y2ggYmV0dGVyIG5vdywgYnV0IHN0aWxsIGl0IGlzIHBvc3NpYmxlIHRvIGhhdmUKCSAgICBtZW1vcnkgZXhoYXVzdGF0aW9uIGlmIHJlY3Vyc2lvbiBpcyB1c2VkLgoKCSAgICBTbywgc3RpbGwgeW91IG5lZWQgdG8gYXZvaWQgcmV0dXJuaW5nIHBvaW50ZXJzLCBhcnJheXMgb3IKCSAgICByZWZlcmVuY2VzIHdoZW4gdXNpbmcgZGlyZWN0b3IgbWV0aG9kcy4KCgkgICAgLSBBZGRlZCBzdGRpbnQuaSAtIHR5cGVtYXBzIGZvciBsYXRlc3QgQzk5IGludGVncmFsIHR5cGVzIGZvdW5kIGluIHN0ZGludC5oLgoJICAgIAoxMS8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIHR5cGVzIGFkZGVkIHRvIHdpbmRvd3MuaSwgZWcgVUlOVDgsIFdPUkQsIEJZVEUgZXRjLiAKICAgICAgICAgICAgSW5jbHVkaW5nIHdpbmRvd3MuaSB3aWxsIGFsc28gZW5hYmxlIFNXSUcgdG8gcGFyc2UgdGhlIF9fZGVjbHNwZWMgTWljcm9zb2Z0CiAgICAgICAgICAgIGV4dGVuc2lvbiwgZWcgX19kZWNsc3BlYyhkbGxpbXBvcnQpLiBBbHNvIG90aGVyIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucwogICAgICAgICAgICBzdWNoIGFzIF9fc3RkY2FsbC4KCjExLzEwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGUgZm9yIFdpbmRvd3MgLSB3aW5kb3dzLmkuIFRoaXMgZmlsZSB3aWxsIGNvbnRhaW4gdXNlZnVsIHR5cGUKICAgICAgICAgICAgaW5mb3JtYXRpb24gZm9yIHVzZXJzIHdobyBpbmNsdWRlIHdpbmRvd3MuaC4gSW5pdGlhbCBzdXBwb3J0IGlzIGZvciB0aGUKICAgICAgICAgICAgbm9uIElTTyBpbnRlZ3JhbCB0eXBlczogX19pbnQ4LCBfX2ludDE2LCBfX2ludDMyLCBfX2ludDY0IGFuZCB1bnNpZ25lZCB2ZXJzaW9ucy4KICAgICAgICAgICAgVGhlIHVuc2lnbmVkIHZlcnNpb25zIHByZXZpb3VzbHkgY291bGQgbm90IGJlIHBhcnNlZCBieSBTV0lHLiAgU0YgIzg3MjAxMy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gUG9ydGFiaWxpdHkgd2FybmluZyBmb3IgZmlsZXMgd2hpY2ggd2lsbCBvdmVyd3JpdGUgZWFjaCBvdGhlciBvbiBjYXNlCiAgICAgICAgICAgIGluc2Vuc2l0aXZlIGZpbGUgc3lzdGVtcyBzdWNoIGFzIEZBVDMyL05URlMuIFRoaXMgd2lsbCBvY2N1ciwgZm9yIGV4YW1wbGUsIHdoZW4gdHdvCiAgICAgICAgICAgIGNsYXNzIG5hbWVzIGFyZSB0aGUgc2FtZSBiYXJyaW5nIGNhc2UuIFRoZSB3YXJuaW5nIGlzIGlzc3VlZCBvbiBhbGwgcGxhdGZvcm1zIGFuZAogICAgICAgICAgICBjYW4gYmUgc3VwcHJlc3NlZCB3aXRoIHRoZSB1c3VhbCB3YXJuaW5nIHN1cHByZXNzaW9uIHRlY2huaXF1ZXMuIFNGIGJ1ZyAjMTA4NDUwNy4KCjExLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1weXRob24gLS13aXRoLXJ1YnkgLS13aXRoLXBlcmw1IGV0YyBlbmFibGUgdGhlc2UgbGFuZ3VhZ2VzLAogICAgICAgICAgICBpZSB0aGUgLS13aXRoLXh4eHggb3B0aW9ucywgd2hlcmUgbm8gcGF0aCBpcyBzcGVjaWZpZWQsIHdvcmsgdGhlIHNhbWUgYXMgaWYgCiAgICAgICAgICAgIHRoZSBvcHRpb24gd2FzIG5vdCBzcGVjaWZpZWQgYXQgYWxsLiBCYXNlZCBvbiBwYXRjaGVzICMxMzM1MDQyICMxMzI5MDQ4ICMxMzI5MDQ3LgoKMTEvMDkvMjAwNTogZGFuY3kKCgkgICAgW0FsbGVncm9jbF0KCSAgICBBZGQgQysrIHN1cHBvcnQgdG8gdGhlIEFsbGVncm9jbCBtb2R1bGUuIEZ1cnRoZXIKCSAgICBlbmhhbmNlcyB0aGUgQyBzdXBwb3J0IGFzIHdlbGwuIFNvbWUgb2YgdGhlCgkgICAgZmVhdHVyZXM6CgoJICAgIC0gTVVDSCBiZXR0ZXIgZ2VuZXJhdGlvbiBvZiBmb3JlaWduIHR5cGVzIGJhc2VkIG9uCgkgICAgdGhlIEMvQysrIHR5cGVzIGZvciB1c2UgaW4gZGVmaW5pbmcgdGhlIEZGSSBvbgoJICAgIHRoZSBsaXNwIHNpZGUuIFdlIGRvbid0IHBhc3MgZXZlcnl0aGluZyBhcyBhICgqIDp2b2lkKQoJICAgIGFueSBsb25nZXIuCgoJICAgIC0gVXNlcyB0eXBlbWFwcyBmb3IgYmV0dGVyIGNvbnRyb2wgb2YgdHlwZSBjb252ZXJzaW9ucwoJICAgIGFuZCBjb2RlIGdlbmVyYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBsaXNwIGFuZCBjKysgd3JhcHBlcgoJICAgIGNvZGUuCgoJICAgIC0gQ0xPUyB3cmFwcGluZyBvZiBwb2ludGVycyByZXR1cm5lZCBmcm9tIGZvcmVpZ24gc3BhY2UKCSAgICBtYWtlcyBpdCBlYXNpZXIgdG8gZGlmZmVyZW50aWF0ZSBwb2ludGVycyBpbiB1c2VyIGNvZGUuCgkgICAgVGhlIHdyYXBwaW5nIG9iamVjdHMgY2FuIGJlIHBhc3NlZCBkaXJlY3RseSB0byBGRiBjYWxscy4KCgkgICAgLSBEZWZ1biB3cmFwcGluZyBvZiBGRiBjYWxscywgYWxsb3dpbmcgZm9yIG1vcmUgbGlzcHkKCSAgICBpbnRlcmZhY2UuIENvbnZlcnNpb24sIEdDaW5nLCBvZiBsaXNwIG9iamVjdHMgdG8gCgkgICAgZm9yZWlnbiBvYmplY3RzIGNhbiBiZSBkb25lIGluIHRoZSB3cmFwcGluZyBkZWZ1biB2aWEKCSAgICB0aGUgdXNlIG9mIHR5cGVtYXBzLgoJICAgIAoJICAgIC0gb3ZlcmxvYWQgZGlzcGF0Y2hpbmcgaW1wbGVtZW50ZWQgb24gdGhlIGxpc3Agc2lkZQoJICAgIHVzaW5nIGdlbmVyaWMgZnVuY3Rpb25zLgoKCSAgICAtIFRlbXBsYXRlcyBhbmQgc3lub255bW91cyB0eXBlcyBzdXBwb3J0ZWQuCgoxMS8wNy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIHByb3BlciBzdXBwb3J0IGZvciBtdWx0aS1pbmhlcml0YW5jZSBpbgoJICAgIHRoZSBweXRob24gc2lkZSwgaWUsIGlmIHlvdSBoYXZlIHR3byBDKysgd3JhcHBlZCBjbGFzcywgRm9vCgkgICAgYW5kIEJhciwgbm93OgoKCSAgICAgICBjbGFzcyBNeVB5dGhvbkNsYXNzKEZvbyxCYXIpOgoJICAgICAgICAgIC4uLi4KCiAgICAgICAgICAgIHdpbGwgcHJvcGVybHkgd29yaywgZXZlbiB3aXRoIGRpcmVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICBkZWFsbG9jYXRpb24gb2YgRm9vLnRoaXMgYW5kIEJhci50aGlzIHdpbGwgZm9sbG93CiAgICAgICAgICAgIGNvcnJlY3RseS4gQmVmb3JlLCBhIGNsYXNzIGNvdWxkIG9ubHkgaGF2ZSBvbmUgJ3RoaXMnCiAgICAgICAgICAgIGluc3RhbmNlICh1bmxpa2UgQysrKSwgb25seSB0aGUgbGFzdCBiYXNlIGNsYXNzIHdhcwogICAgICAgICAgICBwcm9wZXJseSBkZWxldGVkLCBvciBkZXRlY3RlZCB3aXRoIGRpcmVjdG9ycy4KCgkgICAgTm93ICdzZWxmLnRoaXMnIGNhbiBiZSBhIGxpc3QsIHdoaWNoIHdpbGwgY29udGFpbiB0aGUgQysrCgkgICAgaW5zdGFuY2UgcG9pbnRlcnMgZm9yIGFsbCB0aGUgYmFzZSBjbGFzc2VzLgoJICAgIAoJICAgIEFsc28sIHN3aWcudGhpcyBpcyByZXNwb25zaWJsZSBmb3IgZGVhbGxvY2F0aW5nIHRoZSBDKysKCSAgICBpbnN0YW5jZShzKSwgYW5kIHRoZSBfX2RlbF9fIG1ldGhvZCBpcyBub3QgZW1pdHRlZCB1bmxlc3MKCSAgICB0aGUgdXNlciBwcmVwcGVuZC9hcHBlbmQgc29tZSBjb2RlIHRvIGl0LgoKCSAgLSBTd2lnIGNhbiBub3cgZGV0ZWN0IG1lbW9yeSBsZWFrcywgaWUsIGlmIHlvdSBzdGlsbAoJICAgIGRvbid0IHVzZSBwcm94eS9zaGFkb3cgY2xhc3NlcywgYW5kIHR5cGUgc29tZXRoaW5nIGxpa2UKCSAgICAKCSAgICAgICAgIGltcG9ydCBfZXhhbXBsZQoJICAgICAgICAgZiA9IF9leGFtcGxlLm5ld19Gb28oKQoKCSAgICBhbmQgZm9yZ2V0IHRvIGNhbGwgX2V4YW1wbGUuZGVsZXRlX0ZvbyhmKSwgdGhlbiBzd2lnIHdpbGwKCSAgICB0ZWxsIHlvdSB0aGF0IHRoZXJlIGlzIGEgbWVtb3J5IGxlYWsuCgoJICAgIE90aGVyd2lzZSwgaWYgeW91IGFsd2F5cyB1c2UgdGhlIHByb3h5IGNsYXNzZXMsIHlvdSBwcm9iYWJseQoJICAgIHlvdSB3aWxsIG5ldmVyIGV2ZXIgc2VlIHRoaXMgd2FybmluZyB1bmxlc3MgdGhlcmUgaXMKCSAgICBzb21ldGhpbmcgd3JvbmcgaW5zaWRlIHRoZSBzd2lnIHdyYXBwaW5nIGNvZGUuCgkgICAgICAgCgkKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgSWYgeW91IG92ZXJsb2FkZWQgdGhlIF9fZGVsX18gbWV0aG9kLCBhbmQgY2FsbCB0aGUgYmFzZQoJICAgIG9uZQkgd2l0aG91dCBhIHRyeSBibG9jaywgYXMgaW4KCgkgICAgICAgICAgIGNsYXNzIE15Q2xhc3MoU3dpZ0NsYXNzKToKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgCiAgICAgICAgICAgIHB5dGhvbiBjb3VsZCBjb21wbGFpbiB0aGF0IHRoZSBtZXRob2QgU3dpZ0NsYXNzLl9fZGVsX18gaXMKICAgICAgICAgICAgdW5kZWZpbmVkLiBUcnkgdG8gdXNlIGluc3RlYWQ6CgkgICAgCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgkJICAgICAgICAgIHRyeTogU3dpZ0NsYXNzLl9fZGVsX18oc2VsZikKCQkJICBleGNlcHQ6IHBhc3MKCgkgICAgb3Igc2ltcGx5IAkJICAKCgkgICAgICAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgoJCSAgICAgICAgICA8eW91ciBjb2RlIGhlcmU+CgoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkaW5nIG1vcmUgZnVuIHRvIFNUTC9TVEQgY29udGFpbmVycywgbm93IHlvdQoJICAgIGNhbiBkbwoKCSAgICAgICAldGVtcGxhdGUocHlzZXQpIHN0ZDo6c2V0PFB5T2JqZWN0ICo+OwkJCgkgICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3RvcjxQeU9iamVjdCAqPjsJCgkgICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8UHlPYmplY3QgKixQeU9iamVjdCAqPjsKCSAgICAgICAuLi4uCgoJICAgIFRoZSBzYW1lICBhcHBsaWVzIHRvIHN0ZDo6bGlzdCwgc3RkOjpkZXF1ZSwgc3RkOjptdWx0aXNldCwgZXRjLgoKCSAgICBUaGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUgeW91IGNhbiBkbyBub3c6CgoJICAgICAgICMgQysrIHN0ZDo6dmVjdG9yIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICB2ID0gcHl2ZWN0b3IoWzEsImhlbGxvIiwoMSwyKV0pCgkgICAgICAgcHJpbnQgdlsxXQoJICAgICAgID4+ICdoZWxsbycKCSAgICAgICBwcmludCB2WzJdCgkgICAgICAgPj4gKDEsMikKCSAgICAgICAJCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6c2V0IGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBzID0gcHlzZXQoKQkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KCgxLDIpKQkJICAgCgkgICAgICAgcy5pbnNlcnQoMSkJCQkgICAKCSAgICAgICBzLmluc2VydCgiaGVsbG8iKQoJICAgICAgIHN1bT0oKQoJICAgICAgIGZvciBpIGluIHM6CgkgICAgICAgICBzdW0gKz0oaSwpCgkgICAgICAgcHJpbnQgc3VtCgkgICAgICAgPj4+ICgxLCAnaGVsbG8nLCAoMSwgMikpCgkgICAgICAgCQkJCSAgIAoJICAgICAgICMgQysrIHN0ZDo6bWFwIGFzIG5hdGl2ZSBweXRob24gc2VxdWVuY2UKCSAgICAgICBtID0gcHltYXAoKQkJCSAgIAoJICAgICAgIG1bImZvbyJdID0gImhlbGxvIgkJICAgCgkgICAgICAgbVsxXSA9ICgxLDIpCgkgICAgICAgcG0gPSB7fQoJICAgICAgIGZvciBrIGluIG06CSAgICAJICAgCgkgICAgICAgICBwbVtrXSA9IG1ba10KCSAgICAgICBwcmludCBwbQoJICAgICAgID4+PiB7MTogKDEsIDIpLCAnZm9vJzogJ2hlbGxvJ30KCgkgICAgaWUsIHRoZSBTVEQvU1RMIGNvbnRhaW5lcnMgd29yayBhcyByZWFsIG5hdGl2ZSBweXRob24KCSAgICBjb250YWluZXIsIHdpdGggYXJiaXRyYXJ5IGl0ZW0gdHlwZXMgYW5kIHNvLgoKCSAgICBCdXQgc2luY2Ugbm9ybWFsIEMrKyBjb250YWluZXJzIGRvIG5vdCBwcm9wZXJseSByZWYvdW5yZWYKCSAgICB0aGVpciBpdGVtcywgeW91IHNob3VsZCB1c2UgdGhlIHNhZmVyIHZlcnNpb25zOgoJICAgIAoJICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKHB5dmVjdG9yKSBzdGQ6OnZlY3Rvcjxzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPHN3aWc6OlB5T2JqZWN0X3B0ciwgc3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjptYXA8c3dpZzo6UHlPYmplY3RfcHRyLHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAuLi4uCgoJICAgIHdoZXJlIHN3aWc6OlB5T2JqZWN0X3B0ciBpcyBhIFB5T2JqZWN0ICogZW52ZWxvcGUgY2xhc3MgcHJvdmlkZWQKCSAgICB0byBzYWZlbHkgaW5jcmVmL2RlY3JlZiB0aGUgcHl0aG9uIG9iamVjdC4gCgkgICAgCgkgICAgU28sIG5vdyB5b3UgY2FuIHVzZSBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBhcyBuYXRpdmUKCSAgICBQeXRob24gY29udGFpbmVycy4gCgoJICAgIE5vdGUgMTogc3RkOjptYXAsIHN0ZDo6c2V0IGFuZCB0aGUgb3RoZXIgJ29yZGVyZWQnCgkgICAgY29udGFpbmVycyB3aWxsIHByb3Blcmx5IHVzZSBQeU9iamVjdF9Db21wYXJlIGZvciBzb3J0aW5nLAoJICAgIHdoZW4gbmVlZGVkLgoKCSAgICBOb3RlIDI6IGFsbCB0aGUgU1RML1NURCBjb250YWluZXJzIGhhdmUgYSBsaW1pdCBzaXplIG9mCgkgICAgU0laRV9NQVgsIGllLCB5b3UgY2FuIGhhdmUgbWFuYWdlIGNvbnRhaW5lcnMgbGFyZ2VyIHRoYW4KCSAgICBJTlRfTUFYLCB0aGUgcHl0aG9uIGxpbWl0LgoJICAgIAoJICAgICAgCjExLzAyLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXQoJICAgIC0gYWRkICdpdGVyYXRvcigpJyBtZXRob2QgZm9yIGFsbCBzZXF1ZW5jZXMgYW5kIGFkZGl0aW9uYWxseQoJICAgICAgJ2tleV9pdGVyYXRvcigpJyBmb3IgbWFwcy4KCgkgICAgICAnaXRlcmF0b3IoKScgd2lsbCBhbHdheXMgcmV0dXJuIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLgoJICAgICAgQWRkaXRpb25hbGx5LCBpbiBtYXBzLCAna2V5X2l0ZXJhdG9yKCknIHdpbGwgcmV0dXJuIGEgcHl0aG9uCgkgICAgICBpdGVyYXRvciB1c2luZyBvbmx5IHRoZSBtYXAga2V5cy4KCSAgICAgIAoJICAgICAgSW4gZ2VuZXJhbCB0aGUgc2VxdWVuY2UgbWV0aG9kIF9faXRlcl9fIHdpbGwgY2FsbAoJICAgICAgJ2l0ZXJhdG9yKCknLCByZXR1cm5pbmcgdGhlIG5hdGl2ZSBDKysgaXRlcmF0b3IsIGJ1dCBpbgoJICAgICAgbWFwcyBpdCB3aWxsIGNhbGwgJ2tleV9pdGVyYXRvcigpJywgbWFpbnRhaW5pbmcKCSAgICAgIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCgoJICAgICAgSGVuY2UsIGZvciBzdGQ6Om1hcHMsIHlvdSBjYW4gcGxheSB0aGVuIHdpdGggdGhlIG5hdGl2ZQoJICAgICAgQysrIGl0ZXJhdG9yLCB3aGljaCB2YWx1ZSBpcyBhIChrZXksIHZhbHVlKSBwYWlyLCBieQoJICAgICAgY2FsbGluZyBtYXAuaXRlcmF0b3IoKSwgYXMgd2l0aCBtYXAuYmVnaW4oKSwgbWFwLmVuZCgpLCBldGMuCgoJICAgICAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtYXAuaXRlcmF0b3IoKSByZXR1cm5zIGEgc2FmZQoJICAgICAgJ2Nsb3NlZCcgaXRlcmF0b3IsIHdoaWxlIG1hcC5iZWdpbigpIGFuZCBtYXAuZW5kKCkgYXJlCgkgICAgICAnb3BlbicgaXRlcmF0b3JzLgoKCSAgICAgIEEgJ2Nsb3NlZCcgaXRlcmF0b3Iga25vd3MgdGhlIGJlZ2luIGFuZCB0aGUgZW5kIG9mIHRoZQoJICAgICAgc2VxdWVuY2UsIGFuZCBpdCBuZXZlciBjYW4gc2VnLiBmYXVsdC4gQW4gJ29wZW4nCgkgICAgICBpdGVyYXRvciwgYXMgaW4gQysrLCBjYW4gc2VnLiBmYXVsdCBhdCB0aGUgQysrIHNpZGUuCgoJICAgICAgICAgIyBhIGNsb3NlZCBpdGVyYXRvciBpcyBzYWZlIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KCQkgIyB0aGUgbmV4dCgpIG1ldGhvZCB3aWxsIHRocm93IGEgU3RvcEl0ZXJhdGlvbgoJICAgICAgICAgIyBleGNlcHRpb24gYXMgbmVlZGVkCgkKCSAgICAgICAgIGkgPSBzZXEuaXRlcmF0b3IoKQoJCSB0cnk6CiAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBUcnVlOgoJCSAgICAgICAgc3VtICs9IGkubmV4dCgpCgkJIGV4Y2VwdDogcGFzcwoJCSAKCQkgIyBhbiBvcGVuIGl0ZXJhdG9yIGFsd2F5cyBuZWVkIHRvIGJlIGNoZWNrZWQsCgkJICMgb3IgaXQgd2lsbCBjcmFzaCBhdCB0aGUgQysrIHNpZGUKCgkgICAgICAgICBjdXJyZW50ID0gc2VxLmJlZ2luKCkKICAgICAgICAgICAgICAgICBlbmQgPSBzZXEuZW5kKCkKCQkgd2hpbGUgKGN1cnJlbnQgIT0gZW5kKToKCQkgICAgc3VtICs9IGN1cnJlbnQubmV4dCgpCgkgICAgICAKCSAgICAgIAoJICAgIFtQeXRob25dCgkgICAgLSBGaW5hbGx5LCB3aGVuIHdlIGNhbGwgCgoJICAgICAgICBmID0gRm9vKCkKCgkgICAgICB0aGUgY29uc3RydWN0aW9uIGlzICdvbmUtd2F5Jy4gQmVmb3JlIGNvbnN0cnVjdGlvbiAgd2FzIGRvbmUKCSAgICAgIHNvbWV0aGluZyBsaWtlCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykgCiAgICAgICAgICAgICAgICAgIG5ld19Gb28oKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKSAKICAgICAgICAgICAgICAgICAgRm9vUHRyKCkgKHB5dGhvbikgLT4gRm9vKCkgKHB5dGhvbikKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgd2FzIGRvbmUgbGlrZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspIC0+IEZvb1B0cigpIChweXRob24pCiAgICAgICAgICAgICAgICAgIEZvb1B0cihweXRob24pIC0+IEZvbygpIChweXRob24pCiAgICAgICAgICAgICAgICAgIAkJICAKCgkgICAgICBpZSwgd2Ugd2hlbiBnb2luZyBiYWNrIGFuZCBmb3J3YXJkIGJldHdlZW4gdGhlIEMrKyBhbmQKCSAgICAgIHB5dGhvbiBzaWRlLgoKCSAgICAgIE5vdyBzaW5jZSB0aGVyZSBpcyBubyBGb29QdHIgdGhlIGNvbnN0cnVjdGlvbiBwcm9jZXNzIGlzCgoJICAgICAgICAgIEZvbygpIChweXRob24pIC0+IF9uZXdfRm9vKCkgKEMrKykKICAgICAgICAgICAgICAgICAgX25ld19Gb28oKSAoQysrKSAtPiBOZXdQb2ludGVyT2JqKCkgKEMrKykgKG5vIHNoYWRvdyBjbGFzcykKCiAgICAgICAgICAgICAgYW5kIHJldHVybmluZyBhIHBvaW50ZXIgaXMgZG9uZQoKICAgICAgICAgICAgICAgICAgTmV3UG9pbnRlck9iaigpIChDKyspICh3aXRoIHNoYWRvdyBjbGFzcykgLT4gTmV3SW5zdGFjZU9iaigpIChDKyspCgoJICAgICAgd2hlcmUgTmV3SW5zdGFuY2VPYmogY3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB3aXRob3V0CgkgICAgICBjYWxsaW5nIF9faW5pdF9fIGFuZCBpdCBkb2Vzbid0IGdvICdiYWNrJyB0byBweXRob24sIGlzCgkgICAgICAncHVyZScgQyBBUEkuCgoJICAgICAtIFdpdGggdGhpcyBjaGFuZ2UsIGFuZCB0aGUgb3RoZXIgb25lcyBpbiB0aGUKICAgICAgICAgICAgICAgUHlTd2lnT2JqZWN0IHR5cGUsIHdoaWNoIG5vdyBjYXJyaWVzIHRoZSB0aGlzb3duIGFuZAogICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyBwb2ludGVyLCB0aGUgZ2VuZXJhdGVkIGNvZGUgc2hvdWxkIGJlIGFzCiAgICAgICAgICAgICAgIGZhc3QgYXMgYm9vc3Q6OlB5dGhvbiBhbmQvb3IgdGhlIG90aGVyIHB5dGhvbiB3cmFwcGVycwogICAgICAgICAgICAgICBiYXNlZCBpbiBwdXJlIFB5dGhvbi9DIEFQSSBjYWxscy4KCgkgICAgICAgQXMgYSByZWZlcmVuY2UsIHRoZSBwcm9maWxldGVzdF9ydW5tZS5weSBleGFtcGxlLCB3aGljaAoJICAgICAgIGRvZXMgYSBzaW1wbGUgY2FsbCBmdW5jdGlvbiBtYW55IHRpbWVzLCBzdWNoIGFzIHRoaXMgY29kZToKCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHByb2ZpbGV0ZXN0ICAgICAgIAoJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJICAgIGEgPSBwcm9maWxldGVzdC5BKCkgICAgICAKCQkgICAgYiA9IHByb2ZpbGV0ZXN0LkIoKSAgICAgIAoJCSAgICBmb3IgaSBpbiByYW5nZSgwLDEwMDAwMDApCgkgICAgICAgICAgICAgIGEgPSBiLmZuKGEpICAgICAgICAgICAgCgoKCSAgICAgICB3aGVyZSBmbiBpcyBkZWZpbmVkIGFzICdBKiBCOjpmbihBICphKSB7cmV0dXJuIGE7fScsCgkgICAgICAgcHJvZHVjZXMgIHRoZSBmb2xsb3dpbmcgdGltZXMKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub21vZGVybiAgICBtb2Rlcm4KCSAgICAgICAgIHN3aWctMS4zLjI2ICAgIDE5LjcwcyAgICAgIDUuOThzCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuOTlzICAgICAgMC45OHMKCSAgICAgICAKCgkgICAgICAgQ2xlYXJseSwgdGhlcmUgaXMgYSBsYXJnZSBpbXByb3ZlbWVudCBmb3IgdGhlIHB5dGhvbgoJICAgICAgICdub21vZGVybicgbW9kZS4gU3RpbGwsIHRoZSAnbW9kZXJuJyBtb2RlIGlzIGFyb3VuZAoJICAgICAgIDYgdGltZXMgZmFzdGVyIHRoYW4gYmVmb3JlLiBGb3IgdGhlIHNhbWUgdGVzdCwgYnV0CgkgICAgICAgdXNpbmcgdGhlIG5vbi1zaGFkb3cgdmVyc2lvbiBvZiB0aGUgbW9kdWxlLCB3ZSBnZXQKCgkgICAgICAgICAgICAgICAgICAgICAgIF9wcm9maWxldGVzdCAobm9uLXNoYWRvdykKCSAgICAgICAgIHN3aWctMS4zLjI2ICAgICAwLjgwcyAKICAgICAgICAgICAgICAgICBzd2lnLUNWUyAgICAgICAgMC42MHMgCgoJICAgICAgIEhlbmNlLCBub3cgZm9yIHByYWN0aWNhbCBwdXJwb3NlcywgdGhlIHByb3h5IG92ZXJoZWFkCgkgICAgICAgaXMgaW5zaWduaWZpY2FudC4KCgkgICAgICAgTm90ZSB0aGF0IHRoZSBwZXJmb3JtYW5jZSBudW1iZXJzIHdlIGFyZSBzaG93aW5nIGlzIGZvcgoJICAgICAgIGEgc2ltcGxlIG1vZHVsZSAodHdvIHR5cGVzKSBhbmQgYSBzaW1wbGUgZnVuY3Rpb24gKG9uZQoJICAgICAgIGFyZ3VtZW50KS4gRm9yIHJlYWwgc2l0dWF0aW9ucywgZm9yIG1vZHVsZXMgd2l0aCBtYW55CgkgICAgICAgbW9yZSB0eXBlcyBhbmQvb3IgZnVuY3Rpb25zIHdpdGggbWFueSBtb3JlIHBhcmFtZXRlcnMsCgkgICAgICAgeW91IHdpbGwgc2VlIGV2ZW4gYmV0dGVyIHJlc3VsdHMuCgkgICAgICAgCgkJICAJICAgICAgCjEwLzMxLzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dCgoJICAgIC0gRmluYWxseSwgbm8gbW9yZSBDbGFzc1B0ciBwcm94eSBjbGFzc2VzLiBZb3Ugd2lsbCBzZWUKCSAgICAgIG9ubHkgYSBjbGVhbiBDbGFzcyBwcm94eSBjbGFzcyBpbiB0aGUgLnB5IGZpbGUuCgoJICAgIC0gTm8gbW9yZSAncmVhbCcgdGhpc293biBhdHRyaWJ1dGUgZWl0aGVyLCB0aGUgUHlTd2lnT2JqZWN0IG5vdwogICAgICAgICAgICAgIGNhcnJpZXMgdGhlIG93bmVyc2hpcCBpbmZvLgoKCSAgICAgIFlvdSBjYW4gYWxzbyBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoJCSAgCgkJICBzZWxmLnRoaXMuZGlzb3duKCkKCQkgIHNlbGYudGhpcy5vd24oMCkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gRmFsc2UJCSAgCgoJCSAgc2VsZi50aGlzLmFjcXVpcmUoKQoJCSAgc2VsZi50aGlzLm93bigxKQoJICAgICAgICAgIHByaW50IHNlbGYudGhpcy5vd24oKSAKCQkgID4+PiBUcnVlCgoJICAgICAgU3RpbGwgdGhlIG9sZCB3YXksCgkgICAgICAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgoJCSAgc2VsZi50aGlzb3duID0gMAoJICAgICAgICAgIHByaW50IHNlbGYudGhpc293bgoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpc293biA9IDEKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBUcnVlCgogICAgICAgICAgICAgIGlzIHN1cHBvcnRlZCwgYW5kIHB5dGhvbiBkaXNwYXRjaGVzIHRoZSBwcm9wZXIgbWV0aG9kCiAgICAgICAgICAgICAgY2FsbHMgYXMgbmVlZGVkLiAJCSAgCgkgICAgICAgCgoJICAgIC0gU3VwcG9ydCBmb3IgaXRlcmF0b3JzIGluIFNUTC9TVEQgY29udGFpbmVycywgZm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlCgogICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZTxzZXRfc3RyaW5nPiBzdGQ6OnNldDxzdGQ6OnN0cmluZz47CgkgICAgICAgICAgCiAgICAgICAgICAgICAgIHlvdSBjYW4gdXNlIHRoZSBDKysgaXRlcmF0b3JzIGFzOiAgCgogICAgICAgICAgICAgICAgICAgICBzID0gc2V0X3N0cmluZygpCgkJICAgICAgICAgICAgICAgICAgICAgCgkJICAgICBzLmFwcGVuZCgiYyIpICAgCgkJICAgICBzLmFwcGVuZCgiYSIpICAgCgkgICAgICAgICAgICAgcy5hcHBlbmQoImIiKQoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImFiYyIgCgoJCWFkdmFuY2UgdGhlIGl0ZXJhdG9yIGFzIGluIEMrKwoKICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgY3VycmVudCArPSAxCiAgICAgICAgICAgICAgICAgICAgIHByaW50IGN1cnJlbnQudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgCgkJbm93IHVzaW5nIHRoZSByZXZlcnNlIG9wZXJhdG9ycwoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMucmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLnJlbmQoKSAgICAgICAgCgkJICAgICBzdW0gPSAiIiAgICAgICAgICAgCgkJICAgICB3aGlsZSAoYiAhPSBlKTogICAgCiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYi5uZXh0KCkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCgkgICAgICAgIG9yIHRoZSAncHJldmlvdXMnIG1ldGhvZAoKICAgICAgICAgICAgICAgICAgICAgYiA9IHMuYmVnaW4oKSAgICAgIAoJCSAgICAgZSA9IHMuZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGUucHJldmlvdXMoKQogICAgICAgICAgICAgICAgICAgICBwcmludCBzdW0KCiAgICAgICAgICAgICAgICAgICAgID4+PiAiY2JhIiAKCiAgICAgICAgICAgICAgICBvciBqdXN0IGFzIGluIGEgcHl0aG9uIGZhc2hpb24KCiAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgTm90ZSAxOiBJdGVyYXRvcnMgaW4gQysrIGFyZSB2ZXJ5IHBvd2VyZnVsLCBidXQKICAgICAgICAgICAgICAgIGRhbmdlcm91cyB0b28uIEFuZCBpbiBweXRob24geW91IGNhbiBzaG9vdCB5b3Vyc2VsZiBpbiB0aGUgZm9vdAogICAgICAgICAgICAgICAganVzdCBsaWtlIGluIEMrKywgc28sIGJlIGNhcmVmdWwuCgkJCgkJTm90ZSAyOiB0aGUgaXRlcmF0b3JzIGFyZSAnbGlnaHQnLCBpZSwgdGhleSBkbyBub3QKCQljb252ZXJ0IHNlcXVlbmNlIGVsZW1lbnRzIHVudGlsIHlvdSByZXF1ZXN0IHRvIGRvIHNvLCB2aWEKCQluZXh0KCksIHZhbHVlKCkgb3IgcHJldmlvdXMoKS4gSWYgeW91IGp1c3QgaW5jcmVtZW50L2RlY3JlbWVudCBvbmUKCQlubyBjb252ZXJzaW9uIGlzIHBlcmZvcm1lZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCSAgICAgICAgICAgICBiICs9IDEKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKCkKICAgICAgICAgICAgICAgICAgICAgYi5pbmNyKDIpCgkJICAgICBiLmRlY3IoMikKICAgICAgICAgICAgICAgICAgICAgYi5kZWNyKCkKICAgICAgICAgICAgICAgICAgICAgYiAtPSAxCgoJCSBvbmx5IHRoZSBpdGVyYXRvciBpcyBtb2RpZmllZCwgYW5kIG5vdCB2YWx1ZSB3cmFwcGVyCgkJIGlzIGdlbmVyYXRlZC4gT3RoZXIgdHlwaWNhbCBDKysgb3BlcmF0aW9ucyBhcmUgYWxzbyAKCQkgYXZhaWxhYmxlLCBzdWNoIGFzOgoKCQkgICAgIHByaW50IHMuZW5kKCkgLSBzLmJlZ2luKCkKCQkgICAgID4+PiAzCgkJICAgICBmID0gcy5iZWdpbigpICsgMQoJCSAgICAgcHJpbnQgZi52YWx1ZSgpCgkJICAgICA+Pj4gImIiCgkJICAgICBsID0gcy5lbmQoKSAtIDEKCQkgICAgIHByaW50IGwudmFsdWUoKQoJCSAgICAgPj4+ICJjIgoJCSAKCQkgZXRjLiAgT2YgY291cnNlLCB0aGUgJ2ZpbmQnLCAnaW5zZXJ0JywgJ2VyYXNlJywgYW5kCgkJIHNvIG9uIG1ldGhvZHMgYWxzbyBzdXBwb3J0cyBpdGVyYXRvcnMgbm93LCBpZToKCgkJICAgICAgaSA9IHMuYmVnaW4oKQoJCSAgICAgIGkgKz0gMQoJCSAgICAgIHMuZXJhc2UoaSkKICAgICAgICAgICAgICAgICAgICAgIGZvciBpIGluIHM6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gaQoJCSAgICAgIHByaW50IHN1bQoJCSAgICAgID4+PiAiYWMiCgkJICAgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICBUaGVyZSBpcyBubyBtb3JlICd0aGlzb3duJyBhdHRyaWJ1dGUuIElmIHlvdSB1c2UgaXQsIHB5dGhvbgoJICAgIHdpbGwgdHJhbnNsYXRlIHRoZSBmb2xsb3dpbmcgY29kZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGlmIChzZWxmLnRoaXNvd24pOiAgID09PiAgIGlmIChzZWxmLnRoaXMub3duKCkpOgoJCXNlbGYudGhpc293biA9IDEgICAgID09PiAgIHNlbGYudGhpcy5vd24oMSkKICAgICAgICAgICAgICAgIHNlbGYudGhpc293biA9IDAgICAgID09PiAgIHNlbGYudGhpcy5vd24oMCkKCgkgICAgU3RpbGwsIG1heWJlIGluIHNvbWUgdW51c3VhbCBjYXNlcyB0aGUgdHJhbnNsYXRpb24gd2lsbCBub3QgYmUKCSAgICAxMDAlIGNvcnJlY3QsIHNvIGlmIHlvdSBoYXZlIGEgcHJvYmxlbSwgcGxlYXNlIHJlcG9ydCBpdAoJICAgIGFuZC9vciB1c2UgdGhlIG5ldyAnc2VsZi50aGlzLm93bigpJyBhY2Nlc3Nvci4KCSAgICAKCSAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgkgICAgCgkgICAgVGhlcmUgaXMgbm8gbW9yZSBDbGFzc1B0ciBjbGFzc2VzIGluIHRoZSBweXRob24gY29kZS4gSGVuY2UsCgkgICAgaWYgaW4gdGhlIHBhc3QgeW91IG5lZWRlZCB0byByZXNvcnQgdG8gc29tZSBraW5kIG9mIHRyaWNrZXJ5CgkgICAgd2l0aCB0aGVtLCBvciBvdmVyY29tZSB0aGVpciBwcmVzZW5jZSwgaXQgaXMgbm8gbG9uZ2VyCgkgICAgcmVxdWlyZWQsIGJ1dCB0aGUgZXh0cmEgY29kZSB5b3UgYWRkZWQgY291bGQgbm93IGJyZWFrCgkgICAgdGhpbmdzLgoKCSAgICBJZiBuZWVkZWQsIHlvdSBjYW4gdXNlIHRoZSBvcHRpb24gLWNsYXNzcHRyLCBpLmUuLAoKICAgICAgICAgICAgICAgc3dpZyAtY2xhc3NwdHIgLXB5dGhvbiAuLi4KCgkgICAgdG8gZ2VuZXJhdGUgdGhlIG9sZCBDbGFzc1B0ciBjbGFzc2VzLgoKCjEwLzMwLzIwMDU6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBNYWtlIGRlY2xhcmVkIGFuZCBkZWZpbmVkIGxpbmthZ2Ugb2YgU1dJR19pbml0IGNvbnNpc3RlbnQuICAKCSAgICBSZXBvcnRlZCBieSBTdGV2ZW4gRy4gSm9obnNvbiAoU0YgcGF0Y2ggMTMxNTQ5OCkuCgoxMC8yNi8yMDA1OiBtbWF0dXMKCgkgIC0gQWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIGdsb2JhbCBsaWJyYXJ5IGRpcmVjdG9yLgoJICAgIE5vdyBpdCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCB1c2UKCSAgICB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgYXMgd2VsbC4KCgkgICAgU28sIGlmIHlvdSBoYXZlIHNvbWV0aGluZyBsaWtlOgoKCSAgICAgICAlaW5jbHVkZSBhdHRyaWJ1dGUuaQoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZShBLCBpbnQsIGEsIGdldF9hLCBzZXRfYSk7CgkgICAgICAgCQkJCSAgICAgIAkgIAoJICAgICAgIHN0cnVjdCBBCQkJICAgICAgCSAgCgkgICAgICAgeyAgICAJCQkJICAKCSAgICAgICAgIGludCBnZXRfYSgpIGNvbnN0OyAJCSAgCgkgICAgICAgICB2b2lkIHNldF9hKGludCBhYSk7IAkJICAKCSAgICAgICB9OwkJCQkgIAoKICAgICAgICAgICAgICAgJWF0dHJpYnV0ZV9yZWYoQiwgaW50LCBjKTsKCSAgICAgICAJCQkJCgkgICAgICAgc3RydWN0IEIJCQkKCSAgICAgICB7ICAgIAkJCQoJICAgICAgICAgaW50JiBjKCk7IAkJCgkgICAgICAgfTsgCgoJICAgIHRoZW4gaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB0aGUgJ0EuYScgYW5kICdCLmMnIGF0dHJpYnV0ZXMgd2lsbAoJICAgIGJlIHZpc2libGUsIGllLCB5b3UgY2FuIGFjY2VzcyB0aGVtIGFzIHBsYWluIHZhcmlhYmxlczoKCiAgICAgICAgICAgICAgIGYgICA9IEEoKQogICAgICAgICAgICAgICBmLmEgPSAzCiAgICAgICAgICAgICAgIGcgICA9IEIoKQogICAgICAgICAgICAgICBnLmMgPSAzIAogICAgICAgICAgIAoJICAgICAgIGggICA9IGYuYSArIGcuYwoKCSAgICBhbmQgdGhlIHByb3BlciBnZXQvc2V0IG1ldGhvZHMgd2lsbCBiZSBkaXNwYXRjaGVkLiBTZWUKCSAgICBhdHRyaWJ1dGUuaSBmb3IgbW9yZSBpbmZvLgogICAKICAgICAgICAgIC0gTW9yZSBjbGVhbnVwcyBhcm91bmQgYW5kIGFkZGluZyBtb3JlIHRlc3QtY2FzZXMuIFRoZQogICAgICAgICAgICBESVNPV04gdHlwZW1hcCBub3cgaXMgdGVzdGVkIGFuZCB3b3JraW5nIGluIGFsbCB0aGUKICAgICAgICAgICAgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSwgaWUsIHRjbCwKICAgICAgICAgICAgcnVieSwgcGVybCBhbmQgcHl0aG9uLgoJICAgIAoKMTAvMjUvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCwgY29tcGxldGUgdGhlIERJU09XTiB0eXBlbWFwLgoJICAgIAoJICAgIC0gYWRkZWQgdGhlIGF0dHJpYnV0ZS5pIGZpbGUgdG8gdGhlIHVuaWZpZWQgdHlwZW1hcAogICAgICAgICAgICAgIGxpYnJhcnkgKGJlZm9yZSB3YXMgb25seSB1c2FibGUgZnJvbSBweXRob24pLgoKCSAgICAtIHVuaWZ5IHRoZSBuYW1lcyBmb3IgdGhlIHNldHRlciBhbmQgZ2V0dGVyIG1ldGhvZHMgaW4KCSAgICAgIHBlcmwsdGNsLHJ1YnkgYW5kIHB5dGhvbiwgc28sIHRoZSBhdHRyaWJ1dGUuaSBsaWJyYXJ5CgkgICAgICBjYW4gd29yayBhY3Jvc3MgdGhlbS4KCSAgICAgIAoJICAgIC0gc2VlIHRoZSBsaV9hdHRyaWJ1dGUuaSB0ZXN0LWNhc2Ugb3IgdGhlIGxpYnJhcnkgZmlsZQoKIAkgICAgICAgIExpYi90eXBlbWFwcy9hdHRyaWJ1dGUuc3dnCgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm8gYWJvdXQgaG93IHRvIHVzZSBpdC4KCiAKCSAgICAgIAoKMTAvMjQvMjAwNTogbW1hdHVzCgoJICAgIC0gUGVybCBub3cgdXNlcyB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkuCgoJICAgIC0gQ2hhbmdlcyBpbiBydWJ5IHRvIHVzZSB0aGUgJHRyYWNrIG9wdGlvbiBpbiB0eXBlbWFwcy4KCgkgICAgLSBDaGFuZ2VzIGluIHRoZSB1bmlmaWVkIHR5cGVtYXAgbGlicmFyeSB0byBmb2xsb3cgdGhlCgkgICAgICBjb252ZW50aW9uIHRoYXQgYWxsIG1hY3JvcyB0aGF0IGFyZSBub3QgdXNlZCBpbiB0aGUKCSAgICAgIEMvQysrIHNpZGUgc3RhcnRzIHdpdGggJSwgc3VjaCBhcwoKCSAgICAgICAgICAgJWRlbGV0ZQoJCSAgICVuZXdfYXJyYXkKCiAgICAgICAgICAgICAgZXRjLgoJICAgICAgCgkgICAgLSBEb2N1bWVudGluZyBmcmFnbWVudHMsIHNlZSBmcmFnbWVudHMuc3dnLgoKCSAgICAtIENsZWFuZXIgd2F5IHRvIHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGluY2x1ZGUKCSAgICAgIGp1c3QgPHR5cGVtYXBzL3N3aWd0eXBlcy5zd2c+LgoKCSAgICAgIENoZWNrIHNvbWUgb2YgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IHBlcmwsIHRjbCwgcnVieSwKCSAgICAgIHB5dGhvbi4KCgkgICAgICBBbHdheXMgc3RhcnQgd2l0aCB0aGUgaGVhZCBmaWxlLCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dGhvbi5zd2cKCSAgICAgICAgIHRjbC90Y2w4LnN3ZwoJICAgICAgICAgcnVieS9ydWJ5LnN3ZwoJICAgICAgICAgcGVybDUvcGVybDUuc3dnCgogICAgICAgICAgICAgIGFuZCB0aGUgcHJpbmNpcGFsIGZpbGUgdGhhdCBpbnZva2VzIHRoZSB1bmlmaWVkIGxpYnJhcnksIHN1Y2ggYXMKCgkgICAgICAgICBweXRob24vcHl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgdGNsL3RjbHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgICAgICBydWJ5L3J1Ynl0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcGVybC9wZXJsdHlwZW1hcHMuc3dnCSAgICAKCSAgICAKCSAgICAgIFRoZSBmaWxlIHRoYXQgcHJvdmlkZSB0aGUgc3BlY2lhbGl6YXRpb24gZm9yIGVhY2gKCSAgICAgIGxhbmd1YWdlIGFyZSB0aGUgb25lIHRoYXQgcHJvdmlkZXMgdGhlIGJhc2ljIHR5cGVzOgoKCSAgICAgICAgIHB5dGhvbi9weXByaW10eXBlcy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgdGNsL3RjbHByaW10eXBlcy5zd2cJCgkgICAgICAgICBwZXJsNS9wZXJscHJpbXR5cGVzLnN3ZwoKCSAgICAgIGFuZCB0aGUgc3RyaW5nIG1hbmlwdWxhdGlvbjogIAkgCgkgICAgCgkgICAgICAgICBweXRob24vcHlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHJ1YnkvcnVieXN0cmluZ3Muc3dnCQoJICAgICAgICAgdGNsL3RjbHN0cmluZ3Muc3dnCQoJICAgICAgICAgcGVybDUvcGVybHN0cmluZ3Muc3dnCgoJCSAKCSAgICAgIFRoZSByZXN0IG9mIHRoZSBmaWxlcywgc3VjaCBhcyBjYXJyYXkuaSwgYXJlIG1vc3RseSBvbmUgCgkgICAgICBsaW5lIGZpbGVzIHRoYXQgaW5jbHVkZSB0aGUgcHJvcGVyIHR5cGVtYXAgbGlicmFyeQoJICAgICAgdmVyc2lvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFBlcmwgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBleHBlY3RlZCBiZWhhdmlvciBpbiBQZXJsLgoKMTAvMjMvMjAwNTogd3V6emViCiAgICAgICAgICAgIENoaWNrZW46CiAgICAgICAgICAgICAgKyBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zIGZpbmFsbHkgd29yayBwcm9wZXJseQogICAgICAgICAgICAgICsgYWRkIHRlc3Qgb2YgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzIHRvIGNwcF9iYXNpYy5pCgoxMC8yMC8yMDA1OiBkYW5jeQoJICAgIFthbGxlZ3JvY2xdIEFkZGVkIEMrKyBzdXBwb3J0LiBMYXJnZSB1cGRhdGUsIG1hbnkgY2hhbmdlcy4gU2VlCgkgICAgbmV3bHkgYWRkZWQgQWxsZWdybyBDb21tb24gTGlzcCBzZWN0aW9uIGluIGxpc3AuaHRtbAoKMTAvMjAvMjAwNTogbW1hdHVzCgkgICAgUnVieSwgVGNsLCBQeXRob246CgoJICAgIC0gVW5pZm9ybSB3YXkgdG8gZmFpbCAobGFiZWwgZmFpbDopLCBub3cgZmluYWxseQoJICAgICAgU1dJR19leGNlcHRpb24gd29ya3MgYWNyb3NzIHRoZSB0aHJlZSBsYW5ndWFnZXMgYW5kIGFsbAoJICAgICAgdGhlIHR5cGVtYXBzLgoKCSAgICAtIEFkZCBwcm9wZXIgY2xlYW51cCBjb2RlIHRvIHJ1YnkKCgkgICAgLSBNb3JlIHZhbGdyaW5kIGZpeGVzCgoJICAgIC0gU2ltcGxpZnkgdGhlIGlubGluZSB1c2UsIGl0IHNlZW1zIGEgc21hbGwgaW50ZXJmYWNlIG9mCgkgICAgICAyMCwwMDAgbGluZXMgKHBsdXMgbWFueSBtYW55IHRlbXBsYXRlcykgY2FuIGJyZWFrIAoJICAgICAgZ2NjIC1PMyBlYXNpbHkuCgoJICAgIC0gRmluYWxpemUgdGhlIHR5cGVtYXBzIGxpYnJhcnkuIEFsbCB0aGUgb2xkICAqLmkgZmlsZXMKCSAgICAgIChjYXJyYXkuaSwgY3BvaW50ZXIuaSwgZXhjZXB0aW9uLmkpIGhhZCBiZWVuIGltcGxlbWVudGVkCgkgICAgICBpbiB0aGUgbmV3IHR5cGVtYXBzIGxpYnJhcnkuCgkgICAgCgoxMC8xOS8yMDA1OiB3dXp6ZWIKCSAgICBVcGRhdGUgdGhlIFJ1bnRpbWUgVHlwZW1hcCBkb2N1bWVudGF0aW9uIGluIFR5cGVtYXBzLmh0bWwKCjEwLzE4LzIwMDU6IHd1enplYgoJICAgIENoaWNrZW46CgkgICAgICAtIENvcnJlY3RseSBoYW5kbGUgJWlnbm9yZWQgY2xhc3NlcwogICAgICAgICAgICAgIC0gQ29ycmVjdGx5IGNvbnZlcnQgbG9uZywgbG9uZyBsb25nLCB1bnNpZ25lZCBsb25nLCBldGMKICAgICAgICAgICAgICAgIHRvIGNoaWNrZW4gcHJpbWl0aXZlcy4gKFRoYW5rcyB0byBGZWxpeCBXaW5rZWxtYW5uKQogICAgICAgICAgICAgIC0gVXNpbmcgYXJnb3V0IHBhcmFtZXRlcnMgd2hlbiB0aGUgcmV0dXJuIHZhbHVlIHdhcyBhCiAgICAgICAgICAgICAgICB3cmFwcGVkIHBvaW50ZXIgY2F1c2VkIGEgbWVtb3J5IGNvcnJ1cHRpb24uICBUaGUgY2hpY2tlbgogICAgICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3IgbW92ZWQgYSBwb2ludGVyIG91dCBmcm9tIHVuZGVyIHVzLgogICAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYnkgcnVubmluZyBhbGwgdGhlIHByb3h5IGNyZWF0aW9uCiAgICAgICAgICAgICAgICBmdW5jdGlvbnMgYXMgY29udGludWF0aW9ucyBhZnRlciB0aGUgd3JhcHBlciBmdW5jdGlvbgogICAgICAgICAgICAgICAgcmV0dXJucy4gIEFzIHBhcnQgb2YgdGhpcywgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlCiAgICAgICAgICAgICAgICBjaGlja2VuZmFzdHByb3h5IGZsYWcgb24gb3V0cHV0IHR5cGVtYXBzLgogICAgICAgICAgICAgIC0gdXNpbmcgLXByb3h5IGFuZCAtbm9jb2xsZWN0aW9uIHRvZ2V0aGVyIHdvcmtzIG5vdwogICAgICAgICAgICAgICAgQmVmb3JlLCBpdCB3YXMgbm90IGV4cG9ydGluZyB0aGUgZGVzdHJ1Y3RvciBpbiB0aGUgcHJveHkKICAgICAgICAgICAgICAgIHdyYXBwZXIuCgoxMC8xOC8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBBZGRlZCB0aGUgVW5pZmllZCBUeXBlbWFwIExpYnJhcnkgKFVUTCkuIEl0IHVuaWZpZXMgdGhlIHR5cGVtYXBzIGZvcgoKIAkgICAgICAgIHB5dGhvbiwgcnVieSwgdGNsCgoJICAgIGFuZCBpbiB0aGUgcHJvY2VzcywgZml4ZXMgc2V2ZXJhbCBwcm9ibGVtcyBpbiBlYWNoIG9mIHRoZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0byB3b3JrIGluIGEgImNhbm9uaWNhbCIgd2F5IG5vdyBlc3RhYmxpc2hlZCBpbgoJICAgIHRoZSB0eXBlbWFwIGxpYnJhcnkKCSAgICAKCSAgICAgICBTV0lHL0xpYi90eXBlbXBhcwoKCSAgICBUaGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHVuaWZpY2F0aW9uIGlzIHRoYXQgZXZlcnl0aGluZwoJICAgIGNvbXBpbGVzIGFuZCBydW5zIGluc2lkZSB0aGUgdGVzdC1zdWl0ZSBhbmQgZXhhbXBsZXMKCSAgICBkaXJlY3Rvcmllcy4gQW5kIGZvciB0aGUgZmlyc3QgdGltZSB3ZSBoYXZlIHRocmVlCgkgICAgbGFuZ3VhZ2VzIHRoYW4gcGFzcyB0aGUgcHJpbWl0aXZlX3R5cGVzLmkgY2FzZS4KCgkgICAgQWxzbywgd2UgaGF2ZSBhIHVuaWZvcm0gd2F5IHRvIHRyZWF0IHRoZSBlcnJvcnMsIGZvciBleGFtcGxlCgkgICAgaWYgeW91IGRvIHNvbWV0aGluZyBsaWtlCgoJICAgICAgPj4+IGZyb20gcHJpbWl0aXZlX3R5cGVzIGltcG9ydCAqCiAgICAgICAgICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMCkKICAgICAgICAgICAgICAxMAoJICAgICAgPj4+IHByaW50IHZhbF91Y2hhcigxMDAwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToJCSAgICAgIAoJICAgICAgICBGaWxlICI8c3RkaW4+IiwgbGluZSAxLCBpbiA/CQkJICAgIAoJICAgICAgT3ZlcmZsb3dFcnJvcjogaW4gYXJndW1lbnQgMSBvZiB0eXBlICd1bnNpZ25lZCBjaGFyJwoKCSAgICB5b3UgZ2V0IHRoZSBzYW1lIGV4Y2VwdGlvbiBpbiBhbGwgdGhlIHRocmVlIGxhbmd1YWdlcy4KCSAgICAKCSAgICBBbmQgd2VsbCwgbWFueSBtb3JlIGdvb2QgdGhpbmdzIHdpbGwgY29tZSBmcm9tIHRoaXMKCSAgICB1bmlmaWNhdGlvbiwgZm9yIGV4YW1wbGUsIHByb3BlciBzdXBwb3J0IG9mIHRoZSBTVEwvU1REIGNsYXNzZXMKCSAgICBmb3IgYWxsIHRoZSBsYW5ndWFnZXMsIGFuZCBob3BlZnVsbHksIHdlIGNhbiBrZWVwCgkgICAgYWRkaW5nIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgVGhlIGhhcmRlc3QgcGFydCwgd3JpdGluZyBhIGNvbW1vbiB0eXBlbWFwIGxpYnJhcnkKCSAgICB0aGF0IHN1aXRlcyB0aGUgdGhyZWUgZGlmZmVyZW50IGxhbmd1YWdlcywgaXMgZG9uZSwKCSAgICBhbmQgYWRkaW5nIGFub3RoZXIgbGFuZ3VhZ2Ugc2hvdWxkIG5vdyBiZSBlYXN5LiAKCgkgICAgU3RpbGwgdGhlIGdsb2JhbCB1bmlmaWNhdGlvbiBpcyBub3QgY29tcGxldGUsIHRoZSBTVEwvU1REIAoJICAgIHBhcnQgaXMgbmV4dCwgYW5kIHByb2JhYmx5IGFzIHdlbGwgYXMgYWRkaW5nIG9uZSBvciB0d28gbW9yZQoJICAgIGxhbmd1YWdlcy4KCgkgICAgSWYgeW91IGFyZSBjdXJpb3VzLCBsb29rIGF0IHRoZSBweXRob24sIHJ1YnkgYW5kL29yIHRjbAoJICAgIGRpcmVjdG9yaWVzIHRvIHNlZSB3aGF0IGlzIG5lZWRlZCB0byBzdXBwb3J0IHRoZSBuZXcKCSAgICBjb21tb24gdHlwZW1hcHMgbGlicmFyeS4gIFN0aWxsLCB0aGUgZmluYWwgd2F5IHRvCgkgICAgaW50ZWdyYXRlIGEgbmV3IGxhbmd1YWdlIGNvdWxkIGNoYW5nZSBhcyB3ZSBtb3ZlIHRvCgkgICAgaW50ZWdyYXRlIHRoZSBTVEQvU1RMLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgaW4gUnVieS9UY2wgKioqCgoJICAgIFNvbWUgbWlzc2luZy93cm9uZyB0eXBlbWFwcyBjb3VsZCBzdGFydCB3b3JraW5nIHByb3Blcmx5LAoJICAgIGFuZCBjaGFuZ2UgdGhlIG9sZCBiZWhhdmlvciwgc3BlY2lhbGx5IGluIHJ1YnkgYW5kIHRjbC4KClZlcnNpb24gMS4zLjI3IChPY3RvYmVyIDE1LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHR5cGVzYWZlIGVudW0gd3JhcHBpbmcgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSB0bwogICAgICAgICAgICBvdmVybG9hZCBhIG1ldGhvZCB3aXRoIDIgZGlmZmVyZW50IGVudW0gdHlwZXMuCgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVmZWF0dXJlKCJpbW11dGFibGUiLCIwIikgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBzZXR0ZXJzCiAgICAgICAgICAgIGZvciBjb25zdGFudHMuCgogICAgICAgICAgICBSZXN0b3JlZCAlaW1tdXRhYmxlIGFuZCAlbWFrZWRlZmF1bHQgdG8gY2xlYXIgdGhlIGZlYXR1cmUgYXMgaXQKICAgICAgICAgICAgYmVoYXZlZCBpbiBTV0lHLTEuMy4yNSBhbmQgZWFybGllci4KCjEwLzE0LzIwMDU6IG1tYXR1cwogICAgICAgICAgICBGaXggYnVnIGluIGFub255bW91cyB0eXBlZGVmIHN0cnVjdHVyZXMgd2hpY2ggd2FzIGxlYWRpbmcgdG8KICAgICAgICAgICAgc3RyYW5nZSBiZWhhdmlvdXIuCgoxMC8xMy8yMDA1OiBtbWF0dXMKCSAgICBTZXZlcmFsIG1pbm9yIGNoYW5nZXM6CgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSB3Y2hhcl90IHR5cGUgc3VwcG9ydAoJICAgIC0gQWRkIGEgd2FybmluZyBmb3Igd2hlbiB5b3UgZGVmaW5lIHRoZSAnaW4nIHR5cGVtYXAgYnV0CgkgICAgICB5b3UgZG9uJ3QgZGVmaW5lIHRoZSAndHlwZWNoZWNrJyBvbmUuIFZlcnkgY29tbW9uIG1pc3Rha2UuCgkgICAgLSBBZGQgcHJvcGVyIGRlZmF1bHQgcnVsZSBmb3IgZnVuY3Rpb24gcG9pbnRlcnMsIG5vdyB5b3UKCSAgICAgIGNhbiBkZWZpbmUgYSB0eXBlbWFwIHN1Y2ggYXM6CgoJICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFICgoKikoQU5ZKSkgey4uLn0KCgkgICAgICBUaGF0IHdpbGwgYXBwbHkgdG8gYWxsIHRoZSBwb2ludGVyIHRvIGZ1bmN0aW9ucy4gVGhlCgkgICAgICBydWxlIGluIEMrKyBhbHNvIGFwcGx5IHRvIHRoZSBmdW5jdGlvbiAncmVmZXJlbmNlJywgaWUsCgkgICAgICBpbiBib3RoIGNhc2VzCgoJICAgICAgICB0eXBlZGVmICBpbnQgKCpmcHRyKShpbnQgYSk7CgkgICAgICAgIHR5cGVkZWYgIGludCAoZnVuYykoaW50IGEpOwoKCSAgICAgIFRoaXMgd2FzIG5lZWRlZCBzaW5jZSBpdCBzZWVtcyB0byBiZSAnaWxsZWdhbCcgaW4gQysrIHRvCgkgICAgICBkbyBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgICB2b2lkICpwdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGZwdHIpOwoKCSAgICAgIGFuZCBwcm9iYWJseSwgYXMgZm9yIG1lbWJlciBmdW5jdGlvbnMsIGl0IGlzIG5vdAoJICAgICAgd2FycmFudGllZCB0aGF0IHRoZSBwb2ludGVyIHNpemVzIHdpbGwgbWF0Y2guCgoJICAgIC0gQWRkIHRoZSAjZXJyb3IvI3dhcm5pbmcgZGlyZWN0aXZlcyB0byBzd2lnJ3MgY3BwLgoKCSAgICAtIEFkZCB0aGUgbm9ibG9jayBvcHRpb24gZm9yIHR5cGVtYXBzLCB3aGljaCBpcyB1c2VkIGFzCiAgICAgICAgICAgICAgZm9sbG93czogc3VwcG9zZWQgeW91IGEgdHlwZW1hcCwgbGlrZSB0aGlzCgoJICAgICAgCgkgICAgICAldHlwZW1hcChpbixub2Jsb2NrPTEpIEhlbGxvIHsJCQkgICAKCSAgICAgICAgIC4uLi4KICAgICAgICAgICAgICB9CgoJICAgICAgdGhlbiB0aGUgdHlwZW1hcCB3aWxsIGJlIGluc2VydGVkIHdpdGhvdXQgdGhlIGJsb2NrCgkgICAgICBpbXBvc2VkIGJ5IHRoZSBicmFja2V0cywgc2ltaWxhciB0bwoKCSAgICAgICAldHlwZW1hcChpbikgSGVsbG8gIi4uLiI7CgoJICAgICAgU28sIHdoeSB5b3UgZG9uJ3QganVzdCB1c2UgdGhlIHF1b3RlIHN0eWxlPywgYmVjYXVzZToKCSAgICAgIAoJICAgICAgICAgMS4tIFRoZSBxdW90ZSBzdHlsZSBkb2Vzbid0IGdldCBwcmVwcm9jZXNzZWQsIGZvciBleGFtcGxlCgkgICAgICAKCSAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMT0gU1dJR19tYWNybygkMSk7IjsKCSAgICAgIAoJICAgICAgICAgICAgIGhlcmUsIFNXSUdfbWFjcm8gZG9lc24ndCBnZXQgZXhwYW5kZWQKCiAgICAgICAgICAgICAgICAgMi4tIEluc2lkZSBhIHF1b3RlIHR5cGVtYXAsIHlvdSBoYXZlIHRvIHVzZSAKICAgICAgICAgICAgICAgICAgICAgcXVvdGVzIGNhcmVmdWxseQoKCQkgICAgICAldHlwZW1hcChpbikgSGVsbG8gIiQxID0gXCJoZWxsb1wiICI7CgoJCSAzLi0gWW91IGNhbid0IG1ha2UgZW1hY3MgYW5kL29yIG90aGVyIGVkaXRvcnMKCQkgICAgIHRvIGluZGVudCBpbnNpZGUgYSBzdHJpbmchLiAKCgoJICAgICAgU28sIHdoeSBkbyB5b3Ugd2FudCB0byByZW1vdmUgdGhlIGJsb2NrPywgYmVjYXVzZSBhbiBleHRyYQoJICAgICAgYmxvY2sgd2hlbiBub3QgbmVlZGVkIChubyBsb2NhbCB2YXJpYWJsZXMgaW4gaXQpOgoKCSAgICAgICAgICAxLi0gbWFrZXMgdGhlIGNvZGUgaGFyZGVyIHRvIHJlYWQKICAgICAgICAgICAgICAgICAgMi4tIG1ha2VzIHRoZSBjb2RlIGxhcmdlcgogICAgICAgICAgICAgICAgICAzLi0gb3IgaW4gc2hvcnQsIGZvciB0aGUgc2FtZSByZWFzb24gd2UgaGF2ZSB0aGUgcXVvdGUgc3R5bGUuCgpWZXJzaW9uIDEuMy4yNiAoT2N0b2JlciA5LCAyMDA1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gQWRkZWQgJ3Rocm93cycgdHlwZW1hcHMuCgoxMC8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgbGFuZ3VhZ2VzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlCiAgICAgICAgICAgIGZpcnN0IG5vbi1pZ25vcmVkIGNsYXNzIGluIHRoZSBwdWJsaWMgYmFzZSBjbGFzcyBsaXN0IGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlLgogICAgICAgICAgICBieSB0aGUgcHJveHkgY2xhc3MuIFByZXZpb3VzbHksIGlmIHRoZSBmaXJzdCBjbGFzcyBpbiB0aGUgbGlzdCB3YXMgaWdub3JlZCwgdGhlbgogICAgICAgICAgICB0aGUgcHJveHkgY2xhc3Mgd291bGRuJ3QgaGF2ZSBhbnkgYmFzZSBjbGFzc2VzLgoKMTAvMDcvMjAwNTogbW1hdHVzCgkgICAgIFVwZGF0ZSBtb3JlIGZlYXR1cmVzIHRvIGZvbGxvdyBuZXcgY29udmVudGlvbiwgaW5jbHVkaW5nOgoKCSAgICAgICBjYWxsYmFjawoJICAgICAgIHJlZi91bnJlZgoJICAgICAgIGV4Y2VwdAoJICAgIAoJICAgICBBbGwgb2YgdGhlbSB1c2Ugbm90IG9ubHkgdGhlIGZlYXR1cmUgYXMgYSBmbGFnLCBidXQgYWxzbwoJICAgICBhcyBjb2RlIHZhbHVlLiBUbyBkZWFsIHdpdGggdGhvc2UgZmVhdHVyZXMsIHdlIHVzZSBub3cKCSAgICAgR2V0RmxhZ0F0dHIsIHdoaWNoIGlzIHNpbWlsYXIgdG8gR2V0RmxhZywgYnV0IGluc3RlYWQgb3IKCSAgICAgcmV0dXJuaW5nIDEgb3IgMCwgaXQgcmV0dXJucyB0aGUgYXR0ciB2YWx1ZSwgaWYgaGFwcGVucwoJICAgICB0byBiZSBkaWZmZXJlbnQgb2YgIjAiIG9mIGNvdXJzZS4KCgkgICAgIE5vdyB0aGVyZSBhcmUgYWxzbyBtb3JlIHVuaWZvcm0gZGlyZWN0aXZlIG5hbWVzIGZvciB0aGUgCgkgICAgIG9uZXMgYmFzZWQgaW4gZmVhdHVyZXMsIGZvciBleGFtcGxlLCBmb3IgdGhlIG9sZAoJICAgICAlbmV3b2JqZWN0IGRpcmVjdGl2ZSBub3cgd2UgaGF2ZSB0cmVlIGRpcmVjdGl2ZXMgZGVmaW5lZDoKCSAgICAgCgoJICAgICAjZGVmaW5lICVuZXdvYmplY3QgICAgICAgICVmZWF0dXJlKCJuZXciKQoJICAgICAjZGVmaW5lICVub25ld29iamVjdCAgICAgICVmZWF0dXJlKCJuZXciLCIwIikKCSAgICAgI2RlZmluZSAlY2xlYXJuZXdvYmplY3QgICAlZmVhdHVyZSgibmV3IiwiIikKCgkgICAgIGFuZCBzbyBvbiBmb3IgYWxsIHRoZSBvdGhlciBmZWF0dXJlIGRpcmVjdGl2ZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzMwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gc29tZSBmZWF0dXJlcy4gUHJldmlvdXNseSBpdCB3YXMgbm90IHBvc3NpYmxlIHRvIGRpc2FibGUgbWFueQogICAgICAgICAgICBmZWF0dXJlcyBvbmNlIHRoZXkgaGFkIGJlZW4gZW5hYmxlZC4gVGhpcyB3YXMgZm9yIG1vc3QgZmVhdHVyZXMgdGhhdCBiZWhhdmUgYXMKICAgICAgICAgICAgZmxhZ3MuIFRoZXNlIGZlYXR1cmVzIG5vdyB3b3JrIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIikgICAgICAgICAgICAgIC8vIGVuYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIxIikgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMCIpICAgICAgICAgLy8gZGlzYWJsZXMgdGhlIGZlYXR1cmUKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIsICIiKSAgICAgICAgICAvLyBjbGVhcnMgdGhlIGZlYXR1cmUKCiAgICAgICAgICAgIEluIGZhY3QgYW55IG5vbi1lbXB0eSB2YWx1ZSBvdGhlciB0aGFuICIwIiB3aWxsIGVuYWJsZSB0aGUgZmVhdHVyZSAobGlrZSBDIGJvb2xlYW4gbG9naWMpLgogICAgICAgICAgICBQcmV2aW91c2x5ICIxIiwgIjAiIG9yIGFueSBvdGhlciBub24tZW1wdHkgdmFsdWUgd291bGQgZW5hYmxlIHRoZSBmZWF0dXJlIGFuZCBpdCB3b3VsZAogICAgICAgICAgICBvbmx5IGJlIHBvc3NpYmxlIHRvIGRpc2FibGUgdGhlIGZlYXR1cmUgYnkgY2xlYXJpbmcgaXQgKGFzc3VtaW5nIHRoZXJlIHdhcyBubyBnbG9iYWwgZW5hYmxlKS4KCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGFmZmVjdGVkOgoKICAgICAgICAgICAgICBhbGxvd2V4Y2VwdAogICAgICAgICAgICAgIGNvbXBhY3RkZWZhdWx0YXJncwogICAgICAgICAgICAgIGNsYXNzaWMgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBjczpjb25zdCAgICAgICAgICAgICAgIChDIykKICAgICAgICAgICAgICBkaXJlY3RvcgogICAgICAgICAgICAgIGV4Y2VwdGlvbmNsYXNzICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBpZ25vcmUKICAgICAgICAgICAgICBpbW11dGFibGUKICAgICAgICAgICAgICBqYXZhOmNvbnN0ICAgICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGphdmE6ZG93bmNhc3QgICAgICAgICAgKEphdmEpCiAgICAgICAgICAgICAga3dhcmdzCiAgICAgICAgICAgICAgbW9kZXJuICAgICAgICAgICAgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG5ldwogICAgICAgICAgICAgIG5vYXV0b2RvYyAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBub2RlZmF1bHQKICAgICAgICAgICAgICBub2RpcmVjdG9yCiAgICAgICAgICAgICAgbm9yZWYKICAgICAgICAgICAgICBub3RhYnN0cmFjdAogICAgICAgICAgICAgIG5vdW5yZWYKICAgICAgICAgICAgICBub3ZhbHVld3JhcHBlcgogICAgICAgICAgICAgIHB5dGhvbjptYXliZWNhbGwgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBweXRob246bm9uZHluYW1pYyAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbW9kdWxhMzptdWx0aXJldHZhbCAgICAoTW9kdWxhMykKICAgICAgICAgICAgICBwcmVkaWNhdGUgICAgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHRyYWNrb2JqZWN0cyAgICAgICAgICAgKFJ1YnkpCiAgICAgICAgICAgICAgdmFsdWV3cmFwcGVyCgogICAgICAgICAgICBJdCBpcyBub3cgcG9zc2libGUsIGZvciBleGFtcGxlIHRvIGlnbm9yZSBhbGwgbWV0aG9kcy9jbGFzc2VzIGluIGEgaGVhZGVyIGZpbGUsIGV4Y2VwdCBmb3IgYQogICAgICAgICAgICBmZXcgdGFyZ2V0dGVkIG1ldGhvZHMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcwogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgc29tZV9mdW5jdGlvbihpbnQsIGRvdWJsZSk7IC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBmdW5jdGlvbgogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgU29tZUNsYXNzOyAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBDbGFzcwogICAgICAgICAgICAgICVmZWF0dXJlKCJpZ25vcmUiLCIwIikgU29tZUNsYXNzOjptZXRob2Q7ICAgICAgICAgIC8vIGRvIG5vdCBpZ25vcmUgdGhpcyBtZXRob2QKICAgICAgICAgICAgICAlaW5jbHVkZSAiYmlnaGVhZGVyLmgiCgogICAgICAgICAgICBSZW1vdmVkICVweXRob25keW5hbWljIC0gaXQgbmV2ZXIgd29ya2VkIHByb3Blcmx5LiBVc2UgJXB5dGhvbm5vbmR5bmFtaWMgaW5zdGVhZC4KICAgICAgICAgICAgUmVtb3ZlZCAlZmVhdHVyZSgibm9rd2FyZ3MiKSAtIGl0IHdhc24ndCBmdWxseSBpbXBsZW1lbnRlZCAgLSB1c2UgJWZlYXR1cmUoImt3YXJncyIsIjAiKSBpbnN0ZWFkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8yNS8yMDA1OiBta29lcHBlCgkgICAgW0d1aWxlXSBBZGQgInRocm93cyIgdHlwZW1hcHMuCgowOS8yNC8yMDA1OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldIEFkZHMgbmV3ICV0cmFja29iamVjdHMgZnVuY3Rpb25hbGl0eSB0aGF0IG1hcHMgQysrIG9iamVjdHMgdG8KICAgICAgICAgICAgUnVieSBvYmplY3RzLiAgVGhpcyBmdW5jdGlvbmFsaXR5IG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGltcGxlbWVudAogICAgICAgICAgICBtYXJrIGZ1bmN0aW9ucyBmb3IgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24KICAgICAgICAgICAgcmVmZXIgdG8gdGhlIHVwZGF0ZSBkb2N1bWVudGF0aW9uIGFuZCBleGFtcGxlcy4KICAgICAgICAgICAgCjA5LzIwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBQYXRjaCAxMTE2NDMxIGZyb20gSm9zaCBDaGVycnkuIEZpeGVzIG5vbiBtZW1iZXIgZnVuY3Rpb25zIGluYWR2ZXJ0ZW50bHkKICAgICAgICAgICAgYmVpbmcgY2FsbGVkIGluc3RlYWQgb2YgbWVtYmVyIGZ1bmN0aW9ucy4KCjA5LzIwLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFBhdGNoIGZyb20gTWFyayBHb3NzYWdlIHRvIGFkZCBzdXBwb3J0IGZvciBMdWEtNS4xLCBzdGQ6OnN0cmluZywKICAgICAgICAgICAgc3RkOjp2ZWN0b3IsIHN0ZDo6ZXhjZXB0aW9uIGFuZCBkb2N1bWVudGF0aW9uLgoKMDkvMTQvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gQWRkIC1ub2NwcGNhc3QuIE5vdyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0bwoJICAgIGFsd2F5cyB1c2UgdGhlIGNwcGNhc3Qgb3BlcmF0b3JzLiBCZWZvcmUgdGhhdCB3YXMgdGhlIGNhc2UKCSAgICBvbmx5IHdoZW4geW91IHVzZWQgdGhlIC1jcHBjYXN0IG9wdGlvbi4KCiAgICAgICAgICAgIElmIHRoaXMgc2VlbXMgdG8gYnJlYWsgeW91ciBjb2RlLi4uIHlvdXIgd2VsY29tZSEsIGl0CgkgICAgbWVhbnMgaXQgd2FzIGJyb2tlbiBiZWZvcmUsIGFuZCB5b3UgbmV2ZXIgbm90aWNlLiAKCgkgICAgSWYgeW91IHRoaW5nIHRoZSBlcnJvciBpcyBkdWUgdG8gb25lIG9mIHRoZSBTV0lHIHR5cGVtYXBzLAoJICAgIHNlbmQgdXMgYW4gZXhhbXBsZS4KCgkgICAgVXNlIC1ub2NwcGNhc3Qgb25seSB3aXRoIHZlcnkgb2xkIEMrKyBjb21waWxlcnMgdGhhdAoJICAgIGRvIG5vdCBzdXBwb3J0IHRoZSBjcHBjYXN0IG9wZXJhdGlvbnMuIAoKCSAgICBTbywgaGVyZSBhcHBsaWVzOgoKCQlUaGlzIGNoYW5nZSBkb2Vzbid0IGJyZWFrIGNvbXBhdGliaWxpdHksIGl0IHdhcyBicm9rZW4gYmVmb3JlLgoKMDkvMTMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgZGlyZWN0b3IgbWV0aG9kcyB3aGVuIGEgY2xhc3MgaXMgcGFzc2VkIGJ5IHZhbHVlIGFzIGEKICAgICAgICAgICAgcGFyYW1ldGVyLgoKMDkvMTEvMjAwNTogbW1hdHVzCiAgICAgICAgICAgIEFkZGluZyB0aGUgbW9kdWxlIG9wdGlvbiB0byB0aGUgJWltcG9ydCBkaXJlY3RpdmUuIE5vdyB5b3UKICAgICAgICAgICAgY2FuIHVzZSBpdCBhcwoKCSAgICAgICAgJWltcG9ydChtb2R1bGU9IkJpZ01vZHVsZSIpIGZvby5pCgoJICAgIHdoZXJlIHN1YmZpbGUgY291bGQgKG9yIG5vdCkgZGVmaW5lIHRoZSBtb2R1bGUgbmFtZSB2aWEKCSAgICB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuIFRoZSBtb2R1bGUgb3B0aW9uIHRha2UgcHJlY2VkZW5jZQoJICAgIGFuZCBpdCBoYXMgdGhlIHNhbWUgZWZmZWN0cyB0aGFuIGhhdmluZyB0aGUgZGlyZWN0aXZlIAoKCSAgICAgICAgJW1vZHVsZSBCaWdNb2R1bGUgIAoKCSAgICBpbnNpZGUgdGhlIGltcG9ydGVkIGZpbGUgZm9vLmkuCgoJICAgIFlvdSBjYW4gdXNlIHRoZSBvcHRpb24gaW4gbWFpbmx5IHR3byBjYXNlczoKCgkgICAgMS4tIFlvdSB1c2VkIHRoZSAtbW9kdWxlIG9wdGlvbiB3aGVuIHlvdSBnZW5lcmF0ZWQgdGhlCiAgICAgICAgICAgICAgICBtb2R1bGUgdG8gYmUgaW1wb3J0ZWQsIGFuZCBoZW5jZSB0aGUgbW9kdWxlIG5hbWUgaW4KICAgICAgICAgICAgICAgIHRoZSBpbXBvcnRlZCAlbW9kdWxlIGRpcmVjdGl2ZSBpcyBub3QgcmVhbGx5IHVzZWZ1bC4KCgkgICAgMi4tIFRoZSBtb2R1bGUgeW91IHdhbnQgdG8gaW1wb3J0IGlzIHZlcnkgbGFyZ2UsIGFuZCBpdAogICAgICAgICAgICAgICAgaGFzIHNldmVyYWwgLmkvLmggZmlsZXMuIFRoZW4sIGlmIHlvdSBqdXN0IG9uZSB0bwogICAgICAgICAgICAgICAgaW1wb3J0IGEgY2xhc3Mgb3Igc28gZnJvbSB0aGUgbW9kdWxlLCBzYXlzICdmb28nLCBhbmQKICAgICAgICAgICAgICAgIG5vdCB0aGUgZW50aXJlIG1vZHVsZSB2aWEgaW1wb3J0aW5nIHRoZSBtYWluCiAgICAgICAgICAgICAgICBCaWdNb2R1bGUuaSBmaWxlLCB0aGVuIHlvdSBqdXN0IGRvOgoKIAkJICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaAoKICAgCSAgICAgICAgb3IKCQkKIAkJICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCQl3aGVyZSBmb28uaSBjb250YWlucyB0aGUgJ2ZvbycgZGVjbGFyYXRpb24gYW5kIG1heWJlIGEKCQljb3VwbGUgb2YgZXh0cmEgJWluY2x1ZGUgZGlyZWN0aXZlcywgYXMgbmVlZGVkLgoKCSAgICAKMDkvMTEvMjAwNTogbW1hdHVzCgkgICAgRml4IGJ1ZyAjMTI4MjYzNywgYWJvdXQgdGhlIC1tb2R1bGUgb3B0aW9uIG5vdCBoYXZpbmcgZWZmZWN0CgkgICAgaW4gcGxhY2VzIHdoZXJlIGl0IHdhcyBuZWVkZWQuCgowOS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgZW5zdXJlIHRoYXQgbm9uZSBvZiB0aGUgdHlwZW1hcHMgdXNlZCBmb3IgdGhlCiAgICAgICAgICAgIHNldCB3cmFwcGVycyBhcmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIGdldCB3cmFwcGVycy4gSSBkb3VidCB0aGlzIHdhcyBhCiAgICAgICAgICAgIHByb2JsZW0gZm9yIGFueSBsYW5ndWFnZXMgZXhjZXB0IGZvciB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBudWxsIGF0dHJpYnV0ZQogICAgICAgICAgICBpbiB0aGUgb3V0IHR5cGVtYXAgKEMjIG9ubHkpLgoKMDkvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlcyB3aGVuIGZpbGVzIGZhaWwgdG8gb3Blbi4KCjA5LzA2LzIwMDU6IG1tYXR1cyAKCgkgICAgQWxsb3cgYSAlZGVmaW5lIGEgbWFjcm8gaW5zaWRlIGFub3RoZXIgJWRlZmluZSBtYWNybywgZm9yIGV4YW1wbGUKCgkgICAgICAlZGVmaW5lIGhlbGxvKG5hbWUsIFR5cGUpCgkgICAgICAlZGVmaW5lIG5hbWUgIyMgYShUeXBlKQoJICAgICAgJXR5cGVtYXAoaW4pIFR5cGUgImhlbGxvOyI7CgkgICAgICAlZW5kZGVmCgkgICAgICAlZW5kZGVmCgkgICAgICAKCSAgICBUbyBsZWFybiBob3cgdG8gdXNlIHRoaXMgbmV3IGZlYXR1cmVzIGluIHlvdXIgb3duIHR5cGVtYXBzIGxpYnJhcnksIHNlZQoJICAgIHB5dGhvbi9jc3RyaW5nLmksIHB5dGhvbi9jd3N0cmluZy5pIGFuZCBweXRob24vY3dzdHJiYXNlLmkuCSAgICAKCiAgICAgICAgICAgIFtQeXRob25dIE5vcm1hbGl6ZSB0aGUgY3N0cmluZy5pIGltcGxlbWVudGF0aW9uIHRvIHVzZSBmcmFnbWVudHMsIGFuZCBhZGQKICAgICAgICAgICAgY3dzdHJpbmcuaSwgd2hpY2ggaW1wbGVtZW50cyB0aGUgc2FtZSB0eXBlbWFwcyBidXQgZm9yIHdjaGFyX3Qgc3RyaW5ncy4KCgkgICAgW1B5dGhvbl0gQnVnIGZpeGVkOiAxMjQ3NDc3LCAxMjQ1NTkxLCAxMjQ5ODc4IGFuZCBvdGhlcnMuCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gSW1wbGVtZW50IHN1cHBvcnQgZm9yIFNXSUdUWVBFKiBESVNPV04gdHlwZW1hcCAobGlrZSBpbiBQeXRob24pIGZvcgogICAgICAgICAgICBiZXR0ZXIgY29udHJvbCBvZiBtZW1vcnkgbWFuYWdlbWVudCwgZWcgd2hlbiBhZGRpbmcgYW4gb2JqZWN0IGNyZWF0ZWQgaW4gUnVieQogICAgICAgICAgICB0byBhIEMrKyBjb250YWluZXIuIFBhdGNoICMxMjYxNjkyIGZyb20gQ2hhcmxpZSBTYXZhZ2UuCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSA2NCBiaXQgcGxhdGZvcm0gZml4ZXMgZm9yIHRoZSB2YXJhcmdzIGhhbmRsaW5nIGluIFNXSUdfR2V0QXJncy4gVGhpcyBpcyBhbgogICAgICAgICAgICBpbXByb3ZlZCBmaXggZm9yIGJ1ZyAjMTAxMTYwNCBhcyBzdWdnZXN0ZWQgYnkgSmVyZW15IExpbi4KCjA4LzE4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEJ1ZyAjMTI0MDQ2OSAtICVuZXdvYmplY3Qgc3VwcG9ydCBmb3IgVGNsLiBQYXRjaCBmcm9tIEJvYiBNYXJpbmllci4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBCdWcgIzEyNTQ0OTQgLSBGaXggZm9yIGdsb2JhbCBuYW1lc3BhY2UgcG9sbHV0aW9uIGJ5IHBlcmwgaGVhZGVyIGZpbGVzCiAgICAgICAgICAgIChib29sIGRlZmluZSkgcHJldmVudGVkIFNUTCBoZWFkZXJzIGZyb20gYmVpbmcgdXNlZCBvbiBzb21lIHN5c3RlbXMsIGVnCiAgICAgICAgICAgIFdpbmRvd3Mgd2l0aCBWaXN1YWwgU3R1ZGlvLgoKMDgvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEJ1ZyAjMTI0MDkzNyAtIFJlZGVmaW5pdGlvbiBvZiBfX2ludDY0IHR5cGVkZWYgZm9yIEludGVsIGNvbXBpbGVycy4KCjA4LzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEJ1ZyAjMTI1MTgzMiAtICBDKysgdGVtcGxhdGUgbWF5IGdlbmVyYXRlIGludmFsaWQgWE1MIGZpbGUKCjA4LzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFN1cHBvcnQgYWRkZWQgZm9yIEx1YS4gUGF0Y2ggIzEyNDI3NzIgZnJvbSBNYXJrIEdvc3NhZ2UuCiAgICAgICAgICAgIEl0IHN1cHBvcnRzIG1vc3QgQy9DKysgZmVhdHVyZXMgKGZ1bmN0aW9ucywgc3RydWN0LCBjbGFzc2VzLCBhcnJheXMsIHBvaW50ZXJzLAogICAgICAgICAgICBleGNlcHRpb25zKSwgYXMgd2VsbCBhcyBsb3RzIG9mIGRvY3VtZW50YXRpb24gYW5kIGEgZmV3IHRlc3QgY2FzZXMgJiBleGFtcGxlcy4KCjA4LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtYbWxdIEZpeCBpbmNvcnJlY3QgeG1sIGVzY2FwaW5nIGluIGJhc2UgY2xhc3MgbmFtZSB3aGVuIGJhc2UgY2xhc3MgaXMgYSB0ZW1wbGF0ZS4KCjA4LzEzLzIwMDU6IGVmdXp6eW9uZQoJICAgIFtDTElTUF0gQWRkZWQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgZW51bXMuIERvZXMgbm90IGFkZHMgdGhlIHJldHVybiB0eXBlIGRlY2xhcmF0aW9uCgkgICAgdG8gdGhlIGZ1bmN0aW9uIGRlZmluaXRpb24sIGlmIGEgZnVuY3Rpb24gcmV0dXJucyB2b2lkLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIE5ldyBsYW5ndWFnZSBtb2R1bGUsIENvbW1vbiBMaXNwIHdpdGggVUZGSSwgZnJvbSBVdHotVXdlIEhhdXMuCgowOC8wOS8yMDA1OiBta29lcHBlCgkgICAgRml4IHRoZSBMaXNwIHMtZXhwcmVzc2lvbiBvdXRwdXQgbW9kdWxlOyBpdCBubyBsb25nZXIgY29tcGxhaW5zIGFib3V0ICJ1bmtub3duIHRhcmdldHMiLgoKMDcvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZpY2F0aW9ucyB0byBTVEwgd3JhcHBlcnMgc28gdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgYSB1c2VyJ3MgJWV4Y2VwdGlvbiBkaXJlY3RpdmUKICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgU1RMIHdyYXBwZXIgbWV0aG9kcy4gUHJldmlvdXNseSB0aGUgZm9sbG93aW5nIGdsb2JhbCAlZXhjZXB0aW9uCiAgICAgICAgICAgIGRpcmVjdGl2ZSB3b3VsZCBub3QgYmUgdXNlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzOgoKICAgICAgICAgICAgICAgICVleGNlcHRpb24geyAKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB1bmNhdWdodCBleGNlcHRpb25zCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaGFzIGJlZW4gaW1wbGVtZW50ZWQgYnkgcmVwbGFjaW5nICVleGNlcHRpb24gZGlyZWN0aXZlcyBmb3Igc3BlY2lmaWMgU1RMIHdyYXBwZXIKICAgICAgICAgICAgbWV0aG9kcyB3aXRoIGFuIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIGRlY2xhcmVkIG9uIHRoZSB3cmFwcGVyIG1ldGhvZHMuIHRocm93cyB0eXBlbWFwcwogICAgICAgICAgICBhcmUgbm93IHN1cHBsaWVkIGZvciBoYW5kbGluZyB0aGUgU1RMIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uLiBUaGVzZSBjYW4gYWxzbyBiZSBlYXNpbHkKICAgICAgICAgICAgb3ZlcnJpZGRlbiwgZm9yIGV4YW1wbGUgdGhlIHN0ZDo6b3V0X29mX3JhbmdlIGV4Y2VwdGlvbiwgd2hpY2ggaXMgdXNlZCBhIGxvdCBpbiB0aGUgU1RMCiAgICAgICAgICAgIHdyYXBwZXJzLCBjYW4gYmUgY3VzdG9taXNlZCBlYXNpbHk6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfdmVjdG9yLmkiCiAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzKSBzdGQ6Om91dF9vZl9yYW5nZSB7CiAgICAgICAgICAgICAgICAvLyBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFZlY3RJbnQpIHN0ZDo6dmVjdG9yPGludD47CgowNy8yMi8yMDA1OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NMSVNQXSBUaGUgY2xpc3AgbW9kdWxlIGZvciBTV0lHOgogICAgICAgICAgICAgIC0gSXQgY2FuIG9ubHkgaGFuZGxlIEMsIGNsaXNwIGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0cyBmZmkgYmluZGluZ3MgdG8gQysrLgogICAgICAgICAgICAgIC0gSXQgaGFzIHR3byBvcHRpb25zLCAoYSkgLWV4dGVybi1hbGwgdGhpcyB3aWxsIGdlbmVyYXRlIHdyYXBwZXJzIGZvciBhbGwgZnVuY3Rpb25zCiAgICAgICAgCWFuZCB2YXJpYWJsZXN0aW9ucywgKGIpIC1nZW5lcmF0ZS10eXBlZGVmIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyAiZGVmLWMtdHlwZSIKCSAgICAgICAgd3JhcHBlcnMgZm9yIHR5cGVkZWZzCgkgICAgICAtIENhbiBoYW5kbGUgcG9pbnRlcnMgdG8gZnVuY3Rpb25zLCBjb21wbGV4IHR5cGVzIHN1Y2ggYXMgbi1kaW1lbnNpb25hbCBhcnJheXMgb2YgCgkgCXBvaW50ZXJzIG9mIGRlcHRoIGQKCSAgICAgIC0gR2VuZXJhdGVzIHdyYXBwZXJzIGZvciBjb25zdGFudHMgYXMgd2VsbCBhcyB2YXJpYWJsZXMKCSAgICAgIC0gQ29ycmVjdGx5IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0aGUgZGVjbGFyYXRpb24gb2YgdmFyaWFibGVzIGluIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucwoJICAgICAgLSBDcmVhdGVzIGEgZGVmcGFja2FnZSAiZGVjbGFyYXRpb24iIHdpdGggdGhlIG1vZHVsZSBuYW1lIGFzIHRoZSBwYWNrYWdlIG5hbWUsIHRoZSBjcmVhdGVkIAoJICAgIAlwYWNrYWdlIGV4cG9ydHMgYm90aCBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcwoJICAgICAgLSB0cmllcyB0byBndWVzcyB3aGVuIHNob3VsZCBhIHBvaW50ZXIgdmFyaWFibGUgYmUgZGVjbGFyZWQgYXMgYy1wdHIgb3IgYy1wb2ludGVyCgowNy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIENoYW5nZXMgdG8gc3VwcG9ydCBDIyBzdHJ1Y3RzIHJldHVybmVkIGJ5IHZhbHVlLiBUaGUgY2hhbmdlcyByZXF1aXJlZCBhcmU6CiAgICAgICAgICAgICAgLSBVc2luZyBhbiBvcHRpb25hbCAnbnVsbCcgYXR0cmlidXRlIGluIHRoZSBvdXQgdHlwZW1hcC4gSWYgdGhpcyBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICAgICAgdGhlbiBpdCBpcyB1c2VkIGZvciB0aGUgJG51bGwgc3BlY2lhbCB2YXJpYWJsZSBzdWJzdGl0dXRpb24uCiAgICAgICAgICAgICAgLSBUaGUgY3R5cGUgdXNlZCBpbiB0aGUgQy9DKysgd3JhcHBlcnMgaXMgbm8gbG9uZ2VyIGluaXRpYWxpc2VkIHRvIDAgb24gZGVjbGFyYXRpb24uCiAgICAgICAgICAgIEJvdGggb2YgdGhlc2UgY2hhbmdlcyBmaXggdGhlIHNpdHVhdGlvbnMgd2hlcmUgYW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBhc3NpZ24gMCB0byB0aGUKICAgICAgICAgICAgcmV0dXJuZWQgc3RydWN0LiBNYXJzaGFsbGluZyBzdHJ1Y3RzIGFzIHZhbHVlIHR5cGVzIHN0aWxsIHJlcXVpcmVzIHVzZXIgZGVmaW5lZCB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIGRvY3VtZW50YXRpb24gZm9yIGFuIGV4YW1wbGUuCgowNy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCBTV0lHX2V4Y2VwdGlvbiB1c2FnZSB0byB3b3JrIHdpdGggY29tcGlsZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBlbXB0eSBtYWNybwogICAgICAgICAgICBhcmd1bWVudHMuIFVuZm9ydHVuYXRlbHkgdGhpcyBmaXggd2lsbCBzdG9wIHVzYWdlIG9mIFNXSUdfZXhjZXB0aW9uIGJlaW5nIHVzZWQgd2l0aGluIHR5cGVtYXBzCiAgICAgICAgICAgIHRoYXQgdXNlICIiIG9yICV7ICV9IGRlbGltaXRlcnMsIGJ1dCBjb250aW51ZXMgdG8gd29yayB3aXRoIHR5cGVtYXBzIHVzaW5nIHt9IGRlbGltaXRlcnMuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgdGhlIFNXSUdfQ1NoYXJwU2V0UGVuZGluZ0V4Y2VwdGlvbkFyZ3VtZW50IG9yIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIG1ldGhvZHMgaW5zdGVhZAogICAgICAgICAgICBhcyBTV0lHX2V4Y2VwdGlvbiBpcyByZWFsbHkgaW50ZW5kZWQgYXMgYSBwbGF0Zm9ybSBpbmRlcGVuZGVudCBtYWNybyBmb3IgdGhlIFNXSUcgbGlicmFyeSB3cml0ZXJzLgoKMDcvMTYvMjAwNTogbWtvZXBwZQoJICAgIFtBbGxlZ3JvIENMXSBVc2Ugc3BlY2lmaWMgZm9yZWlnbiB0eXBlcyByYXRoZXIgdGhhbiAoKiA6dm9pZCkuIAoJICAgIFVzZSAqc3dpZy1pZGVudGlmaWVyLWNvbnZlcnRlciouCgowNi8yNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGdW5jdGlvbnMgZGVjbGFyZWQgYXMgJ2V4dGVybicgbm8gbG9uZ2VyIGhhdmUgYW4gYWRkaXRpb25hbCBmdW5jdGlvbiBkZWNsYXJhdGlvbiBhZGRlZCB0byB0aGUgCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZXMuIFRoZXJlIGFyZSBzb21lIGNhc2VzIHdoZXJlIFNXSUcgZG9lcyBub3QgZ2V0IHRoaXMgcmlnaHQsIGVnIGJ1ZyAjMTIwNTg1OSAoZXh0ZXJuCiAgICAgICAgICAgIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGRlY2xhcmVkIGluIGEgbmFtZXNwYWNlKS4gQWxzbyBTV0lHIGNhbm5vdCBnZXQgbm9uLXN0YW5kYXJkCiAgICAgICAgICAgIGNhbGxpbmcgY29udmVudGlvbnMgY29ycmVjdCwgZWcgV2luZG93cyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSB1c3VhbGx5IGhhbmRsZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICNkZWZpbmUgRExMSU1QT1JUIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICNkZWZpbmUgRExMSU1QT1JUCiAgICAgICAgICAgICAgI2RlZmluZSBTVERDQUxMCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIERMTElNUE9SVCBleHRlcm4gU1REQ0FMTCB2b2lkIGZ1bmN0aW9uKGludCk7CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFNXSUcgaW5jb3JyZWN0bHkgZ2VuZXJhdGVzOgoKICAgICAgICAgICAgZXh0ZXJuIHZvaWQgZnVuY3Rpb24oaW50KTsKCiAgICAgICAgICAgIFRvIHdoaWNoIHRoZXJlIGlzIG5vIHNvbHV0aW9uIGFzIFNXSUcgZG9lc24ndCBoYW5kbGUgbm9uLXN0YW5kYXJkIGNhbGxpbmcgY29udmVudGlvbnMuIFRoZSBleHRyYQogICAgICAgICAgICAnZXh0ZXJuJyBmdW5jdGlvbiB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlzIHN1cGVyZmx1b3VzIHVubGVzcyBhIHVzZXIgaGFzIGZvcmdvdHRlbiB0byBhZGQgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIGRlY2xhcmF0aW9uIGludG8gdGhlIHdyYXBwZXJzLgoKICAgICAgICAgICAgVGhlIC1ub2V4dGVybiBjb21tYW5kbGluZSBhcmd1bWVudCBpcyBub3cgcmVkdW5kYW50IGFuZCBhIG5ldyBjb21tYW5kbGluZSBhcmd1bWVudCAtYWRkZXh0ZXJuIGNhbgogICAgICAgICAgICBiZSB1c2VkIHRvIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyLiBUaGlzIHNob3VsZG4ndCBiZSBuZWNlc3NhcnkgdW5sZXNzIHRoZSBoZWFkZXIgZmlsZQogICAgICAgICAgICBjb250YWluaW5nIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiB3YXMgaW5hZHZlcnRlbnRseSBub3QgYWRkZWQgdG8gdGhlIHdyYXBwZXJzLiBUbyBmaXggdGhpcwogICAgICAgICAgICBhZGQgdGhlIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGludG8geW91ciB3cmFwcGVycywgRm9yIGV4YW1wbGUsIHJlcGxhY2U6CgogICAgICAgICAgICAgIGV4dGVybiB2b2lkIGZvbyhpbnQpOwoKICAgICAgICAgICAgd2l0aDoKCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIGV4dGVybiB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA2LzIyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YSwgTW9kdWxhMywgT2NhbWxdCiAgICAgICAgICAgIFRoZSBpbnRlcm1lZGlhcnkgZnVuY3Rpb24gbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQgd2hlbiB3cmFwcGluZyB2YXJpYWJsZXMgdG8KICAgICAgICAgICAgbWF0Y2ggdGhlIG90aGVyIGxhbmd1YWdlIG1vZHVsZXMgc28gdGhhdCAlZXh0ZW5kIGZvciBhIG1lbWJlciB2YXJpYWJsZSB3b3JrcwogICAgICAgICAgICB1bmlmb3JtbHkgYWNyb3NzIGFsbCBsYW5ndWFnZSBtb2R1bGVzLCBlZzoKCiAgICAgICAgICAgICAgJWV4dGVuZCBFeHRlbmRNZSB7CiAgICAgICAgICAgICAgICBWYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgRXh0ZW5kTWVfVmFyX3NldChFeHRlbmRNZSAqLCBkb3VibGUpIHsuLi59CiAgICAgICAgICAgICAgICBkb3VibGUgRXh0ZW5kTWVfVmFyX2dldChFeHRlbmRNZSAqKSB7Li4ufQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbWV0aG9kcyBpbXBsZW1lbnRpbmcgdGhlIGdldC9zZXQgdXNlZCB0byBiZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgc2V0X0V4dGVuZE1lX1ZhcihFeHRlbmRNZSAqLCBkb3VibGUpIHsuLi59CiAgICAgICAgICAgICAgICBkb3VibGUgZ2V0X0V4dGVuZE1lX1ZhcihFeHRlbmRNZSAqKSB7Li4ufQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGlzIGFsc28gY2hhbmdlcyB0aGUgbmFtZSBvZiB2YXJpYWJsZSB3cmFwcGVyIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIC1ub3Byb3h5LgogICAgICAgICAgICBUaGUgb3JpZ2luYWwgbmFtZXMgY2FuIGJlIGdlbmVyYXRlZCB3aXRoIHRoZSAtb2xkdmFybmFtZXMgY29tbWFuZGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgpWZXJzaW9uIDEuMy4yNSAoSnVuZSAxMSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNi8xMS8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggaGFuZGxpbmcgb2YgYW5vbnltb3VzLWVudW0gdmFyaWFibGVzLgoKMDYvMTAvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGZvciBmdW5jdGlvbiBhcmd1bWVudHMgdGhhdCBhcmUgcGFzc2VkIGJ5CgkgICAgY29weS1vZi12YWx1ZS4gIEZpeCBmb3IgZ2xvYmFsICJjb25zdCBjaGFyICoiIHZhcmlhYmxlcy4KCSAgICBGaXggdGVzdGNhc2VzIGFycmF5c19kaW1lbnNpb25sZXNzLCBhcnJheXNfZ2xvYmFsLgoKMDYvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciB3aGVuIGEgYmFzZSBjbGFzcyBkZWZpbmVzIGEgc3ltYm9sIGFzIGEgbWVtYmVyIHZhcmlhYmxlIGFuZCBhIGRlcml2ZWQgY2xhc3MgZGVmaW5lcwogICAgICAgICAgICB0aGUgc2FtZSBzeW1ib2wgYXMgYSBtZW1iZXIgbWV0aG9kLgoKMDYvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNb3JlIGZpeGVzIGZvciB2aXJ0dWFsL25ldy9vdmVycmlkZSBtb2RpZmllcnMgLSB3aGVuIGEgbWV0aG9kIGhhcyBwcm90ZWN0ZWQgYWNjZXNzIAogICAgICAgICAgICBpbiBiYXNlIGFuZCBwdWJsaWMgYWNjZXNzIGluIGRlcml2ZWQgY2xhc3MuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzEwNjYzNjMgLSBGb2xsb3cgY29udmVudGlvbiBvZiByZWxlYXNlIHRhcmJhbGwgbmFtZSBtYXRjaGluZyBkaXJlY3RvcnkgbmFtZS4KCjA2LzAyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRml4ICMxMjExMzUzIC0gdHlwZXNhZmUgZW51bXMgKGFuZCBKYXZhIHByb3BlciBlbnVtcykgd3JhcHBlcnMgd2hlbiBlbnVtIHZhbHVlCiAgICAgICAgICAgIGlzIG5lZ2F0aXZlLgoKMDUvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9kZXJuaXNlZCBhbmQgdGlkaWVkIHVwIFdpbmRvd3MgbWFjcm9zIC0tPiBTV0lHRVhQT1JULCBTV0lHU1REQ0FMTC4gVGhleSBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgICAgICBieSB1c2VycyB2aWEgLUQgY29tcGlsZXIgZGlyZWN0aXZlcyBpZiBuZWVkIGJlLgoKMDUvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgJWNzbWV0aG9kbW9kaWZpZXJzIGNhbiBiZSBhcHBsaWVkIHRvIHZhcmlhYmxlcyBhcyB3ZWxsIGFzIG1ldGhvZHMgbm93LgoKICAgICAgICAgICAgSW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgJ3B1YmxpYycgbW9kaWZpZXIgdGhhdCBTV0lHIGdlbmVyYXRlcywgJWNzbWV0aG9kbW9kaWZpZXJzIHdpbGwgYWxzbwogICAgICAgICAgICByZXBsYWNlIHRoZSB2aXJ0dWFsL25ldy9vdmVycmlkZSBtb2RpZmllcnMgdGhhdCBTV0lHIHRoaW5rcyBpcyBhcHByb3ByaWF0ZS4gVGhpcyBmZWF0dXJlIGlzCiAgICAgICAgICAgIHVzZWZ1bCBmb3Igc29tZSBvYnNjdXJlIGNhc2VzIHdoZXJlIFNXSUcgbWlnaHQgZ2V0IHRoZSBtb2RpZmllcnMgaW5jb3JyZWN0LCBmb3IgZXhhbXBsZQogICAgICAgICAgICB3aXRoIG11bHRpcGxlIGluaGVyaXRhbmNlIGFuZCBvdmVycmlkaW5nIGEgbWV0aG9kIGluIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIG1pc3NpbmcgY29uc3RydWN0b3JzIHRvIHN0ZDo6cGFpciB3cmFwcGVycyAoc3RkX3BhaXIuaSkgZm9yIGFsbCBsYW5ndWFnZXMuCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHN0ZDo6cGFpciB3cmFwcGVycyBpbiBzdGRfcGFpci5pCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSBDIyAnbmV3JyBhbmQgJ292ZXJyaWRlJyBtb2RpZmllcnMgd2lsbCBiZSBnZW5lcmF0ZWQgd2hlbiBhIEMrKyBjbGFzcyBpbmhlcml0cyBtZXRob2RzCiAgICAgICAgICAgIHZpYSBhIEMrKyAndXNpbmcnIGRlY2xhcmF0aW9uLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgcHJldmlvdXNseSBiZWluZyBpZ25vcmVkIGluIGNsYXNzZXMgdGhhdCBpbmhlcml0ZWQgbWV0aG9kcwogICAgICAgICAgICBmcm9tICd1c2luZycgZGVjbGFyYXRpb25zLCBlZyBjYWxscyB0byBEZXJpdmVkOjpiYXIgYmVsb3cgd2lsbCBjb252ZXJ0IEMrKyBleGNlcHRpb25zIGludG8KICAgICAgICAgICAgYSB0YXJnZXQgbGFuZ3VhZ2UgZXhjZXB0aW9uL2Vycm9yLCBsaWtlIGl0IGFsd2F5cyBoYXMgZG9uZSBmb3IgQmFzZTo6QmFyLgoKICAgICAgICAgICAgY2xhc3MgQmFzZSB7CiAgICAgICAgICAgICAgdmlydHVhbCBiYXIoKSB0aHJvdyAoc3RkOjpzdHJpbmcpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjbGFzcyBEZXJpdmVkIDogcHVibGljIEJhc2UgewogICAgICAgICAgICAgIHVzaW5nIEJhc2U6OmJhcjsKICAgICAgICAgICAgfTsKCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZXRlY3RpbmcgdmlydHVhbCBtZXRob2RzIGluICVleHRlbmQgZm9yIHRoZSAtZnZpcnR1YWwgb3B0aW9uIGFuZCBDIyBvdmVycmlkZSBhbmQgbmV3CiAgICAgICAgICAgIG1ldGhvZCBtb2RpZmllcnMuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFRoZSAnbmV3JyBtb2RpZmllciBpcyBub3cgZ2VuZXJhdGVkIG9uIHRoZSBwcm94eSBtZXRob2Qgd2hlbiBhIG1ldGhvZCBpbiBhIGRlcml2ZWQKICAgICAgICAgICAgY2xhc3MgaXMgbm90IHBvbHltb3JwaGljIGFuZCB0aGUgc2FtZSBtZXRob2QgZXhpc3RzIGluIHRoZSBkZXJpdmVkIGNsYXNzIChpZSBpdCBoaWRlcwogICAgICAgICAgICB0aGUgYmFzZSBjbGFzcycgbm9uLXZpcnR1YWwgbWV0aG9kKS4KCjA1LzIzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4ZXMgdG8gZGV0ZWN0aW9uIG9mIGNvdmFyaWFudCByZXR1cm4gdHlwZXMgLSB3aGVuIHRoZSBjbGFzcyBoaWVyYXJjaHkgaXMgbW9yZQogICAgICAgICAgICB0aGFuIDIgY2xhc3NlcyBkZWVwLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6d3N0cmluZyB0eXBlbWFwcyBtb3ZlZCBmcm9tIHN0ZF9zdHJpbmcuaSB0byBzdGRfd3N0cmluZy5pCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGNyYXNoIGluIERvaFN0cnN0ciwgYnVnICMxMTkwOTIxCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVENMXSBGaXggZm9yIG1ldGhvZHMgd2l0aCBzaW1pbGFyIG5hbWVzIHdoZW4gc2hvd2luZyBsaXN0IG9mIG5hbWVzIG9uIGVycm9yIC0gYnVnICMxMTkxODI4LgogICAgICAgICAgICBQYXRjaCBmcm9tIEplcm9lbiBEb2JiZWxhZXJlLgoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gbG9uZyBsb25nIG92ZXJsb2FkaW5nIGZpeCAtIGJ1ZyAjMTE5MTgzNSwgcGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWcgIzExOTY3NTUgdG8gcmVtb3ZlIGRlYnVnIGZyb20gc3dpZ3RjbDguc3dnLgoKMDUvMTkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjIGFuZCAtZnZpcnR1YWwgb3B0aW9uXSBGaXggZm9yIHRoZSBvdmVycmlkZSBrZXkgbm90IGJlaW5nIGdlbmVyYXRlZCBpbiB0aGUgZGVyaXZlZCBjbGFzcyB3aGVuIGEKICAgICAgICAgICAgdmlydHVhbCBtZXRob2QncyByZXR1cm4gdHlwZSB3YXMgYSB0eXBlZGVmIGluIGVpdGhlciB0aGUgYmFzZSBvciBkZXJpdmVkIGNsYXNzLiBBbHNvIGVuc3VyZXMgdGhlCiAgICAgICAgICAgIG1ldGhvZCBpcyBlbGltaW5hdGVkIHdoZW4gdXNpbmcgdGhlIC1mdmlydHVhbCBvcHRpb24uIEZvciBleGFtcGxlLCBEZXJpdmVkLm1ldGhvZCBub3cgaGFzIHRoZSBDIwogICAgICAgICAgICBvdmVycmlkZSBrZXl3b3JkIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQqIEludGVnZXJQdHI7CgogICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgSW50ZWdlclB0ciBtZXRob2QoKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICBzdHJ1Y3QgRGVyaXZlZCA6IEJhc2UgewogICAgICAgICAgICAgICAgaW50ICogbWV0aG9kKCkgY29uc3Q7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFtDI10gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IGJlaW5nIGluY29ycmVjdGx5IGdlbmVyYXRlZCBmb3IgdmlydHVhbCBtZXRob2RzIHdoZW4gYSBiYXNlIGNsYXNzCiAgICAgICAgICAgIGlzIGlnbm9yZWQgd2l0aCAlaWdub3JlLgoKMDUvMTMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHRvIHJlbW92ZSAiZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIHdpbGwgYnJlYWsgc3RyaWN0LWFsaWFzaW5nIHJ1bGVzIgogICAgICAgICAgICB3YXJuaW5ncyBpbiBDIHdyYXBwZXJzIHdoZW4gY29tcGlsaW5nIEMgY29kZSB3aXRoICdnY2MgLVdhbGwgLWZzdHJpY3QtYWxpYXNpbmcnLiBQYXRjaCBmcm9tCiAgICAgICAgICAgIE1pY2hhZWwgQ2FoaWxsLiBUaGlzIG1vZGlmaWVzIG1hbnkgb2YgdGhlIGNhc3RzIHNsaWdodGx5LCBmb3IgZXhhbXBsZQogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikmamFyZzE7CiAgICAgICAgICAgIHRvCiAgICAgICAgICAgICAgYXJnMSA9ICooREJfRU5WICoqKSh2b2lkICopJmphcmcxOwoKMDUvMTIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTdXBwb3J0IGZvciBDIyBhdHRyaWJ1dGVzLiBDIyBhdHRyaWJ1dGVzIGNhbiBiZSBnZW5lcmF0ZWQ6CiAgICAgICAgICAgIDEpIE9uIGEgQy9DKysgdHlwZSBiYXNpcyBieSBzcGVjaWZ5aW5nIGFuIGluYXR0cmlidXRlcyBhbmQvb3Igb3V0YXR0cmlidXRlcyB0eXBlbWFwIGF0dHJpYnV0ZQogICAgICAgICAgICAgICBpbiB0aGUgaW10eXBlIG9yIGNzdHlwZSB0eXBlbWFwcyAoZm9yIEMjIHJldHVybiB0eXBlIG9yIEMjIHBhcmFtZXRlciB0eXBlIGF0dHJpYnV0ZXMpLgogICAgICAgICAgICAyKSBPbiBhIHdyYXBwZWQgbWV0aG9kIG9yIHZhcmlhYmxlIGJ5IHNwZWNpZnlpbmcgYSBjc2F0dHJpYnV0ZXMgZmVhdHVyZSAoJWZlYXR1cmUpLgogICAgICAgICAgICAzKSBPbiBhIHdyYXBwZWQgcHJveHkgY2xhc3Mgb3IgZW51bSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIHR5cGVtYXAuCgogICAgICAgICAgICBFeGFtcGxlcyBhcmUgaW4gdGhlIEMjIGRvY3VtZW50YXRpb24gKENTaGFycC5odG1sKS4KCjA0LzI5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE5ldyBjb25maWd1cmUgb3B0aW9uIHRvIHR1cm4gb2ZmIHRoZSBkZWZhdWx0IG1heGltdW0gY29tcGlsZXIgd2FybmluZyBhcwogICAgICAgICAgICB0aGV5IGNvdWxkbid0IGJlIHJlbW92ZWQgZXZlbiB3aGVuIG92ZXJyaWRpbmcgQ0ZMQUdTIGFuZCBDWFhGTEFHUyB3aXRoIGNvbmZpZ3VyZQogICAgICAgICAgICAoLi9jb25maWd1cmUgQ0ZMQUdTPSBDWFhGTEFHUz0pLiBUbyB0dXJuIHRoZSBtYXhpbXVtIHdhcm5pbmdzIG9mZiwgcnVuOiAgCgogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aG91dC1tYXhpbXVtLWNvbXBpbGUtd2FybmluZ3MKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIHdoaWNoIHJld29ya3MgdGhlIEphdmEgY29uc3RydWN0b3IgYW5kIGZpbmFsaXplL2Rlc3RydWN0b3IgdHlwZW1hcHMsCiAgICAgICAgICAgIGZvciBkaXJlY3RvcnMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3ZlcmFsbCBKYXZhIHR5cGVtYXBzLiBBZGRlZCB0aGUgZGlyZWN0b3JfdGFrZSBhbmQgCiAgICAgICAgICAgIGRpcmVjdG9yX3JlbGVhc2UgdHlwZW1hcHMgdG8gZW11bGF0ZSBvdGhlciBtb2R1bGVzJyBfX2Rpc293bl9fIGZ1bmN0aW9uYWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeGVkIHByb2JsZW1zIGR1ZSB0byB0aGUgb3ZlciBlYWdlciBnYXJiYWdlIGNvbGxlY3Rvci4gT2NjYXNpb25hbGx5IHRoZQogICAgICAgICAgICBnYXJiYWdlIGNvbGxlY3RvciB3b3VsZCBjb2xsZWN0IGEgQyMgcHJveHkgY2xhc3MgaW5zdGFuY2Ugd2hpbGUgaXQgd2FzIGJlaW5nIHVzZWQKICAgICAgICAgICAgaW4gdW5tYW5hZ2VkIGNvZGUgaWYgdGhlIG9iamVjdCB3YXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIGEgd3JhcHBlZCBmdW5jdGlvbi4KICAgICAgICAgICAgTmVlZGxlc3MgdG8gc2F5IHRoaXMgY2F1c2VkIGhhdm9jIGFzIHRoZSBDIyBwcm94eSBjbGFzcyBjYWxscyB0aGUgQysrIGRlc3RydWN0b3IKICAgICAgICAgICAgd2hlbiBpdCBpcyBjb2xsZWN0ZWQuIFByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzIG5vdyB1c2UgYSBIYW5kbGVSZWYsCiAgICAgICAgICAgIHdoaWNoIGhvbGRzIGFuIEludFB0ciwgaW5zdGVhZCBvZiBhIHBsYWluIEludFB0ciB0byBtYXJzaGFsIHRoZSBDKysgcG9pbnRlciB0byB1bm1hbmFnZWQKICAgICAgICAgICAgY29kZS4gVGhlcmUgZG9lc24ndCBhcHBlYXIgdG8gYmUgYW55IHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGFzIGEgcmVzdWx0IG9mIHRoaXMKICAgICAgICAgICAgbW9kaWZpY2F0aW9uLgoKICAgICAgICAgICAgVGhlIGNoYW5nZXMgYXJlIGluIHRoZSBwcm94eSBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMuIFRoZSBzd2lnQ1B0ciBpcyBub3cgb2YgdHlwZSBIYW5kbGVSZWYKICAgICAgICAgICAgaW5zdGVhZCBvZiBJbnRQdHIgYW5kIGNvbnNlcXVlbnRseSB0aGUgZ2V0Q1B0ciBtZXRob2QgcmV0dXJuIHR5cGUgaGFzIGFsc28gY2hhbmdlZC4gVGhlIG5ldAogICAgICAgICAgICBlZmZlY3QgaXMgdGhhdCBhbnkgY3VzdG9tIHdyaXR0ZW4gdHlwZW1hcHMgbWlnaHQgaGF2ZSB0byBiZSBtb2RpZmllZCB0byBzdWl0ZS4gQWZmZWN0ZWQgdXNlcnMKICAgICAgICAgICAgc2hvdWxkIG5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgbmV3ICdvdXQnIGF0dHJpYnV0ZSBpbiB0aGUgaW10eXBlIHR5cGVtYXAgYXMgdGhlCiAgICAgICAgICAgIGlucHV0IHR5cGUgaXMgbm93IGEgSGFuZGxlUmVmIGFuZCB0aGUgb3V0cHV0IHR5cGUgaXMgc3RpbGwgYW4gSW50UHRyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA0LzI4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgYXN5bW1ldHJpYyB0eXBlIG1hcnNoYWxsaW5nIGFkZGVkLiBTb21ldGltZXMgdGhlIG91dHB1dCB0eXBlIG5lZWRzIHRvIGJlCiAgICAgICAgICAgIGRpZmZlcmVudCB0byB0aGUgaW5wdXQgdHlwZS4gU3VwcG9ydCBmb3IgdGhpcyBjb21lcyBpbiB0aGUgZm9ybSBvZiBhIG5ldyBvcHRpb25hbCAnb3V0JwogICAgICAgICAgICBhdHRyaWJ1dGUgZm9yIHRoZSBjdHlwZSwgaW10eXBlIGFuZCBjc3R5cGUgdHlwZW1hcHMuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgbm90CiAgICAgICAgICAgIHNwZWNpZmllZCwgdGhlbiB0aGUgdHlwZSB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgaXMgdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZQogICAgICAgICAgICB0eXBlbWFwLCBhcyBoYXMgYWx3YXlzIHByZXZpb3VzbHkgYmVlbiB0aGUgY2FzZS4gSWYgdGhpcyB0eXBlbWFwIGF0dHJpYnV0ZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICAgIHRoZW4gdGhlIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBhdHRyaWJ1dGUgaXMgdXNlZCBmb3Igb3V0cHV0IHR5cGVzIGFuZCB0aGUgdHlwZSBzcGVjaWZpZWQKICAgICAgICAgICAgaW4gdGhlIHR5cGVtYXAgaXRzZWxmIGlzIHVzZWQgZm9yIHRoZSBpbnB1dCB0eXBlLiBBbiBvdXRwdXQgdHlwZSBpcyBhIHJldHVybiB2YWx1ZSBmcm9tCiAgICAgICAgICAgIGEgd3JhcHBlZCBtZXRob2Qgb3Igd3JhcHBlZCBjb25zdGFudCBhbmQgYW4gaW5wdXQgdHlwZSBpcyBhIHBhcmFtZXRlciBpbiBhIHdyYXBwZWQgbWV0aG9kLgoKICAgICAgICAgICAgQW4gZXhhbXBsZSBzaG93cyB0aGF0IGNoYXIgKiBjb3VsZCBiZSBtYXJzaGFsbGVkIGluIGRpZmZlcmVudCB3YXlzLCAKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW10eXBlLCBvdXQ9IkludFB0ciIpIGNoYXIgKiAic3RyaW5nIgogICAgICAgICAgICAgIGNoYXIgKiBmdW5jdGlvbihjaGFyICopOwoKICAgICAgICAgICAgVGhlIG91dHB1dCB0eXBlIGlzIHRodXMgSW50UHRyIGFuZCB0aGUgaW5wdXQgdHlwZSBpcyBzdHJpbmcuIFRoZSByZXN1bHRpbmcgaW50ZXJtZWRpYXJ5IEMjIGNvZGUgaXM6CgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIEludFB0ciBmdW5jdGlvbihzdHJpbmcgamFyZzEpOwoKMDQvMjIvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IGdlbmVyYXRpb24gb2YgImRlZmluZS1tZXRob2QiIGZvciBtZXRob2RzIG9mCgkgICAgY2xhc3NlcyB3aXRoIGEgY29uc3RydWN0b3IuICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjA0LzE1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgIEZvciB3cmFwcGVkIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBtdWx0aXBsZSB2YWx1ZXMgKHVzaW5nIGFyZ291dCksCgkgICAgU1dJRyBDSElDS0VOIG5vdyByZXR1cm5zIHRoZW0gYXMgbXVsdGlwbGUgdmFsdWVzIGluc3RlYWQgb2YgYXMKCSAgICBhIGxpc3QuICBUaGV5IGNhbiB0aGVuIGJlIGFjY2Vzc2VkIHVzaW5nIChjYWxsLXdpdGgtdmFsdWVzKS4KCjA0LzE0LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0KICAgICAgICAgICAgKyBBZGRlZCBhIHdob2xlIGJ1bmNoIG9mIG5ldyBfcnVubWUgc2NyaXB0cyBpbnRvIHRoZSBjaGlja2VuIHRlc3QKICAgICAgICAgICAgc3VpdGUuICBBbHNvIGZpeCBzb21lIGJ1Z3MgdGhlc2UgbmV3IHNjcmlwdHMgdHVybmVkIHVwLgoKICAgICAgICAgICAgKyBBZGRlZCBvcHRpbWl6YXRpb24gd2hlbiByZXR1cm5pbmcgYSB3cmFwcGVkIHByb3h5IGNsYXNzLiAgQmVmb3JlLAogICAgICAgICAgICBhIG1pbm9yIGdhcmJhZ2UgY29sbGVjdGlvbiB3YXMgaW52b2tlZCBldmVyeSB0aW1lIGEgZnVuY3Rpb24gcmV0dXJuZWQuCgoJICAgICsgQWxsIHRoZSBjaGlja2VuIEV4YW1wbGVzIHNob3VsZCBub3cgcnVuIGNvcnJlY3RseQoKMDQvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBNb3JlIGZpeGVzIGZvciB0eXBlbWFwIG1hdGNoaW5nIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzLCBpbiBwYXJ0aWN1bGFyCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nLCBzbyB0aGF0IHN0ZDo6c3RyaW5nIHZhcmlhYmxlcyBjYW4gYmUgZWFzaWx5IG1hcnNoYWxsZWQgd2l0aAogICAgICAgICAgICBhIEMjIHN0cmluZyBwcm9wZXJ0eSB1c2luZzoKCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9zdHJpbmcuaSIKICAgICAgICAgICAgICAlYXBwbHkgY29uc3Qgc3RkOjpzdHJpbmcgJiB7IHN0ZDo6c3RyaW5nICp2YXJpYWJsZV9uYW1lIH07CiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFyaWFibGVfbmFtZTsKCiAgICAgICAgICAgIChSZWNhbGwgdGhhdCBhbGwgY2xhc3MgdmFyaWFibGVzIGFyZSB3cmFwcGVkIHVzaW5nIHBvaW50ZXJzKQoKMDQvMDUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgKyBBZGRlZCBFeGFtcGxlcy9jaGlja2VuL2VnZywgYW4gZXhhbXBsZSBvbiBob3cgdG8gYnVpbGQgYSBjaGlja2VuCgkgICAgICBleHRlbnNpb24gbGlicmFyeSBpbiB0aGUgZm9ybSBvZiBhbiBlZ2cuICBBbHNvIHVwZGF0ZWQgdGhlCgkgICAgICBkb2N1bWVudGF0aW9uIG9uIHRoZSBkaWZmZXJlbnQgbGlua2luZyBvcHRpb25zLgoKCSAgICArIGNoaWNrZW4gdGVzdC1zdWl0ZSBub3cgaGFzIHN1cHBvcnQgdG8gY2hlY2sgU1dJRyB3aXRoIHRoZSAtcHJveHkKCSAgICAgIGFyZ3VtZW50IGlmIHRoZXJlIGV4aXN0cyBhIF9wcm94eV9ydW5tZS5zcyBmaWxlLgoKCSAgICArIE1vcmUgZml4ZXMgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zIGFuZCAtcHJveHkKCjAzLzMxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFR1cm5lZCBvbiBleHRyYSB0ZW1wbGF0ZSBmZWF0dXJlcyBmb3IgYWxsIGxhbmd1YWdlcyB3aGljaCB3ZXJlCiAgICAgICAgICAgIHByZXZpb3VzbHkgb25seSBhdmFpbGFibGUgdG8gUHl0aG9uLgoKICAgICAgICAgICAgVGhpcyBlbmFibGVzIHR5cGVtYXBzIGRlZmluZWQgd2l0aGluIGEgdGVtcGxhdGVkIGNsYXNzIHRvIGJlIHVzZWQgYXMKICAgICAgICAgICAgZXhwZWN0ZWQuIFJlcXVpcmVzICV0ZW1wbGF0ZSBvbiB0aGUgdGVtcGxhdGVkIGNsYXNzLCAldGVtcGxhdGUoKSB3aWxsCiAgICAgICAgICAgIGFsc28gcGljayB1cCB0aGUgdHlwZW1hcHMuIEV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbyAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICAgIG9yCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vPFQ+ICJpbiB0eXBlbWFwIGZvciBGb288VD4gIgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb19pKSBGb288aW50PjsKICAgICAgICAgICAgICAldGVtcGxhdGUoKSBGb288ZG91YmxlPjsKICAgICAgICAgICAgICAKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSB0aGUgcHJvcGVyICdpbicgdHlwZW1hcHMgd2hlcmV2ZXIgRm9vPGludD4gYW5kIEZvbzxkb3VibGU+CiAgICAgICAgICAgIGFyZSB1c2VkLgoKMDMvMzAvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gUGF0Y2ggZnJvbSBIYW5zIE9lc3RlcmhvbHQgZm9yIHN1cHBvcnRpbmcgTXpTY2hlbWUgMzB4LgoKMDMvMjkvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgKyBSZWFsbG93IG9sZGVyIHZlcnNpb25zIG9mIGNoaWNrZW4gKDEuNDAgdG8gMS44OSkgYnkgcGFzc2luZyAtbm9jb2xsZWN0aW9uCgkgICAgICBhcmd1bWVudCB0byBTV0lHCgkgICAgKyAlaW1wb3J0IG5vdyB3b3JrcyBjb3JyZWN0bHkgd2l0aCB0aW55Y2xvcy4gIChkZWNsYXJlICh1c2VzIC4uLikpIHdpbGwgYmUKCSAgICAgIGV4cG9ydGVkIGNvcnJlY3RseS4KCSAgICArIFRpbnlDTE9TIHByb3h5IGNsYXNzZXMgbm93IHdvcmsgY29ycmVjdGx5IHdpdGggb3ZlcmxvYWRlZCBmdW5jdGlvbnMKCSAgICAgIGFuZCBjb25zdHJ1Y3RvcnMuCgowMy8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgZm9yIGRpcmVjdG9yb3V0IHR5cGVtYXBzLiBKYXZhIGRpcmVjdG9ycwogICAgICAgICAgICByZXF1aXJlIHRoZSBkaXJlY3Rvcm91dCB0eXBlbWFwcyBsaWtlIHRoZSBvdGhlciBsYW5ndWFnZXMgbm93LiBUaGUgbmV3CiAgICAgICAgICAgIHR5cGVtYXBzIHByb3ZpZGUgZml4ZXMgZm9yIG1ldGhvZHMgd2hlcmUgdGhlIHJldHVybiB0eXBlIGlzIHJldHVybmVkCiAgICAgICAgICAgIGJ5IHJlZmVyZW5jZSAodGhpcyBjYW5ub3QgYXV0b21hdGljYWxseSBiZSBtYWRlIHRocmVhZCBzYWZlIHRob3VnaCkuCgowMy8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBFbnVtIGNhc3RpbmcgZml4ZXMuIFZpc3VhbCBDKysgZGlkbid0IGxpa2UgdGhlIEMgdHlwZSBjYXN0aW5nIFNXSUcgcHJvZHVjZWQKICAgICAgICAgICAgd2hlbiB3cmFwcGluZyBDKysgZW51bSByZWZlcmVuY2VzLCBhcyByZXBvcnRlZCBieSBBZG1pcmUgS2FuZGF3YXN2aWthLgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIFNGICMxMTI0NDkwLiBGaXggUGVybCBtYWNybyBjbGFzaGVzIHdoZW4gdXNpbmcgVmlzdWFsIFN0dWRpbydzIFNUTCBzdHJpbmcsCiAgICAgICAgICAgIHNvIG5vdyBwcm9qZWN0cyBjYW4gI2luY2x1ZGUgPHN0cmluZz4uCgowMy8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlZCAldmFyYXJncyB3aGljaCBnb3QgYnJva2VuIHdpdGggdGhlIHJlY2VudCBkZWZhdWx0IGFyZ3VtZW50IGNoYW5nZXMuCiAgICAgICAgICAgIEFsc28gd29ya3MgZm9yIEphdmEgYW5kIEMjIGZvciB0aGUgZmlyc3QgdGltZSBub3cuCgowMy8xNy8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICsgRml4IGEgd2hvbGUgYnVuY2ggb2YgYnVncyBpbiB0aGUgY2hpY2tlbiBtb2R1bGUuICBUaGUgZW50aXJlCiAgICAgICAgICAgICAgdGVzdCBzdWl0ZSBub3cgY29tcGlsZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgdGVzdHMgdGhhdCByZXF1aXJlCgkgICAgICBzdGRfdmVjdG9yLmksIHN0ZF9kZXF1ZS5pLCBhbmQgc28gb24sIHdoaWNoIGNoaWNrZW4gZG9lcyBub3QgaGF2ZSB5ZXQuCgoJICAgICsgQWRkIHN1cHBvcnQgZm9yICVleGNlcHRpb24gYW5kICV0eXBlbWFwKGV4Y2VwdGlvbnMpLiAgRXhjZXB0aW9ucyBhcmUKCSAgICAgIHRocm93biB3aXRoIGEgY2FsbCB0byAoYWJvcnQpIGFuZCBjYW4gYmUgaGFuZGxlZCBieSAoaGFuZGxlLWV4Y2VwdGlvbnMpCgowMy8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggZnJvbSBTY290dCBNaWNoZWwgZm9yIGRpcmVjdG9ycy4gTW9kaWZpY2F0aW9ucyB0byB0aGUgdHlwZW1hcHMKICAgICAgICAgICAgZ2l2aW5nIHVzZXJzIGZpbmUgY29udHJvbCBvdmVyIG1lbW9yeSBvd25lcnNoaXAgYW5kIGxpZmV0aW1lIG9mIGRpcmVjdG9yIGNsYXNzZXMuCiAgICAgICAgICAgIERpcmVjdG9yIGNsYXNzZXMgbm8gbG9uZ2VyIGxpdmUgZm9yZXZlciBieSBkZWZhdWx0IGFzIHRoZXkgYXJlIG5vdyBjb2xsZWN0YWJsZQogICAgICAgICAgICBieSB0aGUgR0MuCgowMy8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0gQWRkIHN1cHBvcnQgZm9yIGFkZGluZyBmaW5hbGl6ZXJzIGdhcmJhZ2UgY29sbGVjdGVkIG9iamVjdHMuCgkgICAgRnVuY3Rpb25zIHRoYXQgcmV0dXJuIG5ldyBvYmplY3RzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCAlbmV3b2JqZWN0IGFuZAoJICAgIGlucHV0IGFyZ3VtZW50cyB3aGljaCBjb25zdW1lIChvciB0YWtlIG93bmVyc2hpcCkgb2YgYSBwb2ludGVyIHNob3VsZAoJICAgIGJlIG1hcmtlZCB3aXRoIHRoZSBESVNPV04gdHlwZW1hcC4KCgkgICAgQWxzbyBhZGQgc3VwcG9ydCBmb3IgY29ycmVjdGx5IGNoZWNraW5nIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZAoJICAgIHRvIGEgZnVuY3Rpb24sIGFuZCByYWlzaW5nIGFuIGVycm9yIGlmIHRoZSB3cm9uZyBudW1iZXIgYXJlIHBhc3NlZC4KCjAzLzE0LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBBZGQgLS13aXRob3V0LWFsbGxhbmcgb3B0aW9uIHRvIGNvbmZpZ3VyZS5pbiwgd2hpY2ggaXMgdGhlIHNhbWUgYXMKICAgICAgICAgICAgcGFzc2luZyBhbGwgdGhlIC0td2l0aG91dC1weXRob24gLS13aXRob3V0LXBlcmw1IGV0Yy4uLiB0aGF0IE1hdHRoaWFzIGFkZGVkLgoKMDMvMDkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0gTWVtb3J5IGxlYWsgZml4IGZvciBmdW5jdGlvbnMgcmV0dXJuaW5nIGNsYXNzZXMvc3RydWN0cyBieSB2YWx1ZS4KCjAzLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggZm9yIFBlcmwgaW5jb3JyZWN0bHkgdGFraW5nIG1lbW9yeSBvd25lcnNoaXAgZm9yIHJldHVybiB0eXBlcyB0aGF0CiAgICAgICAgICAgIGFyZSB0eXBlZGVmcyB0byBhIHN0cnVjdC9jbGFzcyBwb2ludGVyLiBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVmFyaW91cyBleGNlcHRpb24gY2hhbmdlcyBmb3IgdGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLiBUaGVzZSBub3cgbW9yZQogICAgICAgICAgICBhY2N1cmF0ZWx5IG1pcnJvciB0aGUgc2FtZSBleGNlcHRpb25zIHRoYXQgU3lzdGVtLkNvbGxlY3Rpb25zLkFycmF5TGlzdCB0aHJvdy4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IHVuZGVmaW5lZCBiZWhhdmlvdXIgYWZ0ZXIgYW55IG9mIHRoZSBzdGQ6OnZlY3RvciBtZXRob2RzCiAgICAgICAgICAgIHRocm93IGFuIGV4Y2VwdGlvbi4KCjAzLzA3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gV2hlbiBudWxsIGlzIHBhc3NlZCBmb3IgYSBDKysgcmVmZXJlbmNlIG9yIHZhbHVlIHBhcmFtZXRlciwgdGhlIAogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duIGhhcyBiZWVuIGNvcnJlY3RlZCB0byBhbiBBcmd1bWVudE51bGxFeGNlcHRpb24gaW5zdGVhZAogICAgICAgICAgICBvZiBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uIGFzIHJlY29tbWVuZGVkIGluIHRoZSAuTkVUIEZyYW1ld29yayBkb2N1bWVudGF0aW9uLgoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgdGhyb3dzIHR5cGVtYXBzIHR1cm4gYSBDKysgZXhjZXB0aW9uIGludG8gYW4gQXBwbGljYXRpb25FeGNlcHRpb24sCiAgICAgICAgICAgIG5vdCBhIFN5c3RlbUV4Y2VwdGlvbiBub3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE51bWVyb3VzIGNoYW5nZXMgaW4gQyMgZXhjZXB0aW9uIGhhbmRsaW5nIGhhdmUgYmVlbiBtYWRlIG92ZXIgdGhlIHBhc3QKICAgICAgICAgICAgZmV3IHdlZWtzLiBBIHN1bW1hcnkgZm9sbG93czoKCiAgICAgICAgICAgIFRoZSB3YXkgaW4gd2hpY2ggQysrIGV4Y2VwdGlvbnMgYXJlIG1hcHBlZCB0byBDIyBleGNlcHRpb25zIGlzIHF1aXRlIGRpZmZlcmVudC4KICAgICAgICAgICAgVGhlIGNoYW5nZSBpcyB0byBmaXggQyMgZXhjZXB0aW9ucyBzbyB0aGF0IHRoZSBDKysgZXhjZXB0aW9uIHN0YWNrIGlzIGNvcnJlY3RseQogICAgICAgICAgICB1bndvdW5kIGFzIHByZXZpb3VzbHkgQysrIGV4Y2VwdGlvbnMgd2VyZSBiZWluZyB0aHJvd24gYWNyb3NzIHRoZSBDIFBJbnZva2UgbGF5ZXIKICAgICAgICAgICAgaW50byB0aGUgbWFuYWdlZCB3b3JsZC4KCiAgICAgICAgICAgIE5ldyB0eXBlbWFwIGF0dHJpYnV0ZXMgKGNhbnRocm93IGFuZCBleGNvZGUpIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIHRvIGNvbnRyb2wgdGhlCiAgICAgICAgICAgIG1hcHBpbmcgb2YgQysrIHRvIEMjIGV4Y2VwdGlvbnMuIEVzc2VudGlhbGx5IGEgY2FsbGJhY2sgaW50byB0aGUgdW5tYW5hZ2VkIHdvcmxkCiAgICAgICAgICAgIGlzIG1hZGUgdG8gc2V0IGEgcGVuZGluZyBleGNlcHRpb24uIFRoZSBleGNlcHRpb24gdG8gdGhyb3cgaXMgc3RvcmVkIGluIHRocmVhZCBsb2NhbAogICAgICAgICAgICBzdG9yYWdlIChzbyB0aGUgYXBwcm9hY2ggaXMgdGhyZWFkLXNhZmUpLiBUaGUgdHlwZW1hcHMgYXJlIGV4cGVjdGVkIHRvIHJldHVybgogICAgICAgICAgICBmcm9tIHVubWFuYWdlZCBjb2RlIGFzIHNvb24gYXMgdGhlIHBlbmRpbmcgZXhjZXB0aW9uIGlzIHNldC4gQW55IHBlbmRpbmcgZXhjZXB0aW9ucwogICAgICAgICAgICBhcmUgY2hlY2tlZCBmb3IgYW5kIHRocm93biBvbmNlIG1hbmFnZWQgY29kZSBzdGFydHMgZXhlY3V0aW5nLiBUaGVyZSBzaG91bGQKICAgICAgICAgICAgYmUgbWluaW1hbCBpbXBhY3Qgb24gZXhlY3V0aW9uIHNwZWVkIGR1cmluZyBub3JtYWwgYmVoYXZpb3VyLiBGdWxsIGRldGFpbHMgd2lsbCBiZQogICAgICAgICAgICBkb2N1bWVudGVkIGluIENTaGFycC5odG1sLgoKICAgICAgICAgICAgVGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oKSBmdW5jdGlvbiBoYXMgYmVlbiByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoIHRoZQogICAgICAgICAgICBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCgpIGFuZCBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb24oKQogICAgICAgICAgICBmdW5jdGlvbnMuIFRoZSBvcmlnaW5hbCBuYW1lIGhhcyBiZWVuIGRlbGliZXJhdGVseSBjaGFuZ2VkIHRvIGJyZWFrIG9sZCBjb2RlIGFzCiAgICAgICAgICAgIHRoZSBvbGQgYXBwcm9hY2ggd2FzIHNvbWV3aGF0IGZsYXdlZC4gQW55IHVzZXIgZGVmaW5lZCBleGNlcHRpb25zIHRoYXQgZm9sbG93IHRoZQogICAgICAgICAgICBzYW1lIHBhdHRlcm4gYXMgdGhlIG9sZCBhcHByb2FjaCBzaG91bGQgYWxzbyBiZSBmaXhlZC4KCiAgICAgICAgICAgIE51bWVyb3VzIG5ldyAuTkVUIGZyYW1ld29yayBleGNlcHRpb25zIGFyZSBub3cgYXZhaWxhYmxlIGZvciBlYXN5IHRocm93aW5nIGZyb20gCiAgICAgICAgICAgIHVubWFuYWdlZCBjb2RlLiBUaGUgY29tcGxldGUgbGlzdCBpczogCgogICAgICAgICAgICAgIEFwcGxpY2F0aW9uRXhjZXB0aW9uLCBBcml0aG1ldGljRXhjZXB0aW9uLCBEaXZpZGVCeVplcm9FeGNlcHRpb24sIAogICAgICAgICAgICAgIEluZGV4T3V0T2ZSYW5nZUV4Y2VwdGlvbiwgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIAogICAgICAgICAgICAgIE51bGxSZWZlcmVuY2VFeGNlcHRpb24sIE91dE9mTWVtb3J5RXhjZXB0aW9uLCBPdmVyZmxvd0V4Y2VwdGlvbiwgCiAgICAgICAgICAgICAgU3lzdGVtRXhjZXB0aW9uLCBBcmd1bWVudEV4Y2VwdGlvbiwgQXJndW1lbnROdWxsRXhjZXB0aW9uIGFuZAogICAgICAgICAgICAgIEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8wNS8yMDA1OiBtbWF0dXMKCSAgICAKCSAgICBGaXggc2V2ZXJhbCBtZW1vcnkgbGVha3MgYXJvdW5kLiBFdmVuIHdoZW4gd2Ugc3Vydml2ZSAga25vd25pbmcKCSAgICBzd2lnIGlzIGEgbWVtb3J5IGxlYWsgZmFjdG9yeSwgaXQgd2FzIGEgbGl0dGxlIG91dCBvZgoJICAgIGNvbnRyb2wuIFRvIHJ1biBzdGRfY29udGFpbmVycy5pIGluIHRoZSBweXRob24gdGVzdC1zdWl0ZSwKCSAgICBzd2lnIHdhcyB1c2luZyB+MjYwTUIsIG5vdyBpdCB1c2VzICdvbmx5JyB+NDBNQiwgd2hpY2ggaXMKCSAgICB0aGUgc2FtZSBhbW1vdW50IHRoYXQgZysrIHVzZXMsIHNvLCBpcyBub3QgdGhhdCBiYWQuCgkgICAgSW4gdGhlIHByb2Nlc3MsIEkgZm91bmQgYSBjb3VwbGUgb2YgZXh0cmEgRGVsZXRlcywgd2hpY2gKCSAgICBpbiBzb21lIGNhc2VzIGNvdWxkIHRyaWdnZXIgc2VnLiBmYXVsdHMgYW5kL29yCgkgICAgRE9IL2Fzc2VydHMuCgkgICAgCgkgICAgW3B5dGhvbl0gQmV0dGVyIHN1cHBvcnQgZm9yIGRpcmVjdG9ycyArIGV4Y2VwdGlvbi4gTW9yZQoJICAgIHZlcmJvc2UgZXJyb3JzIGFuZCBhZGRlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBoYW5kbGVyLgoKCSAgICBbcHl0aG9uXSBGaXggbWVtb3J5IGxlYWsgZm9yIHRoZQoKCSAgICAJICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4gPiAKCgkgICAgY2FzZSxyZXBvcnRlZCBieSBCbyBQZW5nLgoKCSAgICBbcHl0aG9uXSBGaXggU3dpZ1B5T2JqZWN0IGNvbXBhcmUgcHJvYmxlbSByZXBvcnRlIGJ5CgkgICAgQ2FtZXJvbiBQYXRyaWNrLiAKCgkgICAgW3B5dGhvbl0gRml4IHNldmVyYWwgd2FybmluZ3MgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIAoJICAgIGZvciBnbnUtZ2NjLCBJbnRlbCBhbmQgVkM3LjEgIGNvbXBpbGVycy4KCgowMi8yNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBVcGRhdGUgZG9jdW1lbnRhdGlvbiB0byB1c2UgQ1NTIGFuZCA8ZGl2PiBpbnN0ZWFkIG9mIDxibG9ja3F1b3RlPgoJICAgIEkgdXNlZCBhIHNjcmlwdCB0byBjb252ZXJ0IHRoZSBkb2NzLCBhbmQgaXQgc2V0IGFsbCB0aGUgYm94IGNsYXNzZXMKCSAgICB0byBiZSAiY29kZSIuICBUaGVyZSBhcmUgYWN0dWFsbHkgNCBkaWZmZXJlbnQgY2xhc3NlcywKCSAgICAic2hlbGwiLCAiY29kZSIsICJ0YXJnZXRsYW5nIiwgYW5kICJkaWFncmFtIi4gIFdlIG5lZWQgdG8gZ28gdGhyb3VnaAoJICAgIGFuZCBjb252ZXJ0IHRoZSBkaXZzIGRlcGVuZGluZyBvbiB3aGF0IHRoZXkgY29udGFpbi4KCjAyLzIzLzIwMDU6IG1tYXR1cwoKCSAgICBbUHl0aG9uXSBBZGRlZCBvcHRpb24gLW5vcnR0aSB0byBkaXNhYmxlIHRoZSB1c2Ugb2YgbmF0aXZlCgkgICAgQysrIFJUVEkgd2l0aCBkaXJlY3RvcnMgKGR5bmFtaWNfY2FzdDw+IGlzIG5vdCB1c2VkKS4KCgkgICAgQWRkIG1vcmUgY29kZSBmb3IgZGlyZWN0b3JzIHRvIGRldGVjdCBhbmQgcmVwb3J0IGVycm9ycyBpbgoJICAgIHRoZSBweXRob24gc2lkZS4KCgkgICAgRXh0ZW5kIHRoZSB1c2Ugb2YgU1dJR0lOVEVSTiB3aGVuZXZlciBpcyBwb3NzaWJsZS4KCgkgICAgUmVtb3ZlIHRlbXBsYXRlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IFZDNy4xLgoKCSAgICBSZW1vdmUgd2FybmluZ3MgcmVwb3J0ZWQgYnkgZ2NjL2crKy4gRmluYWxseSB5b3UgY2FuCgkgICAgY29tcGlsZSB1c2luZwoKCSAgICAgICBnKysgLVcgLVdhbGwgLWMgbXltb2R1bGVfd3JhcC5jeHgKCgkgICAgYW5kIG5vIHNwdXJpb3VzIGVycm9ycyB3aWxsIGJlIGdlbmVyYXRlZCBpbiB0aGUgd3JhcHBlcgoJICAgIGNvZGUuCgowMi8yMy8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBBZGRlZCAtZXh0ZXJuYWwtcnVudGltZSBhcmd1bWVudC4gIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBkdW1wCgkgICAgb3V0IGFsbCB0aGUgY29kZSBuZWVkZWQgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgcnVudGltZSBzeXN0ZW0sCgkgICAgYW5kIGl0IHJlcGxhY2VzIGluY2x1ZGluZyB0aGUgZmlsZXMgZGlyZWN0bHkuICBUaGlzIGNoYW5nZSBhZGRzCgkgICAgdHdvIG5ldyB2aXJ0dWFsIGZ1bmN0aW9ucyB0byB0aGUgTGFuZ3VhZ2UgY2xhc3MsIHdoaWNoIGFyZSB1c2VkCgkgICAgdG8gZmluZCB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMgcnVudGltZSBjb2RlLiAgSSBhbHNvIHVwZGF0ZWQKCSAgICBhbGwgbGFuZ3VhZ2VzIHRoYXQgdXNlIHRoZSBydW50aW1lIHRvIGltcGxlbWVudCB0aGVzZSB0d28gZnVuY3Rpb25zLgoKMDIvMjIvMjAwNTogbW1hdHVzIAoJICAgIEZpeCAldGVtcGxhdGUgKyBwcml2YXRlIGVycm9yIFNGIzEwOTk5NzYuCgowMi8yMS8yMDA1OiBtbWF0dXMgCgoJICAgIEZpeCBzd2lncnVuLnN3ZyB3YXJuaW5ncyByZXBvcnRlZCB3aGVuIHVzaW5nICJnY2MgLVcgLVdhbGwiCgkgICAgKHN0YXRpYy9pbmxpbmUgbm90IHVzZWQgaW4gZnJvbnQgb2YgYSBmdW5jdGlvbgoJICAgIGRlY2xhcmF0aW9uKSwgYW5kIGFkZCBTV0lHVU5VU0VEIGF0dHJpYnV0ZSB0byBhdm9pZAoJICAgIHVudXNlZCB3YXJuaW5ncyBlbHNld2hlcmUuCgoJICAgIEZpeCB1bnVzZWQgdmFyaWFibGUgd2FybmluZ3MuCgoJICAgIFtQeXRob25dIFVzZSBuZXcgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQgd2FybmluZ3MgaW4KCSAgICBTV0lHSU5URVJOIG1ldGhvZHMuCgoJICAgIFtQeXRob25dIEZpeCBQeU9TX3NucHJpbnRmIGZvciBweXRob24gdmVyc2lvbnMgPCAyLjIgKFNGICMxMTA0OTE5KS4KCgkgICAgW1B5dGhvbl0gRml4IG1hcC9tdWx0aW1hcCB0byBhbGxvdyBlbXB0eSBtYXBzIChyZXBvcnRlZCBieQogIAkgICAgUGhpbGlwcGUgSGV0cm95KS4KCgkgICAgW0RvY3NdIEFkZCBzb21lIGRvY3VtZW50YXRpb24gdG8gUHl0aG9uLmh0bWwgYW5kCgkgICAgU1dJR1BsdXMuaHRtbCwgaW5jbHVkaW5nIGZvciBleGFtcGxlIHRoZSBmYWN0IHRoYXQKCSAgICAnZnJpZW5kcycgYXJlIG5vdyBzdXBwb3J0ZWQuCgowMi8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUEhQXSBQYXRjaCBmcm9tIE9sbHkgQmV0dHMsIHNvIHRoYXQgd3JhcHBlcnMgY29tcGlsZSB3aXRoIFplbmQgdGhyZWFkIHNhZmV0eSBlbmFibGVkLgoKMDIvMTcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTWVtb3J5IGxlYWsgZml4IGluIHNvbWUgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZSBtb2R1bGVzIHdoZW4gdXNpbmcgZGVmYXVsdAogICAgICAgICAgICBhcmd1bWVudHMgaW4gY29uc3RydWN0b3JzLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlIHdhcyBub3QgdGFraW5nIG93bmVyc2hpcCBvZiB0aGUKICAgICAgICAgICAgQysrIG9iamVjdCBtZW1vcnkgd2hlbiBhbnkgb2YgdGhlIGNvbnN0cnVjdG9ycyB0aGF0IHVzZSBkZWZhdWx0IGFyZ3VtZW50cyB3YXMgY2FsbGVkLgoKMDIvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzExMTUwNTU6IEZhaWxlZCBtYWtlIGluc3RhbGwuIFBhdGNoIGZyb20gUm9iIFN0b25lLgoKMDIvMTYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFNGICMxMTIzNDE2IGZyb20gUGF1bCBNb29yZS4gQ29ycmVjdCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgU1RSSU5HQVJSQVkKICAgICAgICAgICAgdHlwZW1hcHMgaW4gdmFyaW91cy5pLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRGlzYWJsZWQgdHlwZW1hcCBzZWFyY2ggY2hhbmdlcyBmb3Igbm93IChzZWUgZW50cnkgMTkvMTIvMjAwNCkuIEl0IGJyZWFrcwogICAgICAgICAgICBvbGQgdHlwZW1hcHMsIGxlbmd0aGVucyB0aGUgZXhlY3V0aW9uIHRpbWUgYnkgYWJvdXQgMjUlIGFuZCBpbnRyb2R1Y2VzCiAgICAgICAgICAgIGluY29uc2lzdGVuY2llcy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIHN3aWcgLWhlbHAgZm9sbG93cyBvdGhlciBzb2Z0d2FyZSBieSBwcmludGluZyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIgbm93LgogICAgICAgICAgICBzd2lnIC12ZXJzaW9uIGFsc28gZGlzcGxheXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgQmVoYXZpb3VyIHJlcG9ydGVkIGJ5IFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBGaXggZm9yIHRoZSBsZXNzIGNvbW1vbmx5IHVzZWQgb3JkZXJpbmcgb2YgJWluY2x1ZGUgYW5kICNpbmNsdWRlLCBzbwogICAgICAgICAgICB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBjb21waWxlcy4gQnVnIHJlcG9ydGVkIGJ5IHJlcG9ydGVkIGJ5IE1heCBCb3dzaGVyLgogICAgICAgICAgICAgICVpbmNsdWRlIGZvby5oCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV9IAoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBTV0lHX2V4Y2VwdGlvbiBtYWNybyB3aWxsIG5vdyByZXR1cm4gZnJvbSB1bm1hbmFnZWQgY29kZSAvIG5hdGl2ZSBjb2RlCiAgICAgICAgICAgIGFzIHNvb24gYXMgaXQgaXMgY2FsbGVkLiBGaXhlcyBwb3NzaWJsZSBKVk0gY3Jhc2hlcyBhbmQgb3RoZXIgY29kZSB1bmV4cGVjdGVkbHkKICAgICAgICAgICAgYmVpbmcgZXhlY3V0ZWQuIE5vdGUgU1dJR19leGNlcHRpb24gaXMgb25seSBvY2Nhc2lvbmFsbHkgdXNlZCBieSBTV0lHIGxpYnJhcnkKICAgICAgICAgICAgd3JpdGVycywgYW5kIGlzIGJlc3QgYXZvaWRlZCBieSBTV0lHIHVzZXJzLgoKMDIvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBUeXBlbWFwcyBjYW4gbm93IGJlIHRhcmdldGVkIGF0IGdsb2JhbCB2YXJpYWJsZSBuYW1lcwogICAgICAgICAgICBhbmQgc3RhdGljIG1lbWJlciB2YXJpYWJsZSBuYW1lcy4gUHJldmlvdXNseSB0aGUgdHlwZW1hcHMgZm9yIAogICAgICAgICAgICB0aGUgc2V0dGVycyB3ZXJlIGlnbm9yZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IGdsb2JhbGludCAiLi4uIgogICAgICAgICAgICAgIGludCBnbG9iYWxpbnQ7CgowMi8xMy8yMDA1OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGQgJXR5cGVjaGVjayBmb3IgU1dJR1RZUEUsIGFkZCAldHlwZWNoZWNrIGZvciBwdHJkaWZmX3QsIGZpeAoJICAgIHR5cGVtYXBzIGZvciBzaXplX3QuCgoJICAgIFtQaWtlXSBNZXJnZSBwYXRjaCBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZiBmb3IgaW1wcm92ZWQgUGlrZSBjb25maWd1cmF0aW9uLgoKMDIvMTIvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIE5ldyBjb25maWd1cmUgc3dpdGNoZXMgLS13aXRob3V0LXRjbCwgLS13aXRob3V0LXB5dGhvbiBldGMuIGFsbG93IHRvCiAgICAgICAgICAgIGRpc2FibGUgdGhlIHNlYXJjaCBmb3IgaW5zdGFsbGVkIGxhbmd1YWdlcy4KCjAxLzMxLzIwMDU6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIEFkZCBEb2hTb3J0TGlzdCB0byBET0gKCSAgICAKCSAgICAtIEltcHJvdmUgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW06CiAgICAgICAgICAgICAgICsgU3BlZWQuIFR5cGUgbG9hZGluZyBpcyBub3cgTyhuIGxvZyBuKSBpbnN0ZWFkIG9mIE8oTl4yKSwgd2hpY2gKCSAgICAgICAgIGZvciBsYXJnZSBtb2R1bGVzIGlzIGEgaHVnZSBpbXByb3ZlbWVudC4KICAgICAgICAgICAgICAgKyBBIHdob2xlIGJ1bmNoIG9mIGZ1bmN0aW9ucyBpbiBzd2lncnVuLnN3ZyBubyBsb25nZXIgbmVlZCB0aGUgCiAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2xpc3RfaGFuZGxlIHBhc3NlZCB0byB0aGVtLiAgVGhlIG9ubHkgb25lIGxlZnQgaXMgCgkJIFR5cGVRdWVyeS4gIFRoaXMgYWxzbyBtYWtlcyBydW50aW1lLnN3ZyBhIGxvdCBzbWFsbGVyLgoJICAgICAgICsgU3BsaXQgdXAgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlIGludG8gdHdvIHN0cnVjdHVyZXMKCSAgICAgICAgIChzd2lnX3R5cGVfaW5mbyBhbmQgc3dpZ19jYXN0X2luZm8pCgkgICAgICAgKyBTdG9yZSBhIHBvaW50ZXIgdG8gYSBzd2lnX3R5cGVfaW5mbyByYXRoZXIgdGhhbiBqdXN0IHRoZSB0eXBlCgkgICAgICAgICBuYW1lIHN0cmluZyBpbiB0aGUgbGlua2VkIGxpc3Qgb2YgY2FzdHMuIEZpcnN0IG9mZiwgdGhpcyBtYWtlcwoJICAgICAgICAgdGhlIGd1aWxlIG1vZHVsZSBhIGxpdHRsZSBmYXN0ZXIsIGFuZCBzZWNvbmQsIHRoZQoJICAgICAgICAgU1dJR19UeXBlQ2xpZW50RGF0YSgpIGZ1bmN0aW9uIGlzIGZhc3RlciB0b28uIAoJICAgICAgICsgQWRkIHRoZSBpZGVhIG9mIGEgbW9kdWxlIGludG8gdGhlIHR5cGUgc3lzdGVtLiAgQmVmb3JlLCBhbGwgdGhlCgkgICAgICAgICB0eXBlcyB3ZXJlIHN0b3JlZCBpbiBvbmUgaHVnZSBsaW5rZWQgbGlzdC4gTm93LCBhbm90aGVyIGxldmVsIGlzCgkgICAgICAgICBhZGRlZCwgYW5kIHRoZSB0eXBlIHN5c3RlbSBzdG9yZXMgYSBsaW5rZWQgbGlzdCBvZiBtb2R1bGVzLCBlYWNoCgkgICAgICAgICBvZiB3aGljaCBzdG9yZXMgYW4gYXJyYXkgb2YgdHlwZXMgYXNzb2NpYXRlZCB3aXRoIGl0LgoJICAgICAgICsgRm9yIG1vcmUgaW5mb3JtYXRpb24gb2YgaG93IHRoZSBydW50aW1lIHR5cGUgc3lzdGVtIG5vdyB3b3JrcywKCSAgICAgICAgIHBsZWFzZSBzZWUgRG9jL01hbnVhbC90eXBlbWFwcy5odG1sIGFuZCBEb2MvRGV2ZWwvcnVudGltZS50eHQKCQkgCgkgICAgLSBVcGRhdGUgYWxsIGxhbmd1YWdlIG1vZHVsZXMgdG8gdXNlIHRoZSBuZXcgdHlwZSBzeXN0ZW0uICBUaGUgY2hhbmdlcwoJICAgICAgdG8gZWFjaCBsYW5ndWFnZSBtb2R1bGUgYXJlIG1pbm9yLiAgQWxsIGxhbmd1YWdlcyBhcmUgbm93IGFibGUgdG8KCSAgICAgIHVzZSBydW50aW1lLnN3ZyBmb3IgZXh0ZXJuYWwgYWNjZXNzIHRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZQoJICAgICAgb25seSBweXRob24gYW5kIHBlcmwgZGlkLgoKCSAgICAtIFtndWlsZSwgbXpzY2hlbWUsIG9jYW1sLCBhbmQgcGhwNF0gIFRoZXNlIGxhbmd1YWdlcyBvcGVuZWQgdXAgdGhlCgkgICAgICBpbml0IGZ1bmN0aW9uIGluc2lkZSB0aGUgLmN4eCBjb2RlLCBhbmQgYW55IGNvZGUgaW4gdGhlIC5zd2cgZmlsZXMKCSAgICAgIGluIHRoZSBpbml0IHNlY3Rpb24gd2FzIGluc2lkZSB0aGlzIGZ1bmN0aW9uLiAgVGhpcyB3YXMgYSBwcm9ibGVtCgkgICAgICBmb3Igc3dpZ2luaXQuc3dnLCB3aGljaCBuZWVkcyB0byBiZSBpbnNlcnRlZCBiZWZvcmUgdGhlIFNXSUdfaW5pdAoJICAgICAgZnVuY3Rpb24gaXMgb3BlbmVkLiAgVGh1cyBJIGNoYW5nZWQgdGhlc2UgbGFuZ3VhZ2VzIHRvIGJlIGxpa2UKCSAgICAgIHB5dGhvbiBvciBwZXJsLCB3aGVyZSB0aGUgaW5pdCBmdW5jdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgLnN3ZwoJICAgICAgZmlsZS4KCSAgICAgIAoJICAgIC0gW1J1YnldIEluc3RlYWQgb2YgbW92aW5nIHRoZSBpbml0IGZ1bmN0aW9uIHRvIHRoZSAuc3dnIGZpbGUsIEkKCSAgICAgIGFkZGVkIGEgbmV3IHNlY3Rpb24gaW5pdGJlZm9yZWZ1bmMsIGFuZCB0aGVuIGFkZGVkCgkgICAgICAlaW5zZXJ0KGluaXRiZWZvcmVmdW5jKSAic3dpZ2luaXQuc3dnIgoKCSAgICAtIFtNelNjaGVtZV0gRml4IGVudW1zIGFuZCBmaXggRXhhbXBsZXMvTWFrZWZpbGUuaW4gc28gdGhhdCBpZgoJICAgICAgbXVsdGlwbGUgLUkgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIElOQ0xVREVTIHZhcmlhYmxlLCBlYWNoCgkgICAgICBnZXRzIGEgKytjY2YuCgoJICAgIC0gW0d1aWxlIEdIXSBVcGRhdGUgR3VpbGUgR0ggdG8gdXNlIHRoZSBuZXcgdHlwZSBzeXN0ZW0uICBTZWUKCSAgICAgIERvYy9NYW51YWwvR3VpbGUuaHRtbCBmb3IgaG93IHNtb2JzIGFyZSBub3cgdXNlZC4KCjAxLzExLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3IHR5cGVtYXAgY2FsbGVkICdjc2NvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuCgogICAgICAgICAgICBbSmF2YV0gTmV3IHR5cGVtYXAgY2FsbGVkICdqYXZhY29uc3RydWN0Jy4gVGhlIGNvZGUgaW4gdGhpcyB0eXBlbWFwcyB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgICAgICAgIGNvZGVkIGFuZCBjb3VsZCBub3QgYmUgY3VzdG9taXNlZCBieSBhIHVzZXIuIFRoaXMgdHlwZW1hcCBjb250YWlucyB0aGUgY29kZSB0aGF0IGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnRvIGEgcHJveHkgY2xhc3MncyBjb25zdHJ1Y3Rvci4gQW5vdGhlciB0eXBlbWFwIG5hbWVkICdqYXZhY29uc3RydWN0X2RpcmVjdG9yJwogICAgICAgICAgICBpcyB1c2VkIGluc3RlYWQgd2hlbiB0aGUgcHJveHkgY2xhc3MgaXMgYSBkaXJlY3RvciBjbGFzcy4KCiAgICAgICAgICAgIFtDIywgSmF2YV0gSWYgYSBDKysgY2xhc3MgZGlkIG5vdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgYSBwcm90ZWN0ZWQgZGVmYXVsdCBjb25zdHJ1Y3RvcgogICAgICAgICAgICB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgU1dJRy4gVGhpcyBzZWVtcyBpcyB1bm5lY2Vzc2FyeSBhbmQgaGFzIGJlZW4gcmVtb3ZlZAogICAgICAgICAgICBhbmQgdGhlcmVieSBnaXZpbmcgdGhlIHVzZXIgYWxtb3N0IGNvbXBsZXRlIGNvbnRyb2wgb3ZlciB0aGUgZ2VuZXJhdGVkIGNvZGUgYWxvbmcgd2l0aCB0aGUKICAgICAgICAgICAgbmV3IHR5cGVtYXBzIGFib3ZlLgoKMTkvMTIvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtEaXNhYmxlZCwgc2VlIGVudHJ5IDAyLzE1LzIwMDRdCiAgICAgICAgICAgIC0gRml4IHR5cGVtYXAgc2VhcmNoLCBub3cgdGhlICJvdXQiIHR5cGVtYXAgc2VhcmNoIGlzIGRvbmUgYXMgZm9sbG93cwoKICAgICAgICAgICAgICAgICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpICAgLT4gIGludCAqRm9vOjpmb28oaW50IGJhcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqRm9vOjpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqZm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICoKCiAgICAgICAgICAgICAgIHRoZW4sIG5vdyB5b3UgY2FuIGJlIG1vcmUgc3BlY2lmaWMsIGFuZCBkZWZpbmUKCiAgICAgICAgICAgICAgLyogYXBwbHkgb25seSBmb3IgICdGb286OmZvbycgbWV0aG9kICovCiAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgKiBGb286OmZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgLyogYXBwbHkgZm9yIGFsbCAnZm9vJyBmdW5jdGlvbnMvbWV0aG9kcyAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogZm9vKGludCAqYmFyKSAuLi47IAoKICAgICAgICAgICAgICAlaW5saW5lIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgaW50ICpmb28oaW50ICpiYXIpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9CgkgIAoKMTUvMTIvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIC0gTW9yZSBmaXhlcyBmb3IgdGVtcGxhdGVzIGFuZCB0ZW1wbGF0ZSBkZWZhdWx0IGFyZ3MuCiAgICAgICAgICAgICAgU2VlIHRlbXBsYXRlX2RlZmF1bHQuaSBmb3Igc2NhcnkgY2FzZXMgdGhhdCBub3cgYXJlIAogICAgICAgICAgICAgIHN1cHBvcnRlZCwgYmVzaWRlcyB0aGUgYWxyZWFkeSB1Z2x5IFNUTC9zdGQgY2FzZXMuCiAgICAgICAgICAgICAgCiAgICAgICAgICAgIC0gQ29zbWV0aWNzIGFuZCBtb3JlIHVzZSBvZiAnY29uc3QnIHdoZXJlIGl0IHdhcyBpbXBsaWNpdC4KICAgICAgICAgICAgLSBPdGhlciBmaXhlcyBmb3IgT1NTLCB3aGljaCBpcyBub3cgd29ya2luZyBhZ2FpbiB3aXRoIDEuMy4yNS4KCQpWZXJzaW9uIDEuMy4yNCAoRGVjZW1iZXIgMTQsIDIwMDQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzEyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gRml4IGEgYnVuY2ggb2YgYnVncyByZWxhdGluZyB0byAtcHJveHkgc3VwcG9ydAoJICAgICAgKyBub24tY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIG1lbWJlciBjbGFzcyB2YXJpYWJsZXMgbm93IGV4cG9ydCBwcm9wZXJseSB1c2luZyAtcHJveHkKCSAgICAgICsgYWRkZWQgYSAtbm91bml0IGFyZ3VtZW50LCB3aGljaCBkb2VzIG5vdCBleHBvcnQgdGhlIChkZWNsYXJlICh1bml0IC4uLikpCgkgICAgICArIGNvcnJlY3RseSBpbnN0YWxsIHN3aWdjbG9zcHJlZml4LnNjbQoJICAgICAgKyBjb25zdGFudHMgKGVudW1zLCBkZWZpbmVzKSBub3cgY29ycmVjbHkgZXhwb3J0IHdoZW4gdXNpbmcgLXByb3h5CgoxMi8xMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25maWd1cmUgZml4IGZvciB3aGVuIG1vcmUgdGhhbiBvbmUgdmVyc2lvbiBvZiBqbmlfbWQuaCBpcyBmb3VuZAogICAgICAgICAgICBpbiB0aGUgSmF2YSBpbmNsdWRlIGRpcmVjdG9yeSAod2FzIGdlbmVyYXRpbmcgbG90cyBvZiBzZWQgZXJyb3IKICAgICAgICAgICAgbWVzc2FnZXMpLgoKMTIvMDgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeGVzIHRvIGFycmF5c19qYXZhLmkgc28gdGhhdCBvbmUgY2FuIGFwcGx5IHRoZSBhcnJheQogICAgICAgICAgICB0eXBlbWFwcyB0byBmdW5jdGlvbnMgdGFraW5nIHBvaW50ZXJzIGFzIGlucHV0LCBlZwoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgJWFwcGx5IGludFtdIHtpbnQqfTsKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCAqYSk7CgoxMi8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3IgbW9kcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwuIE5ldyB0eXBlbWFwcwogICAgICAgICAgICBkaXJlY3RvcmRpc2Nvbm5lY3QgYW5kIGRpcmVjdG9yZGlzY29ubmVjdF9kZXJpdmVkIGZvciB0aGUgCiAgICAgICAgICAgIHN3aWdEaXJlY3RvckRpc2Nvbm5lY3QoKSBtZXRob2QuIEFsc28gZml4IHRvIGdldCB0aGUgamF2YXBhY2thZ2UKICAgICAgICAgICAgdHlwZW1hcCB3b3JraW5nIGFnYWluLgoKMTIvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBGaW5pc2hpbmcgdGhlIGZpeGVzIGZvciB0ZW1wbGF0ZXMgKyBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzICsgc3BlY2lhbGl6YXRpb25zLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBOb3cgd2UgdXNlIHRoZSBuZXcgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyBpbiB0aGUgc3RkL1NUTCBsaWJyYXJ5LiBUaGF0IG1lYW5zIHRoZSBpbnRlcm5hbAoJICAgICAgc3dpZyBmaWxlcyBhcmUgZ2V0dGluZyB1Z2xpZXIgc2luY2Ugd2Ugbm93IHN1cHBvcnQgdGhlCgkgICAgICBvcmlnaW5hbCBkZWNsYXJhdGlvbnM6CgoJICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBfVHAsIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPCBfVHAgPiA+CgkJY2xhc3MgdmVjdG9yIHsKCQkuLi4uCgkJfTsKCSAgICAgIAkgICAgIAogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX0tleSwgY2xhc3MgX1RwLCBjbGFzcyBfQ29tcGFyZSA9IHN0ZDo6bGVzczxfS2V5ID4sCgkgICAgICAgIGNsYXNzIF9BbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPHN0ZDo6cGFpcjxjb25zdCBfS2V5LCBfVHAgPiA+ID4KICAgICAgICAgICAgICAgIGNsYXNzIG1hcCB7CgkJLi4uLgoJCX07CiAKICAgICAgICAgICAgICBhbmQgdGhlIHVzZXIgY2FuIHVzZSB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBhcwoKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCSAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50LCBzdGQ6OmFsbG9jYXRvcjxpbnQ+ID47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgTXlBbGxvY2F0b3I8aW50PiA+OwoKICAgICAgICAgICAgICBOb3cgd2UgYXJlIGNsb3NlciB0byB0aGUgY2xlYW5pbmcvcmV3cml0aW5nIG9mIHRoZQoJICAgICAgcHl0aG9uIHN0ZC9TVEwgc3VwcG9ydCwgc3VjaCB0aGF0IHdlIHJlY292ZXIgc3VwcG9ydCBmb3IKCSAgICAgIE1TVkMrKyA2LjAsIGFuZCB3ZSBjYW4gYWRkIHN1cHBvcnQgZm9yIG90aGVyIGxhbmd1YWdlcwoJICAgICAgdG9vLgoKCjEyLzAyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9ycyB3aGVuIHdyYXBwaW5nIG1ldGhvZHMgdXNpbmcgYSBtZW1iZXIgZW51bQogICAgICAgICAgICBhbmQgdHlwZXNhZmUvcHJvcGVyIGVudW1zIGVuYWJsZWQuCgoxMi8wMS8yMDA0OiBtbWF0dXMKCSAgICAtIEZpeCB0eXBlbWFwcyB0byB3b3JrIHdpdGggdGVtcGxhdGVzIGFuZCBkZWZhdWx0IHRlbXBsYXRlCgkgICAgICBhcmdzLCBpZQoKCSAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQSwgY2xhc3MgQiA9IGludD4KICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CgkgICAgICAgfTsKCgkgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxpbnQ+ICp7Li4ufQoJICAgICAgICV0eXBlbWFwKG91dCkgRm9vPGludCxpbnQ+ICp7Li4ufQoKCSAgICAgICBGb288aW50PiAqIGZvbyggRm9vPGludD4gKmYxLCBGb288aW50LGludD4gKmYyKTsKCgkgICAgICBub3cgJ2YxJywgJ2YyJyBhbmQgdGhlIHJldHVybiB2YWx1ZSByZXNvbHZlIHRoZSBwcm92aWRlZAoJICAgICAgdHlwZW1hcHMgcHJvcGVybHkuCgoJICAgICAgVGhpcyBpcyBoaWdobHkgbmVlZGVkIGZvciBwcm9wZXIgU1RMIHN1cHBvcnQsIHNlZSBuZXcgCgkgICAgICBzdGRfYmFzaWNfc3RyaW5nLmksIHN0ZF9zc3RyZWFtLmksIGV0Yy4KCgkgICAgLSBBZGRlZCBzdGRfc3N0cmVhbS5pLCBhbmQgZml4IHN0ZF9iYXNpY19zdHJpbmcuaSB0byB1c2UKCSAgICAgIHRoZSBuZXcgdHlwZW1hcHMgKyB0ZW1wbGF0ZSBkZWYuIGFyZyBtZWNoYW5pc20uIEFsc28sCgkgICAgICBhZGRlZCB0aGUgbmVlZGVkIHN0ZF9hbGxvYy5pLiBOb3csIGFsbCB0aGUgY29udGFpbmVycwoJICAgICAgY2FuIGJlIG1vZGlmaWVkIHRvIHN1cHBvcnQgc3RkOjphbGxvY2F0b3IsIGxpa2UgaW46CgkgICAgICAKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgQSA9IHN0ZDo6YWxsb2NhdG9yPFQgPiA+CgkJY2xhc3MgdmVjdG9yIHsKCQlwdWJsaWM6CgkJLi4uLgoJCX07CgkgICAgICAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG9ubHkgY29tcGxldGVkIGJ5IG5vdyBmb3IgYmFzaWNfc3RyaW5nLgoKCSAgICAtIEZpeCBmb3Igc21hcnQgcG9pbnRlcnMgKyBtZW1iZXJzICsgZXh0ZW5zaW9uczoKCgkgICAgICAlZXh0ZW5kIEZvbyB7CgkgICAgICAgIGludCBleHRlbnNpb24oaW50IGksIGludCBqKSB7IHJldHVybiBpOyB9CgkJaW50IGV4dGVuc2lvbigpIHsgcmV0dXJuIDE7IH0KCSAgICAgIH0KCgkgICAgICAlaW5saW5lICV7CgoJICAgICAgY2xhc3MgRm9vIHsKCSAgICAgIHB1YmxpYzoKCQlpbnQgeTsKCQlzdGF0aWMgY29uc3QgaW50IHo7CgkgICAgICB9OwogIAoJICAgICAgY2xhc3MgQmFyIHsKCSAgICAgICAgRm9vICpmOwoJICAgICAgcHVibGljOgoJICAgICAgICBCYXIoRm9vICpmKSA6IGYoZikgeyB9CgkJRm9vICpvcGVyYXRvci0+KCkgewoJCSAgcmV0dXJuIGY7CgkJfQoJICAgICAgfTsKCgkgICAgICBub3cgeW91IGNhbiAKCSAgICAgCgkgICAgICBmID0gRm9vKCkKCSAgICAgIGYueSA9IDMKCSAgICAgIGEgPSBmLnoKCSAgICAgIGYtPmV4dGVuc2lvbigpCiAKCSAgICAgIGIgPSBCYXIoZikKCSAgICAgIGIueSA9IDMKCSAgICAgIGEgPSBiLnoKCSAgICAgIGItPmV4dGVuc2lvbigpCgoJICAgIC0gT3RoZXIgc21hbGwgZXJyb3JzIGZpeGVzLCBtb3N0bHkgcHl0aG9uLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE51bWVyb3VzIGRpcmVjdG9yIGJ1ZyBmaXhlcyBzbyB0aGF0IHRoZSBjb3JyZWN0IGphdmEgdHlwZXMKICAgICAgICAgICAgYW5kIGNhbm9uaWNhbGl6ZWQgdHlwZXMgaW4gdGhlIEpOSSBjb2RlIGFyZSBlbWl0dGVkLiBVc2Ugb2YgdGhlCiAgICAgICAgICAgICRqYXZhY2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGVzIGluIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBub3cKICAgICAgICAgICAgY29uc2lzdGVudCB3aXRoIHRoZSBub24tZGlyZWN0b3IgdHlwZW1hcHMuIFRoZSB0eXBlcyB1c2VkIGZvciAKICAgICAgICAgICAgdHlwZW1hcCBsb29rdXBzIGFyZSBhbHNvIGNvcnJlY3RlZCBpbiBhIGZldyBwbGFjZXMuIElmIHlvdSAKICAgICAgICAgICAgcHJldmlvdXNseSBoYWQgeW91ciBvd24gZGlyZWN0b3IgdHlwZW1hcHMsIGVuc3VyZSB0aGV5IGFyZSB1c2luZyB0aGUKICAgICAgICAgICAgY29ycmVjdCBDKysgdHlwZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIERJUkVDVE9SUyAqKioKCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIGNvbnN0IGVudW0gU1dJR1RZUEUgJiB0eXBlbWFwcyBhZGRlZC4gVGhlc2Ugd3JhcCBjb25zdCBlbnVtIHJlZmVyZW5jZXMKICAgICAgICAgICAgYXMgaWYgdGhleSB3ZXJlIHBhc3NlZCBieSB2YWx1ZS4gQ29uc3QgZW51bSByZWZlcmVuY2VzIHRodXMgd29yayB0aGUKICAgICAgICAgICAgc2FtZSBhcyBjb25zdCByZWZlcmVuY2UgcHJpbWl0aXZlIHR5cGVzIHN1Y2ggYXMgY29uc3QgZG91YmxlICYsIAogICAgICAgICAgICBjb25zdCBpbnQgJiBldGMuIFR5cGVtYXBzIGFkZGVkIGZvciBKYXZhLCBDIywgUnVieSwgVGNsLCBQZXJsIGFuZCBQaWtlLgoKMTEvMjUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBOZXcgc3BlY2lhbCB2YXJpYWJsZTogJCpqYXZhY2xhc3NuYW1lLCBzaW1pbGFyIHRvICRqYXZhY2xhc3NuYW1lCiAgICAgICAgICAgIGFuZCAkJmphdmFjbGFzc25hbWUuIFRoZSBuZXcgb25lIHJlbW92ZXMgYSBwb2ludGVyIGZyb20gdGhlIEMgdHlwZSBiZWZvcmUKICAgICAgICAgICAgb2J0YWluaW5nIHRoZSBKYXZhIGNsYXNzIG5hbWUuIE9uZSBvciBtb3JlIG9mICRqYXZhY2xhc3NuYW1lLAogICAgICAgICAgICAkJmphdmFjbGFzc25hbWUgb3IgJCpqYXZhY2xhc3NuYW1lIG1heSBub3cgYXBwZWFyIGluIGEgdHlwZW1hcC4gTGlrZXdpc2UgZm9yCiAgICAgICAgICAgIEMjIHVzaW5nIGNzY2xhc3NuYW1lIGluc3RlYWQgb2YgamF2YWNsYXNzbmFtZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBsYXN0IHZlc3RpZ2VzIG9mIGVudW1zIGJlaW5nIGhhbmRsZWQgYXMgaW50ZWdlcnMgcmVtb3ZlZCBmcm9tIHRoZQogICAgICAgICAgICBpbnRlcm5hbHMuIFRoZSB3cmFwcGVyIG1ldGhvZHMgdXNlIHRoZSBlbnVtIHR5cGUgcmF0aGVyIHRoYW4gYW4gaW50CiAgICAgICAgICAgIG5vdy4gVGhlIG5ldCByZXN1bHQgaXMgYWRkZWQgdHlwZSBzYWZldHkgZm9yIGVudW1zIHdoZW4gaGFuZGxlZCBhcwogICAgICAgICAgICBwb2ludGVycywgcmVmZXJlbmNlcyBldGMuIFByZXZpb3VzbHkgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGEgbWV0aG9kCiAgICAgICAgICAgIHRha2luZyBhIHBvaW50ZXIgdG8gYW4gZW51bSwgYSBwb2ludGVyIHRvIGFuIGludCBvciBhIHBvaW50ZXIgdG8gYW4KICAgICAgICAgICAgZW51bSBvZiBzb21lIG90aGVyIHR5cGUgY291bGQgaW5hZHZlcnRhbnRseSBiZSBwYXNzZWQgdG8gdGhlIG1ldGhvZC4KICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQgYXMgdGhlIGRlc2NyaXB0b3IgZm9yIGFuIGVudW0gaXMgbm8gbG9uZ2VyIGJhc2VkIG9uCiAgICAgICAgICAgIGFuIGludCwgYnV0IHRoZSBlbnVtIHR5cGUgaW5zdGVhZC4gQW5vbnltb3VzIGVudW1zIGFyZSBzdGlsbCBoYW5kbGVkCiAgICAgICAgICAgIGFzIGludGVnZXJzLgoKICAgICAgICAgICAgVGhlIGNvbnNlcXVlbmNlIGZvciBzY3JpcHRpbmcgbGFuZ3VhZ2UgdXNlcnMgaW4gY29ycmVjdCB1c2FnZSBvZiBlbnVtcwogICAgICAgICAgICBzaG91bGQgbm90IGJlIG5vdGljZWFibGUuIFRoZXJlIGlzIG5vIGNoYW5nZSBmb3IgYW55IG9mIHRoZSBsYW5ndWFnZXMKICAgICAgICAgICAgd2hlcmUgZW51bXMgYXJlIHBhc3NlZCBieSB2YWx1ZSAtIG1vc3Qgb2YgdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2lsbAogICAgICAgICAgICBzdGlsbCBhY2NlcHQgYW4gaW50ZWdlciBmb3IgYW4gZW51bSB2YWx1ZSBhbmQgdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgIGxhbmd1YWdlcyBzdGlsbCB1c2UgZWl0aGVyIHR5cGVzYWZlIGVudW1zLCBpbnRlZ2VycyBvciBwcm9wZXIgZW51bXMKICAgICAgICAgICAgZGVwZW5kaW5nIG9uIHdoYXQgdGhlIHVzZXIgY29uZmlndXJlcy4gRm9yIEphdmEgYW5kIEMjIHVzZXJzIGEgY2hhbmdlCiAgICAgICAgICAgIGluIHRoZSB0eXBld3JhcHBlciBjbGFzcyBuYW1lIGhhcyBvY2N1cnJlZCAoZm9yIGVudW0gcG9pbnRlcnMsCiAgICAgICAgICAgIHJlZmVyZW5jZXMgZXRjKS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGVudW0gTnVtYmVycyB7IG9uZT0xLCB0d28gfTsKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMqIG51bWJlcigpOwoKICAgICAgICAgICAgSW4gSmF2YSBhbmQgQyMgdGhpcyBtdXN0IG5vdyBiZSBjb2RlZCBhcwoKICAgICAgICAgICAgICBTV0lHVFlQRV9wX051bWJlcnMgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICByYXRoZXIgdGhhbgoKICAgICAgICAgICAgICBTV0lHVFlQRV9wX2ludCBuID0gbW9kdWxlbmFtZS5udW1iZXIoKTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjEvMjAwNDogd3NmdWx0b24vbW1hdHVzCiAgICAgICAgICAgIEFkZGVkIG1pc3NpbmcgZGVwcmVjYXRlZCB3YXJuaW5nIGZvciAlbmFtZSBhbmQgcmVtb3ZlIHJlbWFpbmluZyAlbmFtZQogICAgICAgICAgICB1c2FnZSBpbiB0aGUgU1dJRyBsaWJyYXJpZXMuCgoxMS8yMS8wNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgdGhlIFB5U3dpZ09iamVjdCB0byBiZSB1c2VkIGZvciBjYXJyeWluZwoJICAgICAgdGhlIGluc3RhbmNlIEMvQysrIHBvaW50ZXJzLiBUaGlzIGlzIHVzZWQgaW5zdGVhZCBvZgoJICAgICAgc3RyaW5nIGFuZCBQeUNPYmplY3RzLgoKCSAgICAgIFRoZSBuZXcgUHlTd2lnT2JqZWN0IGlzIGV2ZW4gc2FmZXIgdGhhbiBQeUNPYmplY3QsIGFuZAoJICAgICAgbW9yZSBmcmllbmRseSB0aGFuIHBsYWluIHN0cmluZ3M6CgoJICAgICAgbm93IHlvdSBjYW4gZG8KCgkgICAgICAgIHByaW50IGEudGhpcwoJCTxTd2lnIE9iamVjdCBhdCBfMDA2OTE2MDhfcF9BPgoKCQlwcmludCBzdHIoYS50aGlzKQoJCV8wMDY5MTYwOF9wX0EKCgkJcHJpbnQgbG9uZyhhLnRoaXMpCgkJMTM1Njg2NDAwCgoJCXByaW50ICIlcyAweCV4IiAlIChhLnRoaXMsIGEudGhpcykKCQlfMDA2OTE2MDhfcF9BIDB4ODE2NjkwMAoKCSAgICAgIHRoZSBsYXN0IG9uZSBpcyB2ZXJ5IHVzZWZ1bCB3aGVuIGRlYnVnZ2luZyB0aGUgQy9DKysKCSAgICAgIHNpZGUsIHNpbmNlIGlzIHRoZSBwb2ludGVyIHZhbHVlIHlvdSB3aWxsIHVzdWFsbHkgZ2V0CgkgICAgICBmcm9tIHRoZSBkZWJ1Z2dlci4KCgkgICAgICBBbHNvLCBpZiB5b3UgaGF2ZSBzb21lIG9sZCBjb2RlIHRoYXQgdXNlcyB0aGUgc3RyaW5nCgkgICAgICByZXByZXNlbnRhdGlvbiAiXzAwNjkxNjA4X3BfQSIsIHlvdSBjYW4gdXNlIGl0IG5vdyBhZ2FpbgoJICAgICAgdXNpbmcgJ3N0cihwdHIpJywgb3IgYnkgY2FsbGluZyAnc3RyID0gUHlPYmplY3RfU3RyKG9iaiknCgkgICAgICBpbiB0aGUgQy9DKysgc2lkZS4KIAoJICAgICAgVGhpcyBjaGFuZ2UgaXMgbWFpbmx5IGZvciBub3N0YWxnaWMgc3dpZyB1c2VycyB0aGF0IG1pc3MKCSAgICAgIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24sIGJ1dCBhbHNvIGFsbG93cyB0byBzYXkgYWdhaW4KCgkgICAgICAgIGlmIGEudGhpcyA9PSBiLnRoaXM6CgkJICByZXR1cm4gImEgaXMgYiIKCgkgICAgICBhbmQgd2VsbCwgc2luY2UgdGhlIGNoYW5nZSB3ZXJlIHJlYWxseSBzaW1wbGUsIG1heWJlIGluCgkgICAgICB0aGUgZnV0dXJlIHdlIHdpbGwgYmUgYWJsZSB0byBkbwogICAKCQluZXh0ID0gYS50aGlzICsgMQoKCSAgICAgIG9yIGFkZCBuYXRpdmUgcHl0aG9uIGl0ZXJhdGlvbiBvdmVyIG5hdGl2ZSBDL0MrKyBhcnJheXMsCgkgICAgICBpZSwgbm8gbmVlZCB0byBjcmVhdGUvY29weSBuZXcgdHVwbGVzIHdoZW4gcmV0dXJuaW5nIGFuZAoJICAgICAgYXJyYXkgb3IgdmVjdG9yLgoKCSAgICAgIEFsc28sIGEgUHlTd2lnUGFja2VkIG9iamVjdCB3YXMgYWRkaW5nIHRvIGNhcnJ5IGEgbWVtYmVyCgkgICAgICBtZXRob2QgcG9pbnRlciwgYnV0IHRoaXMgaXMgcHJvYmFibHkgYSB0ZW1wb3JhbCBzb2x1dGlvbgoJICAgICAgdW50aWwgYSBtb3JlIGdlbmVyYWwgb2JqZWN0IGZvciBtZXRob2RzIGlzIGFkZGVkLgoKCSAgICAgIEJlIGF3YXJlIHRoYXQgdG8gc2ltcGxpZnkgbWFpbnRhaW5pbmcgYW5kIGNvbXBhdGliaWxpdHkKCSAgICAgIHdpdGggb3RoZXIgdG9vbHMsIHRoZSBvbGQgc3RyaW5nIGFuZCBQeUNPYmplY3RzCgkgICAgICByZXByZXNlbnRhdGlvbiBjb3VsZCBkaXNhcHBlYXIgdmVyeSBzb29uLCBhbmQgdGhlCgkgICAgICBTV0lHX0NPQkpFQ1RTX1RZUEVTIG9yIFNXSUdfTk9fT0JKRUNUX1RZUEVTIG1hY3JvcyB3aWxsCgkgICAgICBoYXZlIG5vIGVmZmVjdCBhdCBjb21waWxhdGlvbiB0aW1lLiBTdGlsbCwgdGhlIHRocmVlCgkgICAgICBtZWNoYW5pc21zIGFyZSBwcmVzZW50IGluIHRoZSBjb2RlIGp1c3QgZm9yIHRlc3RpbmcsCgkgICAgICBkZWJ1Z2dpbmcgYW5kIGNvbXBhcmlzb24gcHVycG9zZXMuCgkgICAgICAKMTEvMjEvMDQ6IG1tYXR1cwoKCSAgICAtIFtQeXRob25dIEFkZGluZyBiYWNrIHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBzd2lnIHJ1bnRpbWUgY29kZQoJICAgICAgaW5zaWRlIHRoZSB1c2VyIGNvZGUuIFdlIGp1c3QgYWxsb3cgdGhlIHVzZXIgdG8gaW5jbHVkZQoJICAgICAgdGhlIG1pbmltYWwgY29kZSBuZWVkZWQgdG8gaW1wbGVtZW50IHRoZSBydW50aW1lCgkgICAgICBtZWNoYW5pc20gc3RhdGljYWxseSwganVzdCBhcyBpbiBkb25lIGluIHRoZSBzd2lnCgkgICAgICBtb2R1bGVzLgoJICAgICAgCgkgICAgICBUbyB1c2UgdGhlIHN3aWcgcnVudGltZSBjb2RlLCBmb3IgZXhhbXBsZSB3aXRoIHB5dGhvbiwKCSAgICAgIHRoZSB1c2VyIG5lZWRzIGluY2x1ZGUgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAjaW5jbHVkZSA8UHl0aG9uLmg+ICAgICAgICAgLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8c3dpZ3J1bi5zd2c+CiAgICAgICAgICAgICAgICNpbmNsdWRlIDxweXRob24vcHlydW4uc3dnPiAvLyBvciB1c2luZyB5b3VyIGZhdm9yaXRlIGxhbmd1YWdlCiAgICAgICAgICAgICAgICNpbmNsdWRlIDxydW50aW1lLnN3Zz4KCgkgICAgICB0aGUgZmlsZXMgc3dpZ3J1bi5zd2csIHB5cnVuLnN3ZyBhbmQgcnVudGltZS5zd2cgY2FuIAoJICAgICAgYmUgY2hlY2tlZCBvdXQgYnkgdXNpbmcgc3dpZyAtY28sIG9yIHRoZXkgY2FuIHNpbXBseSAKCSAgICAgIGJlIGZvdW5kIGJ5IGFkZGluZyB0aGUgc3dpZyBsaWIgZGlyZWN0b3J5IHRvIHRoZQoJICAgICAgY29tcGlsZXIgaW5jbHVkZSBkaXJlY3RvcnkgbGlzdCwgZm9yIGV4YW1wbGUKCgkgICAgICAgU1dJR0xJQj1gc3dpZyAtc3dpZ2xpYmAKCSAgICAgICBjKysgLUkke1NXSUdMSUJ9IC4uCgoJICAgICAgb2YgYmV0dGVyLCB1c2luZyB0aGUgQ1BQRkxBR1MsIGJ1dCB0aGF0IGRlcGVuZHMgb24geW91cgoJICAgICAgZW52aXJvbm1lbnQuCgkgICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBjYW4gYmUgcG9ydGVkIHRvIHRoZSBvdGhlciBsYW5ndWFnZXMgdG9vLAoJICAgICAgeW91IGp1c3QgbmVlZCB0byBpc29sYXRlIHRoZSBuZWVkZWQgcnVudGltZSBjb2RlIGluCgkgICAgICBhIHNpbmdsZSBmaWxlIGxpa2UgJ3B5cnVuLnN3ZycsIGFuZCBwcm92aWRlIHRoZSAKCSAgICAgIFNXSUdfUnVudGltZV9HZXRUeXBlTGlzdCgpIG1ldGhvZC4gTG9vayBhdCB0aGUKCSAgICAgIExpYi9weXRob24vcHlydW4uc3dnIGZpbGUgYW5kIHRoZSBFeGFtcGxlcy9weXRob24vc3dpZ3J1bgoJICAgICAgZXhhbXBsZS4KCjExLzE1LzA0OiBtbWF0dXMKCSAgICAtIEZpeCBtaXhlZF90eXBlcy5pICsgZ2NjLTMuNCwgaWUsIGFycmF5cyArIHJlZmVyZW5jZXMgKwoJICAgICAgdHlwZWRlZnMKCgkgICAgLSBGaXggbXVsdGlkaW0gYXJyYXlzICsgdHlwZWRlZnMsaWUKCgkgICAgICAgdHlwZWRlZiBjaGFyIGNoYXJhY3RlclsxXTsKCSAgICAgICB0eXBlZGVmIGNoYXJhY3RlciB3b3JkWzY0XTsKCgkgICAgLSBQcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIGJhc2VzIGluIHRoZSBzYW1lIHdheSBiZWZvcmUKCSAgICAgIHdlIHByb2Nlc3MgcHJvdGVjdGVkL3ByaXZhdGUgbWVtYmVycywgaWUsIHdlIGNoZWNrCgkgICAgICBmb3IgY29uc3RydWN0b3JzLCBvcGVyYXRvciBuZXcsIHZpcnR1YWwgbWVtYmVycywgZXRjLgogICAKCSAgICAtIEZpeCBSdWJ5L0phdmEgdG8gd29yayAob3IgaWdub3JlKSBtdWx0aS1pbmhlcml0YW5jZSArCiAgICAgICAgICAgICAgZGlyZWN0b3JzLiBBbGxvdyBvdGhlciBsYW5ndWFnZXMgdG8gZGVmaW5lIGlmIGl0IGlzCiAgICAgICAgICAgICAgc3VwcG9ydGVkIG9yIG5vdC4KCSAgICAKCSAgICAtIE5vdyB5b3UgY2FuIHJ1bgoKICAgICAgICAgICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1kaXJlY3RvcnMgLWRpcnByb3QiIAogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1ydWJ5LXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcHl0aG9uLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stamF2YS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLW9jYW1sLXRlc3Qtc3VpdGUKCgkgICAgICBhbmQgeW91IHdpbGwgZ2V0IG9ubHkgJ3JlYWwnIGVycm9ycy4gcnVieSBhbmQgcHl0aG9uCgkgICAgICBjb21waWxlIHdpdGggbm8gZXJyb3JzLCBqYXZhIHNob3dzIHNvbWUgcHJvYmxlbXMuCQoKVmVyc2lvbiAxLjMuMjMgKE5vdmVtYmVyIDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjOTgyNzUzIGZyb20gRmFicmljZSBTYWx2YWlyZTogQWRkcyBkZXBlbmRlbmNpZXMgZ2VuZXJhdGlvbiBmb3IKICAgICAgICAgICAgY29uc3RydWN0aW5nIG1ha2VmaWxlcy4gTmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIC1NRiAtTUQgLU1NRCB0byB3b3JrCiAgICAgICAgICAgIHdpdGggdGhlIGN1cnJlbnQgb3B0aW9ucyAtTSBhbmQgLU1NLiBUaGVzZSBvcHRpb25zIGFyZSBuYW1lZCB0aGUgc2FtZQogICAgICAgICAgICBhbmQgd29yayB0aGUgc2FtZSBhcyBpbiBnY2MuCgoxMS8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlaWdub3JlLyVyZW5hbWUgY2hhbmdlcyBmb3IgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHRvIG1pcnJvcgogICAgICAgICAgICAlZmVhdHVyZSBiZWhhdmlvdXIuIFNlZSBwcmV2aW91cyBlbnRyeS4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgZmluZSB0dW5pbmcgd2hlbiB3cmFwcGluZyBtZXRob2RzIHdpdGgKICAgICAgICAgICAgZGVmYXVsdCBhcmd1bWVudHMuIEFueSAlZmVhdHVyZSB0YXJnZXRpbmcgYSBtZXRob2Qgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMgaWYgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUuIElmIHRoZSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUKICAgICAgICAgICAgbm90IHNwZWNpZmllZCBpbiB0aGUgZmVhdHVyZSwgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG1hdGNoIHRoYXQgZXhhY3QKICAgICAgICAgICAgd3JhcHBlciBtZXRob2Qgb25seSBhbmQgbm90IHRoZSBleHRyYSBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBTV0lHIGdlbmVyYXRlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBoZWxsbyhpbnQgaT0wLCBkb3VibGUgZD0wLjApOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgd2lsbCBhcHBseSB0aGUgZmVhdHVyZSB0byBhbGwgdGhyZWUgd3JhcHBlciBtZXRob2RzLCB0aGF0IGlzOgoKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKCiAgICAgICAgICAgdGhlbiB0aGUgZmVhdHVyZSB3aWxsIG9ubHkgYXBwbHkgdG8gdGhpcyB3cmFwcGVyIG1ldGhvZDoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwoKICAgICAgICAgICBhbmQgbm90IHRoZXNlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSk7CiAgICAgICAgICAgICAgdm9pZCBoZWxsbygpOwoKICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGludHJvZHVjZWQgdG8gbWFrZSAlZmVhdHVyZSBtb3JlIHBvd2VyZnVsIHRvIGVhc2UgdGhlIG1pZ3JhdGlvbgogICAgICAgICAgIHRvIG5ldyBkZWZhdWx0IGFyZ3VtZW50cyB3cmFwcGluZyBhcHByb2FjaC4KCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgSWYgeW91IHByZXZpb3VzbHkgaGFkIGEgJWZlYXR1cmUgYW5kIGRpZG4ndCBzcGVjaWZ5IHRoZSBkZWZhdWx0IGFyZ3VtZW50cywKICAgICAgICAgICB5b3Ugd2lsbCBoYXZlIHRvIGFkZCB0aGVtIGluIG5vdyBvciB5b3UgY2FuIG9idGFpbiB0aGUgb3JpZ2luYWwgYmVoYXZpb3VyCiAgICAgICAgICAgYnkgdXNpbmcgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpLgoKMTEvMDQvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUeXBlbWFwcyBmb3Igc3RkOjp2ZWN0b3IgYWRkZWQgaW50byBzdGRfdmVjdG9yLmkuIFRoZSBwcm94eSBjbGFzc2VzCiAgICAgICAgICAgIGdlbmVyYXRlZCBhcmUgbW9kZWxsZWQgb24gdGhlIC5ORVQgQXJyYXlMaXN0IGNsYXNzLiBUaGlzIGlzbid0IHF1aXRlCiAgICAgICAgICAgIHJlYWR5IGZvciBnZW5lcmFsIGNvbnN1bXB0aW9uIHlldCwgYnV0IHdpbGwgd29yayB3aXRoIHZlY3RvcnMgb2YgcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIGFuZCBzb21lIGNsYXNzZXMuCgoxMC8zLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbR1VJTEVdIFRoZSAtc2NtIGludGVyZmFjZSBpcyBub3cgdGhlIGRlZmF1bHQuICBUaGUgb2xkIEdIIGludGVyZmFjZSBjYW4KCSAgICBzdGlsbCBiZSBlbmFibGVkIGJ5IHBhc3NpbmcgLWdoIHRvIFNXSUcuCgoxMC8yLzIwMDQ6IG1tYXR1cwoKCSAgICAtIE1vcmUgZml4ZXMgZm9yIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucy4KCSAgICAgIEFzIGFuIGV4dHJhIGJvbnVzLCB3ZSBnZXQgJXRlbXBsYXRlIHN1cHBvcnQgZm9yIHN0YXRpYy9tZW1iZXJzIGNsYXNzCgkgICAgICBtZXRob2RzLCBpZSwgbm93IHlvdSBjYW4gc2F5OgoKCSAgICAgICAgbmFtZXNwYWNlIHNwYWNlIHsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQQkJCSAgICAKCSAgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JICAgIAoJICAgICAgICAgICBzdGF0aWMgdm9pZCBmb29UKFkgeSkgeyB9CgkgICAgICAgICB9OwkKCQl9CQkJICAgIAoJICAgICAgCSAgICAgIAkJCSAgICAKCSAgICAgICAgc3RydWN0IEIJCQkgICAgCgkgICAgICAgIHsJCQkJICAgIAoJICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBZPgkJICAgIAoJICAgICAgICAgIHZvaWQgYmFyVChZIHkpIHt9IAoJICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGludD47CgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8Y2hhcj47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxkb3VibGU+OwoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8aW50PjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGNoYXI+OwoKCSAgICAgIGFuZCBjYWxsCgoJICAgICAgICBBLmZvbygxKQoJCWIgPSBCKCkKCQliLmJhcigxKQoJICAgICAgCgkgICAgICBub3RlIHRoZSBtZXRob2RzIGFyZSBlbWl0dGVkIGluc2lkZSB0aGUgY2xhc3NlcywKCSAgICAgIGFuZCBoZW5jZSwgdGhlICV0ZW1wbGF0ZSBuYW1lIHJlZmVycyB0byB0aGUgJ21lbWJlcicKCSAgICAgIG1ldGhvZCBuYW1lLCBub3QgYSBnbG9iYWwgbmFtZXNwYWNlIG5hbWUuCgoxMC8zMS8yMDA0OiBtbWF0dXMKCSAgICAtIFNvbHZlIG5hbWVzcGFjZSArIGNsYXNzIGRlY2xhcmF0aW9ucywgYXMgaW4KCgkgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgc3RydWN0IEJhcjsKCQkgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgc3RydWN0IGZvbzo6QmFyIDogRm9vIHsKICAgICAgICAgICAgICAgfTsKCgkgICAgICAgc2VlIG5hbWVzcGFjZV9jbGFzcy5pIGZvciBtb3JlIGV4YW1wbGVzLgoKICAgICAgICAgICAgLSBGaXggJXRlbXBsYXRlIGRpcmVjdGl2ZSB0byBwcm9wZXJseSB1c2UgbmFtZXNwYWNlcywKICAgICAgICAgICAgICBpbmNsdWRpbmcgdGhlIGNhc2U6CgoJCSAgIG5hbWVzcGFjZSBvbmUKCQkgICB7CgkJICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgoJCSAgICAgICBzdHJ1Y3QgUHRyIHt9OwogICAgICAgICAgICAgICAgICAgfQoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewkJICAKCQkgICAgICAgc3RydWN0IE9iajEge307CgkJICAgICAgIHR5cGVkZWYgUHRyPE9iajE+IE9iajFfcHRyOwogIAkJICAgICAgICV0ZW1wbGF0ZShPYmoxX3B0cikgUHRyPE9iajE+OyAKCQkgICB9CQkJCSAgCgkJICAgCQkJCSAgCgkJICAgbmFtZXNwYWNlIHR3byAgCgkJICAgewoJCSAgICAgICBzdHJ1Y3QgT2JqMiB7fTsJCgkJICAgICAgIHR5cGVkZWYgb25lOjpQdHI8T2JqMj4gT2JqMl9wdHI7CgkJICAgICAgICV0ZW1wbGF0ZShPYmoyX3B0cikgb25lOjpQdHI8T2JqMj47CgkJICAgfQoKCSAgICAgIHRoaXMgaXMgZG9uZSBieSB1c2luZyB0aGUgbmFtZXNwYWNlIG5hbWUgJ29uZScgdG8gY3JlYXRlCiAgICAgICAgICAgICAgYSBuYW1lc3BhY2Ugbm9kZSB0byBlbWl0IHRoZSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLAogICAgICAgICAgICAgIGp1c3QgYXMgYmVmb3JlLCBidXQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHJlc29sdmVkCiAgICAgICAgICAgICAgYW5kIHF1YWxpZmllZCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UgKCdvbmUnIG9yICd0d28nKS4KICAgICAgICAgICAgICBUaGlzIGlzIHNhbWUgd2F5IHRoYXQgdHlwZWRlZiB3b3Jrcy4gCgoJICAgICAgVGhpcyByZXNvbHZlIHRoZSBzbWFydF9wb2ludGVyX25hbWVzcGFjZTIuaSBjYXNlLCBhbmQgYXQKICAgICAgICAgICAgICB0aGUgc2FtZSB0aW1lLCBzZXZlcmFsIG90aGVyIG9uZXMgd2hlcmUgYmVmb3JlIHN3aWcgd2FzCiAgICAgICAgICAgICAgZ2VuZXJhdGluZyB0aGUKCgkgICAgICAgICJDYW4ndCBpbnN0YW50aWF0ZSB0ZW1wbGF0ZSAneHgnIGluc2lkZSBuYW1lc3BhY2UgJ3l5JyIKCSAgICAgIAoJICAgICAgZXJyb3IgbWVzc2FnZS4gSW4gZmFjdCwgdGhhdCBlcnJvciBkb2Vzbid0IGV4aXN0CgkgICAgICBhbnltb3JlLiBZb3UgY2FuIG9ubHkgZ2V0IGFuIGVycm9yIGlmIHlvdSB1c2UgYSBiYWQKCSAgICAgIG5hbWVzcGFjZSBuYW1lIG9yIHNvLgoKMTAvMzAvMjAwNDogbW1hdHVzCgkgICAgLSBbcnVieV0gRGlyZWN0b3JzIGZpeGVzOgoJICAgICAgLSBlbnVtcyBhbmQgc3RkOjpzdHJpbmdzIGFyZSB3b3JraW5nIG5vdyAoc2V2ZXJhbAoJICAgICAgICByZXBvcnRzIGluIGJ1ZyB0cmFjayBzeXN0ZW0pCgkgICAgICAtIGFkZGVkIHBhdGNoIDEwMjU4NjEgZm9yIGRpcmVjdG9yICsgZXhjZXB0aW9ucwoJCQogICAgICAgICAgICAgICoqKiBBdHRlbnRpb24gKioqOiBydWJ5IHdpdGggZGlyZWN0b3JzICsgcHJvdGVjdGVkCiAgICAgICAgICAgICAgbWVtYmVycyB3b3JrIHdpdGggdmVyc2lvbiAxLjcrLiBPbGRlciB2ZXJzaW9ucyBzZWVtcyB0bwogICAgICAgICAgICAgIGhhdmUgYSBicm9rZW4gc2lnbmF0dXJlIGZvcidyYl9wcm90ZWN0Jy4KCQkKCSAgICAgIElmIHlvdSBuZWVkIHRvIHVzZSBhbiBvbGQgdmVyc2lvbiwgbG9vayBhdAoKCSAgICAgIGh0dHA6Ly9leGNydWJ5LnNvdXJjZWZvcmdlLm5ldC9kb2NzL2h0bWwvcnVieV9faGFja3NfOGhwcC1zb3VyY2UuaHRtbAogIAkgICAgICBmb3Igd29ya2Fyb3VuZHMuCgkgICAgICAKICAgICAgICAgICAgLSBbcnVieV0gRml4IG1lbW9yeSBhbGxvY2F0aW9uIHByb2JsZW0gaW4gdHlwZW1hcCAoYnVnIDEwMzcyNTkpCgoJICAgIC0gW3RjbF0gRml4IChlbnVtc3xjb25zdGFudHMpICsgbmFtZXNwYWNlIG9wdGlvbiAKCSAgICAgICAgICAgIChyZXBvcnRlZCBieSBqYXNvbi5tLnN1cnByaXNlQGludGVsLmNvbSkuCgogICAgICAgICAgICAtIFtwZXJsXSBBZGQgcGF0Y2ggOTYyMTY4IGZvciBtdWx0aXBsZSBpbmhlcmV0YW5jZQoJICAgIAoJICAgIC0gRml4ICdkZWZpbmVkJyBhcyB2YXJpYWJsZSBuYW1lLgoKMTAvMjkvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZ2xvYmFsIHNjb3BlIG9wZXJhdG9yIHVzZWQgZm9yIGZyaWVuZCBtZXRob2RzOgoKICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgIGZyaWVuZCB2b2lkIDo6Z2xvYmFsc2NvcGUoKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgoxMC8yOC8yMDA0Om1tYXR1cwoJICAgIC0gQWRkZWQgbW9kdWxlIGFuZCBzd2lnIG9wdGlvbiAidGVtcGxhdGVyZWR1Y2UiIHRvIGZvcmNlIHN3aWcKCSAgICAgIHRvIHJlZHVjZSBhbnkgdHlwZSBuZWVkZWQgd2l0aCB0ZW1wbGF0ZXMsIGllLCBpbiB0aGVzZSBjYXNlcwoKICAgICAgICAgICAgICAgICVtb2R1bGUoInRlbXBsYXRlcmVkdWNlIikgdGVzdAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQSB7IH07CgogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50OwoJICAgICAgICAldGVtcGxhdGUoQV9JbnQpIEE8SW50PiAgPT0+ICAldGVtcGxhdGUoQV9JbnQpIEE8aW50PgoKICAgICAgICAgICAgICAgIHR5cGVkZWYgQiogQnA7CgkgICAgICAgICV0ZW1wbGF0ZShBX0JwKSBBPEJwPiAgPT0+ICAldGVtcGxhdGUoQV9CcCkgQTxCKj4KCiAgICAgICAgICAgICAgc3dpZyByZWR1Y2VzIHRoZSB0eXBlcyBJbnQgYW5kIEJwIHRvIHRoZWlyIHByaW1pdGl2ZXMKICAgICAgICAgICAgICBpbnQgYW5kIEIqLiBUaGlzIGlzIGNsb3NlciB0byB0aGUgdXN1YWwgY29tcGlsZXIKICAgICAgICAgICAgICByZXNvbHV0aW9uIG1lY2hhbmlzbSwgYW5kIGl0IGlzIHJlYWxseSBuZWVkZWQgc29tZXRpbWVzCiAgICAgICAgICAgICAgd2hlbiB5b3UgbWl4IHRlbXBsYXRlcyArIHR5cGVkZWZzICsgc3BlY2lhbGl6YXRpb25zLgoKCSAgICAgIERvbid0IHVzZSBpdCBpZiB5b3UgZG9uJ3QgaGF2ZSBhbnkgcHJvYmxlbSBhbHJlYWR5LAoJICAgICAgc2luY2UgdGhlIHR5cGUgcmVkdWN0aW9uIGNhbiBpbnRlcmZlcmUgd2l0aCBzb21lCgkgICAgICB1c2VyIHR5cGVtYXBzLCBzcGVjaWFsbHkgaWYgeW91IGRlZmluZWQgc29tZXRoaW5nIGxpa2UKCgkJICAgdHlwZWRlZiBpbnQgSW50OwoJCSAgICV0eXBlbWFwKGluKSBJbnQgLi4uOwoKICAgICAgICAgICAgICBpbiB0aGlzIGNhc2UsIHdoZW4geW91IHVzZSB0aGUgInRlbXBsYXRlcmVkdWNlIiBvcHRpb24sCgkgICAgICBzd2lnIHdpbGwgaWdub3JlIHRoZSB1c2VyIHR5cGVtYXAsIHNpbmNlIHRoZSAidHlwZWRlZiBpbnQgSW50IgoJICAgICAgd2lsbCB0YWtlIHByZWNlZGVuY2UsIGFuZCB0aGUgdXN1YWwgImludCIgdHlwZW1hcCB3aWxsIGJlCgkgICAgICBhcHBsaWVkLiAKCgkgICAgICBOb3RlIHRoYXQgdGhlIHByZXZpb3VzIGNhc2UgaXMgbm90IGNvbW1vbiwgYW5kIHNob3VsZCBiZQoJICAgICAgYXZvaWRlZCwgaWUsIGlzIG5vdCByZWNvbW1lbmRlZCB0byB1c2UgYSB0eXBlZGVmIGFuZCBhCgkgICAgICB0eXBlbWFwIGF0IHRoZSBzYW1lIHRpbWUsIHNwZWNpYWxseSBpZiB5b3UgYXJlIGdvaW5nIHRvCgkgICAgICB1c2UgdGVtcGxhdGVzICsgc3BlY2lhbGl6YXRpb25zLgoKCSAgICAtIERpcmVjdG9yczoKCgkgICAgICAgIHZpcnR1YWwgZGVzdHJ1Y3RvciBpcyBhbHdheXMgZW1pdHRlZCBub3csIHRoaXMgZG9lc24ndAoJICAgICAgICBjYXVzZSBhbnkgaGFybSwgYW5kIGNvdWxkIHNvbHZlIHNvbWUgbmFzdHkgYW5kCgkgICAgICAgIG15c3RlcmlvdXMgZXJyb3JzLCBsaWtlIHRoZSBvbmUgbWVudGlvbmVkIGJ5IFNjb3R0LgoKCQlhbHNvIHRoZSBkZXN0cnVjdG9yIGlzIG5vdCBpbi1saW5lZCwgc28sIHRoYXQgY2FuIHNvbHZlCgkJc29tZSBvdGhlciBteXN0ZXJpb3VzIGVycm9ycyB3aGVuIG1peGluZyBkaXJlY3RvcnMgKwoJCWltcG9ydHMgKyBlbWJlZGRlZCBhcHBsaWNhdGlvbnMgKyBzb21lIHNwZWNpZmljIGNvbXBpbGVycy4KCQkKMTAvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSB0eXBlbWFwcy5pIGxpYnJhcnkgZmlsZSB3aXRoIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGFkZGVkLgoKMTAvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIHN0ZDo6d3N0cmluZyB0eXBlbWFwIGZpeGVzIGluIHN0ZF9zdHJpbmcuaSBmcm9tIFJ1c3NlbGwgS2VpdGgtTWFnZWUuCgoxMC8yNS8yMDA0OiBtbWF0dXMgCgoJICAgIC0gVXNpbmcgKyBuYW1lc3BhY2UgaXMgd29ya2luZyBub3cgKHVzaW5nX25hbWVzcGFjZS5pKS4KCgkgICAgLSBEZXJpdmVkICsgbmVzdGVkIGNsYXNzZXMgaXMgd29ya2luZyBub3cKCSAgICAgIChkZXJpdmVyX25lc3RlZC5pKSwgYnV0IG9mIGNvdXJzZSwgd2UgYXJlIHN0aWxsIHdhaXRpbmcKCSAgICAgIGZvciB0aGUgbmVzdGVkIGNsYXNzIHN1cHBvcnQuCgkgICAgCgkgICAgLSBEaXJlY3RvcnM6CgkgICAgICAtIHVubmFtZWQgcGFyYW1ldGVycyBzdXBwb3J0LAoKCSAgICAgIC0gcHJvdGVjdGVkIGNvbnN0cnVjdG9yIHN1cHBvcnQgKGF1dG9tYXRpYyBhbmQgd2l0aAogICAgICAgICAgICAgICAgZGlycHJvdCBtb2RlKSwKCgkgICAgICAtIGRldGVjdGlvbiBvZiByZWFsbHkgbmVlZGVkIHByb3RlY3RlZCBkZWNsYXJhdGlvbnMKICAgICAgICAgICAgICAgIChtZW1iZXJzIGFuZCBjb25zdHJ1Y3RvcnMpIG5vdyBpcyBkb25lIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgICAgICAgICBFdmVuIGlmIHlvdSBkb24ndCB1c2UgdGhlICdkaXJwcm90JyBtb2RlLCBzd2lnIHdpbGwKICAgICAgICAgICAgICAgIHdyYXAgd2hhdCBpcyBtaW5pbWFsbHkgbmVlZGVkIChhbmQgcHJvdGVjdGVkKSBmb3IgdGhlCiAgICAgICAgICAgICAgICBjb2RlIHRvIGNvbXBpbGUuCgkJCgkJd2hhdCBpcyBwdWJsaWMsIGFzIHVzdWFsLCBpcyBhbHdheXMgd3JhcHBlZCwgYW5kIGlmCgkJeW91IHVzZSB0aGUgJ2RpcnBvcnQnCgkJCgoJICAgIC0gRmluYWwgZml4ZXMgZm9yIHRoZSBPU1MgdG8gY29tcGlsZSB3aXRoIFNXSUcgMS4zLjIzIChteQoJICAgICAgdmVyeSB2ZXJ5IHVnbHkgQysrICsgdGVtcGxhdGVzICsgZXZlcnl0aGluZyBtb3VudGVycyB3cmFwKS4KCjEwLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtZGxsaW1wb3J0LiBUaGlzIGVuYWJsZXMgb25lIHRvIHNwZWNpZnkKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIERMTCBmb3IgdGhlIERsbEltcG9ydCBhdHRyaWJ1dGUuIE5vcm1hbGx5IHRoaXMgbmFtZQogICAgICAgICAgICBjb21lcyBmcm9tIHRoZSBtb2R1bGUgbmFtZSwgc28gbm93IGl0IGlzIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoaXM6CgogICAgICAgICAgICAgIHN3aWcgLWNzaGFycCAtZGxsaW1wb3J0IHh5eiBleGFtcGxlLmkKCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgZm9yIGFsbCB0aGUgd3JhcHBlZCBQSW52b2tlIG1ldGhvZHM6CgogICAgICAgICAgICAgIFtEbGxJbXBvcnQoInh5eiIsIEVudHJ5UG9pbnQ9Ii4uLiIpXQogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZXh0ZXJuIC4uLgoKICAgICAgICAgICAgVGhlIHdyYXBwZXJzIGZyb20gbWFueSBkaWZmZXJlbnQgU1dJRyBpbnZvY2F0aW9ucyBjYW4gdGh1cyBiZSBjb21waWxlZAogICAgICAgICAgICBpbnRvIG9uZSBETEwuCgogICAgICAgICAgICBBIG5ldyBzcGVjaWFsIHZhcmlhYmxlICRkbGxpbXBvcnQgY2FuIGFsc28gYmUgdXNlZCBpbiB0eXBlbWFwcywgcHJhZ21hcywKICAgICAgICAgICAgZmVhdHVyZXMgZXRjLiBUaGlzIHdpbGwgZ2V0IHRyYW5zbGF0ZWQgaW50byB0aGUgdmFsdWUgc3BlY2lmaWVkIGJ5IC1kbGxpbXBvcnQKICAgICAgICAgICAgaWYgc3BlY2lmaWVkLCBvdGhlcndpc2UgdGhlIG1vZHVsZSBuYW1lLgoKMTAvMjIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoICMxMDQ5NDk2IGZyb20gU2NvdHQgTWljaGVsIGZpeGVzIGRpcmVjdG9ycyBtZXRob2RzIHdpdGggCiAgICAgICAgICAgIGVudW1zIHdoZW4gd3JhcHBlZCB3aXRoIHR5cGVzYWZlIG9yIHByb3BlciBKYXZhIGVudW1zLgoKMTAvMjEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGluIGRpcmVjdG9yIGNvbnN0cnVjdG9ycyAoUHl0aG9uLCBSdWJ5LCBPY2FtbCkuCgoxMC8yMS8yMDA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1jcGx1c2Nhc3QnIG9wdGlvbiB0byBlbmFibGUgdGhlICduZXcnCgkgICAgICBDKysgY2FzdGluZyBvcGVyYXRvcnMsIHN1Y2ggYXMgJ3N0YXRpY19jYXN0JywgaW5zaWRlIHRoZQoJICAgICAgdHlwZW1hcHMuIEJ5IGRlZmF1bHQgc3dpZyB1c2UgdGhlIG9sZCBDIGNhc3Qgc3R5bGUsIGV2ZW4KCSAgICAgIHdoZW4gcGFyc2luZyBDKysuCgkgICAgICAKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1uZXdfdndtJyBvcHRpb24gdG8gZW5hYmxlIHRoZSBuZXcKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyIG1vZGUuIE5vdyB0aGlzIGlzIG1haW5seSBmb3IgdGVzdGluZwogICAgICAgICAgICAgIHRoYXQgdGhlIHR5cGVtYXBzIGFyZSByZWFsbHkgc2FmZSBmb3IgYW55IGZ1dHVyZQogICAgICAgICAgICAgIHNvbHV0aW9uLCBidXQgeW91IGNhbiB1c2UgaXQgaWYgeW91IGhhdmUgYSB2ZXJ5IHN0cmFuZ2UKICAgICAgICAgICAgICBlcnJvciB3aXRoIGRlZmF1bHQgY29zbnRydWN0b3JzIG1pc3NpbmcgKyAlYXBwbHkgKwogICAgICAgICAgICAgICV0eXBlbWFwLCBhbmQgaWYgZXZlcnl0aGluZyBlbHNlIGZhaWxzIChzZWUKICAgICAgICAgICAgICB2YWx1d3JhcHBlcl9vcGFxdWUuaSBmb3IgYWx0ZXJuYXRpdmUgYW5kIGN1cnJlbnQKICAgICAgICAgICAgICBzb2x1dGlvbnMpLiBJZiB5b3UgYXJlIGEgdXNlciB0aGF0IGRvbid0IGtub3cgd2hhdCBpcwogICAgICAgICAgICAgIFN3aWdWYWx1ZVdyYXBwZXIsIGRvbid0IGV2ZW4gdHJ5IGl0LgoKCSAgICAtIFtQeXRob25dIEFkZCB0aGUgJy1ub2gnIG9wdGlvbiB0byBiZSB1c2VkIHdpdGggZGlyZWN0b3JzCgkgICAgICBhbmQgd2hlbiB5b3UgcHJlZmVyIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlCgkgICAgICBkaXJlY3RvciBoZWFkZXIgZmlsZS4gSWYgbm90IHVzZWQsIHN3aWcgd2lsbCB3b3JrIGFzCgkgICAgICB1c3VhbCBnZW5lcmF0aW5nIGJvdGggdGhlIHdyYXAuY3h4IGFuZCB3cmFwLmggZmlsZXMuIElmCgkgICAgICB5b3UgdXNlIGl0LCBzd2lnIHdpbGwgb25seSBnZW5lcmF0ZSB3cmFwLmN4eC4KCjEwLzIxLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIElmIHlvdSBkZWZpbmUgU1dJR19UWVBFX1RBQkxFIHdoZW4gY29tcGlsaW5nIGEgd3JhcHBlciBmaWxlLAoJICAgICAgdGhlIHJ1bnRpbWUgdHlwZXMgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIGdpdmVuIHR5cGUgdGFibGUgbmFtZS4KCSAgICAgIFVzaW5nIHRoaXMsIHlvdSBjYW4gc2VwZXJhdGUgZGlmZmVyZW50IG1vZHVsZXMgdG8gc2hhcmUgdGhlaXIKCSAgICAgIG93biB0eXBlIHN5c3RlbXMuICAtRFNXSUdfVFlQRV9UQUJMRT1NeXRhYmxlCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX1NUQVRJQ19SVU5USU1FIHRoZW4gdGhlIHR5cGUgaW5mb3JtYXRpb24KCSAgICAgIHdpbGwgYmUgc3RhdGljIHRvIHRoaXMgd3JhcHBlci4gIE5vdGhpbmcgd2lsbCBiZSBzaGFyZWQgd2l0aCBhbnkKCSAgICAgIG90aGVyIG1vZHVsZXMKCgkgICAgLSBbUHl0aG9uXSBJZiB5b3UgZGVmaW5lIFNXSUdfTElOS19SVU5USU1FLCB0aGVuIGluc3RlYWQgb2YgdXNpbmcKCSAgICAgIHRoZSBuZXcgd2F5IG9mIHNoYXJpbmcgdHlwZSBpbmZvcm1hdGlvbiwgdGhlIHdyYXBwZXIgd2lsbCBleHBlY3QKCSAgICAgIHRvIGJlIGxpbmtlZCBhZ2FpbnN0IHRoZSBMaWIvbGlua3J1bnRpbWUuYyBmaWxlLiAgQW55IG1vZHVsZXMgY29tcGlsZWQKCSAgICAgIHdpdGggU1dJR19MSU5LX1JVTlRJTUUgYW5kIGxpbmtlZCBhZ2FpbnN0IGxpbmtydW50aW1lLmMgd2lsbCBhbGwKCSAgICAgIHNoYXJlIHR5cGUgaW5mb3JtYXRpb24uCgoxMC8yMC8yMDA0OiBtbWF0dXMKCSAgICAtIFtQeXRob25dIEluaXRpYWwgZml4IGZvciBweXRob24vaW1wb3J0IGV4YW1wbGUuIFBsZWFzZQoJICAgICAgdXBkYXRlIHRoZSBNYWtlZmlsZSAoYXV0b2NvbmYsIGNvbmZpZ3VyZSwgZXRjLCBleHBlcnQpLAoJICAgICAgc2luY2Ugbm93IHByb2JhYmx5IGlzIG9ubHkgd29ya2luZyB3aXRoIGcrKywgaWNjIGFuZCBhCgkgICAgICBmZXcgb3RoZXIgY29tcGlsZXJzIHRoYXQgaGF2ZSB0aGUgLXNoYXJlZCBvcHRpb24uCgoJICAgICAgV2UgbmVlZCB0byBjcmVhdGUgYWRkaXRpb25hbCBzaGFyZWQgbGlicmFyaWVzIGZvciB0aGUKCSAgICAgIHZpcnR1YWwgZGVzdHJ1Y3RvcnMuIE9sZCBhbmQgdXN1YWxseSBmb3Jnb3R0ZW4gQysrCgkgICAgICByZXF1aXJlbWVudC4KCSAgICAgIAoJICAgICAgU2FtZSBmaXggbmVlZCB0byBiZSB1c2VkIGluIHBlcmwsIEkgdGhpbmsuCgogICAgICAgICAgICAtIFtQeXRob25dIEZpeCBnZW5lcmF0aW9uIG9mIGhlYWRlciBmaWxlIGZvciBkaXJlY3RvcnMsCiAgICAgICAgICAgICAgbm93IGRpcmVjdG9ycy5zd2cgaXMgYWxzbyBpbmNsdWRlZCwgc28sIGl0IGNhbiBiZSByZWFsbHkKCSAgICAgIHVzZWQgZnJvbSBDKyssIGFuZCBpdCBzb2x2ZXMgc29tZSBwcm9ibGVtIHdpdGggY29tcGlsZXIKCSAgICAgIHRoYXQgcmVxdWlyZSB0aGF0LCBldmVuIHdpdGggdGhlIHNpbXBsZSBzd2lnIGluY2x1c2lvbi4gIAoKICAgICAgICAgICAgLSBbUHl0aG9uXSBSZW9yZGVyaW5nIHRoZSBtZXRob2RzIGFuZCBtb3Zpbmcgc29tZSBib2RpZXMKICAgICAgICAgICAgICBvdXRzaWRlIHRoZSBjbGFzcyBkZWNsYXJhdGlvbi4gVGhpcyBpcyBuZWVkZWQgZHVlIHRvCiAgICAgICAgICAgICAgc29tZSBnY2MtMi45NiBpbnRlcm5hbCBjb21waWxlciBlcnJvcnMuIEl0IHNlZW1zIHRoZQogICAgICAgICAgICAgIFBZVEhPTiBjbGFzcyBpcyBnZXR0aW5nIHRvbyBsYXJnZSB0byBiZWVuIGRlY2xhcmVkIGFuZAogICAgICAgICAgICAgIGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZS4KCgkgICAgLSBBZGQgdGhlIC1vaCBvcHRpb24gdG8gY2hhbmdlIHRoZSBvdXRwdXQgaGVhZGVyIGZpbGUgbmFtZQogICAgICAgICAgICAgIGlmIG5lZWRlZDoKCiAgICAgICAgICAgICAgICAgc3dpZyAtYysrIC1weXRob24gdGVzdC5pIC1vIHRlc3QuQ0MgLW9oIHRlc3QuSEgKCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbWFpbmx5IG5lZWRlZCB3aGVuIHVzaW5nIGRpcmVjdG9ycywgYW5kIGlmIHRoZQogICAgICAgICAgICAgIGN1cnJlbnQgZGVmYXVsdCBoZWFkZXIgZmlsZSBuYW1lIGlzIG5vdCBnb29kIGZvciB5b3UsCiAgICAgICAgICAgICAgd2hpY2ggaXMgZ2VuZXJhdGVkIGFzIGZvbGxvdzoJICAgICAgCgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAgICAgICAgICAgICA9PiB0ZXN0X3dyYXAuaAogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDICA9PiB0ZXN0LmgKCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAxKSBDb21wYWN0IGRlZmF1bHQgYXJndW1lbnRzIGZlYXR1cmUgYWRkZWQuIFRoaXMgZmVhdHVyZSBhbGxvd3Mgb25lCiAgICAgICAgICAgICAgdG8gdXNlIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGNvZGUgZ2VuZXJhdGlvbiB0aGF0IHdhcyB1c2VkIGluCiAgICAgICAgICAgICAgU1dJRy0xLjMuMjIgYW5kIGVhcmxpZXIgdmVyc2lvbnMuIEl0IHByb2R1Y2VzIG1vcmUgY29tcGFjdCB3cmFwcGVycwogICAgICAgICAgICAgIGFzIG9ubHkgb25lIHdyYXBwZXIgbWV0aG9kIGlzIGdlbmVyYXRlZCBmb3IgYW55IG1ldGhvZCB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgICBhcmd1bWVudHMuIFNvIHRoZSBhZHZhbnRhZ2UgaXMgaXQgZ2VuZXJhdGVzIGxlc3MgY29kZSBidXQgaGFzIHRoZQogICAgICAgICAgICAgIG9yaWdpbmFsIGxpbWl0YXRpb25zLCBsaWtlIGl0IGl0IGRvZXMgbm90IHdvcmsgd2l0aCBhbGwgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICBhbmQgZGVmYXVsdCBhcmd1bWVudHMgY2Fubm90IGJlIHRha2VuIGFkdmFudGFnZSBvZiBpbiB0aGUgc3Ryb25nbHkgdHlwZWQKICAgICAgICAgICAgICBsYW5ndWFnZXMgKEMjIGFuZCBKYXZhKS4gSXQgaXMgaW1wbGVtZW50ZWQgdmlhIHRoZSB1c3VhbCAlZmVhdHVyZSBtZWNoYW5pc206CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImNvbXBhY3RkZWZhdWx0YXJncyIpOwoKICAgICAgICAgICAgMikgS2V5d29yZCBhcmd1bWVudHMgKGt3YXJncykgYXJlIHdvcmtpbmcgYWdhaW4gZm9yIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGluIHRoZSBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IGl0LCBpZSwgUHl0aG9uIGFuZCBSdWJ5LiBUaGUgbmV3IGRlZmF1bHQKICAgICAgICAgICAgICAgYXJndW1lbnQgd3JhcHBpbmcgYXBwcm9hY2ggdXNpbmcgb3ZlcmxvYWRlZCBtZXRob2RzIGNhbm5vdCBzdXBwb3J0IGt3YXJncwogICAgICAgICAgICAgICBzbyB0aGUgY29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50IGZlYXR1cmUgaXMgYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbgogICAgICAgICAgICAgICBrd2FyZ3MgYXJlIHNwZWNpZmllZCwgYnkgJWZlYXR1cmUoImt3YXJncyIpLgoKICAgICAgICAgICAgMykgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgYWxzbyBhdXRvbWF0aWNhbGx5IHR1cm5lZCBvbiB3aGVuIHdyYXBwaW5nCiAgICAgICAgICAgICAgIEMgKG5vdCBDKyspIGNvZGUuIFRoaXMgaXMgdG8gc3VwcG9ydCB0aGUgYml6YXJyZSBub3Rpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgICAgZm9yIEMgY29kZS4KCjEwLzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucyBpbiBuYW1lc3BhY2VzIGFsc28gd29ya2luZyBub3cuCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpbiBuYW1lc3BhY2VzIHRvby4KCjEwLzE5LzIwMDQ6IG1tYXR1cwoKCSAgICAtIEFsbG93IHRvIGRpc2FibGUgdGhlIG5ldyBTd2lnVmFsdWVXcmFwcGVyIG1lY2hhbmlzbSwKCSAgICAgIGlmIHlvdSBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdXIgbGFuZ3VhZ2UgbWFpbi4KCgkJIC8qIFR1cm4gb24gc2FmZSB2YWx1ZSB3cmFwcGVyIHVzZSBtb2RlICovCiAgICAgICAgICAgICAgICAgU3dpZ192YWx1ZV93cmFwcGVyX21vZGUoMSk7CgoJICAgICAgCgkgICAgICBOb3cgaXMgb25seSBhY3RpdmUgaW4gcHl0aG9uLiBBbGwgdGhlIG90aGVyIGxhbmd1YWdlcwoJICAgICAgYXJlIHVzaW5nIHRoZSBvbGQgcmVzb2x1dGlvbiwgYnV0IHRoZXkgIGNhbiBhbHNvIHVzZSB0aGUKCSAgICAgICJ2YWx1ZXdyYXBwZXIiLyJub3ZhbHVld3JhcHBlciIgZmVhdHVyZXMgdG8gZml4IHNvbWUKCSAgICAgIG9mIHRoZSBvbGQgYnJva2VuIGNhc2VzLiBOb3RlLCBob3dldmVyLCAgdGhhdCBub3QgYWxsIAoJICAgICAgdGhlIGJyb2tlbiBjYXNlcyBjYW4gYmUgc29sdmVkIGluIHRoYXQgd2F5LgoKCSAgICAgIFRoZSBuZXcgbWVjaGFuaXNtIHNlZW1zIHRvIGJlIHdvcmtpbmcgZmluZSBpbiBwZXJsLCBydWJ5CgkgICAgICBhbmQgdGNsLCBidXQgZmFpbGluZyBpbiBzb21lIHR5cGVtYXBzIGluIGphdmEuCgoJICAgICAgSGVuY2UsIGlzIHVwdG8gdGhlIGxhbmd1YWdlIG1haW50YWluZXIgdG8gdGVzdCBpdCwgYW5kCgkgICAgICBkZWNpZGUgdG8gZW5hYmxlIGl0IG9yIG5vdC4KCgkgICAgICBMb29rIGF0IHRoZSB2YWx1ZXdyYXBwZXJfb3BhcXVlLmkgZm9yIGV4YW1wbGVzLgoKCSAgICAtIEZpeCBtb3JlIFN3aWdWYWx1ZVdyYXBwZXIgY2FzZXMgd2hlbiB0aGUgbmV3IG1lY2hhbmlzbQoJICAgICAgaXMgYWN0aXZlLiBOb3cgaXQgYWxzbyBjaGVjayBmb3IgbG9jYWwgdHlwZW1hcAoJICAgICAgdmFyaWFibGVzLCBzZWUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBhbiBleGFtcGxlIHdoZW4KCSAgICAgIHRoaXMgaXMgbmVlZGVkLiBCdXQgYWdhaW4sIHRoaXMgZXh0cmEgY2hlY2tpbmcgd2lsbCBvbmx5CgkgICAgICBiZSBhY3RpdmF0ZWQgd2hlbiB1c2luZyB0aGUgbmV3IHZhbHVlIHdyYXBwZXIgbW9kZS4KCgkgICAgLSBbUHl0aG9uXSBGaXggdmFyaWFibGUgd3JhcHBpbmcgb2YgY2xhc3NlcyB3aXRoIHByaXZhdGUKCSAgICAgIGFzc2lnbiBvcGVyYXRvcnMuIEl0IHNob3VsZCBiZSBlYXN5IHRvIGZpeCBpbiBhbGwgdGhlIAoJICAgICAgb3RoZXIgbW9kdWxlcywgaW5zdGVhZCBvZiBjaGVja2luZwoKCSAgICAgICAgIGlmICghR2V0YXR0cihuLCJpbW11dGFibGUiKSkgLi4uCgkKCSAgICAgIHlvdSBuZWVkIHRvIHZlcmlmeQoKCSAgICAgICAgIGlmIChpc19hc3NpZ25hYmxlKG4pKSAuLi4KCgkgICAgICBMb29rIGF0IHRoZSBwcml2YXRlX2Fzc2lnbi5pIGZvciBhbiBleGFtcGxlLgoKMTAvMTgvMjAwNDogbW1hdHVzCgkgICAgLSAlZmVhdHVyZXMgImRpcmVjdG9yIi8ibm9kaXJlY3RvciIgbm93IHdvcmsgYXMgZXhwZWN0ZWQuCiAgICAgICAgICAgIC0gR2VuZXJhbCBmaXhlcyBpbiAlZmVhdHVyZSB0byByZXNvbHZlIGZ1bmN0aW9uIGRlY2wKCSAgICAgIHByb3Blcmx5LAoJICAgICAgCgkgICAgICAgICVmZWF0dXJlKCJoZWxsbyIpIGZvbygpOwoJICAgICAgICBjaGFyIGZvbygpIC0+ICBmKCkgICAgLy8gd2FzIHdvcmtpbmcKCSAgICAgICAgY2hhciAqZm9vKCkgLT4gZigpLnAgIC8vIGl0IHdhc24ndAogCgogICAgICAgICAgICAtIFRlbXBsYXRlICsgc3BlY2lhbGl6YXRpb24gKyBkZWZhdWx0IHRlbXBsYXRlIGFyZ3Mgbm93IGlzCgkgICAgICB3b3JraW5nLCAoZG9uJ3QgY29uZnVzZSB3aXRoIHRlbXBsYXRlICsgZGVmYXVsdCBhcmcKCSAgICAgIHZhbHVlcywgdGhhdCB3YXMgc29sdmVkIGJlZm9yZSksIG5vdyB0aGlzIHVnbHkgY2FzZSBpcwoJICAgICAgd29ya2luZzoKCgkgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBBID0gQWxsb2M8VD4gPgoJCXN0cnVjdCBWZWN0b3IKCQl7CgkJICAgVmVjdG9yKFQgYSl7fQoJCX07CQkgICAKCgkJdGVtcGxhdGUgPD4KCQlzdHJ1Y3QgVmVjdG9yPGRvdWJsZT4KCQl7CgkJICBWZWN0b3IoKXt9CgkJICBpbnQgZm9vKCkgeyByZXR1cm4gMDsgfQogICAgICAgICAgICAgICAgfTsKCgkgICAgICAgICV0ZW1wbGF0ZShWX2MpIFZlY3RvcjxjaGFyLCBBbGxvYzxjaGFyPiA+OwoJICAgICAgICAldGVtcGxhdGUoVl9pKSBWZWN0b3I8aW50PjsgICAgLy8gcGlja3MgVmVjdG9yPGludCxBbGxvYzxpbnQ+ID4KCSAgICAgICAgJXRlbXBsYXRlKFZfZCkgVmVjdG9yPGRvdWJsZT47IC8vIHBpY2tzIHRoZSBzcGVjaWFsaXphdGlvbgoJICAgICAgCiAgICAgICAgICAgICAgdGhpcyBpcyBuZWVkZWQgZm9yIGF1dG9tYXRpYyBTVEwgc3VwcG9ydCAobGF0ZXIgd2lsbAogICAgICAgICAgICAgIGJlKS4KCgkgICAgLSBGaXggdGhlIHRlbXBsYXRlICsgdHlwZWRlZiBlcnJvcnMgaW4gdGVzdC1zdWl0ZSwgd2hpY2gKICAgICAgICAgICAgICBwcm9iYWJseSB3aWxsIGZpeCBhbm90aGVyIGdyb3VwIG9mIHN0cmFuZ2UgdGVtcGxhdGUgKwogICAgICAgICAgICAgIG5hbWVzcGFjZXMgKyB0eXBlZGVmcyBlcnJvcnMuCgoJICAgIC0gJXdhcm5maWx0ZXIgaXMgd29ya2luZyBiZXR0ZXIgbm93LCBwYXJzZXIueSB0cmllcyB0byB1c2UKCSAgICAgIHRoZW0gd2hlbiBuZWVkZWQuCgoJICAgIC0gKioqKiBOZXcgZGVmYXVsdCB0eXBlIHJlc29sdXRpb24gbWV0aG9kIChzdHlwZS5jKSAqKioqKiAKCgkgICAgICBJdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIG1peGVkIHR5cGVzLCB0aGVuIGl0IGdvZXMKCSAgICAgICdiYWNrd2FyZCcgZmlyc3QgZGVsZXRpbmcgdGhlIHF1YWxpZmllciwgdGhlbiB0aGUgaW5uZXIKCSAgICAgIHR5cGVzLCBmb3IgZXhhbXBsZToKICAgIAkJIAkJCQkJCQkgIAogICAgCQkgdHlwZWRlZiBBICpBcHRyOwkJCQkgIAogICAgCQkgY29uc3QgQXB0ciY7CQkJCQkJCiAgICAJCSByLnEoY29uc3QpLkFwdHIgICAgICAgLT4gci5xKGNvbnN0KS5wLlNXSUdUWVBFCQkKICAgIAkJIHIucShjb25zdCkucC5TV0lHVFlQRSAtPiByLnAuU1dJR1RZUEUJCQkKICAgIAkJIHIucC5TV0lHVFlQRSAgICAgICAgICAtPiByLlNXSUdUWVBFCQkJCiAgICAJCSByLlNXSUdUWVBFICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgZW51bSBIZWxsbyB7fTsJCQkJCQkKICAgIAkJIGNvbnN0IEhlbGxvJiBoaTsJCQkJCQogICAgCQkgci5xKGNvbnN0KS5IZWxsbyAgICAgICAgICAtPiByLnEoY29uc3QpLmVudW0gU1dJR1RZUEUJCiAgICAJCSByLnEoY29uc3QpLmVudW0gU1dJR1RZUEUgIC0+IHIuZW51bSBTV0lHVFlQRQkJCiAgICAJCSByLmVudW0gU1dJR1RZUEUgICAgICAgICAgIC0+IHIuU1dJR1RZUEUJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgICAgICAtPiBTV0lHVFlQRQkJCQoJCSAJCQkJCQkJCiAgICAJCSBpbnQgYVsyXVs0XTsJCQkJCQkKICAgIAkJIGEoMikuYSg0KS5pbnQgICAgICAgICAgIC0+IGEoQU5ZKS5hKEFOWSkuU1dJR1RZUEUJCiAgICAJCSBhKEFOWSkuYShBTlkpLlNXSUdUWVBFICAtPiBhKEFOWSkuYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5hKCkuU1dJR1RZUEUgICAgIC0+IGEoQU5ZKS5wLlNXSUdUWVBFCQkKICAgIAkJIGEoQU5ZKS5wLlNXSUdUWVBFICAgICAgIC0+IGEoQU5ZKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuU1dJR1RZUEUgICAgICAgICAtPiBhKCkuU1dJR1RZUEUJCQogICAgCQkgYSgpLlNXSUdUWVBFICAgICAgICAgICAgLT4gcC5TV0lHVFlQRQkJCQogICAgCQkgcC5TV0lHVFlQRSAgICAgICAgICAgICAgLT4gU1dJR1RZUEUgICAgICAgICAgICAgICAgICAgIAoKCSAgICAgIGJlZm9yZSBpdCBhbHdheXMgc3RvcHMgYWZ0ZXIgZmluZGluZyByZWYvcG9pbnRlci9lbnVtL2FycmF5L2V0Yy4KCSAgICAgICAKCSAgICAgIE5vdywgdGhlbiwgeW91IGNhbiBkZWZpbmUgKHVzZSBhbmQgYXBwbHkpICdoaWdoZXInIHR5cGVtYXBzIHN1Y2ggYXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChvdXQpIGNoYXIgRklYU0laRVtBTlldCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUqIGNvbnN0JiAgCgkgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBlbnVtIFNXSUdUWVBFJgoJICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEVbQU5ZXVtBTlldCgkgICAgICAgICV0eXBlbWFwKGluKSBjb25zdCBjaGFyICgmKVtBTlldCgkgICAgICAgCgkgICAgICBJdCBpcyBwb3NzaWJsZSB3aXRoIHRoaXMgY2hhbmdlIHRoYXQgcHJldmlvdXMgdHlwZW1hcHMKCSAgICAgIHRoYXQgd2VyZSBkZWZpbmVkIChidXQgaWdub3JlZCksIG5vdyB3aWxsIHN0YXJ0IHRvIHdvcmsuCgoJICAgICAgQWxzbywgaXQgaXMgbmVjZXNzYXJ5IGNoZWNrIGZvciB0aGUgJyV0eXBlbWFwKHZhcmluKSBTV0lHVFlQRVtdJywKCSAgICAgIGJlZm9yZSBpdCB3YXMgdXN1YWxseSBub3QgZGVmaW5lZCAoYnV0IGNoYXJbXSB3YXMpLAoJICAgICAgYW5kIHRoYXQgY2FuIHByb2R1Y2Ugc29tZSBpbmNvbnNpc3RlbmNpZXMuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgICAgVGhpcyBjaGFuZ2Ugd2FzIG5lZWRlZCBmb3IgU1RMLCBzaW5jZSBzdGQ6OnZlY3RvcjxlbnVtIEhlbGxvPiAKCSAgICAgIHN0ZDo6dmVjdG9yPEEqPiwgZXRjLCB3aWxsIGFsd2F5cyBnZW5lcmF0ZSBtZXRob2RzIHRoYXQKCSAgICAgIG1peCBjb25zdCByZWZlcmVuY2VzIHdpdGggdGhlIHZlY3RvciB0eXBlLgoKCSAgICAgIE5vdyB0aGF0IGlzIHdvcmtpbmcsIGFsbCB0aGUgc3RkOjpjb250YWluZXI8VCo+CgkgICAgICBzcGVjaWFsaXphdGlvbiB3aWxsIG5vdCBiZSBuZWVkZWQgYW55bW9yZSwgd2VsbCwgaW4KCSAgICAgIHRoZW9yeS4gCgoJICAgICAgSW4gdGhlIHByYWN0aWNlLCBldmVyeXRoaW4gaXMgd29ya2luZyBhcyBiZWZvcmUgdW50aWwKCSAgICAgIHRoZSBwcm9wZXIgbWl4ZWQgdHlwZXMgYXJlIGRlZmluZWQgYW5kIHRoZSBsaWJyYXJpZXMKCSAgICAgIHNpbXBsaWZpZWQgdG8gdXNlIHRoZW0uCgoJICAgIC0gQ2hhbmdlIHRoZSBiZWhhdmlvciBvZiBleHRlcm4gImphdmEiLyJmb3J0cmFuIi8iZXRjIiwgCgkgICAgICBub3cgc3dpZyBwcm9kdWNlcyBhIHdhcm5pbmcsIGFuZCB1c2UgZXh0ZXJuICJDIiBpbnN0ZWFkLgoJICAgICAgVGhlIHdhcm5pbmcgY2FuIGFsc28gYmUgZGlzYWJsZSB3aXRoIHRoZSAiLXcgMzEzIiBmbGFnLgoJICAgICAgKFdBUk5fUEFSU0VfVU5ERUZJTkVEX0VYVEVSTikuCgoJICAgIC0gU3dpZ1ZhbHVlV3JhcHBlciBpcyBub3cgbW9yZSBzZWxlY3RpdmUgKGxhbmcuY3h4KS4KCiAgICAgICAgICAgIFtQZXJsL1RjbF0KCSAgICAtIEZpeCBzb21lIHR5cGVtYXBzIChwZXJsL3RjbCkgdG8gd29yayBwcm9wZXJseSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLiBUaGlzIHdhcyBub3QgYSBwcm9ibGVtIHdpdGgKCSAgICAgIFN3aWdWYWx1ZVdyYXBwZXIsIGJ1dCB3aXRoIHRoZSB0eXBlbWFwcyB0aGF0IG5vdyBhcmUKCSAgICAgIHNhZmUgdG8gdXNlIHdpdGggJWFwcGx5LgoKCSAgICBbUHl0aG9uXQoKICAgICAgICAgICAgLSBGaXggJWNhbGxiYWNrLyVweXRob25jYWxsYmFjayB3b3JrIG5vdyBhcyBiZWZvcmUgYWZ0ZXIKCSAgICAgIHRoZSBkZWYgYXJncyBjaGFuZ2VzLiBBbHNvLCAlY2FsbGJhY2sgbm93IGlzIGFuIGFsaWFzCgkgICAgICBmb3IgJXB5dGhvbmNhbGxiYWNrLCBzbywgdGhleSBkbyB0aGUgc2FtZS4KCgkgICAgW1B5dGhvbi9SdWJ5XQoJICAgIC0gJWNhbGxiYWNrIGlzIG1vcmUgdXNhYmxlIGFuZCB1bmlmb3JtOgoKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzX2NiIikgZm9vKCk7ICAvLyBmb3IgYm90aCwgcHl0aG9uL3J1YnkKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soIiVzX2NiIik7ICAgICAgICAvLyBmb3IgYm90aCwgcHl0aG9uL3J1YnkKICAgICAgICAgICAgICAgICAlY2FsbGJhY2soMSkgZm9vKCk7ICAgICAgICAvLyBvbmx5IGluIHB5dGhvbi4KCjEwLzE3LzIwMDQ6IGFydHkKCSAgICBbT0NBTUxdCgkgICAgLSBUd2VhayB0byBlbnVtIHR5cGluZyBmb3Igc291bmRuZXNzIGluIHRoZSBwcmVzZW5jZSBvZiBtdWx0aXBsZQoJICAgICAgbW9kdWxlcy4KCSAgICAtIGdsb2JhbCBmdW5jdGlvbnMgYXJlIG5vdyB1bmFtYmlndW91cyBpbiBtdWx0aXBsZSBsb2FkZWQgbW9kdWxlcy4KCSAgICAtIEZpeGVkIHRlc3QgY2FzZSBjb2RlIHRvIGJ1aWxkIG11bHRpbW9kdWxlIHRlc3QgY2FzZXMgY29ycmVjdGx5LgoJICAgIC0gVGhlcmUgaXMgbm8gd2F5IHRvIHNoYXJlIG92ZXJsb2FkIHJlc29sdXRpb24gYWNyb3NzIG1vZHVsZXMKCSAgICAgIGJlY2F1c2Ugb2Ygc291bmRuZXNzIGlzc3Vlcy4gIElmIHRoZSB1c2VyIHdhbnRzIHRvIGNhbGwgc29tZQoJICAgICAgZnVuY3Rpb24gZm9vIGZyb20gYW4gYXJiaXRyYXJ5IG1vZHVsZSBiYXIsIHRoZXkgd2lsbCBoYXZlIHRvCgkgICAgICB1c2UgQmFyLl9mb28gdG8gY2FsbCBpdCBjb3JyZWN0bHkuICBMYXRlciBJIHdpbGwgZml4IHRoZSAKCSAgICAgIGNhbWxwNCBtb2R1bGUgdG8gZG8gc29tZXRoaW5nIGNsZXZlciBpbiB0aGlzIGNhc2UuICAKICAgICAgICAgICAgLSBQcm9taWRlZCBwZXJmb3JtYW5jZSBvdmVyaGF1bCBvZiBjbGFzcyBtZWNoYW5pc20uCgkgICAgLSBSZW1vdmVkIHN5bWJvbCBoYWNrIGZvciBvY2FtbC0zLjA3IGFuZCBiZWxvdyB3aGljaCBpcyBub3QgbmVlZGVkCgkgICAgICBmb3Igb2NhbWwtMy4wOCBhbmQgYWJvdmUuCgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NISUNLRU5dCgkgICAgLSBDb21wbGV0bHkgY2hhbmdlIGhvdyBjaGlja2VuLmN4eCBoYW5kbGVzIENMT1MgYW5kIGdlbmVyaWMgY29kZS4KCSAgICAgIGNoaWNrZW4gbm8gbG9uZ2VyIGV4cG9ydHMgLWNsb3Muc2NtIGFuZCAtZ2VuZXJpYy5zY20uICBUaGUgY2xvcwoJICAgICAgY29kZSBpcyBleHBvcnRlZCBkaXJlY3RseSBpbnRvIHRoZSBtb2R1bGUuc2NtIGZpbGUgaWYgLXByb3h5IGlzIHBhc3NlZC4KCSAgICAtIFRoZSBjb2RlIG5vdyBhbHdheXMgZXhwb3J0cyBhIHVuaXQuICBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlIGlzIG5vdwoJICAgICAgbWFqb3JseSBicm9rZW4sIGFuZCBuZWVkcyB0byBiZSBmaXhlZC4KCSAgICAtIENMT1Mgbm93IGdlbmVyYXRlcyB2aXJ0dWFsIHNsb3RzIGZvciBtZW1iZXIgdmFyaWFibGVzIHNpbWlsYXIgdG8gaG93CgkgICAgICBHT09QUyBzdXBwb3J0IHdvcmtzIGluIHRoZSBndWlsZSBtb2R1bGUuCgkgICAgLSBjaGlja2VuIG5vIGxvbmdlciBwcmVmaXhlcyBzeW1ib2xzIGJ5IHRoZSBtb2R1bGUgbmFtZSwgYW5kIG5vIGxvbmdlcgoJICAgICAgZm9yY2VzIGFsbCBuYW1lcyB0byBsb3dlciBjYXNlLiAgSXQgbm93IGhhcyAtdXNlY2xhc3NwcmVmaXggYW5kIC1jbG9zcHJlZml4CgkgICAgICBzaW1pbGFyIHRvIGhvdyBndWlsZSBoYW5kbGVzIEdPT1BTIG5hbWVzLgoKMTAvMTYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGVtcGxhdGVkIGZ1bmN0aW9ucyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIHdvcmtpbmcgd2l0aCBuZXcgZGVmYXVsdCBhcmd1bWVudAogICAgICAgICAgICB3cmFwcGluZyBhcHByb2FjaC4gVGhlIG5ldyBhcHByb2FjaCBubyBsb25nZXIgZmFpbHMgd2l0aCB0aGUgZm9sbG93aW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnQgcGF0dGVybiAocHJldmlvdXNseSBmYWlsZWQgd2l0aCBzb21lIHByaW1pdGl2ZSB0eXBlcywgbGlrZSAKICAgICAgICAgICAgdW5zaWduZWQgcHJpbWl0aXZlIHR5cGVzKToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IGZvbyhjb25zdCBUJiB1ID0gVCgpKTsKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288dW5zaWduZWQgaW50PjsKCiAgICAgICAgICAgIFRoaXMgcmVsaWVzIG9uIHRoZSB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgc3VwcG9ydCBqdXN0IGFkZGVkLCBzbyBhbGwKICAgICAgICAgICAgdGhlIGNvbWJpbmF0aW9ucyBvZiBvdmVybG9hZGluZyBieSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFuZCBub3JtYWwgcGFyYW1ldGVycwogICAgICAgICAgICBhcyB3ZWxsIGFzIG92ZXJsb2FkaW5nIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzIHdvcmtzLgoKMTAvMTYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgdGhlIGxhcmdlIHJhbmdlIG9mIHRlbXBsYXRlZCBmdW5jdGlvbiBvdmVybG9hZGluZyB0aGF0IEMrKwogICAgICAgICAgICBzdXBwb3J0cy4KCiAgICAgICAgICAgIC0gT3ZlcmxvYWRlZCB0ZW1wbGF0ZWQgZnVuY3Rpb25zLCBlZwoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgb3ZlcmxvYWQoVCB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnQgb3ZlcmxvYWQoVCB0LCBjb25zdCBUICZyKTsKCiAgICAgICAgICAgIC0gRml4ZXMgd2hlcmUgdGhlIHRlbXBsYXRlZCB0eXBlIGlzIG5vdCB1c2VkIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCwgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCB4eXooKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgeHl6PGRvdWJsZT4oKTsKCiAgICAgICAgICAgIC0gRml4ZXMgZm9yIG92ZXJsb2FkaW5nIG9mIHBsYWluIGZ1bmN0aW9ucyBieSBhIHRlbXBsYXRlZCBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgdm9pZCBhYmMoZG91YmxlIGQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWJjKFQgdCk7CgogICAgICAgICAgICAtIE92ZXJsb2FkaW5nIGJ5IHRlbXBsYXRlZCBwYXJhbWV0ZXJzIGZpeGVkOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGZvbyhUIHQpIHt9CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gdm9pZCBmb28oVCB0LCBVIHUpIHt9CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShmb28pIGZvbzxkb3VibGUsIGRvdWJsZT47CgogICAgICAgICAgICAtIEFsbCBjb21iaW5hdGlvbnMgb2YgdGhlIGFib3ZlIGFsc28gd29ya2luZyBpbmNsdWRpbmcgc3BlY2lhbGl6YXRpb25zLCBlZzoKCiAgICAgICAgICAgICAgdm9pZCBhYmMoZG91YmxlIGQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYWJjKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYzxkb3VibGU+KGRvdWJsZSB0KTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IHZvaWQgYWJjKGludCB0KTsKCjEwLzE2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlbW92ZSB0aGUgYWJpbGl0eSB0byBzaGFyZSB0eXBlIGluZm9ybWF0aW9uIGJ5IHVzaW5nIGMgbGlua2luZy4KICAgICAgICAgICAgICBBbGwgdHlwZSBzaGFyaW5nIGhhcHBlbnMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICAgICAgKyBSZW1vdmUgU1dJR19OT0lNUE9SVCwgU1dJR19SVU5USU1FLCBhbmQgcmVsYXRlZCBkZWZpbmVzLgogICAgICAgICAgICAgICAgKyBEZXByZWNhdGUgLXJ1bnRpbWUsIC1ub3J1bnRpbWUgY29tbWFuZCBsaW5lIG9wdGlvbnMKICAgICAgICAgICAgICAgICsgVXBkYXRlIHRlc3Qtc3VpdGUgY29tbW9uLm1rIHRvIGNvcnJlY3RseSBidWlsZCBtdWx0aWNwcHRlc3QKICAgICAgICAgICAgICAgICsgUmVtb3ZlIHJlZmVyZW5jZSB0byBwcmVjb21tb24uc3dnCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0aGUgZ3VpbGVfZ2ggaW50ZXJmYWNlIHRvIHNoYXJlIGRhdGEgYnkgYSBnbG9iYWwgdmFyIGluc3RlYWQKICAgICAgICAgICAgICAgICAgb2YgYyBsaW5rYWdlLgoKICAgICAgICAgICAgLSBSZW1vdmUgQWR2YW5jZWQuaHRtbCwgc2luY2UgZXZlcnl0aGluZyBpbiBpdCBpcyBub3cgb2Jzb2xldGUKCjEwLzA5LzIwMDQ6IG1tYXR1cwoJICAgIC0gU3BsaXQgdGhlIHB5dGhvbiBzdGQvU1RMIEMrKyBsaWJyYXJ5IGZpbGVzLCBub3cKCSAgICAgIGFsbCB0aGUgbGFuZ3VhZ2UgaW5kZXBlbmRlbnQgZGVmaW5pdGlvbnMgYXJlIHVuZGVyCgkgICAgICB0aGUgZGlyZWN0b3J5CgkgICAgICAKCQlMaWIvc3RkCgoJICAgICAgYW5kIGhlbmNlLCBjYW4gYmUgdXNlZCBmcm9tIG90aGVyIGxhbmd1YWdlcy4KCgkgICAgLSBBZGQgbW9yZSBkb2N1bWVudGF0aW9uIHRvIHRoZSBQeXRob24gU1RMLCBhbmQKCSAgICAgIGNsZWFuIHVubmVjZXNzYXJ5IGNvZGUuCgoJICAgIC0gQWRkIGluaXRpYWwgQzk5IGNvbXBsZXggc3VwcG9ydCwgYW5kIHNvbWUgZml4ZXMKCSAgICAgIGZvciBsb25nIGRvdWJsZS4KCjEwLzA4LzIwMDQ6IG1tYXR1cwoJICAgIC0gRml4IHRoZSBTd2lnVmFsdWVXcmFwcGVyIGZvciBvcGFxdWUgdHlwZXMsIG5vdyBpdCBpcyAKCSAgICAgIGFwcGxpZWQgZm9yIG9wYXF1ZSB0ZW1wbGF0ZXMgYW5kIGNsYXNzZXMsIGZvciB3aGljaCB3ZQoJICAgICAgZG9uJ3Qga25vdyBpZiB0aGVyZSBpcyBvciBub3QgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLCBpZQoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7IAogICAgICAgICAgICAgICAgICAgQShpbnQpOwogICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICBTdGlsbCwgaWYgeW91IGtub3cgdGhhdCB5b3UgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBhbmQgZm9yIHNvbWUgdmVyeSB2ZXJ5IHBhcnRpY3VsYXIgcmVhc29uCiAgICAgICAgICAgICAgeW91IHdhbnQgdG8gYXZvaWQgdGhlIFN3aWdWYWx1ZVdyYXBwZXIsIGFuZCB5b3UgZG9uJ3QKICAgICAgICAgICAgICB3YW50IG9yIGNhbid0IGV4cG9zZSB0aGUgY2xhc3MgdG8gc3dpZywgbm93IHlvdSBjYW4KICAgICAgICAgICAgICBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vdmFsdWV3cmFwcGVyIikgQTsgICAgCiAgICAgICAgICAgICAgICAgY2xhc3MgQTsKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgb3IgdGhlIG90aGVyIHdheSBhcm91bmQsIGlmIHRoZSBjbGFzcyBoYXMgYSBkZWZhdWx0CiAgICAgICAgICAgICAgY29uc3RydWN0b3IsIGJ1dCB5b3Ugd2FudCB0byB1c2UgdGhlIHZhbHVlIHdyYXBwZXIsIHlvdQogICAgICAgICAgICAgIGNhbiBzYXkKCiAgICAgICAgICAgICAgICAgJWZlYXR1cmUoInZhbHVld3JhcHBlciIpIEE7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoKTsKCQkgICAuLi4uCiAgICAgICAgICAgICAgICAgfTsgICAKICAgICAgCgkgICAgLSBGaXggZm9yIGNoYXIgPiAxMjgsIGllCgogICAgICAgICAgICAgICAgY29uc3QgY2hhciB0aWxkZV9hID0gJ1wzNDEnOwoKICAgICAgICAgICAgLSBBZGQgcGF0Y2ggMTA0MTg1OCBmb3IgJGxleHR5cGUsIHdoaWNoIGNhcnJpZXMgdGhlIAogICAgICAgICAgICAgIGxpdGVyYWwgdHlwZSBvZiBhIHN5bWJvbC4gU2VlIGxleHR5cGUuaSBpbiB0aGUKICAgICAgICAgICAgICB0ZXN0LXN1aXRlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAKCjEwLzA3LzIwMDQ6IHdzZnVsdG9uCgkgICAge1J1YnksIEphdmFdIEZpeCBkaXJlY3RvciArICdlbXB0eScgdGhyb3dzCgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgQSgpIHRocm93KCk7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgICAgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgoKMTAvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtUQ0xdCiAgICAgICAgICAgIC0gRml4IGJ1ZyByZXBvcnRlZCBieSBXaWxsaWFtIEEuIEhvZmZtYW4gcHJvcGFnYXRpbmcgY2xpZW50ZGF0YQogICAgICAgICAgICBiZXR3ZWVuIG1vZHVsZXMuICBBZGRlZCBjbGllbnRkYXRhX3Byb3AubXVsdGljcHB0ZXN0IHRvIGNoZWNrIGZvcgogICAgICAgICAgICB0aGlzIGJ1Zy4gIFRoZSBmaXggaW52b2x2ZWQgdGhlIGZvbGxvd2luZyBjaGFuZ2VzOgogICAgICAgICAgICAgICAgKyBTd2lnVHlwZV9jbGllbnRkYXRhX2NvbGxlY3QgZG9lcyBub3QgbmVlZCB0byBjaGVjawogICAgICAgICAgICAgICAgdHlwZXMgaW4gcl9yZXNvbHZlZCBiZWNhdXNlIHdlIG9ubHkgd2FudCB0byBwcm9wYWdhdGUgY2xpZW50ZGF0YQogICAgICAgICAgICAgICAgdG8gdHlwZWRlZmVkIGNsYXNzZXMsIGFuZCByX21hbmdsZWQgYWxyZWFkeSB0YWtlcyBjYXJlIG9mIHR5cGVkZWZzLgoKICAgICAgICAgICAgICAgICsgU1dJR19UeXBlUmVnaXN0ZXIgbm93IGNvcGllcyB0aGUgY2xpZW50ZGF0YSBmaWVsZCBjb3JyZWN0bHkKCiAgICAgICAgICAgICAgICArIE1vdmUgU1dJR19HdWlsZV9Qcm9wYWdhdGVDbGllbnREYXRhIGZ1bmN0aW9uIGZyb20gZ3VpbGUgbW9kdWxlCiAgICAgICAgICAgICAgICBpbnRvIGNvbW1vbi5zd2csIGJlY2F1c2Ugd2UgbmVlZCB0byBjYWxsIGl0IGZyb20gYm90aCBndWlsZSBhbmQgdGNsLgoKICAgICAgICAgICAgICAgICsgQWRkIGJhc2VfbmFtZXMgdG8gc3dpZ19jbGFzcyB0byBkZWxheSB0aGUgbG9va3VwIG9mIGJhc2VzLiAgU1dJRwogICAgICAgICAgICAgICAgbm93IGV4cG9ydHMgdGhlIGJhc2UgbmFtZXMgYW5kIG9ubHkgd2hlbiB0aGUgYmFzZSBzd2lnX2NsYXNzIGlzCiAgICAgICAgICAgICAgICBuZWVkZWQgaXMgU1dJR19UeXBlUXVlcnkobmFtZSktPmNsaWVudGRhdGEgbG9va2VkIHVwLgoKICAgICAgICAgICAgLSBjb252ZXJzaW9uX25zX3RlbXBsYXRlIHRlc3RzdWl0ZSB0ZXN0IHdhcyBmYWlsaW5nIGJlY2F1c2UKICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZWQgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzIG5vdCBjYWxjdWxhdGVkCiAgICAgICAgICAgIGNvcnJlY3RseSBmb3Igc3RydWN0cy4gIEZpeGVkLgoKMTAvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGRlZmF1bHQgYXJndW1lbnRzIHVzZWQgaW4gZGlyZWN0b3JzIC0gaW4gdmlydHVhbAogICAgICAgICAgICBtZXRob2RzIGFuZCBkaXJlY3RvciBjb25zdHJ1Y3RvcnMuCgoxMC8wNi8yMDA0OiBtbWF0dXMKCSAgICBGaXggdGhlIF9fY3BsdXNwbHVzIG1hY3JvLCBhbmQgYnVnIDEwNDExNzAuCgkgICAgTm93IGl0IGlzIHdvcmtpbmcgYXMgc3VwcG9zZWQsIGllLCB5b3UgY2FuIHNhZmVseSB1c2UKCgkgICAgICAjaWZkZWYgX19jcGx1c3BsdXMKCSAgICAgIC4uLgoJICAgIAoJICAgIGFsbCBvdmVyIHN3aWcsIGluY2x1ZGluZyBpbnNpZGUgJWRlZmluZXMgYW5kICV7ICV9IGJvZGllcy4KCgkgICAgCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlIG9sZCB0cmljayBvZiB1c2luZwoKCSAgICAgICNpZiBfX2NwbHVzcGx1cwoKCSAgICBkb2Vzbid0IHdvcmsgYW55IG1vcmUuIFNvLCBpZiB5b3UgaGF2ZSB5b3VyIG93biB0eXBlbWFwcwoJICAgIHVzaW5nIHRoYXQgc3ludGF4LCB5b3Ugd2lsbCBuZWVkIHRvIG1pZ3JhdGUgdGhlbSB0byB1c2UKCSAgICAiI2lmZGVmIF9fY3BsdXNwbHVzIi4KCjEwLzA1LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICAtIFJlb3JnYW5pemUgaG93IHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgYW5kIHNoYXJlZAoJICAgIGJldHdlZW4gbW9kdWxlcy4gIEZvciBjaGlja2VuIGFuZCBtenNjaGVtZSwgSSByZW1vdmVkCgkgICAgdGhlIGFiaWxpdHkgdG8gdXNlIHJ1bnRpbWUgbGlicmFyaWVzLCB3aGlsZSBwZXJsLCB0Y2wsIHB5dGhvbiwgYW5kCgkgICAgcnVieSBkZWZhdWx0IHRvIHVzaW5nIHRoZSBuZXcgbWV0aG9kIGJ1dCBjYW4gZ28gYmFjayB0byB0aGUgb2xkCgkgICAgbWV0aG9kIGJ5IGRlY2xhcmluZyBTV0lHX0FMTE9XX1JVTlRJTUUuCgoJICAgIC0gbGluZSA1ODIgaW4gbXpzY2hlbWUuY3h4IHdhcyBnZW5lcmF0aW5nIGEgc2VnZmF1bHQgb24gCgkgICAgaW1wb3J0cy5tdWx0aWNwcHRlc3QsIHNvIEkgZml4ZWQgaXQuCgoxMC8wNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgJWV4dGVuZCBhbmQgb3ZlcmxvYWRlZCBzdGF0aWMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzLgoKMTAvMDUvMjAwNDogbW1hdHVzCgkgICAgLSBbcHl0aG9uXSBGaXggZGlyZWN0b3IgKyBtZXRob2Qgd2l0aCAnZW1wdHknIHRocm93LCBpZQoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIHZpcnR1YWwgaW50IGZvbygpIHRocm93KCk7CgkJICAgIH07CgkJICAgIAoJICAgICAgb3RoZXIgbGFuZ3VhZ2VzIHNob3VsZCBhbHNvIGVhc3kgdG8gZml4LCBsb29rIGZvcgoJICAgICAgR2V0YXR0cihuLCJ0aHJvdyIpIGluIHB5dGhvbi5jeHguCgoJICAgIC0gRml4IGRpcmVjdG9yICsgZGVzdHJ1Y3RvciB3aXRoICdlbXB0eScgdGhyb3cKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIH5BKCkgdGhyb3coKTsKCQkgICAgfTsKCgkgICAgLSBOb3cgU1dJR19GRUFUVVJFUyBwYXJzZSBhbGwgYW5kIHRoZSBzYW1lICBvcHRpb25zIHlvdQogICAgICAgICAgICAgIGNhbiBwYXNzIHRvIHN3aWcgaW4gdGhlIGNvbW1hbmQgbGluZS4KCSAgICAgIAoJICAgIC0gTmV3IGNvbW1hbmQgbGluZSBmbGFnOiAtZmVhdHVyZXMgPGxpc3Q+LCBhcyBpbgoKCSAgICAgICAgc3dpZyAtZmVhdHVyZXMgYXV0b2RvYz0zLGRpcmVjdG9yCgoJICAgICAgaWUsIGFueSBnbG9iYWwgZmVhdHVyZSBjYW4gYmUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKCSAgICAgIGNvbW1hbmQgbGluZS4gVGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcsIGJ1dCB1c2VycwoJICAgICAgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuCgoxMC8wNC8yMDA0OiBtbWF0dXMKCSAgICAtIFByb3Blcmx5IHF1YWxpZnkgdHlwZSBpbiBzeW50YXggYXMgJ2xvbmcoMiknIG9yICdGb28oKScsCgkgICAgICB0aGlzIHNvbHZlIG9sZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmdzLCBhbmQgcHJvYmFibHkKCSAgICAgIG90aGVyIHByb2JsZW1zIGFyb3VuZC4gSG93ZXZlciwgdGhlIGRlZmF1bHQgYXJnIHByb2JsZW0KCSAgICAgIHdhcyBhbHNvIGFscmVhZHkgc29sdmVkIGJ5IFdpbGxpYW0gKHNlZSBiZWxvdykuCgoJICAgIC0gRml4IGZlYXR1cmVfc2V0IGFuZCBmZWF0dXJlX2dldCBtZXRob2RzLiBCZWZvcmUKCSAgICAgIHRoZXkgbG9vayBmcm9tIHBhcnRpY3VsYXIgdG8gZ2VuZXJhbCBhbmQga2VlcCB0aGUgZmlyc3QKCSAgICAgIGZlYXR1cmUgZm91bmQuIFRoaXMgZGlkbid0IHdvcmsgd2VsbCB3aXRoIHRlbXBsYXRlcy4KCSAgICAgIE5vdyB0aGUgbWV0aG9kcyBsb29rIGZyb20gZ2VuZXJhbCB0byBwYXJ0aWN1bGFyLCBhbmQKCSAgICAgIG92ZXJyaWRlIGFueSBmb3VuZCBmZWF0dXJlLgoKICAgICAgICAgICAgLSBQcmV2aW91c2x5IGEgZmVhdHVyZSBjb3VsZCBub3QgYmUgYXBwbGllZCB0byBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgICBvciBkZXN0cnVjdG9ycyB0aGF0IHdlcmVuJ3QgZXhwbGljaXRseSBkZWNsYXJlZCBpbiB0aGUgY2xhc3MuCiAgICAgICAgICAgICAgVGhpcyBpcyBub3cgZml4ZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIEZvbygpICIuLi4iCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiKSB+Rm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC8vIGltcGxpY2l0IEZvbygpIGFuZCB+Rm9vKCkKICAgICAgICAgICAgICAgIH07CgoJICAgIC0gRml4IG1pc3NpbmcgZmVhdHVyZXMgZm9yIGRlZmF1bHQgY29uc3QvZGVzdCwgYnkgcmVhbGx5CgkgICAgICAnY3JlYXRpbmcnIHRoZSBtZXRob2RzIGFuZCBhcHBseWluZyB0aGUgZmVhdHVyZXMuCgoJICAgIC0gRml4IHJldHVybl9jb25zdF92YWx1ZS5pIGNhc2UgYnkgYWRkaW5nIFN3aWdWYWx1ZVdyYXBwZXI8Y29uc3QgVD4KCSAgICAgIHNwZWNpYWxpemF0aW9uLgoKCSAgICAtIEZpeCAlZXh0ZW5kICsgb3ZlcmxvYWQsIGluY2x1ZGluZyBvdmVybG9hZGluZyBhY3R1YWwKICAgICAgICAgICAgICBjbGFzcyBtZXRob2RzLiAKCgkgICAgLSBBZGRpbmcgbW9yZSBjYXNlcyBpbiByZWxhdGVkIGZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlLiAgCgoxMC8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSB3YXkgZGVmYXVsdCBhcmd1bWVudHMgYXJlIHdyYXBwZWQuIFByZXZpb3VzbHkgYSBzaW5nbGUKICAgICAgICAgICAgbWV0aG9kIHdhcyBnZW5lcmF0ZWQgZm9yIGVhY2ggbWV0aG9kIHRoYXQgaGFkIGRlZmF1bHQgYXJndW1lbnRzLiBJZgogICAgICAgICAgICBhIG1ldGhvZCBoYWQgNSBhcmd1bWVudHMsIHNheSwgb2Ygd2hpY2ggMSBoYWQgYSBkZWZhdWx0IGFyZ3VtZW50CiAgICAgICAgICAgIHRoZW4gdGhlIGNhbGwgdG8gdGhlIHdyYXBwZWQgbWV0aG9kIHdvdWxkIHBhc3MgNSBhcmd1bWVudHMuIFRoZSBkZWZhdWx0CiAgICAgICAgICAgIHZhbHVlIHdhcyBjb3BpZWQgaW50byB0aGUgd3JhcHBlciBtZXRob2QgYW5kIHVzZWQgaWYgdGhlIHNjcmlwdGluZwogICAgICAgICAgICBsYW5ndWFnZSBwYXNzZWQganVzdCA0IGFyZ3VtZW50cy4gSG93ZXZlciwgdGhpcyB3YXMgZmxhd2VkIGFzIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50IHNvbWV0aW1lcyBkb2VzIG5vdCBoYXZlIGdsb2JhbCBhY2Nlc3MsIGZvciBleGFtcGxlCiAgICAgICAgICAgIFNXSUcgd291bGQgZ2VuZXJhdGUgY29kZSB0aGF0IGNvdWxkbid0IGNvbXBpbGUgd2hlbiB3cmFwcGluZzoKCiAgICAgICAgICAgICAgY2xhc3MgVHJpY2t5IHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsID0gcHJpdmF0ZXZhbHVlKTsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB2YWwgPSBUcmlja3k6OmdldERlZmF1bHQoKSk7CiAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgZ2V0RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgZW51bSB7IHByaXZhdGV2YWx1ZSA9IDIwMCB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBbHNvIGJ1Z3MgaW4gcmVzb2x2aW5nIHN5bWJvbHMgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlLCBmb3IgZXhhbXBsZQogICAgICAgICAgICAocHJvYmFibHkgZml4YWJsZSB0aG91Z2gpOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UgewogICAgICAgICAgICAgICAgY2xhc3MgS2xhc3MgewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIEtsYXNzIGNvbnN0cnVjdG9yY2FsbChjb25zdCBLbGFzcyYgayA9IEtsYXNzKCkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBhcHByb2FjaCBhbHNvIGRvZXMgbm90IHdvcmsgZm9yIHN0YXRpY2FsbHkgdHlwZWQgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkKICAgICAgICAgICAgYXMgdGhlc2UgbGFuZ3VhZ2VzIGRvIG5vdCBhbGxvdyBtZXRob2RzIHRvIGhhdmUgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICAgICAgICAgQWx0aG91Z2ggQyMgaGFzIGEgbWVjaGFuaXNtIHRvIHBhc3MgYSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHRoZXkKICAgICAgICAgICAgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFuZCBhcmUgbW9yZSBsaWtlIHZhcmFyZ3MuCgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIHNvbHZlcyB0aGUgYWJvdmUgcHJvYmxlbXMgYW5kIHdyYXBzIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLiBTbyBTV0lHIHdpbGwgbm93IHRyZWF0CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhcyBpZiBpdCBoYWQgcGFyc2VkOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQpOwogICAgICAgICAgICAgIHZvaWQgZm9vKCk7CgogICAgICAgICAgICBUaGUgY29kZSBnZW5lcmF0ZWQgaXMgdGhlbiBleGFjdGx5IHRoZSBzYW1lIGFzIGlmIFNXSUcgaGFkIHBhcnNlZCB0aGUgdHdvCiAgICAgICAgICAgIG92ZXJsb2FkZWQgbWV0aG9kcy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgY291bnQgdGhlIGFyZ3VtZW50cyBwYXNzZWQgYW5kIGNhbGwKICAgICAgICAgICAgdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCwganVzdCBsaWtlIG92ZXJsb2FkZWQgbWV0aG9kcy4gQyMgYW5kIEphdmEgYXJlIG5vdyBhYmxlCiAgICAgICAgICAgIHRvIHByb3Blcmx5IHdyYXAgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGJ5IGdlbmVyYXRpbmcgZXh0cmEgbWV0aG9kcywKICAgICAgICAgICAgYWdhaW4gYXMgaWYgdGhlIG1ldGhvZCB3YXMgb3ZlcmxvYWRlZCwgc28gZm9yOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcz0iaGVsbG8iLCBkb3VibGUgZD0xMC4wLCBpbnQgaT0wKTsKCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgcHJveHkgbWV0aG9kcyBhcmUgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQsIGludCBpKTsKICAgICAgICAgICAgICB2b2lkIGJhcihzdHJpbmcgcywgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzKTsKICAgICAgICAgICAgICB2b2lkIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5ldyBhcHByb2FjaCBjb21lcyB3aXRoIGEgY291cGxlIG9mIG1pbm9yIGtub2NrIG9uIGVmZmVjdHMuCgogICAgICAgICAgICAxKSBTV0lHIHN1cHBvcnQgZm9yIGRlZmF1bHQgYXJndW1lbnRzIGZvciBDIChub3QgQysrKSBjb2RlIG5vIGxvbmdlciB3b3Jrcy4KICAgICAgICAgICAgUHJldmlvdXNseSB5b3UgY291bGQgaGF2ZSB0aGlzIGludGVyZmFjZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CgogICAgICAgICAgICBhbmQgY2FsbCB0aGUgd3JhcHBlZCBtZXRob2QgZnJvbSBhIHNjcmlwdGluZyBsYW5ndWFnZSBhbmQgcGFzcyBubyBhcmd1bWVudHMKICAgICAgICAgICAgd2hlcmV1cG9uIHRoZSBkZWZhdWx0IG9mIDAgd2FzIHVzZWQuIFlvdSBjYW4gZ2V0IHRoZSBzYW1lIGJlaGF2aW91ciBmb3IgQwogICAgICAgICAgICBjb2RlIGJ5IHVzaW5nIHRoZSAiZGVmYXVsdCIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoZGVmYXVsdCkgaW50IHZhbCAiJDEgPSAwOyI7CiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsKTsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwoKICAgICAgICAgICAgb3IgeW91IGNvdWxkIG9mIGNvdXJzZSBjb21waWxlIHlvdXIgY29kZSBhcyBDKysgaWYgeW91IHdhbnQgQysrIGZlYXR1cmVzIDopIDoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIEEgY291cGxlIG9mIFNXSUcncyBsaWJyYXJpZXMgdXNlZCB0aGlzIEMgZXh0ZW5zaW9uIGFuZCB0aGVzZSBoYXZlIGJlZW4gbW9kaWZpZWQKICAgICAgICAgICAgdG8gdXNlIHRoZSAiZGVmYXVsdCIgdHlwZW1hcC4gVGhlICJkZWZhdWx0IiB0eXBlbWFwIGlzIHRodXMgdW5jaGFuZ2VkIChhbmQgc3RpbGwKICAgICAgICAgICAgaXMgbm90IGFuZCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkIGJ5IEMjIGFuZCBKYXZhLCBhbmQgaXMgbGlrZWx5IHRvIHJlbWFpbiBzbykuCgoKICAgICAgICAgICAgMikgQWxsIGZlYXR1cmVzICglZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSBldGMpIG5vIGxvbmdlciB3b3JrIGFzIGlmIHRoZSBtZXRob2QKICAgICAgICAgICAgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBpcyBqdXN0IG9uZSBtZXRob2QuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CgogICAgICAgICAgICB3b3VsZCBoYXZlIGlnbm9yZWQgdGhlIG1ldGhvZCBjb21wbGV0ZWx5LiBOb3cgaXQgd2lsbCBvbmx5IGlnbm9yZSBmb28oaW50KSBidXQKICAgICAgICAgICAgbm90IHRoZSBleHRyYSBmb28oKSBtZXRob2QuIEluc3RlYWQgdXNlOgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbzsKCiAgICAgICAgICAgIHRvIGlnbm9yZSB0aGVtIGFsbC4gb3IKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICAlaWdub3JlIGZvbygpOwoKICAgICAgICAgICAgVGhpcyBvZiBjb3Vyc2UgYWxsb3dzIG9uZSB0byBmaW5lIHR1bmUgdGhlIHdyYXBwaW5nLCBmb3IgZXhhbXBsZSBvbmUgY291bGQgdXNlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2ludCkgZm9vKGludCk7CiAgICAgICAgICAgICAgJXJlbmFtZShmb29kZWZhdWx0cykgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZW0gZnJvbSBhbnkgbGFuZ3VhZ2UgbGlrZSBzbzoKCiAgICAgICAgICAgICAgZm9vaW50KDIwMCkKICAgICAgICAgICAgICBmb29kZWZhdWx0cygpCgogICAgICAgICAgICBvciBmb3IgZXhhbXBsZSBpZ25vcmUgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kLCBzbyB0aGUgZGVmYXVsdHMgY2Fubm90IGJlIHVzZWQ6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzIvMjAwNDogbW1hdHVzCgkgICBbUHl0aG9uXQoJICAgLSBNb3JlIGNsZWFuaW5nIHVwIGFuZCB1bmlmb3JtYXRpb24gb24gdGhlIFB5dGhvbiBMaWIKCgkgICAtIEFkZGVkIFJvYmluJ3MgZG9jc3RyaW5nIHBhdGNoLCBwbHVzIHNvbWUgZml4ZXMsIHBsdXMKCSAgICAgc29tZSBleHRlbnNpb25zLCBzZWUgYXV0b2RvYy5pIGV4YW1wbGUgaW4gdGhlIHRlc3Qtc3VpdGUsCgkgICAgIGFuZCB0cnkgdXNpbmcgJWZlYXR1cmUoImF1dG9kb2MiLCJleHRlbmRlZCIpLgoJICAgIAoJICAgICBUaGlzIHBhdGNoIGlzIG5vdCBhIGNvbXBsZXRlIHNvbHV0aW9uIGZvciB0aGUKCSAgICAgZG9jdW1lbnRhdGlvbiBwcm9ibGVtLCBqdXN0IGVub3VnaCB0byBpbmZvcm0gcHl0aG9uIGFib3V0CgkgICAgIHRoZSBwYXJhbWV0ZXIgbGlzdC4KCgkgICAgIFRoZSBleHBlY3RlZCBzd2lnIGRvY3VtZW50YXRpb24gc3VwcG9ydCBpcyBmYXIgZmFyIGF3YXkgeWV0LgoJICAgICAKCjEwLzEvMjAwNDogbW1hdHVzCgkgICAtIEZpeCB0aGUgJWNhbGxiYWNrIGZlYXR1cmUgKG9ubHkgdXNlZCBpbiBydWJ5IGFuZCBweXRob24gZXhhbXBsZXMsCgkgICAgIGJ5IG5vdywgYnV0IGl0IHNob3VsZCBiZSBnZW5lcmljKSwgbm93IG1lbWJlciBjYWxsYmFja3MKCSAgICAgYXJlIHdvcmtpbmcgYWdhaW4KCSAgICAgCgkgICAtIEZpeCB3cmFwcGluZyBvZiBmdW5jdGlvbnMgcG9pbnRlcnMgbGlrZQoKCQkgc3RkOjpvc3RyZWFtJiBzdGQ6OmVuZGwoc3RkOjpvc3RyZWFtJik7CgoJICAgICBpZSwgdGhlIG9uZXMgdGhhdCByZXR1cm4gcmVmZXJlbmNlcyBvciBlbnVtcy4KCSAKCSAgIFtQeXRob25dIEFkZCB0aGUgJXB5dGhvbmNhbGxiYWNrIGRpcmVjdGl2ZSwgd2hpY2ggaXMgCgkgICBhbiBpbXByb3ZlZCB2ZXJzaW9uIG9mICVjYWxsYmFjaywgaWUsCgoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgZm9vOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFyOwoJICAgICAlcHl0aG9uY2FsbGJhY2soMSkgQTo6YmFybTsKCgkgICAgIGludCBmb28oaW50IGEpIHsKCSAgICAgICAgIHJldHVybiBhOwoJICAgICB9CiAgCgkgICAgIHN0cnVjdCBBIAoJICAgICB7CgkgICAgICAgc3RhdGljIGludCBiYXIoaW50IGEpOwoJICAgICAgIGludCBiYXJtKGludCBhKTsKCgkgICAgIH07CgogICAgICAgICAgICAgaW50IGZvb2JhcihpbnQgYSwgaW50ICgqcGYpKGludCBhKSk7CgoJICAgaW4gcHl0aG9uIHlvdSBjYW4gdXNlCgogICAgICAgICAgICAgZm9vKDIpCgkgICAgIGZvb2JhcigyLGZvbykKICAgICAgICAgICAgIEEuYmFyKDIpCgkgICAgIGZvb2JhcigyLEEuYmFyKQogICAgICAgICAgCiAgICAgICAgICAgaWUsIG5vIGFkZGl0aW9uYWwgcG9pbnRlciBlbGVtZW50cyBhcmUgY3JlYXRlZCwgYW5kCgkgICB0aGUgb3JpZ2luYWwgJ2ZvbycgYW5kICdBLmJhcicgY2FuIGJlIHVzZWQgYXMgcGFyYW1ldGVycy4KCgkgICBJbiB0aGUgY2FzZSBvZiBtZW1iZXIgZnVuY3Rpb24gaG93ZXZlciwgc3RpbGwgeW91IG5lZWQKCSAgIHRvIHVzZSB0aGUgc3BlY2lhbCB2YXJpYWJsZSBDbGFzczo6PGZuY19uYW1lPl9jYl9wdHIsIGllOgoKIAkgICAgIGZvb2Jhcm0oMywgYSwgQS5iYXJtX2NiX3B0cikKCSAgIAoJICAgd2Ugd2lsbCB0cnkgdG8gZml4IHRoaXMgc2l0dWF0aW9uIGFsc28sIGJ1dCBsYXRlci4gIAoKCSAgIFtQeXRob25dIEFkZCBtb3JlIGVsZW1lbnRzIGZyb20gdGhlIFNUTCBsaWJyYXJ5LCBub3cKCSAgIHlvdSBjYW4gdXNlCgoJICAgICBpbXBvcnQgc3RkCgkgICAgIHN0ZC5jb3V0IDw8ICJoZWxsbyAiIDw8IDEyMyA8PCBzdGQuZW5kbAoKCSAgIFtQeXRob25dIEZpeCBpbi9vdXQgcmV0dXJuIG1lY2hhbmlzbSwgbm93IHN3aWcgd2lsbCBiZWhhdmUKCSAgIGFzIDEuMy4yMSBidXQgdXNpbmcgYSBweXRob24gbGlzdCB3aGVuIG5lZWRlZC4gVGhlIHByb2JsZW0KCSAgIGlzIHRoYXQgdGhlIHR5cGVzIHN0ZDo6cGFpcixzdGQ6OnZlY3RvcixldGMsIHVzZSB0dXBsZXMsCgkgICBhbmQgdGhleSBpbnRlcmZlciB3aXRoIHRoZSBwcmV2aW91cyBpbm91dCB0dXBsZSB0eXBlLgoKCSAgIEJ5IHVzaW5nIGxpc3RzIHdlIHNvbHZlIHRoZSBjb25mbGljdHMsIHN3aWcgYWN0cyBhcyBiZWZvcmUsCgkgICBidXQgcmV0dXJucyBhIGxpc3Qgd2hlbiBtb3JlIHRoYW4gb25lIHBhcmFtZXRlciBhcmUgdXNpbmcKCSAgIHRoZSBPVVQgdHlwZW1hcC4gU2VlIHRoZSBuZXcgaW5vdXQuaSBleGFtcGxlIGluIHRoZQoJICAgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJCSAgIAogICAgICAgICAgIFtQeXRob25dIE11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBiYWQgYXJndW1lbnRzLCBub3cKCSAgIHlvdSBhbHdheXMgZ2V0IHRoZSBhcmd1bWVudCBudW1iZXIgd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgoKMDkvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSAtCiAgICAgICAgICAgIDEpIFdhcm5pbmcgZW1pdHRlZCB3aGVuIC1pbXBvcnRhbGwgYW5kIC1pbmNsdWRlYWxsIGlzIHVzZWQgdG9nZXRoZXIsCiAgICAgICAgICAgICAgIHdpdGggLWluY2x1ZGVhbGwgdGFraW5nIHByZWNlZGVuY2UuCiAgICAgICAgICAgIDIpIEVuc3VyZSBTV0lHSU1QT1JURUQgaXMgYWx3YXlzIGRlZmluZWQgd2hlbiBhIGZpbGUgaXMgYmVpbmcKICAgICAgICAgICAgICAgaW1wb3J0ZWQgd2l0aCAlaW1wb3J0LiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgU1dJR0lNUE9SVCwKICAgICAgICAgICAgICAgd2hpY2ggZ2V0cyBkZWZpbmVkIGluIGFsbCBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlcy4KCjA5LzI2LzIwMDQ6IG1tYXR1cwoKCSAgICAtIGFkZCAlZmVhdHVyZSgiZXhjZXB0aW9uY2xhc3MiKSB0byBpZGVudGlmeSBhIGNsYXNzIHVzZWQKCSAgICAgIGFzIGV4Y2VwdGlvbi4gQmVmb3JlIHN3aWcgaWRlbnRpZmllZCBhbmQgbWFya2VkIGEgY2xhc3MKCSAgICAgIHVzaW5nIHRoZSAiY3BsdXM6ZXhjZXB0aW9uY2xhc3MiIGF0dHJpYnV0ZS4gSG93ZXZlciwgdGhlCgkgICAgICBjbGFzcyBuZWVkZWQgdG8gYXBwZWFyIG9uIGFuIHRocm93KCkgc3RhdGVtZW50LiAgTm93CgkgICAgICBzd2lnIGtlZXBzIHRyeWluZyB0byBpZGVudGlmeSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMsIGFzCgkgICAgICBiZWZvcmUsIGJ1dCBpdCBhbHNvIGFsbG93cyB0aGUgdXNlciB0byBtYXJrIGEgY2xhc3MgYnkKCSAgICAgIHVzaW5nIHRoZSAlZmVhdHVyZSBleHBsaWNpdGx5LiAobW9zdGx5IHJlbGV2YW50IGZvcgoJICAgICAgcHl0aG9uIGFuZCBjaGlja2VuKQoKCSAgICBbUHl0aG9uXQoKCSAgICAtIGZpeCAtbW9kZXJuIG9wdGlvbiArIGV4Y2VwdGlvbnMsIHdoaWNoIG1peCBvbGQgY2xhc3MKCSAgICAgIHN0eWxlIHdpdGggdGhlIG5ldyBvbmUuIFNvLCB3ZSBhbHdheXMgbmVlZCB0byBlbWl0CgkgICAgICB0aGUgIm5vbm1vZGVybiIgcHl0aG9uIGNvZGUuCgoJICAgIC0gYWRkIHRoZSAicHl0aG9uOm5vbmR5bmFtaWMiIGZlYXR1cmUgYW5kIGl0cyBoYW5kbGVyCgoJICAgICAgbm93IGlmIHlvdSBoYXZlCgkgICAgICAKCSAgICAgICVweXRob25ub25keW5hbWljIEE7CgkgICAgICAKCSAgICAgIHN0cnVjdCBBIHsKCSAgICAgICBpbnQgYTsKCSAgICAgICBpbnQgYjsKCSAgICAgIH07CgoJICAgICAgdGhlbiwgaW4gdGhlIHB5dGhvbiBzaWRlCgkgICAgICAKCSAgICAgIGFhID0gQSgpCgkgICAgICAKCSAgICAgIGFhLmEgPSAxICMgb2sKCSAgICAgIGFhLmIgPSAyICMgb2sKCSAgICAgIGFhLmMgPSAzICMgZXJyb3IsIHRoZSBjbGFzcyBjYW4gbm90IGJlIGV4dGVuZGVkIGR5bmFtaWNhbGx5LgoKCSAgICAKCSAgICBTaW5jZSB0aGlzIGlzIGEgZmVhdHVyZSwgeW91IGNhbiB1c2UKCgkgICAgICAlcHl0aG9ubm9uZHluYW1pYzsKCiAgICAgICAgICAgIG9yIAoKCSAgICAgICVweXRob25keW5hbWljOyBbIE5vdGU6ICVweXRob25keW5hbWljIHNpbmNlIGRlcHJlY2F0ZWQgXQogICAKCSAgICB0byBmb3JjZSBhbGwgdGhlIHdyYXBwZWQgY2xhc3NlcyB0byBiZSAibm9uZHluYW1pYyIgb25lcy4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHJlZ3VsYXIgcHl0aG9uLCBpcyB0aGF0IGFsbCB0aGUgd3JhcHBlZAoJICAgIGNsYXNzZXMgYXJlIGR5bmFtaWNzLiBTbywgY2FyZWZ1bCB3aXRoIHlvdXIgc3BlbGxpbmcuCgowOS8xNC8yMDA0OiBtbWF0dXMgCgkgICAgLSBTdXBwb3J0IHRoZSAtSS0gb3B0aW9uLgoKCSAgICAtIERpZmZlcmVudGlhdGUgYmV0d2VlbiAlaW5jbHVkZSA8ZmlsZT4gYW5kICVpbmNsdWRlICJmaWxlIi4KCSAgICAgIFRoaXMgZml4IHNldmVyYWwgY29ybmVyIGNhc2VzLgoKCSAgICAKCSAgICBbUHl0aG9uXSBTZXZlcmFsIHBhdGNoZXM6CgoJICAgIC0gTm9ybWFsaXplIHRoZSBMaWIgZmlsZSBuYW1lczogCgkJKi5zd2cgaW50ZXJuYWwgZmlsZXMsIAoJCSouaSAgIHVzZXIgZmlsZXMuCgoJICAgIC0gRml4IENoYXJbQU5ZXSB0eXBlbWFwcywgc28gdGhleSBhbHNvIGRlbGV0ZSBhbnkgZXh0cmEgJ1wwJyBjaGFycywKCSAgICAgIG5vdyB0aGV5IGJlaGF2ZSBhcyBiZWZvcmUgKDEuMy4yMSkuIFN0aWxsLCB5b3UgY2FuIHVzZQoJICAgICAgdGhlIFNXSUdfUFJFU0VSVkVfQ0FSUkFZX1NJWkUgbWFjcm8gaWYgeW91IG5lZWQgdG8KCSAgICAgIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzaXplIChzZWUgcHlzdHJiYXNlLnN3ZykuCgoJICAgIC0gQWRkIHRoZSBDaGFyIEZJWFNJWkVbQU5ZXSB0eXBlbWFwcywgdG8gcHJlc2VydmUgdGhlCiAgICAgICAgICAgICAgb3JpZ2luYWwgQyBhcnJheSBzaXplcyAoc2VlIGFib3ZlKS4gVGhvdWdoLCB5b3UgY2FuJ3QKICAgICAgICAgICAgICB1c2UgdGhlbSB5ZXQgc2luY2UgJWFwcGx5IGFuZCBhcnJheXMgYXJlIG5vdCB3b3JraW5nCiAgICAgICAgICAgICAgdG9nZXRoZXIuCgogICAgICAgICAgICAtIEFkZCBweWZyYWdtZW50cy5zd2csIG5vdyB0aGUgdXNlciBjYW4gYWRkIGZyYWdtZW50cwoJICAgICAgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb25lcy4KCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZyb20gQmlsbCBDbGFya2Ugd2hpY2ggZml4ZXMgc3B1cmlvdXMgcHJlcHJvY2Vzc29yIGJ1ZyB3aGljaAogICAgICAgICAgICBzaG93cyBvbiBTb2xhcmlzIGFuZCBnY2MsIGVnOgogICAgICAgICAgICAgICAgV2FybmluZygyMDIpOiBDb3VsZCBub3QgZXZhbHVhdGUgJyFkZWZpbmVkKFNXSUdKQVZBKSAmJgogICAgICAgICAgICAgICAgIShkZWZpbmVkKFNXSUdDU0hBUlApJwogICAgICAgICAgICBBbHNvIGZpeGVzIGEgYnVnIHdoZXJlICcjaWYgImEiID09ICJiIiA9PSAxJyB3b3VsZG4ndCBoYXZlIHdvcmtlZCAKCjA5LzEwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlc3RvcmVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGZvciB0aGUgdGVzdC1zdWl0ZS4gUGF0Y2ggZnJvbQogICAgICAgICAgICBCaWxsIENsYXJrZS4KCjA5LzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHRoZSBtaXNzaW5nIHJ1bnRpbWUuZHNwIFZpc3VhbCBTdHVkaW8gcHJvamVjdCBmaWxlcyBmb3IgdGhlCiAgICAgICAgICAgIGltcG9ydCBleGFtcGxlcyB0byB3b3JrLgoKClZlcnNpb24gMS4zLjIyIChTZXB0ZW1iZXIgNCwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDkvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIHN3aWcubTQgbWFjcm8gZm9yIHVzZSB3aXRoIHRoZSBBdXRvY29uZi9BdXRvbWFrZS9MaWJ0b29sIGhhcwogICAgICAgICAgICBiZWVuIHJlbW92ZWQgYW5kIGlzIG5vIGxvbmdlciBpbnN0YWxsZWQuIFBsZWFzZSB1c2UgdGhlIG5ldyBhbmQgYmV0dGVyCiAgICAgICAgICAgIG1haW50YWluZWQgdmVyc2lvbiBkZXJpdmVkIGZyb20gc3dpZy5tNCBpbiB0aGUgQXV0b2NvbmYgbWFjcm8gYXJjaGl2ZS4KICAgICAgICAgICAgU2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9hYy1hcmNoaXZlL2h0bWxkb2MvYWNfcGtnX3N3aWcuaHRtbCBhbmQKICAgICAgICAgICAgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19weXRob25fZGV2ZWwuaHRtbC4KCjA5LzAxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkIHBhdGNoICMxMDE5NjY5IGZyb20gQ2hyaXN0b3BoIEZsYW1tLiBBZGRzIHN1cHBvcnQKICAgICAgICAgICAgZm9yICVmZWF0dXJlKCJzaGFkb3ciKSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd29ya3MgaW4gUHl0aG9uLiBUaGlzCiAgICAgICAgICAgIGVuYWJsZXMgb25lIHRvIG92ZXJyaWRlIHRoZSBnZW5lcmF0ZWQgc2hhZG93L3Byb3h5IG1ldGhvZHMsIGluY2x1ZGluZwogICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgLyogTGV0J3MgbWFrZSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGNsYXNzIFNxdWFyZSBtb3JlIHZlcmJvc2UgKi8KCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpIFNxdWFyZShkb3VibGUgdykKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3ViIG5ldyB7CiAgICAgICAgICAgICAgICAgIG15ICRwa2cgPSBzaGlmdDsKICAgICAgICAgICAgICAgICAgbXkgJHNlbGYgPSBleGFtcGxlYzo6bmV3X1NxdWFyZShAXyk7CiAgICAgICAgICAgICAgICAgIHByaW50IFNUREVSUiAiQ29uc3RydWN0ZWQgYW4gQHtbcmVmKCRzZWxmKV19XG4iOwogICAgICAgICAgICAgICAgICBibGVzcyAkc2VsZiwgJHBrZyBpZiBkZWZpbmVkKCRzZWxmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICBjbGFzcyBTcXVhcmUgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIFNxdWFyZShkb3VibGUgdyk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMDgvMzEvMjAwNDogbW1hdHVzIAoJICAgIFtQeXRob25dIEluY29tcGF0aWJpbGl0eSByZXBvcnRlZCBieSBCaWxsIENsYXJrZSAobGxpYkBjb21wdXRlci5vcmcpOgoJICAgIAoJICAgIElmIHlvdSBhcmUgdXNpbmcgU3VuIFN0dWRpbyA4IChhbmQgcG9zc2libHkgZWFybGllcgoJICAgIHZlcnNpb25zKSB0byBjb21waWxlIHRoZSBvdXRwdXQgcHJvZHVjZWQgYnkgc3dpZwoJICAgIDEuMy4yMnJjMSwgYW5kIHlvdSBhcmUgdXNpbmcgQysrIGFuZCBTVEwgdGVtcGxhdGVzIHRoZW4KCSAgICB5b3UgbmVlZCB0byB1c2UgZWl0aGVyICItcnVudGltZSIgb3IgIi1ub3J1bnRpbWUiLiAgSWYgeW91CgkgICAgdXNlIG5laXRoZXIgb2YgdGhlc2Ugb3B0aW9ucyB0aGVuIHlvdSB3aWxsIHByb2JhYmx5IGdldAoJICAgIGNvbXBpbGVyIGVycm9ycyB3aGVuIHRyeWluZyB0byBjb21waWxlIHRoZSB3cmFwcGVyIGZpbGU7CgkgICAgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBsaWtlIHRoaXM6IFRoZSBuYW1lCgkgICAgU1dJR19QeXRob25fQ29udmVydFB0clsuLi5dIGlzIHVudXNhYmxlIGluIHN0YXRpYwoJICAgIHN3aWdweTo6dHJhaXRzX2FzcHRyWy4uLl0gIElmIHlvdSBnZXQgdGhpcyBlcnJvciBtZXNzYWdlLAoJICAgIHlvdSBuZWVkIHRvIHJlZ2VuZXJhdGUgeW91ciB3cmFwcGVyIGZpbGUgdXNpbmcgJ3N3aWcKCSAgICAtcnVudGltZScgb3IgJ3N3aWcgLW5vcnVudGltZScuCgoJICAgIFlvdSBzaG91bGRuJ3QgZ2V0IHRoaXMgcHJvYmxlbSB3aXRoIFN1biBTdHVkaW8gOS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoJICAgIAowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbGllZCAjOTMyMzMzIGZyb20gSWtlZ2FtaSBUc3V0b211LiBGaXhlcyBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICBhbmQgdW5zaWduZWQgbG9uZyBsb25nICpPVVRQVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzg1NzM0NCBmcm9tIEFydCBZZXJrZXMuIFdvcmthcm91bmQgZm9yIGF1dG9jb25mIGJ1ZyB3aGVuCiAgICAgICAgICAgIHJ1bm5pbmcgJ21ha2UgaW5zdGFsbCcuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGFydCBvZiBwYXRjaCAjOTgyNzUzIGFwcGxpZWQuIFRoaXMgaW1wbGVtZW50cyBhICVwZXJsY29kZSBkaXJlY3RpdmUuCiAgICAgICAgICAgIEl0IGFsbG93cyBvbmUgdG8gYWRkIFBlcmwgY29kZSB0byB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiBXb3JrcyB0aGUgc2FtZSAKICAgICAgICAgICAgYXMgJXB5dGhvbmNvZGUuCgowOC8yNi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyB2aXJ0dWFsIG1ldGhvZHMgd2l0aCBleGNlcHRpb24KICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgdGhhdCB3ZXJlIG5vdCBzaW1wbGUgdHlwZXMuIFByZXZpb3VzbHkgY29kZSB3YXMgZ2VuZXJhdGVkIHRoYXQKICAgICAgICAgICAgZGlkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlIHdoZW4gdGhlIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9uIHdhcyBhIHBvaW50ZXIuCgowOC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFR5cGVtYXAgZml4IGZvciBtZXRob2RzIHRoYXQgcmV0dXJuIGNoYXIgKi4gVGhlIENMUiB3b3VsZCBpbmNvcnJlY3RseQogICAgICAgICAgICBkZWxldGUgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IGNoYXIgKi4gQWxzbyBhcHBsaWVkIHRoZSBzYW1lIGNvcnJlY3Rpb24gdG8KICAgICAgICAgICAgdGhlIGNoYXIgYXJyYXkgdHlwZW1hcHMuCgowOC8yNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgLWZtaWNyb3NvZnQgZXJyb3Ivd2FybmluZyBtZXNzYWdlIGRpc3BsYXk6IAogICAgICAgICAgICAtIEVuZCBvZiBmaWxlIChFT0YpIHdhcm5pbmcgbWVzc2FnZXMgbm90IGRpc3BsYXlpbmcgaW4gY29ycmVjdCBmb3JtYXQKICAgICAgICAgICAgLSBTb21lIG1lc3NhZ2VzIGNvbnRhaW5pbmcgYSBmaWxlIHBhdGggd2VyZSBkaXNwbGF5aW5nIGEgZG91YmxlIGJhY2tzbGFzaAogICAgICAgICAgICAgIGluc3RlYWQgb2YgYSBzaW5nbGUgYmFja3NsYXNoCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBsaWVkIHBhdGNoICMxMDExNjA0IHN1Ym1pdHRlZCBieSBDaGFybGVzIFNjaHdpZXRlcnMuIEZpeCBmb3IgNjQgYml0IHRjbAogICAgICAgICAgICBpbnRlcnByZXRlcnMuCgowOC8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yIGJ1ZyAjODc1NTgzIC0gZW51bSBmb3J3YXJkIGRlY2xhcmF0aW9ucyBwcmV2aW91c2x5IGdhdmUgYSBzeW50YXggZXJyb3IuCgowOC8yMy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIFVzZSB0eXBlbWFwcyAiZmZpdHlwZSIgYW5kICJsaXNwdHlwZSIgdG8gZGV0ZXJtaW5lIHRoZSBGRkkgdHlwZQoJICAgIHNwZWNpZmllcnMgZnJvbSB0aGUgQyB0eXBlLiAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSwgZm9yIGluc3RhbmNlLCB0byBjb250cm9sCgkgICAgd2hldGhlciBhIEMgImNoYXIiIGFyZ3VtZW50IHRha2VzIGEgTGlzcCBjaGFyYWN0ZXIgb3IgYSBMaXNwIGludGVnZXIgdmFsdWUuCgkgICAgVGhlIGRlZmF1bHQgKHRha2luZyBMaXNwIGNoYXJhY3RlcnMpIGlzIGRvbmUgYnkgdGhlc2UgYnVpbHQtaW4gdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJjaGFyYWN0ZXIiOwoJICAgIElmIGNoYXIgbWVhbnMgYW4gaW50ZWdlciBpbnN0ZWFkLCB1c2UgdGhlc2UgdHlwZW1hcHM6CgkgICAgICAldHlwZW1hcChmZml0eXBlKSBjaGFyICI6Y2hhciI7ICV0eXBlbWFwKGxpc3B0eXBlKSBjaGFyICJpbnRlZ2VyIjsKCjA4LzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFzIGRpc2N1c3NlZCBpbiBidWcgIzc3MjQ1MywgdGhlIFNXSUcgbGlicmFyeSBkaXJlY3RvcnkgaXMgbm93IGluc3RhbGxlZAogICAgICAgICAgICBpbnRvIGEgZGlmZmVyZW50IGRlZmF1bHQgZGlyZWN0b3J5LiBUaGUgbGlicmFyeSB1c2VkIHRvIGJlIGluc3RhbGxlZCB0bwogICAgICAgICAgICAvdXNyL2xvY2FsL2xpYi9zd2lnMS4zLiBJdCBpcyBub3cgaW4gdGhlIG1vcmUgdXN1YWwgYXJjaGl0ZWN0dXJlIGluZGVwZW5kZW50CiAgICAgICAgICAgIGRpcmVjdG9yeSBhbmQgSSBoYXZlIGFkZGl0aW9uYWxseSB1c2VkIGEgdmVyc2lvbiBzcGVjaWZpYyBzdWJkaXJlY3RvcnkgYXMKICAgICAgICAgICAgdGhlIGxpYnJhcnkgd2lsbCByYXJlbHkgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIFNXSUcuIFRoaXMgcmVsZWFzZQogICAgICAgICAgICB3aWxsIHRodXMgdXNlIC91c3IvbG9jYWwvc2hhcmUvc3dpZy8xLjMuMjIgYnkgZGVmYXVsdCwgd2hpY2ggY2FuIGJlCiAgICAgICAgICAgIHRhaWxvcmVkIGFzIGJlZm9yZSB1c2luZyAnLi9jb25maWd1cmUgLS1zd2lnbGliZGlyJy4KCjA4LzE3LzIwMDQ6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIEFkZCBzdXBwb3J0IHRvIGNyZWF0ZSBuYXRpdmUgTXpTY2hlbWUgc3RydWN0dXJlcyBmcm9tIEMgc3RydWN0dXJlcy4KCSAgICBUbyBjb252ZXJ0IGEgQyBzdHJ1Y3R1cmUgdG8gYW4gTXpTY2hlbWUgc3RydWN0dXJlLCB1c2UgdGhlIG5ldyBydW50aW1lIG1hY3JvCgkgICAgU1dJR19OZXdTdHJ1Y3RGcm9tUHRyIGluIGEgdHlwZW1hcC4gIFBhdGNoIGZyb20gRG1pdHJpeSBaYXZpbi4gCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODM3NzE1IGZyb20gQmVuIFJlc2VyIHRvIGNvcnJlY3RseSBkZXRlY3QgUHl0aG9uIGxpYiBkaXJlY3RvcnkKICAgICAgICAgICAgb24gNjQgYml0IHN5c3RlbXMuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMgYW5kIEphdmFdIFByZXZlbnQgbWVtb3J5IGxlYWtzIGluIHRoZSBjYXNlIG9mIGVhcmx5IHJldHVybgogICAgICAgICAgICBmcm9tIHdyYXBwZXIgbWV0aG9kcyB1c2luZyBjb25zdCBzdGQ6OnN0cmluZyAmIHBhcmFtZXRlcnMuIE1vZGlmaWVkCiAgICAgICAgICAgIE1hcmsgVHJhdWR0IHBhdGNoICM5NTE1NjUuCgowOC8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgIzk0Mzc4MyB3aXRoIHBhdGNoIGZpeGVzIHBocCBjaGFyICogb3V0IHR5cGVtYXAgTlVMTCB2YWx1ZXMuCgowOC8wMy8yMDA0OiBBaG1vbiBEYW5jeSAgPGRhbmN5QGRhbmN5PgoKICAgICAgICAgICAgW2FsbGVncm9jbF0gQWRkaXRpb25hbCBjYXNlIG1vZGUgZml4ZXMuICBBbHNvLCBtYWtlIHN1cmUKCSAgICBmb3JlaWduIHR5cGVzIGFyZSBleHBvcnRlZC4KCjA3LzI0LzIwMDQ6IG1rb2VwcGUgCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIFNXSUcgbW9kdWxlcyBub3cgZXhjaGFuZ2UgdGhlaXIgcG9pbnRlciB0eXBlCgkgICAgaW5mb3JtYXRpb24gdmlhIHRoZSBHdWlsZSBpbnRlcnByZXRlci4gIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYnVpbGQgYQoJICAgIHJ1bnRpbWUgbGlicmFyeSBvciB0byB1c2UgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgZXRjLgoJICAgIAoJICAgIFRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gdGhlIGNoYW5nZSBvZiAwNS8xNy8yMDA0IGlzCgkgICAgbm8gbG9uZ2VyIGF1dG9tYXRpY2FsbHkgYnVpbHQuICBJZiB5b3UgbmVlZCBpdCwgcnVuIFNXSUcgb24gdGhlIGludGVyZmFjZSBmaWxlCgkgICAgc3dpZ3J1bi5pLiAKCjA3LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQnVnICM5MTc2MDEgTWFwcGluZyBDKysgYm9vbCBmaXggZnJvbSBNYXJrIFRyYXVkdAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUlBNIGZpeGVzIGZvciBsYXRlc3QgQ1ZTIHZlcnNpb24gaW5jbHVkaW5nIHJlbW92YWwgb2YgcnVudGltZQogICAgICAgICAgICBsaWJyYXJ5LgoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzkwODk1NSBmcm9tIFJvYmVydCBIIERlIFZyaWVzLgogICAgICAgICAgICBSUE0gZmlsZSBnZW5lcmF0aW9uIGZpeCBmb3IgRmVkb3JlIENvcmUgMSBhbmQgUmVkaGF0IEFTMi4xLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzg2NDY4OSBmcm9tIFJvYmluIER1bm46CgogICAgICAgICAgICBUaGlzIHBhdGNoIGNvcnJlY3RzIHR3byBwcm9ibGVtcyBpbiB0aGUgWE1MIG91dHB1dCBvZiBTV0lHOgogICAgICAgICAgICAgCiAgICAgICAgICAgICAgMS4gVGhlcmUgd2VyZSBvZnRlbiBleHRyYSAnLz5cbicgaW4gdGhlIG91dHB1dC4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAyLiB2YWx1ZSBhdHRyaWJ1dGVzIHdlcmUgb3V0cHV0IHdpdGggJ1xuJyBpbiB0aGVtIGJ1dAogICAgICAgICAgICAgIHNpbmNlIHRoYXQgaXMgbm90IHRlY2huaWNhbGx5IGxlZ2FsIG1vc3QgKGFsbD8pIFhNTAogICAgICAgICAgICAgIHBhcnNlcnMgd2lsbCBzdHJpcCB0aGVtIG91dC4gUmVwbGFjaW5nIHRoZSAnXG4nIHdpdGgKICAgICAgICAgICAgICB0aGUgJyYjMTA7JyBlbnRpdHkgcmVmZXJlbmNlIHNvbHZlcyB0aGlzIGFzIHRoYXQgaXMKICAgICAgICAgICAgICBsZWdhbCBhbmQgWE1MIHBhcnNlcnMgd2lsbCBjb252ZXJ0IGl0IHRvIGEgJ1xuJyB3aGVuCiAgICAgICAgICAgICAgcmVhZGluZyB0aGUgdmFsdWVzIGJhY2sgaW4uCiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgVGhpcyBwYXRjaCBhbHNvIGFkZHMgYSBuZXcgZ2xvYmFsIGNvbW1hbmQgbGluZSBvcHRpb24KICAgICAgICAgICAgICB0aGF0IHdpbGwgYWxsb3cgdGhlIHBhcnNlIHRyZWUgdG8gYmUgd3JpdHRlbiBvdXQgaW4gWE1MCiAgICAgICAgICAgICAgKmFmdGVyKiBzb21lIG90aGVyIGxhbmd1YWdlIG1vZHVsZSBoYXMgYmVlbiBydW4sIGluCiAgICAgICAgICAgICAgb3JkZXIgdG8gYmUgYWJsZSB0byBnZXQgZXh0cmEgaW5mbyB0aGF0IHRoZSBsYW5ndWFnZQogICAgICAgICAgICAgIG1vZHVsZSBwdXRzIGluIHRoZSB0cmVlLiBJbiB0aGlzIHdheSB0aGUgWE1MIGlzIGEKICAgICAgICAgICAgICBwb3N0LXByb2Nlc3NlZCB2ZXJzaW9uIG9mIHRoZSB0cmVlIHJhdGhlciB0aGFuIGEKICAgICAgICAgICAgICBwcmUtcHJvY2Vzc2VkIHZlcnNpb24uIAogCiAgICAgICAgICAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbiBpcyAtZHVtcF94bWwgb3IgLXhtbG91dCA8ZmlsZT4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB0byBmaXggdHlwZXNhZmUgZW51bXMgYW5kIHByb3BlciBlbnVtcwogICAgICAgICAgICB3aXRoIGRpcmVjdG9ycy4KCjA3LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEhUTUwgZG9jdW1lbnRhdGlvbiAobWFrZWNoYXAucHkpIGZpbGUgZ2VuZXJhdG9yIG1pc3NpbmcgZW5kIG9mIGxpbmUKICAgICAgICAgICAgcGF0Y2ggIzkwODk1MSBmcm9tIFJvYmVydCBkZSBWcmllcy4KCjA3LzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBkZXByZWNhdGVkIHJ1bnRpbWUgbGlicmFyeSBidWlsZCBoYXMgYmVlbiByZW1vdmVkLiBUaGlzIGFsc28gcmVtb3ZlcwogICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBvbiBMaWJ0b29sLiBMaWJ0b29sIGlzIG5vIGxvbmdlciByZXF1aXJlZCB0byBidWlsZCBTV0lHLgogICAgICAgICAgICBUaGUgYXNzb2NpYXRlZCAtbGRmbGFncyBTV0lHIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYWxzbyBiZWVuIHJlbW92ZWQuCgogICAgICAgICAgICBUaGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdGVzdGNhc2VzIHRoYXQgdXNlZCB0aGUgcnVudGltZSBsaWJyYXJ5IGhhdmUKICAgICAgICAgICAgYmVlbiB1cGRhdGVkIHRvIHVzZSB0aGUgcmVwbGFjZW1lbnQgYXBwcm9hY2ggdG8gdXNpbmcgU1dJRyBhY3Jvc3MgCiAgICAgICAgICAgIG11bHRpcGxlIG1vZHVsZXMsIHRoYXQgaXMgdGhleSB1c2UgdGhlIC1ub3J1bnRpbWUgYW5kIC1ydW50aW1lIGNvbW1hbmRsaW5lCiAgICAgICAgICAgIG9wdGlvbnMsIHNlZSBNb2R1bGVzLmh0bWwuIEVmZmVjdGl2ZWx5IHRoZXkgYnVpbGQgdGhlaXIgb3duIHJ1bnRpbWUKICAgICAgICAgICAgbGlicmFyaWVzIHVzaW5nIC1ydW50aW1lLiBUaGUgZXhhbXBsZXMgYXJlIGltcG9ydCBhbmQgaW1wb3J0X3RlbXBsYXRlLgogICAgICAgICAgICBUaGUgdGVzdCBjYXNlcyBhcmUgaW4gdGhlIGltcG9ydHMgYW5kIHRlbXBsYXRlX3R5cGVkZWZfaW1wb3J0IGRpcmVjdG9yaWVzLgoKICAgICAgICAgICAgQW55b25lIHdobyB3YW50cyB0aGUgb3JpZ2luYWwgcnVudGltZSBsaWJyYXJpZXMgY2FuIGVpdGhlciBydW4gdGhlIHRlc3Qtc3VpdGUKICAgICAgICAgICAgb3IgYnVpbGQgdGhlIGV4YW1wbGVzIGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlIHNoYXJlZCBvYmplY3QvRExMIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIHdpdGggdGhlIC1ydW50aW1lIGNvbW1hbmRsaW5lIG9wdGlvbi4gRm9yIGV4YW1wbGUgbGliaW1wb3J0c19ydW50aW1lLnNvCiAgICAgICAgICAgIChQeXRob24gY2FsbHMgaXQgbGliX2ltcG9ydHNfcnVudGltZS5zbykgaXMgZ2VuZXJhdGVkIGFmdGVyIHJ1bm5pbmcgdGhlIAogICAgICAgICAgICAnbWFrZSBpbXBvcnRzLm11bHRpY3BwdGVzdCcgdGVzdGNhc2UgaW4gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvPGxhbmc+CiAgICAgICAgICAgIGRpcmVjdG9yeS4gT3IgdXNlIGxpYnJ1bnRpbWUuc28gLyBydW50aW1lLmRsbCBhZnRlciBidWlsZGluZyB0aGUgaW1wb3J0CiAgICAgICAgICAgIGV4YW1wbGVzIGluIEV4YW1wbGVzLzxsYW5nPi9pbXBvcnQuCgowNy8wNy8yMDA0OiBta29lcHBlCgkgICAgW0FsbGVncm8gQ0xdIENvbnZlcnQgY2hhcmFjdGVyIGFuZCBzdHJpbmcgbGl0ZXJhbHMgaW4gY29uc3RhbnRzIHRvIAoJICAgIENMIHN5bnRheC4gIEZpeCBGRjpERUYtRk9SRUlHTi1DQUxMIGZvciBtaXhlZC1jYXNlIEMgZnVuY3Rpb25zLgoKMDYvMjcvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE5ldyBmZWF0dXJlIGZvciBKYXZhIGV4Y2VwdGlvbnMgd2l0aCBmb3JtYXQgJWphdmFleGNlcHRpb24oZXhjZXB0aW9uY2xhc3NlcykuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBhIHNsaWdodCBlbmhhbmNlbWVudCB0byAlZXhjZXB0aW9uIGFuZCB0aGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSAKICAgICAgICAgICAgYWRkaXRpb24gb2YgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIHdoaWNoIGFyZSBnZW5lcmF0ZWQgaW50byBhIHRocm93cyBjbGF1c2UuCiAgICAgICAgICAgIFRoZSAnZXhjZXB0aW9uY2xhc3NlcycgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBjbGFzc2VzIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgYWRkZWQgdG8gdGhlIGFzc29jaWF0ZWQgcHJveHkgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZS4gVGhlICdleGNlcHRpb25jbGFzc2VzJwogICAgICAgICAgICBhcmUgc3BlY2lmaWVkIGxpa2UgdGhlIGV4Y2VwdGlvbiBjbGFzc2VzIGluIHRoZSAndGhyb3dzJyBhdHRyaWJ1dGUgaW4gdGhlCiAgICAgICAgICAgIHR5cGVtYXBzLiBUaGlzIGZlYXR1cmUgc2hvdWxkIGJlIHVzZWQgZm9yIGNvcnJlY3RseSBoYW5kbGluZyBjaGVja2VkIGV4Y2VwdGlvbnMKICAgICAgICAgICAgdGhyb3duIGZyb20gSk5JIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlamF2YWV4Y2VwdGlvbigiamF2YS5sYW5nLkV4Y2VwdGlvbiIpIHRocm93RXhjZXB0aW9uICV7CiAgICAgICAgICAgICAgICAuLi4gY29udmVydCBhIHN0ZDo6bG9naWNfZXJyb3IgaW50byBhIGphdmEubGFuZy5FeGNlcHRpb24gdXNpbmcgSk5JIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgI2luY2x1ZGUgPHN0ZGV4Y2VwdD4KICAgICAgICAgICAgICB2b2lkIHRocm93RXhjZXB0aW9uKCkgewogICAgICAgICAgICAgICAgdGhyb3cgc3RkOjpsb2dpY19lcnJvcigiTG9naWMgZXJyb3IhIik7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgd2lsbCBnZW5lcmF0ZSBhIG1ldGhvZCB3aXRoIGEgdGhyb3dzIGNsYXVzZSBpbiB0aGUgbW9kdWxlIGNsYXNzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiB7IC4uLiB9CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyAlY3Njb25zdHZhbHVlKHZhbHVlKSBmZWF0dXJlIGRpcmVjdGl2ZSBmb3IgdXNlIHdpdGggY29uc3RhbnRzIGFuZAogICAgICAgICAgICBlbnVtcy4gVGhpcyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgJWphdmFjb25zdHZhbHVlLiBGb3IgQyMsIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgIGlzIHRoZSBvbmx5IHdheSB0aGF0IG9uZSBjYW4gZml4IHdyYXBwaW5nIG9mIEMvQysrIGVudW1zIHdpdGggcHJvcGVyIEMjCiAgICAgICAgICAgIGVudW1zIGlmIHRoZSBlbnVtIGl0ZW0ncyBpbml0aWFsaXNlciBjYW5ub3QgY29tcGlsZSBhcyBDIyBjb2RlLiBUaGlzIGlzCiAgICAgICAgICAgIGJlY2F1c2UgSmF2YSBlbnVtcyBjYW4gdXNlIGEgY2FsbCBpbnRvIEMgY29kZSB0byBpbml0aWFsaXNlIHRoZSBlbnVtIGl0ZW0sCiAgICAgICAgICAgIHdoZXJlYXMgaW4gQyMsIHRoZSBlbnVtIHZhbHVlIG11c3QgYmUgYSBjb21waWxlIHRpbWUgY29uc3RhbnQuIFRoYXQgaXMsCiAgICAgICAgICAgIHVzaW5nICVjc2NvbnN0KDApIGNhbm5vdCBiZSB1c2VkIGluIEMjIHRvIGluaXRpYWxpc2UgdGhlIEMjIGVudW0gaXRlbSB2aWEKICAgICAgICAgICAgYSBQSU5WT0tFIGNhbGwuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTmV3ICVqYXZhY29uc3R2YWx1ZSh2YWx1ZSkgZmVhdHVyZSBkaXJlY3RpdmUgZm9yIHVzZSB3aXRoIGNvbnN0YW50cyBhbmQKICAgICAgICAgICAgZW51bXMuIFNvbWV0aW1lcyB0aGUgdXNlIG9mICVqYXZhY29uc3QoMSkgd2lsbCBwcm9kdWNlIGNvZGUgdGhhdCB3b24ndCBjb21waWxlCiAgICAgICAgICAgIHVuZGVyIEphdmEuIElmIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IGlzIHJlcXVpcmVkLCAlamF2YWNvbnN0KDApIGlzIG5vdCBhbgogICAgICAgICAgICBvcHRpb24uIFRoZSAlamF2YWNvbnN0dmFsdWUgZGlyZWN0aXZlIGFjaGlldmVzIHRoaXMgZ29hbCBhbmQgdGhlIHZhbHVlIHNwZWNpZmllZAogICAgICAgICAgICBpcyBnZW5lcmF0ZWQgYXMgSmF2YSBjb2RlIHRvIGluaXRpYWxpc2UgdGhlIGNvbnN0YW50LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSk7CiAgICAgICAgICAgICAgJWphdmFjb25zdHZhbHVlKDEwMDApIEJJRzsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoIm5ldyBqYXZhLm1hdGguQmlnSW50ZWdlcihcIjIwMDBcIikiKSBMQVJHRTsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoMTApIGJhcjsKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgY29uc3QgaW50IGJhciA9IDEwOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgI2RlZmluZSBCSUcgMTAwMExMCiAgICAgICAgICAgICAgICAjZGVmaW5lIExBUkdFIDIwMDBVTEwKICAgICAgICAgICAgICAgIGVudW0gRm9vIHsgQkFSID0gOjpiYXIgfTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgR2VuZXJhdGVzOgoKICAgICAgICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIGV4YW1wbGVDb25zdGFudHMgewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEwMDA7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubWF0aC5CaWdJbnRlZ2VyIExBUkdFID0gbmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKCIyMDAwIik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBGb28gQkFSID0gbmV3IEZvbygiQkFSIiwgMTApOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUHJldmlvdXNseSwgbm9uZSBvZiBCSUcsIExBUkdFIG9yIEJBUiB3b3VsZCBoYXZlIHByb2R1Y2VkIGNvbXBpbGFibGUgY29kZQogICAgICAgICAgICB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBlbmhhbmNlbWVudHMuIEZlYXR1cmVzIGNhbiBub3cgdGFrZSBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGF0dHJpYnV0ZXMKICAgICAgICAgICAgaW4gYWRkaXRpb24gdG8gdGhlIGZlYXR1cmUgbmFtZSBhbmQgZmVhdHVyZSB2YWx1ZS4gVGhlIGF0dHJpYnV0ZXMgYXJlIG9wdGlvbmFsIAogICAgICAgICAgICBhbmQgYXJlIG11Y2ggdGhlIHNhbWUgYXMgdGhlIHR5cGVtYXAgYXR0cmlidXRlcy4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgc3BlY2lmaWVzIHR3byBvcHRpb25hbCBhdHRyaWJ1dGVzLCBhdHRyaWIxIGFuZCBhdHRyaWIyOgoKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCBhdHRyaWIxPSJhdHRyaWJ2YWwxIiwgYXR0cmliMj0iYXR0cmlidmFsMiIpIG5hbWUgInZhbCI7CiAgICAgICAgICAgICAlZmVhdHVyZShmZWF0dXJlbmFtZSwgdmFsLCBhdHRyaWIxPSJhdHRyaWJ2YWwxIiwgYXR0cmliMj0iYXR0cmlidmFsMiIpIG5hbWU7CgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIHRoZSBzeW50YXggdGhhdCB0YWtlcyB0aGUgZmVhdHVyZSB2YWx1ZSB3aXRoaW4gdGhlCiAgICAgICAgICAgICVmZWF0dXJlKCkgYnJhY2tldHMuIFRoZSB2YWx1ZSBzcGVjaWZpZWQgaXMgbm8gbG9uZ2VyIHJlc3RyaWN0ZWQgdG8gYmVpbmcganVzdAogICAgICAgICAgICBhIHN0cmluZy4gSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgbnVtYmVyLiBGb3IgZXhhbXBsZSwgdGhpcyBpcyBub3cgYWNjZXB0YWJsZQogICAgICAgICAgICBzeW50YXg6CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwyMC4wKTsKICAgICAgICAgICAgd2hlcmVhcyBwcmV2aW91c2x5IGl0IHdvdWxkIGhhdmUgdG8gaGF2ZSBiZWVuOgogICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIsIjIwLjAiKTsKICAgICAgICAgICAgVXNlZnVsIGZvciBmZWF0dXJlcyB0aGF0IGFyZSBpbXBsZW1lbnRlZCBhcyBhIG1hY3JvLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICAjZGVmaW5lICVzb21lZmVhdHVyZSh2YWx1ZSkgICAgICAlZmVhdHVyZSgic29tZWZlYXR1cmUiLHZhbHVlKQogICAgICAgICAgICBUaGVzZSB3aWxsIG5vdyB3b3JrIGFjY2VwdGluZyBlaXRoZXIgYSBzdHJpbmcgb3IgYSBudW1iZXI6CiAgICAgICAgICAgICAgJXNvbWVmZWF0dXJlKCJGcmVkIik7CiAgICAgICAgICAgICAgJXNvbWVmZWF0dXJlKDQpOwoKMDYvMDYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuLCBHdWlsZV0KICAgICAgICAgICAgIC0gQ3JlYXRlZCB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9zY2hlbWVydW5tZSBkaXJlY3RvcnksIHdoaWNoIGhvbGRzIGFsbCB0aGUKCSAgICAgICBydW5tZSBzY3JpcHRzIGZvciBndWlsZSBhbmQgY2hpY2tlbiAoYW5kIHBvc3NpYmx5IG16c2NoZW1lLi4uKS4gIFRoZSBndWlsZQoJICAgICAgIGFuZCBjaGlja2VuIF9ydW5tZSBmaWxlcyB0aGVuIChsb2FkICIuLi9zY2hlbWVydW5tZS9mb28uc2NtIikuCiAgICAgICAgICAgICAtIEluIGNoaWNrZW4gbW9kdWxlLCBmaXggYSBmZXcgYnVncyBpbnZsb2x2aW5nIGR5bmFtaWMgY2FzdHMuCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCB0byBmaXggd3JhcHBpbmcgb2YgdGVtcGxhdGVkIG1ldGhvZHMuIElTTyBjb21wbGlhbnQgY29tcGlsZXJzLCBsaWtlCiAgICAgICAgICAgIENvbWVhdSBhbmQgR0NDLTMuNC4wLCBkb24ndCBsaWtlIHRoZSB0ZW1wbGF0ZSBzcGVjaWZpZXIgdGhhdCBTV0lHIHdhcyBnZW5lcmF0aW5nCiAgICAgICAgICAgIHdoZW4gY2FsbGluZyB0aGUgbWV0aG9kLiBUaGlzIGZpeCBtYXkgYnJlYWsgc29tZSBub24gc3RhbmRhcmQgY29tcGxpYW50IGNvbXBpbGVycywKICAgICAgICAgICAgZm9yIGV4YW1wbGUsIFN1biB3b3Jrc2hvcCBjb21waWxlcnMgcHJpb3IgdG8gdmVyc2lvbiA2LjIucDIuIFBhdGNoIHN1Ym1pdHRlZAogICAgICAgICAgICBieSBCaWxsIENsYXJrZS4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gVW5kb2N1bWVudGVkIHNwZWNpYWwgdmFyaWFibGUgJGltY2xhc3NuYW1lIHJlbW92ZWQuCiAgICAgICAgICAgIE5ldyBzcGVjaWFsIHZhcmlhYmxlICRtb2R1bGUgaXMgcmVwbGFjZWQgYnkgdGhlIG1vZHVsZSBuYW1lLCBhcyBzcGVjaWZpZWQKICAgICAgICAgICAgYnkgJW1vZHVsZSBvciAtbW9kdWxlIGNvbW1hbmRsaW5lIG9wdGlvbi4gJGltY2xhc3NuYW1lIGNhbiBiZSBjcmVhdGVkIGZyb20gJG1vZHVsZS4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU2FtZSBhcyBmb3IgSmF2YSBiZWxvdy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgbmFtZWQgZGlmZmVyZW50bHksIG5hbWVseSwKICAgICAgICAgICAgY3Nib2R5IGFuZCBjc2JvZHlfZGVyaXZlZC4gVGhlIGRlcHJlY2F0ZWQgdHlwZW1hcHMgYXJlIGNzZ2V0Y3B0ciBhbmQKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gVHlwZW1hcCBjaGFuZ2VzIGZvciB0aGUgSmF2YSBwcm94eSAvIHR5cGV3cmFwcGVyIGFuZCBlbnVtIGNsYXNzZXMuIEEgbmV3CiAgICAgICAgICAgIHR5cGVtYXAgY2FsbGVkIGphdmFib2R5IGNvbnRhaW5zIHRoZSBlc3NlbnRpYWwgc3VwcG9ydCBjb2RlIGZvciBnZW5lcmF0aW9uIGludG8gdGhlIGJvZHkKICAgICAgICAgICAgb2YgdGhlc2UgY2xhc3Nlcy4gVGhlcmUgaXMgYWxzbyBhIG5ldyBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXAgd2hpY2ggaXMgdXNlZCBpbnN0ZWFkIGZvcgogICAgICAgICAgICB3cmFwcGVkIGNsYXNzZXMgdGhhdCBoYXZlIGEgd3JhcHBlZCBiYXNlIGNsYXNzLiBUaGUgY29kZSBpcyBiYXNpY2FsbHksIHRoZSBnZXRDUHRyKCkKICAgICAgICAgICAgbWV0aG9kIGFuZCBzd2lnQ1B0ciBhbmQgc3dpZ0NNZW1Pd24gbWVtYmVyIHZhcmlhYmxlcy4gVGhlc2UgdXNlZCB0byBiZSBoYXJkIGNvZGVkCiAgICAgICAgICAgIHdpdGggbm8gd2F5IHRvIG1vZGlmeSB0aGUgY29kZS4gVGhlIGludHJvZHVjdGlvbiBvZiB0aGlzIHR5cGVtYXAgbWFrZXMgaXQgcG9zc2libGUgZm9yCiAgICAgICAgICAgIHRoZSB1c2VyIHRvIHRhaWxvciBuZWFybHkgZXZlcnkgYXNwZWN0IG9mIHRoZSBjb2RlIGdlbmVyYXRpb24uCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gbm93IGlzIHRoZSBjb2RlIGZvciBkaXJlY3RvciBjbGFzc2VzLgoKICAgICAgICAgICAgVGhlIGphdmFnZXRjcHRyIGFuZCBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMgdHlwZW1hcHMgYXJlIGRlcHJlY2F0ZWQgYW5kIGFyZQogICAgICAgICAgICBubyBsb25nZXIgdXNlZCBhcyB0aGUgY29kZSB0aGF0IHRoZXNlIGdlbmVyYXRlZCBjYW4gYmUgcHV0IGluIHRoZSBtb3JlIGZsZXhpYmxlCiAgICAgICAgICAgIGphdmFib2R5IGFuZCBqYXZhYm9keV9kZXJpdmVkIHR5cGVtYXBzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsIG1heSBoZWxwIHlvdSB1cGdyYWRlIGlmIHlvdSBoYXZlIHVzZWQKICAgICAgICAgICAgdGhlIGphdmFnZXRjcHRyIHR5cGVtYXA6CgogICAgICAgICAgICAgICAgLyogVXRpbGl0eSBtYWNybyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBKYXZhIGJvZHkgY29kZSBtZXRob2QgYXR0cmlidXRlcyAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBTV0lHSkFWQV9BVFRSSUJTKFRZUEVOQU1FLCBDVE9SX0FUVFJJQiwgR0VUQ1BUUl9BVFRSSUIpCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keSkgVFlQRU5BTUUgJXsKICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN3aWdDUHRyOwogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzd2lnQ01lbU93bjsKCiAgICAgICAgICAgICAgICAgIENUT1JfQVRUUklCICRqYXZhY2xhc3NuYW1lKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NNZW1Pd24gPSBjTWVtb3J5T3duOwogICAgICAgICAgICAgICAgICAgIHN3aWdDUHRyID0gY1B0cjsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgR0VUQ1BUUl9BVFRSSUIgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG9iaiA9PSBudWxsKSA/IDAgOiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJvZHlfZGVyaXZlZCkgVFlQRU5BTUUgJXsKICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHN3aWdDUHRyOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcigkbW9kdWxlSk5JLlNXSUckamF2YWNsYXNzbmFtZVVwY2FzdChjUHRyKSwgY01lbW9yeU93bik7CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgICAgICAvKiBUaGUgZGVmYXVsdCBpcyBwcm90ZWN0ZWQgZ2V0Q1B0ciwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICBTV0lHSkFWQV9BVFRSSUJTKFNXSUdUWVBFLCBwcm90ZWN0ZWQsIHByb3RlY3RlZCkKCiAgICAgICAgICAgICAgICAvKiBQdWJsaWMgZ2V0Q1B0ciBtZXRob2QsIHByb3RlY3RlZCBjb25zdHJ1Y3RvciAqLwogICAgICAgICAgICAgICAgJWRlZmluZSBQVUJMSUNfR0VUQ1BUUihUWVBFTkFNRSkKICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIHByb3RlY3RlZCwgcHVibGljKQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHVibGljIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19CT0RZTUVUSE9EUyhUWVBFTkFNRSkKICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIHB1YmxpYywgcHVibGljKQogICAgICAgICAgICAgICAgJWVuZGRlZgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgY29udGVudHMgb2YgdGhlIGNsYXNzIG1vZGlmaWVyIHR5cGVtYXBzIGFuZCBwcmFnbWFzIGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgVGhleSBtdXN0IG5vdyBpbmNsdWRlIHRoZSBjbGFzcyB0eXBlLiBQcmV2aW91c2x5ICdjbGFzcycgd2FzIGhhcmQgY29kZWQuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGVuYWJsZXMgZmxleGliaWxpdHkgaW50byB3aGF0IHR5cGUgb2YgY2xhc3MgaXMgZ2VuZXJhdGVkLAogICAgICAgICAgICBmb3IgZXhhbXBsZSB0aGUgcHJveHkgY2xhc3MgY291bGQgYmUgYW4gaW50ZXJmYWNlIGluc3RlYWQgb2YgYSBjbGFzcy4KCiAgICAgICAgICAgIEZvciBKYXZhIHRoaXMgYWZmZWN0cyB0aGUgamF2YWNsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBqbmljbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFuZCBtb2R1bGVjbGFzc21vZGlmaWVycyBwcmFnbWFzLgoKICAgICAgICAgICAgRm9yIEMjIHRoaXMgYWZmZWN0cyB0aGUgY3NjbGFzc21vZGlmaWVycyB0eXBlbWFwIGFuZCB0aGUgaW1jbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFuZCBtb2R1bGVjbGFzc21vZGlmaWVycyBwcmFnbWFzLgoKICAgICAgICAgICAgVW5sZXNzIHlvdSBoYXZlIG92ZXJyaWRkZW4gdGhlIGRlZmF1bHQgdmVyc2lvbnMgb2YgdGhlc2UgdHlwZW1hcHMgb3IgcHJhZ21hcywgeW91CiAgICAgICAgICAgIHNob3VsZG4ndCBiZSBhZmZlY3RlZC4gSG93ZXZlciwgaWYgeW91IGhhdmUsIHVwZ3JhZGluZyBpcyBlYXN5LCBmb3IgZXhhbXBsZQoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwiCgogICAgICAgICAgICBtdXN0IG5vdyBiZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28ge307CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY2xhc3Ntb2RpZmllcnMpIEZvbyAicHVibGljIGZpbmFsIGNsYXNzIgoKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzMxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyB0aGF0IGFyZSByZWZlcmVuY2VzLiBQcm9ibGVtIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIE9yZW4gTWlsbGVyLiBBbHNvIGltcHJvdmVzIHRoZSBnZW5lcmF0ZWQgZXhjZXB0aW9uIGRlY2xhcmF0aW9ucyBpbiB0aGUKICAgICAgICAgICAgY2F0Y2ggaGFuZGxlciBmb3IgcG9pbnRlcnMgLSBhIHBvaW50ZXIgaXMgdXNlZCBpbnN0ZWFkIG9mIGEgcmVmZXJlbmNlIHRvCiAgICAgICAgICAgIGEgcG9pbnRlci4gQWRkZWQgZGVmYXVsdCB0aHJvd3MgdHlwZW1hcHMgZm9yIFNXSUdUWVBFICYsIFNXSUdUWVBFICogYW5kCiAgICAgICAgICAgIFNXSUdUWVBFW0FOWV0gKEphdmEgYW5kIEMjKS4KCjA1LzMxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU29tZSBtaW5vciB0eXBlc2FmZSBlbnVtIGltcHJvdmVtZW50cywgaW5jbHVkaW5nIHN0b3JpbmcgdGhlIG5hbWUgb2YKICAgICAgICAgICAgdGhlIGVudW0gaXRlbS4gVGhlIHRvU3JpbmcoKSAvIFRvU3RyaW5nKCkgbWV0aG9kcyBhcmUgb3ZlcnJpZGRlbiB0byByZXR1cm4gdGhpcyBuYW1lLgoKMDUvMzAvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICAgLSBVcGRhdGUgaG93IGV4YW1wbGVzIGFuZCB0aGUgdGVzdCBzdWl0ZSBhcmUgYnVpbHQuCgkgICAgIC0gU3ltYm9sIG5hbWVzIGFyZSBubyBsb25nZXIgY29udmVydGVkIHRvIGxvd2VyIGNhc2UKCSAgICAgLSBBZGRlZCB1bmlvbl9ydW5tZS5zcywgd2hpY2ggd2FzIGNvcGllZCBhbmQgbW9kaWZpZWQgZnJvbSB0aGUgZ3VpbGUgbW9kdWxlCgowNS8yNi8yMDA0OiBsYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBDb21taXR0ZWQgb24gYmVoYWxmIG9mIE1hcmNlbG8gKHdobyBzdGlsbCBoYXMgcHJvYmxlbXMgd2l0aCAKCSAgICB0aGUgU291cmNlRm9yZ2UgQ1ZTLikKCgkgICAgQWRkZWQgUHl0aG9uIHR5cGVtYXBzIGZvciBGSUxFKiB3aXRoIChQeXRob24tb25seSkgdGVzdC4KCjUvMjQvMjAwNDogIGRhbmN5CgoJKiBBbGxlZ3JvIENMIG1vZHVsZTogIE5vdyB1c2luZyBzb21lIG1hY3JvcyAoZGVmaW5lZCBpbgoJTGliL2FsbGVncm9jbC9hbGxlZ3JvY2wuc3dnKSwgc3dpZy1kZWZjb25zdGFudCBhbmQgc3dpZy1kZWZ1biwgZm9yCglkZWZpbmluZyBjb25zdGFudHMgYW5kIGZvcmVpZ24gZnVuY3Rpb25zLiAgVGhpcyBtYWtlcyB0aGUKCWdlbmVyYXRlZCBmaWxlIGEgYml0IG5lYXRlci4gICAgCgoJTm93IHN0cmlwcyBhIGxheWVyIG9mIHBhcmVudGhlc2lzIGZyb20gY29uc3RhbnRzLgoKCVVzZXMgKCogOnZvaWQpIGluc3RlYWQgb2YgOmZvcmVpZ24tYWRkcmVzcyBub3cuCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBVbm5hbWVkIGVudW0gZ2xvYmFsIHZhcmlhYmxlcyBhcmUgbm93IHN1cHBvcnRlZCBpbiBhZGRpdGlvbgogICAgICAgICAgICB0byB0aGUgcmVjZW50bHkgYWRkZWQgc3VwcG9ydCBmb3IgdW5uYW1lZCBlbnVtIG1lbWJlciB2YXJpYWJsZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTEsIGVudW0yIH0gTWVtYmVySW5zdGFuY2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZW51bSB7IGVudW0zLCBlbnVtNCB9IEdsb2JhbEluc3RhbmNlOwoKICAgICAgICAgICAgVGhlIGludCB0eXBlbWFwcyBhcmUgdXNlZCBmb3Igd3JhcHBpbmcgdGhlIGdldC9zZXQgYWNjZXNzb3IgbWV0aG9kcy4KICAgICAgICAgICAgSWYgdGhlIHNpemVvZiBhbiBlbnVtIGlzIG5vdCB0aGUgc2FtZSBzaXplIGFzIGFuIGludCB0aGVuIHNldHRpbmcgdGhlCiAgICAgICAgICAgIHZhcmlhYmxlIHdpbGwgc2lsZW50bHkgZG8gbm90aGluZyBhcyB0aGUgY2FzdHMgY2Fubm90IGJlIGVhc2lseSBhbmQgcG9ydGFibHkKICAgICAgICAgICAgZ2VuZXJhdGVkLiBJZiB5b3UgbmVlZCB0byBzb2x2ZSB0aGlzIGhpZ2hseSBvYnNjdXJlIHNpdHVhdGlvbiwgd3JpdGUKICAgICAgICAgICAgdGhlIGFzc2lnbm1lbnQgdXNpbmcgdGhlICVleGNlcHRpb24gZmVhdHVyZS4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQyMgZW51bSB3cmFwcGluZyBtb2RzLiBTaW1pbGFyIHRvIHRoZSBKYXZhIG1vZHVsZSwgZW51bXMgY2FuIGJlIHdyYXBwZWQgdXNpbmcKICAgICAgICAgICAgb25lIG9mIDMgYXBwcm9hY2hlczoKCiAgICAgICAgICAgIDEpIFByb3BlciBDIyBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgU2ltcGxlIGNvbnN0YW50IGludGVnZXJzIChvcmlnaW5hbCBhcHByb2FjaCkgLSB1c2UgJWluY2x1ZGUgImVudW1zaW1wbGUuc3dnIgoKICAgICAgICAgICAgU2VlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZm9yIGZ1cnRoZXIgZGV0YWlscy4gRWFjaCBvZiB0aGVzZSBmaWxlcyB1c2UgdHlwZW1hcHMKICAgICAgICAgICAgYW5kIGEgbmV3IGZlYXR1cmUgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoZSBmZWF0dXJlIGlzOgoKICAgICAgICAgICAgICAgICVjc2VudW0od3JhcGFwcHJvYWNoKTsKCiAgICAgICAgICAgIHdoZXJlIHdyYXBhcHByb2FjaCBzaG91bGQgYmUgb25lIG9mOiAicHJvcGVyIiwgInR5cGVzYWZlIiwgInR5cGV1bnNhZmUiIG9yICJzaW1wbGUiLgogICAgICAgICAgICBbTm8gaW1wbGVtZW50YXRpb24gZGVlbWVkIG5lY2Vzc2FyeSBmb3IgdHlwZSB1bnNhZmUgZW51bXNdLgoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgYXBwcm9hY2ggaXMgcHJvcGVyIEMjIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSmF2YSBlbnVtIHN1cHBvcnQgYWRkZWQuIFRoZXJlIGFyZSBub3cgNCB3YXlzIGluIHdoaWNoIGVudW1zIGNhbiBiZSB3cmFwcGVkOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEphdmEgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW1zLnN3ZyIKICAgICAgICAgICAgMikgVHlwZXNhZmUgZW51bXMgLSB1c2UgJWluY2x1ZGUgImVudW10eXBlc2FmZS5zd2ciCiAgICAgICAgICAgIDMpIFR5cGUgdW5zYWZlIGVudW1zIChjb25zdGFudCBpbnRlZ2VycykgLSB1c2UgJWluY2x1ZGUgImVudW10eXBldW5zYWZlLnN3ZyIKICAgICAgICAgICAgNCkgU2ltcGxlIGNvbnN0YW50IGludGVnZXJzIChvcmlnaW5hbCBhcHByb2FjaCkgLSB1c2UgJWluY2x1ZGUgImVudW1zaW1wbGUuc3dnIgoKICAgICAgICAgICAgU2VlIGVhY2ggb2YgdGhlc2UgZmlsZXMgZm9yIGZ1cnRoZXIgZGV0YWlscy4gRWFjaCBvZiB0aGVzZSBmaWxlcyB1c2UgdHlwZW1hcHMKICAgICAgICAgICAgYW5kIGEgbmV3IGZlYXR1cmUgdG8gY29udHJvbCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoZSBmZWF0dXJlIGlzOgoKICAgICAgICAgICAgICAgICVqYXZhZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXBzIHdpbGwgaGFuZGxlIGVudW1zIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBzcGVjaWZpZWQgaW5pdGlhbAogICAgICAgICAgICB2YWx1ZXMsIGZvciBleGFtcGxlIHRlbiBpcyBzcGVjaWZpZWQ6CgogICAgICAgICAgICAgICAgZW51bSBOdW1iZXJzIHsgemVybywgdGVuKDEwKSB9OwoKICAgICAgICAgICAgSG93ZXZlciwgdGhlIGFtb3VudCBvZiBnZW5lcmF0ZWQgSmF2YSBjb2RlIGNhbiBiZSBjdXQgZG93biwgYnkgbW9kaWZ5aW5nIHRoZXNlIHR5cGVtYXBzCiAgICAgICAgICAgIGlmIG5vbmUgb2YgdGhlIGVudW1zIGhhdmUgaW5pdGlhbCB2YWx1ZXMgKHByb3BlciBKYXZhIGVudW1zIGFuZCB0eXBlc2FmZSBlbnVtcyBhcHByb2FjaCkuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyB0eXBlc2FmZSBlbnVtcy4gQW5vbnltb3VzIGVudW1zIGFyZSBhbHdheXMgd3JhcHBlZCBieQogICAgICAgICAgICBjb25zdGFudCBpbnRlZ2Vycy4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNS8xMS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBidWcgdXNpbmcgJXJlbmFtZSBvbiBlbnVtIGl0ZW1zIGFuZCB3aGVuIHVzaW5nCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgLyAlY3Njb25zdCgxKQogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB1c2VkIHRvIGdlbmVyYXRlIGNvZGUgdGhhdCB3b3VsZG4ndCBjb21waWxlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoT2JqKSBPYmplY3Q7CiAgICAgICAgICAgICAgICBlbnVtIEdyYW1tYXIgeyBTdWJqZWN0LCBPYmplY3QgfTsKCjA0LzI4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTWlub3IgZml4ZXMgd2hlbiB1c2luZyBjb21iaW5hdGlvbnMgb2YgdGhlIAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcywgamF2YWJhc2UsIGNzaW50ZXJmYWNlcyBhbmQgY3NiYXNlIHR5cGVtYXBzLgoKMDUvMTgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEpWTSBsaW5rIGZhaWx1cmUgb24gc29tZSBzeXN0ZW1zIGZpeGVkIHdoZW4gdXNpbmcgc3RkX3ZlY3Rvci5pLgogICAgICAgICAgICBBbHNvIGFkZHMgZGVmYXVsdCB2ZWN0b3IgY29uc3RydWN0b3IgZm9yIHVzZSBmcm9tIEphdmEuCgowNS8xNy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgoJICAgIFtHdWlsZV0gTmV3IHJ1bnRpbWUgZnVuY3Rpb25zIFNXSUdfUG9pbnRlckFkZHJlc3MsCgkgICAgU1dJR19Qb2ludGVyVHlwZSwgU1dJR19Jc1BvaW50ZXJPZlR5cGUsIFNXSUdfSXNQb2ludGVyLgoKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgd3JhcCBzZXZlcmFsIFNXSUcgcnVudGltZSBmdW5jdGlvbnMKCSAgICBhbmQgZXhwb3J0IHRoZW0gaW50byB0aGUgbW9kdWxlIChTd2lnIHN3aWdydW4pLiAgVGhlCgkgICAgcnVudGltZSBtb2R1bGUgaXMgbm93IGJ1aWx0IHdpdGggIm1vZHVsZSIgbGlua2FnZS4KCgkgICAgW0d1aWxlXSBHT09QUyBwcm94eSBvYmplY3RzIG5vdyBhbHNvIHByaW50IHRoZSBwb2ludGVyCgkgICAgYWRkcmVzcyBvZiB0aGUgQyBvYmplY3QuCgowNS8xNC8yMDA0OiBseWxlCiAgICAgICAgICAgIEFkZGVkIEtvdSdzIHBhdGNoIGZvciB0aGUgUnVieSAlaW1wb3J0IGRpcmVjdGl2ZSBzbyB0aGF0IG1vZHVsZXMKICAgICAgICAgICAgd2l0aCAibmVzdGVkIiBuYW1lcyBhcmUgaGFuZGxlZCBwcm9wZXJseS4gQ29uc2lkZXIgYW4gaW50ZXJmYWNlCiAgICAgICAgICAgIGZpbGUgZm9vLmkgdGhhdCBoYXMgdGhpcyAlbW9kdWxlIGRlY2xhcmF0aW9uIGF0IGl0cyB0b3A6CgogICAgICAgICAgICAgICAgJW1vZHVsZSAibWlzYzo6dGV4dDo6Zm9vIgoKICAgICAgICAgICAgTm93IGNvbnNpZGVyIGFub3RoZXIgaW50ZXJmYWNlIGZpbGUgc3BhbS5pIHRoYXQgaW1wb3J0cyBmb28uaToKCiAgICAgICAgICAgICAgICAlaW1wb3J0IGZvby5pCiAgICAgICAgICAgIAogICAgICAgICAgICBCZWZvcmUgdGhpcyBwYXRjaCwgdGhpcyB3b3VsZCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyBjb2RlIGJlaW5nCiAgICAgICAgICAgIGdlbmVyYXRlZCBmb3Igc3BhbV93cmFwLmM6CgogICAgICAgICAgICAgICAgcmJfcmVxdWlyZSgibWlzYzo6dGV4dDo6Zm9vIik7CgogICAgICAgICAgICBXaXRoIHRoaXMgcGF0Y2gsIGhvd2V2ZXIsIHlvdSdsbCBnZXQgdGhlIGNvcnJlY3QgcGF0aCBuYW1lCiAgICAgICAgICAgIGZvciB0aGUgY2FsbCB0byByYl9yZXF1aXJlKCksIGUuZy4KCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjL3RleHQvZm9vIik7CgogICAgICAgICAgICBTZWUgU291cmNlRm9yZ2UgQnVnICM5MjgyOTkuCgowNS8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmb3IgZW1pdHRpbmcgZGlyZWN0b3JzIHdoZW4gJWZlYXR1cmUoImRpcmVjdG9yIikgc3BlY2lmaWVkCiAgICAgICAgICAgIGZvciBhIGNsYXNzIHdpdGggbm8gdmlydHVhbCBtZXRob2RzLCBidXQgZG9lcyBoYXZlIGEgdmlydHVhbCBkZXN0cnVjdG9yLgogICAgICAgICAgICBTdWJtaXR0ZWQgYnkgS2V2aW4gU21pdGguCgowNS8wNi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgTmV3IFNXSUcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVQcmV0dHlOYW1lLCB3aGljaCAKCSAgICByZXR1cm5zIGFuIHVubWFuZ2xlZCB0eXBlIG5hbWUgZm9yIGEgc3dpZ190eXBlX2luZm8KCSAgICBvYmplY3QuIAoKCSAgICBbR3VpbGVdOiBVc2UgaXQgZm9yIHByaW50aW5nIHBvaW50ZXIgb2JqZWN0cy4KCjA1LzAzLzIwMDQ6ICBkYW5jeSAoQWhtb24gRGFuY3kpCgoJKiBMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2c6ICBVcGRhdGVkIGNvbW1lbnRzIGFib3V0IGlkZW50aWZlcgoJY29udmVyc2lvbi4gIAoKCSogU291cmNlcy9Nb2R1bGVzL2FsbGVncm9jbC5jeHg6ICBSZWdpc3RlciAvZGV2L251bGwgZm9yICJoZWFkZXIiCgl0YXJnZXQuICAgQWxzbywgZGlzcmVnYXJkICJjb25zdCIgcXVhbGlmaWVycyBkdXJpbmcgdHlwZQoJY29udmVyc2lvbi4gIAoKCQowNS8wMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0gRml4IGJ1ZyA3ODI0NjguCgkgICAgVG8gZml4IHRoaXMgYnVnLCB0aGUgcnVudGltZSBjb2RlIGhhcyBiZWVuIHJld3JpdHRlbiwgYW5kCgkgICAgcG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyBhIENfU1dJR19QT0lOVEVSX1RZUEUuCgoJICAgIENoaWNrZW4gdmVyc2lvbiA+IDEuNDAgaXMgbm93IHJlcXVpcmVkIQoKCSAgICAqIFR5cGVtYXAgaW5jb21wYXRpYmlsaXR5OiAgdHlwZW1hcHMgbm8gbG9uZ2VyIHVzZSBjaGlja2VuX3dvcmRzLgoJICAgICAgSWYgYSB0eXBlbWFwIG5lZWRzIHNvbWUgc3BhY2UsIGl0IHNob3VsZCBqdXN0IGNhbGwgQ19hbGxvYwoKCSAgICAqIGFyZ291dCB0eXBlbWFwcyBubyBsb25nZXIgdXNlIHRoZSAvKiBpZiBPTkUgKi8gY29uc3RydWN0IHRvCgkgICAgICBidWlsZCBhbiBvdXRwdXQgbGlzdC4gIEEgU1dJR19BUFBFTkRfVkFMVUUgbWFjcm8sIGV4YWN0bHkgbGlrZQoJICAgICAgZ3VpbGUgYW5kIG16c2NoZW1lIGlzIG5vdyB1c2VkLgoKMDQvMjUvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gdGhlIGdlbmVyYXRlZCBHT09QUyBjb2RlLCBkb24ndCBjcmVhdGUgbWV0aG9kcwoJICAgIHRoYXQgd291bGQgbm90IHNwZWNpYWxpemUgYW55IGFyZ3VtZW50czsgc2ltcGx5IHJlLWV4cG9ydAoJICAgIHRoZSBwcmltaXRpdmUgZnVuY3Rpb25zLiAgKFRoaXMgaXMgYSBwZXJmb3JtYW5jZQoJICAgIG9wdGltaXphdGlvbiB3aGljaCByZWR1Y2VzIGxvYWQgdGltZSBhbmQgZXhlY3V0aW9uIHRpbWUuKQoKCSAgICBbR3VpbGVdIEluIC1naCBtb2RlLCBmaXggdGhlICJ0b28gbWFueSBpbml0aWFsaXplcnMiIGVycm9yCgkgICAgd2hpY2ggd2FzIGNhdXNlZCBieSBhbiBpbmNvbXBhdGlibGUgc3dpZ190eXBlX2luZm8gbGF5b3V0LgoKCSAgICBbR3VpbGVdIFRoZSB0eXBlbWFwIGZvciBGSUxFICogaW4gcG9ydHMuaSBub3cgYWxzbyBhY2NlcHRzCgkgICAgYSByZWd1bGFyIEZJTEUgKiBwb2ludGVyIG9iamVjdC4gIEFsc28gYSBidWcgd2l0aCBTY2hlbWUKCSAgICBmaWxlIHBvcnRzIHRoYXQgYXJlIG9wZW4gZm9yIGlucHV0IGFuZCBvdXRwdXQgaGFzIGJlZW4KCSAgICBmaXhlZC4gCgowNC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBDaGFuZ2UgZW50cnkgMDMvMjEvMjAwNCByZXZva2VkLiBUaGUgY2hhbmdlIGludHJvZHVjZWQgYW5vdGhlcgogICAgICAgICAgICBpbmNvbnNpc3RlbmN5IChyZWZlcmVuY2UgdHlwZW1hcHMgYmVpbmdzIHVzZWQgaW5zdGVhZCBvZgogICAgICAgICAgICBwb2ludGVyIHR5cGVtYXBzIGZvciBtZW1iZXIgdmFyaWFibGVzIGFzIHdlbGwgYXMgc3RhdGljCiAgICAgICAgICAgIG1lbWJlciB2YXJpYWJsZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMgZm9yIHNvbWUgbGFuZ3VhZ2VzLAogICAgICAgICAgICBidXQgb25seSBmb3IgQysrIGFuZCBub3QgQykuIFRoaXMgd291bGQgYnJlYWsgdXNlcidzIGN1cnJlbnQKICAgICAgICAgICAgdHlwZW1hcHMgYW5kIGludHJvZHVjZSBmdXJ0aGVyIGluY29uc2lzdGVuY2llcy4gQWx0ZXJuYXRpdmUKICAgICAgICAgICAgc29sdXRpb24gcmVxdWlyZWQgYW5kIGJlaW5nIGRpc2N1c3NlZC4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgQWRkZWQgdGhlIC1kaXJlY3RvcnMgZmxhZy4gVGhpcyBlbmFibGVzIHRoZSBkaXJlY3RvcgoJICAgIG1vZGUgZm9yIHRoZSBpbnRlcmZhY2UgYW5kIGFsbCB0aGUgY2xhc3NlcyB0aGF0CgkgICAgZG9uJ3Qgc2V0IHRoZSAiZmVhdHVyZTpub2RpcmVjdG9yIiBleHBsaWNpdGx5LgoKCSAgICBZb3UgY2FuIHVzZSB0aGlzIGluIHlvdXIgbW9kdWxlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGUKCSAgICBkaXJlY3RvciBmZWF0dXJlIGluIGFsbCB5b3VyIGNsYXNzZXMsIGJ1dCBpdCBpcyBtb3N0CgkgICAgaW50ZW5kZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMsIGxpa2U6CgoJICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1ydWJ5LXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCSAgICAgIG1ha2UgY2hlY2stamF2YS10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgoJICAgIFRoZXNlIGNvbW1hbmRzIHdpbGwgcnVuIHRoZSBlbnRpcmUgdGVzdC1zdWl0ZSB1c2luZwoJICAgIGRpcmVjdG9ycywgYW5kIG5vdCBvbmx5IHRoZSBzcGVjaWZpYyAnZGlyZWN0b3JzXyonCgkgICAgY2FzZXMuIFRoaXMgc2hvdWxkIGJlIGRvbmUgZnJvbSB0aW1lIHRvIHRpbWUuCgowNC8xMC8yMDA0OiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpIAoJICAgIAoJICAgIFtweXRob25dIEFkZGVkIHN1cHBvcnQgZm9yIHN0ZDo6d3N0cmluZyBhbmQgd2NoYXJfdCwKCSAgICBmb3IgY29tcGlsZXIgYW5kIHB5dGhvbiB2ZXJzaW9ucyB0aGF0IHN1cHBvcnQgdGhlbS4KCSAgICAKCSAgICBXaGVuIG5lZWRlZCwgdXNlIAoKCSAgICAgJWlubGN1ZGUgc3RkX3N0cmluZy5pICAgICAgLy8gJ2NoYXInIHN0cmluZ3MKCSAgICAgJWlubGN1ZGUgc3RkX3dzdHJpbmcuaSAgICAgLy8gJ3djaGFyX3QnIHN0cmluZ3MKCSAgICAKCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gRml4IHRoZSBkZWZhdWx0IGJlaGF2aW91ciAoc2VnLiBmYXVsdCkgd2hlbiBhbgoJICAgIGlucGxhY2Ugb3BlcmF0b3IgKCs9LC09LC4uLikgd2FzIHdyYXBwZWQsIGFzIHJlcG9ydGVkIGJ5CgkgICAgTHVjcml6IChsdWNyaXpAc2l0aWxhbmRpYS5pdCksIHdoZW4gdGhlIG1vc3QgY29tbW9uCgkgICAgZm9ybSB3YXMgdXNlZDoKCiAgICAgICAgICAgICAgICAgICBBJiAgQTo6b3BlcmF0b3IrPShpbnQgaSkgeyAuLi47IHJldHVybiAqdGhpczsgfQogICAgICAgICAgICAgICAgICBeXl5eICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXl5eXl5eCgkgICAgCgoJICAgIGllLCBhbiBvYmplY3QgaXMgcmV0dXJuZWQgYW5kIGl0cyBjb250YWlucyB0aGUgc2FtZSAndGhpcycKCSAgICB2YWx1ZSB0aGFuIHRoZSBpbnB1dCBvYmplY3QsIHdoaWNoIGlzIGRlbGV0ZWQgYWZ0ZXIgdGhlCgkgICAgb3BlcmF0aW9uICJhICs9IGIiLCBsZWF2aW5nIHRoZSByZXN1bHQgd2l0aCBubyByZWFsCgkgICAgb2JqZWN0LCBidXQgYSBzZWcuIGZhdWx0LgoKCSAgICBUbyBmaXggaXQsIHdlIG5lZWRlZCB0byBpbnRyb2R1Y2UgYSBuZXcgZmVhdHVyZSBhbmQgdXNlIGFuCgkgICAgb2xkIG9uZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciKSBBOjpvcGVyYXRvcis9OwoJICAgIAoJICAgIGhlcmUsICJzZWxmOmRpc293biIgZGlzYWJsZSB0aGUgb3duZXJzaGlwIG9mIHRoZSAnc2VsZicKCSAgICBvciBpbnB1dCBvYmplY3QsIGFuZCB0aGUgIm5ldyIgZmVhdHVyZSB0cmFuc2ZlcnMgdGhlCgkgICAgb3duZXJzaGlwIHRvIHRoZSByZXN1bHQgb2JqZWN0LgoJICAgIAoJICAgIFRoZSBmZWF0dXJlL3NvbHV0aW9uIGNvdWxkIGFsc28gYmUgdXNlZCBpbiBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IHVzZSBnYyBhbmQgaW1wbGVtZW50IHRoZSBpbnBsYWNlIG9wZXJhdG9ycywgb3Igb3RoZXIKCSAgICBvcGVyYXRvcnMsIGluIGEgc2ltaWxhciB3YXkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUHl0aG9uIE1PRFVMRSAqKioKCgkgICAgSWYgeW91IGFscmVhZHkgYXJlIHVzaW5nIHRoZSBpbnBsYWNlIG9wZXJhdG9ycyBpbiBweXRob24sCgkgICAgYW5kIHlvdSBpbXBsZW1lbnRlZCBzb21lIGtpbmQgb2Ygd29ya2Fyb3VuZCB0byB0aGUgcHJvYmxlbQoJICAgIGZpeGVkIGhlcmUsIGl0IGlzIHBvc3NpYmxlIHlvdSBjb3VsZCBlbmQgd2l0aCAnZnJlZScKCSAgICBvYmplY3RzIHRoYXQgbmV2ZXIgZ2V0IGRlbGV0ZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIGFuZAoJICAgIHlvdSB3YW50IHRvIGRpc2FibGUgdGhlIGN1cnJlbnQgZml4LCB1c2U6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgic2VsZjpkaXNvd24iLCIiKSBBOjpvcGVyYXRvcis9OwogICAgICAgICAgICAgICAlZmVhdHVyZSgibmV3IiwiIikgQTo6b3BlcmF0b3IrPTsKCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBDKysgZW51bXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkIGJ5IGludGVnZXJzLCB0aGV5IGFyZSBub3cgd3JhcHBlZCBieSAKICAgICAgICAgICAgQyMgZW51bXMuIEZvciBFeGFtcGxlLCBnaXZlbiBDKys6CgogICAgICAgICAgICAgICAgZW51bSBBbkVudW0geyBmb28sIGJhciB9OwogICAgICAgICAgICAgICAgdHlwZWRlZiBBbkVudW0gQW5FbnVtZXJhdGlvbjsKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKEFuRW51bSBlLCBBbkVudW1lcmF0aW9uIGYpOwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgcHVibGljIGVudW0gQW5FbnVtIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bSBmKSB7Li4ufQoKICAgICAgICAgICAgTm90ZSB0aGF0IGEgZ2xvYmFsIGVudW0gbGlrZSBBbkVudW0gYWJvdmUgaXMgZ2VuZXJhdGVkIGludG8gaXRzIG93bgogICAgICAgICAgICBmaWxlIGNhbGxlZCBBbkVudW0uY3MuIEVudW1zIGRlZmluZWQgd2l0aGluIGEgQysrIGNsYXNzIGFyZSBkZWZpbmVkCiAgICAgICAgICAgIHdpdGhpbiB0aGUgQyMgcHJveHkgY2xhc3MuIFNvbWUgb2YgdGhlIHR5cGVtYXBzIGZvciBtb2RpZnlpbmcgQyMgcHJveHkKICAgICAgICAgICAgY2xhc3NlcyBhbHNvIHdvcmsgZm9yIGVudW1zLiBGb3IgZXhhbXBsZSBnbG9iYWwgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzaW1wb3J0cykgdG8gYWRkIGluIGV4dHJhIHVzaW5nIHN0YXRlbWVudHMuCgogICAgICAgICAgICBHbG9iYWwgZW51bXMgYW5kIGNsYXNzIGVudW1zIGNhbiB1c2UKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSB0byBtYWtlIHRoZSBlbnVtIHByaXZhdGUsIHB1YmxpYyBldGMuCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UpIHRvIGNoYW5nZSB0aGUgdW5kZXJseWluZyBlbnVtIHR5cGUgKGVudW0gYmFzZSkKCiAgICAgICAgICAgIElmIHdlIGFkZCB0aGlzIGZvciB0aGUgYWJvdmUgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldHlwZW1hcChjc2NsYXNzbW9kaWZpZXJzKSBBbkVudW0gInByb3RlY3RlZCIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgQW5FbnVtICJsb25nIgoKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBpcyBnZW5lcmF0ZWQ6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgcHJvdGVjdGVkIGVudW0gQW5FbnVtIDogbG9uZyB7CiAgICAgICAgICAgICAgICAgIGZvbywKICAgICAgICAgICAgICAgICAgYmFyCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDQvMDcvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGVtcHR5IGVudW1zLCBsaWtlCiAgICAgICAgICAgICAgICBlbnVtIEZvbyB7fTsKCjAzLzIxLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbTm90ZTogdGhpcyBjaGFuZ2UgcmV2b2tlZCBvbiAwNC8yNS8yMDA0XQoJICAgIFtQeXRob25dIE1ha2VzIHRoZSBmb2xsb3dpbmcgJ3ZhcicgY2FzZXMgbW9yZSB1bmlmb3JtOgoKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGdhOwogCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBzdGQ6OnN0cmluZyBzYTsKICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWE7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIG5vdyB0aGUgdGhyZWUgdmFyaWFibGVzIChnYSwgc2EsIG1hKSBjYW4gYmUgYXNzaWduZWQgYXM6CgoKICAgICAgICAgICAgICAgICAgY3Zhci5nYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIEEuc2EgPSAiaGVsbG8iOwogICAgICAgICAgICAgICAgICBhLm1hID0gImhlbGxvIjsKCiAgICAgICAgICAgIGllLCBub3cgJ21hJyB3aWxsIGFsc28gdXNlIGEgc3RkOjpzdHJpbmcgdHlwZW1hcCAnaW4nIGlmCiAgICAgICAgICAgIGRlZmluZWQsIGJlZm9yZSBpdCB3YXMgb25seSBhY2NlcHRpbmcgYSAncF9zdGRfc3RyaW5nJwogICAgICAgICAgICBwb2ludGVyLiAgTm90ZSwgaG93ZXZlciwgdGhhdCAnbWEnIHdpbGwgbm90IHVzZSB0aGUKICAgICAgICAgICAgJ3ZhcmluL3Zhcm91dCcgdHlwZW1hcHMgKHRoYXQgcHJvYmFibHkgY291bGQgYmUgbW9yZQogICAgICAgICAgICBuYXR1cmFsKSwgYnV0IGl0IHdpbGwgcGljayB1cCB0aGUgJ2luJyB0eXBlbWFwIGZvciBjb25zdAogICAgICAgICAgICBzdGQ6OnN0cmluZyYgKHdoaWNoIGlzIGVhc2llcikuCgoJICAgIFRoZSBjaGFuZ2VzIGluIGN3cmFwLmMgYW5kIGxhbmcuY3h4IHdpbGwgcHJvYmFibHkgZml4IHRoZQoJICAgIGJlaGF2aW91ciBpbiBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgb3ZlcmxvYWQgdGhlCgkgICAgbWVtYmVydmFySGFuZGxlciBtZXRob2QgInRvbyBtdWNoIi4KIAogICAgICAgICAgICAKMDMvMjEvMjAwNDogbW1hdHVzCgkgICAgW1B5dGhvbl0gRGlzYWJsaW5nIHRoZSBkZWZhdWx0IGluc3RhbnRpYXRpb25zIGxpa2U6CgoJICAgICAgJXRlbXBsYXRlKCkgc3RkOjpwYWlyPGludCxpbnQ+OwoKICAgICAgICAgICAgZm9yIGFsbCB0aGUgcHJpbWl0aXZlIHR5cGVzIGFuZCBTVEwgY29udGFpbmVycy9jbGFzc2VzLgoJICAgIFRoZXkgYXJlIGV4cGVuc2l2ZSwgc3BlY2lhbGx5IGZvciBwYWlyIGFuZCBtYXAsIGFuZCB0aGUKCSAgICBwcmV2aW91cyBiZWhhdmlvdXIgYWxzbyByZXF1aXJlcyB0aGUgdXNlciB0byBwZXJmb3JtCgkgICAgbWFudWFsIGluc3RhbnRpYXRpb25zLiBTdGlsbCwgaWYgdGhlIHNwZWVkIGRpZmZlcmVuY2UgaXMKCSAgICBub3QgaW1wb3J0YW50LCBpdCBjYW4gYmUgcmUtZW5hYmxlZCBieSBkZWZpbmluZyB0aGUgbWFjcm8KCSAgICBTV0lHX1NURF9ERUZBVUxUX0lOU1RBTlRJQVRJT04gKHNlZSBzdGRfY29tbW9uLmkpLgoKCSAgICBBbHNvLCBub3JtYWxpemluZyB0aGUgSU5QVVQvT1VUUFVUL0lOT1VUIHR5cGVtYXBzLiBOb3cKCSAgICB0aGV5IHVzZSB0aGUgc2FtZSBjb252ZXJzb3JzIHRoYW4gdGhlIHJlc3Qgb2YgdGhlCgkgICAgdHlwZW1hcHMsIGFuZCB5b3UgY2FuIHVzZSB0aGVtIGZvciBzdGQ6OnBhaXIsIHN0ZDo6c3RyaW5nCgkgICAgYW5kIGFsbCB0aGUgb3RoZXIgU1RMIHR5cGVzLCBsaWtlIGluOgoKCSAgICAgIHZvaWQgcF9pbm91dGQoc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPiAqSU5PVVQpOwoKCSAgICBBZGRlZCB0aGUgYXR0cmlidXRlLmkgYW5kIGltcGxpY2l0LmkgZmlsZXMgd2l0aCBtYWNyb3MgdG8KCSAgICB0cmFuc2Zvcm0gZnVuY3Rpb25zIHBhaXJzIGxpa2UgJ3NldF94Jy8nZ2V0X3gnIAoJICAgIChvciAnVCYgeCgpJy8nY29uc3QgVCYgeCgpIGNvbnN0JykgaW50byBhbiBhdHRyaWJ1dGUsCgkgICAgYW5kIGFsbG93aW5nIHRoZSB1c2Ugb2YgaW1wbGljaXQgY29uc3RydWN0b3JzIGluIHR5cGVtYXBzCgkgICAgKHNlZSB0aGUgZmlsZXMgZm9yIG1vcmUgZGV0YWlscykuCgowMy8yMS8yMDA0OiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggdGhlIGRvY3VtZW50YXRpb24gc3RyaW5ncyBvZiBmdW5jdGlvbnMgd2l0aAoJICAgIGFub255bW91cyBhcmd1bWVudHMuCgowMy8xOC8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBNb3JlIGdlbmVyYWwgc3RkX3N0cmluZy5pIGludGVyZmFjZS4KCSAgICBOb3cgeW91IGNhbiB3cmFwIGl0IHVzaW5nCgoJICAgICAgJXRlbXBsYXRlKHN0cmluZykgc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj47CgogICAgICAgICAgICBhbmQgdXNlIHRoZSBzdGQ6OnN0cmluZyBhcyBhIGJhc2UgY2xhc3M6CgoJICAgICAgc3RydWN0IEEgOiBzdGQ6OnN0cmluZyB7CiAgICAgICAgICAgICAgfTsKCgkgICAgQnV0IG1vcmUgaW1wb3J0YW50LCBzd2lnIHdpbGwgcmVjb2duaXplIAoJICAgIGJvdGggc3RkOjpiYXNpY19zdHJpbmc8Y2hhcj4gYW5kIHN0ZDo6c3RyaW5nIGFzCgkgICAgdGhlIHNhbWUgdHlwZS4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFByZXZpb3VzbHkgYWRkZWQsIGJ1dCBub3QgbWVudGlvbmVkIGJlZm9yZToKCgkgICAgLSBmcmllbmQgZGVjbGFyYXRpb24gc3VwcG9ydCwgc3dpZyBub3cgZW1pdHMgYSBnbG9iYWwKCSAgICAgIGZ1bmN0aW9uIGluIHRoZSBzYW1lIGNsYXNzIHNjb3BlLgoKCSAgICAtIHJlZi91bnJlZiBmZWF0dXJlczogdG8gbWl4IHJlZiBjb3VudGluZyBDKysgY2xhc3NlcwoJICAgICAgYW5kIG5hdGl2ZSBzY3JpcHQgcmVmIGNvdW50aW5nIG1lY2hhbmlzbXMgKGxpa2UgaW4gcHl0aG9uKS4KCSAgICAKCSAgICAgIFVzZSBpdCBsaWtlOgoKIAkgICAgICAgICVmZWF0dXJlKCJyZWYiKSAgIFJDT2JqICIkdGhpcy0+cmVmKCk7IgogICAgICAgICAgICAgICAgJWZlYXR1cmUoInVucmVmIikgUkNPYmogIiR0aGlzLT51bnJlZigpOyIKCgkgICAgICBBbmQgdGhlIGNsYXNzIFJDT2JqLCBhbmQgYWxsIHRoZSBkZXJpdmVkIG9uZXMsIHdpbGwKCSAgICAgIHBlcmZvcm0gdGhlIHJpZ2h0IHJlZi91bnJlZiBjYWxscyB3aGVuIGEgbmV3IHBvaW50ZXIgIAoJICAgICAgaXMgcmV0dXJuZWQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSwgb3Igd2hlbiB0aGUgdGFyZ2V0CgkgICAgICBsYW5ndWFnZSBhdHRlbXB0cyB0byBkZWxldGUgdGhlIG9iamVjdC4KCSAgICAgIAoJICAgICAgU2VlIHRoZSByZWZjb3VudC5pIGZpbGUgaW4gdGhlIHRlc3Qtc3VpdGUgZm9yIG1vcmUKCSAgICAgIGRldGFpbHMuCgoJICAgIAowMy8xNi8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBVc2luZyB0aGUgbmV3ICVmcmFnbWVudCBzdXBwb3J0LCBtYWpvciByZXdyb3RlIAoJICAgIG9mIHRoZSBweXRob24gc3dpZyBsaWJyYXJ5LCBpbmNsdWRpbmc6CgoJICAgIC0gQWxtb3N0IGF1dG9tYXRpYyB0ZW1wbGF0ZS90eXBlbWFwIGluc3RhbnRpYXRpb24gZm9yCgkgICAgICB0aGUgU1RMIGNvbXBvbmVudHMuIEZvciBleGFtcGxlLCBub3cgeW91IGNhbiB3cml0ZToKCgkJICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgICBhbmQgYSBzcGVjaWFsaXplZCB2ZWN0b3JfaSBjbGFzcyBpcyBlbWl0dGVkIHdpdGggYWxsCgkgICAgICB0aGUgbmVlZGVkIHR5cGVtYXBzLiBObyBuZWVkIHRvIHVzZSB0aGUgb2xkCgkgICAgICAnc3BlY2lhbGl6ZV92ZWN0b3InIG1hY3Jvcy4KCgkgICAgICBOb3RlIHlvdSBjYW4gYWxzbyBkZWZpbmUKCgkgICAgICAgICAgJXRlbXBsYXRlKG1hdHJpeF9pKSAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPGludD4gPjsKCSAgICAgICAgICAldGVtcGxhdGUodmVjdG9yX3BpaSkgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludCxpbnQ+ID47CgoJICAgIC0gVGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gCiAJIAogICAgICAgICAgIAkgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgoJICAgICAgZGVmaW5lcyB0aGUgdmVjdG9yIHR5cGVtYXBzLCBidXQgbm8gcHJveHkgY2xhc3MuIEZvciBhbGwgdGhlCiAgICAgICAgICAgICAgZnVuZGFtZW50YWwgdHlwZXMsIHRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGFyZQogICAgICAgICAgICAgIGRlZmluZWQsIHNvLCB5b3UgY2FuIHNheQoKCSAgICAgICVpbmNsdWRlIHN0ZF92ZWN0b3IKCgkgICAgICBpbnQgZnVuYyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBhKTsKCSAgICAgIAoJICAgICAgd2hlcmUgdGhlIHByb3BlciB0eXBlbWFwIGlzIGFwcGxpZWQgdG8gJ2EnLCBidXQgbm8KCSAgICAgIHN0ZDo6dmVjdG9yPGludD4gcHJveHkgaXMgZ2VuZXJhdGVkLgoJICAgICAgCgogICAgICAgICAgICAtIEFsbCB0aGUgU1RMIGNvbnRhaW5lcnMgcHJlc2VudCBhIG1vcmUgdW5pZm9ybSBiZWhhdmlvciBhbmQKCSAgICAgIG1vcmUgY29tcGxldGUgaW50ZXJmYWNlIGRlY2xhcmF0aW9uLiBUaGUgZm9sbG93aW5nIGFyZSAKCSAgICAgIG5vdyBzdXBwb3J0ZWQ6CgoJCSAgc3RkOjp2ZWN0b3I8VD4KCQkgIHN0ZDo6bGlzdDxUPgoJCSAgc3RkOjpkZXF1ZTxUPgoJCSAgc3RkOjpzZXQ8VD4KCQkgIHN0ZDo6bXVsdGlzZXQ8VD4KCQkgIHN0ZDo6bWFwPFQ+CgkJICBzdGQ6Om11bHRpbWFwPFQ+CiAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgbm90IGEgY29udGFpbmVyLCBidXQgYWxzbyBzdXBwb3J0ZWQ6CgoJCSAgc3RkOjpwYWlyPFQsVT4KCiAgICAgICAgICAgICAgYWxzbywgbW9yZSB0eXBlbWFwcyBhcmUgZGVmaW5lZCBmb3IgYWxsIG9mIHRoZW0sCgkgICAgICBpbmNsdWRpbmcgdmFyaW4sIHZhcm91dCwgdHlwZWNoZWNrLCBldGMuCgogICAgICAgICAgICAtIEluaXRpYWwgYXR0ZW1wdCB0byBpbXBsZW1lbnQgdGhlIFNUTCBjb250YWluZXJzCiAgICAgICAgICAgICAgY29uc2lkZXJpbmcgYWxsb2NhdG9ycywgaWU6CgoJICAgICAgICAgIHN0ZDo6dmVjdG9yPFQsQT4JCQkKCgkgICAgICBpdCBpcyBwYXJ0aWFsbHkgd29ya2luZywgYnV0IGl0IGlzIGp1c3QgYSB3b3JrYXJvdW5kCgkgICAgICB3aGlsZSBzd2lnIGltcHJvdmVzIGl0cyB0ZW1wbGF0ZSB0eXBlIHN1cHBvcnQuCgkgICAgICAKCSAgICAgIAoJICAgICBQbGVhc2UgdGVzdCB3aXRoIHlvdXIgcGFydGljdWxhciBzZXR1cC4gSXQgc2VlbXMgdG8gYmUKCSAgICAgd29ya2luZyB3aXRoIGcrKyAzLjIuMiwgZysrIDIuOTYsIEludGVsIGljYyBhbmQgU0dJIENDCgkgICAgIGNvbXBpbGVycywgcGx1cyBweXRob24gMS41LjIsIDIuMCBhbmQgMi4zLCBidXQgc2luY2UKCSAgICAgd2UgYXJlIHVzaW5nIHRlbXBsYXRlcywgdGhlcmUgaXMgYSBjaGFuY2UgeW91IGNhbiBmaW5kCgkgICAgIHNvbWUgcHJvYmxlbXMgd2hlbiB1c2luZyB3aXRoIGFuIG9sZCBDKysgY29tcGlsZXIuCgowMy8xNi8yMDA0OiBtbWF0dXMKCiAgICAgICAgICAgIC0gQWxsb3dpbmcgdGhlIGVtcHR5ICV0ZW1wbGF0ZSBkaXJlY3RpdmUsIHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICB0byBwcm9jZXNzIHRoZSBjbGFzcyAidHlwZWRlZiJzIGFuZCAidHlwZW1hcCJzLiBCZWZvcmUKCSAgICAgIG9ubHkgdGhlIGludGVybmFsICJ0eXBlZGVmInMgd2VyZSBwcm9jZXNzZWQuCgogICAgICAgICAgICAgIFRoaXMgbWFrZXMgcG9zc2libGUgdG8gZW1pdCB0aGUgZGVmYXVsdCBpbi9vdXQKICAgICAgICAgICAgICB0eXBlbWFwcyB3aXRob3V0IHRoZSBuZWVkIG9mIHdyYXBwaW5nIGFuIHNwZWNpYWxpemVkCiAgICAgICAgICAgICAgdmVjdG9yIGluc3RhbmNlLgoKCSAgICAtIEFkZGluZyB0aGUgcHJlcHJvY2Vzc29yIGV4dGVuc2lvbiAjQCB3aGljaCBtYW5nbGVzIHRoZQogICAgICAgICAgICAgIGZvbGxvd2luZyBtYWNybyBhcmd1bWVudCwgbGlrZSBpbjoKCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1hY3JvKFgpICAjQFgKICAgICAgICAgICAgICAgIG1hY3JvKGludCkgICAgICAgICAtPiBpbnQKICAgICAgICAgICAgICAgIG1hY3JvKHN0ZDo6c3RyaW5nKSAtPiBzdGRfc19zX3N0cmluZwogICAgICAgICAgICAgICAgCgkgICAgLSBGcmFnbWVudHMgY2FuIG5vdyBiZSAidHlwZSBzcGVjaWFsaXplZCIsIGFzIHRoZSB0eXBlbWFwcy4gVGhlCgkgICAgICBzeW50YXggaXMgYXMgZm9sbG93cwogCiAgICAgICAgICAgICAgICAlZnJhZ21lbnQoIm5hbWUiLCJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiBhIHR5cGUgaW5kZXBlbmRlbnQgZnJhZ21lbnQgKG9sZCBzeW50YXgpICovIH0KICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIge1R5cGV9LCAiaGVhZGVyIikgCiAgICAgICAgICAgICAgICAgIHsgLyogdGhlIGZyYWdtZW50IGlzIHR5cGUgZGVwZW5kZW50ICovfQogCiAgICAgICAgICAgICAgTm93IGZyYWdtZW50cyBjYW4gYWxzbyBiZSB1c2VkIGluc2lkZSB0ZW1wbGF0ZXM6IAoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgJWZyYWdtZW50KCJpbmNvZGUie0E8VD59LCJoZWFkZXIiKSB7CgkJICAgICAgLyogJ2luY29kZScgc3BlY2lhbGl6ZWQgZnJhZ21lbnQgKi8KCQkgICB9CiAKCQkgICAldHlwZW1hcChpbixmcmFnbWVudD0iaW5jb2RlIntBPFQ+fSkgewoJCSAgICAgIC8qCgkJICAgICAgICAgaGVyZSB3ZSB1c2UgdGhlICd0eXBlIHNwZWNpYWxpemVkJyAKICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50ICJpbmNvZGUie0E8VD59CiAgICAgICAgICAgICAgICAgICAgICAqLwoJCSAgICB9CiAgICAgICAgICAgICAgICB9OwoJCQkgICAgIAkKCjAzLzExLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3IgYnVnIHdoaWNoIG1lYW50IHRoYXQgc29tZSB2aXJ0dWFsIGZ1bmN0aW9ucyBvdmVycmlkZGVuIGluCiAgICAgICAgICAgIEphdmEgd2VyZSBub3QgYmVpbmcgY2FsbGVkIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMuIEJ1ZyByZXBvcnRlZCBhbmQgZml4ZWQKICAgICAgICAgICAgYnkgUm9iZXJ0IGRlIFZyaWVzIGFuZCBTY290dCBNaWNoZWwuCgowMy8wMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IGZvcmdldCB0byBjaGVjayB0aGUgdHlwZSBvZiBzdHJpbmcgYXJndW1lbnRzLgoKMDIvMjQvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gTmV3IGNvbW1hbmRsaW5lIG9wdGlvbiAtbmFtZXNwYWNlIDxuYW1lPi4gVGhpcyBhbGxvd3Mgb25lIHRvIHNwZWNpZnkKICAgICAgICAgICAgYSBDIyBuYW1lc3BhY2UgaW50byB3aGljaCBhbGwgQyMgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkLgoKMDIvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKSAKCSAgICBbTXpTY2hlbWVdIFVzZSBGVU5DX05BTUUgcmF0aGVyIHRoYW4gYSBib2d1cyB0eXBlbWFwIHZhcmlhYmxlIGZvciBzaWduYWxsaW5nCgkgICAgZXJyb3JzLiAgQ2FsbCBzY2hlbWVfd3JvbmdfdHlwZSB3aXRoIGEgemVyby1iYXNlZCBhcmd1bWVudCBudW1iZXIuICAKCSAgICBSZXBvcnRlZCBieSBPbmRyZWogUGFjb3Zza3ksIFNGICM5MDI2MjEuCgoJICAgIFtHdWlsZV0gRGVmaW5lIEZVTkNfTkFNRSBhbHNvIGluIHRoZSBkaXNwYXRjaCB3cmFwcGVyIGZvciBvdmVybG9hZGVkCgkgICAgZnVuY3Rpb25zLiAgUGF0Y2ggYnkgSm9obiBMZW56LCBTRiAjODk2MjU1LgoKMDIvMjIvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCBkb24ndCB0cnkgdG8gaW52b2tlIGEgbnVsbCBkZXN0cnVjdG9yIGZ1bmN0aW9uLgoKMDIvMjAvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHNvIHRoYXQgdGhlIFNXSUcgc291cmNlIHdpbGwgY29tcGlsZSB1c2luZyB0aGUgRGlnaXRhbCBNYXJzIENvbXBpbGVyCiAgICAgICAgICAgIChmb3JtZXJseSBTeW1hbnRpYyBjb21waWxlcikgb24gV2luZG93cy4gU3VibWl0dGVkIGJ5IFNjb3R0IE1pY2hlbC4KCjAyLzEzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIE5ldyBjb21tYW5kLWxpbmUgYXJndW1lbnQgLW5vaW5pdC4gIFVzZSBpdCBmb3IgYnVpbGRpbmcKCSAgICB0aGUgcnVudGltZSBsaWJyYXJ5LCB3aGVyZSB3ZSBkb24ndCB3YW50IHRvIGRlZmluZSB0aGUgZnVuY3Rpb25zCgkgICAgc2NoZW1lX2luaXRpYWxpemUgZXRjLiAgUmVwb3J0ZWQgYnkgVGltIEJyb3duLCBTRiAjODkxNzU0LgoKCSAgICBbTXpTY2hlbWVdIERvbid0IHByb2R1Y2UgaW52YWxpZCBDIGNvZGUgd2hlbiBpbnZva2VkIHdpdGggdGhlCgkgICAgLWRlY2xhcmVtb2R1bGUgb3B0aW9uLiAgUmVwb3J0ZWQgYnkgVGltIEJyb3duLCBTRiAjODkxMTA4LgoJICAgIAoJICAgIFtHdWlsZV0gQnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyeSB3aXRoIHBhc3NpdmUgbGlua2FnZSwgdG8gcmVuYW1lCgkgICAgdGhlIFNXSUdfaW5pdCBmdW5jdGlvbiB1bmlxdWVseS4KCjAyLzEyLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFBhdGNoIHN1Ym1pdHRlZCBieSBCaWxsIEhvZmZtYW4gd2hpY2ggcHJldmVudHMgU1dJRyBmcm9tIGNyYXNoaW5nCiAgICAgICAgICAgIHdoZW4gYSBmaWxlIGZvciB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgY2Fubm90IGJlIG9wZW5lZC4KCjAyLzExLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIE92ZXJsb2FkaW5nIGNoYW5nZXM6CiAgICAgICAgICAgICAgLSBNZXRob2RzIHdoaWNoIGFyZSBvdmVybG9hZGVkIGluIGNvbnN0IG9ubHkgbm8gbG9uZ2VyIGdlbmVyYXRlIEphdmEKICAgICAgICAgICAgICAgIGNvZGUgdGhhdCB3b24ndCBjb21waWxlIC0gdGhlIGZpcnN0IG1ldGhvZCBwYXJzZWQgaXMgdXNlZCBhbmQgYQogICAgICAgICAgICAgICAgd2FybmluZyBpcyBkaXNwbGF5ZWQuIE5vdGUgdGhhdCB0aGlzIGJlaGF2aW91ciBpcyBzbGlnaHRseSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgIHRvIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdoaWNoIGFsd2F5cyB1c2VzIHRoZSBub24tY29uc3QgbWV0aG9kLgogICAgICAgICAgICAgIC0gV2FybmluZyBtZXNzYWdlcyA1MDkgYW5kIDUxMiByZXBsYWNlZCBieSBuZXcgd2FybmluZyBudW1iZXIgNTE2LCB3aGljaCAKICAgICAgICAgICAgICAgIGlzIG1vcmUgcmVsZXZhbnQgdG8gdGhlc2Ugc3RhdGljYWxseSB0eXBlZCBsYW5ndWFnZXMgYXMgdGhlIG92ZXJsb2FkZWQKICAgICAgICAgICAgICAgIG1ldGhvZHMgYXJlbid0ICdzaGFkb3dlZCcsIHRoZXkgYXJlIGlnbm9yZWQuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZXBsYWNlIHRoZSAia25vd25fY2xhc3NlcyIgaGFzaCB0YWJsZSBieSBhIG5vZGUKCSAgICBhdHRyaWJ1dGUuICBNZXRob2RzIG9mIGNsYXNzZXMgaW4gQysrIG5hbWVzcGFjZXMgbm93IGdldAoJICAgIHRoZSBwcm9wZXIgc3BlY2lhbGl6ZXIgaW4gdGhlIEdPT1BTIGRlY2xhcmF0aW9uLgoJICAgIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gVW5pcXVpZnkgdGhlIGFyZ3VtZW50IG5hbWVzIGluIEdPT1BTIHNoYWRvdyBtZXRob2QKCSAgICBkZWNsYXJhdGlvbnMuICBSZXBvcnRlZCBieSBybUBtaC1mcmVpYnVyZy5kZS4KCjAxLzIxLzIwMDQ6IHN1bnNoaW5lIChFcmljIFN1bnNoaW5lKQogICAgICAgICAgICBSZXZpdmVkIHRoZSBOZXh0U3RlcCBwb3J0IG9mIFNXSUcuCgogICAgICAgICAgICBGaXhlZCBmYXRhbCBwcm9ibGVtIGluIERvaFN0cnN0cigpIGNhdXNlZCBieSBkaWZmZXJlbmNlIGluIHN0cnN0cigpCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHdoaWNoIG1hZGUgJWFwcGx5IGJlY29tZSBlbnRpcmVseSBkeXNmdW5jdGlvbmFsLiAgT24KICAgICAgICAgICAgTmV4dFN0ZXAsIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGVzIHRvIE5VTEw7IHdoZXJlYXMsIG9uIG1vZGVybgogICAgICAgICAgICBwbGF0Zm9ybXMsIGl0IGV2YWx1YXRlcyB0byAiZm9vIi4gICVhcHBseSByZWxpZXMgZXh0ZW5zaXZlbHkgdXBvbgogICAgICAgICAgICBzdHJzdHIoImZvbyIsIiIpIGV2YWx1YXRpbmcgdG8gbm9uLU5VTEwsIHRoZXJlZm9yZSBpdCBmYWlsZWQKICAgICAgICAgICAgY2F0YXN0cm9waGljYWxseSB3aGVuIGZhY2VkIHdpdGggTmV4dFN0ZXAncyBzdHJzdHIoKS4KCiAgICAgICAgICAgIEFkZGVkIGBib29sJyBjaGVjayB0byBjb25maWd1cmUuaW4gc2luY2UgTmV4dFN0ZXAncyBDKysgY29tcGlsZXIKICAgICAgICAgICAgZG9lcyBub3Qgc3VwcGx5IHRoaXMgdHlwZS4gIHN3aWcuaCBub3cgZmFrZXMgdXAgYGJvb2wnIGlmIG5lZWRlZC4KCiAgICAgICAgICAgIFdvcmtlZCBhcm91bmQgTmV4dFN0ZXAgQysrIGNvbXBpbGVyIGJ1ZyBpbiB3aGljaCBDKysgY29kZSBpcwogICAgICAgICAgICBkaXNhbGxvd2VkIGluc2lkZSBleHRlcm4gIkMiIGZ1bmN0aW9ucy4gIFRoaXMgcHJvYmxlbSBhZmZlY3RlZCBhbGwKICAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcywgc2luY2UgdGhleSBwdWJsaXNoIGhvb2sgZnVuY3Rpb25zIG9mIHRoZSBmb3JtOgogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqc3dpZ19mb28odm9pZCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgIEZpeGVkIGJ5IGNyZWF0aW5nIGEgQysrIHdyYXBwZXI6CiAgICAgICAgICAgICAgICBzdGF0aWMgTGFuZ3VhZ2UgKm5ld19zd2lnX2ZvbygpIHsgcmV0dXJuIG5ldyBGT08oKTsgfQogICAgICAgICAgICAgICAgZXh0ZXJuICJDIiBMYW5ndWFnZSAqc3dpZ19mb28odm9pZCkgeyByZXR1cm4gbmV3X3N3aWdfZm9vKCk7IH0KCiAgICAgICAgICAgIEVuc3VyZWQgdGhhdCBTd2lnX2NvcHlfc3RyaW5nKCkgaXMgdXNlZCBpbiBwbGFjZSBvZiBzdHJkdXAoKSBzaW5jZQogICAgICAgICAgICBOZXh0U3RlcCBkb2VzIG5vdCBzdXBwbHkgc3RyZHVwKCkuCgogICAgICAgICAgICBGaXhlZCBkZXRlY3Rpb24gb2YgUnVieSBsaWJyYXJ5IG5hbWUgYW5kIGxvY2F0aW9uIGluIGNvbmZpZ3VyZS5pbi4KICAgICAgICAgICAgUHJvYmxlbSAxOiBBc3N1bWVkIHRoYXQgbGlicmFyeSBhbHdheXMgcmVzaWRlZCBpbiBSdWJ5J3MgImFyY2hkaXIiLAogICAgICAgICAgICB3aGljaCB3YXMgY29ycmVjdCBmb3IgUnVieSAxLjYueCwgYnV0IHdoaWNoIGlzIGluY29ycmVjdCBmb3IgUnVieQogICAgICAgICAgICAxLjgueCwgaW4gd2hpY2ggY2FzZSB0aGUgbGlicmFyeSBub3JtYWxseSByZXNpZGVzIGluIFJ1YnkncwogICAgICAgICAgICAibGliZGlyIi4gIFByb2JsZW0gMjogQXNzdW1lZCB0aGF0IHRoZSBsaWJyYXJ5IGNvdWxkIGFsd2F5cyBiZQogICAgICAgICAgICBsaW5rZWQgdmlhICItbCIrUlVCWV9JTlNUQUxMX05BTUUgKHdoZXJlIFJVQllfSU5TVEFMTF9OQU1FCiAgICAgICAgICAgIHR5cGljYWxseSBpcyAicnVieSIpLCBob3dldmVyIHRoaXMgZmFpbGVkIGZvciBwbGF0Zm9ybXMsIHN1Y2ggYXMKICAgICAgICAgICAgTmV4dFN0ZXAsIHdoaWNoIGRvIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMuICBJbiB0aGlzIGNhc2UsIHRoZQogICAgICAgICAgICBzdGF0aWMgbGlicmFyeSBuYW1lIGluIDEuOC54IGlzIGxpYnJ1Ynktc3RhdGljLmEsIHRodXMKICAgICAgICAgICAgLWxydWJ5LXN0YXRpYyBpcyByZXF1aXJlZC4gIFRoZSBuZXcgbG9naWMgd29ya3MgY29ycmVjdGx5IGZvcgogICAgICAgICAgICBzdGF0aWMgYW5kIHNoYXJlZCBsaWJyYXJpZXMgZm9yIDEuNi54IGFuZCAxLjgueC4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBQZXJsIENGTEFHUyBpbiBjb25maWd1cmUuaW4gZm9yIE5leHRTdGVwLgogICAgICAgICAgICBEZXRlY3Rpb24gY29kZSBleHRyYWN0ZWQgQ0ZMQUdTIGZyb20gUGVybCdzICVDb25maWcgaGFzaCBidXQKICAgICAgICAgICAgbmVnbGVjdGVkIHRvIGFkZCBhIG5ld2xpbmUgdG8gdGhlIHZhbHVlIGJlZm9yZSBwYXNzaW5nIGl0IHRocm91Z2gKICAgICAgICAgICAgYHNlZCcuICBOZXh0U3RlcCdzIGFuY2llbnQgYHNlZCcgZGlzY2FyZHMgaW5wdXQgd2hpY2ggaXMgbm90CiAgICAgICAgICAgIHRlcm1pbmF0ZWQgd2l0aCBhIG5ld2xpbmUsIHRodXMgUGVybCBDRkxBR1MgYWx3YXlzIGV2YWx1YXRlZCB0byB0aGUKICAgICAgICAgICAgZW1wdHkgc3RyaW5nLgoKMDEvMTYvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRpZHkgdXAgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIHRoYXQgaXMgZ2VuZXJhdGVkIHdoZW4KICAgICAgICAgICAgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBhcmUgd3JhcHBlZCB3aXRoIHRoZSB0aHJvd3MgdHlwZW1hcC4KICAgICAgICAgICAgVGhpcyByZWR1bmRhbnQgY29kZSBpcyBubyBsb25nZXIgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIGNhdGNoKC4uLikgewogICAgICAgICAgICAgICAgICAgIHRocm93OyAKICAgICAgICAgICAgICAgIH0KCjAxLzEyLzIwMDQ6IHdzZnVsdG9uIG9uIGJlaGFsZiBvZiBtbWF0dXMgKG1hcmNlbG8gbWF0dXMpIAogICAgICAgICAgICBpZiBhIG1ldGhvZCB1c2VzICVleGNlcHRpb24gYW5kIHRoZSBtZXRob2QgcmVxdWlyZXMgdGhlIHVzZQogICAgICAgICAgICBvZiB0aGUgdGhyb3dzIHR5cGVtYXAsIHRoZSBjb2RlIGluIGEgdGhyb3dzIHR5cGVtYXAgd2lsbCBiZQogICAgICAgICAgICBnZW5lcmF0ZWQgaW5zaWRlIHRoZSB0cnkgYm9keS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gbWV0aG9kIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBpbnQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBnZW5lcmljIGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzKSBFeGNlcHQgJXsKICAgICAgICAgICAgICAgIC8vIHRocm93cyB0eXBlbWFwIEV4Y2VwdCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgIGNsYXNzIEV4Y2VwdCB7fTsKICAgICAgICAgICAgICB2b2lkIG1ldGhvZChpbnQgaSkgdGhyb3cgKEV4Y2VwdCk7CgogICAgICAgICAgICBXaWxsIGdlbmVyYXRlOgoKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgYWN0aW9uIAogICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QoYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBjYXRjaChFeGNlcHQgJl9lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICB9IGNhdGNoIChpbnQgaSkgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIEFzIGNhbiBiZSBzZWVuLCB0aGUgaW5uZXIgdHJ5IGNhdGNoIGJsb2NrIGlzIGZvciB0aGUgdGhyb3dzIHR5cGVtYXBzLgogICAgICAgICAgICBQcmV2aW91c2x5LCB0aGlzIHdhcyByZXZlcnNlZCBzbyB0aGF0IHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sKICAgICAgICAgICAgd2FzIHRoZSAlZXhjZXB0aW9uIGNvZGUuIEluIHRoZSBleGFtcGxlIGFib3ZlLCBpdCB3b3VsZCBoYXZlIGJlZW4KICAgICAgICAgICAgaW1wb3NzaWJsZSB0byBjYXRjaCBFeGNlcHQgYXMgdGhlIGNhdGNoIGFsbCAoLi4uKSB3b3VsZCBjYXRjaCB0aGUKICAgICAgICAgICAgZXhjZXB0aW9uIGluc3RlYWQuCgpWZXJzaW9uIDEuMy4yMSAoSmFudWFyeSAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8xMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGhlIG91dHB1dCBmb3JtYXQgZm9yIGJvdGggd2FybmluZ3MgYW5kIGVycm9ycyBjYW4gYmUgc2VsZWN0ZWQgZm9yCiAgICAgICAgICAgIGludGVncmF0aW9uIHdpdGggeW91ciBmYXZvdXJpdGUgSURFL2VkaXRvci4gRWRpdG9ycyBhbmQgSURFcyBjYW4gdXN1YWxseQogICAgICAgICAgICBwYXJzZSBlcnJvciBtZXNzYWdlcyBhbmQgaWYgaW4gdGhlIGFwcHJvcHJpYXRlIGZvcm1hdCB3aWxsIGVhc2lseSB0YWtlIHlvdSAKICAgICAgICAgICAgZGlyZWN0bHkgdG8gdGhlIHNvdXJjZSBvZiB0aGUgZXJyb3IuIFRoZSBzdGFuZGFyZCBmb3JtYXQgaXMgdXNlZCBieSAKICAgICAgICAgICAgZGVmYXVsdCBleGNlcHQgb24gV2luZG93cyB3aGVyZSB0aGUgTWljcm9zb2Z0IGZvcm1hdCBpcyB1c2VkIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIFRoZXNlIGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIGNvbW1hbmQgbGluZSBvcHRpb25zLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAkIHN3aWcgLXB5dGhvbiAtRnN0YW5kYXJkIGV4YW1wbGUuaQogICAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1GbWljcm9zb2Z0IGV4YW1wbGUuaQogICAgICAgICAgICAgICAgZXhhbXBsZS5pKDQpOiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgowMS8wOS8yMDA0OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODcxOTA5IF0gc2ltcGxlIG5hbWVzcGFjZSBwcm9ibGVtLgogICAgICAgICAgICBUaGlzIHdhcyBhIHByb2JsZW0gdXNpbmcgYW5vbnltb3VzIHN0cnVjdHVyZXMgaW4gYSBuYW1lc3BhY2UuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCAgewogICAgICAgICAgICAgICAgICAgICAgaW50IG47CiAgICAgICAgICAgICAgICAgICB9IFM7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMS8wOS8yMDA0OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgYnJva2VuIFBlcmwgZXhhbXBsZXMuCgoxMi8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEgYW5kIEMjXSBGaXhlcyBmb3Igd3JhcHBpbmcgY292YXJpYW50IChwb2x5bW9ycGhpYykgcmV0dXJuIHR5cGVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgfkJhc2UoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBCYXNlKiBjb3B5KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHN0cnVjdCBEZXJpdmVkIDogQmFzZSB7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgRGVyaXZlZCogY29weSgpIGNvbnN0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBEZXJpdmVkOjpjb3B5IHByb3h5IG1ldGhvZCByZXR1cm5zIEJhc2Ugbm90IERlcml2ZWQuIEEgd2FybmluZyBpcyBpc3N1ZWQKICAgICAgICAgICAgYWJvdXQgdGhpcy4gUHJldmlvdXNseSB0aGUgcG9pbnRlciB1c2VkIGJ5IHRoZSBwcm94eSBjbGFzcyB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgdHJlYXRlZCBhcyBhIEJhc2UqIGluc3RlYWQgb2YgYSBEZXJpdmVkKi4KCjEyLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggc28gdGhhdCBXaW5kb3dzIHBhdGhzIGFyZSBkaXNwbGF5ZWQgY29ycmVjdGx5IHdoZW4gcmVwb3J0aW5nIGVycm9ycy4KICAgICAgICAgICAgQW4gZXJyb3IgcHJldmlvdXNseSB3b3VsZCBoYXZlIGJlZW4gc2hvd24gc29tZXRoaW5nIGxpa2U6CgogICAgICAgICAgICAgIC4/eGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCiAgICAgICAgICAgIGluc3RlYWQgb2Y6CgogICAgICAgICAgICAgIC5cZXhhbXBsZS5pOjE0OiBTeW50YXggZXJyb3IgaW4gaW5wdXQuCgoKVmVyc2lvbiAxLjMuMjAgKERlY2VtYmVyIDE3LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIExhc3QgbWludXRlIG1vZGlmaWNhdGlvbnMuICAgUGVybDUgbW9kdWxlIG5vdyBnZW5lcmF0ZXMgc2hhZG93IGNsYXNzZXMKICAgICAgICAgICAgYnkgZGVmYXVsdCBsaWtlIGFsbCBvZiB0aGUgb3RoZXIgbW9kdWxlcy4gIFBIUDQgd3JhcHBlcnMgbm8gbG9uZ2VyCiAgICAgICAgICAgIGluY2x1ZGUgImNvbmZpZy5oIi4gCgoxMi8xNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFdlYWtlbmVkIHdhcm5pbmcgbWVzc2FnZSByZWxhdGVkIHRvIGNvbnN0cnVjdG9yIG5hbWVzIHNvIHRoYXQgYW4KICAgICAgICAgICAgdW51c3VhbCBuZXN0ZWQtY2xhc3Mgd3JhcHBpbmcgdGVjaG5pcXVlIHdvdWxkIHdvcmsgYWdhaW4gKGFwcGFyZW50bHkKICAgICAgICAgICAgaXQgd29ya2VkIGluIHNvbWUgb2xkZXIgU1dJRyByZWxlYXNlcykuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBTY29wZSB7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzc0E7CiAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzc0I7CiAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlOjpDbGFzc0EgewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQiB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBOb3RlOiAgVGhlcmUgaXMgc3RpbGwgc29tZSBvZGQgaW50ZXJhY3Rpb24gd2l0aCB0aGUgU1dJRyBzeW1ib2wKICAgICAgICAgICAgdGFibGUvdHlwZSBzeXN0ZW0gdGhhdCB3aWxsIG5lZWQgdG8gYmUgbG9va2VkIGF0IGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEd1c3Rhdm8gTmllbWV5ZXIuCgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm90ZWN0ZWQgY2xhc3MgbWV0aG9kcyBhcmUgd3JhcHBlZCBhcyBwcm90ZWN0ZWQgSmF2YSBtZXRob2RzIAogICAgICAgICAgICB3aGVuIHVzaW5nIHRoZSBkaXJwcm90IGRpcmVjdG9yIGZlYXR1cmUuIFRoaXMgY2FuIGJlIGNoYW5nZWQgdXNpbmcKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgdG8gc29tZXRoaW5nIGVsc2Ugc2hvdWxkIHRoZSBuZWVkIGFyaXNlLCBmb3IKICAgICAgICAgICAgZXhhbXBsZSwgcHJpdmF0ZSBvciBwYWNrYWdlIGFjY2Vzcy4KCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIAogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyAoSmF2YSkgYW5kICVjc21ldGhvZG1vZGlmaWVycyAoQyMpIG9wZXJhdGUgc2xpZ2h0bHkgCiAgICAgICAgICAgIGRpZmZlcmVudGx5LiBQcmV2aW91c2x5IHRoaXMgZmVhdHVyZSBoYWQgdG8gYmUgcHJlc2VudCB0byBzZXQgdGhlIG1ldGhvZAogICAgICAgICAgICBtb2RpZmllcnMuIE5vdyBpdCBpcyBvbmx5IHVzZWQgaWYgaXQgZXhpc3RzIGZvciB0aGUgbWV0aG9kIGJlaW5nIHdyYXBwZWQuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzICJwdWJsaWMiIGFzIHByZXZpb3VzIGhvd2V2ZXIsIHdoZW4gd3JhcHBpbmcgcHJvdGVjdGVkCiAgICAgICAgICAgIGRpcmVjdG9yIG1ldGhvZHMgaXQgaXMgInByb3RlY3RlZCIuIFRoaXMgY2hhbmdlIHdpbGwgbm90IGFmZmVjdCBleGlzdGluZwogICAgICAgICAgICB1c2Ugb2YgdGhlICVqYXZhbWV0aG9kbW9kaWZpZXJzIG9yICVjc21ldGhvZG1vZGlmaWVycy4KCjEyLzExLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgVGhpcyBmaXggc29tZSByZWN1cnJpbmcgcmVwb3J0cyBhYm91dCBrZXl3b3JkcyBub3QgYmVlbgoJICAgIHByb3Blcmx5IGlkZW50aWZpZWQgYW5kIHdhcm5lZCwgYW5kIGl0IHNvbHZlcyB0aGUgcHJvYmxlbQoJICAgIG9mIGhvdyB0byBhZGQgYSB0ZXN0IGZpbGUgdG8gdGhlIHRlc3Qtc3VpdGUgc3VjaCB0aGF0IGl0CgkgICAgZG9lc24ndCB1c2UgYW55IGtleXdvcmQgb2YgYWxsIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzCgkgICAgKGFuZCBkb2luZyBpdCB3aXRob3V0IGNvbXBpbGluZyB0aGUgdGVzdCBmb3IgYWxsIHRoZQoJICAgIHN1cHBvcnRlZCBsYW5ndWFnZXMsIHRoaW5nIHRoYXQgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwKCSAgICBhbmQgd2l0aG91dCByZXF1aXJpbmcgeW91IHRvIGtub3cgYWxsIHRoZSBzdXBwb3J0ZWQKCSAgICBsYW5ndWFnZSBrZXl3b3JkcywgdGhpbmcgdGhhdCBpcyBhbHdheXMgaW1wb3NzaWJsZSkuCgoJICAgIFNvIHRoZXNlIGFyZSB0aGUgY2hhbmdlcyBnbG9iYWxseSBzcGVha2luZzoKCgkgICAgLSBVbmlmb3JtIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBrZXl3b3JkIHdhcm5pbmdzIHRocm91Z2gKCSAgICAgIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBhbGwgdGhlIGxhbmd1YWdlcyBoYXMgbm93IGEKCSAgICAgIHNlcGFyYXRlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBrZXl3b3JkcyBvciBiYWQgbmFtZXM6CgoJCSAgcHl0aG9uL3B5dGhvbmt3LnN3ZwoJCSAgY2hpY2tlbi9jaGlja2Vua3cuc3dnCiAgICAgICAgICAgICAgICAgIC4uLi4KCgkgICAgLSBBZGRlZCBrZXl3b3JkIGxpc3QgZm9yIG1vc3Qgb2YgdGhlIGxhbmd1YWdlcyB0aGF0IGRpZG4ndAoJICAgICAgaGF2ZSBvbmUgKHVzaW5nIHRoZSBuZXcgc2VwYXJhdGVkIGZpbGUpLgoJCSAgICAJICAgIAoJICAgIC0gQWRkZWQgdGhlICJBbGwga2V5d29yZHMiIHdhcm5pbmcgc3VwcG9ydDogLVdhbGxrdyBvcHRpb24uCgogICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gaW5jbHVkZSBhbGwgdGhlIGtub3duIGtleXdvcmRzCgkgICAgICBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzLCBhbmQgY2FuIGJlIHVzZWQgYXM6CgogICAgICAgICAgICAgICAgIHN3aWcgLVdhbGxrdyAuLi4uCgkgICAgCgkgICAgICBUaGlzIHdpbGwgaGVscCB0byB0aGUgcHJvY2VzcyBvZiBhZGRpbmcgYSB0ZXN0LXN1aXRlCgkgICAgICBmaWxlIHRoYXQgY2FuIGJlIGNvbXBpbGVkIGluIGFsbCB0aGUgc3dpZyBzdXBwb3J0ZWQKCSAgICAgIGxhbmd1YWdlcywgYW5kIGl0IHdpbGwgYmUgYWxzbyBoZWxwZnVsIGZvciB1c2VycyB3aG8KCSAgICAgIHdhbnQgdG8gY3JlYXRlIG11bHRpLWxhbmd1YWdlIGxpYnJhcmllcy4KCSAgICAKCSAgICBBbmQgdGhlc2UgYXJlIHRoZSBkZXRhaWxlZCBjaGFuZ2VzIChtb3N0bHkgZmlsZSBhZGRpdGlvbik6CgoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBhbHJlYWR5IGhhdmUgc29tZSBzb3J0IG9mIGtleXdvcmQKCSAgICAgIHdhcm5pbmcgbGlzdCwgbW92ZSBpdCB0byBhbiBleHRlcm5hbCBsYW5ndWFnZWt3LnN3ZwoJICAgICAgZmlsZSwgaWU6CgkgICAgCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gcHl0aG9uLnN3ZyAtPiBweXRob25rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBjaGlja2VuLnN3ZyAtPiBjaGlja2Vua3cuc3dnCgkgICAgICAgICBtb3ZlIGtleXdvcmRzIGZyb20gdGNsOC5zd2cgLT4gdGNsa3cuc3dnCiAKICAgICAgICAgICAgICBhbmQgcmUtaW5jbHVkZSBsYW5ndWFnZWt3LnN3ZyBmcm9tIGxhbmd1YWdlLnN3Zy4KCSAgICAKCSAgICAtIEZvciB0aGUgbGFuZ3VhZ2UgdGhhdCBkaWRuJ3QgaGF2ZSBhIGtleXdvcmQgbGlzdCwgYW5kCgkgICAgICBmb3IgdGhlIG9uZXMgdGhhdCBJIGNvdWxkIGZpbmQgYSBsaXN0LCBhZGQgdGhlCgkgICAgICBsYW5ndWFnZWt3LnN3ZyBmaWxlLCBpZToKCiAgICAgICAgICAgICAgICAgY3NoYXJwL2NzaGFycGt3LnN3ZwogICAgICAgICAgICAgICAgIGphdmEvamF2YWt3LnN3ZwogICAgICAgICAgICAgICAgIHBocDQvcGhwa3cuc3dnCgkJIHBpa2UvcGlrZWt3LnN3ZwkgCgkJIHJ1YnkvcnVieWt3LnN3ZwoKCiAgICAgICAgICAgICAgYWxzbyBhZGQgYSBsaW5lIGluIGxhbmd1YWdlLnN3ZyB0byBpbmNsdWRlCgkgICAgICBsYW5ndWFnZWt3LnN3ZywgYnV0IG5vdyBpdCBpcyBjb21tZW50ZWQhISEsIGxpa2UgaW4KCSAgICAgIGphdmEuc3dnOgoKICAgICAgICAgICAgICAgICAgLyogamF2YSBrZXl3b3JkcyAqLwogICAgICAgICAgICAgICAgICAvKiBwbGVhc2UgdGVzdCBhbmQgYWN0aXZhdGUgKi8KICAgICAgICAgICAgICAgICAgLy8laW5jbHVkZSAiamF2YWt3LnN3ZyIKCgkgICAgICBpZSwgdGhlcmUgd2lsbCBiZSBubyBjaGFuZ2UgaW4gaG93IHN3aWcgcnVucyBub3JtYWxseQoJICAgICAgdW50aWwgdGhlIGxhbmd1YWdlIG1haW50YWluZXIgdGVzdCBhbmQgdW5jb21tZW50IHRoYXQKCSAgICAgIGxpbmUuCgkgICAgICAKCSAgICAgIFNvLCBwbGVhc2UgY2hlY2sgZWFjaCBsYW5ndWFnZWt3LnN3ZyBmaWxlIChJIGxlZnQgdGhlCgkgICAgICBsaW5rIHRvIHRoZSBrZXl3b3JkIGxpc3Qgc291cmNlIGZvciBjaGVja2luZyksIGFuZCBhZnRlcgoJICAgICAgdGVzdGluZywgdW5jb21tZW50IHRoZSAlaW5jbHVkZSBsaW5lLgoKCSAgICAtIEFkZGVkIHRoZSBmaWxlIGFsbGt3LnN3Zywgd2hpY2ggaW5jbHVkZXMgYWxsIHRoZQogICAgICAgICAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGVzLgoKCSAgICAgIEZvciB0aGUgbGFuZ3VhZ2VzIHRoYXQgaGFzIG5vIGxhbmd1YWdla3cuc3dnIGZpbGUgcmlnaHQKCSAgICAgIG5vdywgYW5kIGlmIHRoZXkgbmVlZCBvbmUsIGFkZCB0aGUgZmlsZSBpbnRvIHRoZQoJICAgICAgbGFuZ3VhZ2UgZGlyZWN0b3J5LCBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nIGluY2x1ZGUKCSAgICAgIGxpbmUgaW50byB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICAKCSAgICAtIEFkZGVkIHRoZSAtV2FsbGt3IHRoYXQgaW5jbHVkZXMgdGhlIGFsbGt3LnN3ZyBmaWxlLgoJICAgICAgTm90ZSB0aGF0IHRoZSBvbGQgLWxhbGxrdy5zd2cgb3B0aW9uIGNvdWxkbid0IGJlIHVzZWQKCSAgICAgIHNpbmNlIGl0IGluY2x1ZGUgdGhlIGZpbGUgYWZ0ZXIgaXQgd291bGQgYmUgbmVlZGVkLgoKCgkgICAgSG9wZWZ1bGx5LCB0aGUgLVdhbGxrdyBvcHRpb24gd2lsbCBiZSBhZGRlZCB0byB0aGUgZGVmYXVsdAoJICAgIHJ1bGVzIGluIHRoZSByZWxhdGVkIHRlc3Qtc3VpdGUgTWFrZWZpbGVzLCBzbywgd2hlbgoJICAgIGNyZWF0aW5nIGEgbmV3IHRlc3QsIG9yIGFkZGluZyBhIG5ldyBzd2lnIGxpYnJhcnkgZmlsZQoJICAgIChsaWtlIF9zdGRfZGVxdWUuaSksIHN3aWcgd2lsbCB3YXJuIHlvdSBpZiB5b3UgYXJlIHVzaW5nIGEKCSAgICBiYWQgbmFtZSwgY29uc2lkZXJpbmcgYWxsIHRoZSBsYW5ndWFnZSB3aGVyZSBpdCBuZWVkcyB0bwoJICAgIHJ1bi4KCSAgICAKCSAgICBSaWdodCBub3cgeW91IGNhbiB0ZXN0IGl0IGJ5IHVzaW5nOgoKICAgICAgICAgICAgICAgbWFrZSBjaGVjay1weXRob24tdGVzdC1zdWl0ZSBTV0lHPSJzd2lnIC1XYWxsa3ciCgoJICAgIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgdGFyZ2V0IGxhbmd1YWdlLCBpdCBkb2Vzbid0IG1hdHRlci4KCgkgICAgQW5kIHllcywgdGhlcmUgYXJlIHNldmVyYWwgZXhhbXBsZXMgdGhhdCBhcmUgdXNpbmcKCSAgICByZXNlcnZlZCBrZXl3b3Jkcywgc3BlY2lhbGx5IGZyb20gY3NoYXJwLgogICAgICAgICAgCgkgICAgKioqIFJlbWVtYmVyICoqKio6IHRoZSBuZXcga2V5d29yZCB3YXJuaW5nIGxpc3RzIGFyZSBub3QKCSAgICBpbmNsdWRlZCBieSBkZWZhdWx0IGluIGFueSBvZiBsYW5ndWFnZSB0aGF0IGJlZm9yZSBkaWRuJ3QKCSAgICBoYXZlIG9uZS4gVG8gZW5hYmxlIHRoZSBrZXl3b3JkIHdhcm5pbmdzIGFzIHRoZSBkZWZhdWx0CgkgICAgYmVoYXZpb3IsIHRoZSBpbmNsdXNpb24gb2YgdGhlIGxhbmd1YWdla3cuc3dnIGZpbGUgaGFzIHRvCgkgICAgYmUgdW5jb21tZW50ZWQgYXQgZWFjaCBsYW5ndWFnZS5zd2cgZmlsZS4KCgkgICAgU28sIGFsbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lcnMsIHBsZWFzZSBjaGVjayB0aGUKCSAgICBrZXl3b3JkcyBsaXN0LiAKCgkgICAgQWxzbywgeW91IGNhbiBhZGQgYnVpdC1pbiBuYW1lcywgYW5kIG5vdCBvbmx5IGtleXdvcmRzLCBsaWtlCgkgICAgJ1RydWUvRmFsc2UnIGluIHB5dGhvbi4gIFJlbWVtYmVyIHRoYXQgeW91IGNhbiBiZSBtb3JlCgkgICAgc3BlY2lmaWMgYW5kIHJlZmVyIG9ubHkgdG8gbWVtYmVyIG5hbWVzLCBsaWtlICo6OmNvbmZpZ3VyZQoJICAgIG9yICo6OmNnZXQgKHNlZSBhbiBleGFtcGxlIGluIHRoZSB0Y2w4L3RjbDhrdy5zd2cgZmlsZSksCgkgICAgb3Igb25seSBnbG9iYWwgbmFtZXMsIGxpa2UgOjpyYW5nZSAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlCgkgICAgcHl0aG9uL3B5dGhvbmt3LnN3ZyBmaWxlLgoKCSAgICBKdXN0IHRvIGJlIGNvbnNpc3RlbnQsIHVzZSB0aGUgZm9sbG93aW5nIGNvZGVzOgoKCSAgICAtIFVzZSBjb2RlIDMxNCBmb3Iga2V5d29yZCBhbmQvb3IgZmF0YWwgYmFkIG5hbWVzLgoJICAgIC0gVXNlIGNvZGUgMzIxIGZvciBidWl0LWluIGFuZC9vciBub3QgZmF0YWwgYmFkIG5hbWVzLgogICAgICAgICAgIAogICAgICAgICAgICBzbywgdGhleSBjYW4ndCBiZSBkaXNhYmxlZC9lbmFibGVkIGluZGVwZW5kZW50bHkgKHNlZQoJICAgIHB5dGhvbi9weWh0b25rdy5zd2cgZm9yIGV4YW1wbGVzKS4KCgkgICAgKioqKiBBbmQgZG9uJ3QgYWRkIGFueSBuZXcgdGVzdCBmaWxlIHdpdGhvdXQgY2hlY2tpbmcgaXQKCSAgICB3aXRoIHRoZSAtV2FsbGt3IG9wdGlvbiEhICh0aGF0IGluY2x1ZGVzIG1lKSAqKioqKi4KCSAgCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU0YgYnVnICM4NTQ2MzQKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYWNjZXB0aW5nIHRoZSBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgJy8nIG9uIAogICAgICAgICAgICBXaW5kb3dzIGFuZCB0aGUgTWFjIGluIGFkZGl0aW9uIHRvIHRoZSBuYXRpdmUgb25lICggJ1wnIG9uIAogICAgICAgICAgICBXaW5kb3dzKS4gVGhpcyBjYW4gYmUgdXNlZCBpbiAlaW1wb3J0LCAlaW5jbHVkZSBhbmQgY29tbWFuZGxpbmUgCiAgICAgICAgICAgIG9wdGlvbnMgdGFraW5nIGEgcGF0aCwgZm9yIGV4YW1wbGUgLUkuIE9uIEN5Z3dpbiwgYm90aCB0aGUgV2luZG93cwogICAgICAgICAgICBhbmQgVW5peCBkaXJlY3Rvcnkgc2VwYXJhdG9yIGNhbiBub3cgYmUgdXNlZCAod2FzICcvJyBvbmx5KS4KICAgICAgICAgICAgCjEyLzEwLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCiAgICAgICAgICAgIFtweXRob25dIEltcGxlbWVudGluZyB0aGUgcnVudGltZSAicmVwcm90ZWN0ZWQiIGRpcmVjdG9yCgkgICAgbWVtYmVycywgaWYgeW91IGhhdmU6CiAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEI7CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFyKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGhlbGxvKCkgeyByZXR1cm4gZG9faGVsbG8oKTspCgogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBkb19oaSgpIHtyZXR1cm4gMDt9CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hlbGxvKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICB0aGVuLCBhdCB0aGUgcHl0aG9uIHNpZGUKCiAgICAgICAgICAgICAgICBpbXBvcnQgbXlfbW9kdWxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vKG15X21vZHVsZS5CYXIpOgogICAgICAgICAgICAgICAgICBkZWYgZG9faGVsbG8oc2VsZik6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIAoJICAgICAgICBiID0gQmFyKCkgIyBQdXJlIEMrKyBEaXJlY3RvciBjbGFzcwogICAgICAgICAgICAgICAgZiA9IEZvbygpICMgQysrIERpcmVjdG9yICsgcHl0aG9uIG1ldGhvZHMKCiAgICAgICAgICAgICAgICBiLmhlbGxvKCkgIyBPaywgYW5kIGl0IGNhbGxzIEMrKyBCYXI6OmRvX2hlbGxvKCkKICAgICAgICAgICAgICAgIGYuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgUHl0aG9uIEZvbzo6ZG9faGVsbG8oKQoKICAgICAgICAgICAgICAgIGIuZG9faGkoKSAjIFJ1bnRpbWVFcnJvciwgZG9faGkoKSBpcyBwcm90ZWN0ZWQhIQogICAgICAgICAgICAgICAgZi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAKICAgICAgICAgICAgICAgIGIuZG9faGVsbG8oKSAjIFJ1bnRpbWVFcnJvciwgZG9faGVsbG8oKSBpcyBwcm90ZWN0ZWQhIQogICAgICAgICAgICAgICAgZi5kb19oZWxsbygpICMgT2ssIHNpbmNlIGl0IGl0cyByZWRlZmluZWQgaW4gcHl0aG9uLgoKICAgICAgICAgICAgSGVyZSBCYXIuZG9faGVsbG8gaXMgYWx3YXlzIHByb3RlY3RlZCwgYnV0IEZvby5kb19oZWxsbwogICAgICAgICAgICBpcyAicHVibGljIiwgYmVjYXVzZSBpdCBpcyByZWRlZmluZWQgaW4gcHl0aG9uLiBCZWZvcmUsCgkgICAgYWxsIHRoZSAnZG9faGVsbG8nIG1ldGhvZHMgd2VyZSBwdWJsaWMuCgoJICAgIFRoaXMgc2VlbXMgdG8gYmUgYSBnb29kIGNvbXByb21pc2UgYmV0d2VlbiBDKysgYW5kIHB5dGhvbgoJICAgIHBoaWxvc29waGllcywgaWUsIGFsbCB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMga2VlcAoJICAgIHByb3RlY3RlZCBhdCB0aGUgdXNlciBzaWRlIChDKysgd2F5KSB1bnRpbCB0aGV5IGFyZQoJICAgIHJlZGVmaW5lZCAocHl0aG9uIHdheSwgd2VyZSBhbGwgZGVmaW5lZCBtZXRob2RzIGFyZSBhbHdheXMKCSAgICBwdWJsaWMpLiBBbmQgdGhpcyBpcyBub3Qgb25seSBhIGdvb2QgY29tcHJvbWlzZSwgaXQgYWxzbwoJICAgIHNlZW1zIHRvIGJlIHRoZSBvbmx5IHdheSB0byBkbyBpdCA6KS4KCgkgICAgTm93IHJ1YnkgaGFzIG5hdGl2ZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycywgYW5kIHB5dGhvbgoJICAgIHB1cmUgcnVudGltZSBzdXBwb3J0LiBJIGd1ZXNzIHRoZXNlIGFyZSB0aGUgdHdvIHBvc3NpYmxlCgkgICAgZXh0cmVtZSBjYXNlcy4gQW5kIGhvcGVmdWxseSwgdGhleSBjb3VsZCBiZSB1c2VkIGFzCgkgICAgdGVtcGxhdGVzIHRvIG1vZGlmeSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydAoJICAgIGRpcmVjdG9ycywgc28gdGhleSBjYW4gInJlcHJvdGVjdCIgdGhlIHByb3RlY3RlZCBkaXJlY3RvcgoJICAgIG1lbWJlcnMgYXQgdGhlIHRhcmdldCBsYW5ndWFnZSBzaWRlLgoKCSAgICBUaGlzIGZpbmlzaGVkIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgc3VwcG9ydCBmb3IgdGhlIAoJICAgIHB5dGhvbiBsYW5ndWFnZS4gT2NhbG0gd2lsbCBuZWVkIHRvIGFkZCB0aGUKCSAgICAicmVwcm90ZWN0aW9uIiBsYXRlci4KCjEyLzEwLzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgVGhlIGZvbGxvd2luZyBjYXNlIChyZXBvcnRlZCBieSBMeWxlIEpvaG5zb24pIHdhcyBmaXhlZDoKCgkgICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwogCgkgICAgICBjbGFzcyBGb28geyAKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgdm9pZCB5KCk7CgoJICAgICAgcHJvdGVjdGVkOgoJICAgICAgICBpbnQgeDsKCSAgICAgIH07CgoJICAgc3dpZyB3YXJuZWQgdGhhdCB0aGUgc3ltYm9sICd4JyB3YXMgYWxyZWFkeSBkZWZpbmVkLCBhbmQKICAgICAgICAgICB0aGUgcmVuYW1pbmcgZmFpbHMuICd4JyB3YXMgbm90IGVtaXR0ZWQsIHNpbmNlIGl0IGlzCiAgICAgICAgICAgcHJvdGVjdGVkLCBidXQgaXQgd2FzIGtlcHQgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHRvbwogICAgICAgICAgIG11Y2ggaW5mb3JtYXRpb24uCgoJICAgTm93IHN3aWcgd29ya3MgZm9yIGFsbCB0aGUgY2FzZXMgKHBsYWluLCBkaXJlY3RvciBhbmQKCSAgIGRpcnByb3QpIGFnYWluLiBUaGlzIHdhcyBmaXhlZCBieSBhbGxvd2luZyB0aGUgcGFyc2VyLnkgdG8KCSAgIGRlY2lkZSBtdWNoIGNsb3NlciB3aGF0IHRvIGRvIHdpdGggJ3gnLiBCZWZvcmUgYWxsIHRoZQoJICAgZGlzY2FyZGluZyBvciBnZW5lcmF0aW9uIHdhcyByZXNvbHZlZCBhdCB0aGUgbGFuZy5jeHgKCSAgIHN0YWdlLiBBbHNvIHRoZSBjaGFuZ2VzIGluIHBhcnNlci55IHRvIGltcGxlbWVudCB0aGUKCSAgIGRpcmVjdG9yIHByb3RlY3RlZCBtb2RlIGFyZSBub3cgbXVjaCBtb3JlIGVuY2Fwc3VsYXRlZCwgYW5kCgkgICB0aGV5IGdldCBkaXNhYmxlZCBpZiB0aGUgbW9kZSBpcyBub3QgZW5hYmxlZC4gQmVmb3JlIHRoZQoJICAgZGVhY3RpdmF0aW9uIHdhcyBkb25lIGF0IHRoZSBnZW5lcmF0aW9uIHN0YWdlIChsYW5nLmN4eCkuCgoJICAgQnkgdGhlIG90aGVyIGhhbmQsIGlmIHRoZSBkaXJlY3RvciBtb2RlIGlzIGVuYWJsZWQsIGFuZAoJICAgJXJlbmFtZSBpcyBkb25lLCByZXVzaW5nIGEgcHJvdGVjdGVkIG1lbWJlciBuYW1lLCB0aGVyZSBpcwoJICAgYSBwYXRob2xvZ2ljYWwgY2FzZToKCgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBBIHsKCSAgICAgcHVibGljOgoJICAgICAgIHZvaWQgeSgpOwoKCSAgICAgcHJvdGVjdGVkOgoJICAgICAgIGludCB4OyAgICAgICAgICAgIC8qIHdvcmtzICovCgkgICAgICAgc3RhdGljICBpbnQgeDsgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIHZvaWQgeCgpOyAvKiB3b3JrcyAqLwoJICAgICAgIHR5cGVkZWYgdm9pZCB4KCk7IC8qIHdvcmtzICovCgoJICAgICAgIHZpcnR1YWwgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYXMgaXQgc2hvdWxkLCBzaW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb286OngoKSB3aWxsIGJlIGVtaXR0ZWQgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yICovCgoJICAgICAgIHZvaWQgeCgpOyAvKiBhbHdheXMgZmFpbHMsIGJ1dCBzb21ldGltZXMgaXQgc2hvdWxkbid0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luY2UgdGhlIEZvbzo6eCgpIHdpbGwgbm90IGJlIGVtaXR0ZWQgaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIG5vdCB2aXJ0dWFsICovCgoJICAgICB9OwoKCSAgIFRoZSBsYXN0IGNhc2UgaXMgbm90IGFsd2F5cyByaWdodCBiZWNhdXNlIGF0IHRoZSBwYXJzZXIucHkKCSAgIHN0YWdlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZWNpZGUgaWYgdGhlIHByb3RlY3RlZCBtZW1iZXIKCSAgIEZvbzo6eCgpIGNvdWxkIG9yIG5vdCBjb25mbGljdCB3aXRoIHRoZSByZW5hbWVkIEZvbzo6eSgpLAoJICAgc2luY2UgRm9vOjp4KCkgY291bGQgYmUgdmlydHVhbCBieSBpbmhlcml0YW5jZS4KCgkgICBJIGd1ZXNzIHRoaXMganVzdCBhbiBpbnRyaW5zaWMgbGltaXRhdGlvbiwgYW5kIG5vIG11Y2ggY2FuCgkgICBiZSBkb25lIGFib3V0IGl0IHdpdGhvdXQgcmVzb3J0aW5nIGludG8gbGFyZ2VyIGNoYW5nZXMgdG8KCSAgIHBvc3Rwb25lLCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnMsIHRoZSBtdWx0aXBseSBzeW1ib2wKCSAgIGRldGVjdGlvbiAobGFuZy5jeHggc3RhZ2UpLgoJICAgCgkgICBTbywgYnkgbm93LCBpdCBpcyBqdXN0IGNvbnNpZGVyZWQgYSB3ZWxsIGtub3duICJmZWF0dXJlIiBpbgoJICAgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtb2RlLiBUaGUgZ29vZCBuZXdzIGlzIHRoYXQgaXQgc2VlbXMKCSAgIHRvIGJlIGEgcmFyZSBjYXNlLCBhbmQgaXQgY2FuIGJlIGF2b2lkZWQgYnkgdGhlIHVzZXIgYnkKCSAgIGhpZGluZyAneCcgYmVmb3JlIHJlbmFtaW5nICd5JzoKCgkgICAgICVyZW5hbWUoX3gpIEZvbzo6eCgpOwoJICAgICAlcmVuYW1lKHgpIEZvbzo6eSgpOwoJICAgCgoxMi8wOC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIHZpcnR1YWwgbWV0aG9kIGRldGVjdGlvbnMgbm93IHByb3Blcmx5CgkgICAgdHJlYXRzIHRoZSBmb2xsb3dpbmcgY2FzZXM6CgogICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7IHR5cGVkZWYgaW50IEludDsgfQoJICAgICBzdHJ1Y3QgQSB7fTsKCSAgICAgdHlwZWRlZiBBIEI7CgogICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgIHZpcnR1YWwgfkZvbygpIHt9CgogICAgICAgICAgICAgICB2aXJ0dWFsIEZvbyogY2xvbmVyKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgaW50IGdldF92YWx1ZSgpID0gMDsKCSAgICAgICB2aXJ0dWFsIEEqIGdldF9jbGFzcygpID0gMDsKCSAgICAgICB2aXJ0dWFsIHZvaWQganVzdF9kb19pdCgpID0gMDsKCSAgICAgfTsKCiAgICAgICAgICAgICBzdHJ1Y3QgQmFyIDogRm9vCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgIEJhciogY2xvbmVyKCk7CiAgICAgICAgICAgICAgIGZvbzo6SW50IGdldF92YWx1ZSgpOwogICAgICAgICAgICAgICBCKiBnZXRfY2xhc3MoKTsKICAgICAgICAgICAgICAgdm9pZCBqdXN0X2RvX2l0KCk7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgIEFsbCB0aGUgRm9vIGFuZCBCYXIgbWV0aG9kcyBhcmUgdmlydHVhbC4gIEEgbmV3IGF0dHJpYnV0ZQoJICAgICJ2aXJ0dWFsOnR5cGUiIHJlY29yZCB0aGUgYmFzZSBwb2x5bW9ycGhpYyB0eXBlLiBJbiB0aGUKCSAgICBwcmV2aW91cyBjYXNlcyB3ZSBoYXZlOgoKCSAgICAgICB0eXBlIDogQmFyICAgICAgIHZpcnR1YWw6dHlwZSA6IEZvbwoJICAgICAgIHR5cGUgOiBmb286OkludCAgdmlydHVhbDp0eXBlIDogaW50CgkgICAgICAgdHlwZSA6IEIgICAgICAgICB2aXJ0dWFsOnR5cGUgOiBBCgkgICAgICAgdHlwZSA6IHZvaWQgICAgICB2aXJ0dWFsOnR5cGUgOiB2b2lkCgogICAgICAgICAgICBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VmdWwgaW4gbGFuZ3VhZ2VzIChqYXZhK2RpcmVjdG9ycykKCSAgICB0aGF0IGNvdWxkIGhhdmUgcHJvYmxlbXMgcmVkZWZpbmluZyBCYXIqIEJhcjo6Y2xvbmVyKCkuCgoJICAgIElmIHlvdSBuZXZlciBoYWQgY29kZSBsaWtlIHRoZSBhYm92ZSwgeW91IHdpbGwgc2VlIG5vCgkgICAgZWZmZWN0cy4gQnV0IGlmIHlvdSBoYXZlIHNvbWUgY29kZSBsaWtlIHRoYXQsIHlvdQoJICAgIHdpbGwgc2VlIHNvbWUgZWZmZWN0cyBzaW5jZSBzb21lIG1ldGhvZHMgdGhhdAoJICAgIGJlZm9yZSB3ZXJlIG5vdCBwcm9wZXJseSB0cmVhdGVkIGFzIHZpcnR1YWwsCgkgICAgd2lsbCBzdGFydCB0byBhY3QgbGlrZSB0aGF0LiBUaGlzIGNvdWxkIGVubGFyZ2UKCSAgICB5b3VyIGRpcmVjdG9yIGNsYXNzZXMuCgkgICAgCgoxMi8wOC8yMDAzOiBtbWF0dXMgKE1hcmNlbG8gTWF0dXMpCgkgICAgVGhlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXIgc3VwcG9ydCAoZGlycHJvdCkKCSAgICBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIAoJICAgIEl0IGNhbiBiZSBlbmFibGUgYnkgdXNpbmcgJy1kaXJwcm90JyBvciBieSBhZGRpbmcKCSAgICB0aGUgb3B0aW9uIHRvIHRoZSBtb2R1bGUgZGVjbGFyYXRpb24sIGxpa2U6CgogICAgICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIsZGlycHJvdD0iMSIpIG15X21vZHVsZQoKCSAgICBUaGlzIG1vZHVsZSBvcHRpb24gd2FzIGFkZGVkIHRvIHByb3Blcmx5IGNvbXBpbGUgdGhlCgkgICAgZGlyZWN0b3JfcHJvdGVjdGVkLmkgYW5kIGRpcmVjdG9yX25lc3RlZC5pIGV4YW1wbGVzLgoJICAgIAoJICAgIFRoZSBmZWF0dXJlIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHB5dGhvblsyLjIsMi4zXSAKCSAgICBhbmQgcnVieVsxLjYuN10sIGJvdGggYXQgY29tcGlsYXRpb24gYW5kIHJ1bnRpbWUsIGFuZCAKCSAgICBqYXZhW2oyc2RrMS40LjFfMDFdLCBidXQgb25seSBhdCBjb21waWxhdGlvbiAobXkgamF2YQoJICAgIGluc3RhbGxhdGlvbiBkb2Vzbid0IHJ1biBhbnkgb2YgdGhlIGRpcmVjdG9yIGV4YW1wbGVzLAoJICAgIG9sZHMgbm9yIG5ld3MpLgoKCSAgICBQbGVhc2UgdGVzdCBmb3Igb2NhbWwgYW5kIGphdmEuCgkgICAgCgkgICAgVGhlIGVycm9ycyByZXBvcnRlZCBieSBXaWxsaWFtIGFuZCBTY290dCB3ZXJlIGZpeGVkLAoJICAgIGV4Y2VwdCBmb3IgYSB3YXJuaW5nIGFib3V0ICBTV0lHX0phdmFUaHJvd0V4ZWNwdGlvbigpCgkgICAgbXVsdGlwbHkgZGVmaW5lZC4gSSBjYW4ndCByZXByb2R1Y2UgdGhpcyBlcnJvciB3aXRoIG15CgkgICAgZXhhbXBsZXMuIFdlIHdpbGwgd2FpdCBmb3IgU2NvdHQgdG8gc2VuZCB1cyBhIG1pbmltYWwKCSAgICBjYXNlLgoKCjEyLzA3LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IGhhcyBiZWVuCgkgICAgY29tcGxldGx5IG1vdmVkIG91dCBmcm9tIHB5dGhvbi5jeHgsIGFuZCBub3cKCSAgICByZXNpZGVzIGluIHRoZSBjb21tb24gbGFuZy5jeHgsIGVtaXQuY3h4IGFuZAoJICAgIGFsbG9jYXRlLmN4eCBmaWxlcy4gCgoJICAgIFRoaXMgbWVhbnMgaXQgc2hvdWxkIHdvcmsgZm9yIGFsbCB0aGUgb3RoZXIgbGFuZ3VhZ2VzCgkgICAgdGhhdCBjdXJyZW50bHkgc3VwcG9ydCBkaXJlY3RvcnMsIGllLCBweXRob24sIGphdmEsIG9jYWxtCgkgICAgYW5kIHJ1YnkuCgoJICAgIFRoZSBjaGFuZ2UgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uIChjb21waWxhdGlvbitydW50aW1lKQoJICAgIGFuZCBqYXZhIChqdXN0IGNvbXBpbGF0aW9uKS4KCSAgICAKCSAgICBQbGVhc2UgYWRkIHJ1bnRpbWUgdGVzdHMgZm9yIHRoZSBtaXNzaW5nIGxhbmd1YWdlcyAKCSAgICBhbmQgdGVzdCBpdC4KCgkgICAgVGhlICctbm9kaXJwcm90JyBvcHRpb24gd2FzIG1vdmVkIHRvIHRoZSBwcmluY2lwYWwgbWFpbiwKCSAgICBhbmQgY2FuIGJlIHVzZWQgZnJvbSBhbGwgdGhlIGxhbmd1YWdlcy4KCjEyLzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgYW5kIGltcHJvdmVkIGVycm9yIGNoZWNraW5nIG9mIFNUUklOR19PVVQgdHlwZW1hcHMgaW4gCiAgICAgICAgICAgIHZhcmlvdXMuaS4KCjEyLzA0LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCgkgICAgLSBOb3cgdGhlIHZpcnR1YWwgbWVtYmVycyB3aXRoIG5vIGV4cGxpY2l0IGRlY2xhcmF0b3IKCSAgICBhcmUgcHJvcGVybHkgaWRlbnRpZmllZDoKCSAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBICB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZigpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBIHsKICAgICAgICAgICAgICAgICAgaW50IGYoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIEhlcmUsIEI6OmYoKSBpcyB2aXJ0dWFsLCBhbmQgdGhlIGRpcmVjdG9yIGFuZCB0aGUKCSAgICB2aXJ0dWFsIGVsaW1pbmF0aW9uIG1lY2hhbmlzbSBub3cgcmVjb2duaXplIHRoYXQuCgogICAgICAgICAgICAtIFtDI10gVGhpcyBmaXggYWxzbyBmaXhlcyB0aGUgcHJvYmxlbSB3aGVyZSAnb3ZlcnJpZGUnIHdhcyBub3QgYmVpbmcgCiAgICAgICAgICAgIHVzZWQgb24gYW55IG92ZXJyaWRkZW4gdmlydHVhbCBtZXRob2QsIHNvIGZvciBzdHJ1Y3QgQiBhYm92ZSwgCiAgICAgICAgICAgIHRoaXMgQyMgY29kZSBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgcHVibGljIGNsYXNzIEIgOiBBIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgZigpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCgkgICAgLSBJbml0aWFsIHN1cHBvcnQgZm9yIHByb3RlY3RlZCB2aXJ0dWFsIG1ldGhvZHMuIFRoZXkgYXJlIG5vdwoJICAgIHByb3Blcmx5IGVtaXR0ZWQgd2hlbiB1c2luZyB3aXRoIGRpcmVjdG9yIChweXRob24gb25seSBieQoJICAgIG5vdykuCgkgICAgCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOyAgICAKICAgICAgICAgICAgICAgIHN0cnVjdCBBICB7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKSA9IDA7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEI7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEF7CiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIGludCBmMSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIGYyKCk7CiAgICAgICAgICAgICAgICB9OwoKCSAgICBUaGlzIGNhbiBiZSBkaXNzYWJsZWQgYnkgdXNpbmcgdGhlICctbm9kaXJwcm90JyBvcHRpb24uCgoJICAgIC0gVGhlIGZlYXR1cmUgJ25vZGlyZWN0b3InIGlzIHdvcmtpbmcgbm93IGF0IHRoZSB0b3AgbGV2ZWwsCgkgICAgc28sIGl0IG11c3Qgd29yayBmb3IgYWxsIHRoZSBsYW5ndWFnZXM6CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQTsKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub2RpcmVjdG9yIikgQTo6ZjI7CgogICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjIoKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAKCSAgICBpbiB0aGlzIGNhc2UsIG9ubHkgJ2YxJyBpcyBleHBvcnRlZCB0byB0aGUgZGlyZWN0b3IgY2xhc3MuCgkgICAgCgkgICAgLSBBZGRlZCBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCBUWVBFJiBhcmd1bWVudHMgKHB5dGhvbikuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgSU5PVVQgYW5kIE9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pIGZvciB3aGVuIHRoZSBKTkkgdHlwZSAKICAgICAgICAgICAgaXMgYmlnZ2VyIHRoYW4gdGhlIEMgdHlwZS4gRm9yIGV4YW1wbGUsIHVuc2lnbmVkIGxvbmcgKDMyYml0cyBvbiBtb3N0IHN5c3RlbXMpCiAgICAgICAgICAgIGlzIG1hcHBlZCB0byBqbG9uZyAoNjRiaXRzKS4gUmV0dXJuZWQgdmFsdWUgd2FzIGluY29ycmVjdC4gQnVnIHJlcG9ydGVkIGJ5IAogICAgICAgICAgICBCcmlhbiBIYXdsZXkuCgoxMi8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjIGFuZCBKYXZhXSBCZXR0ZXIgZml4IGZvciBlbnRyeSBkYXRlZCAwNS8xMS8yMDAzLiBGaXhlcyB0aGUgZm9sbG93aW5nCiAgICAgICAgICAgIHR5cGVtYXBzOgoKICAgICAgICAgICAgSmF2YTogamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KICAgICAgICAgICAgQyM6IGNzYmFzZSwgY3NpbnRlcmZhY2VzLCBjc2ltcG9ydHMsIGNzY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGNzZmluYWxpemUsIGNzZ2V0Y3B0ciAmIGNzY29kZS4KCiAgICAgICAgICAgIEl0IGFsc28gZml4ZXMgYnVnIGluIHVzaW5nIGFycmF5cyBvZiBDIHN0cnVjdHMgd2l0aCBhcnJheXNfamF2YS5pIAogICAgICAgICAgICBhcyByZXBvcnRlZCBTY290dCBNaWNoZWwuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBGaXhlZCBbIDg1MjExOSBdIHJlY3Vyc2l2ZSBpbmhlcml0YW5jZSBpbiBvdXRwdXQgLnBtLCBwZXJsNS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBEb3dsaW5nLgoKMTIvMDIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBGaXhlZCBbIDc1NTM4MiBdIGNhbGxpbmcgZnVuYyhjb25zdCB2ZWN0b3I8VD4mIHApIGV2YWx1YXRlcyBwWzBdIGluIGludGVycC4KICAgICAgICAgICAgVGhlIFRjbCB0eXBlIGNoZWNrZXIgd2FzIGltcHJvcGVybHkgaGFuZGxpbmcgdGhlIGludGVycHJldGVyIHJlc3VsdCB3aGVuCiAgICAgICAgICAgIHR5cGUgdmlvbGF0aW9ucyB3ZXJlIHN1cHBvc2VkIHRvIGJlIGlnbm9yZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsYXZpdSBQb3BwLU5vd2FrLgoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgNTQ1MDU4IF0gY29uZmlndXJlJ3MgLS13aXRoLXRjbGluY2wgaGFzIG5vIGVmZmVjdAoKMTEvMzAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBbIDc2NjQwOSBdIG1pc3Npbmcgc3ltYm9sIFNXSUdfSmF2YVRocm93RXhjZXB0aW9uIGR1cmluZyBtb2R1bGUgbG9hZAogICAgICAgICAgICBTV0lHJ3MgaW50ZXJuYWwgZnVuY3Rpb25zIGFyZSBhbGwgc3RhdGljIGFzIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGRpZmZlcmVudCBTV0lHCiAgICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzIHRvIHNoYXJlIGFueSBjb2RlIGF0IHJ1bnRpbWUuCgoxMS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVkIFsgODQ4MzM1IF0gRGlyZWN0b3JzOiAjaW5jbHVkZSB3cmFwcGVyIC5oIGZpbGUgLSB3YXMgaW5jb3JyZWN0bHkKICAgICAgICAgICAgYWRkaW5nIGEgZGlyZWN0b3J5IHRvIHRoZSBnZW5lcmF0ZWQgI2luY2x1ZGUgImZvb193cmFwLmgiIHN0YXRlbWVudAogICAgICAgICAgICBpbiBzb21lIHNpdHVhdGlvbnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgODQ5MDY0IF0gSkFWQSA6IEFjY2VzcyBtb2RpZmllciBmb3IgZGVyaXZlZCBjbGFzcyB3cm9uZy4KICAgICAgICAgICAgVGhlIGRlbGV0ZSgpIG1ldGhvZCBpcyBhbHdheXMgcHVibGljIG5vdy4gSXQgdXNlZCB0byBiZSBwcm90ZWN0ZWQgd2hlbmV2ZXIgYSAKICAgICAgICAgICAgZGVzdHJ1Y3RvciB3YXMgbm9uIHB1YmxpYy4gQW4gVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gcnVudGltZSAKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biBpbnN0ZWFkIG9mIG1ha2luZyBkZWxldGUoKSBwcm90ZWN0ZWQgbm93LgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEFkZGVkIHN1cHBvcnQgZm9yIEMrKyBwb2ludGVycyB0byBtZW1iZXJzLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDg1MDE1MSBdIFBZVkVSU0lPTiB3aXRoIHB5dGhvbjIuMyBpbiBjb25maWd1cmUgb2YgU1dJRyAxLjMuMTkgKE1heWJlKS4KCjExLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgIFsgODUwNjY2IF0gI2luY2x1ZGUgZXh0cmEgbGluZSBhZGRlZC4gIAogICAgICAgICAgICBUaGlzIHNob3VsZCBmaXggc29tZSBwcm9ibGVtcyB3aXRoIGdldHRpbmcgY29ycmVjdCBsaW5lIG51bWJlcnMgb24KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZXMuCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGFub3RoZXIgb25lIG9mIE1hcmNlbG8ncyBldmlsIHRlbXBsYXRlIGJ1Z3MgKGluZmluaXRlCiAgICAgICAgICAgIHJlY3Vyc2lvbikuIFsgODQ5NTA0IF0gdGVtcGxhdGUgYW5kIHR5cGVkZWYgLT4gaW5mLiByZWN1cnNpb24uCgoxMS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXM6CgoJICAgICAgICAgaW50ICp4ID0gJnNvbWVhcnJheVswXTsKCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NTY1NTIgXSBtaXNzaW5nIGRlZmF1bHQgYXJndW1lbnQgY2xhc3Mgc2NvcGUgd2l0aCAifCIuCiAgICAgICAgICAgIFRoaXMgaXMgcmVhbGx5IG9ubHkgYSBiYW5kLWFpZCBmaXggZm9yIHVzZSBvZiBjbGFzcy1lbnVtcyBpbgogICAgICAgICAgICBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgZW51bSBGbGFnIHsgZmxhZzEgPSAweDEsIGZsYWcyID0gMHgyIH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB4ID0gZmxhZzEgfCBmbGFnMik7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlOiB0aGVyZSBhcmUgc3RpbGwgc29tZSAobW9yZSBzdWJ0bGUpIGNhc2VzIHRoYXQgYXJlIGJyb2tlbiwKICAgICAgICAgICAgYnV0IGhhcmQgdG8gZml4IGR1ZSB0byBhbiBpc3N1ZSB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4gV2lsbAogICAgICAgICAgICBhZGRyZXNzIGxhdGVyLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEbWl0cnkgTWlyb25vdi4KCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgODQwODc4IF0gc3VwcG9ydCBmb3IgJWlubGluZSB7IC4uLiB9IChQQVRDSCkuCiAgICAgICAgICAgIFRoaXMgYWRkcyBzdXBwb3J0IGZvciB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kICVpbmxpbmUgJXsgLi4uICV9IGlzIHRoYXQgdGhlCiAgICAgICAgICAgIGVuY2xvc2VkIHRleHQgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gICBUaGlzCiAgICAgICAgICAgIGFsbG93cyBzcGVjaWFsIG1hY3JvcyBhbmQgb3RoZXIgcHJvY2Vzc2luZyB0byBiZSB1c2VkIGluIAogICAgICAgICAgICBjb25qdW5jdGlvbiB3aXRoICVpbmxpbmUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgzNjkwMyBdIEMrKyBpbmNvbnNpc3RlbmN5ICh3aXRoIHZvaWQgYXJndW1lbnRzKS4KICAgICAgICAgICAgU1dJRyB3YXMgaGF2aW5nIGRpZmZpY3VsdHkgd2l0aCBmKCkgdnMgZih2b2lkKSBpbiBDKysgcHJvZ3JhbXMuCiAgICAgICAgICAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZih2b2lkKSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGYoKTsgICAgLy8gTm90IG1hdGNoZWQgdG8gZih2b2lkKSBjb3JyZWN0bHkKICAgICAgICAgICAgICAgICAgfTsgCgogICAgICAgICAgICBUaGUgcGFyc2VyIG5vdyBub3JtYWxpemVzIGFsbCBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0gZih2b2lkKSAKICAgICAgICAgICAgaW4gQysrIGNsYXNzZXMgdG8gZigpLiAgVGhpcyBzaG91bGQgZml4IGEgdmFyaWV0eSBvZiBzdWJ0bGUgCiAgICAgICAgICAgIHByb2JsZW1zIHdpdGggaW5oZXJpdGFuY2UsIG9wdGltaXphdGlvbnMsIG92ZXJsb2FkaW5nLCBldGMuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFydGhvIEJob3dtaWNrLgogCjExLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1Blcmw1XSBJbmNvcnBvcmF0ZWQgWyA4NDEwNzQgXSBiZXR0ZXIgY3JvYWtpbmcgKFBBVENIKS4gIFRoaXMgZml4ZXMgc29tZSBwcm9ibGVtcwogICAgICAgICAgICB3aXRoIHN0cmluZ3MgYW5kIHByb3ZpZGVzIHNvbWUgbmV3IGVycm9yIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRpbm8gR2FyY2lhLgogICAgICAgICAgICAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTgzNSBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBjYXN0OiB0eHQgPSAoY2hhciAqKSJ0eHQiIHN5bnRheCBFcnJvci4KICAgICAgICAgICAgVGhlIHBhcnNlciBzaG91bGQgbm93IGFjY2VwdCB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpzID0gKGNoYXIgKikgIkhlbGxvIik7CgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IENsYXVkaXVzIFNjaG5vcnIuCgoxMS8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIHByb2JsZW0gd2l0aCBjcm9zcyBtb2R1bGUgbGlua2luZy4gIFByZXZpb3VzbHkgbW9kdWxlcyByZWZlcnJlZAogICAgICAgICAgICB0byBiYXNlIGNsYXNzZXMgdGhyb3VnaCBhIGdsb2JhbCB2YXJpYWJsZS4gICBOb3csIHRoZSBtb2R1bGUgbG9va3MgdXAgYmFzZQogICAgICAgICAgICBjbGFzc2VzIHRocm91Z2ggdGhlIHR5cGUgc3lzdGVtIGl0c2VsZi0tLWF2b2lkaW5nIHRoZSBuZWVkIHRvIGxpbmsgdG8gYSBnbG9iYWwKICAgICAgICAgICAgbGlrZSBiZWZvcmUuICBDYXZlYXQ6ICBtb2R1bGVzIHdpdGggYmFzZSBjbGFzc2VzIG11c3QgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICBtb2R1bGVzIHdpdGggZGVyaXZlZCBjbGFzc2VzLgogCjExLzI0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgdXNlICgpIHRvIHJlcHJlc2VudCBudWxsIHBvaW50ZXJzLAoJICAgIGFzIGl0IGlzIGRvbmUgaW4gLWdoIG1vZGUuCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgQWRkIGEgZ2VuZXJhdGVkIHNjcmlwdCAicHJlaW5zdC1zd2lnIiwgd2hpY2ggY2FuIGJlIHVzZWQKCSAgICB0byBpbnZva2UgU1dJRyBiZWZvcmUgaXQgaGFzIGJlZW4gaW5zdGFsbGVkLiAgSXQgYXJyYW5nZXMKCSAgICB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcyBmcm9tIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZQoJICAgIHVzZWQuIAoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGRvbid0IGZvcmdldCB0byBjYWxsIFNXSUdfR3VpbGVfSW5pdC4KCSAgICBBZGQgYSBTV0lHX2NvbnRyYWN0X2Fzc2VydCBtYWNyby4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFVwZGF0ZSB0aGUgY29uZmlndXJlIGNoZWNrIGZvciB0aGUgZHluZXh0IG9iamVjdCB0byB3b3JrCgkgICAgd2l0aCBNelNjaGVtZSAyMDUuCgoxMS8yMC8yMDAzOiBtbWF0dXMKCSAgICBGaXhlZCB0aGUgaW5jbHVkZS9pbXBvcnQgZXJyb3IgcmVwb3J0ZWQgYnkgS2VyaW0gQm9yY2hhZXYsCgkgICAgd2hlcmUgdHdvIGZpbGVzIHdpdGggbmFtZXMgbGlrZQoKCSAgICAnZGlyMS9oZWxsby5pJwoJICAgICdkaXIyL2hlbGxvLmknCgkgICAgCgkgICAgY2FuIG5vdCBiZSBpbmNsdWRlIGF0IHRoZSBzYW1lIHRpbWUuIFN3aWcgd2FzIGluY2x1ZGluZwoJICAgIGp1c3QgdGhlIGZpcnN0IG9uZSwgYXNzdW1pbmcgdGhlIHNlY29uZCBvbmUgd2FzIG5vdCBhCgkgICAgZGlmZmVyZW50IG9uZSwgc2luY2UgaXQgd2FzIGNoZWNraW5nL2tlZXBpbmcganVzdCB0aGUKCSAgICBiYXNlbmFtZSAnaGVsbG8uaScuCgoxMS8xOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIFNXSUcgcnVudGltZSBsaWJyYXJ5IHN1cHBvcnQuIAogICAgICAgICAgICAgIC0gIFRoZSAtYyBjb21tYW5kIGxpbmUgb3B0aW9uIGhhcyBiZWVuIHJlbmFtZWQgdG8gLW5vcnVudGltZQogICAgICAgICAgICAgIC0gIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9uOiAtcnVudGltZS4gIFdoZW4gc3VwcGxpZWQsIHRoaXMKICAgICAgICAgICAgICAgICBpbnNlcnRzIHRoZSBzeW1ib2wgU1dJR19HTE9CQUwgaW50byB0aGUgd3JhcHBlciBjb2RlLiAgVGhpcywKICAgICAgICAgICAgICAgICBpbiB0dXJuLCBtYWtlcyBhbGwgb2YgdGhlIHJ1bnRpbWUgc3VwcG9ydCBmdW5jdGlvbnMgZ2xvYmFsbHkKICAgICAgICAgICAgICAgICB2aXNpYmxlLgogICAgICAgICAgICAgICAtIE5ldyBsaWJyYXJ5IGZpbGU6IHN3aWdydW4uaS4gICBVc2VkIHRvIGNyZWF0ZSBtb2R1bGVzCiAgICAgICAgICAgICAgICAgZm9yIHJ1bnRpbWUgbGlicmFyeSAoaWYgbmVlZGVkKS4KICAgIAoxMS8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgJ21ha2Ugc3JjcnBtJyBycG1idWlsZCBmaXggLSBwYXRjaCBmcm9tIEpvZSBDb29wZXIKCjExLzE4LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIENoYW5nZSBtZWFuaW5nIG9mIGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLWd1aWxlIHRvCgkgICAgdGhlIG5hbWUgb2YgdGhlIEd1aWxlIGV4ZWN1dGFibGUuICBUaGUgbmV3IG9wdGlvbiAtLXdpdGgtZ3VpbGUtcHJlZml4IAoJICAgIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHRyZWUgd2hlcmUgR3VpbGUgaXMKCSAgICBpbnN0YWxsZWQuICAoSG93ZXZlciwgdXN1YWxseSBpdCBzdWZmaWNlcyB0byB1c2UgdGhlCgkgICAgc2luZ2xlIG9wdGlvbiAtLXdpdGgtZ3VpbGUtY29uZmlnLikgIAoJICAgIFdoZW4gcnVubmluZyB0aGUgcnVuIHRlc3RzIHRlc3Qtc3VpdGUsIG1ha2Ugc3VyZSB0byB1c2UgdGhlCgkgICAgdmVyc2lvbiBvZiBHdWlsZSB0aGF0IFNXSUcgd2FzIGNvbmZpZ3VyZWQgZm9yLgoKMTEvMTcvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW1wcm92ZW1lbnRzIHRvIG9iamVjdC1vd25lcnNoaXAgbWFuYWdlbWVudCBpbiAKCSAgICAiLXNjbSIgbW9kZS4gIChUaGV5IGRvIG5vdCBhcHBseSB0byB0aGUgZGVmYXVsdCAiLWdoIiBtb2RlLikKCSAgICAqIFJlbmFtZWQgdGhlIHNtb2IgdHlwZSB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QgY2FuCgkgICAgICBiZSBnYXJiYWdlIGNvbGxlY3RlZCBmcm9tICJjb2xsZWN0ZWQgc3dpZyIgdG8gImNvbGxlY3RhYmxlCgkgICAgICBzd2lnIiwgd2hpY2ggaXMgbW9yZSBwcmVjaXNlLiAgCgkgICAgKiBFeHBvcnQgdGhlIGRlc3RydWN0b3IgZnVuY3Rpb25zIGFnYWluLiAgSXQgaXMgbm93CiAJICAgICAgYWxsb3dlZCB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3RvcnMsIGV2ZW4gZm9yCgkgICAgICBnYXJiYWdlLWNvbGxlY3RlZCBwb2ludGVyIG9iamVjdHMuICBBIHBvaW50ZXIgb2JqZWN0CgkgICAgICB0aGF0IGhhcyBiZWVuIHBhc3NlZCB0byBhIGRlc3RydWN0b3IgaXMgbWFya2VkIGluIGEKCSAgICAgIHNwZWNpYWwgd2F5IHVzaW5nIGEgbmV3IHNtb2IgdHlwZSwgImRlc3Ryb3llZCBzd2lnIi4KCSAgICAgIChUaGlzIGhlbHBzIGF2b2lkIG5hc3R5IG1lbW9yeSBidWdzLCB3aGVyZSByZWZlcmVuY2VzIHRvCgkgICAgICBkZWFkIEMgb2JqZWN0cyBhcmUgc3RpbGwgaGVsZCBpbiBTY2hlbWUuIE1vcmVvdmVyLCB0aGUKCSAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIHdpbGwgbm90IHRyeSB0byBmcmVlIGEgZGVzdHJveWVkCgkgICAgICBvYmplY3Qgb25jZSBtb3JlLikKCSAgICAqIERlc3RydWN0b3ItbGlrZSBmdW5jdGlvbnMgY2FuIGFsc28gbWFyayB0aGVpciBhcmd1bWVudHMgCgkgICAgICBhcyBkZXN0cm95ZWQgYnkgYXBwbHlpbmcgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkRFU1RST1lFRC4KCSAgICAgIChJdCBjYWxscyB0aGUgZnVuY3Rpb24gU1dJR19HdWlsZV9NYXJrUG9pbnRlckRlc3Ryb3llZC4pCgkgICAgKiBGdW5jdGlvbnMgdGhhdCAiY29uc3VtZSIgdGhlaXIgb2JqZWN0cyAob3IgdGhhdCAib3duIgoJICAgICAgdGhlbSBhZnRlciB0aGUgY2FsbCkgY2FuIG1hcmsgdGhlaXIgYXJndW1lbnRzIGFzCgkgICAgICBub3QgZ2FyYmFnZSBjb2xsZWN0YWJsZS4gIFRoaXMgY2FuIGJlIGRvbmUgYnkgYXBwbHlpbmcKCSAgICAgIHRoZSB0eXBlbWFwIFNXSUdUWVBFICpDT05TVU1FRC4gIChJdCBjYWxscyB0aGUgZnVuY3Rpb24KCSAgICAgIFNXSUdfR3VpbGVfTWFya1BvaW50ZXJOb25jb2xsZWN0YWJsZS4pCgkgICAgKiBUaGUgbWFjcm8gVFlQRU1BUF9QT0lOVEVSX0lOUFVUX09VVFBVVCBmcm9tIGxpYnJhcnkKCSAgICAgIHBvaW50ZXItaW4tb3V0LmkgY3JlYXRlcyBhZGRpdGlvbmFsIHR5cGVtYXBzIAoJICAgICAgUFRSVFlQRSAqSU5QVVRfQ09OU1VNRUQsIFBUUlRZUEUgKklOUFVUX0RFU1RST1lFRC4KCSAgICAgIFRoZXkgbWFyayB0aGUgcGFzc2VkIHBvaW50ZXIgb2JqZWN0IGxpa2V3aXNlLgoJICAgICAgVGhlIHR5cGVtYXAgUFRSVFlQRSAqT1VUUFVUIGNyZWF0ZXMgYSBnYXJiYWdlLWNvbGxlY3RhYmxlCgkgICAgICBwb2ludGVyIG9iamVjdCwgbGlrZSAlbmV3b2JqZWN0IGRvZXMgZm9yIGEgcmV0dXJuZWQgCgkgICAgICBwb2ludGVyLiAgVXNlIHRoZSBuZXcgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVRfTk9OQ09MTEVDVEFCTEUKCSAgICAgIHRvIGNyZWF0ZSBhIHBvaW50ZXIgb2JqZWN0IHRoYXQgd2lsbCBub3QgYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBIYW5kbGUgJGlucHV0IGluICJmcmVlYXJnIiB0eXBlbWFwcy4KCSAgICBOZXZlciBxdWFsaWZ5IEdPT1BTIHNsb3QgbmFtZXMgd2l0aCB0aGUgY2xhc3MgbmFtZS4gCgkgICAgSGFuZGxlIG9wdGlvbmFsIGFyZ3VtZW50cyBwcm9wZXJseSBpbiB0aGUgR09PUFMgbWV0aG9kcy4KCjExLzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgaW5zdGFsbGF0aW9uIHRvIHdvcmsgd2l0aCB0aGUgdXBjb21pbmcgQXV0b21ha2UtMS44LgogICAgICAgICAgICBta2luc3RhbGxkaXJzIHdhcyBiZWluZyB1c2VkIGJ5IGEgbm9uLUF1dG9tYWtlIG1ha2VmaWxlLiAKICAgICAgICAgICAgbWtpbnN0YWxsZGlycyBpcyBiZWluZyBwaGFzZWQgb3V0IGFuZCBzbyB3YXMgbm90IGJlaW5nCiAgICAgICAgICAgIGNyZWF0ZWQgYnkgQXV0b21ha2UuIGluc3RhbGwtc2ggdXNlZCBpbnN0ZWFkLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBpbXByb3ZlbWVudHMsIHR3ZWFrcyBhbmQgYnVnIGZpeGVzIHNpbmNlIAogICAgICAgICAgICB0aGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBoYXZlIGJlZW4gY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTIvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBXaGVuICVmZWF0dXJlKCJzaGFkb3ciKSBpcyB1c2VkIHRvIGFkZCBjb2RlIHRvIHNoYWRvdwogICAgICAgICAgICBjbGFzc2VzLCB0aGUgc3BlY2lhbCB2YXJpYWJsZSAkYWN0aW9uIGV4cGFuZHMgdG8gdGhlIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIHVuZGVybHlpbmcgd3JhcHBlciBmdW5jdGlvbiB0aGF0IHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQgbm9ybWFsbHkuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gZ2VuZXJhdGluZyBwcm94eSBjbGFzcyBjb2RlLCBTV0lHIGVtaXRzIGEgZmV3CiAgICAgICAgICAgIGRlZmF1bHQgbWV0aG9kcyBmb3IgX19yZXByX18oKSBhbmQgb3RoZXIgUHl0aG9uIHNwZWNpYWwKICAgICAgICAgICAgbWV0aG9kcy4gIFNvbWUgb2YgdGhlc2UgbWV0aG9kcyBhcmUgZW1pdHRlZCBhZnRlciBhbGwgb2YgdGhlCiAgICAgICAgICAgIGNvbnRlbnRzIG9mIGEgY2xhc3MuIEhvd2V2ZXIsIHRoaXMgbWFrZXMgaXQgaGFyZCB0byBvdmVycmlkZQogICAgICAgICAgICB0aGUgbWV0aG9kcyB1c2luZyAlcHl0aG9uY29kZSBhbmQgc29tZSBvdGhlciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgICAgYWxsb3cgY29kZSB0byBiZSBpbnNlcnRlZCBpbnRvIGEgY2xhc3MuICBUaGVzZSBzcGVjaWFsIG1ldGhvZHMKICAgICAgICAgICAgYXJlIG5vdyBlbWl0dGVkIGludG8gdGhlIGNvZGUgKmJlZm9yZSogYWxsIG9mIHRoZSBvdGhlciBtZXRob2RzLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgRXJpYyBKb25lcy4KIAoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFByZXByb2Nlc3NvciBlbmhhbmNlbWVudC4gICBGb3IgaW5jbHVkZSBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICVpbmNsdWRlICJmb28vYmFyLmkiCgogICAgICAgICAgICB0aGUgZGlyZWN0b3J5ICJmb28iIGlzIG5vdyBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggd2hpbGUgCiAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIGNvbnRlbnRzIG9mIGJhci5pLiAgVGh1cywgaWYgYmFyLmkgaW5jbHVkZXMgb3RoZXIKICAgICAgICAgICAgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5LCB0aGV5IHdpbGwgYmUgZm91bmQuIFByZXZpb3VzbHksCiAgICAgICAgICAgIHlvdSB3b3VsZCBoYXZlIHRvIGFkZCBhZGRpdGlvbmFsIGRpcmVjdG9yaWVzIHVzaW5nIC1JIHRvIG1ha2UgdGhpcwogICAgICAgICAgICB3b3JrIGNvcnJlY3RseS4gIE5vdGU6IHRoZSBDIHByZXByb2Nlc3NvciBzZWVtcyB0byBiZWhhdmUgaW4KICAgICAgICAgICAgYW4gaWRlbnRpY2FsIG1hbm5lciBvbiBtYW55IChtb3N0PyBhbGw/KSBzeXN0ZW1zLgogICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS2VyaW0gQm9yY2hhZXYuCgoxMS8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayBvbiBNYWMgT1MgWCAxMC4zLnggKFBhbnRoZXIpLgogICAgICAgICAgICBUZXN0ZWQgd2l0aCBQeXRob24sIFRjbCwgUGVybCwgYW5kIFJ1YnktLS1hbGwgb2Ygd2hpY2ggc2VlbSB0byB3b3JrLgoKMTEvMDgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCB0aGUgdHlwZW1hcHMgaW4gdmFyaW91cy5pIHdoaWNoIHdlcmUgbW9zdGx5IGJyb2tlbi4KICAgICAgICAgICAgY2hhciAqKlNUUklOR19JTiBhbmQgY2hhciAqKlNUUklOR19SRVQgdHlwZW1hcHMgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgU1RSSU5HX0FSUkFZLiBmbG9hdCAqRkxPQVRfQVJSQVlfUkVUVVJOIHR5cGVtYXAgcmVtb3ZlZC4KCjExLzA4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gVGNsIG1vZHVsZSBub3cgZW1pdHMgYSBzYWZlIG1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBieQogICAgICAgICAgICBkZWZhdWx0LiAgSXQgY2FuIGJlIHJlbW92ZWQgYnkgcnVubmluZyAnc3dpZyAtbm9zYWZlJy4KCjExLzA0LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE9ubHkgdXNlIHRoZSBTQ01fIEFQSSB3aGVuIHRoZSBmdW5jdGlvbgoJICAgIGBzY21fc2xvdF9leGlzdHNfcCcgZXhpc3RzIChuZWVkZWQgZm9yIEdPT1BTIHN1cHBvcnQpLiAgCgkgICAgVGhpcyBmdW5jdGlvbiB3YXMgcmVuYW1lZCBkdXJpbmcgdGhlIEd1aWxlIDEuNSBzZXJpZXMKCSAgICBmcm9tIGBzY21fc2xvdHNfZXhpc3RzX3AnLgoJICAgIFJlcG9ydCB0aGUgcmlnaHQgcnVudGltZSBsaWJyYXJ5IHdoZW4gaW52b2tlZCB3aXRoCgkgICAgLXNjbSAtbGRmbGFncy4KCjExLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gRml4ICM3ODIwNTIuICBUaGUgLS13aXRoLWNoaWNrZW5jZmcgY29uZmlndXJlCgkgICAgb3B0aW9uIChhbmQgb3RoZXJzKSB3ZXJlIG5vdCBhY2NlcHRlZC4KCjExLzAyLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIE1lcmdlIG5ldyBzZXQgb2YgR09PUFMgY2hhbmdlcyBieSBKb2huIExlbnouCgkgICAgR09PUFMgb2JqZWN0cyBhcmUgbm93IG1hbmlwdWxhdGVkIGRpcmVjdGx5IGJ5IHRoZSBDIGNvZGUuCgkgICAgU29tZSBmaXhlcyB0byB0eXBlbWFwLUdPT1BTIGludGVyYWN0aW9uLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gUmVtb3ZlIHRoZSBmaWxlIGFyZ3VtZW50IHRvIC1zY21zdHViIGFuZCAtZ29vcHMuCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IGFsd2F5cyBjYWxsZWQgTU9EVUxFLnNjbSBvcgoJICAgIE1PRFVMRS1wcmltaXRpdmUuc2NtLCB3aGVyZSBNT0RVTEUgaXMgdGhlIG1vZHVsZSBuYW1lIGFuZCAKCSAgICAicHJpbWl0aXZlIiBjYW4gYmUgY2hhbmdlZCBieSB0aGUgLXByaW1zdWZmaXggb3B0aW9uLgoJICAgIFRoZSBTY2hlbWUgZmlsZXMgYXJlIG5vdyBwbGFjZWQgaW4gdGhlIGRpcmVjdG9yeSBnaXZlbiBieQoJICAgIHRoZSAtb3V0ZGlyIG9wdGlvbiwgb3IgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgoJICAgIChQYXRjaCBieSBKb2huIExlbnosIHNsaWdodGx5IG1vZGlmaWVkLikKCgkgICAgKioqIElOQ09NUEFUSUJJTElUWSBbR3VpbGVdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFVuaWZ5IHRoZSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuICBUaGUgc3RhbmRhcmQKCSAgICBmdW5jdGlvbnMgYXJlOgoJICAgICAqIFNXSUdfTmV3UG9pbnRlck9iaiAoUE9JTlRFUiwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIENyZWF0ZSBhbiBzY3JpcHRpbmcgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHR5cGVkCgkJICAgcG9pbnRlci4gRkxBR1MgYXJlIGxhbmd1YWdlIHNwZWNpZmljLgoJICAgICAqIFNXSUdfQ29udmVydFB0ciAoSU5QVVQsIFJFU1VMVCwgVFlQRSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICBzdG9yZSBpdCBpbiB0aGUgcGxhY2UgUkVTVUxULiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggCgkJICAgb2NjdXJzLCByZXR1cm4gbm9uemVyby4KCSAgICAgKiBTV0lHX011c3RHZXRQdHIgKElOUFVULCBUWVBFLCBBUkdOVU0sIEZMQUdTKQoJICAgICAgICAtLSBHZXQgYSBwb2ludGVyIGZyb20gdGhlIHNjcmlwdGluZyBvYmplY3QgSU5QVVQgYW5kCgkJICAgcmV0dXJuIGl0LiAgV2hlbiBhIHR5cGUgbWlzbWF0Y2ggb2NjdXJzLCB0aHJvdyBhbgoJCSAgIGV4Y2VwdGlvbi4gIElmIEFSR05VTSA+IDAsIHJlcG9ydCBpdCBhcyB0aGUgCgkJICAgYXJndW1lbnQgbnVtYmVyIHRoYXQgaGFzIHRoZSB0eXBlIG1pc21hdGNoLgogICAgICAgICAgICBbR3VpbGVdOiAgICBObyBjaGFuZ2VzLgoJICAgIFtNelNjaGVtZV06IE5vIGNoYW5nZXMuCgkgICAgW1BlcmxdOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmouCgkJICAgICAgICBUaGUgZnVuY3Rpb24gU1dJR19NYWtlUHRyIGlzIGtlcHQuCgkJCVRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIgaXMgY3VycmVudGx5IG5vdAoJCQlzdXBwb3J0ZWQuCgkgICAgW1B5dGhvbl06ICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1J1YnldOiAgICAgQWRkIHRoZSBmdW5jdGlvbiBTV0lHX011c3RHZXRQdHIuCgkgICAgW1RjbF06ICAgICAgUmVtb3ZlIHRoZSAiaW50ZXJwIiBhcmd1bWVudCBvZgoJCSAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaiwgU1dJR19Db252ZXJ0UHRyLAoJCSAgICAgICAgU1dJR19Db252ZXJ0UGFja2VkLCBhbmQgU1dJR19Db252ZXJ0UHRyRnJvbVN0cmluZy4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgCgkJCW5vdCBzdXBwb3J0ZWQuCgkgICAgTm8gY2hhbmdlcyB0byBQaWtlIGJlY2F1c2UgaXRzIHBvaW50ZXIgY29udmVyc2lvbiBjb2RlIGRpZAoJICAgIG5vdCBsb29rIGNvbXBsZXRlLiAgTm8gY2hhbmdlcyB0byBQSFA0LCBiZWNhdXNlIEkgZGlkIG5vdAoJICAgIHVuZGVyc3RhbmQgaXRzIHJ1bnRpbWUgY29kZS4gIE5vIGNoYW5nZXMgdG8gQ2hpY2tlbgoJICAgIGJlY2F1c2UgbWFqb3IgY2hhbmdlcyBhcmUgZXhwZWN0ZWQgc29vbiBhbnl3YXkuICBObwoJICAgIGNoYW5nZXMgdG8gSmF2YSwgT0NhbWwsIEMjIGJlY2F1c2UgdGhleSBkbyBub3Qgc2VlbSB0bwoJICAgIGhhdmUgYSBwb2ludGVyLWNvbnZlcnNpb24gcnVudGltZSBBUEkuCgogICAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZIFtUY2xdICoqKgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtQZXJsNSwgUEhQNCwgUGlrZSwgUHl0aG9uLCBSdWJ5LCBUY2xdOiBVc2UgdGhlCgkgICAgcHJlcHJvY2Vzc29yIHRvIHJlbmFtZSBleHRlcm5hbCBmdW5jdGlvbnMgb2YgdGhlIFNXSUcKCSAgICBydW50aW1lIEFQSSB0byBmb2xsb3cgdGhlIG5hbWluZyBjb252ZW50aW9uCgkgICAgU1dJR188bGFuZ3VhZ2U+XzxmdW5jdGlvbj4uICBUaGlzIHNob3VsZCBhbGxvdyBsaW5raW5nCgkgICAgbW9yZSB0aGFuIG9uZSBpbnRlcnByZXRlciBpbnRvIGEgcHJvZ3JhbS4KCjEwLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCBzaW5jZSBpbnRyb2R1Y2luZyB0aGUgZXhjZXB0aW9uIGFuZCBzdGQ6OnN0cmluZyBkZWxlZ2F0ZXMuCiAgICAgICAgICAgIFRoZSBmaXggb3ZlcmNvbWVzIGxpbmtlciBlcnJvcnMgd2hlbiB1c2luZyBtb3JlIHRoYW4gb25lIFNXSUcgbW9kdWxlLgogICAgICAgICAgICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEFuZHJlYXMgU2No9nJrLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODIzMzAyIF0gSW5jciBUY2wgc3VwcG9ydC4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgQWxleGV5IER5YWNoZW5rby4KICAgICAgICAgICAgTm90ZTogbmVlZHMgZG9jdW1lbnRhdGlvbi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMyNSBdIG5ldyBQeXRob24gTW9kdWxlIG9wdGlvbnMgYW5kIGZlYXR1cmVzLgogICAgICAgICAgICBSb2JpbiBEdW5uIHdyaXRlczoKCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggbWFrZXMgYSBudW1iZXIgb2YgY2hhbmdlcyB0byB0aGUgU1dJRyBweXRob24gbW9kdWxlLgoKICAgICAgICAgICAgMS4gQWRkIC1hcHBseSBvcHRpb24sIGFuZCBjaGFuZ2UgdGhlIGRlZmF1bHQgY29kZQogICAgICAgICAgICBvdXRwdXQgdG8gdXNlIHRoZSBmb28oKmFyZ3MsICoqa3cpIGNhbGxpbmcgc3ludGF4CiAgICAgICAgICAgIGluc3RlYWQgb2YgdXNpbmcgYXBwbHkoKS4gSWYgdGhlIC1hcHBseSBvcHRpb24gaXMKICAgICAgICAgICAgZ2l2ZW4gdGhlbiBjb2RlIGlzIGdlbmVyYXRlZCBhcyBiZWZvcmUuIFRoaXMgaXMgdmVyeQogICAgICAgICAgICBzaW1pbGFyIHRvIFBhdGNoICM3MzcyODEgYnV0IHRoZSBuZXcgLW1vZGVybiBvcHRpb24KICAgICAgICAgICAgbWFrZXMgdGhlIHNlY29uZCBoYWxmIG9mIHRoYXQgcGF0Y2ggdW5uZWNlc3Nhcnkgc28gaXQKICAgICAgICAgICAgaXMgbm90IGluY2x1ZGVkIGhlcmUuCgkgICAgCiAgICAgICAgICAgIDIuIEFkZCAtbmV3X3JlcHIgb3B0aW9uLiBUaGlzIGlzIHRoZSBzYW1lIGFzIG15IFBhdGNoCiAgICAgICAgICAgICM3OTcwMDIgd2hpY2ggSSB3aWxsIG1hcmsgYXMgY2xvc2VkIHNpbmNlIGl0IGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBuZWVkZWQuIFdoZW4gdGhpcyBuZXcgb3B0aW9uIGlzIHVzZWQgdGhlbiB0aGUKICAgICAgICAgICAgX19yZXByX18gbWV0aG9kcyB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIHByb3h5IGNsYXNzZXMKICAgICAgICAgICAgd2lsbCBiZSBtb3JlIGluZm9ybWF0aXZlIGFuZCBnaXZlIGRldGFpbHMgYWJvdXQgdGhlCiAgICAgICAgICAgIHB5dGhvbiBjbGFzcyBhbmQgdGhlIEMrKyBjbGFzcy4KCSAgICAKICAgICAgICAgICAgMy4gQWRkICVmZWF0dXJlKCJhZGR0b2Z1bmMiKS4gSXQgYWxsb3dzIHlvdSB0byBpbnNlcnQKICAgICAgICAgICAgb25lIG9yIG1vcmUgbGluZXMgb2YgY29kZSBpbnNpZGUgdGhlIHNoYWRvdyBtZXRob2Qgb3IKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBpcyBhbHJlYWR5IGdlbmVyYXRlZCwgaW5zdGVhZCBvZgogICAgICAgICAgICByZXBsYWNpbmcgdGhlIHdob2xlIHRoaW5nIGxpa2UgJWZlYXR1cmUoInNoYWRvdyIpIGRvZXMuCiAgICAgICAgICAgIEZvciBfX2luaXRfXyBpdCBnb2VzIGF0IHRoZSBlbmQsIGZvciBfX2RlbF9fIGl0IGdvZXMKICAgICAgICAgICAgYXQgdGhlIGJlZ2luaW5nIGFuZCBmb3IgYWxsIG90aGVycyB0aGUgY29kZSBnZW5lcmF0ZWQKICAgICAgICAgICAgaXMgZXhwYW5kZWQgb3V0IHRvIGJlIGxpa2UKCSAgICAKICAgICAgICAgICAgZGVmIEJhcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICB2YWwgPSBfbW9kdWxlLkZvb19CYXIoKmFyZ3MsICoqa3dhcmdzKQogICAgICAgICAgICByZXR1cm4gdmFsCgkgICAgCiAgICAgICAgICAgIGFuZCB0aGUgImFkZHRvZnVuYyIgY29kZSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSB0aGUKICAgICAgICAgICAgcmV0dXJuIHN0YXRlbWVudC4gSWYgdGhlIGZlYXR1cmUgaXMgbm90IHVzZWQgZm9yIGEKICAgICAgICAgICAgcGFydGljdWxhciBtZXRob2Qgb3IgZnVuY3Rpb24gdGhlbiB0aGUgc2hvcnRlciBjb2RlIGlzCiAgICAgICAgICAgIGdlbmVyYXRlZCBqdXN0IGxpa2UgYmVmb3JlLgoJICAgIAogICAgICAgICAgICA0LiBBIGxpdHRsZSBiaXQgb2YgcmVmYWN0b3JpbmcgdG8gbWFrZSBpbXBsZW1lbnRpbmcKICAgICAgICAgICAgYWRkdG9mdW5jIGEgbGl0dGxlIGVhc2llci4KCSAgICAKICAgICAgICAgICAgNS4gQWRkZWQgYSAtbW9kZXJuIGNvbW1hbmQtbGluZSBmbGFnIHRoYXQgd2lsbCBjYXVzZQogICAgICAgICAgICBTV0lHIHRvIG9taXQgdGhlIGNydWZ0IGluIHRoZSBwcm94eSBtb2R1bGVzIHRoYXQgYWxsb3dzCiAgICAgICAgICAgIGl0IHRvIHdvcmsgd2l0aCB2ZXJzaW9ucyBvZiBQeXRob24gcHJpb3IgdG8gMi4yLiBUaGUKICAgICAgICAgICAgcmVzdWx0IGlzIGEgc2ltcGxlciwgY2xlYW5lciBhbmQgZmFzdGVyIHB5dGhvbiBwcm94eQogICAgICAgICAgICBtb2R1bGUsIGJ1dCBvbmUgdGhhdCByZXF1aXJlcyBQeXRob24gMi4yIG9yIGdyZWF0ZXIuIAoKMTAvMzEvMjAwMzogYmVhemxleSAKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxOSBdIFhNTCBtb2R1bGUgdHdlYWtzLgogICAgICAgICAgICBUaGlzIGFkZHMgYSBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAteG1sbGl0ZSB0aGF0IAogICAgICAgICAgICBncmVhdGx5IHJlZHVjZXMgdGhlIGFtb3VudCBvZiBlbWl0dGVkIFhNTCBjb2RlIGJ5CiAgICAgICAgICAgIGVsaW1pbmF0aW5nIHNvbWUgZmllbGRzIG1vc3RseSB1c2VkIGluIFNXSUcncwogICAgICAgICAgICBpbnRlcm5hbCBwcm9jZXNzaW5nLiAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzMxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIHBhdGNoOiBbIDgyOTMxNyBdIEFkZHMgRG9oU3BsaXRMaW5lcyBmdW5jdGlvbi4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjEwLzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4Mjc5MDcgXSBhcmdvdXQgb2JqZWN0cyBub3QgYmVpbmcgd3JhcHBlZCBwcm9wZXJseSAoUEFUSCkuCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoJICAgICAKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNjk5NiBdIHBlcmwgdHlwZSBjaGVja2luZyBpZ25vcmVzIHBlcmwgc3ViY2xhc3Nlcy4KICAgICAgICAgICAgVGhpcyBlbmhhbmNlbWVudCBtYWtlcyBpdCBzbyB3cmFwcGVkIGNsYXNzZXMgYW5kIHN0cnVjdHMgY2FuCiAgICAgICAgICAgIGJlIHN1YmNsYXNzZWQgaW4gUGVybCBhbmQgdXNlZCBub3JtYWxseS4gCiAgICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFNhbHZhZG9yIEZhbmRp8W8gR2FyY+1hLgoKMTAvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW50UHRyIG1hcnNoYWxsZWQgd2l0aCBhIHZvaWQqIGluc3RlYWQgb2YgaW50IGluIEMgZnVuY3Rpb24gCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gVGhlIGNhc3RzIHRodXMgbG9vayBtb3JlIGNvbnZlbnRpb25hbCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgLy8gb2xkCiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeChpbnQgamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKihTaGFwZSAqKikmamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbmV3CiAgICAgICAgICAgICAgICBEbGxFeHBvcnQgZG91YmxlIFNXSUdTVERDQUxMIENTaGFycF9nZXRfU2hhcGVfeCh2b2lkICogamFyZzEpIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBTaGFwZSAqYXJnMSA9IChTaGFwZSAqKSAwIDsKICAgICAgICAgICAgICAgICAgICBhcmcxID0gKFNoYXBlICopamFyZzE7IAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCjEwLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIGEgY2xhc3MgaGFzIG92ZXJsb2FkZWQgbWV0aG9kcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCB4KTsKICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGludCBiYXIoaW50IHgsIGludCB5KTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgYW5kIHRoZSBjbGFzcyBpcyB1c2VkIGFzIGEgc21hcnQgcG9pbnRlcjoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29QdHIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgU1dJRyB3b3VsZCB0cnkgdG8gZXhwb3NlIHRoZSBzdGF0aWMgbWVtYmVyIEZvbzo6YmFyCiAgICAgICAgICAgIHRocm91Z2ggRm9vUHRyLS0tcmVzdWx0aW5nIGJvZ3VzIHdyYXBwZXIgY29kZSBhbmQgYSBjb21waWxlcgogICAgICAgICAgICBlcnJvci4KCiAgICAgICAgICAgIER1ZSB0byB0aGUgd2F5IGluIHdoaWNoIG92ZXJsb2FkaW5nIGlzIGhhbmRsZWQsIGl0IGlzCiAgICAgICAgICAgIGV4dHJlbWVseSBkaWZmaWN1bHQgdG8gZWxpbWluYXRlIHRoZSBzdGF0aWMgbWV0aG9kIGluCiAgICAgICAgICAgIHRoaXMgY2FzZS4gIFRoZXJlZm9yZSwgaXQgaXMgc3RpbGwgZXhwb3NlZC4gIEhvd2V2ZXIsCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSBub3cgY29tcGlsZXMgYW5kIHdvcmtzLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZSwgTXpTY2hlbWUsIENoaWNrZW5dOiBSZW1vdmUgc3ltYm9sIGNsYXNoZXMgYmV0d2VlbgoJICAgIHRoZSBydW50aW1lIGxpYnJhcmllcyBieSByZW5hbWluZyBhbGwgZXh0ZXJuIGNvbW1vbi5zd2cKCSAgICBmdW5jdGlvbnMgd2l0aCB0aGUgcHJlcHJvY2Vzc29yLgoKMTAvMDUvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkZWQgYmFzaWMgR09PUFMgc3VwcG9ydCwgY29udHJpYnV0ZWQgYnkgSm9obiBMZW56LgoJICAgIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscy4KCSAgICAKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTmV3IG9wdGlvbiwgLW9ubHktc2V0dGVycywgd2hpY2ggZGlzYWJsZXMKCSAgICB0cmFkaXRpb25hbCBnZXR0ZXIgYW5kIHNldHRlciBwcm9jZWR1cmVzIGZvciBzdHJ1Y3R1cmUgc2xvdHMuCgoxMC8wMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBydW4gdGVzdCBmb3IgcmVmZXJlbmNlX2dsb2JhbF92YXJzIGJ5IEpvaG4gTGVuei4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUGFydGlhbCBzb2x1dGlvbiB0byBbIDc5MjE4MCBdIEMrKyBzbWFydC1wb2ludGVyL25hbWVzcGFjZSBtaXh1cCByZXZpc2l0ZWQuCiAgICAgICAgICAgIFRoZSBwcm9ibGVtIGlzIG5vdCBlYXN5IHRvIGZpeCAoYXQgbGVhc3QgaXQgZG9lc24ndCBzZWVtIHNvKSwgYnV0IGlzCiAgICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIGluc3RhbnRpYXRpb24gb2YgcXVhbGlmaWVkIHRlbXBsYXRlcyBpbnNpZGUgb2Ygb3RoZXIKICAgICAgICAgICAgbmFtZXNwYWNlcy4gICBTV0lHIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGlzIGNhc2UgcmF0aGVyCiAgICAgICAgICAgIHRoYW4gZ2VuZXJhdGluZyBicm9rZW4gd3JhcHBlcnMuCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODAwMDEyIF0gRU5URVIgbWFjcm8gZnJvbSBDT1JFL3Njb3BlLmggY2xhc2hlcyB3aXRoIGxpYmMgc2VhcmNoLmguCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMTUxOCBdIENhc3RpbmcgaW50cyB0byBkb3VibGVzICh3LyBzb2x1dGlvbj8pCiAgICAgICAgICAgIEFkZHJlc3NlcyBhIHByb2JsZW0gd2l0aCBvdmVybG9hZGluZyBpbiB0aGUgUGVybCBtb2R1bGUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBEYWxsZXkuCgowOS8yOC8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlIHdpdGggLXNjbSBvcHRpb25dIEZpeCB0eXBvIGluIGdlbmVyYXRlZCBjb2RlIGZvcgoJICAgIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzLiAgUmVwb3J0ZWQgYnkgSm9obiBMZW56LgoKMDkvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgxMjUyOCBdIGV4dGVybnMgbm90IGNvcnJlY3Qgd2hlbiB0aHJvdyBpcyBpbiBzaWduYXR1cmUuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvc2VwaCBXaW5zdG9uLgogICAgICAgICAgICAKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFNXSUcgd2FzIGdlbmVyYXRpbmcgYSBudW1iZXIgb2Ygc3ltYm9scyB0aGF0IGRpZG4ndCBjb21wbHkgd2l0aCAKICAgICAgICAgICAgdGhlIElTTyBDL0MrKyBzdGFuZGFyZCwgaW4gcGFydGljdWxhciBJU08vSUVDIDE0ODgyOjE5OTgoRSkgMTcuNC4zLjEuMgogICAgICAgICAgICB3aGVyZSBkb3VibGUgdW5kZXJzY29yZXMgYXJlIGZvcmJpZGRlbiBhcyB3ZWxsIGFzIHN5bWJvbHMgc3RhcnRpbmcgd2l0aAogICAgICAgICAgICBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGFuIHVwcGVyIGNhc2UgbGV0dGVyLiBNb3N0IG9mIHRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiByb290ZWQgb3V0LiBTZWUgbmV3IHNlY3Rpb24gYWRkZWQgdG8gaW50ZXJuYWxzLmh0bWwgZGV2ZWxvcG1lbnQKICAgICAgICAgICAgbWFudWFsICdTeW1ib2wgTmFtaW5nIEd1aWRlbGluZXMgZm9yIEdlbmVyYXRlZCBDL0MrKyBDb2RlJy4KCjA5LzIzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaXJlY3RvciB0eXBlbWFwIG5hbWUgY2hhbmdlczoKICAgICAgICAgICAgaW52ICAgICA9PiBkaXJlY3RvcmluCiAgICAgICAgICAgIG91dHYgICAgPT4gZGlyZWN0b3JvdXQKICAgICAgICAgICAgYXJnb3V0diA9PiBkaXJlY3RvcmFyZ291dAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8xOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBbUHl0aG9uXSBEaXJlY3RvciBjb25zdHJ1Y3RvcnMgbm93IGRlZmF1bHQgdG8gX19kaXNvd24gPSAwLCAKCSAgICB3aGljaCBpcyB0aGUgaW50ZW5kZWQgYmVoYXZpb3IgYW5kIGZpeGVzIHRoZSBkaXJlY3Rvcl9maW5hbGl6ZXIgCgkgICAgdGVzdCBjYXNlIHVuZGVyIHB5dGhvbi4KCjA5LzEyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIC0gVHlwZW1hcHMgYWRkZWQgZm9yIHN0ZDo6c3RyaW5nIGFuZCBjb25zdCBzdGQ6OnN0cmluZyAmLgogICAgICAgICAgICAgICAgIC0gTmV3IGRlbGVnYXRlIGZvciBjcmVhdGluZyBhIEMjIHN0cmluZyBnaXZlbiBhIGNoYXIgKi4gSXQKICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIGJ5IGNhbGxpbmcgU1dJR19jc2hhcnBfc3RyaW5nX2NhbGxiYWNrIGFzIHNob3duCiAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3RkOjpzdHJpbmcgJ291dCcgdHlwZW1hcC4gVXNlZnVsIGlmIHRoZSByZXR1cm4gdHlwZSBpcwogICAgICAgICAgICAgICAgICAgbWFwcGVkIHRvIGEgQyMgc3RyaW5nIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSAKICAgICAgICAgICAgICAgICAgIGZvciBjbGVhbmluZyB1cCBtZW1vcnkgYXMgdGhlIEMjIGdhcmJhZ2UgY29sbGVjdG9yIGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgIGZyZWUgdGhlIG1lbW9yeSBjcmVhdGVkIGluIEMvQysrIGFuZCB0aGVuIHJldHVybmVkIGFzIGEgQyMgc3RyaW5nLgogICAgICAgICAgICAgICAgIC0gVGhlIGV4Y2VwdGlvbiBkZWxlZ2F0ZXMgaGF2ZSBtb3ZlZCBpbnRvIGFuIGlubmVyIGNsYXNzIGluIHRoZQogICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlIGNsYXNzLCB0aGVyZWJ5IGZyZWVpbmcgdXAgdGhlIHN0YXRpYyBjb25zdHJ1Y3Rvci4KCjA5LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgKEludGVybmFscykKICAgICAgICAgICAgTWFqb3IgcmVmYWN0b3Jpbmcgb2YgaXRlcmF0aW9uIG92ZXIgbGlzdHMgYW5kIGhhc2hlcy4gIFRoZQogICAgICAgICAgICBET0ggbGlicmFyeSBub3cgdXNlcyBpdGVyYXRvcnMuICBUaGV5IHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIExpc3QgKmwgPSAoc29tZSBsaXN0KTsKCiAgICAgICAgICAgICAgICBJdGVyYXRvciBpOwogICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gY29udGFpbnMgdGhlIGFjdHVhbCBsaXN0IGl0ZW0uCiAgICAgICAgICAgICAgICAgICAgLy8gaS5pdGVtIGlzIE5VTEwgYXQgZW5kIG9mIGxpc3QKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBIYXNoICpoID0gKHNvbWUgaGFzaCk7CiAgICAgICAgICAgICAgICBJdGVyYXRvciBqOwogICAgICAgICAgICAgICAgZm9yIChqID0gRmlyc3QoaCk7IGouaXRlbTsgaiA9IE5leHQoaikpIHsKICAgICAgICAgICAgICAgICAgICAvLyBqLml0ZW0gY29udGFpbnMgaGFzaCB0YWJsZSBpdGVtCiAgICAgICAgICAgICAgICAgICAgLy8gai5rZXkgIGNvbnRhaW5zIGhhc2ggdGFibGUga2V5CiAgICAgICAgICAgICAgICAgICAgLy8gQm90aCBqLml0ZW0gYW5kIGoua2V5IGFyZSBOVUxMIGF0IGVuZAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIFRoZSBvbGQgaXRlcmF0aW9uIGZ1bmN0aW9ucyBGaXJzdGl0ZW0oKSwgTmV4dGl0ZW0oKSwgRmlyc3RrZXkoKSwKICAgICAgICAgICAgYW5kIE5leHRrZXkoKSBhcmUgZ29uZS4gIAoKICAgICAgICAgICAgVGhlIG5ldyBpdGVyYXRvcnMgYXJlIHNpbXBsZXIsIHJlc3VsdCBpbiBiZXR0ZXIgbWVtb3J5IHVzZSwKICAgICAgICAgICAgYW5kIG1heSBiZSBmYXN0ZXIuICBBbHNvLCB0aGVyZSBhcmUgbm8gbG9uZ2VyIGFueSBwcm9ibGVtcwogICAgICAgICAgICBpdGVyYXRpbmcgb3ZlciB0aGUgc2FtZSBsaXN0L2hhc2ggaW4gbXVsdGlwbGUgcGxhY2VzIGF0CiAgICAgICAgICAgIHRoZSBzYW1lIHRpbWUuICBGb3IgZXhhbXBsZSwgdGhpcyBpcyBmaW5lOgoKICAgICAgICAgICAgICAgICBJdGVyYXRvciBpLGo7CiAgICAgICAgICAgICAgICAgZm9yIChpID0gRmlyc3QobCk7IGkuaXRlbTsgaSA9IE5leHQoaSkpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChsKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIChUaGlzIG5ldmVyIHdvcmtlZCBpbiBwcmV2aW91cyB2ZXJzaW9ucykuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4gIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayAKICAgICAgICAgICAgdGhpcmQgcGFydHkgZXh0ZW5zaW9ucyB0byBTV0lHIChvciBnaXZlIHRoZW0gZnVydGhlciBlbmNvdXJhZ2VtZW50CiAgICAgICAgICAgIHRvIGpvaW4gdGhlIFNXSUcgQ1ZTLXRyZWUgOi0pLgoKMDkvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gRml4IG1lbW9yeSBsZWFrcyBpbiB0aGUgImxpc3QtdmVjdG9yLmkiIHR5cGVtYXBzLgoKMDkvMDkvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBVc2UgQ19ta19ib29sIHJhdGhlciB0aGFuIENfbWtib29sLiAgVGhpcyBmaXhlcwoJICAgIHRoZSB3cmFwcGluZyBvZiBib29sZWFuIHZhbHVlcyBmb3IgQ2hpY2tlbiAxLjEwIGFuZCBuZXdlci4KCSAgICBSZXBvcnRlZCBieSBEYXZlIDxodW5kb0B5YWhvby5jb20+IC8gRmVsaXggV2lua2VsbWFubgoJICAgIDxmZWxpeEBwcm94aW1hLW10LmRlPi4KCjA5LzA1LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGlyZWN0b3JzIGltcGxlbWVudGVkIGZvciBKYXZhLiBJbiBzdW1tYXJ5IHRoaXMgaXMgYSBiaWcgbmV3IGZlYXR1cmUgCiAgICAgICAgICAgIHdoaWNoIHN1cHBvcnRzIHVwY2FsbHMgZnJvbSBDKysgdG8gSmF2YS4gQ29kZSBpcyBnZW5lcmF0ZWQgdG8gc3VwcG9ydCBDKysgCiAgICAgICAgICAgIGNhbGxiYWNrcyB0byBjYWxsIGludG8gSmF2YSBhbmQgdHJ1ZSBwb2x5bW9ycGhpYyBiZWhhdmlvdXIgZm9yIEphdmEgY2xhc3NlcyAKICAgICAgICAgICAgZGVyaXZlZCBmcm9tIEMrKyBjbGFzc2VzLiBTZWUgamF2YS5odG1sIGZvciBkZXRhaWxzLiBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgoKMDkvMDUvMjAwMzogVGlnZXIKICAgICAgICAgICAgQ3JlYXRlZCBjb250cmFjdCBleGFtcGxlIGRpcmVjdG9yeSBhdCAvU1dJRy9FeGFtcGxlcy9jb250cmFjdAogICAgICAgICAgICBBZGRlZCBzaW1wbGUgY29udHJhY3QgZXhhbXBsZXMgKHNpbXBsZV9jICYgc2ltcGxlX2N4eCkKICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgbW9kdWxlJ3Mgb3V0cHV0IGZvcm1hdAoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRlc3Qtc3VpdGUgYnVpbGQgaW1wcm92ZW1lbnRzOgogICAgICAgICAgICAtIE11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIHdvcmtpbmcgZm9yIHRoZSB0ZXN0IHN1aXRlLCBzbyBpdCBpcyBub3cKICAgICAgICAgICAgICBwb3NzaWJsZSB0byBydW4gY29uZmlndXJlIGluIG11bHRpcGxlIHN1YmRpcmVjdG9yaWVzIGFuZCBydW4gdGhlIHRlc3QKICAgICAgICAgICAgICBzdWl0ZSBpbiBlYWNoIG9mIHRoZXNlIHN1YiBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgLSAnbWFrZSBkaXN0Y2xlYW4nIGZpeGVkIHNvIGl0IGRvZXNuJ3QgYm9tYiBvdXQgb24gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeQogICAgICAgICAgICAgIHdoZW4gdXNpbmcgbXVsdGlwbGUgc3ViZGlyZXRvcnkgYnVpbGRzLiBSZXF1aXJlZCB0aGUgZm9sbG93aW5nIGRpcmVjdG9yaWVzCiAgICAgICAgICAgICAgdG8gYmUgbW92ZWQ6CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BlcmwgLT4gRXhhbXBsZXMvR0lGUGxvdC9QZXJsNQogICAgICAgICAgICAgICAgRXhhbXBsZXMvR0lGUGxvdC9QaHAgIC0+IEV4YW1wbGVzL0dJRlBsb3QvUGhwNAogICAgICAgICAgICAgIFRoZXNlIG5ldyBkaXJlY3RvcmllcyB1c2VkIHRvIGJlIHN5bWJvbGljIGxpbmtzIHRvIHRoZSBvbGQgZGlyZWN0b3J5LgogICAgICAgICAgICAgIEFsc28gdGhlIEV4YW1wbGVzL3Rlc3Qtc3VpdGUvUGVybCBzeW1ib2xpYyBsaW5rIGhhcyBiZWVuIHJlbW92ZWQuCiAgICAgICAgICAgIC0gUnVubmluZyB0aGUgdGVzdC1zdWl0ZSwgb3RoZXIgdGhhbiBmcm9tIHRoZSByb290IGRpcmVjdG9yeSwgc2F5CiAgICAgICAgICAgICAgaW4gRXhhbXBsZXMvdGVzdC1zdWl0ZS9weXRob24gd2lsbCBub3cgZGlzcGxheSBhbGwgdGhlIGNvZGUgYmVpbmcKICAgICAgICAgICAgICBleGVjdXRlZC4KICAgICAgICAgICAgLSBUaGUgZm9sbG93aW5nIDMgQyMgY29tcGlsZXJzIGFyZSBkZXRlY3RlZCBkdXJpbmcgY29uZmlndXJlIGFuZCB3b3JrIHdpdGggCiAgICAgICAgICAgICAgdGhlIHRlc3Qtc3VpdGU6IE1vbm8sIFBvcnRhYmxlLk5FVCBhbmQgTWljcm9zb2Z0LgoKMDkvMDEvMjAwMzogVGlnZXIKICAgICAgICAgICAgQWRkZWQgaW5oZXJpdGFuY2Ugc3VwcG9ydCBmb3IgZGVzaWduIGJ5IGNvbnRyYWN0IGZlYXR1cmUuCgowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk0OTE0IF0gV3JvbmcgdHlwZXMgaW4gdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIFNXSUcgd2FzIG5vdCBoYW5kbGluZyBhcmd1bWVudHMgY29ycmVjdGx5IGluIHRlbXBsYXRlIAogICAgICAgICAgICBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vPFQgKj4gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIFQgKmJsYWgoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb0ludCkgRm9vPGludCAqPjsKCiAgICAgICAgICAgIGluIHRoaXMgY2xhc3MsIHRoZSByZXR1cm4gdHlwZSBvZiBibGFoIHdhcyBzZXQgdG8KICAgICAgICAgICAgJ2ludCAqKicsIGJ1dCBpdCBzaG91bGQgcmVhbGx5IGJlICdpbnQgKicuICBUaGlzIGhhcyBiZWVuCiAgICAgICAgICAgIGZpeGVkLCBidXQgaXQgd2lsbCBhZmZlY3QgYWxsIHByaW9yIHVzZXMgb2YgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbi4KIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzg2Mzk0IF0gUGF0Y2ggZm9yIGdlbmVyYXRlZCBwZXJsIGNvZGUgZG9lcyBub3QgY29tcGlsZSB1bmRlciBSZWRIYXQ5LgogICAgICAgICAgICBSZXBvcnRlZCBieSBTY290dCBGaW5uZXJhbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTE1NzkgXSAodW5zaWduZWQpIGxvbmcgbG9uZyBoYW5kbGVkIGluY29ycmVjdGx5IChUY2wpLgogICAgICAgICAgICBUaGlzIHdhcyBhbiBlcnJvciBpbiB0aGUgVGNsIHR5cGVtYXBzLmkgZmlsZS4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEtqZWxsIFdvb2RpbmcuCiAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzMgXSBubyB3YXkgdG8gcmVuYW1lIGNsYXNzZXMgY29taW5nIGZyb20gQyBzdHJ1Y3R1cmVzLgogICAgICAgICAgICBUaGlzIHByb2JsZW0gcmVsYXRlcyB0byByZW5hbWluZyBvZiBhbm9ueW1vdXMgc3RydWN0dXJlcyB3aXRoIGEKICAgICAgICAgICAgdHlwZWRlZi4gIEZvciBleGFtcGxlOiAKCiAgICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCiAgICAgICAgICAgIAowOS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzk3NTc2IF0gLWhlbHAgc2VlbXMgdG8gaW1wbHkgdGhhdCBvbmx5IHRjbC1zcGVjaWZpYyBvcHRpb25zIGV4aXN0LgogICAgICAgICAgICBBZGRlZCBhIGNvbW1lbnQgdG8gYWxlcnQgdXNlciB0byBvdGhlciBvcHRpb25zLgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTgyMDUgXSBTZWdmYXVsdCBpbiBTV0lHX0NvbnZlcnRQdHIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFByYWJodSBSYW1hY2hhbmRyYW4uCgowOC8zMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBNb2RpZmllZCB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgaW4gcHl0aG9uL3N0ZF9jb21wbGV4LmkgdG8gdXNlIHRoZSAKCSAgICBuZXctc3R5bGUgbWFjcm8gYW5kIGNvbnZlcnNpb24gZnVuY3Rpb25zLCB3aGljaCBlbGltaW5hdGVkIHNvbWUKCSAgICByZWR1bmRhbnQgY29kZS4gIEZpeGVkIGEgZmV3IGJ1Z3MgaW4gdGhlc2UgdHlwZW1hcHMgYXMgd2VsbCwgYWx0aG91Z2gKCSAgICBtb3JlIHRlc3RpbmcgaXMgbmVlZGVkLgoKMDgvMjkvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQ29tcGxldGVkIGluaXRpYWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgYWJzdHJhY3QgY2xhc3NlcyB3aXRoIGRpcmVjdG9ycy4KCSAgICBDb25zdHJ1Y3RvciB3cmFwcGVycyB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgYWJzdHJhY3QgY2xhc3NlcyB0aGF0IGhhdmUKCSAgICBkaXJlY3RvcnMsIGFuZCBpbnN0YW5jZXMgb2YgdGhlIGRpcmVjdG9yIGNsYXNzZXMgd2lsbCBiZSBjcmVhdGVkIHJlZ2FyZGxlc3MKCSAgICBvZiB3aGV0aGVyIHRoZSBwcm94eSBjbGFzcyBoYXMgYmVlbiBzdWJjbGFzc2VkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgkgICAgTm8gY2hlY2tzIGFyZSBtYWRlIGR1cmluZyBjb25zdHJ1Y3Rpb24gdG8gZW5zdXJlIHRoYXQgYWxsIHB1cmUgdmlydHVhbAoJICAgIG1ldGhvZHMgYXJlIGltcGxlbWVudGVkIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBJbnN0ZWFkLCBjYWxscyB0bwoJICAgIHVuaW1wbGVtZW50ZWQgbWV0aG9kcyB3aWxsIHRocm93IFNXSUdfRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTgoJICAgIGV4Y2VwdGlvbnMgaW4gQysrLgoKCSAgICBJbnRlZ3JhdGVkIFByYWJodSBSYW1hY2hhbmRyYW4ncyB0eXBlbWFwIHBhdGNoZXMsIHdoaWNoIHByb3ZpZGUgZGlyZWN0b3IKCSAgICB0eXBlbWFwIHN1cHBvcnQgZm9yIGVudW1zIGFuZCBzdGQ6OnNpemVfdCwgYW5kIGZpeCBhIGNvdXBsZSBidWdzIGluIHRoZSAKCSAgICBkaXJlY3RvciBzdGQ6OnZlY3Rvcjw+IHR5cGVtYXBzLgoKMDgvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wbGVtZW50ZWQgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciB0aHJvd2luZyBDIyBleGNlcHRpb25zIGZyb20gQy9DKysgY29kZS4KICAgICAgICAgICAgQSBmZXcgZGVsZWdhdGUgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgZm9yIGNhbGxpbmcgd2hpY2ggdGhlbiB0aHJvdyB0aGUgQyMKICAgICAgICAgICAgZXhjZXB0aW9uLiBVc2UgdGhlIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24gZnVuY3Rpb24gZnJvbSBDL0MrKyB0eXBlbWFwcy4KICAgICAgICAgICAgU2VlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIG9yIGNzaGFycGhlYWQuc3dnIGZvciBhbGwgYXZhaWxhYmxlIGV4Y2VwdGlvbnMuCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ1NoYXJwVGhyb3dFeGNlcHRpb24oU1dJR19DU2hhcnBFeGNlcHRpb24sICJleGNlcHRpb24gZGVzY3JpcHRpb24iKTsKCiAgICAgICAgICAgIFRoZSAndGhyb3dzJyB0eXBlbWFwcyBhcmUgYWxzbyBub3cgaW1wbGVtZW50ZWQsIHNvIGNvZGUgaXMgYXV0b21hdGljYWxseSAKICAgICAgICAgICAgZ2VuZXJhdGVkIHRvIGNvbnZlcnQgYW55IEMrKyBleGNlcHRpb24gaW50byBhIEMjIFN5c3RlbS5FeGNlcHRpb24gd2hlbiB0aGUgQysrIAogICAgICAgICAgICBtZXRob2QgZGVjbGFyZXMgYW4gZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gc3VjaCBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhCYXIpOwoKICAgICAgICAgICAgQWxzbyBhbnkgcGFyYW1ldGVycyB0aGF0IGFyZSByZWZlcmVuY2VzIHRvIGEgQysrIGNsYXNzIG9yIGEgY2xhc3MgcGFzc2VkIGJ5IHZhbHVlCiAgICAgICAgICAgIGFuZCBhcmUgcGFzc2VkIGFzIGEgQyMgbnVsbCB3aWxsIG5vdyB0aHJvdyBhIEMjIE51bGxSZWZlcmVuY2VFeGNlcHRpb24uCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBGaXggdG8gbWF0Y2ggdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiBhbGwgcGludm9rZSBtZXRob2RzIHNvIHRoYXQgdGhleQogICAgICAgICAgICBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgYnkgZGVmYXVsdCBpbiB0aGUgQyMgJ3N0YXRpYyBleHRlcm4nIGRlY2xhcmF0aW9ucyAKICAgICAgICAgICAgKF9fc3RkY2FsbCBpcyB1c2VkIG9uIFdpbmRvd3MpLgoKMDgvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBSZXdvcmtlZCBzdGQ6OnN0cmluZyB0eXBlbWFwcy4gRml4ZXMgYSBudW1iZXIgb2Ygc3RyaW5nIGluIHN0ZCBuYW1lc3BhY2UgCiAgICAgICAgICAgIHByb2JsZW1zLiBGb3IgZXhhbXBsZSAldGVtcGxhdGUgdmVjdG9yPHN0cmluZz4uIFRoZSB0ZW1wbGF0ZWQgY2xhc3MnIGdldCBtZXRob2QgCiAgICAgICAgICAgIHdhc24ndCByZXR1cm5pbmcgYSBKYXZhIFN0cmluZywgYnV0IGEgU1dJR1RZUEVfcF9zdHJpbmcuIFJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFphY2ggQmF1bS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1MjIgXSAxLjMuMTkgc2VnZmF1bHQgaW4gU3dpZ1R5cGVfYWRkX3BvaW50ZXIvRG9oSW5zZXJ0aXRlbS4KICAgICAgICAgICAgUmVsYXRlZCB0byBwcm9ibGVtIHdpdGggdW5uYW1lZCBjbGFzcyBoYW5kbGluZyBpbiBQZXJsIG1vZHVsZS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NjM1NjMgXSBNaXNzaW5nIGluZGljYXRpb24gb2Ygb3B0aW9uYWwgYXJndW1lbnRzLgogICAgICAgICAgICBUY2wgbW9kdWxlLiAgUmVwb3J0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjA4LzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODc0MzIgXSBsb25nIHBhcmFtIGhhbmRsZWQgYXMgaW50LiAgVGNsIG1vZHVsZQogICAgICAgICAgICBub3cgdXNlcyBUY2xfR2V0TG9uZ0Zyb21PYmogdG8gY29udmVydCBpbnRlZ2VyIHZhbHVlcy4KCjA4LzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU5ODkgXSBudW1lcmljIHRlbXBsYXRlIHBhcmFtZXRlcnMuICAgVGhlcmUgd2VyZQogICAgICAgICAgICBzb21lIGVycm9ycyBpbiB0ZW1wbGF0ZSBleHBhbnNpb24gcmVsYXRlZCB0byB0aGUgdXNlIG9mCiAgICAgICAgICAgIGFycmF5cyB3aGVyZSB0aGUgYXJyYXkgZGltZW5zaW9uIHdhcyBhIHRlbXBsYXRlIHBhcmFtZXRlci4KICAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUmVwb3J0ZWQgYnkgQnJ5YW4gR3JlZW4uCgowOC8xMC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIGRpcmVjdG9yIHR5cGVtYXAgKG91dHYpIGZvciByZXR1cm4gYnkgdmFsdWUgYW5kIGNsZWFuZWQgdXAgdXAgYSBmZXcgCgkgICAgb2YgdGhlIGNvbW1lbnRlZCBkaXJlY3RvciB0eXBlbWFwcy4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24gZm9yIGRpcmVjdG9yIGNsYXNzZXMgdG8gaWdub3JlIHByaXZhdGUKCSAgICBjb25zdHJ1Y3RvcnMuICBQcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFyZSBhbHNvIGlnbm9yZWQgZm9yIG5vdywgcGVuZGluZwoJICAgIGEgc29sdXRpb24gdG8gdGhlIHByb2JsZW0gb2Ygd3JhcHBpbmcgY2xhc3NlcyB0aGF0IG9ubHkgZGVmaW5lIHByb3RlY3RlZAoJICAgIGNvbnN0cnVjdG9ycy4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1vdXRkaXIgPGRpcj4gdG8gc3BlY2lmeSB3aGVyZSB0aGUgbGFuZ3VhZ2Ugc3BlY2lmaWMKICAgICAgICAgICAgZmlsZXMgYXJlIHRvIGJlIGdlbmVyYXRlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRhcmdldCBsYW5ndWFnZXMgbGlrZSBQeXRob24sCiAgICAgICAgICAgIEphdmEgZXRjIHdoaWNoIGdlbmVyYXRlIHByb3h5IGZpbGVzIGluIHRoZSBhcHByb3ByaWF0ZSBsYW5ndWFnZS4KICAgICAgICAgICAgVGhpcyBvcHRpb24gZG9lcyBub3QgYXBwbHkgdG8gdGhlIEMvQysrIHdyYXBwZXIgZmlsZS4KCjA4LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBPbiBXaW5kb3dzIHRoZSBnZW5lcmF0ZWQgZmlsZXMgKG90aGVyIHRoYW4gdGhlIF93cmFwLmMgb3IgX3dyYXAuY3h4IGZpbGVzKQogICAgICAgICAgICB3ZXJlIHNvbWV0aW1lcyBpbmNvcnJlY3RseSBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgY3VycmVudCBkaXJlY3RvcnkgdW5sZXNzCiAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlIHVzZWQgdGhlIFVuaXggcGF0aCBzZXBhcmF0b3IuIFRoZSBXaW5kb3dzIHBhdGggc2VwYXJhdG9yIAogICAgICAgICAgICBzaG91bGQgbm93IGJlIHVzZWQuIEJ1ZyByZXBvcnRlZCBieSBSb2JlcnQgRGF2aWVzLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhcnJheSB2YXJpYWJsZSBzZXQgdHlwZW1hcCB0byBQZXJsIG1vZHVsZS4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzU2NzcgXSBBcnJheSBpbml0IGNhdXNlcyBjb2RlZ2VuIGJ1Zy4uCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzc5MDYyIF0gQ2xhc3MiXG4iOjpmb28gbm90IHN1cHBvcnRlZC4gIFNXSUcKICAgICAgICAgICAgc2hvdWxkIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHdoaXRlc3BhY2UgaW4gYmV0d2VlbiAKICAgICAgICAgICAgbmFtZXNwYWNlIHF1YWxpZmllcnMuICBGb3IgZXhhbXBsZSAiQSA6OiBGb28gOjogQmFyIi4KICAgICAgICAgICAgCjA3LzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlcyBmb3IgcGFyYW1ldGVycyB3aGljaCBhcmUgY2xhc3NlcyB0aGF0IGFyZSBwYXNzZWQgYnkgdmFsdWUgYW5kIGhhdmUgCiAgICAgICAgICAgIGEgZGVmYXVsdCB2YWx1ZS4gQSBjb3B5IGNvbnN0cnVjdG9yIGZvciBTd2lnVmFsdWVXcmFwcGVyIGlzIHJlcXVpcmVkIAogICAgICAgICAgICAoU0YgIzc4MDA1NikuIEFsc28gZml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlc2UgY2lyY3Vtc3RhbmNlcy4gVGhlc2UgbW9kcwogICAgICAgICAgICBhbHNvIGZpeCBTRiAjNzgwMDU0LgoKMDcvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbXByb3ZlZCBydW4tdGltZSBlcnJvciBtZXNzYWdlIGZvciBwb2ludGVycyBpbiBQeXRob24gbW9kdWxlLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBab29rby4KCjA3LzEwLzIwMDM6IGJhbGxhYmlvIChMdWlnaSBCYWxsYWJpbykKICAgICAgICAgICAgW0FsbW9zdCBhbGwgbGFuZ3VhZ2VzXSBXcmFwcGVycyBmb3Igc3RkOjpwYWlyIGFkZGVkLgoJICAgIFR5cGVtYXBzIGZvciBQeXRob24sIFJ1YnksIEd1aWxlIGFuZCBNelNjaGVtZS4KCjA3LzAxLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbQ2hpY2tlbl0gSGFuZGxlIHRoZSBjYXNlIG9mIG1vcmUgdGhhbiBvbmUgYXJnb3V0IHR5cGVtYXAKCSAgICBwZXIgZnVuY3Rpb24uCgowNi8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBTRiAjNjcwOTQ5IHJlcXVlc3QuIFRoZSBkZXN0cnVjdG9yIHdyYXBwZXIgZnVuY3Rpb24gbmFtZSBpcyBub3cgCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZS4gIEEgbmV3IGF0dHJpYnV0ZSBjYWxsZWQgbWV0aG9kbmFtZSBpbiB0aGUgCiAgICAgICAgICAgIGphdmFkZXN0cnVjdC9qYXZhZGVzdHJ1Y3RfZGVyaXZlZCAoSmF2YSkgb3IgY3NkZXN0cnVjdC9jc2Rlc3RydWN0X2Rlcml2ZWQgKEMjKQogICAgICAgICAgICB0eXBlbWFwcyBzcGVjaWZpZXMgdGhlIG1ldGhvZCBuYW1lLiBGb3IgZXhhbXBsZSBpbiBKYXZhIHRoZSBkZXN0cnVjdG9yIGlzIAogICAgICAgICAgICB3cmFwcGVkIGJ5IGRlZmF1bHQgd2l0aCB0aGUgZGVsZXRlIG1ldGhvZDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZGVzdHJ1Y3QsIG1ldGhvZG5hbWU9ImRlbGV0ZSIpIFNXSUdUWVBFIHsuLi59CgowNi8yNy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgdGhyb3dzIGF0dHJpYnV0ZSBmb3IgYWRkaW5nIGV4Y2VwdGlvbiBjbGFzc2VzIHRvIHRoZSB0aHJvd3MKICAgICAgICAgICAgY2xhdXNlIGFsc28gbm93IHdvcmtzIHdpdGggdGhlIGZvbGxvd2luZyB0eXBlbWFwczogCiAgICAgICAgICAgIG5ld2ZyZWUKICAgICAgICAgICAgamF2YWluLCBqYXZhb3V0IChKYXZhKQogICAgICAgICAgICBjc2luLCBjc291dCAoQyMpCgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhlICdBbkV4Y2VwdGlvbicgd2lsbCBiZSBhZGRlZCB0byB0aGUgdGhyb3dzIGNsYXVzZSBpbiB0aGUKICAgICAgICAgICAgcHJveHkgZnVuY3Rpb246CgogICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0LCB0aHJvd3M9IkFuRXhjZXB0aW9uIikgaW50IHsKICAgICAgICAgICAgICAgIGludCByZXR1cm5WYWx1ZT0kam5pY2FsbDsKICAgICAgICAgICAgICAgIGlmIChyZXR1cm5WYWx1ZT09MCkgdGhyb3cgbmV3IEFuRXhjZXB0aW9uKCJWYWx1ZSBtdXN0IG5vdCBiZSB6ZXJvIik7CiAgICAgICAgICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgICAgICAgIH0KCjA2LzI1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIHR5cGVtYXAgbWFyc2hhbGxpbmcgY2hlY2tzIGZvciBudWxsIHBvaW50ZXJzIHdoZW4KCSAgICB3YWxraW5nIHRoZSBwYXJhbWV0ZXIgbGlzdCBpbnN0ZWFkIG9mIHJlbHlpbmcgc29sZXkgb24gdGhlIHBhcmFtZXRlcgoJICAgIGNvdW50LiAgQ3VyZXMgYSBzZWdmYXVsdCB0aGF0IG9jY3VycmVkIGZvciBtdWx0aXBsZSBhcmd1bWVudCBpbnYgdHlwZW1hcHMuCgkgICAgU29tZW9uZSB3aXRoIG1vcmUgU3dpZyBleHBlcmllbmNlIHNob3VsZCBwcm9iYWJseSByZXZpZXcgdGhpcyBjb2RlLgoKMDYvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBEb24ndCBlbWl0IGNhbGxzIHRvICJDX2NoZWNrX2Zvcl9pbnRlcnJ1cHQiLAoJICAgIHdoaWNoIG1heSByZXN1bHQgaW4gYW4gZW5kbGVzcyBsb29wLiAgUGF0Y2ggYnkgZmVsaXhAcHJveGltYS1tdC5kZS4KCjA2LzIwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpbmFsaXplcnMgbm93IHVzZSBkZXN0cnVjdG9yIHN5bnRheCBhcyB0aGUgb3ZlcnJpZGUgd2hpY2ggd2FzIHVzZWQgaW4gCiAgICAgICAgICAgIHRoZSBGaW5hbGl6ZSBtZXRob2QgaXMgbm90IGluIHRoZSBFQ01BIHN0YW5kYXJkcywgc3BvdHRlZCBieSB0aGUgTVMgY29tcGlsZXIuCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBBIG51bWJlciBvZiBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIHRvIHJlbW92ZSB0aGUgSmF2YSBuYW1pbmcgCiAgICAgICAgICAgIHRoYXQgd2FzIHVzZWQgaW4gdGhlIEMjIG1vZHVsZS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqbmkgICAgICAgICAgICAgICAgICAgICAgICAgLT4gY3R5cGUKICAgICAgICAgICAganR5cGUgICAgICAgICAgICAgICAgICAgICAgIC0+IGltdHlwZQogICAgICAgICAgICBqc3R5cGUgICAgICAgICAgICAgICAgICAgICAgLT4gY3N0eXBlCiAgICAgICAgICAgIGphdmFpbiAgICAgICAgICAgICAgICAgICAgICAtPiBjc2luCiAgICAgICAgICAgIGphdmFvdXQgICAgICAgICAgICAgICAgICAgICAtPiBjc291dAogICAgICAgICAgICBqYXZhaW50ZXJmYWNlcyAgICAgICAgICAgICAgLT4gY3NpbnRlcmZhY2VzCiAgICAgICAgICAgIGphdmFiYXNlICAgICAgICAgICAgICAgICAgICAtPiBjc2Jhc2UKICAgICAgICAgICAgamF2YWNsYXNzbW9kaWZpZXJzICAgICAgICAgIC0+IGNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgamF2YWNvZGUgICAgICAgICAgICAgICAgICAgIC0+IGNzY29kZQogICAgICAgICAgICBqYXZhaW1wb3J0cyAgICAgICAgICAgICAgICAgLT4gY3NpbXBvcnRzCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyAtPiBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzCiAgICAgICAgICAgIGphdmFnZXRjcHRyICAgICAgICAgICAgICAgICAtPiBjc2dldGNwdHIKICAgICAgICAgICAgamF2YWZpbmFsaXplICAgICAgICAgICAgICAgIC0+IGNzZmluYWxpemUKCiAgICAgICAgICAgIEZlYXR1cmUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBqYXZhY29uc3QgICAgICAgICAgICAgICAgICAgLT4gY3Njb25zdAogICAgICAgICAgICBqYXZhbWV0aG9kbW9kaWZpZXJzICAgICAgICAgLT4gY3NtZXRob2Rtb2RpZmllcnMKCiAgICAgICAgICAgIFByYWdtYSBjaGFuZ2VzOgogICAgICAgICAgICBwcmFnbWEoamF2YSkgICAgICAgICAgICAgICAgLT4gcHJhZ21hKGNzaGFycCkKICAgICAgICAgICAgam5pY2xhc3NiYXNlICAgICAgICAgICAgICAgIC0+IGltY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgICAgICAtPiBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgam5pY2xhc3Njb2RlICAgICAgICAgICAgICAgIC0+IGltY2xhc3Njb2RlCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0cyAgICAgICAgICAgICAtPiBpbWNsYXNzaW1wb3J0cwogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZXMgICAgICAgICAgLT4gaW1jbGFzc2ludGVyZmFjZXMKCiAgICAgICAgICAgIFNwZWNpYWwgdmFyaWFibGUgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSAgICAgICAgICAgICAgLT4gJGNzY2xhc3NuYW1lCiAgICAgICAgICAgICRqYXZhaW5wdXQgICAgICAgICAgICAgICAgICAtPiAkY3NpbnB1dAogICAgICAgICAgICAkam5pY2FsbCAgICAgICAgICAgICAgICAgICAgLT4gJGltY2FsbAoKICAgICAgICAgICAgVGhpcyB3aWxsIGJyZWFrIFNXSUcgaW50ZXJmYWNlIGZpbGVzIHRoYXQgdXNlIHRoZXNlIHR5cGVtYXBzLCBmZWF0dXJlcwogICAgICAgICAgICBhbmQgcHJhZ21hcy4gUGxlYXNlIHVwZGF0ZSB5b3VyIGNvZGUgb3IgdXNlIG1hY3JvcyBmb3IgYmFja3dhcmRzCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDYvMTAvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gQXBwbGllZCBNelNjaGVtZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieQoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBtenNjaGVtZSB0byB1c2UgU1dJRydzIGNvbW1vbiBydW50aW1lIHR5cGUKICAgICAgICAgICAgICBzeXN0ZW0gZnJvbSBjb21tb24uc3dnLiAKCgkgICAgLSBUaGUgTGliL216c2NoZW1lIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyB0aGUgbGFuZ3VhZ2UgbW9kdWxlczoKICAgICAgICAgICAgICBtenNjaGVtZS5pIHdhcyBtb3ZlZCB0byBtenNjaGVtZS5zd2csIG16c2NoZW1lLnN3ZyBhbmQKICAgICAgICAgICAgICBtenNjaGVtZWRlYy5zd2cgaGF2ZSBiZWVuIHJlbW92ZWQsIG16cnVuLnN3ZyAod2hpY2gKICAgICAgICAgICAgICBjb250YWlucyB0aGUgcnVudGltZSBjb2RlKSBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgIC0gVGhlIHN3aWdfcHJveHkgc3RydWN0dXJlIHdhcyByZW5hbWVkIHRvIHN3aWdfbXpfcHJveHkuCiAgICAgICAgICAgICAgc3dpZ19tel9wcm94eSBub3cgY29udGFpbnMgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8KICAgICAgICAgICAgICBzdHJ1Y3R1cmUuICAKCgkgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQKICAgICAgICAgICAgICBTV0lHVFlQRSAmLgoKCSAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBieSBjYWxsaW5nIHNjaGVtZV9hZGRfZmluYWxpemVyKCkgaGFzCiAgICAgICAgICAgICAgYmVlbiBhZGRlZC4KCgkgICAgKioqIE5FVyBGRUFUVVJFIFtNelNjaGVtZV0gKioqCgowNi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwczogamF2YWRlc3RydWN0IGFuZCBqYXZhZGVzdHJ1Y3RfZGVyaXZlZAogICAgICAgICAgICBmb3IgdGhlIEMrKyBkZXN0cnVjdG9yIHdyYXBwZXIuIFRoZSBqYXZhZGVzdHJ1Y3QgdmVyc2lvbiBnZXRzIHVzZWQgYnkKICAgICAgICAgICAgY2xhc3NlcyBhdCB0aGUgdG9wIG9mIGFuIGluaGVyaXRhbmNlIGNoYWluIGFuZCB0aGUgamF2YWRlc3RydWN0X2Rlcml2ZWQgCiAgICAgICAgICAgIHZlcnNpb24gZ2V0cyB1c2VkIGJ5IG90aGVyIGNsYXNzZXMuCgogICAgICAgICAgICBbQyNdIGNpbGRpc3Bvc2UgYW5kIGNpbGRpc3Bvc2VvdmVycmlkZSB0eXBlbWFwcyByZXBsYWNlZCBieQogICAgICAgICAgICBjc2Rlc3RydWN0IGFuZCBjc2Rlc3RydWN0X2Rlcml2ZWQgdHlwZW1hcHMuIFRoZSBkZWxldGUoKQogICAgICAgICAgICBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBhbmQgaXRzIGZ1bmN0aW9uYWxpdHkgcHV0IGludG8gdGhlc2UKICAgICAgICAgICAgdHlwZW1hcHMgZGVzaWduZWQgZm9yIHRoZSBEaXNwb3NlKCkgbWV0aG9kLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcHMgY3NpbnRlcmZhY2VzIGFuZCBjc2ludGVyZmFjZXNfZGVyaXZlZCByZXBsYWNlCiAgICAgICAgICAgIHRoZSBqYXZhaW50ZXJmYWNlcyB0eXBlbWFwLiBBbHNvIGZpeGVzIHRoZSBwZWN1bGlhcml0eSBvZiBhbGwgY2xhc3NlcwogICAgICAgICAgICBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiBpbmRpdmlkdWFsbHkgZGVyaXZpbmcgZnJvbSB0aGUgSURpc3Bvc2FibGUgCiAgICAgICAgICAgIGludGVyZmFjZS4KCiAgICAgICAgICAgIC0gTmV3IHR5cGVtYXAgY3NmaW5hbGl6ZSBmb3IgZmluYWxpemVycy4gQysrIGRlc3RydWN0b3JzIGFyZSBub3cgY2FsbGVkCiAgICAgICAgICAgIGJ5IGdhcmJhZ2UgY29sbGVjdG9yIGR1cmluZyBmaW5hbGl6YXRpb24uIFByb2JsZW0gcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEFuZHJlYXMgU2No9nJrLgoKMDYvMTAvMjAwMzogVGlnZXIKCSAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIGZvciBlcnJvciBtZXNzYWdlIG91dHB1dC4KICAgICAgICAgICAgQ29udHJhY3QgY29kZSBjYW4gbm93IHByaW50IG91dCBzaW1wbGUgZXJyb3IgbWVzc2FnZS4KICAgICAgICAgICAgTW9kaWZpZWQgY29udHJhY3QgY29kZSB0byBwcmVwYXJlIGZvciBpbmhlcml0YW5jZQogICAgICAgICAgICAKMDYvMDMvMjAwMzogbWtvZXBwZQoJICAgIFtHdWlsZV0gQXBwbGllZCBHdWlsZSBtb2R1bGUgdXBkYXRlcyBjb250cmlidXRlZCBieSAKCSAgICBKb2huIExlbnogPGplbGVuekBzdHVkZW50cy53aXNjLmVkdT4uIAoKCSAgICAtIFNXSUcgY3VycmVudGx5IHVzZXMgR3VpbGUncyBnaF8gQVBJLCB3aGljaCBpcyBtYXJrZWQgYXMKCSAgICAgIGRlcHJlY2F0ZWQgaW4gR3VpbGUgMS42IGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gR3VpbGUKCSAgICAgIDEuOS4gIFRoaXMgY2hhbmdlIGludHJvZHVjZXMgYSBjb21tYW5kLWxpbmUgZmxhZyAiLXNjbSIKCSAgICAgIHdoaWNoIGNhdXNlcyBTV0lHIHRvIGdlbmVyYXRlIHdyYXBwZXJzIHRoYXQgdXNlIEd1aWxlJ3MKCSAgICAgIFNDTSBBUEkgaW5zdGVhZDsgdGhpcyByZXF1aXJlcyBHdWlsZSA+PSAxLjYuCgkgICAgCgkgICAgLSBUaGUgTGliL2d1aWxlIGRpcmVjdG9yeSBoYXMgYmVlbiByZW9yZ2FuaXplZCB0bwogICAgICAgICAgICAgIHN0YW5kYXJkaXplIG5hbWVzIGFjcm9zcyBsYW5ndWFnZSBtb2R1bGVzOiBndWlsZWRlYy5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGUuc3dnIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGd1aWxlX2doX3J1bi5zd2csCiAgICAgICAgICAgICAgZ3VpbGUuaSBoYXMgYmVlbiBtb3ZlZCB0byBndWlsZV9naC5zd2csIGd1aWxlX3NjbS5zd2cKICAgICAgICAgICAgICBhbmQgZ3VpbGVfc2NtX3J1bi5zd2cgd2hpY2ggY29udGFpbiB0aGUgU0NNIEFQSSBzdHVmZgogICAgICAgICAgICAgIGhhdmUgYmVlbiBhZGRlZAoKCSAgICAtIGdoaW50ZXJmYWNlLmksIHdoaWNoIGNvbnRhaW5zIHRoZSBkZWZpbmVzIGZyb20gdGhlIGdoXwogICAgICAgICAgICAgIGZ1bmN0aW9ucyB0byB0aGUgc2NtX2Z1bmN0aW9ucyBoYXMgYmVlbiBhZGRlZAoKCSAgICAtIFRoZSBBUEkgZm9yIGRlYWxpbmcgd2l0aCBwb2ludGVyIG9iamVjdHMgaXMgbm93CgkgICAgICBTV0lHX0NvbnZlcnRQdHIsIFNXSUdfTXVzdEdldFB0ciwgU1dJR19OZXdQb2ludGVyT2JqLgoKICAgICAgICAgICAgLSBBZGRlZCB2YXJpbiBhbmQgdmFyb3V0IHR5cGVtYXBzIGZvciBTV0lHVFlQRSBbXSBhbmQgU1dJR1RZUEUgJgoKICAgICAgICAgICAgLSBHYXJiYWdlIGNvbGxlY3Rpb24gaGFzIGJlZW4gYWRkZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgW0d1aWxlXSAqKioKCSAgICAJCjA2LzAxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBEaW1lbnNpb25sZXNzIGFycmF5cyBzdWNoIGFzIAoKICAgICAgICAgICAgICAgIGludCBmb29bXSA9IHsxLCAyfTsKICAgICAgICAgICAgICAgIGV4dGVybiBpbnQgYmFyW107CgogICAgICAgICAgICBwcm9kdWNlIGEgd2FybmluZyB0aGF0IHRoZSB2YXJpYWJsZSBpcyByZWFkLW9ubHkuIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0CiAgICAgICAgICAgIGxhbmd1YWdlLCB0aGlzIHVzZWQgdG8gY2F1c2UgY29tcGlsZSBlcnJvcnMgb3IgZ2VuZXJhdGUgYSBzZXR0ZXIgdGhhdAogICAgICAgICAgICBnZW5lcmF0ZWQgYSBydW50aW1lIGVycm9yLiBBIHNldHRlciBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQKICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXJyYXkgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBTV0lHLiBBIHZhcmluLCBnbG9iYWxpbiAKICAgICAgICAgICAgb3IgbWVtYmVyaW4gdHlwZW1hcCAoZGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpIG11c3QgYmUgd3JpdHRlbiAKICAgICAgICAgICAgYnkgdGhlIHVzZXIuCgowNS8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZW1lbnQgdG8gZGVmYXVsdCB0eXBlbWFwIG1hdGNoaW5nIGFuZCBhcnJheXMuICBXaGVuIGFuCiAgICAgICAgICAgIGFycmF5IGlzIGRlY2xhcmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGZvb1s0XTsKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHR5cGVtYXAgbm93IHJlc29sdmVzIHRvIAoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbQU5ZXQoKICAgICAgICAgICAgSWYgbm8gbWF0Y2ggaXMgZm91bmQgZm9yIHRoYXQsIGl0IHRoZW4gcmVzb2x2ZXMgdG8KCiAgICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgW10KCiAgICAgICAgICAgIElmIG5vIGFycmF5IGRpbWVuc2lvbiBpcyBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIGRlY2xhcmF0aW9uLAogICAgICAgICAgICB0aGUgU1dJR1RZUEUgW10gaXMgdXNlZCByaWdodCBhd2F5LiAKCiAgICAgICAgICAgIE5vdGU6IFRoaXMgY2hhbmdlIGhhcyBiZWVuIG1hZGUgdG8gcmVzb2x2ZSBwcm9ibGVtcyByZWxhdGVkIHRvCiAgICAgICAgICAgIGFycmF5cyB3aXRoIGFuZCB3aXRob3V0IGRpbWVuc2lvbnMuICBGb3IgZXhhbXBsZSwgc29tZXRpbWVzIFNXSUcKICAgICAgICAgICAgd2FzIGdlbmVyYXRpbmcgc2V0dGVyIGZ1bmN0aW9ucyBmb3IgYXJyYXkgdmFyaWFibGVzIHdpdGggbm8gZGltZW5zaW9ucwogICAgICAgICAgICAoYW4gZXJyb3IpLiBMaWtld2lzZSwgU1dJRyBzb21ldGltZXMgbWFkZSBhcnJheXMgd2l0aCBkaW1lbnNpb25zCiAgICAgICAgICAgIHJlYWQtb25seSAoYWxzbyBhbiBlcnJvcikuICBUaGlzIGZpeGVzIHRoZSBhcnJheXNfZ2xvYmFsIHRlc3QKICAgICAgICAgICAgcHJvYmxlbS4KICAgICAgICAgICAgICAgICAgICAgICAgCjA1LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHR5cGUgaGFuZGxpbmcgYnVnIHdpdGggcmVmZXJlbmNlcyBhbmQgcG9pbnRlcnMuCiAgICAgICAgICAgIElmIHlvdSBoYWQgZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgICAgICAgIEZvbyAqZnVuYzEoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBmdW5jMihCYXIgJngpOwoKICAgICAgICAgICAgVGhlbiBmdW5jMigpIHdvdWxkbid0IGFjY2VwdCBvYmplY3RzIHJldHVybmVkIGJ5IGZ1bmMxKCkKICAgICAgICAgICAgYmVjYXVzZSBvZiBhIHR5cGUgZXJyb3IuICAgSXQgc2hvdWxkIHdvcmsgbm93LgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcmlhbiBZYW5nLgoKMDUvMjEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIHRvIHNvbWUgb2YgdGhlIFZpc3VhbCBDKysgZXhhbXBsZSBwcm9qZWN0IGZpbGVzIHdoaWNoIHdvdWxkIG5vdCAKICAgICAgICAgICAgd29yayB3aXRoIHNwYWNlcyBpbiB0aGUgcGF0aHMgaGVsZCBpbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHVzZWQgdG8gCiAgICAgICAgICAgIHBvaW50IHRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UncyBsaWJyYXJ5IC8gaW5jbHVkZSBkaXJlY3RvcnkuCiAgICAgICAgICAgIFNGIGJ1ZyAjNzQwNzY5CgowNS8yMS8yMDAzOiAgc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCAtY29udHJhY3RzIG9wdGlvbi4KICAgICAgICAgICAgRmlyc3QgdHJ5IG9mIHRoZSBpZGVhIG9mICJXcmFwIGJ5IENvbnRyYWN0IjogCiAgICAgICAgICAgIGJ1aWxkIHVwIHJlYWxpYWJsZSBjcm9zcy1sYW5ndWFnZSBtb2R1bGUgYnkgd3JhcHBpbmcgd2l0aCBTV0lHLgogICAgICAgICAgICBJbXBsZW1lbnRlZCBiYXNpYyBhc3NlcnRpb24KICAgICAgICAgICAgKHByZWFzc2VydGlvbiAmIHBvc3Rhc3NlcnRpb24gJiBpbnZhcmlhbnQpCiAgICAgICAgICAgIGZvciBzaW1wbGUgQy9DKysgZnVuY3Rpb25zLgogICAgICAgICAgICAKICAgICAgICAgICAgQ3VycmVudCBmb3JtYXQgb2YgY29udHJhY3RzIGFyZToKICAgICAgICAgICAgJWNvbnRyYWN0IGNsYXNzX25hbWUgOjogZnVuY19uYW1lIChwYXJhcy4uLikgewogICAgICAgICAgICByZXF1aXJlOgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByczsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBlbnN1cmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgaW52YXJpYW50OgogICAgICAgICAgICAgICAgICAgYm9vbGVhbiBleHByOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCSAgICAJCjA1LzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCB0d2Vha3MuIFRoZXJlIHdlcmUgYSBmZXcgcHJlcHJvY2Vzc29yIGRlZmluaXRpb25zIHdoaWNoIHdlcmUKICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSBNYWtlZmlsZSBmb3IgcGFzc2luZyBvbiB0aGUgY29tbWFuZGxpbmUgd2hlbiBjb21waWxpbmcuCiAgICAgICAgICAgIFRoZXNlIGFyZSBub3cgYWxsIGRlZmluZWQgaW4gc3dpZ2NvbmZpZy5oLiBBdXRvY29uZiBkb2Vzbid0IG5vcm1hbGx5IAogICAgICAgICAgICBhbGxvdyBpbnN0YWxsYXRpb24gZGlyZWN0b3JpZXMgdG8gYmUgZGVmaW5lZCBpbiB0aGlzIGNvbmZpZyBoZWFkZXIgZmlsZSwgCiAgICAgICAgICAgIGJ1dCBhbiBhdXRvY29uZiBhcmNoaXZlIG1hY3JvIGVuYWJsZXMgdGhpcy4gVGhpcyBtYWNybyBhbG9uZyB3aXRoIGZ1dHVyZSAKICAgICAgICAgICAgYXV0b2NvbmYgbWFjcm9zIGFyZSBnb2luZyB0byBiZSBwdXQgaW4gdGhlIFRvb2xzL2NvbmZpZyBkaXJlY3RvcnkuCgogICAgICAgICAgICAnc3dpZyAtdmVyc2lvbicgbm93IHJlcG9ydHMgdGhlIHRhcmdldCBidWlsZCBwbGF0Zm9ybS4KCjA1LzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEZpeCB0byB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOgoKICAgICAgICAgICAgamF2YWJhc2UsIGphdmFpbnRlcmZhY2VzLCBqYXZhaW1wb3J0cywgamF2YWNsYXNzbW9kaWZpZXJzLAogICAgICAgICAgICBqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMsIGphdmFmaW5hbGl6ZSwgamF2YWdldGNwdHIgJiBqYXZhY29kZS4KCiAgICAgICAgICAgIFRoZXNlIGFyZSB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZy9nZW5lcmF0aW5nIHByb3h5IGNsYXNzZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIHdvdWxkIHVzZSB0aGUgcHJveHkgY2xhc3MgbmFtZSBhbmQgbm90IHRoZSAKICAgICAgICAgICAgQysrIHR5cGUsIHdoaWNoIHdhcyBpbmNvbnNpc3RlbnQgd2l0aCBhbGwgb3RoZXIgdHlwZW1hcHMuIAoKICAgICAgICAgICAgSW4gbW9zdCBjaXJjdW1zdGFuY2VzIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCB0aGUgQysrIGNsYXNzIG5hbWUvdHlwZSAKICAgICAgICAgICAgaXMgdGhlIHNhbWUgZXhjZXB0IGZvciBjbGFzc2VzIGluIG5hbWVzcGFjZSwgdGVtcGxhdGVkIGNsYXNzZXMgZXRjLiBzbwogICAgICAgICAgICB0aGlzIHNob3VsZG4ndCBhZmZlY3QgbW9zdCBjYXNlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIGFuZCBDIyBNT0RVTEVTICoqKgoKMDUvMDkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFZpc3VhbCBDKysgUHJvamVjdCBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCB0aGUgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgICAgY2FuIGJlIGJ1aWx0IG9uIFdpbmRvd3MgKGZvciBUY2wsIFBlcmwsIFB5dGhvbiBhbmQgUnVieSkuCgowNS8wMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCByZXR1cm4gYnkgdmFsdWUsIGNvbnN0LCBhbmQgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgIEIoKTsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIEIoY29uc3QgQiYpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgY29uc3QgQiByZXR1cm5CKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcm9ibGVtIGFuZCBwYXRjaCBzdWdnZXN0aW9uIHJlcG9ydGVkIGJ5IEJpbGwgSG9mZm1hbi4KCjA0LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIFNpbmdsZSBhdXRvY29uZiBpbnZvY2F0aW9uIC0gYXV0b2NvbmYgaW4gdGhlIFRvb2xzIGRpcmVjdG9yeSBoYXMgZ29uZS4KCiAgICAgICAgICAgIC0gTGlidG9vbCBib290c3RyYXBwZWQgd2hlbiBydW5uaW5nIGF1dG9nZW4uc2guIFRoaXMgcmVxdWlyZXMgYW55b25lCiAgICAgICAgICAgICAgdXNpbmcgdGhlIGN2cyB2ZXJzaW9uIG9mIFNXSUcgdG8gaGF2ZSBsaWJ0b29sIGluc3RhbGxlZCBvbiB0aGVpcgogICAgICAgICAgICAgIG1hY2hpbmUuIFN1Z2dlc3QgdmVyc2lvbiAxLjQuMiBvciBoaWdoZXIsIHByZWZlcmFibHkgdGhlIGxhdGVzdCAtIDEuNS4KCiAgICAgICAgICAgIC0gQXV0b21ha2UgaXMgbm93IHVzZWQgdG8gYnVpbGQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGluIGNvbmp1bmN0aW9uIAogICAgICAgICAgICAgIHdpdGggbGlidG9vbC4KCiAgICAgICAgICAgIC0gUnVudGltZSBsaWJyYXJpZXMgYXJlIG5vdyBzdWNjZXNzZnVsbHkgYnVpbHQgYXMgRExMcyBvbiBDeWd3aW4uCgogICAgICAgICAgICAtIFNraXBwaW5nIGxhbmd1YWdlcyBpcyBubyBsb25nZXIganVzdCBkZXRlcm1pbmVkIGluIHRoZSB0b3AgbGV2ZWwgCiAgICAgICAgICAgICAgbWFrZWZpbGUgYnV0IGluIGNvbmZpZ3VyZS5pbi4gVGhpcyBpbmZvIGlzIHVzZWQgZm9yIGJ1aWxkaW5nCiAgICAgICAgICAgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGFuZCBmb3IgcnVubmluZyB0aGUgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUuCgogICAgICAgICAgICAtIFRoZXNlIGNoYW5nZXMgaGF2ZSBmaXhlZCBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcnkgYnVpbGRzLCB0aGF0IGlzCiAgICAgICAgICAgICAgYnVpbGRpbmcgZnJvbSBkaXJlY3RvcmllcyBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5LiAKICAgICAgICAgICAgICBJbnN0YWxsYXRpb24gZnJvbSBtdWx0aXBsZSBidWlsZCBkaXJlY3RvcmllcyBhbHNvIHdvcmtpbmcuIEFuIGluaXRpYWwKICAgICAgICAgICAgICBjb25maWd1cmUgaW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgaXMgbm8gbG9uZ2VyIG5lZWRlZCBhcyBkZXNjcmliZWQKICAgICAgICAgICAgICBpbiAwNC8wMi8yMDAzIGVudHJ5LiBBICdtYWtlIGRpc3RjbGVhbicgd2lsbCBiZSBuZWVkZWQgYmVmb3JlIGJ1aWxkaW5nCiAgICAgICAgICAgICAgaW4gYSBkaXJlY3Rvcnkgb3RoZXIgdGhhbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpZiB0aGUgYXV0b3Rvb2xzIAogICAgICAgICAgICAgIGhhdmUgYmVlbiBydW4gZnJvbSB0aGlzIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgc29tZSBwb2ludCwgYnV0IAogICAgICAgICAgICAgIGF1dG9jb25mIHdpbGwgdGVsbCB5b3UgdGhpcy4gTm90ZSB0aGF0ICdtYWtlIGNoZWNrJyBvbmx5IHdvcmtzIGZyb20gCiAgICAgICAgICAgICAgdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkgYXQgdGhlIG1vbWVudC4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3MjM0NzEgXSBXcmFwcGVyX3ByaW50KCkgZmFpbHMgd2l0aCBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KCjA0LzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiBjb25zdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlIGhhbmRsaW5nIAogICAgICAgICAgICBkZXNjcmliZWQgaW4gQ0hBTkdFUyAwOC8xMS8yMDAyLiAgIFByZXZpb3VzbHksIFNXSUcgbWVyZWx5CiAgICAgICAgICAgIGNoZWNrZWQgdG8gc2VlIGlmIHRoZXJlIHdhcyBhbiBpbml0aWFsaXplciBpbiB0aGUgZGVjbGFyYXRpb24uCiAgICAgICAgICAgIE5vdywgU1dJRyBhZGRpdGlvbmFsbHkgY2hlY2tzIHRvIG1ha2Ugc3VyZSB0aGUgc3RhdGljIG1lbWJlcgogICAgICAgICAgICBpcyBjb25zdC4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIGtpbmQgb2YgbGltaXRlZCBzdXBwb3J0IGZvciBtdWx0aXBsZSBpbmhlcml0YW5jZSwKICAgICAgICAgICAgYWN0aXZhdGVkIHVzaW5nIHRoZSAtbWluaGVyaXQgY29tbWFuZC1saW5lIG9wdGlvbi4gSSd2ZSBhbHNvIHVwZGF0ZWQKICAgICAgICAgICAgdGhlICJDKysgSW5oZXJpdGFuY2UiIHNlY3Rpb24gb2YgdGhlIFJ1YnkgZG9jdW1lbnRhdGlvbiB0byBkaXNjdXNzCiAgICAgICAgICAgIGhvdyB0aGlzIHdvcmtzLCBhbmQgaXRzIGxpbWl0YXRpb25zLiBBbHNvIGFsc28gbW9kaWZpZWQgdGhlIG1pbmhlcml0LmkKICAgICAgICAgICAgdGVzdCBjYXNlIHRvIHJ1biBhZ2FpbnN0IHRoaXMuCgowNC8yNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIC1nbG9iYWxtb2R1bGUgY29tbWFuZC1saW5lIG9wdGlvbiBmb3IgdGhlIFJ1YnkKICAgICAgICAgICAgbW9kdWxlLCBmb3Igd3JhcHBpbmcgc3R1ZmYgaW50byB0aGUgZ2xvYmFsIG1vZHVsZSAoS2VybmVsKSBpbnN0ZWFkCiAgICAgICAgICAgIG9mIGEgbmVzdGVkIG1vZHVsZS4gVXBkYXRlZCBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LgoKMDQvMjMvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgc3ltbmFtZSBlcnJvciBpbiBkaXJlY3RvciBjYWxscyB0byBQeXRob24gbWV0aG9kcwoJICAgIHRoYXQgZXh0ZW5kIEMrKyBvcGVyYXRvcnMuCgoJICAgIFN0b3BwZWQgZGlyZWN0b3IgZGVzdHJ1Y3RvciB3cmFwcGVycyBmcm9tIGNhbGxpbmcgX19zZXRfdXAsCgkgICAgd2hpY2ggd2FzIGxlYXZpbmcgdGhlIGRpcmVjdG9yIGZsYWcgaW4gYW4gaW5jb25zaXN0ZW50IHN0YXRlLgoKMDQvMjMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggbmFtZXNwYWNlIHJlc29sdXRpb24gYW5kIG5lc3RlZCBuYW1lc3BhY2VzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBbGZyZWQgTG9yYmVyIChhbmQgTWFyY2VsbyBNYXR1cykuCgowNC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUGF0Y2ggZm9yIEphdmEgZXhhbXBsZXMgYW5kIHRlc3Qtc3VpdGUgdG8gcnVuIG9uIE1hYyBPUyBYLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEluY29ycG9yYXRlZCBOb2J1IE5ha2FkYSdzIHBhdGNoZXMgZm9yIHN1cHBvcnRpbmcgdGhlIFJ1YnkKICAgICAgICAgICAgMS44IGFsbG9jYXRpb24gZnJhbWV3b3JrLgoKMDQvMTUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlcGxhY2VkIGFsbCB1c2VzIG9mIHRoZSBkZXByZWNhdGVkIFNUUjJDU1RSKCkgbWFjcm8gd2l0aCB0aGUKICAgICAgICAgICAgc2FmZXIgU3RyaW5nVmFsdWVQdHIoKSBtYWNyby4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBydWJ5LXRhbGs6NjcwNTkKICAgICAgICAgICAgYW5kIGZvbGxvdy11cHMgdG8gdGhhdCBwb3N0LgoKMDQvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcHJlcHJvY2Vzc29yIG1hY3JvIGV4cGFuc2lvbi4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICAjZGVmaW5lIG1pbih4LHkpICgoeCkgPCAoeSkpID8gKHgpIDogKHkpIAogICAgICAgICAgICAgICAgaW50IGYoaW50IG1pbik7CgogICAgICAgICAgICBSZXBvcnRlZCBieSBTZWJhc3RpZW4gUmVjaW8uCgowNC8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIGEgcnVudGltZSBjaGVjayB0byB0eXBlbWFwcyBpbiBhcnJheXNfamF2YS5pIGxpYnJhcnkgdG8gY2hlY2sgCiAgICAgICAgICAgIHRoYXQgdGhlIEphdmEgYXJyYXkgcGFzc2VkIGluIGlzIHRoZSBzYW1lIHNpemUgYXMgdGhlIEMgYXJyYXkgYW5kIHRocm93IGFuIAogICAgICAgICAgICBleGNlcHRpb24gaWYgbm90LgoKICAgICAgICAgICAgQWxzbyBmaXggdG8gdXNlIGRlbGV0ZSBpbnN0ZWFkIG9mIGZyZWUgZm9yIGFycmF5cyBjcmVhdGVkIHVzaW5nIG5ldy4KCjA0LzA3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBSZW1vdmUgR0NDMyB3YXJuaW5nIHdoZW4gY29tcGlsaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZToKCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogY2hhbmdpbmcgc2VhcmNoIG9yZGVyIGZvciBzeXN0ZW0gZGlyZWN0b3J5ICIvdXNyL2luY2x1ZGUiCiAgICAgICAgICAgICAgY2MxcGx1czogd2FybmluZzogYXMgaXQgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQgYXMgYSBub24tc3lzdGVtIGRpcmVjdG9yeSAKCiAgICAgICAgICAgIFNlZSBTRiBwYXRjaCAjNzE1NTMxIHN1Ym1pdHRlZCBieSBHZXJhbGQgV2lsbGlhbXMKCjA0LzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEltcHJvdmVkIHdyYXBwaW5nIG9mIGVudW1zIGFuZCBjb25zdGFudHMuIFRoZXNlIHdlcmUgcHJldmlvdXNseQogICAgICAgICAgICB3cmFwcGVkIGFzIEMjIHZhcmlhYmxlcyByYXRoZXIgdGhhbiBjb25zdGFudHMuIEVpdGhlciB0aGVzZSBhcmUgd3JhcHBlZAogICAgICAgICAgICBhcyByZWFkb25seSAocnVudGltZSkgY29uc3RhbnRzIG9yIGNvbXBpbGUgdGltZSBjb25zdGFudHMsIGRlcGVuZGluZyBvbgogICAgICAgICAgICB0aGUgJWphdmFjb25zdCBkaXJlY3RpdmUgKFRoZSBkaXJlY3RpdmUgaXMgbGlrZWx5IHRvIGNoYW5nZSBuYW1lIHNvb24pLgogICAgICAgICAgICBGb3IgZXhhbXBsZSB3cmFwcGluZzoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDApOwogICAgICAgICAgICAgICNkZWZpbmUgQUJDIDIyCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKSBYWVo7CiAgICAgICAgICAgICAgI2RlZmluZSBYWVogMzMKICAgICAgICAgICAgaXMgbm93OgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW50IEFCQyA9IGV4YW1wbGVQSU5WT0tFLmdldF9BQkMoKTsKICAgICAgICAgICAgICBwdWJsaWMgY29uc3QgaW50IFhZWiA9IDMzOwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBHbG9iYWwgY29uc3RhbnRzIGFuZCBlbnVtcyBhcmUgcHV0IGluIHRoZWlyIG93biBpbnRlcmZhY2UgY2FsbGVkCiAgICAgICAgICAgIHh4eENvbnN0YW50cywgd2hlcmUgeHh4IGlzIHRoZSBtb2R1bGUgbmFtZS4gVGhpcyBpcyBhbiBpbXByb3ZlbWVudCBhcyAKICAgICAgICAgICAgaXQgaXMgcG9zc2libGUgdG8gZGVyaXZlIChpbXBsZW1lbnQpIGEgSmF2YSBjbGFzcyBmcm9tIHRoZSB4eHhDb25zdGFudHMKICAgICAgICAgICAgaW50ZXJmYWNlIHRvIGltcHJvdmUgdGhlIHN5bnRheDsgbmFtZWx5IHdoZW4gd3JhcHBpbmc6CiAgICAgICAgICAgICAgZW51bSB7T05FPTEsIFRXTywgVEhSRUV9OwogICAgICAgICAgICBhY2Nlc3NpbmcgdGhlc2UgZnJvbSBhIEphdmEgY2xhc3MgaW1wbGVtZW50aW5nIHh4eENvbnN0YW50cyBpcyBuZWF0ZXI6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IE9ORTsKICAgICAgICAgICAgdGhhbiB0aGUgcHJldmlvdXM6CiAgICAgICAgICAgICAgaW50IG51bWJlciA9IHh4eC5PTkU7CgogICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgRGF2ZSBEcmliaW4uCgowNC8wMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgQnVpbGQgaW1wcm92ZW1lbnRzIGZvciBtdWx0aXBsZSBidWlsZHMuIFRoaXMgYWxsb3dzIG9uZSB0byBidWlsZAogICAgICAgICAgICB0aGUgU1dJRyBleGVjdXRhYmxlIGFuZCBydW50aW1lIGxpYnJhcmllcyBmb3IgZGlmZmVyZW50IHBsYXRmb3Jtcy9jb21waWxlcnMgCiAgICAgICAgICAgIGV0YyBieSBydW5uaW5nIGNvbmZpZ3VyZSBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXMuIFRoaXMgaXNuJ3QgMTAwJSBqdXN0IAogICAgICAgICAgICB5ZXQgYW5kIHdvbid0IGJlIHVudGlsIGxpYnRvb2wgaXMgYmV0dGVyIGNvbmZpZ3VyZWQuLi4gYSAnY29uZmlndXJlJyBhbmQgCiAgICAgICAgICAgICdtYWtlIGRpc3RjbGVhbicgbmVlZHMgdG8gYmUgcnVuIGluIHRoZSByb290IGRpcmVjdG9yeSBiZWZvcmUgaXQgYWxsIHdvcmtzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAkIC4vY29uZmlndXJlCiAgICAgICAgICAgICAgJCBtYWtlIGRpc3RjbGVhbgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMTsgY2QgY29uZmlnMTsgLi4vY29uZmlndXJlIENDPWdjYyBDWFg9ZysrOyBtYWtlOyBjZCAuLgogICAgICAgICAgICAgICQgbWtkaXIgY29uZmlnMjsgY2QgY29uZmlnMjsgLi4vY29uZmlndXJlIENDPWNjIENYWD1jKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgIAogICAgICAgICAgICBUbyBiZSBpbXByb3ZlZC4gQSAnbWFrZSBjaGVjaycgZG9lcyBub3Qgd29yayB5ZXQgZWl0aGVyLiAKCjA0LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhcmd1bWVudCBleHBhbnNpb24gYnVnLgogICAgICAgICAgICBUaGlzIHNob3dlZCB1cCB3aGVuIHRyeWluZyB0byB1c2Ugc3RkX3ZlY3Rvci5pIHdpdGggdmVjdG9ycwogICAgICAgICAgICBvZiBwb2ludGVycy4KCjAzLzMxLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHBhcmFsbGVsIG1ha2UgYnVpbGRzIG9mIFNXSUcsIGZvciBleGFtcGxlCiAgICAgICAgICAgICAgbWFrZSAtaiA0CiAgICAgICAgICAgIEJ1aWxkIGZhaWx1cmUgcmVwb3J0ZWQgYnkgQmlsbCBDbGFya2UuCgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFJlbGVhc2VkIDEuMy4xOS4KCgoKVmVyc2lvbiAxLjMuMTkgKE1hcmNoIDI4LCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFZhcmlldHkgb2YgbWlub3IgYnVnIGZpeGVzIHRvIHRoZSAxLjMuMTggcmVsZWFzZSBpbmNsdWRpbmc6CgogICAgICAgICAgICAgICAgLSBTZWdtZW50YXRpb24gZmF1bHQgd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZS4KICAgICAgICAgICAgICAgIC0gVHlwZW1hcCB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBFeHByZXNzaW9uIGV2YWx1YXRpb24gYnVnLgogICAgICAgICAgICAgICAgLSBMYXJnZSBtZW1vcnkgbGVhayB3aXRoIHRlbXBsYXRlIGV4cGFuc2lvbi4KClZlcnNpb24gMS4zLjE4IChNYXJjaCAyMywgMjAwMykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDMvMjEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0d28gcHJvYmxlbXMgd2l0aCB0aGUgJWV4dGVuZCBkaXJlY3RpdmUsIG92ZXJsb2FkaW5nLCBhbmQKICAgICAgICAgICAgdGVtcGxhdGUgZXhwYW5zaW9uLiAgU2VlIHRoZSAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkJyBhbmQKICAgICAgICAgICAgJ3RlbXBsYXRlX2V4dGVuZF9vdmVybG9hZF8yJyB0ZXN0cyBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlIGZvcgogICAgICAgICAgICBkZXRhaWxzLgoKMDMvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gQWRkZWQgc29tZSB0eXBlbWFwcyBhcyBzdWdnZXN0ZWQgYnkgQW5kcmVhcyBTY2hvZXJrIGZvciBoYW5kbGluZwogICAgICAgICAgICBwYXJhbWV0ZXJzIHRoYXQgYXJlIHBhc3NlZCBhcyBwb2ludGVycyBvciBieSByZWZlcmVuY2UuIFRoZXNlIGhhdmUKICAgICAgICAgICAgYmVlbiBwdXQgaW4gdHlwZW1hcHMuaS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBDKysgc2NvcGluZyBidWcgcmVsYXRlZCB0byBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgRm9vOjpiYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5LCBTV0lHIGp1c3QgdG9zc2VkIG91dCB0aGUgRm9vOjpiYXIoKSBkZWNsYXJhdGlvbi4gTm93LAogICAgICAgICAgICB0aGUgZGVjbGFyYXRpb24gaXMgd3JhcHBlZCBwcm92aWRlZCB0aGF0IHRoZSBwcmVmaXggaXMgZXhhY3RseSB0aGUKICAgICAgICAgICAgc2FtZSBhcyB0aGUgY3VycmVudCBzY29wZSAoaW5jbHVkaW5nIGFueSBlbmNsb3NpbmcgbmFtZXNwYWNlcykuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJydWNlIExvd2VyeS4KCjAzLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgSW5jb3Jwb3JhdGVkIFsgNjk2NTE2IF0gRW5hYmxpbmcgZXhjZXB0aW9uIHByb2Nlc3NpbmcgZm9yIGRhdGEgbWVtYmVyIGFjY2Vzcy4KICAgICAgICAgICAgSW4gc29tZSBjb21waWxlcnMsIGF0dHJpYnV0ZSBhY2Nlc3MgY2FuIGdlbmVyYXRlIGV4Y2VwdGlvbnMuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIG9yZGluYXJpbHkgYXNzdW1lcyB0aGF0IG5vIGV4Y2VwdGlvbnMgd2lsbCBiZSByYWlzZWQuICBUbyBkaXNhYmxlIHRoaXMsCiAgICAgICAgICAgIHVzZSB0aGUgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhbGxvd2V4Y2VwdCIpIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCB4OyAgICAgLyogRXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgWWFrb3YgTWFya292aXRjaC4gCiAKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgUGF0Y2guIFsgNzAxODYwIF0gSW1wcm92ZSBQZXJmb3JtYW5jZSAocHl0aG9uIHByb3hpZXMpLgogICAgICAgICAgICBHaXZlcyBhIHBlcmZvcm1hbmNlIGJvb3N0IHRvIHByb3h5IGNsYXNzIGNvZGUgYW5kIHRoZSBtYW5hZ2VtZW50IG9mIHRoZQogICAgICAgICAgICAudGhpcyBhbmQgLnRoaXNvd24gYXR0cmlidXRlcy4gIENvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjAzLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEFkZGVkIG1pc3NpbmcgdmFyYXJnIHN1cHBvcnQuCgowMy8xOC8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBSZW1vdmVkIGNvZGUgcmVsYXRlZCB0byB0YWdnaW5nIGluZGl2aWR1YWwgbWV0aG9kcyBmb3IgZGlyZWN0b3JzLgoJICAgIFRoZSBjb25jZXB0IG9mIGhhdmluZyBkaXJlY3RvcnMgZm9yIHNvbWUgYnV0IG5vdCBhbGwgdmlydHVhbCBtZXRob2RzCgkgICAgb2YgYSBjbGFzcyBpcyBkZWVwbHkgZmxhd2VkLiAgVGhlICVmZWF0dXJlKCJub2RpcmVjdG9yIikgdGFnIGlzIGFsc28KCSAgICBnb25lLiAgCgkgICAgCgkgICAgRGlyZWN0b3JzIGFyZSBvZmYgYnkgZGVmYXVsdC4gIFRvIGVuYWJsZSB0aGVtIGZvciBhIGNsYXNzLCBpc3N1ZQoJICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIGNsYXNzbmFtZTsgd2hpY2ggd2lsbCBjcmVhdGUgZGlyZWN0b3IgbWV0aG9kcwoJICAgIGZvciBldmVyeSB2aXJ0dWFsIG1ldGhvZCBpbiB0aGUgaGllcmFyY2h5IG9mIHRoZSBjbGFzcy4KCjAzLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHBhc3NpbmcgYXJndW1lbnRzIG9mIHR5cGUgZnVuY3Rpb24uICBGb3IKICAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGludCBmb28oaW50IHgoaW50LCBpbnQpKTsKCiAgICAgICAgICAgIG9yCgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBiaW5vcF90KGludCwgaW50KTsKICAgICAgICAgICAgICAgaW50IGZvbyhiaW5vcF90IHgpOwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zLCB0aGlzIHdvdWxkIHByb2R1Y2UgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuICBOb3csCiAgICAgICAgICAgIFNXSUcgbWVyZWx5IGFkZHMgYW4gZXh0cmEgcG9pbnRlciwgbWFraW5nIHRoZXNlIGRlY2xhcmF0aW9ucyB0aGUgc2FtZQogICAgICAgICAgICBhczoKCiAgICAgICAgICAgICAgIGludCBmb28oaW50ICgqeCkoaW50LCBpbnQpKTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgKngpOwoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2FydGggQnVzaGVsbC4KCjAzLzE3LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIHRoZSByZXR1cm4gc3RhdGVtZW50IGZvciBkaXJlY3RvciBiYXNlIGNsYXNzIGNhbGxzIHRoYXQgaGF2ZSBubwogICAgICAgICAgICByZXR1cm4gdmFsdWUuCgowMy8xNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnN0IHNtYXJ0LXBvaW50ZXIgd3JhcHBpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBvbmx5ICJ4IiBhbmQgImJhciIgYXJlIHZpc2libGUgZnJvbSBCbGFoIChzaW5jZSBhcHBsaWNhdGlvbgogICAgICAgICAgICBvZiBzcGFtIHZpb2xhdGVzIGNvbnN0bmVzcykuICBNb3Jlb3ZlciwgYWNjZXNzIHRvICJ4IiBpcyByZWFkLW9ubHkuCiAgICAgICAgICAgCjAzLzE1LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIENsZWFuZWQgdXAgdHdvIHNpZ25lZCB2ZXJzdXMgdW5zaWduZWQgY29tcGFyaXNvbnMgaW4gcHl0aG9uL3N0ZF92ZWN0b3IuaS4KCSAgICAKMDMvMTUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gR2xvYmFsIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwcm9wZXJ0aWVzIGluc3RlYWQgb2YgZ2V0IGFuZCBzZXQgbWV0aG9kcy4KICAgICAgICAgICAgTWVtYmVyIHZhcmlhYmxlIHdyYXBwaW5nIGJ1ZyBmaXhlcywgZm9yIGV4YW1wbGUgd3JhcHBpbmcgcG9pbnRlcnMgd29yayBub3cuCiAgICAgICAgICAgIFR5cGVtYXBzIGFyZSB1c2VkIGZvciBhbGwgdmFyaWFibGUgd3JhcHBpbmcgdG8gZ2VuZXJhdGUgdGhlIHByb3BlcnR5IGNvZGUuCgowMy8xMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyBpbiB0aGUgdmlydHVhbCBtZXRob2QgdW5yb2xsaW5nIGZvciBkaXJlY3RvcnMuIAoJICAgIFRoZSBvcmRlciBvZiB1bnJvbGxpbmcgaXMgbm93IGZyb20gYmFzZSB0byBkZXJpdmVkLCB0byBlbnN1cmUKCSAgICB0aGF0IHRoZSBtb3N0IGRlcml2ZWQgaW1wbGVtZW50YXRpb24gb2YgYSBkaXJlY3RvciBtZXRob2QgaXMKCSAgICBmb3VuZC4KCgkgICAgRGlyZWN0b3IgbWV0aG9kcyBmb3IgcHVyZSB2aXJ0dWFsIG1ldGhvZHMgbm93IHRocm93CgkgICAgRElSRUNUT1JfUFVSRV9WSVJUVUFMX0VYQ0VQVElPTiBpZiBfdXAgaXMgc2V0LgoKMDMvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gUG9seW1vcnBoaXNtIGZpeDogdmlydHVhbCBmdW5jdGlvbnMgbm93IHVzZSB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgQyMgcHJveHkgY2xhc3MsIHZpcnR1YWwgb3Igb3ZlcnJpZGUuCiAgICAgICAgICAgIFNvbWUgJ3VzaW5nIFN5c3RlbTsnIHN0YXRlbWVudCBmaXhlcyBuZWVkZWQgYnkgdGhlIE1vbm8gY29tcGlsZXIuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBidWcgaW4gdGhlIGFwcGxpY2F0aW9uIG9mIFN3aWdWYWx1ZVdyYXBwZXI8PiB0bwogICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcnVjZSBMb3dlcnkuCgowMy8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAkZGVzY3JpcHRvcih0eXBlKSB2YXJpYWJsZSBpcyBub3cgZXhwYW5kZWQgaW4gY29kZSBzdXBwbGllZCB0bwogICAgICAgICAgICAlZXh0ZW5kLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGNlcnRhaW4ga2luZHMgb2YgYWR2YW5jZWQgd3JhcHBpbmcgCiAgICAgICAgICAgIChlc3BlY2lhbGx5IGNvbnRhaW5lciBjbGFzc2VzKS4KCjAzLzExLzIwMDM6IGx1aWdpCiAgICAgICAgICAgIFN1cHBvcnQgZm9yIHN0ZDo6bWFwLgogICAgICAgICAgICAoYSkgSW50ZWdyYXRpb24gd2l0aCBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGEgbGEgc3RkOjp2ZWN0b3IpIGZvcgogICAgICAgICAgICAgICAgUHl0aG9uLCBSdWJ5LCBNelNjaGVtZSwgYW5kIEd1aWxlOwogICAgICAgICAgICAoYikgU2ltcGxlIHdyYXBwZXIgZm9yIG90aGVyIGxhbmd1YWdlcwoKMDMvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBpbiBzdHJpbmcgYW5kIGNoYXJhY3RlciBjb25zdGFudHMuICBTV0lHCiAgICAgICAgICAgIHdhc24ndCBwYXJzaW5nIGNlcnRhaW4gb2N0YWwgY29kZXMgY29ycmVjdGx5LgoKMDMvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2Ygc3VidGxlIHByZXByb2Nlc3NvciBwcm9ibGVtcyByZXBvcnRlZCBieQogICAgICAgICAgICBTZWJhc3RpZW4gUmVjaW8uCgogICAgICAgICAgICAoYSkgRW1wdHkgcHJlcHJvY2Vzc29yIHZhbHVlcyBubyBsb25nZXIgZ2VuZXJhdGUgImJhZCBjb25zdGFudAogICAgICAgICAgICB2YWx1ZSIgZXJyb3JzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTwogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyBCQVIKCiAgICAgICAgICAgIChiKSBNYWNybyBuYW1lcyBjYW4gbm93IHNwYW4gbXVsdGlwbGUgbGluZXMgKHRlY2huaWNhbGx5IHZhbGlkLAogICAgICAgICAgICBhbHRob3VnaCBxdWVzdGlvbmFibGUgcHJhY3RpY2UpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEFfTE9OR19NQUNST19cCiAgICAgICAgICAgICAgICAgIE5BTUUgNDIKCiAgICAgICAgICAgIChjKSBXaGl0ZXNwYWNlIGlzIG5vIGxvbmdlciByZXF1aXJlZCBiZWZvcmUgY2VydGFpbiBtYWNybyB2YWx1ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2RlZmluZSBGT08iSGVsbG8iCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQkFSXAogICAgICAgICAgICAgICAgICAiSGVsbG8iCiAKMDMvMDcvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZW1hcHMKICAgICAgICAgICAgaW4gdGhlIExpYi9ydWJ5L3R5cGVtYXBzLmkgbGlicmFyeSBmaWxlLgoKMDMvMDcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2NhbGxiYWNrIHRvIGRlbW9zdHJhdGUgaG93IGRpcmVjdG9ycyBjYW4KCSAgICBiZSB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3MgaW4gUHl0aG9uCgkgICAgQWRkZWQgRXhhbXBsZXMvcHl0aG9uL2V4dGVuZCB0byBkZW1vbnN0cmF0ZSB2aXJ0dWFsIG1ldGhvZAoJICAgIGNhbGxzIGZyb20gQysrIHRvIFB5dGhvbiAocmVhbGx5IHRoZSBzYW1lIGFzIHRoZSBjYWxsYmFjawoJICAgIGV4YW1wbGUsIGp1c3QgYSBkaWZmZXJlbnQgY29udGV4dCkuCgkgICAgQWRkZWQgZm91ciB0ZXN0cyBmb3IgdmVyeSBiYXNpYyBkaXJlY3RvciBmdW5jdGlvbmFsaXR5LiAgVGhlc2UKCSAgICBoYXZlIHJ1bnRpbWUgdGVzdHMgdW5kZXIgcHl0aG9uLgoJICAgIFRoZSBQeXRob24gbW9kdWxlIG5vdyBlbWl0cyAjZGVmaW5lIFNXSUdfRElSRUNUT1JTIG5lYXIgdGhlCgkgICAgdG9wIG9mIHRoZSBvdXRwdXQgZmlsZSBpZiBkaXJlY3RvcnMgYXJlIGVuYWJsZWQuICBUaGlzIGlzIHVzZWZ1bAoJICAgIGZvciBkaXNhYmxpbmcgcGFydHMgb2YgdGVzdHMgaW4gdGFyZ2V0IGxhbmd1YWdlcyB0aGF0IGRvbid0CgkgICAgc3VwcG9ydCBkaXJlY3RvcnMuCgowMy8wNi8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBhIHNlY3Rpb24gdG8gRG9jL01hbnVhbC9QeXRob24uaHRtbCBvbiBjcm9zcyBsYW5ndWFnZQoJICAgIHBvbHltb3JwaGlzbSAoZGlyZWN0b3JzKS4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFRoZSBzaG9ydC1saXZlZCAiLWZkaXJlY3RvcnMiIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgVG8gZW5hYmxlIGRpcmVjdG9ycywgaW5zdGVhZCB1c2UgdGhlIGV4dGVuZGVkICVtb2R1bGUgCgkgICAgZGlyZWN0aXZlIGFzIGZvbGxvd3M6CgoJICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIpIG1vZHVsZW5hbWUKCjAzLzA2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgbG9uZyBsb25nIHR5cGVtYXBzIGhhdmUgYmVlbiByZXdyaXR0ZW4gc28gdGhhdCB0aGV5IGNhbiBiZSBtb3JlCiAgICAgICAgICAgIGVhc2lseSB1c2VkIHdpdGggbm9uIElTTyBjb21waWxlcnMsIGxpa2UgVmlzdWFsIEMrKy4gRm9yIGV4YW1wbGUKICAgICAgICAgICAgaWYgeW91IGFyZSB3cmFwcGluZyB0aGUgV2luZG93cyA2NCBiaXQgdHlwZSBfX2ludDY0IHRoZSBsb25nIGxvbmcKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHk6CgogICAgICAgICAgICAgICAgJWFwcGx5IGxvbmcgbG9uZyB7IF9faW50NjQgfTsKICAgICAgICAgICAgICAgIF9faW50NjQgdmFsdWUxKF9faW50NjQgeCk7CgogICAgICAgICAgICBfX2ludDY0IHdpbGwgbm93IGFwcGVhciBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgaW5zdGVhZCBvZiBsb25nIGxvbmcuCiAgICAgICAgICAgIAowMy8wNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgQ0hBTkdFICoqKgogICAgICAgICAgICBTd2lnIG1vZHVsZSBtdXRhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIHNsaWdodGx5LiAgV2hlbiBhIGxhbmd1YWdlCiAgICAgICAgICAgIGNsYXNzIG1ldGhvZCB3YW50cyB0byBzYXZlIG5vZGUgYXR0cmlidXRlcywgaXQgbm93IHVzZXMgb25lIG9mIHRoZQogICAgICAgICAgICBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKICAgICAgICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkKICAgICAgICAgICAgICAgICAgU3dpZ19zYXZlKCkKCiAgICAgICAgICAgIFRoZSBmaXJzdCBhcmd1bWVudCB0byB0aGVzZSBmdW5jdGlvbnMgaXMgYSBuYW1lc3BhY2UgaW4gd2hpY2gKICAgICAgICAgICAgc2F2ZWQgYXR0cmlidXRlcyBhcmUgcGxhY2VkLiAgRm9yIGV4YW1wbGUsdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgICBOb2RlICpuOwogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoImNEZWNsYXJhdGlvbiIsbiwidHlwZSIsInBhcm1zIiwibmFtZSIsTklMKTsKCiAgICAgICAgICAgIHNhdmVzIHRoZSBhdHRyaWJ1dGVzIGFzICJjRGVjbGFyYXRpb246dHlwZSIsICJjRGVjbGFyYXRpb246cGFybXMiLAogICAgICAgICAgICBhbmQgc28gZm9ydGguICAgSWYgbmVjZXNzYXJ5LCBhIGxhbmd1YWdlIG1vZHVsZSBjYW4gcmVmZXIgdG8KICAgICAgICAgICAgb2xkIHZhbHVlcyBieSB1c2luZyB0aGlzIHNwZWNpYWwgbmFtZXNwYWNlIHF1YWxpZmllci4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoaXMsIGEgc3BlY2lhbCBhdHRyaWJ1dGUgInZpZXciIGNvbnRhaW5zIHRoZSBuYW1lCiAgICAgICAgICAgIG9mIHRoZSBsYXN0IG5hbWVzcGFjZSB1c2VkIHRvIHNhdmUgYXR0cmlidXRlcy4gIEluIHRoZSBhYm92ZSAKICAgICAgICAgICAgZXhhbXBsZSwgInZpZXciIHdvdWxkIGhhdmUgdGhlIHZhbHVlICJjRGVjbGFyYXRpb24iLiAgIFRoZSB2YWx1ZQogICAgICAgICAgICBvZiAiY0RlY2xhcmF0aW9uOnZpZXciIHdvdWxkIGhhdmUgdGhlIHByZXZpb3VzIHZpZXcgYW5kIHNvIGZvcnRoLgoKICAgICAgICAgICAgU3dpZ19yZXN0b3JlKG4pIHJlc3RvcmVzIGEgbm9kZSB0byB0aGUgc3RhdGUgYmVmb3JlIHRoZSBsYXN0CiAgICAgICAgICAgIFN3aWdfcmVxdWlyZSgpIG9yIFN3aWdfc2F2ZSgpIGNhbGwuCgogICAgICAgICAgICBOb3RlOiAgVGhpcyBjaGFuZ2UgbWFrZXMgaXQgZWFzaWVyIGZvciBsYW5ndWFnZSBtb2R1bGVzIHRvIHJlZmVyCiAgICAgICAgICAgIHRvIG9sZCB2YWx1ZXMgb2YgYXR0cmlidXRlcy4gIAoKCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1lcmdlZCB0aGUgY3Jvc3MtbGFuZ3VhZ2UgcG9seW1vcnBoaXNtIHBhdGNoLiAgV2hlbiBlbmFibGVkLCBDKysgCgkgICAgInByb3h5IiBjbGFzc2VzIChjYWxsZWQgZGlyZWN0b3JzKSBhcmUgZ2VuZXJhdGVkIGZvciBlYWNoIHNwZWNpZmllZCAKCSAgICBDKysgY2xhc3MuICBEaXJlY3RvcnMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uLCBzaW1pbGFyIAoJICAgIHRvIHRoZSB3YXkgdGhlIHVzdWFsIHByb3h5IChzaGFkb3cpIGNsYXNzZXMgcGFzcyBtZXRob2QgY2FsbHMgZnJvbSAKCSAgICBQeXRob24gdG8gQysrLiAgVG9nZXRoZXIsIHRoZXNlIHR3byB0eXBlcyBvZiBwcm94aWVzIGFsbG93IEMrKyAKCSAgICBjbGFzc2VzIHRoYXQgYXJlIGV4dGVuZGVkIGluIFB5dGhvbiB0byBiZWhhdmUganVzdCBsaWtlIG9yZGluYXJ5IAoJICAgIEMrKyBjbGFzc2VzIGFuZCBiZSB1c2VkIGluIEMrKyBsaWtlIG5hdGl2ZSBvYmplY3RzLiAgCgkgICAgCgkgICAgVGhpcyBmZWF0dXJlIGlzIHN0aWxsIHZlcnkgZXhwZXJpbWVudGFsIGFuZCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgoJICAgIFRvIGVuYWJsZSBkaXJlY3RvciBzdXBwb3J0LCBzcGVjaWZ5ICctZmRpcmVjdG9ycycgb24gdGhlIFNXSUcgY29tbWFuZAoJICAgIGxpbmUgb3IgaW4gdGhlIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUuICBJbiB0aGUgaW50ZXJmYWNlCgkgICAgZmlsZSwgYWRkICVmZWF0dXJlKCJkaXJlY3RvciIpIHRvIGdlbmVyYXRlIGRpcmVjdG9ycyBmb3IgYWxsIGNsYXNzZXMKCSAgICB0aGF0IGhhdmUgdmlydHVhbCBtZXRob2RzLiAgCgkgICAgCgkgICAgU2VlIGh0dHA6Ly9zdG0ubGJsLmdvdi9+dG0yL3N3aWcvUHJveHlEb2MuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgoJICAgIAoKMDMvMDMvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHNtYWxsIGdsaXRjaCBpbiB0eXBlbWFwIGxvY2FsIHZhcmlhYmxlIHJlcGxhY2VtZW50LiAgSWYgeW91IGhhZAogICAgICAgICAgICBhIHR5cGVtYXAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSAoJDFfdHlwZSB0ZW1wKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIHRlbXAgPSAuLi47CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgbm8gb2NjdXJyZW5jZSBvZiAiJDFfdHlwZSIgYXBwZWFyZWQgaW4gdGhlIGJvZHksIHRoZW4gdGhlIGxvY2FsCiAgICAgICAgICAgIHZhcmlhYmxlIHR5cGUgd291bGRuJ3QgYmUgc3Vic3RpdHV0ZWQuCgowMy8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgdmVyc2lvbiBvZiB0aGUgQ1NoYXJwIG1vZHVsZSB3aGljaCBpcyB0eXBlbWFwIGJhc2VkLgogICAgICAgICAgICBJdCBhbHNvIHVzZXMgRUNNQSBDIyBhbmQgbm8gbG9uZ2VyIHVzZXMgTWljcm9zb2Z0IFZpc3VhbCBDKysuTkVUIAogICAgICAgICAgICBnbHVlLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCB3b3JrIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgTmVpbCBDYXdzZS4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTM1NDggXSBlcnJvciBwYXJzaW5nIGNhc3Rpbmcgb3BlcmF0b3IgZGVmaW5pdGlvbi4KICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyBjYXN0aW5nIG9wZXJhdG9ycyBkZWNsYXJlZCBvdXRzaWRlIG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGlubGluZSBBOjpvcGVyYXRvciBjaGFyICooKSB7IC4uLiB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFydGluIENhc2Fkby4KCjAyLzI3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgYW5vbnltb3VzIGJpdC1maWVsZHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeCA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgICA6IDQ7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgeSA6IDg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFub255bW91cyBiaXQtZmllbGRzIGFyZSBpZ25vcmVkIGJ5IFNXSUcuICAgUHJvYmxlbQogICAgICAgICAgICByZXBvcnRlZCBieSBGcmFueiBI9nBmaW5nZXIuCgowMi8yNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJldHRlciB0eXBlbWFwcyBpbiB0aGUgRXhhbXBsZXMvamF2YS90eXBlbWFwIGV4YW1wbGUgYW5kIGFsc28gCiAgICAgICAgICAgIGZpeGVzIHN1YnRsZSBidWcgd2hlbiB1c2luZyB0aGUgU3RyaW5nQnVmZmVyIHR5cGVtYXBzIG1vcmUgdGhhbiBvbmNlLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0MjExMiBdIENvbnN0YW50cyBjaGFyIGJ1Zy4KCjAyLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzUzMzcgXSBQYXJ0aWFsIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIG5vdCBlbnRpcmVseSB3b3JraW5nLgogICAgICAgICAgICBUaGVyZSB3YXMgYSBzdWJ0bGUgcHJvYmxlbSByZWxhdGVkIHRvIHRoZSBuYW1pbmcgYW5kIG9yZGVyaW5nIG9mCiAgICAgICAgICAgIHRlbXBsYXRlIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gYXJndW1lbnRzLiAgTWF0Y2hpbmcgd29ya2VkIG9rYXksCiAgICAgICAgICAgIHRoZSByZXN1bHRpbmcgdGVtcGxhdGVzIHdlcmVuJ3QgZXhwYW5kZWQgY29ycmVjdGx5LgoKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggcGFyc2luZyAoYW5kIGdlbmVyYXRpbmcgY29kZSkgZm9yIAogICAgICAgICAgICByZWZlcmVuY2VzIHRvIGFycmF5cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBmb28oaW50ICgmeClbMTBdKTsKICAKMDIvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTM0NyBdIENvbXBpbGF0aW9uIHdhcm5pbmcgZnJvbSBsaWJweS5jLgogICAgICAgICAgICBSZXBvcnRlZCBieSBEYW5pZWwgTC4gUmFsbC4KIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB2aXJ0dWFsIG1ldGhvZCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICBjaGVja2luZyBhbmQgdHlwZWRlZi4KCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKmludHB0cjsKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50ICpmb28oKSA9IDA7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludHB0ciBmb28oKSB7IH07CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIHRyZWF0aW5nIHRoZXNlIGRlY2xhcmF0aW9ucyBhcyBkaWZmZXJlbnQgZXZlbiB0aG91Z2gKICAgICAgICAgICAgdGhleSBhcmUgdGhlIHNhbWUgKHZpYSB0eXBlZGVmKS4KCjAyLzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCByYW5nZSBjaGVja2luZyBmb3IgdGhlIE5VTTJVU0hSVCBtYWNybywgcGVyIFsgNjc1MzUzIF0uCgowMi8yNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc3VidGxlIHByb2JsZW0gd2l0aCB0aGUgY29kZSB0aGF0IGRldGVybWluZWQgaWYgYSBjbGFzcyBpcyBhYnN0cmFjdAogICAgICAgICAgICBhbmQgY2FuIGJlIGluc3RhbnRpYXRlZC4gICAgSWYgeW91IGhhZCBjbGFzc2VzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCkgPSAwOwogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IHZpcnR1YWwgQSB7CiAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgc3RydWN0IEMgOiB2aXJ0dWFsIEEgeyAKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIC8qIE5vdGUgb3JkZXIgb2YgYmFzZSBjbGFzc2VzICovCQogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRCA6IEIsIEMgeyB9OyAgICAvKiBPayAqLwogICAgICAgICAgICAgICAgICBzdHJ1Y3QgRSA6IEMsIEIgeyB9OyAgICAvKiBCcm9rZW4gKi8KCiAgICAgICAgICAgIHRoZW4gU1dJRyBkZXRlcm1pbmVkIHRoYXQgaXQgY291bGQgaW5zdGFudGlhdGUgRCgpLCBidXQgbm90IEUoKS4KICAgICAgICAgICAgVGhpcyBpbmNvbnNpc3RlbmN5IGFyb3NlIGZyb20gdGhlIGRlcHRoLWZpcnN0IHNlYXJjaCBvZiB0aGUgCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB0byBsb2NhdGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB2aXJ0dWFsCiAgICAgICAgICAgIG1ldGhvZHMuICAgVGhpcyBwcm9ibGVtIHNob3VsZCBub3cgYmUgZml4ZWQtLS1TV0lHIHdpbGwgYXR0ZW1wdAogICAgICAgICAgICB0byBsb2NhdGUgYW55IHZhbGlkIGltcGxlbWVudGF0aW9uIG9mIGEgdmlydHVhbCBtZXRob2QgYnkKICAgICAgICAgICAgdHJhdmVyc2luZyBvdmVyIHRoZSBlbnRpcmUgaGllcmFyY2h5LgoKMDIvMjIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHVzaW5nIGVudW0gdHlwZW1hcHMuIFRoZSBKYXZhIGZpbmFsIHN0YXRpYyB2YXJpYWJsZSB0eXBlCiAgICAgICAgICAgIGNhbiBiZSBzZXQgdXNpbmcgdGhlIGpzdHlwZSB0eXBlbWFwLCBlbmFibGluZyBlbnVtcyB0byBiZSBtYXBwZWQgdG8gCiAgICAgICAgICAgIHNvbWV0aGluZyBvdGhlciB0aGFuIGludC4gQnVnIHJlcG9ydGVkIGJ5IEhlaW5lciBQZXRpdGguCgowMi8yMS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIENTaGFycCAoQyMpIG1vZHVsZSBwcm90b3R5cGUKICAgICAgICAgICAgaS5lLiBjc2hhcnAuY3h4ICYgY3NoYXJwLmggYXQgU291cmNlL01vZHVsZXMvLgogICAgICAgICAgICBUaGV5IGFyZSBmb3IgdGVzdCB1c2FnZSBvbmx5IG5vdyBhbmQgbmVlZCBpbXByb3ZlbWVudC4KICAgICAgICAgICAgVGhlIGludGVyZmFjZSBhbHNvIG5lZWQgdG8gYmUgbW9kaWZpZWQuCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgCjAyLzIwLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVkZWYgd2l0aCAtZnZpcnR1YWwuCiAgICAgICAgICAgIFNpbWlsYXIgYXMgYmVhemxleSdzIG1vZGlmaWNhdGlvbiB0b2RheS4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZ2NjLXN0eWxlIHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICAKICAgICAgICAgICAgUGF0Y2ggWyA2MjMyNTggXSBHQ0Mtc3R5bGUgdmFyYXJnIG1hY3JvIHN1cHBvcnQuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZSBNYXNvbi4KCjAyLzIwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgY2xhc3NlcyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKGludCB4KSA9IDA7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKEludGVnZXIgeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyBnZXR0aW5nIGNvbmZ1c2VkIGFib3V0IHRoZSBsYXR0ZXIgbWV0aG9kLS0tbWFraW5nIEJhcgogICAgICAgICAgICBhYnN0cmFjdC4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVqYXZhY29uc3QoZmxhZykgY2FuIGFsc28gYmUgdXNlZCBvbiBlbnVtcyBhcyB3ZWxsIGFzIGNvbnN0YW50cy4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGVuYWJsZXMgdHJ1ZSBKYXZhIGNvbXBpbGVyIGNvbnN0YW50cyBzbyB0aGF0IHRoZXkgY2FuIGJlIAogICAgICAgICAgICB1c2VkIGluIEphdmEgc3dpdGNoIHN0YXRlbWVudHMuIFRoYW5rcyB0byBIZWluZXIgUGV0aXRoIGZvciBwYXRjaGVzLgoKMDIvMTkvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBNb2RpZmllZCAtZmNvbXBhY3QgZmVhdHVyZSB0byBkZWFsIHdpdGggUFAgbGluZXMKCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODkwNDAgXSBNaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvYmVydCBILiBkZSBWcmllcy4KCjAyLzE4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBmZXcgZXZpbCBzY29waW5nIHByb2JsZW1zIHdpdGggdGVtcGxhdGVzLCBuYW1lc3BhY2VzLCBhbmQgdGhlCiAgICAgICAgICAgICVleHRlbmQgZGlyZWN0aXZlLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCgowMi8xOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW1J1YnldIEltcHJvdmVkIHN1cHBvcnQgZm9yIFZpc3VhbCBDKysgYW5kIG90aGVyIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4gCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gc3BlY2lmeSAiL0VYUE9SVDpJbml0Xzxtb2R1bGU+Iiwgd2hlcmUgPG1vZHVsZT4gaXMgdGhlCiAgICAgICAgICAgIHN3aWcgbW9kdWxlIG5hbWUgd2hlbiBsaW5raW5nIHVzaW5nIHRoZXNlIG5hdGl2ZSBXaW5kb3dzIGNvbXBpbGVycy4KCjAyLzE1LzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgLWZ2aXJ0dWFsIG9wdGlvbi4KICAgICAgICAgICAgUmVkdWNlIHRoZSBsaW5lcyBhbmQgc2l6ZSBvZiB0aGUgd3JhcHBlciBmaWxlCiAgICAgICAgICAgIGJ5IG9taXR0aW5nIHJlZGlmaW5lZCB2aXJ0dWFsIGZ1bmN0aW9uIGluIGNoaWxkcmVuIGNsYXNzZXMuCgogICAgICAgICAgICBNb2RpZmllZCAtY29tcGFjdCBvcHRpb24gdG8gLWZjb21wYWN0IG9wdGlvbgoKICAgICAgICAgICAgQWRkZWQgLXNtYWxsIG9wdGlvbi4KICAgICAgICAgICAgLXNtYWxsID0gLWZ2aXJ0dWFsIC1mY29tcGFjdAogICAgICAgICAgICBBbmQgaXQgY2FuIGJlIGV4dGVuZGVkIGJ5IGZ1dHVyZSBmZWF0dXJlIG9wdGlvbnMsCiAgICAgICAgICAgIHdoaWNoIGFyZSB1c2VkIHRvIHJlZHVjZSB3cmFwcGVyIGZpbGUgc3ppZS4KCiAgICAgICAgICAgIEFkZGVkIFNXSUdfRkVBVFVSRVMgZW52aXJvbm1lbnQgdmFyaWFibGUgY2hlY2suCiAgICAgICAgICAgIFRvIGR5bmFtaWNhbGx5IHNldCB0aGUgZmVhdHVyZSBvcHRpb25zIHN1Y2ggYXMgLWZjb21wYWN0ICYgLWZ2aXJ0dWFsCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAyLzEzLzIwMDM6IGxlbnoKICAgICAgICAgICAgVXBkYXRlZCBEb2MvTWFudWFsL1Blcmw1Lmh0bWwgdG8gdGFsayBhYm91dCBDKysgY29tcGlsZSBwcm9ibGVtcwogICAgICAgICAgICBjb25maWd1cmUuaW4gbm93IGNoZWNrcyBmb3IgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBSdW50aW1lL01ha2VmaWxlLmluIGFuZCBFeGFtcGxlL01ha2VmaWxlLmluIG5vdyB1c2UgUEVSTDVfQ0NGTEFHUwogICAgICAgICAgICBBZGRlZCBMaWIvcGVybDUvbm9lbWJlZC5oIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUga25vd24gbWFjcm8gY29uZmxpY3RzCgowMi8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjg1NDEwIF0gQysrIEV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gY2F1c2VzIFNXSUcgdG8gZXhpdC4KICAgICAgICAgICAgRml4ZXMgYSBzeW50YXggZXJyb3Igd2l0aCBkZWNsYXJhdGlvbnMgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBzdGQ6OnZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgaW5zdGFudGlhdGlvbiBhbmQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlLgogICAgICAgICAgICBXZSBtaWdodCBkbyBtb3JlIGxhdGVyLiAgUmVwb3J0ZWQgYnkgVGhvbWFzIFdpbGxpYW1zb24uCgowMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgUmV3cm90ZSBib29sIHR5cGVtYXBzIHRvIHJlbW92ZSBwZXJmb3JtYW5jZSB3YXJuaW5nIGZvciBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgdW5kZXIgVmlzdWFsIEMrKy4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXggZm9yIHdyYXBwaW5nIHJlZmVyZW5jZSB2YXJpYWJsZXMgKGNvbnN0IG5vbi1wcmltaXRpdmUgYW5kIGFsbCBub24tY29uc3QgdHlwZXMpIAogICAgICAgICAgICBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBpbnQmIGk7CiAgICAgICAgICAgICAgQ2xhc3MmIGM7CiAgICAgICAgICAgICAgY29uc3QgQ2xhc3MmIGM7CgowMi8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG1vcmUgdmVyeSBzdWJ0bGUgcHJlcHJvY2Vzc29yIGNvcm5lciBjYXNlcyByZWxhdGVkIHRvIHJlY3Vyc2l2ZQogICAgICAgICAgICBtYWNybyBleHBhbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAjZGVmaW5lIGNhdCh4LHkpIHggIyMgeQoKICAgICAgICAgICAgICAgICAgIGNhdChjYXQoMSwyKSwzKSAgICAvLyBQcm9kdWNlczogY2F0KDEsMikzCiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgeGNhdCh4LHkpIGNhdCh4LHkpCgogICAgICAgICAgICAgICAgICAgeGNhdCh4Y2F0KDEsMiksMykgIC8vIFByb2R1Y2VzIDEyMwoKICAgICAgICAgICAgU2VlIEsmUiwgMm5kIEVkLiBwLiAyMzEuCgowMi8xMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA2ODM4ODIgXSAtIHBhdGNoIHN1Ym1pdHRlZCBieSBGLiBQb3N0bWEgZm9yIFNXSUcgdG8gY29tcGlsZSBvbiBIUC1VWC4KCjAyLzEwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByZXByb2Nlc3NvciBhcmd1bWVudCBleHBhbnNpb24gYnVnLiBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDIvMTAvMjAwMzogc29uZ3lhbmYKICAgICAgICAgICAgQWRkZWQgLWNvbXBhY3Qgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgY29tbWVudHMgYW5kIGNvbWJpbmluZyBzaG9ydCBsaW5lcy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NTEzNTUgXSBTeW50YXggZXJyb3Igd2l0aCBjc3RyaW5nLmkKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgT21yaSBCYXJlbC4KCjAyLzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NjM2MzIgXSBpbmNvbXBhdGliaWxpdHkgd2l0aCBzdGFuZGFyZCBjcHAuCiAgICAgICAgICAgIFRoaXMgaXMgYSByZWZpbmVtZW50IHRoYXQgZml4ZXMgdGhpcyBwcm9ibGVtOgoKICAgICAgICAgICAgICAgICAvLyBTb21lIG1hY3JvIHdpdGggYW4gYXJndW1lbnQKICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyh4KSAgICAgICB4CgogICAgICAgICAgICAgICAgIGludCBGT087ICAgICAgICAvKiBOb3QgYSBtYWNyby0tLW5vIGFyZ3VtZW50cyAqLwogCjAyLzA1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2NzU0OTEgXSBwYXJzZSBlcnJvciB3aXRoIGdsb2JhbCBuYW1lc3BhY2UgcXVhbGlmaWNhdGlvbi4KICAgICAgICAgICAgU3VibWl0dGVkIGJ5IEplcmVteSBZYWxsb3AuCgowMi8wNC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB2YXJhcmdzIHByb2Nlc3NpbmcgaW50cm9kdWNlZCBieSB0aGUgbnVtaW5wdXRzIHR5cGVtYXAgcGFyYW1ldGVyLgoKMDEvMDgvMjAwMzogdHRuCgkgICAgW3htbF0gRml4IHN0cmluZy1yZXBsYWNlbWVudCBvcmRlcmluZyBidWdsZXQuCgkgICAgVGhhbmtzIHRvIEdhcnkgSGVycm9uLgoKMTIvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZ1cnRoZXIgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBUaGUgU1dJRyBleGVjdXRhYmxlIGlzIG5vdyBidWlsdCB1c2luZyBhIHNpbmdsZSBNYWtlZmlsZS4KICAgICAgICAgICAgLSBUaGlzIG1ha2VmaWxlIGlzIGdlbmVyYXRlZCBieSBBdXRvbWFrZSAoU291cmNlL01ha2VmaWxlLmFtKS4KICAgICAgICAgICAgLSBEZXBlbmRlbmN5IHRyYWNraW5nIGFuZCB0YWdzIHN1cHBvcnQgYXJlIGluIHRoaXMgbWFrZWZpbGUuCiAgICAgICAgICAgIC0gQXV0b21ha2UgMS43LjIgYW5kIEF1dG9jb25mIDIuNTQgbWluaW11bSB2ZXJzaW9ucyBhcmUgbmVlZGVkIHRvIGJ1aWxkIFNXSUcgZnJvbSBDVlMuCiAgICAgICAgICAgIC0gUnVubmluZyAuL2F1dG9nZW4uc2ggbm93IGluc3RhbGxzIEF1dG9jb25mL0F1dG9tYWtlIHN1cHBvcnQgZmlsZXMgaW50bwogICAgICAgICAgICAgIFRvb2xzL2NvbmZpZyBhbmQgdGhlc2UgZmlsZXMgYXJlIG5vIGxvbmdlciBzdG9yZWQgaW4gQ1ZTLgogICAgICAgICAgICAtIEJ1ZyBmaXhlcyBpbiAnbWFrZSBpbnN0YWxsJyBmb3Igc3lzdGVtcyB1c2luZyAuZXhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIGFuZAogICAgICAgICAgICAgIC4vY29uZmlndXJlIC0td2l0aC1yZWxlYXNlLXN1ZmZpeD13aGF0ZXZlcgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vcmUgYnVpbGQgY2hhbmdlczoKICAgICAgICAgICAgLSBBdXRvY29uZidzIEFDX0NBTk9OSUNBTF9IT1NUIHJlcGxhY2VzIHByb3ByaWV0YXJ5IGFwcHJvYWNoIGZvciBkZXRlY3RpbmcgYnVpbGQgaG9zdC4KICAgICAgICAgICAgLSBBdXRvY29uZiBzdXBwb3J0IGZpbGVzIG1vdmVkIHRvIFRvb2xzL2NvbmZpZy4KCjEyLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBNb2RpZmljYXRpb25zIHRvIHJ1biBvbiBNYWNPUywgc3VibWl0dGVkIGJ5IEJlcm5hcmQgRGVzZ3JhdXBlcy4KICAgICAgICAgICAgTWFpbmx5IGVuc3VyaW5nIGdlbmVyYXRlZCBmaWxlcyBhcmUgb3V0cHV0IGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcnkgZm9yCiAgICAgICAgICAgIHNvbWUgbW9kdWxlcy4KCjEyLzExLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBWYXJpb3VzIGJ1aWxkIG1vZGlmaWNhdGlvbnMgYW5kIGJ1ZyBmaXhlczoKICAgICAgICAgICAgLSBTaW1wbGlmaWNhdGlvbiBvZiB2ZXJzaW9uIHN0cmluZy4gVXNlIGF1dG9jb25mJ3MgUEFDS0FHRV9WRVJTSU9OIGluc3RlYWQuCiAgICAgICAgICAgIC0gQnVpbGQgdGltZSByZW1vdmVkIGZyb20gU1dJRyB2ZXJzaW9uLgogICAgICAgICAgICAtIFVzaW5nIHN0YW5kYXJkIGF1dG9jb25mIGNvbmZpZyBoZWFkZXIgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgLSBVcGRhdGVkIG9sZCBhdXRvY29uZiBtYWNyb3MgYXMgcmVwb3J0ZWQgYnkgYXV0b3VwZGF0ZS4KICAgICAgICAgICAgLSBSZW1vdmVkICRwcmVmaXggaW4gYXV0b2NvbmYgZnJvbSBzZWFyY2ggcGF0aHMgYXMgYXV0b2NvbmYgd29uJ3QgZXhwYW5kIHRoZW0uCiAgICAgICAgICAgIC0gU3VidGxlIGJ1ZyBmaXggd2hlcmUgJ21ha2UgcHJlZml4PS9zb21ld2hlcmU7IG1ha2UgY2xlYW47IG1ha2UgcHJlZml4PS9zb213aGVyZS9lbHNlJwogICAgICAgICAgICAgIHByb2R1Y2VkIGFuIGV4ZWN1dGFibGUgdXNpbmcgdGhlIGluY29ycmVjdCBsaWJyYXJ5IGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtIEFkZGVkIC1sZGZsYWdzIGNvbW1hbmRsaW5lIG9wdGlvbiBmb3IgTXpTY2hlbWUsIE9jYW1sLCBQaWtlIGFuZCBQSFAuCiAgICAgICAgICAgIC0gRml4ZWQgcmVwb3J0aW5nIG9mIGNvbXBpbGVyIHVzZWQgd2hlbiB1c2luZyAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCiAgICAgICAgICAgIC0gU1dJRyB3ZWIgYWRkcmVzcyBhZGRlZCB0byAtdmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24uCgoxMi8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGZpeCB0byBUY2wgZHluYW1pYyBjYXN0IHR5cGVtYXBzLiBSZXBvcnRlZCBieQogICAgICAgICAgICBLcmlzdG9waGVyIEJsb20uCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSB0ZW1wbGF0ZSBhcmd1bWVudCByZXBsYWNlIGJ1Zy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIENocmlzIEZsYXRsZXkuCgoxMi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJldmVydGVkIENIQU5HRVMgMDkvMDMvMjAwMiwgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV2YWx1YXRpb24uICBBcmd1bWVudHMKICAgICAgICAgICAgYXJlIG5vdCBldmFsdWF0ZWQgZHVyaW5nIGNvbGxlY3Rpb24sIEsmUiwgcC4gMjMwLgoKMTIvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY0OTAyMiBdIENvbXBpbGF0aW9uIHByb2JsZW1zIHdpdGggS0FJL0tDQwoKMTIvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHICdyZWwtMS0zJyBDVlMgYnJhbmNoIG1lcmdlZCBiYWNrIGludG8gdGhlIG1haW4gYnJhbmNoLgoKClZlcnNpb24gMS4zLjE3IChOb3ZlbWJlciAyMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxMzkyMiBdIHByZXByb2Nlc3NvciBlcnJvcnMgd2l0aCBIQVZFX0xPTkdfTE9ORy4KICAgICAgICAgICAgCjExLzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MTU0ODAgXSBtenNjaGVtZSBTV0lHX011c3RHZXRQdHJfLgoKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYzNTExOSBdIFNXSUdfY3JvYWsgY2F1c2VzIGNvbXBpbGVyIHdhcm5pbmcuCgoxMS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHR5cGVtYXBzIGZvciBwb2ludGVycyB0byBjbGFzcyBtZW1iZXJzLgoKMTEvMTUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBPdmVybG9hZGVkIEMrKyBmdW5jdGlvbnMgd2hpY2ggY2Fubm90IGJlIG92ZXJsb2FkZWQgaW4gSmF2YSAKICAgICAgICAgICAgb25jZSBhZ2FpbiBpc3N1ZSBhIHdhcm5pbmcuCgoxMS8xNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEhhbmRsaW5nIG9mIE5VTEwgcG9pbnRlcnMgaXMgaW1wcm92ZWQuIEEgamF2YSBudWxsIG9iamVjdCB3aWxsIG5vdwogICAgICAgICAgICBiZSB0cmFuc2xhdGVkIHRvIGFuZCBmcm9tIGEgTlVMTCBDL0MrKyBwb2ludGVyIGJ5IGRlZmF1bHQuIFByZXZpb3VzbHkgd2hlbiAKICAgICAgICAgICAgd3JhcHBpbmc6CgogICAgICAgICAgICAgICAgY2xhc3MgU29tZUNsYXNzIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzICpzKTsKCiAgICAgICAgICAgIGFuZCBpdCB3YXMgY2FsbGVkIGZyb20gSmF2YSB3aXRoIG51bGw6CgogICAgICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28obnVsbCkKCiAgICAgICAgICAgIGEgSmF2YSBOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgdGhyb3duLiBFeHRyYSB0eXBlbWFwcyBoYWQgdG8gYmUgd3JpdHRlbiBpbgogICAgICAgICAgICBvcmRlciB0byBvYnRhaW4gYSBOVUxMIHBvaW50ZXIgdG8gcGFzcyB0byBmdW5jdGlvbnMgbGlrZSB0aGlzIG9uZS4gTm93IHRoZSAKICAgICAgICAgICAgZGVmYXVsdCB3cmFwcGluZyB3aWxsIGRldGVjdCAnbnVsbCcgYW5kIHRyYW5zbGF0ZSBpdCBpbnRvIGEgTlVMTCBwb2ludGVyLgogICAgICAgICAgICBBbHNvIGlmIGEgZnVuY3Rpb24gcmV0dXJucyBhIE5VTEwgcG9pbnRlciwgZWc6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICAgU29tZUNsYXNzICpiYXIoKSB7IHJldHVybiBOVUxMOyB9CiAgICAgICAgICAgIAogICAgICAgICAgICBUaGVuIHRoaXMgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggYSBTb21lQ2xhc3MgcHJveHkgY2xhc3MgaG9sZGluZyBhIE5VTEwKICAgICAgICAgICAgcG9pbnRlci4gTm93IG51bGwgaXMgcmV0dXJuZWQgaW5zdGVhZC4gVGhlc2UgY2hhbmdlcyBhcmUgc3VidGxlIGJ1dCB1c2VmdWwuCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIGJ5IHVzaW5nIHRoZSBvcmlnaW5hbCB0eXBlbWFwczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkJmphdmFjbGFzc25hbWUoJGpuaWNhbGwsIHRydWUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyAkamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWdldGNwdHIpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAlewogICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKCjExLzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGFic3RyYWN0IG1ldGhvZHMgYW5kIHNpZ25hdHVyZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgICBtZXRoKGludCBtZXRoX3BhcmFtKSA9IDA7IAogICAgICAgICAgICB9OyAKIAogCiAgICAgICAgICAgIGNsYXNzIGFic3RyYWN0X2JhciA6IHB1YmxpYyBhYnN0cmFjdF9mb28geyAKICAgICAgICAgICAgcHVibGljOiAKICAgICAgICAgICAgICAgIGludCBtZXRoKGludCBtZXRoX3BhcmFtXzEsIGludCBtZXRoX3BhcmFtXzIpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYWJzdHJhY3RfYmFyIGlzIHN0aWxsIGFic3RyYWN0LgoKICAgICAgICAgICAgRml4ZXMgWyA2Mjg0MzggXSBEZXJpdmVkIGFic3RyYWN0IGNsYXNzIG5vdCBhYnN0cmFjdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYW5kIHBhdGNoZWQgYnkgU2NvdHQgTWljaGVsLgoKMTEvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIG1hdGNoaW5nIHByb2JsZW0gd2l0aCB0eXBlbWFwcyBhbmQgYXJyYXkgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICAgaGFkIHRoaXM6CgogICAgICAgICAgICAgICB0eXBlZGVmIGNoYXIgYmxhaFsyMF07CgogICAgICAgICAgICBhbmQgYSB0eXBlbWFwOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAgIC4uLiAkMV9kaW0wIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuICQxX2RpbSogdmFyaWFibGVzIHdlcmVuJ3QgYmUgZXhwYW5kZWQgcHJvcGVybHkuICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgUGFua2FqIEt1bWFyIEdvZWwuCiAgICAgICAgICAgICAgIAoxMS8wNy8yMDAyOiBta29lcHBlCgkgICAgQWRkZWQgYW4gZXhwZXJpbWVudGFsIG5ldyBtb2R1bGUgdGhhdCBkdW1wcyBTV0lHJ3MgcGFyc2UKCSAgICB0cmVlIGFzIChDb21tb24pIExpc3Agcy1leHByZXNzaW9ucy4gIFRoZSBtb2R1bGUgaXMKCSAgICBpbnZva2VkIHdpdGggU1dJRydzIC1zZXhwIGNvbW1hbmQtbGluZSBzd2l0Y2guICBUaGUgb3V0cHV0CgkgICAgY2FuIGJlIHJlYWQgaW50byBDb21tb24gTGlzcC4gIFRoZXJlIGlzIChwcm90b3R5cGUpCgkgICAgZXhhbXBsZSBMaXNwIGNvZGUgdGhhdCBnZW5lcmF0ZXMgRm9yZWlnbiBGdW5jdGlvbiBJbnRlcmZhY2UKCSAgICBkZWZpbml0aW9ucyBmb3IgdXNlIHdpdGggS2V2aW4gUm9zZW5iZXJnJ3MgVUZGSS4KCgkgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBSZW1vdmVkIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbiBvZiAiY3BwX3RlbXBsYXRlX2RlY2wiIGluCgkgICAgcGFyc2VyLnk7IGJpc29uIDEuNzUgY29tcGxhaW5lZC4KCjExLzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRGVmYXVsdCBwcmltaXRpdmUgYXJyYXkgaGFuZGxpbmcgaGFzIGNoYW5nZWQgbGlrZSBhcnJheXMgb2YgY2xhc3Nlcy4gCiAgICAgICAgICAgIEMgcHJpbWl0aXZlIGFycmF5cyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgYSBKYXZhIGFycmF5IGJ1dCB3aXRoIGEgcG9pbnRlciAKICAgICAgICAgICAgKHR5cGUgd3JhcHBlciBjbGFzcykuIEFnYWluIHRoZSBjaGFuZ2VzIGhhdmUgYmVlbiBtYWRlIGZvciBlZmZpY2llbmN5IHJlYXNvbnMuIAogICAgICAgICAgICBUaGUgb3JpZ2luYWwgdHlwZW1hcHMgaGF2ZSBiZWVuIG1vdmVkIGludG8gYXJyYXlzX2phdmEuaSwgc28gdGhlIG9yaWdpbmFsIAogICAgICAgICAgICBiZWhhdmlvdXIgY2FuIGJlIG9idGFpbmVkIG1lcmVseSBpbmNsdWRpbmcgdGhpcyBmaWxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgoKICAgICAgICAgICAgVGhlIGFycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBubyBsb25nZXIgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZXkgYXJlIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gaW5jbHVkaW5nIHRoaXMgZmlsZSwgdGh1cyB0aGlzIG9mdGVuIHVudXNlZCBjb2RlIGlzIG9ubHkKICAgICAgICAgICAgZ2VuZXJhdGVkIHdoZW4gc3BlY2lmaWNhbGx5IHJlcXVpcmluZyB0aGlzIHR5cGUgb2YgYXJyYXkgc3VwcG9ydC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjExLzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBzdXBwb3J0IGZvciBuZXN0ZWQgbW9kdWxlIGRlY2xhcmF0aW9ucyAoYXMgd2FzCiAgICAgICAgICAgIHByZXZpb3VzbHkgYWRkZWQgZm9yIHRoZSBQZXJsIG1vZHVsZSkuIFNvIGEgJW1vZHVsZSBkaXJlY3RpdmUKICAgICAgICAgICAgb2YgdGhlIGZvcm06CgogICAgICAgICAgICAgICAgJW1vZHVsZSAiT3V0ZXI6OklubmVyOjpGb28iCgogICAgICAgICAgICB3aWxsIG5lc3QgZXZlcnl0aGluZyBhcyAoaW4gUnVieSBjb2RlKToKCiAgICAgICAgICAgICAgICBtb2R1bGUgT3V0ZXIKICAgICAgICAgICAgICAgICAgbW9kdWxlIElubmVyCiAgICAgICAgICAgICAgICAgICAgbW9kdWxlIEZvbwogICAgICAgICAgICAgICAgICAgICAgIyBzdHVmZiBnb2VzIGhlcmUKICAgICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgICAgZW5kCiAgICAgICAgICAgICAgICBlbmQKIAoxMS8wNS8yMDAyOiBta29lcHBlIAoJICAgIFtNelNjaGVtZV0gQWRkIGFuIGFyZ3VtZW50ICgtZGVjbGFyZW1vZHVsZSkgdGhhdCBnZW5lcmF0ZXMKCSAgICBjb2RlIHRvIGNvcnJlY3RseSBkZWNsYXJlIGEgcHJpbWl0aXZlIG1vZHVsZSBleHRlbnNpb24uCgkgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEJydWNlIEJ1dHRlcmZpZWxkLgoKMTEvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCBwYXRjaCBzdWJtaXR0ZWQgYnkgTWljaGFlbCBDYWhpbGwgdG8gcmVtb3ZlIHVudXNlZCBwYXJhbWV0ZXIKICAgICAgICAgICAgd2FybmluZ3MgZm9yIHRoZSBqZW52IGFuZCBjbHMgcGFyYW1ldGVycy4gVGhpcyBwYXRjaCBhbHNvIGFsc28gYWxsb3dzIG9uZQogICAgICAgICAgICB0byB1c2UgInZvaWQiIGluIHRoZSBqbmkgdHlwZW1hcCBmb3IgYW55IHR5cGUgd2l0aG91dCBjb2RlIGJlaW5nIGdlbmVyYXRlZAogICAgICAgICAgICBhdHRlbXB0aW5nIHRvIHJldHVybiBhIHZhbHVlLgoKMTAvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBcnJheSBoYW5kbGluZyBpcyBkaWZmZXJlbnQuIEFycmF5cyBvZiBjbGFzc2VzIGFyZSBubyBsb25nZXIgd3JhcHBlZAogICAgICAgICAgICB3aXRoIHByb3h5IGFycmF5cywgZWcgd3JhcHBpbmcKCiAgICAgICAgICAgICAgICBjbGFzcyBYIHsuLi59OwogICAgICAgICAgICAgICAgWCBmb29bMTBdOwogICAgICAgICAgICAKICAgICAgICAgICAgdXNlZCB0byBiZSB3cmFwcGVkIHdpdGggdGhlc2UgSmF2YSBnZXR0ZXJzIGFuZCBzZXR0ZXJzOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRGb28oWFtdIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYW10gZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaXMgdmVyeSBpbmVmZmljaWVudCBhcyB0aGUgZW50aXJlIGFycmF5IGlzIGNvcGllZCBudW1lcm91cwogICAgICAgICAgICB0aW1lcyBvbiBlYWNoIGludm9jYXRpb24gb2YgdGhlIGdldHRlciBvciBzZXR0ZXIuIFRoZXNlIGFycmF5cyBhcmUgbm93CiAgICAgICAgICAgIHdyYXBwZWQgd2l0aCBhIHBvaW50ZXIgc28gaXQgaXMgb25seSBwb3NzaWJsZSB0byBhY2Nlc3MgdGhlIGZpcnN0IGFycmF5IGVsZW1lbnQgCiAgICAgICAgICAgIHVzaW5nIGEgcHJveHkgY2xhc3M6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYIHZhbHVlKSB7Li4ufQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBYIGdldEZvbygpIHsuLi59CgogICAgICAgICAgICBBcnJheXMgb2YgZW51bXMgaGF2ZSBhbHNvIGJlZW4gc2ltaWxhcmx5IGNoYW5nZWQuIFRoaXMgYmVoYXZpb3VyIGlzIG5vdyBsaWtlIHRoZSAKICAgICAgICAgICAgb3RoZXIgU1dJRyBsYW5ndWFnZSdzIGltcGxlbWVudGF0aW9uIGFuZCB0aGUgYXJyYXkgbGlicmFyeSBzaG91bGQgYmUgdXNlZCB0byAKICAgICAgICAgICAgYWNjZXNzIHRoZSBvdGhlciBlbGVtZW50cy4gVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcgdGhlIAogICAgICAgICAgICBtYWNyb3MgYW5kIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmksIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbmNsdWRlICJhcnJheXNfamF2YS5pIgogICAgICAgICAgICAgICAgSkFWQV9BUlJBWVNPRkNMQVNTRVMoWCkKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFR3byBuZXcgdHlwZW1hcHMgamF2YWluIGFuZCBqYXZhb3V0IGZvciBnZW5lcmF0aW5nIHRoZSBwcm94eSBjbGFzcyAKICAgICAgICAgICAgYW5kIHR5cGUgd3JhcHBlciBjbGFzcyBtZXRob2QgY2FsbHMgdG8gdGhlIEpOSSBjbGFzcy4gVGhlIG5ldyB0eXBlbWFwcyBhcmUgCiAgICAgICAgICAgIHJlYWxseSB1c2VkIGZvciB0cmFuc2Zvcm1pbmcgdGhlIGpzdHlwZSAodXNlZCBpbiBwcm94eSBjbGFzcyBhbmQgdHlwZSB3cmFwcGVyCiAgICAgICAgICAgIGNsYXNzZXMpIHRvIHRoZSBqdHlwZSAodXNlZCBpbiB0aGUgSk5JIGNsYXNzKSBhbmQgdmlzYSB2ZXJzYS4gQSBqYXZhaW4gdHlwZW1hcAogICAgICAgICAgICBpcyByZXF1aXJlZCB3aGVuZXZlciBhbiBpbiB0eXBlbWFwIGlzIHdyaXR0ZW4gYW5kIHNpbWlsYXJseSBqYXZhb3V0IGZvciBhbiBvdXQKICAgICAgICAgICAgdHlwZW1hcC4gQW4gZXhhbXBsZSBpcyBwcm9iYWJseSBiZXN0IHRvIHNob3cgdGhlbSB3b3JraW5nOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgQ2xhc3MgIkNsYXNzLmdldENQdHIoJGphdmFpbnB1dCkiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhaW4pIHVuc2lnbmVkIHNob3J0ICIkamF2YWlucHV0IgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YW91dCkgQ2xhc3MgKiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcygkam5pY2FsbCwgJG93bmVyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBDbGFzcyB7fTsKICAgICAgICAgICAgICAgICAgICBDbGFzcyAqIGJhcihDbGFzcyBjbHMsIHVuc2lnbmVkIHNob3J0IHVzaCkgeyByZXR1cm4gbmV3IENsYXNzKCk7IH07CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGdlbmVyYXRlZCBwcm94eSBjb2RlIGlzIHRoZW46CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBDbGFzcyBiYXIoQ2xhc3MgY2xzLCBpbnQgdXNoKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xhc3MoZXhhbXBsZUpOSS5iYXIoQ2xhc3MuZ2V0Q1B0cihjbHMpLCB1c2gpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgU29tZSBuZXcgc3BlY2lhbCB2YXJpYWJsZXMgaGF2ZSBiZWVuIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gdXNlIHRoZXNlIHR5cGVtYXBzLgogICAgICAgICAgICBIZXJlICRqYXZhaW5wdXQgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2NscycgYW5kICd1c2gnLiAkam5pY2FsbCBoYXMgYmVlbiByZXBsYWNlZCBieSAKICAgICAgICAgICAgdGhlIG5hdGl2ZSBtZXRob2QgY2FsbCwgJ2V4YW1wbGVKTkkuYmFyKC4uLiknIGFuZCAkb3duZXIgaGFzIGJlZW4gcmVwbGFjZWQgYnkgJ2ZhbHNlJy4KICAgICAgICAgICAgJGphdmFpbnB1dCBpcyBhbmFsb2dvdXMgdG8gdGhlICRpbnB1dCBzcGVjaWFsIHZhcmlhYmxlLiBJdCBpcyByZXBsYWNlZCBieSB0aGUgcGFyYW1ldGVyIG5hbWUuCiAgICAgICAgICAgICRqbmljYWxsIGlzIGFuYWxvZ291cyB0byAkYWN0aW9uIGluICVleGNlcHRpb24uIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBjYWxsIHRvIHRoZSBuYXRpdmUKICAgICAgICAgICAgbWV0aG9kIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgICRvd25lciBpcyByZXBsYWNlZCBieSBlaXRoZXIgdHJ1ZSBpZiAlbmV3b2JqZWN0IGhhcyBiZWVuIHVzZWQgb3RoZXJ3aXNlIGZhbHNlLgoKICAgICAgICAgICAgVGhlIGphdmEuc3dnIGZpbGUgY29udGFpbnMgZGVmYXVsdCBqYXZhaW4gYW5kIGphdm91dCB0eXBlbWFwcyB3aGljaCB3aWxsIHByb2R1Y2UgdGhlIHNhbWUgY29kZQogICAgICAgICAgICBhcyBwcmV2aW91c2x5LiBUaGlzIGNoYW5nZSBpcyBvbmx5IG9mIGNvbmNlcm4gdG8gdGhvc2Ugd2hvIGhhdmUgd3JpdHRlbiB0aGVpciBvd24gdHlwZW1hcHMgYXMKICAgICAgICAgICAgeW91IHdpbGwgdGhlbiBtb3N0IGxpa2VseSBoYXZlIHRvIHdyaXRlIHlvdXIgb3duIGphdmFpbiBhbmQgamF2YW91dCB0eXBlbWFwcy4KCiAgICAgICAgICAgIFRoZSBqYXZhb3V0IHR5cGVtYXAgYWxzbyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgYSBKYXZhIGRvd25jYXN0IHRvIGJlIHVzZWQgb24gYWJzdHJhY3QgCiAgICAgICAgICAgIHByb3h5IGJhc2UgY2xhc3Nlcy4gU2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gb24gZHluYW1pY19jYXN0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTAvMjQvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBVcGdhZGVkIHRvIGxpYnRvb2wgMS40LjMsIHByZXN1bWFibHkgdy8gYmV0dGVyCgkgICAgc3VwcG9ydCBmb3IgbmV3aXNoIHBsYXRmb3JtcyAobGlrZSBNYWNPUyBYKS4KCjEwLzIxLzIwMDI6IHR0bgoJICAgIEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYnVnIC0tIHRoYW5rcyB0byBSaWNoYXJkIENhbG1iYWNoLgoKMTAvMTgvMjAwMjogdHRuCgkgICAgRml4ZWQgdHlwbyBpbiBkb2guaCAtLSB0aGFua3MgdG8gTWF4IEhvcm4uCgpWZXJzaW9uIDEuMy4xNiAoT2N0b2JlciAxNCwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVleHRlbmQgZGlyZWN0aXZlIGFuZCAlZmVhdHVyZSByZXBvcnRlZAogICAgICAgICAgICBieSBXaWxsaWFtIEZ1bHRvbi4KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgT3BlblZNUyBidWlsZCBkaXJlY3RvcnkgKHZtcykuICBDb250cmlidXRlZCBieSAKICAgICAgICAgICAgSmVhbi1GcmFu529pcyBQaWVyb25uZS4KCjEwLzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdGhyb3dzIGNsYXVzZSB0byB0aGUgbmF0aXZlIGZ1bmN0aW9ucyBpbiB0aGUgSk5JIGNsYXNzLgogICAgICAgICAgICBUaGUgdGhyb3dzIGNsYXVzZSBpcyB0aGUgc2FtZSBhcyB0aGUgb25lIGdlbmVyYXRlZCBmb3IgcHJveHkgZnVuY3Rpb25zCiAgICAgICAgICAgIGFuZCBtb2R1bGUgY2xhc3MgZnVuY3Rpb25zLgoKMDkvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIGFuZCBjbGFzc2VzIHRoYXQKICAgICAgICAgICAgd2VyZSBkZWZpbmVkIGJ1dCBub3Qgd3JhcHBlZC4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgTGVzbGllIEJyb29rcywKICAgICAgICAgICAgR2VycnkgV29vZHMsIGFuZCBvdGhlcnMuCgowOS8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFNvbWUgZXJyb3IgY2hlY2tpbmcgYWRkZWQ6CiAgICAgICAgICAgIDEpIE91dE9mTWVtb3J5RXhjZXB0aW9uIGNoZWNrIGluIHRoZSBjaGFyICogdHlwZW1hcHMuIAogICAgICAgICAgICAyKSBBcyBTV0lHIHRyZWF0cyBwb2ludGVycywgcmVmZXJlbmNlcyBhbmQgcGFzc2luZyBieSB2YWx1ZSBhbGwgdGhlCiAgICAgICAgICAgIHNhbWUsIGl0IGlzIHBvc3NpYmxlIHRvIHBhc3MgYSBOVUxMIHBvaW50ZXIgdG8gYSBmdW5jdGlvbiB0aGF0IGV4cGVjdHMKICAgICAgICAgICAgYW4gb2JqZWN0IHBhc3NlZCBieSB2YWx1ZSBvciBieSByZWZlcmVuY2UuIEEgTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgCiAgICAgICAgICAgIG5vdyB0aHJvd24gdW5kZXIgdGhpcyBzY2VuYXJpby4KCjA5LzIwLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2xlYW4iIGFuZCAibWFrZSBpbnN0YWxsIgoJCQkgIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBFeHBsYWluIGhvdyB0byBleHRlbmQgIm1ha2UgaW5zdGFsbCIgdy8gZXh0cmEtaW5zdGFsbC5saXN0LgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGlvbiBvZiB0aGUgImlnbm9yZSIgdHlwZW1hcC4gICBUaGUgImlnbm9yZSIgdHlwZW1hcCBoYXMKICAgICAgICAgICAgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mIGEgZ2VuZXJhbGl6YXRpb24gb2YgdGhlICJpbiIgdHlwZW1hcC4KICAgICAgICAgICAgVG8gaWdub3JlIGFuIGFyZ3VtZW50LCB1c2Ugc29tZXRoaW5nIGxpa2UgdGhpcyBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluLG51bWlucHV0cz0wKSBpbnQgKm91dHB1dCAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgJDEgPSAmdGVtcDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uCiAgICAgICAgICAgIG9mIHRoZSAiaW4iIGFuZCAiaWdub3JlIiB0eXBlbWFwcyAod2hpY2ggd2VyZSBzdXBwb3NlZCB0byBiZQogICAgICAgICAgICBtdXR1YWxseSBleGNsdXNpdmUpLgoKICAgICAgICAgICAgVGhlIHVzZSBvZiB0aGUgbnVtaW5wdXRzIGFyZ3VtZW50IGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICBDdXJyZW50bHksIHZhbHVlcyA+MSB3aWxsIGdlbmVyYXRlIGFuIGVycm9yLiAgSG93ZXZlciwgZnV0dXJlCiAgICAgICAgICAgIHJlbGVhc2VzIG9mIFNXSUcgbWF5IHV0aWxpemUgdGhhdCB0byBzdXBwb3J0IG11bHRpLWlucHV0IHR5cGVtYXBzLgoKICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBzdGlsbCB3b3JrcywgYnV0IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBhbmQgaXMKICAgICAgICAgICAgdHJhbnNsYXRlZCB0byAldHlwZW1hcChpbixudW1pbnB1dHM9MCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDkvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgZm9yIHVubmFtZWQgc3RydWN0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICB9ICpibGFoOwoKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFJvZ2VyIEdpYnNvbi4KICAgICAgICAgICAgTm90ZTogd2UgbWlnaHQgYmUgYWJsZSB0byBnZW5lcmF0ZSB3cmFwcGVycyBpbiBzcGVjaWFsIGNhc2VzLgoKMDkvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBtb2RpZmljYXRpb24gdG8gZ2VuZXJhdGVkIHdyYXBwZXIgZnVuY3Rpb25zLiAgUG9pbnRlciBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICBhbHdheXMgc2V0IHRvIGFuIGluaXRpYWwgdmFsdWUgb2YgMC4gICBTaW1wbGlmaWVzIHR5cGVtYXAgd3JpdGluZyBhbmQgY2xlYW51cAogICAgICAgICAgICBjb2RlIChzaW5jZSB5b3UgY2FuIHJlbHkgb24gemVyby12YWx1ZSBpbml0aWFsaXphdGlvbikuICAgVGhpcyBhbHNvIGdyZWF0bHkKICAgICAgICAgICAgcmVkdWNlcyB0aGUgbmVlZCB0byBldmVyIHdyaXRlIGFuICJhcmdpbml0IiB0eXBlbWFwLgoKMDkvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBzbWFydC1wb2ludGVyIHN1cHBvcnQuICBJZiBvcGVyYXRvci0+KCkKICAgICAgICAgICAgaXMgcGFydCBvZiBhbiBpZ25vcmVkIGJhc2UgY2xhc3MgbGlrZSB0aGlzLAoKICAgICAgICAgICAgICAgICAlaWdub3JlIEJhcjsKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgICAgICAgICAvKiBJZ25vcmVkICovCiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgQmFyIHsgfTsKCiAgICAgICAgICAgIHRoZW4gbWV0aG9kcyBmcm9tIEZvbyBhcmUgc3RpbGwgYXZhaWxhYmxlLiAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgID4+PiBzID0gU3BhbSgpCiAgICAgICAgICAgICAgICAgPj4+IHMuYmxhaCgpCiAgICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgIFRoZSBvbmx5IGNhdGNoIGlzIHRoYXQgdGhlIG9wZXJhdG9yLT4oKSBpdHNlbGYgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgICAgKHNpbmNlIGl0IHdhc24ndCB3cmFwcGVkKS4gICBUaGVyZWZvcmUsIHRoZXJlIHdvbid0IGJlIGFueQogICAgICAgICAgICAgX19kZXJlZl9fKCkgb3BlcmF0aW9uIHVubGVzcyBpdCBpcyBleHBsaWNpdGx5IGFkZGVkIHRvIFNwYW0KICAgICAgICAgICAgIChlaXRoZXIgdXNpbmcgJWV4dGVuZCBvciBqdXN0IHBsYWNpbmcgb3BlcmF0b3ItPigpIGluIHRoZQogICAgICAgICAgICAgZGVmaW5pdGlvbiBvZiBTcGFtKS4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtNZXRob2RvbG9neV0gUmV3b3JrZWQgIm1ha2UgY2hlY2siIHRvIGJlIG1vcmUgdGFibGUgZHJpdmVuLgoJICAgIFtEb2NzXSBEb2N1ZW1lbnRlZCBtZXRob2RvbG9neSBpbiBNYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgowOS8xMS8yMDAyOiB0dG4KCSAgICBbRG9jc10gUHJlZml4ZWQgTWFudWFsLyouaHRtbCB3aXRoICI8IURPQ1RZUEUgaHRtbCAuLi4+IiB0bwoJICAgIHBhbmRlciBkb3RpbmdseSB0byAob3Zlci0pc2Vuc2l0aXZlIGVkaXRvcnMuCgowOS8xMC8yMDAyOiB0dG4KCSAgICBbR3VpbGVdIENvbnZlcnRlZCBFeGFtcGxlcy9ndWlsZS9zaW1wbGUgIm1ha2UgY2hlY2siCgkgICAgYmVoYXZpb3IgdG8gYWN0dWFsbHkgY2hlY2sgZXhlY3V0aW9uIHJlc3VsdHMuICBSZWR1Y2VkCgkgICAgaXRlcmF0aW9uIGNvdW50cyBzbyB0aGF0IHRoZSB0ZXN0IGRvZXNuJ3QgdGFrZSB0b28gbG9uZy4KCjA5LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRy0xLjMuMTUgcmVsZWFzZWQuCgoKVmVyc2lvbiAxLjMuMTUgKFNlcHRlbWJlciA5LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIG5hc3R5IHJ1bnRpbWUgdHlwZSBjaGVja2luZyBidWcgd2l0aCBzdWJ0eXBlcyBhbmQgaW5oZXJpdGFuY2UKICAgICAgICAgICAgYW5kIHRlbXBsYXRlcy4gCgowOS8wOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEphdmEgZXhjZXB0aW9uIGNsYXNzZXMgZm9yIGEgbWV0aG9kJ3MgdGhyb3dzIGNsYXVzZSBjYW4gYmUgZ2VuZXJhdGVkIGJ5IAogICAgICAgICAgICBzcGVjaWZ5aW5nIHRoZW0gaW4gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBpbiB0aGUgdGhyb3dzIGF0dHJpYnV0ZSBpbiBhbnkgb25lCiAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6IGluLCBvdXQsIGNoZWNrLCBmcmVlYXJnLCBhcmdvdXQgYW5kIHRocm93cy4gQSBjbGFzc2ljCiAgICAgICAgICAgIGV4YW1wbGUgd291bGQgYmUgdG8gY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvIGEgc3RhbmRhcmQgSmF2YSBleGNlcHRpb246CgogICAgICAgICAgICAgICAgJXR5cGVtYXAodGhyb3dzLCB0aHJvd3M9ImphdmEuaW8uSU9FeGNlcHRpb24iKSBmaWxlX2V4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgamNsYXNzIGV4Y2VwID0gamVudi0+RmluZENsYXNzKCJqYXZhL2lvL0lPRXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwKQogICAgICAgICAgICAgICAgICAgICAgICBqZW52LT5UaHJvd05ldyhleGNlcCwgJDEud2hhdCgpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJG51bGw7IC8vIG9yIHVzZSBTV0lHX2ZhaWwKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBmaWxlX2V4Y2VwdGlvbiB7Li4ufTsKICAgICAgICAgICAgICAgIHZvaWQgb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSkgdGhyb3coZmlsZV9leGNlcHRpb24pOwoKICAgICAgICAgICAgVGhlIEphdmEgbWV0aG9kIHdpbGwgdGhlbiBiZSBkZWNsYXJlZCB3aXRoIGEgdGhyb3dzIGNsYXVzZToKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbihTdHJpbmcgZmlsZW5hbWUpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsuLi59CgowOS8wOC8yMDAyOiBta29lcHBlCgkgICogW0d1aWxlXSBJbXByb3ZlZCB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgYXJnbGlzdCBubwoJICAgIGxvbmdlciBnZXRzIGNsdXR0ZXJlZCB3aXRoIHR5cGUgc3BlY2lmaWNhdGlvbiwgbWFraW5nIGl0CgkgICAgbW9yZSByZWFkYWJsZS4gIChBbHNvIHRoZSBJTElTUCBmdW5jdGlvbiBDLXUgTS14CgkgICAgYGFyZ2xpc3QtbGlzcCcgUkVUIHdvcmtzIGJldHRlciB0aGlzIHdheS4pICBUaGUgdHlwZXMgb2YKCSAgICBhcmd1bWVudHMgYXJlIGV4cGxhaW5lZCBpbiBhbiBleHRyYSBzZW50ZW5jZSBhZnRlciB0aGUKCSAgICBhcmdsaXN0LiAKCSAgICAKCSAgICBUaGVyZSBhcmUgbm93IHR3byBkb2N1bWVudGF0aW9uLXJlbGF0ZWQgdHlwZW1hcCBhcmd1bWVudHM6CgoJICAgICAgICAldHlwZW1hcChpbiwgZG9jPSIkTkFNRSBpcyBhIHZlY3RvciBvZiBpbnRlZ2VycyIsIAoJCQkgYXJnbGlzdD0iJG5hbWUiKSAgaW50ICpWRUNUT1IgeyAuLi4gfQoJCQkgCiAgICAgICAgICAgIFRoZSAiYXJnbGlzdCIgdGV4dHMgb2YgYWxsIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIG1ha2UgdXAKCSAgICBpdHMgYXJnbGlzdCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gIFRoZSAiZG9jIiB0ZXh0cyBvZiBhbGwKCSAgICBhcmd1bWVudHMgYXJlIGNvbGxlY3RlZCB0byBtYWtlIGEgc2VudGVuY2UgdGhhdCBkZXNjcmliZXMKCSAgICB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4gIFJlYXNvbmFibGUgZGVmYXVsdHMgYXJlCgkgICAgcHJvdmlkZWQuIAoKCSAgICBBcyB1c3VhbCwgJG5hbWUgaXMgc3Vic3RpdHV0ZWQgYnkgdGhlIG5hbWUgb2YgdGhlCgkgICAgYXJndW1lbnQuIFRoZSBuZXcgdHlwZW1hcCB2YXJpYWJsZSAkTkFNRSBpcyBsaWtlICRuYW1lLAoJICAgIGJ1dCBtYXJrZWQtdXAgYXMgYSB2YXJpYWJsZS4gIFRoaXMgbWVhbnMgdGhhdCBpdCBpcwoJICAgIHVwcGVyLWNhc2VkOyBpbiBUZVhpbmZvIG1vZGUgKCItcHJvY2RvY2Zvcm1hdCB0ZXhpbmZvIikgaXQKCSAgICBjb21lcyBvdXQgYXMgQHZhcntuYW1lfS4gCgkgICAgCgkgICAgVGhlIGRpcmVjdGl2ZXMgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICAlbXVsdGlwbGVfdmFsdWVzIG5vdyBhbHNvIGhhdmUgYW4gZWZmZWN0IG9uIHRoZQoJICAgIGRvY3VtZW50YXRpb24uIChUaGlzIGlzIGFjaGlldmVkIHZpYSB0aGUgbmV3IHByYWdtYXMKCSAgICByZXR1cm5fbm90aGluZ19kb2MsIHJldHVybl9vbmVfZG9jLCByZXR1cm5fbXVsdGlfZG9jLikKCgkgICAgRG9jdW1lbnRhdGlvbiBoYXMgYWxzbyBpbXByb3ZlZCBmb3IgdmFyaWFibGVzIHRoYXQgYXJlCgkgICAgd3JhcHBlZCBhcyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVycyAoY29tbWFuZC1saW5lIHN3aXRjaAoJICAgICItZW1pdC1zZXR0ZXJzIikuCgogICAgICAgICAgKiBbR3VpbGVdIEVtaXQgY29uc3RhbnRzIGFzIF9pbW11dGFibGVfIHZhcmlhYmxlcy4gIChUaGlzCiAgICAgICAgICAgIHdhcyBicm9rZW4gcmVjZW50bHkuKQoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gVXBkYXRlZCB0aGUgdHlwZW1hcHMgaW4gbGlzdC12ZWN0b3IuaS4KCjA5LzA3LzIwMDI6IG1rb2VwcGUKCSAgICBTaG9ydC1jaXJjdWl0IHRoZSB0eXBlY2hlY2tzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucy4KCSAgICAoVGhlIGNoYW5nZXMgaW4gY29kZSBnZW5lcmF0aW9uIGFyZSB2aXNpYmxlIGluIHRoZSBuZXcKCSAgICB0ZXN0Y2FzZSAib3ZlcmxvYWRfY29tcGxpY2F0ZWQiLikKCjA5LzA2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29sdXRpb24gZm9yIFsgNTk2NDEzIF0KICAgICAgICAgICAgTmV3IHR5cGVtYXAgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICB3cmFwcGVyIGNvbnN0cnVjdG9yIG1vZGlmaWVyIGNhbiBiZSB0YWlsb3JlZCBieSB1c2Vycy4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgCiAgICAgICAgICAgIHByb3RlY3RlZC4gTm9ybWFsbHkgU1dJRyBnZW5lcmF0ZXMgYSBjb25zdHJ1Y3RvciBsaWtlIHRoaXMgd2hpY2ggY2FuIG9ubHkgCiAgICAgICAgICAgIGJlIGFjY2Vzc2VkIHdpdGhpbiBvbmUgcGFja2FnZToKCiAgICAgICAgICAgICAgcHJvdGVjdGVkIEJhcihsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIElmIHlvdSBhcmUgdXNpbmcgU1dJRyBhY3Jvc3MgbXVsdGlwbGUgcGFja2FnZXMgb3Igd2FudCB0byB1c2UgdGhpcyBjb25zdHJ1Y3RvcgogICAgICAgICAgICBhbnl3YXksIGl0IGNhbiBub3cgYmUgYWNjZXNzZWQgb3V0c2lkZSB0aGUgcGFja2FnZS4gVG8gbW9kaWZ5IHVzZSBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzKSBTV0lHVFlQRSAicHVibGljIgoKICAgICAgICAgICAgdG8gY2hhbmdlIHRvIHB1YmxpYyBmb3IgYWxsIHByb3h5IGNsYXNzZXMgYW5kIHNpbWlsYXJseSBmb3IgYWxsIHR5cGUgd3JhcHBlciBjbGFzc2VzOgogICAgICAgICAgICAKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFLCBTV0lHVFlQRSAqLCBTV0lHVFlQRSAmLCBTV0lHVFlQRSBbXSAicHVibGljIgoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgdHlwZW1hcHMgZm9yIHRoZSBKYXZhIG1vZHVsZS4gQysrIGV4Y2VwdGlvbnMgZ2V0IGNvbnZlcnRlZCBpbnRvCiAgICAgICAgICAgIGphdmEubGFuZy5SdW50aW1lRXhjZXB0aW9uIEphdmEgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIAogICAgICAgICAgICBXYXJuaW5nOiBUaGlzIG1heSBjaGFuZ2UgZnJvbSBqYXZhLmxhbmcuUnVudGltZSBleGNlcHRpb24gaW4gdGhlIGZ1dHVyZS4KCjA5LzA1LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB2YXJpYWJsZXMgZGVjbGFyZWQgYXMgcmVmZXJlbmNlcy4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDUxNjIgXSBUeXBlbWFwIGxvY2FsIHZhcmlhYmxlcy4gUmVwb3J0ZWQgYnkgTHlsZSBKb2huc29uLgoKMDkvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vcmUgdXBkYXRlcyB0byB0aGUgUnVieSBtb2R1bGUgZG9jdW1lbnRhdGlvbiwgaW5jbHVkaW5nCgkgICAgYSBuZXcgdHlwZW1hcCBleGFtcGxlIHRoYXQgZGVtb25zdHJhdGVzIGhvdyB0byBjb2xsZWN0IGtleS12YWx1ZQoJICAgIHBhaXJzIGZyb20gYW4gYXJndW1lbnQgbGlzdCBpbnRvIGEgSGFzaC4KCjA5LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uIGFuZCBjb25zdHJ1Y3RvcnMuCgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBGb288VD4oKSB7IH0KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZXh0cmEgPFQ+IGluIHRoZSBjb25zdHJ1Y3RvciB3YXMgY2FycmllZCB0aHJvdWdoIGluIHRoZQogICAgICAgICAgICBuYW1lLS1jYXVzaW5nIHJ1bnRpbWUgcHJvYmxlbXMgaW4gZ2VuZXJhdGVkIG1vZHVsZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvcmRpIEFybmFiYXQgQmVuZWRpY3RvLgogCjA5LzA1LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIFN1cHBvcnQgb3ZlcmxvYWRpbmcuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlZCB0eXBlbWFwcyBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgdHlwZXMKCSAgICB0byB1c2UgUnVieSAxLjcgc3VwcG9ydCBmb3IgdGhlc2UgdHlwZXMgd2hlbiBhdmFpbGFibGUuCgowOS8wNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgb3V0cHV0IHR5cGVtYXBzIGZvciBjb25zdCByZWZlcmVuY2UgdG8gcHJpbWl0aXZlCgkgICAgdHlwZXMuCgowOS8wNC8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBGaXggcGFzcy1ieS12YWx1ZSB0eXBlbWFwcy4gIFJlcG9ydGVkIGJ5IEFybm8KCSAgICBQZXRlcnMgdmlhIERlYmlhbiBidWd0cmFja2luZyAoIzE1NjkwMiksIHBhdGNoIGJ5IFRvcnN0ZW4KCSAgICBMYW5kc2Nob2ZmIDx0b3JzdGVuQGRlYmlhbi5vcmc+LgoKMDkvMDMvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQoJICAgIEJldHRlciByZWZlcmVuY2Ugc3VwcG9ydC4KCSAgICBGdW5jdGlvbnMgdGhhdCB3YW50IGEgdm9pZCoqIGNhbiB0YWtlIGEgTlVMTCBieSByZWZlcmVuY2UgYW5kCgkgICAgdGhlIHZvaWQqIHdpbGwgYmUgbWFkZSBmb3IgeW91IGFuZCB0aGVuIHBhc3NlZC1ieS1yZWZlcmVuY2UKCgkgICAgQWxzbyBhbGwgaW50ZWdlci1jbGFzcyBuYXRpdmUgdHlwZXMgY2FuIGJlIHBhc3NlZCBieSByZWZlcmVuY2UKCSAgICB3aGVyZSBhbiBpbnQqIG9yIGludCYgZXRjIGlzIG5lZWRlZAoKMDkvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VkIHRoZSBldmFsdWF0aW9uIG9yZGVyIG9mIHByZXByb2Nlc3NvciBtYWNybyBhcmd1bWVudHMuCiAgICAgICAgICAgIEFyZ3VtZW50cyBhcmUgbm93IGV4cGFuZGVkIGJ5IHRoZSBwcmVwcm9jZXNzb3IgKmJlZm9yZSogdGhleQogICAgICAgICAgICBhcmUgcGFzc2VkIHRvIG1hY3JvIGV4cGFuc2lvbi4gIFRoaXMgZml4ZXMgYSBzdWJ0bGUgZXhwYW5zaW9uCiAgICAgICAgICAgIGJ1ZyByZXBvcnRlZCBieSBBbnRob255IEhlYWRpbmcuCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHRoZSBmaWxlIGluY2x1ZGUgb3JkZXIgKGFnYWluLCBhcHBhcmVudGx5KS4gU2VlIDIvMjcvOTkuCgowOS8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsXSBCZXR0ZXIgZXhjZXB0aW9uIGhhbmRsaW5nIHN1cHBvcnQuICBTaW5jZSBQZXJsIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHJlbGllcyBvbiBzZXRqbXAvbG9uZ2ptcCwgd3JhcHBlciBmdW5jdGlvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHNsaWdodGx5CiAgICAgICAgICAgIHRvIHByb3ZpZGUgYW4gZXh0cmEgYmxvY2sgc2NvcGU6CgogICAgICAgICAgICAgICAgWFMoZm9vKSB7CiAgICAgICAgICAgICAgICAgICBjaGFyIF9zd2lnbXNnW1NXSUdfTUFYX0VSUk1TR10gPSAiIjsKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKl9zd2lnZXJyID0gX3N3aWdtc2c7CiAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAvKiBOb3JtYWwgd3JhcHBlciBmdW5jdGlvbiBoZXJlICovCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgIFNXSUdfY3JvYWsoIkFuIGVycm9yIG9jY3VycmVkXG4iKTsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgWFNSRVRVUk4oYXJndmkpOyAgICAgIC8qIFN1Y2Nlc3NmdWwgcmV0dXJuICovCiAgICAgICAgICAgICAgICAgICAgICBmYWlsOgogICAgICAgICAgICAgICAgICAgICAgICAvKiBjbGVhbnVwIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIGNyb2FrKF9zd2lnX2Vycik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgbWFjcm8gU1dJR19jcm9hayh4KSBzZXRzIHRoZSB2YWx1ZSBvZiBfc3dpZ2VyciB0byB4IGFuZAogICAgICAgICAgICBleGVjdXRlcyBhICJnb3RvIGZhaWwiLiAgVGhlIHdob2xlIHdyYXBwZXIgZnVuY3Rpb24gaXMgZW5jbG9zZWQKICAgICAgICAgICAgYmxvY2sgc2NvcGUgdG8gcHJvdmlkZSBwcm9wZXIgY2xlYW51cCBvZiBDKysgb2JqZWN0cy4gIFNpbmNlCiAgICAgICAgICAgIGNyb2FrIGV4ZWN1dGVzIGEgbG9uZ2ptcCgpLCB0aGVyZSBpcyBubyB3YXkgdG8gcHJvcGVybHkgcmVjbGFpbQogICAgICAgICAgICByZXNvdXJjZXMgaWYgdGhpcyBleGVjdXRlcyBpbiB0aGUgc2FtZSBzY29wZSBhcyB0aGUgd3JhcHBlcgogICAgICAgICAgICBmdW5jdGlvbi4KCiAgICAgICAgICAgIFRoZSBfc3dpZ21zZ1tdIHZhcmlhYmxlIGlzIG5vcm1hbGx5IHVudXNlZCwgYnV0IGNhbiBiZSB1c2VkCiAgICAgICAgICAgIHRvIHN0b3JlIHNtYWxsIGVycm9yIG1lc3NhZ2VzIHVzaW5nIHNwcmludGYgb3Igc25wcmludGYuIEl0CiAgICAgICAgICAgIGhhcyBhIGNhcGFjaXR5IG9mIGF0IGxlYXN0IDI1NiBieXRlcyAoU1dJR19NQVhfRVJSTVNHKS4KICAgICAgICAgICAgCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgYmV0dGVyIHN1cHBvcnQgZm9yIGV4Y2VwdGlvbnMuICBJbnN0ZWFkIG9mIHJldHVybmluZyBUQ0xfRVJST1IsCiAgICAgICAgICAgIHVzZSB0aGUgbWFjcm8gU1dJR19mYWlsIHRvIHJldHVybiB3aXRoIGFuIGVycm9yLiAgVGhpcyBlbnN1cmVzIHRoYXQKICAgICAgICAgICAgYXJndW1lbnRzIGFyZSBwcm9wZXJseSBjbGVhbmVkIHVwLiAgRXhjZXB0aW9uIHNwZWNpZmllcnMgYXJlIG5vdwogICAgICAgICAgICBoYW5kbGVkIGJ5IGRlZmF1bHQuCgowOS8wMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVGhlIHR5cGUtY2hlY2tpbmcgc3lzdGVtIGZvciB0aGUgUnVieSBtb2R1bGUgaGFzIGhhZCBhIGZsYXcKCSAgICBpbiB0aGF0IHNvbWUgdHlwZXMgd2hpY2ggc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudAoJICAgIHdlcmVuJ3QuIFRoaXMgYnVnIHdhcyBiZXN0IGRlbW9uc3RyYXRlZCBieSB0aGUgaW5oZXJpdF9taXNzaW5nLmkKCSAgICB0ZXN0IHN1aXRlIGNhc2UsIHdoaWNoIGRlZmluZXMgYSBiYXNlIGNsYXNzICJGb28iIHRoYXQgaXMKCSAgICBzdWJjbGFzc2VkIGJ5ICJCYXIiLiBUaGUgIkZvbyIgY2xhc3MgaXNuJ3QgYWN0dWFsbHkgd3JhcHBlZCAoaS5lLgoJICAgIGl0J3Mgbm90IGRpcmVjdGx5IGFjY2Vzc2libGUgZnJvbSBSdWJ5KSBidXQgd2UnZCBzdGlsbCBsaWtlIHRvIGJlCgkgICAgYWJsZSB0byBwYXNzICJCYXIiIGluc3RhbmNlcyB0byBmdW5jdGlvbnMgZXhwZWN0aW5nIEZvb3MgYW5kIGhhdmUKCSAgICB0aGF0IHdvcms7IGl0IHdhc24ndC4gVGhlIHJldmlzZWQgaW1wbGVtZW50YXRpb24gKHNpbWlsYXIgdG8gdGhhdAoJICAgIHVzZWQgZm9yIHNvbWUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcykgYWRkcyBhIG5ldyBpbnN0YW5jZSB2YXJpYWJsZQoJICAgIChfX3N3aWd0eXBlX18pIHRvIGVhY2ggb2JqZWN0IHRoYXQgaW5kaWNhdGVzIGl0cyBTV0lHIHR5cGU7CgkgICAgdGhhdCBpcywgZWFjaCAiQmFyIiBpbnN0YW5jZSB3aWxsIG5vdyBoYXZlIGEgc3RyaW5nIGluc3RhbmNlCgkgICAgdmFyaWFibGUgY2FsbGVkICJfX3N3aWd0eXBlX18iIHdob3NlIHZhbHVlIGlzICJfcF9CYXIiLgoKICAgICAgICAgICAgVW5sZXNzIGRldmVsb3BlcnMgd2VyZSB0YWtpbmcgYWR2YW50YWdlIG9mIHRoaXMgbG93LWxldmVsCgkgICAgaW1wbGVtZW50YXRpb24gZGV0YWlsLCB0aGV5IHNob3VsZG4ndCBub3RpY2UgYW55IGNvbXBhdGliaWxpdHkKCSAgICBwcm9ibGVtczsgbmV2ZXJ0aGVsZXNzLCBJJ20gbWFya2luZyBpdCBhcyBhICJwb3RlbnRpYWwKCSAgICBpbmNvbXBhdGliaWxpdHkiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8wMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgU0YgQnVnICM2MDMxOTkuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIE9VVFBVVCwgSU5QVVQgYW5kIElOT1VUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIEMrKyAKICAgICAgICAgICAgcmVmZXJlbmNlcy4KCjA4LzI3LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeGVkIGVycm9yIGluICJsaWJfc3RkX3ZlY3RvciIgdGVzdGNhc2UgYW5kCgkgICAgY29tcGlsZXIgd2FybmluZyBpbiAibGliX2NkYXRhIiB0ZXN0Y2FzZS4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgIiVtaXhpbiIgZGlyZWN0aXZlLCB3aGljaCBhbGxvd3MgdGhlIHVzZXIgdG8KCSAgICBzcGVjaWZ5IGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbW9kdWxlIG5hbWVzIHRvIG1peC1pbiB0byBhCgkgICAgY2xhc3MuIFNvLCBmb3IgZXhhbXBsZSwgaWYgeW91J2QgbGlrZSB0byBzcGVjaWZ5IHRoYXQgUnVieSdzCgkgICAgRW51bWVyYWJsZSBtb2R1bGUgc2hvdWxkIGJlIG1peGVkLWluIHRvIHlvdXIgY2xhc3MgRm9vLCB5b3UnZAoJICAgIHdyaXRlOgoJICAgIAoJICAgICAgICAlbWl4aW4gRm9vICJFbnVtZXJhYmxlIjsKCQkKICAgICAgICAgICAgb3IgdG8gc3BlY2lmeSB0aGF0IHRoZSBtb2R1bGVzIEZlZSwgRmllIGFuZCBGbyBzaG91bGQgYmUgbWl4ZWQKCSAgICBpbiB0byBGb286CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkZlZSxGaWUsRm8iOwoJCQoJICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgJWFsaWFzIGRpcmVjdGl2ZSBzbyB0aGF0IG11bHRpcGxlIGFsaWFzZXMKCSAgICBjYW4gYmUgc3BlY2lmaWVkIGZvciBhbiBpbnN0YW5jZSBtZXRob2QgYnkgdXNpbmcgYSBjb21tYS1zZXBhcmF0ZWQKCSAgICBsaXN0IG9mIGFsaWFzZXMuCgowOC8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgInRocm93IiB0eXBlbWFwcyBmb3IgdGhlIFJ1YnkgbW9kdWxlLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBUd28gbmV3IGNvbW1hbmQgbGluZSBvcHRpb25zIGZvciBwcmludGluZyBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgICdzd2lnIC1NJyBsaXN0cyBhbGwgZmlsZSBkZXBlbmRlbmNpZXMuICAnc3dpZyAtTU0nIGxpc3RzCiAgICAgICAgICAgIGRlcGVuZGVuY2llcywgYnV0IGV4Y2x1ZGVzIGZpbGVzIGluIHRoZSBTV0lHIGxpYnJhcnkuIAogICAgICAgICAgICBFeGFtcGxlOgoKICAgICAgICAgICAgICAgJSBzd2lnIC1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3N3aWcuc3dnIFwKICAgICAgICAgICAgICAgIC91MC9iZWF6bGV5L1Byb2plY3RzL2xpYi9zd2lnMS4zL3B5dGhvbi9weXRob24uc3dnIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAgICAlIHN3aWcgLU1NIC1weXRob24gZXhhbXBsZS5pCiAgICAgICAgICAgICAgIGV4YW1wbGVfd3JhcC5jeHg6IFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaSBcCiAgICAgICAgICAgICAgICBleGFtcGxlLmggCgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk3NTk5IF0gdW5pb24gaW4gY2xhc3M6IGluY29ycmVjdCBzY29wZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2MDAxMzIgXSBEZWZhdWx0IGFyZ3VtZW50IHdpdGggbmFtZXNwYWNlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hpYnVrYXdhIFlvc2hpa2kuCiAKMDgvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBBdXRvbWF0aWMgQysrIGV4Y2VwdGlvbiBoYW5kbGluZyBlbmFibGVkIGZvciBhbGwgbGFuZ3VhZ2UgbW9kdWxlcy4gICAgVGhpcyBpcwogICAgICAgICAgICBwcmV0dHkgc2ltcGxlLiAgSWYgeW91IGhhdmUgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGVuIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgIHdyYXBfQmFyX2JsYWgoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMS0+YmxhaCgpOwogICAgICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZvbyAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogInRocm93IiB0eXBlbWFwIGNvZGUgaW5zZXJ0ZWQuICQxID0gX2UgKi8KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKC4uLikgewogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93OwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICBUaGUgInRocm93IiB0eXBlbWFwIGNhbiBiZSB1c2VkIHRvIHJhaXNlIGFuIGVycm9yIGluIHRoZSB0YXJnZXQgCiAgICAgICAgICAgIGxhbmd1YWdlLiAgSXQgY2FuIGRvIGFueXRoaW5nLiAgSGVyZSBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKCJ0aHJvdyIpIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJGb28gZXhjZXB0aW9uIik7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRvIG1ha2UgdGhpcyB3b3JrIGluIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlLCBzaW1wbHkgZGVmaW5lIGEgZmV3IGRlZmF1bHQKICAgICAgICAgICAgInRocm93IiB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIFNXSUdUWVBFICosIGludCwgY29uc3QgY2hhciAqLCBhbmQgYQogICAgICAgICAgICBmZXcgY29tbW9uIGV4Y2VwdGlvbiB0eXBlcy4gICBUaGF0J3MgYWxsIHRoZXJlIGlzIHRvIGl0LgoKICAgICAgICAgICAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBjYW4gYmUgZGlzYWJsZWQgdXNpbmcgLW5vZXhjZXB0IG9yCiAgICAgICAgICAgIHNldHRpbmcgdGhlIE5vRXhjZXB0IGdsb2JhbCB2YXJpYWJsZSB0byAxLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFsgUHl0aG9uIF0KICAgICAgICAgICAgQXV0b21hdGljIHRyYW5zbGF0aW9uIG9mIEMrKyBleGNlcHRpb24gc3BlY2lmaWNhdGlvbnMgaW50byBlcnJvciBoYW5kbGluZyBjb2RlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KEZvbyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIEZvbyBpcyB3cmFwcGVkIGFzIGEgY2xhc3NpYy1zdHlsZSBjbGFzcyAoY29tcGF0aWJsZQogICAgICAgICAgICB3aXRoIGV4Y2VwdGlvbiBoYW5kbGluZykuICBGdXJ0aGVybW9yZSwgeW91IGNhbiB3cml0ZSBQeXRob24gY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgYi5ibGFoKCk7CiAgICAgICAgICAgICAgICBleGNlcHQgRm9vLGU6ICAgICAjIE5vdGUgdXNlIG9mIGV4Y2VwdGlvbiBjbGFzcyBoZXJlIQogICAgICAgICAgICAgICAgICAgICMgSGFuZGxlIEZvbyBlcnJvcgogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlIG9iamVjdCAiZSIgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGlzIGp1c3QgYSB3cmFwcGVkIEZvbwogICAgICAgICAgICBvYmplY3QuICBBY2Nlc3MgaXQgbGlrZSBhIG5vcm1hbCBvYmplY3QuCgogICAgICAgICAgICBJZiBhbiBleGNlcHRpb24gaXMgbm90IHdyYXBwZWQgYXMgYSBjbGFzcywgYSBSdW50aW1lRXJyb3IKICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHJhaXNlZC4gIFRoZSBhcmd1bWVudCB0byB0aGlzIGV4Y2VwdGlvbiBpcwogICAgICAgICAgICB0aGUgZXhjZXB0aW9uIG9iamVjdC4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIHRocm93KGludCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYiA9IEJhcigpCiAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3IsZToKICAgICAgICAgICAgICAgICAgIHByaW50IGUuYXJnc1swXSAgICAgICAjIEludGVnZXIgZXhjZXB0aW9uIHZhbHVlCgogICAgICAgICAgICBDb21tZW50czoKCiAgICAgICAgICAgICAgICAtICBJZiBhIGNsYXNzIGlzIHVzZWQgYXMgYW4gZXhjZXB0aW9uLCBpdCAqbXVzdCogYmUgd3JhcHBlZAogICAgICAgICAgICAgICAgICAgYXMgYSBQeXRob24gY2xhc3NpYy1zdHlsZSBjbGFzcyAobmV3IGNsYXNzZXMgZG9uJ3Qgd29yaykuCgogICAgICAgICAgICAgICAgLSAgQXV0b21hdGljIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBjb21wYXRpYmxlIHdpdGggJWV4Y2VwdGlvbi4KCiAgICAgICAgICAgICAgICAtICBVc2UgLW5vZXhjZXB0IHRvIHR1cm4gb2ZmIHRoaXMgZmVhdHVyZS4KCiAgICAgICAgICAgICAgICAtICBUaGUgbmV3bHkgaW50cm9kdWNlZCAidGhyb3ciIHR5cGVtYXAgaXMgdXNlZCB0byByYWlzZQogICAgICAgICAgICAgICAgICAgUHl0aG9uIGVycm9ycyAobmF0dXJhbGx5KS4KCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgowOC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluZm9ybWF0aW9uIGZyb20gdGhyb3coKSBzcGVjaWZpZXJzIGlzIG5vdyBzdG9yZWQgaW4gdGhlIHBhcnNlCiAgICAgICAgICAgIHRyZWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHRocm93KHNwYW0sYmFyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBzdG9yZWQgaW5mb3JtYXRpb24gaXMgZnVsbHkgY29ycmVjdGVkIGZvciBuYW1lc3BhY2VzIGFuZCB3b3JrcwogICAgICAgICAgICB3aXRoIHRlbXBsYXRlcy4gIFVzZXMgd2lsbCBmb2xsb3cuCiAgICAgICAgICAgIAowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vIGxvbmdlciBhcHBsaWVkIHRvIG1lbWJlciBhY2Nlc3MKICAgICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSwgaW4gdGhpcyBjb2RlCgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCh3aGF0ZXZlcikgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gaGFuZGxpbmcgY29kZSBpcyBub3QgYXBwbGllZCB0byBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgICAgZm9yIEZvbzo6eC4gICBUaGlzIHNob3VsZCByZWR1Y2UgdGhlIGFtb3VudCBvZiBleHRyYSBjb2RlCiAgICAgICAgICAgIGdlbmVyYXRlZC4KCiAgICAgICAgICAgIENhdmVhdDogIEV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlICppcyogdXNlZCB3aGVuIGF0dHJpYnV0ZXMgYXJlCiAgICAgICAgICAgIGFjY2Vzc2VkIHRocm91Z2ggYSBzbWFydC1wb2ludGVyIG9yIGEgc3ludGhlc2l6ZWQgYXR0cmlidXRlZAogICAgICAgICAgICBhZGRlZCB3aXRoICVleHRlbmQgaXMgdXNlZC4KCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSBtb3JlIHBhdGNoZXMgdG8gaG9wZWZ1bGx5IGVsaW1pbmF0ZSBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyBTV0lHIAogICAgICAgICAgICBhcyBhIDY0LWJpdCBleGVjdXRhYmxlLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGNvbnN0IHJlZmVyZW5jZSBtZW1iZXJzLCB2YXJpYWJsZXMsIGFuZCBzdGF0aWMgbWVtYmVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCAmcmVmOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgdHJ5aW5nIHRvIGdlbmVyYXRlICJzZXQiIGZ1bmN0aW9ucyB3aGljaCB3b3VsZG4ndCBjb21waWxlLiAKCjA4LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFkZSB0aGUgd2FybmluZyBtZXNzYWdlIGZvciAiQ2xhc3MgWCBtaWdodCBhYnN0cmFjdCIgb2ZmIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIEVuYWJsZSB3aXRoIC1XYWxsLgoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIGhhbmRsaW5nIG9mIGNvbnN0IGFuZCBub24tY29uc3Qgb3ZlcmxvYWRlZCBtZXRob2RzLiAgSWYKICAgICAgICAgICAgYSBjbGFzcyBkZWZpbmVzIGEgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGludCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGVuIHRoZSBub24tY29uc3QgbWV0aG9kIGlzICphbHdheXMqIHNlbGVjdGVkIGluIG92ZXJsb2FkaW5nIGFuZAogICAgICAgICAgICB0aGUgY29uc3QgbWV0aG9kIHNpbGVudGx5IGRpc2NhcmRlZC4gIElmIHJ1bm5pbmcgd2l0aCAtV2FsbCwgYSB3YXJuaW5nCiAgICAgICAgICAgIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgowOC8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciB1c2luZyBkZWNsYXJhdGlvbnMgYW5kIGluaGVyaXRhbmNlLiAgIENvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBibGFoKGRvdWJsZSB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vQmFyIDogcHVibGljIEZvbywgcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICBjaGFyICpibGFoKGNoYXIgKngpOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgICAgICAgdXNpbmcgQmFyOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBTV0lHIHdyYXBzIEZvb0Jhcjo6YmxhaCBhcyBhbiBvdmVybG9hZGVkIG1ldGhvZCB0aGF0IHVzZXMgYWxsCiAgICAgICAgICAgIGFjY2Vzc2libGUgdmVyc2lvbnMgb2YgYmxhaCgpLiAgU2VlIHNlY3Rpb24gMTUuMi4yIGluIFN0cm91c3RydXAsIDNyZCBFZC4KCiAgICAgICAgICAgIFNXSUcgYWxzbyBzdXBwb3J0cyBhY2Nlc3MgY2hhbmdlIHRocm91Z2ggdXNpbmcgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKGludCB4KTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHVzaW5nIEZvbzo6eDsKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjpibGFoOwogICAgICAgICAgICAgICAgfTsKCgogICAgICAgICAgICBDYXZlYXQ6ICAgU1dJRyBkb2VzIG5vdCBhY3R1YWxseSBjaGVjayB0byBzZWUgaWYgZGVjbGFyYXRpb25zIGltcG9ydGVkCiAgICAgICAgICAgIHZpYSAndXNpbmcnIGFyZSBpbiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiAgSWYgdGhpcyBvY2N1cnMsIHRoZQogICAgICAgICAgICB3cmFwcGVyIGNvZGUgd29uJ3QgY29tcGlsZSBhbnl3YXlzLS0tbm90IHN1cmUgaXQncyB3b3J0aCB3b3JyeWluZyBhYm91dC4KICAgICAgICAgIAowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIG92ZXJsb2FkaW5nIGRpc3BhdGNoIHRvIG5vdCBpbmNsdWRlIG5vZGVzIHdpdGggYW4gImVycm9yIiBhdHRyaWJ1dGUuCiAgICAgICAgICAgIEEgbGFuZ3VhZ2UgbW9kdWxlIGNhbiBzZXQgdGhpcyBpZiBhIG5vZGUgY291bGRuJ3QgYmUgd3JhcHBlZCBhbmQgeW91IGRvbid0IHdhbnQKICAgICAgICAgICAgaXQgaW5jbHVkZWQgaW4gdGhlIGRpc3BhdGNoIGZ1bmN0aW9uLgoKMDgvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudCB0byBvdmVybG9hZGVkIGZ1bmN0aW9uIGRpc3BhdGNoLiAgIFRoZSBkaXNwYXRjaGVyIGlzIG5vdyBhd2FyZSBvZgogICAgICAgICAgICBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7IH07CiAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbShGb28gKmYpOwogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkaXNwYXRjaGVyIHJlLW9yZGVycyB0aGUgZnVuY3Rpb25zIHNvIHRoYXQgc3BhbShCYXIgKmIpIGlzCiAgICAgICAgICAgIGNoZWNrZWQgZmlyc3QtLS1pdCBpcyBtb3JlIHNwZWNpZmljIHRoYW4gc3BhbShGb28gKmYpLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAtV2Vycm9yIGNvbW1hbmQgbGluZSBvcHRpb24uICAgSWYgc3VwcGxpZWQsIHdhcm5pbmcgbWVzc2FnZXMgYXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgZXJyb3JzIGFuZCBTV0lHIHdpbGwgcmV0dXJuIGEgbm9uLXplcm8gZXhpdCBjb2RlLgoKMDgvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU5NjEzNSBdIFR5cGVkZWYgb2YgcmVmZXJlbmNlIGNhbid0IGNvbXBpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgJkludFJlZjsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhJbnRSZWYgaSk7CgogICAgICAgICAgICBTV0lHLTEuMy4xNCBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUuCgpWZXJzaW9uIDEuMy4xNCAoQXVndXN0IDEyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgU3RhdGljIGNvbnN0IG1lbWJlcnMgaW5pdGlhbGl6ZWQgZHVyaW5nIGRlY2xhcmF0aW9uLCBhbmQKCSAgICBvbmx5IHRoZW0sIGllOgoKCSAgICBzdHJ1Y3QgQQoJICAgIHsJCSAKCQlzdGF0aWMgY29uc3QgaW50IGEgPSAxIDsgIC8vIHRoaXMgb25lCgkJc3RhdGljIGNvbnN0IGludCBiOyAgICAgICAvLyBub3QgdGhpcyBvbmUKICAgICAgICAgICAgfTsgICAgIAoKCSAgICBhcmUgZW1pdHRlZCBsaWtlIGNvbnN0YW50cyAoZXF1aXZhbGVudCB0byBlbnVtcyBvcgoJICAgIGV4cGxpY2l0ICVjb25zdGFudCkuCgkgICAgCgkgICAgVGhpcyBpcyBiZWNhdXNlIHRoZXkgY2Fubm90IGJlIGFkZGVkIGRpcmVjdGx5IHRvICdjdmFyJwoJICAgIHNpbmNlIHRoZXkgbGFjayB0aGUgbmVlZGVkIHJlZmVyZW5jZSAod2VsbCwgeW91IGNhbiBmb3JjZQoJICAgIHRoZW0gdG8gaGF2ZSBhIHJlYWwgcmVmZXJlbmNlLCBidXQgaW4gYW4gdWdseSB3YXkgd2hpY2gKCSAgICBnb2VzIGNvbXBsZXRlbHkgYWdhaW4gdGhlIG9yaWdpbmFsIHB1cnBvc2Ugb2YgaW5pdGlhbGl6ZQoJICAgIHRoZW0gZHVyaW5nIGRlY2xhcmF0aW9uLCB5b3UgYWxzbyBoYXZlIHRvIGRlYWwgd2l0aCBleHRyYQoJICAgIGxpbmtpbmcgbWF0dGVycywgYW5kIGl0IHRha2UgYSB3aGlsZSB0byBmaWd1cmUgb3V0IHdoYXQgaXMKCSAgICB0aGUgcHJvYmxlbSBhbmQgaG93IHRvIHNvbHZlIGl0KS4KCSAgICAKCSAgICBQbGVhc2UgdGVzdCBpdCB3aXRoIHlvdXIgcHJlZmVycmVkIHRhcmdldCBsYW5ndWFnZSwgYW5kCgkgICAgbm90IG9ubHkgdGhlIGNvZGUgZ2VuZXJhdGlvbiwgYnV0IHJlYWxseSBydW4gdGhlIGV4YW1wbGUKCSAgICBpbiB0aGUgdGVzdC1zdWl0ZSAoc3RhdGljLWNvbnN0LW1lbWJlci0yLmkpIGJlY2F1c2UgdGhlCgkgICAgcHJvYmxlbSBhbmQgdGhlIHNvbHV0aW9uIGNhbm5vdCBiZSAiZnVsbHkiIGFwcHJlY2lhdGVkCgkgICAgdW50aWwgeW91IHRyeSB0byBsb2FkIHRoZSBtb2R1bGUgYW5kIHJ1biBpdC4KCgkgICAgSW4gc29tZSB0YXJnZXQgbGFuZ3VhZ2VzIChweXRob24gc3BlY2lhbGx5KSwgdGhpcyBjYW4KCSAgICBwcm9kdWNlcyBhIGRpZmZlcmVuY2UgaW4gdGhlIHdheSB0aGF0IHRoZSBzdGF0aWMgY29uc3RhbnQKCSAgICBtZW1iZXJzICdhJyBhbmQgJ2InIGFyZSBpbnRlcm5hbGx5IHdyYXBwZWQuIEhvcGVmdWxseSwKCSAgICB0aGV5IHN0aWxsIGNhbiBiZSBhY2Nlc3NlZCBpbiB0aGUgc2FtZSB3YXkuCgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gTm93IHN0YXRpYyBjb25zdCBtZW1iZXJzIGNhbiBiZSBhY2Nlc3NlZCBpbiBhIG1vcmUKCSAgICBuYXR1cmFsIHdheSwgaWUsIGlmIHlvdSBoYXZlCgoJICAgIHN0cnVjdCBBCiAgICAgICAgICAgICB7CQkgCgkJdHlwZWRlZiB1bnNpZ25lZCBpbnQgdmlld2ZsYWdzOwoJCXN0YXRpYyBjb25zdCB2aWV3ZmxhZ3MgZm9yd2FyZF9maWVsZCA9IDA7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBiYWNrd2FyZF9maWVsZDsKICAgICAgICAgICAgfTsgICAgIAoJICAgIAoJICAgIG5vdyB5b3UgY2FuIGRvOgoKCQlwcmludCBBLmJhY2t3YXJkX2ZpZWxkCgoJICAgIGFuZCBhbHNvCgoJICAgICAgICBhID0gQSgpCgkJcHJpbnQgYS5mb3J3YXJkX2ZpZWxkCgkJCgkgICAgTm90ZSB0aGF0IGlmIHRoZSBzdGF0aWMgY29uc3QgbWVtYmVycyBkb24ndCBoYXZlIGFuCgkgICAgaW5pdGlhbGl6ZXIgKGxpa2UgYmFja3dhcmRfZmllbGQpLCBzdGlsbCB5b3UgY2FuIGFjY2VzcwoJICAgIHRoZW0gaW4gdGhlIHNhbWUgd2F5IGluIHRoZSBweXRob24gc2lkZSwgYnV0IHRoZQoJICAgIGltcGxlbWVudGF0aW9uIGlzIGEgcXVpdGUgZGlmZmVyZW50OiBiYWNrd2FyZF9maWVsZCB3aWxsCgkgICAgc3RpbGwgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSwgYW5kIGFsc28sIHlvdSBhcmUgCgkgICAgcmVzcG9uc2libGUgdG8gaW5pdGlhbGl6ZSBpdCBpbiBzb21lIGNvZGUgdW5pdCwgYW5kIGxpbmsgaXQKCSAgICBwcm9wZXJseS4gZm9yd2FyZF9maWVsZCwgYnkgdGhlIG90aGVyIGhhbmQsIHdpbGwgbm90CgkgICAgYXBwZWFyIGluIHRoZSBjdmFyIGVudGl0eSBidXQgb25seSBhcyBhIEEgbWVtYmVyLCBzaW1pbGFyCgkgICAgdG8gd2hhdCBoYXBwZW4gd2l0aCBlbnVtIG9yICVjb25zdGFudCBtZW1iZXJzLgoKMDgvMTEvMjAwMjogbW1hdHVzCgkgICAgW3B5dGhvbl0gQ29tbW9uIGNvZGUgaW4gdGhlIF9fc2V0YXR0cl9fL19fZ2V0YXR0cl9fIG5vdwoJICAgIGdvZXMgdG8gdHdvICJmcmVlIiBtZXRob2RzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHByb3h5CgkgICAgZmlsZSwgZnJvbSB3aGVyZSBlYWNoIGNsYXNzIHVzZSBpdC4gVGhpcyBjaGFuZ2UgcmVkdWNlcwoJICAgIHRoZSBzaXplIG9mIHRoZSBwcm94eSBmaWxlLCBzcGVjaWFsbHkgaWYgeW91IHdyYXAgYSBsb3Qgb2YKCSAgICBzbWFsbCBjbGFzc2VzIGluIG9uZSBtb2R1bGUgKHVwIHRvIDMzJSBpbiBzb21lIGNhc2VzKSwKCSAgICBtYWtpbmcgaXQgZmFzdGVyIHRvIGxvYWQgdG9vLgoKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIElmIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGNoYXIgKiByZXR1cm5zIE5VTEwsCiAgICAgICAgICAgIHVuZGVmIGlzIHJldHVybmVkIHRvIHRoZSBQZXJsIGludGVycHJldGVyLgogCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IHRvIGNvbnZlcnNpb24gb3BlcmF0b3JzIGFuZCBuYW1lc3BhY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vKigpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGUgd3JhcHBlciBjb2RlLCBTV0lHIHdhcyB1c2luZyAtPm9wZXJhdG9yIEZvbyooKQogICAgICAgICAgICB3aGVuIGl0IHNob3VsZCBoYXZlIGJlZW4gdXNpbmcgLT5vcGVyYXRvciBuczo6Rm9vKigpLgoKICAgICAgICAgICAgTm90ZTogaWYgdXNpbmcgJXJlbmFtZSB3aXRoIGEgY29udmVyc2lvbiBvcGVyYXRvciwgeW91CiAgICAgICAgICAgIG1pZ2h0IGhhdmUgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVyZW5hbWUodG9Gb29QdHIpIG5zOjpvcGVyYXRvciBuczo6Rm9vKigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgXl5eXiBub3RlIGV4dHJhIHF1YWxpZmllcgogICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgCjA4LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gTWlub3IgZW5oYW5jZW1lbnQgdG8gJ2NvbnN0JyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgICBOb3JtYWxseSBjb25zdCBkZWNsYXJhdGlvbnMgYXJlIHdyYXBwZWQgYXMgcmVhZC1vbmx5IHZhcmlhYmxlcwogICAgICAgICAgICBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCB0aGUgY3ZhciBhdHRyaWJ1dGUgKHNlZSBTV0lHLmh0bWwgZm9yCiAgICAgICAgICAgIGEgZGlzY3Vzc2lvbiBvZiB3aHkpLiAgSG93ZXZlciwgaW4gbWFueSBwcm9ncmFtcywgImNvbnN0IiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zIG1heSBqdXN0IGJlIGNvbnN0YW50cy0tLW1ha2luZyB0aGUgY3Zhci4gYWNjZXNzCiAgICAgICAgICAgIGF3a3dhcmQuICBUbyBmaXggdGhpcywgImNvbnN0IiBkZWNsYXJhdGlvbnMgYXJlIG5vdyBhdmFpbGFibGUKICAgICAgICAgICAgYm90aCB0aHJvdWdoIGN2YXIuIGFuZCBhcyBhIHNpbXBsZSBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNvbnN0IGludCBGT08gPSA0MjsKCiAgICAgICAgICAgIEluIFB5dGhvbjoKCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuY3Zhci5GT08KICAgICAgICAgICAgICAgICA0MgogICAgICAgICAgICAgICAgID4+PiBwcmludCBleGFtcGxlLkZPTwogICAgICAgICAgICAgICAgIDQyCgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHZhbHVlIG9mIGEgImNvbnN0IiB2YXJpYWJsZQogICAgICAgICAgICBtaWdodCBjaGFuZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY2hhciAqY29uc3QgQkFSID0gIkhlbGxvIFdvcmxkIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHBvaW50ZXIgaXRzZWxmIGNhbiBub3QgY2hhbmdlLCBidXQgdGhlIAogICAgICAgICAgICBkYXRhIGJlaW5nIHBvaW50ZWQgdG8gY291bGQgYmUgbW9kaWZpZWQuICBJbiB0aGVzZSBzaXR1YXRpb25zLAogICAgICAgICAgICBjdmFyLkJBUiBzaG91bGQgYmUgYWNjZXNzZWQgdG8gb2J0YWluZWQgdGhlIGN1cnJlbnQgdmFsdWUuCgowOC8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIEZpeGVkIGdlbmVyYXRpb24gb2YgdGhlIHByb3h5IGNvZGUgKC5weSBmaWxlcykgdG8gbW9yZQogICAgICAgICAgICBjbG9zZWx5IGZvbGxvdyB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb25zIGFzIHRoZXkgYXBwZWFyIGluCiAgICAgICAgICAgIHRoZSAuaSBmaWxlLiAgIEluIHRoZSBwYXN0LCBhbGwgb2YgdGhlIGNsYXNzIHdyYXBwZXJzIGFwcGVhcmVkCiAgICAgICAgICAgIGZpcnN0LCBmb2xsb3dlZCBieSBmdW5jdGlvbiBzdHVicywgaW5zZXJ0ZWQgUHl0aG9uIGNvZGUsIGFuZAogICAgICAgICAgICBvdGhlciBkZXRhaWxzLgoKMDgvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eSBtZXRob2QgX2RlbGV0ZSgpIGNoYW5nZWQgdG8gZGVsZXRlKCkuIFRoZXJlIHNob3VsZG4ndCBldmVyCiAgICAgICAgICAgIGJlIGEgd3JhcHBlZCBmdW5jdGlvbiBjYWxsZWQgZGVsZXRlKCkgYXMgaXQgaXMgYSBDKysga2V5d29yZCBhbmQgdGhlcmUKICAgICAgICAgICAgaXMgbm8gc3VjaCB0aGluZyBhcyBhIG1lbWJlciBmdW5jdGlvbiBpbiBDLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IGFkZGluZyB0aGUgZnVuY3Rpb24gYmFjayBpbgogICAgICAgICAgICBmb3IgYWxsIHByb3h5IGNsYXNzZXM6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHB1YmxpYyB2b2lkIF9kZWxldGUoKSB7CiAgICAgICAgICAgICAgICBkZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBKYXZhIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHN1bW1hcnkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgY2hhbmdlcyB0aGF0IGhhdmUgYmVlbiBtYWRlIGluIGltcHJvdmluZyB0aGUgSmF2YSBtb2R1bGUgCiAgICAgICAgICAgIGZvciB2ZXIgMS4zLjE0LiAgSWYgYXQgYWxsIHBvc3NpYmxlIGNoYW5nZSB5b3VyIGNvZGUgdG8gdGFrZSBhZHZhbnRhZ2VzIG9mIHRoZSAKICAgICAgICAgICAgaW1wcm92ZW1lbnRzLiBJZiB5b3Ugd2VyZSB1c2luZyBwcm94eSBjbGFzc2VzIHlvdSBtYXkgbm90IG5vdGljZSBhbnkgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IGlzc3Vlcy4gSGVyZSBpcyBhbiBleGFtcGxlIHdoaWNoIHdpbGwgaGVscCB3aXRoIG1vc3QgYmFja3dhcmRzIAogICAgICAgICAgICBjb21wYXRpYmlsaXR5IHByb2JsZW1zIHdoZXJlIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBtb2RpZnkgdGhlIGNvZGUgdGhhdCB1c2VzCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgb3V0cHV0OgoKICAgICAgICAgICAgUmVwbGFjZToKICAgICAgICAgICAgICAgICVtb2R1bGUgbW9kdWxlbmFtZQoKICAgICAgICAgICAgV2l0aDoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibW9kdWxlbmFtZSIpIG1vZHVsZW5hbWU7CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnM9InB1YmxpYyI7CgogICAgICAgICAgICBUaGUgcHJveHkgY29uc3RydWN0b3JzIHRoYXQgdG9vayBwYXJhbWV0ZXJzIChsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikKICAgICAgICAgICAgd2VyZSBwdWJsaWMgYW5kIGFyZSBub3cgcHJvdGVjdGVkLiBJZiB5b3Ugd2VyZSBtYWtpbmcgdXNlIG9mIHRoZXNlIHRoZW4geW91J2xsIAogICAgICAgICAgICBoYXZlIHRvIG1vZGlmeSB5b3VyIGNvZGUgYW5kIHRoZSBiZXN0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIHVzZSB0aGUgbmV3IHR5cGUgCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFRoZSBvdGhlciBtYWluIGFyZWFzIGFyZSB0aGUgcHJhZ21hcyBhbmQgZ2xvYmFsIHZhcmlhYmxlIHdyYXBwaW5nLiBSZXBsYWNlIAogICAgICAgICAgICB0aGUgcHJhZ21hcyB3aXRoIG9uZSBvZiB0aGUgbmV3IGRpcmVjdGl2ZXMgb3IgdHlwZW1hcHMgbWVudGlvbmVkIGJlbG93IGFuZCB1c2UKICAgICAgICAgICAgJXJlbmFtZSBvbiB0aGUgdmFyaWFibGVzLgoKICAgICAgICAgICAgSWYgeW91IHdlcmUgbm90IHVzaW5nIHByb3h5IGNsYXNzZXMsIHlvdSB3aWxsIGhhdmUgdG8gZGVmaW5lIGEganN0eXBlIHR5cGVtYXAKICAgICAgICAgICAgYXMgd2VsbCBhcyBhIGp0eXBlIHR5cGVtYXAuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3Igd3JhcHBpbmcgdHdvIGRpbWVuc2lvbiBhcnJheSB2YXJpYWJsZXMuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsXQogICAgICAgICAgICBPYmplY3QgbWFuYWdlbWVudCBub3cgaGFzIGEgbXVjaCBiZXR0ZXIgc2Vuc2Ugb2Ygb3duZXJzaGlwLgogICAgICAgICAgICBPd25lcnNoaXAgYml0cyBpcyBjaGFuZ2VkIHdoZW5ldmVyIGFuIG9iamVjdCBpcyBzdG9yZWQgaW4gYQogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgb3Igc3RydWN0dXJlIG1lbWJlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB2YWw7CiAgICAgICAgICAgICAgICAgICAgRm9vICpuZXh0OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdyBpbiBQeXRob24KCiAgICAgICAgICAgICAgID4+PiBmID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGYudGhpc293bgogICAgICAgICAgICAgICAxCiAgICAgICAgICAgICAgID4+PiBnID0gRm9vKCkKICAgICAgICAgICAgICAgPj4+IGcubmV4dCA9IGYgICAgICAgICAgIyBBc3NpZ24gYSBwb2ludGVyCiAgICAgICAgICAgICAgID4+PiBmLnRoaXNvd24gICAgICAgICAgICMgTm90aWNlIG93bmVyc2hpcCBjaGFuZ2UKICAgICAgICAgICAgICAgMAogICAgICAgICAgICAgICA+Pj4KCiAgICAgICAgICAgIFRoaXMgc2NoZW1lIGlzIG1vc3RseSBhIGNvbnNlcnZhdGl2ZSBoZXVyaXN0aWMgZGVzaWduZWQgdG8gCiAgICAgICAgICAgIHByb3ZpZGUgc2VnbWVudGF0aW9uIGZhdWx0cy4gIEl0IGNvdWxkIGNhdXNlIGEgbWVtb3J5IGxlYWsKICAgICAgICAgICAgaWYgb3duZXJzaGlwIGlzIGNoYW5nZWQgdW5uZWNlc3NhcmlseS4gIEluIHRoaXMgY2FzZSwgeW91IGNhbgogICAgICAgICAgICBlaXRoZXIgd3JpdGUgYSB0eXBlbWFwICh0aGF0IGRvZXNuJ3QgY2hhbmdlIG93bmVyc2hpcCksIG9yCiAgICAgICAgICAgIG1hbnVhbGx5IHNldCB0aGUgdGhpc293biBhdHRyaWJ1dGUgYmFjayB0byAxLgoKMDgvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBNYWpvciB1c2FiaWxpdHkgaW1wcm92ZW1lbnRzIHRvIHRoZSBvYmplY3QgaW50ZXJmYWNlLgogICAgICAgICAgICBTdXBwb3NlIHlvdSBoYWQgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyAKICAgICAgICAgICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdm9pZCAgYmxhaChGb28gKmYpOwoKICAgICAgICAgICAgSW4gcGFzdCB2ZXJzaW9ucyBvZiBTV0lHLCB5b3UgY291bGQgY3JlYXRlIG9iamVjdHMgYW5kIHVzZQogICAgICAgICAgICB0aGVtIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlIEZvbyBmCiAgICAgICAgICAgICAgICAlIGYgY29uZmlndXJlIC14IDMKICAgICAgICAgICAgICAgICUgZiBzcGFtCiAgICAgICAgICAgICAgICAzNwogICAgCiAgICAgICAgICAgIFRoZSBvbmx5IHByb2JsZW0gaXMgdGhhdCBpZiB5b3UgdHJpZWQgdG8gY2FsbCBibGFoKCksIGl0IGRpZG4ndAogICAgICAgICAgICB3b3JrOgoKICAgICAgICAgICAgICAgICUgYmxhaCBmCiAgICAgICAgICAgICAgICBUeXBlIEVycm9yLiBFeHBlY3RlZCBfcF9Gb28KICAgICAgICAgICAgICAgICUKCiAgICAgICAgICAgIEluc3RlYWQsIHlvdSBoYWQgdG8gZG8gdGhpczoKCiAgICAgICAgICAgICAgICAlIGJsYWggW2YgY2dldCAtdGhpc10KICAKICAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBleHRyYWN0cyB0aGUgLXRoaXMgcG9pbnRlciwgYXZvaWRpbmcgdGhpcwogICAgICAgICAgICBwcm9ibGVtLiAgVGhpcyBtZWFucyB0aGF0IHNheWluZyAiYmxhaCBmIiBpcyBwZXJmZWN0bHkgbGVnYWwgYW5kCiAgICAgICAgICAgIGV2ZXJ5dGhpbmcgd2lsbCBzdGlsbCB3b3JrIG5vcm1hbGx5LgoKICAgICAgICAgICAgQ2F2ZWF0OiBTaW5jZSBwb2ludGVyIHN0cmluZ3Mgc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZSAoXyksCiAgICAgICAgICAgIGRvbid0IHVzZSB0aGlzIGluIG9iamVjdCBuYW1lcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICUgRm9vIF9mIAogICAgICAgICAgICAgICAgJSBibGFoIF9mICAgICAgICAjIFBvdGVudGlhbCBjcmFzaAoKICAgICAgICAgICAgT2JqZWN0cyBub3cgaGF2ZSBhIC10aGlzb3duIGF0dHJpYnV0ZSB0aGF0IHNob3dzIHRoZSBvd25lcnNoaXAuCiAgICAgICAgICAgIFRoaXMgYnVpbGRzIHVwb24gdGhlIENIQU5HRVMgMTEvMjQvMjAwMSBlbnRyeS4KCjA4LzA3LzIwMDI6IHNhbWphbSwgU2FtIExpZGRpY290dAogICAgICAgICAgICBQcm9wZXJseSBpbXBsZW1lbnRlZCBwb2ludGVyIHN5c3RlbSB1c2luZyBwaHAgcmVzb3VyY2VzLgogICAgICAgICAgICBTdGlsbCBuZWVkIHRvIHdvcmsgb3V0IHdoZXRoZXIgb3Igbm90IHRvIGxldCBzY3JpcHQtdXNlcnMgY2FsbAogICAgICAgICAgICBkZXN0cnVjdG9ycyBkaXJlY3RseQoKMDgvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBVcGdyYWRlZCBtenNjaGVtZSBtb2R1bGUgdG8gc3VwcG9ydCB2ZXJzaW9uIDIwMSBhbmQgYWRkZWQKICAgICAgICAgICAgb3ZlcmxvYWRpbmcgc3VwcG9ydC4KCjA4LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBleHRyYSBncm91cGluZyAoaW4gdmVyeSBsaW1pdGVkIGNhc2VzKS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IChGdW5jUHRyKShpbnQsIGRvdWJsZSk7CgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMICoqKgogICAgICAgICAgICAKMDgvMDMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFVwZGF0ZXMgdG8gdHlwZW1hcHMuaSBhcyB0aG9zZSBkb25lIHByZXZpb3VzbHkgZm9yIFBlcmwsCiAgICAgICAgICAgIFB5dGhvbiBhbmQgVGNsIG1vZHVsZXMuIE5vdyBzdXBwb3J0cyByZWZlcmVuY2UgdHlwZXMgd2l0aCBJTlBVVCwKICAgICAgICAgICAgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcy4KCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGxpYnJhcnkgZmlsZSBjc3RyaW5nLmkgYWRkZWQuICBQcm92aWRlcyBtYWNyb3MgZm9yCiAgICAgICAgICAgIG1hbmlwdWxhdGluZyBjaGFyICogZGF0YS4KIAowOC8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVuZXcgZGlyZWN0aXZlLiAgVXNlICVuZXdvYmplY3QgaW5zdGVhZC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgJW5ld29iamVjdCBmb287CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICBjaGFyICpmb28oKTsKCiAgICAgICAgICAgICVuZXdvYmplY3QgZm9sbG93cyB0aGUgc2FtZSBydWxlcyBhcyAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwKICAgICAgICAgICAgZXRjLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOC8wMS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBhdHRyaWJ1dGUgJ2puaWNsYXNzbmFtZScgZm9yIHRoZSBtb2R1bGUgZGlyZWN0aXZlIGFsbG93cyBhIHdheSBvZgogICAgICAgICAgICBjaGFuZ2luZyB0aGUgSk5JIGNsYXNzIG5hbWUgZnJvbSB0aGUgZGVmYXVsdCB3aGljaCB1c2VzIHRoZSBtb2R1bGVuYW1lIHdpdGggSk5JCiAgICAgICAgICAgIGFwcGVuZGVkIGFmdGVyIGl0LgoKICAgICAgICAgICAgICAgICVtb2R1bGUgKGpuaWNsYXNzbmFtZT0ibmFtZSIpIG1vZHVsZW5hbWUKCiAgICAgICAgICAgIElmICduYW1lJyBpcyB0aGUgc2FtZSBhcyAnbW9kdWxlbmFtZScgdGhlbiB0aGUgbW9kdWxlIGNsYXNzIG5hbWUgZ2V0cyBjaGFuZ2VkCiAgICAgICAgICAgIGZyb20gJ21vZHVsZW5hbWUnIHRvIG1vZHVsZW5hbWVNb2R1bGUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmaWxlIGluY2x1ZGUgb3JkZXIuICBMYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBkaXJlY3RvcmllcyBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgZ2VuZXJpYyBkaXJlY3Rvcmllcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6ICAic3dpZ19saWIvcHl0aG9uL2Zvby5pIiBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZQogICAgICAgICAgICAic3dpZ19saWIvZm9vLmkiLiAgICBJIHRob3VnaHQgdGhpcyB3YXMgdGhlIGNhc2UgYWxyZWFkeSwgYnV0CiAgICAgICAgICAgIGFwcGFyZW50bHkgaXQgaGFzIGJlZW4gYnJva2VuIGZvciBxdWl0ZSBzb21lIHRpbWUuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHN0ZF9kZXF1ZS5pIGxpYnJhcnkgZmlsZS4gIFdvcmsgaW4gcHJvZ3Jlc3MuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob24sVGNsLFBlcmxdCiAgICAgICAgICAgIEltcHJvdmVtZW50cyB0byB0eXBlbWFwcy5pLiAgSU5QVVQvSU5PVVQgdHlwZW1hcHMgcGVyZm9ybSBiZXR0ZXIKICAgICAgICAgICAgZXJyb3IgY2hlY2tpbmcuICBUeXBlbWFwcyBhcmUgbm93IHN1cHBsaWVkIGZvciByZWZlcmVuY2VzIGxpa2UgCiAgICAgICAgICAgIGludCAmT1VUUFVULCBkb3VibGUgJklOT1VULCBldGMuCiAgICAgICAgICAKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBEZXByZWNhdGVkIHRoZSBUXyogYW5kIExfKiB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgogICAgICAgICAgICBNdWx0aXBsZSByZXR1cm4gdmFsdWVzIGFyZSBhbHdheXMgcGxhY2VkIGluIGEgdHVwbGUuIERlcHJlY2F0ZWQKICAgICAgICAgICAgdGhlIEJPVEggdHlwZW1hcHMuICBUaGlzIGlzIG5vdyBJTk9VVCAoZS5nLiwgaW50ICpJTk9VVCkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUFlUSE9OIE1PRFVMRSAqKioKCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgYXJyYXkuaSwgY2FycmF5LmksIGFuZCB0aW1lci5pIGxpYnJhcnkgZmlsZXMuCgowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlIHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUuICBVc2UgY3BvaW50ZXIuaSBpbnN0ZWFkLgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRm9yIGNvbnNpc3RlbmN5IHRoZSBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB1c2UgdGhlIEphdmFCZWFuIAogICAgICAgICAgICBwcm9wZXJ0eSBkZXNpZ24gcGF0dGVybiBsaWtlIG1lbWJlciB2YXJpYWJsZXMgYWx3YXlzIGhhdmUuIFRoaXMgbWVhbnMgaWYgeW91IGFyZSAKICAgICAgICAgICAgd3JhcHBpbmcgYSB2YXJpYWJsZSBjYWxsZWQgZm9vLCB0aGUgZ2V0dGVyIGlzIGNhbGxlZCBnZXRGb28oKSBhbmQgdGhlIHNldHRlciBpcyAKICAgICAgICAgICAgY2FsbGVkIHNldEZvbygpLiBCZWZvcmUgdGhlIHJlY2VudCBjaGFuZ2VzIHRvIHRoZSBKYXZhIG1vZHVsZSB0aGUgZ2V0dGVycyBhbmQgCiAgICAgICAgICAgIHNldHRlcnMgd2VyZSBjYWxsZWQgZ2V0X2ZvbygpIGFuZCBzZXRfZm9vKCkuIElmIHlvdSByZWFsbHkgd2FudCB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGZ1bmN0aW9uIG5hbWVzIHVzZSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgbGlrZSB0aGlzOiAlcmVuYW1lKF9mb28pIEZvbzsKCjA3LzMxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgY2FzdGluZyBwcm9ibGVtIHdpdGggbXVsdGlwbGUgaW5oZXJpdGFuY2UuICBJZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgICBjbGFzcyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJhciA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIGJheiA6IHB1YmxpYyBmb28ge307CiAgICAgICAgICAgICAgICAgIGNsYXNzIHNwYW0gOiBwdWJsaWMgYmFyLCBwdWJsaWMgYmF6IHt9OwoKICAgICAgICAgICAgdGhlbiB0aGUgd3JhcHBlcnMgd291bGRuJ3QgY29tcGlsZSBkdWUgdG8gYW4gYW1iaWd1b3VzIGNhc3QuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFydCBZZXJrZXMuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIER1ZSB0byBuZXcgc3RhdGljIHR5cGVjaGVja2luZyBhbGwgcG9pbnRlcnMgaGVsZCBpbiBhIEphdmEgbG9uZyBhcmUgcGFydCBvZiAKICAgICAgICAgICAgdGhlIGludGVybmFsIHdvcmtpbmdzIGFuZCB0aGlzIHBvaW50ZXIgdmFsdWUgaW4gdGhlIEphdmEgbG9uZyBoYXMgYmVjb21lIGFic3RyYWN0ZWQKICAgICAgICAgICAgZGF0YS4gVGhlIHR5cGUgd3JhcHBlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFzIHN1Y2ggcHJvdGVjdGVkLgogICAgICAgICAgICBJZiB5b3UgbmVlZCB0byBtZXNzIGFyb3VuZCB3aXRoIHBvaW50ZXJzIGZyb20gSmF2YSBvciBmb3IgZXhhbXBsZSBjcmVhdGUgYSBwcm94eSAKICAgICAgICAgICAgY2xhc3Mgb3IgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCBhIG51bGwgcG9pbnRlciwgYWRkIGEgZnVuY3Rpb24vY29uc3RydWN0b3IgCiAgICAgICAgICAgIHRvIGRvIHNvIHdpdGggdGhlICVqYXZhY29kZSB0eXBlbWFwLiBZb3UgY2FuIGFsc28gbWFrZSBnZXRDUHRyKCkgcHVibGljIGFnYWluIHdpdGgKICAgICAgICAgICAgdGhlICVqYXZhZ2V0Y3B0ciB0eXBlbWFwLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyBmb3IgJXR5cGVtYXAoaWdub3JlKS4gSW4gcGFydGljdWxhciB3aGVuIGlnbm9yaW5nIHRoZSBsYXN0IHBhcmFtZXRlcgogICAgICAgICAgICBpbiBhIGZ1bmN0aW9uLiBBbHNvIGZvciBhbGwgcGFyYW1ldGVycyBpbiBjb25zdHJ1Y3RvcnMuIFRoZXNlIG1vZHMgaGF2ZSBhbHNvIGZpeGVkCiAgICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzIGZvciBwcm94eSBjbGFzc2VzIC0gU0YgNTgxNzkxLgoKMDcvMzAvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSAlbmV3b2JqZWN0IChyZXBsYWNlbWVudCBmb3IgJW5ldykgbm93IGltcGxlbWVudGVkIGZvciBKYXZhLiAKCjA3LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHR5cGVtYXAgY29waWVzLCAlYXBwbHksIGFuZCAlY2xlYXIgaW5zaWRlCiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2VzLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSk5JIGNsYXNzIG5vdyBoYXMgcGFja2FnZSBhY2Nlc3MgYXMgdGhlIGNsYXNzIG1vZGlmaWVyCiAgICAgICAgICAgIGhhcyBiZWVuIGNoYW5nZWQgZnJvbSAicHVibGljIiB0byBub3RoaW5nLiBUaGlzIGhhcyBiZWVuIGRvbmUKICAgICAgICAgICAgYXMgdGhpcyBjbGFzcyBpcyBub3cgbW9yZSBmb3IgdGhlIGludGVybmFsIHdvcmtpbmdzIG9mIFNXSUcgc2luY2UgdGhlIG1vZHVsZQogICAgICAgICAgICBjbGFzcyBoYXMgc3RhdGljIHR5cGUgY2hlY2tpbmcgZm9yIGFsbCB0eXBlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyB0aGUgJWpuaWNsYXNzY2xhc3Ntb2RpZmllciAKICAgICAgICAgICAgcHJhZ21hIHRvIGNoYW5nZSBpdCBiYWNrIHRvICJwdWJsaWMiLgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBQcm94eS9TaGFkb3cgY2xhc3NlcyBhcmUgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQuIFRoZSAtcHJveHkgYW5kIAogICAgICAgICAgICAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBkZXByZWNhdGVkLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlIAogICAgICAgICAgICBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdGhlbiB1c2UgdGhlIG5ldyAtbm9wcm94eSBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJlbWFpbmluZyBwcmFnbWFzIHNoYWtldXAuIFRoZXNlIHdlcmUgdGhlIHJlbWFpbmluZyBwcmFnbWFzIGFuZCB0aGVpcgogICAgICAgICAgICBuZXcgbmFtZXMgd2hlcmUgY2hhbmdlZDoKCiAgICAgICAgICAgIG1vZHVsZWJhc2UKICAgICAgICAgICAgbW9kdWxlY29kZQogICAgICAgICAgICBtb2R1bGVjbGFzc21vZGlmaWVycwogICAgICAgICAgICBtb2R1bGVpbXBvcnQgPT4gbW9kdWxlaW1wb3J0cwogICAgICAgICAgICBtb2R1bGVpbnRlcmZhY2UgPT4gbW9kdWxlaW50ZXJmYWNlcwoKICAgICAgICAgICAgVGhlIG1vZHVsZWltcG9ydHMgd29ya3Mgc2xpZ2h0bHkgZGlmZmVyZW50bHkgdG8gaG93IHRoZSBtb2R1bGVpbXBvcnQgcHJhZ21hIHdvcmtlZC4gCiAgICAgICAgICAgIE5vdyBpdCBhY3R1YWxseSB0YWtlcyBjb2RlIHdoaWNoIGdldHMgcGxhY2VkIGJlZm9yZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBzbyB0aGUgCiAgICAgICAgICAgIHdob2xlIGltcG9ydCBzdGF0ZW1lbnQgaGFzIHRvIGJlIGdpdmVuLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW1wb3J0cz0lewogICAgICAgICAgICBpbXBvcnQgamF2YS5pby4qOwogICAgICAgICAgICBpbXBvcnQgamF2YS5tYXRoLio7CiAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgbW9kdWxlaW50ZXJmYWNlcyBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdG8gdGhlIG9sZCBtb2R1bGVpbnRlcmZhY2UgaW4gdGhhdCBpZiAKICAgICAgICAgICAgbW9yZSB0aGFuIG9uZSBpbnRlcmZhY2UgaXMgcmVxdWlyZWQgdGhleSBtdXN0IGJlIGNvbW1hIHNlcGFyYXRlZCBpbiBvbmUgdXNlIG9mIAogICAgICAgICAgICB0aGUgcHJhZ21hLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVwcmFnbWEoamF2YSkgbW9kdWxlaW50ZXJmYWNlcz0iU2VyaWFsaXphYmxlLCBNeUludGVyZmFjZSIKCiAgICAgICAgICAgIFRoZXNlIGxhc3QgdHdvIHByYWdtYXMgYXJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgamF2YWludGVyZmFjZXMgYW5kIGphdmFpbXBvcnRzIAogICAgICAgICAgICB0eXBlbWFwLgoKICAgICAgICAgICAgQSBzaW1pbGFyIHNldCBvZiBwcmFnbWFzIGhhcyBiZWVuIGludHJvZHVjZWQsIG5hbWVseToKCiAgICAgICAgICAgIGpuaWNsYXNzYmFzZQogICAgICAgICAgICBqbmljbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2ltcG9ydAogICAgICAgICAgICBqbmljbGFzc2ludGVyZmFjZQoKICAgICAgICAgICAgVGhlc2Ugd29yayBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlaXIgbW9kdWxlIGNvdW50ZXJwYXJ0cy4gTm90ZSB0aGF0IHByZXZpb3VzbHkKICAgICAgICAgICAgdGhlIG1vZHVsZVhYWCBwcmFnbWFzIHdvcmtlZCBvbiB0aGUgb2xkIG1vZHVsZSBjbGFzcyB3aGljaCBpcyBub3cgY2FsbGVkIHRoZQogICAgICAgICAgICBKTkkgY2xhc3MgKHRoZSBjbGFzcyB3aXRoIHRoZSBuYXRpdmUgZnVuY3Rpb25zKS4gVGhlIGpuaWNsYXNzWFhYIHByYWdtYXMgbm93IAogICAgICAgICAgICB3b3JrIG9uIHRoZSBuZXcgbW9kdWxlIGNsYXNzICh0aGUgY2xhc3MgdGhhdCBoYXMgYWxsIHRoZSBnbG9iYWwgZnVuY3Rpb25zIGFuZAogICAgICAgICAgICBnbG9iYWwgdmFyaWFibGUgZ2V0dGVycyBhbmQgc2V0dGVycyB3aGVuIHVzaW5nIHByb3h5IGNsYXNzZXMsIHBsdXMgYWxsIG90aGVyCiAgICAgICAgICAgIHJlbWFpbmluZyBmdW5jdGlvbnMgd2hlbiB1c2luZyB0aGUgbG93LWxldmVsIHByb2NlZHVyYWwgaW50ZXJmYWNlKS4KCiAgICAgICAgICAgIEluIHN1bW1hcnkgdGhlIGNvbnRlbnRzIG9mIHRoZSBwcmFnbWFzIG1ha2UgdXAgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICA8am5pY2xhc3NpbXBvcnRzPgogICAgICAgICAgICA8am5pY2xhc3Ntb2RpZmllcnM+IGNsYXNzIG1vZHVsZW5hbWUgZXh0ZW5kcyA8am5pY2xhc3NiYXNlPiBpbXBsZW1lbnRzIDxqbmljbGFzc2ludGVyZmFjZXM+IHsKICAgICAgICAgICAgICAgIDxqbmljbGFzc2NvZGU+CiAgICAgICAgICAgICAgICAuLi4gU1dJRyBnZW5lcmF0ZWQgZnVuY3Rpb25zIC4uLgogICAgICAgICAgICB9Cn0KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZXByZWNhdGVkIG1vZHVsZW1ldGhvZG1vZGlmaWVycyBwcmFnbWEgYW5kIHJlcGxhY2VkIHdpdGggCiAgICAgICAgICAgIGEgYmV0dGVyICVmZWF0dXJlIGJhc2VkIGRpcmVjdGl2ZSBjYWxsZWQgJWphdmFtZXRob2Rtb2RpZmllcnMuCiAgICAgICAgICAgIEEgdXNlZnVsIGV4YW1wbGUgd291bGQgYmUgZm9yIHN5bmNocm9uaXNhdGlvbiBpbiBtdWx0aS10aHJlYWRlZCBhcHBzOgoKICAgICAgICAgICAgJWphdmFtZXRob2Rtb2RpZmllcnMgZm9vKGludCBhKSAicHVibGljIHN5bmNocm9uaXplZCI7CgogICAgICAgICAgICBDaGFuZ2VzIHRoaXMgZnVuY3Rpb24gZnJvbSB0aGUgZGVmYXVsdCAoInB1YmxpYyIpIHRvICJwdWJsaWMgc3luY2hyb25pemVkIi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU2V2ZXJhbCBkaXJlY3RpdmVzIG5vdyBhbGxvdyBvcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCiAgICAgICAgICAgIFRoZXNlIGluY2x1ZGU6CgogICAgICAgICAgICAgICAgJW1vZHVsZShuYW1lPSJ2YWx1ZSIsIG5hbWU9InZhbHVlIiwgLi4uKSBtb2R1bGVuYW1lCiAgICAgICAgICAgICAgICAlaW1wb3J0KG5hbWU9InZhbHVlIiwgLi4uKSAiZmlsZW5hbWUuaSIKICAgICAgICAgICAgICAgICVleHRlbmQobmFtZT0idmFsdWUiLCAuLi4pIGNsYXNzbmFtZSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZXNlIGN1cnJlbnRseSBoYXZlIG5vIGVmZmVjdCBhbmQgYXJlIHJlc2VydmVkIGZvcgogICAgICAgICAgICBmdXR1cmUgZXhwYW5zaW9uLgogICAgICAgICAgICAgICAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBFbmhhbmNlbWVudHMgdG8gc21hcnQtcG9pbnRlciBoYW5kbGluZy4gIFNXSUcgb25seSBwcm92aWRlcwogICAgICAgICAgICBleHRyYSBzdXBwb3J0IGZvciBhIHNtYXJ0LXBvaW50ZXIgaWYgb3BlcmF0b3ItPigpIHJldHVybnMKICAgICAgICAgICAgYSBwcm9wZXIgcG9pbnRlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKCiAgICAgICAgICAgIElmIG9wZXJhdG9yLT4oKSByZXR1cm5zIGFuIG9iamVjdCBieSB2YWx1ZSBvciByZWZlcmVuY2UsCiAgICAgICAgICAgIHRoZW4gU1dJRyBleGFtaW5lcyB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHNlZSBpZiBpdCBhbHNvCiAgICAgICAgICAgIGltcGxlbWVudHMgb3BlcmF0b3ItPigpLiAgSWYgc28sIFNXSUcgY2hhc2VzIG9wZXJhdG9yLT4oKQogICAgICAgICAgICB1bnRpbCBpdCBjYW4gZmluZCBvbmUgdGhhdCByZXR1cm5zIGEgcG9pbnRlci4gIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNhc2VzIGxpa2UgdGhpcyB0byB3b3JrOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBTcGFtIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgQmFyIG9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkgICAgICAjIEludm9rZXMgRm9vOjpibGFoKCkKCiAgICAgICAgICAgIFRoZSBzLmJsYWgoKSBjYWxsIGFjdHVhbGx5IGludm9rZXM6CgogICAgICAgICAgICAgICAgICAoKHMub3BlcmF0b3ItPigpKS5vcGVyYXRvci0+KCkpLT5ibGFoKCk7CiAKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHR5cGVkZWYgYW5kIHJlZmVyZW5jZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gJiBGb29SZWY7CiAgICAgICAgICAgICAgICAgRm9vUmVmIGJsYWgoKTsKCiAgICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcgZ2VuZXJhdGVkIGNvZGUgdGhhdCB3b3VsZG4ndAogICAgICAgICAgICBjb21waWxlLgoKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBXcmFwcGluZyBvZiBzdGF0aWMgbWV0aG9kcyBoYXMgYmVlbiBpbXByb3ZlZCBpbiBwcm94eSBjbGFzc2VzLiAgSW4gb2xkZXIKICAgICAgICAgICAgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGlzOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgdm9pZCBiYXIoKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBzdGF0aWMgbWV0aG9kIHdhcyBvbmx5IGF2YWlsYWJsZSBhcyBhIGZ1bmN0aW9uIEZvb19iYXIoKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgPj4+IEZvb19iYXIoKQoKICAgICAgICAgICAgTm93LCB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYWxzbyBiZSBpbnZva2VkIHRocm91Z2ggYW4gaW5zdGFuY2UgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICAgICA+Pj4gZi5iYXIoKSAgICAgICAgIyBJbnZva2VzIHN0YXRpYyBtZXRob2QKCiAgICAgICAgICAgIFRoaXMgd29ya3Mgd2l0aCBhbGwgdmVyc2lvbnMgb2YgUHl0aG9uLiAgQWRkaXRpb25hbGx5LCBmb3IgUHl0aG9uLTIuMiwKICAgICAgICAgICAgdGhlIHN0YXRpYyBtZXRob2QgY2FuIGJlIGludm9rZWQgYXM6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vLmJhcigpCgogICAgICAgICAgICBUaGUgb2xkLXN0eWxlIGZ1bmN0aW9uIGlzIHN0aWxsIHN1cHBvcnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZgogICAgICAgICAgICB5b3UgY2FyZSBhYm91dCBtYWtpbmcgeW91ciBjb2RlIGFjcm9zcyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgUHl0aG9uLAogICAgICAgICAgICBlaXRoZXIgdXNlIEZvb19iYXIoKSBvciBhY2Nlc3MgdGhlIG1ldGhvZCB0aHJvdWdoIGFuIGluc3RhbmNlLgogCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgUHl0aG9uIG1vZHVsZS4gIFByb3h5IGNsYXNzZXMgbm93IHV0aWxpemUgbmV3IFB5dGhvbi0yLjIKICAgICAgICAgICAgZmVhdHVyZXMgaW5jbHVkaW5nIHByb3BlcnRpZXMgYW5kIHN0YXRpYyBtZXRob2RzLiAgSG93ZXZlciwgdGhlc2UgZmVhdHVyZXMKICAgICAgICAgICAgYXJlIHN1cHBvcnRlZCBpbiBhIHdheSB0aGF0IHByb3ZpZGVzIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIKICAgICAgICAgICAgUHl0aG9uIHZlcnNpb25zLiAgSW4gb3RoZXIgd29yZHMsIHByb3h5IGNsYXNzZXMgd29yayB3aXRoIGFsbCB2ZXJzaW9ucwogICAgICAgICAgICBvZiBQeXRob24gYW5kIG9ubHkgdXNlIG5ldyBmZWF0dXJlcyB3aGVuIHJ1bm5pbmcgb24gUHl0aG9uLTIuMi4KCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICVleHRlbmQgc28gdGhhdCBvdmVybG9hZGVkIG1ldGhvZHMgY2FuIGJlIGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgeCkgeyB9OwogICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpzKSB7IH07CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGJvdGggQysrICphbmQqIEMuCgowNy8yNC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE1vcmUgbmV3IHR5cGVtYXBzIHNvIHRoYXQgdGhlIEphdmEgcHJveHkgY2xhc3NlcyBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzZXMKICAgICAgICAgICAgY2FuIGJlIGZ1cnRoZXIgdGFpbG9yZWQgYnkgdXNlcnMuIFRoZXNlIGFyZSB0aGUgZGVmYXVsdCBjb2RlIGZvciBnZW5lcmF0aW5nIHRoZSAKICAgICAgICAgICAgZmluYWxpemUoKSBtZXRob2RzIChwcm94eSBjbGFzc2VzIG9ubHkpIGFuZCB0aGUgZ2V0Q1B0cigpIG1ldGhvZHMgZm9yIHByb3h5IAogICAgICAgICAgICBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlczoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFmaW5hbGl6ZSkgU1dJR1RZUEUgJXsKICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHsKICAgICAgICAgICAgICAgIF9kZWxldGUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICV9CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBqYXZhZ2V0Y3B0ciB0eXBlbWFwIHdpbGwgZW5hYmxlIHVzZXJzIHRvIGhhbmRsZSBKYXZhIG51bGwgYnkgb3ZlcnJpZGluZwogICAgICAgICAgICB0aGlzIHR5cGVtYXAgLSBhIHJlcXVlc3RlZCBmZWF0dXJlLgoKICAgICAgICAgICAgVGhlIC1ub2ZpbmFsaXplIGNvbW1hbmRsaW5lIG9wdGlvbiBoYXMgYmVlbiBkZXByZWNhdGVkLiBUaGUgamF2YWZpbmFsaXplCiAgICAgICAgICAgIHR5cGVtYXAgaXMgbW9yZSBwb3dlcmZ1bCBhcyBpdCB3aWxsIGFsbG93IHRoZSByZW1vdmFsIG9mIHRoZSBmaW5hbGl6ZSBtZXRob2RzIAogICAgICAgICAgICBmb3IgYWxsIG9yIGFueSBvbmUgb3IgbW9yZSBwYXJ0aWN1bGFyIHByb3h5IGNsYXNzLgoKMDcvMjMvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgZ2V0Q1B0clhYWCgpIGZ1bmN0aW9uIGhhcyBiZWVuIGNoYW5nZWQgdG8gYSBzdGF0aWMgZnVuY3Rpb24gYW5kCiAgICAgICAgICAgIGlzIG5vdyBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKFhYWCBvYmopIHsuLi59CgogICAgICAgICAgICBUaGlzIGlzIGEgcmVxdWVzdGVkIGNoYW5nZSB3aGljaCB3aWxsIGFsbG93IEphdmEgbnVsbCBwb2ludGVycyB0byBiZSB1c2VkIGFzIG51bGwKICAgICAgICAgICAgY2FuIGJlIHBhc3NlZCBpbiBmb3Igb2JqLiBIb3dldmVyLCB0byBhY2hpZXZlIHRoaXMgdGhlIGFwcHJvcHJpYXRlIGNvZGUgbXVzdCBiZQogICAgICAgICAgICB3cml0dGVuIHVzaW5nIHRoZSBuZXcgamF2YWdldGNwdHIgdHlwZW1hcCBkaXJlY3RpdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoaXMgZnVuY3Rpb24gYmFjayBpbiB1c2luZyB0aGUKICAgICAgICAgICAgbmV3IGphdmFjb2RlIHR5cGVtYXA6CgogICAgICAgICAgICAldHlwZW1hcChqYXZhY29kZSkgU1dJR1RZUEUgJXsKCiAgICAgICAgICAgICAgLy8gU1dJRy0xLjMuMTIgYW5kIFNXSUctMS4zLjEzCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0ciRqYXZhY2xhc3NuYW1lKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMSBhbmQgZWFybGllcgogICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgJX0KCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE5ldyBkaXJlY3RpdmUgdG8gY29udHJvbCBjb25zdGFudCBjb2RlIGdlbmVyYXRpb24gLSAlamF2YWNvbnN0LgogICAgICAgICAgICBUaGUgZGVmYXVsdCBoYW5kbGluZyBmb3IgaGFuZGxpbmcgY29uc3RhbnRzIGlzIHRvIGdldCB0aGUgdmFsdWUgdGhyb3VnaAogICAgICAgICAgICBhIEpOSSBjYWxsLCBlZwoKICAgICAgICAgICAgI2RlZmluZSBZRUxMT1cgNQogICAgICAgICAgICAjZGVmaW5lIEJJRyAxMjM0TEwKCiAgICAgICAgICAgIHJlc3VsdHMgaW46CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSBtb2R1bGVuYW1lLmdldF9ZRUxMT1coKTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IG1vZHVsZW5hbWUuZ2V0X0JJRygpOwoKICAgICAgICAgICAgRWFybGllciB2ZXJzaW9ucyBvZiB0aGUgSmF2YSBtb2R1bGUgaW5pdGlhbGlzZWQgdGhlIHZhbHVlIHVzaW5nIHRoZSBDIHZhbHVlOgoKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWUVMTE9XID0gNTsKICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBsb25nIEJJRyA9IDEyMzRMTDsKCiAgICAgICAgICAgIFRoaXMgd29ya3MgaW4gbW9zdCBjYXNlcywgYnV0IHRoZSB2YWx1ZSBmb3IgQklHIHdvbid0IGNvbXBpbGUgYXMgMTIzNExMIGlzIG5vdAogICAgICAgICAgICB2YWxpZCBKYXZhIGNvZGUgYW5kIHRoaXMgaXMgb25lIG9mIHRoZSByZWFzb25zIHdoeSB0aGUgZGVmYXVsdCBpcyBub3cgdG8gZ2V0IHRoZSAKICAgICAgICAgICAgdmFsdWVzIHRocm91Z2ggYSBKTkkgY2FsbC4gVGhlIHNpZGUgZWZmZWN0IGlzIHRoYXQgdGhlc2UgJ2NvbnN0YW50cycgY2Fubm90IGJlIHVzZWQgCiAgICAgICAgICAgIGluIHN3aXRjaCBzdGF0ZW1lbnRzLiBUaGUgJWphdmFjb25zdCBkaXJlY3RpdmUgYWxsb3dzIG9uZSB0byBzcGVjaWZ5IHRoZQogICAgICAgICAgICB3YXkgdGhlIGNvbnN0YW50IHZhbHVlIGlzIGluaXRpYWxpc2VkIGFuZCB3b3JrcyBsaWtlIG90aGVyICVmZWF0dXJlCiAgICAgICAgICAgIGRpcmVjdGl2ZXMsIGVnCgogICAgICAgICAgICAlamF2YWNvbnN0KDApOyAgICAgLy8gYWxsIGNvbnN0YW50cyBmcm9tIHRoaXMgcG9pbnQgb24gYXJlIGluaXRpYWxpc2VkIHVzaW5nIHRoZSBDIHZhbHVlCiAgICAgICAgICAgICVqYXZhY29uc3QoMSkgQklHOyAvLyBqdXN0IEJJRyBpbml0aWFsaXNlZCB1c2luZyBKTkkgY2FsbCAobXVzdCBiZSBwYXJzZWQgYmVmb3JlIEJJRyBpcyBkZWZpbmVkKQoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICAqKiogSU1QT1JUQU5UIENIQU5HRVMgVE8gVEhFIFBZVEhPTiBNT0RVTEUgKioqCgogICAgICAgICAgICAoMSkgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVuYWJsZXMgc2hhZG93L3Byb3h5IGNsYXNzZXMgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHR3byBmaWxlcyBhcmUgYWx3YXlzIGNyZWF0ZWQgYnkgU1dJRy4gIEZvcgogICAgICAgICAgICBpbnN0YW5jZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgICAgLy8gZmlsZTogZm9vLmkKICAgICAgICAgICAgICAgICAlbW9kdWxlIGZvbwogICAgICAgICAgICAgICAgIC4uLgoKICAgICAgICAgICAgVGhlbiBzd2lnIGdlbmVyYXRlcyB0d28gZmlsZXMgImZvb193cmFwLmMiIGFuZCAiZm9vLnB5Ii4KCiAgICAgICAgICAgICgyKSBUaGUgbmFtZSBvZiB0aGUgbG93LWxldmVsIEMgZXh0ZW5zaW9uIG1vZHVsZSBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgICAgICAgIHRvIHN0YXJ0IHdpdGggYSBsZWFkaW5nIHVuZGVyc2NvcmUuICAgVGhpcyBtZWFucyB0aGF0IHlvdSBoYXZlCiAgICAgICAgICAgIHRvIGNvbXBpbGUgdGhlIG1vZHVsZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICQgY2MgLWMgLUkvdXNyL2xvY2FsL2luY2x1ZGUvcHl0aG9uMi4yIGZvb193cmFwLmMKICAgICAgICAgICAgICAgICQgY2MgLXNoYXJlZCBmb29fd3JhcC5vICQoT0JKUykgLW8gX2Zvby5zbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGUgZXh0cmEgdW5kZXJzY29yZQoKICAgICAgICAgICAgVGhpcyBuYW1pbmcgc2NoZW1lIGlzIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBQeXRob24gbW9kdWxlcyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgZXh0ZW5zaW9uIGNvZGUuICBGb3IgaW5zdGFuY2UsIHRoZSBzb2NrZXQgbW9kdWxlIGNvbnNpc3RzCiAgICAgICAgICAgIG9mICJfc29ja2V0LnNvIiBhbmQgInNvY2tldC5weSIuICBJbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLAogICAgICAgICAgICB0aGUgc2hhcmVkIG9iamVjdCBmaWxlIHdhcyBuYW1lZCAiZm9vY21vZHVsZS5zbyIuCgogICAgICAgICAgICAoMykgQSBuZXcgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGluc2VydCBQeXRob24gY29kZSBpbnRvCiAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIC5weSBmaWxlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXB5dGhvbmNvZGUgJXsKICAgICAgICAgICAgICAgIGRlZiBmb28oKToKICAgICAgICAgICAgICAgICAgICBwcmludCAiSGVsbG8gV29ybGQiCiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIGFsbG93cyB5b3UgdG8gY3JlYXRlIG1vZHVsZXMgYXMgYSBtaXggb2YgQyBhbmQgUHl0aG9uLgogICAgICAgICAgICAgUHl0aG9uIGNvZGUgaXMgc2VhbWxlc3NseSBhZGRlZCB0byB0aGUgbW9kdWxlLgoKICAgICAgICAgICAgKDQpIFRoZSAtc2hhZG93IGNvbW1hbmQgbGluZSBvcHRpb24gaXMgZGVwcmVjYXRlZC4gIFRoaXMgaXMgdHVybmVkIG9uCiAgICAgICAgICAgIGJ5IGRlZmF1bHQuCgogICAgICAgICAgICAoNSkgVG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgZXh0cmEgcHl0aG9uIGZpbGUsIHVzZSB0aGUgIi1ub3Byb3h5IgogICAgICAgICAgICBjb21tYW5kIGxpbmUgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIHdpbGwgbGlrZWx5IGJyZWFrIHRoZSBidWlsZCBlbnZpcm9ubWVudCBvZiBwcm9qZWN0cyB0aGF0CiAgICAgICAgICAgIHV0aWxpemUgc2hhZG93IGNsYXNzZXMuICAgVG8gZml4IHRoaXMsIHlvdSBwcm9iYWJseSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQgLnNvIGZpbGUuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUKICAgICAgICAgICAgTWFrZWZpbGUgaW5mb3JtYXRpb24gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IGV4YW1wbGVjbW9kdWxlLnNvCgogICAgICAgICAgICBKdXN0IGNoYW5nZSBpdCB0bzoKCiAgICAgICAgICAgICAgICAgICBUQVJHRVQgPSBfZXhhbXBsZS5zbwoKICAgICAgICAgICAgKioqIERPQ1VNRU5UQVRJT04gVVBEQVRFICoqKgogICAgICAgICAgICBUaGUgZmlsZSBEb2MvTWFudWFsL1B5dGhvbi5odG1sIGhhcyBiZWVuIHVwZGF0ZWQgdG8gZGVzY3JpYmUgdGhlc2UgY2hhbmdlcy4KCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1ub2V4dGVybiBvcHRpb24uICAgSWYgc3VwcGxpZWQsIFNXSUcgd2lsbCBub3QgZ2VuZXJhdGUKICAgICAgICAgICAgZXh0cmEgZXh0ZXJuIGRlY2xhcmF0aW9ucy4gIFRoaXMgaXMgc29tZXRpbWVzIGFuIGlzc3VlIG9uIAogICAgICAgICAgICBub24tdW5peCBwbGF0Zm9ybXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgd2FybmluZyBmb3IgaWdub3JlZCBmcmllbmQgZnVuY3Rpb25zLgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NDQ5OCBdIC1wcm94eSBhbmQgJWluY2x1ZGUgInBvaW50ZXIuaSIgY2xhc2guCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhdmlkIENyZWFzeS4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NzYxMDMgXSBnbG9iYWwgZGVzdHJ1Y3Rpb24gd2FybmluZyB3aXRoIHNoYWRvdy4KICAgICAgICAgICAgUGVybCBleHRlbnNpb25zIHNob3VsZCBubyBsb25nZXIgcmVwb3J0IHRoZSB3YXJuaW5nCgogICAgICAgICAgICAgICAiVXNlIG9mIHVuaW5pdGlhbGl6ZWQgdmFsdWUgZHVyaW5nIGdsb2JhbCBkZXN0cnVjdGlvbi4iCiAKICAgICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggInBlcmwgLXciLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQnJldHQgV2lsbGlhbXMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEluIEMrKyBtb2RlLCBTV0lHIG5vdyBhbHdheXMgZGVmaW5lcyBuYW1lc3BhY2Ugc3RkLiAgQnkgZGVmYXVsdCwKICAgICAgICAgICAgaXQncyBlbXB0eS4gIEhvd2V2ZXIsIHRoaXMgd2lsbCBzaWxlbmNlIGVycm9ycyBmcm9tIHByb2dyYW1zCiAgICAgICAgICAgIHRoYXQgaW5jbHVkZSBzdGF0ZW1lbnRzIHN1Y2ggYXMgInVzaW5nIG5hbWVzcGFjZSBzdGQ7Ii4KICAgICAgICAgICAgVGhpcyBmaXhlcyBCdWcgWyA1ODQwMTcgXSB1c2luZyBuYW1lc3BhY2Ugc3RkIGdlbmVyYXRlcyBlcnJvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCgowNy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGEgbmV3IHdhcm5pbmcgbWVzc2FnZSBmb3IgJWFwcGx5LiAgSWYgeW91IHVzZSAlYXBwbHkgYnV0IG5vIHR5cGVtYXBzCiAgICAgICAgICAgIGFyZSBkZWZpbmVkLCB5b3Ugd2lsbCBnZXQgYSB3YXJuaW5nIG1lc3NhZ2UuICBUaGlzIHNob3VsZCBoZWxwIHdpdGgKICAgICAgICAgICAgcHJvYmxlbXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICVhcHBseSBjaGFyICpPVVRQVVQgeyAuLi4gfTsKCiAgICAgICAgICAgIEluIG9sZCB2ZXJzaW9ucyBvZiBTV0lHLCB0aGlzIHNpbGVudGx5IGRpZCBub3RoaW5nLiAgTm93IHlvdSBnZXQgYW4gZXJyb3IgbGlrZSB0aGlzOgogIAogICAgICAgICAgICAgICAgICAgZmlsZTpsaW5lLiBXYXJuaW5nLiBDYW4ndCBhcHBseSAoY2hhciAqT1VUUFVUKS4gTm8gdHlwZW1hcHMgYXJlIGRlZmluZWQuCgowNy8yMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN0YXJ0ZWQgSmF2YSBwcmFnbWEgZGVwcmVjYXRpb24uIFJlcGxhY2VtZW50cyB1c2UgJXR5cGVtYXAgYmFzZWQgCiAgICAgICAgICAgIGRpcmVjdGl2ZXMgYW5kIGVuYWJsZSBwcm94eSBjbGFzc2VzIGFuZCB0aGUgbmV3IHR5cGUgd3JhcHBlciBjbGFzc2VzIHRvIGJlIAogICAgICAgICAgICB0YWlsb3JlZCBpbiB2YXJpb3VzIHdheXMuIFRoZXNlIGFyZSB0aGUgbmV3IHR5cGVtYXBzOgogICAgICAgICAgICAKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UpICAgICAgICAgICAtIGJhc2UgKGV4dGVuZHMpIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgLSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBKYXZhIGNsYXNzOiBkZWZhdWx0IGlzICJwdWJsaWMiCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSAgICAgICAgICAgLSBqYXZhIGNvZGUgaXMgY29waWVkIHZlcmJhdGltIHRvIHRoZSBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSAgICAgICAgLSBpbXBvcnQgc3RhdGVtZW50cyBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAldHlwZW1hcChqYXZhaW50ZXJmYWNlcykgICAgIC0gaW50ZXJmYWNlcyAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgCiAgICAgICAgICAgIEFuZCB0aGVzZSBhcmUgdGhlICVwcmFnbWEgZGlyZWN0aXZlcyBiZWluZyBkZXByZWNhdGVkOgogICAgICAgICAgICBhbGxzaGFkb3diYXNlCiAgICAgICAgICAgIGFsbHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGFsbHNoYWRvd2NvZGUKICAgICAgICAgICAgYWxsc2hhZG93aW1wb3J0CiAgICAgICAgICAgIGFsbHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICBzaGFkb3diYXNlCiAgICAgICAgICAgIHNoYWRvd2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIHNoYWRvd2NvZGUKICAgICAgICAgICAgc2hhZG93aW1wb3J0CiAgICAgICAgICAgIHNoYWRvd2ludGVyZmFjZQogICAgICAgICAgICAKICAgICAgICAgICAgTm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHRhcmdldCBhIHBhcnRpY3VsYXIgcHJveHkgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBGb28gImltcG9ydCBqYXZhLnV0aWwuKiI7CiAgICAgICAgICAgIG9yIGEgcGFydGljdWxhciB0eXBlIHdyYXBwZXIgY2xhc3M6CiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbXBvcnRzKSBkb3VibGUqICJpbXBvcnQgamF2YS5tYXRoLioiOwogICAgICAgICAgICBOb3RlIHRoYXQgJGphdmFjbGFzc25hbWUgaW4gdGhlc2UgdHlwZW1hcHMgYXJlIHN1YnN0aXR1dGVkIHdpdGggZWl0aGVyIHRoZSBwcm94eSAKICAgICAgICAgICAgY2xhc3NuYW1lIHdoZW4gdXNpbmcgcHJveHkgY2xhc3NlcyBvciB0aGUgU1dJR1RZUEUgY2xhc3MgbmFtZS4KCjA3LzE4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSmF2YSBtb2R1bGUgb3ZlcmhhdWwgdG8gaW1wbGVtZW50IHN0YXRpYyB0eXBlIGNoZWNraW5nIG9mIGFsbCAKICAgICAgICAgICAgdHlwZXMuIAogICAgICAgICAgICAKICAgICAgICAgICAgMSkgQ2hhbmdlcyB3aGVuIHVzaW5nIEphdmEgUHJveHkgY2xhc3NlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBQcmV2aW91c2x5IHdoZW4gd3JhcHBpbmcgZ2xvYmFsIGZ1bmN0aW9uczogCgogICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3N7fTsKICAgICAgICAgICAgdm9pZCBmb28oU29tZUNsYXNzKiBzKTsKICAgICAgICAgICAgU29tZUNsYXNzKiBiYXIoKTsKCiAgICAgICAgICAgIFRoZSBuYXRpdmUgbWV0aG9kIHByb3RvdHlwZXMgdXNlZCBhIGxvbmcgZm9yIHBvaW50ZXJzIGFuZCBsb29rZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgcHVibGljIGNsYXNzIG1vZHVsZW5hbWUgIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBmb28obG9uZyBqYXJnMSk7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSBsb25nIGJhcigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBhbmQgdW5saWtlIG1lbWJlciBmdW5jdGlvbnMgb2YgYSBDKysgY2xhc3MgdGhlcmUgd2FzIG5vIHdyYXBwZXIgYXJvdW5kIHRoZSBuYXRpdmUgY2FsbHMgCiAgICAgICAgICAgIHRvIG1ha2UgdGhlIHVzZSBvZiB0aGVtIG1vcmUgdXNlciBmcmllbmRseS4gVGhleSB3b3VsZCBiZSB1c2VkIGZyb20gSmF2YSBsaWtlIHRoaXM6CgogICAgICAgICAgICBTb21lQ2xhc3MgcyA9IG5ldyBTb21lQ2xhc3MobW9kdWxlbmFtZS5iYXIoKSwgZmFsc2UpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzLmdldENQdHJTb21lQ2xhc3MoKSk7CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhlIGZvbGxvd2luZyB3aWxsIGhhdmUgdGhlIHNhbWUgZWZmZWN0LCBidXQgdGhlbiBpdCB3b3VsZCBub3QgaGF2ZSAKICAgICAgICAgICAgYmVlbiBwb3NzaWJsZSB0byBjYWxsIGFueSBwcm94eSBtZW1iZXIgZnVuY3Rpb25zIGluIFNvbWVDbGFzczoKCiAgICAgICAgICAgIGxvbmcgcyA9IG1vZHVsZW5hbWUuYmFyKCk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMpOwoKICAgICAgICAgICAgTm93IHdyYXBwZXIgZnVuY3Rpb25zIGFyZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICBwdWJsaWMgY2xhc3MgbW9kdWxlbmFtZSAgewogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIGZvbyhTb21lQ2xhc3MgcykgewogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxzIHRoZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFNvbWVDbGFzcyBiYXIoKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5hdGl2ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBXaGljaCBtZWFucyB0aGVzZSBmdW5jdGlvbnMgY2FuIG5vdyBiZSB1c2VkIG1vcmUgbmF0dXJhbGx5IHdpdGggcHJveHkgY2xhc3NlczoKCiAgICAgICAgICAgIFNvbWVDbGFzcyBzID0gbW9kdWxlbmFtZS5iYXIoKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocyk7CgogICAgICAgICAgICAyKSBDaGFuZ2VzIHdoZW4gbm90IHVzaW5nIEphdmEgUHJveHkgY2xhc3NlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAgICAgVGhlIHNvIGNhbGxlZCBsb3ctbGV2ZWwgaW50ZXJmYWNlIHdhcyByYXRoZXIgbG93LWxldmVsIGluZGVlZC4gVGhlIAogICAgICAgICAgICBuZXcgc3RhdGljIHR5cGUgY2hlY2tpbmcgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgbGVzcyBzbyBidXQgaXQgcmVtYWlucyBhCiAgICAgICAgICAgIGZ1bmN0aW9uYWwgaW50ZXJmYWNlIHRvIHRoZSBDL0MrKyB3b3JsZC4gUHJveHkgY2xhc3NlcyBhcmUgdGhlIG9idmlvdXMgd2F5IHRvIHVzZQogICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBjb2RlLCBidXQgZm9yIHRob3NlIHdobyB3YW50IGEgZnVuY3Rpb25hbCBpbnRlcmZhY2UgYWxsIG5vbi1wcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgbm93IGhhdmUgYSBzaW1wbGUgSmF2YSBjbGFzcyB3cmFwcGVyIGFyb3VuZCB0aGUgQy9DKysgdHlwZS4gUG9pbnRlcnMgYW5kCiAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlIHR5cGVzIGFyZSBhbHNvIHdyYXBwZWQgYnkgdHlwZSB3cmFwcGVyIGNsYXNzZXMuIFRoZSB0eXBlCiAgICAgICAgICAgIHdyYXBwZXIgY2xhc3NuYW1lcyBhcmUgYmFzZWQgb24gdGhlIFNXSUcgZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgb3RoZXIgbGFuZ3VhZ2UgCiAgICAgICAgICAgIG1vZHVsZXMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgQy9DKysgdHlwZSAgICAgIEphdmEgdHlwZSB3cmFwcGVyIGNsYXNzIG5hbWUKICAgICAgICAgICAgLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgaW50KiAgICAgICAgICAgIFNXSUdUWVBFX3BfaW50CiAgICAgICAgICAgIGRvdWJsZSoqICAgICAgICBTV0lHVFlQRV9wX3BfZG91YmxlCiAgICAgICAgICAgIFNvbWVDbGFzcyogICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwogICAgICAgICAgICBTb21lQ2xhc3MmICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKICAgICAgICAgICAgU29tZUNsYXNzICAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCgogICAgICAgICAgICBOb3RlIHRoYXQgZXZlcnl0aGluZyB3cmFwcGVkIGJ5IFNXSUcgaXMgYWNjZXNzZWQgdmlhIGEgcG9pbnRlciBldmVuIHdoZW4gd3JhcHBpbmcgCiAgICAgICAgICAgIGZ1bmN0aW9ucyB0aGF0IHBhc3MgYnkgdmFsdWUgb3IgcmVmZXJlbmNlLiBTbyB0aGUgcHJldmlvdXMgZXhhbXBsZSB3b3VsZCBub3cgYmUgCiAgICAgICAgICAgIHVzZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MgcyA9IGV4YW1wbGUuYmFyKCk7CiAgICAgICAgICAgIGV4YW1wbGUuZm9vKHMpOwoKICAgICAgICAgICAgTm90ZSB0aGF0IHR5cGVkZWZzIHRoYXQgU1dJRyBrbm93cyBhYm91dCBhcmUgcmVzb2x2ZWQsIHNvIHRoYXQgaWYgb25lIGhhcyAKCiAgICAgICAgICAgIGNsYXNzIEZvb3t9OwogICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CgogICAgICAgICAgICB0aGVuIGFueSB1c2Ugb2YgQmFyIHdpbGwgcmVxdWlyZSBvbmUgdG8gdXNlIFNXSUdUWVBFX3BfRm9vOwoKICAgICAgICAgICAgU29tZSBjb25zaWRlcmF0aW9uczoKICAgICAgICAgICAgTWFrZSBzdXJlIHlvdSBtYWtlIGEgZmlybSBkZWNpc2lvbiB0byB1c2UgZWl0aGVyIHByb3h5IGNsYXNzZXMgb3IgdGhlIGZ1bmN0aW9uYWwgCiAgICAgICAgICAgIGludGVyZmFjZSBlYXJseSBvbiBhcyB0aGUgY2xhc3NuYW1lcyBhcmUgZGlmZmVyZW50LgoKICAgICAgICAgICAgMykgUG9pbnRlcnMgYW5kIG5vbi1wYXJzZWQgdHlwZXMKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgU29tZXRpbWVzIFNXSUcgY2Fubm90IGdlbmVyYXRlIGEgcHJveHkgY2xhc3MuIFRoaXMgb2NjdXJzIHdoZW4gdGhlIGRlZmluaXRpb24gb2YgCiAgICAgICAgICAgIGEgdHlwZSBpcyBub3QgcGFyc2VkIGJ5IFNXSUcsIGJ1dCBpcyB0aGVuIHVzZWQgYXMgYSB2YXJpYWJsZSBvciBhIHBhcmFtZXRlci4gCiAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgdm9pZCBmb28oU25henp5IHNkcyk7CgogICAgICAgICAgICBJZiBTV0lHIGhhcyBub3QgcGFyc2VkIFNuYXp6eSBpdCBoYW5kbGVzIGl0IHNpbXBseSBhcyBhIHBvaW50ZXIgdG8gYSBTbmF6enkuCiAgICAgICAgICAgIFRoZSBKYXZhIG1vZHVsZSBnaXZlcyBpdCBhIHR5cGUgd3JhcHBlciBjbGFzcyBhcm91bmQgdGhlIHBvaW50ZXIgYW5kIGNhbGxzIGl0IAogICAgICAgICAgICBTV0lHVFlQRV9wX1NuYXp6eS4gSW4gb3RoZXIgd29yZHMgaXQgaGFuZGxlcyBpdCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdHlwZXMgYXJlIAogICAgICAgICAgICBoYW5kbGVkIGluIHRoZSBsb3ctbGV2ZWwgZnVuY3Rpb25hbCBpbnRlcmZhY2UuIFRoaXMgYXBwcm9hY2ggaXMgdXNlZCBmb3IgYWxsIAogICAgICAgICAgICBub24tcHJveHkgY2xhc3NlcywgZWcgYWxsIHBvaW50ZXIgdG8gcG9pbnRlcnMgYW5kIHBvaW50ZXJzIHRvIHByaW1pdGl2ZSB0eXBlcy4KCiAgICAgICAgICAgIDQpIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGlzIG5vdCBhbiBpc3N1ZSBpZiB5b3UgaGF2ZSBiZWVuIHVzaW5nIHByb3h5IGNsYXNzZXMgYW5kIAogICAgICAgICAgICBubyBnbG9iYWwgdmFyaWFibGVzL2Z1bmN0aW9ucy4gT3RoZXJ3aXNlIHNvbWUgY2hhbmdlcyB3aWxsIGhhdmUgdG8gYmUgbWFkZS4gCiAgICAgICAgICAgIFRoZSBuYXRpdmUgbWV0aG9kcyBzdGlsbCBleGlzdCBidXQgdGhleSBhcmUgbm93IGluIGEgSk5JIGNsYXNzLCB3aGljaCBpcyBjYWxsZWQgCiAgICAgICAgICAgIG1vZHVsZW5hbWVKTkkuIEFzIHRoaXMgY2xhc3MgaXMgcmVhbGx5IHBhcnQgb2YgdGhlIGludGVybmFsIHdvcmtpbmdzLAogICAgICAgICAgICBpdCBzaG91bGQgbm90IGJlIHJlcXVpcmVkIHNvIHRoZSBjbGFzcyBoYXMgYmVjb21lIHByb3RlY3RlZC4gU29tZSBwcmFnbWFzL2RpcmVjdGl2ZXMKICAgICAgICAgICAgd2lsbCBob3BlZnVsbHkgYmUgYWRkZWQgdG8gaGVscCB3aXRoIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMTgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb2RpZmllZCB3cmFwcGluZyBvZiB1bmluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMgcmV0dXJuZWQgYnkKICAgICAgICAgICAgdmFsdWUuICBKdXN0IHRvIGJlIHNhZmUsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IFN3aWdWYWx1ZVdyYXBwZXI8PgogICAgICAgICAgICBqdXN0IGluIGNhc2UgdGhleSBkb24ndCBkZWZpbmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgVGhpcwogICAgICAgICAgICB3b3VsZCBiZSB1c2VkIGlmIHlvdSBoYWQgY29kZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgRm9vPGludD4gYmxhaCgpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgIG1vcmVibGFoKEZvbzxpbnQ+IHgpOwoKICAgICAgICAgICAgYnV0IHlvdSBkaWRuJ3QgaW5zdGFudGlhdGUgRm9vPGludD4gdXNpbmcgJXRlbXBsYXRlLiAgCiAgICAgICAgICAgIFdlIHNob3VsZCBwcm9iYWJseSBhZGQgYSB3YXJuaW5nIGZvciB0aGlzLgoKMDcvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBhbiBlcnJvciBjaGVjayB0byBkZXRlY3Qgc2hhZG93ZWQgdGVtcGxhdGUgcGFyYW1hdGVycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgIGludCBUOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIGFuIGVycm9yLCBub3QgYSB3YXJuaW5nLiAgVGhpcyB3YXJuaW5nIGlzCiAgICAgICAgICAgIGFsc28gbmVlZGVkIHRvIGZpeCBzb21lIHJhdGhlciBpbnNpZGlvdXMgcHJvYmxlbXMgbGlrZQogICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgVCB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgIGJsYWg7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIFQgVHJhaXRzOyAgICAvLyBXaGljaCBUIGlzIHRoaXM/Pz8/CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBUIHNoYWRvd3MgdGhlIG91dGVyCiAgICAgICAgICAgIHN0cnVjdHVyZSAod2hpY2ggaXMgd2hhdCB5b3Ugd2FudCkuCgowNy8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHN1cHBvcnQgZm9yIHRlbXBsYXRlcyB3aXRoIGludGVnZXIgYXJndW1lbnRzLiAgU1dJRyBpcwogICAgICAgICAgICBtdWNoIG1vcmUgYXdhcmUgb2Ygc2l0dWF0aW9ucyBzdWNoIGFzIHRoaXM6CgogICAgICAgICAgICAgICAgY29uc3QgaW50IFNpemUgPSAxMDA7CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvbzEwMCkgRm9vPDEwMD47CiAgICAgICAgICAgICAgICB2b2lkIGJhcihGb288U2l6ZT4gKngpOyAgIC8vIEtub3dzIHRoYXQgRm9vPFNpemU+IGlzIHRoZSBzYW1lIGFzIEZvbzwxMDA+OwoKMDcvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCAlZmVhdHVyZS8laWdub3JlLyVyZW5hbWUgYW5kIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpCYXIKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNy8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgY29uc3RydWN0b3JzIHRoYXQgdHJ5IHRvIGNhdGNoCiAgICAgICAgICAgIGV4Y2VwdGlvbnMgaW4gaW5pdGlhbGl6ZXJzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIEJhciBiOwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBGb28oaW50IHgpIHRyeSAKICAgICAgICAgICAgICAgICAgICAgOiBiKHgpIHsgLi4uIH0KICAgICAgICAgICAgICAgICBjYXRjaChpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgaGFzIG5vIGVmZmVjdCBvbiB0aGUgZ2VuZXJhdGVkIHdyYXBwZXJzLiAgSG93ZXZlciwgdGhlIHRyeSBhbmQgY2F0Y2gKICAgICAgICAgICAgcGFydHMgb2YgdGhlIGRlY2xhcmF0aW9uIGFyZSBpZ25vcmVkLiAgU2VlIFN0cm91c3RydXAsIDNyZCBFZCwgc2VjdGlvbiAKICAgICAgICAgICAgMTQuNC42LjEgZm9yIGRldGFpbHMuCiAgICAgICAgICAgICAgICAgICAKMDcvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgaW4gdGVtcGxhdGUgc3ltYm9sIHRhYmxlIG1hbmFnZW1lbnQuICBUaGlzIGZpeGVzCiAgICAgICAgICAgIHR3byBidWdzLiAgRmlyc3QsIG1peGluZyBhYnN0cmFjdCBtZXRob2RzLCB0ZW1wbGF0ZXMsIGFuZCAKICAgICAgICAgICAgaW5oZXJpdGFuY2Ugbm8gbG9uZ2VyIGdlbmVyYXRlcyBhIGZhaWxlZCBhc3NlcnRpb24uCiAKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBPFQ+CiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgJXRlbXBsYXRlKEFfaW50KSBBPGludD47CiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShCX2ludCkgQjxpbnQ+OwoKICAgICAgICAgICAgVGhpcyBmaXggYWxzbyBmaXhlcyBhIHN1YnRsZSBwcm9ibGVtIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kCiAgICAgICAgICAgIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEM+CiAgICAgICAgICAgICAgIHN0cnVjdCBCIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50IHNpemVfdHlwZTsKICAgICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3R5cGUgbmluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPigtMSk7CiAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhzaXplX3R5cGUgaW5kZXggPSBuaW5kZXgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQnVncyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKCjA3LzA1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBDaGFuZ2VkIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBTV0lHX0NvbnZlcnRQdHIoKSBmdW5jdGlvbgoJICAgIGZvciB0aGUgU1dJRy9SdWJ5IHJ1bnRpbWUgc3VwcG9ydCBzbyB0aGF0IGl0IGxvb2tzIGxpa2UgdGhlCgkgICAgUHl0aG9uIHZlcnNpb24uIElmIHRoZSBsYXN0IGFyZ3VtZW50IChmbGFncykgaXMgbm9uLXplcm8sCgkgICAgU1dJR19Db252ZXJ0UHRyKCkgd2lsbCByYWlzZSBhbiBleGNlcHRpb24gZm9yIHR5cGUgbWlzbWF0Y2hlcwoJICAgIGFzIGJlZm9yZS4gSWYgZmxhZ3MgaXMgemVybywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiAtMSBmb3IKCSAgICB0eXBlIG1pc21hdGNoZXMgd2l0aG91dCByYWlzaW5nIGFuIGV4Y2VwdGlvbi4gCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgUlVCWSBNT0RVTEUgKioqCgowNy8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE92ZXJsb2FkZWQgZnVuY3Rpb25zL21ldGhvZHMvY29uc3RydWN0b3JzIG5vdyB3b3JrIGluIG1hbnkgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcy4gIFRoZSBzdXBwb3J0IGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQtLWp1c3QgY2FsbCB0aGUKICAgICAgICAgICAgZnVuY3Rpb24gbm9ybWFsbHkgYW5kIFNXSUcgd2lsbCBkaXNwYXRjaCB0byB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICAgVGhlcmUgYXJlIGEgdmFyaWV0eSBvZiBpc3N1ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMuICBQbGVhc2UgcmVmZXIKICAgICAgICAgICAgdG8gdGhlIG92ZXJsb2FkaW5nIHNlY3Rpb24gb2YgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sIGZvciBkZXRhaWxzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNy8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggbmFtZXNwYWNlcywgZW51bXMsIGFuZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIG5hbWVzcGFjZSBoZWxsbyB7CiAgICAgICAgICAgICAgICAgIGVudW0gSGVsbG8geyBIaSwgSG9sYSB9OwogCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlIDxIZWxsbyBIPgogICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHRyYWl0cwogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIHZhbHVlX3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgICAgdHJhaXRzPEhpPjo6dmFsdWVfdHlwZSBzYXlfaGkoKQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhaXRzPEhpPjo6dmFsdWVfdHlwZSgxKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgU1dJRyB3YXNuJ3QgZ2VuZXJhdGluZyB3cmFwcGVycyB0aGF0IHByb3Blcmx5IHF1YWxpZmllZCAKICAgICAgICAgICAgdHJhaXRzPEhpPi4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuICAgICAgICAgCgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1cHBsaWVkIGFycmF5IHZhcmlhYmxlIHR5cGVtYXBzIGZvciBUY2wgbW9kdWxlLiAgIElmIHlvdSBoYXZlIGEKICAgICAgICAgICAgdmFyaWFibGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGludCBmb29bMTBdOwoKICAgICAgICAgICAgdGhlbiBhIHNldCBmdW5jdGlvbiBsaWtlIHRoaXMgaXMgZ2VuZXJhdGVkOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vX3NldChpbnQgKngpIHsKICAgICAgICAgICAgICAgICAgIG1lbW1vdmUoZm9vLHgsMTAqc2l6ZW9mKGludCkpOwogICAgICAgICAgICAgICAgfQoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgJWZyYWdtZW50IGRpcmVjdGl2ZS4gICBXaGVuIHdyaXRpbmcgdHlwZW1hcHMsIGl0IGNhbiBiZSBlYXN5IHRvCiAgICAgICAgICAgIGdldCBjYXJyaWVkIGF3YXkgYW5kIHdyaXRlIGEgbG90IG9mIGNvZGUuICBIb3dldmVyLCBkb2luZyBzbyBjYXVzZXMKICAgICAgICAgICAgdHJlbWVuZG91cyBjb2RlIGJsb2F0LiAgIEEgY29tbW9uIHdheSB0byBzb2x2ZSB0aGlzIGlzIHRvIHdyaXRlIAogICAgICAgICAgICBoZWxwZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdHlwZSB7CiAgICAgICAgICAgICAgICAgICBzb21lX2hlbHBlcl9mdW5jdGlvbiguLi4pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSB3aXRoIHRoaXMgaXMgdGhhdCB0aGUgd3JhcHBlciBmaWxlIGdldHMgcG9sbHV0ZWQKICAgICAgICAgICAgd2l0aCBoZWxwZXIgZnVuY3Rpb25zIGV2ZW4gaWYgdGhleSBhcmVuJ3QgdXNlZC4gICAgVG8gZml4IHRoaXMsCiAgICAgICAgICAgIGEgbmV3IGZyYWdtZW50IGRpcmVjdGl2ZSBpcyBhdmFpbGFibGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIChjb3JyZWN0ZWQgdHlwbyBpbiBsaW5lIGJlbG93IC0gMDYvMjYvMjAwOCkKICAgICAgICAgICAgICAgJWZyYWdtZW50KCJ0eXBlX2hlYWRlciIsImhlYWRlciIpICV7CiAgICAgICAgICAgICAgICAgIHZvaWQgc29tZV9oZWxwZXJfZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIGZyYWdtZW50PSJ0eXBlX2hlYWRlciIpIHR5cGUgewogICAgICAgICAgICAgICAgICAgc29tZV9oZWxwZXJfZnVuY3Rpb24oLi4uKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgY29kZSBmcmFnbWVudCBpcyBvbmx5IGVtaXR0ZWQgaWYgdGhlIHR5cGVtYXAgaXMKICAgICAgICAgICAgYWN0dWFsbHkgdXNlZC4gICBBIHNpbWlsYXIgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCBmb3IgZGVjbGFyYXRpb24KICAgICAgICAgICAgYW5ub3RhdGlvbiBhbmQgdGhlICVmZWF0dXJlIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImZyYWdtZW50IiwidHlwZV9oZWFkZXIiKSAgU29tZURlY2xhcmF0aW9uOwoKICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvICVmcmFnbWVudCBpcyB0aGUgZnJhZ21lbnQgbmFtZS4gIFRoZSBzZWNvbmQgYXJndW1lbnQKICAgICAgICAgICAgaXMgdGhlIGZpbGUgc2VjdGlvbiB3aGVyZSB0aGUgZnJhZ21lbnQgc2hvdWxkIGJlIGVtaXR0ZWQuICAKCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGRpcmVjdGl2ZSBpcyBmb3Igd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICAgIGFuZCBhZHZhbmNlZCB1c2VycyB3YW50aW5nIHRvIHN0cmVhbWxpbmUgdHlwZW1hcCBjb2RlLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgbWVtYmVyaW4gdHlwZW1hcHMgZm9yIGFsbCBhcnJheXMgaW4gYW4gYXR0ZW1wdCB0byBlbGltaW5hdGUKICAgICAgICAgICAgY29uZnVzaW9uIGFib3V0IHRoZWlyIHVzZS4KCjA2LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHNtYXJ0LXBvaW50ZXJzLiAgV2hlbiBhIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgb3BlcmF0b3ItPigpIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIEJhciAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgbG9jYXRlcyBjbGFzcyBCYXIgYW5kIHRyaWVzIHRvIHdyYXAgaXRzIG1lbWJlciB2YXJpYWJsZXMgYW5kCiAgICAgICAgICAgIG1ldGhvZHMgYXMgcGFydCBvZiBGb28uICBGb3IgZXhhbXBsZSwgaWYgQmFyIHdhcyBkZWZpbmVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICBpbnQgc3BhbSgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgWW91IGNvdWxkIGRvIHRoaXMgKGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UpOgoKICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICBmLnggPSA0ICAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OngKICAgICAgICAgICAgICBmLnNwYW0oKSAgICAgICAgICAgIyBBY2Nlc3NlcyBCYXI6OnNwYW0KCiAgICAgICAgICAgIFRoZSBwcmltYXJ5IHVzZSBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gZW11bGF0ZSB0aGUgYmVoYXZpb3Igb2YgQysrCiAgICAgICAgICAgIHNtYXJ0LXBvaW50ZXJzLS0td2hpY2ggYWxsb3cgYXR0cmlidXRlcyB0byBhY2Nlc3NlZCB0cmFuc3BhcmVudGx5CiAgICAgICAgICAgIHRocm91Z2ggb3BlcmF0b3ItPi4KCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYXV0b21hdGljYWxseSBpbiBTV0lHLS0tbm8gc3BlY2lhbCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGFyZSBuZWVkZWQuICAgVG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLiAgVXNlICVpZ25vcmUgdG8gaWdub3JlIAogICAgICAgICAgICBvcGVyYXRvci0+LgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNi8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICVleGNlcHQgZGlyZWN0aXZlLiAgICVleGNlcHRpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KCjA2LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWFqb3IgY2xlYW51cCBvZiB0aGUgbW9kdWxlcyBkaXJlY3RvcnkuICBFbGltaW5hdGVkIG1vc3QKICAgICAgICAgICAgaGVhZGVyIGZpbGVzLCBjb25zb2xpZGF0ZWQgbW9kdWxlIGNvZGUgaW50byBzaW5nbGUgZmlsZXMuCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBpbnN0YW50aWF0aW9uIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBBbGwgbGFuZ3VhZ2UKICAgICAgICAgICAgbW9kdWxlcyBtdXN0IG5vdyBkZWZpbmUgYSBmYWN0b3J5IGZ1bmN0aW9uIHNpbWlsYXIgdG8gdGhpczoKCiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICoKICAgICAgICAgICAgICAgIHN3aWdfcHl0aG9uKHZvaWQpIHsKICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUFlUSE9OKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHRoZW4gcGxhY2VkIGluIGEgdGFibGUgYW5kIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgICBhIGNvbW1hbmQgbGluZSBvcHRpb24gaW4gc3dpZ21haW4uY3h4LiAgCgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGhhcyBhIG51bWJlciBvZiBiZW5lZml0cy4gIEl0IGRlY291cGxlcyB0aGUgCiAgICAgICAgICAgIFNXSUcgbWFpbiBwcm9ncmFtIGZyb20gaGF2aW5nIHRvIGtub3cgYWJvdXQgdGhlIGNsYXNzCiAgICAgICAgICAgIGRlZmluaXRpb25zIGZvciBlYWNoIG1vZHVsZS4gIEFsc28sIGJ5IHVzaW5nIGEgZmFjdG9yeQogICAgICAgICAgICBmdW5jdGlvbiwgaXQgd2lsbCBiZSBlYXNpZXIgdG8gaW1wbGVtZW50IGR5bmFtaWMgbG9hZGluZwogICAgICAgICAgICBvZiBtb2R1bGVzIChzaW1wbHkgbG9hZCB0aGUgZmlsZSBhbmQgaW52b2tlIHRoZSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uKS4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciByZWZlcmVuY2UgY29udmVyc2lvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIEZvbyAmKCk7CgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN5bnRheCBlcnJvciBmb3Igb3BlcmF0b3IgbmV3W10gYW5kIG9wZXJhdG9yIGRlbGV0ZVtdLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjb2RlIGdlbmVyYXRpb24gcHJvYmxlbSBmb3IgY29uc3RhbnRzIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICBpbnZvbHZpbmcgdGVtcGxhdGVzLgoKMDYvMTkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIGEgYnVnIGZvciB0aGUgJy1mZWF0dXJlJyBjb21tYW5kIGxpbmUgYXJndW1lbnQ7CiAgICAgICAgICAgIHRoYXQgc2V0dGluZyB3YXMgZWZmZWN0aXZlbHkgYmVpbmcgaWdub3JlZCBhbmQgc28gdGhlIGZlYXR1cmUKICAgICAgICAgICAgbmFtZSB3YXMgYWx3YXlzIHNldCBlcXVhbCB0byB0aGUgbW9kdWxlIG5hbWUuCgowNi8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW1zIHdpdGggc3RhdGljIG1lbWJlcnMgYW5kIGVudW1zIGluIHRlbXBsYXRlcy4KClZlcnNpb24gMS4zLjEzIChKdW5lIDE3LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBfX0ZJTEVfXyBleHBhbnNpb24gaW4gdGhlIHByZXByb2Nlc3Nvci4gICBPbiBXaW5kb3dzLAogICAgICAgICAgICB0aGUgYmFja3NsYXNoIChcKSBpcyBub3cgY29udmVydGVkIHRvIChcXCkgaW4gdGhlIHN0cmluZyBsaXRlcmFsCiAgICAgICAgICAgIHVzZWQgZm9yIF9fRklMRV9fLiAgUmVwb3J0ZWQgYnkgU3RldmUgR2xhc2VyLgoKMDYvMTQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgJ25hbWUgcHJpdmF0ZSBpbiB0aGlzIGNvbnRleHQnLiAgVGhlCiAgICAgICAgICAgIHdhcm5pbmcgaXMgb25seSBnZW5lcmF0ZWQgZm9yIHB1YmxpYyBtZXRob2RzLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgU2NvdHQgTWljaGVsLgogCjA2LzE0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gCiAgICAgICAgICAgIGFuZCBuYW1lc3BhY2VzLiAgIFdoZW4gU1dJRyBleHBhbmRzIGEgdGVtcGxhdGUsIGl0IGRvZXMKICAgICAgICAgICAgc28gd2l0aCBmdWxseSByZXNvbHZlZCB0eXBlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGZvbyB7IH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBEb3VibGU7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vX2QpIGZvbzxEb3VibGU+OwoKICAgICAgICAgICAgdGhlbiwgaXQgaXMgaGFuZGxlZCBhcyBmb288ZG91YmxlPiBpbiB0aGUgdHlwZXN5c3RlbS4KICAgICAgICAgICAgVGhpcyBmaXhlcyBhIG51bWJlciBvZiBzdWJ0bGUgcHJvYmxlbXMgd2l0aCBpbmhlcml0YW5jZQogICAgICAgICAgICBhbmQgdGVtcGxhdGVzLgoKMDYvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG1pc3NpbmcgYm9vbCB0eXBlbWFwcyBmb3IgSU5QVVQsIE9VVFBVVCBhbmQKCSAgICBJTk9VVCBpbiBMaWIvcnVieS90eXBlbWFwcy5pLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGEgY291cGxlIG9mIGJyb2tlbiBwcmFnbWFzLgoKMDUvMjkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3IgdW5uZWNlc3NhcnkgY2FzdCB3aGVuIHdyYXBwaW5nIGdsb2JhbCB2YXJpYWJsZSB3aGVyZSAKICAgICAgICAgICAgdGhlIHR5cGUgaXMgbm90IHBhcnNlZCBieSBTV0lHIC0gSmF2YSB2YXJpYWJsZXMgZXhhbXBsZSAKICAgICAgICAgICAgZmFpbHVyZSBhcyByZXBvcnRlZCBieSBMYXJyeSBWaXJkZW4uCgowNi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkICV0ZW1wbGF0ZSB0byBhbGxvdyBmb3IgZW1wdHkgaW5zdGFudGlhdGlvbnMuCgogICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBmb288aW50LGludD47CgogICAgICAgICAgICBUaGlzIHJlZ2lzdGVycyBmb288aW50LGludD4gd2l0aCB0aGUgdHlwZSBzeXN0ZW0sIGJ1dAogICAgICAgICAgICBkb2Vzbid0IHdyYXAgaXQgKHNhbWUgYXMgJWlnbm9yZSkuICAgVGhpcyBtYXkgb25seSBiZSBhCiAgICAgICAgICAgIHRlbXBvcmFyeSBtZWFzdXJlLiAgIFNXSUcgbWlnaHQgYmUgYWJsZSB0byBhdXRvbWF0aWNhbGx5CiAgICAgICAgICAgIGluc3RhbnRpYXRlIHRlbXBsYXRlcyBpbiBjZXJ0YWluIGNhc2VzLgoKMDYvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBmdW5jdGlvbiBwcm90b3R5cGUgcHJvYmxlbXMgd2l0aCBUY2wgOC40CgowNi8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCB0ZW1wbGF0ZXMgYW5kIGxvY2F0aW9uIG9mIGJhc2UgY2xhc3Nlcy4gIAogICAgICAgICAgICBUaGlzIG9uZSBpcyBhIGxpdHRsZSBtaW5kLWJlbmRpbmcsIGJ1dCBoZXJlIGlzIGFuIGV4YW1wbGUKICAgICAgICAgICAgdGhhdCBpbGx1c3RyYXRlczoKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGUsIGNsYXNzIFJlc1R5cGU+CiAgICAgICAgICAgICBzdHJ1Y3QgdHJhaXRzCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIHR5cGVkZWYgQXJnVHlwZSBhcmdfdHlwZTsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBSZXNUeXBlIHJlc190eXBlOwogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFyZ1R5cGUsIGNsYXNzIFJlc1R5cGU+CiAgICAgICAgICAgICBzdHJ1Y3QgRnVuY3Rpb24KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBBRiwgY2xhc3MgQUc+CiAgICAgICAgICAgICBzdHJ1Y3QgQ2xhc3MgOiBGdW5jdGlvbjx0eXBlbmFtZSB0cmFpdHM8QUYsIEFHPjo6YXJnX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSB0cmFpdHM8QUYsIEFHPjo6cmVzX3R5cGU+CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICV0ZW1wbGF0ZSh0cmFpdHNfZGQpIHRyYWl0cyA8ZG91YmxlLCBkb3VibGU+OwogICAgICAgICAgICAgJXRlbXBsYXRlKEZ1bmN0aW9uX2RkKSBGdW5jdGlvbiA8ZG91YmxlLCBkb3VibGU+OwogICAgICAgICAgICAgJXRlbXBsYXRlKENsYXNzX2RkKSBDbGFzcyA8ZG91YmxlLCBkb3VibGU+OwoKCiAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIGJhc2UgY2xhc3Mgb2YgJ0NsYXNzJyBpcyBkZXRlcm1pbmVkIGZyb20KICAgICAgICAgICAgdGhlIEZ1bmN0aW9uIHRlbXBsYXRlLCBidXQgdGhlIHR5cGVzIGFyZSBvYnRhaW5lZCB0aHJvdWdoIHR5cGVkZWZzLgogICAgICAgICAgICBCZWNhdXNlIG9mIHRoaXMsIFNXSUcgY291bGQgbm90IGxvY2F0ZSB0aGUgd3JhcHBlZCBiYXNlIGNsYXNzCiAgICAgICAgICAgIChGdW5jdGlvbjxkb3VibGUsZG91YmxlPikuICAgU2hvdWxkIGJlIGZpeGVkIGluIDEuMy4xMyBldmVuCiAgICAgICAgICAgIHRob3VnaCBJIGNhbiB0aGluayBvZiBhIG1pbGxpb24gb3RoZXIgdGhpbmdzIHRoYXQgbWlnaHQKICAgICAgICAgICAgYWxzbyBiZSBicm9rZW4uCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvbnZlcnNpb24gb3BlcmF0b3JzLiAgSWYgeW91IGhhZCBhbgogICAgICAgICAgICBvcGVyYXRvciBsaWtlIHRoaXMsCgogICAgICAgICAgICAgICAgICBvcGVyYXRvciBkb3VibGUoKSBjb25zdDsKCiAgICAgICAgICAgIFNXSUcgd2FzIG9tbWl0dGluZyB0aGUgImNvbnN0IiBxdWFsaWZpZXIuICBUaGlzIGFmZmVjdGVkCiAgICAgICAgICAgICVyZW5hbWUgYW5kIG90aGVyIGRpcmVjdGl2ZXMuICBSZXBvcnRlZCBieSBaaG9uZyBSZW4uCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIExlc3NlbmVkIHRoZSBzdHJpY3RuZXNzIG9mIGFic3RyYWN0IGNsYXNzIGNoZWNraW5nLiAgSWYKICAgICAgICAgICAgeW91IGhhdmUgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IG1ldGhvZCgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgIFNXSUcgd2lsbCBnbyBhaGVhZCBhbmQgZ2VuZXJhdGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcnMKICAgICAgICAgICAgIGZvciBCYXIuICBIb3dldmVyLCBpdCB3aWxsIGFsc28gZ2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UgCiAgICAgICAgICAgICB0aGF0ICJCYXIiIG1pZ2h0IGJlIGFic3RyYWN0IChzaW5jZSBtZXRob2QoKSBpc24ndCBkZWZpbmVkKS4KICAgICAgICAgICAgIEluIFNXSUctMS4zLjEyLCBTV0lHIHJlZnVzZWQgdG8gZ2VuZXJhdGUgYSBjb25zdHJ1Y3RvciBhdCBhbGwuCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byAldGVtcGxhdGUgZGlyZWN0aXZlLiAgSWYgeW91IHNwZWNpZnkgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmkpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBJdCBpcyAqZXhhY3RseSogdGhlIHNhbWUgYXMgdGhpczoKIAogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZpKSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFNXSUctMS4zLjEyIHRyaWVkIHRvIGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBvdXRzaWRlIG9mIHRoZSBuYW1lc3BhY2UKICAgICAgICAgICAgdXNpbmcgc29tZSB0cmljay4gIEhvd2V2ZXIsIHRoaXMgd2FzIGV4dHJlbWVseSBwcm9ibGVtYXRpYyBhbmQgZnVsbAogICAgICAgICAgICBob2xlcy4gICBUaGlzIHZlcnNpb24gaXMgc2FmZXIuCgowNi8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIHNjb3BlIHF1YWxpZmljYXRpb24gYW5kIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBBPEI6OkM+OjpERAoKICAgICAgICAgICAgQmVmb3JlLCB0aGlzIHdhcyBzZXBhcmF0ZWQgYXMgc2NvcGVzIEE8QiwgQz4sIGFuZCBERC4gIEZpeGVkIG5vdy4KCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWxsb3cgdGhlIGZvbGxvd2luZyBzeW50YXg6IAogICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgY2xhc3MgQSB7IH07CiAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQSB7IC4uLiB9OwoKICAgICAgICAgICAgQSBiYXNlIGNsYXNzIHdpdGhvdXQgYSBzcGVjaWZpZXIgaXMgYXNzdW1lZCB0byBiZSBwdWJsaWMgZm9yIGEgc3RydWN0LgogCjA2LzA2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIHdpdGggdGVtcGxhdGUgY29uc3RydWN0b3IgaW5pdGlhbGl6ZXJzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cy4gCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNi8wNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHN1YnRsZSBwcm9ibGVtcyB3aXRoICVyZW5hbWUgZGlyZWN0aXZlIGFuZCB0ZW1wbGF0ZQogICAgICAgICAgICBleHBhbnNpb24uCgogICAgICAgICAgICBDb2RlIGxpa2UgdGhpcyBzaG91bGQgbm93IHdvcms6CgogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWgpIGZvbzxkb3VibGU+OjptZXRob2Q7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBmb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICB2b2lkIG1ldGhvZCgpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgJXRlbXBsYXRlKHdoYXRldmVyKSBmb288ZG91YmxlPjsKCjA2LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmVzb2x2ZWQgc29tZSB0cmlja3kgaXNzdWVzIG9mIG11bHRpLXBhc3MgY29tcGlsYXRpb24gYW5kIAogICAgICAgICAgICBhbmQgaW5oZXJpdGFuY2UuICBUaGUgZm9sbG93aW5nIHNpdHVhdGlvbiBub3cgZ2VuZXJhdGVzCiAgICAgICAgICAgIGFuIGVycm9yOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIGEgd2FybmluZyBhYm91dCBpbmNvbXBsZXRlIGNsYXNzZXMuCgogICAgICAgICAgICAgICAgICBjbGFzcyBCYXI7CiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgeyB9OwoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBjb2RlIGdlbmVyYXRlcyBhIHdhcm5pbmcgYWJvdXQgYW4gdW5kZWZpbmVkIGNsYXNzLgoKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7IH07ICAvLyBCYXIgdW5kZWZpbmVkCgogICAgICAgICAgICBUaGlzIGZpeGVzIGEgZmFpbGVkIGFzc2VydGlvbiBidWcgcmVwb3J0ZWQgYnkgSmFzb24gU3Rld2FydC4KCjA2LzA1LzIwMDI6IGxqb2huc29uCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSBmb3IgdGhlIFJ1YnkgbW9kdWxlIGFib3V0IHRoZSBsYWNrCiAgICAgICAgICAgIG9mIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLiBPbmx5IHRoZSBmaXJzdCBiYXNlIGNsYXNzCiAgICAgICAgICAgIGxpc3RlZCBpcyB1c2VkIGFuZCB0aGUgb3RoZXJzIGFyZSBpZ25vcmVkLiAoUmVwb3J0ZWQgYnkgQ3JhaWcKICAgICAgICAgICAgRmlsZXMpLgogICAgICAgICAgICAKMDYvMDMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIHN0cnVjdCBkZWNsYXJhdGlvbnMgYW5kIHR5cGVkZWYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBGb28gRm9vOwogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBBIGZldyBvdGhlciBzdWJ0bGUgc3RydWN0IHJlbGF0ZWQgdHlwaW5nIHByb2JsZW1zIHdlcmUKICAgICAgICAgICAgYWxzbyByZXNvbHZlZC4KClZlcnNpb24gMS4zLjEyIChKdW5lIDIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgIAowNS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gcmVsYXRlZCB0byBmb3J3YXJkIHRlbXBsYXRlIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICAgbmFtZXNwYWNlcy4gIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCAnbWFrZSB1bmluc3RhbGwnIHRhcmdldC4gIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjA1LzI5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcmF0aGVyIGluc2lkaW91cyBidWcgd2l0aCAlcmVuYW1lLCAlZmVhdHVyZSBhbmQgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVleGNlcHRpb24gdmVjdG9yOjpfX2dldGl0ZW1fXyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFQgX19nZXRpdGVtX18oaW50IGluZGV4KTsgICAgICAgLy8gRmluZQogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTw+IGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICBUIF9fZ2V0aXRlbV9fKGludCBpbmRleCk7ICAgICAgIC8vIE9vcHMuCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93LCB0aGUgJWV4Y2VwdGlvbiBkaXJlY3RpdmUgKGFuZCBvdGhlciBmZWF0dXJlcykgc2hvdWxkIGNvcnJlY3RseSBhcHBseSB0bwogICAgICAgICAgICBib3RoIHZlY3RvciBhbmQgc3BlY2lhbGl6YXRpb25zLgoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlcyB0byAldGVtcGxhdGUoKSBkaXJlY3RpdmUuICAgVGVtcGxhdGUgYXJndW1lbnRzIGFyZSBub3cKICAgICAgICAgICAgcmVkdWNlZCB0byBwcmltaXRpdmUgdHlwZXMgaW4gdGVtcGxhdGUgbWF0Y2hpbmcuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvcjxUICo+IHsKICAgICAgICAgICAgICAgIC4uLiBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICB0eXBlZGVmIGludCAqSW50UHRyOyAgICAgLy8gR3Jvc3MgdHlwZWRlZgoKICAgICAgICAgICAgICAgLy8gR2V0cyB0aGUgYWJvdmUgcGFydGlhbCBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICAgICAldGVtcGxhdGUodmVjdG9ySW50UHRyKSB2ZWN0b3I8SW50UHRyPjsKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGV4dHJlbWVseSBzdWJ0bGUsIGJ1dCBpdCBmaXhlcyBhIG51bWJlciBvZiBwb3RlbnRpYWwKICAgICAgICAgICAgaG9sZXMgaW4gTHVpZ2kncyBTVEwgbGlicmFyeSBtb2R1bGVzLiAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3RvcmkpIHZlY3RvcjxpbnQ+OwoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCByYXRoZXIgaW5zaWRpb3VzIHR5cGVtYXAgYnVnIHJlbGF0ZWQgdG8gY29uc3QuICBjb25zdAogICAgICAgICAgICB3YXMgYmVpbmcgZGlzY2FyZGVkIHRocm91Z2ggdHlwZWRlZnMuCgowNS8yOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgaW5wdXQgdHlwZW1hcHMgZm9yIGNvbnN0IHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlCiAgICAgICAgICAgIHR5cGVzIChpbiBMaWIvcnVieS9ydWJ5LnN3ZykuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBqYXZhIGFycnJheSBzdXBwb3J0IGZ1bmN0aW9ucyBhcmUgZW5jbG9zZWQgYnkgCiAgICAgICAgICAgIGEgU1dJR19OT0FSUkFZUyAjZGVmaW5lLiBVc2VmdWwgaWYgbm90IHVzaW5nIGFycmF5cyBhbmQgCiAgICAgICAgICAgIGl0IGlzIGRlc2lyYWJsZSB0byBtaW5pbWlzZSB0aGUgYW1vdW50IG9mIGNvbXBpbGVkIGNvZGUuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEVudW1zIHdlcmUgbm90IHJlbmFtZWQgd2hlbiB1c2luZyAlbmFtZSBvciAlcmVuYW1lCiAgICAgICAgICAgIGZpeC4KCjA1LzI4LzIwMDI6IGxqb2huc29uCiAgICAgICAgICAgIFtSdWJ5XSBNb2RpZmllZCB0aGUgbmFtZSBvZiB0aGUgd3JhcHBlciBmdW5jdGlvbnMgZm9yIHRoZQoJICAgICJuZXciIHNpbmdsZXRvbiBtZXRob2QgYW5kICJpbml0aWFsaXplIiBpbnN0YW5jZSBtZXRob2QgZm9yCgkgICAgY29uc2lzdGVuY3kgd2l0aCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcy4gVGhlIHdyYXBwZXIgbmFtZQoJICAgIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzICJuZXciIGlzIGFsbG9jX2NsYXNzbmFtZSBhbmQKCSAgICB0aGUgd3JhcHBlciBuYW1lIGZvciB0aGUgZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzICJpbml0aWFsaXplIgoJICAgIGlzIG5ld19jbGFzc25hbWUuCgoKMDUvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHJ1bnRpbWUuICBQb2ludGVyIGNvbnZlcnNpb24vY3JlYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICAgIG5vdyBhbG1vc3QgYWx3YXlzIGhhdmUgYW4gZXh0cmEgImZsYWdzIiBhcmd1bWVudC4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICBTV0lHX0NvbnZlcnRQdHIob2JqLCB2b2lkICoqLCBzd2lnX3R5cGVfaW5mbyAqdHksIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eCiAgICAgICAgICAgIFRoaXMgZXh0cmEgcGFyYW1ldGVyIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uIGFuZCB3aWxsCiAgICAgICAgICAgIGJlIHVzZWQgZm9yIG1vcmUgY29udHJvbCBvdmVyIHBvaW50ZXJzIGluIGZ1dHVyZSB2ZXJzaW9ucy4KCjA1LzI3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4IGZvciBDKysgY2xhc3NlcyB3aXRoIHByaXZhdGUgYXNzaWdubWVudCBvcGVyYXRvcnMuICBJdAogICAgICAgICAgICBpcyBub3cgcG9zc2libGUgdG8gc2FmZWx5IHJldHVybiBvYmplY3RzIGxpa2UgdGhpcyBieSB2YWx1ZS4KICAgICAgICAgICAgQ2F2ZWF0OiAgdGhlIGNsYXNzIG11c3QgcHJvdmlkZSBhIGNvcHkgY29uc3RydWN0b3IuCgkgICAgCjA1LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgLXByb3h5IG9wdGlvbiBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuICBUaGlzIGlzIHRoZQogICAgICAgICAgICBzYW1lIGFzIC1zaGFkb3cuICBXZSBhcmUgbWVyZWx5IGNoYW5naW5nIHRlcm1pbm9sb2d5LgogICAgICAgICAgICAKMDUvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgc29tZSBpbmNvbnNpc3RlbmNpZXMgaW4gdGhlIC1wYWNrYWdlIG9wdGlvbi4KICAgICAgICAgICAgLXBhY2thZ2UgbWVyZWx5IHNldHMgdGhlIHBhY2thZ2UgbmFtZSB0byBiZSB1c2VkIG9uIHRoZQogICAgICAgICAgICB3cmFwcGVycy4gIEl0IGRvZXMgbm90IGNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGxpYnJhcnkKICAgICAgICAgICAgZmlsZSBvciB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIC5wbSBmaWxlLiAgVGhpcyB3YXMKICAgICAgICAgICAgYnJva2VuIGF0IHNvbWUgcG9pbnQsIGJ1dCB3b3JrcyBhZ2FpbiBub3cuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBbIDQ3NTQ1MiBdIG1lbW9yeSBsZWFrIGluIHJldHVybi1ieS12YWx1ZS4KICAgICAgICAgICAgUHJvYmxlbSByZWxhdGVkIHRvIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIHJldHVybmluZyBuZXdseQogICAgICAgICAgICBhbGxvY2F0ZWQgb2JqZWN0cy4gUmVwb3J0ZWQgYnkgUm95IExlY2F0ZXMuCiAKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbcGVybF0gRml4ZWQgWyA1MTMxMzQgXSAlQkxFU1NFRE1FTUJFUlMgaXNuJ3QgYWx3YXlzIHJpZ2h0LgogICAgICAgICAgICBSZXBvcnRlZCBieSBGbGV1ciBEaWFuYSBEcmFnYW4uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQwNzM1IF0gLWltcG9ydGFsbCBhbmQgdGhlIC1JIG9wdGlvbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW2d1aWxlXSBGaXhlZCBbIDUzMjcyMyBdIERlZmF1bHQgYXJnIGZvciBjaGFyKiBjYW4gU2VnVi4gIAogICAgICAgICAgICBFcnJvciBpbiBndWlsZSBtb2R1bGUuICBSZXBvcnRlZCBieSBCcmV0dCBXaWxsaWFtcy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byB0eXBlbWFwIGFwcGxpY2F0aW9uIGNvZGUuICBUaGUgImZyZWVhcmciCiAgICAgICAgICAgIHR5cGVtYXAgbXVzdCBleGFjdGx5IG1hdGNoIHVwIHdpdGggdGhlICJpbiIgb3IgImlnbm9yZSIKICAgICAgICAgICAgdHlwZW1hcC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGNoYXIgKmRhdGEsIGludCBsZW4pIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoZnJlZWFyZykgY2hhciAqZGF0YSB7IC4uLiB9OyAKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oY2hhciAqZGF0YSwgaW50IGxlbik7CgogICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgImluIiB0eXBlbWFwIGlzIGFwcGxpZWQsIGJ1dCB0aGUKICAgICAgICAgICAgIGZyZWVhcmcgdHlwZW1hcCBpcyBub3QuICBUaGlzIGlzIGJlY2F1c2UgdGhlIGZyZWVhcmcKICAgICAgICAgICAgIHR5cGVtYXAgZG9lc24ndCBtYXRjaCB1cCB3aXRoIHRoZSBpbnB1dCBhcmd1bWVudCBzZXF1ZW5jZS4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDgyNzIgXSBEZWZhdWx0IGFyZ3VtZW50IGNvZGUgbWlzc2luZyBicmFjZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyZXR0IFdpbGxpYW1zLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0NzczMCBdIFN3aWdWYWx1ZVdyYXBwZXIgbmVlZGVkIGZvciBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBVbmRlZmluZWQgaWRlbnRpZmllcnMgbm93IGV2YWx1YXRlIHRvIDAgd2hlbiBldmFsdWF0aW5nCiAgICAgICAgICAgIHByZXByb2Nlc3NvciBleHByZXNzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgI2lmICFGT08KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAKICAgICAgICAgICAgd2hlcmUgRk9PIGlzIHVuZGVmaW5lZCBvciBzZXQgdG8gc29tZSBub24tbnVtZXJpYyB2YWx1ZS4KCiAgICAgICAgICAgIEZpeGVzIFsgNTQwODY4IF0gI2lmIGRlZmluZWQgd2hhdGV2ZXIgLSBub3QgcGFyc2VkLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBZGFtIEh1cHAuCgogCjA1LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgaWdub3JlcyB0aGUgQysrICdleHBvcnQnIGtleXdvcmQuCgowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgcmVmaW5lbWVudCBvZiB0eXBlLW5hbWUgbWFuZ2xpbmcgdG8gYWNjb3VudCBmb3IgcG9pbnRlcnMsIGFycmF5cywKICAgICAgICAgICAgcmVmZXJlbmNlcywgYW5kIG90aGVyIGVtYmVkZGVkIHR5cGUgY29uc3RydWN0cy4KCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW5pdGlhbCBhdHRlbXB0IGF0IHN1cHBvcnRpbmcgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbi4gIEF0CiAgICAgICAgICAgIHRoZSB2ZXJ5IGxlYXN0LCBpdCBpcyBwYXJzZWQgYW5kIHRoZSBjbGFzc2VzIGFyZSBzdG9yZWQuICBNYXRjaGluZwogICAgICAgICAgICBvZiBpbnN0YW50aWF0aW9ucyB0byBzcGVjaWFsaXplZCB2ZXJzaW9uIGlzIG1vcmUgbGltaXRlZCBhbmQgYmFzZWQgb24KICAgICAgICAgICAgdGhlIFNXSUcgZGVmYXVsdCB0eXBlbWFwIHJ1bGVzOgoKICAgICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKgogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbXQogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAmCgogICAgICAgICAgICBOb3csIHdoeSBpbiB0aGUgd29ybGQgd291bGQgeW91IHdhbnQgdG8gdXNlIHRoaXMgZmVhdHVyZT8gIE90aGVyCiAgICAgICAgICAgIHRoYW4gYWxsb3dpbmcgZm9yIHNsaWdodGx5IG1vZGlmaWVkIGNsYXNzIEFQSXMsIHRoaXMgY2FwYWJpbGl0eSBpcwogICAgICAgICAgICBwcmltYXJpbHkgdXNlZCB0byBwcm92aWRlIGFkdmFuY2VkIHdyYXBwaW5nIHN1cHBvcnQgZm9yIFNUTC1saWtlCiAgICAgICAgICAgIG9iamVjdHMuICBJdCBjYW4gYWxzbyBiZSBtaXhlZCB3aXRoIHR5cGVtYXBzLiAgSGVyZSBpcyBhbiBleGFtcGxlOgoKCiAgICAgICAgICAgICAgICAvKiBHZW5lcmljIHZlcnNpb24gKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxUPiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2Ygb2JqZWN0cyAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyogUGFydGlhbCBzcGVjaWFsaXphdGlvbiAocG9pbnRlcnMpICovCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyB2ZWN0b3I8VCAqPiB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxUPiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2YgcG9pbnRlcnMgdG8gb2JqZWN0cy4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyogU3BlY2lhbGl6YXRpb24gKGludGVnZXJzKS4gKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBjb250YWluZXIgb2YgaW50ZWdlcnMuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50IHRvIHR5cGVtYXBzLiAgIE5vcm1hbGx5LCB0eXBlbWFwIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICAgcmVuYW1lZCB0byBhdm9pZCBjb25mbGljdHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgKiAoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gY29kZSB0aGF0IGNyZWF0ZXMgYW5kIHVzZXMgdmFyaWFibGVzICJ0ZW1wMSIsInRlbXAyIiwgCiAgICAgICAgICAgICJ0ZW1wMyIgYW5kIHNvIGZvcnRoIGRlcGVuZGluZyBvbiBob3cgbWFueSB0aW1lcyB0aGUgdHlwZW1hcCBpcyB1c2VkLgogICAgICAgICAgICBTb21ldGltZXMgeW91IHdhbnQgYSBzaW5nbGUgdmFyaWFibGUgaW5zdGVhZC4gIFRvIGRvIHRoYXQsIHVzaW5nCiAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgbmFtaW5nIHNjaGVtZToKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50ICooaW50IF9nbG9iYWxfdGVtcCkgewogICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgIElzIHRoaXMgY2FzZSwgYSBzaW5nbGUgdmFyaWFibGUgX2dsb2JhbF90ZW1wIGlzIGVtaXR0ZWQgaW4gdGhlCiAgICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb25zLiAgSXQgaXMgc2hhcmVkIGFjcm9zcyBhbGwgdHlwZW1hcHMuICBSZXBlYXRlZAogICAgICAgICAgICB0eXBlbWFwcyBkbyBub3QgcmVwbGljYXRlIHRoZSB2YXJpYWJsZS0tLXRoZXkgdXNlIHRoZSBmaXJzdCBvbmUKICAgICAgICAgICAgZW1pdHRlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAowNS8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHR5cGVtYXBzLiAgSWYgeW91IGhhdmUgdGhpcyBjb2RlLAoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbyAoaW50IHNvbWV2YXIgPSAzKSB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSBmb3Igc29tZXZhciBpcyBub3cgZW1pdHRlZCBpbnRvIHRoZSB3cmFwcGVyIGNvZGUuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkICVleHRlbmQgdG8gYmUgYmV0dGVyIGJlaGF2ZWQgaW4gbmFtZXNwYWNlcy4gIElmIHlvdSBoYXZlIGNvZGUKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmFyIHsKICAgICAgICAgICAgICAgICAgICAgICAgJWV4dGVuZCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgCiAgICAgICAgICAgIFNXSUcgbWF0Y2hlcyB0aGUgYmxhaCgpIG1ldGhvZCB0byBhIEMgZnVuY3Rpb24gbmFtZWQgCiAgICAgICAgICAgIHZvaWQgZm9vX2Jhcl9ibGFoKGZvbzo6YmFyICpzZWxmKS4KCiAgICAgICAgICAgIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBub24tbmFtZXNwYWNlIHZlcnNpb24uCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJjZWxvIE1hdHVzLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlczogY3BvaW50ZXIuaSwgY2FycmF5cy5pLCBjbWFsbG9jLmkuICBUaGVzZQogICAgICAgICAgICBwcm92aWRlIGFjY2VzcyB0byBDIHBvaW50ZXJzIGFuZCBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbnMuCiAgICAgICAgICAgIFNlZSBEb2MvTWFudWFsL0xpYnJhcnkuaHRtbCBmb3IgZGV0YWlscy4KCjA1LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQyB0eXBlIGNoYXIgbm8gbG9uZ2VyIG1hcHMgdG8gSmF2YSB0eXBlIGJ5dGUsIGJ1dCB0byBKYXZhIHR5cGUgY2hhci4KICAgICAgICAgICAgSXQgaXMgbm93IHRyZWF0ZWQgYXMgYSBjaGFyYWN0ZXIgcmF0aGVyIHRoYW4gYSBzaWduZWQgbnVtYmVyLiBUaGlzIGZpdHMgaW4KICAgICAgICAgICAgd2l0aCB0aGUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgaXMgYSBtb3JlIG5hdHVyYWwgbWFwcGluZyBhcyBjaGFyKiBpcyAKICAgICAgICAgICAgbWFwcGVkIGFzIGEgc3RyaW5nIG9mIGNoYXJhY3RlcnMuIE5vdGUgdGhhdCB0aGUgQyBzaWduZWQgY2hhciB0eXBlIGlzIHN0aWxsCiAgICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgYnl0ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSW1wcm92ZWQgY29uc3RhbnRzIHdyYXBwaW5nLiBDb25zdGFudHMgKCNkZWZpbmUgYW5kICVjb25zdGFudCkgdmFsdWVzIAogICAgICAgICAgICBhcmUgbm93IG9idGFpbmVkIHRocm91Z2ggYSBKTkkgY2FsbC4gUHJldmlvdXNseSB0aGUgdmFsdWUgd2FzIGNvbXBpbGVkIGFzIAogICAgICAgICAgICBKYXZhIGNvZGUsIGJ1dCB0aGlzIGRpZG4ndCB3b3JrIGZvciBhbGwgY2FzZXMsIGVnICNkZWZpbmUgMTIzVUxMLgoKMDUvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBib2d1cyBlcnJvciBtZXNzYWdlIHdpdGggJWV4dGVuZCBkaXJlY3RpdmUgYW5kIEMrKwogICAgICAgICAgICBhY2Nlc3Mgc3BlY2lmaWVycy4gIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5hbWVzcGFjZXMgYW5kIGVudW1zIG5vdyB3b3JrIGNvcnJlY3RseS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgIGVudW0gQmFyIHsgQSwgQiB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldHlwZXMgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCB0byBzcGVjaWZ5IGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMKICAgICAgICAgICAgaW4gdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAldHlwZXMoRm9vID0gQmFyKTsKCiAgICAgICAgICAgIHNwZWNpZmllcyB0aGF0IEZvbyBpc2EgQmFyLiAgICBVc2luZyB0aGlzIGlzIHBvdGVudGlhbGx5IHF1aXRlIGRhbmdlcm91cy4KICAgICAgICAgICAgSG93ZXZlciwgdGhpcyBpcyB1c2VmdWwgaW4gY2VydGFpbiBjYXNlcyAoYW5kIGluIHRoZSBTV0lHIGxpYnJhcnkpLgogICAgICAgICAgICAKMDUvMjAvMjAwMjogYmVhemxleQogICAgICAgICAgICAlbm9kZWZhdWx0IGFuZCAlbWFrZWRlZmF1bHQgZGlyZWN0aXZlcyBub3cgcmVxdWlyZSBhIHRyYWlsaW5nIHNlbWljb2xvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdDsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0OwoKICAgICAgICAgICAgSW4gYWRkaXRpb24gYm90aCBkaXJlY3RpdmVzIGNhbiB0YWtlIGEgY2xhc3MgbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQgRm9vOwoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7ICAgLyogTm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yICovCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7ICAvKiBEZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgZ2VuZXJhdGVkICovCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIElmIHlvdSBkb24ndCB1c2UgdGhlIHRyYWlsaW5nIHNlbWljb2xvbiwgdGhpbmdzIHdpbGwgbXlzdGVyaW91c2x5IGJyZWFrLgoKMDUvMjAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNb3JlIGltcHJvdmVtZW50cyB0byB0eXBlIHN5c3RlbSBoYW5kbGluZy4gIFNXSUcgbm93IGNvcnJlY3RseSBoYW5kbGVzCiAgICAgICAgICAgIHRlbXBsYXRlIG5hbWVzIGFuZCBwYXJhbWV0ZXJzIGluIGEgbmFtZXNwYWNlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBiYXIgeyB9OwogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CgogICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChiYXI8SW50ZWdlcj4gKngpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIHRoZSBnZW5lcmF0ZWQgY29kZSwgYWxsIG9mIHRoZSB0eXBlbmFtZXMgYXJlIHByb3Blcmx5IHF1YWxpZmllZC4KCjA1LzE3LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gZGVwcmVjYXRlZCBicm9rZW4gLWpuaWMgYW5kIC1qbmljcHAgY29tbWFuZGxpbmUgb3B0aW9ucy4gVGhlIEMgb3IgQysrIAogICAgICAgICAgICBKTkkgY2FsbGluZyBjb252ZW50aW9uIGlzIG5vdyBkZXRlcm1pbmVkIGZyb20gdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uLgoKMDUvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBUaGUgSkNBTEwgbWFjcm9zIHdoaWNoIGV4aXN0IHNvIHRoYXQgdGhlIHNhbWUgdHlwZW1hcHMgY2FuIGJlIHVzZWQKICAgICAgICAgICAgZm9yIGdlbmVyYXRpbmcgYm90aCB0aGUgQyBhbmQgQysrIEpOSSBjYWxsaW5nIGNvbnZlbnRpb25zIG5vIGxvbmdlciBhcHBlYXIKICAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIG91dHB1dCBpcyBub3cgcGFzc2VkIHRocm91Z2ggdGhlIAogICAgICAgICAgICBTV0lHIHByZXByb2Nlc3NvciB3aGljaCBkb2VzIHRoZSBtYWNybyBleHBhbnNpb24gZm9yIGVpdGhlciBDIG9yIEMrKyAoZGVwZW5kaW5nCiAgICAgICAgICAgIG9uIHdoZXRoZXIgLWMrKyBpcyBwYXNzZWQgb24gdGhlIFNXSUcgY29tbWFuZGxpbmUpLgoKICAgICAgICAgICAgVGhlIGdlbmVyYXRpb24gb2YgdGhlIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gYWRqdXN0ZWQgCiAgICAgICAgICAgIHRvIHRha2UgYWNjb3VudCBvZiB0aGlzLiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCBhbnkgdHlwZW1hcHMgd2hpY2ggY29udGFpbmVkIAogICAgICAgICAgICBKQ0FMTCBtYWNyb3Mgd2l0aGluICV7ICV9IGJyYWNrZXRzIHdpbGwgaGF2ZSB0byBiZSBtb3ZlZCB3aXRoaW4ge30gYnJhY2tldHMgCiAgICAgICAgICAgIHNvIHRoYXQgdGhlIFNXSUcgcHJlcHJvY2Vzc29yIGNhbiBleHBhbmQgdGhlIG1hY3Jvcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2xhc3MgdGVtcGxhdGVzIG1heSBub3cgYmUgdXNlZCBhcyB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIHRlbXBsYXRlPGNsYXNzPiBjbGFzcyBDPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29pKSBGb288aW50LCBCYXI+OwogICAgIAogICAgICAgICAgICBTV0lHIGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIHNwZWNpYWwgd2l0aCB0aGlzLS0taXQncyBqdXN0CiAgICAgICAgICAgIGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuICAKICAgICAgICAgCjA1LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgcmVmaW5lbWVudCBvZiB0ZW1wbGF0ZSBzdXBwb3J0LiAgVGVtcGxhdGUgcGFyYW1ldGVyIG5hbWVzIGFyZSBubyBsb25nZXIKICAgICAgICAgICAgcmVxdWlyZWQgZm9yIHR5cGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Ym9vbD4gY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBPYnZpb3VzbHksIG5hbWVzIGFyZSByZXF1aXJlZCBmb3IgdGVtcGxhdGU8Y2xhc3MgVD47CgowNS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBtYWNybyBleHBhbnNpb24gaW4gdHlwZW1hcHMuICBUaGUgc2VxdWVuY2U6CgogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IodHlwZSkKCiAgICAgICAgICAgIFdpbGwgZXhwYW5kIGludG8gdGhlIFNXSUcgdHlwZSBkZXNjcmlwdG9yIHN0cnVjdG9yIGZvcgogICAgICAgICAgICB0aGUgZ2l2ZW4gdHlwZS4gIFR5cGUgbWF5IGJlIGFueSBhYnN0cmFjdCBkYXRhdHlwZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IoaW50ICopCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcihpbnQgKCopKGludCxkb3VibGUpKQogICAgICAgICAgICAgICAgJGRlc2NyaXB0b3IodmVjdG9yPGludD4gKikKCiAgICAgICAgICAgIENhdmVhdDogSXQgaXMgKk5PVCogY3VycmVudGx5IGxlZ2FsIHRvIHVzZSBvdGhlciB0eXBlbWFwCiAgICAgICAgICAgIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgaW4gdGhlIG1hY3JvLiAgRm9yIGV4YW1wbGUgCiAgICAgICAgICAgICRkZXNjcmlwdG9yKCQxX3R5cGUpLgoKICAgICAgICAgICAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIG1vZGlmaWNhdGlvbiBpcyB0byBiZXR0ZXIKICAgICAgICAgICAgc3VwcG9ydCB0eXBlbWFwcyBmb3IgY29udGFpbmVyIG9iamVjdHMgb3IgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgICAgdGhhdCBtaWdodCBiZSBwZXJmb3JtaW5nIHR5cGUgY29udmVyc2lvbnMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlIHdyYXBwaW5nIG9mIHJlZmVyZW5jZXMgdG8gcHJpbWl0aXZlIHR5cGVzIGhhcyBiZWVuCiAgICAgICAgICAgIGNoYW5nZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgIEFyZ3VtZW50cyBvZiB0eXBlICdjb25zdCBwcmltaXRpdmUgJicgYXJlIG5vdyBwYXNzZWQKICAgICAgICAgICAgYnkgdmFsdWUgYXMgb3Bwb3NlZCB0byBwb2ludGVycy4gIFJldHVybiB2YWx1ZXMgb2YKICAgICAgICAgICAgdHlwZSAnY29uc3QgcHJpbWl0aXZlICYnIGFyZSByZXR1cm5lZCBhcyB2YWx1ZXMgaW5zdGVhZCBvZgogICAgICAgICAgICBwb2ludGVycy4KCiAgICAgICAgICAgICdwcmltaXRpdmUnIGlzIGFueSBvbmUgb2YgaW50LCBzaG9ydCwgbG9uZywgbG9uZyBsb25nLAogICAgICAgICAgICBjaGFyLCBmbG9hdCwgZG91YmxlLCBib29sIChhcyB3ZWxsIGFzIHVuc2lnbmVkIHZhcmlhbnRzKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgdG8gYmV0dGVyIHN1cHBvcnQgQysrIHdyYXBwaW5nLS1lc3BlY2lhbGx5CiAgICAgICAgICAgIGNvZGUgdGhhdCBtYWtlcyB1c2Ugb2YgdGVtcGxhdGVzIGFuZCB0aGUgU1RMLgogICAgICAgICAgICAKMDUvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgdG8gYWNjZXNzIHRlbXBsYXRlcwogICAgICAgICAgICBpbiBhIG5hbWVzcGFjZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGNvbXBsZXggewogICAgICAgICAgICAgICAgICAgICAgIFQgcmUsIGltOwogICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV4KFQgX3IgPSBUKCksIFQgX2kgPSBUKCkpIDogcmUoX3IpLCBpbShfaSkgeyB9CiAgICAgICAgICAgICAgICAgICAgICAgVCByZWFsKCkgeyByZXR1cm4gcmU7IH0KICAgICAgICAgICAgICAgICAgICAgICBUIGltYWcoKSB7IHJldHVybiBpbTsgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKGNvbXBsZXgpIHN0ZDo6Y29tcGxleDxkb3VibGU+OwoKICAgICAgICAgICAgTm90ZTogVGhlcmUgYXJlIHNvbWUgdmVyeSBzdWJ0bGUgbmFtZXNwYWNlL3N5bWJvbCB0YWJsZSAKICAgICAgICAgICAgbWFuYWdlbWVudCBpc3N1ZXMgaW52b2x2ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMuCiAgICAgICAgICAgIEl0IG1heSBub3Qgd29yayBpbiBjZXJ0YWluIGNhc2VzLgoKMDUvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBNZW1iZXIgdGVtcGxhdGUgY29uc3RydWN0b3Igc3VwcG9ydCBhZGRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+IAogICAgICAgICAgICAgICBzdHJ1Y3QgcGFpciB7CiAgICAgICAgICAgICAgICAgX1QxIGZpcnN0OwogICAgICAgICAgICAgICAgIF9UMiBzZWNvbmQ7CiAgICAgICAgICAgICAgICAgcGFpcigpIDogZmlyc3QoX1QxKCkpLCBzZWNvbmQoX1QyKCkpIHsgfQogICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9VMSwgY2xhc3MgX1UyPiBwYWlyKGNvbnN0IHBhaXI8X1UxLF9VMj4gJngpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVG8gaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlLCB1c2UgJXRlbXBsYXRlIGFuZCAlZXh0ZW5kLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGhpcyBleHBhbmRzIHRoZSBjb25zdHJ1Y3RvciBpbnRvIGEgZGVmYXVsdAogICAgICAgICAgICBjb3B5IGNvbnN0cnVjdG9yOgoKICAgICAgICAgICAgICAgJWV4dGVuZCBwYWlyIHsKICAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHBhaXIpIHBhaXI8X1QxLF9UMj47CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIEhpZ2hseSBleHBlcmltZW50YWwuICBPdGhlciB1c2VzIG1heSBiZSBicm9rZW4uCgowNS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAlZXh0ZW5kICglYWRkbWV0aG9kcykgZGlyZWN0aXZlIG5vIGxvbmdlciB3b3JrcyB1bmxlc3MKICAgICAgICAgICAgaXQgYXBwZWFycyBpbiB0aGUgcHVibGljIHNlY3Rpb24gb2YgYSBjbGFzcy4gICBBbiBlcnJvcgogICAgICAgICAgICBtZXNzYWdlIGlzIG5vdyBnZW5lcmF0ZWQgKGFzIG9wcG9zZWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQpLgoKMDUvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgJXdhcm5maWx0ZXIoKSBkaXJlY3RpdmUuICBUaGlzIGRpcmVjdGl2ZSBhdHRhY2hlcyBhIHdhcm5pbmcKICAgICAgICAgICAgZmlsdGVyIHRvIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBhbmQgaGFzIHRoZSBzYW1lIHNlbWFudGljcyBhcwogICAgICAgICAgICAlcmVuYW1lLCAlaWdub3JlLCAlZmVhdHVyZSwgYW5kIHNvIGZvcnRoLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAld2FybmZpbHRlcig1MDEpIGZvbzsgICAvLyBTdXBwcmVzcyBvdmVybG9hZGVkIHdhcm5pbmcKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGRvdWJsZSk7IAoKICAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgICV3YXJuZmlsdGVyKDUwMSkgT2JqZWN0Ojpmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgY2xhc3MgT2JqZWN0IHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBvbmx5IHN1cHByZXNzZXMgd2FybmluZ3MgaW4gbGF0ZXIgc3RhZ2VzIG9mIGNvZGUKICAgICAgICAgICAgZ2VuZXJhdGlvbi4gIEl0IGRvZXMgbm90IHN1cHByZXNzIHdhcm5pbmdzIHJlbGF0ZWQgdG8gcHJlcHJvY2Vzc2luZwogICAgICAgICAgICBvciBwYXJzaW5nLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IHN1cHBvcnRzIEM5OSB2YXJpYWRpYyBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIGRlYnVnZihmbXQsLi4uKSBmcHJpbnRmKHN0ZGVycixmbXQsX19WQV9BUkdTX18pCgogICAgICAgICAgICBUaGUgYXJndW1lbnQgIi4uLiIgaXMgdXNlZCB0byBpbmRpY2F0ZSB2YXJpYWJsZSBhcmd1bWVudHMgd2hpY2gKICAgICAgICAgICAgYXJlIGFsbCBwbGFjZWQgaW50byB0aGUgc3BlY2lhbCBhcmd1bWVudCBuYW1lIF9fVkFfQVJHU19fIGluCiAgICAgICAgICAgIHRoZSBtYWNybyBleHBhbnNpb24uICAKCiAgICAgICAgICAgIFNXSUcgYWxzbyBpbXBsZW1lbnRzIHRoZSBHTlUgKCMjKSBleHRlbnNpb24gZm9yIHN3YWxsb3dpbmcgdGhlCiAgICAgICAgICAgIHByZWNlZGluZyBjb21tYSB3aGVuIF9fVkFfQVJHU19fIGlzIGVtcHR5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgZGVidWdmKGZtdCwuLi4pIGZwcmludGYoc3RkZXJyLGZtdCwgIyNfX1ZBX0FSR1NfXykKCiAgICAgICAgICAgIEhlcmUgaXMgaG93IHRoaXMgaXMgZXhwYW5kZWQ6CgogICAgICAgICAgICAgICBkZWJ1Z2YoIiVkIiwgMykgIC0tPiBmcHJpbnRmKHN0ZGVyciwiJWQiLDMpCiAgICAgICAgICAgICAgIGRlYnVnZigiSGVsbG8iKSAgLS0+IGZwcmludGYoc3RkZXJyLCJIZWxsbyIgKQoKICAgICAgICAgICAgKG5vdGljZSB0aGUgZGVsZXRlZCBjb21tYSkuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA4LzIwMDI6IHNhbWphbSAoU2FtIExpZGRpY290dCkKICAgICAgICAgICAgTWFueSBjaGFuZ2VzIHRvIHBocCBtb2R1bGUuICBTaGFkb3cgY2xhc3NlcyBhcmUgbm93IGltcGxlbWVudGVkCiAgICAgICAgICAgIGVudGlyZWx5IGluIG5hdGl2ZSBDIGFuZCBubyBuZWVkIGZvciBwaHAtY29kZSBzaGFkb3cgd3JhcHBlcnMKICAgICAgICAgICAgUG9wdWxhdGVkIHRlbXBsYXRlIGNvbmZpZy5tNCBhbmQgTWFrZWZpbGUuaW4gYXMgbmVlZGVkIGJ5CiAgICAgICAgICAgIHBocGl6ZSBhcmUgZ2VuZXJhdGVkLgoKMDUvMDgvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEEgY29weSBjb25zdHJ1Y3RvciBpcyBub3cgdHVybmVkIGludG8gYSAiY2xvbmUiCiAgICAgICAgICAgIGluc3RhbmNlIG1ldGhvZCAoc2VlIERhdmUncyBjaGFuZ2UgZm9yIGNvcHkgY29uc3RydWN0b3JzCiAgICAgICAgICAgIGRhdGVkIDQvNy8yMDAyKS4gVGhpcyBzZWVtcyBsaWtlIHRoZSBhcHByb3ByaWF0ZSB0aGluZwogICAgICAgICAgICB0byBkbyBmb3IgUnVieSBjb2RlLgoKMDUvMDgvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFsgNTUzODY0IF0gSW5saW5lIGRlc3RydWN0b3IgY29kZSBub3Qgd3JpdHRlbi4KCjA1LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJWlnbm9yZSBiZWhhdmVzIGJldHRlciB3aXRoIGNvbnN0cnVjdG9ycywgZGVzdHJ1Y3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgdHlwZSBzeXN0ZW0gaW4gZ2VuZXJhbC4gICBGb3IgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycywKICAgICAgICAgICAgJWlnbm9yZSBub3cgc3VwcHJlc3NlcyB0aGUgY3JlYXRpb24gb2YgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgIG9yIGRlc3RydWN0b3IuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJWlnbm9yZSB+Rm9vOwogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28oKTsKICAgICAgICAgICAgICAgICAgICB+Rm9vKCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiBTV0lHLTEuMy4xMSwgfkZvbygpIHNpbXBseSAiZGlzYXBwZWFyZWQiIGFuZCB0aGUgY29kZSBnZW5lcmF0b3IKICAgICAgICAgICAgY3JlYXRlZCBhIHdyYXBwZXIgZm9yIGEgZGVmYXVsdCBkZXN0cnVjdG9yIChhcyBpZiBpdCB3YXMgbmV2ZXIKICAgICAgICAgICAgZGVjbGFyZWQgaW4gdGhlIGludGVyZmFjZSkuICBJbiBTV0lHLTEuMy4xMiwgJWlnbm9yZSBzdXBwcmVzc2VzCiAgICAgICAgICAgIHRoZSBjcmVhdGlvbiBvZiBhIGRlc3RydWN0b3IgaWYgb25lIGlzIGFjdHVhbGx5IGRlZmluZWQuIAoKICAgICAgICAgICAgU2ltaWxhcmx5LCBldmVuIHRob3VnaCBhIGRlY2xhcmF0aW9uIGlzIGlnbm9yZWQsIGluZm9ybWF0aW9uCiAgICAgICAgICAgIG1heSBzdGlsbCBiZSBuZWVkZWQgdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzLiBGb3IgZXhhbXBsZSwgaGVyZQogICAgICAgICAgICBpcyBhIHZlcnkgc3VidGxlIGVycm9yIHRoYXQgaXMgZml4ZWQgYnkgdGhpcyBjaGFuZ2U6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBzdGQ6OnN0cmluZzsgICAgICAgICAvLyBQcmV2ZW50IGNsYXNzIHdyYXBwaW5nCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIHN0cmluZyB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzdHJpbmcgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhzdGQ6OnN0cmluZyAqcyk7ICAgLy8gQnJva2VuLgoKICAgICAgICAgICAgQmVmb3JlIHRoaXMgZml4LCAlaWdub3JlIHdvdWxkIGNhdXNlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHRvIGRpc2FwcGVhci4KICAgICAgICAgICAgVGhpcywgaW4gdHVybiwgd291bGQgY2F1c2UgdGhlIHR5cGVtYXAgdG8gYmUgbWlzYXBwbGllZC4gCiAKMDUvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzCiAgICAgICAgICAgIGZvciBiZXR0ZXIgc3VwcG9ydCBvZiBkZXN0cnVjdG9ycy4gIERlc3RydWN0b3JzIGNhbiBub3cgYmUgcHJlY2lzZWx5CiAgICAgICAgICAgIHRhZ2dlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286On5Gb287CiAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhY3Rpb24iKSB+QmFyIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAKICAgICAgICAgICAgKkRldmVsb3BlciB3YXJuaW5nKiAKICAgICAgICAgICAgT3BlcmF0aW9ucyBzdWNoIGFzIHJlbmFtaW5nIGFuZCBmZWF0dXJlIGF0dGFjaG1lbnQgZm9yIGNsYXNzZXMgdXNlZCB0bwogICAgICAgICAgICBiZSBhcHBsaWVkIHRvIGRlc3RydWN0b3JzIGFzIHdlbGwuICBGb3IgaW5zdGFuY2UsIGlmIHlvdSBkaWQgdGhpczoKIAogICAgICAgICAgICAgICAgICVyZW5hbWUoQmFyKSBGb287CgogICAgICAgICAgICBUaGUgb3BlcmF0aW9uIGFwcGxpZWQgdG8gdGhlIGNsYXNzIGl0c2VsZiwgdGhlIGNvbnN0cnVjdG9yLCBhbmQKICAgICAgICAgICAgdGhlIGRlc3RydWN0b3IuICAgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuICBOb3cgc3VjaCBvcGVyYXRpb25zCiAgICAgICAgICAgIHdpbGwgb25seSBhcHBseSB0byB0aGUgY2xhc3MgYW5kIHRoZSBjb25zdHJ1Y3Rvci4gIE5vdGU6IGlmIHlvdQogICAgICAgICAgICB3ZXJlIHJlbHlpbmcgb24gdGhpcyBmb3IgY2xhc3MgcmVuYW1pbmcsIGJlIGF3YXJlIHRoYXQgcmVuYW1lZAogICAgICAgICAgICBjbGFzc2VzIHNob3VsZCByZWFsbHkgb25seSBiZSBoYW5kbGVkIGF0IHRoZSBsZXZlbCBvZiB0aGUgY2xhc3MgaXRzZWxmCiAgICAgICAgICAgIGFuZCBub3QgdGhlIGxldmVsIG9mIGluZGl2aWR1YWwgZGVjbGFyYXRpb25zIGluIHRoZSBjbGFzcyAoYWx0aG91Z2gKICAgICAgICAgICAgdGhleSBjYW4gYmUgcmVuYW1lZCBpbmRpdmlkdWFsbHkgaWYgbmVlZGVkKS4gIEFzIGZhciBhcyBJIGtub3csCiAgICAgICAgICAgIHRoZSBMYW5ndWFnZSBjbGFzcyBpcyBhbHJlYWR5IHRha2luZyBjYXJlIG9mIHRoaXMgY2FzZSBjb3JyZWN0bHkuCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBzZXQgb2YgdGVzdHMuICBUaGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9lcnJvcnMgZGlyZWN0b3J5IGNvbnRhaW5zCiAgICAgICAgICAgIHRlc3RzIHRoYXQgdHJ5IHRvIGV4ZXJjaXNlIGFsbCBvZiBTV0lHJ3MgZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMuCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN0YXJ0IG9mIGEgd2FybmluZyBmcmFtZXdvcmsuICBXYXJuaW5nIG1lc3NhZ2VzIGFyZSBub3cgYXNzaWduZWQgbnVtZXJpYyB2YWx1ZXMKICAgICAgICAgICAgdGhhdCBhcmUgc2hvd24gaW4gd2FybmluZyBtZXNzYWdlcy4gICBUaGVzZSBjYW4gYmUgc3VwcHJlc3NlZCB1c2luZyB0aGUKICAgICAgICAgICAgLXcgb3B0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN3aWcgLXczMDIgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICAgc3dpZyAtdzMwMiwzMDUgZXhhbXBsZS5pCgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgI3ByYWdtYSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvIGRpc2FibGUgdGhpczoKCiAgICAgICAgICAgICAgICAgI3ByYWdtYSBTV0lHIG5vd2Fybj0zMDIKICAgICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPTMwMiwzMDUKCiAgICAgICAgICAgIE5vdGU6IFNpbmNlIFNXSUcgaXMgYSBtdWx0aS1wYXNzIGNvbXBpbGVyLCB0aGlzIHByYWdtYSBzaG91bGQKICAgICAgICAgICAgb25seSBiZSB1c2VkIHRvIGNoYW5nZSBnbG9iYWwgc2V0dGluZ3Mgb2YgdGhlIHdhcm5pbmcgZmlsdGVyLiAgSXQgc2hvdWxkCiAgICAgICAgICAgIG5vdCBiZSB1c2VkIHRvIHNlbGVjdGl2ZWx5IGVuYWJsZS9kaXNhYmxlIHdhcm5pbmdzIGluIGFuIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgICBUaGUgaGFuZGxpbmcgb2YgI3ByYWdtYSBvY2N1cnMgaW4gdGhlIEMrKyBwcmVwcm9jb2Vzc29yIGFuZCBhZmZlY3RzIGFsbCAKICAgICAgICAgICAgc3Vic2VxdWVudCBzdGFnZXMgb2YgY29tcGlsYXRpb24uCgogICAgICAgICAgICBUaGUgLVdhbGwgb3B0aW9uIHR1cm5zIG9uIGFsbCB3YXJuaW5ncyBhbmQgb3ZlcnJpZGVzIGFueSBmaWx0ZXJzIHRoYXQKICAgICAgICAgICAgbWlnaHQgaGF2ZSBiZWVuIHNldC4KCiAgICAgICAgICAgIFdhcm5pbmdzIGNhbiBiZSBpc3N1ZWQgZnJvbSBhbiBpbnRlcmZhY2UgdXNpbmcgJXdhcm4uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXdhcm4gIjExMDolc2VjdGlvbiBpcyBkZXByZWNhdGVkIgoKICAgICAgICAgICAgVGhlIGZpcnN0IHBhcnQgb2YgYSB3YXJuaW5nIG1lc3NhZ2UgaXMgYW4gb3B0aW9uYWwgd2FybmluZyBudW1iZXIuCiAgICAgICAgICAgIEEgY29tcGxldGUgc2V0IG9mIHdhcm5pbmcgbnVtYmVycyBpcyBmb3VuZCBpbiBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNS8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEludGVybmFsIHBhcnNpbmcgY2hhbmdlLiAgIERpcmVjdGl2ZXMgdG8gaW5jbHVkZSBmaWxlcyBub3cgdXNlIGJyYWNrZXRzIFsgLi4uIF0KICAgICAgICAgICAgaW5zdGVhZCBvZiB7IC4uLiB9LiAgIAoKICAgICAgICAgICAgICAgICAgJWluY2x1ZGVmaWxlICJmb28uaSIgWwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgXQoKICAgICAgICAgICAgVGhlIHVzZSBvZiB7IC4uLiB9IHdhcyBhIGJhZCBjaG9pY2UgYmVjYXVzZSB0aGV5IHdlcmUgaW5jbHVkZWQgaW1wbGljaXRseSBieQogICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yIGFuZCBtYWRlIGl0IGltcG9zc2libGUgdG8gcHJvcGVybHkgZGV0ZWN0IGxlZ2l0aW1hdGUgbWlzc2luZyAnfScgCiAgICAgICAgICAgIGVycm9ycy4KCjA0LzE2LzIwMDItCjA1LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBFdXJvcGVhbiBUb3VyOiBQYXJpcy1BbXN0ZXJkYW0tQmF0aC4KCjA0LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBoYXMgYmVlbiByZW5hbWVkIHRvICVleHRlbmQuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWV4dGVuZCBGb28gewogICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgaW50IGJhcigpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBNb3RpdmF0aW9uOiB0aGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIGZvciBtYW55CiAgICAgICAgICAgIG90aGVyIHRhc2tzIGluY2x1ZGluZyBhZGRpbmcgc3ludGhlc2l6ZWQgYXR0cmlidXRlcywgY29uc3RydWN0b3JzLAogICAgICAgICAgICBhbmQgdHlwZW1hcHMuIEJlY2F1c2Ugb2YgdGhpcywgImFkZG1ldGhvZHMiIGlzIHNvbWV3aGF0IG1pc2xlYWRpbmcuCiAgICAgICAgICAgICVleHRlbmQgbW9yZSBwcmVjaXNlbHkgZGVzY3JpYmVzIHRoaXMgb3BlcmF0aW9uLS0tZXh0ZW5zaW9uIG9mIGEKICAgICAgICAgICAgY2xhc3Mgb3Igc3RydWN0dXJlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICVhZGRtZXRob2RzIHN0aWxsIHdvcmtzIHZpYSBhIG1hY3JvIGRlZmluaXRpb24uICAgSG93ZXZlciwKICAgICAgICAgICAgYSB3YXJuaW5nIG1lc3NhZ2UgbWF5IGJlIGdlbmVyYXRlZC4gICBFcnJvcnMgaW52b2x2aW5nICVhZGRtZXRob2RzCiAgICAgICAgICAgIHdpbGwgYWN0dWFsbHkgcmVmZXIgdG8gdGhlICVleHRlbmQgZGlyZWN0aXZlLiAgCiAgICAgICAgICAgIAowNC8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZ1cnRoZXIgcmVmaW5lbWVudCBvZiB0aGUgdHlwZSBzeXN0ZW0uICBUeXBlZGVmIG5vdwogICAgICAgICAgICBwcm9wYWdhdGVzIHRocm91Z2ggZnVuY3Rpb25zLCBwb2ludGVycyB0byBmdW5jdGlvbnMsCiAgICAgICAgICAgIGFuZCBwb2ludGVycyB0byBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCAoKngpKGludCksIEludGVnZXIgKCp5KShJbnRlZ2VyKSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFyZ3VtZW50cyAneCcgYW5kICd5JyBoYXZlIGV4YWN0bHkKICAgICAgICAgICAgdGhlIHNhbWUgdHlwZSAoYW5kIHdvdWxkIG9idmlvdXNseSBhY2NlcHQgb2JqZWN0cwogICAgICAgICAgICBvZiBlaXRoZXIgdHlwZSkuCgogICAgICAgICAgICBTaW1pbGFybHksIGNvbnNpZGVyIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwogICAgICAgICAgICAgICB2b2lkIGJhcihpbnQgKEZvbzo6KngpKGludCksIGludCAoQmFyOjoqeSkoaW50KSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGFyZ3VtZW50cyB4IGFuZCB5IGFyZSB0aGUgc2FtZSAKICAgICAgICAgICAgdHlwZSAodmlhIHR5cGVkZWYpLgogICAgICAgICAgICAKMDQvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgYW55IHBhcnQgb2YKICAgICAgICAgICAgYW4gZXhwcmVzc2lvbiBpbnZvbHZlcyB2YWx1ZXMgZnJvbSBhIHByaXZhdGUgcGFydCBvZiBhIGNsYXNzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IFg7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgYSwgaW50IGIgPSBYKTsgICAvLyBXYXJuaW5nCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZGVmYXVsdCBhcmd1bWVudCBpcyBpZ25vcmVkLiAgVGhlcmUKICAgICAgICAgICAgYXJlIHdvcmthcm91bmRzLCBidXQgdGhleSBhcmUgcmF0aGVyIGNsdW1zeS4gIEZvciBpbnN0YW5jZSwKICAgICAgICAgICAgeW91IG1pZ2h0IGRvIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICVmZWF0dXJlKCJhY3Rpb24iKSBibGFoKGludCxpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoJG5hcmdzID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBibGFoKGFyZzEpOwogICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gYmxhaChhcmcxLGFyZzIpOwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludCBhLCBpbnQgYiA9IDApOwoKCjA0LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVXNlIG9mIHRoZSAlaW5saW5lIGRpcmVjdGl2ZSBpbnNpZGUgYSBuYW1lc3BhY2UgaXMKICAgICAgICAgICAgZm9yYmlkZGVuIGFuZCBub3cgZ2VuZXJhdGVzIGFuIGVycm9yIG1lc3NhZ2UuICAgVGhpcyBpcwogICAgICAgICAgICBub3QgYWxsb3dlZCBzaW5jZSB0aGUgaW5saW5lZCBjb2RlIHRoYXQgaXMgZW1pdHRlZCBpcwogICAgICAgICAgICBub3QgcGxhY2VkIGluc2lkZSBhIG5hbWVzcGFjZS4gIFRoaXMgY29uZnVzZXMgb3RoZXIKICAgICAgICAgICAgc3RhZ2VzIG9mIHBhcnNpbmcuCiAgICAgICAgICAgICAgICAgICAgCjA0LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBidWcgZml4ZXMgdG8gY2FzdGluZyBvcGVyYXRpb25zIGFuZCBleHByZXNzaW9uCiAgICAgICAgICAgIHBhcnNpbmcuICAgRHVlIHRvIHNvbWUgcGFyc2luZyBpc3N1ZXMsIGl0IGlzIG5vdCAKICAgICAgICAgICAgY3VycmVudGx5IHBvc3NpYmxlIHRvIHVzZSBjYXN0cyBmb3IgYWxsIHBvc3NpYmxlCiAgICAgICAgICAgIGRhdGF0eXBlcy4gICBIb3dldmVyLCB0aGUgY29tbW9uIGNhc2VzIHdvcmsuCgowNC8yMC8yMDAyOiBiZWF6bGV5IChBbXN0ZXJkYW0pCiAgICAgICAgICAgIE1lbWJlciB0ZW1wbGF0ZXMgbm93IHdvcmsuICBTaW1wbHkgdXNlIHRoZSAldGVtcGxhdGUKICAgICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIG9yICVhZGRtZXRob2RzIHRvIGNyZWF0ZQogICAgICAgICAgICBpbnN0YW50aWF0aW9ucyAoc2VlIERvYy9NYW51YWwvU1dJR1BsdXMuaHRtbCkuICBTdXBwb3J0aW5nCiAgICAgICAgICAgIHRoaXMgd2FzIGVhc3ktLS1lYXJsaWVyIGNoYW5nZXMgdG8gdGVtcGxhdGVzIG1hZGUgaXQKICAgICAgICAgICAgcG9zc2libGUgdXNpbmcgb25seSBhIHR3by1saW5lIG1vZGlmaWNhdGlvbiB0byB0aGUgcGFyc2VyCiAgICAgICAgICAgIGFuZCBhIGZldyBtaW5vciBtb2RpZmljYXRpb25zIGVsc2V3aGVyZS4gIEhtbW0sIGNvbWUgdG8gCiAgICAgICAgICAgIHRoaW5rIG9mIGl0LCB0aGUgc21va2Ugd2FzIHJhdGhlciB0aGljayBpbiB0aGF0IEludGVybmV0ICJjYWZlIi4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKMDQvMTkvMjAwMjogYmVhemxleSAoVEdWKQogICAgICAgICAgICBJbXByb3ZlZCBoYW5kbGluZyBvZiBub24tdHlwZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQsMTAwPjsKCiAgICAgICAgICAgIFNpbXBsZSBudW1iZXJzIGFuZCBzdHJpbmdzIGNhbiBiZSB1c2VkIHdpdGggdGhlICV0ZW1wbGF0ZQogICAgICAgICAgICBkaXJlY3RpdmUgYXMgd2VsbC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50MTAwKSB2ZWN0b3I8aW50LDEwMD47CgogICAgICAgICAgICBOb3RlOiBBcml0aG1ldGljIGV4cHJlc3Npb25zIGFyZSBub3QgY3VycmVudGx5IGFsbG93ZWQuCiAgICAgICAgICAgIAogICAgICAgICAgICBEZWZhdWx0IHRlbXBsYXRlIGFyZ3VtZW50cyBub3cgd29yayBhbmQgZG8gbm90IGhhdmUgdG8KICAgICAgICAgICAgYmUgZ2l2ZW4gdG8gJXRlbXBsYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAKMDQvMTgvMjAwMjogYmVhemxleSAoUGFyaXMpCiAgICAgICAgICAgIENoYW5nZSBpbiBpbnRlcm5hbCB0ZW1wbGF0ZSBoYW5kbGluZy4gIFRlbXBsYXRlCiAgICAgICAgICAgIHBhcmFtZXRlcnMgYXJlIG5vdyBmdWxseSBpbnRlZ3JhdGVkIGludG8gdGhlIHR5cGUKICAgICAgICAgICAgc3lzdGVtIGFuZCBhcmUgYXdhcmUgb2YgdHlwZWRlZnMsIGV0Yy4gIFRoaXMgYnVpbGRzCiAgICAgICAgICAgIHVwb24gdGhlIGNoYW5nZSBiZWxvdy4gICAKCiAgICAgICAgICAgICoqKiBERVZFTE9QRVIgV0FSTklORyAqKioKICAgICAgICAgICAgV29yZCBvZiBjYXV0aW9uIHRvIGxhbmd1YWdlIG1vZHVsZSB3cml0ZXJzLiAgVGhlICJuYW1lIgogICAgICAgICAgICBwYXJhbWV0ZXIgb2YgY2VydGFpbiBwYXJzZSB0cmVlIG5vZGVzIChjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pCiAgICAgICAgICAgIG1heSBiZSBwYXJhbWV0ZXJpemVkIHdpdGggdHlwZXMuICAgVGhpcyBwYXJhbWV0ZXJpemF0aW9uIGlzCiAgICAgICAgICAgIGRvbmUgdXNpbmcgU1dJRyB0eXBlLXN0cmluZ3MgYW5kIG5vdCB0aGUgdW5kZXJseWluZyBDIHZlcnNpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgaW50IG1heDxpbnQgKj4oaW50ICosaW50ICopICAKCiAgICAgICAgICAgIGhhcyBhIG5hbWUgb2YgIm1heDwocC5pbnQpPiIuICBJZiB5b3UgdXNlIHRoZSBuYW1lIGRpcmVjdGx5LAogICAgICAgICAgICB5b3UgbWF5IGdldCBzeW50YXggZXJyb3JzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4gIFRvIGZpeCB0aGlzLAogICAgICAgICAgICB1c2UgU3dpZ1R5cGVfbmFtZXN0cihuYW1lKSB0byBjb252ZXJ0IGEgcGFyYW1ldGVyaXplZCBuYW1lIAogICAgICAgICAgICB0byBhIEMgbmFtZSB3aXRoIHZhbGlkIHN5bnRheC4gIFRoZSBpbnRlcm5hbCB2ZXJzaW9uIGlzCiAgICAgICAgICAgIHVzZWQgdG8gcmVkdWNlIHRlbXBsYXRlIHR5cGVzIHRvIGEgY29tbW9uIHJlcHJlc2VudGF0aW9uIAogICAgICAgICAgICBhbmQgdG8gaGFuZGxlIGlzc3VlcyBvZiB0eXBlZGVmLgogICAgICAgICAgICAKMDQvMTYvMjAwMjogYmVhemxleSAoc29tZXdoZXJlIG92ZXIgdGhlIEF0bGFudGljKQogICAgICAgICAgICBFbmhhbmNlbWVudCBvZiB0eXBlZGVmIHJlc29sdXRpb24uICBUaGUgdHlwZSBzeXN0ZW0gaXMgbm93CiAgICAgICAgICAgIGF3YXJlIG9mIHRlbXBsYXRlIGFyZ3VtZW50cyBhbmQgdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgZm9vKHZlY3RvcjxpbnQ+ICp4LCB2ZWN0b3I8SW50ZWdlcj4gKnkpOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB2ZWN0b3I8aW50PiBhbmQgdmVjdG9yPEludGVnZXI+IGFyZQogICAgICAgICAgICB0aGUgc2FtZSB0eXBlLiAgIFRoZXJlIGlzIHNvbWUgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGlzCiAgICAgICAgICAgIG1lY2hhbmlzbSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgIGEgdHlwZW1hcCBkZWZpbmVkIGZvciB2ZWN0b3I8aW50PiAqIHdvdWxkIGFwcGx5IHRvIGVpdGhlciB0eXBlLgogICAgICAgICAgICBIb3dldmVyLCBhIHR5cGVtYXAgZm9yIHZlY3RvcjxJbnRlZ2VyPiAqIHdvdWxkIG9ubHkgYXBwbHkgdG8KICAgICAgICAgICAgdGhhdCB0eXBlLgoKICAgICAgICAgICAgVHlwZWRlZnMgYW5kIHR5cGVtYXBzIGFuZCBtYXRjaGVkIGJ5IGxlZnQtbW9zdCBleHBhbnNpb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2ZWN0b3I8SW50ZWdlcixJbnRlZ2VyPiAtLT4gCiAgICAgICAgICAgICAgdmVjdG9yPGludCwgSW50ZWdlcj4gLS0+CiAgICAgICAgICAgICAgdmVjdG9yPGludCwgaW50PgoKCjA0LzI0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQ2hhbmdlcyB0byBKYXZhIHNoYWRvdyBjbGFzc2VzLgogICAgICAgICAgICBPdmVyY29tZXMgYSBidWcgd2hlcmUgdGhlIG1vZHVsZSBhc3N1bWVkIHRoYXQgYSBwb2ludGVyIHRvIGEgZGVyaXZlZAogICAgICAgICAgICBjbGFzcyBjb3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIGEgcG9pbnRlciB0byBhIGJhc2UgY2xhc3MuIFRoYW5rcyAKICAgICAgICAgICAgdG8gU3RlcGhlbiBNY0NhdWwgZm9yIGFuYWx5c2luZyB0aGUgYnVnIGFuZCBzdWJtaXR0aW5nIHBhdGNoZXMuCgogICAgICAgICAgICBBIGNvbnNlcXVlbmNlIGlzIHRoYXQgdGhlIGdldENQdHIoKSBtZXRob2QgaW4gZWFjaCBzaGFkb3cgY2xhc3MgaGFzCiAgICAgICAgICAgIGRpc2FwcGVhcmVkIGFuZCBoYXMgYmVlbiByZXBsYWNlZCB3aXRoIGEgZ2V0Q1B0clhYWCgpLCB3aGVyZSBYWFggaXMgdGhlIAogICAgICAgICAgICBzaGFkb3cgY2xhc3MgbmFtZS4gSWYgeW91IGhhdmUgY29kZSB0aGF0IHByZXZpb3VzbHkgdXNlZCBnZXRDUHRyKCksIAogICAgICAgICAgICBhbmQgdGhlIGFzc29jaWF0ZWQgY2xhc3MgaXMgd3JhcHBpbmcgYSBDIHN0cnVjdCBvciBhIEMrKyBjbGFzcyB0aGF0CiAgICAgICAgICAgIGlzIG5vdCBpbnZvbHZlZCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiwganVzdCB1c2UgdGhlIG5ldyBtZXRob2QuIElmCiAgICAgICAgICAgIGhvd2V2ZXIsIHRoZSBjbGFzcyBpcyBpbnZvbHZlZCBpbiBhbiBpbmhlcml0YW5jZSBjaGFpbiwgeW91J2xsIGhhdmUKICAgICAgICAgICAgdG8gY2hvb3NlIHdoaWNoIHBvaW50ZXIgeW91IHJlYWxseSB3YW50LiBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSAKICAgICAgICAgICAgaGFzIGJlZW4gYnJva2VuIGFzIG5vdCB1c2luZyB0aGUgY29ycmVjdCBwb2ludGVyIGNhbiBsZWFkIHRvIHdlaXJkIGJ1Z3MKICAgICAgICAgICAgdGhyb3VnaCBpbGwtZGVmaW5lZCBiZWhhdmlvdXIuIElmIHlvdSBhcmUgc3VyZSB5b3Ugd2FudCB0aGUgb2xkIG1ldGhvZHMsIAogICAgICAgICAgICB5b3UgY291bGQgYWRkIHRoZW0gYmFjayBpbnRvIGFsbCBzaGFkb3cgY2xhc3NlcyBieSBhZGRpbmcgdGhpcyBhdCB0aGUgCiAgICAgICAgICAgIGJlZ2lubmluZyBvZiB5b3VyIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBhbGxzaGFkb3djb2RlPSV7CiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0cigpewogICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFBsZWFzZSBzZWUgZW50cnkgZGF0ZWQgMDcvMjMvMjAwMiB0byBzZWUgaG93IHRvIGRvIHRoaXMgYWZ0ZXIgdGhlIGRlcHJlY2F0aW9uCiAgICAgICAgICAgIG9mIHRoZSBhbGxzaGFkb3djb2RlIHByYWdtYS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA0LzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCByZWZlcmVuY2VzLiAgIERlY2xhcmF0aW9ucyBzdWNoIAogICAgICAgICAgICBhcyB0aGlzIHNob3VsZCBub3cgd29yazoKCiAgICAgICAgICAgICAgICB2b2lkIGZvbyhjb25zdCBzdHJpbmcgJnggPSAiSGVsbG8iKTsKCjA0LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgdHlwZW1hcCAkKiBzdWJzdGl0dXRpb25zIGZvciB0eXBlbWFwcyBpbnZvbHZpbmcgYXJyYXlzLgogICAgICAgICAgICBSZXF1ZXN0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowNC8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGlzIG5vdyBzdXBwb3J0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFdoZW4gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgaXMgdXNlZCwgaXQgd2lsbCB1c2UgYSBzcGVjaWFsaXphdGlvbgogICAgICAgICAgICBpZiBvbmUgaXMgZGVmaW5lZC4gICBUaGVyZSBhcmUgc3RpbGwgc29tZSBsaW1pdGF0aW9ucy4gUGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBpcyBub3Qgc3VwcG9ydGVkLiAgQSB0ZW1wbGF0ZSBvZiB0eXBlIDx2b2lkICo+IGRvZXMKICAgICAgICAgICAgbm90IG1hdGNoIGFsbCBwb2ludGVycy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDQvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWpvciBjaGFuZ2UgdG8gdGVtcGxhdGUgd3JhcHBpbmcgaW50ZXJuYWxzLiBUZW1wbGF0ZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciBwcm9jZXNzZWQgYXMgbWFjcm9zIGJ1dCBub3cgcmVzdWx0IGluIHJlYWwgcGFyc2UtdHJlZQogICAgICAgICAgICBub2Rlcy4gIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGV4cGFuZHMgdGhlc2Ugbm9kZXMgaW50byBhCiAgICAgICAgICAgIHNwZWNpZmljIGluc3RhbnRpYXRpb24uICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBhIG51bWJlciBvZgogICAgICAgICAgICBuZXcgYW5kIGludGVyZXN0aW5nIGNhcGFiaWxpdGllczoKCiAgICAgICAgICAgIERpcmVjdGl2ZXMgc3VjaCBhcyAlcmVuYW1lLCAlZmVhdHVyZSwgYW5kICVhZGRtZXRob2RzIGNhbgogICAgICAgICAgICBub3cgYmUgYXBwbGllZCB0byB1bmluc3RhbnRpYXRlZCB0ZW1wbGF0ZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJzaXplKSB2ZWN0b3I6OmJhcihjaGFyICpidWYsIGludCBsZW4pOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKmJ1Zik7CiAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqYnVmLCBpbnQgbGVuKTsgICAvLyBSZW5hbWVkCiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGludHZlY3RvcikgdmVjdG9yPGludD47ICAgLy8gUmVuYW1pbmcgY2FycmllcyB0aHJvdWdoCgogICAgICAgICAgICAKICAgICAgICAgICAgQnkgcGFyc2luZyB0ZW1wbGF0ZXMgaW50byBhbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSwgaXQgd2lsbAogICAgICAgICAgICBiZSBwb3NzaWJsZSB0byBzdXBwb3J0IHNwZWNpYWxpemF0aW9uIChhbmQgbWF5YmUgcGFydGlhbAogICAgICAgICAgICBzcGVjaWFsaXphdGlvbikuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwgYW5kIGEgd29yayBpbiBwcm9ncmVzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBJbiBTV0lHLTEuMy4xMSwgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHdlcmUgc2ltcGx5IHByb2Nlc3NlZAogICAgICAgICAgICBhcyB3ZWlyZCBtYWNyb3MuICBObyBvdGhlciBpbmZvcm1hdGlvbiB3YXMgcmV0YWluZWQuICAgVGhpcyAKICAgICAgICAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHN1cHBvcnQgbW9yZSBhZHZhbmNlZCBmZWF0dXJlcyBhbmQgCiAgICAgICAgICAgIGNvbXBsaWNhdGVkIG1hbnkgb3RoZXIgcGFydHMgb2YgdGhlIGltcGxlbWVudGF0aW9uLgoKMDQvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gdGVtcGxhdGUgY2xhc3Mgd3JhcHBpbmcuICAgVGhlcmUgd2VyZSBhIHZhcmlldHkgb2YKICAgICAgICAgICAgImlzc3VlcyIgd2l0aCB0aGUgb2xkIGFwcHJvYWNoIHJlbGF0ZWQgdG8gcGFyc2luZywgdGhlIHR5cGUKICAgICAgICAgICAgc3lzdGVtLCBhbmQgbmFtZXNwYWNlcy4gICBUaGVzZSBjaGFuZ2VzIGFyZSBtZWFudCB0byByZWN0aWZ5CiAgICAgICAgICAgIHNvbWUgb2YgdGhlc2UgcHJvYmxlbXM6CgogICAgICAgICAgICBBIHNwZWNpZmljIGluc3RhbnRpYXRpb24gb2YgYSB0ZW1wbGF0ZSBjYW4gbm93IGJlIHNwZWNpZmllZAogICAgICAgICAgICBieSBpbmNsdWRpbmcgdGhlIGNsYXNzIGlubGluZSBsaWtlIHRoaXM6CiAKICAgICAgICAgICAgICAgICAgY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICB+dmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uIHdoYXRldmVyIC4uLgoJICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoaXMgaXMgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24sIGJ1dCBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGlzCiAgICAgICAgICAgIG5vdCB5ZXQgaW1wbGVtZW50ZWQuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBoYXMgYmVlbiBtb2RpZmllZCB0byBleHBhbmQgcm91Z2hseSBhcwogICAgICAgICAgICBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSh2ZWNpbnQ+IHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgIGNsYXNzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHZlY3RvcigpOwogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgc2ltcGx5IGJ1aWxkcyB1cG9uIHRoZSBjb2RlIGFib3ZlICh0ZW1wbGF0ZXMKICAgICAgICAgICAgaW5jbHVkZWQgaW5saW5lKS4KCiAgICAgICAgICAgIFRoaXMgbW9kaWZpZWQgYXBwcm9hY2ggdG8gd3JhcHBpbmcgZml4ZXMgc29tZSBzdWJ0bGUgdHlwZQogICAgICAgICAgICBpc3N1ZXMuICBGb3IgaW5zdGFuY2UsIHlvdSBjYW4gbm93IGRlZmluZSB0eXBlbWFwcyBhbmQgdHlwZWRlZnMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPGludD4gKiB7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHR5cGVkZWYgdmVjdG9yPGludD4gaW50dmVjdG9yOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgYmxhaChpbnR2ZWN0b3IgKnYpOyAgIC8vIEdldHMgdGhlIGFib3ZlIHR5cGVtYXAKCiAgICAgICAgICAgIFRoaXMgZGlkIG5vdCB3b3JrIGluIFNXSUctMS4zLjExIGR1ZSB0byBhIHBlY3VsaWFyaXR5IG9mCiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBpbXBsZW1lbnRhdGlvbi4KCiAgICAgICAgICAgICV0ZW1wbGF0ZShuYW1lKSBubyBsb25nZXIgaW5zdGFsbHMgdGhlIHRlbXBsYXRlIGFzIGEgY2xhc3MKICAgICAgICAgICAgd2l0aCBuYW1lICJuYW1lIi4gICBUaGlzIG1pZ2h0IGJyZWFrICVhZGRtZXRob2RzIGFzIGRlc2NyaWJlZAogICAgICAgICAgICBpbiB0aGUgbWFudWFsLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY2ludCB7ICAgIC8vIEZhaWxzLiB2ZWNpbnQgbm90IGEgY2xhc3MKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgCiAgICAgICAgICAgIFRvIGZpeCB0aGlzLCBqdXN0IHVzZSB0aGUgdGVtcGxhdGUgbmFtZSBpbnN0ZWFkOgoKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6IFRoaXMgdGVjaG5pcXVlIG1pZ2h0IGJlIGEgd2F5IHRvIGltcGxlbWVudCBzb21lIGJpemFycmUKICAgICAgICAgICAgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGVjaG5pcXVlcy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGFwcGxpZWQgaWYgdmVjdG9yPGludD4gaW5zdGFudGlhdGVkIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAgCjA0LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDA4NjggXSAjaWYgZGVmaW5lZCB3aGF0ZXZlciAtIG5vdCBwYXJzZWQuICBTV0lHIHNob3VsZAogICAgICAgICAgICBub3cgY29ycmVjdGx5IGhhbmRsZSBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgI2lmIGRlZmluZWQgX19jcGx1c3BsdXMKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAKICAgICAgICAgICAgTm90ZTogd2FzIGltcGxlbWVudGVkIHByZXZpb3VzbHksIGJ1dCB0aGVyZSB3YXMgYSBtaW5vciBidWcuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFkYW0gSHVwcC4KICAgICAgICAgICAgICAgICAgIAowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBhcmUgZGVwcmVjYXRlZCBkdWUgdG8gYSBjaGFuZ2UgaW4gdGhlIAogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbi4gIEluc3RlYWQgb2YgYmVpbmcgcHJhZ21hcywgbXV0YWJpbGl0eSBpcyBub3cKICAgICAgICAgICAgY29udHJvbGxlZCBhcyBhICJmZWF0dXJlIiB1c2luZyB0aGUgZm9sbG93aW5nIHR3byBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAgICAlaW1tdXRhYmxlOwogICAgICAgICAgICAgICAgIGludCB4OyAgICAgICAgICAgLy8gcmVhZC1vbmx5IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgaW50IHk7ICAgICAgICAgICAvLyByZWFkLW9ubHkgdmFyaWFibGUKICAgICAgICAgICAgICAgICAlbXV0YWJsZTsKICAgICAgICAgICAgICAgICBpbnQgejsgICAgICAgICAgIC8vIE1vZGlmaWFibGUKCiAgICAgICAgICAgICVpbW11dGFibGUgYW5kICVtdXRhYmxlIGFyZSBtdWNoIG1vcmUgcG93ZXJmdWwgdGhhbiB0aGVpciBvbGRlcgogICAgICAgICAgICBjb3VudGVycGFydHMuICBUaGV5IGNhbiBub3cgcGlucG9pbnQgYSBzcGVjaWZpYyBkZWNsYXJhdGlvbiBsaWtlCiAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAlaW1tdXRhYmxlICB4OyAgICAgICAgIC8qIEFueSB4ICovCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIEZvbzo6eDsgICAgLyogeCBpbiBjbGFzcyBGb28gKi8KCiAgICAgICAgICAgIEluIGZhY3QsIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gaXMgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUsIAogICAgICAgICAgICAlaWdub3JlLCBhbmQgb3RoZXIgZGlyZWN0aXZlcy4gICBUaGlzIG1lYW5zIHRoYXQgdGhlIGRlY2xhcmF0aW9uCiAgICAgIAogICAgICAgICAgICAgICAlaW1tdXRhYmxlICBGb286Ong7CgogICAgICAgICAgICB3b3VsZCBub3Qgb25seSBhcHBseSB0byBjbGFzcyBGb28gYnV0IHRvIGFsbCBkZXJpdmVkIGNsYXNzZXMKICAgICAgICAgICAgYXMgd2VsbC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBtdXN0IGJlIHRlcm1pbmF0ZWQgYnkgYSBzZW1pLWNvbG9uLiAgVGhpcwogICAgICAgICAgICBkaWZmZXJzIHNsaWdodGx5IGZyb20gdGhlIG9sZGVyICVyZWFkb25seSBhbmQgJXJlYWR3cml0ZSBkaXJlY3RpdmVzLgogICAgICAgICAgICBTaW5jZSAlaW1tdXRhYmxlIGFuZCAlbXV0YWJsZSBjYW4gYmUgYXBwbGllZCB0byBkZWNsYXJhdGlvbnMgdGhlCiAgICAgICAgICAgIHNlbWljb2xvbiBpcyBuZWVkZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBhIGdsb2JhbCBmZWF0dXJlIGFuZCAKICAgICAgICAgICAgb25lIHRhcmdldGVkIHRvIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgTm90ZTogdGhpcyBpbmNvbXBhdGliaWxpdHkgaXMgdGhlCiAgICAgICAgICAgIHByaW1hcnkgcmVhc29uIGZvciBjaGFuZ2luZyB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0aXZlLgoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgaGFuZGxpbmcgb2YgY29weSBjb25zdHJ1Y3RvcnMuICBJZiBhIGNsYXNzIGRlZmluZXMgCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIEZvbygpOwogICAgICAgICAgICAgICAgICAgICAgRm9vKGNvbnN0IEZvbyAmKTsgICAgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIGEgZnVuY3Rpb24gY29weV9Gb28oKSBmb3IgdGhlIGNvcHkKICAgICAgICAgICAgY29uc3RydWN0b3IuCgogICAgICAgICAgICBJbiBwcmV2aW91cyB2ZXJpb25zLCB0aGlzIGdlbmVyYXRlZCBhIG5hbWUtY2xhc2ggYW5kIGFuCiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UuICAgVG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIFNXSUcKICAgICAgICAgICAgZG9lcyBub3QgY2hhbmdlIHRoZSBiZWhhdmlvciBpZiAlcmVuYW1lIGlzIHVzZWQgdG8gcmVzb2x2ZQogICAgICAgICAgICB0aGUgbmFtZSBjb25mbGljdC4gICBIb3dldmVyLCBpZiBubyBuYW1lIHJlc29sdXRpb24gaXMgbWFkZSwKICAgICAgICAgICAgdGhpcyBuZXcgYXBwcm9hY2ggaXMgdXNlZC4KCiAgICAgICAgICAgIENvcHkgY29uc3RydWN0b3JzIG1heSBiZSBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlIGluIHRoZQogICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2UuICBIb3dldmVyLCB0aGlzIGlzIHVwIHRvIHRoZSBsYW5ndWFnZSBtb2R1bGUKICAgICAgICAgICAgaXRzZWxmLgogICAgICAgICAgICAgICAgICAKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBpcyBub3cgbmFtZXNwYWNlIGF3YXJlLiAgIFRoaXMgYWxsb3dzCiAgICAgICAgICAgIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IG1heChUIGEsIFQgYikgeyByZXR1cm4gYSA+IGIgPyBhIDogYjsgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBmb287CiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgICAvLyBPawoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBiYXIgewogICAgICAgICAgICAgICAgICAgdXNpbmcgZm9vOjptYXg7CiAgICAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4ZG91YmxlKSBtYXg8ZG91YmxlPjsgICAvLyBPawogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgQ2F2ZWF0OiB0aGUgdGVtcGxhdGUgbmFtZSBzdXBwbGllZCB0byAldGVtcGxhdGUgbXVzdCBiZSBkZWZpbmVkIGluIHRoZQogICAgICAgICAgICBzYW1lIHNjb3BlIGluIHdoaWNoIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGFwcGVhcnMuICAgVGhpcyBjb2RlIGlzCiAgICAgICAgICAgIGlsbGVnYWw6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGludCkgZm9vOjptYXg8aW50PjsKCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gcHJlcHJvY2Vzc29yLiAgIFRoZSBwcmVwcm9jZXNzb3IgY2FuIG5vdyBwZXJmb3JtCiAgICAgICAgICAgIHN0cmluZyBjb21wYXJpc29uLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBBICJoZWxsbyIKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICNpZiBBID09ICJoZWxsbyIKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgaXMgaW4gU1dJRyBtYWNyb3MuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWRlZmluZSBGT08oeCkgCiAgICAgICAgICAgICAgI2lmICN4ID09ICJpbnQiCiAgICAgICAgICAgICAgLyogU3BlY2lhbCBoYW5kbGluZyBmb3IgaW50ICovCiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgI2VuZGlmCiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgTm9ybWFsIHVzZXJzIGNhbiBwcm9iYWJseSBzYWZlbHkgaWdub3JlIHRoaXMgZmVhdHVyZS4gIEhvd2V2ZXIsIGl0IG1heQogICAgICAgICAgICBiZSB1c2VkIGluIHBhcnRzIG9mIHRoZSBTV0lHIGxpYnJhcnkuCgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZ1cnRoZXIgcmVmaW5lbWVudCBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3Igd3JhcHBlciBnZW5lcmF0aW9uLgogICAgICAgICAgICBTV0lHIGlzIG5vdyBtdWNoIG1vcmUgYXdhcmUgb2YgcHVyZSB2aXJ0dWFsIG1ldGhvZHMuIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgY2xhc3MgQSB7ICAgICAgICAgICAgIC8qIEFic3RyYWN0ICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QxKCkgPSAwOwogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QyKCkgPSAwOwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsgIC8qIEFic3RyYWN0ICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QxKCkgeyB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgIGNsYXNzIEMgOiBwdWJsaWMgQiB7ICAvKiBPayAqLwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kMigpIHsgfTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBTV0lHIHdpbGwgb25seSBnZW5lcmF0ZSBkZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgQy4KICAgICAgICAgICAgRXZlbiB0aG91Z2ggQiBsb29rcyBmaW5lLCBpdCdzIG1pc3NpbmcgYSByZXF1aXJlZCBtZXRob2QgYW5kIGlzIGFic3RyYWN0LgoKMDQvMDQvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHN0cnVjdHVyZSBkYXRhIG1lbWJlciBhY2Nlc3MuICBJZiB5b3UKICAgICAgICAgICAgaGF2ZSBhIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgQmFyICAgYjsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciBiIGFyZSBnZW5lcmF0ZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICgxKSBJZiBiIGlzICpub3QqIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgb3IgY2xhc3M6CgogICAgICAgICAgICAgICAgQmFyIEZvb19iX2dldChGb28gKnNlbGYpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi0+YjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvaWQgRm9vX2Jfc2V0KEZvbyAqc2VsZiwgQmFyIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YiA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKDIpIElmIGIgKmlzKiBkZWZpbmVkIGFzIGEgc3RydWN0dXJlIG9yIGNsYXNzOgoKICAgICAgICAgICAgICAgIEJhciAqRm9vX2JfZ2V0KEZvbyAqc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAmc2VsZi0+YjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZvaWQgRm9vX2Jfc2V0KEZvbyAqc2VsZiwgQmFyICp2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNlbGYtPmIgPSAqdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFNlZSB0aGUgIlN0cnVjdHVyZSBkYXRhIG1lbWJlcnMiIHNlY3Rpb24gb2YgRG9jL01hbnVhbC9TV0lHLmh0bWwKICAgICAgICAgICAgZm9yIGZ1cnRoZXIgZGV0YWlscy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICBUaGlzIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQgcmVsaWVkIG9uIGEgbG90IG9mIGEgdW5kZWNsYXJlZAogICAgICAgICAgICBzdHJ1Y3R1cmUgYW5kIGNsYXNzIG5hbWVzLiAgICBUbyBnZXQgdGhlIG9sZCBiZWhhdmlvciwgc2ltcGx5CiAgICAgICAgICAgIHVzZSBhIGZvcndhcmQgZGVjbGFyYXRpb24gc3VjaCBhcyAic3RydWN0IEJhcjsiCiAgICAgICAgICAgIAowNC8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEMrKyBuYW1lc3BhY2Ugc3VwcG9ydCBhZGRlZC4gIFNXSUcgc3VwcG9ydHMgYWxsIGFzcGVjdHMgb2YKICAgICAgICAgICAgbmFtZXNwYWNlcyBpbmNsdWRpbmcgbmFtZXNwYWNlLCB1c2luZywgYW5kIG5hbWVzcGFjZSBhbGlhcwogICAgICAgICAgICBkZWNsYXJhdGlvbnMuICAgIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIFNXSUcgaXMgdG8gZmxhdHRlbgogICAgICAgICAgICBuYW1lc3BhY2VzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuICBIb3dldmVyLCBuYW1lc3BhY2VzIGFyZQogICAgICAgICAgICBmdWxseSBzdXBwb3J0ZWQgYXQgdGhlIEMrKyBsZXZlbCBhbmQgaW4gdGhlIHR5cGUgc3lzdGVtLgogICAgICAgICAgICBTZWUgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sIGZvciBkZXRhaWxzIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAKMDQvMDIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTdW4gaGFzIG1vZGlmaWVkIGphdmFjIGluIGpkazEuNCB0byBubyBsb25nZXIgY29tcGlsZQogICAgICAgICAgICBhbiBpbXBvcnQgb2YgYW4gdW5uYW1lZCBuYW1lc3BhY2UuIFRvIGZpeCB0aGlzIFNXSUcgbm8gbG9uZ2VyIAogICAgICAgICAgICBnZW5lcmF0ZXMgdGhlIGltcG9ydCBmb3IgcGFja2FnZWxlc3MgY2xhc3Nlcy4KICAgICAgICAgICAgaHR0cDovL2RldmVsb3Blci5qYXZhLnN1bi5jb20vZGV2ZWxvcGVyL2J1Z1BhcmFkZS9idWdzLzQzNjE1NzUuaHRtbAogICAgICAgICAgICBBcyByZXBvcnRlZCBTRiAjNTM4NDE1LgoKMDMvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHN1cHBvcnQgZm9yIHBvaW50ZXItdG8tbWVtYmVyLCBzaW1pbGFyIHRvIHRoYXQKICAgICAgICAgICAgZm9yIHRoZSBQeXRob24gbW9kdWxlLiBSZW1hcmthYmx5IHNpbWlsYXIuIEFsc28gYWRkZWQgYSBuZXcKICAgICAgICAgICAgZXhhbXBsZSBmb3IgdGhpcyAoRXhhbXBsZXMvcnVieS9tcG9pbnRlciksIHdoaWNoIGlzIHJlbWFya2FibHkKICAgICAgICAgICAgc2ltaWxhciB0byB0aGUgUHl0aG9uIGV4YW1wbGUgb2YgdGhlIHNhbWUgbmFtZS4KCjAzLzI2LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBNYWRlIGEgZmV3IG1pbm9yIGVkaXRzIHRvIHRoZSAiQWR2YW5jZWQgVG9waWNzIgogICAgICAgICAgICBjaGFwdGVyIG9mIHRoZSBTV0lHIG1hbnVhbCBhbmQgYWRkZWQgYSBuZXcgbWFqb3Igc2VjdGlvbgogICAgICAgICAgICBhYm91dCBob3cgdG8gY3JlYXRlIG11bHRpLW1vZHVsZSBSdWJ5IHBhY2thZ2VzIHdpdGggU1dJRy4KCjAzLzI2LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBSZW1vdmVkIGFsbCBvZiB0aGUgb2xkIFJ1YnkgcHJhZ21hcy4gSWYgYW55IG9mIHRoaXMKICAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyB0cnVseSBtaXNzZWQgd2UgY2FuIHJlc3VycmVjdCBpdCwgcHJlZmVyYWJseQogICAgICAgICAgICB3aXRoIHNvbWUga2luZCBvZiBmZWF0dXJlLWJhc2VkIGRpcmVjdGl2ZS4KICAgICAgICAgICAgCjAzLzI1LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBTV0lHIGV4Y2VwdGlvbiBsaWJyYXJ5IHN1cHBvcnQgZm9yIFJ1YnksIHdoaWNoCiAgICAgICAgICAgIGhhcyBhcHBhcmVudGx5IGJlZW4gYnJva2VuIGZvciBzb21lIHRpbWUuIEx1Y2tpbHksIG5vIG9uZSBzZWVtcwogICAgICAgICAgICB0byBoYXZlIG5vdGljZWQuCgowMy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEMrKy1uYW1lc3BhY2Ugc3VwcG9ydCBpbiBTV0lHIGRpcmVjdGl2ZXMuCgogICAgICAgICAgICAlYWRkbWV0aG9kczogCgogICAgICAgICAgICBUaGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIG5vdyBhY2NlcHRzIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZQogICAgICAgICAgICBhbmQgY2FuIGJlIHVzZWQgaW5zaWRlIEMrKyBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIC8vIEF0dGFjaGVzIHRvIHRoZSBjbGFzcyBGb286OkJhciBiZWxvdwogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIEZvbzo6QmFyIHsKICAgICAgICAgICAgICAgICAgICAgaW50IHNvbWVtZXRob2QoKSB7IC4uLiB9CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoZXMgdG8gdGhlIGNsYXNzIEJhciBhYm92ZQogICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgb3RoZXJtZXRob2QoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAlZmVhdHVyZSwgJXJlbmFtZSwgJWlnbm9yZSwgJWV4Y2VwdGlvbiwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlczoKCiAgICAgICAgICAgIE5hbWVzcGFjZXMgYXJlIGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgcmVuYW1pbmcgYW5kIGRlY2xhcmF0aW9uCiAgICAgICAgICAgIG1hdGNoZXIuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXJlbmFtZShkaXNwbGF5KSBGb286OnByaW50OyAgICAgICAgICAvLyBSZW5hbWUgaW4gbmFtZXNwYWNlIEZvbwogICAgICAgICAgICAgICAgICVpZ25vcmUgRm9vOjpCYXI6OmJsYWg7ICAgICAgICAgICAgICAgLy8gSWdub3JlIGEgZGVjbGFyYXRpb24KCiAgICAgICAgICAgICVyZW5hbWUgZGlyZWN0aXZlcyBjYW4gYmUgcGxhY2VkIGluc2lkZSBuYW1lc3BhY2UgYmxvY2tzIGFzIHdlbGwuIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBGb28gewogICAgICAgICAgICAgICAgICAgJXJlbmFtZShkaXNwbGF5KSBwcmludDsgICAgICAgICAvLyBBcHBsaWVzIHRvIHByaW50IGJlbG93CgogICAgICAgICAgICAgICAgICAgdm9pZCBwcmludCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE1vc3Qgb3RoZXIgU1dJRyBkaXJlY3RpdmVzIHNob3VsZCB3b3JrIHByb3Blcmx5IGluc2lkZSBuYW1lc3BhY2VzLgogICAgICAgICAgICBObyBvdGhlciBjaGFuZ2VzIGFyZSBuZWVkZWQuCiAgICAgIAowMy8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byBpbnRlcm5hbCBzeW1ib2wgdGFibGUgaGFuZGxpbmcuICAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICAgbWFuYWdlcyBzdHJ1Y3R1cmVzIGFuZCB1bmlvbnMgaW4gYSBzZXBhcmF0ZSBuYW1lc3BhY2UgdGhhbiBub3JtYWwKICAgICAgICAgICAgZGVjbGFyYXRpb25zIGxpa2UgQU5TSSBDLiAgVGhpcyBtZWFucyB5b3UgY2FuJ3QgaGF2ZSBhIHN0cnVjdHVyZQogICAgICAgICAgICB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgYSBmdW5jdGlvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgRm9vKCkgeyAuLi4gfQoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBpcyBtb3JlIGxpa2UgQysrLiAgIEl0J3Mgbm90IGNsZWFyIHRoYXQgU1dJRyBldmVyCiAgICAgICAgICAgIHJlYWxseSBzdXBwb3J0ZWQgdGhlIEFOU0kgQyBhbnl3YXlzLS0tdXNpbmcgdGhlIHNhbWUgbmFtZSB3b3VsZAogICAgICAgICAgICBhbG1vc3QgY2VydGFpbmx5IGdlbmVyYXRlIGEgbmFtZS1jbGFzaCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKMDMvMjIvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFsgNTE3MzAyIF0gZm9yIGhhbmRsaW5nIG9mIHJlbmFtZWQgb3ZlcmxvYWRlZAogICAgICAgICAgICBjb25zdHJ1Y3RvcnMuIE5vdywgcmVuYW1lZCBvdmVybG9hZGVkIGNvbnN0cnVjdG9ycyBhcmUgY29udmVydGVkCiAgICAgICAgICAgIGludG8gY2xhc3Mgc2luZ2xldG9uIG1ldGhvZHMgKGJhc2ljYWxseSBhY3RpbmcgYXMgImZhY3RvcnkiCiAgICAgICAgICAgIG1ldGhvZHMpLgoKMDMvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDUzMjk1NyBdICVpZ25vcmUgcGFyc2UgZXJyb3IgYW5kIGNhc3Rpbmcgb3BlcmF0b3IuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMDMvMTgvMjAwMjogYmVhemxleSAoKiogQURWQU5DRUQgVVNFUlMgT05MWSAqKikKICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZHluYW1pYyBjYXN0aW5nIGluIHJldHVybiB2YWx1ZXMuICBBIHNvbWV3aGF0CiAgICAgICAgICAgIGNvbW1vbiBwcm9ibGVtIGluIGNlcnRhaW4gQysrIHByb2dyYW1zIGlzIGZ1bmN0aW9ucyB0aGF0IGhpZGUKICAgICAgICAgICAgdGhlIGlkZW50aXR5IG9mIHVuZGVybHlpbmcgb2JqZWN0cyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIAogICAgICAgICAgICBmcm9tIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBhIHByb2dyYW0gbWlnaHQgaW5jbHVkZQogICAgICAgICAgICBzb21lIGdlbmVyaWMgbWV0aG9kIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICAgICBOb2RlICpnZXROb2RlKCk7CgogICAgICAgICAgICBIb3dldmVyLCBOb2RlICogbWF5IGp1c3QgYmUgYmFzZSBjbGFzcyB0byBhIHdob2xlIGhpZXJhcmNoeQogICAgICAgICAgICBvZiBkaWZmZXJlbnQgb2JqZWN0cy4gICBJbnN0ZWFkIG9mIHJldHVybmluZyB0aGlzIGdlbmVyaWMgTm9kZSAqLAogICAgICAgICAgICBpdCBtaWdodCBiZSBuaWNlIHRvIGF1dG9tYXRpY2FsbHkgZG93bmNhc3QgdGhlIG9iamVjdCBpbnRvIHRoZQogICAgICAgICAgICBhcHByb3ByaWF0ZSB0eXBlIHVzaW5nIHNvbWUga2luZCBkeW5hbWljIGNhc3QuCgogICAgICAgICAgICBBc3N1bWluZyB5b3UgdW5kZXJzdGFuZCB0aGUgcGVyaWwgaW52b2x2ZWQsIGEgZG93bmNhc3QgY2FuIG5vdwogICAgICAgICAgICBiZSBwZXJmb3JtZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpbiB0aGUgcnVuLXRpbWUgdHlwZQogICAgICAgICAgICBjaGVja2VyOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqU1dJR19UeXBlRHluYW1pY0Nhc3Qoc3dpZ190eXBlX2luZm8gKiwgdm9pZCAqKnB0cik7CgogICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNoZWNrcyB0byBzZWUgaWYgdGhlIHR5cGUgY2FuIGJlIGNvbnZlcnRlZCB0byBhbm90aGVyCiAgICAgICAgICAgIHR5cGUuICBJZiBzbywgYSBkaWZmZXJlbnQgdHlwZSBkZXNjcmlwdG9yIChmb3IgdGhlIGNvbnZlcnRlZCB0eXBlKQogICAgICAgICAgICBpcyByZXR1cm5lZC4gICBUaGlzIHR5cGUgZGVzY3JpcHRvciB3b3VsZCB0aGVuIGJlIHVzZWQgdG8gY3JlYXRlCiAgICAgICAgICAgIGEgcG9pbnRlciBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgoKICAgICAgICAgICAgVG8gdXNlIHRoaXMsIHlvdSB3b3VsZCB3cml0ZSBhIHR5cGVtYXAgc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIE5vZGUgKiB7CiAgICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTV0lHX1R5cGVEeW5hbWljQ2FzdCgkMV9kZXNjcmlwdG9yLCAodm9pZCAqKikgJiQxKTsKICAgICAgICAgICAgICAgICRyZXN1bHQgPSBTV0lHX05ld1BvaW50ZXJPYmooJDEsIHR5KTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LAoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIE5vZGUgKiA9IFNXSUdUWVBFICpEWU5BTUlDOwoKICAgICAgICAgICAgVG8gbWFrZSB0aGUgdHlwZW1hcCBoYXZlIGFueSBlZmZlY3QsIHlvdSBoYXZlIHRvIHdyaXRlIGEgc3VwcG9ydGluZyAKICAgICAgICAgICAgZnVuY3Rpb24gdGhhdCBrbm93cyBob3cgdG8gcGVyZm9ybSBkb3duY2FzdGluZy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgc3RhdGljIHN3aWdfdHlwZV9pbmZvICoKICAgICAgICAgICAgICBOb2RlX2R5bmFtaWNfY2FzdCh2b2lkICoqcHRyKSB7CiAgICAgICAgICAgICAgICAgTm9kZSAqKm5wdHIgPSAoTm9kZSAqKikgcHRyOwogICAgICAgICAgICAgICAgIEVsZW1lbnQgKmUgPSBkeW5hbWljX2Nhc3Q8RWxlbWVudCAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGUpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9FbGVtZW50OwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBEYXRhICpkID0gZHluYW1pY19jYXN0PERhdGEgKj4oKm5wdHIpOwogICAgICAgICAgICAgICAgIGlmIChkKSB7CiAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh2b2lkICopIGQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNXSUdUWVBFX3BfRGF0YTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGVyZSBpcyBubyByZXN0cmljdGlvbiBvbiBob3cgdHlwZXMgYXJlIGRldGVybWluZWQuIGR5bmFtaWNfY2FzdDw+CiAgICAgICAgICAgIHVzZXMgQysrIFJUVEkuICBIb3dldmVyLCBpZiB5b3UgaGFkIHNvbWUgb3RoZXIgbWVjaGFuaXNtIGZvciBkZXRlcm1pbmluZwogICAgICAgICAgICB0aGUgdHlwZSwgeW91IGNvdWxkIHVzZSB0aGF0IGhlcmUuICBOb3RlOiBpdCBpcyBpbXBvcnRhbnQgdG8gc2F2ZQogICAgICAgICAgICB0aGUgbmV3IHBvaW50ZXIgdmFsdWUgYmFjayBpbnRvIHRoZSBhcmd1bWVudCBhcyBzaG93bi4gIFdoZW4gZG93bmNhc3RpbmcsCiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciBjb3VsZCBjaGFuZ2UuIAoKICAgICAgICAgICAgRmluYWxseSwgdG8gbWFrZSB0aGUgY2FzdGluZyBmdW5jdGlvbiBhdmFpbGFibGUsIHlvdSBoYXZlIHRvIHJlZ2lzdGVyCiAgICAgICAgICAgIGl0IHdpdGggdGhlIHJ1bi10aW1lIHR5cGUgY2hlY2tlci4gUHV0IHRoaXMgbWFjcm8gaW4geW91ciBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgICAgICAgIERZTkFNSUNfQ0FTVChTV0lHVFlQRV9wX05vZGUsIE5vZGVfZHluYW1pY19jYXN0KTsKCiAgICAgICAgICAgIE5vdGU6IHRoaXMgZmVhdHVyZSBkb2VzIG5vdCBpbnRyb2R1Y2UgYSBwZXJmb3JtYW5jZSBwZW5hbHR5IG9uIAogICAgICAgICAgICBub3JtYWwgU1dJRyBvcGVyYXRpb24uICBUaGUgZmVhdHVyZSBpcyBvbmx5IGVuYWJsZWQgYnkgd3JpdGluZwogICAgICAgICAgICBhIG5ldyB0eXBlbWFwIHRoYXQgZXhwbGljaXRseSBjYWxscyBTV0lHX1R5cGVEeW5hbWljQ2FzdCgpIHRvCiAgICAgICAgICAgIG1ha2UgYSBjb252ZXJzaW9uLiAKICAKICAgICAgICAgICAgRXhhbXBsZXMvdGVzdC1zdWl0ZS9keW5hbWljX2Nhc3QuaSBjb250YWlucyBhIHNpbXBsZSBleGFtcGxlLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgSmF2YSBtb2R1bGUgZHVlIHRvIGRpZmZlcmVuY2VzCiAgICAgICAgICAgIGluIHRoZSB0eXBlLWNoZWNraW5nIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKMDMvMTcvMjAwMjogYmVhemxleQogICAgICAgICAgICBTbWFsbCBjaGFuZ2UgdG8gdHlwZS1uYW1lIGhhbmRsaW5nIG9mIHVubmFtZWQgc3RydWN0dXJlcyBhbmQKICAgICAgICAgICAgdHlwZWRlZi4gIElmIGEgc3RydWN0dXJlIG9mIHRoaXMgZm9ybSBhcHBlYXJzOgoKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9IEZvbzsKCiAgICAgICAgICAgIFRoZW4gJ0ZvbycgaXMgdXNlZCBhcyB0aGUgcHJvcGVyIHR5cGVuYW1lIGZvciB0aGUgc3RydWN0dXJlLgogICAgICAgICAgICBGdXJ0aGVybW9yZSwgRm9vIGNhbiBub3cgYmUgdXNlZCBhcyBhIG5hbWUgaW4gQysrIGluaGVyaXRhbmNlLgogICAgICAgICAgICBTV0lHIHdhcyBhbHJlYWR5IGtpbmQgb2YgZG9pbmcgdGhpcywgYnV0IHRoaXMgbW9kaWZpY2F0aW9uIHJlZmluZXMKICAgICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIHRvIG1vcmUgY2xvc2VseSBmb2xsb3cgdGhlIEMrKyBBUk0sIHNlY3Rpb24KICAgICAgICAgICAgNy4xLjMsIHAuIDEwNi4gIFRoaXMgZml4ZXMgYSBjb3VwbGUgb2Ygb2JzY3VyZSBjb3JuZXIgY2FzZXMuCgowMy8xNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIEMrKyBpbmhlcml0YW5jZSB3aXRoIGEgZmV3IGVuaGFuY2VtZW50cy4gIEZpcnN0LCB0eXBlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIG5lZWRlZCBmb3IgY2FzdGluZyBhbmQgdHlwZS1lcXVpdmFsZW5jZSBpcyBnZW5lcmF0ZWQgZXZlbiB3aGVuIGJhc2UtY2xhc3NlcwogICAgICAgICAgICBhcmVuJ3QgZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciAgeyAgICAvKiBCYXIgdW5zcGVjaWZpZWQgKi8KICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgdm9pZCBibGFoKEJhciAqYik7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBibGFoKCkgZnVuY3Rpb24gc3RpbGwgYWNjZXB0cyBGb28gKiBldmVuIHRob3VnaCBub3RoaW5nCiAgICAgICAgICAgIGlzIHJlYWxseSBrbm93biBhYm91dCBCYXIuICAgUHJldmlvdXMgU1dJRyB2ZXJzaW9ucyB3b3VsZCBqdXN0IGdlbmVyYXRlCiAgICAgICAgICAgIGEgdHlwZSBlcnJvci4KCiAgICAgICAgICAgIEluaGVyaXRhbmNlIGhhcyBhbHNvIGJlZW4gbW9kaWZpZWQgdG8gd29yayB0aHJvdWdoIHR5cGVkZWYuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIEJhciBPdGhlckJhcjsKICAgICAgICAgICAgICAgY2xhc3MgRm9vOiBwdWJsaWMgT3RoZXJCYXIgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBiYXNlIGNsYXNzIG9mIE90aGVyQmFyIGlzIGNvcnJlY3RseSByZXNvbHZlZCBiYWNrIHRvCiAgICAgICAgICAgIEJhci4gICBUaGUgdXNlIG9mIHRoZSBuYW1lIE90aGVyQmFyIGlzIGxvc3QgaW4gdGhpcyByZXNvbHV0aW9uICh0aGUgd3JhcHBlcnMKICAgICAgICAgICAgd2lsbCBzaW1wbHkgdXNlIEJhciBpbnN0ZWFkIG9mIHRoZSB0eXBlZGVmIG5hbWUgT3RoZXJCYXIpLgogICAgICAgICAgIAowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICV0eXBlbWFwLCAlYXBwbHksIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMgY2FuIG5vdyBhcHBlYXIgaW5zaWRlCiAgICAgICAgICAgIGNsYXNzIGRlZmluaXRpb25zLiAgIAoKMDMvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHZhcmlldHkgb2YgcHJvYmxlbXMgcmVsYXRlZCB0byBjb21waWxpbmcgU1dJRyBvbiA2NC1iaXQKICAgICAgICAgICAgcGxhdGZvcm1zLgoKMDMvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggImlnbm9yZSIgYW5kICJpbiIgdHlwZW1hcHMuICBMb2NhbCB2YXJpYWJsZXMKICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoICJpbiIgd2VyZSBiZWluZyBhZGRlZCB0byB0aGUgd3JhcHBlciBmdW5jdGlvbiBldmVuCiAgICAgICAgICAgIHRob3VnaCB0aGV5IHdlcmUgbmV2ZXIgdXNlZC4gICBNb3N0bHkgaGFybWxlc3MsIGJ1dCBpdCB3b3VsZCBsZWFkCiAgICAgICAgICAgIHRvIGEgdmFyaWV0eSBvZiBjb21waWxhdGlvbiB3YXJuaW5ncy4KICAKMDMvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGNoYW5nZXMgdG8gdGhlIGludGVybmFsIHR5cGUgc3lzdGVtIGFuZCBoYW5kbGluZyBvZiBuZXN0ZWQgQysrCiAgICAgICAgICAgIHR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGlmIHlvdSBoYWQgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBCbGFoOwogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgY2xhc3MgQmFyIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIHZvaWQgc29tZW1ldGhvZChCbGFoIHgpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd291bGQgaW1wbGljaXRseSBiZSBzZXQgdG8gQmFyOjpCbGFoLgogICAgICAgICAgICBBbHRob3VnaCB0aGlzIGlzIHRlY2huaWNhbGx5IGFsbG93ZWQsIGl0IGJyZWFrcyB0eXBlbWFwcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vOjpCbGFoIHsgLi4uIH0KCiAgICAgICAgICAgIGRvZXNuJ3QgbWF0Y2ggbGlrZSB5b3UgZXhwZWN0LiAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBpbiBTV0lHLTEuMy4xMi4KICAgICAgICAgICAgTm93LCB0eXBlcyBhcmUgZXhwYW5kZWQgdXNpbmcgdGhlIGNsYXNzIGluIHdoaWNoIHRoZXkgd2VyZSBkZWZpbmVkLgogICAgICAgICAgICBTbywgdGhlIGFyZ3VtZW50IHR5cGUgaW4gc29tZW1ldGhvZCgpIHdpbGwgYmUgRm9vOjpCbGFoLS0tc2luY2UgdGhlCiAgICAgICAgICAgIHR5cGUgQmxhaCB3YXMgZGVmaW5lZCBpbiBGb28uCiAKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHN1YnRsZSB0eXBlIHNjb3BpbmcgcHJvYmxlbXMgd2l0aCB0eXBlZGVmIGFuZCBDKysgY2xhc3Nlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIEJsYWg7CiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oQmxhaCB4LCA6OkJsYWggeSk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSGlnaGx5IGV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gaGFuZGxlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCiAgICAgICAgICAgIEZpcnN0LCB0aGVyZSBpcyBubyBwb3J0YWJsZSBvciByZWxpYWJsZSB3YXkgdG8gd3JhcAogICAgICAgICAgICBhIHZhcmFyZ3MgZnVuY3Rpb24gaW4gZnVsbCBnZW5lcmFsaXR5LiAgSG93ZXZlciwgeW91ICpjYW4qIGNoYW5nZQogICAgICAgICAgICB0aGUgZnVuY3Rpb24gc2lnbmF0dXJlIHVzaW5nICV2YXJhcmdzLgoKICAgICAgICAgICAgICAgJXZhcmFyZ3MoY2hhciAqKSBmcHJpbnRmOwogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgdm9pZCBmcHJpbnRmKEZJTEUgKmYsIGNoYXIgKmZtdCwgLi4uKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHZhcmlhYmxlIGxlbmd0aCBwYXJhbWV0ZXIgIi4uLiIgaXMKICAgICAgICAgICAgc2ltcGx5IHJlcGxhY2VkIGJ5IHRoZSBwYXJhbWV0ZXJzIGdpdmVuIGluICV2YXJhcmdzLiBUaGlzCiAgICAgICAgICAgIHJlc3VsdHMgaW4gYSBmdW5jdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCBjaGFyICpzKTsKCiAgICAgICAgICAgIE1vcmUgdGhhbiBvbmUgYXJndW1lbnQgY2FuIGJlIHVzZWQgYW5kIGRlZmF1bHQgdmFsdWVzCiAgICAgICAgICAgIGNhbiBiZSBkZWZpbmVkLiAgRm9yIGV4YW1wbGUsIHRoaXMgY29kZSBzcGVjaWZpZXMgYQogICAgICAgICAgICBtYXhpbXVtIG9mIGZvdXIgYXJndW1lbnRzLgoKICAgICAgICAgICAgICAgJXZhcmFyZ3MoY2hhciAqeDEgPSAwLCBjaGFyICp4MiA9IDAsIGNoYXIgKngzID0gMCwgY2hhciAqeDQgPSAwKSBmcHJpbnRmOwogCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCiAKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2UgdG8gaGFuZGxpbmcgb2YgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4gIHZhcmFyZ3MKICAgICAgICAgICAgaXMgbm93IGhhbmRsZWQgYXMgYSBwcm9wZXIgcGFyYW1ldGVyIGFuZCBpcyBwYXNzZWQgdG8gdGhlCiAgICAgICAgICAgIGNvZGUgZ2VuZXJhdG9yLiAgSG93ZXZlciwgaXQgc3RpbGwgY2FuJ3QgYmUgaGFuZGxlZCBjb3JyZWN0bHkKICAgICAgICAgICAgKGFuZCB3aWxsIGdlbmVyYXRlIGEgdHlwZW1hcCB3YXJuaW5nKS4gICBUaGlzIGNoYW5nZSBoYXMgYmVlbgogICAgICAgICAgICBtYWRlIHRvIGJldHRlciBpbmNvcnBvcmF0ZSB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzIHdpdGggb3RoZXIKICAgICAgICAgICAgZGlyZWN0aXZlcyBzdWNoIGFzICVpZ25vcmUsICVyZW5hbWUsICVmZWF0dXJlLCBhbmQgc28gZm9ydGguCgowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTIyNTU1IF0gU3ludGF4IGVycm9yIHBhcnNpbmcgImRlZmluZSIgY29uc3RydWN0LiBTV0lHCiAgICAgICAgICAgIGlzIGEgbGl0dGxlIG1vcmUgcmVzdHJpY3RpdmUgaW4gZGV0ZXJtaW5pbmcgI2RlZmluZSBzdGF0ZW1lbnRzCiAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB3cmFwcGVkIGFzIGNvbnN0YW50cy4gIEFsc28gYWRkZWQgYSBiZXR0ZXIgcGFyc2VyCiAgICAgICAgICAgIGVycm9yIHJ1bGUgZm9yIGhhbmRsaW5nIGJhZCBjb25zdGFudHMuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IENsYXNzZXMgcmVuYW1lZCB3aXRoICVyZW5hbWUgdGhhdCBhcmUgZGVyaXZlZCBmcm9tIAogICAgICAgICAgICBhbm90aGVyIGNsYXNzIGdlbmVyYXRlIG1vcmUgYXBwcm9wcmlhdGUgc2hhZG93IGNsYXNzIGNvZGUuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFNGIFsgIzUyMzYzMiBdIGFuZCBbICM1MTMzMzUgXSBib3RoIHJlcG9ydGVkIGJ5IElzcmFlbCAKICAgICAgICAgICAgVGFubmVyLiBTdXBwb3J0IGZvciB0eXBlcyB0aGF0IGFyZSB1c2VkIHdoaWNoIGFyZSBpbiBhIHR5cGVkZWYuIFRoZQogICAgICAgICAgICBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgbmFtZSBpcyBnZW5lcmF0ZWQuIEFsc28gZ2VuZXJhdGVkIGNvcnJlY3QKICAgICAgICAgICAgc2hhZG93IGNsYXNzbmFtZSB3aGVuIGEgdGVtcGxhdGVkIGNsYXNzIGlzIHVzZWQgd2l0aGluIGFub3RoZXIgCiAgICAgICAgICAgIHRlbXBsYXRlZCBjbGFzcy4gU2VlIHRoZSBjcHBfdHlwZWRlZi5pIHRlc3RjYXNlLgoKMDMvMDgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyB0eXBlIHdhcyBnZW5lcmF0ZWQgaW4gc2hhZG93IGNsYXNzZXMgZm9yIHR5cGVzIAogICAgICAgICAgICB0aGF0IHdlcmVuJ3Qgd3JhcHBlZCBieSBTV0lHLiAgVGhlIHR5cGUgaXMgdHJlYXRlZCBhcyBhIHJhdyAKICAgICAgICAgICAgcG9pbnRlciwgaWUgbm8gc2hhZG93IGNsYXNzLgoKMDIvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZWZpbmVkIHRoZSBtYXRjaGluZyBhbGdvcml0aG0gdXNlZCBieSAlcmVuYW1lLCAlaWdub3JlLCBhbmQKICAgICAgICAgICAgJWZlYXR1cmUuICAgSWYgYSB0eXBlIHNpZ25hdHVyZSBpcyBzdXBwbGllZCwgaXQgbXVzdCBleGFjdGx5CiAgICAgICAgICAgIG1hdGNoIHRoYXQgdXNlZCBpbiB0aGUgZGVjbGFyYXRpb24tLS1pbmNsdWRpbmcgYW55IHVzZSBvZgogICAgICAgICAgICBjb25zdC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vMSkgICBmb28oaW50KTsKICAgICAgICAgICAgICAgICVyZW5hbWUoYmFyMSkgICBiYXIoaW50KSBjb25zdDsKCiAgICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7ICAgICAgIC8vIE1hdGNoZWQgLS0+IGZvbzEKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCkgY29uc3Q7IC8vIE5vdCBtYXRjaGVkIAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsgICAgICAgLy8gTm90IG1hdGNoZWQKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCkgY29uc3Q7IC8vIE1hdGNoZWQgLS0+IGJhcjEKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIG5vbi1jb25zdCBzcGVjaWZpY2F0aW9uIHdvdWxkIG1hdGNoCiAgICAgICAgICAgIGJvdGggdGhlIG5vbi1jb25zdCBhbmQgY29uc3QgZGVjbGFyYXRpb25zLiAgSG93ZXZlciwgdGhlIHdob2xlCiAgICAgICAgICAgIHBvaW50IG9mICVyZW5hbWUgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBpcyB0aGF0IHRoZXkgYmUgYWJsZQogICAgICAgICAgICB0byBwcmVjaXNlbHkgcGlucG9pbnQgZXhhY3QgZGVjbGFyYXRpb25zIGluIGFuIGludGVyZmFjZS4gIFRoaXMKICAgICAgICAgICAgZml4ZXMgdGhlIHByb2JsZW0uCgowMi8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJld29ya2VkIHRoZSBoYW5kbGluZyBvZiBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCBkZXN0cnVjdG9ycy4KICAgICAgICAgICAgU1dJRyBub3cgbWFrZXMgYSBwcmVsaW1pbmFyeSBwYXNzIG92ZXIgdGhlIHBhcnNlIHRyZWUgdG8gZGlzY292ZXIKICAgICAgICAgICAgd2hpY2ggY2xhc3NlcyBzdXBwb3J0IGRlZmF1bHQgYWxsb2NhdGlvbi4gICBUaGlzIGZpeGVzIGEgbnVtYmVyCiAgICAgICAgICAgIG9mIHZlcnkgc3VidGxlIGlzc3VlcyBpbiBjb2RlIGdlbmVyYXRpb24gYW5kIGNhbGwvcmV0dXJuIGJ5IHZhbHVlLgoKMDIvMTgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEltcHJvdmVkIHN1cHBvcnQgb24gQ3lnd2luOiBQZXJsLCBQeXRob24sIFRjbCwgUnVieSBhbmQgSmF2YSBzaG91bGQKICAgICAgICAgICAgd29yayBvdXQgb2YgdGhlIGJveCwgYmFycmluZyB0aGUgcnVudGltZSBsaWJyYXJ5LiBSZW1vdmVkIGRsbHdyYXAgCiAgICAgICAgICAgIGFuZCByZXBsYWNlZCB3aXRoIG5ld2x5IHdvcmtpbmcgZ2NjIC1zaGFyZWQgaW5zdGVhZCBmb3IgQ3lnd2luLiAKICAgICAgICAgICAgQWxsIHRoaXMgd2lsbCByZXF1aXJlIHRoZSBuZXcgaW1wcm92ZWQgYmludXRpbHMgMjAwMTA4MDIgYW5kIGxhdGVyLAogICAgICAgICAgICBidXQgdGhlIGxhdGVzdCBDeWd3aW4gaXMgdXN1YWxseSB0aGUgYmVzdCByZWNvbW1lbmRhdGlvbi4KCjAyLzE1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIHdyYXBwaW5nIG9mIGdsb2JhbCB2YXJpYWJsZXMKICAgICAgICAgICAgYW5kIFBlcmwgc2hhZG93IGNsYXNzZXMuIFJlcG9ydGVkIGJ5IENoaWEtbGlhbmcgS2FvLgoKMDIvMTUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hZGUgYSBmaXggdG8gdGhlIGNvZGUgZ2VuZXJhdGlvbiBmb3IgQysrIGNsYXNzCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBzbyB0aGF0IHdlIGdldCBib3RoIGEgIm5ldyIgc2luZ2xldG9uIG1ldGhvZAogICAgICAgICAgICBhbmQgYW4gImluaXRpYWxpemUiIGluc3RhbmNlIG1ldGhvZCBmb3IgZWFjaCBjbGFzcy4gVGhpcwogICAgICAgICAgICBjaGFuZ2UgZW5hYmxlcyBkZXZlbG9wZXJzIHRvIGRlcml2ZSBuZXcgUnVieSBjbGFzc2VzIGZyb20KICAgICAgICAgICAgU1dJRy13cmFwcGVkIEMrKyBjbGFzc2VzIGFuZCB0aGVuIG92ZXJyaWRlIHRoZWlyIGluaXRpYWxpemUKICAgICAgICAgICAgbWV0aG9kcyB0byBwcm92aWRlIHN1YmNsYXNzLXNwZWNpZmljIGluc3RhbmNlIGluaXRpYWxpemF0aW9uLgoKMDIvMTUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hc3NpdmUgZG9jdW1lbnRhdGlvbiB1cGRhdGUgZm9yIHRoZSBSdWJ5IG1vZHVsZSwKICAgICAgICAgICAgY29udHJpYnV0ZWQgYnkgQ3JhaWcgRmlsZXMuCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogQW4gZXJyb3IgaW4gdGhlIFNXSUcgcnVudGltZSBzdXBwb3J0IGZvciBSdWJ5CiAgICAgICAgICAgIHdhcyBjYXVzaW5nIHNldmVyYWwgb2YgdGhlIGV4YW1wbGVzIHRvIGZhaWwuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFdpbGxpYW0gRnVsdG9uLgoKMDIvMTQvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEJ1ZyBmaXg6IEVudW1lcmF0aW9ucyBkZWZpbmVkIHdpdGhpbiBhIGNsYXNzIChzdWNoCiAgICAgICAgICAgIGFzIHRob3NlIHNlZW4gaW4gdGhlIEV4YW1wbGVzL3J1YnkvZW51bSBleGFtcGxlKSB3ZXJlIG5vdAogICAgICAgICAgICBiZWluZyBleHBvcnRlZCB3aXRoIHRoZSBjb3JyZWN0IG5hbWVzLiBSZXBvcnRlZCBieSBXaWxsaWFtCiAgICAgICAgICAgIEZ1bHRvbi4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHdlIHJ1biBhY3Jvc3Mgb3ZlcmxvYWRlZAogICAgICAgICAgICBjbGFzcyBjb25zdHJ1Y3RvcnMgZm9yIEMrKyBjb2RlLCB0aGF0IHRoaXMgaXMgY3VycmVudGx5IG5vdAogICAgICAgICAgICBzdXBwb3J0ZWQgKGV2ZW4gaWYgdGhlIG92ZXJsb2FkcyBoYXZlIGJlZW4gJXJlbmFtZWQpLiBGb3IgYW4KICAgICAgICAgICAgZXhhbXBsZSBvZiB3aGVyZSB0aGlzIGRvZXNuJ3Qgd29yaywgc2VlIEV4YW1wbGVzL3J1Ynkvb3BlcmF0b3IuCgowMi8xMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgYW4gImlnbm9yZWQiIHdhcm5pbmcgbWVzc2FnZSB3aGVuIHRoZSBwYXJzZXIgcnVucwogICAgICAgICAgICBhY3Jvc3MgYW4gb3BlcmF0b3IhPSgpIGRlY2xhcmF0aW9uIGZvciBDKysgY29kZS4KCjAyLzExLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgImltcG9ydCIsICJpbXBvcnRfdGVtcGxhdGUiLCAib3BlcmF0b3IiIGFuZAogICAgICAgICAgICAidGVtcGxhdGUiIGV4YW1wbGVzLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIG11bHRpLW1vZHVsZSBzdXBwb3J0LgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSBtaXNzaW5nICIjZGVmaW5lIFNXSUdfTk9JTkNMVURFIiBhdCB0aGUgdG9wIG9mCiAgICAgICAgICAgIHRoZSB3cmFwcGVyIGNvZGUgd2hlbiB0aGUgJy1jJyBvcHRpb24gaXMgdXNlZC4KCjAyLzA5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIENvcnJlY3RlZCBhIG1pbm9yIG9mZi1ieS1vbmUgZXJyb3IgZm9yIHRoZSBzaXplIG9mIHRoZQogICAgICAgICAgICBzd2lnX3R5cGVzW10gYXJyYXkgdGhhdCdzIGdlbmVyYXRlZCBpbiB0aGUgd3JhcHBlciBjb2RlLgoKMDIvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBTRiBbICM1MTUwNTggXSBXcm9uZyBjb2RlIGZvciBDKysgdGVtcGxhdGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKVmVyc2lvbiAxLjMuMTEgKEphbnVhcnkgMzEsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggdG8gcGFzcy9yZXR1cm4gYnkgdmFsdWUgZm9yIEMrKyBvYmplY3RzIHRoYXQgZGVmaW5lCiAgICAgICAgICAgIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuICBDaGFuZ2VzIHRvIHRoZSB0eXBlbWFwIHN5c3RlbQogICAgICAgICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gd3JhcCBDKysgb2JqZWN0cyB3aXRoIG5vIGRlZmF1bHQKICAgICAgICAgICAgY29uc3RydWN0b3IuICAgVGhpcyBoYXMgYmVlbiBmaXhlZCwgYnV0IHRoZSBzb2x1dGlvbiAKICAgICAgICAgICAgaW52b2x2ZXMgc29tZSBjbGV2ZXIgdGVtcGxhdGUgbWFnaWMgY29udHJpYnV0ZWQgYnkgCiAgICAgICAgICAgIFdpbGxpYW0gRnVsdG9uLiAgUGxlYXNlIHNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGZpbGUKICAgICAgICAgICAgTGliL3N3aWcuc3dnIGZvciBmdXJ0aGVyIGRldGFpbHMuICBUaGlzIHNvbHV0aW9uIGlzCiAgICAgICAgICAgIGV4cGVyaW1lbnRhbCBhbmQgbWF5IGJlIHJlZmluZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgR2xvYmFsIHZhcmlhYmxlcyBhbmQgbWVtYmVyIGRhdGEgb2YgdHlwZSAiY29uc3QgY2hhciAqIgogICAgICAgICAgICBjYW4gYmUgc2V0LCBidXQgdGhlIG9sZCB2YWx1ZSBpcyBzaWxlbnRseSBkaXNjYXJkZWQgd2l0aG91dAogICAgICAgICAgICBhbnkgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgIFRoaXMgbWF5IGdlbmVyYXRlIGEgbWVtb3J5IGxlYWsuCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIG5lZWRlZCB0byBtb3JlIHNhZmVseSBoYW5kbGUgdmFyaWFibGVzCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmb28gPSAiSGVsbG8gV29ybGRcbiI7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIGl0J3Mgbm90IHNhZmUgdG8gZnJlZSB0aGUgb2xkIHZhbHVlLiAgSG93ZXZlciwKICAgICAgICAgICAgU1dJRyBjYW4gZHluYW1pY2FsbHkgYWxsb2NhdGUgYSBuZXcgdmFsdWUgYW5kIG1ha2UgZm9vIHBvaW50CiAgICAgICAgICAgIHRvIGl0LiAgIFRvIGZpeCB0aGlzIG1lbW9yeSBsZWFrLCB5b3UgY2FuIHByb2JhYmx5IGRvIHRoaXM6CgogICAgICAgICAgICAgICAlY2xlYXIgY29uc3QgY2hhciAqZm9vOwogICAgICAgICAgICAgICAlYXBwbHkgY2hhciAqIHtjb25zdCBjaGFyICpmb299OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIAowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFR3byBtaW5vciB0eXBlbWFwIGVuaGFuY2VtZW50cyBoYXZlIGJlZW4gYWRkZWQuICBGaXJzdCwKICAgICAgICAgICAgdHlwZW1hcHMgY2FuIGlzc3VlIGEgd2FybmluZyBtZXNzYWdlIGJ5IGluY2x1ZGluZyBhIHNwZWNpYWwKICAgICAgICAgICAgd2FybmluZyBhdHRyaWJ1dGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGluLHdhcm5pbmc9IkknbSBnb2luZyB0byBkbyBzb21ldGhpbmcgZGFuZ2Vyb3VzIikgLi4uCgogICAgICAgICAgICBUaGUgd2FybmluZyBtZXNzYWdlIHdpbGwgc2hvdyB1cCB3aGVuZXZlciB0aGUgdHlwZW1hcCBpcwogICAgICAgICAgICBhcHBsaWVkLgoKICAgICAgICAgICAgU2Vjb25kLCBhIHR5cGVtYXAgY2FuIGZvcmNlIGEgbm8tbWF0Y2ggYnkgZGVmaW5pbmcKCiAgICAgICAgICAgICAldHlwZW1hcChpbikgc29tZXR5cGUgInBhc3MiOwoKICAgICAgICAgICAgSWYgdGhpcyBpcyB1c2VkLCB0aGUgdHlwZW1hcCBzeXN0ZW0gd2lsbCAqbm90KiByZWNvcmQgYQogICAgICAgICAgICB0eXBlbWFwIG1hdGNoIGZvciAic29tZXR5cGUiLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYmxvY2sKICAgICAgICAgICAgc2VsZWN0ZWQgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBkaXNhYmxlCiAgICAgICAgICAgIGEgdHlwZW1hcCBmZWF0dXJlIGZvciBzb21lIHR5cGUsIHlvdSBjb3VsZCBkbyB0aGlzLgoKICAgICAgICAgICAgICAgLy8gRG8gbm90IGFsbG93IGdsb2JhbCB2YXJpYWJsZXMgb2YgdHlwZSAnY29uc3QgY2hhciAqJyB0byBiZSBzZXQuCiAgICAgICAgICAgICAgICV0eXBlbWFwKHZhcmluKSBjb25zdCBjaGFyICogInBhc3MiOwoKICAgICAgICAgICAgSXQgbWlnaHQgYWxzbyBiZSBwb3NzaWJsZSB0byB1c2UgdGhpcyB0byBkbyBzdWJ0bGUgYW5kCiAgICAgICAgICAgIHN0cmFuZ2UgdGhpbmdzIHdpdGggdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0bwogICAgICAgICAgICBtYWtlICdibGFoIConIGFuIG91dHB1dCB2YWx1ZSBhbmQgJ2NvbnN0IGJsYWggKicgYW4gaW5wdXQKICAgICAgICAgICAgcGFyYW1ldGVyLCB5b3UgbWlnaHQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIGJsYWggKihibGFoIHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEJsb2NrIHVucXVhbGlmaWVkIHR5cGVtYXBzIGRlZmluZWQgYWJvdmUgKi8KICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgY29uc3QgYmxhaCAqICJwYXNzIjsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgY29uc3QgYmxhaCAqICJwYXNzIjsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAgICAgY29uc3QgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGlucHV0IHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgIChUaGlzIHBvdGVudGlhbCBhcHBsaWNhdGlvbnMgb2YgdHlwZW1hcHMgc3VnZ2VzdGVkIGJ5IEdyZWcgU3RlaW4pLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8yOS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogTm8gZW51bWVyYXRpb25zIHdlcmUgd3JhcHBlZCB3aGVuIHRoZSAtc2hhZG93IAogICAgICAgICAgIGNvbW1hbmRsaW5lIG9wdGlvbiB3YXMgbm90IHNwZWNpZmllZC4gUmVwb3J0ZWQgYnkgSXNyYWVsIFRhbGxlci4KCjAxLzI4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBHbG9iYWwgYXJyYXlzIGFyZSBzdWNjZXNzZnVsbHkgd3JhcHBlZC4gSW4gZmFjdCB0aGV5IHN0YXJ0ZWQKICAgICAgICAgICBtb3N0bHkgd29ya2luZyBpbiBTV0lHLTEuMy4xMC4KCjAxLzI4LzIwMDI6cmljaGFyZHAKCSAgIEFkZGVkIGZpcnN0IGF0dGVtcHQgYXQgQysrIGFuZCAtc2hhZG93IHN1cHBvcnQgZm9yIFBIUDQgbW9kdWxlLAoJICAgcGxlYXNlIHRlc3QgYW5kIG1haWwgbWUgaWYgYW55IHByb2JsZW1zL2lkZWFzIG9uIGltcHJvdmluZyBpdC4KCgkgICBUaGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCB1bmluaXRpYWxpemVkIG1lbWJlciB2YXJpYWJsZXMsCgkgICBwbGVhc2Ugc2VlIEV4YW1wbGVzL3BocDQvc3luYy9SRUFETUUgZm9yIGRldGFpbHMuCgoJICAgQWxzbyBtb3JlIFBIUCBkb2N1bWVudGF0aW9uIGFkZGVkIHRvIERvYy9NYW51YWwvUGhwLmh0bWwKCjAxLzI3LzIwMDI6YmVhemxleQogICAgICAgICAgIFRoZSBBTlNJIEMgc2l6ZV90IHR5cGUgaXMgbm93IHJlY29nbml6ZWQgYXMgYW4gaW50ZWdlciBieSBkZWZhdWx0LgoKMDEvMjYvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgc3VwcG9ydCBhZGRlZCB0byBtYW55IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgVGhpcyBpcyBub3QgYSBwb3J0YWJsZSBmZWF0dXJlIGFuZCB3aWxsIHJlcXVpcmUgY29tcGlsZXIgc3VwcG9ydAogICAgICAgICAgIGZvciB0aGUgbG9uZyBsb25nIHR5cGUuICBJbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG8gbm90IHN1cHBvcnQKICAgICAgICAgICBsb25nIGxvbmcgKGUuZy4sIFRjbCBhbmQgUGVybCksIG51bWJlcnMgYXJlIGNvbnZlcnRlZCB0byBhIHN0cmluZwogICAgICAgICAgIG9mIGRpZ2l0cy4gIFRoaXMgcHJldmVudHMgdGhlaXIgdXNlIGluIGFyaXRobWV0aWMgY2FsY3VsYXRpb25zLCBidXQKICAgICAgICAgICBzdGlsbCBhbGxvd3MgdmFsdWVzIHRvIGJlIHNldCBmcm9tIGEgc3RyaW5nLiAgCgogICAgICAgICAgIGxvbmcgbG9uZyBzdXBwb3J0IHJlcXVpcmVzIHRoZSB1c2Ugb2YgdGhlIHN0cnRvbGwoKSBhbmQgc3RydG91bGwoKQogICAgICAgICAgIGZ1bmN0aW9ucyBhcyB3ZWxsIGFzIHRoZSAnbGxkJyBhbmQgJ2xsdScgZm9ybWF0IHNwZWNpZmllcnMKICAgICAgICAgICBvZiBzcHJpbnRmKCkuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM1MDE4MjcgXSBEZWxldGUgbWV0aG9kIGlzIG5vdCBjYWxsZWQuICAgVGhlIFRjbAogICAgICAgICAgIG1vZHVsZSB3YXNuJ3QgY29ycmVjdGx5IGNhbGxpbmcgZGVzdHJ1Y3RvcnMgd2hlbiB0aGV5CiAgICAgICAgICAgd2VyZSBkZWZpbmVkIHVzaW5nICVhZGRtZXRob2RzLiAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBSZWluaGFyZCBGb2JiZS4KCjAxLzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICBCZXR0ZXIgc3VwcG9ydCBmb3IgbG9uZyBsb25nIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcuICBUeXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiBpbmNsdWRlZCBpbiBhIG51bWJlciBvZiBtb2R1bGVzIGZvciBoYW5kbGluZyB0aGVzZSB0eXBlcy4KICAgICAgICAgICBJbiBhZGRpdGlvbiwgdGhlIHBhcnNlciBoYXMgYmVlbiBtb2RpZmllZCB0byBhY2NlcHQgbG9uZyBsb25nCiAgICAgICAgICAgbGl0ZXJhbHMgc3VjaCBhcyAxMjM0TEwgYW5kIDEyMzRVTEwuCgowMS8yNy8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQSBDIGNoYXJbXSBpcyBtYXBwZWQgdG8gYSBKYXZhIFN0cmluZyB3aGljaCBpcyB0aGUgZGVmYXVsdCAKICAgICAgICAgICBTV0lHIGhhbmRsaW5nIG9mIGNoYXJbXSBhbmQgY2hhciouIEl0IHVzZWQgdG8gYmUgbWFwcGVkIHRvIGJ5dGVbXS4gCiAgICAgICAgICAgTm90ZSB0aGF0IGEgQyBzaWduZWQgY2hhcltdIGFycmF5IGlzIG1hcHBlZCB0byBieXRlW10uCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDEvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgcHJvYmxlbSB3aXRoIHJldHVybi1ieS12YWx1ZSwgQysrLCBhbmQKICAgICAgICAgICBvYmplY3RzIHRoYXQgZGVmaW5lIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9lbCBSZWVkLgoKMDEvMjUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE92ZXJoYXVsIG9mIHRoZSBKYXZhIG1vZHVsZS4gVGhlIEMgY29kZSBnZW5lcmF0aW9uIGlzIG5vdyAKICAgICAgICAgICBkb25lIGZyb20gdHlwZW1hcHMuCgowMS8yNC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gU3VwcG9ydCBmb3IgYXJyYXlzIG9mIGVudW0gcG9pbnRlcnMKCjAxLzIwLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBFcnJvciBjaGVja2luZyBmb3IgbnVsbCBKYXZhIG9iamVjdHMgYmVpbmcgcGFzc2VkIHRvIG5hdGl2ZSAKICAgICAgICAgICBmdW5jdGlvbnMuICBFeGNlcHRpb24gdGhyb3duIG5vdyB3aGVyZWFzIGJlZm9yZSB0aGUgSlZNIGNyYXNoZWQuCgowMS8xOC8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ29ycmVjdGVkIGJlaGF2aW91ciBmb3IgZnVuY3Rpb25zIHRoYXQgdGFrZSBhcnJheXMuIEZvciAKICAgICAgICAgICBleGFtcGxlLCB3aGVuIHRoaXMgYyBmdW5jdGlvbjogCgogICAgICAgICAgIHZvaWQgYXJyYXlmbihpbnQgYXJyYXlbXSk7CiAgICAgICAgICAgCiAgICAgICAgICAgaXMgd3JhcHBlZCB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgZnVuY3Rpb24KCiAgICAgICAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBuYXRpdmUgdm9pZCBhcnJheWZuKGludFtdIGFycmF5KTsKCiAgICAgICAgICAgaXMgcHJvZHVjZWQuIFByZXZpb3VzbHkgaWYgdGhlIEMgZnVuY3Rpb24gbWFkZSBhbnkgY2hhbmdlcyB0byB0aGUgCiAgICAgICAgICAgYXJyYXkgZWxlbWVudHMsIHRoZXNlIHdlcmUgbm90IHJlZmxlY3RlZCBiYWNrIGludG8gdGhlIEphdmEgYXJyYXkuIAogICAgICAgICAgIFRoaXMgaGFzIG5vdyBiZWVuIGNvcnJlY3RlZCBzbyB0aGF0IHRoZSBjaGFuZ2VzIGFyZSBwcm9wb2dhdGVkIGJhY2sKICAgICAgICAgICB0byBKYXZhIGFuZCB0aGUgY2FsbGluZyBmdW5jdGlvbiB3aWxsIHNlZSB0aGVzZSBjaGFuZ2VzLiBUaGlzIGlzIAogICAgICAgICAgIGhvdyBwdXJlIEphdmEgZnVuY3Rpb25zIHdvcmssIGllIGFycmF5cyBhcmUgcGFzc2VkIGJ5IHJlZmVyZW5jZS4KCjAxLzE1LzIwMDI6bWtvZXBwZQogICAgICAgICAgIFtHdWlsZV0gTmV3IGZpbGUgY3BsdXNwbHVzLmkgd2l0aCBDKysgdHlwZW1hcHMgY29udHJpYnV0ZWQKICAgICAgICAgICBieSBNYXJjaW8gTHVpcyBUZWl4ZWlyYSA8bWFyY2lvdEBob2xseS5jb2xvc3RhdGUuZWR1Pi4KCjAxLzExLzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDaGFuZ2VkIG1hcHBpbmcgb2YgQyBsb25nIHRvIEphdmEgdHlwZS4gV2FzIG1hcHBlZCB0byBKYXZhCiAgICAgICAgICAgbG9uZywgbm93IG1hcHBlZCB0byBKYXZhIGludC4gSWYgeW91IHdhbnQgdGhlIHByZXZpb3VzIG1hcHBpbmcgdG8gCiAgICAgICAgICAgSmF2YSBsb25nIHVzZSB0aGlzIGFwcHJvYWNoIGluIHlvdXIgaW50ZXJmYWNlIGZpbGU6CiAgICAgICAgICAgCiAgICAgICAgICAgICAlY2xlYXIgbG9uZzsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZyAgICAgICAgICAgICAiamxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqdHlwZSkgbG9uZyAgICAgICAgICAgImxvbmciCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmcgICAgICAgICAgImxvbmciCgogICAgICAgICAgICAgJWNsZWFyIGxvbmdbQU5ZXTsKICAgICAgICAgICAgICV0eXBlbWFwKGpuaSkgbG9uZ1tBTlldICAgICAgICAiamxvbmdBcnJheSIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nW0FOWV0gICAgICAibG9uZ1tdIgogICAgICAgICAgICAgJXR5cGVtYXAoanN0eXBlKSBsb25nW0FOWV0gICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChpbikgbG9uZ1tBTlldICAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBsb25nW0FOWV0gICAgICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGFyZ291dCkgbG9uZ1tBTlldICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBsb25nW0FOWV0gICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCiAgICAgICAgICAgVGhpcyBuZXcgbWFwcGluZyBpcyBtb3JlIGFwcHJvcHJpYXRlIHdoZW4gaW50ZXJmYWNpbmcgdG8gMzIgYml0IAogICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBpbiB0aGUgY3VycmVudCAzMi1iaXQgSlZNcy4gRm9yIGZ1dHVyZSAKICAgICAgICAgICA2NC1iaXQgSlZNcyB5b3UgbWF5IGhhdmUgdG8gY2hhbmdlIHRoZXNlIG1hcHBpbmdzIC0gZWcgb24gVW5peCBMUDY0IAogICAgICAgICAgIHN5c3RlbXMsIGJ1dCBub3Qgb24gTWljcm9zb2Z0IDY0Yml0IFdpbmRvd3Mgd2hpY2ggd2lsbCBiZSB1c2luZyBhIAogICAgICAgICAgIFA2NCBJTDMyIG1vZGVsLiBUaGlzIG1heSBiZSBhdXRvbWF0ZWQgaW4gYSBmdXR1cmUgdmVyc2lvbiBvZiBTV0lHLgoKMDEvMTAvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyA1MDE2NzcgXSAlaW5pdCBibG9jayBpbiB3cm9uZyBwbGFjZS4gUmVwb3J0ZWQKICAgICAgICAgICBieSBMdWlnaSBCYWxsYWJpby4KCjAxLzA5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHN1cHBvcnQgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gc2lnbmVkIGxvbmcgbG9uZyBpcyAKICAgICAgICAgICBtYXBwZWQgdG8gYSBKYXZhIGxvbmcuIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyBtYXBwZWQgdG8gQmlnSW50ZWdlci4KCjAxLzA5LzIwMDI6YmVhemxleQogICAgICAgICAgIEV4cGVyaW1lbnRhbCBjaGFuZ2UgdG8gcGFyc2VyIHRvIGJldHRlciBzdXBwb3J0IG1peGluZyBvZgogICAgICAgICAgIGludCwgbG9uZywgc2hvcnQsIHVuc2lnbmVkLCBmbG9hdCwgYW5kIGRvdWJsZS4gICBUaGUgcGFyc2VyCiAgICAgICAgICAgc2hvdWxkIG5vdyBzdXBwb3J0IHR5cGVzIGxpa2UgdGhpczoKICAgIAogICAgICAgICAgICAgICAgc2hvcnQgdW5zaWduZWQgaW50CiAgICAgICAgICAgICAgICBpbnQgICB1bnNpZ25lZCBzaG9ydAogICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgaW50CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2hvcnQKCiAgICAgICAgICAgIFRoaXMgY2hhbmdlIGFsc28gZW5hYmxlcyBhIHR5cGUgb2YgJ2xvbmcgZG91YmxlJyAocHJldmlvdXNseQogICAgICAgICAgICB1bnN1cHBvcnRlZCkgdG8gYmUgdXNlZC4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENhc3RpbmcgZml4IGZvciB3aGVuIGZ1bmN0aW9uIHJldHVybiB0eXBlIGlzIGEgcG9pbnRlciBhcyAKICAgICAgICAgICByZXBvcnRlZCBieSBHYXJ5IFBlbm5pbmd0b24gMjAwMi0wMS0wNS4gVGhlIHVwcGVyIDMyYml0cyBvZiB0aGUgCiAgICAgICAgICAgNjQgYml0IGpsb25nIHdpbGwgaGF2ZSBjb250YWluZWQganVuayBmb3IgMzJiaXQgcG9pbnRlcnMuCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHBvaW50ZXIgaGFuZGxpbmcgaW4gSmF2YSBpcyBwb3NzaWJsZSBhcyB0aGUgCiAgICAgICAgICAgSU5QVVQsIE9VVFBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaGF2ZSBiZWVuIGFkZGVkIGludG8gdHlwZW1hcHMuaS4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSAkbnVsbCBjYW4gYmUgdXNlZCBpbiBpbnB1dCB0eXBlbWFwcyB0byByZXR1cm4gZWFybHkgZnJvbSBKTkkgCiAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgaGF2ZSBlaXRoZXIgdm9pZCBvciBhIG5vbi12b2lkIHJldHVybiB0eXBlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICV0eXBlbWFwKGNoZWNrKSBpbnQgKiAleyAKICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb24oU1dJR19JbmRleEVycm9yLCAiQXJyYXkgZWxlbWVudCBlcnJvciIpOwogICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgJX0KCiAgICAgICAgICAgSWYgdGhlIHR5cGVtYXAgZ2V0cyBwdXQgaW50byBhIGZ1bmN0aW9uIHdpdGggdm9pZCBhcyByZXR1cm4sICRudWxsIAogICAgICAgICAgIHdpbGwgZXhwYW5kIHRvIG5vdGhpbmc6CgogICAgICAgICAgICAgdm9pZCBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgogICAgICAgICAgIG90aGVyd2lzZSAkbnVsbCBleHBhbmRzIHRvIHplcm8sIHdoZXJlIGphdmFyZXR1cm50eXBlIGlzIGVpdGhlciBhIAogICAgICAgICAgIHBvaW50ZXIgb3IgYSBwcmltaXRpdmUgdHlwZToKCiAgICAgICAgICAgICBqYXZhcmV0dXJudHlwZSBqbmlfZm4oLi4uKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfQoKMDEvMDIvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIFRoZSBKYXZhIG1vZHVsZSBpbmNvcnJlY3RseSB1c2VkIGFyZ291dCB0eXBlbWFwcyBmb3IgCiAgICAgICAgICAgc3RyaW5ncy4gVGhpcyBpcyBub3cgY29ycmVjdGVkIGFuZCB0aGUgY29kZSBub3cgcmVzaWRlcwogICAgICAgICAgIGluIHRoZSBmcmVlYXJnIHR5cGVtYXAuIFRoZSBhcmdvdXQgYXJyYXkgdHlwZW1hcHMgaGF2ZSBiZWVuIHNwbGl0IGludG8gCiAgICAgICAgICAgYXJnb3V0IGFuZCBmcmVlYXJnIHR5cGVtYXBzLiBUaGlzIGNvcnJlY3Rpb24gbWF5IHJlcXVpcmUgc29tZSB1c2VyIAogICAgICAgICAgIHdyaXR0ZW4gdHlwZW1hcHMgdG8gYmUgbW9kaWZpZWQuIAogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIE11bHRpIHR5cGVtYXBzIG5vdyB3b3JraW5nIGZvciBKYXZhIHNlZSBtdWx0aW1hcCBleGFtcGxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIC0gZnJlZWFyZyB0eXBlbWFwIGNvZGUgd2FzIGFwcGVhcmluZwogICAgICAgICAgIGJlZm9yZSB0aGUgZnVuY3Rpb24gY2FsbC4KCjEyLzI4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBKQ0FMTCBtYWNybyBmb3IgSk5JIGNhbGxzIHRoYXQgd29yayBpbiBib3RoIEMgYW5kIEMrKyB0eXBlbWFwcwogICAgICAgICAgIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIEpDQUxMMCwgSkNBTEwxLCBKQ0FMTDIsIEpDQUxMMyBhbmQgSkNBTEw0IAogICAgICAgICAgIG1hY3Jvcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEyLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFJlc29sdmVkIHNvbWUgaW5jb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggJXJlbmFtZSBhbmQgY2xhc3MgcmVuYW1pbmcuCiAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlIGZvbGxvd2luZzoKIAogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgIEJhcjsKCiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgICB+QmFyKCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlbiB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgYXBwbGllcyB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsCiAgICAgICAgICAgYW5kIHRoZSBkZXN0cnVjdG9yIChhbGwgd2lsbCBiZSByZW5hbWVkIHRvIEZvbykuCgogICAgICAgICAgIElmIGEgY2xhc3MgZGVmaW5lcyBtb3JlIHRoYW4gb25lIGNvbnN0cnVjdG9yLCB0aGUgb3ZlcmxvYWRlZCB2YXJpYW50cwogICAgICAgICAgIGNhbiBzdGlsbCBiZSByZW5hbWVkIGJ5IHNwZWNpZnlpbmcgcGFyYW1ldGVycyB0byAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlcmVuYW1lKEJhcl9jb3B5KSBCYXIoQmFyICYpOwogICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgICBCYXIoQmFyICYpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlcmUgYXJlIHN0aWxsIHNvbWUgb2RkIGNvcm5lciBjYXNlcy4gIElmIHlvdSBzcGVjaWZ5CgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgOjpCYXI7CgogICAgICAgICAgIHRoZW4gb25seSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgY2hhbmdlZCBhbmQgdGhlIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IKICAgICAgICAgICBuYW1lcyBhcmUgbGVmdCB1bm1vZGlmaWVkLiAgSWYgeW91IHNwZWNpZnkgCgogICAgICAgICAgICAgICAlcmVuYW1lKEZvbykgKjo6QmFyOwoKICAgICAgICAgICB0aGVuIHRoZSBuYW1lcyBvZiB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYXJlIG1vZGlmaWVkIGJ1dAogICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBub3QuCgoxMi8yMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gam5pLCBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzIG5vIGxvbmdlciBoYXJkY29kZWQgYnV0IHJlYWwgCiAgICAgICAgICAgdHlwZW1hcHMuIE5ldyB2YXJpYWJsZSBzdWJzdGl0dXRpb24sICRqYXZhY2xhc3NuYW1lLCBjYW4gYmUgdXNlZCBpbgogICAgICAgICAgIHRoZSBqc3R5cGUgdHlwZW1hcHMuIEl0IGlzIHJlcGxhY2VkIHdpdGggdGhlIEphdmEgc2hhZG93IGNsYXNzIG5hbWUKICAgICAgICAgICB3aGVyZSBhcHBsaWNhYmxlLgogICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHJlY2VudGx5IGludHJvZHVjZWQgYnVnIHRvIGRvIHdpdGggaW5oZXJpdGFuY2Ugd2hlbiAKICAgICAgICAgICB1c2luZyAlaW1wb3J0LgogICAgICAgICAgIFtKYXZhXSBBIGZldyBtb3JlIGJ1ZyBmaXhlcywgdG9kbyB3aXRoICVyZW5hbWUgYW5kIHVzaW5nIHRoZSBraW5kCiAgICAgICAgICAgd2l0aCB0aGUgdHlwZSwgZWcgCiAgICAgICAgICAgdm9pZCBmbih1bmlvbiB1bmkgbXl1bmksIHN0cnVjdCBzdHIgbXlzdHIsIGNsYXNzIGNsIG15Y2wpOwoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDk0NTI0IF0gUHJlcHJvY2Vzc29yIGJ1ZyAtIGFwb3N0cm9waGUgYW5kICNzdWJzdC4KCjEyLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIFNXSUdfVkVSU0lPTiBwcmVwcm9jZXNzb3Igc3ltYm9sLiAgIFRoaXMgaXMgYSBoZXhhZGVjaW1hbAogICAgICAgICAgIGludGVnZXIgc3VjaCBhcyAweDAxMDMxMSAoY29ycmVzcG9uZGluZyB0byBTV0lHLTEuMy4xMSkuICBUaGlzIGNhbgogICAgICAgICAgIGJlIHVzZWQgaW4gdGhlIGludGVyZmFjZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgI2lmIFNXSUdfVkVSU0lPTiA+PSAweDAxMDMxMQogICAgICAgICAgICAgICAvKiBVc2Ugc29tZSBmYW5jeSBuZXcgZmVhdHVyZSAqLwogICAgICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgTm90ZTogVGhlIHZlcnNpb24gc3ltYm9sIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgU1dJRwogICAgICAgICAgIHdyYXBwZXIgZmlsZS4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTIvMjAvMjAwMTpta29lcHBlCgkgICBbTXpTY2hlbWVdOiBSZW5hbWVkIG16c3dpZ19tYWtlX2Jvb2xlYW4gdG8KCSAgIHN3aWdfbWFrZV9ib29sZWFuLCBhcyB0aGUgbGF0dGVyIGlzIHVzZWQgaW4gdGhlIHR5cGVtYXBzLgoJICAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgoxMi8xNy8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IFJld3JvdGUgbGlzdC12ZWN0b3IuaSB1c2luZyBtdWx0aS1kaXNwYXRjaAoJICAgdHlwZW1hcHMuICBVcGRhdGVkIHBvaW50ZXItaW4tb3V0LmkuICBNYWtlIHRoZQoJICAgZGVwcmVjYXRlZCB0eXBlbWFwLXN1YnN0aXR1dGlvbiBvZiAiJHNvdXJjZSIgaW4gImFyZ291dCIKCSAgIHdvcmsgYXMgYmVmb3JlLgoKMTIvMTYvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCBtYWNyb3MgJXZhbHVlc19hc19saXN0LCAldmFsdWVzX2FzX3ZlY3RvciwKCSAgICVtdWx0aXBsZV92YWx1ZXMgdG8gdXNlIHRoZSBwcm9wZXIgJXByYWdtYSBzeW50YXguICBOZXcKCSAgIEd1aWxlIGV4YW1wbGUvdGVzdCAibXVsdGl2YWx1ZSI7IG5ldyBHdWlsZSBydW4tdGVzdCBmb3IKCSAgIHRlc3Qtc3VpdGUgaXRlbSAibGlzdC12ZWN0b3IiIChjdXJyZW50bHkgYnJva2VuKS4KCjEyLzE0LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogRml4ZWQgdHlwZW1hcC1zdWJzdGl0aW9uIGJ1ZyBmb3IgInZhcmluIi4gIFJlbGF4ZWQKCSAgIHZhbGlkLWlkZW50aWZpZXIgY2hlY2sgdG8gYWxsb3cgYWxsIFI1UlMgaWRlbnRpZmllcnMuCgoKVmVyc2lvbiAxLjMuMTAgKERlY2VtYmVyIDEwLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCAldHlwZW1hcCBzbyB0aGF0ICV7IC4uLiAlfSBjYW4gYWxzbyBiZSB1c2VkIGFzIGEKICAgICAgICAgICBjb2RlIGJsb2NrIChtb3N0bHkgZm9yIGNvbXBsZXRlbmVzcykuICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBibGFoICV7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhpcyBmb3JtIGRvZXMgbm90IGludHJvZHVjZSBhIG5ldyBibG9jayBzY29wZS4gIEFsc28sIHRoZQogICAgICAgICAgIGNvZGUgZW5jbG9zZWQgaW4gJXsgLi4uICV9IGlzIG5vdCBwcm9jZXNzZWQgYnkgdGhlIHByZXByb2Nlc3Nvci4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ1OTYxNCBdIFNXSUcgd2l0aCBtdWx0aXBsZSBUQ0wgaW50ZXJwcmV0ZXJzLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDE3MTQxIF0gcnVieWRlYy5zd2cgaXMgd3JvbmcKICAgICAgICAgICBSZXBvcnRlZCBieSBQYXVsIEJyYW5uYW4uCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTA1NTcgXSBQcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgb24gTlQuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFnbnVzIExqdW5nLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDQ1MjMzIF0gRW5oYW5jZW1lbnQ6IGhhbmRsZSBhY2Nlc3MgY2hhbmdlLgogICAgICAgICAgIFNXSUcgbm93IHBhcnNlcyAoYnV0IGlnbm9yZXMpIEMrKyBhY2Nlc3MgY2hhbmdlcyBmb3IgdGhlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIHZvaWQgc29tZXRoaW5nKCkgeyB9CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBBKCkge30KICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgY2xhc3MgQiA6IHByaXZhdGUgQSB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBCKCkgOiBBKCkgeyB9CiAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICBBOjpzb21ldGhpbmc7ICAgIDwtLS0tIFBhcnNlZCwgYnV0IGlnbm9yZWQKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgS3J6eXN6dG9mIEtvem1pbnNraS4KCjEyLzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIEZpeCBmb3IgUnVieSB0byB3b3JrIHVzaW5nIFZpc3VhbCBDKysuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NjU2ODcgXSB1bnNpZ25lZCBzaG9ydCBwYXJhbWV0ZXJzIGZhaWwuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDg5NTk0IF0gUHlTdHJpbmdfRnJvbVN0cmluZyBjYW4ndCB0YWtlIE5VTEwgYXJnLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEpvaG4gTWVycml0dC4gICBTV0lHIG5vdyBjb252ZXJ0cyBzdHJpbmcgdmFsdWVzCiAgICAgICAgICAgdG8gUHl0aG9uIHVzaW5nIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICByZXN1bHRvYmogPSByZXN1bHQgPyBQeVN0cmluZ19Gcm9tU3RyaW5nKHJlc3VsdCkgOiBQeV9CdWlsZFZhbHVlKCIiKTsKCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ2MzU2MSBdIFR5cGUgY29udmVyc2lvbnMgbm90IGdlbmVyYXRlZC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgkKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDcwMjE3IF0gVGNsIGRlZmF1bHQgYXJndW1lbnQgaGFuZGxpbmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzIwODggXSBkZWZpbmVkKE1BQ1JPKSBleHBhbmRlZCBldmVyeXdoZXJlLgogICAgICAgICAgIEVtYmVkZGVkIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHN1Y2ggYXMKCiAgICAgICAgICAgICAgJSNpZiBkZWZpbmVkKEZPTykKCiAgICAgICAgICAgYXJlIG5vdCBleHBhbmRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIFdpbGxpYW1zLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc2NDY3IF0gUHJvYmxlbXMgd2l0aCAjZGVmaW5lICYgY29tbWFzLgoKMTIvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDc3NTQ3IF0gd3JvbmcgZGVjbGFyYXRpb24gb2YgcG9pbnRlciBmdW5jdGlvbnMuCiAgICAgICAgICAgQmFkIHByb3RvdHlwZXMgaW4gTGliL3RjbC9wdHJsYW5nLmkuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODMxODIgXSBDb25zdGFudHMgY2FuIHRha2UgYXJncyBieSBtaXN0YWtlLiAKICAgICAgICAgICBXaGVuIHN3aWcgLXBlcmw1IC1jb25zdCBpcyB1c2VkLCBjb25zdGFudHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICAgd2l0aCBhIHZvaWQgcHJvdG90eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3ViIElDT05TVCAoKSB7ICRleGFtcGxlYzo6SUNPTlNUIH0KCiAgICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IFJpY2ggV2FsZXMuCgoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBOZXcgJWV4Y2VwdGlvbiBkaXJlY3RpdmUuICAgVGhpcyBpcyBpbnRlbmRlZCB0byByZXBsYWNlICVleGNlcHQuCiAgICAgICAgICAgSXQgd29ya3MgaW4gZXhhY3RseSB0aGUgc2FtZSBtYW5uZXIgZXhjZXB0IGl0IGRvZXMgbm90IGFjY2VwdCBhIAogICAgICAgICAgIGxhbmd1YWdlIHNwZWNpZmllci4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IAogICAgICAgICAgICAgICAgICAgY2F0Y2goU29tZUVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAlZXhjZXB0aW9uIGlzIGFsc28gbmFtZSBhd2FyZS0tLWFsbG93aW5nIGl0IHRvIGJlIGFwcGxpZWQgdG8KICAgICAgICAgICBzcGVjaWZpYyBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleGNlcHRpb24gZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgYW55IGZ1bmN0aW9uL21ldGhvZCBmb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhciBpbiBjbGFzcyBGb28KICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBGb286OmJhcihkb3VibGUpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiBmb3IgbWV0aG9kIGJhcihkb3VibGUpIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoZSBzZW1hbnRpY3Mgb2YgdGhpcyBuYW1lIG1hdGNoaW5nIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgZm9yICVyZW5hbWUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdWJzdGFudGlhbCBjbGVhbnVwIG9mIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIGNvZGUuICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIHVzZWQgdG8gYmUgY3JlYXRlZCBpbiB0aGlzIHJhdGhlciBjb21wbGljYXRlZCBtYW5uZXIgaW52b2x2aW5nIGFib3V0CiAgICAgICAgICAgYSBoYWxmLWRvemVuIHN0cmluZ3MgY3JlYXRlZCBpbiBiaXRzIGFuZCBwaWVjZXMuICAgU2hhZG93IGNsYXNzZXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZCBpbiBhIG1vcmUgc3RyYWlnaHRmb3J3YXJkIG1hbm5lci0taW4gdGhlIHNhbWUKICAgICAgICAgICBvcmRlciB0aGF0IGFwcGVhcnMgaW4gdGhlIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGUgb3JkZXIgaW4gd2hpY2ggZGVjbGFyYXRpb25zIGFwcGVhciBpbiB0aGUgc2hhZG93IGZpbGUgbWF5IGRpZmZlci4KICAgICAgICAgICAKMTIvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVpbnNlcnQgZGlyZWN0aXZlICgleyAuLi4gJX0sICVydW50aW1lLCAlaGVhZGVyLCAld3JhcHBlciwgZXRjLikKICAgICAgICAgICBjYW4gbm93IGJlIHVzZWQgaW5zaWRlIG9mIGEgY2xhc3MgZGVmaW5pdGlvbi4gICBUaGlzIGhhcyBwb3RlbnRpYWwKICAgICAgICAgICB1c2VzIHdoZW4gZ2VuZXJhdGluZyBzaGFkb3cgY2xhc3MgY29kZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlaW5zZXJ0KCJzaGFkb3ciKSAlewogICAgICAgICAgICAgICAgICMgU29tZSBweXRob24gY29kZQogICAgICAgICAgICAgICAgIGRlZiBibGFoKHNlbGYpOgogICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkknbSBibGFoISIKICAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGUgc3VwcG9ydCBmb3IgY2xhc3MgY29kZSBpbnNlcnRpb24gZGVwZW5kcyBvbiB0aGUgbGFuZ3VhZ2UgbW9kdWxlLgogICAgICAgICAgIEhvd2V2ZXIsIHRoZSBpbnRlbnQgb2YgdGhpcyBmZWF0dXJlIGlzIHRvIHNpbXBsaWZ5IHRoZSB0YXNrIG9mIGV4dGVuZGluZwogICAgICAgICAgIHNoYWRvdyBjbGFzcyBjb2RlLiAgIEluIHRoZSBQeXRob24gbW9kdWxlLCB0aGlzIGluc2VydHMgY29kZSB3aXRoIHRoZQogICAgICAgICAgIHByb3BlciBsZXZlbCBvZiBpbmRlbmRhdGlvbiAocmVnYXJkbGVzcyBvZiB3aGF0IHdhcyB1c2VkIGluIHRoZSBTV0lHCiAgICAgICAgICAgaW50ZXJmYWNlKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yOS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBNb2RpZmljYXRpb25zIGZvciBKYXZhIGFuZCBQeXRob24gbW9kdWxlcyB0byB3b3JrIG9uIGN5Z3dpbi4KICAgICAgICAgICBVbmZvcnR1bmF0ZWx5IGEgbG90IG9mIHRoZSBweXRob24gbW9kdWxlIGhhcyBzdGFydGVkIHRvIHByb2R1Y2VzIGNvZGUgCiAgICAgICAgICAgd2hpY2ggY2Fubm90IGJlIGF1dG8taW1wb3J0ZWQgdXNpbmcgY3lnd2luIGxpYnRvb2xzIHNvIG1vc3Qgb2YgaXQgaXMgCiAgICAgICAgICAgc3RpbGwgYnJva2VuLgoKMTEvMjgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICVyZW5hbWUgYW5kICVmZWF0dXJlIGRpcmVjdGl2ZSBjYW4gbm93IGJlIHVzZWQgaW5zaWRlCiAgICAgICAgICAgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFdoZW4gdXNlZCBpbiB0aGlzIG1hbm5lciwgdGhlICVyZW5hbWUgZGlyZWN0aXZlIG9ubHkgYXBwbGllcwogICAgICAgICAgIHRvIG1lbWJlcnMgb2YgdGhlIGNsYXNzIGluIHdoaWNoIGl0IGFwcGVhcnMgYXMgd2VsbCBhcyBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMuICBJbiBmYWN0LCB0aGlzIGlzIHJlYWxseSBqdXN0IHRoZSBzYW1lCiAgICAgICAgICAgYXMgc2F5aW5nOgoKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2kpIEZvbzo6Zm9vKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGZvb19kKSBGb286OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMjYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgdGhlIGV4cGVyaW1lbnRhbCAlZmVhdHVyZSBkaXJlY3RpdmUuICAlZmVhdHVyZSBjYW4gYmUKICAgICAgICAgICB1c2VkIHRvIGF0dGFjaCBhcmJpdHJhcnkgc3RyaW5nIGF0dHJpYnV0ZXMgdG8gcGFyc2UgdHJlZSBub2Rlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJleGNlcHQiKSBibGFoIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgd2hhdGV2ZXI7ICAgICAgCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNldCIpICo6Onhfc2V0ICJ4IjsKCiAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImJsYWgiKSBGb286OmJhcihpbnQsZG91YmxlKSBjb25zdCAic3BhbSI7CgogICAgICAgICAgIFRoZSBzeW50YXggaXMgYm9ycm93ZWQgZnJvbSB0aGUgJXJlbmFtZSBkaXJlY3RpdmUuICBJbiBmYWN0LCB0aGUKICAgICAgICAgICBleGFjdCBzYW1lIHNlbWFudGljcyBhcHBseSAoaW5oZXJpdGFuY2UsIG1hdGNoaW5nLCBldGMuKS4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgYSB2ZXJ5IHBvd2VyZnVsIGxvdy1sZXZlbCBwcmltaXRpdmUgdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgIGN1c3RvbWl6ZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgYW5kIHRvIHByb3ZpZGUgaGludHMgdG8gCiAgICAgICAgICAgYW55IHN0YWdlIG9mIGNvZGUgZ2VuZXJhdGlvbi4gICBGZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8KICAgICAgICAgICBwYXJzZSB0cmVlIG5vZGVzIGFzIGF0dHJpYnV0ZXMgd2l0aCBuYW1lcyBsaWtlICJmZWF0dXJlOioiIHdoZXJlICogCiAgICAgICAgICAgaXMgcmVwbGFjZWQgYnkgdGhlIGZlYXR1cmUgbmFtZSAoZS5nLiwgImZlYXR1cmU6ZXhjZXB0IiwgImZlYXR1cmU6c2V0IiwgCiAgICAgICAgICAgZXRjLikuICAgTGFuZ3VhZ2UgbW9kdWxlcyBjYW4gdGhlbiBsb29rIGZvciB0aGUgZmVhdHVyZXMgdXNpbmcgCiAgICAgICAgICAgYSBzaW1wbGUgYXR0cmlidXRlIGxvb2t1cC4KCiAgICAgICAgICAgJWZlYXR1cmUgaXMgaW50ZW5kZWQgdG8gYmUgYSByZXBsYWNlbWVudCBmb3IgYSBudW1iZXIgb2YKICAgICAgICAgICBvbGRlciBTV0lHIGRpcmVjdGl2ZXMgaW5jbHVkaW5nICVleGNlcHQgYW5kIHNwZWNpYWxpemVkCiAgICAgICAgICAgcHJhZ21hcy4gSXQgaXMgbW9yZSBwb3dlcmZ1bCAoZHVlIHRvIGl0cyBwYXJhbWV0ZXJpemVkCiAgICAgICAgICAgbmFtZSBtYXRjaGluZykgYW5kIGl0IHByb3ZpZGVzIHZlcnkgcHJlY2lzZSBjb250cm9sIG92ZXIKICAgICAgICAgICBob3cgY3VzdG9taXphdGlvbiBmZWF0dXJlcyBhcmUgYXR0YWNoZWQgdG8gaW5kaXZpZHVhbAogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICBUaGVyZSBhcmUgZnV0dXJlIGV4cGFuc2lvbiBwbGFucyB0aGF0IHdpbGwKICAgICAgICAgICBidWlsZCB1cG9uIHRoaXMgY2FwYWJpbGl0eSBhcyB3ZWxsLgoKICAgICAgICAgICBJdCdzIG5vdCBjZXJ0YWluIHRoYXQgJWZlYXR1cmUgd2lsbCBldmVyIGJlIHVzZWQgZGlyZWN0bHkKICAgICAgICAgICBieSBTV0lHIHVzZXJzLiAgSW5zdGVhZCwgaXQgbWF5IGJlIGEgbG93LWxldmVsIHByaW1pdGl2ZQogICAgICAgICAgIHRoYXQgaXMgdXNlZCBpbiBoaWdoLWxldmVsIG1hY3JvIGRlZmluaXRpb25zLiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgIHRvIHN1cHBvcnQgcHJvcGVydGllcywgeW91IG1pZ2h0IGRlZmluZSBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgJWRlZmluZSAlcHJvcGVydHkobmFtZSwgc2V0ZiwgZ2V0ZikKICAgICAgICAgICAlZmVhdHVyZSgic2V0Iikgc2V0ZiAjbmFtZTsKICAgICAgICAgICAlZmVhdHVyZSgiZ2V0IikgZ2V0ZiAjbmFtZTsKICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFdoaWNoIGFsbG93cyBhIHVzZXIgdG8gc3BlY2lmeSB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAlcHJvcGVydHkocCwgZ2V0X3AsIHNldF9wKTsKCiAgICAgICAgICAgY2xhc3MgQmxhaCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgIGludCAgZ2V0X3AoKTsKICAgICAgICAgICAgICB2b2lkIHNldF9wKGludCk7CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAKMTEvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFRjbCBtb2R1bGUgaGFzIGJlZW4gZXhwYW5kZWQgd2l0aCBzb21lIG5ldyBmZWF0dXJlcyBmb3IKICAgICAgICAgICBtYW5hZ2luZyBvYmplY3Qgb3duZXJzaGlwLiAgRm9yIGV4YW1wbGU6CiAgICAgICAgIAogICAgICAgICAgICAgICAgc2V0IGMgW0NpcmNsZSAtYXJncyAyMF0KICAgICAgICAgICAgICAgICRjIGFyZWEgICAgICAgICAgICAgIyBJbnZva2UgYSBtZXRob2QKICAgICAgICAgICAgICAgICRjIC1kaXNvd24gICAgICAgICAgIyBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdAogICAgICAgICAgICAgICAgJGMgLWFjcXVpcmUgICAgICAgICAjIEFjcXVpcmVzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CgogICAgICAgICAgIElmIFRjbCBvd25zIHRoZSBvYmplY3QsIGl0cyBkZXN0cnVjdG9yIGlzIGludm9rZWQgd2hlbiB0aGUgCiAgICAgICAgICAgY29ycmVzcG9uZGluZyBvYmplY3QgY29tbWFuZCBpcyBkZWxldGVkIGluIFRjbC4gIAoKICAgICAgICAgICBUbyBzaW1wbGlmeSB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cywgdGhlIGZvbGxvd2luZyBzeW50YXgKICAgICAgICAgICBjYW4gYmUgdXNlZDoKCiAgICAgICAgICAgICAgICAkYyAtZGVsZXRlICAgICAgICAgIyBEZWxldGUgYW4gb2JqZWN0CgogICAgICAgICAgIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgZm9yIHRoZSBtb3JlIG9ic2N1cmUgdmFyaWFudCBvZiAKCiAgICAgICAgICAgICAgICByZW5hbWUgJGMge30KCiAgICAgICAgICAgVGhlc2UgZmVhdHVyZXMgYWxzbyBhZGQgZnVuY3Rpb25hbGl0eSBhdCB0aGUgQyBBUEkgbGV2ZWwuCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgbWFuYWdlIG93bmVyc2hpcCBmcm9tIEMgYW5kCiAgICAgICAgICAgY2FuIGJlIHVzZWQgaW4gdHlwZW1hcHMuCgogICAgICAgICAgICAgICAgU1dJR19BY3F1aXJlKHZvaWQgKnB0cik7CiAgICAgICAgICAgICAgICBTV0lHX0Rpc293bih2b2lkICpwdHIpOwoKICAgICAgICAgICBBIG5ldyBmdW5jdGlvbiBmb3IgY29uc3RydWN0aW5nIGluc3RhbmNlcyBpcyBhbHNvIGF2YWlsYWJsZToKCiAgICAgICAgICAgICAgICBUY2xfT2JqICoKICAgICAgICAgICAgICAgIFNXSUdfTmV3SW5zdGFuY2VPYmooVGNsX0ludGVycCAqaW50ZXJwLCB2b2lkICpwdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eXBlLCBpbnQgb3duKTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIGEgdHlwZW1hcCwgdGhpcyBjcmVhdGVzIGEgcG9pbnRlciBvYmplY3QgYW5kCiAgICAgICAgICAgYW4gaW50ZXJwcmV0ZXIgY29tbWFuZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGlzc3VlIG1ldGhvZHMgYW5kCiAgICAgICAgICAgYWNjZXNzIGF0dHJpYnV0ZXMgYXMgc2hvd24gYWJvdmUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBbGwgUHl0aG9uLXJlbGF0ZWQgJXByYWdtYSBvcGVyYXRpb25zIGhhdmUgYmVlbiBlbGltaW5hdGVkLgogICAgICAgICAgIE1vc3Qgb2YgdGhlc2Ugd2VyZSB3cml0dGVuIGZvciBvbGRlciBTV0lHIHZlcnNpb25zIGluIG9yZGVyIHRvCiAgICAgICAgICAgY29tcGVuc2F0ZSBmb3IgbGltaXRhdGlvbnMgaW4gZWFybGllciByZWxlYXNlcy4gIEluIGFuIGVmZm9ydAogICAgICAgICAgIHRvIHJlZHVjZSB0aGUgYW1vdW50IG9mIGNvZGUtY2x1dHRlciBhbmQgcG90ZW50aWFsIGZvciBlcnJvcnMsCiAgICAgICAgICAgaXQgaXMgZWFzaWVyIHRvIHNpbXBseSBlbGltaW5hdGUgdGhlIHByYWdtYXMgYW5kIHRvIHN0YXJ0IG92ZXIKICAgICAgICAgICAoaWYgbmVlZGVkKS4gIFRvIGJlIGhvbmVzdCwgSSdtIG5vdCBldmVuIHN1cmUgdGhlIHByYWdtYXMKICAgICAgICAgICB3b3JrZWQgaW4gMS4zLjkgYW5kIHJlY2VudCByZWxlYXNlcy4KCiAgICAgICAgICAgTm90ZTogSWYgeW91IG5lZWQgdG8gaW5zZXJ0IGNvZGUgaW50byB0aGUgc2hhZG93IGNsYXNzIGZpbGUKICAgICAgICAgICBjcmVhdGVkIGJ5IFNXSUcsIHNpbXBseSB1c2UgdGhlICVzaGFkb3cgZGlyZWN0aXZlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXNoYWRvdyAlewogICAgICAgICAgICAgIGRlZiBzb21lX3B5dGhvbl9jb2RlKCk6ICAgICAgICAgCiAgICAgICAgICAgICAgICAgIHByaW50ICJibGFoISIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFN3ZWVwaW5nIGNoYW5nZXMgdG8gdGhlIHdheSBpbiB3aGljaCB0aGUgUHl0aG9uIG1vZHVsZSBoYW5kbGVzCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMuICAgSW4gZWFybHkgaW1wbGVtZW50YXRpb25zLCBzaGFkb3cgY2xhc3NlcyB3ZXJlCiAgICAgICAgICAgbWVyZWx5IFB5dGhvbiB3cmFwcGVycyBhcm91bmQgdHlwZWQgcG9pbnRlciBvYmplY3RzLiBIb3dldmVyLCAKICAgICAgICAgICBzb21lIHVzZXJzIGFjdHVhbGx5IHdhbnRlZCB0byByZWNlaXZlIHRoZSBzaGFkb3cgY2xhc3Mgb2JqZWN0IGluIEMuCiAgICAgICAgICAgVG8gYWNjb21tb2RhdGUgdGhpcywgdGhlIGRlcmVmZXJlbmNpbmcgb2YgdGhlICJ0aGlzIiBwb2ludGVyIGluCiAgICAgICAgICAgYSBzaGFkb3cgY2xhc3Mgd2FzIG1vdmVkIHRvIEMgYXMgZGVzY3JpYmVkIGluIENIQU5HRVMgWzgvOC85OV0uCiAgICAgICAgICAgSG93ZXZlciwgdGhlIHByb2Nlc3Mgb2YgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIFB5dGhvbiB3YXMgc3RpbGwKICAgICAgICAgICBzb21ld2hhdCBwcm9ibGVtYXRpYy4gIFNwZWNpZmljYWxseSwgc2hhZG93IGNsYXNzZXMgbmV2ZXIgd29ya2VkCiAgICAgICAgICAgaW4gc2l0dWF0aW9ucyBzdWNoIGFzIHRoZXNlOgoKICAgICAgICAgICAgIC0gICBVc2Ugb2YgYW55IGtpbmQgb2Ygb3V0cHV0IHR5cGVtYXAgKCdvdXQnIG9yICdhcmdvdXQnKQogICAgICAgICAgICAgLSAgIEdsb2JhbCB2YXJpYWJsZXMgKGJyb2tlbiBhcyBmYXIgYXMgSSBjYW4gdGVsbCkuCgogICAgICAgICAgIEluIHRoZSBwYXN0LCBzb21lIHVzZXJzIGhhdmUgZGVhbHQgd2l0aCB0aGlzIGJ5IG1hbnVhbGx5IHRyeWluZwogICAgICAgICAgIHRvIGNyZWF0ZSBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0aGVtc2VsdmVzIGZyb20gQy9DKysuICBIb3dldmVyLAogICAgICAgICAgIHRoaXMgd2FzIGRpZmZpY3VsdCBiZWNhdXNlIHRoZSBDIHdyYXBwZXJzIGRvbid0IHJlYWxseSBrbm93IGhvdwogICAgICAgICAgIHRvIGdldCBhY2Nlc3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHl0aG9uIGNsYXNzLgoKICAgICAgICAgICBUaGUgUHl0aG9uIG1vZHVsZSBoYXMgbm93IGJlZW4gbW9kaWZpZWQgdG8gYXV0b21hdGljYWxseSBhdHRhY2gKICAgICAgICAgICBzaGFkb3cgY2xhc3Mgb2JqZWN0cyB0byBwb2ludGVycyB3aGVuIHRoZXkgYXJlIHJldHVybmVkIHRvIAogICAgICAgICAgIFB5dGhvbi4gICBUaGlzIHByb2Nlc3Mgb2NjdXJzIGluIHRoZSBmdW5jdGlvbiBTV0lHX05ld1BvaW50ZXJPYmooKQogICAgICAgICAgIHNvIHRoZSBwcm9jZXNzIGlzIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgdG8gdXNlcnMuICAgIEFzIGEgcmVzdWx0LAogICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIGFyZSBub3cgbW9yZSBzZWFtbGVzc2x5IGludGVncmF0ZWQgd2l0aCB0eXBlbWFwcwogICAgICAgICAgIGFuZCBvdGhlciBmZWF0dXJlcyBvZiBTV0lHLgoKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgaW50cm9kdWNlIGEgbnVtYmVyIG9mIGluY29tcGF0aWJpbGl0aWVzLiAgVGhlCiAgICAgICAgICAgU1dJR19OZXdQb2ludGVyT2JqKCkgbm93IHRha2VzIGFuIGV4dHJhIHBhcmFtZXRlciAib3duIiB0byAKICAgICAgICAgICBpbmRpY2F0ZSBvYmplY3Qgb3duZXJzaGlwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGEgcG9pbnRlcgogICAgICAgICAgIHRvIFB5dGhvbiB0aGF0IFB5dGhvbiBzaG91bGQgZGVzdHJveS4gICBJbiBhZGRpdGlvbiwgb2xkZXIgY29kZQogICAgICAgICAgIHRoYXQgdHJpZXMgdG8gbWFudWFsbHkgY29uc3RydWN0IHNoYWRvdyBjbGFzcyBvYmplY3RzIG9yIHdoaWNoCiAgICAgICAgICAgZXhwZWN0cyBiYXJlIHBvaW50ZXJzIG1heSBicmVhay0tLXN1Y2ggcG9pbnRlcnMgbWF5IGFscmVhZHkgYmUKICAgICAgICAgICBlbmNhcHN1bGF0ZWQgYnkgYSBzaGFkb3cgY2xhc3MuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWluc2VydCBkaXJlY3RpdmUgdG8gYWNjZXB0IHNpbmdsZSBicmFjZXMgeyAuLi4gfS4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlaW5zZXJ0KCJoZWFkZXIiKSB7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAleyAuLi4gJX0gZXhjZXB0IHRoYXQgdGhlIGNvZGUgaW4gdGhlCiAgICAgICAgICAgYnJhY2VzIGlzIHByb2Nlc3NlZCB1c2luZyB0aGUgcHJlcHJvY2Vzc29yLiAgIFRoaXMgY2FuIGJlIHVzZWZ1bAogICAgICAgICAgIGluIGNlcnRhaW4gY29udGV4dHMgc3VjaCBhcyBsb3ctbGV2ZWwgY29kZSBnZW5lcmF0aW9uIGluIAogICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9ucyBhcmUgbm93IHRyYW5zbGF0ZWQgaW50byBwcmVwcm9jZXNzb3IKICAgICAgICAgICBzeW1ib2xzLiAgRm9yIGV4YW1wbGU6CgkKICAgICAgICAgICAgICAuL3N3aWcgLXB5dGhvbiAtc2hhZG93IC1tb2R1bGUgYmxhaCBpbnRlcmZhY2UuaQoKICAgICAgICAgICBDcmVhdGVzIHRoZSBzeW1ib2xzOgoKICAgICAgICAgICAgICBTV0lHT1BUX1BZVEhPTiAxCiAgICAgICAgICAgICAgU1dJR09QVF9TSEFET1cgMQogICAgICAgICAgICAgIFNXSUdPUFRfTU9EVUxFIGJsYWgKICAgICAgICAgICAgICAKICAgICAgICAgICBNb2R1bGVzIGNhbiBsb29rIGZvciB0aGVzZSBzeW1ib2xzIHRvIGFsdGVyIHRoZWlyIGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgIGlmIG5lZWRlZC4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgICAKMTEvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgUGVybDUgbW9kdWxlLiAgQSBsb3Qgb2YgY29kZSBnZW5lcmF0aW9uIGlzCiAgICAgICAgICAgbm93IGRyaXZlbiBieSB0YWJsZXMgYW5kIHR5cGVtYXBzLiAgIFRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIAogICAgICAgICAgIGFsc28gbWFrZXMgdXNlIG9mIHRhYmxlcyB0byBpbnN0YWxsIGNvbnN0YW50cywgdmFyaWFibGVzLCBhbmQKICAgICAgICAgICBmdW5jdGlvbnMgaW5zdGVhZCBvZiBpbmxpbmluZyBhIGJ1bmNoIG9mIHByb2NlZHVyZSBjYWxscy4gIFRoZQogICAgICAgICAgIHNlcGFyYXRlIHZhcmlhYmxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGlzIGdvbmUuICAgTW9zdAogICAgICAgICAgIGNvZGUgZ2VuZXJhdGlvbiBpcyBjb250cm9sbGVkIHZpYSB0aGUgcGVybDUuc3dnIGZpbGUgaW4gdGhlCiAgICAgICAgICAgbGlicmFyeS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAKMTEvMTMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgQysrIHR5cGVuYW1lIGtleXdvcmQuICBQcmltYXJpbHkgdGhpcwogICAgICAgICAgIGlzIGFkZGVkIHRvIGJldHRlciBzdXBwb3J0IHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgIGJsYWgoQyYgdikgewogICAgICAgICAgICAgICAgIHR5cGVuYW1lIEM6Oml0ZXJhdG9yIGkgPSB2LmJlZ2luKCk7CiAgICAgICAgICAgICB9CgogICAgICAgICAgIE5vdGU6IHR5cGVuYW1lIGlzIHN1cHBvcnRlZCBpbiB0aGUgcGFyc2VyIGluIHRoZSBzYW1lIHdheSBhcyAnc3RydWN0JwogICAgICAgICAgIG9yICdjbGFzcycuICBZb3UgcHJvYmFibHkgc2hvdWxkbid0IHVzZSBpdCBhbnl3aGVyZSBleGNlcHQgaW4gdGVtcGxhdGVzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1hc3NpdmUgb3ZlcmhhdWwgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZSBBUEkuICAgTW9zdCBmdW5jdGlvbnMgbm93CiAgICAgICAgICAgdXNlIGEgY29tbW9uLCB2ZXJ5IHNpbXBsZSwgIEFQSS4gICBUaGVyZSBhcmUgYWxzbyBhIG51bWJlciBvZgogICAgICAgICAgIGludGVyZXN0aW5nIHNlbWFudGljIHNpZGUtZWZmZWN0cyBvZiBob3cgY29kZSBpcyBhY3R1YWxseSBnZW5lcmF0ZWQuCiAgICAgICAgICAgRGV0YWlscyB3aWxsIGJlIGZvcnRoY29taW5nIGluIERvYy9NYW51YWwvRXh0ZW5kaW5nLmh0bWwuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiBMYW5ndWFnZSBtb2R1bGVzIHdyaXR0ZW4gZm9yCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyB3aWxsIG5vIGxvbmdlciB3b3JrLAoKMTEvMTAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSB2ZXJ5IHN1YnRsZSBidWcgZHVlIHRvIHVubmFtZWQgY2xhc3Mgd3JhcHBpbmcuIEZvciBleGFtcGxlLCBpZgogICAgICAgICAgIHlvdSBkaWQgdGhpcwoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgICAgIGludCB4LHk7CiAgICAgICAgICAgICAgfSBnZFBvaW50LCAqZ2RQb2ludFB0cjsKCiAgICAgICAgICAgICAgdm9pZCBmb28oZ2RQb2ludFB0ciB4KTsKCiAgICAgICAgICAgVGhlbiB0aGUgZm9vIGZ1bmN0aW9uIHdvdWxkIGdldCBhIHR5cGUtZXJyb3IuICAgVGhlIHByb2JsZW0gaGFzCiAgICAgICAgICAgdG8gZG8gd2l0aCBpbnRlcm5hbCB0eXBlZGVmIGhhbmRsaW5nIGFuZCB0aGUgZmFjdCB0aGF0IHRoZSB0eXBlZGVmCiAgICAgICAgICAgZGVjbGFyYXRpb25zIGFmdGVyIHRoZSBzdHJ1Y3QgYXBwZWFyIGxhdGVyIGluIHRoZSBwYXJzZSB0cmVlLgogICAgICAgICAgIEl0IHNob3VsZCB3b3JrIG5vdy4gIFByb2JsZW0gcmVwb3J0ZWQgYnkgVmluIEpvdmFub3ZpYy4KCjExLzA5LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gIm91dCIgdHlwZW1hcHMgKGFuZCByZWxhdGVkIHZhcmlhdGlvbnMpLiAgVGhlIG5hbWUKICAgICAgICAgICB0aGF0IGlzIGF0dGFjaGVkIHRvIHRoZSB0eXBlbWFwIGlzIG5vdyB0aGUgcmF3IEMgaWRlbnRpZmllciB0aGF0CiAgICAgICAgICAgYXBwZWFycyBvbiBhIGRlY2xhcmF0aW9uLiAgVGhpcyBjaGFuZ2VzIHRoZSBiZWhhdmlvciBvZgogICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IGZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGludCBmb28oKTsgICAgLy8gdHlwZW1hcCBnZXRzIGFwcGxpZWQKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICBQcmV2aW91cyB2ZXJzaW9ucyBuZXZlciByZWFsbHkgc3BlY2lmaWVkIGhvdyB0aGlzIHdhcyBzdXBwb3NlZCB0bwogICAgICAgICAgIHdvcmsuICBJbiBTV0lHMS4xLCB5b3UgY291bGQgcHJvYmFibHkgd3JpdGUgYSB0eXBlbWFwIGZvciB0aGUKICAgICAgICAgICB3cmFwcGVyIG5hbWUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50IEJsYWhfZm9vIHsgLi4uIH0KCiAgICAgICAgICAgSG93ZXZlciwgdGhpcyBvbGQgYmVoYXZpb3IgaXMgbm93IHdpdGhkcmF3biBhbmQgbm90IHN1cHBvcnRlZC4gCiAgICAgICAgICAgSnVzdCB1c2UgdGhlIG1lbWJlciBuYW1lIHdpdGhvdXQgYW55IHNvcnQgb2Ygc3BlY2lhbCBwcmVmaXguCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFRjbCBtb2R1bGUgaW5pdGlhbGl6YXRpb246CgogICAgICAgICAgICgxKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGluY2x1ZGVzIHRoZSBjb2RlIG5lZWRlZCB0byB3b3JrIHdpdGgKICAgICAgICAgICAgICAgIFRjbCBzdHVicy4gIFNpbXBseSBjb21waWxlIHdpdGggLURVU0VfVENMX1NUVUJTLgoKICAgICAgICAgICAoMikgU1dJRyBub3cgYXV0b21hdGljYWxseSBjYWxscyBUY2xfUGtnUHJvdmlkZSB0byByZWdpc3RlcgogICAgICAgICAgICAgICBhIHBhY2thZ2UgbmFtZS4gIFRoZSBwYWNrYWdlIG5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIG5hbWUKICAgICAgICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlICVtb2R1bGUgZGlyZWN0aXZlLiAgVGhlIHZlcnNpb24gbnVtYmVyIGlzCiAgICAgICAgICAgICAgIHNldCB0byAiMC4wIiBieSBkZWZhdWx0LiAgVG8gY2hhbmdlIHRoZSB2ZXJzaW9uIG51bWJlciwgdXNlCiAgICAgICAgICAgICAgIHN3aWcgLXBrZ3ZlcnNpb24gMS4yIGludGVyZmFjZS5pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBNb2R1bGVzIHRoYXQgcHJvdmlkZWQgc3R1YnMgYW5kIFRjbF9Qa2dQcm92aWRlIG9uIHRoZWlyIG93biBtaWdodAogICAgICAgICAgIGJyZWFrLiAgU2ltcGx5IHJlbW92ZSB0aGF0IGNvZGUuCgoxMS8wNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VkIGNvZGUgZ2VuZXJhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFRjbCBtb2R1bGUuICBDb25zdGFudHMKICAgICAgICAgICBhcmUgbm93IHN0b3JlZCBpbiBhIGxhcmdlIHRhYmxlIHRoYXQgZ2V0IGluc3RhbGxlZCBhdCBtb2R1bGUgc3RhcnR1cC4KICAgICAgICAgICBUaGVyZSBhcmUgYWxzbyBubyBsb25nZXIgYW55IHN0YXRpYyB2YXJpYWJsZXMgc28gaXQgc2hvdWxkIGdlbmVyYXRlCiAgICAgICAgICAgc29tZXdoYXQgbGVzcyBjb2RlLgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlICJjb25zdCIgdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvICJjb25zdGFudCIgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMuICAiY29uc3QiIGlzIGEgQyBrZXl3b3JkIHdoaWNoIG1hZGUgdGhlIGhhbmRsaW5nIG9mIHRoZSB0eXBlbWFwCiAgICAgICAgICAgZGlyZWN0aXZlIHNvbWV3aGF0IGF3a3dhcmQgaW4gdGhlIHBhcnNlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgICV0eXBlbWFwIGRpcmVjdGl2ZSBjYW4gbm93IGFjY2VwdCBuZWFybHkgYXJiaXRyYXJ5IGtleXdvcmQgcGFyYW1ldGVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4scGFyc2U9ImkiLGRvYz0iaW50ZWdlciIpIGludCAiLi4uIjsKCiAgICAgICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhlIGtleXdvcmQgcGFyYW1ldGVycyBpcyB0byBzdXBwbHkgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgaGludHMgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSBtb2R1bGUuICAgVGhlIGludGVwcmV0YXRpb24gb2YgdGhlCiAgICAgICAgICAgcGFyYW1ldGVycyBpcyBsYW5ndWFnZSBzcGVjaWZpYy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgc2VtYW50aWMgY2hhbmdlIHRvIGludGVybmFsIGNhbGwvcmV0dXJuIGJ5IHZhbHVlIGhhbmRsaW5nLgogICAgICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGNhbGwtYnktdmFsdWUgd2FzIHRyYW5zbGF0ZWQKICAgICAgICAgICBpbnRvIHBvaW50ZXJzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBkb3VibGUgZG90X3Byb2R1Y3QoVmVjdG9yIGEsIFZlY3RvciBiKTsKCiAgICAgICAgICAgdHVybmVkIGludG8gdGhpczoKCiAgICAgICAgICAgICAgIGRvdWJsZSB3cmFwX2RvdF9wcm9kdWN0KFZlY3RvciAqYSwgVmVjdG9yICpiKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBkb3RfcHJvZHVjdCgqYSwqYik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyB0cmFuc2xhdGlvbiB3YXMgbm9ybWFsbHkgcGVyZm9ybWVkIGJ5IHRoZSBTV0lHIGNvcmUsIG91dHNpZGUKICAgICAgICAgICBvZiB0aGUgY29udHJvbCBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgSG93ZXZlciwgYSBzaWRlIGVmZmVjdAogICAgICAgICAgIG9mIHRoaXMgd2FzIGEgbG90IG9mIGJpemFycmUgdHlwZW1hcCBiZWhhdmlvci4gICBGb3IgZXhhbXBsZSwKICAgICAgICAgICBpZiB5b3UgZGlkIHNvbWV0aGluZyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludDMyIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgWW91IHdvdWxkIGZpbmQgdGhhdCBpbnQzMiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIHBvaW50ZXIgZXZlcnl3aGVyZSEKICAgICAgICAgICAobmVlZGxlc3MgdG8gc2F5LCBzdWNoIGJlaGF2aW9yIGlzIHVuZXhwZWN0ZWQgYW5kIHF1aXRlIGF3a3dhcmQgdG8KICAgICAgICAgICBkZWFsIHdpdGgpLiAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCBpZiBhIHR5cGVkZWYgd2FzIGFsc28gdXNlZCwKICAgICAgICAgICB0aGUgcG9pbnRlciBiZWhhdmlvciBzdWRkZW5seSBkaXNhcHBlYXJlZC4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBwb2ludGVyIHRyYW5zZm9ybWF0aW9uIGlzIG5vdyBwdXNoZWQgdG8gdGhlCiAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4gICBUaGlzIHByb2R1Y2VzIHdyYXBwZXJzIHRoYXQgbG9vayByb3VnaGx5CiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZzEgPSAqYTsKICAgICAgICAgICAgICAgICAgVmVjdG9yIGFyZzIgPSAqYjsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KGFyZzEsYXJnMik7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBtYWtlcyBpdCBlYXN5IHRvIGRlZmluZSB0eXBlbWFwcyBmb3IKICAgICAgICAgICBhcmJpdHJhcnkgdW5kZWZpbmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIHlvdSBjYW4gZG8gdGhpcyAoYW5kIGl0CiAgICAgICAgICAgd2lsbCB3b3JrIHJlZ2FyZGxlc3Mgd2hhdCBpbnQzMiBpcyk6CgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAkMSA9IChpbnQzMikgUHlJbnRfQXNMb25nKCRpbnB1dCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTUNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNhbGwvcmV0dXJuIGJ5IHZhbHVlIGNvZGUgZ2VuZXJhdGlvbiBpbgogICAgICAgICAgIHNvbWUgbGFuZ3VhZ2UgbW9kdWxlcy4KCjExLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZWQgdGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgdHlwZW1hcHMgdG8gdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgIHsgCiAgICAgICAgICAgICAgICAgICAuLi4gYW4gb2JqZWN0IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgKiB7CiAgICAgICAgICAgICAgICAgICAuLi4gYSBwb2ludGVyIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgJiB7CiAgICAgICAgICAgICAgICAgICAuLi4gYSByZWZlcmVuY2UgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSBbXSB7CiAgICAgICAgICAgICAgICAgICAuLi4gYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBlbnVtIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgLi4uIGFuIGVudW0gdmFsdWUgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAoQ0xBU1M6OiopIHsKICAgICAgICAgICAgICAgICAgIC4uLiBwb2ludGVyIHRvIG1lbWJlciAuLi4KICAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgVGhlc2UgdHlwZXMgYXJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgZm9yIGFsbCB0eXBlcyB0aGF0IGRvbid0IG1hdGNoCiAgICAgICAgICAgYW55dGhpbmcgZWxzZS4gIFNlZSBDSEFOR0VTIGxvZyBlbnRyeSBmb3IgOC8yNy8yMDAwIGZvciB0aGUKICAgICAgICAgICBvbGQgYmVoYXZpb3IuICBUaGUgcm9sZSBvZiB0aGVzZSB0eXBlcyBpcyBhbHNvIGRlc2NyaWJlZCBpbiAKICAgICAgICAgICBEb2MvTWFudWFsL1R5cGVtYXBzLmh0bWwKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAKMTAvMjUvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgR3VpbGUgYW5kIE16c2NoZW1lIG1vZHVsZXMgdG8gc3VwcG9ydAogICAgICAgICAgIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEZpeCB0byBoYW5kbGUgcG9pbnRlcnMgdG8gYXJyYXlzLgoKMTAvMjQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRGVmaW5pbmcgYSB0eXBlbWFwIHJ1bGUgZm9yIGVudW0gU1dJR0VOVU0gY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICAgdG8gZGVmaW5lIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGVudW0gdmFyaWFibGVzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUnVieSBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBtdWx0aS1hcmd1bWVudCB0eXBlbWFwcy4KCjEwLzIyLzIwMDE6YmVhemxleQogICAgICAgICAgIFRoZSBSdWJ5IG1vZHVsZSBjYW4gbm93IGhhbmRsZSBmdW5jdGlvbnMgd2l0aCBhbiBhcmJpdHJhcnkKICAgICAgICAgICBudW1iZXIgb2YgYXJndW1lbnRzLiAgUHJldmlvdXMgdmVyc2lvbnMgd2VyZSBsaW1pdGVkIHRvIAogICAgICAgICAgIHRvIGZ1bmN0aW9ucyB3aXRoIG9ubHkgOSBvciAxNiBhcmd1bWVudHMgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgdGhlIHVzZSBvZiBkZWZhdWx0IGFyZ3VtZW50cy4gICBOb3RlOiBmcm9tIHNvbWUgaW5zcGVjdGlvbgogICAgICAgICAgIG9mIHRoZSBSdWJ5IGludGVycHJldGVyIHNvdXJjZSwgdGhlIG5ldyBhcHByb2FjaCBtaWdodCBiZQogICAgICAgICAgIGEgbGl0dGxlIGZhc3RlciBhcyB3ZWxsLgoKMTAvMTgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucyBhbmQKICAgICAgICAgICB0ZW1wbGF0ZXMuCgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyA8UyxUPjsKCiAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IElyaW5hIEtvdGxvdmEuCgoxMC8xNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBTdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcyBhZGRlZC4gIFRoZSB0eXBlbWFwcwogICAgICAgICAgIGFyZSBzcGVjaWZpZWQgdXNpbmcgdGhlIHN5bnRheCBiZWxvdy4gICBXaXRoaW4gZWFjaAogICAgICAgICAgIHR5cGVtYXAsIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBpcyBoYW5kbGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAkYXJnOyAgLy8gVGhlIGlucHV0IG9iamVjdCBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlCiAgICAgICAgICAgICAgICAgICQxOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBmaXJzdCBhcmd1bWVudAogICAgICAgICAgICAgICAgICAkMjsgICAgLy8gQyBsb2NhbCB2YXJpYWJsZSBmb3Igc2Vjb25kIGFyZ3VtZW50CgogICAgICAgICAgICAgICAgICAvLyBUaGVzZSB2YXJpYWJsZXMgcmVmZXIgdG8gZWl0aGVyIGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQxX3R5cGUsICQxX2x0eXBlLCAkMV9iYXNldHlwZSwgZXRjLi4uICAoYXJnYykKICAgICAgICAgICAgICAgICAgJDJfdHlwZSwgJDJfbHR5cGUsICQyX2Jhc2V0eXBlLCBldGMuLi4gIChhcmd2W10pCgogICAgICAgICAgICAgICAgICAvLyBBcnJheSBkaW1lbnNpb24gb2YgYXJndgogICAgICAgICAgICAgICAgICAkMl9kaW0wCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBCYXNpY2FsbHkgYW55IHZhcmlhYmxlIHRoYXQgd2FzIGF2YWlsYWJsZSBpbiBub3JtYWwgdHlwZW1hcHMKICAgICAgICAgICBpcyBhdmFpbGFibGUgZm9yIGVpdGhlciBhcmd1bWVudCBieSBwcmVmYWNpbmcgdGhlIHZhcmlhYmxlCiAgICAgICAgICAgbmFtZSBieSAnJG5fJyB3aGVyZSBuIGlzIHRoZSBhcmd1bWVudCBwb3NpdGlvbi4KCiAgICAgICAgICAgTm90ZXM6ICAKICAgICAgICAgICAoMSkgTXVsdGktdmFsdWVkIHR5cGVtYXBzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gYSBzaW5nbGUKICAgICAgICAgICAgICAgb2JqZWN0IGluIHRoZSB0YXJnZXQgc2NyaXB0aW5nIGxhbmd1YWdlLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgICAgICB5b3UgY2FuIHNwbGl0IGEgc3RyaW5nIGludG8gYSAoY2hhciAqLCBpbnQpIHBhaXIgb3IKICAgICAgICAgICAgICAgc3BsaXQgYSBsaXN0IGludG8gYSAoaW50LCBjaGFyIFtdKSBwYWlyLiAgSXQgaXMgbm90CiAgICAgICAgICAgICAgIHBvc3NpYmxlIHRvIG1hcCBtdWx0aXBsZSBvYmplY3RzIHRvIG11bHRpcGxlIGFyZ3VtZW50cy4KCiAgICAgICAgICAgKDIpIFRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBTV0lHIHZlcnNpb25zLCB0aGUKICAgICAgICAgICAgICAgdmFyaWFibGVzIHN1Y2ggYXMgJHRhcmdldCBhbmQgJHR5cGUgYXJlIHByZXNlcnZlZCBhbmQKICAgICAgICAgICAgICAgYXJlIG1hcHBlZCBvbnRvIHRoZSBmaXJzdCBhcmd1bWVudCBvbmx5LgoKICAgICAgICAgICAoMykgVGhpcyBzaG91bGQgbm90IGFmZmVjdCBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgY29kZS4KICAgICAgICAgICAgICAgTXVsdGktdmFsdWVkIHR5cGVtYXBzIGFyZSBhbiBleHRlbnNpb24gdG8gdHlwZW1hcCBoYW5kbGluZy4KICAgICAgICAgICAgICAgU2luZ2xlIHZhbHVlZCB0eXBlbWFwcyBjYW4gYmUgc3BlY2lmaWVkIGluIHRoZSB1c3VhbAogICAgICAgICAgICAgICB3YXkuCgogICAgICAgICAgIFRoZSBvbGQgJHNvdXJjZSBhbmQgJHRhcmdldCB2YXJpYWJsZXMgYXJlIG9mZmljaWFsbHkKICAgICAgICAgICBkZXByZWNhdGVkLiAgSW5wdXQgdmFyaWFibGVzIGFyZSByZWZlcmVuY2VkIHRocm91Z2gKICAgICAgICAgICAkYXJnJCBhbmQgb3V0cHV0IHZhbHVlcyBhcmUgcmVmZXJlbmNlIHRocm91Z2ggJHJlc3VsdCQuCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIEFkZGVkIHBhcnNpbmcgc3VwcG9ydCBmb3IgbXVsdGl2YWx1ZWQgdHlwZW1hcHMuICBUaGUgc3ludGF4CiAgICAgICAgICAgaXMgYSBsaXR0bGUgZnVua3ksIGJ1dCBoZXJlIGdvZXM6CgogICAgICAgICAgICAgIC8vIERlZmluZSBhIG11bHRpdmFsdWVkIHR5cGVtYXAKICAgICAgICAgICAgICAldHlwZW1hcChpbikgKGludCBhcmdjLCBjaGFyICphcmd2W10pIHsKICAgICAgICAgICAgICAgICAgICAuLi4gdHlwZW1hcCBjb2RlIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gTXVsdGl2YWx1ZWQgdHlwZW1hcCB3aXRoIGxvY2FscwogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkoaW50IHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAuLi4gdHlwZW1hcCBjb2RlIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAKICAgICAgICAgICAgICAvLyBDb3B5IGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2NvdW50LCBjaGFyICoqYXJndikgPSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSk7CgogICAgICAgICAgICAgIC8vIEFwcGx5IGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICVhcHBseSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgeyAoaW50IGFyZ2NvdW50LCBjaGFyICoqYXJndikgfTsKCiAgICAgICAgICAgTm90ZTogdGhpcyBleHRyYSBwYXJzaW5nIHN1cHBvcnQgaXMgYWRkZWQgZm9yIGZ1dHVyZSBleHRlbnNpb24uCiAgICAgICAgICAgTm8gbGFuZ3VhZ2UgbW9kdWxlcyBjdXJyZW50bHkgc3VwcG9ydCBtdWx0aS12YWx1ZWQgdHlwZW1hcHMuCgoxMC8xMS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgdHlwZW1hcCBtYXRjaGluZyBjb2RlIHRvIGRpc2NhcmQgcXVhbGlmaWVycyB3aGVuCiAgICAgICAgICAgY2hlY2tpbmcgZm9yIGEgbWF0Y2guICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgZGVjbGFyYXRpb24KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBjaGFyICp4KTsKCiAgICAgICAgICAgVGhlIHR5cGVtYXAgY2hlY2tlciBjaGVja3MgZm9yIGEgbWF0Y2ggaW4gdGhlIGZvbGxvd2luZyBvcmRlcjoKCiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgICAgICAgICAgICAgIGNoYXIgKngKICAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgSWYgdHlwZWRlZidzIGFyZSBpbnZvbHZlZCwgcXVhbGlmaWVyIHN0cmlwcGluZyBvY2N1cnMgYmVmb3JlCiAgICAgICAgICAgdHlwZWRlZiByZXNvbHV0aW9uLiAgU28gaWYgeW91IGhhZCB0aGlzLAoKICAgICAgICAgICAgICAgIHR5cGVkZWYgY2hhciAqc3RyaW5nOwogICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IHN0cmluZyB4KTsKCiAgICAgICAgICAgdHlwZW1hcCBjaGVja2luZyB3b3VsZCBiZSBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyB4CiAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcKICAgICAgICAgICAgICAgIHN0cmluZyB4CiAgICAgICAgICAgICAgICBzdHJpbmcKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKngKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKgogICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgY2hhciAqCgogICAgICAgICAgIFRoZSBwcmltYXJ5IHJlYXNvbiBmb3IgdGhpcyBjaGFuZ2UgaXMgdG8gc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIFdpdGhvdXQgcXVhbGlmaWVyIHN0cmlwcGluZywgb25lIGhhcyB0byB3cml0ZQogICAgICAgICAgIHNlcGVyYXRlIHR5cGVtYXBzIGZvciBhbGwgdmFyaWF0aW9ucyBvZiBjb25zdCBhbmQgdm9sYXRpbGUgKHdoaWNoCiAgICAgICAgICAgaXMgYSBwYWluKS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBUeXBlbWFwcyBtaWdodCBiZSBhcHBsaWVkIGluCiAgICAgICAgICAgcGxhY2VzIHdoZXJlIHRoZXkgd2VyZW4ndCBiZWZvcmUuCgoKMTAvOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgZ2VuZXJhdGVzIHdyYXBwZXJzIHRoYXQgcHJvcGVybHkgZGlzYW1iaWd1YXRlCiAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgb25seSB2YXJ5IGluIGNvbnN0bmVzcy4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCk7CiAgICAgICAgICAgICAgICAgIHZvaWQgYmxhaCgpIGNvbnN0OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gaGFuZGxlIHRoaXMsIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBjYW4gYmUgdXNlZCBub3JtYWxseS4KICAgICAgICAgICAKICAgICAgICAgICAgICAgJXJlbmFtZShibGFoX2NvbnN0KSBibGFoKCkgY29uc3Q7CgogICAgICAgICAgIEluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLCBtZXRob2QgY2FsbHMgbGlrZSB0aGlzCiAgICAgICAgICAgYXJlIG5vdyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAob2JqKS0+YmxhaCgpICAgICAgICAgICAgICAgLy8gTm9uLWNvbnN0IHZlcnNpb24KICAgICAgICAgICAgICAgKChGb28gY29uc3QgKilvYmopLT5ibGFoKCkgIC8vIGNvbnN0IHZlcnNpb24KCiAgICAgICAgICAgVGhpcyBzaG91bGQgZm9yY2UgdGhlIHJpZ2h0IG1ldGhvZCB0byBiZSBpbnZva2VkLgogICAgICAgICAgIEFkbWl0dGVkbHksIHRoaXMgaXMgcHJvYmFibHkgb2JzY3VyZSwgYnV0IHdlIG1pZ2h0CiAgICAgICAgICAgYXMgd2VsbCBnZXQgaXQgcmlnaHQuCgoxMC84LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgcHJlcHJvY2Vzc29yIG5vdyBpZ25vcmVzICdccicgaW4gdGhlIGlucHV0LgogICAgICAgICAgIFRoaXMgc2hvdWxkIGZpeCB0aGUgZm9sbG93aW5nIGJ1ZzoKICAgICAgICAgICBbICM0Njg0MTYgXSBTV0lHIHRoaW5rcyBtYWNybyBkZWZzIGFyZSBkZWNsYXJhdGlvbnM/CgoxMC84LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciB8fCwgJiYsIGFuZCAhIGluIGNvbnN0YW50cy4gIFRoaXMKICAgICAgICAgICBmaXhlcyBTRiBbICM0Njg5ODggXSBMb2dpY2FsIG9wcyBicmVhayBwcmVwcm9jZXNzb3IuCiAgICAgICAgICAgSG93ZXZlciwgYXQgdGhpcyB0aW1lLCBjb25zdGFudHMgdXNpbmcgdGhlc2Ugb3BlcmF0b3JzCiAgICAgICAgICAgYXJlIG5vdCBzdXBwb3J0ZWQgKHRoZSBwYXJzZXIgd2lsbCBpc3N1ZSBhIHdhcm5pbmcpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgLXNob3dfdGVtcGxhdGVzIGNvbW1hbmQgbGluZSBvcHRpb24uICBUaGlzIG1ha2VzCiAgICAgICAgICAgU1dJRyBkaXNwbGF5IHRoZSBjb2RlIGl0IGFjdHVhbGx5IHBhcnNlcyB0byBnZW5lcmF0ZQogICAgICAgICAgIHRlbXBsYXRlIHdyYXBwZXJzLiAgTW9zdGx5IHVzZWZ1bCBmb3IgZGVidWdnaW5nLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byBzZW1hbnRpY3Mgb2YgJXRlbXBsYXRlIGRpcmVjdGl2ZS4gIFdoZW4KICAgICAgICAgICB1c2luZyAldGVtcGxhdGUsIHRoZSB0ZW1wbGF0ZSBhcmd1bWVudHMgYXJlIGhhbmRsZWQKICAgICAgICAgICBhcyB0eXBlcyBieSBkZWZhdWx0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8ZG91YmxlPjsKCiAgICAgICAgICAgVG8gc3BlY2lmeSBhIHRlbXBsYXRlIGFyZ3VtZW50IHRoYXQgaXMgKm5vdCogYSB0eXBlLCB5b3UKICAgICAgICAgICBuZWVkIHRvIHVzZSBkZWZhdWx0LXZhbHVlIHN5bnRheC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludCxpbnQ9NTA+OwogICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2RvdWJsZSkgdmVjdG9yPGludCxzaXplPTEwMD47CgogICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgbmFtZSBkb2Vzbid0IHJlYWxseSBtYXR0ZXItLW9ubHkKICAgICAgICAgICB0aGUgZGVmYXVsdCB2YWx1ZSAoZS5nLiwgNTAsIDEwMCkgaXMgdXNlZCBkdXJpbmcKICAgICAgICAgICBleHBhbnNpb24uICBUaGlzIGRpZmZlcnMgZnJvbSBub3JtYWwgQysrLCBidXQgSSBjb3VsZG4ndAogICAgICAgICAgIGZpZ3VyZSBvdXQgYSBiZXR0ZXIgd2F5IHRvIGRvIGl0IGluIHRoZSBwYXJzZXIuICBNaWdodAogICAgICAgICAgIGltcGxlbWVudCBhbiBhbHRlcm5hdGl2ZSBsYXRlci4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgIAoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYWpvciBjaGFuZ2VzIHRvIHRlbXBsYXRlIGhhbmRsaW5nIGluIG9yZGVyIHRvIHByb3ZpZGUKICAgICAgICAgICBiZXR0ZXIgaW50ZWdyYXRpb24gd2l0aCB0aGUgQysrIHR5cGUtc3lzdGVtLiBUaGUgbWFpbgogICAgICAgICAgIHByb2JsZW0gaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgU3VwcG9zZSB5b3UgaGF2ZSBhIHRlbXBsYXRlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gdm9pZCBibGFoKGNvbnN0IFQgeCkgeyBzdHVmZiB9OwogICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgTm93IHN1cHBvc2UsIHRoYXQgeW91IGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBvbiBhCiAgICAgICAgICAgdHlwZSBsaWtlIHRoaXMgaW4gU1dJRzoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8aW50ICo+OwoKICAgICAgICAgICBJbiBDKyssIHRoaXMgaXMgKnN1cHBvc2VkKiB0byBnZW5lcmF0ZSBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICBIb3dldmVyLCBpbiBTV0lHLTEuMy45LCB0aGUgdGVtcGxhdGUgc3Vic3RpdHV0aW9uIGdldHMgaXQgd3JvbmcKICAgICAgICAgICBhbmQgcHJvZHVjZXMKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGludCAqeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICAobm90aWNlIHRoZSBiYWQgcGxhY2VtZW50IG9mIHRoZSAnY29uc3QnIHF1YWxpZmllcikuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCB0aGUgU1dJRyBwYXJzZXIgbm93IGdlbmVyYXRlcyBpbXBsaWNpdCB0eXBlZGVmcwogICAgICAgICAgIGZvciB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cyB0aGF0IHByb2R1Y2VzIGNvZGUgcm91Z2hseQogICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZG9pbmcgdGhpczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKl9fc3dpZ3RtcGwxOwogICAgICAgICAgICAgICV0ZW1wbGF0ZShibGFoaW50KSBibGFoPF9fc3dpZ3RtcGwxPjsKCiAgICAgICAgICAgd2hpY2ggZ2VuZXJhdGVzIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICBTaW5jZSB0aGlzIGlzIGNvcnJlY3QgaW4gYm90aCBDKysgYW5kIFNXSUcsIGl0IHByb3ZpZGVzIHRoZSByaWdodAogICAgICAgICAgIHNlbWFudGljcyBhbmQgYWxsb3dzIGV2ZXJ5dGhpbmcgdG8gY29tcGlsZSBwcm9wZXJseS4gIEhvd2V2ZXIsCiAgICAgICAgICAgdG8gY2xlYW4gdXAgdGhlIGdlbmVyYXRlZCBjb2RlIGEgbGl0dGxlIGJpdCwgdGhlIHBhcnNlciBrZWVwcwogICAgICAgICAgIHRyYWNrIG9mIHRoZSB0ZW1wbGF0ZSB0eXBlcyBhbmQgcGVyZm9ybXMgYmFjay1zdWJzdGl0dXRpb24gdG8KICAgICAgICAgICB0aGUgb3JpZ2luYWwgdHlwZSB3aGVuIGJ1aWxkaW5nIHRoZSBwYXJzZSB0cmVlLiAgVGh1cywgZXZlbgogICAgICAgICAgIHRob3VnaCB0aGUgaW1wbGljaXQgdHlwZWRlZiBpcyB1c2VkIGluIHRoZSBpbnB1dCBhbmQgbWF5IGFwcGVhcgogICAgICAgICAgIGluIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBmaWxlIChmb3IgcHJvcGVyIGNvbXBpbGF0aW9uKSwgdGhlIHBhcnNlCiAgICAgICAgICAgdHJlZSB3aWxsIGhpZGUgYSBsb3Qgb2YgdGhlc2UgZGV0YWlscy4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IF9fc3dpZ3RtcGwxIHgpIHsgc3R1ZmYgfTsKCiAgICAgICAgICAgd2lsbCBsb29rIGxpa2UgaXQgd2FzIGRlY2xhcmVkIGFzIGZvbGxvd3MgKHdoaWNoIGlzIHdoYXQKICAgICAgICAgICB5b3Ugd2FudCk6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChpbnQgKmNvbnN0IHgpIHsgc3R1ZmYgfQoKICAgICAgICAgICBUaGUgb25seSBwbGFjZSB5b3UgYXJlIGxpa2VseSB0byBub3RpY2UgdGhlIHR5cGVkZWYgaGFjawogICAgICAgICAgIGlzIGluIGJvZGllcyBvZiB0ZW1wbGF0ZSBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgZGlkIHRoaXMsCgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGJsYWggewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB7CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIFQgIHRlbXB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICB5b3Ugd2lsbCBmaW5kIHRoYXQgJ1QgdGVtcHZhbHVlJyBnb3QgZXhwYW5kZWQgaW50byBzb21lCiAgICAgICAgICAgc3RyYW5nZSB0eXBlZGVmIHR5cGUuICBUaGlzICpzdGlsbCogY29tcGlsZXMgY29ycmVjdGx5IAogICAgICAgICAgIHNvIGl0J3Mgbm90IGEgYmlnIGRlYWwgKG90aGVyIHRoYW4gbG9va2luZyBraW5kIG9mIHVnbHkKICAgICAgICAgICBpbiB0aGUgd3JhcHBlciBmaWxlKS4KCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHNvbWUgaW5oZXJpdGFuY2UgcHJvYmxlbXMgaW4gVGNsIE9iamVjdCBpbnRlcmZhY2UuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUY2wgbW9kdWxlIGhhcyBjaGFuZ2VkIHRvIHVzZSBieXRlLWJhY2tlZCBwb2ludGVyIHN0cmluZ3MuICBUaGlzCiAgICAgICAgICAgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHNhZmUgb24gNjQtYml0IHBsYXRmb3Jtcy4gIEhvd2V2ZXIsCiAgICAgICAgICAgdGhlIG9yZGVyIGluIHdoaWNoIGRpZ2l0cyBhcHBlYXIgaW4gcG9pbnRlciB2YWx1ZXMgbm8gbG9uZ2VyCiAgICAgICAgICAgZGlyZWN0bHkgY29ycmVzcG9uZHMgdG8gdGhlIGFjdHVhbCBudW1lcmljYWwgdmFsdWUgb2YgYQogICAgICAgICAgIHBvaW50ZXIgKG9uIGxpdHRsZS1lbmRpYW4gbWFjaGluZXMsIHBhaXJzIG9mIGRpZ2l0cyBhcHBlYXIKICAgICAgICAgICBpbiByZXZlcnNlIG9yZGVyKS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFBlcmw1IG1vZHVsZSBpcyBub3cgZHJpdmVuIGJ5IGEgY29uZmlndXJhdGlvbiBmaWxlICdwZXJsNS5zd2cnCiAgICAgICAgICAgaW4gdGhlIFNXSUcgbGlicmFyeS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwZXJsNSBtb2R1bGUgbm8gbG9uZ2VyIHRyaWVzIHRvIGFwcGx5IHRoZSAib3V0IiB0eXBlbWFwCiAgICAgICAgICAgaW4gY29kZSBnZW5lcmF0ZWQgZm9yIG1hZ2ljIHZhcmlhYmxlcy4gIEknbSBzdXJwcmlzZWQgdGhhdAogICAgICAgICAgIHRoaXMgZXZlciB3b3JrZWQgYXQgYWxsIChzaW5jZSBhbGwgb2YgdGhlIGNvZGUgdGhhdCB3YXMgdGhlcmUKICAgICAgICAgICB3YXMgd3JvbmcgYW55d2F5cykuICAgVXNlIHRoZSAidmFyb3V0IiB0eXBlbWFwIHRvIGhhbmRsZQogICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZXMuCgoxMC8xLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyByZWxhdGVkIHRvIGNoYXJhY3RlciBhcnJheSBtZW1iZXJzIG9mIHN0cnVjdHVyZXMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICBjaGFyIG5hbWVbMzJdOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBpcyBub3JtYWxseSBzdXBwb3NlZCB0byByZXR1cm4gYSBzdHJpbmcsIGJ1dCB0aGlzIHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuOS4gICBUaGUgcmVhc29uIGl0IHdhcyBicm9rZW4gd2FzIGFjdHVhbGx5CiAgICAgICAgICAgZHVlIHRvIGEgc3VidGxlIG5ldyBmZWF0dXJlIG9mIHR5cGVtYXBzLiAgV2hlbiBhIGRhdGEgbWVtYmVyCiAgICAgICAgICAgaXMgc2V0IHRvIGFuIGFycmF5IGxpa2UgdGhpcywgdGhlIHJldHVybiB0eXBlIG9mIHRoZSByZWxhdGVkCiAgICAgICAgICAgYWNjZXNzb3IgZnVuY3Rpb24gaXMgYWN0dWFsbHkgc2V0IHRvIGFuIGFycmF5LiAgVGhpcyBtZWFucwogICAgICAgICAgIHRoYXQgeW91IGNhbiBub3cgd3JpdGUgdHlwZW1hcHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAldHlwZW1hcChweXRob24sb3V0KSBjaGFyIFtBTlldIHsKICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoJHNvdXJjZSwkZGltMCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgZGVmdW5jdAogICAgICAgICAgIG1lbWJlcm91dCB0eXBlbWFwIGluIGEgbW9yZSBlbGVnYW50IG1hbm5lci4KCjkvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNvbWUgZnVydGhlciByZWZpbmVtZW50IG9mIHF1YWxpZmllZCBDKysgbWVtYmVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGZvbygpIGNvbnN0OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgKGkpIFRoZSBTV0lHIHBhcnNlciB3YXMgZXh0ZW5kZWQgc2xpZ2h0bHkgdG8gYWxsb3cgJ3ZvbGF0aWxlJwogICAgICAgICAgIGFuZCBjb21iaW5hdGlvbnMgb2YgJ2NvbnN0JyBhbmQgJ3ZvbGF0aWxlJyB0byBiZSB1c2VkLiAgVGhpcwogICAgICAgICAgIGlzIHByb2JhYmx5IHJhcmUsIGJ1dCB0ZWNobmljYWxseSBsZWdhbC4gIE9ubHkgYWRkZWQgZm9yCiAgICAgICAgICAgY29tcGxldGVuZXNzLgoKICAgICAgICAgICAoaWkpIEZvciB0aGUgcHVycG9zZXMgb2Ygb3ZlcmxvYWRpbmcsIHF1YWxpZmllZCBhbmQgbm9uLXF1YWxpZmllZAogICAgICAgICAgIGZ1bmN0aW9ucyBhcmUgZGlmZmVyZW50LiAgVGh1cywgd2hlbiBhIGNsYXNzIGhhcyBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpIGNvbnN0OwoKICAgICAgICAgICBUd28gZGlzdGluY3QgbWV0aG9kcyBhcmUgZGVjbGFyZWQuICBUbyBkZWFsIHdpdGggdGhpcywgJXJlbmFtZQogICAgICAgICAgIGFuZCBzaW1pbGFyIGRpcmVjdGl2ZXMgaGF2ZSBiZWVuIGV4dGVuZGVkIHRvIHJlY29nbml6ZSBjb25zdC4KICAgICAgICAgICBUaHVzLCBvbmUgY2FuIGRpc2FtYmlndWF0ZSB0aGUgdHdvIGZ1bmN0aW9ucyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb29jb25zdCkgRm9vOjpmb28oKSBjb25zdDsKCiAgICAgICAgICAgb3Igc2ltcGx5IGlnbm9yZSB0aGUgY29uc3QgdmFyaWFudCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBOb3RlOiBTV0lHIGN1cnJlbnRseSBoYXMgbm8gd2F5IHRvIGFjdHVhbGx5IGludm9rZSB0aGUgY29uc3QKICAgICAgICAgICBtZW1iZXIgc2luY2UgdGhlICdjb25zdCcgaXMgZGlzY2FyZGVkIHdoZW4gZ2VuZXJhdGluZyB3cmFwcGVycwogICAgICAgICAgIGZvciBvYmplY3RzLiAgCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBOZXcgZGlyZWN0aXZlLiAlbmFtZXdhcm4gY2FuIGJlIHVzZWQgdG8gaXNzdWUgd2FybmluZwogICAgICAgICAgIG1lc3NhZ2VzIGZvciBjZXJ0YWluIGRlY2xhcmF0aW9uIG5hbWVzLiAgIFRoZSBuYW1lCiAgICAgICAgICAgbWF0Y2hpbmcgaXMgdGhlIHNhbWUgYXMgZm9yIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4KICAgICAgICAgICBUaGUgaW50ZW50IG9mIHRoaXMgZGlyZWN0aXZlIGlzIHRvIGlzc3VlIHdhcm5pbmdzIGZvcgogICAgICAgICAgIHBvc3NpYmxlIG5hbWVzcGFjZSBjb25mbGljdHMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJW5hbWV3YXJuKCJwcmludCBpcyBhIHB5dGhvbiBrZXl3b3JkIikgcHJpbnQ7CgogICAgICAgICAgIFRoZSBuYW1lIG1hdGNoaW5nIGFsZ29yaXRobSBpcyBwZXJmb3JtZWQgYWZ0ZXIgYSBuYW1lCiAgICAgICAgICAgaGFzIGJlZW4gcmVzb2x2ZWQgdXNpbmcgJXJlbmFtZS4gIFRoZXJlZm9yZSwgYQogICAgICAgICAgIGRlY2xhcmF0aW9uIGxpa2UgdGhpcyB3aWxsIG5vdCBnZW5lcmF0ZSBhIHdhcm5pbmc6CgogICAgICAgICAgICAgICVyZW5hbWUoIlByaW50IikgcHJpbnQ7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgdm9pZCBwcmludCgpOyAgICAvKiBObyB3YXJuaW5nIGdlbmVyYXRlZCAqLwoKICAgICAgICAgICBTaW5jZSB0aGUgd2FybmluZyBtZWNoYW5pc20gZm9sbG93cyAlcmVuYW1lIHNlbWFudGljcywgaXQgaXMKICAgICAgICAgICBhbHNvIHRvIGlzc3VlIHdhcm5pbmdzIGZvciBzcGVjaWZpYyBjbGFzc2VzIG9yIGp1c3QgZm9yCiAgICAgICAgICAgY2VydGFpbiBtZW1iZXIgZnVuY3Rpb24gbmFtZXMuCgogICAgICAgICAgIChEYXZlIC0gSSd2ZSBiZWVuIHRoaW5raW5nIGFib3V0IGFkZGluZyBzb21ldGhpbmcgbGlrZSB0aGlzCiAgICAgICAgICAgZm9yIHF1aXRlIHNvbWUgdGltZS4gIEp1c3QgbmV2ZXIgZ290IGFyb3VuZCB0byBpdCkKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoKOS8yNy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW5oYW5jZWQgdGhlICVpZ25vcmUgZGlyZWN0aXZlIHNvIHRoYXQgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgIGNhbiBiZSBpc3N1ZWQgdG8gdXNlcnMuICAgVGhpcyBpcyBkb25lIHVzaW5nICVpZ25vcmV3YXJuCiAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICVpZ25vcmV3YXJuKCJvcGVyYXRvciBuZXcgaWdub3JlZCIpIG9wZXJhdG9yIG5ldzsKCiAgICAgICAgICAgVGhlIG5hbWVzIGFuZCBzZW1hbnRpY3Mgb2YgJWlnbm9yZXdhcm4gaXMgZXhhY3RseSB0aGUgCiAgICAgICAgICAgc2FtZSBhcyAlaWdub3JlLiBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICAgaXMgZm9yIG1vZHVsZSB3cml0ZXJzIHdobyB3YW50IHRvIGlnbm9yZSBjZXJ0YWluIHR5cGVzCiAgICAgICAgICAgb2YgZGVjbGFyYXRpb25zLCBidXQgd2hvIGFsc28gd2FudCB0byBhbGVydCB1c2VycyBhYm91dCBpdC4KICAgICAgICAgICBBIHVzZXIgbWlnaHQgYWxzbyB1c2UgdGhpcyBmb3IgZGVidWdnaW5nIChzaW5jZSBtZXNzYWdlcwogICAgICAgICAgIHdpbGwgYXBwZWFyIHdoZW5ldmVyIGFuIGlnbm9yZWQgZGVjbGFyYXRpb24gYXBwZWFycykuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yNi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU3VwZXItZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIG92ZXJsb2FkZWQgb3BlcmF0b3JzLiAKICAgICAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnNpc3RzIG9mIGEgZmV3IGRpZmZlcmVudCBwYXJ0cy4KCiAgICAgICAgICAgKGkpIE9wZXJhdG9yIG5hbWVzIHN1Y2ggYXMgJ29wZXJhdG9yKycgYXJlIG5vdyBhbGxvd2VkCiAgICAgICAgICAgYXMgdmFsaWQgZGVjbGFyYXRvciBuYW1lcy4gIFRodXMgdGhlICdvcGVyYXRvcicgc3ludGF4CiAgICAgICAgICAgY2FuIGFwcGVhciAqYW55cGxhY2UqIGEgbm9ybWFsIGRlY2xhcmF0b3IgbmFtZSB3YXMgdXNlZAogICAgICAgICAgIGJlZm9yZS4gIE9uIHRoZSBzdXJmYWNlLCB0aGlzIG1lYW5zIHRoYXQgb3BlcmF0b3JzIGNhbgogICAgICAgICAgIGJlIHBhcnNlZCBqdXN0IGxpa2Ugbm9ybWFsIGZ1bmN0aW9ucyBhbmQgbWV0aG9kcy4gCiAgICAgICAgICAgSG93ZXZlciwgaXQgYWxzbyBtZWFucyB0aGF0IG9wZXJhdG9yIG5hbWVzIGNhbiBiZSB1c2VkCiAgICAgICAgICAgaW4gbWFueSBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAlcmVuYW1lKF9fYWRkX18pIENvbXBsZXg6Om9wZXJhdG9yKyhjb25zdCBDb21wbGV4ICYpOwoKICAgICAgICAgICAoaWkpIE9wZXJhdG9ycyBhcmUgd3JhcHBlZCAqZXhhY3RseSogbGlrZSBub3JtYWwgZnVuY3Rpb25zCiAgICAgICAgICAgYW5kIG1ldGhvZHMuICBJbnRlcm5hbGx5LCB0aGUgb3BlcmF0b3IgbmFtZSBpcyB1c2VkIAogICAgICAgICAgIGRpcmVjdGx5IG1lYW5pbmcgdGhhdCB0aGUgd3JhcHBlciBjb2RlIG1pZ2h0IGNvbnRhaW4KICAgICAgICAgICBzdGF0ZW1lbnRzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBhcmcwLT5vcGVyYXRvciooKENvbXBsZXggY29uc3QgJikqYXJnMSk7CgogICAgICAgICAgIFRoaXMgYWxsIHNlZW1zIHRvIHBhcnNlIGFuZCBjb21waWxlIGNvcnJlY3RseSAoYXQgbGVhc3QKICAgICAgICAgICBvbiBteSBtYWNoaW5lKS4KCiAgICAgICAgICAgKGlpaSkgU1dJRyB3aWxsIG5vIGxvbmdlciB3cmFwIGEgZGVjbGFyYXRpb24gaWYgaXRzIHN5bWJvbAogICAgICAgICAgIHRhYmxlIG5hbWUgY29udGFpbnMgaWxsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMuICBJZgogICAgICAgICAgIGlsbGVnYWwgY2hhcmFjdGVycyBhcmUgZGV0ZWN0ZWQsIHlvdSB3aWxsIHNlZSBhbiBlcnJvcgogICAgICAgICAgIGxpa2UgdGhpczoKIAogICAgICAgICAgICAgICAgV2FybmluZy4gQ2FuJ3Qgd3JhcCBvcGVyYXRvciogdW5sZXNzIHJlbmFtZWQgdG8gYSB2YWxpZCBpZGVudGlmaWVyLgoKICAgICAgICAgICBUaGUgb25seSB3YXkgdG8gZml4IHRoaXMgaXMgdG8gdXNlICVyZW5hbWUgb3IgJW5hbWUgdG8gYmluZAogICAgICAgICAgIHRoZSBvcGVyYXRvciB0byBhIG5pY2UgbmFtZSBsaWtlICJhZGQiIG9yIHNvbWV0aGluZy4gTm90ZToKICAgICAgICAgICB0aGUgbGVnYWwgaWRlbnRpZmllciBjaGFyYWN0ZXJzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSB0YXJnZXQKICAgICAgICAgICBsYW5ndWFnZS4KCiAgICAgICAgICAgVGhlcmUgYXJlIGNlcnRhaW4gaXNzdWVzIHdpdGggZnJpZW5kIGZ1bmN0aW9ucyBhbmQgb3BlcmF0b3JzLgogICAgICAgICAgIFNvbWV0aW1lcywgZnJpZW5kcyBhcmUgdXNlZCB0byBkZWZpbmUgbWl4ZWQgb3BlcmF0b3JzIHN1Y2gKICAgICAgICAgICBhcyBhZGRpbmcgYSBDb21wbGV4IGFuZCBhIGRvdWJsZSB0b2dldGhlci4gIEN1cnJlbnRseSwgU1dJRwogICAgICAgICAgIGlnbm9yZXMgYWxsIGZyaWVuZCBkZWNsYXJhdGlvbnMgaW4gYSBjbGFzcy4gIEEgZ2xvYmFsIG9wZXJhdG9yCiAgICAgICAgICAgZGVjbGFyYXRpb24gY2FuIHByb2JhYmx5IGJlIG1hZGUgdG8gd29yaywgYnV0IHlvdSdsbCBoYXZlIHRvCiAgICAgICAgICAgcmVuYW1lIGl0IGFuZCBpdCBwcm9iYWJseSB3b24ndCB3b3JrIHZlcnkgY2xlYW5seSBpbiB0aGUKICAgICAgICAgICB0YXJnZXQgbGFuZ3VhZ2Ugc2luY2UgaXQncyBub3QgYSBjbGFzcyBtZW1iZXIuCgogICAgICAgICAgIFNXSUcgZG9lc24ndCBrbm93IGhvdyB0byBoYW5kbGUgb3BlcmF0b3Igc3BlY2lmaWNhdGlvbnMgCiAgICAgICAgICAgc29tZXRpbWVzIHVzZWQgZm9yIGF1dG9tYXRpYyB0eXBlIGNvbnZlcnNpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICBjbGFzcyBTdHJpbmcgewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIG9wZXJhdG9yIGNvbnN0IGNoYXIqKCk7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgfTsKCiAgICAgICAgICAgKHRoaXMgZG9lc24ndCBwYXJzZSBjb3JyZWN0bHkgYW5kIGdlbmVyYXRlcyBhIHN5bnRheCBlcnJvcikuCgogICAgICAgICAgIEFsc286IG9wZXJhdG9ycyBubyBsb25nZXIgc2hvdyB1cCBhcyBzZXBhcmF0ZSBwYXJzZS10cmVlCiAgICAgICAgICAgbm9kZXMgKGluc3RlYWQgdGhleSBhcmUgbm9ybWFsICdjZGVjbCcgbm9kZXMpLiAgSSBtYXkKICAgICAgICAgICBzZXBhcmF0ZSB0aGVtIGFzIGEgc3BlY2lhbCBjYXNlIGxhdGVyLgoKICAgICAgICAgICBTZWUgRXhhbXBsZXMvcHl0aG9uL29wZXJhdG9yIGZvciBhbiBleGFtcGxlLgoKICAgICAgICAgICAqKiogU1VQRVItRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKVmVyc2lvbiAxLjMuOSAoU2VwdGVtYmVyIDI1LCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzI1LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwYXJzaW5nIHByb2JsZW0gd2l0aCB0eXBlIGRlY2xhcmF0aW9ucyBsaWtlIAogICAgICAgICAgICdjaGFyICoqIGNvbnN0Jy4gIFNXSUcgcGFyc2VkIHRoaXMgY29ycmVjdGx5LCBidXQgdGhlCiAgICAgICAgICAgaW50ZXJuYWwgdHlwZSB3YXMgcmVwcmVzZW50ZWQgaW5jb3JyZWN0bHkgKHRoZSBwb2ludGVycwogICAgICAgICAgIGFuZCBxdWFsaWZpZXJzIHdlcmUgaW4gdGhlIHdyb25nIG9yZGVyKS4KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIFdpdGhkcmV3IGV4cGVyaW1lbnRhbCBmZWF0dXJlIChub3RlZCBiZWxvdykgdGhhdCB3YXMKICAgICAgICAgICBjYXVzaW5nIHNlcmlvdXMgcGFyc2luZyBwcm9ibGVtcy4KClZlcnNpb24gMS4zLjggKFNlcHRlbWJlciAyMywgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgaW1wcm92ZWQgZGlzdHV0aWxzIHNldHVwLnB5IGZpbGUgaW4gdGhlIFRvb2xzIAogICAgICAgICAgIGRpcmVjdG9yeSAobG9vayBmb3IgdGhlIHNldHVwLnB5LnRtcGwgZmlsZSkuICBDb250cmlidXRlZCBieQogICAgICAgICAgIFRvbnkgU2V3YXJkLgoKOS8yMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgSW5jbHVkZWQgdHdvIG5ldyBSUE0gc3BlYyBmaWxlcyBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5LiBDb250cmlidXRlZAogICAgICAgICAgIGJ5IFRvbnkgU2V3YXJkIGFuZCBVd2UgU3RlaW5tYW5uLgogIAo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYzNjM1IF0gUGVybDUuc3dnIGRvZXMgbm90IGNvbXBpbGUgaW4gVmlzdWFsIEMrKwoKOS8yMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVHdvIG5ldyBkaXJlY3RpdmVzIGNvbnRyb2wgdGhlIGNyZWF0aW9uIG9mIGRlZmF1bHQKICAgICAgICAgICBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzOgoKICAgICAgICAgICAgICAgICVub2RlZmF1bHQKICAgICAgICAgICAgICAgICVtYWtlZGVmYXVsdAoKICAgICAgICAgICBUaGVzZSByZXBsYWNlICVwcmFnbWEgbm9kZWZhdWx0IGFuZCAlcHJhZ21hIG1ha2VkZWZhdWx0LgogICAgICAgICAgIChvbGQgY29kZSB3aWxsIHN0aWxsIHdvcmssIGJ1dCBkb2N1bWVudGF0aW9uIHdpbGwgb25seQogICAgICAgICAgIGRlc2NyaWJlIHRoZSBuZXcgZGlyZWN0aXZlcykuCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBCdWcgWyAjNDYyMzU0IF0gJWltcG9ydCBicm9rZW4gaW4gMS4zLjcuCgo5LzIwLzIwMDE6IGJlYXpsZXkKCiAgICAgICAgICAgUGFyc2VyIG1vZGlmaWVkIHRvIGlnbm9yZSBvdXQtb2YtY2xhc3MgY29uc3RydWN0b3IKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvciBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGlubGluZSBGb286OkZvbygpIDoKICAgICAgICAgICAgICAgICAgICBCYXIoImZvbyIpCiAgICAgICAgICAgICAgIHsgCiAgICAgICAgICAgICAgIH0gCgogICAgICAgICAgICAgICBpbmxpbmUgRm9vOjp+Rm9vKCkgewogICAgICAgICAgICAgICB9CgogICAgICAgICAgIFN1Z2dlc3RlZCBieSBKYXNvbiBTdGV3YXJ0LgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gaWdub3JlIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MKICAgICAgICAgICBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFYsIGxvbmcgUz4gY2xhc3MgTWFwSXRlcjsKCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IGFuIGVtYWlsIGV4YW1wbGUgZnJvbSBJcmluYSBLb3Rsb3ZhLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHVuZGVjbGFyZWQgdGNsX3Jlc3VsdCB2YXJpYWJsZSBpbiAKICAgICAgICAgICB0aGUgIm91dCIgdHlwZW1hcCBmb3IgVGNsLiAgUmVwb3J0ZWQgYnkgU2hhdW4gTG93cnkuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNvcnBvcmF0ZWQgY2hhbmdlcyB0byBtYWtlIFNXSUcgd29yayB3aXRoIEFjdGl2ZVBlcmwuICAKICAgICAgICAgICBDb250cmlidXRlZCBieSBKb2VsIFJlZWQuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwYXJzaW5nIG9mIEMrKyBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgRm9vKCkgOiBCYXIoLi4uKSB7Li4ufQogICAgICAgICAgIH07CgogICAgICAgICAgIFNXSUcgbm93IGRpc2NhcmRzIHRoZSBjb250ZW50cyBvZiB0aGUgKC4uLikgcmVnYXJkbGVzcyBvZiAKICAgICAgICAgICB3aGF0IG1pZ2h0IGVuY2xvc2VkIChldmVuIGlmIHN5bnRhY3RpY2FsbHkgd3JvbmcpLiAgU1dJRwogICAgICAgICAgIGRvZXNuJ3QgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGFuZCB0aGVyZSBpcyBubyByZWFzb24gdG8KICAgICAgICAgICBuZWVkbGVzcyBhZGQgc3ludGF4IHJ1bGVzIHRvIGhhbmRsZSBhbGwgb2YgdGhlIHBvc3NpYmlsaXRpZXMKICAgICAgICAgICBoZXJlLgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHR5cGVtYXBzIGZvciBzdHJ1Y3R1cmUgbWVtYmVycy4gIElmIHlvdSBoYXZlIGEKICAgICAgICAgICBzdHJ1Y3R1cmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgIGludCAqYmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBtZW1iZXIgbmFtZSAnYmFyJyBpcyBub3cgdXNlZCBpbiBhbnkgYWNjZXNzb3IgZnVuY3Rpb25zLgogICAgICAgICAgIFRoaXMgYWxsb3dzIHRoZSAiaW4iIHR5cGVtYXAgdG8gYmUgdXNlZCB3aGVuIHNldHRpbmcgdGhlIHZhbHVlLgogICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIHR5cGVtYXAKCiAgICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixpbikgaW50ICpiYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgbm93IG1hdGNoZXMgVmVjdG9yOjpiYXIuICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIHdpbGwgYWxzbwogICAgICAgICAgIG1hdGNoIGFueSBmdW5jdGlvbiB3aXRoIGFuIGFyZ3VtZW50IG9mICJpbnQgKmJhciIgKHNvIHlvdSBzaG91bGQKICAgICAgICAgICBiZSBjYXJlZnVsKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUuIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjY0MiBzZXR0aW5nIHN0cmluZyB2YWx1ZXMgaW4gc3RydWN0dXJlcwoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjIzOTggcHJvYmxlbSB3aXRoIG5lc3RlZCB0ZW1wbGF0ZXMuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MTYyNiBwcm9ibGVtIHdpdGggZm9ybWF0dGluZyBhbmQgQysrIGNvbW1lbnRzLgogICAgICAgICAgICAKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NjI4NDUgV3Jvbmcgb3duZXJzaGlwIG9mIHJldHVybmVkIG9iamVjdHMuCiAgICAgICAgICAgCjkvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDU5MzY3LiAgRGVmYXVsdCBjb25zdHJ1Y3RvcnMgZm9yIGNsYXNzZXMKICAgICAgICAgICB3aXRoIHB1cmUgdmlydHVhbCBtZXRob2RzLgoKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBjbGFzcyBzY29wZS4gIEZvcgogICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGVudW0gYmFyIHsgRk9PLCBCQVIgfTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhciBiID0gRk9PKTsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU1dJRyBub3cgY29ycmVjdGx5IGdlbmVyYXRlcyBhIGRlZmF1bHQgdmFsdWUgb2YgIkZvbzo6Rk9PIiBmb3IKICAgICAgICAgICB0aGUgYmxhaCgpIG1ldGhvZCBhYm92ZS4gIFRoaXMgdXNlZCB0byB3b3JrIGluIDEuMSwgYnV0IHdhcwogICAgICAgICAgIGJyb2tlbiBpbiAxLjMuNy4gICBCdWcgcmVwb3J0ZWQgYnkgTWlrZSBSb21iZXJnLgoKVmVyc2lvbiAxLjMuNyAgKFNlcHRlbWJlciAzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzcGVjaWFsICVpZ25vcmUgZGlyZWN0aXZlIHRvIGlnbm9yZSBkZWNsYXJhdGlvbnMuICBUaGlzCiAgICAgICAgICAgZmVhdHVyZSB3b3JrcyBleGFjdGx5IGxpa2UgJXJlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgIGZvbzsgICAgICAgIC8vIElnbm9yZSBhbGwgZGVjbGFyYXRpb25zIGZvbwogICAgICAgICAgICAgJWlnbm9yZSAgOjpmb287ICAgICAgLy8gT25seSBpZ25vcmUgZm9vIGluIGdsb2JhbCBzY29wZQogICAgICAgICAgICAgJWlnbm9yZSAgU3BhbTo6Zm9vOyAgLy8gT25seSBpZ25vcmUgaW4gY2xhc3MgU3BhbQogICAgICAgICAgICAgJWlnbm9yZSAgKjo6Zm9vOyAgICAgLy8gSWdub3JlIGluIGFsbCBjbGFzc2VzCgogICAgICAgICAgICVpZ25vcmUgY2FuIGFsc28gYmUgcGFyYW1ldGVyaXplZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICVpZ25vcmUgZm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIDo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlIFNwYW06OmZvbyhpbnQpOwogICAgICAgICAgICAgJWlnbm9yZSAqOjpmb28oaW50KTsKCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgICAKCjkvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIHNoYWRvd2NvZGUgcHJhZ21hIG1vZGlmaWVkIHNvIHRoYXQgdGhlIGNvZGUgdGhhdCBpcyBvdXRwdXQgCiAgICAgICAgICAgaW4gdGhlIHNoYWRvdyBmaWxlIGlzIHBsYWNlZCByZWxhdGl2ZSB0byB3aGVyZSBpdCBpcyBwbGFjZWQgaW4gdGhlIAogICAgICAgICAgIGMvYysrIGNvZGUuIFRoaXMgYWxsb3dzIHN1cHBvcnQgZm9yIEphdmFEb2MgZnVuY3Rpb24gY29tbWVudHMuIAoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgUGF0Y2ggWyAjNDQ3NzkxIF0gRml4IGZvciBweXRob24gLWludGVyZmFjZSBvcHRpb24uCiAgICAgICAgICAgU3VibWl0dGVkIGJ5IFRhcm4gV2Vpc25lciBCdXJ0b24uCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMKICAgICAgICAgICBmb3IgYSBjbGFzcyBpZiBpdCBvbmx5IGRlZmluZXMgYSBwcml2YXRlL3Byb3RlY3RlZCBjb25zdHJ1Y3RvcgogICAgICAgICAgIG9yIGRlc3RydWN0b3Igb3IgaWYgYW55IG9uZSBvZiBpdHMgYmFzZSBjbGFzc2VzIG9ubHkgaGFzCiAgICAgICAgICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMuICBUaGlzIHdhcyByZXBvcnRlZCBpbgogICAgICAgICAgIFNGIFBhdGNoIFsgIzQ0NDI4MSBdIG5vbnB1YmxpYy9kZWZhdWx0L2luaGVyZXRlZCBjdG9yL2R0b3IKICAgICAgICAgICBieSBNYXJjZWxvIE1hdHVzLgoKOS8wMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gUGVybDUgbW9kdWxlIHRoYXQgYWxsb3dzIGNvbnN0YW50cyB0byBiZQogICAgICAgICAgIHdyYXBwZWQgYXMgY29uc3RhbnRzIHRoYXQgZG9uJ3QgcmVxdWlyZSB0aGUgbGVhZGluZyAkLgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBlbmFibGVkIHVzaW5nIHRoZSAtY29uc3Qgb3B0aW9uLgogICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IFJpY2ggV2FsZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciB0aGUgJ3ZvbGF0aWxlJyB0eXBlIHF1YWxpZmllci4KICAgICAgICAgICB2b2xhdGlsZSBkb2Vzbid0IG1lYW4gYW55dGhpbmcgdG8gU1dJRywgYnV0IGl0IGlzCiAgICAgICAgICAgbmVlZGVkIHRvIHByb3Blcmx5IGdlbmVyYXRlIHByb3RvdHlwZXMgZm9yIGRlY2xhcmF0aW9ucwogICAgICAgICAgIHRoYXQgdXNlIGl0LiAgSXQncyBhbHNvIGJlZW4gYWRkZWQgdG8gbWFrZSB0aGUgU1dJRyB0eXBlCiAgICAgICAgICAgc3lzdGVtIG1vcmUgY29tcGxldGUuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCAlcmVuYW1lIGRpcmVjdGl2ZS4gICoqKiBUaGlzCiAgICAgICAgICAgbmV3IGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gZ3JlYXRseSBzaW1wbGlmeSB0aGUgdGFzayBvZgogICAgICAgICAgIHJlc29sdmluZyBvdmVybG9hZGVkIG1ldGhvZHMgYW5kIGZ1bmN0aW9ucy4gKioqCiAgICAgICAgICAgCiAgICAgICAgICAgSW4gcHJpb3IgdmVyc2lvbnMgb2YgU1dJRywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIHdhcwogICAgICAgICAgIHVzZWQgdG8gY29uc2lzdGVudGx5IGFwcGx5IGFuIGlkZW50aWZpZXIgcmVuYW1pbmcuIEZvciAKICAgICAgICAgICBleGFtcGxlLCBpZiB5b3Ugc2FpZCB0aGlzOgoKICAgICAgICAgICAgICAgICVyZW5hbWUgZm9vIGJhcjsKCiAgICAgICAgICAgRXZlcnkgb2NjdXJyZW5jZSBvZiAnZm9vJyB3b3VsZCBiZSByZW5hbWVkIHRvICdiYXInLiAKICAgICAgICAgICBBbHRob3VnaCB0aGlzIHdvcmtzIGZpbmUgZm9yIHJlc29sdmluZyBhIGNvbmZsaWN0IHdpdGggYQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSByZXNlcnZlZCB3b3JkLCBpdCBpcyB1c2VsZXNzIGZvcgogICAgICAgICAgIGZvciBkZWFsaW5nIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzLiAgICBUaGlzIGlzIGJlY2F1c2UKICAgICAgICAgICBhbGwgbWV0aG9kcyBhcmUgc2ltcGx5IHJlbmFtZWQgdG8gdGhlIHNhbWUgdGhpbmcgCiAgICAgICAgICAgKGdlbmVyYXRpbmcgdGhlIHNhbWUgY29uZmxpY3QgYXMgYmVmb3JlKS4KCiAgICAgICAgICAgVGhlcmVmb3JlLCB0aGUgb25seSB3YXkgdG8gZGVhbCB3aXRoIG92ZXJsb2FkZWQgbWV0aG9kcwogICAgICAgICAgIHdhcyB0byBnbyB0aHJvdWdoIGFuZCBpbmRpdmlkdWFsbHkgcmVuYW1lIHRoZW0gYWxsIHVzaW5nCiAgICAgICAgICAgJW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRvIG1ha2UgbWF0dGVycyB3b3JzZSwgeW91IGhhZCB0byBkbyB0aGlzIGZvciBhbGwKICAgICAgICAgICBkZXJpdmVkIGNsYXNzZXMgdG9vLgoKICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKHZvaWQpOwogICAgICAgICAgICAgICAgICVuYW1lKGJhcl9pKSB2aXJ0dWFsIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICBOZWVkbGVzcyB0byBzYXksIHRoaXMgbWFrZXMgaXQgZXh0cmVtZWx5IGhhcmQgdG8gcmVzb2x2ZQogICAgICAgICAgIG92ZXJsb2FkaW5nIHdpdGhvdXQgYSBsb3Qgb2Ygd29yayBhbmQgbWFrZXMgaXQgYWxtb3N0CiAgICAgICAgICAgaW1wb3NzaWJsZSB0byB1c2UgU1dJRyBvbiByYXcgQysrIC5oIGZpbGVzLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgJXJlbmFtZSBub3cgYWNjZXB0cyBwYXJhbWV0ZXIgZGVjbGFyYXRvcnMuCiAgICAgICAgICAgVGhlIHN5bnRheCBoYXMgYWxzbyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICB0aGUgZm9sbG93aW5nIGRlY2xhcmF0aW9uIHJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXIoaW50KScKICAgICAgICAgICB0byAnYmFyX2knLCBsZWF2aW5nIGFueSBvdGhlciBvY2N1cnJlbmNlIG9mICdiYXInIGFsb25lLgoKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIGJhcihpbnQpOwoKICAgICAgICAgICBVc2luZyB0aGlzIGZlYXR1cmUsIHlvdSBjYW4gbm93IHNlbGVjdGl2ZWx5IHJlbmFtZSAKICAgICAgICAgICBjZXJ0YWluIGRlY2xhcmF0aW9ucyBpbiBhZHZhbmNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9kKSBiYXIoZG91YmxlKTsKCiAgICAgICAgICAgICAvLyBJbmNsdWRlIHJhdyBDKysgaGVhZGVyICAgIAogICAgICAgICAgICAgJWluY2x1ZGUgImhlYWRlci5oIgoKICAgICAgICAgICBXaGVuICVyZW5hbWUgaXMgdXNlZCBpbiB0aGlzIG1hbm5lciwgYWxsIG9jY3VycmVuY2Ugb2YgYmFyKGludCkKICAgICAgICAgICBhcmUgcmVuYW1lZCB3aGVyZXZlciB0aGV5IG1pZ2h0IG9jY3VyLiAgTW9yZSBjb250cm9sIGlzIG9idGFpbmVkCiAgICAgICAgICAgdGhyb3VnaCBleHBsaWNpdCBxdWFsaWZpY2F0aW9uLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgOjpiYXIoaW50KTsKCiAgICAgICAgICAgb25seSBhcHBsaWVzIHRoZSByZW5hbWluZyBpZiBiYXIoaW50KSBpcyBkZWZpbmVkIGluIHRoZSBnbG9iYWwgc2NvcGUuCiAgICAgICAgICAgVGhlIGRlY2xhcmF0aW9uLAogICAgIAogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpIEZvbzo6YmFyKGludCk7CgogICAgICAgICAgIGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gYSBjbGFzcyBGb28uCiAgICAgICAgICAgVGhpcyBsYXR0ZXIgZm9ybSBhbHNvIHN1cHBvcnRzIGluaGVyaXRhbmNlLiAgVGhlcmVmb3JlLCBpZiB5b3UKICAgICAgICAgICBoYWQgYSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBjbGFzcyBTcGFtIDogcHVibGljIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIFNwYW06OmJhcihpbnQpIG1ldGhvZCB3b3VsZCBhbHNvIGJlIHJlbmFtZWQgKHNpbmNlIFNwYW0gCiAgICAgICAgICAgaXMgYSBzdWJjbGFzcyBvZiBGb28pLiAgIFRoaXMgbGF0dGVyIGZlYXR1cmUgbWFrZXMgaXQgZWFzeQogICAgICAgICAgIGZvciBTV0lHIHRvIGFwcGx5IGEgY29uc2lzdGVudCByZW5hbWluZyBhY3Jvc3MgYW4gZW50aXJlCiAgICAgICAgICAgY2xhc3MgaGllcmFyY2h5IHNpbXBseSBieSBzcGVjaWZ5aW5nIHJlbmFtaW5nIHJ1bGVzIGZvcgogICAgICAgICAgIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICBBIGNsYXNzIHdpbGRjYXJkIG9mICogY2FuIGJlIHVzZWQgaWYgeW91IHdhbnQgdG8gcmVuYW1pbmcKICAgICAgICAgICBhbGwgbWF0Y2hpbmcgbWVtYmVycyBvZiBhbGwgY2xhc3Nlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSAqOjpiYXIoaW50KTsKCiAgICAgICAgICAgd2lsbCByZW5hbWUgYWxsIG1lbWJlcnMgYmFyKGludCkgdGhhdCBhcmUgZGVmaW5lZCBpbiBjbGFzc2VzLgogICAgICAgICAgIEl0IHdpbGwgbm90IHJlbmFtZWQgZGVmaW5pdGlvbnMgb2YgYmFyKGludCkgaW4gdGhlIGdsb2JhbAogICAgICAgICAgIHNjb3BlLgoKICAgICAgICAgICBUaGUgb2xkIHVzZSBvZiAlcmVuYW1lIGlzIHN0aWxsIHN1cHBvcnRlZCwgYnV0IGlzIHNvbWV3aGF0CiAgICAgICAgICAgZW5oYW5jZWQuICAKCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pIGJhcjsgICAgICAvLyBSZW5hbWVzIGFsbCBvY2N1cnJlbmNlcyBvZiAnYmFyJy4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgOjpiYXI7ICAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gZ2xvYmFsIHNjb3BlIG9ubHkuCiAgICAgICAgICAgICAgJXJlbmFtZShmb28pICo6OmJhcjsgICAvLyBSZW5hbWUgYWxsICdiYXInIGluIGNsYXNzZXMgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgRm9vOjpiYXI7IC8vIFJlbmFtZSBhbGwgJ2JhcicgZGVmaW5lZCBpbiBjbGFzcyBGb28uCgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGRhdGEtbWVtYmVyIHRvIG1lbWJlci1mdW5jdGlvbiAKICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbi4gIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdSBoYWQgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5vdyBzdXBwb3NlIHRoYXQgeW91IHdhbnRlZCB0byBhY2Nlc3MgeCBhbmQgeSAKICAgICAgICAgICB0aHJvdWdoIGEgbWVtYmVyIGZ1bmN0aW9uIGludGVyZmFjZSBpbnN0ZWFkIAogICAgICAgICAgIG9mIHRoZSB1c3VhbCBTV0lHIGJlaGF2aW9yLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgZi5zZXRfeCgzLjQpICAgICAgIyBpbnN0ZWFkIG9mIGYueCA9IDMuNAogICAgICAgICAgICAgIHggPSBmLmdldF94KCkgICAgICMgaW5zdGVhZCBvZiB4ID0gZi54CgogICAgICAgICAgIFRvIGRvIHRoaXMsIHNpbXBseSB1c2UgdGhlIG5ldyAlYXR0cmlidXRlZnVuYwogICAgICAgICAgIGRpcmVjdGl2ZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXRfJXMsc2V0XyVzKQogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgIGRvdWJsZSB4LHk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAlbm9hdHRyaWJ1dGVmdW5jCgogICAgICAgICAgIFRoZSBhcmd1bWVudHMgdG8gJWF0dHJpYnV0ZWZ1bmMgYXJlIEMtc3R5bGUgcHJpbnRmCiAgICAgICAgICAgZm9ybWF0IHN0cmluZ3MgdGhhdCBkZXRlcm1pbmUgdGhlIG5hbWluZyBjb252ZW50aW9uCiAgICAgICAgICAgdG8gdXNlLiAgJXMgaXMgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIG5hbWUgb2YgdGhlCiAgICAgICAgICAgZGF0YSBtZW1iZXIuIFNXSUcgcHJvdmlkZXMgYSBudW1iZXIgb2YgcHJpbnRmCiAgICAgICAgICAgZXh0ZW5zaW9ucyB0aGF0IG1pZ2h0IGhlbHAuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICAgd2FudGVkIHRvIHRpdGxlIGNhc2UgYWxsIG9mIHRoZSBhdHRyaWJ1dGVzLCB5b3UKICAgICAgICAgICBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAlYXR0cmlidXRlZnVuYyhnZXQlKHRpdGxlKXMsc2V0JSh0aXRsZSlzKTsKCiAgICAgICAgICAgVGhpcyB3aWxsIHR1cm4gYW4gYXR0cmlidXRlICdiYXInIHRvICdnZXRCYXIoKScgYW5kICdzZXRCYXIoKScuCgogICAgICAgICAgIChzb21lb25lIHJlcXVlc3RlZCB0aGlzIGxvbmcgYWdvLCBidXQgSSBmaW5hbGx5IGZpZ3VyZWQKICAgICAgICAgICBob3cgdG8gaW1wbGVtZW50IGl0IGluIGEgc3RyYWlnaHRmb3J3YXJkIG1hbm5lcikuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgZGVmYXVsdCBjb25zdHJ1Y3RvcnMKICAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgaWYgbm9uZSBhcmUgZGVmaW5lZC4gIFRoaXMgdXNlZCB0byBiZQogICAgICAgICAgIGVuYWJsZWQgd2l0aCBhIGNvbW1hbmQgbGluZSBzd2l0Y2ggLW1ha2VfZGVmYXVsdCwgYnV0CiAgICAgICAgICAgbW9zdCBwZW9wbGUgd2FudCB0aGVzZSBmdW5jdGlvbnMgYW55d2F5cy4gIFRvIHR1cm4KICAgICAgICAgICBvZmYgdGhpcyBiZWhhdmlvciB1c2UgdGhlIC1ub19kZWZhdWx0IG9wdGlvbiBvciBpbmNsdWRlCiAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW4gdGhlIGludGVyZmFjZSBmaWxlOgogCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0OwogIAogICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGNlcnRhaW4gaW50ZXJmYWNlcyB0aGF0IGRlZmluZWQgdGhlaXIKICAgICAgICAgICBvd24gY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIHVzaW5nIHRoZSBzYW1lIG5hbWluZwogICAgICAgICAgIGNvbnZlbnRpb24gYXMgU1dJRy4gIElmIHNvLCB5b3Ugd2lsbCBnZXQgZHVwbGljYXRlCiAgICAgICAgICAgc3ltYm9scyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIFBlcmw1IHNoYWRvdyBjbGFzcyBjb2RlIGdlbmVyYXRpb24uICBJdGVyYXRvcnMKICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCAoRklSU1RLRVksIE5FWFRLRVkpLiAgQWxzbywgYXR0cmlidXRlCiAgICAgICAgICAgYWNjZXNzIGhhcyBiZWVuIGNoYW5nZWQgdG8gcmVseSBvbiBpbmhlcml0YW5jZSBpbiBvcmRlcgogICAgICAgICAgIHRvIHByb3ZpZGUgYmV0dGVyIGJlaGF2aW9yIGFjcm9zcyBtb2R1bGVzLiAgCgo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBWYXJpb3VzIG9ic2N1cmUgaW1wcm92ZW1lbnRzIHRvIHRoZSB0eXBlIHN5c3RlbSBhbmQgY2xhc3Nlcy4KICAgICAgICAgICBTdHJhbmdlIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMgYXJlIG5vdyB3cmFwcGVkIGNvcnJlY3RseQogICAgICAgICAgIChpLmUuLCB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSBkb2Vzbid0IGNhdXNlIHRoZSBDKysKICAgICAgICAgICAgY29tcGlsZXIgdG8gZGllIHdpdGggYSB0eXBlIGVycm9yKS4KCiAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBSZWFsOwogICAgICAgICAgICAgICAgIFJlYWwgZm9vKFJlYWwgKCpvcCkoUmVhbCxSZWFsKSwgUmVhbCB4LCBSZWFsIHkpOwogICAgICAgICAgICB9OwoKICAgICAgICAgICBJbmhlcml0YW5jZSBvZiB0eXBlcyBpcyBhbHNvIGhhbmRsZWQgY29ycmVjdGx5LgogICAgICAgICAgIAo4LzI4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2VzIHRvIGNsYXNzIHdyYXBwZXJzLiAgIFdoZW4gU1dJRyBzZWVzIHR3byBjbGFzc2VzIGxpa2UgdGhpcywKIAogICAgICAgICAgIGNsYXNzIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBjbGFzcyBZIDogcHVibGljIFggewogICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIHZvaWQgYmFyKCk7CiAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9CiAKICAgICAgICAgICBpdCBub3cgb25seSBnZW5lcmF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zOgogCiAgICAgICAgICAgICBYX2ZvbyhYICp4KSB7IHgtPmZvbygpOyB9CiAgICAgICAgICAgICBZX2JhcihZICp5KSB7IHktPmJhcigpOyB9CiAKICAgICAgICAgICBVbmxpa2UgU1dJRzEuMTUsIHRoZSBmb28oKSBtZXRob2QgZG9lcyAqbm90KiBwcm9wYWdhdGUgdG8gYSB3cmFwcGVyCiAgICAgICAgICAgZnVuY3Rpb24gWV9mb28oKS4gSW5zdGVhZCwgdGhlIGJhc2UgY2xhc3MgbWV0aG9kIFhfZm9vKCkgbXVzdCBiZQogICAgICAgICAgIHVzZWQuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IG1vZHVsZXMgdGhhdCB1c2Ugc2hhZG93IGNsYXNzZXMsIGJ1dAogICAgICAgICAgIGl0IG1pZ2h0IGJyZWFrIG1vZHVsZXMgdGhhdCBkaXJlY3RseSB1c2UgdGhlIGxvdy1sZXZlbCBDIHdyYXBwZXJzLgogICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGJlaW5nIG1hZGUgZm9yIGEgbnVtYmVyIG9mIHJlYXNvbnM6CgogICAgICAgICAgICAgICAtICBJdCBncmVhdGx5IHNpbXBsaWZpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIFNXSUctLWVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgd2l0aCBhbnRpY2lwYXRlZCBmdXR1cmUgY2hhbmdlcyBzdWNoIGFzIG92ZXJsb2FkZWQgbWV0aG9kcy4KCiAgICAgICAgICAgICAgIC0gIEl0IHJlc3VsdHMgaW4gc3Vic3RhbnRpYWxseSBsZXNzIHdyYXBwZXIgY29kZS0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICBmb3IgYmlnIEMrKyBjbGFzcyBoaWVyYXJjaGllcyAoaW5oZXJpdGVkIGRlY2xhcmF0aW9ucwogICAgICAgICAgICAgICAgICBhcmUgbm8gbG9uZ2VyIGNvcGllZCBpbnRvIGV2ZXJ5IHNpbmdsZSBkZXJpdmVkIGNsYXNzKS4KCiAgICAgICAgICAgICAgIC0gIEl0IGFsbG93cyBmb3IgYmV0dGVyIGNvZGUgZ2VuZXJhdGlvbiBhY3Jvc3MgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcyAoY29kZSBpc24ndCByZXBsaWNhdGVkIGluCiAgICAgICAgICAgICAgICAgIGV2ZXJ5IHNpbmdsZSBtb2R1bGUpLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgUHJvdmlkZWQgc29tZSBXaW5kb3dzIGRvY3VtZW50YXRpb24gaW4gdGhlIFdpbiBkaXJlY3RvcnkgYW5kIHNvbWUKICAgICAgICAgICBWaXN1YWwgQysrIHByb2plY3QgZmlsZXMgZm9yIHJ1bm5pbmcgZXhhbXBsZXMgb24gV2luZG93cy4KCjgvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBIYW5kbGUgcmVuYW1lZCBvdmVybG9hZGVkIGZ1bmN0aW9ucyBwcm9wZXJseTsKCSAgIHRoYW5rcyB0byBNYXJjIFpvbnpvbiA8TWFyYy5ab256b25AdW5pdi1yZW5uZXMxLmZyPiBmb3IgdGhlCgkgICBwYXRjaC4gIFNlZSB0aGUgbmV3IHRlc3QgY2FzZSBuYW1lX2N4eC4KCjgvMjcvMjAwMTogbWtvZXBwZQoJICAgW1RjbF0gUmVtb3ZlZCBsb3RzIG9mIHdhcm5pbmdzIGlzc3VlZCBieSB0aGUgU3VuIEZvcnRlCgkgICBjb21waWxlcnMsIHdoaWNoIHdlcmUgY2F1c2VkIGJ5IG1peGluZyBmdW5jdGlvbiBwb2ludGVycwoJICAgb2YgZGlmZmVyZW50IGxpbmthZ2VzIChDKysvQykuIAoKOC8yMy8yMDAxOiBta29lcHBlCgkgICBJbXByb3ZlZCB0aGUgTXpTY2hlbWUgbW9kdWxlIGJ5IHBvcnRpbmcgR3VpbGUncyBwb2ludGVyCgkgICB0eXBlIGNoZWNraW5nIHN5c3RlbSBhbmQgbWFraW5nIHR5cGUgZGlzcGF0Y2gKCSAgIHR5cGVtYXAtZHJpdmVuLiAKCjgvMjIvMjAwMTogYmVhemxleQogICAgICAgICAgIEVudGlyZWx5IG5ldyBzeW1ib2wgdGFibGUgcHJvY2Vzc2luZy4gICBTV0lHIHNob3VsZCBiZSBhYmxlIHRvCiAgICAgICAgICAgcmVwb3J0IG11Y2ggYmV0dGVyIGVycm9yIG1lc3NhZ2VzIGZvciBtdWx0aXBsZSBkZWNsYXJhdGlvbnMuIAogICAgICAgICAgIEFsc28sIHRoZSBuZXcgc3ltYm9sIHRhYmxlIGFsbG93cyBmb3Igb3ZlcmxvYWRlZCBmdW5jdGlvbnMKICAgICAgICAgICAoYWx0aG91Z2ggb3ZlcmxvYWRpbmcgaXNuJ3QgcXVpdGUgc3VwcG9ydGVkIGluIHRoZSBsYW5ndWFnZQogICAgICAgICAgIG1vZHVsZXMgeWV0KS4KCjgvMjIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gJW5ldyBzdXBwb3J0IGFkZGVkLgogICAgICAgICAgICogW0phdmFdIFBhY2thZ2UgSk5JIG5hbWUgcmVmaXhlZCEKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFB5dGhvbiBtb2R1bGUgbW9kaWZpZWQgdG8gc3VwcG9ydCBwb2ludGVycyB0byBDKysgbWVtYmVycy4gIFRoaXMKICAgICAgICAgICBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIGxpbWl0ZWQgcGFyc2luZyBhbmQgZnVsbCB0eXBlLXN5c3RlbSBzdXBwb3J0IGZvciBwb2ludGVycyB0bwogICAgICAgICAgIG1lbWJlcnMuIE5vbmUgb2YgU1dJRydzIGxhbmd1YWdlIG1vZHVsZXMgcmVhbGx5IGtub3cgaG93IHRvIGRlYWwgd2l0aAogICAgICAgICAgIHRoaXMgc28gdGhpcyBpcyByZWFsbHkgb25seSBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzIGFuZCBmdXR1cmUKICAgICAgICAgICBleHBhbnNpb24uICBOb3RlOiBTV0lHIGRvZXMgbm90IHN1cHBvcnQgcG9pbnRlcnMgdG8gbWVtYmVycyB3aGljaCAKICAgICAgICAgICBhcmUgdGhlbXNlbHZlcyBwb2ludGVycyB0byBtZW1iZXJzLCByZWZlcmVuY2VzIHRvIHBvaW50ZXJzIHRvIG1lbWJlcnMsCiAgICAgICAgICAgb3Igb3RoZXIgY29tcGxpY2F0ZWQgZGVjbGFyYXRpb25zIGxpa2UgdGhpcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIGlzIG11Y2ggYmV0dGVyIGF0IHBhcnNpbmcgY2VydGFpbiBDKysgZGVjbGFyYXRpb25zLiBPcGVyYXRvcnMgYW5kCiAgICAgICAgICAgZnJpZW5kcyBnZW5lcmFsbHkgZG9uJ3QgY2F1c2UgYW55bW9yZSBzeW50YXggZXJyb3JzLiAgSG93ZXZlciwgbmVpdGhlcgogICAgICAgICAgIGFyZSByZWFsbHkgc3VwcG9ydGVkLgoKOC8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgKmhpZ2hseSogZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIHdyYXBwaW5nIG9mIEMrKwogICAgICAgICAgIHRlbXBsYXRlIGRlY2xhcmF0aW9ucy4gIFNpbmNlIEMrKyB0ZW1wbGF0ZXMgYXJlIGVzc2VudGlhbGx5CiAgICAgICAgICAgZ2xvcmlmaWVkIG1hY3JvcyBhbmQgU1dJRyBoYXMgYSBmdWxseSBvcGVyYXRpb25hbCBDIAogICAgICAgICAgIHByZXByb2Nlc3NvciB3aXRoIG1hY3JvIHN1cHBvcnQsIHRoZSBwYXJzZXIgbm93IGNvbnZlcnRzCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zIHRvIG1hY3Jvcy4gIEZvciBleGFtcGxlLCBhIGZ1bmN0aW9uCiAgICAgICAgICAgdGVtcGxhdGUgbGlrZSB0aGlzCgogICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBUIG1heChUIGEsIFQgYik7CgogICAgICAgICAgIGlzIGludGVybmFsbHkgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAlZGVmaW5lICVfdGVtcGxhdGVfbWF4KF9fbmFtZSxUKQogICAgICAgICAgICAgICAlbmFtZShfX25hbWUpIFQgbWF4KFQgYSwgVCBiKTsKICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSBhIHZlcnNpb24gb2YgdGhlIHRlbXBsYXRlLCBhIHNwZWNpYWwgJXRlbXBsYXRlIGRlY2xhcmF0aW9uCiAgICAgICAgICAgaXMgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBtYXg8aW50PjsgICAgICAgICAgCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OwoKICAgICAgICAgICBUaGUgcGFyYW1ldGVyIHRvIHRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIG11c3QgYmUgcHJvcGVyIEMgaWRlbnRpZmllciB0aGF0J3MKICAgICAgICAgICB1c2VkIHRvIHVuaXF1ZWx5IG5hbWUgdGhlIHJlc3VsdGluZyBpbnN0YW50aWF0aW9uLiAgIFdoZW4gdXNlZCwgdGhlCiAgICAgICAgICAgdGhlIGV4cGFuZGVkIG1hY3JvIGxvb2tzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJW5hbWUobWF4aW50KSBpbnQgbWF4KGludCBhLCBpbnQgYik7CiAgICAgICAgICAgICAgJW5hbWUobWF4ZG91YmxlKSBkb3VibGUgbWF4KGRvdWJsZSBhLCBkb3VibGUgYik7CgogICAgICAgICAgIEEgc2ltaWxhciB0ZWNobmlxdWUgaXMgdXNlZCBmb3IgdGVtcGxhdGUgY2xhc3Nlcy4gICBGb3IgaW5zdGFuY2U6CgogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgVCAqZGF0YTsKICAgICAgICAgICAgICAgICBpbnQgc3o7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZlY3RvcihpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICBUICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgogICAgICAgICAgIEdldHMgY29udmVydGVkIGludG8gYSBtYWNybyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV92ZWN0b3IoX19uYW1lLCBUKQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8VD4gX19uYW1lOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgY2xhc3MgX19uYW1lIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgX19uYW1lKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB0eXBlZGVmIF9fbmFtZSB2ZWN0b3I8VD47CiAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICBBIHNwZWNpZmljIGluc3RhbnRpYXRpb24gaXMgY3JlYXRlZCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheToKCiAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjKSB2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgVGhlIHJlc3VsdGluZyBjb2RlIHBhcnNlZCBieSBTV0lHIGlzIHRoZW46CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWM7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBpbnR2ZWMgewogICAgICAgICAgICAgICAgICBpbnQgKmRhdGE7CiAgICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludHZlYyhpbnQgbml0ZW1zKTsKICAgICAgICAgICAgICAgICAgaW50ICpnZXQoaW50IG4pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgaW50dmVjIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBOb3RlOiB0aGUgbGFzdCB0eXBlZGVmIGlzIG5vbi1zdGFuZGFyZCBDIGFuZCBpcyB1c2VkIGJ5IFNXSUcgdG8gcHJvdmlkZQogICAgICAgICAgIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gdGhlIG5hbWUgImludHZlYyIgYW5kIHRoZSB0ZW1wbGF0ZSB0eXBlIAogICAgICAgICAgICJ2ZWN0b3I8aW50PiIuCgogICAgICAgICAgIENBVVRJT046ICBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGFuZCB0aGUgZmlyc3QgdGltZSBTV0lHIGhhcwogICAgICAgICAgIHN1cHBvcnRlZCBDKysgdGVtcGxhdGVzLiAgIEVycm9yIHJlcG9ydGluZyBpcyBlc3NlbnRpYWwgbm9uLWV4aXN0ZW50LgogICAgICAgICAgIEl0IHdpbGwgcHJvYmFibHkgYnJlYWsgaW4gY2VydGFpbiBjYXNlcy4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKioKCjgvMTUvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZSB0byB3cmFwcGluZyBvZiBtdWx0aS1kaW1lbnNpb25hbCBhcnJheXMuICBBcnJheXMKICAgICAgICAgICBhcmUgbm93IHByb3Blcmx5IG1hcHBlZCB0byBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKICAgICAgICAgICBvbmUgbGVzcyBkaW1lbnNpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBpbnQgWzEwXTsgICAgICAgICAgICAgIC0tPiAgaW50ICoKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXTsgICAgICAgICAgLS0+ICBpbnQgKCopWzIwXTsKICAgICAgICAgICAgICAgIGludCBbMTBdWzIwXVszMF07ICAgICAgLS0+ICBpbnQgKCopWzIwXVszMF07CgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBjZXJ0YWluIFNXSUcgZXh0ZW5zaW9ucyBiZWNhdXNlCiAgICAgICAgICAgb2xkZXIgdmVyc2lvbnMgc2ltcGx5IG1hcHBlZCBhbGwgYXJyYXlzIGludG8gYSBzaW5nbGUKICAgICAgICAgICBwb2ludGVyIHN1Y2ggYXMgImludCAqIi4gICBBbHRob3VnaCBwb3NzaWJseSB1bnVzdWFsLCAKICAgICAgICAgICB0aGUgbmV3IHZlcnNpb24gaXMgY29ycmVjdCBpbiB0ZXJtcyBvZiB0aGUgQyB0eXBlIHN5c3RlbS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgIAo4LzA2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogW0phdmFdIEFycmF5IHNldHRlcnMgZ2VuZXJhdGVkIGZvciBzdHJ1Y3QvY2xhc3MgYXJyYXkgbWVtYmVycy4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hbnkgaW1wcm92ZW1lbnRzIHRvIFRjbC9QZXJsL1B5dGhvbiBtb2R1bGVzIHRvIGJldHRlcgogICAgICAgICAgIHdvcmsgd2l0aCBtdWx0aXBsZSBpbnRlcmZhY2UgZmlsZXMgYW5kIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4KCjgvMTMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSBiZWhhdmlvciBvZiAlaW1wb3J0IGluIHRoZSBQeXRob24gbW9kdWxlLgogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIHBvbGx1dGVzIHRoZSBtb2R1bGUgbmFtZXNwYWNlIGJ5IHVzaW5nCiAgICAgICAgICAgJ2Zyb20gbW9kdWxlIGltcG9ydCAqJyB0byByZWZlciB0byB0aGUgb3RoZXIgbW9kdWxlLiAKICAgICAgICAgICBJbnN0ZWFkLCBpdCBkb2VzIGEgcHJvcGVyICdpbXBvcnQgbW9kdWxlJy4gICBBbHNvLCBTV0lHCiAgICAgICAgICAgbWF5IHdvcmsgYSBsb3QgYmV0dGVyIHdoZW4gaW1wb3J0aW5nIG1vZHVsZXMgdGhhdCBpbmNsdWRlCiAgICAgICAgICAgcmVmZXJlbmNlcyB0byBvdGhlciBpbXBvcnRlZCBtb2R1bGVzLgoKOC8xMy8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBuZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zLCBnZW5lcmFsaXppbmcgdGhvc2Ugb2YgdGhlCgkgICBHdWlsZS1zcGVjaWZpYyA1LzI3LzIwMDEgY2hhbmdlczogCgkgICAqICRkZXNjcmlwdG9yIGlzIHRoZSBzYW1lIGFzIFNXSUdUWVBFJG1hbmdsZSwgYnV0IGFsc28KCSAgICAgZW5zdXJlcyB0aGF0IHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhpcyBuYW1lIGdldHMKCSAgICAgZGVmaW5lZC4KCSAgICogJCp0eXBlLCAkKmx0eXBlLCAkKm1hbmdsZSwgJCpkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBzdGFyLCBidXQgdGhleSBSRU1PVkUgb25lIGxldmVsIG9mCgkgICAgIHBvaW50ZXJzIGZyb20gdGhlIHR5cGUuIChUaGlzIGlzIG9ubHkgdmFsaWQgZm9yIHBvaW50ZXIgCgkgICAgIHR5cGVzLikKCSAgICogJCZ0eXBlLCAkJmx0eXBlLCAkJm1hbmdsZSwgJCZkZXNjcmlwdG9yIGFyZSB0aGUgc2FtZSBhcwoJICAgICB0aGUgdmFyaWFudHMgd2l0aG91dCBhbXBlcnNhbmQsIGJ1dCB0aGV5IEFERCBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgdG8gdGhlIHR5cGUuCgkgICBUaGUgR3VpbGUtc3BlY2lmaWMgc3Vic3RpdHV0aW9uICRiYXNlZGVzY3JpcHRvciB3YXMgcmVtb3ZlZAoJICAgYmVjYXVzZSBpdCB3YXMgdXNlbGVzcy4KCjgvMTIvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlZXh0ZXJuIGRpcmVjdGl2ZSBpcyBub3cgZGVwcmVjYXRlZCBhbmQgd2l0aGRyYXduLiAgVGhlCiAgICAgICAgICAgcHVycG9zZSBvZiB0aGlzIGRpcmVjdGl2ZSB3YXMgdG8gaW1wb3J0IHNlbGVjdGVkIGRlZmluaXRpb25zCiAgICAgICAgICAgZnJvbSBvdGhlciBpbnRlcmZhY2UgZmlsZXMgYW5kIGhlYWRlcnMuICBIb3dldmVyLCB0aGUgc2FtZQogICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgaXMgYmV0dGVyIGhhbmRsZWQgdGhyb3VnaCAlaW1wb3J0LiAgIFRoaXMKICAgICAgICAgICBsZWF2ZXMgU1dJRyB3aXRoIHR3byBmaWxlIGluY2x1c2lvbiBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgICAlaW5jbHVkZSBmaWxlbmFtZSAgICAgLSBJbnNlcnRzIGludG8gY3VycmVudCBpbnRlcmZhY2UKICAgICAgICAgICAgICAlaW1wb3J0IGZpbGVuYW1lICAgICAgLSBJbXBvcnQgdHlwZXMgYW5kIGNsYXNzZXMgZnJvbSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm90aGVyIG1vZHVsZQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDkvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIG5ldyBzdXBwb3J0IGZvciB3cmFwcGluZyBDL0MrKyBjYWxsYmFjayBmdW5jdGlvbnMuIAogICAgICAgICAgIEEgY29tbW9uIHByb2JsZW0gd2l0aCBzb21lIEMgbGlicmFyaWVzIGlzIHRoYXQgbWFueQogICAgICAgICAgIGZ1bmN0aW9ucyB0YWtlIGEgZnVuY3Rpb24gcG9pbnRlciBhcyBhbiBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGludCBkb19vcCguLi4sIGludCAoKm9wKShpbnQsaW50KSwgLi4uKTsKCiAgICAgICAgICAgVW5mb3J0dW5hdGVseSwgdGhlIG9ubHkgd2F5IHRvIGNhbGwgc3VjaCBhIGZ1bmN0aW9uIGlzIHRvCiAgICAgICAgICAgcGFzcyBpdCBhIGZ1bmN0aW9uIHBvaW50ZXIgb2Ygc29tZSBjb21wYXRpYmxlIHR5cGUuICBJbgogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIHlvdSBoYWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtCiAgICAgICAgICAgd2l0aCBzb21lIHJlYWxseSBncm9zcyBoYWNrcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgdXNlIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gYXMgYSBjYWxsYmFjaywKCiAgICAgICAgICAgICAgIGludCBmb28oaW50LCBpbnQpOwoKICAgICAgICAgICB5b3UgaGFkIHRvIGluc3RhbGwgYSBwb2ludGVyIHRvIGl0IGFzIGEgY29uc3RhbnQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gZm9vOwoKICAgICAgICAgICBvciAKCiAgICAgICAgICAgICAgIGNvbnN0IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIGlmIHlvdSBoYWQgYSByZWFsbHkgb2xkIFNXSUcgdmVyc2lvbjoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICgqT1BfRlVOQykoaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBkb19vcCguLi4sIE9QX0ZVTkMsIC4uLik7CiAgICAgICAgICAgICAgIGNvbnN0IE9QX0ZVTkMgRk9PID0gZm9vOwoKICAgICAgICAgICAKICAgICAgICAgICBOb3csIHlvdSBjYW4gZG8gb25lIG9mIHR3byB0aGluZ3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50IGZvbyhpbnQsaW50KTsKCiAgICAgICAgICAgVGhpcyBjcmVhdGVzIGEgY29uc3RhbnQgJ2Zvbycgb2YgdHlwZSBpbnQgKCopKGludCxpbnQpLgogICAgICAgICAgIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CgogICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGZ1bmN0aW9ucyBhcmUgaW5zdGFsbGVkIGFzIGNvbnN0YW50cyB3aGVyZQogICAgICAgICAgIHRoZSBuYW1lIGlzIGRlZmluZWQgYnkgdGhlIGZvcm1hdCBzdHJpbmcgZ2l2ZW4gdG8gJWNhbGxiYWNrKCkuCiAgICAgICAgICAgSWYgdGhlIG5hbWVzIGdlbmVyYXRlZCBieSB0aGUgZm9ybWF0IHN0cmluZyBkaWZmZXIgZnJvbSB0aGUKICAgICAgICAgICBhY3R1YWwgZnVuY3Rpb24gbmFtZSwgYm90aCBhIGZ1bmN0aW9uIHdyYXBwZXIgYW5kIGEgY2FsbGJhY2sgCiAgICAgICAgICAgY29uc3RhbnQgYXJlIGNyZWF0ZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVjYWxsYmFjaygiJSh1cHBlcilzIik7CiAgICAgICAgICAgICAgIGludCBmb28oaW50LGludCk7CiAgICAgICAgICAgICAgIGludCBiYXIoaW50LGludCk7CiAgICAgICAgICAgICAgICVub2NhbGxiYWNrOwogICAgICAgICAgIAogICAgICAgICAgIENyZWF0ZXMgdHdvIHdyYXBwZXIgZnVuY3Rpb25zICdmb28nLCAnYmFyJyBhbmQgYWRkaXRpb25hbGx5CiAgICAgICAgICAgY3JlYXRlcyB0d28gY2FsbGJhY2sgY29uc3RhbnRzICdGT08nLCAnQkFSJy4KCiAgICAgICAgICAgTm90ZTogU1dJRyBzdGlsbCBkb2VzIG5vdCBwcm92aWRlIGF1dG9tYXRpYyBzdXBwb3J0IGZvciAKICAgICAgICAgICB3cml0aW5nIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBzdHJ1Y3QgbmVzdGluZyBmaXhlcyBhcyBwZXIgU0YgYnVnICM0NDc0ODguCgo4LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUaGUgJW5hbWUgZGlyZWN0aXZlIG5vdyBhcHBsaWVzIHRvIGNvbnN0YW50cyBjcmVhdGVkIHdpdGgKICAgICAgICAgICAjZGVmaW5lIGFuZCAlY29uc3RhbnQuICBIb3dldmVyLCBtb3N0IGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgICB3ZXJlIG5ldmVyIHdyaXR0ZW4gdG8gc3VwcG9ydCB0aGlzIGFuZCB3aWxsIGhhdmUgdG8gYmUKICAgICAgICAgICBtb2RpZmllZCB0byBtYWtlIGl0IHdvcmsuICBUY2wsIFB5dGhvbiwgYW5kIFBlcmwgbW9kdWxlcwogICAgICAgICAgIGFyZSB3b3JraW5nIG5vdy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzAzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIGNoYW5nZXMgYW5kIHNpbXBsaWZpY2F0aW9uIG9mIEMgZGVjbGFyYXRpb24gcGFyc2luZy4KICAgICAgICAgICBBbHRob3VnaCBTV0lHIGlzIHN0aWxsIG5vdCBhIGZ1bGwgQyBwYXJzZXIsIGl0cyBhYmlsaXR5CiAgICAgICAgICAgdG8gaGFuZGxlIGNvbXBsZXggZGF0YXR5cGVzIGluY2x1ZGluZyBwb2ludGVycyB0byBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgcG9pbnRlcnMgdG8gYXJyYXlzIGhhcyBiZWVuIHZhc3RseSBpbXByb3ZlZC4gIAoKOC8wMy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIERpc3RyaWJ1dGlvbiBmaXhlczogYXV0b2NvbmYgbm8gbG9uZ2VyIG5lZWRlZCB0byBpbnN0YWxsIFNXSUcuCgo4LzAyLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHR3byB1bmRvY3VtZW50ZWQgcGFyc2luZyBmZWF0dXJlcy4gIFNXSUcgbm8gbG9uZ2VyCiAgICAgICAgICAgc3VwcG9ydHMgb3V0LW9mLWNsYXNzIHN0YXRpYyBmdW5jdGlvbiBvciB2YXJpYWJsZQogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgRm9vOjpiYXI7CgogICAgICAgICAgIFRoaXMgZmVhdHVyZSBtYXkgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQgZGVtYW5kLiAKICAgICAgICAgICBIb3dldmVyLCBzaW5jZSBTV0lHIGlzIG1vc3Qgb2Z0ZW4gdXNlZCB3aXRoIGhlYWRlciBmaWxlcywKICAgICAgICAgICBpdCBpcyBtb3JlIGxpa2VseSBmb3IgdGhlc2UgZGVmaW5pdGlvbnMgdG8gYmUgaW5jbHVkZWQKICAgICAgICAgICBpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbi4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMDIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIENsZWFudXAgb2YgdGhlIEdJRlBsb3QgZXhhbXBsZXMuIFVwZ3JhZGVkIEphdmEgR0lGUGxvdCBleGFtcGxlLgoKOC8wMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEVmZmljaWVuY3kgY2hhbmdlczogX2NQdHIgdXNlZCB3aGVyZSBwb3NzaWJsZSByYXRoZXIgdGhhbgoJICAgICBnZXRDUHRyKCkuIEJ1ZyBmaXhlcyBmb3IgaW5oZXJpdGFuY2UgLSBkZXJpdmVkIGNsYXNzIHNvbWV0aW1lcwoJICAgICBkaWRuJ3QgZGVsZXRlIHRoZSBjIG1lbW9yeSB3aGVuIF9kZWxldGUoKSB3YXMgY2FsbGVkLgoJICAgKiBbSmF2YV0gQWJzdHJhY3QgYysrIGNsYXNzZXMgYXJlIHdyYXBwZWQgd2l0aCBhIGphdmEgYWJzdHJhY3Qgc2hhZG93CgkgICAgIGNsYXNzLiBBbHNvIGEgcHVyZSB2aXJ0dWFsIGZ1bmN0aW9uIGlzIG1hcHBlZCB3aXRoIGFuIGFic3RyYWN0IG1ldGhvZC4KCSAgICogVGhlIGRlZmF1bHQgb3V0cHV0IGZpbGUgaGFzIGFsd2F5cyBiZWVuIDxtb2R1bGU+X3dyYXAuYy4gSXQgaXMgbm93CgkgICAgIDxtb2R1bGU+X3dyYXAuY3h4IGlmIHRoZSAtYysrIGNvbW1hbmRsaW5lIG9wdGlvbiBpcyBwYXNzZWQgdG8gc3dpZy4KCSAgICAgVGhpcyBoYXMgYmVlbiBkb25lIGFzIG90aGVyd2lzZSBjKysgY29kZSB3b3VsZCBhcHBlYXIgaW4gYSBjIGZpbGUuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAoKNy8zMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlICVjb25zdGFudCBkaXJlY3RpdmUgdG8gYmUgbW9yZSBDLWxpa2UgaW4gc3ludGF4LgogICAgICAgICAgIFRoZSBzeW50YXggaXMgbm93OgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBOQU1FID0gVkFMVUU7CiAgICAgICAgICAgICAgICAlY29uc3RhbnQgVFlQRSBOQU1FID0gVkFMVUU7CiAKICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlY29uc3RhbnQgRm9vICpCYXIgPSAmU3BhbTsKCiAgICAgICAgICAgQSBtb3JlIHN1YnRsZSBjYXNlIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAlY29uc3RhbnQgaW50ICgqRk9PKShpbnQsaW50KSA9IGJsYWg7CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgTW9kdWxlcyB0aGF0IHdlcmUgdXNpbmcKICAgICAgICAgICB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSBkaXJlY3RseSB3aWxsIG5lZWQgdG8gYmUgbW9kaWZpZWQuCiAgICAgIAo3LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIG9ic2N1cmUgYW5kIHVuZG9jdW1lbnRlZCBmb3JtIG9mIHRoZSAlaW5saW5lIGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICVpbmxpbmUgaW50IGJsYWgoaW50IGEsIGludCBiKSB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAKICAgICAgICAgICAobm90ZTogdGhpcyBmZWF0dXJlIHdhcyBuZXZlciBkb2N1bWVudGVkIGFuZCBpcyB3aXRoZHJhd24pCgo3LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBSZW1vdmVkIHN1cHBvcnQgZm9yIGZ1bmN0aW9ucyB3aXRoIG5vIGV4cGxpY2l0bHkgZGVjbGFyZWQKICAgICAgICAgICByZXR1cm4gdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgZm9vKGludCk7CgogICAgICAgICAgIEluIEMsIHN1Y2ggZnVuY3Rpb25zIHdlcmUgaW1wbGljaXRseSBhc3N1bWVkIHRvIHJldHVybiBhbiAnaW50Jy4KICAgICAgICAgICBJbiBDKyssIHRoaXMgaXMgaWxsZWdhbC4gIEVpdGhlciB3YXksIGl0J3MgY29uc2lkZXJlZCBiYWQKICAgICAgICAgICBzdHlsZS4gIFJlbW92aW5nIHN1cHBvcnQgZm9yIHRoaXMgaW4gU1dJRyB3aWxsIHNpbXBsaWZ5CiAgICAgICAgICAgY2VydGFpbiBpc3N1ZXMgaW4gcGFyc2luZy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMzAvMjAwMTogbWtvZXBwZQoJICAgKiBQYXJ0aWFsIG1lcmdlIGZyb20gdGhlIENWUyB0cnVuay4gIFRoZSBTb3VyY2UvRE9IIGRpcmVjdG9yeQoJICAgICBhbmQgbW9zdCBvZiB0aGUgU291cmNlL1N3aWcgZGlyZWN0b3J5IGlzIHVwLXRvLWRhdGUgbm93LgoJICAgKiBbR3VpbGVdICVzY2hlbWUgaXMgbm93IGEgbWFjcm8gZm9yICVpbnNlcnQoInNjaGVtZSIpLiAgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICJGSUxFTkFNRSI7IAoJICAgICBOZXcgc3ludGF4OiAgJXNjaGVtZSAleyBTQ0hFTUUtQ09ERSAlfQoJICAgICBOZXcgbWFjcm9zICVtdWx0aXBsZV92YWx1ZXMsICV2YWx1ZXNfYXNfbGlzdCwKCSAgICAgJXZhbHVlc19hc192ZWN0b3IuIAoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGhhdmUgYmVlbiB0dXJuZWQgaW50byBTV0lHIHByYWdtYXMuCiAgICAgICAgICAgJXByYWdtYShzd2lnKSByZWFkb25seSBhbmQgJXByYWdtYShzd2lnKSByZWFkd3JpdGUuICBNYWNyb3MKICAgICAgICAgICBhcmUgdXNlZCB0byBwcm92aWRlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWlub3IgY2hhbmdlcyB0byAlcHJhZ21hIGRpcmVjdGl2ZS4gICVwcmFnbWEgbXVzdCBhbHdheXMKICAgICAgICAgICBiZSBkaXJlY3RlZCB0byBhIHNwZWNpZmljIGxhbmd1YWdlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVwcmFnbWEoc3dpZykgbWFrZV9kZWZhdWx0OwogICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiYmxhaC5pIjsKCiAgICAgICAgICAgQWxzbyBleHRlbmRlZCB0aGUgcHJhZ21hIGRpcmVjdGl2ZSB0byBhbGxvdyBjb2RlIGJsb2NrcwogCiAgICAgICAgICAgICAgJXByYWdtYShmb28pIGNvZGUgPSAlewogICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHRoZSB3YXkgJ2NvbnN0JyB2YXJpYWJsZXMgYXJlIHdyYXBwZWQuICBJbiAKICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHLCBhICdjb25zdCcgdmFyaWFibGUgd2FzCiAgICAgICAgICAgd3JhcHBlZCBhcyBhIGNvbnN0YW50LiAgIE5vdywgJ2NvbnN0JyB2YXJpYWJsZXMgYXJlCiAgICAgICAgICAgd3JhcHBlZCBhcyByZWFkLW9ubHkgdmFyaWFibGVzLiAgVGhlcmUgYXJlIHNldmVyYWwKICAgICAgICAgICByZWFzb25zIGZvciBtYWtpbmcgdGhpcyBjaGFuZ2UsIG1vc3RseSBwZXJ0YWluaW5nIHRvCiAgICAgICAgICAgc3VidGxlIGRldGFpbHMgb2YgaG93ICdjb25zdCcgYWN0dWFsbHkgd29ya3MuIAoKICAgICAgICAgICBUaGlzIHdpbGwgcHJvYmFibHkgYnJlYWsgb2xkIGludGVyZmFjZXMgdGhhdCB1c2VkICdjb25zdCcKICAgICAgICAgICB0byBjcmVhdGUgY29uc3RhbnRzLiAgIEFzIGEgcmVwbGFjZW1lbnQsIGNvbnNpZGVyIHVzaW5nIHRoaXM6CgogICAgICAgICAgIGNvbnN0IGludCBhID0gNDsgICA9PT0+ICAgJWNvbnN0YW50IGludCBhID0gNDsKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlb3JnYW5pemF0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbiBvZiB0eXBlIHBhcnNpbmcuCiAgICAgICAgICAgVHlwZXMgd2l0aCAnY29uc3QnIHNob3VsZCB3b3JrIGNvcnJlY3RseSBub3cuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb3N0IHN3aWcgZGlyZWN0aXZlcyByZWxhdGVkIHRvIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQogICAgICAgICAgIGFyZSBub3cgZGVwcmVjYXRlZC4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgT2JqZWN0aXZlLUMgaW4gb3JkZXIgdG8gc2ltcGxpZnkKICAgICAgICAgICBwYXJzZXIgcmVjb25zdHJ1Y3Rpb24uICBXaWxsIHJldHVybiBpZiB0aGVyZSBpcyBzdWZmaWNpZW50CiAgICAgICAgICAgZGVtYW5kLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ29kZSBpbmNsdXNpb24gaGFzIGJlZW4gbW9kaWZpZWQgaW4gdGhlIHBhcnNlci4gIEEgY29tbW9uCiAgICAgICAgICAgZGlyZWN0aXZlICVpbnNlcnQgaXMgbm93IHVzZWQgZm9yIGV2ZXJ5dGhpbmcuICBUaGlzCiAgICAgICAgICAgaW5zZXJ0cyBhIGZpbGUgaW50byB0aGUgb3V0cHV0OgoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICJmb28uc3dnIgoKICAgICAgICAgICBUaGlzIGluc2VydHMgc29tZSBpbmxpbmUgY29kZSBpbnRvIHRoZSBvdXRwdXQKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVyKSAlewogICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgY29kZSAuLi4gCiAgICAgICAgICAgICAgICV9CgogICAgICAgICAgIFRoZXJlIGFyZSBmaXZlIHByZWRlZmluZWQgdGFyZ2V0cyBmb3IgdGhlIGluc2VydCBkaXJlY3RpdmU6CgogICAgICAgICAgICAgICAiaGVhZGVyIiAgICAtIEhlYWRlciBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAicnVudGltZSIgICAtIFJ1bnRpbWUgc2VjdGlvbiBvZiB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgICAgIndyYXBwZXIiICAgLSBXcmFwcGVyIHNlY3Rpb24KICAgICAgICAgICAgICAgImluaXQiICAgICAgLSBJbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgICAgICAgICAgICAibnVsbCIgICAgICAtIE5vdGhpbmcuIERpc2NhcmQuCgogICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlcyBhcmUgc3RpbGwgc3VwcG9ydGVkLCBidXQgYXJlCiAgICAgICAgICAgbm93IGRlZmluZWQgaW4gdGVybXMgb2YgbWFjcm9zOgoKICAgICAgICAgICAgICAgJXsgLi4uICV9ICAgICAgICAgICAtPiAlaW5zZXJ0KGhlYWRlcikgICV7IC4uLiAlfQogICAgICAgICAgICAgICAlaW5pdCAleyAuLi4gJX0gICAgIC0+ICVpbnNlcnQoaW5pdCkgICAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICV3cmFwcGVyICV7IC4uLiAlfSAgLT4gJWluc2VydCh3cmFwcGVyKSAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXJ1bnRpbWUgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHJ1bnRpbWUpICV7IC4uLiAlfQoKICAgICAgICAgICBMYW5ndWFnZSBtb2R1bGVzIGNhbiBkZWZpbmUgbmV3IG5hbWVkIHRhcmdldHMgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgQyBBUEkgZnVuY3Rpb24gU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCkgKHNlZSBtYWluLmN4eCkuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8gZXhwb3NlIGEgc2hhZG93IGNsYXNzIGZpbGUsCiAgICAgICAgICAgeW91IGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgIFN3aWdfcmVnaXN0ZXJfZmlsZWJ5bmFtZSgic2hhZG93IiwgZl9zaGFkb3cpOwoKICAgICAgICAgICBUaGVuIGluIHRoZSBpbnRlcmZhY2UgZmlsZToKCiAgICAgICAgICAgICAgJWluc2VydChzaGFkb3cpICV7IC4uLiAlfQoKICAgICAgICAgICBOb3RlOiB0aGlzIGNoYW5nZSBzaG91bGQgbm90IGFmZmVjdCBhbnkgb2xkIGludGVyZmFjZXMsIGJ1dAogICAgICAgICAgIGRvZXMgb3BlbiB1cCBuZXcgcG9zc2liaWxpdGllcyBmb3IgZW5oYW5jZW1lbnRzLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU1dJRyBub3cgYWx3YXlzIGluY2x1ZGVzIGEgc3RhbmRhcmQgbGlicmFyeSBmaWxlICdzd2lnLnN3ZycuCiAgICAgICAgICAgVGhpcyBmaWxlIGRlZmluZXMgYSBsYXJnZSBudW1iZXIgb2YgbWFjcm8gZGVmaW5pdGlvbnMKICAgICAgICAgICB0aGF0IGRlZmluZSB0aGUgYmVoYXZpb3Igb2YgdmFyaW91cyBTV0lHIGRpcmVjdGl2ZXMuCiAgICAgICAgICAgUHJldmlvdXNseSwgYWxsIFNXSUcgZGlyZWN0aXZlcyB3ZXJlIGhhbmRsZWQgYXMgc3BlY2lhbAogICAgICAgICAgIGNhc2VzIGluIHRoZSBwYXJzZXIuICBUaGlzIG1hZGUgdGhlIHBhcnNlciBhIGxhcmdlIAogICAgICAgICAgIGJsb2F0ZWQgbWVzcy4gIE5vdywgdGhlIHBhcnNlciBpcyBzdHJpcHBlZCBkb3duIHRvIGEgZmV3CiAgICAgICAgICAgc2ltcGxlIGRpcmVjdGl2ZXMgYW5kIG1hY3JvcyBhcmUgdXNlZCB0byBoYW5kbGUgZXZlcnl0aGluZyBlbHNlLgoKNy8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogRml4ZXMgZm9yIFNvdXJjZWZvcmdlIGJ1ZyAjNDQ0NzQ4IC0gbmV3IHRlc3RjYXNlIGNwcF9zdGF0aWM6CgkgICAgIFtUQ0xdIENsYXNzIHdpdGgganVzdCBzdGF0aWMgbWVtYmVyIHZhcmlhYmxlL2Z1bmN0aW9uIGZpeAoJICAgICBbSmF2YV0gRml4ZWQgc3RhdGljIHZhcmlhYmxlcyBzdXBwb3J0CgkgICAgIFtSdWJ5XSBTdGF0aWMgdmFyaWFibGVzIHdvcmthcm91bmQgcmVtb3ZlZAoKNy8yNy8yMDAxOiBta29lcHBlCgkgICAqIHN0eXBlLmMgKFN3aWdUeXBlX2RlZmF1bHQpOiBTdHJpcCBxdWFsaWZpZXJzIGZpcnN0LiBUaGUKCSAgICAgZGVmYXVsdCB0eXBlIG9mICJpbnQgKiBjb25zdCIgaXMgbm93ICJTV0lHUE9JTlRFUiAqIi4KCSAgICogbWFpbi5jeHg6IERlZmluZSAiX19jcGx1c3BsdXMiIGluIFNXSUcncyBwcmVwcm9jZXNzb3IgaWYKCSAgICAgaW4gQysrIG1vZGUuCgkgICAqIFtHdWlsZV06IEFkZGVkIHNvbWUgc3VwcG9ydCBmb3IgYXJyYXlzIGFuZCBDKysKCSAgICAgcmVmZXJlbmNlcywgZml4aW5nIHRoZSAiY29uc3RhbnRfcG9pbnRlcnMiIHRlc3QgY2FzZS4KCSAgICogTW92ZWQgbW9zdCB0ZXN0cyBmcm9tIHRoZSBvbGQgR3VpbGUtc3BlY2lmaWMgdGVzdC1zdWl0ZQoJICAgICB0byB0aGUgbmV3IHRlc3Qtc3VpdGUuICBBbHNvIG1vdmVkIHBlcmw1L3BvaW50ZXItY3h4CgkgICAgIGV4YW1wbGUgdGhlcmUuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBUZXN0LXN1aXRlIGFkZGVkLgoJICAgKiBJbml0aWFsIHRlc3RjYXNlczogY29uc3RhbnRfcG9pbnRlcnMgY3BwX2VudW0gZGVmaW5lcwoJICAgICBzaXplb2ZfcG9pbnRlcnMgdW5pb25zIHZpcnR1YWxfZGVzdHJ1Y3RvcgoJICAgKiBNYWtlIGNsZWFuIGltcHJvdmVtZW50cy4KCjcvMjQvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBVbmRlcnNjb3JlcyBpbiB0aGUgcGFja2FnZSBuYW1lIGFuZC9vciBtb2R1bGUgbmFtZQoJICAgbm8gbG9uZ2VyIGdpdmUgbGlua2luZyBwcm9ibGVtcy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIE1vcmUgcGFyc2VyIGJ1ZyBmaXhlcyBmb3IgY29uc3RhbnQgcG9pbnRlcnMKCjcvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdIEFlc3RoZXRpYyBpbXByb3ZlbWVudCBpbiB2YXJpYWJsZSB3cmFwcGVycy4KCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgY29yZS1kdW1wIHByb2JsZW0gaW4gcG9pbnRlciBsaWJyYXJ5IHdoZW4gCiAgICAgICAgICAgICBmcmVlaW5nIGNoYXJhY3RlciBhcnJheXMuCiAgICAgICAgICAgICBTRiBCdWcgWyAjNDE1ODM3IF0gcG9pbnRlciBsaWIgY29yZSBkdW1wCgo3LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAqIEZpeGVkIHByb2JsZW0gd2l0aCBkZWZhdWx0IGRlc3RydWN0b3JzIGFuZCBzaGFkb3cKICAgICAgICAgICAgIGNsYXNzZXMuICBTRiBidWcgIzIyMTEyOC4KCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogVG8gcHJvdmlkZSBiZXR0ZXIgbGluZS1udW1iZXIgdHJhY2tpbmcgaW4gaW50ZXJmYWNlcwogICAgICAgICAgICAgd2l0aCBsb3RzIG9mIG1hY3Jvcywgc3BlY2lhbCBsb2NhdG9yIGNvbW1lbnRzIGFyZQogICAgICAgICAgICAgbm93IGdlbmVyYXRlZCBieSB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgLypAZm9vLmksNDIsQkxBSEAqL2V4cGFuZGVkIG1hY3JvLypAQCovCgogICAgICAgICAgICAgVGhlIGZpcnN0IC8qQC4uLkAqLyBzZXF1ZW5jZSBzZXRzIHRoZSBjb250ZXh0CiAgICAgICAgICAgICB0byBwb2ludCB0byB0aGUgbWFjcm8gY29kZS4gIFRoZSAvKkBAKi8gY29tbWVudAogICAgICAgICAgICAgdGVybWluYXRlcyB0aGUgY29udGV4dC4gIFRoZSBTV0lHIHBhcnNlciBzaG91bGQKICAgICAgICAgICAgIGlnbm9yZSBhbGwgb2YgdGhlIGxvY2F0b3IgY29tbWVudHMgYXMgc2hvdWxkCiAgICAgICAgICAgICB0aGUgQyBjb21waWxlciAoc2hvdWxkIHN1Y2ggY29tbWVudHMgZW5kIHVwCiAgICAgICAgICAgICBpbiBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlKS4KCjcvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBUaGUgcGFyc2VyIG5vdyBoYW5kbGVzIHNldmVyZWx5IGNvbnN0aWZpZWQgdHlwZXMgaW4KCSAgIHR5cGVtYXBzLiAgVGhpcyBpbnRyb2R1Y2VkIGEgbmV3IHNoaWZ0L3JlZHVjZSBjb25mbGljdCwgYnV0CgkgICBvbmx5IHdpdGggYSBoZXVyaXN0aWMgZnVuY3Rpb24tcG9pbnRlciBjYXRjaC1hbGwgcnVsZS4gIAoJICAgKiBbR3VpbGVdOiBBZGRlZCB0eXBlbWFwcyBmb3Igc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcy4gCgkgICAqIEZpeGVkIHRoZSAidGVtcGxhdGUtd2hpdGVzcGFjZSIgcHJvYmxlbSBieSBjYW5vbmljYWxpemluZwoJICAgICB3aGl0ZXNwYWNlLCBlc3BlY2lhbGx5IGFyb3VuZCBhbmdsZSBicmFja2V0cyBhbmQgY29tbWFzLiAKCjcvMTcvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBBIFNjaGVtZSBmaWxlIGlzIGVtaXR0ZWQgaWYgdGhlIC1zY21zdHViIEZJTEUuU0NNCgkgICBjb21tYW5kLWxpbmUgb3B0aW9uIGlzIHVzZWQuICBUaGUgJXNjaGVtZSBkaXJlY3RpdmUKCSAgIChpbXBsZW1lbnRlZCBhcyBhIG1hY3JvIGZvciBhIHByYWdtYSkgYWxsb3dzIHRvIGluc2VydAoJICAgYXJiaXRyYXJ5IGNvZGUgaGVyZS4gIEluICJzaW1wbGUiIGFuZCAicGFzc2l2ZSIgbGlua2FnZSwKCSAgIHRoZSBmaWxlIGdldHMgZmlsbGVkIHdpdGggZGVmaW5lLW1vZHVsZSBhbmQgZXhwb3J0CgkgICBkZWNsYXJhdGlvbnMuCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBQYXJzZXIgYnVnIGZpeCB0byBzdXBwb3J0IGNvbnN0YW50IHBvaW50ZXJzLCBlZyBpbnQqIGNvbnN0IHB0ci4KCSAgIEZpeGVkIGV2ZXJ5d2hlcmUgLSB2YXJpYWJsZXMsIHBhcmFtZXRlcnMsIHJldHVybiB0eXBlcyBldGMuIE5vdGUgdGhhdAoJICAgd2hlbiB3cmFwcGluZyBhIGNvbnN0YW50IHBvaW50ZXIgdmFyaWFibGUgb25seSB0aGUgZ2V0dGVyIGlzIGdlbmVyYXRlZC4KCjcvMTcvMjAwMTogbWtvZXBwZQoJICAgKiBGaXhlZCBTRiBidWcgIzQ0MTQ3MCAoI2RlZmluZSBYICIvLyIgd291bGQgbm90IGJlIHBhcnNlZCwKCSAgICAgc2VlIHRlc3Qtc3VpdGUgZW50cnkgInByZXByb2MtMSIpLCByZXBvcnRlZCBieSBULiBXLiBCdXJ0b24KCSAgICAgPHR3YnVydG9uQHVzZXJzLnNmLm5ldD4uCgkgICAqIENoYW5nZWQgdGhlIHR5cGUgb2YgY2hhcmFjdGVyIGNvbnN0YW50cyB0byAiY2hhciIsIHJhdGhlcgoJICAgICB0aGFuICJjaGFyICoiLiAgQ2hhbmdlZCB0aGUgaW5kaXZpZHVhbCBsYW5ndWFnZSBtb2R1bGVzCgkgICAgIHRvIGtlZXAgdGhlIG9sZCBiZWhhdmlvdXIsIGV4Y2VwdCBmb3IgdGhlIEd1aWxlIG1vZHVsZSwKCSAgICAgd2hlcmUgaXQgaXMgZGVzaXJlZCB0byBtYWtlIHRoZW0gU2NoZW1lIGNoYXJhY3RlcnMuICBUaGlzCgkgICAgIGZpeGVzIFNGIGJ1ZyAjMjMxNDA5LCB0ZXN0LXN1aXRlIGVudHJ5ICJjaGFyLWNvbnN0YW50Ii4KCSAgICogQXBwbGllZCBwYXRjaCBmb3IgRE9IL0RvaC9tZW1vcnkuYyBieSBMZXMgU2NoYWZmZXIKCSAgICAgPHNjaGFmZmVyQG9wdG9ubGluZS5uZXQ+IChhdm9pZCByZXF1aXJlZCBzaWRlIGVmZmVjdHMgaW4KCSAgICAgYXNzZXJ0KS4gCgo3LzE3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBCdWcgZml4IGluIHBhcnNlciBmb3IgdmlydHVhbCBkZXN0cnVjdG9yIHdpdGggdm9pZCBhcyBwYXJhbWV0ZXIKCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgI2RlZmluZXMgZW1iZWRkZWQgd2l0aGluIGNsYXNzZXMvc3RydWN0cy91bmlvbnMKCSAgIENvbnNlcXVlbnRseSAlY29uc3RhbnQgY2FuIG5vdyBhbHNvIGJlIHBsYWNlZCB3aXRoaW4gYSBzdHJ1Y3QvY2xhc3MvdW5pb24uCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIHRvIGFsbG93IHNpemVvZigqSV9hbV9hX3BvaW50ZXIpIHdpdGhpbiBhICNkZWZpbmUKCjcvMTYvMjAwMTogbWtvZXBwZQoJICAgKiBBZGRlZCBjaGFuZ2VzIGZvciB0aGUgTWFjaW50b3NoIGNvbnRyaWJ1dGVkIGJ5IEx1aWdpCgkgICBCYWxsYWJpbyA8YmFsbGFiaW9AbWFjLmNvbT4uIAoJICAgKiBTb21lICJjb25zdCIgZml4ZXMgaW4gdGhlIGNvZGUuCgkgICAqIFtHdWlsZV06IE1hZGUgdGhlIGNvbnN0YW50LXdyYXBwZXIgZnVuY3Rpb25zIG11Y2ggc2hvcnRlci4KCjcvMTMvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBTb21lICJjb25zdCIgZml4ZXMgZm9yIEd1aWxlIHZlcnNpb24gMS4zLjQuCgkgICAqIEhhbmRsZSBhbm9ueW1vdXMgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kIHN0YXRpYwoJICAgICBhcnJheSBtZW1iZXJzIG9mIGNsYXNzZXMuICBCb3RoIGJ1Z3MgcmVwb3J0ZWQgYnkgQW5uYWxpc2EgVGVycmFjaW5hCgkgICAgIDxhbm5hbGlzYS50ZXJyYWNpbmFAZGF0YW1hdC5pdD47IHNlZSB0aGUgZmlsZXMKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9zdGF0aWMtYXJyYXktbWVtYmVyLmkgYW5kCgkgICAgIGFub255bW91cy1hcmcuaS4KClZlcnNpb24gMS4zLjYgIChKdWx5IDksIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo3LzA5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBHSUZQbG90IGV4YW1wbGVzOiBGT1JFR1JPVU5EIGFuZCBCQUNLR1JPVU5EIGRlZmluaXRpb24gbWlzc2luZyAKCSAgIGFmdGVyIFRSQU5TUEFSRU5UICNkZWZpbmUgZml4IGluIEdJRlBsb3QKCjcvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHVwIHRoZSB2ZXJzaW9uIG51bWJlcnMgc28gdGhhdCB0aGUgcmVsZWFzZSBpcyBrbm93bgogICAgICAgICAgIGFzIDEuMy42LiAgQWxsIGZ1dHVyZSByZWxlYXNlcyBzaG91bGQgaGF2ZSBhIHNpbWlsYXIKICAgICAgICAgICB2ZXJzaW9uIGZvcm1hdC4KCjcvMDIvMjAwMTogbWtvZXBwZQoJICAgKiBbUHl0aG9uXTogUHJldmVudCB0aGUgcHJvYmxlbSBvZiBzZWxmLnRoaXNvd24gbm90IGJlaW5nCgkgICBkZWZpbmVkIGlmIHRoZSBDKysgY2xhc3MgY29uc3RydWN0b3IgcmFpc2VkIGFuIGV4Y2VwdGlvbi4KCSAgIFRoYW5rcyB0byBMdWlnaSBCYWxsYWJpbyA8YmFsbGFiaW9AbWFjLmNvbT4uCgo2LzI5LzIwMDE6IG1rb2VwcGUKCSAgICogTW9yZSBwb3J0YWJpbGl0eSBmaXhlczsgZml4ZWQgImdjYyAtV2FsbCIgd2FybmluZ3MuCgo2LzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBHSUZQbG90IGV4YW1wbGVzOiBUUkFOU1BBUkVOVCAjZGVmaW5lIG11bHRpcGxlIHRpbWVzIG9uIFNvbGFyaXMgCgkgICAoY2xhc2hlcyB3aXRoIHN0cmVhbS5oKS4KCSAgICogTXVsdGlwbGUgZGVmaW5pdGlvbiBidWcgZml4IGZvciBzaGFkb3cgY2xhc3Nlcy4gVGhlIHBlcmwgYW5kIHB5dGhvbiAKCSAgIG1vZHVsZXMgaGFkIHdvcmthcm91bmRzIHdoaWNoIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoIGZpeGVzIGluIAoJICAgdGhlIGNvcmUuIE1hbnkgb2YgdGhlIExhbmd1YWdlOjpjcHBfeHh4eCBmdW5jdGlvbnMgbm93IHNldCBhIAoJICAgZmxhZyB3aGljaCB0aGUgZGVyaXZlZCBjbGFzc2VzIGNhbiBhY2Nlc3MgdGhyb3VnaCAKCSAgIGlzX211bHRpcGxlX2RlZmluaXRpb24oKSB0byBzZWUgd2hldGhlciBvciBub3QgY29kZSBzaG91bGQgYmUgCgkgICBnZW5lcmF0ZWQuICBUaGUgY29kZSBiZWxvdyB3b3VsZCBoYXZlIHByb2R1Y2VkIHZhcnlpbmcgZGVncmVlcyAKCSAgIG9mIGluY29ycmVjdCBzaGFkb3cgY2xhc3MgY29kZSBmb3IgdGhlIHZhcmlvdXMgbW9kdWxlczoKCSAgIGNsYXNzIFRlc3RDbGFzcwoJICAgewoJICAgcHVibGljOgoJICAgICBUZXN0Q2xhc3MoKSB7fQoJICAgICBUZXN0Q2xhc3MoaW50IGEpIHt9CgkgICAgIH5UZXN0Q2xhc3MoKSB7fQoJICAgICB1bnNpZ25lZCBsb25nIHh5eihzaG9ydCBrKSB7fQoJICAgICB1bnNpZ25lZCBsb25nIHh5eihpbnQgbikge30KCSAgICAgc3RhdGljIHZvaWQgc3RhdGljX2Z1bmMoKSB7fQoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYyhpbnQgYSkge30KCSAgIH07CgkgICB2b2lkIGRlbGV0ZV9UZXN0Q2xhc3MoaW50IGEpOwoKNi8yNy8yMDAxOiBta29lcHBlCgkgICAqIFtQZXJsXSBBbm90aGVyIGNvbnN0LXJlbGF0ZWQgcG9ydGFiaWxpdHkgZml4LgoKNi8yNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIEFkZGVkIGluIGNwcF9wcmFnbWEoKSBzdXBwb3J0IHdpdGggYSBob3N0IG9mIG5ldyBwcmFnbWFzIC0gc2VlIAoJICAganN3aWcuaHRtbC4gVGhlc2UgYXJlIGRlc2lnbmVkIGZvciBiZXR0ZXIgbWl4aW5nIG9mIEphdmEgYW5kIGMrKy4gSXQgCgkgICBlbmFibGVzIHRoZSB1c2VyIHRvIHNwZWNpZnkgcHVyZSBKYXZhIGNsYXNzZXMgYXMgYmFzZXMgYW5kL29yIGludGVyZmFjZXMgCgkgICBmb3IgdGhlIHdyYXBwZWQgYy9jKysuCgkgICAqIFtKYXZhXSBPbGQgcHJhZ21hcyByZW5hbWVkLiBXYXJuaW5nIGdpdmVuIGZvciB0aGUgbW9tZW50IGlmIHVzZWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LzI1LzIwMDE6IG1rb2VwcGUKCSAgICogSW5jb3Jwb3JhdGVkIG1vcmUgYnVpbGQgY2hhbmdlcyBjb250cmlidXRlZCBieSBXeXNzIENsZW1lbnMKCSAgIDxXWVNAaGVsYmxpbmcuY2g+IGZvciBzd2lnL3J1Ynkgb24gY3lnd2luLgoKNi8yMC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTWFrZWZpbGUgbW9kcyBzbyB0aGF0ICdtYWtlIGNoZWNrJyB1c2VzIHRoZSBzd2lnIG9wdGlvbnMgaW4gdGhlIG1ha2VmaWxlcwoJICAgKiBbSmF2YV0gUmVtb3ZlZCBHZW5lcmF0aW5nIHdyYXBwZXJzIG1lc3NhZ2UKCSAgICogW0phdmFdIE5VTEwgcG9pbnRlciBidWcgZml4CgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBLYWZmZSBKVk0KCjYvMjAvMjAwMTogbWtvZXBwZQoJICAgKiBTV0lHX1R5cGVRdWVyeSBmcm9tIGNvbW1vbi5zd2cgbm93IHJldHVybnMgYQoJICAgc3dpZ190eXBlX2luZm8qIHJhdGhlciB0aGFuIGEgdm9pZCouICBUaGlzIGZpeGVzIGEgcHJvYmxlbQoJICAgd2hlbiB1c2luZyBwb2ludGVyLmkgYW5kIEMrKywgYXMgaWxsdXN0cmF0ZWQgYnkgdGhlIG5ldwoJICAgdGVzdC1zdWl0ZSBleGFtcGxlIHBlcmw1L3BvaW50ZXItY3h4LgoJICAgKiBQb3J0YWJpbGl0eSBmaXhlcyAoY29uc3QgY2hhciAqKS4gCgkgICAqIEluY29ycG9yYXRlZCBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4sIHdoaWNoIG1ha2Ugc3dpZyBydW5uYWJsZSBvbiBjeWd3aW4uCgo2LzE5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQnVnIGZpeCBmb3IgU0YgYnVnICMyMTExNDQuIFRoaXMgZml4IGlzIGEgd29ya2Fyb3VuZCAKCSAgICAgdW50aWwgZml4ZWQgaW4gdGhlIGNvcmUuCgo2LzE5LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogUG9ydGFiaWxpdHkgZml4ZXMgZm9yIHVzZSB3aXRoIHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycy4gCgkgICAqIFtUY2xdOiBQb3J0YWJpbGl0eSBmaXggKGNvbnN0IGNoYXIgKikuCgkgICAqIFtUY2xdOiBDb25maWd1cmUgbm93IGZpcnN0IHRyaWVzIHRvIGZpbmQgYSB0Y2xDb25maWcuc2gKCSAgIGZpbGUgaW4gb3JkZXIgdG8gZmluZCB0aGUgVGNsIGluY2x1ZGUgZGlyZWN0b3J5LCBsaWJyYXJ5CgkgICBsb2NhdGlvbiBhbmQgbGlicmFyeSBuYW1lLgoJICAgKiBbUHl0aG9uXTogQWRkZWQgYSBmZXcgcG9zc2libGUgbGlicmFyeSBsb2NhdGlvbnMuCgo2LzE4LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRG9uJ3QgY2FsbCBzY21fY19leHBvcnQgaWYgbm90aGluZyBpcyB0byBiZQoJICAgICBleHBvcnRlZC4gIERvbid0IHdhcm4gb24gJW1vZHVsZSBpZiBtb2R1bGUgaGFzIGJlZW4gc2V0CgkgICAgIGFscmVhZHkgKHRoaXMgZnJlcXVlbnRseSBvY2N1cnMgd2hlbiAlaW1wb3J0IGlzIHVzZWQpLgoKNi8xNi8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IE5ldyAicGFzc2l2ZSIgbGlua2FnZSwgd2hpY2ggaXMgYXBwcm9wcmlhdGUgZm9yCgkgICAgIG11bHRpLW1vZHVsZSBleHRlbnNpb25zIHdpdGhvdXQgR3VpbGUgbW9kdWxlIG1hZ2ljLgoKNi8xNS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEZpeGVkIHByaW50aW5nIG9mIHNtb2JzIChzcGFjZSBhbmQgYW5nbGUgd2VyZQoJICAgICBtaXNzaW5nKS4gCgkgICAqIFByb3Blcmx5IGdlbmVyYXRlIHR5cGUgaW5mb3JtYXRpb24gZm9yIGJhc2UgY2xhc3NlcwoJICAgICBpbXBvcnRlZCB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gIFRoYW5rcyB0byBNYXJjZWxvCgkgICAgIE1hdHVzIDxtbWF0dXNAYWNtcy5hcml6b25hLmVkdT4gZm9yIHRoZSByZXBvcnQgYW5kIHRoZQoJICAgICBwYXRjaDsgdGhpcyBjbG9zZXMgU0YgYnVnICMyMzE2MTk7IHNlZSBhbHNvCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvaW1wb3J0Ki4gCgkgICAqIFtHdWlsZV06IEZpeCBjYXN0aW5nIGJldHdlZW4gY2xhc3MgYW5kIGJhc2UgY2xhc3M7IHRoZQoJICAgICBydW50aW1lIHR5cGUgc3lzdGVtIGhhZCBpdCB0aGUgd3Jvbmcgd2F5IGFyb3VuZDsgc2VlCgkgICAgIEV4YW1wbGVzL2d1aWxlL3Rlc3Qtc3VpdGUvY2FzdHMuaQoJICAgKiBNYWtlIHR5cGVtYXBzIGZvciBTV0lHUE9JTlRFUiAqIHdpdGggYXJnIG5hbWUgdGFrZQoJICAgICBwcmVjZWRlbmNlIG92ZXIgdGhvc2Ugd2l0aG91dCBhcmcgbmFtZSwgdG8gbWF0Y2ggbm9ybWFsCgkgICAgIHR5cGVtYXAgcHJlY2VkZW5jZSBydWxlcy4KCSAgICogRml4ZWQgdGhlIHJhbmRvbS1saW5lLW51bWJlcnMgcHJvYmxlbSByZXBvcnRlZCBhcyBTRiBidWcKCSAgICAgIzIxNzMxMDsgdGhhbmtzIHRvIE1pY2hhZWwgU2NoYXJmIDxzY2hhcmZAdXNlcnMuc2YubmV0Pi4KCSAgICogW0d1aWxlXTogSGFuZGxlIHRoZSAlbmFtZSBhbmQgJXJlbmFtZSBkaXJlY3RpdmVzLgoJICAgKiBOZXcgc3ludGF4OiAlbmFtZSBhbmQgJXJlbmFtZSBub3cgb3B0aW9uYWxseSB0YWtlIGRvdWJsZQoJICAgICBxdW90ZXMgYXJvdW5kIHRoZSBzY3JpcHRpbmcgbmFtZS4gIFRoaXMgaXMgdG8gYWxsb3cgc2NyaXB0aW5nCgkgICAgIG5hbWVzIHRoYXQgYXJlbid0IHZhbGlkIEMgaWRlbnRpZmllcnMuCgo2LzE0LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNYWRlIGEgbWlub3IgY2hhbmdlIHRvIHRoZSB3YXkgZmlsZXMgYXJlIGxvYWRlZCBpbgogICAgICAgICAgIG9yZGVyIHRvIGdldCBmaWxlL2xpbmUgbnVtYmVyIHJlcG9ydGluZyBjb3JyZWN0IGluCiAgICAgICAgICAgdGhlIHByZXByb2Nlc3Nvci4KCjYvMTQvMjAwMTogbWtvZXBwZQoJICAgKiBUaGUgcGFyc2VyIG5vdyB1bmRlcnN0YW5kcyB0aGUgKG5vbi1zdGFuZGFyZCkgImxvbmcgbG9uZyIKCSAgICAgdHlwZXMuIEl0IGlzIHVwIHRvIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMgdG8KCSAgICAgcHJvdmlkZSB0eXBlbWFwcyBpZiBuZWVkZWQuIFJlcG9ydGVkIGJ5IFNhbSBTdGVpbmdvbGQsIFNGCgkgICAgIGJ1ZyAjNDI5MTc2LgoJICAgKiBUaGUgcGFyc2VyIG5vdyB1bmRlcnN0YW5kcyBhcmd1bWVudHMgbGlrZSAiY29uc3QgaW50ICoKCSAgICAgY29uc3QgaSIuIFRoaXMgZml4ZXMgU0YgYnVnICMyMTU2NDkuCgkgICAqIEZpeGVkIHRoZSBHdWlsZSB0ZXN0LXN1aXRlLgoKNi8xMy8yMDAxOiBta29lcHBlCgkgICBQYXJ0aWFsIG1lcmdlIGZyb20gdGhlIENWUyB0cnVuayBhdCB0YWcKCSAgICJta29lcHBlLW1lcmdlLTEiLiBUaGlzIGNvdmVycyB0aGUgZm9sbG93aW5nIGNoYW5nZXM6Cgp8IDAxLzE2LzAxOiB0dG4KfAkgICBXcm90ZSB0YWJsZSBvZiBjb250ZW50cyBmb3IgRG9jL2VuZ2luZWVyaW5nLmh0bWwuICBBZGRlZCBzZWN0aW9uCnwJICAgb24gQ1ZTIHRhZ2dpbmcgY29udmVudGlvbnMuICBBZGRlZCBjb3B5cmlnaHQgdG8gb3RoZXIgZG9jcy4KfCA5LzI1LzAwIDogYmVhemxleQp8IAkgICBNb2RpZmllZCB0aGUgcHJlcHJvY2Vzc29yIHNvIHRoYXQgbWFjcm8gbmFtZXMgY2FuIHN0YXJ0IHdpdGggYSAnJScuCnwgCSAgIFRoaXMgbWF5IGFsbG93IG5ldyBTV0lHICJkaXJlY3RpdmVzIiB0byBiZSBkZWZpbmVkIGFzIG1hY3JvcyBpbnN0ZWFkCnwgCSAgIG9mIGhhdmluZyB0byBiZSBoYXJkLWNvZGVkIGludG8gdGhlIHBhcnNlci4gIAp8CnwgKioqIEFsc28gYSB5ZXQtdG8tYmUtZG9jdW1lbnRlZCBxdW90aW5nIG1lY2hhbmlzbSB3aXRoIGJhY2txdW90ZXMKfCAqKiogaGFzIGJlZW4gaW1wbGVtZW50ZWQ/Cgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAqIFdoZW4gY29uZmlndXJlIGRvZXMgbm90IGZpbmQgYSBsYW5ndWFnZSwgZG9uJ3QgdXNlIGRlZmF1bHQKCSAgIHBhdGhzIGxpa2UgL3Vzci9sb2NhbC9pbmNsdWRlOyB0aGlzIG9ubHkgY2F1c2VzIGJ1aWxkCgkgICBwcm9ibGVtcy4KCSAqIE5ldyBkaXJlY3Rvcnk6IEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUsIHdoZXJlIGEgZmV3CgkgICBidWdzIGluIDEuM2E1IGFyZSBkZW1vbnN0cmF0ZWQuIAoJICogSGFuZGxlIEMrKyBtZXRob2RzIHRoYXQgaGF2ZSBib3RoIGEgImNvbnN0IiBhbmQgYSAidGhyb3ciCgkgICBkaXJlY3RpdmUgKHNlZSBFeGFtcGxlcy9HdWlsZS90ZXN0LXN1aXRlL2NwbHVzcGx1cy10aHJvdy5pKTsgCgkgICB0aGFua3MgdG8gU2NvdHQgQi4gRHJ1bW1vbmRzIGZvciB0aGUgcmVwb3J0IGFuZCB0aGUgZml4LiAKCSAqIEhhbmRsZSBDKysgcG9pbnRlci1yZWZlcmVuY2UgYXJndW1lbnRzIChsaWtlICJpbnQgKiYgYXJnIikgCgkgICAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvcG9pbnRlci1yZWZlcmVuY2UuaSwKCSAgIHJlcG9ydGVkIGFzIFNGIGJ1ZyAjNDMyMjI0KS4KCSAqIFtSdWJ5XSBGaXhlZCB0eXBvIGluIHJ1YnlkZWMuc3dnOyB0aGFua3MgdG8gTHlsZSBKb2huc29uIQoJICogRG9uJ3Qgc3RvcCB0ZXN0aW5nIHdoZW4gb25lIHRlc3QgZmFpbHMuCgkgKiBbR3VpbGUsIE16U2NoZW1lXSBEb24ndCBwcmludCAiR2VuZXJhdGluZyB3cmFwcGVycy4uLiIuCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gVkVDVE9STEVOSU5QVVQgYW5kIExJU1RMRU5JTlBVVCBub3cgaGF2ZSBzZXBhcmF0ZQoJICAgbGlzdCBsZW5ndGggdmFyaWFibGVzLiBUWVBFTUFQX1BPSU5URVJfSU5QVVRfT1VUUFVUCgkgICBhdHRhY2hlcyBhcmd1bWVudCBkb2N1bWVudGF0aW9uIGludm9sdmluZyBTQ01fVFlQRSB0byB0aGUKCSAgIHN0YW5kYXJkIHBvaW50ZXIgdHlwZW1hcHMuIElOT1VUIGlzIG5vdyBhbiBhbGlhcyBmb3IgQk9USC4KCjYvMTIvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBTb21lIEphdmEgZG9jdW1lbnRhdGlvbiBhZGRlZC4KCSAgIFtKYXZhXSBGaXhlZCBidWdzIGluIGltcG9ydCBwcmFnbWEgYW5kIHNoYWRvdyBwcmFnbWEuIAoKNi8xMi8yMDAxOiBta29lcHBlCgkgICBGaXggZGVjbGFyYXRpb25zIG9mIFNXSUdfZGVmaW5lX2NsYXNzCgkgICAoTGliL3J1YnkvcnVieWRlYy5zd2cpIGFuZCBTV0lHX1R5cGVRdWVyeQoJICAgKExpYi9jb21tb24uc3dnKS4gVGhhbmtzIHRvIEx5bGUgSm9obnNvbgoJICAgPGxqb2huc29uQHJlc2dlbi5jb20+IGZvciB0aGUgcGF0Y2hlcy4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBVc2UgbG9uZyBpbnN0ZWFkIG9mIHNjbV9iaXRzX3Q7IHRoaXMgbWFrZXMgdGhlCgkgICBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGNvbXBhdGlibGUgd2l0aCBHdWlsZSAxLjMuNAoJICAgYWdhaW4uIFRoYW5rcyB0byBNYXNha2kgRnVrdXNoaW1hIGZvciBwb2ludGluZyB0aGlzIG91dC4KCjYvMTEvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBUaGUgZ2VuZXJpYyBJTlNUQUxMIGZpbGUgZnJvbSBhdXRvY29uZiBhZGRlZC4gRmV3IGNoYW5nZXMgdG8gUkVBRE1FIGZpbGUuCgo2LzExLzIwMDE6IG1rb2VwcGUKCSAgIEZpeGVkIHR5cG8gaW4gTWFrZWZpbGUuaW47IHRoYW5rcyB0byBHcmVnIFRyb3hlbAoJICAgPGdkdEBpci5iYm4uY29tPi4gCgo2LzA4LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgbWFrZSBjaGVjayB3b3JrcyBhZ2Fpbi4gRXhhbXBsZXMvR0lGUGxvdCBjb25maWd1cmUgZ2VuZXJhdGVkIGJ5CgkgICB0b3AgbGV2ZWwgYXV0b2NvbmYgbm93LgoKNi8wOC8yMDAxOiBta29lcHBlCgkgICBBbm90aGVyIGJ1aWxkIGNoYW5nZTogVGhlIG5ldyBzY3JpcHQgYXV0b2dlbi5zaCBydW5zCgkgICBhdXRvY29uZiBpbiB0aGUgYXBwcm9wcmlhdGUgZGlyZWN0b3JpZXMuICBUaGUgdG9wLWxldmVsCgkgICBjb25maWd1cmUgYWxzbyBjb25maWd1cmVzIGluIEV4YW1wbGVzL0dJRlBsb3QuCgo2LzA3LzIwMDE6IG1rb2VwcGUKCSAgIE1hZGUgdGhlIE1ha2VmaWxlIHdvcmsgd2l0aCBub24tR05VIG1ha2UgYWdhaW4uCgo2LzA3LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIENsYXNzL3N0cnVjdCBtZW1iZXJzIHRoYXQgYXJlIGFycmF5cyBvZiBwb2ludGVycyB0byBjbGFzc2VzL3N0cnVjdHMgLQoJICAgU2hhZG93IGNsYXNzJ3MgZ2V0L3NldCBhY2Nlc3NvcnMgbm93IHVzZSBKYXZhIGNsYXNzZXMgaW5zdGVhZCBvZiBsb25ncyAocG9pbnRlcnMpLgoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIHdpbGwgbm93IGNsZWFuIHVwIG1lbW9yeSBpZiBmdW5jdGlvbiByZXR1cm4gdHlwZSAKCSAgIGlzIGEgY2xhc3Mvc3RydWN0LgoJICAgW0phdmFdIE5ldyBleGFtcGxlIGNhbGxlZCByZWZlcmVuY2UgYmFzZWQgb24gdGhlIHNhbWUgZXhhbXBsZSBmcm9tIG90aGVyIG1vZHVsZXMuCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIE5ldyBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeCBhbGxvd3MgZm9yCgkgICBhdHRhY2hpbmcgYSBzdWZmaXggdG8gdGhlIHN3aWcgYmluYXJ5IGFuZCB0aGUgc3dpZyBydW50aW1lCgkgICBsaWJyYXJpZXMuICBNaW5vciBjaGFuZ2VzIHRvIHRoZSBidWlsZCBzeXN0ZW0uICAic3dpZwoJICAgLXN3aWdsaWIiIHdvcmtzIGFnYWluLiAgSWYgaW52b2tlZCB3aXRoIHRoZSBuZXcgb3B0aW9uCgkgICAiLWxkZmxhZ3MiLCBTV0lHIHByaW50cyBhIGxpbmUgb2YgbGlua2VyIGZsYWdzIG5lZWRlZCB0bwoJICAgbGluayB3aXRoIHRoZSBydW50aW1lIGxpYnJhcnkgb2YgdGhlIHNlbGVjdGVkIGxhbmd1YWdlCgkgICBtb2R1bGUuIAoKNi8wNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIGdzd2lnX2xpc3RfcCBpcyBhbiBpbnQsIG5vdCBhIFNDTS4gIFRoaXMgdHlwbwoJICAgY2F1c2VkIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIHdpdGggYSBHdWlsZSBjb25maWd1cmVkIHdpdGgKCSAgIHN0cmljdCBDIHR5cGUgY2hlY2tpbmcuIEluIElOUFVUIGFuZCBCT1RIIHR5cGVtYXBzCgkgICBnZW5lcmF0ZWQgYnkgdGhlIFNJTVBMRV9NQVAgbWFjcm8sIHVzZSB0aGUgU0NNX1RPX0MKCSAgIGZ1bmN0aW9uIHRvIGNvbnZlcnQgZnJvbSBHdWlsZSB0byBDIChyYXRoZXIgdGhhbiBDX1RPX1NDTSkuCgkgICBVc2Ugc2NtX2ludHByaW50IHRvIHByaW50IHBvaW50ZXJzIChyYXRoZXIgdGhhbgoJICAgc3ByaW50ZikuIEFsbG93IHVzaW5nICItbGlua2FnZSIgaW5zdGVhZCBvZiAiLUxpbmthZ2UiLiAKCjYvMDUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gTW9kcyBmb3IgdXNpbmcgaW5oZXJpdGVkIGMrKyBjbGFzc2VzIGZyb20gSmF2YQoJICAgW0phdmFdIE5ldyBleGFtcGxlIGNhbGxlZCBjbGFzcyBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcwoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBkZXN0cnVjdG9yIChfZGVsZXRlKCkpIHdhcyBub3QgYXdhcmUgb2YgJW5hbWUgcmVuYW1pbmcKCSAgIFtKYXZhXSBleHRlbmRzIGJhc2VjbGFzcyBkaWQgbm90IGtub3cgYWJvdXQgJW5hbWUgcmVuYW1pbmcKCSAgIFtKYXZhXSBleHRlbmRzIGJhc2VjbGFzcyBkaWQgZXh0ZW5kIGV2ZW4gd2hlbiB0aGUgYmFzZWNsYXNzIHdhcyBub3Qga25vd24gdG8gc3dpZwoJICAgW0phdmFdIHNvbWV0aW1lcyBlbnVtLWRlY2xhcmF0aW9ucyBvY2N1cnJlZCBiZWZvcmUgdGhlIEphdmEgY2xhc3MgZGVjbGFyYXRpb24KCSAgIFtKYXZhXSB1bnJlbGF0ZWQgZW51bSBpbml0aWFsaXNhdGlvbnMgbm8gbG9uZ2VyIGFwcGVhciBpbiBKYXZhIGNsYXNzCgkgICBbSmF2YV0gaWYgbW9kdWxlIGVuZHMgaW4gJ18nIGNvcnJlY3QgSk5JIG5hbWVzIGFyZSBub3cgcHJvZHVjZWQKCjYvMDQvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzIG1vZHMgLSBNb2RpZmllZCBjb25zdHJ1Y3RvciByZXBsYWNlcwoJICAgbmV3SW5zdGFuY2UoKS4gX2RlbGV0ZSgpIG5vdyB0aHJlYWQgc2FmZS4gZ2V0Q1B0cigpIHJlcGxhY2VzCgkgICBfc2VsZi4gX3NlbGZDbGFzcygpIHJlbW92ZWQgYXMgbm93IHJlZHVuZGFudC4gCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoJICAgW0phdmFdIE5vdCBhbGwgb3V0cHV0IGphdmEgZmlsZXMgaGFkIFNXSUcgYmFubmVyLiBOZXcgYmFubmVyLgoKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgZmluYWxpemVycyBhcmUgb3V0cHV0IGJ5IGRlZmF1bHQ6IENvbW1hbmQKCSAgIGxpbmUgb3B0aW9uIC1maW5hbGl6ZSBkZXByZWNhdGVkIGFuZCByZXBsYWNlZCB3aXRoIC1ub2ZpbmFsaXplLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIENhc3QgU0NNX0NBUigpIHRvIHNjbV9iaXRzX3QgYmVmb3JlIHNoaWZ0aW5nIGl0LgoJICAgVGhpcyBpcyByZXF1aXJlZCBmb3IgY29tcGlsaW5nIHdpdGggYSBHdWlsZSBjb25maWd1cmVkIHdpdGgKCSAgIHN0cmljdCBDIHR5cGUgY2hlY2tpbmcuICAKCjYvIDEvMjAwMTogbWtvZXBwZQoJICAgQWRkZWQgY29uZmlndXJlIG9wdGlvbiAiLS13aXRoLXN3aWdsaWJkaXIiLgoKNS8zMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFN1cHBvcnQgbXVsdGlwbGUgcGFyYWxsZWwgbGlzdHMgb3IgdmVjdG9ycyBpbgoJICAgdGhlIHR5cGVtYXBzIHByb3ZpZGVkIGJ5IGxpc3QtdmVjdG9yLmkuICBOZXcgdHlwZW1hcHMgZmlsZSwKCSAgIHBvaW50ZXItaW4tb3V0LmkuIAoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBIVE1MIHVwZGF0ZSBmb3IgZXhhbXBsZXMuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gIEFkZGVkIHN1YmRpcmVjdG9yeSBmb3IKCSAgIERlYmlhbiBwYWNrYWdlIGNvbnRyb2wgZmlsZXMuCgo1LzI4LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQnVpbGQgYSBydW50aW1lIGxpYnJhcnksIGxpYnN3aWdndWlsZS4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb24gJCpkZXNjcmlwdG9yLiAgVXNlIHRoZSB7fQoJICAgc3ludGF4LCByYXRoZXIgdGhhbiB0aGUgIiIgc3ludGF4IGZvciB0aGUgc3RhbmRhcmQKCSAgIHR5cGVtYXBzLCBpbiBvcmRlciB0byB3b3JrIGFyb3VuZCBzdHJhbmdlIG1hY3JvLWV4cGFuc2lvbgoJICAgYmVoYXZpb3Igb2YgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgVGhpcyBpbnRyb2R1Y2VzIHNvbWUKCSAgIGV4dHJhIGJyYWNlcy4KCjUvMjcvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBIYW5kbGUgcG9pbnRlciB0eXBlcyB3aXRoIHR5cGVtYXBzLCByYXRoZXIgdGhhbgoJICAgaGFyZC1jb2RlZC4gTmV3IHR5cGVtYXAgc3Vic3RpdHV0aW9ucyAkZGVzY3JpcHRvciwKCSAgICRiYXNlZGVzY3JpcHRvcjsgc2VlIGRvY3VtZW50YXRpb24uIFNvbWUgY2xlYW4tdXAgaW4gdGhlCgkgICB2YXJpYWJsZS9jb25zdGFudHMgd3JhcHBlciBnZW5lcmF0b3IgY29kZS4gIE5ldyBjb252ZW5pZW5jZQoJICAgbWFjcm8gU1dJR19HdWlsZV9NdXN0R2V0UHRyLCB3aGljaCBhbGxvd3MgZ2V0dGluZyBwb2ludGVycwoJICAgZnJvbSBzbW9icyBpbiBhIGZ1bmN0aW9uYWwgc3R5bGUuICBOZXcgdHlwZW1hcCBmaWxlCgkgICAibGlzdC12ZWN0b3IuaSIsIHByb3ZpZGluZyBtYWNyb3MgdGhhdCBkZWZpbmUgdHlwZW1hcHMgZm9yCgkgICBjb252ZXJ0aW5nIGJldHdlZW4gQyBhcnJheXMgYW5kIFNjaGVtZSBsaXN0cyBhbmQgdmVjdG9ycy4KCjUvMjUvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gU1RMIHN0cmluZyBtb3ZlZCBpbnRvIGl0cyBvd24gdHlwZW1hcCBhcyBpdCBpcyBjKysgY29kZSBhbmQgCgkgICBpdCBicmVhayBhbnkgYyBjb2RlIHVzaW5nIHRoZSB0eXBlbWFwcy5pIGZpbGUuCgkgICAtIEZpeGVzIGZvciB3cmFwcGVycyBhcm91bmQgZ2xvYmFsIHZhcmlhYmxlcyAtIGFwcGxpZXMgdG8gcHJpbWl0aXZlIAoJICAgdHlwZXMgYW5kIHVzZXIgdHlwZXMgKGNsYXNzL3N0cnVjdCkgYW5kIHBvaW50ZXJzIHRvIHRoZXNlLgoJICAgLSBTdHJ1Y3R1cmUgbWVtYmVyIHZhcmlhYmxlcyBhbmQgY2xhc3MgcHVibGljIG1lbWJlciB2YXJpYWJsZXMgZ2V0dGVycyAKCSAgIGFuZCBzZXR0ZXJzIHBhc3MgYSBwb2ludGVyIHRvIHRoZSBtZW1iZXIgYXMgd2FzIGluIDEuM2EzIGFuZCAxLjEgCgkgICAoMS4zYTUgd2FzIHBhc3NpbmcgYnkgdmFsdWUpCgkgICAtIFBhcmFtZXRlcnMgdGhhdCB3ZXJlIGFycmF5cyBhbmQgcmV0dXJuIHR5cGVzIHdlcmUgaW5jb3JyZWN0bHkgCgkgICBiZWluZyBwYXNzZWQgdG8gY3JlYXRlX2Z1bmN0aW9uKCkgYXMgcG9pbnRlcnMuCgkgICAtIEZpeCBmb3IgYXJyYXlzIG9mIGVudW1zLiAKCSAgIFtKYXZhXSBVcGRhdGVkIGphdmEgZXhhbXBsZXMgYW5kIGFkZGVkIHR3byBtb3JlLgoJICAgW0phdmFdIEphdmEgbW9kdWxlIHVwZGF0ZWQgZnJvbSBTV0lHMS4zYTMgaW5jbHVkaW5nIGNvZGUgY2xlYW51cCBldGMuCgkgICBbSmF2YV0gZW51bSBzdXBwb3J0IGFkZGVkLgoJICAgW0phdmFdIEFycmF5IHN1cHBvcnQgaW1wbGVtZW50ZWQKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3NlcyBpbXByb3ZlZCAtIEphdmEgb2JqZWN0cyB1c2VkIHJhdGhlciB0aGFuIAoJICAgbG9uZ3MgaG9sZGluZyB0aGUgYyBwb2ludGVyIHRvIHRoZSB3cmFwcGVkIHN0cnVjdHVyZS9jKytjbGFzcwoKNS8yMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIGV4dGVybiAiQyIgZGVjbGFyYXRpb25zIGluIEMrKyBtb2RlLiBUaGFua3MKCSAgIHRvIEdyZWcgVHJveGVsIDxnZHRAaXIuYmJuLmNvbT4uCgo1LzIxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTmV3IGxpbmthZ2UgIm1vZHVsZSIgZm9yIGNyZWF0aW5nIEd1aWxlIG1vZHVsZXMgZm9yCgkgICBHdWlsZSB2ZXJzaW9ucyA+PSAxLjUuMC4gCgo0LzE4LzIwMDE6IG1rb2VwcGUKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIHBhc3NpbmcgdGhyb3VnaCBTY2hlbWVfT2JqZWN0CgkgICBwb2ludGVycy4gCgo0LzkvMjAwMSA6IG1rb2VwcGUgCgkgICBbTXpTY2hlbWVdIEFkZGVkIHR5cGVtYXBzIGZvciBgYm9vbCcuICBJbmNsdXNpb24gb2YgaGVhZGVycwoJICAgYW5kIHN1cHBvcnQgcm91dGluZXMgaXMgbm93IGRhdGEtZHJpdmVuIHZpYSBtenNjaGVtZS5pLgoJICAgSGVhZGVycyBjb21lIGZyb20gdGhlIG5ldyBmaWxlIG16c2NoZW1kZWMuc3dnLiAgRG9uJ3QgYWJvcnQKCSAgIGltbWVkaWF0ZWx5IHdoZW4gYSB0eXBlLWhhbmRsaW5nIGVycm9yIGlzIHJlcG9ydGVkLiAgV2hlbgoJICAgc2VhcmNoaW5nIGZvciB0eXBlbWFwcyBmb3IgZW51bXMsIGZhbGwgYmFjayB0byB1c2luZyBpbnQsCgkgICBsaWtlIHRoZSBHdWlsZSBiYWNrZW5kIGRvZXMuICBTdXBwb3J0IGNoYXIgY29uc3RhbnRzLiAgRW1pdAoJICAgY29ycmVjdCB3cmFwcGVyIGNvZGUgZm9yIHZhcmlhYmxlcy4KCjMvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBGaXhlZCB0eXBlbWFwcyBmb3IgY2hhciAqKk9VVFBVVCwgY2hhciAqKkJPVEguCgozLzIvMjAwMSA6IG1rb2VwcGUgCgkgICBbR3VpbGVdIEV2ZXJ5IHdyYXBwZXIgZnVuY3Rpb24gbm93IGdldHMgYSBib29sZWFuIHZhcmlhYmxlCgkgICBnc3dpZ19saXN0X3Agd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgbXVsdGlwbGUgdmFsdWVzIGFyZQoJICAgcHJlc2VudC4gVGhlIG1hY3JvcyBHVUlMRV9BUFBFTkRfUkVTVUxULCBHVUlMRV9NQVlCRV9WQUxVRVMKCSAgIGFuZCBHVUlMRV9NQVlCRV9WRUNUT1IgdXNlIHRoaXMgdmFyaWFibGUsIHJhdGhlciB0aGFuCgkgICBjaGVja2luZyB3aGV0aGVyIHRoZSBjdXJyZW50IHJldHVybiB2YWx1ZSBpcyBhIGxpc3QuIFRoaXMKCSAgIGFsbG93cyBmb3IgdHlwZW1hcHMgcmV0dXJuaW5nIGEgbGlzdCBhcyBhIHNpbmdsZSB2YWx1ZSAoYQoJICAgbGlzdCB3YXMgZXJyb25lb3VzbHkgY29udmVydGVkIGludG8gYSB2ZWN0b3Igb3IgYQoJICAgbXVsdGlwbGUtdmFsdWUgb2JqZWN0IGluIHRoaXMgY2FzZSkuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nIG11bHRpcGxlIHZhbHVlcyBhcwoJICAgdmVjdG9ycywgb3IgcGFzc2luZyB0aGVtIHRvIGEgbXVsaXBsZS12YWx1ZQoJICAgY29udGludWF0aW9uLiBCeSBkZWZhdWx0LCBtdWx0aXBsZSB2YWx1ZXMgc3RpbGwgZ2V0CgkgICByZXR1cm5lZCBhcyBhIGxpc3QuCgozLzEvMjAwMSA6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQWRkZWQgYSAiYmVmb3JlcmV0dXJuIiBwcmFnbWEuIFRoZSB2YWx1ZSBvZiB0aGlzCgkgICBwcmFnbWEgaXMgaW5zZXJ0ZWQganVzdCBiZWZvcmUgZXZlcnkgcmV0dXJuIHN0YXRlbWVudC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciBHdWlsZSAxLjQuMSBwcm9jZWR1cmUKCSAgIGRvY3VtZW50YXRpb24gZm9ybWF0cywgc2VlIGludGVybmFscy5odG1sLgoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE1hZGUgdGhlIHdyYXBwZXIgY29kZSBjb21waWxlIHdpdGggQysrIGlmIHRoZQoJICAgIi1jKysiIGNvbW1hbmQtbGluZSBzd2l0Y2ggaXMgZ2l2ZW4uICBUaGFua3MgdG8KCSAgIDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTm93IHR3byB0eXBlIHRhYmxlcywgc3dpZ190eXBlcyBhbmQKCSAgIHN3aWdfdHlwZXNfaW5pdGlhbCwgYXJlIHVzZWQsIGFzIGFsbCBvdGhlciBTV0lHIGxhbmd1YWdlCgkgICBtb2R1bGVzIGRvLiAgVGhpcyByZW1vdmVzIHRoZSBuZWVkIGZvciB0aGUgdHJpY2t5CgkgICBjb25zdHJ1Y3Rpb24gdXNlZCBiZWZvcmUgdGhhdCB0aGUgYnJva2VuIFJlZGhhdCA3LjAgZ2NjCgkgICBkb2Vzbid0IHBhcnNlLiBSZXBvcnRlZCBieSA8bW9ua2V5aXFAZGluZ29ibHVlLm5ldC5hdT4uIAoKMi8yNi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICpPVVRQVVQsIGNoYXIgKkJPVEg7IGEgYmFkCgkgICBmcmVlKCkgd291bGQgYmUgZW1pdHRlZC4gIEFkZGVkIHR5cGVtYXAgZm9yIFNDTS4KCgpWZXJzaW9uIDEuMyBBbHBoYSA1IAo9PT09PT09PT09PT09PT09PT09Cgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgW1B5dGhvbl0gUHl0aG9uIG1vZHVsZSBnZW5lcmF0ZXMgbW9yZSBlZmZpY2llbnQgY29kZSBmb3IKICAgICAgICAgIGNyZWF0aW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgYSB3cmFwcGVyIGZ1bmN0aW9uLiBNb2RpZmljYXRpb24KICAgICAgICAgIHN1Z2dlc3RlZCBieSBKb24gVHJhdmlzLgoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIExpYnJhcnkgZmlsZXMgc3BlY2lmaWVkIHdpdGggdGhlIC1sIG9wdGlvbiBhcmUgbm93IGluY2x1ZGVkIGF0IHRoZQogICAgICAgICAgZW5kIG9mIHRoZSBpbnRlcmZhY2UgZmlsZSAocmV2ZXJ0aW5nIHRvIHRoZSBvbGQgYmVoYXZpb3IpLgoKOS8xOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBlbnVtIGhhbmRsaW5nLiAgZW51bXMgYXJlIG5vdyBtYW5pcHVsYXRlZCBhcwogICAgICAgICAgJ2ludCcsIGJ1dCBjYXN0IGludG8gdGhlIGVudW0gdHlwZSB3aGVuIHZhbHVlcyBhcmUgcGFzc2VkIHRvIHRoZSAKICAgICAgICAgIGNvcnJlc3BvbmRpbmcgQyBmdW5jdGlvbi4KCjkvMTkvMDAgOiBta29lcHBlCgkgIFtHdWlsZV0gUmVtb3ZlZCAiLXdpdGgtc21vYnMiIGNvbW1hbmQtbGluZSBvcHRpb24sIGFzIHRoaXMgaXMgdGhlCgkgIGRlZmF1bHQgbm93LiAgQWRkZWQgIi1lbWl0LXNldHRlcnMiIGNvbW1hbmQtbGluZSBvcHRpb24sCgkgIHdoaWNoIHR1cm5zIG9uIGdlbmVyYXRpbmcgcHJvY2VkdXJlcy13aXRoLXNldHRlcnM7IHNlZQoJICBpbnRlcm5hbHMuaHRtbC4KCjkvMTgvMDAgOiBta29lcHBlCgkgIEluY29ycG9yYXRlZCBwYXRjaCAjMTAxNDMwLCBmaXhpbmcgYnVncyBpbiB0aGUgR3VpbGUgbW9kdWxlOiAKCSAgMS4gU29tZSBhcmd1bWVudHMgd2VyZSBlcnJvbmVvdXNseSB0YWtlbiBhcyAqb3B0aW9uYWwqIGFyZ3VtZW50cyB3aGVuCgkgICAgIGlnbm9yZWQgYXJndW1lbnRzIHdlcmUgcHJlc2VudC4gCgkgIDIuIEd1aWxlIDEuMy40IHdhcyBub3Qgc3VwcG9ydGVkIHNpbmNlIGZ1bmN0aW9ucyBpbnRyb2R1Y2VkIGluIEd1aWxlCgkgICAgICAxLjQgd2VyZSB1c2VkLgkgIAoJICAzLiBBZGRlZCBoYW5kbGluZyBvZiBgY29uc3QgY2hhciAqJy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZmFpbGVkIGFzc2VydGlvbiBhbmQgbGFyZ2UgZmlsZXMuCgo5LzE3LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHRoZSAnJScgY2hhcmFjdGVyIGFwcGVhcmluZyBpbiBhZGRlZCBtZXRob2RzCiAgICAgICAgICBhbmQgZnVuY3Rpb24gYm9kaWVzLiAgUHJlcHJvY2Vzc29yIGJ1Zy4KClZlcnNpb24gMS4zIEFscGhhIDQgKFNlcHRlbWJlciA0LCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMy8wMCAgOiB0dG4KICAgICAgICAgIEFkZGVkIGluc3RydWN0aW9ucyBmb3IgbWFpbnRhaW5lcnMgaW4gRXhhbXBsZXMvUkVBRE1FIG9uIGhvdwogICAgICAgICAgdG8gbWFrZSBleGFtcGxlcyBhbHNvIGJlIHVzZWZ1bCBpbiB0aGUgdGVzdGluZyBmcmFtZXdvcmsuCiAgICAgICAgICBBbHNvLCAibWFrZSBjaGVjayIgbm93IHVzZXMgLi9MaWIgYnkgdmlhIGVudiB2YXIgYFNXSUdfTElCJy4KICAgICAgICAgIFRoaXMgaXMgb3ZlcnJpZGFibGUgbGlrZSBzbzoKICAgICAgICAgICAgIG1ha2UgY2hrLXN3aWdsaWI9L215L2V4cGVyaW1lbnRhbC9zd2lnL0xpYiBjaGVjawoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkICR0eXBlbWFwIHZhcmlhYmxlIHRvIHR5cGVtYXBzLiAgVGhpcyBnZXRzIHJlcGxhY2VkIHdpdGgKICAgICAgICAgIGEgc3RyaW5nIGluZGljYXRpbmcgdGhlIHR5cGVtYXAgdGhhdCBpcyBhcHBsaWVkLiAgRmVhdHVyZQogICAgICAgICAgcmVxdWVzdCBmcm9tIHJzYWx6LgoKOS8zLzAwICA6IGJlYXpsZXkKICAgICAgICAgIEV4cGVyaW1lbnRhbCBvcHRpbWl6YXRpb24gdG8gY29kZSBnZW5lcmF0aW9uIGZvciB2aXJ0dWFsCiAgICAgICAgICBtZW1iZXIgZnVuY3Rpb25zLiAgSWYgeW91IGhhdmUgdHdvIGNsYXNzZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICBjbGFzcyBBKCkgewogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgY2xhc3MgQigpIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBTd2lnIG5vdyB3aWxsIGdlbmVyYXRlIGEgc2luZ2xlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoaXMKCiAgICAgICAgICAgICAgICBBX2ZvbyhBICphKSB7CiAgICAgICAgICAgICAgICAgICAgYS0+Zm9vKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgYW5kIHVzZSBpdCBhcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgYm90aCBBX2ZvbygpIGFuZCBCX2ZvbygpLgogICAgICAgICAgVGhpcyBvcHRpbWl6YXRpb24gb25seSB0YWtlcyBwbGFjZSBpZiBib3RoIG1ldGhvZHMgYXJlIGRlY2xhcmVkCiAgICAgICAgICBhcyB2aXJ0dWFsIGFuZCBib3RoIHRha2UgaWRlbnRpY2FsIHBhcmFtZXRlcnMuCiAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgUmVzdG9yZWQgdGhlICJtZW1iZXJpbiIgdHlwZW1hcCBmb3Igc2V0dGluZyBzdHJ1Y3R1cmUgbWVtYmVycy4KICAgICAgICAgIFVubGlrZSB0aGUgb2xkIHZlcnNpb24sIHRoZSBuZXcgdmVyc2lvbiBpcyBleHBhbmRlZCBpbmxpbmUgaW4gdGhlCiAgICAgICAgICB3cmFwcGVyIGZ1bmN0aW9uIGFsbG93aW5nIGFjY2VzcyB0byBzY3JpcHRpbmcgbGFuZ3VhZ2UKICAgICAgICAgIGludGVybmFscyAoYSBzb21ldGltZXMgcmVxdWVzdGVkIGZlYXR1cmUpLiBUaGUgIm1lbWJlcm91dCIgdHlwZW1hcAogICAgICAgICAgaXMgZ29uZS4gVXNlIHRoZSAib3V0IiB0eXBlbWFwcyBpbnN0ZWFkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQXR0cmlidXRlIHNldCBtZXRob2RzIG5vIGxvbmdlciByZXR1cm4gdGhlIHZhbHVlIG9mIGEgbWVtYmVyLgogICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIG5vdyBnZXRzIHNldCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICB2b2lkIEZvb194X3NldChGb28gKmYsIGludCB4KSB7CiAgICAgICAgICAgICAgICAgICAgZi0+eCA9IHg7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIEluIFNXSUcxLjEgaXQgdXNlZCB0byBiZSB0aGlzOgoKICAgICAgICAgICAgICBpbnQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgIHJldHVybiAoZi0+eCA9IHgpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIGhhcyBiZWVuIGNoYW5nZWQgZHVlIHRvIHRoZSBjb21wbGV4aXR5IGNyZWF0ZWQgYnkgdHJ5aW5nCiAgICAgICAgICB0byBkbyB0aGlzIHdpdGggbW9yZSBleG90aWMgZGF0YXR5cGVzIHN1Y2ggYXMgYXJyYXlzLiAgSXQgYWxzbwogICAgICAgICAgY29tcGxpY2F0ZXMgaW5saW5pbmcgYW5kIGhhbmRsaW5nIG9mIHRoZSAibWVtYmVyaW4iIHR5cGVtYXAuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBwdHJjYXN0KCkgYW5kIHB0cm1hcCgpIGZ1bmN0aW9ucyBmcm9tIHRoZQogICAgICAgICAgcG9pbnRlci5pIGxpYnJhcnkgZmlsZS4gIE9sZCBpbXBsZW1lbnRhdGlvbiBpcyBpbmNvbXBhdGlibGUKICAgICAgICAgIHdpdGggbmV3IHR5cGUgc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo5LzIvMDAgIDogYmVhemxleQogICAgICAgICAgTmV3IHJ1bnRpbWUgZnVuY3Rpb24gU1dJR19UeXBlUXVlcnkoY29uc3QgY2hhciAqbmFtZSkgYWRkZWQuCiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIHR5cGUgaW5mbyBzdHJ1Y3R1cmUKICAgICAgICAgIHRoYXQgaXMgdXNlZCBmb3IgdHlwZS1jaGVja2luZy4gIEl0IHdvcmtzIHdpdGggZWl0aGVyIHRoZQogICAgICAgICAgbmljZSBDIG5hbWUgb3IgbWFuZ2xlZCB2ZXJzaW9uIG9mIGEgZGF0YXR5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU3dpZ19UeXBlUXVlcnkoImludCAqIik7CiAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5ID0gU3dpZ19UeXBlUXVlcnkoIl9wX2ludCIpOwoKICAgICAgICAgIFRoaXMgaXMgYW4gYWR2YW5jZWQgZmVhdHVyZSB0aGF0IGhhcyBiZWVuIGFkZGVkIHRvIHN1cHBvcnQgc29tZQogICAgICAgICAgZXhvdGljIGV4dGVuc2lvbiBtb2R1bGVzIHRoYXQgbmVlZCB0byBkaXJlY3RseSBtYW5pcHVsYXRlCiAgICAgICAgICBzY3JpcHRpbmcgbGFuZ3VhZ2Ugb2JqZWN0cy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgZGlyZWN0aXZlICV0eXBlcygpIGFkZGVkLiAgVGhpcyBpcyB1c2VkIHRvCiAgICAgICAgICBleHBsaWNpdGx5IGxpc3QgZGF0YXR5cGVzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluCiAgICAgICAgICB0aGUgcnVudGltZSB0eXBlLWNoZWNraW5nIGNvZGUuIE5vcm1hbGx5IGl0IGlzIG5ldmVyCiAgICAgICAgICBuZWNlc3NhcnkgdG8gdXNlIHRoaXMgYnV0IHNvbWV0aW1lcyBhZHZhbmNlZCBleHRlbnNpb25zCiAgICAgICAgICAoc3VjaCBhcyB0aGUgcG9pbnRlci5pIGxpYnJhcnkpIG1heSBuZWVkIHRvIG1hbnVhbGx5CiAgICAgICAgICBhZGQgdHlwZXMgdG8gdGhlIHR5cGUtY2hlY2tlci4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMzEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBJbXByb3ZlZCBoYW5kbGluZyBvZiBzdHJpbmcgYXJyYXkgdmFyaWFibGVzLiBGb3IgZXhhbXBsZSwKICAgICAgICAgIGEgZ2xvYmFsIHZhcmlhYmxlIG9mIHRoZSBmb3JtICJjaGFyIG5hbWVbNjRdIiBpcyBhdXRvbWF0aWNhbGx5CiAgICAgICAgICBtYW5hZ2VkIGFzIGEgNjQgY2hhcmFjdGVyIHN0cmluZy4gIFByZXZpb3VzbHkgdGhpcyBkaWRuJ3QKICAgICAgICAgIHdvcmsgYXQgYWxsIG9yIHJlcXVpcmVkIHRoZSB1c2Ugb2YgYSBzcGVjaWFsIHR5cGVtYXAuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKFRjbCwgUGVybCwgUHl0aG9uKSAqKioKCjgvMzEvMDAgOiB0dG4KCSAgQWRkZWQgTWFrZWZpbGUgdGFyZ2V0IGBjaGVjay1jKystZXhhbXBsZXMnLCB3aGljaCB1c2VzIG5ldwoJICBmaWxlcyB1bmRlciBFeGFtcGxlcy9DKysgY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4gIE5vdyAibWFrZQoJICBjaGVjayIgYWxzbyBkb2VzICJtYWtlIGNoZWNrLWMrKy1leGFtcGxlcyIuICBBbHNvLCBleHBhbmRlZAoJICBhY3Rpb25zIGluIGBjaGVjay1naWZwbG90LWV4YW1wbGUnIGFuZCBgY2hlY2stYWxpdmVuZXNzJy4KCjgvMzAvMDAgOiBta29lcHBlCgkgIE1ham9yIGNsZWFuLXVwIGluIHRoZSBHdWlsZSBtb2R1bGUuIEFkZGVkIHR5cGVtYXAtZHJpdmVuCgkgIGRvY3VtZW50YXRpb24gc3lzdGVtLiBDaGFuZ2VkIHRvIGhhbmRsZSBtb3JlIHRoYW4gMTAKCSAgYXJncy4gVXBkYXRlZCBhbmQgZXh0ZW5kZWQgZXhhbXBsZXMuCgkgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBuZXcgJWluc2VydCBkaXJlY3RpdmUgdGhhdCBpbnNlcnRzIHRoZSBjb250ZW50cyBvZiBhIGZpbGUKICAgICAgICAgIGludG8gYSBwb3J0aW9uIG9mIHRoZSBvdXRwdXQgd3JhcHBlciBmaWxlLiAgVGhpcyBpcyBvbmx5IGludGVuZGVkCiAgICAgICAgICBmb3IgdXNlIGJ5IHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIFdvcmtzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcnMpICAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KHJ1bnRpbWUpICAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KHdyYXBwZXJzKSAiZmlsZS5zd2ciOwogICAgICAgICAgICAgICAlaW5zZXJ0KGluaXQpICAgICAiZmlsZS5zd2ciOwoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBuZXcgJXJ1bnRpbWUgZGlyZWN0aXZlIHdoaWNoIGluY2x1ZGVzIGNvZGUgaW50byB0aGUgcnVudGltZQogICAgICAgICAgcG9ydGlvbiBvZiB0aGUgd3JhcHBlciBjb2RlLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXJ1bnRpbWUgJXsKICAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBpbnRlcm5hbCBydW50aW1lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICBUaGVyZSBpcyBubyBwcmFjdGljYWwgcmVhc29uIGZvciBvcmRpbmFyeSB1c2VycyB0byB1c2UgdGhpcwogICAgICAgICAgZmVhdHVyZSAoYWxtb3N0IGV2ZXJ5dGhpbmcgY2FuIGJlIGRvbmUgdXNpbmcgJXsgLi4uICV9CiAgICAgICAgICBpbnN0ZWFkKS4gICBIb3dldmVyLCB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMgbWF5IHdhbnQgdG8KICAgICAgICAgIHVzZSB0aGlzIGluIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24gZmlsZXMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI4LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgdXNpbmcgc3RyaW5nIGxpdGVyYWxzIGxpa2UKICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgIiR0YXJnZXQgPSBTdklWKCRzb3VyY2UpOyI7CgogICAgICAgICAgV2hlbiBjb2RlIGlzIHNwZWNpZmllZCBsaWtlIHRoaXMsIGl0IGlzICpOT1QqIGVuY2xvc2VkCiAgICAgICAgICBpbnNpZGUgYSBsb2NhbCBzY29wZSAoYXMgd2l0aCBvbGRlciB0eXBlbWFwIGRlY2xhcmF0aW9ucykuCiAgICAgICAgICBOb3RlOiBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlcyBhcmUgaW50ZXJwcmV0ZWQgaW4gdGhlCiAgICAgICAgICBjb2RlIHN0cmluZyBzbyBpZiB5b3Ugd2FudCB0byBpbmNsdWRlIGEgcXVvdGUgb3Igc29tZQogICAgICAgICAgb3RoZXIgc3BlY2lhbCBjaGFyYWN0ZXIsIG1ha2Ugc3VyZSB5b3UgdXNlIGEgKFwpLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBmb2xsb3cgdHlwZWRlZiBkZWNsYXJhdGlvbnMuCiAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgdGhpczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgTnVtYmVyOwoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50IHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYW4gaW50ZWdlciAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIHZvaWQgZm9vKE51bWJlciBhKTsKCiAgICAgICAgICBUaGUgdHlwZW1hcCBmb3IgJ2ludCcgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBhcmd1bWVudCAnTnVtYmVyIGEnLgogICAgICAgICAgT2YgY291cnNlLCBpZiB5b3Ugc3BlY2lmeSBhIHR5cGVtYXAgZm9yICdOdW1iZXInIGl0IHdpbGwgdGFrZQogICAgICAgICAgcHJlY2VkZW5jZSAobm9yIHdpbGwgaXQgZXZlciBiZSBhcHBsaWVkIHRvIGFuICdpbnQnKS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlZmF1bHQgdHlwZW1hcCBzcGVjaWZpY2F0aW9uIGhhcyBjaGFuZ2VkLiAgIEluIG9sZGVyCiAgICAgICAgICB2ZXJzaW9ucyBvZiBzd2lnLCB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgU1dJR19ERUZBVUxUX1RZUEUgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUbyBzcGVjaWZ5IHRoZSBkZWZhdWx0IGhhbmRsaW5nIG9mIGEgZGF0YXR5cGUuICAgTm93IHRoYXQKICAgICAgICAgIFNXSUcgZm9sbG93cyB0eXBlZGVmIGRlY2xhcmF0aW9ucywgdGhpcyBpcyB1bm5lY2Vzc2FyeS4KICAgICAgICAgIFNpbXBseSBzcGVjaWZ5aW5nIGEgdHlwZW1hcCBmb3IgJ2ludCcgd2lsbCB3b3JrIGZvciBhbGwKICAgICAgICAgIHZhcmlhdGlvbnMgb2YgaW50ZWdlcnMgdGhhdCBhcmUgdHlwZWRlZidkIHRvICdpbnQnLgoKICAgICAgICAgIENhdmVhdCwgc3BlY2lmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBmb3IgcG9pbnRlcnMsCiAgICAgICAgICByZWZlcmVuY2VzLCBhcnJheXMsIGFuZCB1c2VyIGRlZmluZWQgdHlwZXMgaXMgYSBsaXR0bGUKICAgICAgICAgIGRpZmZlcmVudC4gIFRoaXMgbXVzdCBiZSBkb25lIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdQT0lOVEVSICogewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgcG9pbnRlciAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdSRUZFUkVOQ0UgJiB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSByZWZlcmVuY2UgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHQVJSQVkgW10gewogICAgICAgICAgICAgICAgICAgICAgLi4uIGFuIGFycmF5IC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGEgdXNlci1kZWZpbmVkIHR5cGUgKGJ5IHZhbHVlKSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzE1LzAwIDogZHVzdGluCiAgICAgICAgICBUaGUgZmlsZSBzd2lnLTEuM2ExLTEuc3BlYyBoYXMgYmVlbiBhZGRlZCB0byB0aGUgVG9vbHMgZGlyZWN0b3J5LgogICAgICAgICAgSXQgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYSByZWRoYXQgcGFja2FnZSBmb3IgU1dJRywgYWx0aG91Z2ggaXQKICAgICAgICAgIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGZvciB0aGUgbmV4dCBwdWJsaWMgcmVsZWFzZS4KCjgvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBoYXZlIGJlZW4gY29tcGxldGVseSByZXdyaXR0ZW4uICBFdmVudHVhbGx5IHRoZXkgbWF5IGJlCiAgICAgICAgICByZXBsYWNlZCB3aXRoIHNvbWV0aGluZyBiZXR0ZXIsIGJ1dCBmb3Igbm93IHRoZXkgc3RheS4gIEhvd2V2ZXIsCiAgICAgICAgICB0aGVyZSBhcmUgYSBudW1iZXIgb2YgYSBzaWduaWZpY2FudCBjaGFuZ2VzIHRoYXQgbWF5IHRyaXAgc29tZQogICAgICAgICAgcGVvcGxlIHVwOgoKICAgICAgICAgIDEuICBUeXBlbWFwIHNjb3BpbmcgaXMgY3VycmVudGx5IGJyb2tlbi4gIEJlY2F1c2Ugb2YgdGhpcywgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIGNvZGUgd29uJ3Qgd29yay4KCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgaW50IGJhcihibGFoICp4KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggKjsgICAvKiBDbGVhciB0eXBlbWFwICovCgogICAgICAgICAgICAgICh0aGlzIGJyZWFrcyBiZWNhdXNlIHRoZSBjb2RlIGZvciB0aGUgY2xhc3MgRm9vIGlzIGFjdHVhbGx5CiAgICAgICAgICAgICAgZ2VuZXJhdGVkIGFmdGVyIHRoZSBlbnRpcmUgaW50ZXJmYWNlIGZpbGUgaGFzIGJlZW4gcHJvY2Vzc2VkKS4KICAgICAgICAgICAgICBUaGlzIGlzIG9ubHkgYSB0ZW1wb3JhcnkgYnVnLgoKICAgICAgICAgIDIuICBJbiBTV0lHMS4xLCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSB3b3JrZWQgYnkgcGVyZm9ybWluZyBhCiAgICAgICAgICAgICAgdmVyeSBjb21wbGV4IHR5cGUtYWxpYXNpbmcgcHJvY2VkdXJlLiAgRnJvbSB0aGlzIHBvaW50IG9uLAogICAgICAgICAgICAgICVhcHBseSBpcyBzaW1wbHkgYSBnZW5lcmFsaXplZCB0eXBlbWFwIGNvcHkgb3BlcmF0aW9uLgogICAgICAgICAgICAgIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSAqT1VUUFVUIHsgZG91YmxlICp4LCBkb3VibGUgKnkgfTsKCiAgICAgICAgICAgICAgQ29waWVzICpBTEwqIGN1cnJlbnRseSBkZWZpbmVkIHR5cGVtYXBzIGZvciAnZG91YmxlICpPVVRQVVQnIGFuZAogICAgICAgICAgICAgIGNvcGllcyB0aGVtIHRvICdkb3VibGUgKngnIGFuZCAnZG91YmxlICp5Jy4KCiAgICAgICAgICAgICAgTW9zdCBwZW9wbGUgcHJvYmFibHkgd29uJ3QgZXZlbiBub3RpY2UgdGhpcyBjaGFuZ2UgaW4KICAgICAgICAgICAgICAlYXBwbHkuICBIb3dldmVyLCB3aGVyZSBpdCB3aWxsIGJyZWFrIHRoaW5ncyBpcyBpbiBjb2RlIGxpa2UKICAgICAgICAgICAgICB0aGlzOgoKICAgICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSAqT1VUUFVUIHsgZG91YmxlICp4IH07CiAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKk9VVFBVVCB7CiAgICAgICAgICAgICAgICAgICAgICAgLi4uIHdoYXRldmVyIC4uLgogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKngpOwoKICAgICAgICAgICAgICBJbiBTV0lHMS4xLCB5b3Ugd2lsbCBmaW5kIHRoYXQgJ2ZvbycgdXNlcyB0aGUgJ2RvdWJsZSAqT1VUUFVUJyBydWxlCiAgICAgICAgICAgICAgZXZlbiB0aG91Z2ggaXQgd2FzIGRlZmluZWQgYWZ0ZXIgdGhlICVhcHBseSBkaXJlY3RpdmUgKHRoaXMgaXMKICAgICAgICAgICAgICB0aGUgd2VpcmQgYWxpYXNpbmcgc2NoZW1lIGF0IHdvcmspLiAgSW4gU1dJRzEuMyBhbmQgbGF0ZXIsCiAgICAgICAgICAgICAgdGhlICdkb3VibGUgKk9VVFBVVCcgcnVsZSBpcyBpZ25vcmVkIGJlY2F1c2UgaXQgaXMgZGVmaW5lZAogICAgICAgICAgICAgIGFmdGVyIHRoZSAlYXBwbHkgZGlyZWN0aXZlLgoKICAgICAgICAgIDMuICBUaGUgJWNsZWFyIGRpcmVjdGl2ZSBoYXMgYmVlbiBtb2RpZmllZCB0byBlcmFzZSBhbGwgY3VycmVudGx5CiAgICAgICAgICAgICAgZGVmaW5lZCB0eXBlbWFwcyBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUuICBUaGlzIGRpZmZlcnMgZnJvbQogICAgICAgICAgICAgIFNXSUcxLjEgd2hlcmUgJWNsZWFyIG9ubHkgcmVtb3ZlZCBydWxlcyB0aGF0IHdlcmUgYWRkZWQgdXNpbmcKICAgICAgICAgICAgICB0aGUgJWFwcGx5IGRpcmVjdGl2ZS4KCiAgICAgICAgICA0LiAgVHlwZW1hcCBtYXRjaGluZyBpcyBub3cgcGVyZm9ybWVkIHVzaW5nICpleGFjdCogdHlwZXMuCiAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoaW5ncyBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgY2hhciAqIHsgfQogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IGNoYXIgKiB7IH0KCiAgICAgICAgICAgICAgYXJlIGRpZmZlcmVudCB0eXBlbWFwcy4gICAgQSBzaW1pbGFyIHJ1bGUgYXBwbGllcyBmb3IgcG9pbnRlcnMsCiAgICAgICAgICAgICAgYXJyYXlzLCBhbmQgcmVmZXJlbmNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKiB7IH0KCiAgICAgICAgICAgICAgdXNlZCB0byBhcHBseSB0byAnZG91YmxlICYnLCAnZG91YmxlIFtdJywgIE5vdywgaXQgb25seSBhcHBsaWVzCiAgICAgICAgICAgICAgdG8gJ2RvdWJsZSAqJy4gIElmIHlvdSB3YW50IGEgJ2RvdWJsZSAmJywgeW91J2xsIG5lZWQgdG8gaGFuZGxlCiAgICAgICAgICAgICAgdGhhdCBzZXBhcmF0ZWx5LgoKICAgICAgICAgIDUuICBBcnJheSBtYXRjaGluZyBoYXMgYmVlbiBzaW1wbGZpZWQuICBJbiBTV0lHMS4xLCBhcnJheSBtYXRjaGluZwogICAgICAgICAgICAgIHdhcyBwZXJmb3JtZWQgYnkgdHJ5aW5nIHZhcmlvdXMgY29tYmluYXRpb25zIG9mIGRpbWVuc2lvbnMuCiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsICdkb3VibGUgYVsxMF1bMjBdJyB3YXMgbWF0Y2hlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bQU5ZXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldW0FOWV0KCiAgICAgICAgICAgICAgSW4gU1dJRzEuMywgb25seSB0aGUgZm9sbG93aW5nIG1hdGNoZXMgYXJlIGF0dGVtcHRlZDoKCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVsyMF0KICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbQU5ZXVtBTlldCgogICAgICAgICAgT24gdGhlIHBvc2l0aXZlIHNpZGUsIHR5cGVtYXAgbWF0Y2hpbmcgaXMgbm93ICpzaWduaWZpY2FudGx5KiBmYXN0ZXIKICAgICAgICAgIHRoYW4gYmVmb3JlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzE1LzAwIDogYmVhemxleQogICAgICAgICAgU2VjcmV0IGRldmVsb3BlciBmZWF0dXJlLiAgU2luY2UgZGF0YXR5cGVzIGFyZSBub3cgcmVwcmVzZW50ZWQgYXMgCiAgICAgICAgICBzdHJpbmdzIGludGVybmFsbHksIHlvdSBjYW4gYnlwYXNzIGxpbWl0YXRpb25zIG9mIHRoZSBwYXJzZXIgYW5kCiAgICAgICAgICBjcmVhdGUgYSB3aWxkIGRhdGF0eXBlIGJ5IHNpbXBseSBlbmNsb3NpbmcgdGhlIHJhdyBzdHJpbmcgZW5jb2RpbmcKICAgICAgICAgIGluIGJhY2t0aWNrcyAoYGApIGFuZCBzdGlja2luZyBpdCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUgYW55d2hlcmUgYQogICAgICAgICAgdHlwZSBpcyBleHBlY3RlZC4gIEZvciBleGFtcGxlLCBgYSgyMCkuYSgxMCkucC5mKGludCxpbnQpYC4gIFRoaXMgCiAgICAgICAgICBmZWF0dXJlIGlzIG9ubHkgaW50ZW5kZWQgZm9yIHRlc3RpbmcgKGkuZS4sIHlvdSB3YW50IHRvIHNlZSB3aGF0CiAgICAgICAgICBoYXBwZW5zIHRvIHlvdXIgbGFuZ3VhZ2UgbW9kdWxlIGlmIGl0IGdldHMgYSByZWZlcmVuY2UgdG8gYSBwb2ludGVyCiAgICAgICAgICB0byBhbiBhcnJheSBvZiBwb2ludGVycyB0byBmdW5jdGlvbnMgb3Igc29tZXRoaW5nKS4gCiAgICAgICAgICAqKiogU0lDSyBIQUNLICoqKgoKOC8xNC8wMCA6IGJlYXpsZXkKICAgICAgICAgIENvbXBsZXRlbHkgbmV3IHR5cGUtc3lzdGVtIGFkZGVkIHRvIHRoZSBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgIE1vcmUgZGV0YWlscyBsYXRlci4KCjgvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDbGVhbmVkIHVwIHNvbWUgb2YgdGhlIEkvTyBoYW5kbGluZy4gIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcwogICAgICAgICAgYW55IHRlbXBvcmFyeSBmaWxlcyBzdWNoIGFzIF93cmFwLndyYXAsIF93cmFwLmlpLCBfd3JhcC5pbml0LgogICAgICAgICAgSW5zdGVhZCwgdGhlc2UgImZpbGVzIiBhcmUga2VwdCBhcm91bmQgaW4gbWVtb3J5IGFzIHN0cmluZ3MKICAgICAgICAgIChhbHRob3VnaCB0aGlzIGlzIHRyYW5zcGFyZW50IHRvIGxhbmd1YWdlIG1vZHVsZXMpLgoKOC80LzAwICA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgImNoZWNrIiBhbmQgdmFyaWFudHMuCgkgIFRoaXMgY2FuIGJlIHVzZWQgbGlrZSAibWFrZSBjaGVjayIgb3IsIHRvIGV4cGxpY2l0bHkgc2tpcCBhCgkgIGxhbmd1YWdlIExBTkc6ICJtYWtlIHNraXAtTEFORz10cnVlIGNoZWNrIi4gIExBTkcgaXMgc2tpcHBlZAoJICBhdXRvbWF0aWNhbGx5IGlmIC4vY29uZmlndXJlIGRldGVybWluZXMgdGhhdCBMQU5HIHN1cHBvcnQgaXMKCSAgaW5zdWZmaWNpZW50LgoKCSAgQ3VycmVudGx5LCB0aGUgY2hlY2sgaXMgbGltaXRlZCB0byBkb2luZyB0aGUgZXF1aXZhbGVudCBvZgoJICAibWFrZSBhbGwiIGluIHNvbWUgb2YgdGhlIEV4YW1wbGVzIGRpcmVjdG9yaWVzLiAgVGhpcyBzaG91bGQKCSAgYmUgZXhwYW5kZWQgYm90aCBob3Jpem9udGFsbHkgKGRpZmZlcmVudCB0eXBlcyBvZiB0ZXN0cykgYW5kCgkgIHZlcnRpY2FsbHkgKGFmdGVyICJtYWtlIGFsbCIgaW4gYW4gRXhhbXBsZXMgc3ViZGlyIHN1Y2NlZWRzLAoJICBkbyBzb21lIGFkZGl0aW9uYWwgdGVzdHMgd2l0aCB0aGUgcmVzdWx0aW5nIGludGVycHJldGVyLCBldGMpLgoKOC80LzAwICA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgImRpc3RjbGVhbiIsIHdoaWNoIGRlbGV0ZXMgYWxsIHRoZQoJICBmaWxlcyAuL2NvbmZpZ3VyZSBjcmVhdGVzLCBpbmNsdWRpbmcgY29uZmlnLnN0YXR1cyBhbmQgZnJpZW5kcy4KCjgvMy8wMCAgOiBoYXJjb2gKCSAgamF2YSBjaGFuZ2VzPz8/IFt0b2RvOiBkb2N1bWVudCBjaGFuZ2VzXQoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBrZXkgb2ZmIG9mIHRoZSByZWFsIGRhdGF0eXBlcwogICAgICAgICAgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuICBUaGlzIG1lYW5zIHRoYXQgdHlwZW1hcHMgZm9yCiAgICAgICAgICAiY29uc3QgY2hhciAqIiBhbmQgImNoYXIgKiIgd2lsbCBiZSBkaWZmZXJlbmNlIGFzIHdpbGwgdHlwZW1hcHMKICAgICAgICAgIGZvciAiVmVjdG9yIiBhbmQgIlZlY3RvciAqLiIKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBpcyBsaWtlbHkgdG8gYnJlYWsgaW50ZXJmYWNlcyB0aGF0IHJlbHkgb24gdGhlIG9kZCB0eXBlCiAgICAgICAgICBoYW5kbGluZyBiZWhhdmlvciBvZiB0eXBlbWFwcyBpbiBTV0lHMS4xLS1lc3BlY2lhbGx5IHdpdGgKICAgICAgICAgIHJlc3BlY3QgdG8gaW50ZXJmYWNlcyBpbnZvbHZpbmcgcGFzcy1ieS12YWx1ZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgJWNvbnN0YW50IGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICBjcmVhdGUgdHJ1ZSBjb25zdGFudHMgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuCiAgICAgICAgICBJdCdzIG1vc3Qgc2ltcGxlIGZvcm0gaXMgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAlY29uc3RhbnQgRk9PIDQyOwoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIHR5cGUgaXMgaW5mZXJyZWQgZnJvbSB0aGUgc3ludGF4IG9mIHRoZQogICAgICAgICAgdmFsdWUgKGluIHJlYWxpdHksIGFsbCAjZGVmaW5lIG1hY3JvcyBhcmUgdHJhbnNsYXRlZCBpbnRvCiAgICAgICAgICBkaXJlY3RpdmVzIG9mIHRoaXMgZm9ybSkuCgogICAgICAgICAgQW4gZXhwYW5kZWQgdmVyc2lvbiBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgJWNvbnN0YW50KEZvbyAqKSBGT08gPSAmRm9vT2JqOwoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgYW4gZXhwbGljaXQgdHlwZSBjYW4gYmUgc3BlY2lmaWVkLiAgVGhpcwogICAgICAgICAgbGF0dGVyIGZvcm0gbWF5IGJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgY29uc3RhbnRzIHRoYXQKICAgICAgICAgIHVzZWQgdG8gYmUgc3BlY2lmaWVkIGFzCgogICAgICAgICAgICAgY29uc3QgRm9vICpGT08gPSAmRm9vT2JqOwoKICAgICAgICAgICh3aGljaCBhcmUgbm93IHRyZWF0ZWQgYXMgdmFyaWFibGVzKS4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKiogVGhlIHN5bnRheCBtYXkgY2hhbmdlIGluCiAgICAgICAgICB0aGUgZmluYWwgcmVsZWFzZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgcGFyc2VyIHNvIHRoYXQgdmFyaWFibGUgZGVjbGFyYXRpb25zIG9mIHRoZSBmb3JtCiAgICAgICAgICAiY29uc3QgdHlwZSAqYSIgYXJlIGhhbmRsZWQgYXMgdmFyaWFibGVzLCBub3QgY29uc3RhbnRzLgogICAgICAgICAgTm90ZTogU1dJRzEuMSBoYW5kbGVkIHRoaXMgY2FzZSBlcnJvbmVvdXNseSBiZWNhdXNlCiAgICAgICAgICBjb25zdCBjaGFyICphIGlzIGEgcG9pbnRlciB2YXJpYWJsZSB0aGF0IGNhbiBiZSByZWFzc2lnbmVkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBOb3RlOiBqdXN0IGJlY2F1c2UgdGhpcyBpcyB0aGUgInJpZ2h0IiB3YXkgdG8gZG8gdGhpbmdzLAogICAgICAgICAgZG9lc24ndCBtZWFuIGl0J3MgdGhlIG1vc3QgYXBwcm9wcmlhdGUgaW50ZXJwcmV0YXRpb24uCiAgICAgICAgICBJIHN1c3BlY3QgdGhhdCBtYW55IEMgcHJvZ3JhbW1lcnMgbWlnaHQgdXNlICdjb25zdCBjaGFyIConCiAgICAgICAgICB3aXRoIHRoZSBpbnRlbnQgb2YgY3JlYXRpbmcgYSBjb25zdGFudCwgd2l0aG91dCByZWFsaXppbmcKICAgICAgICAgIHRoYXQgdGhleSd2ZSBjcmVhdGVkIGEgcmVhc3NpZ25hYmxlIGdsb2JhbCB2YXJpYWJsZS4KCjcvMjMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUaGUgQy9DKysgd3JhcHBpbmcgbGF5ZXIgaGFzIGJlZW4gY29tcGxldGVseSByZWRlc2lnbmVkIGFuZAogICAgICAgICAgcmVpbXBsZW1lbnRlZC4gIFRoaXMgY2hhbmdlIHNob3VsZCBpcm9uIG91dCBhIGZldyByb3VnaAogICAgICAgICAgc3BvdHMgd2l0aCB0aGUgaGFuZGxpbmcgb2YgZGF0YXR5cGVzLiAgSW4gYWRkaXRpb24sIHRoZQogICAgICAgICAgd3JhcHBlciBjb2RlIGlzIHNvbWV3aGF0IGNsZWFuZXIuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBpbnRlcmZhY2VzIHRoYXQgaW52b2x2ZQogICAgICAgICAgc3VidGxlIGNvcm5lci1jYXNlcyB3aXRoIHR5cGVtYXBzIGFuZCB0aGUgJWFkZG1ldGhvZHMKICAgICAgICAgIGRpcmVjdGl2ZSBzaW5jZSBzb21lIG9mIHRoZXNlIGZlYXR1cmVzIGhhZCBzb21ld2hhdAogICAgICAgICAgdHlwZSBoYW5kbGluZyBiZWhhdmlvciBpbiBTV0lHMS4xLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSAibWVtYmVyaW4iIGFuZCAibWVtYmVyb3V0IiB0eXBlbWFwcyBhcmUgZ29uZSBmb3IgdGhlCiAgICAgICAgICBtb21lbnQsIGJ1dCB0aGV5IG1pZ2h0IHJldHVybiBhcyBzb29uIGFzIEkgZmlndXJlIG91dAogICAgICAgICAgaG93IHRvIGludGVncmF0ZSB0aGVtIHdpdGggc29tZSBvZiB0aGUgc3RyZWFtbGluZWQgQyB3cmFwcGVyCiAgICAgICAgICBmdW5jdGlvbnMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2Ygb2xkIHR5cGUgaGFuZGxpbmcgZnVuY3Rpb25zIHN1Y2ggYXMgcHJpbnRfdHlwZSgpLAogICAgICAgICAgcHJpbnRfZnVsbCgpLCBwcmludF9tYW5nbGUoKSwgZXRjLi4uIGFyZSBnb25lIGFuZCBoYXZlIGJlZW4KICAgICAgICAgIHJlcGxhY2VkIHdpdGggYSBzbWFsbGVyIHNldCBvZiBmdW5jdGlvbnMuICBTZWUgdGhlIGZpbGUKICAgICAgICAgIERvYy9pbnRlcm5hbHMuaHRtbCBmb3IgZGV0YWlscy4gIFRoaXMgd2lsbCBicmVhayBhbGwgdGhpcmQKICAgICAgICAgIHBhcnR5IGxhbmd1YWdlIG1vZHVsZXMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZXByZWNhdGVkIHRoZSAldmFsIGFuZCAlb3V0IGRpcmVjdGl2ZXMuICBUaGVzZSBkaXJlY3RpdmVzCiAgICAgICAgICBzaG91bGRuJ3QgcmVhbGx5IGJlIG5lY2Vzc2FyeSBzaW5jZSB0eXBlbWFwcyBjYW4gYmUgdXNlZAogICAgICAgICAgdG8gYWNoaWV2ZSBzaW1pbGFyIHJlc3VsdHMuICAgVGhpcyBhbHNvIGNsZWFucyB1cCB0aGUKICAgICAgICAgIGhhbmRsaW5nIG9mIHR5cGVzIGFuZCBwYXJhbWV0ZXJzIHF1aXRlIGEgYml0LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzIwLzAwIDogdHRuCgkgIEZpeGVkIHVuc3BlY2lmaWVkLW1vZHVsZSBidWcgaW4gR3VpbGUgc3VwcG9ydCBhbmQgcmVtb3ZlZAoJICBtb3JlIG5vbi0id2l0aC1zbW9icyIgZnVuY3Rpb25hbGl0eSB1c2luZyBwYXRjaGVzIHN1Ym1pdHRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgoJICBSZS1lbmFibGUgcmVjb2duaXRpb24gb2YgIi13aXRoLXNtb2JzIiAod2l0aCBubyBlZmZlY3Qgc2luY2UKCSAgd2UgdXNlIHNtb2JzIGJ5IGRlZmF1bHQgbm93KSBmb3IgdGhlIHRpbWUgYmVpbmcuICBBZnRlciB0aGUKCSAgMS4zYTQgcmVsZWFzZSwgdGhpcyBvcHRpb24gd2lsbCBzaWduYWwgYW4gZXJyb3IuCgo3LzE3LzAwIDogdHRuCgkgIEZpeGVkIE5VTEwtaW5wdXQgYnVnIGluIHBhcmFtZXRlciBsaXN0IGhhbmRsaW5nLgoJICBSZXBvcnRlZCBieSBNYXR0aGlhcyBLb2VwcGUuCgo3LzEyLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgbWVtb3J5IGxlYWsgaW4gUHl0aG9uIHR5cGUtY2hlY2tpbmcgY29kZS4gUmVwb3J0ZWQgYnkKICAgICAgICAgIEtlaXRoIERhdmlkc29uLiAgQnVnICMxMDkzNzkuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgQ2hhbmdlZCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgcmVsYXRlZCB0byBmdW5jdGlvbiBwYXJhbWV0ZXJzLgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHNvbWUgYnVncyByZWxhdGVkIHRvIHRoZSBoYW5kbGluZyBvZiB0aGUgJW5hbWUoKSBkaXJlY3RpdmUKICAgICAgICAgIGFuZCBjbGFzc2VzIGluIHRoZSBUY2wgbW9kdWxlLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IEphbWVzIEJhaWxleS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwYXJzaW5nIGFuZCBlbnVtIGhhbmRsaW5nIHByb2JsZW1zIHdpdGggY2hhcmFjdGVyIGNvbnN0YW50cy4KICAgICAgICAgIFJlcG9ydGVkIGJ5IEdyZWcgS29jaGFuc2tpLgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgV3JhcHBlckZ1bmN0aW9uIGNsYXNzIGZyb20gdGhlIGNvcmUgYW5kIHVwZGF0ZWQgdGhlIGxhbmd1YWdlCiAgICAgICAgICBtb2R1bGUuICBUaGlzIHdpbGwgYnJlYWsgdGhpcmQgcGFydHkgbW9kdWxlcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy85LzAwICA6IGJlYXpsZXkKICAgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIFNXSUcgbm8gbG9uZ2VyIG1ha2VzIHVzZSBvZiBDKysgb3BlcmF0b3Igb3ZlcmxvYWRpbmcuCiAgICAgICAgICBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBicmVhayAqYWxsKiB0aGlyZCBwYXJ0eSBsYW5ndWFnZSBtb2R1bGVzCiAgICAgICAgICB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgbWFpbiBTV0lHIENWUyB0cmVlLiBTb3JyeS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy84LzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIGV4cGVyaW1lbnRhbCBhbmQgdW5kb2N1bWVudGVkICJidWlsZCIgdHlwZW1hcCB0aGF0CiAgICAgICAgICB3YXMgaW50ZW5kZWQgdG8gd29yayB3aXRoIG11bHRpcGxlIGFyZ3VtZW50cy4gU2ltcGx5IHRvbyB3ZWlyZAogICAgICAgICAgdG8ga2VlcCBhcm91bmQuICBCZXNpZGVzLCBhIGJldHRlciByZXBsYWNlbWVudCBpcyBpbiB0aGUgd29ya3MuCgo3LzYvMDAgIDogdHRuCiAgICAgICAgICBSZW1vdmVkIG5vbi0id2l0aC1zbW9icyIgZnVuY3Rpb25hbGl0eSAoR3VpbGUgc3VwcG9ydCksIGkuZS4sCiAgICAgICAgICAiLXdpdGgtc21vYnMiIGlzIG5vdyB0aGUgZGVmYXVsdCBhbmQgbm8gbG9uZ2VyIG5lZWRzIHRvIGJlCgkgIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZC1saW5lLgoKNy81LzAwICA6IHR0bgogICAgICAgICAgSW5jb3Jwb3JhdGVkIFJ1Ynkgc3VwcG9ydCBjb250cmlidXRlZCBieSBNYXNha2kgRnVrdXNoaW1hLgoKNi8yOC8wMCA6IHR0bgogICAgICAgICAgQXBwbGllZCBtb3JlLXRoYW4tMTAtYXJncyBidWdmaXggcGF0Y2ggY29udHJpYnV0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKNi8yNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJld3JvdGUgc29tZSBvZiB0aGUgc3RyaW5nIGhhbmRsaW5nIGFuZCBlbGltaW5hdGVkIHRoZSBDKysKICAgICAgICAgIGltcGxlbWVudGF0aW9uICh3aGljaCBpcyBub3cganVzdCBhIHdyYXBwZXIpLgoKNi8yNy8wMCA6IHR0bgogICAgICAgICAgQWRkZWQgRG9jL2luZGV4Lmh0bWwgYW5kIERvYy9pbnRlcm5hbHMuaHRtbC4gIFRoZSB0YXJnZXQKICAgICAgICAgIGF1ZGllbmNlIGZvciB0aGUgbGF0dGVyIGlzIG5ldyBTV0lHIGRldmVsb3BlcnMuCgoKVmVyc2lvbiAxLjMgQWxwaGEgMyAoSnVuZSAxOCwgMjAwMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjYvMTgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSBuYW1pbmcuY3h4LCBoYXNoLmN4eCwgYW5kIHN5bWJvbC5jeHggZmlsZXMgZnJvbQogICAgICAgICAgdGhlIFNXSUcxLjEgZGlyZWN0b3J5LiAgIENvbnRpbnVlZCB0byBtaWdyYXRlIHRoaW5ncyBhd2F5CiAgICAgICAgICBmcm9tIHRoZSBDKysgYmFzZSAoYWx0aG91Z2ggdGhlcmUncyBzdGlsbCBhIGxvdCBvZiB3b3JrIHRvIGRvKS4KCjYvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBhIGZldyBtb3JlIGV4YW1wbGVzIHRvIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkuICBTdGlsbAogICAgICAgICAgbmVlZCB0byBkbyBhIGxvdCBvZiB3b3JrIG9uIHRoaXMuCgo2LzE2LzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgLWluY2x1ZGVhbGwgdG8gZm9sbG93IGFsbCAjaW5jbHVkZSBzdGF0ZW1lbnRzIGluIHRoZQogICAgICAgICAgcHJlcHJvY2Vzc29yLgoKNi8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRyaWVkIHRvIGZpeCBhcyBtYW55IEMrKyB3YXJuaW5ncyBhcyBwb3NzaWJsZSB3aGVuIGNvbXBpbGluZwogICAgICAgICAgd2l0aCB0aGUgU3VuIFdvcmtzaG9wIEMrKyBjb21waWxlci4gIFVuZm9ydHVuYXRlbHksIHRoaXMgbWVhbnMKICAgICAgICAgIHRoYXQgdGhlcmUgYXJlIGEgbG90IG9mIHN0YXRlbWVudHMgdGhhdCBjb250YWluIHN0cmluZyBsaXRlcmFscwogICAgICAgICAgb2YgdGhlIGZvcm0gKGNoYXIqKSJCbGFoIi4KCjYvMTUvMDA6ICBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2YgY2xlYW51cCBhbmQgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIGluIHRoZQogICAgICAgICAgbG93LWxldmVsIERPSCBsaWJyYXJ5LiAgIFRoaXMgc2VlbXMgdG8gcmVzdWx0IGluIGEgc3BlZWR1cAogICAgICAgICAgb2YgNTAtMTAwJSBmb3IgcHJlcHJvY2Vzc2luZyBhbmQgb3RoZXIgcmVsYXRlZCB0YXNrcy4KCjUvMTAvMDAgOiB0dG4KCSAgQXBwbGllZCB2YXJpYWJsZS13cmFwcGluZyBidWdmaXggcGF0Y2ggY29udHJpYnV0ZWQKCSAgYnkgTWF0dGhpYXMgS29lcHBlLgoKNC8xNy8wMCA6IHR0bgoJICBVcGRhdGVkIE16U2NoZW1lIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgT2xlZyBUb2xtYXRjZXYuCgkgIFdlIG5vdyB1c2UgYSBgU2NoZW1lX1R5cGUnLWJhc2VkIHN0cnVjdHVyZSB0byB3cmFwIHBvaW50ZXJzLgoKNC8xMS8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgZnVydGhlciBHdWlsZS1zdXBwb3J0IHBhdGNoIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCSAgVHlwZW1hcHMgcHJldmlvdXNseSBkZWxldGVkIGhhdmUgYmVlbiByZS1hZGRlZC4gIFRoZXJlIGlzIG5vdwoJICBleGNlcHRpb24gaGFuZGxpbmcgKHNlZSBEb2MvZW5naW5lZXJpbmcuaHRtbCkuICBgU1dJR19pbml0JyBpcyBub3cKCSAgZGVjbGFyZWQgZXh0ZXJuIG9ubHkgZm9yIHNpbXBsZSBsaW5rYWdlLiAgU29tZSBidWdzIHdlcmUgZml4ZWQuCgo0LzA2LzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBNelNjaGVtZSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE9sZWcgVG9sbWF0Y2V2LgoJICBUaGlzIGluY2x1ZGVzIG5ldyBkaXJlY3RvcmllcyBMaWIvbXpzY2hlbWUgYW5kIEV4YW1wbGVzL216c2NoZW1lLgoKNC8wMy8wMCA6IHR0bgoJICBBZGRlZCBFeGFtcGxlcy9ndWlsZSBhbmQgY2hpbGRyZW4uICBUaGlzIGlzIGFuIGFkYXB0YXRpb24gb2YKCSAgdGhlIHNhbWUtbmFtZWQgZGlyZWN0b3J5IGZyb20gdGhlIFNXSUctMS4xcDUgZGlzdHJpYnV0aW9uLgoJICBBZGRlZCBHdWlsZS1zcGVjaWZpYyBzZWN0aW9uIHRvIERvYy9lbmdpbmVlcmluZy5odG1sLgoKNC8wMi8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgbmV3IGd1aWxlbWFpbi5pIGJ5IE1hcnRpbiBGcm9laGxpY2guCgkgIEluY29ycG9yYXRlZCBHdWlsZS1zdXBwb3J0IHJld3JpdGUgcGF0Y2ggYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbiAiLXdpdGgtc21vYnMiIGVuYWJsZXMgaW1wbGVtZW50YXRpb24gb2YKCSAgcG9pbnRlciB0eXBlIGhhbmRsaW5nIHVzaW5nIHNtb2JzLCB0aGUgY2Fub25pY2FsIG1lY2hhbmlzbSBmb3IKCSAgZGVmaW5pbmcgbmV3IHR5cGVzIGluIEd1aWxlLiAgUHJldmlvdXMgaW1wbGVtZW50YXRpb24gKHVzaW5nCgkgIHN0cmluZ3MpIGlzIGF0IHRoZSBtb21lbnQgc3RpbGwgc3VwcG9ydGVkIGJ1dCBkZXByZWNhdGVkLiAgQXQKCSAgc29tZSBwb2ludCwgIi13aXRoLXNtb2JzIiB3aWxsIGJlIHRoZSBkZWZhdWx0IGFuZCBubyBsb25nZXIKCSAgcmVxdWlyZWQuCgozLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcHVyaWZ5IHBhdGNoZXMgc3VibWl0dGVkIGJ5IFJhbSBCaGFtaWRpcGF0eS4KCjMvMDIvMDAgOiB0dG4KICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudCBHdWlsZSAibGlua2FnZSIgc2NoZW1lcy4KCSAgQ3VycmVudGx5LCAiLUxpbmthZ2UgaG9iYml0IiB3b3Jrcy4KCgpWZXJzaW9uIDEuMyBBbHBoYSAyIChNYXJjaCAxLCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1hZGUgU1dJRyBpZ25vcmUgdGhlICdtdXRhYmxlJyBrZXl3b3JkLgoKMi8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEluY29ycG9yYXRlZCBzb21lIHBhdGNoZXMgdG8gdGhlIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvCiAgICAgICAgICB0aGUgLWhpZGUgb3B0aW9uIGFuZCB0aGUgZGVzdHJ1Y3Rpb24gb2Ygb2JqZWN0cy4KICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBLYXJsIEZvcm5lci4KCjIvMjcvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUaGlzIGluY2x1ZGVzIGEgY3BwIG1hY3JvIGluIExpYi9ndWlsZS9ndWlsZS5zd2cgYW5kIHRoZQoJICBlbnRpcmUgZmlsZSBMaWIvZ3VpbGUvdHlwZW1hcHMuaS4KCjIvMjUvMDAgOiB0dG4KCSAgTW9kaWZpZWQgY29uZmlndXJlLmluIGFuZCBNYWtlZmlsZS5pbiBmaWxlcyB0byBzdXBwb3J0CgkgIG5vbi1sb2NhbCBidWlsZCAodXNlZnVsIGluIG11bHRpLWFyY2ggZW52aXJvbm1lbnRzKS4KCjIvMjQvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgQ2xhcmsgTWNHcmV3LgoJICBUaGlzIHdvcmtzIHdpdGggR3VpbGUgMS4zLCBidXQgc2luY2UgaXQgZGVwZW5kcyBoZWF2aWx5CgkgIG9uIHRoZSBnaF8gaW50ZXJmYWNlLCBpdCBzaG91bGQgd29yayBmb3IgYWxsIGxhdGVyIHZlcnNpb25zLgoJICBJdCBoYXMgbm90IGJlZW4gdGVzdGVkIHdpdGggdmVyc2lvbnMgYmVmb3JlIDEuMy4KCSAgV0FSTklORzogQ29kZSBpcyB1bnN0YWJsZSBkdWUgdG8gZXhwZXJpbWVudGF0aW9uIGJ5IHR0bi4KCjIvMTYvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBIHZhcmlldHkgb2YgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIHRoZSBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzcyBjb2RlIGdlbmVyYXRpb24uICBNYW55IG9mIHRoZXNlIHJlc3VsdCBpbiBzdWJzdGFudGlhbAogICAgICAgICAgcnVudGltZSBwZXJmb3JtYW5jZSBnYWlucy4gIEhvd2V2ZXIsIHRoZXNlIGhhdmUgY29tZSBhdAogICAgICAgICAgYSBjb3N0IG9mIHJlcXVpcmluZyB0aGUgdXNlIG9mIFB5dGhvbiAxLjUuMi4gIEZvciBvbGRlcgogICAgICAgICAgdmVyc2lvbnMsIHVzZSAnc3dpZyAtbm9vcHQgLXB5dGhvbicgdG8gdHVybiBvZmYgdGhlc2UKICAgICAgICAgIG9wdGltaXphdGlvbiBmZWF0dXJlcy4KClZlcnNpb24gMS4zIEFscGhhIDEgKEZlYnJ1YXJ5IDExLCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvMTEvMDAgOiBBZGRlZCAndm9pZCcgdG8gcHJvdG90eXBlIG9mIFB5dGhvbiBtb2R1bGUgaW5pdGlhbGl6ZXIuCiAgICAgICAgICBSZXBvcnRlZCBieSBNYXJrIEhvd3NvbiAoMS8yMC8wMCkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgY29kZSB0byBkaXNjYXJkIG93bmVyc2hpcCBvZiBhbgogICAgICAgICAgb2JqZWN0IHdoZW5ldmVyIGl0IGlzIGFzc2lnbmVkIHRvIGEgbWVtYmVyIG9mIGFub3RoZXIgb2JqZWN0LgogICAgICAgICAgVGhpcyBwcm9ibGVtIGhhcyBiZWVuIGFyb3VuZCBmb3IgYXdoaWxlLCBidXQgd2FzIG1vc3QgcmVjZW50bHkKICAgICAgICAgIHJlcG9ydGVkIGJ5IEJ1cmtoYXJkIEtsb3NzICgxMi8zMC85OSkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgYnJhY2VzIGFyb3VuZCBtYWNyb3MgaW4gdGhlIGV4Y2VwdGlvbi5pIGxpYnJhcnkuICBSZXBvcnRlZAogICAgICAgICAgYnkgQnVjayBIb2RnZXMgKDEyLzE5Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB0aGUgY29uc3RyYWludHMuaSBsaWJyYXJ5LiBSZXBvcnRlZCBieSBCdWNrCiAgICAgICAgICBIb2RnZXMgKDEyLzE0Lzk5KQoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSAlbmF0aXZlIGRpcmVjdGl2ZSBub3cgZ2VuZXJhdGVzIFRjbDggb2JqZWN0LXN0eWxlIGNvbW1hbmQgY2FsbHMuCiAgICAgICAgICBBIGZ1bGwgc29sdXRpb24gZm9yIFRjbDcgYW5kIFRjbDggaXMgc3RpbGwgbmVlZGVkLiBQYXRjaCBzdWdnZXN0ZWQKICAgICAgICAgIGJ5IE1pa2UgV2VpYmxlbiAoMTEvMjkvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIHR5cGVtYXAgY29kZSB0byBpbmNsdWRlIHRoZSAkbmRpbSB2YXJpYWJsZSBmb3IgYXJyYXlzLgogICAgICAgICAgUGF0Y2ggcHJvdmlkZWQgYnkgTWljaGVsIFNhbm5lciAoMTEvMTIvOTkpLgoKMi8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBQeXRob24gbW9kdWxlIHRvIHJhaXNlIGEgUnVudGltZSBlcnJvciBpZiBhbiBhdHRlbXB0CiAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHJlYWQtb25seSBtZW1iZXIgb2YgYSBzaGFkb3cgY2xhc3MuICBSZXBvcnRlZCBieQogICAgICAgICAgTWljaGVsIFNhbm5lciAoMTEvNS85OSkuCgoyLzEwLzAwIDogVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGhhcyBiZWVuIHJlbW92ZWQuIEhvd2V2ZXIsIGl0IGlzIGxpa2VseQogICAgICAgICAgdG8gcmV0dXJuIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4KCjIvMS8wMCAgOiBBZGRlZCBhIG51bWJlciBvZiBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudHMgdG8gdGhlIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzaW5nIGFuZCB0eXBlLWNoZWNraW5nIGNvZGUuICBDb250cmlidXRlZCBieSBWYWRpbSBDaHVndW5vdi4KCiAgICAgICAgICAxLiBSZW1vdmUgX2t3YXJncyBhcmd1bWVudCBmcm9tIHRoZSBzaGFkb3cgd3JhcHBlcnMgd2hlbiAta2V5d29yZAogICAgICAgICAgICAgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQuIFRoaXMgc2F2ZXMgdXMgYSBjb25zdHJ1Y3Rpb24gb2Yga2V5d29yZAogICAgICAgICAgICAgZGljdGlvbmFyeSBvbiBlYWNoIG1ldGhvZCBjYWxsLgoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncywgKipfa3dhcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzLCBfa3dhcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAyLiBJbmNvcnBvcmF0ZSBzZWxmIGludG8gdGhlIF9hcmdzIHR1cGxlLiAgVGhpcyBzYXZlcyBhdCBsZWFzdCBvbmUgdHVwbGUKICAgICAgICAgICAgIGFsbG9jYXRpb24gcGVyIG1ldGhvZCBjYWxsLgoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKHNlbGYsICpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIChzZWxmLCkgKyBfYXJncykKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgIGRlZiBtZXRob2QxKCpfYXJncyk6CiAgICAgICAgICAgICAgICAgdmFsID0gYXBwbHkodGVzdDJjLlB5Q2xhc3MxX21ldGhvZDEsIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAzLiBSZW1vdmUgKlB0ciBjbGFzc2VzLgogICAgICAgICAgICAgQXNzdW1lIHRoYXQgd2UgYXJlIFNXSUdnaW5nIGEgYysrIGNsYXNzIENwcENsYXNzLgogICAgICAgICAgICAgQ3VycmVudGx5IFNXSUcgd2lsbCBnZW5lcmF0ZSBib3RoIENwcENsYXNzUHRyIGNsYXNzCiAgICAgICAgICAgICB0aGF0IGhvc3RzIGFsbCBtZXRob2RzIGFuZCBhbHNvIENwcENsYXNzIHRoYXQgaXMgZGVyaXZlZAogICAgICAgICAgICAgZnJvbSB0aGUgZm9ybWVyIGFuZCBjb250YWlucyBqdXN0IHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgICAgIFdoZW4gQ3BwQ2xhc3MgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGludGVycHJldGVyIHdpbGwgdHJ5CiAgICAgICAgICAgICB0byBmaW5kIGl0IGluIHRoZSBDcHBDbGFzcydzIGRpY3Rpb25hcnkgZmlyc3QsIGFuZCBvbmx5IHRoZW4KICAgICAgICAgICAgIGNoZWNrIHRoZSBiYXNlIGNsYXNzLgoKICAgICAgICAgICAgIENwcENsYXNzUHRyIGZ1bmN0aW9uYWxpdHkgbWF5IGJlIGVtdWxhdGVkIHdpdGg6CgogICAgICAgICAgICAgaW1wb3J0IG5ldwogICAgICAgICAgICAgX25ld19pbnN0YW5jZSA9IG5ldy5pbnN0YW5jZQogICAgICAgICAgICAgZGVmIENwcENsYXNzUHRyKHRoaXMpOgogICAgICAgICAgICAgICAgICByZXR1cm4gX25ld19pbnN0YW5jZShDcHBDbGFzcywgeyJ0aGlzIjp0aGlzLCJ0aGlzb3duIjowfSkKCiAgICAgICAgICAgICBUaGlzIHNhdmVzIHVzIG9uZSBkaWN0aW9uYXJ5IGxvb2t1cCBwZXIgY2FsbC4KCiAgICAgICAgICAgICA8REI+VGhlIG5ldyBtb2R1bGUgd2FzIGZpcnN0IGFkZGVkIGluIFB5dGhvbi0xLjUuMiBzbyBpdAogICAgICAgICAgICAgd29uJ3Qgd29yayB3aXRoIG9sZGVyIHZlcnNpb25zLiAgSSd2ZSBpbXBsZW1lbnRlZCBhbgogICAgICAgICAgICAgYWx0ZXJuYXRpdmUgdGhhdCBhY2hpZXZlcyB0aGUgc2FtZSB0aGluZzwvREI+CgogICAgICAgICAgNC4gVXNlIENPYmplY3RzIGluc3RlYWQgb2Ygc3RyaW5ncyBmb3IgcG9pbnRlcnMuCgogICAgICAgICAgRGF2ZTogVGhpcyBlbmhhbmNlbWVudHMgcmVzdWx0IGluIHNwZWVkdXBzIG9mIHVwIHRvIDUwJSBpbiBzb21lCiAgICAgICAgICBvZiB0aGUgcHJlbGltaW5hcnkgdGVzdHMgSSByYW4uCgoyLzEvMDAgIDogVXBncmFkZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gdXNlIGEgbmV3IHR5cGUtY2hlY2tpbmcgc2NoZW1lIHRoYXQKICAgICAgICAgIGlzIG1vcmUgbWVtb3J5IGVmZmljaWVudCwgcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlLCBhbmQKICAgICAgICAgIGlzIGxlc3MgZXJyb3IgcHJvbmUuIFVuZm9ydHVuYXRlbHksIGl0IHdpbGwgYnJlYWsgYWxsIGNvZGUgdGhhdAogICAgICAgICAgZGVwZW5kcyBvbiB0aGUgU1dJR19HZXRQdHIoKSBmdW5jdGlvbiBjYWxsIGluIHR5cGVtYXBzLgogICAgICAgICAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBiZSBjaGFuZ2VkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgaWYgKFNXSUdfR2V0UHRyKHN0cmluZywmcHRyLCJfRm9vX3AiKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICAgICBpZiAoU1dJR19Db252ZXJ0UHRyKHB5b2JqLCAmcHRyLCBTV0lHX1RZUEVfRm9vX3ApID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgTm90ZTogSW4gdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBTV0lHX1RZUEVfRm9vX3AgaXMgbm8gbG9uZ2VyCiAgICAgICAgICBhIHR5cGUtc2lnbmF0dXJlIHN0cmluZywgYnV0IHJhdGhlciBhbiBpbmRleCBpbnRvIGEgdHlwZQogICAgICAgICAgZW5jb2RpbmcgdGFibGUgdGhhdCBjb250YWlucyB0eXBlIGluZm9ybWF0aW9uLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzMwLzAwIDogbG9pYwoJICBDb25kaXRpb25hbGx5IGNvbXBpbGUgZXhwZXJpbWVudGFsIGNvZGUgd2l0aCAtLWVuYWJsZS1leHBlcmltZW50CgkgIGNvbmZpZ3VyZSBmbGFnLgoJICBGaXggLmN2c2lnbm9yZSB0byBpZ25vcmUgY29uZmlndXJlICYgeWFjYyBnZW5lcmF0ZWQgZmlsZXMKCjEvMjgvMDAgOiBsb2ljCgkgIEFwcGx5IGF1dG9tYWtlIGV2ZXJ5d2hlcmUKCSAgS2VlcCBjb25maWd1cmUgc2NyaXB0cyBzbyB0aGF0IHBlb3BsZSBhcmUgbm90ICpmb3JjZWQqIHRvIGF1dG9jb25mCiAgICAgICAgICBLZWVwIHNvdXJjZXMgZ2VuZXJhdGVkIGJ5IHlhY2Mgc28gdGhhdCBjb21waWxhdGlvbiB3aXRob3V0IHlhY2MKCSAgaXMgcG9zc2libGUuCgkgIFNvdXJjZS9MUGFyc2UvY3NjYW5uZXIuYzogY2hhbmdlIGx5YWNjLmggaW50byBwYXJzZXIuaCB0byBwbGVhc2UKCSAgZGVmYXVsdCB5YWNjIGdlbmVyYXRpb24gcnVsZXMuCgkgIFVzZSBBQ19DT05GSUdfU1VCRElSUyBpbiBjb25maWd1cmUuaW4gaW5zdGVhZCBvZiBoYW5kIG1hZGUgc2NyaXB0LgoJICBVcGRhdGUgYWxsIHJlbGV2YW50IC5jdnNpZ25vcmUgdG8gaW5jbHVkZSAuZGVwcwoJICBGaXhlZCBtaXNzaW5nIDsgbGluZSAxMzYgU291cmNlL1N3aWcvc3dpZy5oCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYSBudW1iZXIgb2YgbWlub3IgZW5kLW9mLWZpbGUgcGFyc2luZyBwcm9ibGVtcyBpbiB0aGUKICAgICAgICAgIHByZXByb2Nlc3Nvci4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtZnJlZXplIG9wdGlvbiB0aGF0IGZvcmNlcyBTV0lHIHRvIGZyZWV6ZSB1cG9uIGV4aXQuCiAgICAgICAgICBUaGlzIGlzIG9ubHkgdXNlZCBhcyBhIGRlYnVnZ2luZyB0b29sIHNvIHRoYXQgSSBjYW4gbW9yZQogICAgICAgICAgZWFzaWx5IGV4YW1pbmUgU1dJRydzIG1lbW9yeSBmb290cHJpbnQuCgoxLzEzLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgcGF0Y2ggdG8gZ3VpbGUgbW9kdWxlIGZvciBzdXBwb3J0aW5nIG9wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGlldGVyIEJhcm9uLgoKMS8xMy8wMCA6IGxvaWMKCSAgQWRkZWQgLmN2c2lnbm9yZSwgRXhhbXBsZXMvLmN2c2lnbm9yZSwgU291cmNlL0RPSC9Eb2gvLmN2c2lnbm9yZQoJICBTb3VyY2UvU1dJRzEuMS9tYWluLmN4eDogRml4ZWQgLUkgaGFuZGxpbmcgYnVnCgkgIFNvdXJjZS9Nb2R1bGVzMS4xL2phdmEuY3h4OiBmaXhlZCBjaGFyKiAtPiBjb25zdCBjaGFyKiB3YXJuaW5ncyB0aGF0IGFyZQoJICBlcnJvcnMgd2hlbiBjb21waWxpbmcgd2l0aCBnY2MtMi45NS4yCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBjYXN0IGNvbnN0IGNoYXIqIHRvIGNoYXIqIGZvciBTdHJpbmdfcmVwbGFjZQoJICB0b2tlbiBhbmQgcmVwIHNob3VsZCByZWFsbHkgYmUgY29uc3QuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgQWRkZWQgSGFyY28ncyBKYXZhIG1vZHVsZXMuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmV2b2tlZCB0aGUgJWlmZGVmLCAlaWZuZGVmLCAlZW5kaWYsICVpZiwgJWVsaWYsIGFuZCAlZWxzZQogICAgICAgICAgZGlyZWN0aXZlcy4gIFRoZXNlIGFyZSBubyBsb25nZXIgbmVlZGVkIGFzIFNXSUcgbm93IGhhcyBhIHJlYWwKICAgICAgICAgIHByZXByb2Nlc3Nvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vdmVkIHRoZSBkb2N1bWVudGF0aW9uIG1vZHVsZXMgZnJvbSB0aGUgU1dJRyBkaXJlY3RvcnkKICAgICAgICAgIHRvIHRoZSBNb2R1bGVzIGRpcmVjdG9yeSAod2hlcmUgdGhleSByZWFsbHkgc2hvdWxkIGhhdmUgYmVlbgogICAgICAgICAgdG8gYmVnaW4gd2l0aCkuCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLXN0YXQgb3B0aW9uIGZvciBwcmludGluZyBzdGF0aXN0aWNzLiBUaGUKICAgICAgICAgIHN0YXRpc3RpY3MgcmVwb3J0aW5nIHdhcyBpbmFkZXF1YXRlIGFuZCBtb3N0bHkgYnJva2VuCiAgICAgICAgICBhbnl3YXkuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtdCBvcHRpb24gZm9yIHJlYWRpbmcgYSB0eXBlbWFwIGZpbGUuICBNb3JlCiAgICAgICAgICB0cm91YmxlIHRoYW4gaXQncyB3b3J0aC4gIEp1c3QgaW5jbHVkZSB0eXBlbWFwcyBhdCB0aGUgdG9wCiAgICAgICAgICBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAlY2hlY2tvdXQgZGlyZWN0aXZlLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgLWNpIG9wdGlvbiBmb3IgZmlsZSBjaGVja2luLiAgIFRvbyBwcm9ibGVtYXRpYwogICAgICAgICAgdG8gaW1wbGVtZW50LiAgUHJvYmFibHkgYmV0dGVyIHRvIGp1c3QgcHV0IHlvdXIgU1dJRyBsaWJyYXJ5CiAgICAgICAgICB1bmRlciBDVlMgaW5zdGVhZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKi4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBEZWxldGVkIHRoZSBMQVRFWCBtb2R1bGUuICBTb3JyeS4uLiBEaWRuJ3Qga25vdyBhbnlvbmUKICAgICAgICAgIHdobyB3YXMgdXNpbmcgaXQuICBCZXNpZGVzLCBJJ20gbG9va2luZyB0byBzaW1wbGlmeQogICAgICAgICAgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24gbW9kdWxlIHRvIHVzZSBhIC50eHQKICAgICAgICAgIHN1ZmZpeCBmb3IgaXRzIG91dHB1dCBmaWxlIGluc3RlYWQgb2YgLmRvYy4KCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCB0aGUgbG9uZy1sb3N0IFNXSUcgcHJlcHJvY2Vzc29yIGJhY2sgdG8gdGhlIHN5c3RlbS4KICAgICAgICAgIEl0IHNob3VsZCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQuICBSYXcgcHJlcHJvY2Vzc2VkIG91dHB1dAogICAgICAgICAgY2FuIGJlIHZpZXdlZCB1c2luZyBzd2lnIC1FIGZpbGUuaS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5IGFuZCBkam1pdGNoZQogICAgICAgICAgQ29tcGxldGVseSByZW9yZ2FuaXplZCB0aGUgU1dJRyBkaXJlY3Rvcnkgc3RydWN0dXJlLiAgVGhlCiAgICAgICAgICBiYXNpYyBvcmdhbml6YXRpb24gaXMgbm93OgoKICAgICAgICAgICAgICAgIFNvdXJjZS8gICAgICAgICBTV0lHIHNvdXJjZSBjb2RlCiAgICAgICAgICAgICAgICBMaWIvICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIChzd2lnX2xpYikKICAgICAgICAgICAgICAgIERvYy8gICAgICAgICAgICBEb2N1bWVudGF0aW9uCiAgICAgICAgICAgICAgICBFeGFtcGxlcy8gICAgICAgRXhhbXBsZXMKCiAgICAgICAgICBNb3JlIGRpcmVjdG9yaWVzIHdpbGwgYmUgYWRkZWQgYXMgbmVlZGVkLgoKMTIvMDgvOTk6IExvaWMgRGFjaGFyeSAobG9pY0BzZW5nYS5vcmcpCgkgIEVuaGFuY2VkIHBhY2thZ2UgaGFuZGxpbmcgZm9yIHBlcmw1IGFuZCBjKysuCgoJICBXaXRoIG5ldyBvcHRpb24gLWhpZGUgRm9vOjpCYXIsIGV2ZXJ5IHBlcmw1IG9iamVjdCAoRnJvYikgaXMKCSAgcXVhbGlmaWVkIGJ5IEZvbzo6QmFyOjpGcm9iLiBUaGUgcGFja2FnZSBuYW1lIGlzIHNvbGVseSB1c2VkCgkgIHRvIGVuY2Fwc3VsYXRlIEMvQysrIHdyYXBwZXJzIG91dHB1dCBpbiA8bW9kdWxlPl93cmFwLmMgYW5kIHRoZQoJICBjb3JyZXNwb25kaW5nIHBlcmwgcGFja2FnZSBpbiA8bW9kdWxlPi5wbS4gTm90ZSB0aGF0IGEgcGFja2FnZQoJICBuYW1lIG1heSBjb250YWluIDo6IChGcm9iOjpOaXR6KSBhbmQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUKCSAgcGFja2FnZSBuYW1lIHByb3ZpZGVkIGJ5IC1oaWRlIChGb286OkJhcjo6RnJvYjo6Tml0eikuCgoJICBJbiAqX3dyYXAuYywgU1dJR19pbml0IG1hY3JvIGlzIHVzZWQuIFdhcyBwcmV2aW91c2x5IGRlZmluZWQKCSAgYnV0IG5vdCB1c2VkIGFuZCBzaW1wbGlmaWVzIGNvZGUuCgoJICBBZGRlZCB0eXBlbWFwKHBlcmw1LHBlcmw1aW4pIGFuZCB0eXBlbWFwKHBlcmw1LHBlcmw1b3V0KSB0aGF0CgkgIGRvIHRoZSBlcXVpdmFsZW50IG9mIHR5cGVtYXAocGVybDUsaW4pIGFuZCB0eXBlbWFwKHBlcmw1LG91dCkKCSAgYnV0IGNvbnRhaW4gcGVybCBjb2RlIGFuZCBhcHBsaWVzIHRvIHdyYXBwZXJzIGdlbmVyYXRlZCBieQoJICAtc2hhZG93LgoKCSAgTGFja2luZyBwcm9wZXIgcmVncmVzc2lvbiB0ZXN0cyBJIHVzZWQKCSAgRXhhbXBsZXMvcGVybDUve2MrKyxjb25zdHJhaW50LGRlZmFyZyxleGNlcHQsCgkgIGdyYXBoL2dyYXBoWzEyMzRdLG11bHRpbmhlcml0LG5lc3RlZCxzaGFkb3csc2ltcGxlLHRyZWUsCgkgIHR5cGVtYXBzL3thcmd2LGFyZ3YyLGFycmF5bWVtYmVyLGRhdGFiYXNlLGZpbGUsaWdub3JlLGludGVnZXIsCgkgIG91dHB1dCxwYXNzcmVmLHJlZmVyZW5jZSxyZXR1cm59fS8uIEkgcmFuIHN3aWcgd2l0aCBhbmQgd2l0aG91dAoJICB0aGUgcGF0Y2hlcywgZGlmZiB0aGUgZ2VuZXJhdGVkc291cmNlcywgcnVuIHRoZSAucGwgZmlsZXMKCSAgYW5kIGNoZWNrZWQgdGhhdCB0aGUgcmVzdWx0cyBhcmUgaWRlbnRpY2FsLiBJbiBhbGwgdGhvc2UgZXhhbXBsZXMKCSAgSSBoYWQgbm8gZXJyb3IuCgoxMS8yMS85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gcHJvdmlkZSBmdWxsIHZhcmlhYmxlIGxpbmtpbmcgY2FwYWJpbGl0aWVzCiAgICAgICAgICB0byBhbGwgZGF0YXR5cGVzLiAgIEluIHByZXZpb3VzIHZlcnNpb25zLCBhIHBhaXIgb2YgYWNjZXNzb3IgZnVuY3Rpb25zCiAgICAgICAgICB3ZXJlIGNyZWF0ZWQgZm9yIGRhdGF0eXBlcyBpbmNvbXBhdGlibGUgd2l0aCB0aGUgVGNsX0xpbmtWYXIoKSBmdW5jdGlvbi4KICAgICAgICAgIE5vdywgd2Ugc2ltcGx5IHVzZSB2YXJpYWJsZSB0cmFjZXMgdG8gc3VwcG9ydCBldmVyeXRoaW5nLiBUaGlzIG1heQogICAgICAgICAgYnJlYWsgc2NyaXB0cyB0aGF0IHJlbHkgdXBvbiB0aGUgb2xkZXIgYmVoYXZpb3IuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzk5OiBBZGRlZCBzbGlnaHQgdHdlYWsgdG8gd3JhcHBlciBnZW5lcmF0b3IgdG8gY29sbGVjdCBsb2NhbCB2YXJpYWJsZXMKICAgICAgICAgIG9mIHNpbWlsYXIgdHlwZS4gIFByb2R1Y2VzIHNvbWV3aGF0IG1vcmUgY29tcGFjdCB3cmFwcGVyIGNvZGUuCgoxMS8yMC85OTogTW9kaWZpZWQgdGhlIFRjbCBtb2R1bGUgdG8gdXNlIFNXSUdfR2V0QXJncygpIHRvIHBhcnNlCiAgICAgICAgICBhcmd1bWVudHMuICAgIFRoaXMgaXMgYSB0ZWNobmlxdWUgYm9ycm93ZWQgZnJvbSBQeXRob24gaW4gd2hpY2gKICAgICAgICAgIGFyZ3VtZW50cyBhcmUgY29udmVydGVkIHVzaW5nIGEgZm9ybWF0IHN0cmluZyBjb252ZW50aW9uIHNpbWlsaWFyCiAgICAgICAgICB0byBmcHJpbnRmKCkuICAgVGhpcyByZXN1bHRzIGluIGEgKnN1YnN0YW50aWFsKiByZWR1Y3Rpb24gaW4gdGhlCiAgICAgICAgICBzaXplIG9mIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlIHdpdGggb25seSBhIG1vZGVzdCBydW50aW1lIG92ZXJoZWFkCiAgICAgICAgICBpbiBnb2luZyB0aHJvdWdoIHRoZSBleHRyYSBjb252ZXJzaW9uIGZ1bmN0aW9uLgoKMTEvMTMvOTk6IENvbXBsZXRlbHkgcmV3cm90ZSB0aGUgY2xhc3Mvc3RydWN0dXJlIGdlbmVyYXRpb24gY29kZSBmb3IgdGhlCiAgICAgICAgICBUY2wgbW9kdWxlLiAgTm93LCBhIHNtYWxsIHNldCBvZiBydW50aW1lIGZ1bmN0aW9ucyBhcmUgdXNlZAogICAgICAgICAgdG8gaW1wbGVtZW50IHRoZSBmdW5jdGlvbmFsaXR5IGZvciBhbGwgY2xhc3NlcyAoaW5zdGVhZCBvZiBhCiAgICAgICAgICBtYXNzaXZlIGFtb3VudCBvZiBydW50aW1lIGNvZGUgYmVpbmcgZ2VuZXJhdGVkIGZvciBlYWNoIGNsYXNzKS4KICAgICAgICAgIENsYXNzIHNwZWNpZmljIGluZm9ybWF0aW9uIGlzIHNpbXBseSBlbmNvZGVkIGluIGEgc2VyaWVzIG9mCiAgICAgICAgICBzdGF0aWMgdGFibGVzLiAgIFRoaXMgcmVzdWx0cyBpbiBhICpIVUdFKiByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLS1lc3BlY2lhbGx5IGZvciBDKysuCgoxMS8xMy85OTogUmVtb3ZlZCB0aGUgLXRjbCAoVGNsIDcueCkgbW9kdWxlLiAgVGNsIDguMCBpcyBub3cgc2V2ZXJhbAogICAgICAgICAgeWVhcnMgb2xkIGFuZCB0aGUgZGVmYWN0byBzdGFuZGFyZC0tbm8gcmVhbCByZWFzb24gdG8ga2VlcAogICAgICAgICAgc3VwcG9ydGluZyB0aGUgb2xkIHZlcnNpb24gYXQgdGhpcyBwb2ludC4KCjExLzEzLzk5OiBDbGVhbmVkIHVwIC1jIG9wdGlvbiBmb3IgUHl0aG9uIG1vZHVsZS4gIFRoZSBweWV4cC5zd2cgZmlsZQogICAgICAgICAgaXMgbm93IGdvbmUuCgoxMS8xMy85OTogRml4ZWQgZXh0ZXJuYWwgZGVjbGFyYXRpb25zIHRvIHdvcmsgYmV0dGVyIHdpdGggc3RhdGljIGxpbmtpbmcKICAgICAgICAgIG9uIFdpbmRvd3MuICBTdGF0aWMgbGlua2luZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIGJ5IGRlZmluaW5nCiAgICAgICAgICB0aGUgLURTVEFUSUNfTElOSyBvcHRpb24gb24gdGhlIGNvbW1hbmQgbGluZS4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBBbGJlcnRvIEZvbnNlY2EuCgoxMS81Lzk5IDogRml4ZWQgYW4gb2JzY3VyZSBjb2RlIGdlbmVyYXRpb24gYnVnIHJlbGF0ZWQgdG8gdGhlIGdlbmVyYXRpb24KICAgICAgICAgIG9mIGRlZmF1bHQgY29uc3RydWN0b3JzLiAgIEJ1ZyByZXBvcnRlZCBieSBCcmFkIENsZW1lbnRzLgoKMTEvNS85OSA6IEZpeGVkIGEgZmV3IG1lbW9yeSBwcm9ibGVtcyBmb3VuZCBieSBwdXJpZnkuCgoxMS81Lzk5IDogT2ZmaWNpYWxseSBkZXByZWNhdGVkIHRoZSAtaHRjbCwgLWh0aywgYW5kIC1wbHVnaW4gb3B0aW9ucwogICAgICAgICAgZnJvbSB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxMC8yNi85OTogUmVtb3ZlZCB1bnVzZWQgdmFyaWFibGUgZnJvbSBweXRob24vdHlwZW1hcHMuaS4gIFBhdGNoCiAgICAgICAgICBjb250cmlidXRlZCBieSBLZWl0aCBEYXZpZHNvbi4KCjgvMTYvOTkgOiBBZGRlZCBfV0lOMzIgc3ltYm9sIHRvIGxpYnJhcmllcyB0byBiZXR0ZXIgc3VwcG9ydCBXaW5kb3dzLgoKOC8xNi85OSA6IERlcHJlY2F0ZWQgdGhlIFBlcmw0IG1vZHVsZS4gICBJdCBpcyBubyBsb25nZXIgaW5jbHVkZWQgaW4gdGhlCiAgICAgICAgICBkaXN0cmlidXRpb24gYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBJbiB0aGUgZW50aXJlIDMgeWVhcnMgU1dJRwogICAgICAgICAgaGFzIGJlZW4gYXJvdW5kIEkgbmV2ZXIgcmVjZWl2ZWQgYSBzaW5nbGUgY29tbWVudCBhYm91dCBpdCBzbyBJJ20KICAgICAgICAgIGFzc3VtaW5nIG5vIG9uZSB3aWxsIG1pc3MgaXQuLi4KCjgvMTYvOTkgOiBNb2RpZmllZCB0aGUgdHlwZS1jaGVja2luZyBjb2RlIHRvIHJlZ2lzdGVyIHR5cGUgbWFwcGluZ3MgdXNpbmcgYQogICAgICAgICAgdGFibGUgaW5zdGVhZCBvZiByZXBlYXRlZCBjYWxscyB0byBTV0lHX1JlZ2lzdGVyTWFwcGluZygpLiAgVGhpcwogICAgICAgICAgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIHNvbWV3aGF0LgoKOC8xNS85OSA6IENsZWFuZWQgdXAgdGhlIHBvaW50ZXIgdHlwZS1jaGVja2luZyBjb2RlIGluIHRoZSBUY2wgbW9kdWxlLgoKOC8xNS85OSA6IE1hbnkgY2hhbmdlcyB0byB0aGUgbGlicmFyaWVzIHRvIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMuCgo4LzEzLzk5IDogRWxpbWluYXRlZCBDKysgY29tcGlsZXIgd2FybmluZyBtZXNzYWdlcyBhYm91dCBleHRlcm4gIkMiIGxpbmthZ2UuCgo4LzEzLzk5IDogU29tZSBjbGVhbnVwIG9mIFB5dGhvbiAuc3dnIGZpbGVzIHRvIGJldHRlciBzdXBwb3J0IHJ1bnRpbWUgbGlicmFyaWVzCiAgICAgICAgICBvbiBXaW5kb3dzLgoKOC8xMy85OSA6IE1vZGlmaWVkIHRoZSAlcHJhZ21hIGRpcmVjdGl2ZSB0byBhdHRhY2ggcHJhZ21hcyBkZWNsYXJlZCBpbnNpZGUKICAgICAgICAgIGEgY2xhc3MgZGVmaW5pdGlvbiB0byB0aGUgY2xhc3MgaXRzZWxmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgJXByYWdtYShweXRob24pIGFkZHRvbWV0aG9kID0gImluc2VydDpwcmludCBgaGVsbG8gd29ybGQnIgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgTW9zdCBwZW9wbGUgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBob3cgdGhpcyB3b3Jrcy4gIEZvciBwZW9wbGUKICAgICAgICAgIHdyaXRpbmcgYmFja2VuZCBtb2R1bGVzLCBjbGFzcy1iYXNlZCBwcmFnbWFzIHdvcmsgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICBsYW5nLT5jcHBfb3Blbl9jbGFzcygpICAgICAgICAgICAgIC8vIE9wZW4gYSBjbGFzcwogICAgICAgICAgICAgIGxhbmctPmNwcF9wcmFnbWEoKSAgICAgICAgICAgICAgICAgLy8gU3VwcGx5IHByYWdtYXMKICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgbWVtYmVycwoKICAgICAgICAgICAgICBsYW5nLT5jcHBfY2xvc2VfY2xhc3MoKSAgICAgICAgICAgIC8vIENsb3NlIHRoZSBjbGFzcwoKICAgICAgICAgIEFsbCBvZiB0aGUgcHJhZ21hcyBhcmUgcGFzc2VkIGZpcnN0IHNpbmNlIHRoZXkgbWlnaHQgYmUgdXNlZCB0bwogICAgICAgICAgYWZmZWN0IHRoZSBjb2RlIGdlbmVyYXRpb24gb2Ygb3RoZXIgbWVtYmVycy4gICBQbGVhc2Ugc2VlCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZSBmb3IgYW4gZXhhbXBsZS4gICBQYXRjaGVzIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMy85OSA6IFBhdGNoIHRvIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byBlbGltaW5hdGUgaWdub3JlZAogICAgICAgICAgZXhjZXB0aW9uIGVycm9ycyBpbiBkZXN0cnVjdG9ycy4gIFBhdGNoIGNvbnRyaWJ1dGVkCiAgICAgICAgICBieSBSb2JpbiBEdW5uLgoKOC8xMS85OSA6IE1pbm9yIHBhdGNoIHRvIHN3aWdfbGliL3B5dGhvbi9zd2lncHRyLnN3ZyAgKGFkZGVkIFNXSUdTVEFUSUMKICAgICAgICAgIGRlY2xhcmF0aW9uKS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEx5bGUgSm9obnNvbi4KCjgvMTEvOTkgOiBBZGRlZCBGSVJTVEtFWS9ORVhUS0VZIG1ldGhvZHMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjgvMTEvOTkgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHNvIHRoYXQgTlVMTCBwb2ludGVycyBhcmUgcmV0dXJuZWQKICAgICAgICAgIGFuZCBwYXNzZWQgYXMgJ05vbmUuJyAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgVGFsIFNoYWxpZi4KCjgvMTAvOTkgOiBGaXhlZCBtaXNzaW5nICdpbnQnIHNwZWNpZmllcnMgaW4gdmFyaW91cyBwbGFjZXMuCgo4LzEwLzk5IDogQWRkZWQgV2luZG93cyBtYWtlZmlsZSBmb3IgUnVudGltZSBsaWJyYXJpZXMuICBDb250cmlidXRlZAogICAgICAgICAgYnkgQm9iIFRlY2hlbnRpbi4KCjgvMTAvOTkgOiBGaXhlZCBtaW5vciBwcm9ibGVtIGluIFB5dGhvbiBydW50aW1lIG1ha2VmaWxlIGludHJvZHVjZWQKICAgICAgICAgIGJ5IGtleXdvcmQgYXJndW1lbnRzLgoKOC84Lzk5ICA6IENoYW5nZWQgJHRhcmdldCBvZiBwZXJsNShvdXQpIHR5cGVtYXAgZnJvbSBTVCgwKSB0bwogICAgICAgICAgU1QoYXJndmkpLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR2VvZmZyZXkgSG9ydC4KCjgvOC85OSAgOiBGaXhlZCBidWcgaW4gdHlwZW1hcCBjaGVja2luZyByZWxhdGVkIHRvIHRoZSBBTlkga2V5d29yZAogICAgICAgICAgaW4gYXJyYXlzIGFuZCBpZ25vcmVkIGFyZ3VtZW50cy4gIEVycm9yIHJlcG9ydGVkIGJ5CiAgICAgICAgICBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6ICVlbmFibGVkb2MgYW5kICVkaXNhYmxlZG9jIGRpcmVjdGl2ZXMgY2FuIG5vdyBiZSB1c2VkCiAgICAgICAgICBpbnNpZGUgY2xhc3Mvc3RydWN0dXJlIGRlZmluaXRpb25zLiAgIEhvd2V2ZXIsIG5vIGNoZWNrCiAgICAgICAgICBpcyBtYWRlIHRvIHNlZSBpZiB0aGV5IGFyZSBiYWxhbmNlZCAoaS5lLiwgYSAlZGlzYWJsZWRvYwogICAgICAgICAgZGlyZWN0aXZlIGluc2lkZSBhIGNsYXNzIGRvZXMgbm90IGhhdmUgdG8gaGF2ZSBhIG1hdGNoaW5nCiAgICAgICAgICAlZW5hYmxlZG9jIGluIHRoZSBzYW1lIGNsYXNzKS4KCjgvOC85OSAgOiBLZXl3b3JkIGFyZ3VtZW50IGhhbmRsaW5nIGlzIG5vdyBzdXBwb3J0ZWQgaW4gdGhlIFB5dGhvbgogICAgICAgICAgbW9kdWxlLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhjaGFyICpiYXIsIGludCBzcGFtLCBkb3VibGUgeCk7CgogICAgICAgICAgQ2FuIGJlIGNhbGxlZCBmcm9tIFB5dGhvbiBhcwoKICAgICAgICAgICAgICAgZm9vKHggPSAzLjQsIGJhcj0iaGVsbG8iLCBzcGFtPTQyKQoKICAgICAgICAgIFRvIGVuYWJsZSB0aGlzIGZlYXR1cmUsIHJ1biBTV0lHIHdpdGggdGhlICcta2V5d29yZCcgY29tbWFuZAogICAgICAgICAgbGluZSBvcHRpb24uICAgIE1peGluZyBrZXl3b3JkIGFuZCBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgc2hvdWxkIHdvcmsgYXMgd2VsbC4gICBVbm5hbWVkIGFyZ3VtZW50cyBhcmUgYXNzaWduZWQgbmFtZXMKICAgICAgICAgIHN1Y2ggYXMgImFyZzEiLCAiYXJnMiIsIGV0Yy4uLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgRnVuY3Rpb25zIHdpdGggZHVwbGljYXRlIGFyZ3VtZW50IG5hbWVzIHN1Y2ggYXMKICAgICAgICAgIGJhcihpbnQgKk9VVFBVVCwgaW50ICpPVVRQVVQpIHdpbGwgbGlrZWx5IGNhdXNlIHByb2JsZW1hdGljCiAgICAgICAgICB3cmFwcGVyIGNvZGUgdG8gYmUgZ2VuZXJhdGVkLiAgIFRvIGZpeCB0aGlzLCAgdXNlIGRpZmZlcmVudAogICAgICAgICAgbmFtZXMgb3IgdXNlICVhcHBseSB0byBtYXAgdHlwZW1hcHMgdG8gYWx0ZXJuYXRlIG5hbWVzLgoKOC84Lzk5ICA6IEhhbmRsaW5nIG9mIHRoZSAndGhpcycgcG9pbnRlciBoYXMgYmVlbiBjaGFuZ2VkIGluIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBQcmV2aW91c2x5LCBkZXJlZmVyZW5jaW5nIG9mICcudGhpcycgb2NjdXJyZWQgaW4gdGhlCiAgICAgICAgICBQeXRob24gc2hhZG93IGNsYXNzIGl0c2VsZi4gICBOb3csIHRoaXMgc3RlcCBvY2N1cnMgaW4gdGhlIEMKICAgICAgICAgIHdyYXBwZXJzIHVzaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CgogICAgICAgICAgICAgICAgU1dJR19HZXRQdHJPYmooUHlPYmplY3QgKiwgdm9pZCAqKnB0ciwgY2hhciAqdHlwZSkKCiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGNhbiBhY2NlcHQgZWl0aGVyIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBwb2ludGVyCiAgICAgICAgICBvciBhIHNoYWRvdyBjbGFzcyBpbnN0YW5jZSB3aXRoIGEgJy50aGlzJyBhdHRyaWJ1dGUgb2YKICAgICAgICAgIGFwcHJvcHJpYXRlIHR5cGUuICBUaGlzIGNoYW5nZSBhbGxvd3MgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgICAxLiAgVGhlIHJlYWwgc2hhZG93IGNsYXNzIGluc3RhbmNlIGZvciBhbiBvYmplY3QgaXMKICAgICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEMgd3JhcHBlcnMgd2hlcmUgaXQgY2FuIGJlIGV4YW1pbmVkL21vZGlmaWVkCiAgICAgICAgICAgICAgYnkgdHlwZW1hcHMuCgogICAgICAgICAgMi4gIEhhbmRsaW5nIG9mIGRlZmF1bHQva2V5d29yZCBhcmd1bWVudHMgaXMgbm93IGdyZWF0bHkKICAgICAgICAgICAgICBzaW1wbGlmaWVkLgoKICAgICAgICAgIDMuICBUaGUgUHl0aG9uIHdyYXBwZXIgY29kZSBpcyBtdWNoIG1vcmUgc2ltcGxlLgoKICAgICAgICAgIFBsdXMsIGl0IGVsaW1pbmF0ZWQgbW9yZSB0aGFuIDMwMCBsaW5lcyBvZiBDKysgY29kZSBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBtb2R1bGUuCgogICAgICAgICAgKioqIENBVkVBVCA6IFRoaXMgcmVxdWlyZXMgdGhlIGFic3RyYWN0IG9iamVjdCBpbnRlcmZhY2UuCiAgICAgICAgICBJdCBzaG91bGQgd29yayB3aXRoIFB5dGhvbiAxLjQsIGJ1dCBwcm9iYWJseSBub3RoaW5nIG9sZGVyCiAgICAgICAgICB0aGFuIHRoYXQuCgoKOC84Lzk5ICA6IEZpeGVkIGhhbmRsaW5nIG9mICJjb25zdCIgYW5kIHBvaW50ZXJzIGluIGNsYXNzZXMuICBJbiBwYXJ0aWN1bGFyLAogICAgICAgICAgZGVjbGFyYXRpb25zIHN1Y2ggYXMKCiAgICAgICAgICAgY2xhc3MgZm9vIHsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgY29uc3QgY2hhciAqbXNnOwogICAgICAgICAgICAgY29uc3QgaW50ICAqaXB0cjsKICAgICAgICAgIH0KCiAgICAgICAgICBhcmUgaGFuZGxlZCBhcyBhc3NpZ25hYmxlIHZhcmlhYmxlcyBhcyBvcHBvc2VkIHRvIGNvbnN0YW50CiAgICAgICAgICB2YWx1ZXMgKHRoaXMgaXMgdGhlIGNvcnJlY3QgYmVoYXZpb3IgaW4gQy9DKyspLiAgIE5vdGU6CiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcyAiY2hhciAqY29uc3QgbXNnIiBhcmUgc3RpbGwgdW5zdXBwb3J0ZWQuCiAgICAgICAgICBDb25zdGFudHMgZGVjbGFyZWQgYXQgdGhlIGdsb2JhbCBsZXZlbCB1c2luZyBjb25zdCBhcmUgYWxzbwogICAgICAgICAgYnJva2VuIChiZWNhdXNlIEkgaGF2ZSBhIG51bWJlciBvZiBpbnRlcmZhY2VzIHRoYXQgcmVseSB1cG9uCiAgICAgICAgICB0aGlzIGJlaGF2aW9yKS4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFRoaXMgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdAogICAgICAgICAgbWlzdGFrZW5seSB0cmVhdCAnY29uc3QgY2hhciAqJyB0eXBlcyBhcyBjb25zdGFudCB2YWx1ZXMuCgo4LzgvOTkgIDogTW9kaWZpZWQgdGhlIHBhcnNlciB0byBzdXBwb3J0IGJpdC1maWVsZHMuICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfa2V5d29yZCA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX2V4dGVybiAgOiAxOwogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19zdGF0aWMgIDogMTsKICAgICAgICAgIH0gZmxhZ3M7CgogICAgICAgICAgQml0LWZpZWxkcyBjYW4gb25seSBiZSBhcHBsaWVkIHRvIGludGVnZXIgdHlwZXMgYW5kIHRoZWlyCiAgICAgICAgICBhcmUgb3RoZXIgcmVzdHJpY3Rpb25zLiAgU1dJRyBwZXJmb3JtcyBubyBzdWNoIHR5cGUtY2hlY2tpbmcKICAgICAgICAgIChhbHRob3VnaCB0aGUgQyBjb21waWxlciB3aWxsIGNhdGNoIHByb2JsZW1zIHdoZW4gaXQgdHJpZXMgdG8KICAgICAgICAgIGNvbXBpbGUgdGhlIHdyYXBwZXIgY29kZSkuCgo4LzgvOTkgIDogUmVtb3ZlZCB0cmFpbGluZyBzcGFjZSBvZiAkYmFzZXR5cGUgc3Vic3RpdHV0aW9uIGluIHR5cGVtYXBzLgogICAgICAgICAgVGhpcyBpcyB0byBhbGxvdyB0aGluZ3MgbGlrZSB0aGlzOgoKICAgICAgICAgICV0eXBlbWFwKHB5dGhvbiwgYXJnb3V0KSBzcGFtKiogT1VUUFVUewogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIGNoYXIqIGEgPSAiJGJhc2V0eXBlX3AiOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgfQoKICAgICAgICAgIChQYXRjaCBzdWdnZXN0ZWQgYnkgTmF0aGFuIER1bmZpZWxkKS4KCjYvMjIvOTkgOiBNYWRlIGEgdmVyeSBzbGlnaHQgdHdlYWsgdG8gdGhlIFBlcmw1IHNoYWRvdyBjbGFzcwogICAgICAgICAgY29kZSB0aGF0IGFsbG93cyB0eXBlbWFwcyB0byBhbHRlciB0aGUgcmV0dXJuIHR5cGUKICAgICAgICAgIG9mIG9iamVjdHMgKHRvIHN1cHBvcnQgcG9seW1vcnBoaWMgdHlwZXMpLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IERyYWtlIERpZWRyaWNoLgoKNC84Lzk5ICA6IEZpeGVkIG51bGwgcG9pbnRlciBoYW5kbGluZyBidWcgaW4gUGVybCBtb2R1bGUuCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBKdW5pbyBIYW1hbm8uCgozLzE3Lzk5IDogRml4ZWQgYnVnIGluIHBlcmw1cHRyLnN3ZyBmb3IgQWN0aXZlU3RhdGUgUGVybC4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEdyZWcgQW5kZXJzb24uCgoyLzI3Lzk5IDogRWxpbWluYXRlZCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBTd2lnIHJ1bnMgb24KICAgICAgICAgIGVtcHR5IGZpbGVzLgoKMi8yNy85OSA6IEFkZGVkIHBhdGNoIHRvIEd1aWxlIG1vZHVsZSB0byBlbGltaW5hdGUgdW51c2VkCiAgICAgICAgICB2YXJpYWJsZXMuICAgQ29udHJpYnV0ZWQgYnkgTWlrZSBTaW1vbnMuCgoyLzI3Lzk5IDogRml4ZWQgcHJvYmxlbSB3aXRoICVhZGRtZXRob2RzIHJldHVybmluZyByZWZlcmVuY2VzLgoKMi8yNy85OSA6IEZpeGVkIFJ1bnRpbWUvTWFrZWZpbGUuIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICBNaWtlIFJvbWJlcmcuCgoyLzI3Lzk5IDogSW5jb3Jwb3JhdGVkIHBhdGNoZXMgdG8gdGhlIHR5cGUtY2hlY2tlci4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggLWV4cG9ydGFsbCBzd2l0Y2ggYW5kIHNoYWRvdyBjbGFzc2VzCiAgICAgICAgICBpbiBQZXJsNSBtb2R1bGUuICBQYXRjaCBjb250cmlidXRlZCBieSBEZW5uaXMgTWFyc2EuCgoyLzI3Lzk5IDogTW9kaWZpZWQgUGVybDUgbW9kdWxlIHRvIHJlY29nbml6ZSAndW5kZWYnIGFzIGEgTlVMTCBjaGFyICouCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBKdW5pbyBIYW1hbm8uCgoyLzI3Lzk5IDogRml4ZWQgdGhlIFBlcmw1IG1vZHVsZSB0byBzdXBwb3J0IHRoZSBuZXdlciB2ZXJzaW9ucyBvZgogICAgICAgICAgQWN0aXZlU3RhdGUgUGVybCBmb3IgV2luMzIuCgoyLzI3Lzk5IDogRml4ZWQgdGhlIGluY2x1ZGUgb3JkZXIgb2YgZmlsZXMgc3BlY2lmaWVkIHdpdGggdGhlCiAgICAgICAgICAtSSBvcHRpb24uCgoyLzUvOTgtIDogRGF2ZSBmaW5pc2hlcyBoaXMgZGlzc2VydGF0aW9uLCBnb2VzIGpvYiBodW50aW5nLCBtb3ZlcyB0bwoyLzUvOTkgICAgQ2hpY2FnbyBhbmQgZ2VuZXJhbGx5IHRocmFzaGVzIGFib3V0LgoKVmVyc2lvbiAxLjEgUGF0Y2ggNSAoRmVicnVhcnkgNSwgMTk5OCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIvNC85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIGRpZmZlcmVudCBwYWNrYWdlCiAgICAgICAgICBsb2NhdGlvbnMgYXJlIHNwZWNpZmllZCAoLS13aXRoLXRjbGluY2wsIGV0Yy4uLikuCgoyLzIvOTggIDogRml4ZWQgbmFtZS1jbGFzaCBidWcgcmVsYXRlZCB0byB0aGUgc3dpdGNoIHRvIEMgbWFjcm9zIGZvciBhY2Nlc3NvcgogICAgICAgICAgZnVuY3Rpb25zLiAgVGhlIG5ldyBzY2hlbWUgZGlkIG5vdCB3b3JrIGNvcnJlY3RseSBmb3Igb2JqZWN0cwogICAgICAgICAgd2l0aCBtZW1iZXJzIHN1Y2ggYXMgJ29iaicsICd2YWwnLCBldGMuLi4gICBGaXhlZCB0aGUgYnVnIGJ5CiAgICAgICAgICBhcHBlbmRpbmcgdGhlIHdvcmQgJ3N3aWcnIHRvIG1hY3JvIGFyZ3VtZW50IG5hbWVzLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IFJ1ZHkgQWxiYWNodGVuLgoKMi8yLzk4ICA6IFNsaWdodCBmaXggdG8gdGhlIFBlcmw1IG1vZHVsZSB0byBlbGltaW5hdGUgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgYWJvdXQgJ3Zhcm5hbWUgdXNlZCBvbmx5IG9uY2UgOiBwb3NzaWJsZSB0eXBvJy4gIEZpeAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgUnVkeSBBbGJhY2h0ZW4uCgoxLzkvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIFBlcmwgNSBtb2R1bGUgcmVsYXRlZCB0byB0aGUgY3JlYXRpb24gb2YKICAgICAgICAgIGNvbnN0YW50cyBhbmQgc2hhZG93IGNsYXNzZXMuCgoxLzkvOTggIDogRml4ZWQgbGlua2luZyBidWcgd2l0aCBQeXRob24gMS41IGVtYmVkLmkgbGlicmFyeSBmaWxlLgoKVmVyc2lvbiAxLjEgUGF0Y2ggNCAoSmFudWFyeSA0LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLzQvOTggIDogQ2hhbmdlZCBzdHJ1Y3R1cmVkIG9mIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgdG8gYmUgbW9yZSBmcmllbmRseQogICAgICAgICAgdG8gQm9ybGFuZCBDKysuCgoxLzQvOTggIDogQWRkZWQgdGhlIGZ1bmN0aW9uIE1ha2VmaWxlLndpbi5iYyBmb3IgY29tcGlsaW5nIHRoZSBleGFtcGxlcwogICAgICAgICAgdW5kZXIgQm9ybGFuZCA1LjIuCgoxLzQvOTggIDogU2xpZ2h0IGNoYW5nZSB0byB0aGUgcGVybDUgbW9kdWxlIGFuZCBDKysgY29tcGlsYXRpb24uICBUaGUKICAgICAgICAgIDxtYXRoLmg+IGxpYnJhcnkgaXMgbm93IGluY2x1ZGVkIGJlZm9yZSBhbnkgUGVybCBoZWFkZXJzCiAgICAgICAgICBiZWNhdXNlIFBlcmwgdGhlIGV4dGVybiAiQyIgbGlua2FnZSBvZiBtYXRoLmggc2NyZXdzIGFsb3QKICAgICAgICAgIG9mIHRoaW5ncyB1cCAoZXNwZWNpYWxseSBvbiBXaW5kb3dzKS4KCjEvMi85OCAgOiBDaGFuZ2UgdG8gdGhlIFB5dGhvbiBtb2R1bGUgdGhhdCByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29uc3RhbnRzCiAgICAgICAgICBjcmVhdGVkIGJ5IEMrKyBjbGFzc2VzLCBpbmhlcml0YW5jZSwgYW5kIHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMKICAgICAgICAgIG1vZGlmaWNhdGlvbiBtYXkgaW50cm9kdWNlIGEgZmV3IHNsaWdodCBpbmNvbXBhdGliaWxpdGllcyBpZgogICAgICAgICAgeW91IGF0dGVtcHQgdG8gdXNlIHRoZSBub24tc2hhZG93IGNsYXNzIGludGVyZmFjZSB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3NlcyBlbmFibGVkLiAgICBQYXRjaCBjb250cmlidXRlZCBieSBNaWtlIFJvbWJlcmcuCgoxLzIvOTggIDogU3VwcG9ydCBmb3IgVGNsIDguMCBuYW1lc3BhY2VzIGhhcyBiZWVuIGFkZGVkLiAgIFRoaXMgKnJlcGxhY2VzKgogICAgICAgICAgdGhlIG9yaWdpbmFsIFNXSUcgbWVjaGFuaXNtIHRoYXQgYXNzdW1lZCBbaW5jciBUY2xdIG5hbWVzcGFjZXMuCiAgICAgICAgICBUbyB1c2UgbmFtZXNwYWNlcywgc2ltcGx5IHJ1biBTV0lHIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zCgogICAgICAgICAgICAgc3dpZyAtdGNsIC1uYW1lc3BhY2UgIGZvby5pCgogICAgICAgICAgICAgICAgICAgIFRoaXMgcGxhY2VzIGV2ZXJ5dGhpbmcgaW4gYSBuYW1lc3BhY2UgdGhhdCBtYXRjaGVzCiAgICAgICAgICAgICAgICAgICAgdGhlIG1vZHVsZSBuYW1lCgogICAgICAgICAgICAgc3dpZyAtdGNsIC1uYW1lc3BhY2UgLXByZWZpeCBiYXIgZm9vLmkKCiAgICAgICAgICAgICAgICAgICAgVGhpcyBwbGFjZXMgZXZlcnl0aGluZyBpbiB0aGUgbmFtZXNwYWNlICdiYXInCgogICAgICAgICAgVGhlIHVzZSBvZiBuYW1lc3BhY2VzIGlzIG5ldyBpbiBUY2wgOC4wLiAgSG93ZXZlciwgdGhlIHdyYXBwZXIgY29kZQogICAgICAgICAgZ2VuZXJhdGVkIGJ5IFNXSUcgd2lsbCBzdGlsbCB3b3JrIHdpdGggYWxsIHZlcnNpb25zIG9mIFRjbCBuZXdlcgogICAgICAgICAgdGhhbiBhbmQgaW5jbHVkaW5nIFRjbCA3LjMvVGszLjYgZXZlbiBpZiB0aGUgLW5hbWVzcGFjZSBvcHRpb24gaXMKICAgICAgICAgIHVzZWQuCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgZXhpc3RpbmcgYXBwbGljYXRpb25zIHRoYXQgcmVsaWVkIG9uIHRoZQogICAgICAgICAgLXByZWZpeCBhbmQgLW5hbWVzcGFjZSBvcHRpb25zLgoKMS8yLzk4ICA6IEFkZGVkIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzIHRvIHRoZSBUY2wgd3JhcHBlciBjb2RlCgogICAgICAgICAgICAgICAgIFNXSUdfbmFtZSAgICAgIC0gTmFtZSBvZiB0aGUgU1dJRyBtb2R1bGUKICAgICAgICAgICAgICAgICBTV0lHX3ByZWZpeCAgICAtIFByZWZpeC9uYW1lc3BhY2UgYXBwZW5kZWQgdG8gY29tbWFuZCBuYW1lcwogICAgICAgICAgICAgICAgIFNXSUdfbmFtZXNwYWNlIC0gTmFtZSBvZiB0aGUgbmFtZXNwYWNlCgogICAgICAgICAgU1dJRyBsaWJyYXJ5IHdyaXRlcnMgY2FuIHVzZSB0aGVzZSB0byB0aGVpciBhZHZhbnRhZ2VzLgoKMS8yLzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2w4IG1vZHVsZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvZgogICAgICAgICAgcG9pbnRlciBjb25zdGFudHMgKHRoZSBmdW5jdGlvbiBTV0lHX01ha2VQdHIgd2FzIG1pc3NpbmcgZnJvbQogICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSkuCgoxLzIvOTggIDogQWRkZWQgdGhlIGNvbnN0aGFzaC5pIGxpYnJhcnkgZmlsZSB0byB0aGUgVGNsIGFuZCBUY2w4IG1vZHVsZXMuCgoxLzEvOTggIDogQ2hhbmdlZCBhbmQgY2xlYW5lZCB1cCB0aGUgUHl0aG9uIHR5cGVtYXBzLmkgZmlsZS4gICBUaGUgZm9sbG93aW5nCiAgICAgICAgICBzaWduaWZpY2FudCBjaGFuZ2VzIHdlcmUgbWFkZSA6CgogICAgICAgICAgICAgICAgMS4gIFRoZSBPVVRQVVQgdHlwZW1hcCBub3cgcmV0dXJucyBQeXRob24gdHVwbGVzIGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgICBsaXN0cy4gICBMaXN0cyBjYW4gYmUgcmV0dXJuZWQgYXMgYmVmb3JlIGJ5IHVzaW5nIHRoZQogICAgICAgICAgICAgICAgICAgIExfT1VUUFVUIHR5cGUuICAgIElmIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciB2ZXJzaW9ucwogICAgICAgICAgICAgICAgICAgIGlzIG5lZWRlZCwgcnVuIFNXSUcgd2l0aCB0aGUgLURPVVRQVVRfTElTVCBvcHRpb24uCgogICAgICAgICAgICAgICAgMi4gIFRoZSBCT1RIIHR5cGVtYXAgaGFzIGJlZW4gcmVuYW1lZCB0byBJTk9VVC4gIEZvciBiYWNrd2FyZHMKICAgICAgICAgICAgICAgICAgICBjb21wYXRpYmlsaXR5LCB0aGUgIkJPVEgiIG1ldGhvZCBzdGlsbCBleGlzdHMgaG93ZXZlci4KCiAgICAgICAgICAgICAgICAzLiAgT3V0cHV0IHR5cGVtYXBzIG5vdyBnZW5lcmF0ZSBsZXNzIGNvZGUgdGhhbiBiZWZvcmUuCgogICAgICAgICAgQ2hhbmdlcyB0byB0eXBlbWFwcy5pIG1heSBicmVhayBleGlzdGluZyBQeXRob24gc2NyaXB0cyB0aGF0IGFzc3VtZQogICAgICAgICAgb3V0cHV0IGluIHRoZSBmb3JtIG9mIGEgbGlzdC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMzEvOTc6IEZpeGVkIGxvbmcgb3ZlcmR1ZSBwcm9ibGVtcyB3aXRoIHRoZSB0ZXN0aW5nIHNjcmlwdHMgYW5kIGNlcnRhaW4KICAgICAgICAgIG1ha2VmaWxlcyB0aGF0IHJlcXVpcmVkIHRoZSB1c2Ugb2YgdGhlIGJhc2ggc2hlbGwuICAgRXZlcnl0aGluZyBzaG91bGQKICAgICAgICAgIHdvcmsgcHJvcGVybHkgd2l0aCB0aGUgc3RhbmRhcmQgQm91cm5lIHNoZWxsIChzaCkgbm93LgoKMTIvMzEvOTc6IE1vZGlmaWVkIHR5cGVtYXBzIHRvIGFsbG93ICRiYXNldHlwZSBhcyBhIHZhbGlkIGxvY2FsIHZhcmlhYmxlLgogICAgICAgICAgVGhpcyBhbGxvd3MgZm9yIGFsbCBzb3J0cyBvZiBiaXphcnJlIGhhY2tpc2ggdHlwZW1hcHMgdGhhdAogICAgICAgICAgZG8gY29vbCB0aGluZ3MuICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRG9taW5pcXVlIER1bW9udC4KCjEyLzMxLzk3OiBTd2l0Y2hlZCBhY2Nlc3NvciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZvciBtZW1iZXIgZGF0YSB0bwogICAgICAgICAgQyBwcmVwcm9jZXNzb3IgbWFjcm9zIChleGNlcHQgaW4gY2FzZXMgaW52b2x2aW5nIHR5cGVtYXBzCiAgICAgICAgICBvciBjaGFyICopLgoKMTIvMzEvOTc6IEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gQysrIG1lbWJlciBkYXRhIGludm9sdmluZyByZWZlcmVuY2VzLgoKMTIvMzEvOTc6IENoYW5nZWQgYWNjZXNzb3IgZnVuY3Rpb25zIGZvciBDKysgbWVtYmVyIGZ1bmN0aW9ucyB0bwogICAgICAgICAgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gICBUaGlzIGNsZWFucyB1cCB0aGUgd3JhcHBlciBjb2RlCiAgICAgICAgICBhbmQgcmVzdWx0cyBpbiBmZXdlciBmdW5jdGlvbiBkZWZpbml0aW9ucy4KCjEyLzMxLzk3OiBDaGFuZ2VkIHRoZSBkZWZhdWx0IEMgY29uc3RydWN0b3IgdG8gdXNlIGNhbGxvYygpIGluc3RlYWQKICAgICAgICAgIG9mIG1hbGxvYygpCgoxMi8zMC85NzogQ2hhbmdlZCB0aGUgY3JlYXRpb24gb2YgY29uc3RhbnRzIGluIHRoZSBQZXJsNSBtb2R1bGUuCiAgICAgICAgICBGb3IgYWxsIHByYWN0aWNhbCBwdXJwb3NlcywgdGhleSBzaG91bGQgd29yayBpbiBleGFjdGx5IHRoZQogICAgICAgICAgc2FtZSB3YXkgYXMgYmVmb3JlIGV4Y2VwdCB0aGF0IHRoZXkgbm93IHJlcXVpcmUgbXVjaCBsZXNzCiAgICAgICAgICB3cmFwcGVyIGNvZGUuICAgTW9kdWxlcyBjb250YWluaW5nIGxhcmdlIG51bWJlcnMgb2YKICAgICAgICAgIGNvbnN0YW50cyBtYXkgc2VlIGdyZWF0ZXIgdGhhbiBhIDUwJSByZWR1Y3Rpb24gaW4gd3JhcHBlcgogICAgICAgICAgY29kZSBzaXplLgoKMTIvMzAvOTc6IE1vZGlmaWVkIHRoZSBQeXRob24gbW9kdWxlIHRvIGJlIG1vcmUgaW50ZWxsaWdlbnQgYWJvdXQgdGhlCiAgICAgICAgICBjcmVhdGlvbiBvZiBjb25zdGFudHMuICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgcmVkdW5kYW50CiAgICAgICAgICBnbG9iYWwgdmFyaWFibGVzIGFuZCB0aGUgc2l6ZSBvZiB0aGUgbW9kdWxlIGluaXRpYWxpemF0aW9uCiAgICAgICAgICBmdW5jdGlvbiBzaG91bGQgYmUgcmVkdWNlZC4gICAoTWFueSB0aGFua3MgdG8gSmltIEZ1bHRvbikuCgoxMi8yOS85NzogRml4ZWQgYSBidWcgaW4gQysrIGNvZGUgZ2VuZXJhdGlvbiByZWxhdGVkIHRvIG1lbWJlciBmdW5jdGlvbnMsCiAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cywgYW5kIHJlZmVyZW5jZXMuCgoxMi8yOS85NzogRml4ZWQgY29uZmlndXJlIHNjcmlwdCBhbmQgYSBmZXcgbWFrZWZpbGVzIHRvIHN1cHBvcnQgUHl0aG9uIDEuNQoKMTIvMjkvOTc6IEFkZGVkICdlbWJlZDE1LmknIGxpYnJhcnkgZmlsZS4gIFRoaXMgZmlsZSBzaG91bGQgYmUgdXNlZCB0bwogICAgICAgICAgc3RhdGljYWxseSBsaW5rIHZlcnNpb25zIG9mIFB5dGhvbiAxLjUuICAgIFRvIG1ha2UgaXQgdGhlIGRlZmF1bHQsCiAgICAgICAgICBzaW1wbHkgY29weSAnc3dpZ19saWIvcHl0aG9uL2VtYmVkMTUuaScgdG8gJ3N3aWdfbGliL3B5dGhvbi9lbWJlZC5pJwoKVmVyc2lvbiAxLjEgUGF0Y2ggMyAoTm92ZW1iZXIgMjQsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHdpdGggc2hhZG93IGNsYXNzZXMgYW5kCiAgICAgICAgICBzdGF0aWMgY2xhc3MgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGNsYXNzIGluc3RhbmNlcy4KICAgICAgICAgIE5vdGUgOiBUaGUgZml4IGZvciB0aGlzIGJ1ZyByZXF1aXJlcyBhIHNsaWdodCByZXN0cnVjdHVyaW5nIG9mCiAgICAgICAgICBvZiB0aGUgLnBtIGZpbGVzIGNyZWF0ZWQgYnkgU1dJRy4KCjExLzIzLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgVGNsL1RjbDggbW9kdWxlcyByZWxhdGVkIHRvIHZhcmlhYmxlIGxpbmtpbmcKICAgICAgICAgIG9mIGNoYXJhY3RlciBhcnJheXMuICBJZiB5b3UgZGVjbGFyZWQgYSBnbG9iYWwgdmFyaWFibGUgJ2NoYXIgZm9vWzEwXScsCiAgICAgICAgICB0aGUgZ2VuZXJhdGVkIHdyYXBwZXIgY29kZSB3b3VsZCBlaXRoZXIgY2F1c2UgYSBzZWdtZW50YXRpb24gZmF1bHQKICAgICAgICAgIGltbWVkaWF0ZWx5IHVwb24gbG9hZGluZyBvciB3ZWlyZCBtZW1vcnkgY29ycnVwdGlvbiBlbHNld2hlcmUuCiAgICAgICAgICBUaGlzIHNob3VsZCBub3cgYmUgZml4ZWQgYWx0aG91Z2ggY2hhcmFjdGVyIGFycmF5cyBjYW4gb25seSBiZQogICAgICAgICAgcmVhZC1vbmx5LgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlIHRoYXQgY2F1c2VkIGl0IHRvCiAgICAgICAgICBmYWlsIGlmIGZpbGVzIHdlcmUgaW1wb3J0ZWQgZnJvbSBkaXJlY3RvcmllcyBvdGhlciB0aGFuCiAgICAgICAgICB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4KCjExLzIzLzk3OiBGaXhlZCBpbmNvcnJlY3QgZGlhZ25vc3RpYyBtZXNzYWdlIGluIHRoZSBBU0NJSSBkb2N1bWVudGF0aW9uCiAgICAgICAgICBtb2R1bGUuCgoxMS8yMy85NzogQ2hhbmdlZCB0aGUgYmVoYXZpb3Igb2YgdGhlIC1vIG9wdGlvbiB3aGVuIHVzZWQgd2l0aCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuIElmIC1vIHdhcyB1c2VkIHRvIHNwZWNpZnkgYm90aCB0aGUgcGF0aG5hbWUgYW5kIGZpbGVuYW1lCiAgICAgICAgICBvZiBTV0lHJ3Mgb3V0cHV0IHN1Y2ggYXMKCiAgICAgICAgICAgICAgICAgc3dpZyAtbyAvaG9tZS9zd2lnL3dyYXBwZXIuYyAtc2hhZG93IC1wZXJsNSBmb28uaQoKICAgICAgICAgIFRoZSB3cmFwcGVyIGNvZGUgd291bGQgYmUgcGxhY2VkIHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIC1vLAogICAgICAgICAgYnV0IHRoZSAucG0gZmlsZSBhbmQgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBwbGFjZWQgaW4gdGhlCiAgICAgICAgICBkaXJlY3Rvcnkgd2hlcmUgU1dJRyB3YXMgcnVuLiAgIE5vdywgdGhlc2UgZmlsZXMgYXJlIHBsYWNlZAogICAgICAgICAgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBmaWxlIHNwZWNpZmllZCB3aXRoIHRoZSAtbyBvcHRpb24uCiAgICAgICAgICBUaGlzIGNoYW5nZSBpcyBhbHNvIG5lZWRlZCBmb3IgcHJvcGVyIG9wZXJhdGlvbiBvbiB0aGUKICAgICAgICAgIE1hY2ludG9zaC4KCjExLzIzLzk3OiBBZGRlZCBhICd0aGlzKCknIG1ldGhvZCB0byBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4gICBUaGlzIGNhbgogICAgICAgICAgYmUgdXNlZCB0byByZXR1cm4gdGhlIG5vcm1hbCBwb2ludGVyIHZhbHVlIGZyb20gYSBzaGFkb3cKICAgICAgICAgIGNsYXNzIHRoYXQgaXMgcmVwcmVzZW50ZWQgYXMgYSB0aWVkIGhhc2guICAgVG8gdXNlIGp1c3QKICAgICAgICAgIGludm9rZSBhcyBhIG1ldGhvZCBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAkbCA9IG5ldyBMaXN0OyAgICAgICAjIENyZWF0ZSBhbiBvYmplY3QKICAgICAgICAgICAgICAkcHRyID0gJGwtPnRoaXMoKTsgICAjIEdldCB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUKCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yMy85NzogRml4ZWQgdGhlIFRjbCA4IHBvaW50ZXIuaSBsaWJyYXJ5IGZpbGUgKHdoaWNoIHdhcyBjb21wbGV0ZWx5CiAgICAgICAgICBicm9rZW4gaW4gMS4xcDIpLgoKMTEvMjMvOTc6IE1vZGlmaWVkIHRoZSBQZXJsNSB0eXBlLWNoZWNrZXIgdG8gZml4IGEgZmV3IHByb2JsZW1zCiAgICAgICAgICB3aXRoIGdsb2JhbCB2YXJpYWJsZXMgb2YgcG9pbnRlciB0eXBlcyBhbmQgdG8gYWxsb3cKICAgICAgICAgIHRpZWQgaGFzaGVzIHRvIGJlIHVzZWQgaW50ZXJjaGFuZ2FibHkgd2l0aCBub3JtYWwKICAgICAgICAgIHBvaW50ZXIgdmFsdWVzLgoKMTEvMjMvOTc6IE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1lY2hhbmlzbSB0byBhbGxvdyBvdXRwdXQKICAgICAgICAgIHR5cGVtYXBzIG9mIHR5cGUgJ3ZvaWQnLiAgIFRoZXNlIHdlcmUgaWdub3JlZCBwcmV2aW91c2x5LAogICAgICAgICAgYnV0IG5vdyBpZiB5b3Ugc3BlY2lmeSwKCiAgICAgICAgICAgICAgICAldHlwZW1hcChsYW5nLG91dCkgdm9pZCB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gcmV0dXJuIGEgdm9pZCAuLi4KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBZb3UgY2FuIGNoYW5nZSBvciBhc3NpZ24gYSByZXR1cm4gdmFsdWUgdG8gdGhlIGZ1bmN0aW9uLgoKMTEvMjMvOTc6IEZpeGVkIHByb2Nlc3Npbmcgb2YgJ2Jvb2wnIGRhdGF0eXBlcyBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KCjExLzIzLzk3OiBGaXhlZCBtaW5vciBwYXJzaW5nIGVycm9yIHdpdGggQysrIGluaXRpYWxpemVycy4gRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIEIoKSA6IEEoKSB7IC4uLiB9OwogICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsOCBtb2R1bGUgc28gdGhhdCBDIGZ1bmN0aW9ucyB0aGF0IGNhbGwgYmFjayBpbnRvCiAgICAgICAgICBUY2wgZG9uJ3QgY29ycnVwdCB0aGUgcmV0dXJuIHJlc3VsdCBvYmplY3QgKFNXSUcgd2FzIGdhdGhlcmluZwogICAgICAgICAgdGhlIHJlc3VsdCBvYmplY3QgdG9vIGVhcmx5IHdoaWNoIGxlYWRzIHRvIHByb2JsZW1zIGlmIHN1YnNlcXVlbnQKICAgICAgICAgIFRjbCBjYWxscyBhcmUgbWFkZSkuCgoxMS8yMy85NzogRml4ZWQgYSBjb2RlIGdlbmVyYXRpb24gYnVnIGluIHRoZSBQeXRob24gbW9kdWxlIHdoZW4gdHdvIG9yCiAgICAgICAgICBtb3JlIG91dHB1dCBwYXJhbWV0ZXJzIHdlcmUgdXNlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnRzIG9mIGEKICAgICAgICAgIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAlaW5jbHVkZSB0eXBlbWFwcy5pCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICpPVVRQVVQsIGRvdWJsZSAqT1VUUFVULCBkb3VibGUgYSk7CgogICAgICAgICAgUHJldmlvdXNseSwgZG9pbmcgdGhpcyByZXN1bHRlZCBpbiB0aGUgY3JlYXRpb24gb2YgYW4KICAgICAgICAgIGV4dHJhbmVvdXMgY29tbWEgaW4gdGhlIG91dHB1dCwgcmVzdWx0aW5nIGluIGEgQyBzeW50YXggZXJyb3IuCgoxMS8yMi85NzogRml4ZWQgYSBidWcgd2hlbiB0ZW1wbGF0ZSBoYW5kbGluZyB0aGF0IHdhcyBzdHJpcHBpbmcgd2hpdGVzcGFjZQogICAgICAgICAgYXJvdW5kIG5lc3RlZCB0ZW1wbGF0ZXMuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICBGb288QmFyPGRvdWJsZT4gPgoKICAgICAgICAgIHdhcyBnZXR0aW5nIG11bmdlZCBpbnRvIEZvbzxCYXI+PiB3aGljaCBpcyBhIHN5bnRheCBlcnJvciBpbgogICAgICAgICAgaW4gdGhlIEMrKyBjb21waWxlci4KCjExLzIyLzk3OiBGaXhlZCBidWdzIGluIHRoZSBCb3JsYW5kIEMrKyBtYWtlZmlsZXMuCgoxMS8yMi85NzogRml4ZWQgbWVtb3J5IGNvcnJ1cHRpb24gYnVnIHdoZW4gcHJvY2Vzc2luZyBpbnRlZ2VyCiAgICAgICAgICBhcmd1bWVudHMgaW4gVGNsOCBtb2R1bGUuCgoxMS8yMS85NzogRml4ZWQgYSBidWcgaW4gdGhlIFJ1bnRpbWUvTWFrZWZpbGUgcmVsYXRlZCB0byBUY2wgOC4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyB3aXRoIHRoZSAlbmV3IGRpcmVjdGl2ZSBhbmQgUGVybDUgc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICBObyBsb25nZXIgZ2VuZXJhdGVzIGEgcGVybCBzeW50YXggZXJyb3IuCgoxMS85Lzk3IDogQ2hhbmdlZCBhIHN0cm5jcHkoKSB0byBzdHJjcHkoKSBpbiB0aGUgcG9pbnRlciB0eXBlLWNoZWNrZXIuCiAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYSBzdWJzdGFudGlhbCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBpbgogICAgICAgICAgdHlwZS1jaGVja2luZy4KCjEwLzI5Lzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgY29kZSBnZW5lcmF0aW9uIG9mIGRlZmF1bHQgYXJndW1lbnRzIGFuZAogICAgICAgICAgdXNlci1kZWZpbmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhWZWN0b3IgYSwgVmVjdG9yIGIgPSBkKTsKCiAgICAgICAgICBzaG91bGQgbm93IHdvcmsgcHJvcGVybHkuCgpWZXJzaW9uIDEuMSBQYXRjaCAyIChTZXB0ZW1iZXIgNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzQvOTcgIDogRml4ZWQgcHJvYmxlbSB3aXRoIGhhbmRsaW5nIG9mIHZpcnR1YWwgZnVuY3Rpb25zIHRoYXQKICAgICAgICAgIHdhcyBpbnRyb2R1Y2VkIGJ5IHNvbWUgY2hhbmdlcyBpbiB0aGUgQysrIG1vZHVsZS4KClZlcnNpb24gMS4xIFBhdGNoIDEgKEF1Z3VzdCAyNywgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOC8yNi85NyA6IEZpeGVkIGNvbXBpbGF0aW9uIGFuZCBydW4tdGltZSBidWdzIHdpdGggVGNsIDguMCBmaW5hbC4KCjgvMjEvOTcgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVnIHdpdGggYXJyYXlzIGFwcGVhcmluZyBhcyBhcmd1bWVudHMKICAgICAgICAgIHRvIEMrKyBtZW1iZXIgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2b2lkIEJhcihpbnQgYVsyMF1bMjBdKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgVGhlcmUgaXMgc3RpbGwgYSBidWcgdXNpbmcgYXJyYXlzIHdpdGggYWRkZWQgbWV0aG9kcwogICAgICAgICAgaG93ZXZlci4KCjgvMjAvOTcgOiBGaXhlZCBhIGJ1ZyB3aXRoIGdlbmVyYXRpbmcgdGhlIGNvZGUgZm9yIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGludm9sdmluZyBwYXNzLWJ5LXZhbHVlLgoKOC8xOS85NyA6IE1vZGlmaWVkIHRoZSB0eXBlbWFwcGVyIHRvIHN1YnN0aXR1dGUgdGhlICckYXJnJyB2YWx1ZQogICAgICAgICAgd2hlbiBkZWNsYXJpbmcgbG9jYWwgdmFyaWFibGVzLiAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgKiAoZG91YmxlIHRlbXBfJGFyZykgewogICAgICAgICAgICAgICAgICAgIC4uLiBkbyBzb21ldGhpbmcgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdoZW4gYXBwbGllZCB0byBhIHJlYWwgZnVuY3Rpb24gc3VjaCBhcyB0aGUgZm9sbG93aW5nIDoKCiAgICAgICAgICAgICAgdm9pZCBmb28oZG91YmxlICphLCBkb3VibGUgKmIsIGRvdWJsZSAqcmVzdWx0KTsKCiAgICAgICAgICB0aHJlZSBsb2NhbCB2YXJpYWJsZXMgd2lsbCBiZSBjcmVhdGVkIGFzIGZvbGxvd3MgOgoKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9hOwogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX2I7CiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfcmVzdWx0OwoKICAgICAgICAgIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiB3cml0aW5nIG11bHRpcGxlIHR5cGVtYXBzIHRoYXQgbmVlZAogICAgICAgICAgdG8gYWNjZXNzIHRoZSBzYW1lIGxvY2FsIHZhcmlhYmxlcy4KCgo3LzI3Lzk3IDogRml4ZWQgYSB2YXJpZXR5IG9mIHByb2JsZW1zIHdpdGggdGhlICVhcHBseSBkaXJlY3RpdmUgYW5kIGFycmF5cy4KICAgICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgZGVjbGFyYXRpb25zIHNob3VsZCBub3cgd29yayA6CgogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIFtBTlldIHsgUmVhbCBbQU5ZXSB9OwogICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlIFs0XSB7IGRvdWJsZSBbMTBdIH07CgogICAgICAgICAgQSBnZW5lcmljIHZlcnNpb24gb2YgYXBwbHkgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgeyBSZWFsIH07CgogICAgICAgICAgc2hvdWxkIG5vdyB3b3JrLS1ldmVuIGlmIGFycmF5cyBpbnZvbHZpbmcgZG91YmxlcyBhbmQgUmVhbHMgYXJlCiAgICAgICAgICB1c2VkIGxhdGVyLgoKNy8yNy85NyA6IENoYW5nZWQgd2FybmluZyBtZXNzYWdlIGFib3V0ICJBcnJheSBYIGhhcyBiZWVuIGNvbnZlcnRlZCB0byBZIiB0bwogICAgICAgICAgb25seSBhcHBlYXIgaWYgcnVubmluZyBTV0lHIGluIHZlcmJvc2UgbW9kZS4KCjcvMjcvOTcgOiBBZGRlZCB0aGUgdmFyaWFibGVzICRwYXJtbmFtZSBhbmQgJGJhc2VtYW5nbGUgdG8gdGhlIHR5cGVtYXAKICAgICAgICAgIGdlbmVyYXRvci4gICAgJHBhcm1uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdXNlZAogICAgICAgICAgd2hlbiB0aGUgdHlwZW1hcCB3YXMgbWF0Y2hlZC4gIEl0IG1heSBiZSAiIiBpZiBubyBwYXJhbWV0ZXIKICAgICAgICAgIHdhcyB1c2VkLiAgICRiYXNlbWFuZ2xlIGlzIGEgbWFuZ2xlZCB2ZXJzaW9uIG9mIHRoZSBiYXNlCiAgICAgICAgICBkYXRhdHlwZS4gICAgU29tZXRpbWVzIHVzZWQgZm9yIGFycmF5IGhhbmRsaW5nLgoKNy8yNy85NyA6IENoYW5nZWQgdGhlIGJlaGF2aW9yIG9mIG91dHB1dCBhcmd1bWVudHMgd2l0aCBQeXRob24gc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICBPcmlnaW5hbGx5LCBpZiBhIGZ1bmN0aW9uIHJldHVybmVkIGFuIG9iamVjdCAnRm9vJywgdGhlIHNoYWRvdyBjbGFzcwogICAgICAgICAgbWVjaGFuaXNtIHdvdWxkIGNyZWF0ZSBjb2RlIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICAgZGVmIHJldHVybl9mb28oKToKICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IEZvb1B0cihzaGFkb3djLnJldHVybl9mb28oKSkKICAgICAgICAgICAgICAgICAgICAgIHZhbC50aGlzID0gMQogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIFRoZSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHR5cGVtYXBzIGFsbG93IGEgdXNlciB0byByZWRlZmluZQogICAgICAgICAgdGhlIG91dHB1dCBiZWhhdmlvciBvZiBhIGZ1bmN0aW9uLS1hcyBhIHJlc3VsdCwgd2UgY2FuIG5vIGxvbmdlcgogICAgICAgICAgbWFrZSBhbnkgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHJldHVybiB0eXBlIGJlaW5nIGEgcG9pbnRlciBvcgogICAgICAgICAgZXZlbiBiZWluZyBhIHNpbmdsZSB2YWx1ZSBmb3IgdGhhdCBtYXR0ZXIgKGl0IGNvdWxkIGJlIGEgbGlzdCwKICAgICAgICAgIHR1cGxlLCBldGMuLi4pLiAgIElmIFNXSUcgZGV0ZWN0cyB0aGUgdXNlIG9mIG91dHB1dCB0eXBlbWFwcwogICAgICAgICAgKGVpdGhlciAib3V0IiBvciAiYXJnb3V0IikgaXQgcmV0dXJucyB0aGUgcmVzdWx0IHVubW9kaWZpZWQgbGlrZQogICAgICAgICAgdGhpcyA6CgogICAgICAgICAgICAgICAgZGVmIHJldHVybl9mb28oKToKICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHNoYWRvd2MucmV0dXJuX2ZvbygpCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgSW4gdGhpcyBjYXNlLCBpdCBpcyB1cCB0byB0aGUgdXNlciB0byBmaWd1cmUgb3V0IHdoYXQgdG8gZG8KICAgICAgICAgIHdpdGggdGhlIHJldHVybiB2YWx1ZSAoaW5jbHVkaW5nIHRoZSBwb3NzaWJpbGl0eSBvZiBjb252ZXJ0aW5nIGl0CiAgICAgICAgICBpbnRvIGEgUHl0aG9uIGNsYXNzKS4KCjcvMjYvOTcgOiBGaXhlZCBhIHBhcnNpbmcgcHJvYmxlbSB3aXRoIHR5cGVzIGxpa2UgJ3Vuc2lnbmVkIGxvbmcgaW50JywKICAgICAgICAgICd1bnNpZ25lZCBzaG9ydCBpbnQnLCBldGMuLi4KCjcvMjQvOTcgOiBNaW5vciBidWcgZml4IHRvIFRjbCA4IG1vZHVsZSB0byBwYXJzZSBlbnVtcyBwcm9wZXJseS4gIEFsc28KICAgICAgICAgIGZpeGVkIGEgbWVtb3J5IGNvcnJ1cHRpb24gcHJvYmxlbSBpbiB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKHBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEhlbnJ5IFJvd2xleS4KCjcvMjQvOTcgOiBBZGRlZCBQeXRob24tdHVwbGUgdHlwZW1hcHMgY29udHJpYnV0ZWQgYnkgUm9iaW4gRHVubi4KCjcvMjQvOTcgOiBJbmNvcnBvcmF0ZWQgc29tZSBjaGFuZ2VzIHRvIHRoZSBQeXRob24gbW9kdWxlIGluIHN1cHBvcnQgb2YKICAgICAgICAgIE1hcmsgSGFtbW9uZCdzIENPTSBzdXBwb3J0LiAgSSdtIG5vdCBlbnRpcmVseSBzdXJlIHRoZXkKICAgICAgICAgIHdvcmsgeWV0IGhvd2V2ZXIuICBOZWVkcyBkb2N1bWVudGF0aW9uIGFuZCB0ZXN0aW5nLgoKNy8yNC85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWdzIHdoZW4gc3RydWN0dXJlcyBoYWQgYXJyYXkgbWVtYmVycwogICAgICAgICAgYW5kIHR5cGVtYXBzIHdlcmUgdXNlZC4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAobWVtYmVyaW4pIGRvdWJsZSBbMjBdWzIwXSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gZ2V0IGEgZG91YmxlIFsyMF1bMjBdIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGFbMjBdWzIwXTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgT3JpZ2luYWxseSwgdGhpcyB3b3VsZCBnZW5lcmF0ZSBhIGNvbXBpbGVyLXR5cGUgZXJyb3Igd2hlbgogICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSB3YXMgY29tcGlsZWQuICAgTm93LCBhIGhlbHBlciBmdW5jdGlvbiBsaWtlCiAgICAgICAgICB0aGlzIGlzIGdlbmVyYXRlZCA6CgogICAgICAgICAgICAgICAgZG91YmxlICpGb29fYV9zZXQoRm9vICphLCBkb3VibGUgdmFsWzIwXVsyMF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBtZW1iZXJpbiB0eXBlbWFwIGhlcmUgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGRvdWJsZSAqKSB2YWw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgV2hlbiB3cml0aW5nIHR5cGVtYXBzLCBvbmUgY2FuIGFzc3VtZSB0aGF0IHRoZSBzb3VyY2UgdmFyaWFibGUKICAgICAgICAgIGlzIGFuIGFycmF5IG9mIHRoZSAqc2FtZSogdHlwZSBhcyB0aGUgc3RydWN0dXJlIG1lbWJlci4gVGhpcwogICAgICAgICAgbWF5IGJyZWFrIHNvbWUgY29kZXMgdGhhdCBtYW5hZ2VkIHRvIHdvcmsgYXJvdW5kIHRoZSBhcnJheSBidWcuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMTMvOTcgOiBGaXhlZCBidWcgaW4gUGVybDUgbW9kdWxlIHdoZW4gdXNpbmcgQyBnbG9iYWwgdmFyaWFibGVzIHRoYXQKICAgICAgICAgIGFyZSBwb2ludGVycy4gIFdoZW4gdXNlZCBpbiBmdW5jdGlvbiBjYWxscyBhbmQgb3RoZXIgb3BlcmF0aW9ucywKICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgcG9pbnRlciB3b3VsZCBiZSBpbnZhbGlkLS0tY2F1c2luZyBjb3JlCiAgICAgICAgICBkdW1wcyBhbmQgb3RoZXIgcHJvYmxlbXMuICBTV0lHIGltcGxlbWVudHMgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgdXNpbmcgUGVybCBtYWdpYyB2YXJpYWJsZXMuICBBcyBpdCB0dXJucyBvdXQsIHRoZSBlcnJvcgogICAgICAgICAgd2FzIGNhdXNlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBwb2ludGVyLWV4dHJhY3Rpb24gY29kZQogICAgICAgICAgd2FzIHNvbWVob3cgYnlwYXNzaW5nIHRoZSBwcm9jZWR1cmUgdXNlZCB0byByZXNvbHZlIG1hZ2ljYWwKICAgICAgICAgIHZhcmlhYmxlcyAoaGVuY2UsIGxlYXZpbmcgdGhlIHZhbHVlIHVuZGVmaW5lZCkuICBUbyBmaXgKICAgICAgICAgIHRoZSBwcm9ibGVtLCBTV0lHIG5vdyBleHBsaWNpdGx5IHJlc29sdmVzIG1hZ2ljIGJlZm9yZQogICAgICAgICAgZXh0cmFjdGluZyBwb2ludGVyIHZhbHVlcy4KCjcvMTIvOTcgOiBFbGltaW5hdGVkIHRoZSBsYXN0IHJlbW5hbnRzIG9mIGZyZWUoKSBhbmQgbWFsbG9jKCkgZnJvbQogICAgICAgICAgdGhlIFNXSUcgY29tcGlsZXIuCgo3LzEyLzk3IDogRml4ZWQgcGFyc2luZyBwcm9ibGVtcyB3aXRoIHR5cGVtYXBzIGludm9sdmluZyBhcnJheXMgYW5kCiAgICAgICAgICB0ZW1wb3JhcnkgdmFyaWFibGVzIG9mIGFycmF5cy4gICAgQWxzbyBtYWRlIGl0IHBvc3NpYmxlIGZvcgogICAgICAgICAgU1dJRyB0byBoYW5kbGUgdHlwZW1hcHMgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbQU5ZXSAoZG91YmxlIHRlbXBbJGRpbTBdKSB7CgkJICAgICAgLi4uIHN0b3JlIGRhdGEgaW4gdGVtcFskZGltMF0gLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIE5vdCBvbmx5IGRvZXMgdGhpcyB0eXBlbWFwIG1hdGNoIGFueSBkb3VibGUgW10gYXJyYXksIGl0CiAgICAgICAgICBjcmVhdGVzIGEgbG9jYWwgdmFyaWFibGUgd2l0aCBwcmVjaXNlbHkgdGhlIHJpZ2h0IGRpbWVuc2lvbnMuCiAgICAgICAgICAoaWUuICRkaW0wIGdldHMgZmlsbGVkIGluIHdpdGggdGhlIHJlYWwgbnVtYmVyIG9mIGRpbWVuc2lvbnMpLgogICAgICAgICAgT2YgY291cnNlLCBvZmYgdGhlIHJlY29yZCwgdGhpcyB3aWxsIGJlIGEgd2F5IHRvIGFkZCBtb3JlCiAgICAgICAgICBmdW5jdGlvbmFsaXR5IHRvIHRoZSB0eXBlbWFwcy5pIGxpYnJhcmllcy4KCjcvOS85NyAgOiBGaXhlZCBzb21lIHByb2JsZW1zIHdpdGggUGVybDUsIHN0YXRpYyBsaW5raW5nLCBhbmQgc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgV2hlbiBzdGF0aWNhbGx5IGxpbmtpbmcgbXVsdGlwbGUgbW9kdWxlcyB0b2dldGhlciwgd3JpdGUKICAgICAgICAgIGEgdG9wLWxldmVsIGludGVyZmFjZSBmaWxlIGxpa2UgdGhpcyB3aGVuIHNoYWRvdyBjbGFzc2VzIGFyZSBub3QKICAgICAgICAgIHVzZWQgOgoKICAgICAgICAgICAgICAgICAlbW9kdWxlIHN3aWcsIGZvbywgYmFyLCBnbG9iOwogICAgICAgICAgICAgICAgICVpbmNsdWRlIHBlcmxtYWluLmkKCiAgICAgICAgICBXaGVuIHNoYWRvdyBjbGFzc2VzIGFyZSB1c2VkLCB0aGUgbW9kdWxlIG5hbWVzIGhhdmUgYW4gZXh0cmEgJ2MnCiAgICAgICAgICBhcHBlbmRlZCBzbyBpdCBzaG91bGQgcmVhZCBhcyA6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgc3dpZywgZm9vYywgYmFyYywgZ2xvYmM7CiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgcGVybG1haW4uaQoKICAgICAgICAgIFdoZW4gbGlua2luZyBtdWx0aXBsZSBtb2R1bGVzLCBjb25zaWRlciB1c2luZyB0aGUgU1dJRyBydW50aW1lCiAgICAgICAgICBsaWJyYXJ5LgoKNy84Lzk3ICA6IEluY29ycG9yYXRlZCBmaXhlZCB2ZXJzaW9ucyBvZiB0aGUgQm9ybGFuZCBDKysgTWFrZWZpbGVzLgoKNy84Lzk3ICA6IEZpcnN0IGN1dCBhdCB0cnlpbmcgdG8gZWxpbWluYXRlIGV4Y2Vzc2l2ZSBjb21waWxlciB3YXJuaW5ncy4KICAgICAgICAgIEFzIGl0IHR1cm5zIG91dCwgYWxvdCBvZiB3YXJuaW5ncyBnbyBhd2F5IGlmIHlvdSBqdXN0IG1ha2UKICAgICAgICAgIGRlY2xhcmF0aW9ucyBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgICAgIGNsaWVudERhdGEgPSBjbGllbnREYXRhOwoKICAgICAgICAgIGluIHRoZSByZXN1bHRpbmcgd3JhcHBlciBjb2RlLiAgTW9zdCBjb21waWxlcnMgc2hvdWxkIGp1c3QKICAgICAgICAgIGlnbm9yZSB0aGlzIGNvZGUgKGF0IGxlYXN0IHdvdWxkIGNhbiBob3BlKS4KCjcvOC85NyAgOiBGaXhlZCBiaXphcnJlIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2l0aCB0eXBlbWFwcyBhbmQgQysrIGNsYXNzZXMuCiAgICAgICAgICBJbiBzb21lIGNhc2VzLCB0eXBlbWFwcyBjb250YWluaW5nIHByaW50ZiBmb3JtYXR0aW5nIHN0cmluZ3Mgc3VjaCBhcwoKICAgICAgICAgICAgICAgICAgJXR5cGVtYXAobWVtYmVyb3V0KSBpbnQgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVkIiw0Mik7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBXb3VsZCBnZW5lcmF0ZSBjb21wbGV0ZWx5IGJvZ3VzIGNvZGUgd2l0aCBnYXJiYWdlIHJlcGxhY2luZwogICAgICAgICAgdGhlICclZCcuICAgQ2F1c2VkIGJ5IG9uZSBmYXVsdHkgdXNlIG9mIHByaW50ZiAod2Fzbid0IGFibGUgdG8gZmluZAogICAgICAgICAgYW55IG90aGVyIG9jY3VycmVuY2VzKS4KCjcvNy85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIHNoYWRvdyBjbGFzcyBnZW5lcmF0aW9uIHdpdGggbm9uLW1lbWJlcgogICAgICAgICAgZnVuY3Rpb25zIHRoYXQgYXJlIHJldHVybmluZyBtb3JlIHRoYW4gb25lIHZhbHVlLgoKNy83Lzk3ICA6IEluY29ycG9yYXRlZCBtb2RpZmljYXRpb25zIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggR3VpbGUgMS4yLgogICAgICAgICAgU3RpbGwgbmVlZCB0byB0ZXN0IGl0IG91dCwgYnV0IGl0IGlzIHJ1bW9yZWQgdG8gd29yay4KCjcvMi85NyAgOiBGaXhlZCBzb21lIGJ1Z3MgcmVsYXRlZCB0byBvdXRwdXQgYXJndW1lbnRzIGFuZCBQeXRob24gc2hhZG93CiAgICAgICAgICBjbGFzc2VzLiAgICBJZiBhbiBvdXRwdXQgYXJndW1lbnQgaXMgZGV0ZWN0ZWQsIFNXSUcgYXNzdW1lcwogICAgICAgICAgdGhhdCB0aGUgcmVzdWx0IGlzIGEgbGlzdCBhbmQgaGFuZGxlcyBpdCBhcHByb3ByaWF0ZWx5LgogICAgICAgICAgSWYgdGhlIG5vcm1hbCByZXR1cm4gdHlwZSBvZiBhbiBmdW5jdGlvbiBpcyBhbiBvYmplY3QsCiAgICAgICAgICBpdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgc2hhZG93IGNsYXNzIGFzIGJlZm9yZSwgYnV0CiAgICAgICAgICB3aXRoIHRoZSBhc3N1bXB0aW9uIHRoYXQgaXQgaXMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYQogICAgICAgICAgbGlzdC4gICoqKiBOT1RFIDogVGhpcyBiZWhhdmlvciBoYXMgYmVlbiBzdWJzZXF1ZW50bHkgY2hhbmdlZCAqKioKCjYvMjkvOTcgOiBDaGFuZ2VkIEVYUE9SVCB0byBTV0lHRVhQT1JUIGluIGFsbCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgIFNob3VsZCBwcm92aWRlIGJldHRlciBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cy4KCjYvMjkvOTcgOiBNb2RpZmllZCBQeXRob24gc2hhZG93IGNsYXNzZXMgc28gdGhhdCBvdXRwdXQgYXJndW1lbnRzCiAgICAgICAgICB3b3JrIGNvcnJlY3RseSAod2hlbiB0eXBlbWFwcyBhcmUgdXNlZCkuCgpWZXJzaW9uIDEuMSAoSnVuZSAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo2LzI0Lzk3IDogRml4ZWQgT2JqZWN0aXZlLUMgY29uc3RydWN0b3IgYnVnIHdoZW4gd29ya2luZyB3aXRoIFBlcmw1CiAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4KCjYvMjMvOTcgOiBGaXhlZCBzb21lIHBhcnNpbmcgcHJvYmxlbXMgd2l0aCBPYmplY3RpdmUtQy4gIERlY2xhcmF0aW9ucwogICAgICAgICAgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIG5vdyA6CgogICAgICAgICAgICAgICAtIGZvbyA6IChpbnQpIGEgd2l0aDogKGludCkgYjsKCjYvMjIvOTcgOiBBZGRlZCBTV0lHIFJ1bnRpbWUgbGlicmFyeS4gICBUaGlzIGxpYnJhcnkgY29udGFpbnMKICAgICAgICAgIHRoZSBTV0lHIHBvaW50ZXIgdHlwZS1jaGVja2VyIGFuZCBzdXBwb3J0IGZ1bmN0aW9ucwogICAgICAgICAgdGhhdCBhcmUgbm9ybWFsbHkgaW5jbHVkZWQgaW4gZXZlcnkgbW9kdWxlLiAgQnkgdXNpbmcKICAgICAgICAgIHRoZSBsaWJyYXJ5LCBpdCBpcyBlYXNpZXIgdG8gd29yayB3aXRoIG11bHRpcGxlIFNXSUcKICAgICAgICAgIGdlbmVyYXRlZCBtb2R1bGVzLgoKNi8yMi85NyA6IEZpeGVkIG1pbm9yIGJ1ZyBpbiBQZXJsNSBtb2R1bGUgcmVsYXRlZCB0byBzdGF0aWMgbGlua2luZwogICAgICAgICAgb2YgbXVsdGlwbGUgbW9kdWxlcy4KCjYvMjIvOTcgOiBGaXhlZCBzb21lIGJ1Z3Mgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUuIFdoZW4gdXNlZCB3aXRoCiAgICAgICAgICBQZXJsNSBzaGFkb3cgY2xhc3NlcywgdGhpcyBnZW5lcmF0ZXMgYSAncmVxdWlyZScgc3RhdGVtZW50CiAgICAgICAgICB0byBsb2FkIGluIGV4dGVybmFsIG1vZHVsZXMuCgo2LzIyLzk3IDogQWRkZWQgLXN3aWdsaWIgb3B0aW9uLiAgVGhpcyBwcmludHMgb3V0IHRoZSBsb2NhdGlvbiBvZiB0aGUKICAgICAgICAgIFNXSUcgbGlicmFyeSBhbmQgZXhpdHMuICBUaGlzIG9wdGlvbiBpcyBvbmx5IHJlYWxseSB1c2VmdWwgdG8KICAgICAgICAgIGNvbmZpZ3VyYXRpb24gdG9vbHMgdGhhdCBhcmUgbG9va2luZyBmb3IgU1dJRyBhbmQgaXRzIGxpYnJhcnkKICAgICAgICAgIGxvY2F0aW9uIChlLmcuIGF1dG9jb25mLCBjb25maWd1cmUsIGV0Yy4uLikuCgo2LzIxLzk3IDogRml4ZWQgZXhwb3J0IGJ1ZyB3aXRoIFBlcmw1LjAwNCBvbiBXaW5kb3dzLU5ULgoKNi8yMC85NyA6IE1pbm9yIGNoYW5nZSB0byBjb2RlIGdlbmVyYXRpb24gb2YgY2xhc3Mvc3RydWN0dXJlIG1lbWJlcnMgaW4KICAgICAgICAgIG9yZGVyIHRvIHdvcmsgYmV0dGVyIHdpdGggdHlwZW1hcHMuIFNob3VsZCBoYXZlIG5vIG5vdGljYWJsZQogICAgICAgICAgaW1wYWN0IG9uIGV4aXN0aW5nIFNXSUcgbW9kdWxlcy4KCjYvMTkvOTcgOiBBZGRlZCAtdCBvcHRpb24uIFRoaXMgYWxsb3dzIFNXSUcgdG8gbG9hZCBhIHR5cGVtYXAgZmlsZSBiZWZvcmUKICAgICAgICAgIHByb2Nlc3NpbmcgYW55IGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgc3dpZyAtdCB0eXBlbWFwcy5pIC1weXRob24gZXhhbXBsZS5pCgogICAgICAgICAgQXQgbW9zdCwgb25seSBvbmUgdHlwZW1hcCBmaWxlIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhpcyBtYW5uZXIuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE4Lzk3IDogTmVlZCBhIE1ha2VmaWxlIGZhc3Q/IFR5cGUKCiAgICAgICAgICAgICAgICAgc3dpZyBbLXRjbCwgLXBlcmw1LCAtcHl0aG9uXSAtY28gTWFrZWZpbGUKCiAgICAgICAgICBhbmQgeW91IHdpbGwgZ2V0IGEgTWFrZWZpbGUgc3BlY2lmaWMgdG8gdGhhdCB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICBZb3UganVzdCBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgeW91ciBhcHBsaWNhdGlvbiBhbmQgeW91J3JlCiAgICAgICAgICByZWFkeSB0byBydW4uCgo2LzE4Lzk3IDogQ29tcGxldGVkIHRoZSAtY2kgb3B0aW9uLiAgVGhpcyBvcHRpb24gY2hlY2tzIGEgZmlsZSBpbnRvIHRoZQogICAgICAgICAgU1dJRyBsaWJyYXJ5LiAgIEl0IHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYQogICAgICAgICAgbGFuZ3VhZ2Ugb3B0aW9uLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICBzd2lnIC10Y2wgLWNpIGZvb2Jhci5pCgogICAgICAgICAgQ2hlY2tzIHRoZSBmaWxlIGZvb2Jhci5pIGludG8gdGhlIFRjbCBwYXJ0IG9mIHRoZSBsaWJyYXJ5LgogICAgICAgICAgSW4gb3JkZXIgdG8gY2hlY2sgYSBmaWxlIGludG8gdGhlIGdlbmVyYWwgbGlicmFyeSAoYWNjZXNzaWJsZQogICAgICAgICAgdG8gYWxsIGxhbmd1YWdlcyBtb2R1bGVzKSwgZG8gdGhlIGZvbGxvd2luZwoKICAgICAgICAgICAgICAgICAgc3dpZyAtY2kgLW8gLi4vZm9vYmFyLmkgZm9vYmFyLmkKCiAgICAgICAgICAoQWRtaXR0ZWRseSB0aGlzIGxvb2tzIGEgbGl0dGxlIHN0cmFuZ2UgYnV0IGlzIHVuYXZvaWRhYmxlKS4KICAgICAgICAgIFRoZSBjaGVjay1pbiBvcHRpb24gaXMgcHJpbWFyaWx5IGRlc2lnbmVkIGZvciBTV0lHIG1haW50ZW5hbmNlCiAgICAgICAgICBhbmQgbGlicmFyeSBkZXZlbG9wbWVudC4gVGhlIGNvbW1hbmQgd2lsbCBmYWlsIGlmIHRoZSB1c2VyIGRvZXMKICAgICAgICAgIG5vdCBoYXZlIHdyaXRlIHBlcm1pc3Npb24gdG8gdGhlIFNXSUcgbGlicmFyeS4gIFRoaXJkIHBhcnR5IGxpYnJhcnkKICAgICAgICAgIGV4dGVuc2lvbnMgY2FuIGVhc2lseSBpbnN0YWxsIHRoZW1zZWx2ZXMgYnkgc2ltcGx5IHByb3ZpZGluZwogICAgICAgICAgYSBzaGVsbCBzY3JpcHQgdGhhdCB1c2VzICdzd2lnIC1jaScgdG8gaW5zdGFsbCB0aGUgYXBwcm9wcmlhdGUKICAgICAgICAgIGxpYnJhcnkgZmlsZXMuICBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGtub3cgd2hlcmUgdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgaXMgbG9jYXRlZCBpZiB5b3UgdXNlIHRoaXMgbWVjaGFuaXNtLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xNi85NyA6IEZpeGVkIGEgYnVnIGluIHNoYWRvdyBjbGFzcyBnZW5lcmF0aW9uIHdoZW4gJW5hbWUoKSB3YXMgYXBwbGllZAogICAgICAgICAgdG8gYSBjbGFzcyBkZWZpbml0aW9uLiAgIFVuZm9ydHVuYXRlbHksIGZpeGluZyB0aGUgYnVnIHJlcXVpcmVkCiAgICAgICAgICBhIGNoYW5nZSBpbiB0aGUgTGFuZ3VhZ2UgQyBBUEkgYnkgYWRkaW5nIGFuIGV4dHJhIGFyZ3VtZW50IHRvCiAgICAgICAgICB0aGUgTGFuZ3VhZ2U6OmNwcF9jbGFzc19kZWNsKCkgZnVuY3Rpb24uICBUaGlzIG1heSBicmVhawogICAgICAgICAgU1dJRyBDKysgZXh0ZW5zaW9ucy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNi8xNS85NyA6IEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIGlmIG5vIG1vZHVsZSBuYW1lIGlzIHNwZWNpZmllZCB3aXRoIHRoZQogICAgICAgICAgJW1vZHVsZSBkaXJlY3RpdmUgb3IgLW1vZHVsZSBvcHRpb24uCgo2LzE1Lzk3IDogRml4ZWQgbGluZSBudW1iZXIgYnVnIHdoZW4gcmVwb3J0aW5nIGVycm9ycyBmb3IgdW5kZWZpbmVkCiAgICAgICAgICBiYXNlIGNsYXNzZXMuCgo2LzE1Lzk3IDogQWRkZWQgbmV3ICVyZW5hbWUgZGlyZWN0aXZlLiAgVGhpcyBhbGxvd3MgdGhlIGZvcndhcmQgZGVjbGFyYXRpb24KICAgICAgICAgIG9mIGEgcmVuYW1pbmcuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVyZW5hbWUgT2xkTmFtZSBOZXdOYW1lOwoKICAgICAgICAgICAgICAgICAuLi4uIGxhdGVyIC4uLgogICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7CgogICAgICAgICAgVW5saWtlICVuYW1lLCAlcmVuYW1lIHdpbGwgcmVuYW1lIGFueSBvY2N1cnJlbmNlIG9mIHRoZSBvbGQgbmFtZS4KICAgICAgICAgIFRoaXMgYXBwbGllcyB0byBmdW5jdGlvbnMsIHZhcmlhYmxlcywgY2xhc3MgbWVtYmVycyBhbmQgc28gZm9ydGguCiAgICAgICAgICBUaGVyZSBpcyBubyB3YXkgdG8gZGlzYWJsZSAlcmVuYW1lIG9uY2Ugc2V0LCBidXQgeW91IGNhbiBjaGFuZ2UgdGhlCiAgICAgICAgICBuYW1lIGJ5IHJlZGVjbGFyaW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNi8xNS85NyA6IEltcHJvdmVkIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJW5hbWUgZGlyZWN0aXZlIHNvIHRoYXQgaXQKICAgICAgICAgIGNvdWxkIGJlIHVzZWQgd2l0aCBjb25kaXRpb25hbCBjb21waWxhdGlvbiA6CgogICAgICAgICAgICAgICAgICAgICNpZmRlZiBTV0lHCiAgICAgICAgICAgICAgICAgICAgJW5hbWUoTmV3TmFtZSkKICAgICAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAgICAgICBpbnQgT2xkTmFtZShpbnQpOwoKNi8xNS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIGZ1bmN0aW9ucyB3aXRoIG5vIHJldHVybiBkYXRhdHlwZS4gIEluIHRoaXMgY2FzZSwKICAgICAgICAgIFNXSUcgYXNzdW1lcyBhIHJldHVybiB0eXBlIG9mICdpbnQnLgoKNi8xMS85NyA6IEltcHJvdmVkIGVycm9yIHJlcG9ydGluZyBpbiB0aGUgcGFyc2VyLiAgSXQgc2hvdWxkIGJlIGEgbGl0dGxlCiAgICAgICAgICBsZXNzIHNlbnNpdGl2ZSB0byBlcnJvcnMgdGhhdCBvY2N1ciBpbnNpZGUgY2xhc3MgZGVmaW5pdGlvbnMKICAgICAgICAgIG5vdy4gIEFsc28gcmVwb3J0cyBlcnJvcnMgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLgoKNi8xMS85NyA6IE1hZGUgJyQnIGEgbGVnYWwgc3ltYm9sIGluIGlkZW50aWZpZXJzLiAgVGhpcyBpcyB0byBzdXBwb3J0CiAgICAgICAgICBzb21lIE9iamVjdGl2ZS1DIGxpYnJhcmllcy4gIFNvbWUgY29tcGlsZXJzIChzdWNoIGFzIGdjYykgbWF5IGFsc28KICAgICAgICAgIGFsbG93IGlkZW50aWZpZXJzIHRvIGNvbnRhaW4gYSAkIGluIEMvQysrIGNvZGUgYXMgd2VsbCAodGhpcyBpcwogICAgICAgICAgYW4gb2JzY3VyZSBmZWF0dXJlIG9mIEMpLiBXaGVuICckJyBhcHBlYXJzIGluIGlkZW50aWZpZXIsIFNXSUcKICAgICAgICAgIHJlbWFwcyBpdCB0byB0aGUgc3RyaW5nICdfU18nIHdoZW4gY3JlYXRpbmcgdGhlIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgZnVuY3Rpb24uIFRodXMgYSBmdW5jdGlvbiAnZm9vJGJhcicgd291bGQgYmUgY2FsbGVkICdmb29fU19iYXInLgoKNi8xMS85NyA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gc2hhZG93IGNsYXNzZXMgd2l0aCBfX3JlcHJfXyBtZXRob2QuICBJZgogICAgICAgICAgc3VwcGxpZWQgYnkgdGhlIHVzZXIsIGl0IHdhcyBpZ25vcmVkLCBidXQgbm93IGl0IHNob3VsZCB3b3JrLgoKNi85Lzk3ICA6IEZpeGVkIHRoZSBUY2wgOC4wIG1vZHVsZSB0byB3b3JrIHdpdGggVGNsIDguMGIxLiAgIFNXSUcgaXMgbm8KICAgICAgICAgIGxvbmdlciBjb21wYXRpYmxlIHdpdGggKmFueSogYWxwaGEgcmVsZWFzZSBvZiBUY2wgOC4wLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo2LzcvOTcgIDogUHV0IGEgbWF4aW1hbCBlcnJvciBjb3VudCBpbiAoY3VycmVudGx5IHNldCB0byAyMCkuIFNXSUcgd2lsbCBiYWlsIG91dAogICAgICAgICAgaWYgaXQgZ2VuZXJhdGVzIG1vcmUgZXJyb3JzIHRoYW4gdGhpcyAodXNlZnVsIGZvciBwcmV2ZW50aW5nIFNXSUcKICAgICAgICAgIGZyb20gcHJpbnRpbmcgNDAwMCBzeW50YXggZXJyb3JzIHdoZW4gaXQgZ2V0cyBjb25mdXNlZCkuCgo2LzcvOTcgIDogRml4ZWQgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gcGFyc2luZyB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLgoKNi83Lzk3ICA6IE1pbm9yIGNoYW5nZSB0byBQZXJsNSBtb2R1bGUuICBDKysgc3RhdGljIGZ1bmN0aW9ucyBhcmUgbm93CiAgICAgICAgICBwdXQgaW4gdGhlIHNhbWUgcGFja2FnZSBhcyB0aGVpciBjbGFzcyB3aGVuIHVzaW5nIHNoYWRvdyBjbGFzc2VzLgoKNi83Lzk3ICA6IENlbnRyYWxpemVkIHRoZSBuYW1pbmcgb2YgZnVuY3Rpb25zLCBtZW1iZXJzLCB3cmFwcGVycyBldGMuLi4gQnkKICAgICAgICAgIGNlbnRyYWxpemluZyB0aGUgbmFtaW5nIHNjaGVtZSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIG1ha2UKICAgICAgICAgIHNvbWUgbXVsdGktZmlsZSBvcHRpbWl6YXRpb25zLiAgQWxzbywgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvCiAgICAgICAgICBjaGFuZ2UgU1dJRydzIG5hbWluZyBzY2hlbWUgKHBlcmhhcHMgYSBuZXcgZmVhdHVyZSB0byBiZSBhZGRlZAogICAgICAgICAgbGF0ZXIpLgoKNi8yLzk3ICA6IEFkZGVkICdhcmdpbml0JyB0eXBlbWFwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXNzaWduIGluaXRpYWwgdmFsdWVzCiAgICAgICAgICB0byBmdW5jdGlvbiBhcmd1bWVudHMuICBEb2luZyBzbyBtYWtlcyBpdCBzb21ld2hhdCBlYXNpZXIgdG8gZGV0ZWN0CiAgICAgICAgICBpbXByb3BlciBhcmd1bWVudCBwYXNzaW5nIHdoZW4gd29ya2luZyB3aXRoIG90aGVyIHR5cGVtYXBzLgoKNi8yLzk3ICA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiByZWFkLW9ubHkgdmFyaWFibGVzIHdlcmUgaW5oZXJpdGVkCiAgICAgICAgICBpbnRvIG90aGVyIGNsYXNzZXMuICBVbmRlciBpbmhlcml0YW5jZSwgdGhlIHZhcmlhYmxlcyB3b3VsZAogICAgICAgICAgYmVjb21lIHdyaXRhYmxlLCBidXQgdGhpcyBoYXMgbm93IGJlZW4gY29ycmVjdGVkLgoKNS8zMC85NyA6IEFuIGVtcHR5ICVuYW1lKCkgZGlyZWN0aXZlIGlzIG5vIGxvbmdlciBhbGxvd2VkIG9yIHN1cHBvcnRlZC4KICAgICAgICAgIFRoaXMgZGlyZWN0aXZlIHdhcyBvcmlnaW5hbGx5IHVzZWQgdG8gc3RyaXAgdGhlIHByZWZpeAogICAgICAgICAgb2ZmIG9mIGEgY2xhc3Mgb3Igc3RydWN0dXJlLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBuZXZlciByZWFsbHkKICAgICAgICAgIHNlZW1lZCB0byB3b3JrIHJpZ2h0IGFuZCBpdCBjb21wbGljYXRlZCB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yCiAgICAgICAgICBzaWduaWZpY2FudGx5LiAgIEFzIGZhciBhcyBJIGNhbiB0ZWxsIG5vIG9uZSB1c2VzIGl0LCBzbyBpdAogICAgICAgICAgaXMgbm93IGhpc3RvcnkuICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjUvMjgvOTcgOiBGaXhlZCBhIHBhcnNpbmcgYnVnIHdpdGggI2RlZmluZSBhbmQgQysrIGNvbW1lbnRzLiAgRGVjbGFyYXRpb25zCiAgICAgICAgICBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgbm93IHdvcmsgcHJvcGVybHkgOgoKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgQ09OU1QgICA0ICAgICAvLyBBIENvbW1lbnQKCjUvMjgvOTcgOiBNYWRlIHNvbWUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIHRoZSBTV0lHIFN0cmluZyBjbGFzcy4KICAgICAgICAgIChvbmx5IGFmZmVjdHMgdGhlIFNXSUcgY29tcGlsZXIgaXRzZWxmKS4KCjUvMjgvOTcgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHNraXAgdGVtcGxhdGUgZGVmaW5pdGlvbnMgYW5kIGlzc3VlIGEKICAgICAgICAgIHdhcm5pbmcgbWVzc2FnZS4KCjUvMjgvOTcgOiBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkIHR5cGVzIGFkZGVkIChpZS4gdGVtcGxhdGVzKS4KICAgICAgICAgIFR5cGVzIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBzaG91bGQgcGFzcyB0aHJvdWdoIHRoZSBTV0lHIGNvbXBpbGVyCgogICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKHZlY3Rvcjxjb21wbGV4PiAqYSwgdmVjdG9yPGRvdWJsZT4gKmIpOwoKICAgICAgICAgIFdoZW4gdXNlZCwgdGhlIGVudGlyZSBuYW1lICd2ZWN0b3I8Y29tcGxleD4nIGJlY29tZXMgdGhlIG5hbWUKICAgICAgICAgIG9mIHRoZSBkYXRhdHlwZS4gICAgICBEdWUgdG8gc3BhY2UgbGltaXRhdGlvbnMgaW4gZGF0YXR5cGUKICAgICAgICAgIHJlcHJlc2VudGF0aW9ucywgdGhlIG5hbWUgc2hvdWxkIG5vdCBleGNlZWQgOTYgY2hhcmFjdGVycy4KCiAgICAgICAgICBOb3RlIDogVGhpcyBpcyBvbmx5IHBhcnQgb2Ygd2hhdCBpcyBuZWVkZWQgZm9yIHRlbXBsYXRlIHN1cHBvcnQuCiAgICAgICAgICBUZW1wbGF0ZSBjbGFzcyBkZWZpbml0aW9ucyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgYnkgU1dJRy4KCiAgICAgICAgICBUaGUgdGVtcGxhdGUgbm90YXRpb24gYWJvdmUgbWF5IGFsc28gYmUgdXNlZCB3aGVuIHNwZWNpZnlpbmcKICAgICAgICAgIE9iamVjdGl2ZS1DIHByb3RvY29sIGxpc3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNS8yNC85NyA6IEZpcnN0IGN1dCBhdCBPYmplY3RpdmUtQyBzdXBwb3J0IGFkZGVkLiAgIEFzIGl0IHR1cm5zIG91dCwgYWxtb3N0CiAgICAgICAgICBldmVyeXRoaW5nIGNhbiBiZSBoYW5kbGVkIHdpdGggb25seSBhIGZldyBtaW5vciBtb2RpZmljYXRpb25zIHRvCiAgICAgICAgICB0aGUgQysrIG1vZHVsZS4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjUvMjMvOTcgOiBGaXhlZCByZXBlYXRlZCBkZWZpbml0aW9uIGJ1ZyBpbiBtdWx0aXBsZSBpbmhlcml0YW5jZSBoYW5kbGluZwogICAgICAgICAgd2hlbiBtdWx0aXBsZSBiYXNlIGNsYXNzZXMgc2hhcmUgYSBjb21tb24gYmFzZSBjbGFzcyAoaWUuCiAgICAgICAgICB0aGUgZXZpbCBkaWFtb25kKS4KCjUvMjEvOTcgOiBGaXhlZCByYXRoZXIgZW1iYXJyYXNzaW5nIHR5cG8gdGhhdCB3b3JrZWQgaXRzIHdheSBpbnRvIHRoZQogICAgICAgICAgVGVzdHMvQnVpbGQgZGlyZWN0b3J5LgoKNS8xOS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiB1c2luZyBuYXRpdmUgbWV0aG9kcyBhbmQKICAgICAgICAgIHNoYWRvdyBjbGFzc2VzIHdpdGggUHl0aG9uIGFuZCBQZXJsNSBtb2R1bGVzLgoKNS8xOS85NyA6IE1vZGlmaWVkIHRoZSAlYXBwbHkgZGlyZWN0aXZlIHNsaWdodGx5IHNvIHRoYXQgaXQgd291bGQgd29yawogICAgICAgICAgd2l0aCBwb2ludGVycyBhIGxpdHRsZSBiZXR0ZXIuIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVhcHBseSB1bnNpZ25lZCBsb25nIHsgRFdPUkQgfTsKCiAgICAgICAgICBBcHBsaWVzICphbGwqIHR5cGVtYXBzIGFzc29jaWF0ZWQgd2l0aCAidW5zaWduZWQgbG9uZyIgdG8KICAgICAgICAgICJEV09SRCIuICAgVGhpcyBub3cgaW5jbHVkZXMgcG9pbnRlcnMgdG8gdGhlIHR3byBkYXRhdHlwZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSwgYSB0eXBlbWFwIGFwcGxpZWQgdG8gInVuc2lnbmVkIGxvbmcgKioiIHdvdWxkCiAgICAgICAgICBhbHNvIGJlIGFwcGxpZWQgdG8gYW55IG9jY3VycmVuY2Ugb2YgIkRXT1JEICoqIiBhcyB3ZWxsLgoKNS8xOS85NyA6IEZpeGVkIGFuIG93bmVyc2hpcCBhc3NpZ25tZW50IGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHdoZW4KICAgICAgICAgIGNsYXNzIG1lbWJlcnMgd2VyZSByZXR1cm5pbmcgbmV3IG9iamVjdHMgYmVsb25naW5nIHRvCiAgICAgICAgICBkaWZmZXJlbnQgY2xhc3Nlcy4KCjUvMTcvOTcgOiBBZGRlZCBhIGZldyBtb3JlIHR5cGVtYXAgdmFyaWFibGVzLgoKICAgICAgICAgICAgICAgICAgJG5hbWUgICAgICAgICAgLSBOYW1lIG9mIGZ1bmN0aW9uL3ZhcmlhYmxlL21lbWJlcgogICAgICAgICAgICAgICAgICAkYmFzZXR5cGUgICAgICAtIEJhc2UgZGF0YXR5cGUgKHR5cGUgd2l0aG91dCBwb2ludGVycykKICAgICAgICAgICAgICAgICAgJGFyZ251bSAgICAgICAgLSBBcmd1bWVudCBudW1iZXIKCjUvMTYvOTcgOiBGaXhlZCBlbWJhcnJhc3NpbmcgdW5kZXJzY29yZSBlcnJvciBpbiBsb2NhbCB2YXJpYWJsZQogICAgICAgICAgYWxsb2NhdG9yLgoKNS8xNi85NyA6IEZpeGVkIG5hbWVzcGFjZSBjbGFzaCBidWcgaW4gcGFyYW1ldGVyaXplZCB0eXBlbWFwcwogICAgICAgICAgd2hlbiBjcmVhdGluZyBhcnJheXMgYXMgbmV3IGxvY2FsIHZhcmlhYmxlcy4KCjUvMTUvOTcgOiBGaXhlZCBzb21lIGJ1Z3Mgd2l0aCBpbmhlcml0YW5jZSBvZiBhZGRlZCBtZXRob2RzIGFjcm9zcwogICAgICAgICAgbXVsdGlwbGUgZmlsZXMuICAgU1dJRyBub3cgdXNlcyBuYW1lcyBvZiBiYXNlIGNsYXNzZXMKICAgICAgICAgIHdoZW4gZ2VuZXJhdGluZyBzdWNoIGZ1bmN0aW9ucy4KCjUvMTQvOTcgOiBGaW5pc2hlZCBzdXBwb3J0IGZvciBkZWZhdWx0IHR5cGVtYXBzLiAgUHJpbWFyaWx5IHVzZWQKICAgICAgICAgIGludGVybmFsbHksIHRoZXkgY2FuIGJlIHVzZWQgdG8gbWF0Y2ggdGhlIGJhc2ljCiAgICAgICAgICBidWlsdC1pbiBkYXRhdHlwZXMgdXNlZCBpbnNpZGUgb2YgU1dJRy4gICBZb3UgY2FuCiAgICAgICAgICBzcGVjaWZ5IHRoZW0gaW4gaW50ZXJmYWNlIGZpbGVzIGFzIHdlbGwgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50IFNXSUdfREVGQVVMVF9UWVBFIHsKICAgICAgICAgICAgICAgICAgICAgICAgJHRhcmdldCA9IGF0b2koJHRhcmdldCk7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBVbmxpa2Ugbm9ybWFsIHR5cGVtYXBzLCB0aGlzIGRlZmF1bHQgbWFwIHdpbGwgZ2V0IGFwcGxpZWQKICAgICAgICAgIHRvICphbGwqIGludGVnZXIgZGF0YXR5cGVzIGVuY291bnRlcmVkLCBpbmNsdWRpbmcgdGhvc2UKICAgICAgICAgIHJlbmFtZWQgd2l0aCB0eXBlZGVmLCBldGMuLi4KCjUvMTMvOTcgOiBGaXhlZCBzdWJzdHJpbmcgYnVnIGluIHR5cGUgY2hlY2tlci4KCjUvMTIvOTcgOiBGaXhlZCBidWcgaW4gcGFyYW1ldGVyaXplZCB0eXBlbWFwcyB3aGVuIGRlY2xhcmluZyBsb2NhbAogICAgICAgICAgdmFyaWFibGVzIG9mIHN0cnVjdHVyZXMuCgpWZXJzaW9uIDEuMSBCZXRhNiAoTWF5IDksIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjUvOS85NyAgOiBGaXhlZCBiaXphcnJlIE5VTEwgcG9pbnRlciBoYW5kbGluZyBidWcgaW4gUGVybDUgbW9kdWxlLgoKNS84Lzk3ICA6IEZpeGVkIG15c3RlcmlvdXMgc2VnbWVudGF0aW9uIGZhdWx0IHdoZW4gcnVubmluZyBTV0lHIG9uIGFuCiAgICAgICAgICBlbXB0eSBmaWxlLgoKNS83Lzk3ICA6IFRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIG5vdyByZXBsYWNlIHRoZSBzcGVjaWFsIHN5bWJvbCAiJGNsZWFudXAiCiAgICAgICAgICB3aXRoIHRoZSBjbGVhbnVwIGNvZGUgc3BlY2lmaWVkIHdpdGggdGhlICJmcmVlYXJnIiB0eXBlbWFwLgogICAgICAgICAgVGhpcyBjaGFuZ2UgbmVlZGVkIHRvIHByb3Blcmx5IG1hbmFnZSBtZW1vcnkgYW5kIGV4Y2VwdGlvbnMuCgo1LzUvOTcgIDogQWRkZWQgdGhlICd0eXBlbWFwcy5pJyBsaWJyYXJ5IGZpbGUuICBUaGlzIGNvbnRhaW5zIGEKICAgICAgICAgIHZhcmlldHkgb2YgY29tbW9uIHR5cGVtYXBzIGZvciBpbnB1dCB2YWx1ZXMsIHBvaW50ZXJzLAogICAgICAgICAgYW5kIHNvIG9uLgoKNS81Lzk3ICA6IENoYW5nZWQgYmVoYXZpb3Igb2YgImFyZ291dCIgdHlwZW1hcCBpbiBQeXRob24gbW9kdWxlLgogICAgICAgICAgT2xkIHZlcnNpb25zIGF1dG9tYXRpY2FsbHkgdHVybmVkIHRoZSByZXN1bHQgaW50byBhCiAgICAgICAgICBQeXRob24gbGlzdC4gIFRoZSBuZXcgdmVyc2lvbiBkb2VzIG5vdGhpbmcsIGxlYXZpbmcgdGhlCiAgICAgICAgICBpbXBsZW1lbnRhdGlvbiB1cCB0byB0aGUgdXNlci4gIFRoaXMgcHJvdmlkZXMgbW9yZSBmbGV4aWJpbGl0eQogICAgICAgICAgYnV0IG1heSBicmVhayBvbGRlciBjb2RlcyB0aGF0IHJlbHkgb24gdHlwZW1hcHMuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjUvNS85NyAgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSByZWxhdGVkIHRvIHRoZSBpbnRlcmFjdGlvbiBvZgogICAgICAgICAgImFyZ291dCIgYW5kICJpZ25vcmUiIHR5cGVtYXBzLgoKNS81Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHRoYXQgd291bGQgZ2VuZXJhdGUgaW5jb3JyZWN0IGNvZGUKICAgICAgICAgIGlmIGFsbCBmdW5jdGlvbiBhcmd1bWVudHMgYXJlICJpZ25vcmVkIi4KCjUvNC85NyAgOiBBZGRlZCAlYXBwbHkgYW5kICVjbGVhciBkaXJlY3RpdmVzLiAgIFRoZXNlIGZvcm0gYSBoaWdoZXIgbGV2ZWwKICAgICAgICAgIGludGVyZmFjZSB0byB0aGUgdHlwZW1hcCBtZWNoYW5pc20uICBJbiBhIG51dHNoZWxsLCB0aGV5CiAgICAgICAgICBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIHByb2Nlc3Npbmcgb2YgdmFyaW91cyBkYXRhdHlwZXMgd2l0aG91dAogICAgICAgICAgZXZlciBoYXZpbmcgdG8gd3JpdGUgYSB0eXBlbWFwLiAgU2VlIHRoZSBTV0lHIGRvY3VtZW50YXRpb24KICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuICAqKiBORVcgRkVBVFVSRSAqKgoKNS80Lzk3ICA6IEFkZGVkIGEgbG9jYWwgdmFyaWFibGUgZXh0ZW5zaW9uIHRvIHRoZSB0eXBlbWFwIGhhbmRsZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlICooZG91YmxlIHRlbXApIHsKCQkgICAgICAgIHRlbXAgPSBhdG9mKCRzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gJnRlbXA7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIEluIHRoaXMgY2FzZSwgJ3RlbXAnIGlzIGEgbG9jYWwgdmFyaWFibGUgdGhhdCBleGlzdHMKICAgICAgICAgIGluIHRoZSBlbnRpcmUgd3JhcHBlciBmdW5jdGlvbiAobm90IGp1c3QgdGhlIHR5cGVtYXAKICAgICAgICAgIGNvZGUpLiAgVGhpcyBtZWNoYW5pc20gcHJvdmlkZXMgYmV0dGVyIHN1cHBvcnQgZm9yCiAgICAgICAgICBjZXJ0YWluIHR5cGVzIG9mIGFyZ3VtZW50IGhhbmRsaW5nIGFuZCBhbHNvIG1ha2VzIGl0CiAgICAgICAgICBwb3NzaWJsZSB0byB3cml0ZSB0aHJlYWQtc2FmZSB0eXBlbWFwcy4gIEFueSBudW1iZXIKICAgICAgICAgIGxvY2FsIHZhcmlhYmxlcyBjYW4gYmUgZGVjbGFyZWQgYnkgc3VwcGx5aW5nIGEgY29tbWEKICAgICAgICAgIHNlcGFyYXRlZCBsaXN0LiAgIExvY2FsIHZhcmlhYmxlcyBhcmUgZ3VhcmFudGVlZCB0byBiZQogICAgICAgICAgdW5pcXVlLCBldmVuIGlmIHRoZSBzYW1lIHR5cGVtYXAgaXMgYXBwbGllZCBtYW55IHRpbWVzCiAgICAgICAgICBpbiBhIGdpdmVuIGZ1bmN0aW9uLgogICAgICAgICAgKiogTm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gUGVybDQgb3IgR3VpbGUgbW9kdWxlcy4KCjUvMi85NyAgOiBGaXhlZCBwcm9jZXNzaW5nIG9mICVpZmRlZiwgJWVuZGlmLCAlaWYsIGV0Yy4uLiAgKFRoZXNlIGFyZQogICAgICAgICAgU1dJRyBlcXVpdmFsZW50cyBvZiB0aGUgQyBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyB0aGF0CiAgICAgICAgICBjYW4gcGFzcyB0aHJvdWdoIHRoZSBDIHByZXByb2Nlc3NvciB3aXRob3V0IG1vZGlmaWNhdGlvbikuCgo1LzIvOTcgIDogRml4ZWQgbWFqb3IgKGJ1dCBzdWJ0bGUpIGJ1ZyBpbiB0aGUgcnVuLXRpbWUgdHlwZSBjaGVja2VyCiAgICAgICAgICByZWxhdGVkIHRvIHNlYXJjaGluZyBhbmQgdHlwZS1jaGVja2luZyBmb3IgQysrIGluaGVyaXRhbmNlLgogICAgICAgICAgVG8gbWFrZSBhIGxvbmcgc3Rvcnkgc2hvcnQsIGlmIHlvdSBoYWQgdHdvIGNsYXNzZXMgbmFtZWQKICAgICAgICAgICJGb28iIGFuZCAiRm9vT2JqZWN0IiB0aGUgdHlwZSBjaGVja2VyIHdvdWxkIHNvbWV0aW1lcwogICAgICAgICAgZ2V0IGNvbmZ1c2VkIGFuZCBiZSB1bmFibGUgdG8gbG9jYXRlICJGb28iIGluIGFuIGludGVybmFsCiAgICAgICAgICB0YWJsZS4KCjUvMi85NyAgOiBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIC1jbyBvcHRpb24uCgo0LzI0Lzk3IDogUG9pbnRlciBsaWJyYXJ5IGFkZGVkIHRvIHRoZSBTV0lHIGxpYnJhcnkuCgo0LzE5Lzk3IDogQWRkZWQgdGhlICVuZXcgZGlyZWN0aXZlLiAgIFRoaXMgaXMgYSAiaGludCIgdGhhdCBjYW4gYmUgdXNlZAogICAgICAgICAgdG8gdGVsbCBTV0lHIHRoYXQgYSBmdW5jdGlvbiBpcyByZXR1cm5pbmcgYSBuZXcgb2JqZWN0LiBGb3IKICAgICAgICAgIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJW5ldyBGb28gKmNyZWF0ZV9mb28oKTsKCiAgICAgICAgICBUaGlzIHRlbGxzIFNXSUcgdGhhdCBjcmVhdGVfZm9vKCkgaXMgY3JlYXRpbmcgYSBuZXcgb2JqZWN0CiAgICAgICAgICBhbmQgcmV0dXJuaW5nIGEgcG9pbnRlciB0byBpdC4gICBNYW55IGxhbmd1YWdlIG1vZHVsZXMgbWF5CiAgICAgICAgICBjaG9vc2UgdG8gaWdub3JlIHRoZSBoaW50LCBidXQgd2hlbiB3b3JraW5nIHdpdGggc2hhZG93IGNsYXNzZXMsCiAgICAgICAgICB0aGUgJW5ldyBpcyB1c2VkIHRvIGhhbmRsZSBwcm9wZXIgb3duZXJzaGlwIG9mIG9iamVjdHMuCgogICAgICAgICAgJW5ldyBjYW4gYWxzbyBiZSB1c2VkIHdpdGggZHluYW1pY2FsbHkgYWxsb2NhdGVkIHN0cmluZ3MuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlbmV3IGNoYXIgKmNyZWF0ZV9zdHJpbmcoKTsKCiAgICAgICAgICBXaGVuIHVzZWQsIGFsbCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyB3aWxsIGF1dG9tYXRpY2FsbHkgY2xlYW51cAogICAgICAgICAgdGhlIHJldHVybmVkIHN0cmluZy0tZWxpbWluYXRpbmcgbWVtb3J5IGxlYWtzLgogICAgICAgICAgKiogTkVXIEZFQVRVUkUgKioKCjQvMTkvOTcgOiBBZGRlZCBhIG5ldyB0eXBlbWFwICJuZXdmcmVlIi4gICBUaGlzIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aAogICAgICAgICAgdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIG1ldGhvZCBieSB3aGljaAogICAgICAgICAgYSBuZXcgb2JqZWN0IHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gaXMgZGVsZXRlZC4KCjQvMTkvOTcgOiBUaGUgc3ltYm9sICJfX2NwbHVzcGx1cyIgaXMgbm93IGRlZmluZWQgaW4gdGhlIFNXSUcgaW50ZXJwcmV0ZXIKICAgICAgICAgIHdoZW4gcnVubmluZyB3aXRoIHRoZSAtYysrIG9wdGlvbi4KCjQvMTcvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyB3aGVuIHVzZWQgaW5zaWRlIHRoZQogICAgICAgICAgJWFkZG1ldGhvZHMgZGlyZWN0aXZlLgoKNC8xNS85NyA6IEFkZGVkIGEgc3BlY2lhbCB0eXBlbWFwIHN5bWJvbCBQUkVWSU9VUyB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICByZXN0b3JlIGEgcHJldmlvdXMgdHlwZW1hcC4gRm9yIGV4YW1wbGUgOgoKCSAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgaW50ICogPSBQUkVWSU9VUzsKCiAgICAgICAgICBUaGlzIGlzIHByaW1hcmlseSB1c2VkIGluIGxpYnJhcnkgZmlsZXMuCgo0LzEzLzk3IDogQWRkZWQgJXByYWdtYSBkaXJlY3RpdmUgZm9yIFBlcmw1IG1vZHVsZS4gICBUd28gbmV3IHByYWdtYXMgYXJlCiAgICAgICAgICBhdmFpbGFibGUgOgoKICAgICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBjb2RlID0gInN0cmluZyIKICAgICAgICAgICAgICAgICAlcHJhZ21hKHBlcmw1KSBpbmNsdWRlID0gImZpbGUucGwiCgogICAgICAgICAgQm90aCBpbnNlcnQgY29kZSBpbnRvIHRoZSAucG0gZmlsZSBjcmVhdGVkIGJ5IFNXSUcuICBUaGlzIGNhbgogICAgICAgICAgYmUgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGN1c3RvbWl6ZSB0aGUgLnBtIGZpbGUgY3JlYXRlZCBieSBTV0lHLgoKNC8xMy85NyA6IFNjYW5uZXIgbW9kaWZpZWQgdG8gb25seSByZWNvZ25pemUgQysrIGtleXdvcmRzIHdoZW4gdGhlIC1jKysKICAgICAgICAgIG9wdGlvbiBoYXMgYmVlbiBzcGVjaWZpZWQuICBUaGlzIHByb3ZpZGVzIHN1cHBvcnQgZm9yIEMgcHJvZ3JhbXMKICAgICAgICAgIHRoYXQgbWFrZSB1c2Ugb2YgdGhlc2Uga2V5d29yZHMgZm9yIGlkZW50aWZpZXJzLgogICAgICAgICAgU1dJRyBtYXkgbmVlZCB0byBiZSBleHBsaWNpdGx5IHJ1biB3aXRoIHRoZSAtYysrIG9wdGlvbiB3aGVuCiAgICAgICAgICBjb21waWxpbmcgQysrIGNvZGUgKHRoaXMgd2FzIGFsbG93ZWQsIGJ1dCBub3QgcmVjb21tZW5kZWQgaW4KICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zKS4gKipQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZKioKCjQvMTEvOTcgOiBGaXhlZCBhIHJhdGhlciBuYXN0eSBidWcgaW4gdGhlIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvIHVzaW5nCiAgICAgICAgICB2YXJpYWJsZSBsaW5raW5nIHdpdGggY29tcGxleCBkYXRhdHlwZXMgYW5kIHBvaW50ZXJzLiAgIE9uIFVuaXgsCiAgICAgICAgICBjb2RlIHdvdWxkIHdvcmsgKHNvbWVob3cpLCBidXQgd291bGQgY2F1c2UgYW4gYWNjZXNzIHZpb2xhdGlvbgogICAgICAgICAgdW5kZXIgV2luZG93cy1OVC4gIFRoZSBmaXggc2hvdWxkIGNvcnJlY3QgdGhlIHByb2JsZW0sCiAgICAgICAgICBidXQgdGhlcmUgbWF5IHN0aWxsIGJlIGEgcHJvYmxlbSB1c2luZyBnbG9iYWwgdmFyaWFibGVzIG9mCiAgICAgICAgICBjb21wbGV4IGRhdGF0eXBlcyBpbiBjb25qdW5jdGlvbiB3aXRoIHNoYWRvdyBjbGFzc2VzLiAgRm9ydHVuYXRlbHksCiAgICAgICAgICB0aGlzIHNvcnQgb2YgdGhpbmcgc2VlbXMgdG8gYmUgcmVsYXRpdmVseSByYXJlIChjb25zaWRlcmluZwogICAgICAgICAgdGhhdCB0aGUgYnVnIGhhcyBiZWVuIGFyb3VuZCBmb3IgbW9yZSB0aGFuIGEgeWVhciAtIHlpa2VzISkuCgo0LzExLzk3IDogRml4ZWQgYml6YXJyZSBjb25zdGFudCBldmFsdWF0aW9uIGJ1ZyBpbiBQZXJsNSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgIHdoZW4gcnVubmluZyB1bmRlciBXaW5kb3dzLU5ULgoKNC84Lzk3ICA6IEJ1ZyB3aGVuIHVzaW5nIGRlZmF1bHQgYXJndW1lbnRzIGFuZCBDKysgcmVmZXJlbmNlcyBmaXhlZC4KCjQvOC85NyAgOiBGaXhlZCBjb2RlIGdlbmVyYXRpb24gYnVncyBpbiBQeXRob24gYW5kIFBlcmw1IG1vZHVsZXMgcmVsYXRlZCB0bwogICAgICAgICAgdXNpbmcgY2xhc3MgcmVuYW1pbmcgKGFwcGx5aW5nIHRoZSAlbmFtZSBkaXJlY3RpdmUgdG8gYSBjbGFzcwogICAgICAgICAgZGVmaW5pdGlvbikgYW5kIHNoYWRvdyBjbGFzc2VzLgoKNC83Lzk3ICA6IEZpeGVkIG1pbm9yIGJ1Z3MgaW4gc3dpZ3B0ci5zd2csIHRjbDhwdHIuc3dnLCBhbmQgcGVybDVwdHIuc3dnIHRvCiAgICAgICAgICBwcmV2ZW50IGluZmluaXRlIGxvb3BzIHdoZW4gd2VpcmQgZGF0YXR5cGVzIGFyZSBwYXNzZWQuCgozLzI5Lzk3IDogJ01ha2VmaWxlLndpbicgYWRkZWQuICAgVGhpcyBpcyB1c2VkIHRvIGJ1aWxkIG1vc3Qgb2YgdGhlIGV4YW1wbGVzCiAgICAgICAgICBpbiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IHVuZGVyIFdpbmRvd3MgTlQvOTUuCgozLzI3Lzk3IDogRml4ZXMgdG8gU1dJRydzIGVycm9yIHJldHVybiBjb2Rlcy4gICBTV0lHIG5vdyByZXR1cm5zIG5vbi16ZXJvCiAgICAgICAgICBleGl0IGNvZGVzIGZvciBjZXJ0YWluIGtpbmRzIG9mIGVycm9ycyAod2hpY2ggbWFrZXMgaXQgbW9yZQogICAgICAgICAgZnJpZW5kbHkgdG8gbWFrZWZpbGVzKS4gICAgIEFuIG92ZXJoYXVsIG9mIHRoZSBlcnJvciBoYW5kbGluZwogICAgICAgICAgaXMgb24gdGhlIHRvLWRvIGxpc3QgYW5kIHdpbGwgcHJvYmFibHkgc2hvdyB1cCBpbiBhIGxhdGVyIHJlbGVhc2UuCgozLzI1Lzk3IDogQnVnIGZpeC4gICJmcmVlYXJnIiBhbmQgImFyZ291dCIgdHlwZW1hcHMgaGF2ZSBiZWVuIGZpeGVkIGluCiAgICAgICAgICB0aGUgUGVybDUgbW9kdWxlLiAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGZ1bmN0aW9uIGlucHV0IHBhcmFtZXRlcnMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBvdXRwdXQgcGFyYW1ldGVycyBzaGFyZWQgdGhlIHNhbWUgbWVtb3J5IHNwYWNlLS1jYXVzaW5nCiAgICAgICAgICBhbGwgc29ydHMgb2YgbmFzdHkgcHJvYmxlbXMgd2hlbiB0cnlpbmcgdG8gcGFzcyBwZXJsIHZhbHVlcyBieQogICAgICAgICAgcmVmZXJlbmNlLiAgIFNXSUcgbm93IGludGVybmFsbHkgbWFrZXMgYSAiY29weSIgKHdoaWNoIGlzIHJlYWxseQogICAgICAgICAganVzdCBhIHBvaW50ZXIpIG9mIGFmZmVjdGVkIHBhcmFtZXRlcnMgYW5kIHVzZXMgdGhhdC4gICBUaGlzCiAgICAgICAgICBpcyBkb25lIHRyYW5zcGFyZW50bHkgc28gdGhlcmUgaXMgbm8gbm90aWNhYmxlIGltcGFjdCBvbiBhbnkKICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIG1vZHVsZXMuICAgVGhpcyBjaGFuZ2UgaXMgcHJvYmFibHkgb25seSBub3RpY2FibGUKICAgICAgICAgIHRvIGV4cGVydCB1c2Vycy4KCjMvMjUvOTcgOiBBZGRlZCB0eXBlLWNoZWNrIHRvIHZlcmJvc2UgYW5kIHN0YXQgbW9kZS4gIFNXSUcgd2lsbCBub3cgZ2VuZXJhdGUgYSBsaXN0CiAgICAgICAgICBvZiBhbGwgZGF0YXR5cGVzIHRoYXQgd2VyZSB1c2VkIGJ1dCB1bmRlZmluZWQgKHVzZWZ1bCBmb3IgdHJhY2tpbmcKICAgICAgICAgIGRvd24gd2VpcmQgYnVncykuICAgVGhpcyBpcyBlbmFibGVkIHdpdGggdGhlIC12IG9wdGlvbiAod2hpY2gKICAgICAgICAgIGlzIG5vdyBvZmZpY2lhbGx5IGtub3duIGFzICJvdmVybHkgdmVyYm9zZSIgbW9kZSkgb3IgdGhlIC1zdGF0IG9wdGlvbi4KCjMvMjUvOTcgOiBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwYXJzZXIgdG8gbWFrZSBpbmNsdWRlIGd1YXJkcyB3b3JrIGNvcnJlY3RseS4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAjaWZuZGVmIElOVEVSRkFDRV9JCiAgICAgICAgICAgICAgICAjZGVmaW5lIElOVEVSRkFDRV9JCiAgICAgICAgICAgICAgICAlbW9kdWxlIGZvb2Jhci5pCiAgICAgICAgICAgICAgICAuLi4gZGVjbGFyYXRpb25zIC4uLgogICAgICAgICAgICAgICAgI2VuZGlmCgozLzI0Lzk3IDogJWNoZWNrb3V0IGRpcmVjdGl2ZSBhZGRlZC4gICBUaGlzIGFsbG93cyBhbiBpbnRlcmZhY2UgZmlsZSB0bwogICAgICAgICAgZXh0cmFjdCBmaWxlcyBmcm9tIHRoZSBTV0lHIGxpYnJhcnkgYW5kIHBsYWNlIHRoZW0gaW4gdGhlCiAgICAgICAgICBjdXJyZW50IGRpcmVjdG9yeS4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGV4dHJhY3Qgc2NyaXB0cyBhbmQKICAgICAgICAgIG90aGVyIGhlbHBlciBjb2RlIHRoYXQgbWlnaHQgYmUgYXNzb2NpYXRlZCB3aXRoIGxpYnJhcnkgZmlsZXMuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJWNoZWNrb3V0IGFycmF5LnRjbAoKICAgICAgICAgIFdpbGwgbG9vayBmb3IgYSBmaWxlICJhcnJheS50Y2wiIGluIHRoZSBsaWJyYXJ5IGFuZCBjb3B5IGl0CiAgICAgICAgICB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuICAgIElmIHRoZSBmaWxlIGFscmVhZHkgZXhpc3RzIGluIHRoZQogICAgICAgICAgZGlyZWN0b3J5LCB0aGlzIGRpcmVjdGl2ZSBkb2VzIG5vdGhpbmcgKGl0IHdpbGwgbm90IG92ZXJ3cml0ZSBhbgogICAgICAgICAgZXhpc3RpbmcgZmlsZSkuICBUaGlzIG9ubHkgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgZm9yIG5vdy4KCjMvMjQvOTcgOiBTV0lHIHdpbGwgbm93IGxvb2sgaW4gdGhlIFNXSUcgTGlicmFyeSBmb3IgYSBmaWxlIGlmIGl0IGNhbid0CiAgICAgICAgICBmaW5kIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEFzIGEgcmVzdWx0LCBpdCBpcyBlYXN5IHRvCiAgICAgICAgICBtYWtlIG1vZHVsZXMgZnJvbSBTV0lHIGxpYnJhcnkgZmlsZXMuICBGb3IgZXhhbXBsZSwgaWYgeW91CiAgICAgICAgICB3YW50IHRvIG1ha2UgYSBQeXRob24gbW9kdWxlIGZyb20gdGhlIFNXSUcgdGltZXJzIGxpYnJhcnksIGp1c3QKICAgICAgICAgIHR5cGUgdGhpcyBpbiBhbnkgZGlyZWN0b3J5IDoKCiAgICAgICAgICAgICAgICBzd2lnIC1weXRob24gdGltZXJzLmkKCiAgICAgICAgICBZb3Ugd2lsbCBnZXQgdGhlIGZpbGVzIHRpbWVyc193cmFwLmMgYW5kIHRpbWVyc193cmFwLmRvYyBpbgogICAgICAgICAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHRoYXQgeW91IGNhbiBub3cgY29tcGlsZS4gICBUaGUgZmlsZQogICAgICAgICAgcmVtYWlucyBpbiB0aGUgU1dJRyBsaWJyYXJ5IChhbHRob3VnaCB5b3UgY2FuIGNoZWNrIGl0IG91dAogICAgICAgICAgdXNpbmcgdGhlIC1jbyBvcHRpb24pLiAgKioqIE5ldyBGZWF0dXJlICoqKgoKMy8yNC85NyA6IC1jbyBvcHRpb24gYWRkZWQgdG8gU1dJRyB0byBhbGxvdyBlYXN5IGFjY2VzcyB0byB0aGUgU1dJRyBsaWJyYXJ5LgogICAgICAgICAgV2hlbiB1c2VkLCB0aGlzIGluc3RydWN0cyBTV0lHIHRvIGNoZWNrIG91dCBhIGxpYnJhcnkgZmlsZSBhbmQKICAgICAgICAgIHBsYWNlIGl0IGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICB1bml4ID4gc3dpZyAtY28gYXJyYXkuaQogICAgICAgICAgICAgICAgYXJyYXkuaSBjaGVja2VkIG91dCBmcm9tIHRoZSBTV0lHIGxpYnJhcnkKICAgICAgICAgICAgICAgIHVuaXggPgoKICAgICAgICAgIE9uY2UgaW4geW91ciBkaXJlY3RvcnkgeW91IGNhbiBjdXN0b21pemUgdGhlIGZpbGUgdG8gc3VpdCB5b3VyCiAgICAgICAgICBwYXJ0aWN1bGFyIHB1cnBvc2VzLiAgVGhlIGNoZWNrb3V0IG9wdGlvbiBtYWtlcyBpdCBlYXN5IHRvCiAgICAgICAgICBncmFiIGxpYnJhcnkgZmlsZXMgd2l0aG91dCBrbm93aW5nIGFueXRoaW5nIGFib3V0IHRoZSBTV0lHCiAgICAgICAgICBpbnN0YWxsYXRpb24sIGJ1dCBpdCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHN0YXJ0CiAgICAgICAgICBpbmNsdWRpbmcgc2NyaXB0cywgQyBjb2RlLCBhbmQgb3RoZXIgbWlzY2VsbGFuZW91cyBmaWxlcwogICAgICAgICAgaW4gdGhlIGxpYnJhcnkuICBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHB1dCBhIGNvb2wgc2NyaXB0CiAgICAgICAgICBpbiB0aGUgbGlicmFyeSBhbmQgY2hlY2sgaXQgb3V0IHdoZW5ldmVyIHlvdSB3YW50ZWQgdG8gdXNlIGl0LgogICAgICAgICAgKioqIE5ldyBGZWF0dXJlICoqKgoKMy8yNC85NyA6ICNwcmFnbWEgZXhwb3J0IGRpcmVjdGl2ZXMgYWRkZWQgdG8gVGNsIG91dHB1dCBmb3IgY29tcGlsaW5nCiAgICAgICAgICBzaGFyZWQgbGlicmFyaWVzIG9uIHRoZSBNYWMuCgozLzI0Lzk3IDogTWlub3IgY2hhbmdlcyB0byB3aXNoLmkgYW5kIHRjbHNoLmkgbGlicmFyeSBmaWxlcyB0byBwcm92aWRlCiAgICAgICAgICBzdXBwb3J0IGZvciB0aGUgTWFjaW50b3NoLgoKMy8xOS85NyA6IFNXSUcncyBwb2xpY3kgdG93YXJkcyBOVUxMIHBvaW50ZXJzIGhhcyBiZWVuIHJlbGF4ZWQuICBUaGUKICAgICAgICAgIHBvbGljeSBvZiByZXF1aXJpbmcgYSBzcGVjaWFsIGNvbXBpbGVyIGRpcmVjdGl2ZSAtREFMTE9XX05VTEwKICAgICAgICAgIHRvIHVzZSBOVUxMIHBvaW50ZXJzIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuICBXaGlsZSB0aGlzIG1heQogICAgICAgICAgc2VlbSAidW5zYWZlIiwgaXQgdHVybnMgb3V0IHRoYXQgeW91IGNhbiB1c2UgYSAiY2hlY2siCiAgICAgICAgICB0eXBlbWFwIHRvIGFjaGlldmUgc29tZSBzYWZldHkuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHBlcmw1LGNoZWNrKSBOb2RlICogewogICAgICAgICAgICAgICAgICAgICAgIGlmICghJHRhcmdldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb2FrKCJOVUxMIFBvaW50ZXJzIG5vdCBhbGxvd2VkLiIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgcHJldmVudHMgYW55IE5VTEwgdmFsdWUgb2YgYSAiTm9kZSAqIiBwb2ludGVyIHRvIGJlCiAgICAgICAgICBwYXNzZWQgdG8gYSBmdW5jdGlvbi4gICAoSSB0aGluayB0aGlzIGlzIG11Y2ggY2xlYW5lcgogICAgICAgICAgdGhhbiB0aGUgb2xkIC1EQUxMT1dfTlVMTCBoYWNrIGFueXdheXMpLgoKMy8xOS85NyA6IEZpeGVkIHBvaW50ZXIgaGFuZGxpbmcgZXJyb3JzIGluIFBlcmw1IG1vZHVsZS4gIE1vZHVsZXMgbm8KICAgICAgICAgIGxvbmdlciBjb3JlIGR1bXAgd2hlbiBhIFBlcmwgcmVmZXJlbmNlIGlzIGluYWR2ZXJ0ZW50bHkKICAgICAgICAgIHBhc3NlZCBpbiBhcyBhIEMgcG9pbnRlci4KCjMvMTgvOTcgOiBBZGRlZCBhICJjaGVjayIgdHlwZW1hcC4gICBUaGlzIGNhbiBiZSB1c2VkIHRvIGNoZWNrIHRoZQogICAgICAgICAgdmFsaWRpdHkgb2YgZnVuY3Rpb24gaW5wdXQgdmFsdWVzLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKHBlcmw1LGNoZWNrKSBpbnQgcG9zaW50IHsKICAgICAgICAgICAgICAgICAgICAgICBpZiAoJHRhcmdldCA8IDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyb2FrKCJBcmd1bWVudCBpcyBub3QgYSBwb3NpdGl2ZSBpbnRlZ2VyIik7CiAgICAgICAgICAgICAgICB9CgozLzE4Lzk3IDogQWRkZWQgYW4gJGFyZyB2YXJpYWJsZSB0byBUY2wgdHlwZW1hcHMuICAgVGhpcyBtYWtlcyBpdCBlYXNpZXIKICAgICAgICAgIHRvIHJldHVybiBhcmd1bWVudCB2YWx1ZXMgYnkgInJlZmVyZW5jZSIuCgozLzE4Lzk3IDogRml4ZWQgYSBjb2RlIGdlbmVyYXRpb24gYnVnIHdoZW4gdXNpbmcgQysrIHJlZmVyZW5jZXMgYW5kCiAgICAgICAgICB0aGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlLgoKMy8xOC85NyA6IEZpeGVkIGEgZmV3IGdsaXRjaGVzIGluIHRoZSB0eXBlbWFwIG1vZHVsZSB3aXRoIHJlc3BlY3QgdG8KICAgICAgICAgIGNoYWluaW5nLiBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgewogICAgICAgICAgICAgICAgICAgICAgICRpbiAgICAgICAgICAgICAgICAvLyBJbnNlcnRzIHByZXhpc3RpbmcgdHlwZW1hcAogICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiUmVjZWl2ZWQgYSAlZFxuIiwgJHRhcmdldCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBoYXMgYmVlbiBhbGxvd2VkIGZvciBxdWl0ZSBzb21lIHRpbWUsIGJ1dCBkaWRuJ3Qgd29yawogICAgICAgICAgaWYgbm8gZXhpc3RpbmcgdHlwZW1hcCB3YXMgZGVmaW5lZC4gIE5vdywgaXQgc3RpbGwgZG9lc24ndAogICAgICAgICAgd29yayBpZiBubyBleGlzdGluZyB0eXBlbWFwIGlzIGRlZmluZWQsIGJ1dCBpdCBpc3N1ZXMgYQogICAgICAgICAgd2FybmluZyBtZXNzYWdlLiAgIFRoZXJlIGlzIHNvbWUgc3VwcG9ydCB1c2luZyBkZWZhdWx0IHR5cGVtYXBzLAogICAgICAgICAgYnV0IG5vbmUgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgdGFrZSBhZHZhbnRhZ2Ugb2YgaXQuICBUaGlzCiAgICAgICAgICBzaG91bGQgYmUgY29uc2lkZXJlZCBleHBlcmltZW50YWwgYXQgdGhpcyB0aW1lLgoKVmVyc2lvbiAxLjFiNSBQYXRjaCAxIChNYXJjaCAxNiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjMvMTYvOTcgOiBGaXhlZCByZWZlcmVuY2VzIGJ1ZyB3aXRoIEMrKyBjb2RlIGdlbmVyYXRpb24uCgozLzE2Lzk3IDogRml4ZWQgaW5pdGlhbGl6YXRpb24gYnVnIGluIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSB0aGF0CiAgICAgICAgICB3YXMgY2F1c2luZyB3ZWlyZCBwcm9ibGVtcy4KCjMvMTYvOTcgOiBGaXhlZCBmYXRhbCBidWcgd2l0aCAtYyBvcHRpb24gaW4gdGhlIFB5dGhvbiBtb2R1bGUuCgozLzEzLzk3IDogRml4ZWQgYnVnIGluIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbSBpbnZvbHZpbmcgdGhlICV0ZXh0IGRpcmVjdGl2ZQogICAgICAgICAgYW5kIHNvcnRpbmcuIEluIHRoZSBvbGQgc3lzdGVtLCAldGV4dCBlbnRyaWVzIHdvdWxkIGZsb2F0IHRvIHRoZQogICAgICAgICAgdG9wIG9mIGEgc2VjdGlvbiBiZWNhdXNlIHRoZXkgd2VyZSAibmFtZWxlc3MiLiAgIE5vdyB0aGV5IGFyZQogICAgICAgICAgYXR0YWNoZWQgdG8gdGhlIHByZXZpb3VzIGRlY2xhcmF0aW9uIGFuZCB3aWxsIHN0YXkgaW4gdGhlIHByb3BlcgogICAgICAgICAgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIHByZXZpb3VzIGVudHJ5LgoKVmVyc2lvbiAxLjFiNSAoTWFyY2ggMTIsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMy8xMS85NyA6IEZpeGVkIGNvbXBpbGF0aW9uIHByb2JsZW1zIGludHJvZHVjZWQgYnkgVGNsL1RrIDguMGEyLgogICAgICAgICAgKioqIElOQ09NUEFUSUJJTElUWSAqKiogU1dJRyBubyBsb25nZXIgd29ya3Mgd2l0aCBUY2wvVGsgOC4wYTEuCgozLzEwLzk3IDogRml4ZWQgYnVnIHdpdGggaWdub3JlZCBhcmd1bWVudHMgYW5kIEMrKyBtZW1iZXIgZnVuY3Rpb25zIGluCiAgICAgICAgICB0aGUgUHl0aG9uIG1vZHVsZS4KCjMvOS85NyAgOiBQYXJzaW5nIGJ1Z3Mgd2l0aCBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMgYW5kIHByaXZhdGVseQogICAgICAgICAgZGVjbGFyZWQgbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zIGZpeGVkLgoKMy85Lzk3ICA6IEZpeGVkIGEgZmV3IG1pbm9yIGNvZGUgZ2VuZXJhdGlvbiBidWdzIHdpdGggQysrIGNsYXNzZXMgYW5kCiAgICAgICAgICBjb25zdHJ1Y3RvcnMuICAgSW4gc29tZSBjYXNlcywgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUKICAgICAgICAgIHdvdWxkIG5vdCBjb21waWxlIHByb3Blcmx5LiAgIFNXSUcgbm93IGF0dGVtcHRzIHRvIHVzZQogICAgICAgICAgdGhlIGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvciBpbnN0ZWFkLgoKMy84Lzk3ICA6IEFkZGVkIGEgLWwgb3B0aW9uIHRvIFNXSUcgdGhhdCBhbGxvd3MgYWRkaXRpb25hbCBTV0lHIGxpYnJhcnkgZmlsZXMKICAgICAgICAgIHRvIGJlIGdyYWJiZWQgd2l0aG91dCBoYXZpbmcgdGhlbSBzcGVjaWZpZWQgaW4gdGhlIGludGVyZmFjZSBmaWxlLgogICAgICAgICAgVGhpcyBtYWtlcyBpdCBlYXNpZXIgdG8ga2VlcCB0aGUgaW50ZXJmYWNlIGZpbGUgY2xlYW4gYW5kIG1vdmUgY2VydGFpbgogICAgICAgICAgb3B0aW9ucyBpbnRvIGEgTWFrZWZpbGUuICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICBzd2lnIC10Y2wgZXhhbXBsZS5pICAgICAgICAgICAgICAjICBCdWlsZCBhIG5vcm1hbCBUY2wgZXh0ZW5zaW9uCiAgICAgICAgICAgICAgc3dpZyAtdGNsIC1sd2lzaC5pIGV4YW1wbGUuaSAgICAgIyAgQnVpbGQgaXQgYXMgYSB3aXNoIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIGJ5IGluY2x1ZGluZyB0aGUgJ3dpc2guaScgZmlsZS4KCiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIGV4YW1wbGUuaSAgICAgICAgICAgIyBCdWlsZCBhIGR5bmFtaWNhbGx5IGxvYWRlZCBleHRlbnNpb24KICAgICAgICAgICAgICBzd2lnIC1weXRob24gLWxlbWJlZC5pIGV4YW1wbGUuaSAjIEJ1aWxkIGEgc3RhdGljIGV4dGVuc2lvbgoKICAgICAgICAgIFRoZXNlIGtpbmRzIG9mIG9wdGlvbnMgY291bGQgcHJldmlvdXNseSBiZSBhY2NvbXBsaXNoZWQgd2l0aAogICAgICAgICAgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gc3VjaCBhcyA6CgogICAgICAgICAgICAgICAgICAgJW1vZHVsZSBleGFtcGxlCiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICNpZmRlZiBTVEFUSUMKICAgICAgICAgICAgICAgICAgICVpbmNsdWRlIGVtYmVkLmkKICAgICAgICAgICAgICAgICAgICNlbmRpZgoKMy84Lzk3ICA6IEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIEd1aWxlIG1vZHVsZSB0byB1c2UgdGhlIG5ldyBnaCBpbnRlcmZhY2UKICAgICAgICAgIGluIEZTRiBHdWlsZSAxLjAuICAgIFRoZSBvbGRlciBnc2NtIGludGVyZmFjZSB1c2VkIGluIEN5Z251cwogICAgICAgICAgR3VpbGUgcmVsZWFzZXMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSBTV0lHLgoKMy84Lzk3ICA6IENsZWFuZWQgdXAgdGhlIFRjbCBOZXRzY2FwZSBwbHVnaW4gZXhhbXBsZS4gICBJdCBzaG91bGQgd29yayB3aXRoCiAgICAgICAgICB2ZXJzaW9uIDEuMSBvZiB0aGUgcGx1Z2luIG5vdy4KCjMvOC85NyAgOiBBZGRlZCBiZXR0ZXIgYXJyYXkgc3VwcG9ydCB0byB0aGUgdHlwZW1hcCBtb2R1bGUuICBUaGUga2V5d29yZAogICAgICAgICAgQU5ZIGNhbiBub3cgYmUgdXNlZCB0byBtYXRjaCBhbnkgYXJyYXkgZGltZW5zaW9uLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbQU5ZXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgd2lsbCBtYXRjaCBhbnkgc2luZ2xlLWRpbWVuc2lvbmFsIGRvdWJsZSBhcnJheS4gICBUaGUgYXJyYXkKICAgICAgICAgIGRpbWVuc2lvbiBpcyBwYXNzZWQgaW4gdGhlIHZhcmlhYmxlcyAkZGltMCwgJGRpbTEsIC4uLiAkZGltOS4gIEZvcgogICAgICAgICAgZXhhbXBsZSA6CgoJCSAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbQU5ZXVtBTlldW0FOWV0gewoJCQlwcmludGYoIlJlY2VpdmVkIGEgZG91YmxlWyVkXVslZF1bJWRdXG4iLCRkaW0wLCRkaW0xLCRkaW0yKTsKCSAgICAgICAgICAgIH0KCiAgICAgICAgICBBbnkgdHlwZW1hcCBpbnZvbHZpbmcgYSBzcGVjaWZpYyBhcnJheSBkaW1lbnNpb24gd2lsbCBvdmVycmlkZSBhbnkKICAgICAgICAgIHNwZWNpZmllZCB3aXRoIHRoZSBBTlkgdGFnLiAgVGh1cywgYSAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSBbNV1bNF1bQU5ZXSB7fQogICAgICAgICAgd291bGQgb3ZlcnJpZGUgYSBkb3VibGUgW0FOWV1bQU5ZXVtBTlldLiAgSG93ZXZlciwgb3ZlcnVzZSBvZiB0aGUgQU5ZCiAgICAgICAgICB0YWcgaW4gYXJyYXlzIG9mIGhpZ2gtZGltZW5zaW9ucyBtYXkgbm90IHdvcmsgYXMgeW91IGV4cGVjdCBkdWUgdG8KICAgICAgICAgIHRoZSBwYXR0ZXJuIG1hdGNoaW5nIHJ1bGUgdXNlZC4gRm9yIGV4YW1wbGUsIHdoaWNoIG9mIHRoZSBmb2xsb3dpbmcKICAgICAgICAgIHR5cGVtYXBzIGhhcyBwcmVjZWRlbmNlPwoKICAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgW0FOWV1bNV0ge30gICAgIC8vIEF2b2lkIHRoaXMhCiAgICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFs1XVtBTlldIHt9CgozLzcvOTcgIDogRml4ZWQgYSBudW1iZXIgb2YgYnVncyByZWxhdGVkIHRvIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5IGhhbmRsaW5nLgogICAgICAgICAgVHlwZWRlZnMgaW52b2x2aW5nIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBub3cgd29ya3MgY29ycmVjdGx5LgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBNQVRSSVhbNF1bNF07CgogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIGV4dGVybiBkb3VibGUgZm9vKE1BVFJJWCBhKTsKCiAgICAgICAgICBUeXBlY2FzdGluZyBvZiBwb2ludGVycyBpbnRvIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cyBpcyBub3cKICAgICAgICAgIGltcGxlbWVudGVkIHByb3Blcmx5IHdoZW4gbWFraW5nIEMvQysrIGZ1bmN0aW9uIGNhbGxzLgoKMy82Lzk3ICA6IEZpeGVkIHBvdGVudGlhbGx5IGRhbmdlcm91cyBidWcgaW4gdGhlIFRjbCBPYmplY3Qtb3JpZW50ZWQKICAgICAgICAgIGludGVyZmFjZS4gIFdlbGwsIGFjdHVhbGx5LCBkaWRuJ3QgZml4IGl0IGJ1dCBpc3N1ZWQgYQogICAgICAgICAgVGNsIGVycm9yIGluc3RlYWQuICAgVGhlIGJ1ZyB3b3VsZCBtYW5pZmVzdCBpdHNlbGYgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICAgJSBzZXQgbCBbTGlzdF0gICAgICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICUgc2V0IG0gW0xpc3QgLXRoaXMgJGxdICAjIE1ha2UgJG0gaW50byBhbiBvYmplY3QgYXNzdW1pbmcgJGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb250YWlucyBhIHBvaW50ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgU2luY2UgJG0gPT0gJGwsICRsIGdldHMgZGVzdHJveWVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKHNpbmNlIGl0cyB0aGUgc2FtZSBjb21tYW5kIG5hbWUpCiAgICAgICAgICAgICAgICAgJSAkbSBpbnNlcnQgRm9vCiAgICAgICAgICAgICAgICAgU2VnbWVudGF0aW9uIGZhdWx0ICAgICAgICMgTm90ZSA6IHRoZSBsaXN0IG5vIGxvbmdlciBleGlzdHMhCgogICAgICAgICAgTm93LCBhbiBlcnJvciB3aWxsIGJlIGdlbmVyYXRlZCBpbnN0ZWFkIG9mIHJlZGVmaW5pbmcgdGhlIGNvbW1hbmQuCiAgICAgICAgICBBcyBpbiA6CgogICAgICAgICAgICAgICAgICUgc2V0IGwgW0xpc3RdCiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJSBzZXQgbSBbTGlzdCAtdGhpcyAkbF0KICAgICAgICAgICAgICAgICBPYmplY3QgbmFtZSBhbHJlYWR5IGV4aXN0cyEKCiAgICAgICAgICBVc2UgY2F0Y2h7fSB0byBpZ25vcmUgdGhlIGVycm9yLgoKMy8zLzk3ICA6IEJldHRlciBzdXBwb3J0IGZvciBlbnVtcyBhZGRlZC4gICBEYXRhdHlwZXMgb2YgJ2VudW0gTXlFbnVtJwogICAgICAgICAgYW5kIHR5cGVkZWZzIHN1Y2ggYXMgJ3R5cGVkZWYgZW51bSBNeUVudW0gRm9vOycgbm93IHdvcmsuCgozLzMvOTcgIDogUGFyc2VyIG1vZGlmaWVkIHRvIGlnbm9yZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMgc3VjaCBhcyA6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgaW50IGEsYjsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBGb28oaW50IGkpIDogYSgwKSwgYihpKSwgQmFyKGksMCkgeyB9OwogICAgICAgICAgICAgICB9OwoKMy8zLzk3ICA6IE1vZGlmaWVkIHBhcnNlciB0byBpZ25vcmUgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKSB0aHJvdyhYLFkpOwoKMy8zLzk3ICA6IEFkZGVkICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhpcyB3b3JrcyBleGFjdGx5IGxpa2UgJWV4dGVybgogICAgICAgICAgZXhjZXB0IGl0IHRlbGxzIHRoZSBsYW5ndWFnZSBtb2R1bGUgdGhhdCB0aGUgZGVjbGFyYXRpb25zIGFyZQogICAgICAgICAgY29taW5nIGZyb20gYSBzZXBhcmF0ZSBtb2R1bGUuICAgVGhpcyBpcyB1c3VhbGx5IG9ubHkKICAgICAgICAgIG5lZWRlZCB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3Nlcy4KCjMvMi85NyAgOiBDaGFuZ2VkIHBvaW50ZXIgdHlwZS1jaGVja2VyIHRvIGJlIHNpZ25pZmljYW50bHkgbW9yZQogICAgICAgICAgZWZmaWNpZW50IHdoZW4gd29ya2luZyB3aXRoIGRlcml2ZWQgZGF0YXR5cGVzLiAgVGhpcwogICAgICAgICAgaGFzIGJlZW4gYWNjb21wbGlzaGVkIGJ5IHN0b3JpbmcgdHlwZS1tYXBwaW5ncyBpbiBzb3J0ZWQKICAgICAgICAgIG9yZGVyLCB1c2luZyBiaW5hcnkgc2VhcmNoIHNjaGVtZXMsIGFuZCBjYWNoaW5nIHJlY2VudGx5CiAgICAgICAgICB1c2VkIGRhdGF0eXBlcy4gICBGb3IgU1dJRyBnZW5lcmF0ZWQgQysrIG1vZHVsZXMgdGhhdAogICAgICAgICAgbWFrZSBhIGxhcmdlIG51bWJlciBvZiBDIGZ1bmN0aW9uIGNhbGxzIHdpdGggZGVyaXZlZCB0eXBlcywKICAgICAgICAgIHRoaXMgY291bGQgcmVzdWx0IGluIHNwZWVkdXBzIG9mIGJldHdlZW4gMTAwIGFuZCA1MDAwMCBwZXJjZW50LgogICAgICAgICAgSG93ZXZlciwgZHVlIHRvIHRoZSByZXF1aXJlZCBzb3J0aW5nIG9wZXJhdGlvbiwgbW9kdWxlCiAgICAgICAgICBsb2FkaW5nIHRpbWUgbWF5IGluY3JlYXNlZCBzbGlnaHRseSB3aGVuIHRoZXJlIGFyZSBsb3RzIG9mCiAgICAgICAgICBkYXRhdHlwZXMuCgozLzIvOTcgIDogRml4ZWQgc29tZSBDKysgY29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBQeXRob24KICAgICAgICAgIGVtYmVkLmkgbGlicmFyeSBmaWxlcy4KCjIvMjcvOTcgOiBTbGlnaHQgY2hhbmdlIHRvIEMrKyBjb2RlIGdlbmVyYXRpb24gdG8gdXNlIGNvcHkgY29uc3RydWN0b3JzCiAgICAgICAgICB3aGVuIHJldHVybmluZyBjb21wbGV4IGRhdGEgdHlwZSBieSB2YWx1ZS4KCjIvMjYvOTcgOiBGaXhlZCBidWcgaW4gUHl0aG9uIG1vZHVsZSB3aXRoIC1jIG9wdGlvbi4KCjIvMjYvOTcgOiBTbGlnaHQgdHdlYWsgb2YgcGFyc2VyIHRvIGFsbG93IHRyYWlsaW5nIGNvbW1hIGluIGVudW1lcmF0aW9ucwogICAgICAgICAgc3VjaCBhcwoKICAgICAgICAgICAgICAgIGVudW0gVmFsdWUgKEFMRSwgU1RPVVQsIExBR0VSLCB9OwoKMi8yNS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gVGNsIG1vZHVsZSB3aGVuIHVzaW5nIHRoZQogICAgICAgICAgJW5hbWUoKSBkaXJlY3RpdmUgb24gYSBjbGFzc25hbWUuCgoyLzI1Lzk3IDogRmluaXNoZWQgY29kZS1zaXplIG9wdGltaXphdGlvbiBvZiBDKysgY29kZSBnZW5lcmF0aW9uIHdpdGgKICAgICAgICAgIGluaGVyaXRhbmNlIG9mIGF0dHJpYnV0ZXMuICAgIEluaGVyaXRlZCBhdHRyaWJ1dGVzIG5vdwogICAgICAgICAgb25seSBnZW5lcmF0ZSBvbmUgc2V0IG9mIHdyYXBwZXIgZnVuY3Rpb25zIHRoYXQgYXJlIHJlLXVzZWQKICAgICAgICAgIGluIGFueSBkZXJpdmVkIGNsYXNzZXMuICAgVGhpcyBjb3VsZCBwcm92aWRlIGJpZyBjb2RlCiAgICAgICAgICBzaXplIGltcHJvdmVtZW50cyBpbiBzb21lIHNjcmlwdGluZyBsYW5ndWFnZSBpbnRlcmZhY2VzLgoKMi8yNS85NyA6IFBlcmw1IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IGJvdGggdGhlIFVuaXggYW5kIFdpbmRvd3MKICAgICAgICAgIHZlcnNpb25zLiAgVGhlIHdpbmRvd3MgdmVyc2lvbiBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCB0aGUKICAgICAgICAgIEFjdGl2ZXdhcmUgcG9ydCBvZiBQZXJsIDUuMDAzIHJ1bm5pbmcgdW5kZXIgV2luZG93cyA5NS4KICAgICAgICAgIFRoZSBDIHNvdXJjZSBnZW5lcmF0ZWQgYnkgU1dJRyBzaG91bGQgY29tcGlsZSB3aXRob3V0CiAgICAgICAgICBtb2RpZmljYXRpb24gdW5kZXIgYm90aCB2ZXJzaW9ucyBvZiBQZXJsLCBidXQgaXMgbm93CiAgICAgICAgICBldmVuIG1vcmUgaGlkZW91cyB0aGFuIGJlZm9yZS4KCjIvMjUvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgc2NvcGUgcmVzb2x1dGlvbiBvcGVyYXRpb24gdG8KICAgICAgICAgIGFwcGVhciBpbiBleHByZXNzaW9ucyBhbmQgZGVmYXVsdCBhcmd1bWVudHMgYXMgaW4gOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCBhID0gIEJhcjo6ZGVmdmFsdWUpOwoKMi8yNS85NyA6IEZpeGVkIGJ1ZyB3aGVuIHJlc29sdmluZyBzeW1ib2xzIGluc2lkZSBDKysgY2xhc3Nlcy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIGVudW0gVmFsdWUge0FMRSwgU1RPVVQsIExBR0VSfTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgdm9pZCBkZWZhcmcoVmFsdWUgdiA9IFNUT1VUKTsKCiAgICAgICAgICAgICAgfTsKCjIvMjQvOTcgOiBGaXhlZCBidWcgd2l0aCBtZW1iZXIgZnVuY3Rpb25zIHJldHVybmluZyB2b2lkICouCgoyLzIzLzk3IDogTW9kaWZpZWQgUHl0aG9uIG1vZHVsZSB0byBiZSBiZXR0ZXIgYmVoYXZlZCB1bmRlciBXaW5kb3dzCgogICAgICAgICAgICAtICBNb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gaXMgbm93IHByb3Blcmx5IGV4cG9ydGVkLgogICAgICAgICAgICAgICBJdCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byBleHBsaWNpdGx5IGV4cG9ydCB0aGlzIGZ1bmN0aW9uCiAgICAgICAgICAgICAgIHlvdXJzZWxmLgoKICAgICAgICAgICAgLSAgQml6YXJyZSBjb21waWxhdGlvbiBwcm9ibGVtcyB3aGVuIGNvbXBpbGluZyB0aGUgU1dJRyB3cmFwcGVyCiAgICAgICAgICAgICAgIGNvZGUgYXMgQU5TSSBDIHVuZGVyIFZpc3VhbCBDKysgNC54IGZpeGVkLgoKICAgICAgICAgICAgLSAgVGVzdGVkIHdpdGggYm90aCB0aGUgc3RvY2sgUHl0aG9uLTEuNCBkaXN0cmlidXRpb24gYW5kIFB5dGhvbndpbgogICAgICAgICAgICAgICBydW5uaW5nIHVuZGVyIFdpbjk1LgoKMi8xOS85NyA6IEZpeGVkIHR5cGVkZWYgaGFuZGxpbmcgYnVnIGluIFBlcmw1IHNoYWRvdyBjbGFzc2VzLgoKMi8xOS85NyA6IEFkZGVkIGV4Y2VwdGlvbiBzdXBwb3J0LiAgVG8gdXNlIGl0LCBkbyB0aGUgZm9sbG93aW5nIDoKCiAgICAgICAgICAgICAgJWV4Y2VwdChsYW5nKSB7CiAgICAgICAgICAgICAgICAgIC4uLiB0cnkgcGFydCBvZiB0aGUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgLi4uIGNhdGNoIHBhcnQgb2YgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAkZnVuY3Rpb24gaXMgYSBTV0lHIHZhcmlhYmxlIHRoYXQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUKICAgICAgICAgIGFjdHVhbCBDL0MrKyBmdW5jdGlvbiBjYWxsIGluIGEgd3JhcHBlciBmdW5jdGlvbi4gIFRodXMsCiAgICAgICAgICBhIHJlYWwgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gbWlnaHQgbG9vayBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICVleGNlcHQocGVybDUpIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgJGZ1bmN0aW9uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGNoYXIgKiYgc3opIHsKICAgICAgICAgICAgICAgICAgICAuLi4gcHJvY2VzcyBhbiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgY3JvYWsoIlVua25vd24gZXhjZXB0aW9uLiBCYWlsaW5nIG91dC4uLiIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CgoyLzE5Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgbWFuYWdpbmcgZ2VuZXJpYyBjb2RlIGZyYWdtZW50cyAobmVlZGVkCiAgICAgICAgICBmb3IgZXhjZXB0aW9ucykuCgoyLzE5Lzk3IDogRml4ZWQgc29tZSByZWFsbHkgb2JzY3VyZSB0eXBlbWFwIHNjb3BpbmcgYnVncyBpbiB0aGUgQysrCiAgICAgICAgICBoYW5kbGVyLgoKMi8xOC85NyA6IENsZWFuZWQgdXAgcGVybG1haW4uaSBmaWxlIGJ5IHJlbW92aW5nIHNvbWUgcHJvYmxlbWF0aWMsCiAgICAgICAgICBidXQgc2VlbWluZ2x5IHVubmVjZXNzYXJ5IGRlY2xhcmF0aW9ucy4KCjIvMTgvOTcgOiBPcHRpbWl6ZWQgaGFuZGxpbmcgb2YgbWVtYmVyIGZ1bmN0aW9ucyB1bmRlciBpbmhlcml0YW5jZS4KICAgICAgICAgIFNXSUcgY2FuIG5vdyB1c2Ugd3JhcHBlciBmdW5jdGlvbnMgZ2VuZXJhdGVkIGZvciBhCiAgICAgICAgICBiYXNlIGNsYXNzIGluc3RlYWQgb2YgcmVnZW5lcmF0aW5nIHdyYXBwZXJzIGZvcgogICAgICAgICAgdGhlIHNhbWUgZnVuY3Rpb25zIGluIGEgZGVyaXZlZCBjbGFzcy4gICAgVGhpcyBjb3VsZAogICAgICAgICAgbWFrZSBhIGRyYXN0aWMgcmVkdWN0aW9uIGluIHdyYXBwZXIgY29kZSBzaXplIGZvciBDKysKICAgICAgICAgIGFwcGxpY2F0aW9ucyB3aXRoIGRlZXAgaW5oZXJpdGFuY2UgaGllcmFyY2hpZXMgYW5kCiAgICAgICAgICBsb3RzIG9mIGZ1bmN0aW9ucy4KCjIvMTgvOTcgOiBBZGRpdGlvbmFsIG1ldGhvZHMgc3BlY2lmaWVkIHdpdGggJWFkZG1ldGhvZHMgY2FuIG5vdwogICAgICAgICAgYmUgaW5oZXJpdGVkIGFsb25nIHdpdGggbm9ybWFsIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgoKMi8xOC85NyA6IE1pbm9yIGludGVybmFsIGZpeGVzIHRvIG1ha2UgU1dJRydzIHN0cmluZyBoYW5kbGluZyBhIGxpdHRsZQogICAgICAgICAgc2FmZXIuCgoyLzE2Lzk3IDogTW92ZWQgc29tZSBjb2RlIGdlbmVyYXRpb24gb2YgVGNsIHNoYWRvdyBjbGFzc2VzIHRvCiAgICAgICAgICBsaWJyYXJ5IGZpbGVzLgoKMi8xNi85NyA6IEZpeGVkIGRvY3VtZW50YXRpb24gZXJyb3Igb2YgJy1jb25maWd1cmUnIG1ldGhvZCBpbgogICAgICAgICAgVGNsIG1vZHVsZXMuCgoyLzE2Lzk3IDogTW9kaWZpZWQgUGVybDUgbW9kdWxlIHNsaWdodGx5IHRvIGFsbG93IHR5cGVtYXBzCiAgICAgICAgICB0byB1c2UgUGVybCByZWZlcmVuY2VzLgoKMi8xMi85NyA6IEZpeGVkIGFyZ3VtZW50IGNoZWNraW5nIGJ1ZyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGJ5CiAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyAoZnVuY3Rpb24gY2FsbHMgd2l0aCB0b28gbWFueQogICAgICAgICAgYXJndW1lbnRzIHdvdWxkIHN0aWxsIGJlIGV4ZWN1dGVkKS4gIEZ1bmN0aW9ucyBub3cKICAgICAgICAgIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgYXJndW1lbnRzIGFzIEMgdmVyc2lvbgogICAgICAgICAgKHdpdGggcG9zc2liaWxpdHkgb2YgZGVmYXVsdC9vcHRpb25hbCBhcmd1bWVudHMKICAgICAgICAgIHN0aWxsIHN1cHBvcnRlZCkuCgoyLzEyLzk3IDogRml4ZWQgZGVmYXVsdCBhcmd1bWVudCBidWcgaW4gUGVybDUgbW9kdWxlIHdoZW4KICAgICAgICAgIGdlbmVyYXRpbmcgd3JhcHBlciBmdW5jdGlvbnMgaW52b2x2aW5nIGRlZmF1bHQKICAgICAgICAgIGFyZ3VtZW50cyBvZiBjb21wbGV4IGRhdGF0eXBlcy4KCjIvMTIvOTcgOiBGaXhlZCB0eXBlbWFwIHNjb3BpbmcgcHJvYmxlbXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIHsKICAgICAgICAgICAgICAgICAgICAuLiBnZXQgYSBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZG91YmxlIGJhcihkb3VibGUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIG5ldyBnZXQgZG91YmxlIC4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGFwcGx5IHRoZSBzZWNvbmQgdHlwZW1hcCB0byBhbGwgZnVuY3Rpb25zIGluIEZvbwogICAgICAgICAgZHVlIHRvIGRlbGF5ZWQgZ2VuZXJhdGlvbiBvZiBDKysgd3JhcHBlciBjb2RlIChjbGVhcmx5IHRoaXMKICAgICAgICAgIGlzIG5vdCB0aGUgZGVzaXJlZCBlZmZlY3QpLiAgIFByb2JsZW0gaGFzIGJlZW4gZml4ZWQgYnkKICAgICAgICAgIGFzc2lnbmluZyB1bmlxdWUgbnVtZXJpY2FsIGlkZW50aWZpZXJzIHRvIGV2ZXJ5IGRhdGF0eXBlIGluCiAgICAgICAgICBhbiBpbnRlcmZhY2UgZmlsZSBhbmQgcmVjb3JkaW5nIHRoZSAicmFuZ2Ugb2YgZWZmZWN0IiBvZiBlYWNoCiAgICAgICAgICB0eXBlbWFwLgoKMi8xMS85NyA6IEFkZGVkIHN1cHBvcnQgZm9yICJpZ25vcmUiIGFuZCAiZGVmYXVsdCIgdHlwZW1hcHMuICBPbmx5IHVzZQogICAgICAgICAgaWYgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSdyZSBkb2luZy4KCjIvOS85NyAgOiBBZGRlZCBhdXRvbWF0aWMgY3JlYXRpb24gb2YgY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycyBmb3IKICAgICAgICAgIEMgc3RydWN0cyBhbmQgQysrIGNsYXNzZXMgdGhhdCBkbyBub3Qgc3BlY2lmeSBhbnkgc29ydCBvZgogICAgICAgICAgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3Rvci4gICBUaGlzIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgYnkKICAgICAgICAgIHJ1bm5pbmcgU1dJRyB3aXRoIHRoZSAnLW1ha2VfZGVmYXVsdCcgb3B0aW9uIG9yIGJ5IGluc2VydGluZwogICAgICAgICAgdGhlIGZvbGxvd2luZyBwcmFnbWEgaW50byBhbiBpbnRlcmZhY2UgZmlsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEgbWFrZV9kZWZhdWx0CgogICAgICAgICAgVGhlIGZvbGxvd2luZyBwcmFnbWEgZGlzYWJsZXMgYXV0b21hdGljIGNvbnN0cnVjdG9yIGdlbmVyYXRpb24KCiAgICAgICAgICAgICAgICAgJXByYWdtYSBub19kZWZhdWx0CgoyLzkvOTcgIDogQWRkZWQgLW1ha2VfZGVmYXVsdCBvcHRpb24gZm9yIHByb2R1Y2luZyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgYW5kIGRlc3RydWN0b3JzIGZvciBjbGFzc2VzIHdpdGhvdXQgdGhlbS4KCjIvOS85NyAgOiBDaGFuZ2VkIHRoZSBzeW50YXggb2YgdGhlIFNXSUcgJXByYWdtYSBkaXJlY3RpdmUgdG8KICAgICAgICAgICVwcmFnbWEgb3B0aW9uPXZhbHVlIG9yICVwcmFnbWEobGFuZykgb3B0aW9uPXZhbHVlLgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWFrZXMgdGhlIHN5bnRheCBhIGxpdHRsZSBtb3JlIGNvbnNpc3RlbnQKICAgICAgICAgIGJldHdlZW4gZ2VuZXJhbCBwcmFnbWFzIGFuZCBsYW5ndWFnZS1zcGVjaWZpYyBwcmFnbWFzLgogICAgICAgICAgVGhlIG9sZCBzeW50YXggc3RpbGwgd29ya3MsIGJ1dCB3aWxsIHByb2JhYmx5IGJlIHBoYXNlZAogICAgICAgICAgb3V0IChhIHdhcm5pbmcgbWVzc2FnZSBpcyBjdXJyZW50bHkgcHJpbnRlZCkuCgoyLzkvOTcgIDogSW1wcm92ZWQgVGNsIHN1cHBvcnQgb2YgZ2xvYmFsIHZhcmlhYmxlcyB0aGF0IGFyZSBvZgogICAgICAgICAgc3RydWN0dXJlcywgY2xhc3NlcywgYW5kIHVuaW9ucy4KCjIvOS85NyAgOiBGaXhlZCBDKysgY29tcGlsYXRpb24gcHJvYmxlbSBpbiBQeXRob24gJ2VtYmVkLmknIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBtaXNzaW5nIHJldHVybiB2YWx1ZSBpbiBwZXJsbWFpbi5pIGxpYnJhcnkgZmlsZS4KCjIvOS85NyAgOiBGaXhlZCBQeXRob24gc2hhZG93IGNsYXNzZXMgdG8gcmV0dXJuIGFuIEF0dHJpYnV0ZUVycm9yIHdoZW4KICAgICAgICAgIHVuZGVmaW5lZCBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NlZCAob2xkZXIgdmVyc2lvbnMgcmV0dXJuZWQKICAgICAgICAgIGEgTmFtZUVycm9yKS4KCjIvOS85NyAgOiBGaXhlZCBidWcgd2hlbiAlYWRkbWV0aG9kcyBpcyB1c2VkIGFmdGVyIGEgY2xhc3MgZGVmaW5pdGlvbiB3aG9zZQogICAgICAgICAgbGFzdCBzZWN0aW9uIGlzIHByb3RlY3RlZCBvciBwcml2YXRlLgoKMi84Lzk3ICA6IE1hZGUgc2xpZ2h0IGNoYW5nZXMgaW4gaW5jbHVkZSBmaWxlIHByb2Nlc3NpbmcgdG8gc3VwcG9ydAogICAgICAgICAgdGhlIE1hY2ludG9zaC4KCjIvOC85NyAgOiBFeHRlbmRlZCBzd2lnbWFpbi5jeHggdG8gcHJvdmlkZSBhIHJ1ZGltZW50YXJ5IE1hY2ludG9zaCBpbnRlcmZhY2UuCiAgICAgICAgICBJdCdzIGEgcmVhbGx5IGJhZCBpbnRlcmZhY2UsIGJ1dCB3b3JrcyB1bnRpbCBzb21ldGhpbmcgYmV0dGVyCiAgICAgICAgICBpcyB3cml0dGVuLgoKMS8yOS85NyA6IEZpeGVkIHR5cGUtY2FzdGluZyBidWcgaW50cm9kdWNlZCBieSAxLjFiNCB3aGVuIHNldHRpbmcvZ2V0dGluZyB0aGUKICAgICAgICAgIHZhbHVlIG9mIGdsb2JhbCB2YXJpYWJsZXMgaW52b2x2aW5nIGNvbXBsZXggZGF0YSB0eXBlcy4KCjEvMjkvOTcgOiBSZW1vdmVkIGVycm9uZW91cyB3aGl0ZSBzcGFjZSBiZWZvcmUgYW4gI2VuZGlmIGluIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgYnkgdGhlIFB5dGhvbiBtb2R1bGUgKHdhcyBjYXVzaW5nIGVycm9ycyBvbiBERUMgQWxwaGEgY29tcGlsZXJzKS4KCjEvMjYvOTcgOiBGaXhlZCBlcnJvcnMgd2hlbiB1c2luZyBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cyBpbiBQeXRob24gc2hhZG93CgkgIHNoYWRvdyBjbGFzc2VzLgoKMS8yMy85NyA6IEZpeGVkIGJ1ZyB3aXRoIG5lc3RlZCAlZXh0ZXJuIGRlY2xhcmF0aW9ucy4KCjEvMjEvOTcgOiBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZWRlZiBpbnZvbHZpbmcgY29uc3QgZGF0YXR5cGVzLgoKMS8yMS85NyA6IFNvbWV3aGF0IG9ic2N1cmUsIGJ1dCBzZXJpb3VzIGJ1ZyB3aXRoIGhhdmluZyBtdWx0aXBsZSBsZXZlbHMKICAgICAgICAgIG9mIHR5cGVkZWZzIGZpeGVkLiAgRm9yIGV4YW1wbGUgOgoKCQl0eXBlZGVmIGNoYXIgKlN0cmluZzsKICAgICAgICAgICAgICAgIHR5cGVkZWYgU3RyaW5nICBOYW1lOwoKVmVyc2lvbiAxLjEgQmV0YTQgKEphbnVhcnkgMTYsIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTm90ZSA6IFNXSUcgMS4xYjMgY3Jhc2hlZCBhbmQgYnVybmVkIHNob3J0bHkgYWZ0ZXIgdGFrZSBvZmYgZHVlCnRvIGEgZmV3IG1ham9yIHJ1bi10aW1lIHByb2JsZW1zIHRoYXQgc3VyZmFjZWQgYWZ0ZXIgcmVsZWFzZS4KVGhpcyByZWxlYXNlIHNob3VsZCBmaXggbW9zdCwgaWYgbm90IGFsbCwgb2YgdGhvc2UgcHJvYmxlbXMuCgoxLzE2Lzk3IDogRml4ZWQgbWFqb3IgbWVtb3J5IG1hbmFnZW1lbnQgYnVnIG9uIExpbnV4CgoxLzE0Lzk3IDogRml4ZWQgYnVnIGluIGZ1bmN0aW9ucyByZXR1cm5pbmcgY29uc3RhbnQgQysrIHJlZmVyZW5jZXMuCgoxLzE0Lzk3IDogTW9kaWZpZWQgQysrIG1vZHVsZSB0byBoYW5kbGUgZGF0YXR5cGVzIGJldHRlci4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgYSAqc2luZ2xlKiBzY29wZSByZXNvbHV0aW9uCiAgICAgICAgICBvcGVyYXRvciBpbiBkYXRhdHlwZXMuICBJZSA6IEZvbzo6YmFyLiAgIFNXSUcgZG9lc24ndAogICAgICAgICAgeWV0IGhhbmRsZSBuZXN0ZWQgY2xhc3Nlcywgc28gdGhpcyBzaG91bGQgYmUKICAgICAgICAgIHN1ZmZpY2llbnQgZm9yIG5vdy4KCjEvMTQvOTcgOiBNb2RpZmllZCBwYXJzZXIgdG8gYWxsb3cgdHlwZWRlZiBpbnNpZGUgYSBDKysgY2xhc3MuCgoxLzE0Lzk3IDogRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIGRhdGF0eXBlcyBkZWZpbmVkIGluc2lkZQogICAgICAgICAgYSBDKysgY2xhc3MuICBTV0lHIHdhcyBub3QgZ2VuZXJhdGluZyBjb3JyZWN0IGNvZGUsCiAgICAgICAgICBidXQgYSBuZXcgc2NvcGluZyBtZWNoYW5pc20gYW5kIG1ldGhvZCBmb3IgaGFuZGxpbmcKICAgICAgICAgIGRhdGF0eXBlcyBpbnNpZGUgYSBDKysgY2xhc3MgaGF2ZSBiZWVuIGFkZGVkLgoKMS8xNC85NyA6IENoYW5nZWQgZW51bWVyYXRpb25zIHRvIHVzZSB0aGUgdmFsdWUgbmFtZSBpbnN0ZWFkCiAgICAgICAgICBvZiBhbnkgdmFsdWVzIHRoYXQgbWlnaHQgaGF2ZSBhcHBlYXJlZCBpbiB0aGUgaW50ZXJmYWNlCiAgICAgICAgICBmaWxlLiAgVGhpcyBtYWtlcyB0aGUgY29kZSBhIGxpdHRsZSBtb3JlIGZyaWVuZGx5IHRvCiAgICAgICAgICBDKysgY29tcGlsZXJzLgoKMS8xNC85NyA6IFJlbW92ZWQgdHlwZWRlZiBidWcgdGhhdCBtYWRlIGFsbCBlbnVtZXJhdGlvbnMKICAgICAgICAgIGVxdWl2YWxlbnQgdG8gZWFjaCBvdGhlciBpbiB0aGUgdHlwZSBjaGVja2VyIChzaW5jZQogICAgICAgICAgaXQgZ2VuZXJhdGVkIGFsb3Qgb2YgdW5uZWNlc3NhcnkgY29kZSkuCgpWZXJzaW9uIDEuMSBCZXRhMyAoSmFudWFyeSA5LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKTm90ZSA6IEEgKmh1Z2UqIG51bWJlciBvZiBjaGFuZ2VzIHJlbGF0ZWQgdG8gb25nb2luZyBtb2RpZmljYXRpb25zLgoKMS4gIFN1cHBvcnQgZm9yIEMrKyBtdWx0aXBsZSBpbmhlcml0YW5jZSBhZGRlZC4KCjIuICBUeXBlbWFwcyBhZGRlZC4KCjMuICBTb21lIHN1cHBvcnQgZm9yIG5lc3RlZCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgYWRkZWQuCgo0LiAgRGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZyBhZGRlZC4KCjUuICAtYyBvcHRpb24gYWRkZWQgZm9yIGJ1aWxkaW5nIGJhcmUgd3JhcHBlciBjb2RlIG1vZHVsZXMuCgo2LiAgUmV3cm90ZSBQb2ludGVyIHR5cGUtY2hlY2tpbmcgdG8gc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZQogICAgY29ycmVjdGx5LgoKNy4gIFRjbCA4LjAgbW9kdWxlIGFkZGVkLgoKOC4gIFBlcmw0IGFuZCBHdWlsZSBtb2R1bGVzIHJlc3VycmVjdGVkIGZyb20gdGhlIGRlYWQgKHdlbGwsIHRoZXkKICAgIGF0IGxlYXN0IHdvcmsgYWdhaW4pLgoKOS4gIE5ldyBPYmplY3QgT3JpZW50ZWQgVGNsIGludGVyZmFjZSBhZGRlZC4KCjEwLiBCdWcgZml4ZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzZXMuCgoxMS4gQ2xlYW5lZCB1cCBtYW55IG9mIHRoZSBpbnRlcm5hbCBtb2R1bGVzIG9mIHRoZSBwYXJzZXIuCgoxMi4gVG9ucyBvZiBleGFtcGxlcyBhbmQgdGVzdGluZyBtb2R1bGVzIGFkZGVkLgoKMTMuIEZpeGVkIGJ1Z3MgcmVsYXRlZCB0byB1c2Ugb2YgImNvbnN0IiByZXR1cm4gdmFsdWVzLgoKMTQuIEZpeGVkIGJ1ZyB3aXRoIEMrKyBtZW1iZXIgZnVuY3Rpb25zIHJldHVybmluZyB2b2lkICouCgoxNS4gQ2hhbmdlZCBTV0lHIGNvbmZpZ3VyYXRpb24gc2NyaXB0LgoKVmVyc2lvbiAxLjEgQmV0YTIgKERlY2VtYmVyIDMsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gQ29tcGxldGVseSByZXdyb3RlIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gc3lzdGVtLiAgVGhlIGNoYW5nZXMKICAgaW52b2x2ZWQgYXJlIHRvbyBudW1lcm91cyB0byBtZW50aW9uLiAgQmFzaWNhbGx5LCB0YWtlIGV2ZXJ5dGhpbmcKICAgeW91IGtuZXcgYWJvdXQgdGhlIG9sZCBzeXN0ZW0sIHRocm93IHRoZW0gb3V0LCBhbmQgcmVhZCB0aGUKICAgZmlsZSBEb2MvZG9jLnBzLgoKMi4gTGltaXRlZCBzdXBwb3J0IGZvciAjaWYgZGVmaW5lZCgpIGFkZGVkLgoKMy4gVHlwZSBjYXN0cyBhcmUgbm93IGFsbG93ZWQgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMuICBpZQoKICAgICAgICAgI2RlZmluZSAgQSAgIChpbnQpIDMKCjQuIEFkZGVkIHN1cHBvcnQgZm9yIHR5cGVkZWYgbGlzdHMuICBGb3IgZXhhbXBsZSA6CgoJdHlwZWRlZiBzdHJ1Y3QgewoJICAgICAgICBkb3VibGUgeCx5LHo7CiAgICAgICAgfSBWZWN0b3IsICpWZWN0b3JQdHI7Cgo1LiBOZXcgU1dJRyBkaXJlY3RpdmVzIChyZWxhdGVkIHRvIGRvY3VtZW50YXRpb24gc3lzdGVtKQoKCSVzdHlsZQoJJWxvY2Fsc3R5bGUKCSVzdWJzZWN0aW9uCgklc3Vic3Vic2VjdGlvbgoKNi4gUmVvcmdhbml6ZWQgdGhlIEMrKyBoYW5kbGluZyBhbmQgbWFkZSBpdCBhIGxpdHRsZSBlYXNpZXIgdG8KICAgd29yayB3aXRoIGludGVybmFsbHkuCgo3LiAgRml4ZWQgcHJvYmxlbSB3aXRoIGluaGVyaXRpbmcgZGF0YSBtZW1iZXJzIGluIFB5dGhvbgogICAgc2hhZG93IGNsYXNzZXMuCgo4LiAgRml4ZWQgc3ltYm9sIHRhYmxlIHByb2JsZW1zIHdpdGggc2hhZG93IGNsYXNzZXMgaW4gYm90aAogICAgUHl0aG9uIGFuZCBQZXJsLgoKOS4gIEZpeGVkIGFubm95aW5nIHNlZ21lbnRhdGlvbiBmYXVsdCBidWcgaW4gd3JhcHBlciBjb2RlCiAgICBnZW5lcmF0ZWQgZm9yIFBlcmw1LgoKMTAuIEZpeGVkIGJ1ZyB3aXRoICVhZGRtZXRob2RzIGRpcmVjdGl2ZS4gIE5vdyBpdCBjYW4gYmUgcGxhY2VkCiAgICBhbnl3aGVyZSBpbiBhIGNsYXNzLgoKMTEuIE1vcmUgdGVzdCBjYXNlcyBhZGRlZCB0byB0aGUgU1dJRyBzZWxmLXRlc3QuICAgRG9jdW1lbnRhdGlvbgogICAgdGVzdHMgYXJlIG5vdyBwZXJmb3JtZWQgYWxvbmcgd2l0aCBvdGhlciB0aGluZ3MuCgoxMi4gUmVvcmdhbml6ZWQgdGhlIFNXSUcgbGlicmFyeSBhIGxpdHRsZSBiaXQgYW5kIHNldCBpdCB1cCB0bwogICAgc2VsZi1kb2N1bWVudCBpdHNlbGYgdXNpbmcgU1dJRy4KCjEzLiBMb3RzIGFuZCBsb3RzIG9mIG1pbm9yIGJ1ZyBmaXhlcyAobW9zdGx5IG9ic2N1cmUsIGJ1dCBidWdzCiAgICBub25ldGhlbGVzcykuCgoKVmVyc2lvbiAxLjEgQmV0YTEgKE9jdG9iZXIgMzAsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gQWRkZWQgbmV3ICVleHRlcm4gZGlyZWN0aXZlIGZvciBoYW5kbGluZyBtdWx0aXBsZSBmaWxlcwoKMi4gUGVybDUgc2hhZG93IGNsYXNzZXMgYWRkZWQKCjMuIFJld3JvdGUgY29uZGl0aW9uYWwgY29tcGlsYXRpb24gdG8gd29yayBiZXR0ZXIKCjQuIEFkZGVkICdib29sJyBkYXRhdHlwZQoKNS4gJXssJX0gYmxvY2sgaXMgbm93IG9wdGlvbmFsLgoKNi4gRml4ZWQgc29tZSBidWdzIGluIHRoZSBQeXRob24gc2hhZG93IGNsYXNzIG1vZHVsZQoKNy4gUmV3cm90ZSBhbGwgb2YgdGhlIFNXSUcgdGVzdHMgdG8gYmUgbW9yZSBpbmZvcm1hdGl2ZQogICAoYW5kIGxlc3Mgc2NhcnkpLgoKOC4gUmV3cm90ZSBwYXJhbWV0ZXIgbGlzdCBoYW5kbGluZyB0byBiZSBtb3JlIG1lbW9yeQogICBlZmZpY2llbnQgYW5kIGZsZXhpYmxlLgoKOS4gQ2hhbmdlZCBwYXJzZXIgdG8gaWdub3JlICdzdGF0aWMnIGRlY2xhcmF0aW9ucy4KCjEwLiBJbml0aWFsaXplcnMgYXJlIG5vdyBpZ25vcmVkLiAgRm9yIGV4YW1wbGUgOgoKCXN0cnVjdCBGb29CYXIgYSA9IHszLDQsNX07CgoxMS4gU29tZXdoYXQgYmV0dGVyIHBhcnNpbmcgb2YgYXJyYXlzIChhbHRob3VnaCBpdCdzCiAgICB1c3VhbGx5IGp1c3QgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBub3cpLgoKMTIuIExvdCdzIG9mIG1pbm9yIGJ1ZyBmaXhlcy4KCgpWZXJzaW9uIDEuMCBGaW5hbCAoQXVndXN0IDMxLCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4gRml4ZWQgbWlub3IgYnVnIGluIEMrKyBtb2R1bGUKCjIuIEZpeGVkIG1pbm9yIGJ1ZyBpbiBwb2ludGVyIHR5cGUtY2hlY2tlciB3aGVuIHVzaW5nCiAgIC1EQUxMT1dfTlVMTC4KCjMuIEZpeGVkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yayB3aXRoIFB5dGhvbiAxLjRiZXRhMwoKNC4gQ2hhbmdlZCBjb25maWd1cmUgc2NyaXB0IHRvIGFsbG93IGNvbXBpbGF0aW9uIHdpdGhvdXQKICAgeWFjYyBvciBiaXNvbi4KClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMjgsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiAgQ2hhbmdlZCBwYXJzZXIgdG8gc3VwcG9ydCBtb3JlIEMvQysrIGRhdGF0eXBlcyAod2VsbCwKICAgIG1vcmUgdmFyaWFudHMpLiAgIFR5cGVzIGxpa2UgInVuc2lnbmVkIiwgInNob3J0IGludCIsCiAgICAibG9uZyBpbnQiLCBldGMuLi4gbm93IHdvcmsuCgoyLiAgInVuaW9ucyIgYWRkZWQgdG8gcGFyc2VyLgoKMy4gIFVzZSBvZiAidHlwZWRlZiIgYXMgaW4gOgoKCXR5cGVkZWYgc3RydWN0IHsKCSAgICAgZG91YmxlIHgseSx6OwoJfSBWZWN0b3I7CgogICAgTm93IHdvcmtzIGNvcnJlY3RseS4gICBUaGUgbmFtZSBvZiB0aGUgdHlwZWRlZiBpcyB1c2VkIGFzCiAgICB0aGUgc3RydWN0dXJlIG5hbWUuCgo0LiAgQ29uZGl0aW9uYWwgY29tcGlsYXRpb24gd2l0aCAjaWZkZWYsICNlbHNlLCAjZW5kaWYsIGV0Yy4uLgogICAgYWRkZWQuCgo1LiAgTmV3ICVkaXNhYmxlZG9jLCAlZW5hYmxlZG9jIGRpcmVjdGl2ZXMgYWxsb3cgZG9jdW1lbnRhdGlvbgogICAgdG8gc2VsZWN0aXZlbHkgYmUgZGlzYWJsZWQgZm9yIGNlcnRhaW4gcGFydHMgb2YgYSB3cmFwcGVyCiAgICBmaWxlLgoKNi4gIE5ldyBQeXRob24gbW9kdWxlIHN1cHBvcnRzIGJldHRlciB2YXJpYWJsZSBsaW5raW5nLCBjb25zdGFudHMsCiAgICBhbmQgc2hhZG93IGNsYXNzZXMuCgo3LiAgUGVybDUgbW9kdWxlIGltcHJvdmVkIHdpdGggYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBYUwogICAgYW5kIHhzdWJwcC4gICBTV0lHIHBvaW50ZXJzIGFuZCBub3cgY3JlYXRlZCBzbyB0aGF0IHRoZXkKICAgIGFyZSBjb21wYXRpYmxlIHdpdGggeHN1YnBwIHBvaW50ZXJzLgoKOC4gIFN1cHBvcnQgZm9yIFtpbmNyIFRjbF0gbmFtZXNwYWNlcyBhZGRlZCB0byBUY2wgbW9kdWxlLgoKOS4gICVwcmFnbWEgZGlyZWN0aXZlIGFkZGVkLgoKMTAuICVhZGRtZXRob2RzIGRpcmVjdGl2ZSBhZGRlZC4KCjExLiAlbmF0aXZlIGRpcmVjdGl2ZSBhZGRlZCB0byBhbGxvdyBwcmUtZXhpc3Rpbmcgd3JhcHBlciBmdW5jdGlvbnMKICAgIHRvIGJlIHVzZWQuCgoxMi4gV3JvdGUgY29uZmlndXJlIHNjcmlwdCBmb3IgU1dJRyBpbnN0YWxsYXRpb24uCgoxMy4gRnVuY3Rpb24gcG9pbnRlcnMgbm93IGFsbG93ZWQgd2l0aCB0eXBlZGVmIHN0YXRlbWVudHMuCgoxNC4gJXR5cGVkZWYgbW9kaWZpZWQgdG8gaW5zZXJ0IGEgY29ycmVzcG9uZGluZyBDIHR5cGVkZWYgaW50bwogICAgdGhlIG91dHB1dCBmaWxlLgoKMTUuIEZpeGVkIHNvbWUgcHJvYmxlbXMgcmVsYXRlZCB0byBDKysgcmVmZXJlbmNlcy4KCjE2LiBOZXcgU3RyaW5nIGFuZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3NlcyBhZGQgdG8gbWFrZSBnZW5lcmF0aW5nCiAgICB3cmFwcGVyIGNvZGUgZWFzaWVyLgoKMTcuIEZpeGVkIGNvbW1hbmQgbGluZSBvcHRpb24gcHJvY2Vzc2luZyB0byBlbGltaW5hdGUgY29yZSBkdW1wcwogICAgYW5kIHRvIGFsbG93IGhlbHAgbWVzc2FnZXMuCgoxOC4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzIHRvIGFsbW9zdCBhbGwgY29kZSBtb2R1bGVzCgoKVmVyc2lvbiAxLjAgQmV0YSAzIChQYXRjaCAxKSBKdWx5IDE3LCAxOTk2Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMS4wIEZpbmFsIGlzIG5vdCBxdWl0ZSByZWFkeSB5ZXQsIGJ1dCB0aGlzIHJlbGVhc2UgZml4ZXMgYQpudW1iZXIgb2YgaW1tZWRpYXRlIHByb2JsZW1zIDoKCjEuICBDb21waWxlciBlcnJvcnMgd2hlbiB1c2luZyAtc3RyaWN0IDEgdHlwZSBjaGVja2luZyBoYXZlIGJlZW4gZml4ZWQuCgoyLiAgUG9pbnRlciB0eXBlIGNoZWNrZXIgbm93IHJlY29nbml6ZXMgcG9pbnRlcnMgb2YgdGhlIGZvcm0KICAgIF8wX1R5cGUgY29ycmVjdGx5LgoKMy4gIEEgZmV3IG1pbm9yIGZpeGVzIHdlcmUgbWFkZSBpbiB0aGUgTWFrZWZpbGUKClZlcnNpb24gMS4wIEJldGEgMyAoSnVuZSAxNCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKClRoZXJlIGFyZSBsb3RzIG9mIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlIDoKCjEuICBTV0lHIGlzIG5vdyBpbnZva2VkIHVzaW5nIHRoZSAic3dpZyIgY29tbWFuZCBpbnN0ZWFkIG9mICJ3cmFwIi4KICAgIEhleSwgc3dpZyBzb3VuZHMgY29vbGVyLgoKMi4gIFRoZSBTV0lHX0xJQiBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgc2V0IHRvIGNoYW5nZSB0aGUKICAgIGxvY2F0aW9uIHdoZXJlIFNXSUcgbG9va3MgZm9yIGxpYnJhcnkgZmlsZXMuCgozLiAgQysrIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuICAgWW91IHNob3VsZCB1c2UgdGhlIC1jKysgb3B0aW9uCiAgICB0byBlbmFibGUgaXQuCgo0LiAgVGhlICVpbml0IGRpcmVjdGl2ZSBoYXMgYmVlbiByZXBsYWNlZCBieSB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuCiAgICAlbW9kdWxlIGNvbnN0cnVjdHMgYSB2YWxpZCBuYW1lIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KICAgIGZvciB3aGF0ZXZlciB0YXJnZXQgbGFuZ3VhZ2UgeW91J3JlIHVzaW5nIChhY3R1YWxseSB0aGlzIG1ha2VzCiAgICBTV0lHIGZpbGVzIGEgbGl0dGxlIGNsZWFuZXIpLiAgVGhlIG9sZCAlaW5pdCBkaXJlY3RpdmUgc3RpbGwgd29ya3MuCgo1LiAgVGhlIHN5bnRheCBvZiB0aGUgJW5hbWUgZGlyZWN0aXZlIGhhcyBiZWVuIGNoYW5nZWQuICAgVXNlIG9mIHRoZQogICAgb2xkIG9uZSBzaG91bGQgZ2VuZXJhdGUgYSB3YXJuaW5nIG1lc3NhZ2UsIGJ1dCBtYXkgc3RpbGwgd29yay4KCjYuICBUbyBzdXBwb3J0IFRjbC9UayBvbiBub24tdW5peCBwbGF0Zm9ybXMsIFNXSUcgaW1wb3J0cyBhIGZpbGUgY2FsbGVkCiAgICBzd2lndGNsLmNmZyBmcm9tIHRoZSAkKFNXSUdfTElCKS90Y2wgZGlyZWN0b3J5LiAgIEkgZG9uJ3QgaGF2ZSBhY2Nlc3MKICAgIHRvIGFuIE5UIG1hY2hpbmUsIGJ1dCB0aGlzIGZpbGUgaXMgc3VwcG9zZWRseSBhbGxvd3MgU1dJRyB0bwogICAgcHJvZHVjZSB3cmFwcGVyIGNvZGUgdGhhdCBjb21waWxlcyBvbiBib3RoIFVOSVggYW5kIG5vbiBVTklYIG1hY2hpbmVzLgogICAgSWYgdGhpcyBkb2Vzbid0IHdvcmssIHlvdSdsbCBoYXZlIHRvIGVkaXQgdGhlIGZpbGUgc3dpZ3RjbC5jZmcuIFBsZWFzZQogICAgbGV0IG1lIGtub3cgaWYgdGhpcyBkb2Vzbid0IHdvcmsgc28gSSBjYW4gdXBkYXRlIHRoZSBmaWxlIGFzCiAgICBuZWNlc3NhcnkuCgo3LiAgVGhlIFNXSUcgcnVuLXRpbWUgdHlwZWNoZWNrZXIgaGFzIGJlZW4gaW1wcm92ZWQuICAgIFlvdSBjYW4gYWxzbwogICAgbm93IHJlZGVmaW5lIGhvdyBpdCB3b3JrcyBieSBzdXBwbHlpbmcgYSBmaWxlIGNhbGxlZCAic3dpZ3B0ci5jZmciCiAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgeW91ciBTV0lHIGludGVyZmFjZSBmaWxlcy4gICBCeSBkZWZhdWx0LAogICAgU1dJRyByZWFkcyB0aGlzIGZpbGUgZnJvbSAkKFNXSUdfTElCKS9jb25maWcuCgo4LiAgVGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGhhcyBiZWVuIGNoYW5nZWQgdG8gc3VwcG9ydCB0aGUgZm9sbG93aW5nIDoKCgktICBEb2N1bWVudGF0aW9uIG9yZGVyIGlzIHByaW50ZWQgaW4gaW50ZXJmYWNlIGZpbGUgb3JkZXIgYnkKICAgICAgICAgICBkZWZhdWx0LiAgIFRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHV0dGluZyBhbiAlYWxwaGEKICAgICAgICAgICBkaXJlY3RpdmUgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgIC0gIFlvdSBjYW4gc3VwcGx5IGFkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbiB0ZXh0IHVzaW5nCgogICAgICAgICAgICV0ZXh0ICV7IHB1dCB5b3VyIHRleHQgaGVyZSAlfQoKICAgICAgICAtICBBIGZldyBtaW5vciBidWdzIHdlcmUgZml4ZWQuCgo5LiAgQSBmZXcgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbiBtYWRlIHRvIHRoZSBoYW5kbGluZyBvZiBjb21tYW5kIGxpbmUKICAgIG9wdGlvbnMgKGJ1dCBpdCdzIHN0aWxsIG5vdCBmaW5pc2hlZCkuCgoxMC4gIExvdHMgb2YgbWlub3IgYnVnIGZpeGVzIGluIG1vc3Qgb2YgdGhlIGxhbmd1YWdlIG1vZHVsZXMgaGF2ZSBiZWVuCiAgICAgbWFkZS4KCjExLiBGaWxlbmFtZXMgaGF2ZSBiZWVuIGNoYW5nZWQgdG8gOC4zIGZvciBjb21wYXRpYmlsaXR5IHdpdGggYSBTV0lHCiAgICBwb3J0IHRvIG5vbi11bml4IHBsYXRmb3JtcyAod29yayBpbiBwcm9ncmVzcykuCgoxMi4gQysrIGZpbGUgc3VmZml4IGlzIG5vdyAuY3h4IChmb3Igc2FtZSByZWFzb24pLgoKMTMuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIHVwZ3JhZGVkIHNpZ25pZmljYW50bHkgYW5kIGlzIG5vdwogICAgYXJvdW5kIDEwMCBwYWdlcy4gICAgSSBhZGRlZCBuZXcgZXhhbXBsZXMgYW5kIGEgc2VjdGlvbiBvbgogICAgQysrLiAgVGhlIGRvY3VtZW50YXRpb24gbm93IGluY2x1ZGVzIGEgVGFibGUgb2YgQ29udGVudHMuCgoxNC4gVGhlIFNXSUcgRXhhbXBsZXMgZGlyZWN0b3J5IGlzIHN0aWxsIHdvZWZ1bGx5IHNwYXJzZSwgYnV0IGlzCiAgICBnZXR0aW5nIGJldHRlci4KClNwZWNpYWwgbm90aWNlIGFib3V0IEMrKwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVGhpcyBpcyB0aGUgZmlyc3QgdmVyc2lvbiBvZiBTV0lHIHRvIHN1cHBvcnQgQysrIHBhcnNpbmcuICBDdXJyZW50bHkKdGhlIEMrKyBpcyBmYXIgZnJvbSBjb21wbGV0ZSwgYnV0IHNlZW1zIHRvIHdvcmsgZm9yIHNpbXBsZSBjYXNlcy4KTm8gd29yayBoYXMgYmVlbiBkb25lIHRvIGFkZCBzcGVjaWFsIEMrKyBwcm9jZXNzaW5nIHRvIGFueSBvZgp0aGUgdGFyZ2V0IGxhbmd1YWdlcy4gICBTZWUgdGhlIHVzZXIgbWFudWFsIGZvciBkZXRhaWxzIGFib3V0IGhvdwpDKysgaXMgaGFuZGxlZC4gICBJZiB5b3UgZmluZCBwcm9ibGVtcyB3aXRoIHRoZSBDKysgaW1wbGVtZW50YXRpb24sCnBsZWFzZSBsZXQgbWUga25vdy4gIEV4cGVjdCBtYWpvciBpbXByb3ZlbWVudHMgaW4gdGhpcyBhcmVhLgoKTm90ZSA6IEkgaGF2ZSBvbmx5IHN1Y2Nlc3NmdWxseSB1c2VkIFNXSUcgYW5kIEMrKyB3aXRoIFRjbCBhbmQKUHl0aG9uLgoKTm90aWNlIGFib3V0IFZlcnNpb24gMS4wRmluYWwKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClZlcnNpb24gMS4wQjMgaXMgdGhlIGxhc3QgQmV0YSByZWxlYXNlIGJlZm9yZSB2ZXJzaW9uIDEuMCBGaW5hbCBpcwpyZWxlYXNlZC4gIEkgaGF2ZSBmcm96ZW4gdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGluIHZlcnNpb24gMS4wCmFuZCB3aWxsIG9ubHkgZml4IGJ1Z3MgYXMgdGhleSBzaG93IHVwLiAgV29yayBvbiBTV0lHIHZlcnNpb24gMi4wIGlzCmFscmVhZHkgaW4gcHJvZ3Jlc3MsIGJ1dCBpcyBnb2luZyB0byByZXN1bHQgaW4gcmF0aGVyIHNpZ25pZmljYW50CmNoYW5nZXMgdG8gU1dJRydzIGludGVybmFsIHN0cnVjdHVyZSAoaG9wZWZ1bGx5IGZvciB0aGUgYmV0dGVyKS4gIE5vCmFudGljaXBhdGVkIGRhdGUgZm9yIHZlcnNpb24gMi4wIGlzIHNldCwgYnV0IGlmIHlvdSd2ZSBnb3QgYW4gaWRlYSwKbGV0IG1lIGtub3cuCgpWZXJzaW9uIDEuMCBCZXRhIDIgKEFwcmlsIDI2LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyByZWxlYXNlIGlzIGlkZW50aWNhbCB0byBCZXRhMSBleGNlcHQgYSBmZXcgbWlub3IgYnVncyBhcmUKZml4ZWQgYW5kIHRoZSBTV0lHIGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNS9UayA0LjEuCkEgdGNsNy41IGV4YW1wbGVzIGRpcmVjdG9yeSBpcyBub3cgaW5jbHVkZWQuCgotIEZpeGVkIGEgYnVnIGluIHRoZSBNYWtlZmlsZSB0aGF0IGRpZG4ndCBpbnN0YWxsIHRoZSBsaWJyYXJpZXMKICBjb3JyZWN0bHkuCgotIFNXSUcgTGlicmFyeSBmaWxlcyBhcmUgbm93IHVwZGF0ZWQgdG8gd29yayB3aXRoIFRjbCA3LjUgYW5kIFRrIDQuMS4KCi0gTWlub3IgYnVnIGZpeGVzIGluIG90aGVyIG1vZHVsZXMuCgoKVmVyc2lvbiAxLjAgQmV0YSAxICAoQXByaWwgMTAsIDE5OTYpLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIGlzIHRoZSBmaXJzdCAic2VtaS1vZmZpY2lhbCIgcmVsZWFzZSBvZiBTV0lHLiAgICBJdCBoYXMgYQpudW1iZXIgb2Ygc3Vic3RhbnRpYWwgaW1wcm92ZW1lbnRzIG92ZXIgdGhlIEFscGhhIHJlbGVhc2UuICAgVGhlc2UKbm90ZXMgYXJlIGluIG5vIHBhcnRpY3VsYXIgb3JkZXItLWhvcGUgSSByZW1lbWJlcmVkIGV2ZXJ5dGhpbmcuLi4uCgoxLiAgVGNsL1RrCgpTV0lHIGlzIGtub3duIHRvIHdvcmsgd2l0aCBUY2w3LjMsIFRrMy42IGFuZCBsYXRlciB2ZXJzaW9ucy4KSSd2ZSBhbHNvIHRlc3RlZCBTV0lHIHdpdGggZXhwZWN0LTUuMTkuCgpOb3JtYWxseSBTV0lHIGV4cGVjdHMgdG8gdXNlIHRoZSBoZWFkZXIgZmlsZXMgInRjbC5oIiBhbmQgInRrLmgiLgpOZXdlciB2ZXJzaW9ucyBvZiBUY2wvVGsgdXNlIHZlcnNpb24gbnVtYmVycy4gICBZb3UgY2FuIHNwZWNpZnkgdGhlc2UKaW4gU1dJRyBhcyBmb2xsb3dzIDoKCiAgICAgICAgJSB3cmFwIC1odGNsIHRjbDcuNC5oIC1odGsgdGs0LjAuaCBleGFtcGxlLmkKCk9mIGNvdXJzZSwgSSBwcmVmZXIgdG8gc2ltcGx5IHNldCB1cCBzeW1ib2xpYyBsaW5rcyBiZXR3ZWVuICJ0Y2wuaCIgYW5kCnRoZSBtb3N0IHJlY2VudCBzdGFibGUgdmVyc2lvbiBvbiB0aGUgbWFjaGluZS4KCjIuICBQZXJsNAoKVGhpcyBpbXBsZW1lbnRhdGlvbiBoYXMgYmVlbiBiYXNlZCBvbiBQZXJsLTQuMDM1LiAgU1dJRydzIGludGVyZmFjZSB0bwpQZXJsNCBpcyBiYXNlZCBvbiB0aGUgZG9jdW1lbnRhdGlvbiBwcm92aWRlZCBpbiB0aGUgIlByb2dyYW1taW5nIFBlcmwiCmJvb2sgYnkgTGFycnkgV2FsbCwgYW5kIGZpbGVzIGxvY2F0ZWQgaW4gdGhlICJ1c3ViIiBkaXJlY3Rvcnkgb2YgdGhlClBlcmw0IGRpc3RyaWJ1dGlvbi4KCkluIG9yZGVyIHRvIGNvbXBpbGUgd2l0aCBQZXJsNCwgeW91J2xsIG5lZWQgdG8gbGluayB3aXRoIHRoZSB1cGVybC5vCmZpbGUgZm91bmQgaW4gdGhlIFBlcmw0IHNvdXJjZSBkaXJlY3RvcnkuICBZb3UgbWF5IHdhbnQgdG8gbW92ZSB0aGlzCmZpbGUgdG8gYSBtb3JlIGNvbnZlbmllbnQgbG9jYXRpb24uCgozLiAgUGVybDUKClRoaXMgaXMgYSBzb21ld2hhdCBleHBlcmltZW50YWwgaW1wbGVtZW50YXRpb24sIGJ1dCBpcyBhbG90IGxlc3MKYnVnZ3kgdGhhbiB0aGUgYWxwaGEgcmVsZWFzZS4gICAgIFNXSUcgb3BlcmF0ZXMgaW5kZXBlbmRlbnRseSBvZgp0aGUgWFMgbGFuZ3VhZ2UgYW5kIHhzdWJwcCBzdXBwbGllZCB3aXRoIFBlcmw1LiAgQ3VycmVudGx5IFNXSUcKcHJvZHVjZXMgdGhlIG5lY2Vzc2FyeSBDIGNvZGUgYW5kIC5wbSBmaWxlIG5lZWRlZCB0byBkeW5hbWljYWxseQpsb2FkIGEgbW9kdWxlIGludG8gUGVybDUuCgpUbyBzdXBwb3J0IFBlcmw1J3Mgbm90aW9uIG9mIG1vZHVsZXMgYW5kIHBhY2thZ2VzIChhcyB3aXRoIHhzdWJwcCksCnlvdSBjYW4gdXNlIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMgOgoKICAgICAgICAlIHdyYXAgLXBlcmw1IC1tb2R1bGUgTXlNb2R1bGUgLXBhY2thZ2UgTXlQYWNrYWdlIGV4YW1wbGUuaQoKTm90ZSA6IEluIG9yZGVyIGZvciBkeW5hbWljIGxvYWRpbmcgdG8gYmUgZWZmZWN0aXZlLCB5b3UgbmVlZCB0byBiZQpjYXJlZnVsIGFib3V0IG5hbWluZy4gICAgRm9yIGEgbW9kdWxlIG5hbWVkICJNeU1vZHVsZSIsIHlvdSdsbCBuZWVkIHRvCmNyZWF0ZSBhIHNoYXJlZCBvYmplY3QgZmlsZSBjYWxsZWQgIk15TW9kdWxlLnNvIiB1c2luZyBzb21ldGhpbmcgbGlrZQoKICAgICAgICAlIGxkIC1zaGFyZWQgbXlfb2JqLm8gLW8gTXlNb2R1bGUuc28KClRoZSB1c2Ugb2YgdGhlICVpbml0IGRpcmVjdGl2ZSBtdXN0IG1hdGNoIHRoZSBtb2R1bGUgbmFtZSBzaW5jZSBQZXJsNQpjYWxscyBhIGZ1bmN0aW9uICJib290X01vZHVsZU5hbWUiIGluIG9yZGVyIHRvIGluaXRpYWxpemUgdGhpbmdzLgpTZWUgdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSBmb3Igc29tZSBleGFtcGxlcyBvZiBob3cgdG8gZ2V0IHRoaW5ncwp0byB3b3JrLgoKNC4gIFB5dGhvbjEuMwoKVGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZSBzdXBwb3J0aW5nIFB5dGhvbi4gICAgVGhlIFB5dGhvbiBwb3J0IGlzCmV4cGVyaW1lbnRhbCBhbmQgbWF5IGJlIHJld3JpdHRlbi4gICBWYXJpYWJsZSBsaW5rYWdlIGlzIGRvbmUgdGhyb3VnaApmdW5jdGlvbnMgd2hpY2ggaXMgc29ydCBvZiBhIGtsdWRnZS4gIEkgYWxzbyB0aGluayBpdCB3b3VsZCBiZSBuaWNlCnRvIGltcG9ydCBTV0lHIHBvaW50ZXJzIGludG8gUHl0aG9uIGFzIGEgbmV3IG9iamVjdCAoaW5zdGVhZCBvZiBzdHJpbmdzKS4KT2YgY291cnNlLCB0aGlzIG5lZWRzIGEgbGl0dGxlIG1vcmUgd29yay4KCjUuICBHdWlsZTMKCklmIHlvdSByZWFsbHkgd2FudCB0byBsaXZlIG9uIHRoZSBlZGdlLCBwaWNrIHVwIGEgY29weSBvZiBHdWlsZS1paWkgYW5kCnBsYXkgYXJvdW5kIHdpdGggdGhpcy4gICAgICBUaGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwtLS1lc3BlY2lhbGx5IHNpbmNlCkknbSBub3Qgc3VyZSB3aGF0IHRoZSBvZmZpY2lhbCBzdGF0ZSBvZiBHdWlsZSBpcyB0aGVzZSBkYXlzLiAgVGhpcwppbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIGF0IGFueSB0aW1lIHNob3VsZCBJIHN1ZGRlbmx5IGZpZ3VyZSBvdXQgYmV0dGVyCndheXMgdG8gZG8gdGhpbmdzLgoKNi4gIEV4dGVuZGluZyBTV0lHCgpTV0lHIGlzIHdyaXR0ZW4gaW4gQysrIGFsdGhvdWdoIEkgdGVuZCB0byB0aGluayBvZiB0aGUgY29kZSBhcyBtb3N0bHkKYmVpbmcgQU5TSSBDIHdpdGggYSBsaXR0bGUgaW5oZXJpdGFuY2UgdGhyb3duIGluLiAgIEVhY2ggdGFyZ2V0IGxhbmd1YWdlCmlzIGltcGxlbWVudGVkIGFzIGEgQysrIGNsYXNzIHRoYXQgY2FuIGJlIHBsdWdnZWQgaW50byB0aGUgc3lzdGVtLgpJZiB5b3Ugd2FudCB0byBhZGQgeW91ciBvd24gbW9kaWZpY2F0aW9ucywgc2VlIEFwcGVuZGl4IEMgb2YgdGhlIHVzZXIKbWFudWFsLiAgIFRoZW4gdGFrZSBhIGxvb2sgYXQgdGhlICJ1c2VyIiBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgc29tZQpjb2RlIGZvciBidWlsZGluZyB5b3VyIG93biBleHRlbmlvbnMuCgo3LiBUaGUgU1dJRyBsaWJyYXJ5CgpUaGUgU1dJRyBsaWJyYXJ5IGlzIHN0aWxsIGluY29tcGxldGUuICBTb21lIG9mIHRoZSBmaWxlcyBtZW50aW9uZWQgaW4KdGhlIHVzZXIgbWFudWFsIGFyZSB1bmF2YWlsYWJsZS4gICAgVGhlc2UgZmlsZXMgd2lsbCBiZSBtYWRlIGF2YWlsYWJsZQp3aGVuIHRoZXkgYXJlIHJlYWR5LiAgIFN1YnNjcmliZSB0byB0aGUgU1dJRyBtYWlsaW5nIGxpc3QgZm9yIGFubm91bmNlbWVudHMKYW5kIHVwZGF0ZXMuCgo4LiBTV0lHIERvY3VtZW50YXRpb24KCkkgaGF2ZSBzb21ldGltZXMgZXhwZXJpZW5jZWQgcHJvYmxlbXMgdmlld2luZyB0aGUgU1dJRyBkb2N1bWVudGF0aW9uIGluCnNvbWUgcG9zdHNjcmlwdCB2aWV3ZXJzLiAgIEhvd2V2ZXIsIHRoZSBkb2N1bWVudGF0aW9uIHNlZW1zIHRvIHByaW50Cm5vcm1hbGx5LiAgICBJJ20gd29ya2luZyBvbiBtYWtpbmcgbXVjaCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvbmxpbmUsCmJ1dCB0aGlzIHRha2VzIHRpbWUuCgpWZXJzaW9uIDAuMSBBbHBoYSAoRmVicnVhcnkgOSwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiAgUnVuLXRpbWUgdHlwZS1jaGVja2luZyBvZiBTV0lHIHBvaW50ZXJzLiAgIFBvaW50ZXJzIGFyZSBub3cgcmVwcmVzZW50ZWQKICAgIGFzIHN0cmluZ3Mgd2l0aCBib3RoIG51bWVyaWMgYW5kIGVuY29kZWQgdHlwZSBpbmZvcm1hdGlvbi4gICAgVGhpcyBtYWtlcwogICAgaXQgYSBsaXR0bGUgaGFyZGVyIHRvIHNob290IHlvdXJzZWxmIGluIHRoZSBmb290IChhbmQgaXQgZWxpbWluYXRlcwogICAgc29tZSBzZWdtZW50YXRpb24gZmF1bHRzIGFuZCBvdGhlciBvZGRpdGllcykuCgoyLiAgUHl0aG9uIDEuMyBub3cgc3VwcG9ydGVkLgoKMy4gICNkZWZpbmUgYW5kIGVudW0gY2FuIGJlIHVzZWQgdG8gaW5zdGFsbCBjb25zdGFudHMuCgo0LiAgQ29tcGxldGVseSByZXdyb3RlIHRoZSAlaW5jbHVkZSBkaXJlY3RpdmUgYW5kIG1hZGUgaXQgYWxvdCBtb3JlIHBvd2VyZnVsLgoKNS4gIFJlc3RydWN0dXJlZCB0aGUgU1dJRyBsaWJyYXJ5IHRvIG1ha2UgaXQgd29yayBiZXR0ZXIuCgo2LiAgVmFyaW91cyBidWcgZml4ZXMgdG8gVGNsLCBQZXJsNCwgUGVybDUsIGFuZCBHdWlsZSBpbXBsZW1lbnRhdGlvbnMuCgo3LiAgQmV0dGVyIGltcGxlbWVudGF0aW9uIG9mICV0eXBlZGVmIGRpcmVjdGl2ZS4KCjguICBNYWRlIHNvbWUgY2hhbmdlcyB0byBTV0lHJ3MgY2xhc3Mgc3RydWN0dXJlIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGV4cGFuZC4KICAgIFNXSUcgaXMgbm93IGJ1aWx0IGludG8gYSBsaWJyYXJ5IGZpbGUgdGhhdCB5b3UgY2FuIHVzZSB0byBtYWtlIHlvdXIKICAgIG93biBleHRlbmlvbnMuCgo5LiAgTWFkZSBleHRlbnNpdmUgY2hhbmdlcyB0byB0aGUgZG9jdW1lbnRhdGlvbi4KCjEwLiBNaW5vciBjaGFuZ2VzIHRvIHRoZSBTV0lHIHBhcnNlciB0byBtYWtlIGl0IHVzZSBsZXNzIG1lbW9yeS4KICAgIEFsc28gdG9vayBvdXQgc29tZSBleHRyYW5lb3VzIHJ1bGVzIHRoYXQgd2VyZSB1bmRvY3VtZW50ZWQgYW5kCiAgICBkaWRuJ3Qgd29yayBpbiB0aGUgZmlyc3QgcGxhY2UuCgoxMS4gVGhlIFNXSUcgbGlicmFyeSBmaWxlcyAidGNsc2giLCAid2lzaCIsICJleHBlY3QiLCBldGMuLi4gaW4gdGhlIGZpcnN0CiAgICByZWxlYXNlIGhhdmUgYmVlbiByZXN0cnVjdHVyZWQgYW5kIHJlbmFtZWQgdG8gInRjbHNoLmkiLCAid2lzaC5pIiwKICAgIGFuZCBzbyBvbi4K