U1dJRyAoU2ltcGxpZmllZCBXcmFwcGVyIGFuZCBJbnRlcmZhY2UgR2VuZXJhdG9yKQoKU2VlIHRoZSBDSEFOR0VTLmN1cnJlbnQgZmlsZSBmb3IgY2hhbmdlcyBpbiB0aGUgY3VycmVudCB2ZXJzaW9uLgpTZWUgdGhlIFJFTEVBU0VOT1RFUyBmaWxlIGZvciBhIHN1bW1hcnkgb2YgY2hhbmdlcyBpbiBlYWNoIHJlbGVhc2UuCklzc3VlICMgbnVtYmVycyBtZW50aW9uZWQgYmVsb3cgY2FuIGJlIGZvdW5kIG9uIEdpdGh1Yi4gRm9yIG1vcmUgZGV0YWlscywgYWRkCnRoZSBpc3N1ZSBudW1iZXIgdG8gdGhlIGVuZCBvZiB0aGUgVVJMOiBodHRwczovL2dpdGh1Yi5jb20vc3dpZy9zd2lnL2lzc3Vlcy8KClZlcnNpb24gMy4wLjEyICgyNyBKYW4gMjAxNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNy0wMS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSAjODgyIEZpeCBtaXNzaW5nIGZpbGVuYW1lIGluIGVycm9yIG1lc3NhZ2VzIHdoZW4gdGhlcmUgaXMgYSBwcm9ibGVtCiAgICAgICAgICAgIHdyaXRpbmcgb3V0IEMjIGZpbGVzLgoKMjAxNy0wMS0yNzogYnJpYW5jYWluZQogICAgICAgICAgICBbR3VpbGVdICM3NDQgRml4IGNvbXBpbGF0aW9uIGVycm9ycyBpbiBHdWlsZSB3cmFwcGVycyAtIHJlZ3Jlc3Npb24KICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTMuMC4xMS4KCjIwMTctMDEtMjQ6IGFuZHJleS1zdGFyb2R1YnRzZXYKICAgICAgICAgICAgW0phdmFdIEFwcGx5ICM3MDQgLSBkaXJlY3RvciB0eXBlbWFwIGltcHJvdmVtZW50cy4KICAgICAgICAgICAgTWVtb3J5IGxlYWsgZml4ZXMsIGFkZCBzdXBwb3J0IGZvciAiZGlyZWN0b3JhcmdvdXQiIHR5cGVtYXAgYW5kCiAgICAgICAgICAgIGFkZCBkaXJlY3RvciBzdXBwb3J0IHRvIHR5cGVtYXBzLmkuCgoyMDE3LTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBFbmhhbmNlICVleHRlbmQgdG8gZXh0ZW5kIGEgY2xhc3Mgd2l0aCB0ZW1wbGF0ZSBjb25zdHJ1Y3RvcnMsIGVnOgoKICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICVleHRlbmQgewogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgICAgICAgICAgICBGb28oaW50IGEsIFQgYikgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vKSBGb286OkZvbzxkb3VibGU+OwoKMjAxNy0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgSXNzdWUgIzg3NiBFbmhhbmNlICVleHRlbmQgdG8gZXh0ZW5kIGEgY2xhc3Mgd2l0aCB0ZW1wbGF0ZSBtZXRob2RzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgICAgICAgICAgdm9pZCBkb19zdHVmZihpbnQgYSwgVCBiKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShkb19zdHVmZl9pbnN0KSBGb286OmRvX3N0dWZmPGRvdWJsZT47CgogICAgICAgICAgICAgIFNpbWlsYXJseSBmb3Igc3RhdGljIHRlbXBsYXRlIG1ldGhvZHMuCgoyMDE3LTAxLTIyOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIGFkZCBzdXBwb3J0IGZvciB2ZXJzaW9uIDQuMgogICAgICAgICAgICAtIFRoZSBPY3RhdmUgQVBJIG5vdyB1c2VzIHNvbWUgQysrMTEgZmVhdHVyZXMuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQogICAgICAgICAgICAgIHRoZSBta29jdGZpbGUgcHJvZ3JhbSBzdXBwbGllZCBieSBPY3RhdmUgdG8gY29tcGlsZSB0aGUgU1dJRy1nZW5lcmF0ZWQKICAgICAgICAgICAgICB3cmFwcGVyIGNvZGUsIGFzIG1rb2N0ZmlsZSB3aWxsIGVuc3VyZSB0aGUgY29ycmVjdCBDKysgY29tcGlsZXIvb3B0aW9ucwogICAgICAgICAgICAgIGFyZSB1c2VkLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBvZiBgbWtvY3RmaWxlIC1wIENYWGAgc2hvdWxkIGJlIHBhcnNlZAogICAgICAgICAgICAgIGZvciBhbnkgLXN0ZD0qIGZsYWdzIHdoaWNoIG1pZ2h0IGJlIHByZXNlbnQuCiAgICAgICAgICAgIC0gT2N0YXZlIGhhcyBkcm9wcGVkIHN1cHBvcnQgZm9yIDw8IGFuZCA+PiBvcGVyYXRvcnMsIHNvIFNXSUcgbm93CiAgICAgICAgICAgICAgaWdub3JlcyB0aGVtLgogICAgICAgICAgICAtIFRoZSBPY3RhdmUgZXJyb3IoKSBmdW5jdGlvbiBub3cgcmFpc2VzIEMrKyBleGNlcHRpb25zIHRvIHByb3BhZ2F0ZQogICAgICAgICAgICAgIE9jdGF2ZSBlcnJvcnMsIHNvICVleGNlcHRpb24gZGlyZWN0aXZlcyBtYXkgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgICAgICAgICBGb3IgY29udmVuaWVuY2UgdGhlIFNXSUdfUkVUSFJPV19PQ1RBVkVfRVhDRVBUSU9OUyBtYWNybyBjYW4gYmUgdXNlZAogICAgICAgICAgICAgIHRvIHJldGhyb3cgYW55IE9jdGF2ZSBleGNlcHRpb25zIGZvciBPY3RhdmUgaXRzZWxmIHRvIGhhbmRsZSwgZS5nLjoKCiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkYWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWF5IGNhbGwgZXJyb3IoKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgU1dJR19SRVRIUk9XX09DVEFWRV9FWENFUFRJT05TICAgLy8gZXJyb3IoKSBleGNlcHRpb25zIGFyZSByZXRocm93bgogICAgICAgICAgICAgICAgY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgZXhjZXB0aW9ucwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE3LTAxLTE2OiB3a2FsaW5pbgogICAgICAgICAgICBbQyNdIEZpeCAjNzMzIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgogICAgICAgICAgICBNaXNzaW5nIHZpcnR1YWwgZnVuY3Rpb24gb3ZlcnJpZGUgaW4gQyMgbGF5ZXIgd2hlbiB1c2luZyAlaW1wb3J0LgoKMjAxNy0wMS0xNjogZnNjaGxpbWIKICAgICAgICAgICAgRml4ICM4MTMgdGVtcGxhdGUgc3ltYm9sIG5hbWUgbG9va3VwIGJ1ZyB3aGVuIHR5cGVkZWYgbmFtZXMgYXJlIHRoZSBzYW1lIGJ1dCBpbiBkaWZmZXJlbnQKICAgICAgICAgICAgbmFtZXNwYWNlcy4KCjIwMTctMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBEIEphdmFdCiAgICAgICAgICAgIFRoZSBTV0lHIGxpYnJhcnkgbm8gbG9uZ2VyIHVzZXMgdGhlIGphdmF0eXBlLCBkdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMsIHRoZXJlYnkKICAgICAgICAgICAgY29tcGxldGVseSBmcmVlaW5nIHRoZW0gdXAgZm9yIHVzZXJzIHRvIHVzZSB3aXRob3V0IGhhdmluZyB0byByZXBsaWNhdGUgdGhlIGxpYnJhcnkKICAgICAgICAgICAgY29kZSB0aGF0IHRoZXkgcHJldmlvdXNseSBhZGRlZC4gVGhlIGNvZGUgcHJldmlvdXNseSBnZW5lcmF0ZWQgYnkgdGhlc2UgdHlwZW1hcHMKICAgICAgICAgICAgaGFzIGJlZW4gcmVwbGFjZWQgYnkgdGhlIG5ldyAlcHJveHljb2RlIGRpcmVjdGl2ZS4gVGhlaXIgdXNlIGluIHRoZSBsaWJyYXJ5IGNvZGUKICAgICAgICAgICAgd2FzIGZhaXJseSBtaW5pbWFsOgoKICAgICAgICAgICAgICBDIyAgIGNzdHlwZTogICBzdGRfYXJyYXkuaSBzdGRfbWFwLmkgc3RkX3ZlY3Rvci5pCiAgICAgICAgICAgICAgRCAgICBkdHlwZTogICAgc3RkX3ZlY3Rvci5pCiAgICAgICAgICAgICAgSmF2YSBqYXZhdHlwZTogYXJyYXlzX2phdmEuaQoKMjAxNy0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlICVleHRlbmQgZGlyZWN0aXZlIGNhbiBub3cgb3B0aW9uYWxseSBzdXBwb3J0IG9uZSBvZiB0aGUgJ2NsYXNzJywgJ3N0cnVjdCcgb3IgJ3VuaW9uJwogICAgICAgICAgICBrZXl3b3JkcyBiZWZvcmUgdGhlIGlkZW50aWZpZXIgbmFtZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHN0cnVjdCBYIHsgLi4uIH07CiAgICAgICAgICAgICAgJWV4dGVuZCBzdHJ1Y3QgWCB7IC4uLiB9CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoaXMgaGFkIHRvIHNwZWNpZmllZCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFggeyAuLi4gfTsKICAgICAgICAgICAgICAlZXh0ZW5kIFggeyAuLi4gfQoKMjAxNy0wMS0xMzogd3NmdWx0b24KCSAgICBbQyMgRCBKYXZhXSBBZGQgbmV3ICVwcm94eWNvZGUgZGlyZWN0aXZlIHdoaWNoIGlzIGEgbWFjcm8gZm9yICVpbnNlcnQoInByb3h5Y29kZSIpLgogICAgICAgICAgICBUaGlzIGlzIGEgd2F5IG9mIGFkZGluZyBwdXJlIEMjL0QvSmF2YSBjb2RlIGludG8gdGhlIGFwcHJvcHJpYXRlIHByb3h5IGNsYXNzLCBlZzoKCiAgICAgICAgICAgICAgJWV4dGVuZCBQcm94eTIgewogICAgICAgICAgICAgICVwcm94eWNvZGUgJXsKICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcHJveHljb2RlMihpbnQgaSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gaSsyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgc3RydWN0IFByb3h5MiB7fTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlcmUgd2lsbCB0aGVuIGJlIGEgcHVyZSBKYXZhL0MjL0QgbWV0aG9kIGNhbGxlZCBwcm94eWNvZGUyIGluIHRoZSBQcm94eTIgY2xhc3MuCgoyMDE2LTEyLTMxOiBhanJoZWFkaW5nMQoJICAgIElzc3VlICM4NjAgLSBSZW1vdmUgdXNlIG9mIHN0ZDo6dW5hcnlfZnVuY3Rpb24gYW5kIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uCiAgICAgICAgICAgIHdoaWNoIGlzIGRlcHJlY2F0ZWQgaW4gQysrMTEuCgoyMDE2LTEyLTMwOiBvbGx5CgkgICAgW1BIUDddIFJlZ2lzdGVyIGludGVybmFsICdzd2lnX3J1bnRpbWVfZGF0YV90eXBlX3BvaW50ZXInIGNvbnN0YW50CgkgICAgYXMgIkNPTlNUX1BFUlNJU1RFTlQiIHRvIGF2b2lkIHNlZ21lbnRhdGlvbiBmYXVsdCBvbiBtb2R1bGUgdW5sb2FkLgoJICAgIEZpeGVzICM4NTkgcmVwb3J0ZWQgYnkgVGltb3RoZXVzIFBva29ycmEuIFRoYW5rcyBhbHNvIHRvIEphdmllciBUb3JyZXMKCSAgICBmb3IgYSBtaW5pbWFsIHJlcHJvZHVjZXIuCgpWZXJzaW9uIDMuMC4xMSAoMjkgRGVjIDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMTItMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkICVmZWF0dXJlKCJjc2RpcmVjdG9yZGVsZWdhdGVtb2RpZmllcnMiKSB0byBlbmFibGUgY3VzdG9taXphdGlvbgogICAgICAgICAgICBvZiB0aGUgZGVsZWdhdGUgYWNjZXNzIG1vZGlmaWVycyBnZW5lcmF0ZWQgaW4gZGlyZWN0b3IgY2xhc3Nlcy4KICAgICAgICAgICAgRml4ZXMgaXNzdWUgIzc0OC4KCjIwMTYtMTItMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBidWlsdGluICJweXRob246c2xvdCIgZmVhdHVyZSBmYWlsaW5nIGZvciB0cF9oYXNoIHdoZW4gdXNpbmcKICAgICAgICAgICAgaGFzaGZ1bmMgY2xvc3VyZSB3aXRoIGEgIldyb25nIHR5cGUgZm9yIGhhc2ggZnVuY3Rpb24iIGZvciBQeXRob24gMi4KICAgICAgICAgICAgSXNzdWUgIzg0My4KCjIwMTYtMTItMjE6IGpvZXF1YW10CiAgICAgICAgICAgIENoYW5nZWQgZ2VuZXJhdGlvbiBvZiBmdW5jdGlvbnMgc28gdGhhdCBvbmx5IGZ1bmN0aW9ucwogICAgICAgICAgICB0aGF0IGVuZCBpbiBfc2V0IGdlbmVyYXRlIGFjY2Vzc29yIGZ1bmN0aW9ucyByYXRoZXIgdGhhbgoJICAgIGxvb2tpbmcgZm9yICJzZXQiLgoJICAgIENoYW5nZSBnZW5lcmF0aW9uIG9mIG9wZXJhdG9ycyB0byBub3QgaGF2ZSB1bmRlcnNjb3JlcwoJICAgIHRvIHN0YXJ0IGluIFIuIFVzZXJzIG5lZWQgdG8gcHJvdmlkZSBjdXN0b20gbmFtZXMgZm9yIHRoZXNlIG9wZXJhdG9yIG92ZXJsb2Fkcy4KCjIwMTYtMTItMjE6IG9sbHkKCSAgICBGaXggaXNmaW5pdGUoKSBjaGVja3MgdG8gd29yayB3aXRoIGFsbCBDKysxMSBjb21waWxlcnMuCgkgICAgRml4ZXMgaXNzdWVzICM2MTUsICM3ODggYW5kICM4NDkuCgoyMDE2LTEyLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICAlbmFtZXdhcm4gdW5uZWNlc3NhcmlseSBjYXVzZWQga2V5d29yZCB3YXJuaW5ncyBmb3Igbm9uLWluc3RhbnRpYXRlZCB0ZW1wbGF0ZSBjbGFzc2VzCiAgICAgICAgICAgIGFuZCBkdXBsaWNhdGUgd2FybmluZ3MgZm9yIGluc3RhbnRpYXRlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdoZW4ga2V5d29yZHMgd2VyZSB1c2VkLgogICAgICAgICAgICBJc3N1ZSAjODQ1LgoKMjAxNi0xMi0xODogZXpyYWxhbmdsb2lzIAogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY3RhdmVdIE1lbW9yeSBsZWFrIGZpeCBvbiBlcnJvciBpbiBzdGQ6OnBhaXIgd3JhcHBlcnMuCiAgICAgICAgICAgIElzc3VlICM4NTEuCgoyMDE2LTEyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBaZXJvIGluaXRpYWxpemUgYXJyYXlzIHdoZW4gdXNpbmcgJWFycmF5X2NsYXNzIGFuZCAlYXJyYXlfZnVuY3Rpb25zLgoKMjAxNi0xMi0xODogdC1pa2VnYW1pCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjNDQ2CiAgICAgICAgICAgIFB5dGhvbiAlYXJyYXlfY2xhc3Mgb2YgY2FycmF5cy5pIGZhaWxlZCB3aXRoIC1idWlsdGluIG9wdGlvbi4KCjIwMTYtMTItMTY6IGJyaWFuY2FpbmUKICAgICAgICAgICAgW0d1aWxlXSBQYXRjaCAjNzQ0IEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlJ3MgbmF0aXZlIHBvaW50ZXIgZnVuY3Rpb25hbGl0eQoKMjAxNi0xMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzc2OS4KICAgICAgICAgICAgQWRkIG9wdGlvbmFsIG1vZHVsZWltcG9ydCBhdHRyaWJ1dGUgdG8gJW1vZHVsZSBzbyB0aGF0IHRoZQogICAgICAgICAgICBkZWZhdWx0IG1vZHVsZSBpbXBvcnQgY29kZSBjYW4gYmUgb3ZlcnJpZGRlbi4gU2VlIHRoZSAiU2VhcmNoaW5nIGZvciB0aGUgd3JhcHBlciBtb2R1bGUiCiAgICAgICAgICAgIGRvY3VtZW50YXRpb24gaW4gUHl0aG9uLmh0bWwuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVtb2R1bGUobW9kdWxlaW1wb3J0PSJpbXBvcnQgX2ZvbyIpIGZvbwoKICAgICAgICAgICAgJG1vZHVsZSBhbHNvIGV4cGFuZHMgdG8gdGhlIGxvdy1sZXZlbCBDL0MrKyBtb2R1bGUgbmFtZSwgc28gdGhlIGZvbGxvd2luZyBpcyB0aGUKICAgICAgICAgICAgc2FtZSBhcyBhYm92ZQoKICAgICAgICAgICAgICAlbW9kdWxlKG1vZHVsZWltcG9ydD0iaW1wb3J0ICRtb2R1bGUiKSBmb28KCjIwMTYtMTEtMzA6IG9sbHkKCSAgICBbUEhQXSBBZGQgc3VwcG9ydCBmb3IgUEhQNy4gIFBIUDUncyBDIGV4dGVuc2lvbiBBUEkgaGFzIGNoYW5nZWQKCSAgICBzdWJzdGFudGlhbGx5IHNvIHlvdSBuZWVkIHRvIHVzZSAtcGhwNyB0byBzcGVjaWZ5IHlvdSB3YW50IFBIUDcKCSAgICBjb21wYXRpYmxlIHdyYXBwZXJzLiAgVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBnZW5lcmF0ZWQgd3JhcHBlcnMKCSAgICBpcyBub3cgLmN4eCAodG8gbWF0Y2ggU1dJRydzIGRlZmF1bHQgZm9yIGV2ZXJ5IG90aGVyIGxhbmd1YWdlIC0gdG8KCSAgICBnZW5lcmF0ZSBmb29fd3JhcC5jcHAgeW91IGNhbiBydW4gU1dJRyB3aXRoIC1jcHBleHQgY3BwKS4gIEZpeGVzCgkgICAgaXNzdWUgIzU3MS4KCgkgICAgQXMgcGFydCBvZiB0aGlzIGNoYW5nZSwgdGhlIGxhbmd1YWdlIHN1YmRpcmVjdG9yeSBmb3IgUEhQNSBoYXMKCSAgICBjaGFuZ2VkIGZyb20gInBocCIgdG8gInBocDUiIC0gaWYgeW91IGFyZSBtYWtpbmcgdXNlIG9mIHRoZSBzZWFyY2gKCSAgICBwYXRoIGZlYXR1cmUgd2hlcmUgdGhlIGxhbmd1YWdlIHN1YmRpcmVjdG9yeSBvZiBlYWNoIGRpcmVjdG9yeQoJICAgIGlzIGFsc28gc2VhcmNoZWQsIHlvdSdsbCBuZWVkIHRvIHVwZGF0ZSB5b3VyIGJpbmRpbmdzLiAgQSBzaW1wbGUKCSAgICBmaXggd2hpY2ggd29ya3MgZm9yIG9sZGVyIGFuZCBuZXdlciBTV0lHIGlzIHRvIGFkZCBhIHN5bWxpbms6CgkgICAgbG4gLXMgcGhwIHBocDUKCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTExLTMwOiBvbGx5CgkgICAgW1BIUF0gT25seSBlbWl0IG9uZSBjb3B5IG9mIGVhY2ggZGlzdGluY3QgYXJnaW5mby4gIFByZXZpb3VzbHkgd2UKCSAgICBlbWl0dGVkIGEgc2VwYXJhdGUgb25lIGZvciBldmVyeSB3cmFwcGVkIGZ1bmN0aW9uLCBidXQgdHlwaWNhbGx5CgkgICAgbWFueSBmdW5jdGlvbnMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgY29tYmluYXRpb25zCgkgICAgb2YgcGFyYW1ldGVycyBwYXNzZWQgYnkgcmVmZXJlbmNlIG9yIG5vdC4KCgkgICAgVGhpcyBjaGFuZ2Ugc2lnbmlmaWNhbnRseSByZWR1Y2VzIGJvdGggdGhlIHNpemUgb2YgdGhlIGdlbmVyYXRlZAoJICAgIHdyYXBwZXIsIGFuZCBvZiB0aGUgY29tcGlsZWQgUEhQIGV4dGVuc2lvbiBtb2R1bGUgKGUuZy4gYnkgfjYlIGZvcgoJICAgIHRoZSBzdHJpcHBlZCBleHRlbnNpb24gbW9kdWxlIGZvciBYYXBpYW4ncyBQSFA3IGJpbmRpbmdzKS4KCjIwMTYtMTEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlcmVuYW1lIG92ZXJyaWRlIG9mIHdpbGRjYXJkICVyZW5hbWUgZm9yIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoR2xvYmFsSW50T3BlcmF0b3IpICo6Om9wZXJhdG9yIGJvb2w7IC8vIHdpbGRjYXJkICVyZW5hbWUKCiAgICAgICAgICAgICAgJXJlbmFtZShYSW50T3BlcmF0b3IpIFg6Om9wZXJhdG9yIGJvb2w7IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGZpcnN0ICVyZW5hbWUgYWJvdmUKICAgICAgICAgICAgICBPUgogICAgICAgICAgICAgICVyZW5hbWUoWEludE9wZXJhdG9yKSBYPGludD46Om9wZXJhdG9yIGJvb2w7IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGZpcnN0ICVyZW5hbWUgYWJvdmUKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFggewogICAgICAgICAgICAgICAgb3BlcmF0b3IgYm9vbCgpOwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoWGludCkgWDxpbnQ+OwoKICAgICAgICAgICAgVGhpcyBhbHNvIGZpeGVzICVyZW5hbWUgb3ZlcnJpZGUgb2YgZ2xvYmFsICVyZW5hbWUgZm9yIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIC8vIEdsb2JhbCByZW5hbWUgdG8gbWFrZSBhbGwgZnVuY3Rpb25zIHN0YXJ0IHdpdGggYSBsb3dlciBjYXNlIGxldHRlcgogICAgICAgICAgICAgICVyZW5hbWUoIiUoZmlyc3Rsb3dlcmNhc2UpcyIsICUkaXNmdW5jdGlvbiApICIiOwogICAgICAgICAgICAgICVyZW5hbWUod29vaG9vKSBXOjpXb287IC8vIGZpeCBub3cgb3ZlcnJpZGVzIGFib3ZlICVyZW5hbWUKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFcgewogICAgICAgICAgICAgICAgVyBXb28oKTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFdpbnQpIFc8aW50PjsKCiAgICAgICAgICAgIFRoZSBhYm92ZSBhbHNvIGludHJvZHVjZXMgYSBwb3NzaWJseSB1bmV4cGVjdGVkIGNoYW5nZS4gTWFueSBvZiB0aGUgU1RMIGNvbnRhaW5lcnMKICAgICAgICAgICAgcHJvdmlkZWQgYnkgU1dJRyB1c2UgJXJlbmFtZSB0byByZW5hbWUgc29tZSBtZXRob2RzLCBlZyBpbiBzdGQ6OnZlY3RvciwgcHVzaF9iYWNrCiAgICAgICAgICAgIGlzIHJlbmFtZWQgdG8gYWRkIGluIEphdmEuIFByZXZpb3VzbHkgdGhpcyBpbnRlbmRlZCByZW5hbWUgZGlkIG5vdCBoYXBwZW4gd2hlbiB1c2luZwogICAgICAgICAgICB1c2luZyBnbG9iYWwgJXJlbmFtZSBydWxlcyBhbmQgdGhlIG1ldGhvZCB3b3VsZCByZW1haW4gYXMgcHVzaF9iYWNrLCBidXQgaXMgbm93CiAgICAgICAgICAgIHJlbmFtZWQgdG8gYWRkLiBTb21lIG1vcmUgaW5mbyBpbiBpc3N1ZSAjODU2LgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMTEtMjY6IG03dGhvbgogICAgICAgICAgICBbUHl0aG9uXSBJc3N1ZSAjNzA5IC0gaW1wcm92ZWQgd3JhcHBpbmcgb2YgZGl2aXNpb24gb3BlcmF0b3JzCiAgICAgICAgICAgICdmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uJyBub3cgd29ya3MgaW4gUHl0aG9uIDIgd2hldGhlciBvciBub3QgdGhlCiAgICAgICAgICAgIC1weTMgZmxhZyBpcyB1c2VkLgoKMjAxNi0xMS0xMjogam9lcXVhbnQKICAgICAgICAgICAgW1JdIElzc3VlICM2OTcgLSBmaXggY29tbWEgaXNzdWUgd2l0aCBvdmVybG9hZCBtZXRob2RzCgoyMDE2LTExLTEyOiBqb2VxdWFudAoJICAgIFtSXSBJc3N1ZSAjNTU1IC0gUiBydW50aW1lIG5lZWRzIHN0ZGlvLmgKCjIwMTYtMTEtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIElzc3VlICM4MTYgLSBmaXggY29tcGlsYXRpb24gZXJyb3Igd2hlbiB1c2luZyAtZXh0cmFuYXRpdmUgYW5kIC1idWlsdGluLgoKMjAxNi0xMS0wMjogbGlvcmdvbGQKICAgICAgICAgICAgUGF0Y2ggIzc0MSAtIEFkZCBzdXBwb3J0IGZvciBDKysxMSBhbGlhcyB0ZW1wbGF0ZXMsIHNlZSB1cGRhdGVkIENQbHVzUGx1czExLmh0bWwKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4KCjIwMTYtMTAtMzA6IG15ZDczNDkKICAgICAgICAgICAgW0MjXSBQYXRjaCAjNzQwIEFkZCBzdGRfYXJyYXkuaSBmb3IgQyMgZm9yIHdyYXBwaW5nIHN0ZDo6YXJyYXkuCgogICAgICAgICAgICBQYXRjaCBhbHNvIGVuaGFuY2VzIHN0ZDo6dmVjdG9yPHN0ZDo6d3N0cmluZz4gQyMgd3JhcHBlcnMgd2l0aCBhZGRpdGlvbmFsIGZ1bmN0aW9ucwogICAgICAgICAgICAoQ29udGFpbnMsIEluZGV4T2YsIExhc3RJbmRleE9mIGFuZCBSZW1vdmUpLgoKMjAxNi0xMC0zMDogdG9iaWxhdQogICAgICAgICAgICBbSmF2YV0gRml4IHdyYXBwZXJzIGZvciB3c3RyaW5nIHBhcmFtZXRlcnMgaW4gZGlyZWN0b3IgbWV0aG9kcyB0byBjbGVhbnVwIGxvY2FsCiAgICAgICAgICAgIHJlZiBhZnRlciBkaXJlY3RvciBjYWxsYmFjayBoYXMgZmluaXNoZWQuCgoyMDE2LTEwLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBtaXNzaW5nIGNzZGlyZWN0b3JpbiBWT0lEX0lOVF9QVFIgYW5kIGNzZGlyZWN0b3JvdXQgVk9JRF9JTlRfUFRSIHR5cGVtYXBzLgoKMjAxNi0xMC0yMzogaml1bG9uZ3cKICAgICAgICAgICAgUGF0Y2ggIzc4MSAtIEZpeCB3cmFwcGluZyBvZiBDIGNvbXBvdW5kIGV4cHJlc3Npb25zIGNvbnRhaW5pbmcgY2hhciBjb25zdGFudHMKICAgICAgICAgICAgaW4gcXVvdGVzIHN1Y2ggYXM6CgogICAgICAgICAgICAgICNkZWZpbmUgSF9TVVBQUkVTU19TQ0FMSU5HX01BR0lDICgoJ3MnPDwyNCkgfCAoJ3UnPDwxNikgfCAoJ3AnPDw4KSB8ICdwJykKCiAgICAgICAgICAgICAgZW51bSBEaWZmZXJlbnRUeXBlcyB7CiAgICAgICAgICAgICAgICB0eXBlY2hhcmNvbXBvdW5kPSdBJysxLAogICAgICAgICAgICAgICAgdHlwZWNoYXJjb21wb3VuZDI9J0InIDw8IDIKICAgICAgICAgICAgICB9OwoKMjAxNi0xMC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSXNzdWUgIzgwOCAtIGZpeCBQeXRob24gcGlja2xpbmcgYW5kIG1ldGFjbGFzcyBmb3IgYnVpbHRpbiB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZSBtZXRhY2xhc3MgKFN3aWdQeU9iamVjdFR5cGUpIGZvciBTV0lHIG9iamVjdHMgd2FzIG5vdCBkZWZpbmVkIGluCiAgICAgICAgICAgIGEgd2F5IHRoYXQgbGV0IGltcG9ydGxpYiBzdWNjZXNzZnVsbHkgaW1wb3J0IHRoZSBQeXRob24gd3JhcHBlcnMuCiAgICAgICAgICAgIFRoZSBwaWNrbGUgbW9kdWxlIHByZXZpb3VzbHkgZmFpbGVkIHRvIHBpY2tsZSBvYmplY3RzIGJlY2F1c2UgaXQgY291bGRuJ3QKICAgICAgICAgICAgZGV0ZXJtaW5lIHdoYXQgbW9kdWxlIHRoZSBTV0lHIHdyYXBwZWQgb2JqZWN0cyB3ZXJlIGluLgoKMjAxNi0wOS0yOTogd3NmdWx0b24KICAgICAgICAgICAgW0FsbGVncm9jbCwgQ0ZGSSwgR08sIEphdmFzY3JpcHQsIE9jYW1sLCBSLCBTY2lsYWJdCiAgICAgICAgICAgIEFkZCBtaXNzaW5nIHN1cHBvcnQgZm9yIHRoZSAicmV0IiB0eXBlbWFwIGluIGEgZmV3IHRhcmdldCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIGFsc28gbm93IGhhcyBpbmZvIG9uIHRoZSAicmV0IiB0eXBlbWFwLgoKMjAxNi0wOS0yNzogYWhtZWQtdXNtYW4KICAgICAgICAgICAgW3htbF0gSGFuZGxlIHRlbXBsYXRlIHBhcmFtZXRlcnMgY29ycmVjdGx5LgoKMjAxNi0wOS0yNzogZG9udHBhbmljOTIKICAgICAgICAgICAgW0dvXSBGaXggYXJndW1lbnQgbmFtZXMgaW4gaW5oZXJpdGVkIGZ1bmN0aW9ucyB0YWtpbmcgbW9yZSB0aGFuIDgKICAgICAgICAgICAgcGFyYW1ldGVycy4gIEZpeGVzICM3OTUuCgoyMDE2LTA5LTI2OiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIG1saXN0cyB0aGF0IG1hcCBwb2ludGVycyBjYW4gYmUgZ2l2ZW4gYSBjdXN0b20gdHlwZSBuYW1lLgoKMjAxNi0wOS0yNTogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzc5MyBmcm9tIHEtcCB0byBleHBhbmQgZXhjZXB0aW9uIGhhbmRsaW5nIHRvIGluY2x1ZGUgc3RkOjpiYWRfY2FzdAogICAgICAgICAgICBpbiBzdGRfZXhjZXB0LmkuCgoyMDE2LTA5LTI0OiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCBjb2RlIGdlbmVyYXRlZCBmb3IgZmVhdHVyZSgiZGlyZWN0b3I6ZXhjZXB0IikgLQogICAgICAgICAgICBwcmV2aW91c2x5IHRoZSByZXR1cm4gdmFsdWUgb2YgY2FsbF91c2VyX2Z1bmN0aW9uKCkgd2FzIGlnbm9yZWQgYW5kCiAgICAgICAgICAgIHdlIGNoZWNrZWQgYW4gdW5pbml0aWFsaXNlZCB2YWx1ZSBpbnN0ZWFkLiAgRml4ZXMgIzYyNy4gIEJhc2VkIG9uCiAgICAgICAgICAgIHBhdGNoIGZyb20gU2VyZ2V5IFNlcm9zaHRhbi4KCjIwMTYtMDktMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1vcmUgZmxleGlibGUgcHl0aG9uIGJ1aWx0aW4gc2xvdHMgZm9yIG92ZXJsb2FkZWQgQysrIGZ1bmN0aW9uLgoKICAgICAgICAgICAgVGhlIGNsb3N1cmUgbmFtZXMgdXNlZCBmb3IgYnVpbHRpbiBzbG90cyBhcmUgbWFuZ2xlZCB3aXRoIHRoZWlyIGZ1bmN0eXBlIHNvCiAgICAgICAgICAgIHRoYXQgb3ZlcmxvYWRlZCBDKysgbWV0aG9kIG5hbWVzIGNhbiBiZSB1c2VkIGZvciBtdWx0aXBsZSBzbG90cy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246c2xvdCIsICJtcF9zdWJzY3JpcHQiLCBmdW5jdHlwZT0iYmluYXJ5ZnVuYyIpIFNpbXBsZUFycmF5OjpfX2dldGl0ZW1fXzsKICAgICAgICAgICAgICAlZmVhdHVyZSgicHl0aG9uOnNsb3QiLCAic3FfaXRlbSIsIGZ1bmN0eXBlPSJzc2l6ZWFyZ2Z1bmMiKSBTaW1wbGVBcnJheTo6X19nZXRpdGVtX18oUHlfc3NpemVfdCBuKTsKCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgY2xvc3VyZXM6CgogICAgICAgICAgICAgIFNXSUdQWV9TU0laRUFSR0ZVTkNfQ0xPU1VSRShfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fXykgLyogZGVmaW5lcyBfd3JhcF9TaW1wbGVBcnJheV9fX2dldGl0ZW1fX19zc2l6ZWFyZ2Z1bmNfY2xvc3VyZSAqLwogICAgICAgICAgICAgIFNXSUdQWV9CSU5BUllGVU5DX0NMT1NVUkUoX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX18pIC8qIGRlZmluZXMgX3dyYXBfU2ltcGxlQXJyYXlfX19nZXRpdGVtX19fYmluYXJ5ZnVuY19jbG9zdXJlICovCgogICAgICAgICAgICBQcmV2aW91c2x5IG9ubHkgb25lIG5hbWUgd2FzIGRlZmluZWQ6IF93cmFwX1NpbXBsZUFycmF5X19fZ2V0aXRlbV9fX2Nsb3N1cmUuCiAgICAgICAgICAgIEhlbmNlIHRoZSBvdmVybG9hZGVkIF9fZ2V0aXRlbV9fIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBzdXBwb3J0IGJvdGggbXBfc3Vic2NyaXB0IGFuZCBzcV9pdGVtIHNsb3RzLgoKMjAxNi0wOS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRml4IGl0ZXJhdG9ycyBmb3IgY29udGFpbmVycyBvZiBOVUxMIHBvaW50ZXJzIChvciBQeXRob24gTm9uZSkgd2hlbiB1c2luZwogICAgICAgICAgICAtYnVpbHRpbi4gUHJldmlvdXNseSBpdGVyYXRpb24gd291bGQgc3RvcCBhdCB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IHdhcyBOVUxMLgoKMjAxNi0wOS0xNjogb2xseQogICAgICAgICAgICBbSmF2YXNjcmlwdF0gRml4IFNXSUdfZXhjZXB0aW9uKCkgbWFjcm8gdG8gcmV0dXJuIGZyb20gdGhlIGN1cnJlbnQKICAgICAgICAgICAgZnVuY3Rpb24uICBGaXhlcyAjNzg5LCByZXBvcnRlZCBieSBKdWxpZW4gRHV0cmlhdXguCgoyMDE2LTA5LTE2OiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCBTV0lHX2V4Y2VwdGlvbigpIG1hY3JvIHRvIHJldHVybiBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgogICAgICAgICAgICBGaXhlcyAjMjQwLCByZXBvcnRlZCBieSBTZXJnZXkgU2Vyb3NodGFuLgoKMjAxNi0wOS0xMjogeHlwcm9uCiAgICAgICAgICAgIFtDI10gUGF0Y2ggIzc4NiBLZXl3b3JkIHJlbmFtZSB0byBiZSBDTFMgY29tcGxpYW50IGJ5IGFkZGluZyBhbiB1bmRlcnNjb3JlCiAgICAgICAgICAgIHN1ZmZpeCBpbnN0ZWFkIG9mIGFuIHVuZGVyc2NvcmUgcHJlZml4IHRvIHRoZSBDIHN5bWJvbCBuYW1lLiBQbGVhc2UgdXNlIGFuIGV4cGxpY2l0CiAgICAgICAgICAgICVyZW5hbWUgdG8gcmVuYW1lIHRoZSBzeW1ib2wgd2l0aCBhIF8gcHJlZml4IGlmIHlvdSB3YW50IHRoZSBvbGQgc3ltYm9sIG5hbWUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTYtMDktMDk6IG9sbHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IGltcG9ydCBoYW5kbGluZyBmb3IgUHl0aG9uIDIuNiB0byB3b3JrIGluIGEgZnJvemVuCiAgICAgICAgICAgIGFwcGxpY2F0aW9uLiAgRml4ZXMgIzE0NSwgcmVwb3J0ZWQgYnkgVGhvbWFzIEtsdXl2ZXIuCgoyMDE2LTA5LTAyOiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdIFBvaW50ZXJzIGFyZSBtYXBwZWQgdG8gbWxpc3QgaW5zdGVhZCBvZiB0bGlzdAogICAgICAgICAgICAobWxpc3QgYmV0dGVyIGZvciBzY2lsYWIgb3ZlcmxvYWRpbmcpCgoyMDE2LTA5LTAyOiBvbGx5CiAgICAgICAgICAgIFtQSFBdIEZpeCAib3V0IiB0eXBlbWFwIGZvciBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgYW5kICJpbiIKICAgICAgICAgICAgdHlwZW1hcCBmb3IgY2hhciBJTlBVVFtBTlldLgoKMjAxNi0wOS0wMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gTW9yZSBlZmZpY2llbnQgUHl0aG9uIHNsaWNpbmcuCiAgICAgICAgICAgIENhbGwgcmVzZXJ2ZSBmb3IgY29udGFpbmVyIHR5cGVzIHRoYXQgc3VwcG9ydCBpdCB0byBhdm9pZCByZXBlYXRlZAogICAgICAgICAgICBtZW1vcnkgcmVhbGxvY2F0aW9ucyBmb3IgbmV3IHNsaWNlcyBvciBzbGljZXMgdGhhdCBncm93IGluIHNpemUuCgoyMDE2LTA5LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNzcxIC0gTWFrZSBidWlsdGluIHR5cGVzIGhhc2hhYmxlIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgIERlZmF1bHQgaGFzaCBpcyB0aGUgdW5kZXJseWluZyBDL0MrKyBwb2ludGVyLiBUaGlzIG1hdGNoZXMgdXAgd2l0aCB0ZXN0aW5nIGZvcgogICAgICAgICAgICBlcXVpdmFsZW5jZSAoUHlfRVEgaW4gU3dpZ1B5T2JqZWN0X3JpY2hjb21wYXJlKSB3aGljaCBjb21wYXJlcyB0aGUgcG9pbnRlcnMuCgoyMDE2LTA4LTIyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBUaGUgZm9sbG93aW5nIGJ1aWx0aW4gc2xvdHMgY2FuIGJlIGN1c3RvbWl6ZWQgbGlrZSBvdGhlciBzbG90cyB2aWEgdGhlCiAgICAgICAgICAgICJweXRob246PHg+IiBhbmQgInB5dGhvbjpzbG90IiBmZWF0dXJlcyB3aGVyZSA8eD4gaXMgdGhlIGFwcHJvcHJpYXRlIHNsb3QgbmFtZToKICAgICAgICAgICAgICB0cF9hbGxvY3MKICAgICAgICAgICAgICB0cF9iYXNlcwogICAgICAgICAgICAgIHRwX2Jhc2ljc2l6ZQogICAgICAgICAgICAgIHRwX2NhY2hlCiAgICAgICAgICAgICAgdHBfZGVsCiAgICAgICAgICAgICAgdHBfZGVhbGxvYwogICAgICAgICAgICAgIHRwX2ZsYWdzCiAgICAgICAgICAgICAgdHBfZnJlZXMKICAgICAgICAgICAgICB0cF9nZXRzZXQKICAgICAgICAgICAgICB0cF9pc19nYwogICAgICAgICAgICAgIHRwX21heGFsbG9jCiAgICAgICAgICAgICAgdHBfbWV0aG9kcwogICAgICAgICAgICAgIHRwX21ybwogICAgICAgICAgICAgIHRwX25ldwogICAgICAgICAgICAgIHRwX25leHQKICAgICAgICAgICAgICB0cF9wcmV2CiAgICAgICAgICAgICAgdHBfcmljaGNvbXBhcmUKICAgICAgICAgICAgICB0cF9zdWJjbGFzc2VzCiAgICAgICAgICAgICAgdHBfd2Vha2xpc3QKICAgICAgICAgICAgICB3YXNfc3FfYXNzX3NsaWNlCiAgICAgICAgICAgICAgd2FzX3NxX3NsaWNlCgogICAgICAgICAgICBBIGZldyBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cyBmb3Igc2xvdCBjdXN0b21pemF0aW9uLgoKMjAxNi0wOC0wOTogam9lcXVhbnQKICAgICAgICAgICAgW1JdIFBhdGNoICM3NjUgRml4IGV4dGVybiAiQyIgaGVhZGVyIGluY2x1ZGVzIGZvciBDKysgY29kZS4KCjIwMTYtMDgtMDU6IG9sbHkKICAgICAgICAgICAgW3htbF0gRml4IGhvdyB0aGUgb3V0cHV0IGZpbGVuYW1lIGlzIGJ1aWx0IHRvIGF2b2lkIHByb2JsZW1zIHdoZW4KICAgICAgICAgICAgaXQgY29udGFpbnMgdGhlIGVtYmVkZGVkIHN0cmluZ3MgIi5jIiwgIi5jcHAiIG9yICIuY3h4Ii4KICAgICAgICAgICAgRml4ZXMgIzU0MCByZXBvcnRlZCBieSBkamFjazQyLgoKMjAxNi0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGNvcm5lciBjYXNlIG9mIHdyYXBwaW5nIHN0ZDo6dmVjdG9yIG9mIFQgcG9pbnRlcnMgd2hlcmUgYSBwb2ludGVyIHRvIGEgcG9pbnRlciBvZiBUCiAgICAgICAgICAgIGFsc28gZXhpc3RzIGluIHRoZSB3cmFwcGVkIGNvZGUuIFNGIEJ1ZyAyMzU5NDE3ICg5NjcpLgoKMjAxNi0wNi0yNjogd2thbGluaW4KICAgICAgICAgICAgW0phdmEsIEMjXSBQYXRjaCAjNjgxIEZpeCBzZWcgZmF1bHQgd2hlbiBpZ25vcmluZyBuZXN0ZWQgY2xhc3Nlcy4KCjIwMTYtMDYtMjU6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dICM3MTEgRml4IC1jYXN0bW9kZSBhbmQgY29udmVyc2lvbiBvZiBzaWduZWQgYW5kIHVuc2lnbmVkIGludGVnZXIgdHlwZXMuCiAgICAgICAgICAgIFNlZSAyMDE1LTEyLTIzIENIQU5HRVMgZW50cnkgZm9yIGRldGFpbHMgb2YgdGhlc2UgaW1wcm92ZW1lbnRzIHdoZW4gdGhleSB3ZXJlCiAgICAgICAgICAgIGltcGxlbWVudGVkIGZvciB0aGUgZGVmYXVsdCBvcHRpb25zIChpZSBub3QgdXNpbmcgLWNhc3Rtb2RlKS4KCjIwMTYtMDYtMjU6IGFobm9sZHMKICAgICAgICAgICAgUGF0Y2ggIzczMCAtIEZpeCAlaW1wbGljaXRjb252IGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyB3aGVuIHVzaW5nCiAgICAgICAgICAgIC1jYXN0bW9kZSBvciAtZmFzdGRpc3BhdGNoIG9wdGlvbnMuCgogICAgICAgICAgICBUaGUgcmVzdWx0IGlzIHRoYXQgaW4gYWxsIG92ZXJsb2FkIGNhc2VzIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBwb3NzaWJpbGl0aWVzCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIGFyZ3VtZW50cywgdGhlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpbGwgZmlyc3QgY2hlY2sgZm9yCiAgICAgICAgICAgIGV4YWN0IChha2Egbm9uIGltcGxpY2l0KSBtYXRjaGVzLCBhbmQgdGhlbiBzdWJzZXF1ZW50bHkgY2hlY2sgZm9yIGltcGxpY2l0CiAgICAgICAgICAgIGNhc3RpbmcgbWF0Y2hlcy4gVGhpcyB3YXMgYWxyZWFkeSBoYXBwZW5pbmcgaW4gdGhlIG5vcm1hbCBkaXNwYXRjaCBzaXR1YXRpb24sCiAgICAgICAgICAgIGFuZCBpbiB0aGUgLWZhc3RkaXNwYXRjaCBjYXNlIHR3byBwYXNzZXMgdGhyb3VnaCB0aGUgY2FuZGlkYXRlcyB3ZXJlIGhhcHBlbmluZywKICAgICAgICAgICAganVzdCB3aXRoIFNXSUdfUE9JTlRFUl9JTVBMSUNJVF9DT05WIGFsd2F5cyBzZXQuIEFmdGVyIHRoaXMgcGF0Y2gsIGl0IGlzIG5vdCBzZXQKICAgICAgICAgICAgb24gdGhlIGZpcnN0IHBhc3MsIGFuZCB0aGVuIHNldCBvbiB0aGUgc2Vjb25kIHBhc3MuCgoyMDE2LTA2LTI1OiBsaW9yZ29sZAogICAgICAgICAgICBQYXRjaCAjNzI3IC0gQWRkIHN1cHBvcnQgZm9yIEMrKzExIHR5cGUgYWxpYXNpbmcuCgpWZXJzaW9uIDMuMC4xMCAoMTIgSnVuIDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTYtMDYtMDY6IG1yb21iZXJnCiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICM2OTguIEFkZCBzdXBwb3J0IGZvciAtcmVsYXRpdmVpbXBvcnQgZm9yIHB5dGhvbiAyLjcsIHNvIC1weTMgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIGFsc28gcmVxdWlyZWQgZm9yIHJlbGF0aXZlIGltcG9ydCBzdXBwb3J0LgoKMjAxNi0wNi0wNTogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzY5NCAtIEZpeCBwYWNrYWdlIGltcG9ydCByZWdyZXNzaW9ucyBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjkuCgogICAgICAgICAgICAxKSBUaGUgY29kZSBpbiAzLjAuOSBkaWQgbm90IGZhbGwgYmFjayB0byAnaW1wb3J0IF9mb28nIGlmICdpbXBvcnQgYmFyLl9mb28nIGZhaWxlZAogICAgICAgICAgICAoYXNzdW1pbmcgYmFyLmZvbyB3YXMgdGhlIG1haW4gbW9kdWxlKS4gRXZlcnkgcGxhY2UgX2ZvbyBpcyBpbXBvcnRlZCBub3cgZmlyc3QgdHJpZXMKICAgICAgICAgICAgaXQgZnJvbSB0aGUgcGFja2FnZSB3aGVyZSBmb28gd2FzIGZvdW5kIGFuZCBpZiB0aGF0IGZhaWxzIHRyaWVzIF9mb28gYXMgYSBnbG9iYWwgbW9kdWxlLgoKICAgICAgICAgICAgMikgVGhlIHNlcGFyYXRlIGJsb2NrIG9mIFB5dGhvbiBjb2RlIHRoYXQgaW5qZWN0ZWQgY29kZSB0byBwdWxsIGluIHRoZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZyb20gX2ZvbyB3aGVuIC1idWlsdGluIGlzIHVzZWQgbWFkZSB1c2Ugb2YgdGhlIC1weTMgc3dpdGNoIHRvIGVpdGhlciBkbwogICAgICAgICAgICAnZnJvbSAuX2ZvbyBpbXBvcnQgKicgb3IgImZyb20gX2ZvbyBpbXBvcnQgKiIuIFRoaXMgYmxvY2sgb2YgY29kZSBubyBsb25nZXIgZG9lcyB0aGlzCiAgICAgICAgICAgIGFuZCBpbnN0ZWFkIGNoZWNrcyB0aGUgUHl0aG9uIHZlcnNpb24gYXQgcnVudGltZSB0byBzd2l0Y2ggYmV0d2VlbiB0aGUgdHdvIHN5bnRheGVzLgoKICAgICAgICAgICAgSW4gc3VtbWFyeSwgc3dpZy0zLjAuMTAgaGFzIGJlZW4gbW9kaWZpZWQgdG8gZWFzZSB0aGUgY3JlYXRpb24gb2Ygd3JhcHBlciBtb2R1bGVzCiAgICAgICAgICAgIHRoYXQgY2FuIGJlIGZ1bGx5IG1hZGUgcGFydCBvZiBhIFB5dGhvbiBwYWNrYWdlLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICAgYXNzdW1lcyB0aGUgZHluYW1pY2FsbHkgbGlua2VkIEMgbW9kdWxlIGlzIGEgZ2xvYmFsIG1vZHVsZS4KICAgICAgICAgICAgVGhlIGR5bmFtaWMgbW9kdWxlIGNhbiBub3cgYmUgcGxhY2VkIGludG8gZWl0aGVyIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIHB1cmUgUHl0aG9uCiAgICAgICAgICAgIG1vZHVsZSBvciBhcyBhIGdsb2JhbCBtb2R1bGUuICBCb3RoIGxvY2F0aW9ucyBhcmUgdXNlZCBieSB0aGUgUHl0aG9uIHdyYXBwZXIgdG8KICAgICAgICAgICAgbG9jYXRlIHRoZSBDIG1vZHVsZS4KCiAgICAgICAgICAgIEhvd2V2ZXIsIHRoaXMgY291bGQgY2F1c2UgYSBiYWNrd2FyZHMgaW5jb21wYXRpYmlsaXR5IHdpdGggc29tZSBjb2RlCiAgICAgICAgICAgIHRoYXQgd2FzIHJlbHlpbmcgb24gdGhlIGFiaWxpdHkgb2YgImZyb20gcGFja2FnZSBpbXBvcnQgX21vZHVsZSIgdG8KICAgICAgICAgICAgcHVsbCBhdHRyaWJ1dGVzIG91dCBvZiB0aGUgcGFja2FnZSBkaXJlY3RseS4gIElmIHlvdXIgY29kZSBwb3B1bGF0ZXMgYQogICAgICAgICAgICBtb2R1bGUgKHdoaWNoIGlzIGFsc28gYSBwYWNrYWdlKSB3aXRoIGF0dHJpYnV0ZXMgdGhhdCBhcmUgU1dJRwogICAgICAgICAgICBnZW5lcmF0ZWQgbW9kdWxlcyB3aGljaCB3ZXJlIG5vdCBsb2FkZWQgaW4gYSBjb252ZW50aW9uYWwgd2F5LAogICAgICAgICAgICBzd2lnLTMuMC44IGFuZCBlYXJsaWVyIG1heSBoYXZlIHdvcmtlZCBkdWUgdG8gJ2Zyb20gcGFja2FnZSBpbXBvcnQKICAgICAgICAgICAgX21vZHVsZScgYnlwYXNzaW5nIGEgcmVhbCBpbXBvcnQgYW5kIHB1bGxpbmcgeW91ciBtb2R1bGUgaW4gYXMgYW4KICAgICAgICAgICAgYXR0cmlidXRlLiBUaGlzIHdpbGwgbm8gbG9uZ2VyIHdvcmsuICBTaW5jZSB0aGlzIGlzIG5vdCBhIGNvbW1vbiAob3IKICAgICAgICAgICAgZXZlbiByZWNvbW1lbmRlZCkgcHJhY3RpY2UsIG1vc3QgZm9sayBzaG91bGQgbm90IGJlIGFmZmVjdGVkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTA1LTMxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzY5MCAtIFNtYXJ0IHBvaW50ZXIgdG8gJWlnbm9yZWQgY2xhc3MgZG9lc24ndCBleHBvc2UgaW5oZXJpdGVkIG1ldGhvZHMuCiAgICAgICAgICAgIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTMuMC45LgoKVmVyc2lvbiAzLjAuOSAoMjkgTWF5IDIwMTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNi0wNS0yNDogbXJvbWJlcmcKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxMiAtIEFkZCBzdXBwb3J0IGZvciBQeXRob24ncyBpbXBsaWNpdCBuYW1lc3BhY2UgcGFja2FnZXMuCgoyMDE2LTA1LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICM2MDIgLSBFcnJvciBoYW5kbGluZyByZWdyZXNzaW9uIG9mIG9wYXF1ZSBwb2ludGVycyBpbnRyb2R1Y2VkCiAgICAgICAgICAgIGluIHN3aWctMy4wLjggd2hlbiBDIGZ1bmN0aW9ucyBleHBsaWNpdGx5IHJlc2V0IGEgcG9pbnRlciB1c2luZyAnREFUQV9QVFIoc2VsZikgPSAwJy4KICAgICAgICAgICAgQW4gT2JqZWN0UHJldmlvdXNseURlbGV0ZWQgZXJyb3Igd2FzIGluY29ycmVjdGx5IHRocm93biB3aGVuIHRoZSBwb2ludGVyIHdhcyB1c2VkCiAgICAgICAgICAgIGFzIGEgcGFyYW1ldGVyLgoKMjAxNi0wNS0xNzogdGFtdXJhdGFrCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjNjUxIC0gQ29ycmVjdCBvdmVybG9hZGVkIGZ1bmN0aW9uIGVycm9yIG1lc3NhZ2Ugd2hlbiBmdW5jdGlvbiBpcwogICAgICAgICAgICB1c2luZyAlbmV3b2JqZWN0LgoKMjAxNi0wNS0xNzogYXVyZWxqCiAgICAgICAgICAgIFtSdWJ5XSBQYXRjaCAjNTgyIC0gYWRkIHN1cHBvcnQgZm9yIGRvY3N0cmluZyBvcHRpb24gaW4gJW1vZHVsZSgpCgoyMDE2LTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQzNCAtIFBhc3NpbmcgY2xhc3NlcyBieSB2YWx1ZSBhcyBwYXJhbWV0ZXJzIGluIGRpcmVjdG9yIG1ldGhvZHMgZGlkIG5vdCBjcmVhdGUKICAgICAgICAgICAgYSBjb3B5IG9mIHRoZSBhcmd1bWVudCBsZWFkaW5nIHRvIGludmFsaWQgbWVtb3J5IGFjY2Vzc2VzIGlmIHRoZSBvYmplY3Qgd2FzIHVzZWQKICAgICAgICAgICAgYWZ0ZXIgdGhlIHVwY2FsbCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIFBhc3NpbmcgYXJndW1lbnRzIGJ5IHZhbHVlIHNob3VsZG4ndCBnaXZlCiAgICAgICAgICAgIHJpc2UgdG8gdGhlc2Ugc29ydHMgb2YgbWVtb3J5IHByb2JsZW1zIGFuZCBzbyB0aGUgb2JqZWN0cyBhcmUgbm93IGNvcGllZCBhbmQgb3duZXJzaGlwCiAgICAgICAgICAgIG9mIHRoZWlyIGxpZmV0aW1lIGlzIGNvbnRyb2xsZWQgYnkgdGhlIHRhcmdldCBsYW5ndWFnZS4KCjIwMTYtMDUtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjExLiBGaXggYXNzZXJ0aW9uIGhhbmRsaW5nIGRlZmF1bHRhcmdzIHdoZW4gdXNpbmcgJWV4dGVuZCBmb3IgYSB0ZW1wbGF0ZQogICAgICAgICAgICBjbGFzcyBhbmQgdGhlIGV4dGVuZGVkIG1ldGhvZHMgY29udGFpbiBkZWZhdWx0IGFyZ3VtZW50cy4KCjIwMTYtMDUtMDU6IGVqdWxpYW4KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxNy4gRml4IG9wZXJhdG9yLyB3cmFwcGVycy4KCjIwMTYtMDUtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNjY5LiBEb24ndCBpc3N1ZSB3YXJuaW5nIGFib3V0IGlnbm9yaW5nIGJhc2UgY2xhc3NlcyB3aGVuIHRoZSBkZXJpdmVkIGNsYXNzIGlzCiAgICAgICAgICAgIGl0c2VsZiBpZ25vcmVkLgoKMjAxNi0wNC0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeCB1c2Ugb2YgZ29vdXQgdHlwZW1hcCB3aGVuIGNhbGxpbmcgYmFzZSBtZXRob2QgYnkKCSAgICBmb3JjaW5nIHRoZSAidHlwZSIgYXR0cmlidXRlIHRvIHRoZSB2YWx1ZSB3ZSBuZWVkLgoKMjAxNi0wNC0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEZpeGVzIGZvciBHbyAxLjY6IGF2b2lkIHJldHVybmluZyBHbyBwb2ludGVycyBmcm9tCgkgICAgZGlyZWN0b3JzIHRoYXQgcmV0dXJuIHN0cmluZyB2YWx1ZXM7IGFkZCBhIHRyYWlsaW5nIDAgYnl0ZQoJICAgIHdoZW4gdHJlYXRpbmcgR28gc3RyaW5nIGFzIEMgY2hhciouCgoyMDE2LTA0LTA2OiBzbWFyY2hldHRvCiAgICAgICAgICAgIFtTY2lsYWJdICM1NTIgTWFrZSBTY2lsYWIgcnVudGltZSBrZWVwIHRyYWNrIG9mIHBvaW50ZXIgdHlwZXMKICAgICAgICAgICAgSW5zdGVhZCBvZiBhIFNjaWxhYiBwb2ludGVyIHdoaWNoIGhhcyBubyB0eXBlLCBTV0lHIFNjaWxhYiBtYXBzIGEKICAgICAgICAgICAgcG9pbnRlciB0byBhIHN0cnVjdHVyZSB0bGlzdCBjb250YWluaW5nIHRoZSBwb2ludGVyIGFkcmVzcyBhbmQgaXRzIHR5cGUuCgoyMDE2LTA0LTAyOiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5ICM1OTguIEZpeCBtaXNsZWFkaW5nIGVycm9yIG1lc3NhZ2Ugd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgYSBub24tZXhpc3RlbnQKICAgICAgICAgICAgYXR0cmlidXRlLiBUaGUgcHJldmlvdXMgY3J5cHRpYyBlcnJvciBtZXNzYWdlOgogICAgICAgICAgICAgIEF0dHJpYnV0ZUVycm9yOiB0eXBlIG9iamVjdCAnb2JqZWN0JyBoYXMgbm8gYXR0cmlidXRlICdfX2dldGF0dHJfXycKICAgICAgICAgICAgaXMgbm93IHJlcGxhY2VkIHdpdGggb25lIG1lbnRpb25pbmcgdGhlIGF0dHJpYnV0ZSBuYW1lLCBlZzoKICAgICAgICAgICAgICBBdHRyaWJ1dGVFcnJvcjogJ0Zvbycgb2JqZWN0IGhhcyBubyBhdHRyaWJ1dGUgJ2JhcicKCjIwMTYtMDQtMDI6IGRlcmt1Y2kKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzYxMCB0byBmaXggIzYwNy4KICAgICAgICAgICAgRml4IHNpbmdsZSBhcmd1bWVudHMgd2hlbiB1c2luZyBweXRob24gLWJ1aWx0aW4gLU8gd2l0aCAlZmVhdHVyZSgiY29tcGFjdGRlZmF1bHRhcmdzIikKCjIwMTYtMDMtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzICM1OTQuIEZpeCBhc3NlcnRpb24gZm9yIHNvbWUgbGFuZ3VhZ2VzIHdoZW4gd3JhcHBpbmcgYSBDKysxMSBlbnVtIGNsYXNzIHRoYXQKICAgICAgICAgICAgaXMgcHJpdmF0ZSBpbiBhIGNsYXNzLgoKICAgICAgICAgICAgQWxzbyBkb24ndCB3cmFwIHByaXZhdGUgZW51bXMgZm9yIGEgZmV3IGxhbmd1YWdlcyB0aGF0IGF0dGVtcHRlZCB0byBkbyBzby4KCjIwMTYtMDMtMzE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSB1bnNpZ25lZCBsb25nIGxvbmcgbWFyc2hhbGxpbmcgaW1wcm92ZW1lbnRzIHdoZW4gYSBuZWdhdGl2ZSBudW1iZXIKICAgICAgICAgICAgaXMgcGFzc2VkIGZyb20gSmF2YSB0byBDLiBBIGNhc3QgdG8gc2lnbmVkIGxvbmcgbG9uZyBpbiB0aGUgQyBsYXllciB3aWxsIG5vdwogICAgICAgICAgICByZXN1bHQgaW4gdGhlIGV4cGVjdGVkIHZhbHVlLiBObyBjaGFuZ2UgZm9yIHBvc2l0aXZlIG51bWJlcnMgcGFzc2VkIHRvIEMuCiAgICAgICAgICAgIEZpeGVzICM2MjMuCgoyMDE2LTAzLTIyOiBhbGV4d2FyZwoJICAgIFtMdWFdICMzOTggRml4IGx1YSBfX2dldGl0ZW0gKyBpbmhlcml0YW5jZQogICAgICAgICAgICBUaGUgbmV3IGhhbmRsaW5nIG9mIGNsYXNzZXMgaW4gTHVhIChub3QgbWVyZ2luZyBtZXRob2RzIGludG8gdGhlIGRlcml2ZWQgY2xhc3NlcykKICAgICAgICAgICAgYnJlYWtzIGZvciBjbGFzc2VzIHRoYXQgcHJvdmlkZSBhIF9fZ2V0aXRlbSBmdW5jdGlvbi4gVGhlIF9fZ2V0aXRlbSBmdW5jdGlvbgogICAgICAgICAgICBwcmV2ZW50cyBtZXRob2QgY2FsbHMgdG8gYW55IG1ldGhvZCBkZWZpbmVkIGluIGEgYmFzZSBjbGFzcy4gVGhpcyBmaXggY2FsbHMKICAgICAgICAgICAgX19nZXRpdGVtIG9ubHkgaWYgdGhlIG1lbWJlciBpcyBub3QgZm91bmQgdXNpbmcgcmVjdXJzaXZlIGxvb2t1cC4KCjIwMTYtMDMtMTg6IHB0b211bGlrCgkgICAgW1B5dGhvbl0gIzU2MyBTdG9wIGdlbmVyYXRpbmcgdW5uZWNlc3NhcnkgX3N3aWdjb25zdGFudCBoZWxwZXJzLgoKMjAxNi0wMy0xNjogcmljaGFyZGJlYXJlCgkgICAgW1JdICM2MzYgQWRkIGV4dHJhIHN0ZDo6dmVjdG9yIG51bWVyaWMgdHlwZXMKCjIwMTYtMDMtMTQ6IHdzZnVsdG9uCgkgICAgW0phdmFdIEFkZCBzdGRfYXJyYXkuaSBmb3IgQysrMTEgc3RkOjphcnJheSBzdXBwb3J0LgoKMjAxNi0wMy0xMjogd3NmdWx0b24KCSAgICBbSmF2YSwgQyMsIERdIEZpeCBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzIHdyYXBwZXJzIHdpdGggJWphdmFjb25zdCgxKQogICAgICAgICAgICAlY3Njb25zdCgxKSBvciAlZG1hbmlmZXN0Y29uc3QuCiAgICAgICAgICAgIFRoaXMgZml4ZXMgdGhlIGNhc2Ugd2hlbiBhbiBpbnRlZ2VyIGlzIHVzZWQgYXMgdGhlIGluaXRpYWxpemVyLCBzdWNoIGFzOgoKICAgICAgICAgICAgICBzdHJ1Y3QgVyB7IHN0YXRpYyBjb25zdCBjaGFyIHcgPSAxMDA7IH07CgoJICAgIEZpeCBnZW5lcmF0ZWQgY29kZSBwYXJzaW5nIGVudW0gdmFsdWVzIHVzaW5nIGNoYXIgZXNjYXBlIHNlcXVlbmNlcwogICAgICAgICAgICB3aGVuIHRoZXNlIHZhbHVlcyBhcHBlYXIgaW4gdGhlIEphdmEgY29kZSAodXN1YWxseSB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkpCiAgICAgICAgICAgIHN1Y2ggYXM6CgogICAgICAgICAgICAgIGVudW0gWCB7IHgxID0gJ1xuJywgeDIgPSAnXDEnIH07CgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0YXRpYyBjb25zdCBtZW1iZXIgY2hhciB2YXJpYWJsZXMgc3VjaCBhczoKCiAgICAgICAgICAgICAgc3RydWN0IFkgeyBzdGF0aWMgY29uc3QgY2hhciB5ID0gJ1xuJzsgfQoKICAgICAgICAgICAgTGlrZXdpc2UgZm9yIEQgYW5kICVkbWFuaWZlc3Rjb25zdGFudC4gRm9yIEMjIGFuZCAlY3Njb25zdCgxKSwgY2hhcgogICAgICAgICAgICB2YWx1ZXMgaW4gQyMgYXJlIG5vdyBoZXggZXNjYXBlZCBhcyBDIyBkb2Vzbid0IHN1cHBvcnQgQyBvY3RhbCBlc2NhcGluZy4KCjIwMTYtMDMtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBBZGQgc3VwcG9ydCBmb3IgdHJlYXRpbmcgQysrIGJhc2UgY2xhc3NlcyBhcyBKYXZhIGludGVyZmFjZXMKICAgICAgICAgICAgaW5zdGVhZCBvZiBKYXZhIHByb3h5IGNsYXNzZXMuIFRoaXMgZW5hYmxlIHNvbWUgc29ydCBvZiBzdXBwb3J0IGZvcgogICAgICAgICAgICBtdWx0aXBsZSBpbmhlcml0YW5jZS4gVGhlIGltcGxlbWVudGF0aW9uIGlzIGluIHN3aWdpbnRlcmZhY2UuaSBhbmQKICAgICAgICAgICAgcHJvdmlkZXMgYWRkaXRpb25hbCBtYWNyb3MgKHNlZSBKYXZhLmh0bWwgZm9yIGZ1bGwgZG9jdW1lbnRhdGlvbik6CgogICAgICAgICAgICAgICVpbnRlcmZhY2UoQ1RZUEUpCiAgICAgICAgICAgICAgJWludGVyZmFjZV9pbXBsKENUWVBFKQogICAgICAgICAgICAgICVpbnRlcmZhY2VfY3VzdG9tKCJQUk9YWSIsICJJTlRFUkZBQ0UiLCBDVFlQRSkKCjIwMTYtMDMtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCByc3RyaXAgZW5jb2RlciBmb3IgdXNlIGluICVyZW5hbWUuIFRoaXMgaXMgbGlrZSB0aGUgc3RyaXAgZW5jb2RlciBidXQKICAgICAgICAgICAgc3RyaXBzIHRoZSBzeW1ib2wncyBzdWZmaXggaW5zdGVhZCBvZiB0aGUgcHJlZml4LiBUaGUgZXhhbXBsZSBiZWxvdwogICAgICAgICAgICB3aWxsIHJlbmFtZSBTb21lVGhpbmdDbHMgdG8gU29tZVRoaW5nIGFuZCBBbm90aGVyVGhpbmdDbHMgdG8gQW5vdGhlclRoaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCIlKHJzdHJpcDpbQ2xzXSlzIikgIiI7CgogICAgICAgICAgICAgIGNsYXNzIFNvbWVUaGluZ0NscyB7fTsKICAgICAgICAgICAgICBzdHJ1Y3QgQW5vdGhlclRoaW5nQ2xzIHt9OwoKMjAxNi0wMy0wMTogb2xseQoJICAgIEZpeCBpc2Zpbml0ZSgpIGNoZWNrIHRvIHdvcmsgd2l0aCBHQ0M2LiAgRml4ZXMKCSAgICBpc3N1ZSAjNjE1IHJlcG9ydGVkIGJ5IGpwbGVzbmlrLgoKMjAxNi0wMi0xNzogb2xseQoJICAgIFtQeXRob25dIEFkZCBtaXNzaW5nIGtleXdvcmRzICdhcycgYW5kICd3aXRoJyB0byBweXRob25rdy5zd2cuCgoyMDE2LTAyLTA3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHJlY29nbmlzZSB2YXJpb3VzIHVuYXJ5IGZ1bmN0aW9ucwogICAgICAgICAgICAqIFVzZSBfX2Zsb2F0X18oKSBmb3IgbnVtZXJpYyBjb252ZXJzaW9ucywgZS5nLiB3aGVuIGNhbGxpbmcgZG91YmxlKCkKICAgICAgICAgICAgKiBNYXAgdmFyaW91cyB1bmFyeSBmdW5jdGlvbnMsIGUuZy4gYWJzKCkgdG8gX19hYnNfXygpLCBzZWUgZnVsbCBsaXN0CiAgICAgICAgICAgICAgaW4gc2VjdGlvbiAzMi4zLjEwIG9mIG1hbnVhbDsgb25seSBhdmFpbGFibGUgaW4gT2N0YXZlIDMuOC4wIG9yIGxhdGVyCgoyMDE2LTAyLTA3OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIGV4cG9ydCBmdW5jdGlvbiBzd2lnX29jdGF2ZV9wcmVyZXEoKSBmb3IgdGVzdGluZyBPY3RhdmUgdmVyc2lvbgoKMjAxNi0wMi0wNjogcGpvaGFuZ3VzdGF2c3NvbgogICAgICAgICAgICBbQyNdIEZpeCBkdXBsaWNhdGUgc3ltYm9sIHByb2JsZW1zIHdoZW4gbGlua2luZyB0aGUgc291cmNlIGdlbmVyYXRlZAogICAgICAgICAgICBmcm9tIG11bHRpcGxlIFNXSUcgbW9kdWxlcyBpbnRvIG9uZSBzaGFyZWQgbGlicmFyeSBmb3IgdGhlIC1uYW1lc3BhY2UKICAgICAgICAgICAgb3B0aW9uLiBUaGUgbmFtZXNwYWNlIGlzIG5vdyBtYW5nbGVkIGludG8gdGhlIGdsb2JhbCBQSW52b2tlIGZ1bmN0aW9uCiAgICAgICAgICAgIG5hbWVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE2LTAxLTI3OiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIEFkZGVkIHN1cHBvcnQgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIFB5dGhvbiBCeXRlcwogICAgICAgICAgICBhbmQgVW5pY29kZSBvYmplY3RzIHVzaW5nIGJ5IGRlZmluaW5nIFNXSUdfUFlUSE9OX1NUUklDVF9CWVRFX0NIQVIKICAgICAgICAgICAgYW5kIFNXSUdfUFlUSE9OX1NUUklDVF9VTklDT0RFX1dDSEFSLgoKMjAxNi0wMS0yNzogc3RlZXZlCiAgICAgICAgICAgIFtHb10gRW5zdXJlIHN0cnVjdHMgYXJlIHByb3Blcmx5IHBhY2tlZCBiZXR3ZWVuIGdjIGFuZCBHQ0MvY2xhbmcuCgoyMDE2LTAxLTI1OiBhaG5vbGRzCiAgICAgICAgICAgIFtQeXRob25dIFN1cHBvcnQgdGhlIGZ1bGwgUHl0aG9uIHRlc3Qgc3VpdGUgaW4gLWNsYXNzaWMgbW9kZQogICAgICAgICAgICAqIENvbnZlcnQgbG9uZy91bnNpZ25lZCBsb25nL2xvbmcgbG9uZy91bnNpZ25lZCBsb25nIGxvbmcgdG8gUHlJbnQKICAgICAgICAgICAgICByYXRoZXIgdGhhbiBQeUxvbmcgd2hlbiBwb3NzaWJsZS4gQ2VydGFpbiBweXRob24gZnVuY3Rpb25zIGxpa2UKICAgICAgICAgICAgICBsZW4oKSByZXF1aXJlIGEgUHlJbnQgd2hlbiBvcGVyYXRpbmcgb24gb2xkLXN0eWxlIGNsYXNzZXMuCiAgICAgICAgICAgICogQWRkIHN1cHBvcnQgZm9yIHN0YXRpYyBtZXRob2RzIGluIGNsYXNzaWMgbW9kZSwgaW5jbHVkaW5nIHN1cHBvcnQKICAgICAgICAgICAgICBmb3IgcHl0aG9uYXBwZW5kLCBweXRob25wcmVwZW5kLCBhbmQgZG9jc3RyaW5ncy4KICAgICAgICAgICAgKiBSZW1vdmluZyB0aGUgdXNlIG9mIF9fc3dpZ19nZXRtZXRob2RzX18gZm9yIHN0YXRpYyBtZW1iZXIgbWV0aG9kcwogICAgICAgICAgICAgIHNpbmNlIHRoZXkgd2lsbCBhbHdheXMgYmUgZm91bmQgYnkgdGhlIHN0YW5kYXJkIGFyZ3VtZW50IGxvb2t1cAogICAgICAgICAgICAqIEZpeCBhIGJ1ZyB3aGVyZSB0aGUgd3JvbmcgdHlwZSBvZiBleGNlcHRpb24gd2FzIGNhdWdodCB3aGVuCiAgICAgICAgICAgICAgY2hlY2tpbmcgZm9yIG5ldy1zdHlsZSBjbGFzcyBzdXBwb3J0CgoyMDE2LTAxLTIzOiBhaG5vbGRzCiAgICAgICAgICAgIFtHb10gRW5hYmxlIHN1cHBvcnQgZm9yIHRoZSBHbyB0ZXN0LXN1aXRlIG9uIE9TWDoKICAgICAgICAgICAgKiBUaGUgbGlua2VyIG9uIE9TWCByZXF1aXJlcyB0aGF0IGFsbCBzeW1ib2xzIChldmVuIHdlYWsgc3ltYm9scykKICAgICAgICAgICAgICBhcmUgZGVmaW5lZCBhdCBsaW5rIHRpbWUuIEJlY2F1c2UgdGhlIGZ1bmN0aW9uIF9jZ29fdG9wb2ZzdGFjayBpcwogICAgICAgICAgICAgIG9ubHkgZGVmaW5lZCBzdGFydGluZyBpbiBHbyB2ZXJzaW9uIDEuNCwgd2UgZXhwbGljaXRseSBtYXJrIGl0IGFzCiAgICAgICAgICAgICAgdW5kZWZpbmVkIGZvciBvbGRlciB2ZXJzaW9ucyBvZiBHbyBvbiBPU1guCiAgICAgICAgICAgICogQXZvaWQgd3JpdGluZyBlbXB0eSBzd2lnYXJncyBzdHJ1Y3RzLCBzaW5jZSBlbXB0eSBzdHJ1Y3RzIGFyZSBub3QKICAgICAgICAgICAgICBhbGxvd2VkIGluIGV4dGVybiAiQyIgYmxvY2tzLgoKMjAxNi0wMS0xMjogb2xseQoJICAgIFtKYXZhc2NyaXB0XSBMb29rIGZvciAibm9kZWpzIiBhcyB3ZWxsIGFzICJub2RlIiwgYXMgaXQncyBwYWNrYWdlZAoJICAgIGFzIHRoZSBmb3JtZXIgb24gRGViaWFuLgoKMjAxNi0wMS0xMjogb2xseQoJICAgIFtKYXZhc2NyaXB0XSBGb3IgdjggPj0gNC4zLjAsIHVzZSBWOF9NQUpPUl9WRVJTSU9OLgoJICAgIEZpeGVzIGlzc3VlIDU2MS4KCjIwMTYtMDEtMTA6IGFobm9sZHMKICAgICAgICAgICAgSW1wcm92ZWQgc2l6ZV90IGFuZCBwdHJkaWZmX3QgdHlwZW1hcHMgdG8gc3VwcG9ydCBsYXJnZSB2YWx1ZXMKICAgICAgICAgICAgb24gcGxhdGZvcm1zIHdoZXJlIHNpemVvZihzaXplX3QpID4gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpIGFuZAogICAgICAgICAgICBzaXplb2YocHRyZGlmZl90KSA+IHNpemVvZihsb25nKS4KClZlcnNpb24gMy4wLjggKDMxIERlYyAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMTItMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBwZGYgZG9jdW1lbnRhdGlvbiBpcyBub3cgZ2VuZXJhdGVkIGJ5IHdraHRtbHRvcGRmIGFuZCBoYXMgY29sb3VyCiAgICAgICAgICAgIGZvciB0aGUgY29kZSBzbmlwcGV0cyBqdXN0IGxpa2UgdGhlIGh0bWwgZG9jdW1lbnRhdGlvbiEKCjIwMTUtMTItMjM6IGFobm9sZHMKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZXMgZm9yIGNvbnZlcnNpb24gb2Ygc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VyIHR5cGVzOgoKICAgICAgICAgICAgTm8gbG9uZ2VyIGNoZWNrIGZvciBQeUludCBvYmplY3RzIGluIFB5dGhvbjMuIEJlY2F1c2UgUHlJbnRfQ2hlY2sKICAgICAgICAgICAgYW5kIGZyaWVuZHMgYXJlICNkZWZpbmVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIFB5TG9uZyBtZXRob2RzLCB0aGlzCiAgICAgICAgICAgIGhhZCBjYXVzZWQgZXJyb3JzIGluIFB5dGhvbjMgd2hlcmUgdmFsdWVzIGdyZWF0ZXIgdGhhbiB3aGF0IGNvdWxkIGJlCiAgICAgICAgICAgIHN0b3JlZCBpbiBhIGxvbmcgd2VyZSBpbmNvcnJlY3RseSBpbnRlcnByZXRlZCBhcyB0aGUgdmFsdWUgLTEgd2l0aAogICAgICAgICAgICB0aGUgUHl0aG9uIGVycm9yIGluZGljYXRvciBzZXQgdG8gT3ZlcmZsb3dFcnJvci4gVGhpcyBhcHBsaWVzIHRvCiAgICAgICAgICAgIGJvdGggdGhlIGNvbnZlcnNpb25zIFB5TG9uZy0+bG9uZyBhbmQgUHlMb25nLT5kb3VibGUuCgogICAgICAgICAgICBDb252ZXJzaW9uIGZyb20gUHlMb25nIHRvIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGxvbmcgbG9uZywgYW5kCiAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBub3cgcmFpc2UgT3ZlcmZsb3dFcnJvciBpbnN0ZWFkIG9mIFR5cGVFcnJvciBpbgogICAgICAgICAgICBib3RoIFB5dGhvbjIgYW5kIFB5dGhvbjMgZm9yIFB5TG9uZyB2YWx1ZXMgb3V0c2lkZSB0aGUgcmFuZ2UKICAgICAgICAgICAgZXhwcmVzc2libGUgYnkgdGhlIGNvcnJlc3BvbmRpbmcgQyB0eXBlLiBUaGlzIG1hdGNoZXMgdGhlIGV4aXN0aW5nCiAgICAgICAgICAgIGJlaGF2aW9yIGZvciBvdGhlciBpbnRlZ3JhbCB0eXBlcyAoc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRzLCBzaG9ydHMsCiAgICAgICAgICAgIGFuZCBjaGFycyksIGFzIHdlbGwgYXMgdGhlIGNvbnZlcnNpb24gZm9yIFB5SW50IHRvIGFsbCBudW1lcmljCiAgICAgICAgICAgIHR5cGVzLiBUaGlzIGFsc28gaW5kaXJlY3RseSBhcHBsaWVzIHRvIHRoZSBzaXplX3QgYW5kIHB0cmRpZmZfdAogICAgICAgICAgICB0eXBlcywgd2hpY2ggZGVwZW5kIG9uIHRoZSBjb252ZXJzaW9ucyBmb3IgdW5zaWduZWQgbG9uZyBhbmQgbG9uZy4KCjIwMTUtMTItMTk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAyIFVuaWNvZGUgVVRGLTggc3RyaW5ncyBjYW4gYmUgdXNlZCBhcyBpbnB1dHMgdG8gY2hhciAqIG9yCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHR5cGVzIGlmIHRoZSBnZW5lcmF0ZWQgQy9DKysgY29kZSBoYXMgU1dJR19QWVRIT05fMl9VTklDT0RFIGRlZmluZWQuCgoyMDE1LTEyLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBJc3N1ZXMgIzI4NiwgIzEyOAogICAgICAgICAgICBSZW1vdmUgY2NhY2hlLXN3aWcuMSBtYW4gcGFnZSAtIHBsZWFzZSB1c2UgdGhlIENDYWNoZS5odG1sIGRvY3MgaW5zdGVhZC4KICAgICAgICAgICAgVGhlIHlvZGwybWFuIGFuZCB5b2RsMmh0bWwgdG9vbHMgYXJlIG5vIGxvbmdlciB1c2VkIGFuZCBzbyBTV0lHIG5vCiAgICAgICAgICAgIGxvbmdlciBoYXMgYSBkZXBlbmRlbmN5IG9uIHRoZXNlIHBhY2thZ2VzIHdoaWNoIHdlcmUgcmVxdWlyZWQgd2hlbgogICAgICAgICAgICBidWlsZGluZyBmcm9tIGdpdC4KCjIwMTUtMTItMTY6IHp0dXJuZXIvY29sZWIKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFB5dGhvbjMuNSBpbnRlcnByZXRlciBhc3NlcnRpb25zIHdoZW4gb2JqZWN0cyBhcmUgYmVpbmcKICAgICAgICAgICAgZGVsZXRlZCBkdWUgdG8gYW4gZXhpc3RpbmcgZXhjZXB0aW9uLiBNb3N0IG5vdGFibHkgaW4gZ2VuZXJhdG9ycwogICAgICAgICAgICB3aGljaCB0ZXJtaW5hdGUgdXNpbmcgYSBTdG9wSXRlcmF0aW9uIGV4Y2VwdGlvbi4gRml4ZXMgIzU1OSAjNTYwICM1NzMuCiAgICAgICAgICAgIElmIGEgZnVydGhlciBleGNlcHRpb24gaXMgcmFpc2VkIGR1cmluZyBhbiBvYmplY3QgZGVzdHJ1Y3Rpb24sCiAgICAgICAgICAgIFB5RXJyX1dyaXRlVW5yYWlzYWJsZSBpcyB1c2VkIG9uIHRoaXMgc2Vjb25kIGV4Y2VwdGlvbiBhbmQgdGhlCiAgICAgICAgICAgIG9yaWdpbmFsIGV4Y2VwdGlvbiBidWJibGVzIHRocm91Z2guCgoyMDE1LTEyLTE0OiBhaG5vbGRzL3dzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBpbiBtaXNzaW5nIGluaXRpYWxpemVycyBmb3IgdHBfZmluYWxpemUsCiAgICAgICAgICAgIG5iX21hdHJpeF9tdWx0aXBseSwgbmJfaW5wbGFjZV9tYXRyaXhfbXVsdGlwbHksIGh0X3F1YWxuYW1lCiAgICAgICAgICAgIGh0X2NhY2hlZF9rZXlzIGFuZCB0cF9wcmV2LgoKMjAxNS0xMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNUTCB3cmFwcGVycyB0byBub3QgZ2VuZXJhdGUgPDogZGlncmFwaHMuCiAgICAgICAgICAgIEZvciBleGFtcGxlIHN0ZDo6dmVjdG9yPDo6WDo6WT4gd2FzIHNvbWV0aW1lcyBnZW5lcmF0ZWQsIG5vdwogICAgICAgICAgICBjb3JyZWN0ZWQgdG8gc3RkOjp2ZWN0b3I8IDo6WDo6WSA+LgoKMjAxNS0xMS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNUTCByYW5nZXMgYW5kIHNsaWNlcyBmaXhlcy4KCiAgICAgICAgICAgIFJ1YnkgU1RMIGNvbnRhaW5lciBzZXR0aW5nIHNsaWNlcyBmaXhlczoKCiAgICAgICAgICAgIFNldHRpbmcgYW4gU1RMIGNvbnRhaW5lciB3cmFwcGVyIHNsaWNlIGJldHRlciBtYXRjaGVzIHRoZSB3YXkgUnVieQogICAgICAgICAgICBhcnJheXMgd29yay4gVGhlIGJlaGF2aW91ciBpcyBub3cgdGhlIHNhbWUgYXMgUnVieSBhcnJheXMuIFRoZSBvbmx5CiAgICAgICAgICAgIGV4Y2VwdGlvbiBpcyB0aGUgZGVmYXVsdCB2YWx1ZSB1c2VkIHdoZW4gZXhwYW5kaW5nIGEgY29udGFpbmVyCiAgICAgICAgICAgIGNhbm5vdCBiZSBuaWwgYXMgdGhpcyBpcyBub3QgYSB2YWxpZCB0eXBlL3ZhbHVlIGZvciBDKysgY29udGFpbmVyCiAgICAgICAgICAgIGVsZW1lbnRzLgoKICAgICAgICAgICAgT2J0YWluaW5nIGEgUnVieSBTVEwgY29udGFpbmVyIHJhbmdlcyBhbmQgc2xpY2VzIGZpeGVzOgoKICAgICAgICAgICAgQWNjZXNzIHZpYSByYW5nZXMgYW5kIHNsaWNlcyBub3cgYmVoYXZlIGlkZW50aWNhbGx5IHRvIFJ1YnkgYXJyYXlzLgogICAgICAgICAgICBUaGUgZml4ZXMgYXJlIG1vc3RseSBmb3Igb3V0IG9mIHJhbmdlIGluZGljZXMgYW5kIGxlbmd0aHMuCiAgICAgICAgICAgIC0gWmVybyBsZW5ndGggc2xpY2UgcmVxdWVzdHMgcmV0dXJuIGFuIGVtcHR5IGNvbnRhaW5lciBpbnN0ZWFkIG9mIG5pbC4KICAgICAgICAgICAgLSBTbGljZXMgd2hpY2ggcmVxdWVzdCBhIGxlbmd0aCBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGNvbnRhaW5lcgogICAgICAgICAgICAgIG5vIGxvbmdlciBjaG9wIG9mZiB0aGUgbGFzdCBlbGVtZW50LgogICAgICAgICAgICAtIFJhbmdlcyB3aGljaCB1c2VkIHRvIHJldHVybiBuaWwgbm93IHJldHVybiBhbiBlbXB0eSBhcnJheSB3aGVuIHRoZQogICAgICAgICAgICAgIHRoZSBzdGFydCBlbGVtZW50IGlzIGEgdmFsaWQgaW5kZXguCgogICAgICAgICAgICBSdWJ5IFNUTCBjb250YWluZXIgbmVnYXRpdmUgaW5kZXhpbmcgc3VwcG9ydCBpbXByb3ZlZC4KCiAgICAgICAgICAgIFVzaW5nIG5lZ2F0aXZlIGluZGV4ZXMgdG8gc2V0IHZhbHVlcyB3b3JrcyB0aGUgc2FtZSBhcyBSdWJ5IGFycmF5cywgZWcKCiAgICAgICAgICAgICV0ZW1wbGF0ZShJbnRWZWN0b3IpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBpdiA9IEludFZlY3Rvci5uZXcoWzEsMiwzLDRdKQogICAgICAgICAgICBpdlstNF0gPSA5ICMgPT4gWzEsMiwzLDldCiAgICAgICAgICAgIGl2Wy01XSA9IDkgIyA9PiBJbmRleEVycm9yCgoyMDE1LTExLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieSwgUHl0aG9uXSBBZGQgc3RkOjphcnJheSBjb250YWluZXIgd3JhcHBlcnMuCgogICAgICAgICAgICBUaGVzZSB3b3JrIG11Y2ggbGlrZSBhbnkgb2YgdGhlIG90aGVyIFNUTCBjb250YWluZXJzIGV4Y2VwdCBQeXRob24vUnVieSBzbGljaW5nCiAgICAgICAgICAgIGlzIHNvbWV3aGF0IGxpbWl0ZWQgYmVjYXVzZSB0aGUgYXJyYXkgaXMgYSBmaXhlZCBzaXplLiBPbmx5IHNsaWNlcyBvZgogICAgICAgICAgICB0aGUgZnVsbCBzaXplIGFyZSBzdXBwb3J0ZWQuCgoyMDE1LTEwLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjNTM5IC0gU3VwcG9ydCBQeXRob24gMy41IGFuZCAtYnVpbHRpbi4gIFB5QXN5bmNNZXRob2RzIGlzIGEgbmV3CiAgICAgICAgICAgIG1lbWJlciBpbiBQeUhlYXBUeXBlT2JqZWN0LgoKMjAxNS0xMC0wNjogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIERvbid0IGVtaXQgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgYSBkaXJlY3RvcgoJICAgIGNsYXNzIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLCBzaW5jZSB0aGUgZnVuY3Rpb24gd2lsbAoJICAgIGFsd2F5cyBwYW5pYy4KCjIwMTUtMTAtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlc2hhcmVkX3B0ciBzdXBwb3J0IGZvciBwcml2YXRlIGFuZCBwcm90ZWN0ZWQgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIC0gUmVtb3ZlIHVubmVjZXNzYXJ5IFdhcm5pbmcgNTIwOiBEZXJpdmVkIGNsYXNzICdEZXJpdmVkJyBvZiAnQmFzZScKICAgICAgICAgICAgICBpcyBub3Qgc2ltaWxhcmx5IG1hcmtlZCBhcyBhIHNtYXJ0IHBvaW50ZXIKICAgICAgICAgICAgLSBEbyBub3QgZ2VuZXJhdGUgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGNhc3QgdXAgdGhlIGluaGVyaXRhbmNlIGNoYWluIGluIHRoZQogICAgICAgICAgICAgIHR5cGUgc3lzdGVtIHJ1bnRpbWUgaW4gc3VjaCBjYXNlcyBhcyBpdCBkb2Vzbid0IGNvbXBpbGUgYW5kIGNhbid0IGJlIHVzZWQuCiAgICAgICAgICAgIFJlbW92ZSB1bm5lY2Vzc2FyeSB3YXJuaW5nIDUyMCBmb3IgJXNoYXJlZF9wdHIgd2hlbiB0aGUgYmFzZSBjbGFzcyBpcyBpZ25vcmVkLgoKMjAxNS0xMC0wMTogdmthbGluaW4KICAgICAgICAgICAgRml4ICM1MDg6IEZpeCBzZWdmYXVsdCBwYXJzaW5nIGFub255bW91cyB0eXBlZGVmIG5lc3RlZCBjbGFzc2VzLgoKMjAxNS0wOS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFkZCBzaGFyZWRfcHRyIHN1cHBvcnQKCjIwMTUtMDktMTM6IGtrYWVtcGYKICAgICAgICAgICAgW1J1YnldIFJlc29sdmUgdHJhY2tpbmcgYnVnIC0gaXNzdWUgIzIyNS4KICAgICAgICAgICAgVGhlIGJ1ZyBpcyB0aGF0IHRoZSB0cmFja2luZyBjb2RlIHVzZXMgYSBydWJ5IGhhc2ggYW5kIHRodXMgbWF5CiAgICAgICAgICAgIGFsbG9jYXRlIG9iamVjdHMgKEJpZ251bSkgd2hpbGUgcnVubmluZyB0aGUgR0MuIFRoaXMgd2FzIHRvbGVyYXRlZCBpbgogICAgICAgICAgICAxLjggYnV0IGlzIGludmFsaWQgKHJhaXNlcyBhbiBleGNlcHRpb24pIGluIDEuOS4KICAgICAgICAgICAgVGhlIHBhdGNoIHVzZXMgYSBDIGhhc2ggKGFsc28gdXNlZCBieSBydWJ5KSBpbnN0ZWFkLgoKMjAxNS0wOS0wOTogbHl6ZQogICAgICAgICAgICBbQ0ZGSV0gRXh0ZW5kIHRoZSAiZXhwb3J0IiBmZWF0dXJlIGluIHRoZSBDRkZJIG1vZHVsZSB0byBzdXBwb3J0CiAgICAgICAgICAgIGV4cG9ydGluZyB0byBhIHNwZWNpZmllZCBwYWNrYWdlLgoKMjAxNS0wOS0wNDogb2xseQoJICAgIFtQeXRob25dIEZpeCBkb2NzdHJpbmdzIGZvciAlY2FsbGJhY2sgZnVuY3Rpb25zLgoKMjAxNS0wOS0wMzogZGVtaS1ybHVkZHkKICAgICAgICAgICAgW0dvXSBSZW1vdmVkIGdvbGFuZyBzdHJpbmdpbmcgZm9yIHNpZ25lZC91bnNpZ25lZCBjaGFyCgogICAgICAgICAgICBDaGFuZ2VkIGRlZmF1bHQgaGFuZGxpbmcgb2Ygc2lnbmVkIGNoYXIqIGFuZCB1bnNpZ25lZCBjaGFyKiB0byBiZQogICAgICAgICAgICBvcGFxdWUgcG9pbnRlcnMgcmF0aGVyIHRoYW4gc3RyaW5ncywgc2ltaWxhcmx5IHRvIGhvdyBvdGhlcgogICAgICAgICAgICBsYW5ndWFnZXMgd29yay4KCiAgICAgICAgICAgIEFueSBleGlzdGluZyBjb2RlIHJlbHlpbmcgb24gdHJlYXRpbmcgc2lnbmVkIGNoYXIqIG9yIHVuc2lnbmVkCiAgICAgICAgICAgIGNoYXIqIGFzIGEgc3RyaW5nIGNhbiByZXN0b3JlIHRoZSBvbGQgYmVoYXZpb3Igd2l0aCB0eXBlbWFwcy5pIGJ5CiAgICAgICAgICAgIHVzaW5nICVhcHBseSB0byBjb3B5IHRoZSBbdW5jaGFuZ2VkXSBjaGFyKiBiZWhhdmlvci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAxNS0wOC0wNzogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIHRpZHkgLVd0YXV0b2xvZ2ljYWwtY29uc3RhbnQtb3V0LW9mLXJhbmdlLWNvbXBhcmUgd2FybmluZ3Mgd2hlbiBidWlsZGluZyBnZW5lcmF0ZWQgY29kZSB1bmRlciBjbGFuZwoKMjAxNS0wOC0wNzogeGFudGFyZXMKICAgICAgICAgICAgW1B5dGhvbl0gcGVwMjU3ICYgbnVtcHlkb2MgY29uZm9ybWluZyBkb2NzdHJpbmdzOgogICAgICAgICAgICAtIE1vbm8tbGluZSBtb2R1bGUgZG9jc3N0cmluZwogICAgICAgICAgICAtIFJld3JpdGUgYXV0b2RvYyBwYXJhbWV0ZXJzIHNlY3Rpb24gaW4gbnVtcHlkb2Mgc3R5bGU6CiAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL251bXB5L251bXB5L2Jsb2IvbWFzdGVyL2RvYy9IT1dUT19ET0NVTUVOVC5yc3QudHh0CiAgICAgICAgICAgIC0gT25lIGxpbmUgc3VtbWFyeSBzaG91bGQgZW5kIHdpdGggIi4iCiAgICAgICAgICAgIC0gQWRkcyBhIGJsYW5rIGxpbmUgYWZ0ZXIgY2xhc3MgZG9jc3RyaW5nCgoyMDE1LTA4LTA1OiB2YWR6CiAgICAgICAgICAgIFtKYXZhXSBNYWtlIChjaGFyKiBTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzIHVzYWJsZSBmb3IKICAgICAgICAgICAgc3RyaW5ncyBvZiBvdGhlciB0eXBlcywgZS5nLiAidW5zaWduZWQgY2hhcioiLgoKVmVyc2lvbiAzLjAuNyAoMyBBdWcgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDgtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggcG90ZW50aWFsIHNlY3VyaXR5IGV4cGxvaXQgaW4gZ2VuZXJhdGVkIEphdmEgY2xhc3Nlcy4KICAgICAgICAgICAgVGhlIHN3aWdDUHRyIGFuZCBzd2lnQ01lbU93biBtZW1iZXIgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgSmF2YQogICAgICAgICAgICBjbGFzc2VzIGFyZSBub3cgZGVjbGFyZWQgJ3RyYW5zaWVudCcgYnkgZGVmYXVsdC4gRnVydGhlciBkZXRhaWxzIG9mIHRoZSBleHBsb2l0CiAgICAgICAgICAgIGluIEFuZHJvaWQgaXMgYmVpbmcgcHVibGlzaGVkIGluIGFuIGFjYWRlbWljIHBhcGVyIGFzIHBhcnQgb2YgVVNFTklYIFdPT1QgJzE1OgogICAgICAgICAgICBodHRwczovL3d3dy51c2VuaXgub3JnL2NvbmZlcmVuY2Uvd29vdDE1L3dvcmtzaG9wLXByb2dyYW0vcHJlc2VudGF0aW9uL3BlbGVzLgoKICAgICAgICAgICAgSW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgeW91IGFyZSByZWx5aW5nIG9uIHRoZXNlIG1lbWJlcnMgYmVpbmcgc2VyaWFsaXphYmxlLAogICAgICAgICAgICB0aGVuIHlvdSB3aWxsIG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgamF2YWJvZHkgYW5kIGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcHMKICAgICAgICAgICAgdG8gZ2VuZXJhdGUgdGhlIG9sZCBnZW5lcmF0ZWQgY29kZS4gVGhlIHJlbGV2YW50IHR5cGVtYXBzIGFyZSBpbiB0aGUgTGliIGRpcmVjdG9yeQogICAgICAgICAgICBpbiB0aGUgamF2YS5zd2csIGJvb3N0X3NoYXJlZF9wdHIuaSBhbmQgYm9vc3RfaW50cnVzaXZlX3B0ci5pIGZpbGVzLiBDb3B5IHRoZQogICAgICAgICAgICByZWxldmFudCBkZWZhdWx0IHR5cGVtYXBzIGludG8geW91ciBpbnRlcmZhY2UgZmlsZSBhbmQgcmVtb3ZlIHRoZSAndHJhbnNpZW50JyBrZXl3b3JkLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE1LTA4LTAxOiB2YWR6CiAgICAgICAgICAgIE1ha2UgY29uZmlndXJlIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiBtb3JlIHVzZWZ1bDogaXQgY2FuIG5vdyBiZSBvdmVycmlkZGVuIGJ5IHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgLS13aXRoLXh4eCBvcHRpb25zLCBhbGxvd2luZyB0byBlYXNpbHkgZW5hYmxlIGp1c3Qgb25lIG9yIHR3byBsYW5ndWFnZXMuCgoyMDE1LTA3LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzQ0MCAtIEluaXRpYWxpc2UgYWxsIG5ld2x5IGNyZWF0ZWQgYXJyYXlzIHdoZW4gdXNpbmcgJWFycmF5X2Z1bmN0aW9ucyBhbmQgJWFycmF5X2NsYXNzCiAgICAgICAgICAgIGluIHRoZSBjYXJyYXlzLmkgbGlicmFyeSAtIGJ1ZyBpcyBvbmx5IHJlbGV2YW50IHdoZW4gdXNpbmcgQysrLgoKMjAxNS0wNy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gSW1wcm92ZSBpbmRlbnRhdGlvbiB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcyBmb3IgY29kZSBpbiB0aGUgZm9sbG93aW5nIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVweXRob25wcmVwZW5kCiAgICAgICAgICAgICAgJXB5dGhvbmFwcGVuZAogICAgICAgICAgICAgICVweXRob25jb2RlCiAgICAgICAgICAgICAgJXB5dGhvbmJlZ2luCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNoYWRvdyIpCgogICAgICAgICAgICBPbGQgZXJyb3IgZXhhbXBsZToKICAgICAgICAgICAgICBFcnJvcjogTGluZSBpbmRlbnRlZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKGxpbmUgMyBvZiBweXRob25jb2RlKQoKICAgICAgICAgICAgTmV3IGVycm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgRXJyb3I6IExpbmUgaW5kZW50ZWQgbGVzcyB0aGFuIGV4cGVjdGVkIChsaW5lIDMgb2YgJXB5dGhvbmNvZGUgb3IgJWluc2VydCgicHl0aG9uIikgYmxvY2spCiAgICAgICAgICAgICAgYXMgbm8gbGluZSBzaG91bGQgYmUgaW5kZW50ZWQgbGVzcyB0aGFuIHRoZSBpbmRlbnRhdGlvbiBpbiBsaW5lIDEKCiAgICAgICAgICAgIE9sZCB3YXJuaW5nIGV4YW1wbGU6CiAgICAgICAgICAgICAgV2FybmluZyA3NDA6IFdoaXRlc3BhY2UgcHJlZml4IGRvZXNuJ3QgbWF0Y2ggKGxpbmUgMiBvZiAlcHl0aG9uY29kZSBvciAlaW5zZXJ0KCJweXRob24iKSBibG9jaykKCiAgICAgICAgICAgIE5ldyB3YXJuaW5nIGV4YW1wbGU6CiAgICAgICAgICAgICAgV2FybmluZyA3NDA6IFdoaXRlc3BhY2UgaW5kZW50YXRpb24gaXMgaW5jb25zaXN0ZW50IGNvbXBhcmVkIHRvIGVhcmxpZXIgbGluZXMgKGxpbmUgMyBvZgogICAgICAgICAgICAgICVweXRob25jb2RlIG9yICVpbnNlcnQoInB5dGhvbiIpIGJsb2NrKQoKICAgICAgICAgICAgCjIwMTUtMDctMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjNDc1LiBJbXByb3ZlIGRvY3N0cmluZyBpbmRlbnRhdGlvbiBoYW5kbGluZy4KICAgICAgICAgICAgCiAgICAgICAgICAgIFNXSUctMy4wLjUgYW5kIGVhcmxpZXIgc29tZXRpbWVzIHRydW5jYXRlZCB0ZXh0IHByb3ZpZGVkIGluIHRoZSBkb2NzdHJpbmcgZmVhdHVyZS4KICAgICAgICAgICAgVGhpcyBvY2N1cnJlZCB3aGVuIHRoZSBpbmRlbnRhdGlvbiAod2hpdGVzcGFjZSkgaW4gdGhlIGRvY3N0cmluZyB3YXMgbGVzcyBpbiB0aGUKICAgICAgICAgICAgc2Vjb25kIG9yIGxhdGVyIGxpbmVzIHdoZW4gY29tcGFyZWQgdG8gdGhlIGZpcnN0IGxpbmUuCiAgICAgICAgICAgIFNXSUctMy4wLjYgZ2F2ZSBhICdMaW5lIGluZGVudGVkIGxlc3MgdGhhbiBleHBlY3RlZCcgZXJyb3IgaW5zdGVhZCBvZiB0cnVuY2F0aW5nCiAgICAgICAgICAgIHRoZSBkb2NzdHJpbmcgdGV4dC4KICAgICAgICAgICAgTm93IHRoZSBpbmRlbnRhdGlvbiBmb3IgdGhlICdkb2NzdHJpbmcnIGZlYXR1cmUgaXMgc21hcnRlciBhbmQgaXMgYXBwcm9wcmlhdGVseQogICAgICAgICAgICBhZGp1c3RlZCBzbyB0aGF0IG5vIHRydW5jYXRpb24gb2NjdXJzLgoKMjAxNS0wNy0yMjogd3NmdWx0b24KICAgICAgICAgICAgU3VwcG9ydCBmb3Igc3BlY2lhbCB2YXJpYWJsZSBleHBhbnNpb24gaW4gdHlwZW1hcCBhdHRyaWJ1dGVzLiBFeGFtcGxlIHVzYWdlIGV4cGFuc2lvbgogICAgICAgICAgICBpbiB0aGUgJ291dCcgYXR0cmlidXRlIChDIyBzcGVjaWZpYyk6CgogICAgICAgICAgICAgICV0eXBlbWFwKGN0eXBlLCBvdXQ9IiQqMV9sdHlwZSIpIHVuc2lnbmVkIGludCYgIiQqMV9sdHlwZSIKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGZvbGxvd2luZyBhcyAkKjFfbHR5cGUgZXhwYW5kcyB0byAndW5zaWduZWQgaW50JzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3R5cGUsIG91dD0idW5zaWduZWQgaW50IikgdW5zaWduZWQgaW50JiAidW5zaWduZWQgaW50IgoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZXMgY2FuIGJlIHVzZWQgd2l0aGluIHNwZWNpYWwgdmFyaWFibGUgbWFjcm9zIHRvby4gRXhhbXBsZSB1c2FnZSBleHBhbnNpb246CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgdW5zaWduZWQgaW50ICJ1aW50IgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSIkdHlwZW1hcChjc3R5cGUsICQqMV9sdHlwZSkiKSB1bnNpZ25lZCBpbnQmICIkdHlwZW1hcChjc3R5cGUsICQqMV9sdHlwZSkiCgogICAgICAgICAgICBTcGVjaWFsIHZhcmlhYmxlcyBhcmUgZXhwYW5kZWQgZmlyc3QgYW5kIGhlbmNlIHRoZSBhYm92ZSBpcyBlcXVpdmFsZW50IHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0iJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIikgdW5zaWduZWQgaW50JiAiJHR5cGVtYXAoY3N0eXBlLCB1bnNpZ25lZCBpbnQpIgoKICAgICAgICAgICAgd2hpY2ggdGhlbiBleHBhbmRzIHRvOgoKICAgICAgICAgICAgICAldHlwZW1hcChjc3R5cGUsIG91dD0idWludCIpIHVuc2lnbmVkIGludCYgInVpbnQiCgoyMDE1LTA3LTIyOiBsaW5kbGV5ZgoJICAgIEFwcGx5IHBhdGNoICM0MzkgLSBzdXBwb3J0IGZvciAkdHlwZW1hcCgpIChha2EgZW1iZWRkZWQgdHlwZW1hcHMgb3Igc3BlY2lhbCB2YXJpYWJsZQogICAgICAgICAgICBtYWNyb3MpIGluIHR5cGVtYXAgYXR0cmlidXRlcy4gQSBzaW1wbGUgZXhhbXBsZSB3aGVyZSAkdHlwZW1hcCgpIGlzIGV4cGFuZGVkIGluIHRoZQogICAgICAgICAgICAnb3V0JyBhdHRyaWJ1dGUgKEMjIHNwZWNpZmljKToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlKSB1bnNpZ25lZCBpbnQgInVpbnQiCiAgICAgICAgICAgICAgJXR5cGVtYXAoY3N0eXBlLCBvdXQ9IiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIpIHVuc2lnbmVkIGludCYgIiR0eXBlbWFwKGNzdHlwZSwgdW5zaWduZWQgaW50KSIKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG86CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSwgb3V0PSJ1aW50IikgdW5zaWduZWQgaW50JiAidWludCIKCjIwMTUtMDctMTg6IG03dGhvbgoJICAgIFtQeXRob25dIERvY3N0cmluZ3MgcHJvdmlkZWQgdmlhICVmZWF0dXJlKCJkb2NzdHJpbmciKSBhcmUgbm93IHF1b3RlZCBhbmQgYWRkZWQgdG8KICAgICAgICAgICAgdGhlIHRwX2RvYyBzbG90IHdoZW4gdXNpbmcgcHl0aG9uIGJ1aWx0aW4gY2xhc3NlcyAoLWJ1aWx0aW4pLiBXaGVuIG5vIGRvY3N0cmluZyBpcwogICAgICAgICAgICBwcm92aWRlZCwgdGhlIHRwX2RvYyBzbG90IGlzIHNldCB0byB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGNsYXNzIG5hbWUuCiAgICAgICAgICAgIEdpdGh1YiBpc3N1ZXMgIzQ0NSBhbmQgIzQ2MS4KCjIwMTUtMDctMTc6IGt3d2V0dGUKICAgICAgICAgICAgW29jdGF2ZV0gU3VwcG9ydCBPY3RhdmUgdmVyc2lvbiA0LjAuMCAodGhhbmtzIHRvIHBhdGNoZXMgZnJvbSBPcmlvbiBQb3BsYXdza2kpLgoKMjAxNS0wNy0wNzogd3NmdWx0b24KCSAgICBTV0lHIG5vIGxvbmdlciBnZW5lcmF0ZXMgYSB3cmFwcGVyIGZvciBhIGNsYXNzJyBjb25zdHJ1Y3RvciBpZiB0aGF0IGNsYXNzIGhhcwogICAgICAgICAgICBhbnkgYmFzZSBjbGFzcyB3aXRoIGEgcHJpdmF0ZSBkZXN0cnVjdG9yLiBUaGlzIGlzIGJlY2F1c2UgeW91ciBjb21waWxlciBzaG91bGQKICAgICAgICAgICAgbm90IGFsbG93IGEgY2xhc3MgdG8gYmUgaW5zdGFudGlhdGVkIGlmIGEgYmFzZSBoYXMgYSBwcml2YXRlIGRlc3RydWN0b3IuIFNvbWUKICAgICAgICAgICAgY29tcGlsZXJzIGRvLCBzbyBpZiB5b3UgbmVlZCB0aGUgb2xkIGJlaGF2aW91ciwgdXNlIHRoZSAibm90YWJzdHJhY3QiIGZlYXR1cmUsIGVnOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibm90YWJzdHJhY3QiKSBEZXJpdmVkOwogICAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgICAgfkJhc2UoKSB7fQogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHt9OwoKVmVyc2lvbiAzLjAuNiAoNSBKdWwgMjAxNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDctMDI6IHdzZnVsdG9uCgkgICAgRml4IHN5bnRheCBlcnJvciB3aGVuIHRoZSB0ZW1wbGF0ZSBrZXl3b3JkIGlzIHVzZWQgaW4gdHlwZXMsIGVnOgoKICAgICAgICAgICAgICBzdGQ6OnRlbXBsYXRlIHZlY3RvcjxpbnQ+IHY7CgoyMDE1LTA3LTAyOiBuZ2xhZGl0egoJICAgIFtMdWFdIFB1c2ggY2hhcmFjdGVycyBhcyB1bmZvcm1hdHRlZCAxLWNoYXJhY3RlciBzdHJpbmdzIHRvIGF2b2lkCgkgICAgdW5wcmludGFibGUgY2hhcmFjdGVycyBzdWNoIGFzIChjaGFyKTEyNyBiZWluZyBjb252ZXJ0ZWQgdG8KCSAgICAiPFwxMjc+IiB3aXRoIEx1YSA1LjMgYW5kIGxhdGVyLiAgKGdpdGh1YiBQUiAjNDUyKQoKMjAxNS0wNi0yOTogb2xseQoJICAgIFtQeXRob25dIEltcHJvdmUgaGFuZGxpbmcgb2Ygd2hpdGVzcGFjZSBpbiAlcHl0aG9uY29kZS4KCgkgICAgUHJldmlvdXNseSBTV0lHIGxvb2tlZCBhdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGZpcnN0IGxpbmUgYW5kCgkgICAgcmVtb3ZlZCB0aGF0IG1hbnkgY2hhcmFjdGVycyBmcm9tIGVhY2ggc3Vic2VxdWVudCBsaW5lLCByZWdhcmRsZXNzCgkgICAgb2Ygd2hhdCB0aG9zZSBjaGFyYWN0ZXJzIHdlcmUuICBUaGlzIHdhcyBtYWRlIHdvcnNlIGJlY2F1c2UgU1dJRydzCgkgICAgcHJlcHJvY2Vzc29yIHJlbW92ZXMgYW55IHdoaXRlc3BhY2UgYmVmb3JlIGEgJyMnLiAgRml4ZXMgZ2l0aHViCgkgICAgaXNzdWUgIzM3OSwgcmVwb3J0ZWQgYnkgSm9lIE9ydG9uLgoKMjAxNS0wNi0xMjogd3NmdWx0b24KCSAgICBbUl0gRml4ICM0MzAgLSBjYWxsIHRvIFNXSUdfY3JlYXRlTmV3UmVmIGluIGNvcHlUb0Mgd2FzIGluY29ycmVjdGx5IG5hbWVkLgoKMjAxNS0wNi0xMTogc2doaXJhdGUKCSAgICBbQyNdIFBhdGNoICM0MjcgYWRkcyBpbiBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbiAtb3V0ZmlsZSB0byBjb21iaW5lIGFsbCB0aGUKICAgICAgICAgICAgZ2VuZXJhdGVkIEMjIGNvZGUgaW50byBhIHNpbmdsZSBmaWxlLgoKMjAxNS0wNi0wOTogd3NmdWx0b24KCSAgICBGaXggc2VnIGZhdWx0IHByb2Nlc3NpbmcgQysrMTEgdHlwZSBhbGlhc2luZy4gSXNzdWUgIzQyNC4KCjIwMTUtMDUtMjg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gQWRkIG5ldyBmZWF0dXJlICJweXRob246Y2RlZmF1bHRhcmdzIiB0byBjb250cm9sIGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgY29kZSBnZW5lcmF0aW9uLiBCeSBkZWZhdWx0LCBTV0lHIGF0dGVtcHRzIHRvIGNvbnZlcnQgQy9DKysgZGVmYXVsdCBhcmd1bWVudCB2YWx1ZXMKICAgICAgICAgICAgaW50byBQeXRob24gdmFsdWVzIGFuZCBnZW5lcmF0ZXMgY29kZSBpbnRvIHRoZSBQeXRob24gbGF5ZXIgd2l0aCB0aGVzZSB2YWx1ZXMuCiAgICAgICAgICAgIFJlY2VudCB2ZXJzaW9ucyBvZiBTV0lHIGFyZSBhYmxlIHRvIGNvbnZlcnQgbW9yZSBvZiB0aGVzZSB2YWx1ZXMsIGhvd2V2ZXIsIHRoZQogICAgICAgICAgICBuZXcgYmVoYXZpb3VyIGNhbiBiZSBjaXJjdW12ZW50ZWQgaWYgZGVzaXJlZCB2aWEgdGhpcyBuZXcgZmVhdHVyZSwgc3VjaCB0aGF0CiAgICAgICAgICAgIHRoZSBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlcyBhcmUgb2J0YWluZWQgZnJvbSB0aGUgQyBsYXllciBhbmQgbm90IHRoZSBQeXRob24gbGF5ZXIuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzdHJ1Y3QgQ0RBIHsKICAgICAgICAgICAgICAgIGludCBmZmYoaW50IGEgPSAxLCBib29sIGIgPSBmYWxzZSk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGNvZGUgZ2VuZXJhdGlvbiBpbiB0aGUgUHl0aG9uIGxheWVyIGlzOgoKICAgICAgICAgICAgICBjbGFzcyBDREEoX29iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBkZWYgZmZmKHNlbGYsIGE9MSwgYj1GYWxzZSk6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gX2RlZmF1bHRfYXJncy5DREFfZmZmKHNlbGYsIGEsIGIpCgogICAgICAgICAgICBBZGRpbmcgdGhlIGZlYXR1cmU6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJweXRob246Y2RlZmF1bHRhcmdzIikgQ0RBOjpmZmY7CgogICAgICAgICAgICBSZXN1bHRzIGluOgoKICAgICAgICAgICAgICBjbGFzcyBDREEoX29iamVjdCk6CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBkZWYgZmZmKHNlbGYsICphcmdzKToKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZGVmYXVsdF9hcmdzLkNEQV9mZmYoc2VsZiwgKmFyZ3MpCgogICAgICAgICAgICBTb21lIGNvZGUgZ2VuZXJhdGlvbiBtb2RlcywgZWcgLWJ1aWx0aW4gYW5kIC1mYXN0cHJveHksIGFyZSB1bmFmZmVjdGVkIGJ5IHRoaXMgYXMKICAgICAgICAgICAgdGhlIGRlZmF1bHQgdmFsdWVzIGFyZSBhbHdheXMgb2J0YWluZWQgZnJvbSB0aGUgQyBsYXllci4KCjIwMTUtMDUtMjc6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRGVhbCB3aXRoIGFuIGludGVnZXIgYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSB0eXBlZGVmIHRvIGJvb2wKCSAgICBwYXJhbWV0ZXIgaW4gdGhlIEMrKyBwcm90b3R5cGUuICBTZWUgIzMyNy4gUmVncmVzc2lvbiBmcm9tIDMuMC4wIG9ud2FyZHMuCgoyMDE1LTA1LTE5OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IHdhcm5pbmcgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIGNvZGUgd2l0aCBNU1ZDLgoJICAgIChGaXhlcyBodHRwczovL3NvdXJjZWZvcmdlLm5ldC9wL3N3aWcvcGF0Y2hlcy8zNTEvIHJlcG9ydGVkIGJ5CgkgICAgTWF0ZXVzeiBTenltYb9za2kpLgoKMjAxNS0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZyBmYXVsdCB3cmFwcGluZyBzaGFyZWRfcHRyIG9mIGNsYXNzZXMgd2l0aCBwcml2YXRlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIAogICAgICAgICAgICBUaGlzIGFsc28gZml4ZXMgdGhlICJ1bnJlZiIgZmVhdHVyZSB3aGVuIHVzZWQgb24gY2xhc3NlcyB3aXRoIHByaXZhdGUgZGVzdHJ1Y3RvcnMuCgoyMDE1LTA1LTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzIChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpCiAgICAgICAgICAgIHNvIHRoYXQgdGhleSBjYW4gYmUgYXBwbGllZCB0byBhIHdpZGVyIHJhbmdlIG9mIHR5cGVzLiBGaXhlcyAjMzg1LgoKMjAxNS0wNS0wNzogb2xseQoJICAgIFtQeXRob25dIERlYWwgd2l0aCBhbiBpbnRlZ2VyIGFzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGEgYm9vbAoJICAgIHBhcmFtZXRlciBpbiB0aGUgQysrIHByb3RvdHlwZS4gIEZpeGVzIGdpdGh1YiAjMzI3LCByZXBvcnRlZCBieQoJICAgIEdyZWcgQWxsZW4uCgoyMDE1LTA1LTA3OiBMaW5kbGV5RgoJICAgIFtKYXZhXSBBbGxvdyBmZWF0dXJlKCJkaXJlY3RvciIpIGFuZCBmZWF0dXJlKCJyZWYiKSB0byBiZSB1c2VkCgkgICAgdG9nZXRoZXIuICBHaXRodWIgUFIjNDAzLgoKMjAxNS0wNS0wNTogb2xseQoJICAgIFN1cHByZXNzIHdhcm5pbmcgMzI1ICJOZXN0ZWQgY2xhc3Mgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgKEZvbwoJICAgIGlnbm9yZWQpIiB3aGVuIEZvbyBoYXMgYWxyZWFkeSBiZWVuIGV4cGxpY2l0bHkgaWdub3JlZCB3aXRoICIlaWdub3JlIi4KCjIwMTUtMDUtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCBzdXBwb3J0IGZvciBmcmllbmQgdGVtcGxhdGVzLCBpbmNsdWRpbmcgb3BlcmF0b3Igb3ZlcmxvYWRpbmcgLSBmaXhlcyAjMTk2LiBDb25zaWRlcmluZwogICAgICAgICAgICB0aGUgZXhhbXBsZSBiZWxvdywgcHJldmlvdXNseSB0aGUgb3BlcmF0b3IgZ2F2ZSBhIHN5bnRheCBlcnJvciBhbmQgZnJpZW5kZnVuYyBpbmNvcnJlY3RseQogICAgICAgICAgICB3YXJuZWQgd2l0aDoKCiAgICAgICAgICAgICAiV2FybmluZyA1MDM6IENhbid0IHdyYXAgJ2ZyaWVuZGZ1bmM8KFR5cGUpPicgdW5sZXNzIHJlbmFtZWQgdG8gYSB2YWxpZCBpZGVudGlmaWVyLiIKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFR5cGU+IGNsYXNzIE15Q2xhc3MgewogICAgICAgICAgICAgICAgZnJpZW5kIGludCBmcmllbmRmdW5jIDxUeXBlPihkb3VibGUgaXMsIE15Q2xhc3MgPFR5cGU+ICYgeCk7CiAgICAgICAgICAgICAgICBmcmllbmQgaW50IG9wZXJhdG9yPDwgPFR5cGU+KGRvdWJsZSB1biwgY29uc3QgTXlDbGFzcyA8VHlwZT4gJngpOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGFsc28gcHJldmlvdXNseSBpbmNvcnJlY3RseSB3YXJuZWQgd2l0aDoKCiAgICAgICAgICAgICAgIldhcm5pbmcgMzAyOiBJZGVudGlmaWVyICd0ZW1wbGF0ZV9mcmllbmQnIHJlZGVmaW5lZCAoaWdub3JlZCksIgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUIHRlbXBsYXRlX2ZyaWVuZChUKTsKICAgICAgICAgICAgICBzdHJ1Y3QgTXlUZW1wbGF0ZSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBmcmllbmQgVCB0ZW1wbGF0ZV9mcmllbmQoVCk7CiAgICAgICAgICAgICAgfTsKCjIwMTUtMDUtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBoYW5kbGluZyBvZiBjb252ZXJzaW9uIG9wZXJhdG9ycyB3aGVyZSB0aGUgb3BlcmF0b3IgaXMgc3BsaXQgb3ZlciBtdWx0aXBsZQogICAgICAgICAgICBsaW5lcyBvciBoYXMgY29tbWVudHMgd2l0aGluIHRoZSBvcGVyYXRvciB0eXBlLiBGaXhlcyAjNDAxLgoKICAgICAgICAgICAgQWxzbyBmaXggc2ltaWxhciBwcm9ibGVtIHdpdGggbm9ybWFsIG9wZXJhdG9ycyB3aGljaCBnYXZlIGEgc3ludGF4IGVycm9yIGlmIHNwbGl0IG92ZXIKICAgICAgICAgICAgbXVsdGlwbGUgbGluZXMgb3IgaGFkIGEgY29tbWVudCB3aXRoaW4gdGhlIG9wZXJhdG9yIGRlY2xhcmF0aW9uLgoKMjAxNS0wNC0zMDogb2xseQoJICAgIElnbm9yZSB1bmtub3duIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHdoaWNoIGFyZSBpbnNpZGUgYW4gaW5hY3RpdmUKCSAgICBjb25kaXRpb25hbCAoZ2l0aHViIGlzc3VlICMzOTQsIHJlcG9ydGVkIGJ5IERhbiBXaWxjb3gpLgoJICAgIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAzLjAuMy4KCjIwMTUtMDQtMjc6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICJkZWZhdWx0IiB0eXBlbWFwIHVzZWQgYWZ0ZXIgYW4gYXJndW1lbnQgd2l0aCAibnVtaW5wdXRzPTAiICgjMzc3KS4KCjIwMTUtMDQtMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCAjMjU2LiBDb2RlIGdlbmVyYXRlZCB3aXRoICctYnVpbHRpbiAtbW9kZXJuYXJncycgc2VnZmF1bHRzIGZvciBhbnkKICAgICAgICAgICAgbWV0aG9kIHRha2luZyB6ZXJvIGFyZ3VtZW50cy4KCiAgICAgICAgICAgIEFsc28gZml4ZXM6ICJTeXN0ZW1FcnJvcjogZXJyb3IgcmV0dXJuIHdpdGhvdXQgZXhjZXB0aW9uIHNldCIgZHVyaW5nIGVycm9yIGNoZWNraW5nCiAgICAgICAgICAgIHdoZW4gdXNpbmcganVzdCAtYnVpbHRpbiBhbmQgdGhlIGluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIGlzIHBhc3NlZCB0byBhIGNsYXNzCiAgICAgICAgICAgIG1ldGhvZCBleHBlY3RpbmcgemVybyBhcmd1bWVudHMuCgoyMDE1LTA0LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQnVnICMzODYgLSBNZW1vcnkgbGVhayBmaXggaW4gKGNoYXIgKlNUUklORywgc2l6ZV90IExFTkdUSCkgdHlwZW1hcHMuCgoyMDE1LTA0LTIzOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIE1ha2UgImRlZmF1bHQiIHR5cGVtYXAgd29yayBhZ2FpbiAoIzMzMCwgIzM3NykuCgoyMDE1LTA0LTIzOiB2YWR6CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgdXNlIG9mIGRlZmF1bHQgdmFsdWVzIGZvciB0aGUgcG9pbnRlciB0eXBlcyAoIzM2NSwgIzM3NikuCgoyMDE1LTA0LTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJ21ha2UgY2hlY2stY2NhY2hlJyB3aGljaCBpcyBwYXJ0IG9mICdtYWtlIGNoZWNrJyB3aGVuIG9uZSBvZiB0aGUgQ0NBQ0hFXwogICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIGZvciBleGFtcGxlIENDQUNIRV9ESVNBQkxFLCBpcyBzZXQuCgoyMDE1LTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBDbGVhcmVyIHdhcm5pbmcgbWVzc2FnZSBmb3IgYmFkbHkgY29uc3RydWN0ZWQgdHlwZWNoZWNrIHR5cGVtYXBzLiBGb3IgZXhhbXBsZSwgd2FzOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzogV2FybmluZyA0Njc6IE92ZXJsb2FkZWQgZm9vKGludCkgbm90IHN1cHBvcnRlZCAobm8gdHlwZSBjaGVja2luZwogICAgICAgICAgICAgIHJ1bGUgZm9yICdpbnQnKS4KCiAgICAgICAgICAgIE5vdzoKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjM6IFdhcm5pbmcgNDY3OiBPdmVybG9hZGVkIGZvbyhpbnQpIG5vdCBzdXBwb3J0ZWQgKGluY29tcGxldGUgdHlwZSBjaGVja2luZwogICAgICAgICAgICAgIHJ1bGUgLSBubyBwcmVjZWRlbmNlIGxldmVsIGluIHR5cGVjaGVjayB0eXBlbWFwIGZvciAnaW50JykuCgoyMDE1LTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ICMzNTMgLSBMaW5rZXIgbXVsdGlwbGUgZGVmaW5pdGlvbiBvZiAnRXhjZXB0aW9uTWF0Y2hlcycgd2hlbgogICAgICAgICAgICB1c2luZyBkaXJlY3RvcnMgYW5kIG11bHRpcGxlIG1vZHVsZXMuCgoyMDE1LTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBNZXJnZSAjMzIwIC0gTWFrZSBfX2RpY3RfXyBhY2Nlc3NpYmxlIGZvciBQeXRob24gYnVpbHRpbiBjbGFzc2VzLgoKMjAxNS0wNC0wNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNzUgLSBwYXJzaW5nIG9mIGV4dGVybiAiQyIgYW5kIHR5cGVkZWYgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgZXh0ZXJuICJDIiB0eXBlZGVmIHZvaWQgKCpIb29rMl90KShpbnQsIGNvbnN0IGNoYXIgKik7CiAgICAgICAgICAgICAgZXh0ZXJuICJDIiB0eXBlZGVmIGludCBJbnRlZ2VyOwoKMjAxNS0wMy0xMjogb2xseQoJICAgIC1EU1dJR19ESVJFQ1RPUl9TVEFUSUMgaXMgbm93IHN1cHBvcnRlZCBmb3IgYWxsIGxhbmd1YWdlcyB3aXRoCgkgICAgZGlyZWN0b3Igc3VwcG9ydCwgbm90IG9ubHkgUHl0aG9uIGFuZCBQSFAuCgoyMDE1LTAzLTAyOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIC1jZ28gb3B0aW9uLCByZXF1aXJlZCBmb3IgR28gdmVyc2lvbnMgMS41IGFuZAoJICAgIGxhdGVyLgoKMjAxNS0wMi0yNjogb2xseQoJICAgIEZpeCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiB0b3A9PU5VTEwsIGludHJvZHVjZWQgYnkgbmVzdGVkIGNsYXNzCgkgICAgaGFuZGxpbmcgKHJlcG9ydGVkIGluIGlzc3VlIzM0NiBieSBQYXdlvyBUb211bGlrKS4KCjIwMTUtMDItMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtHdWlsZV0gRml4IGdlbmVyYXRlZCBjb2RlIGZvciBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzIHdoZW4KICAgICAgICAgICAgZGVmaW5lZCBhbmQgZGVjbGFyZWQgaW5saW5lLgoKMjAxNS0wMi0wOTogbWlzaGFzCiAgICAgICAgICAgIFtHb10gRml4ICVpbXBvcnQgb2YgZmlsZXMgaW4gc3ViIGRpcmVjdG9yaWVzLgoKMjAxNS0wMi0wNTogaWFubGFuY2V0YXlsb3IKICAgICAgICAgICAgW0dvXSBJZ25vcmUgR28gc3BlY2lmaWMgdHlwZSBtYXBzIChnb2luLCBnb291dCwgZXRjLikgaWYgdGhleSBhcmUgZW1wdHkuCgoyMDE1LTAyLTA1OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIEdlbmVyYXRlZCBHbyBjb2RlIG5vIGxvbmdlciBjYWxscyBfc3dpZ19nb2FsbG9jYXRlIG9yCiAgICAgICAgICAgIF9zd2lnX21ha2Vnb3N0cmluZywgYXMgdGhleSB3aWxsIG5vIGxvbmdlciB3b3JrIGFzIG9mIEdvIDEuNS4KClZlcnNpb24gMy4wLjUgKDMxIEphbiAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDEtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24gLWNsYXNzaWMgYW5kIHByb3BlcnR5IHNldHRpbmcuIFNldHRpbmcgcHJvcGVydGllcyBvbiBjbGFzc2ljIGNsYXNzZXMKICAgICAgICAgICAgd2FzIGJyb2tlbiBpbiBzd2lnLTMuMC4zIGJ5IGF0dGVtcHRpbmcgdG8gdXNlIF9fc2V0YXR0cl9fLiBUaGlzIHJlZ3Jlc3Npb24gaXMgZml4ZWQgbm93CiAgICAgICAgICAgIGJ5IHVzaW5nIF9fZGljdF9fIGFnYWluIHdoZW4gdXNpbmcgLWNsYXNzaWMuCiAgICAgICAgICAgIEZpeGVzIHBhdGNoICMyMzIuCgoyMDE1LTAxLTI3OiBzbWFyY2hldHRvCgkgICAgW1NjaWxhYl0gU3VwcG9ydCBmb3IgdGhlIFNjaWxhYiBsYW5ndWFnZSBoYXMgYmVlbiBhZGRlZAoKMjAxNS0wMS0yMzogb2xseQoJICAgIFtQSFBdIFdoZW4gd3JhcHBpbmcgYSByZXR1cm5lZCByZXNvdXJjZSBhcyBhbiBvYmplY3QsIGNoZWNrIGlmIGFsbAoJICAgIGNhc2VzIHdyYXAgaXQgaW4gdGhlIHNhbWUgY2xhc3MsIGFuZCBpZiBzbyBlbGltaW5hdGUgdGhlIHBvaW50bGVzcwoJICAgIHN3aXRjaCBzdGF0ZW1lbnQgd3JhcHBlciB3ZSBwcmV2aW91c2x5IGdlbmVyYXRlZC4KCjIwMTUtMDEtMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIE1lcmdlIHBhdGNoICMyOTcgZm9yIFNGIGJ1ZyAjMTI3NyAtIE9jdGF2ZSBzaGFyZWRfcHRyIHN1cHBvcnQKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIE1lcmdlIHBhdGNoICMyNTAgLSBGaXhlcyBmb3IgdXNpbmcgJWNvbnN0YW50IGFuZCBvYmplY3RzIChub24tcHJpbWl0aXZlIHR5cGVzKQoKMjAxNS0wMS0xNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjIEdvXSBNZXJnZSBwYXRjaCAjMzA4IGFuZCBmaXggIzMwNyAtIEMrKzExIHN0cm9uZ2x5IHR5cGVkIGVudW0gc3VwcG9ydAogICAgICAgICAgICBpbiBkaXJlY3RvcnMKCjIwMTUtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFNlY29uZCBmaXggZm9yICMyOTQgIzI5NiAtIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBTV0lHLTMuMC4zIHdoZW4KICAgICAgICAgICAgd3JhcHBpbmcgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMsIHRoaXMgdGltZSB3aGVuIHVzaW5nIGt3YXJncy4KClZlcnNpb24gMy4wLjQgKDE0IEphbiAyMDE1KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTUtMDEtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnZmF1bHQgaW4gZGlyZWN0b3IgdXBjYWxsIGNoZWNrIHdoZW4gdXNpbmcgUEhQIGJ1aWx0IHdpdGgKCSAgICBaVFMgZW5hYmxlZC4gIEZpeGVzICMxNTUsIHJlcG9ydGVkIGJ5IFBpZXJyZSBMYWJhc3RpZS4KCjIwMTUtMDEtMTI6IHZhZHoKICAgICAgICAgICAgW1B5dGhvbl0gRml4ICMyOTQgIzI5NiAtIFJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBTV0lHLTMuMC4zIHdoZW4KICAgICAgICAgICAgd3JhcHBpbmcgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMuIEludmFsaWQgb3IgbWlzc2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cyB3ZXJlIHNvbWV0aW1lcyBiZWluZyBnZW5lcmF0ZWQgaW50byB0aGUgcHl0aG9uIGxheWVyLgoKMjAxNS0wMS0wODogb2xseQoJICAgIEFsbG93IEMrKzExICJleHBsaWNpdCBjb25zdGV4cHIiLiAgRml4ZXMgZ2l0aHViIGlzc3VlICMyODQgcmVwb3J0ZWQKCSAgICBieSBQYXdlbCBUb211bGlrLiAgQWxzbyBoYW5kbGUgImNvbnN0ZXhwciBleHBsaWNpdCIgYW5kICJjb25zdGV4cHIKCSAgICBzdGF0aWMiLgoKMjAxNS0wMS0wODogb2xseQoJICAgIFdoZW4gcmVwb3J0aW5nIGFuIGVycm9yIGZvciBhIGNvbnN0cnVjdCB3aGljaCBoYXNuJ3QgYmVlbgoJICAgIHRlcm1pbmF0ZWQgd2hlbiB0aGUgZW5kIG9mIHRoZSBmaWxlIGlzIHJlYWNoZWQsIHJlcG9ydCBpdCBhdCB0aGUKCSAgICBzdGFydCBsaW5lIHJhdGhlciB0aGFuICJFT0YiIGFzIHRoZW4gdG9vbHMgbGlrZSBlZGl0b3JzIGFuZCBJREVzCgkgICAgd2lsbCB0YWtlIHlvdSB0byBhIGdlbmVyYWxseSBtb3JlIHVzZWZ1bCBwbGFjZSBmb3IgZml4aW5nIHRoZQoJICAgIHByb2JsZW0uCgoyMDE1LTAxLTA4OiBvbGx5CgkgICAgSW1wcm92ZSBlcnJvciBtZXNzYWdlcyBmb3IgYSBmZXcgY2FzZXMgd2hpY2ggcHJldmlvdXNseSBnYXZlIHRoZQoJICAgIG9uZSBvZiB0aGUgY3J5cHRpYyBjYXRjaC1hbGwgZXJyb3JzICJTeW50YXggZXJyb3IgaW4gaW5wdXQiLgoKMjAxNS0wMS0wODogb2xseQoJICAgIFByb3ZpZGUgLWNwcGV4dCBhcyBhIGdlbmVyYWwgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3Igc2V0dGluZyB0aGUKCSAgICBleHRlbnNpb24gdXNlZCBmb3IgZ2VuZXJhdGVkIEMrKyBmaWxlcyAocHJldmlvdXNseSBpdCB3YXMgc3BlY2lmaWMKCSAgICB0byB0aGUgUEhQIGJhY2tlbmQpLiAgRGVwcmVjYXRlIHRoZSBlcXVpdmFsZW50IC1zdWZmaXggb3B0aW9uCgkgICAgcHJvdmlkZWQgYnkgdGhlIE9jYW1sIGJhY2tlbmQsIGJ1dCBjb250aW51ZSB0byBzdXBwb3J0IHRoYXQgZm9yCgkgICAgbm93LgoKVmVyc2lvbiAzLjAuMyAoMzAgRGVjIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0xMi0yNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyODAgLSBhYm9ydCB1c2luZyBhbGwgZGVmYXVsdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHdpdGhpbiBvdGhlciB0ZW1wbGF0ZQogICAgICAgICAgICBwYXJhbWV0ZXJzLgoKMjAxNC0xMi0yNzogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIElzc3VlICMyODIgcGVybDUgYXJjaGxpYiB2cyBhcmNobGliZXhwCiAgICAgICAgICAgIFtQZXJsXSB0aWR5ICJ3YXJuaW5nOiBkdXBsaWNhdGUgJ2V4dGVybicgZGVjbGFyYXRpb24gc3BlY2lmaWVyIiB3aGVuIGJ1aWxkaW5nIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIHVuZGVyIGNsYW5nCgoyMDE0LTEyLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgc3VwcG9ydCBmb3IgJWNvbnN0YW50IGFuZCBzdHJ1Y3RzL2NsYXNzZXMgLSBpc3N1ZSAjMjcyCgoyMDE0LTEyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzI0NSAtIHJlZ3Jlc3Npb24gKHNpbmNlIHN3aWctMy4wLjApIGluIHRlbXBsYXRlZCBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICAgIFRlbXBsYXRlZCBjb25zdHJ1Y3RvcnMgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCAtIHRoZXkgd2VyZSBpbmNvcnJlY3RseSBpZ25vcmVkIHdpdGggYSB3YXJuaW5nIDUwNDoKICAgICAgICAgICAgIkZ1bmN0aW9uOiB4eXogbXVzdCBoYXZlIGEgcmV0dXJuIHR5cGUuIElnbm9yZWQuIgoKMjAxNC0xMi0wNzogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIEMrKzExIHN0cm9uZ2x5IHR5cGVkIGVudW1lcmF0aW9ucy4KCjIwMTQtMTEtMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhIEMjXSBGaXggbXVsdGlwbHkgZGVmaW5lZCBlcnJvciB3aGVuIHVzaW5nICVyZW5hbWUgb2YgZW51bSBpdGVtcyB3aGVuIHVzaW5nIHRoZSAic2ltcGxlIGVudW0iCiAgICAgICAgICAgIHdyYXBwZXJzLgoKMjAxNC0xMC0yODogdmFkegogICAgICAgICAgICBbUHl0aG9uXSBQYXRjaCAjMjAxIFRoZSBnZW5lcmF0ZWQgLnB5IGZpbGUgbm8gbG9uZ2VyIHVzZXMgKmFyZ3MgZm9yIGFsbCBQeXRob24gcGFyYW1ldGVycy4KICAgICAgICAgICAgSW5zdGVhZCwgdGhlIHBhcmFtZXRlcnMgYXJlIG5hbWVkIHVzaW5nIHRoZSBDKysgcGFyYW1ldGVyIG5hbWVzLgoKICAgICAgICAgICAgImNvbXBhY3RkZWZhdWx0YXJncyIgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZCB0byByZXN0b3JlIHRoZSBvbGQgYmVoYXZpb3VyLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDE0LTEwLTI0OiB0aW1vdGhlZWNvdXIKICAgICAgICAgICAgW0RdIFBhdGNoICMyMDQgVXNlIGNvcmUuYXRvbWljLmF0b21pY09wIHRvIG11dGF0ZSBzaGFyZWQgdmFyaWFibGVzCgoyMDE0LTEwLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaXNzdWUgIzI0MiAtIFVzZSBvZiB0aGUgImt3YXJncyIgZmVhdHVyZSBubyBsb25nZXIgYXV0b21hdGljYWxseSB0dXJucyBvbiB0aGUKICAgICAgICAgICAgImNvbXBhY3RkZWZhdWx0YXJncyIgZmVhdHVyZSBpZiB0aGUgdGFyZ2V0IGxhbmd1YWdlIGRvZXMgbm90IHN1cHBvcnQga3dhcmdzLgogICAgICAgICAgICBUaGlzIGNoYW5nZSBhZmZlY3RzIGFsbCBsYW5ndWFnZXMgZXhjZXB0IFB5dGhvbiBhbmQgUnVieS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMTAtMTA6IGRpb3JjZXR5CiAgICAgICAgICAgIFtQeXRob25dIFBhdGNoICMyMzIgRml4IHByb3BlcnR5IGFjY2VzcyB1c2luZyBkaXJlY3RvcnMKCjIwMTQtMTAtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeGVzIHdoZW4gdXNpbmcgLWJ1aWx0aW4gYW5kIHN0ZDo6dmVjdG9yL3N0ZDo6bGlzdCB3cmFwcGVycyB0byBhbGxvdyBkZWxldGlvbgogICAgICAgICAgICBvZiBzaW5nbGUgZWxlbWVudHMsIHN1Y2ggYXMgJ2RlbCB2ZWNbMF0nLgoKMjAxNC0wOS0zMDogb2xpdmVyYgogICAgICAgICAgICBbSmF2YXNjcmlwdF0gTWVyZ2UgcGF0Y2ggIzIxNiBieSBSaWNoaWU3NjUgLSBBZGRlZCBzdXBwb3J0IGZvciBtYW55IHZlcnNpb25zIG9mIHY4IGphdmFzY3JpcHQuCgoyMDE0LTA5LTMwOiBvbGl2ZXJiCiAgICAgICAgICAgIFtKYXZhc2NyaXB0XSBNZXJnZSBwYXRjaCAjMTk1IGJ5IHppdHRpeCAtIEZpeGVkIEpTQ2xhc3NSZWYgZGVjbGFyYXRpb24gbm90IHVzaW5nIHRoZSBzdGF0aWMgb25lLgoKMjAxNC0wOS0zMDogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEluIGNvbmZpZ3VyZSBzY3JpcHQsIHJlcXVpcmUgR28gMS4xIG9yIGxhdGVyLgoKMjAxNC0wOS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzIwNyAtIEZpeCBObyBtb2R1bGUgZXJyb3Igd2l0aCAtcmVsYXRpdmVpbXBvcnQgd2hlbiB1c2luZyBzaW5nbGUKICAgICAgICAgICAgaGVhZGVyIGZpbGUgaW1wb3J0LgoKMjAxNC0wOS0yNzogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzIwOCAtIEluaXRpYWxpc2UgbmV3bHkgY3JlYXRlZCBhcnJheSB3aGVuIHVzaW5nIGFycmF5X2Z1bmN0aW9ucyBpbiB0aGUKICAgICAgICAgICAgY2FycmF5cy5pIGxpYnJhcnkgKEMrKyB1c2FnZSkuCgoyMDE0LTA5LTI3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gUGF0Y2ggIzE4NyAtIEZpeCBjcmFzaCBvbiBzaHV0ZG93biBvZiB0aGUgUnVieSBpbnRlcnByZXRlciBpZiBtb3JlIHRoYW4gb25lCiAgICAgICAgICAgIG1vZHVsZSB3YXMgbG9hZGVkIGF0IGEgdGltZSB3aGVuIGRhdGEgaXMgYmVpbmcgc2hhcmVkIGJldHdlZW4gbW9kdWxlcy4KCjIwMTQtMDktMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTY4IC0gRml4IGxlYWsgaW4gSmF2YSBkaXJlY3RvciBzdHJpbmcgaGFuZGxpbmcgYWZ0ZXIgdGhlIEphdmEKICAgICAgICAgICAgdXBjYWxsIHdoZW4gY2FsbGVkIGZyb20gYSBuYXRpdmUgdGhyZWFkLgoKMjAxNC0wOS0yNTogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkanVzdCBnZW5lcmF0ZWQgY29kZSB0byB3b3JrIHdpdGggdXBjb21pbmcgR28gMS40CgkgICAgcmVsZWFzZS4KCjIwMTQtMDktMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFkZCBwYXRjaCBmcm9tIFRob21hcyBNYXNsYWNoIHRvIGZpeCBjcmFzaCBpbiB3cmFwcGVycyB3aGVuIHVzaW5nIC10aHJlYWRzIGluCiAgICAgICAgICAgIHRoZSBTVEwgaXRlcmF0b3JzIChTd2lnUHlJdGVyYXRvciBkZXN0cnVjdG9yKS4KCjIwMTQtMDktMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTWVyZ2UgcGF0Y2ggIzIyOSBmcm9tIGNvbnRyZSAtIEFkZCBib29sIGFycmF5IHR5cGVzIHRvIGFycmF5c19jc2hhcnAuaQoKMjAxNC0wOS0xMjogb2xseQoJICAgIFtQSFBdIEFkZCBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGFueSBQSFAgaW50ZXJmYWNlcyBhIHdyYXBwZWQgY2xhc3MKCSAgICBpbXBsZW1lbnRzLCBlLmcuOiAldHlwZW1hcCgicGhwaW50ZXJmYWNlcyIpIE15SXRlcmF0b3IgIkl0ZXJhdG9yIjsKCjIwMTQtMDktMTE6IG9sbHkKCSAgICBbUEhQXSBGaXggdGhyb3dpbmcgYSBQSFAgZXhjZXB0aW9uIHRocm91Z2ggQysrIGZyb20gYSBzdWJjbGFzc2VkCgkgICAgZGlyZWN0b3IgbWV0aG9kIC0gUEhQIE5VTEwgZ2V0cyByZXR1cm5lZCBieSB0aGUgc3ViY2xhc3NlZCBtZXRob2QKCSAgICBpbiB0aGlzIGNhc2UsIHNvIHRoZSBkaXJlY3Rvcm91dCB0eXBlbWFwIG5lZWRzIHRvIGFsbG93IHRoYXQgKGF0CgkgICAgbGVhc3QgaWYgYW4gZXhjZXB0aW9uIGlzIGFjdGl2ZSkuCgoyMDE0LTA5LTA5OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIGdvYXJnb3V0IHR5cGVtYXAuCgoyMDE0LTA5LTA5OiBvbGx5CgkgICAgW1BIUF0gRml4IHNlZ21lbnRhdGlvbiBmYXVsdHMgd2l0aCBkaXJlY3RvcnMgaW4gUEhQID49IDUuNCwgYW5kCgkgICAgcmVlbmFibGUgcnVubWUgdGVzdHMgZm9yIGRpcmVjdG9yX2Jhc2ljIHRlc3RjYXNlLiAgRml4IGZyb20KCSAgICBwYXZlbC1jaGFydmF0IGluIGlzc3VlIzE2NC4KCjIwMTQtMDktMDU6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgaW10eXBlLCBnb2luLCBnb291dCwgZ29kaXJlY3RvcmluLCBhbmQKCSAgICBnb2RpcmVjdG9yb3V0IHR5cGVtYXBzLCB0byBzdXBwb3J0IHdyaXRpbmcgR28gY29kZSB0bwoJICAgIGNvbnZlcnQgYmV0d2VlbiB0eXBlcy4KCjIwMTQtMDktMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggcmVncmVzc2lvbiBpbiBpbmRlbnRhdGlvbiBvZiBweXRob24gY29kZSBwcm9kdWNlZCB3aXRoCgkgICAgLW1vZGVybiwgaW50cm9kdWNlZCBieSBjaGFuZ2VzIGluICMxODguICBSZXBvcnRlZCBieSBmYWJpZW5jYXN0YW4KCSAgICBpbiAjMjE4LgoKMjAxNC0wOS0wMTogb2xseQoJICAgIElzc3VlIGFuIGVycm9yIGZvciB1bmtub3duIFNXSUcgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMsIHJhdGhlcgoJICAgIHRoYW4gcXVpZXRseSBpZ25vcmluZyB0aGVtLiAgUmVwb3J0ZWQgYnkganJoZWxzZXkgaW4gaXNzdWUjMjE3LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wOC0xNTogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEluY2x1ZGUgZ3VhcmQgZml4IGZvciBuZXN0ZWQgbW9kdWxlcyBmcm9tIEFudGhvbnkgSGVhZGluZyAoU0YgUGF0Y2ggIzM1MCkuCgoyMDE0LTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE1lcmdlIHBhdGNoICMyMDAgZnJvbSBncGV0cm91IC0gQ2hhbmdlZCBDU2hhcnAgbGljZW5zZSBoZWFkZXIgdG8gaW5jbHVkZSBhdXRvLWdlbmVyYXRlZAogICAgICAgICAgICB0YWcgc28gdGhhdCBTdHlsZUNvcCBpZ25vcmVzIHRoZSBmaWxlcy4KCjIwMTQtMDgtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBNZXJnZSBwYXRjaCAjMTk4IGZyb20gWXV2YWwgS2FzaHRhbiAtIFN1cHBvcnQgZm9yIGphdmEubmlvLkJ5dGVCdWZmZXIgbWFwcGluZyB0bwogICAgICAgICAgICB1bnNpZ25lZCBjaGFyICogaW4gdmFyaW91cy5pIGluIE5JT0JVRkZFUiB0eXBlbWFwcy4KCjIwMTQtMDctMTQ6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBDaGFuZ2Ugc3RydWN0IGRlZmluaXRpb24gdG8gdXNlIHZvaWQgKiwgbm90IHVpbnQ4LCBzbwoJICAgIHRoYXQgdGhlIHR5cGUgaXMgcmVjb3JkZWQgYXMgcG9zc2libHkgY29udGFpbmluZwoJICAgIHBvaW50ZXJzLiAgVGhpcyBlbnN1cmVzIHRoYXQgdGhlIDEuMyBnYXJiYWdlIGNvbGxlY3RvcgoJICAgIGRvZXMgbm90IGNvbGxlY3QgcG9pbnRlcnMgcGFzc2VkIHRvIEMrKyBjb2RlLgoKMjAxNC0wNy0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGIEJ1ZyAjMTM3NSAtIEV4cGFuc2lvbiBvZiB0aGUgJHBhcmVudGNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlIGluY29ycmVjdGx5IGNvbnRhaW5zCiAgICAgICAgICAgIGJyYWNrZXRzIGluIHRoZSBleHBhbmRlZCBuYW1lLgoKVmVyc2lvbiAzLjAuMiAoNCBKdW4gMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDYtMDI6IHYtZm9yLXZhbmRhbAogICAgICAgICAgICBbTHVhXSBQdWxsIHJlcXVlc3QgIzE3NjoKICAgICAgICAgICAgSWYgY2xhc3MgaGFzIG5vIF9fZXEgaW1wbGVtZW50ZWQsIHRoZW4gZGVmYXVsdCBfX2VxIGlzIGdlbmVyYXRlZC4gCiAgICAgICAgICAgIERlZmF1bHQgX19lcSBjb21wYXJlcyBhY3R1YWwgcG9pbnRlcnMgc3RvcmVkIGluc2lkZSBMdWEgdXNlcmRhdGEuCgoyMDE0LTA2LTAyOiB2a2FsaW5pbgogICAgICAgICAgICBGaXggIzE4MyAtICVleHRlbmQgYW5kIHVubmFtZWQgbmVzdGVkIHN0cnVjdHMKCjIwMTQtMDUtMjg6IGt3d2V0dGUKICAgICAgICAgICAgRml4IGluc3RhbGwgZmFpbHVyZSB3aGVuIHVzaW5nIGFuICdvdXQgb2Ygc291cmNlJyBidWlsZCB1c2luZyB0aGUgc2hpcHBlZAogICAgICAgICAgICB0YXJiYWxsIC0gcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMy4wLjEuCgoyMDE0LTA1LTI0OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIFJlbW92ZSBkZXByZWNhdGVkIC1nbG9iYWwvLW5vZ2xvYmFsIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKClZlcnNpb24gMy4wLjEgKDI3IE1heSAyMDE0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTQtMDUtMjU6IGhmYWxjaWMKCSAgICBbUHl0aG9uXSBQeXRob24gMyBieXRlIHN0cmluZyBvdXRwdXQ6IHVzZSBlcnJvcnM9InN1cnJvZ2F0ZWVzY2FwZSIKICAgICAgICAgICAgaWYgYXZhaWxhYmxlIG9uIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB0aGF0J3MgaW4gdXNlLiBUaGlzIGFsbG93cwogICAgICAgICAgICBvYnRhaW5pbmcgdGhlIG9yaWdpbmFsIGJ5dGUgc3RyaW5nIChhbmQgcG90ZW50aWFsbHkgdHJ5aW5nIGEgZmFsbGJhY2sKICAgICAgICAgICAgZW5jb2RpbmcpIGlmIHRoZSBieXRlcyBjYW4ndCBiZSBkZWNvZGVkIGFzIFVURi04LgoKICAgICAgICAgICAgUHJldmlvdXNseSwgYSBVbmljb2RlRGVjb2RlRXJyb3Igd291bGQgYmUgcmFpc2VkIHdpdGggbm8gd2F5IHRvIHRyZWF0CiAgICAgICAgICAgIHRoZSBkYXRhIGFzIGJ5dGVzIG9yIHRyeSBhbm90aGVyIGNvZGVjLgoKMjAxNC0wNS0xODogdmthbGluaW4KCSAgICBCdWcgIzE3NSAtIFJlc3RvcmUgJWV4dGVuZCB0byB3b3JrIGZvciB1bm5hbWVkIG5lc3RlZCBzdHJ1Y3R1cmVzIGJ5IHVzaW5nIGEgQwogICAgICAgICAgICBzeW1ib2wgY29tcHJpc2luZyB0aGUgb3V0ZXIgc3RydWN0dXJlIG5hbWUgYW5kIHVubmFtZWQgdmFyaWFibGUgaW5zdGFuY2UgbmFtZS4KCjIwMTQtMDUtMTU6IGt3d2V0dGUKCSAgICBBZGQgIzE2NiAtICdtYWtlIGNoZWNrJyBub3cgd29ya3Mgb3V0IG9mIHNvdXJjZS4gVGhpcyByZXF1aXJlZCB0aGUgZXhhbXBsZXMgdG8gYnVpbGQKICAgICAgICAgICAgb3V0IG9mIHNvdXJjZS4gVGhlIG1haW4gbGFuZ3VhZ2VzIGhhdmUgYmVlbiB0ZXN0ZWQgLSBDIywgR28sIEd1aWxlLCBKYXZhLCBKYXZhc2NyaXB0LAogICAgICAgICAgICBMdWEsIE9jdGF2ZSwgUGVybCwgUEhQLCBQeXRob24sIFJ1YnkgYW5kIFRjbC4KCjIwMTQtMDUtMDE6IE9saXZlciBCdWNodGFsYQoJICAgIEphdmFzY3JpcHQgc3VwcG9ydCBhZGRlZCwgc2VlIEphdmFzY3JpcHQgY2hhcHRlciBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KCjIwMTQtMDUtMDE6IG9sbHkKCSAgICBbUEhQXSBUaGUgZ2VuZXJhdGVkIF9faXNzZXQoKSBtZXRob2Qgbm93IHJldHVybnMgdHJ1ZSBmb3IgcmVhZC1vbmx5IHByb3BlcnRpZXMuCgoyMDE0LTA0LTI0OiBrd3dldHRlCiAgICAgICAgICAgIFtHb10gRml4IGdvIC4vY29uZmlndXJlIHBhcnNpbmcgb2YgZ2NjZ28gLS12ZXJzaW9uLCBhbmQKICAgICAgICAgICAgZ29ydW50aW1lLnN3ZyB0eXBvIGluIF9fR05VQ19QQVRDSExFVkVMX18gKFNGIEJ1ZyAjMTI5OCkKCjIwMTQtMDQtMjQ6IGt3d2V0dGUKICAgICAgICAgICAgRml4IHtweXRob258cGVybDV8cnVieXx0Y2x9L2phdmEgZXhhbXBsZXMKCiAgICAgICAgICAgIEluIExpYi9nY2ovY25pLmksIGZvciBjb21wYXRpYmlsaXR5IHdpdGggbmV3ZXIgZ2NqIHZlcnNpb25zOgoKICAgICAgICAgICAgLSByZW1vdmUgSnZBbGxvY09iamVjdCgpIHdoaWNoIGdjaiBubyBsb25nZXIgZGVmaW5lcywgZnJvbSBnY2ogQ2hhbmdlbG9nOgogICAgICAgICAgICAgIDIwMDQtMDQtMTYgIEJyeWNlIE1jS2lubGF5ICA8bWNraW5sYXlAcmVkaGF0LmNvbT4KICAgICAgICAgICAgICAgICogZ2NqL2NuaS5oIChKdkFsbG9jT2JqZWN0KTogUmVtb3ZlIHRoZXNlIG9ic29sZXRlLAogICAgICAgICAgICAgICAgdW5kb2N1bWVudGVkIENOSSBjYWxscy4KCiAgICAgICAgICAgIC0gY2hhbmdlIEp2Q3JlYXRlSmF2YVZNKCkgYXJndW1lbnQgZnJvbSB2b2lkKiB0byBKdlZNSW5pdEFyZ3MqLCBmcm9tIGdjaiBDaGFuZ2Vsb2c6CiAgICAgICAgICAgICAgMjAwNS0wMi0yMyAgVGhvbWFzIEZpdHpzaW1tb25zICA8Zml0enNpbUByZWRoYXQuY29tPgogICAgICAgICAgICAgIFBSIGxpYmdjai8xNjkyMwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIChKdkNyZWF0ZUphdmFWTSk6IERlY2xhcmUgdm1fYXJncyBhcyBKdlZNSW5pdEFyZ3MqIHJhdGhlciB0aGFuIHZvaWQqLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wNC0wODogd3NmdWx0b24KICAgICAgICAgICAgU0YgQnVnICMxMzY2IC0gUmVtb3ZlIGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgb2Ygc3RydG9pbWF4IGFuZCBzdHJ0b3VtYXggaW4gaW50dHlwZXMuaQoKMjAxNC0wNC0wODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEgQyNdIEVudW1zIHdoaWNoIGhhdmUgYmVlbiBpZ25vcmVkIHZpYSAlaWdub3JlIGFuZCBhcmUgc3Vic2VxdWVudGx5CiAgICAgICAgICAgIHVzZWQgYXJlIGhhbmRsZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHkuIFR5cGUgd3JhcHBlciBjbGFzc2VzIGFyZSBub3cgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoaWNoIGFyZSBlZmZlY3RpdmVseSBhIHdyYXBwZXIgb2YgYW4gZW1wdHkgZW51bS4gUHJldmlvdXNseSBpbiBKYXZhIHVuY29tcGlsYWJsZQogICAgICAgICAgICBjb2RlIHdhcyBnZW5lcmF0ZWQgYW5kIGluIEMjIGFuIGludCB3YXMgdXNlZC4KCjIwMTQtMDQtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCByZWdyZXNzaW9uIGluIDMuMC4wIHdoZXJlIGxlZ2FsIGNvZGUgZm9sbG93aW5nIGFuIG9wZXJhdG9yPDwgZGVmaW5pdGlvbiBtaWdodAogICAgICAgICAgICBnaXZlIGEgc3ludGF4IGVycm9yLiBTRiBCdWcgIzEzNjUuCgoyMDE0LTA0LTAzOiBvbGx5CgkgICAgW1BIUF0gRml4IHdyYXBwaW5nIGRpcmVjdG9yIGNvbnN0cnVjdG9ycyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycwoJICAgIHdpdGggYSBaVFMtZW5hYmxlZCBidWlsZCBvZiBQSFAuCgoyMDE0LTA0LTAyOiBvbGx5CgkgICAgW1BIUF0gUGFzcyB0aGUgWlRTIGNvbnRleHQgd2UgYWxyZWFkeSBoYXZlIHRvIGF2b2lkIG5lZWRpbmcgdG8KCSAgICBjYWxsIFRTUk1MU19GRVRDSCwgd2hpY2ggaXMgcmVsYXRpdmVseSBleHBlbnNpdmUuCgoyMDE0LTA0LTAyOiBvbGx5CgkgICAgW1BIUF0gUGFzcyBaVFMgY29udGV4dCB0aHJvdWdoIHRvIHRfb3V0cHV0X2hlbHBlcigpIHNvIGl0IHdvcmtzCgkgICAgd2l0aCBhIFpUUy1lbmFibGVkIGJ1aWxkIG9mIFBIUC4gIFJlcG9ydGVkIGJ5IFBpZXJyZSBMYWJhc3RpZSBpbgoJICAgIGdpdGh1YiBQUiMxNTUuCgoyMDE0LTAzLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDIyBEIEdvXSBGaXhlcyBmb3IgQyBlbnVtcyB1c2VkIGluIGFuIEFQSSBhbmQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudW0KICAgICAgICAgICAgaGFzIG5vdCBiZWVuIHBhcnNlZC4gRm9yIEQsIHRoaXMgZml4ZXMgYSBzZWdmYXVsdCBpbiBTV0lHLiBUaGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIG5vdyBwcm9kdWNlIGNvZGUgdGhhdCBjb21waWxlcywgYWx0aG91Z2ggdGhlIGRlZmluaXRpb24gb2YgdGhlIGVudW0gaXMgbmVlZGVkCiAgICAgICAgICAgIGluIG9yZGVyIHRvIHVzZSB0aGUgZW51bSBwcm9wZXJseSBmcm9tIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgoyMDE0LTAzLTIzOiB2LWZvci12YW5kYWwKICAgICAgICAgICAgW0x1YV0gRml4IGZvciB1c2FnZSBvZiBzbnByaW50ZiBpbiBMdWEgcnVudGltZSB3aGljaCBWaXN1YWwgU3R1ZGlvIGRvZXMgbm90IGhhdmUuCgpWZXJzaW9uIDMuMC4wICgxNiBNYXIgMjAxNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDE0LTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBDKysxMSBzdXBwb3J0IGluaXRpYWxseSBkZXZlbG9wZWQgYXMgQysrMHggc3VwcG9ydCBieSBNYXRldnogSmVrb3ZlYyBhcyBhIEdvb2dsZSBTdW1tZXIgb2YgQ29kZQogICAgICAgICAgICBwcm9qZWN0IGhhcyBiZWVuIGZ1cnRoZXIgZXh0ZW5kZWQuIFRoZSBDKysxMSBzdXBwb3J0IGlzIGNvbXByZWhlbnNpdmUsIGJ1dCBieSBubyBtZWFucyBjb21wbGV0ZQogICAgICAgICAgICBvciB3aXRob3V0IGxpbWl0YXRpb25zLiBGdWxsIGRldGFpbHMgZm9yIGVhY2ggbmV3IGZlYXR1cmUgaW4gQysrMTEgaXMgY292ZXJlZCBpbiB0aGUKICAgICAgICAgICAgQ1BsdXNQbHVzMTEuaHRtbCBjaGFwdGVyIGluIHRoZSBkb2N1bWVudGF0aW9uIHdoaWNoIGlzIGluY2x1ZGVkIGluIFNXSUcgYW5kIGFsc28gYXZhaWxhYmxlCiAgICAgICAgICAgIG9ubGluZSBhdCBodHRwOi8vd3d3LnN3aWcub3JnL0RvYzMuMC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxNC0wMy0xNDogdi1mb3ItdmFuZGFsCiAgICAgICAgICAgIFtMdWFdIE51bWVyb3VzIEx1YSBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIDEuICVuc3BhY2Ugc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gTmFtZXNwYWNlcyBhcmUgbWFwcGVkIHRvIHRhYmxlcyBpbiB0aGUgbW9kdWxlLCB3aXRoIHRoZSBzYW1lCiAgICAgICAgICAgICAgIG5hbWUgYXMgdGhlIEMrKyBuYW1lc3BhY2UuCiAgICAgICAgICAgIDIuIEluaGVyaXRhbmNlIGlzIG5vdyBoYW5kbGVkIGRpZmZlcmVudGx5LiBFYWNoIGNsYXNzIG1ldGF0YWJsZSBrZWVwcyBhIGxpc3Qgb2YgY2xhc3MgYmFzZXMgaW5zdGVhZAogICAgICAgICAgICAgICBvZiBtZXJnaW5nIGFsbCBtZW1iZXJzIG9mIGFsbCBiYXNlcyBpbnRvIHRoZSBkZXJpdmVkIGNsYXNzLgogICAgICAgICAgICAzLiBUaGUgbmV3IG1ldGF0YWJsZXMgcmVzdWx0IGluIGRpZmZlcmVuY2VzIGluIGFjY2Vzc2luZyBjbGFzcyBtZW1iZXJzLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBleGFtcGxlCiAgICAgICAgICAgICAgICAgc3RydWN0IFRlc3QgewogICAgICAgICAgICAgICAgICAgICBlbnVtIHsgVEVTVDEgPSAxMCwgVEVTVDIgPSAyMCB9OwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IElDT05TVCA9IDEyOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIE5vdyB0aGlzIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuVEVTVDEpCiAgICAgICAgICAgICAgICAgICBwcmludChleGFtcGxlLlRlc3QuSUNPTlNUKQogICAgICAgICAgICAgICAgIFRoZSBvbGQgd2F5IHdhczoKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9URVNUMSkKICAgICAgICAgICAgICAgICAgIHByaW50KGV4YW1wbGUuVGVzdF9JQ09OU1QpCgogICAgICAgICAgICA0LiBUaGUgc3BlY2lhbCBjbGFzcyBtZXRhdGFibGUgbWVtYmVyICIuY29uc3RydWN0b3IiIHdhcyByZW1vdmVkLiBOb3cgU1dJRyBnZW5lcmF0ZXMgdGhlIHByb3h5CiAgICAgICAgICAgICAgIGZ1bmN0aW9uIGJ5IGl0c2VsZiBhbmQgYXNzaWducyBpdCBkaXJlY3RseSB0byB0aGUgY2xhc3MgdGFibGUgIl9fY2FsbCIgbWV0aG9kLgogICAgICAgICAgICA1LiBlTHVhIHNob3VsZCBhbHNvIG5vdyBzdXBwb3J0IGluaGVyaXRhbmNlLgogICAgICAgICAgICA2LiAnY29uc3QnIHN1YnRhYmxlIGluIGVMdWEgaXMgY29uc2lkZXJlZCBkZXByZWNhdGVkLgoKICAgICAgICAgICAgQ2hhbmdlcyBpbiBiZWhhdmlvdXI6CiAgICAgICAgICAgIGEuIFlvdSBjYW4gbm8gbG9uZ2VyIGFzc2lnbiB0byBub24tZXhpc3RpbmcgY2xhc3MgbWVtYmVycyBpbiBjbGFzc2VzIHdpdGhvdXQgYSBfX3NldGl0ZW1fXyBtZXRob2QuCiAgICAgICAgICAgICAgIEl0IHdpbGwgY2F1c2UgYSBMdWEgZXJyb3IuCiAgICAgICAgICAgIGIuIFlvdSBjYW4gbm8gbG9uZ2VyIGl0ZXJhdGUgb3ZlciBhIG1vZHVsZSB0YWJsZSBhbmQgY29weSBldmVyeXRoaW5nIGludG8gdGhlIGdsb2JhbCBuYW1lc3BhY2UuCiAgICAgICAgICAgICAgIEFjdHVhbGx5LCB0aGlzIHdhcyBuZXZlciB0aGUgY2FzZSwgYnV0IGl0IGlzIG5vdyBleHBsaWNpdGx5IHByb2hpYml0ZWQuCiAgICAgICAgICAgIGMuIE5vdyBjaGFuZ2luZyBhIGJhc2UgY2xhc3Mgd2lsbCBpbW1lZGlhdGVseSBhZmZlY3QgYWxsIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAgICAgICAgZC4gVGhlcmUgbWlnaHQgYmUgc29tZSBpc3N1ZXMgd2l0aCBpbmhlcml0YW5jZS4gQWx0aG91Z2ggdGhlIGJhc2VzIGl0ZXJhdGlvbiBzY2hlbWUgaXMgdGhlIHNhbWUKICAgICAgICAgICAgICAgYXMgd2FzIHVzZWQgZm9yIG1lcmdpbmcgYmFzZSBjbGFzc2VzIGludG8gZGVyaXZlZCBvbmUsIHNvbWUgdW5rbm93biBpc3N1ZXMgbWF5IGFyaXNlLgoKICAgICAgICAgICAgVGhlIG9sZCBtZXRhdGFibGUgYmVoYXZpb3VyIGNhbiBiZSByZXN0b3JlZCBieSB1c2luZyB0aGUgLW5vLW9sZC1tZXRhdGFibGUtYmluZGluZ3Mgb3B0aW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQ2hhbmdlIGluIGRlZmF1bHQgYmVoYXZpb3VyIHdyYXBwaW5nIEMrKyBib29sLiBPbmx5IGEgUHl0aG9uIFRydWUgb3IgRmFsc2UKICAgICAgICAgICAgd2lsbCBub3cgd29yayBmb3IgQysrIGJvb2wgcGFyYW1ldGVycy4gVGhpcyBmaXhlcyBvdmVybG9hZGluZyBib29sIHdpdGggb3RoZXIgdHlwZXMuCiAgICAgICAgICAgIFB5dGhvbiAyLjMgbWluaW11bSBpcyBub3cgcmVxdWlyZWQgZm9yIHdyYXBwaW5nIGJvb2wuCgogICAgICAgICAgICBXaGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICBjb25zdCBjaGFyKiBvdmVybG9hZGVkKGJvb2wgdmFsdWUpIHsgcmV0dXJuICJib29sIjsgfQogICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG92ZXJsb2FkZWQoaW50IHZhbHVlKSB7IHJldHVybiAiaW50IjsgfQoKICAgICAgICAgICAgUHJldmlvdXMgYmVoYXZpb3VyOgogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKEZhbHNlKQogICAgICAgICAgICAgICdpbnQnCiAgICAgICAgICAgICAgPj4+IG92ZXJsb2FkZWQoVHJ1ZSkKICAgICAgICAgICAgICAnaW50JwogICAgICAgICAgICAgID4+PiBvdmVybG9hZGVkKDApCiAgICAgICAgICAgICAgJ2ludCcKCiAgICAgICAgICAgIE5vdyB3ZSBnZXQgdGhlIGV4cGVjdGVkIGJlaGF2aW91cjoKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZChGYWxzZSkKICAgICAgICAgICAgICAnYm9vbCcKICAgICAgICAgICAgICA+Pj4gb3ZlcmxvYWRlZCgwKQogICAgICAgICAgICAgICdpbnQnCgogICAgICAgICAgICBUaGUgY29uc2VxdWVuY2UgaXMgd2hlbiB3cmFwcGluZyBib29sIGluIG5vbi1vdmVybG9hZGVkIGZ1bmN0aW9uczoKCiAgICAgICAgICAgICAgY29uc3QgY2hhciogYm9vbGZ1bmN0aW9uKGJvb2wgdmFsdWUpIHsgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsgfQoKICAgICAgICAgICAgVGhlIHByZXZpb3VzIGJlaGF2aW91ciB3YXMgdmVyeSBQeXRob25pYzoKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKCIiKQogICAgICAgICAgICAgICdmYWxzZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKCJoaSIpCiAgICAgICAgICAgICAgJ3RydWUnCiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigxMi4zNCkKICAgICAgICAgICAgICAndHJ1ZScKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKDApCiAgICAgICAgICAgICAgJ2ZhbHNlJwogICAgICAgICAgICAgID4+PiBib29sZnVuY3Rpb24oMSkKICAgICAgICAgICAgICAndHJ1ZScKCiAgICAgICAgICAgIE5vdyB0aGUgbmV3IGJlaGF2aW91ciBtb3JlIGFsb25nIHRoZSBsaW5lcyBvZiBDKysgZHVlIHRvIHN0cmljdGVyIHR5cGUgY2hlY2tpbmcuIFRoZQogICAgICAgICAgICBhYm92ZSBjYWxscyByZXN1bHQgaW4gYW4gZXhjZXB0aW9uIGFuZCBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgY29udmVydGVkIGludG8gYSBib29sIGFzCiAgICAgICAgICAgIGZvbGxvd3M6CiAgICAgICAgICAgICAgPj4+IGJvb2xmdW5jdGlvbigwKQogICAgICAgICAgICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKICAgICAgICAgICAgICAgIEZpbGUgIjxzdGRpbj4iLCBsaW5lIDEsIGluIDxtb2R1bGU+CiAgICAgICAgICAgICAgVHlwZUVycm9yOiBpbiBtZXRob2QgJ2Jvb2xmdW5jdGlvbicsIGFyZ3VtZW50IDEgb2YgdHlwZSAnYm9vbCcKICAgICAgICAgICAgICA+Pj4gYm9vbGZ1bmN0aW9uKGJvb2woMCkpCiAgICAgICAgICAgICAgJ2ZhbHNlJwoKICAgICAgICAgICAgVGhlIG9sZCBiZWhhdmlvdXIgY2FuIGJlIHJlc3VycmVjdGVkIGJ5IHBhc3NpbmcgdGhlIC1EU1dJR19QWVRIT05fTEVHQUNZX0JPT0wgY29tbWFuZCBsaW5lCiAgICAgICAgICAgIHBhcmFtZXRlciB3aGVuIGV4ZWN1dGluZyBTV0lHLiBUeXBlbWFwcyBjYW4gb2YgY291cnNlIGJlIHdyaXR0ZW4gdG8gY3VzdG9taXNlIHRoZSBiZWhhdmlvdXIKICAgICAgICAgICAgZm9yIHNwZWNpZmljIHBhcmFtZXRlcnMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDE0LTAzLTA2OiB3c2Z1bHRvbgoJICAgIEZpeCBTRiBCdWcgIzEzNjMgLSBQcm9ibGVtIHdpdGggbWV0aG9kIG92ZXJsb2FkaW5nIHdoZW4gc29tZSBtZXRob2RzIGFyZSBhZGRlZCBieSAlZXh0ZW5kCiAgICAgICAgICAgIGFuZCBvdGhlcnMgYXJlIHJlYWwgbWV0aG9kcyBhbmQgdXNpbmcgdGVtcGxhdGUgZGVmYXVsdCBwYXJhbWV0ZXJzIHdpdGggc21hcnQgcG9pbnRlcnMuCiAgICAgICAgICAgIFRoaXMgaXMgbm90aWNlYWJsZSBhcyBhIHJlZ3Jlc3Npb24gc2luY2UgMi4wLjEyIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgc21hcnQgcG9pbnRlcgogICAgICAgICAgICBoYW5kbGluZyBmb3Igc29tZSBsYW5ndWFnZXMgd2hlbiB0aGUgc21hcnQgcG9pbnRlciB3cmFwcyBzdGQ6Om1hcCBhbmQgb3RoZXIgU1RMIGNvbnRhaW5lcnMuCgoyMDE0LTAzLTAyOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFNGIFBhdGNoICMzNDYgZnJvbSBKZW5zIEtydWVnZXIuIENvcnJlY3QgZXhjZXB0aW9uIHRocm93biBhdHRlbXB0aW5nIHRvCiAgICAgICAgICAgIGFjY2VzcyBhIG5vbi1leGlzdGVudCBDL0MrKyBnbG9iYWwgdmFyaWFibGUgb24gdGhlICdjdmFyJyBvYmplY3QuIFRoZSBleGNlcHRpb24gdGhyb3duCiAgICAgICAgICAgIHVzZWQgdG8gYmUgYSBOYW1lRXJyb3IuIEhvd2V2ZXIsIGFzIHRoaXMgYWNjZXNzIGlzIHZpYSBhIHByaW1hcnksIGFuIEF0dHJpYnV0ZUVycm9yCiAgICAgICAgICAgIGlzIG1vcmUgY29ycmVjdCBhbmQgc28gdGhlIGV4Y2VwdGlvbiB0aHJvd24gbm93IGlzIGFuIEF0dHJpYnV0ZUVycm9yLiBSZWZlcmVuY2U6CiAgICAgICAgICAgIGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvMi9yZWZlcmVuY2UvZXhwcmVzc2lvbnMuaHRtbCNhdHRyaWJ1dGUtcmVmZXJlbmNlcwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxNC0wMy0wMTogd3NmdWx0b24KCSAgICBbUHl0aG9uXSBQYXRjaCAjMTQzIEZpeCB0eXBlIHNob3duIHdoZW4gdXNpbmcgdHlwZSgpIHRvIGluY2x1ZGUgdGhlIG1vZHVsZSBhbmQgcGFja2FnZQogICAgICAgICAgICBuYW1lIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDE0LTAzLTAxOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIFNGIHBhdGNoICMzNDcgRml4IG1pc3NpbmcgYXJndW1lbnQgY291bnQgY2hlY2tpbmcgd2l0aCAtbW9kZXJuLgogICAgICAgICAgICBGaXhlcyByZWdyZXNzaW9uIGludHJvZHVjZWQgd2hlbiBidWlsdGluIGNoYW5nZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFNXSUctMi4wLjMuCgoyMDE0LTAyLTIxOiB3c2Z1bHRvbgoJICAgIFtQSFBdIEZpeCB3YXJuaW5nIHN1cHByZXNzaW9uIHVzaW5nICV3YXJuZmlsdGVyIGZvciBQSFAgcmVzZXJ2ZWQgY2xhc3MgbmFtZXMuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgW0x1YV0gQWRkIGtleXdvcmQgd2FybmluZ3MgZm9yIEx1YSBrZXl3b3JkcyBhbmQgQmFzaWMgRnVuY3Rpb25zLgoKMjAxNC0wMi0xOTogb2xseQoJICAgIC1XYWxsa3cgbm93IGluY2x1ZGVzIGtleXdvcmRzIGZvciBhbGwgbGFuZ3VhZ2VzIHdpdGgga2V5d29yZAoJICAgIHdhcm5pbmdzIChwcmV2aW91c2x5IEdvIGFuZCBSIHdlcmUgbWlzc2luZykuCgoyMDE0LTAyLTE5OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBsaXN0cyBvZiBQSFAga2V5d29yZHMgd2l0aCBuZXcgb25lcyBmcm9tIFBIUCA1LjQKCSAgICBhbmQgbmV3ZXIgKGFuZCBzb21lIG1pc3Npbmcgb25lcyBmcm9tIDUuMykuICBSZXNlcnZlZCBQSFAgY29uc3RhbnRzCgkgICAgbmFtZXMgYXJlIG5vdyBjaGVja2VkIGFnYWluc3QgZW51bSB2YWx1ZXMgYW5kIGNvbnN0YW50cywgaW5zdGVhZAoJICAgIG9mIGFnYWluc3QgZnVuY3Rpb24gYW5kIG1ldGhvZCBuYW1lcy4gIEJ1aWx0LWluIFBIUCBmdW5jdGlvbiBuYW1lcwoJICAgIG5vIGxvbmdlciBtYXRjaCBtZXRob2RzIGFkZGVkIGJ5ICVleHRlbmQuICBGdW5jdGlvbnMgYW5kIG1ldGhvZHMKCSAgICBuYW1lZCAnX19zbGVlcCcsICdfX3dha2V1cCcsICdub3QnLCAncGFyZW50Jywgb3IgJ3ZpcnR1YWwnIGFyZSBubwoJICAgIGxvbmdlciBuZWVkbGVzc2x5IHJlbmFtZWQuCgoyMDE0LTAyLTE1OiB3c2Z1bHRvbgoJICAgIEZpeCB0aGUgJSRpc21lbWJlciAlcmVuYW1lIHByZWRpY2F0ZXMgdG8gYWxzbyBhcHBseSB0byBtZW1iZXJzIGFkZGVkIHZpYSAlZXh0ZW5kLgoKICAgICAgICAgICAgQWRkICUkaXNleHRlbmRtZW1iZXIgZm9yICVyZW5hbWUgb2YgbWVtYmVycyBhZGRlZCB2aWEgJWV4dGVuZC4gVGhpcyBjYW4gYmUgdXNlZCB0bwogICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIG5vcm1hbCBjbGFzcy9zdHJ1Y3QgbWVtYmVycyBhbmQgJWV4dGVuZCBtZW1iZXJzLiBGb3IgZXhhbXBsZQogICAgICAgICAgICAnJSRpc21lbWJlciwgJSRub3QgJSRpc2V4dGVuZG1lbWJlcicgd2lsbCBub3cgaWRlbnRpZnkganVzdCBjbGFzcy9zdHJ1Y3QgbWVtYmVycy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDItMTY6IGhmYWxjaWMKICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggIzEzNyAtIGZpeCBjcmFzaGVzL2V4Y2VwdGlvbnMgaW4gZXhjZXB0aW9uIGhhbmRsaW5nIGluIFB5dGhvbiAzLjMKCjIwMTQtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBZGQgc3VwcG9ydCBmb3IgdGhlIGNkYXRhIGxpYnJhcnkuCgoyMDE0LTAyLTA4OiB2a2FsaW5pbgogICAgICAgICAgICBOZXN0ZWQgY2xhc3Mgc3VwcG9ydCBhZGRlZC4gVGhpcyBwcmltYXJpbHkgYWxsb3dzIFNXSUcgdG8gcHJvcGVybHkgcGFyc2UgbmVzdGVkCiAgICAgICAgICAgIGNsYXNzZXMgYW5kIGtlZXAgdGhlIG5lc3RlZCBjbGFzcyBpbmZvcm1hdGlvbiBpbiB0aGUgcGFyc2UgdHJlZS4gSmF2YSBhbmQgQyMKICAgICAgICAgICAgaGF2ZSB1dGlsaXNlZCB0aGlzIGluZm9ybWF0aW9uIHdyYXBwaW5nIHRoZSBDKysgbmVzdGVkIGNsYXNzZXMgYXMgSmF2YS9DIwogICAgICAgICAgICBuZXN0ZWQgY2xhc3Nlcy4gVGhlIHJlbWFpbmluZyB0YXJnZXQgbGFuZ3VhZ2VzIGlnbm9yZSBuZXN0ZWQgY2xhc3NlcyBhcyBpbgogICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucy4gSGVscCBpcyBuZWVkZWQgYnkgdXNlcnMgb2YgdGhlc2UgcmVtYWluaW5nIGxhbmd1YWdlcyB0bwogICAgICAgICAgICBkZXNpZ24gaG93IEMrKyBuZXN0ZWQgY2xhc3NlcyBjYW4gYmUgYmVzdCB3cmFwcGVkLiBQbGVhc2UgdGFsayB0byB1cyBvbiB0aGUKICAgICAgICAgICAgc3dpZy1kZXZlbCBtYWlsaW5nIGxpc3QgaWYgeW91IHRoaW5rIHlvdSBjYW4gaGVscC4KCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoZXJlIHdhcyBsaW1pdGVkIG5lc3RlZCBjbGFzcyBzdXBwb3J0LiBOZXN0ZWQgY2xhc3NlcyB3ZXJlIHRyZWF0ZWQKICAgICAgICAgICAgYXMgb3BhcXVlIHBvaW50ZXJzLiBIb3dldmVyLCB0aGUgIm5lc3RlZHdvcmthcm91bmQiIGZlYXR1cmUgcHJvdmlkZWQgYSB3YXkgdG8KICAgICAgICAgICAgd3JhcCBhIG5lc3RlZCBjbGFzcyBhcyBpZiBpdCB3YXMgYSBnbG9iYWwgY2xhc3MuIFRoaXMgZmVhdHVyZSBubyBsb25nZXIgZXhpc3RzCiAgICAgICAgICAgIGFuZCBpcyByZXBsYWNlZCBieSB0aGUgbmV3ICJmbGF0bmVzdGVkIiBmZWF0dXJlLiBUaGlzIGVmZmVjdGl2ZWx5IGRvZXMgdGhlIHNhbWUKICAgICAgICAgICAgdGhpbmcgd2l0aCBsZXNzIG1hbnVhbCBjb2RlIHRvIGJlIHdyaXR0ZW4uIFBsZWFzZSBzZWUgdGhlICdOZXN0ZWQgY2xhc3NlcycKICAgICAgICAgICAgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBpbiBTV0lHUGx1cy5odG1sIGlmIHlvdSB3ZXJlIHByZXZpb3VzbHkgdXNpbmcgdGhpcwogICAgICAgICAgICBmZWF0dXJlLgoKICAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIHRoZSBjb250ZW50cyBvZiBuZXN0ZWQgY2xhc3NlcyB3aGVyZSBwcmV2aW91c2x5IGl0IGRpZCBub3QuIFlvdQogICAgICAgICAgICBtYXkgZmluZCB0aGF0IHlvdSB3aWxsIG5lZWQgdG8gbWFrZSBhZGp1c3RtZW50cyB0byB5b3VyIGludGVyZmFjZSBmaWxlIGFzCiAgICAgICAgICAgIGVmZmVjdGl2ZWx5IGV4dHJhIGNvZGUgaXMgYmVpbmcgd3JhcHBlZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTQtMDItMDY6IGdqYW5zc2VucwogICAgICAgICAgICBbR3VpbGVdIFBhdGNoICMxMzMuIE1ha2Ugc2NtIHRvIHN0cmluZyBjb252ZXJzaW9uIHdvcmsgd2l0aCBub24tYXNjaWkgc3RyaW5ncy4KICAgICAgICAgICAgR3VpbGUgMiBoYXMgYSBjb21wbGV0ZWx5IHJld3JpdHRlbiBzdHJpbmcgaW1wbGVtZW50YXRpb24uIFNXSUcgbWFkZSBzb21lIGFzc3VtcHRpb25zCiAgICAgICAgICAgIHRoYXQgYXJlIG5vIGxvbmdlciB2YWxpZCBhcyB0byB0aGUgaW50ZXJuYWxzIG9mIGd1aWxlJ3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgoKMjAxNC0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgbmV3IHN3aWd0eXBlX2lub3V0LmkgbGlicmFyeSBjb250YWluaW5nIFNXSUdUWVBFIComIE9VVFBVVCB0eXBlbWFwcy4KCiAgICAgICAgICAgIEV4YW1wbGUgdXNhZ2Ugd3JhcHBpbmc6CgogICAgICAgICAgICAgIHZvaWQgZihYWFggKiYgeCkgeyB4ID0gbmV3IFhYWCgxMTEpOyB9CgogICAgICAgICAgICB3b3VsZCBiZToKCiAgICAgICAgICAgICAgWFhYIHggPSBudWxsOwogICAgICAgICAgICAgIGYob3V0IHgpOwogICAgICAgICAgICAgIC8vIHVzZSB4CiAgICAgICAgICAgICAgeC5EaXNwb3NlKCk7IC8vIG1hbnVhbGx5IGNsZWFyIG1lbW9yeSBvciBvdGhlcndpc2UgbGVhdmUgb3V0IGFuZCBsZWF2ZSBpdCB0byB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKCjIwMTQtMDEtMjE6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBBZGQgJWdvX2ltcG9ydCBkaXJlY3RpdmUuCgoyMDE0LTAxLTIxOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gQWRkIHN1cHBvcnQgZm9yIEdvIDEuMywgbm90IHlldCByZWxlYXNlZC4KCjIwMTQtMDEtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGV4Y2VwdGlvbnMgKFN3aWc6OkRpcmVjdG9yRXhjZXB0aW9uKSBub3cgZGVyaXZlIGZyb20gc3RkOjpleGNlcHRpb24KICAgICAgICAgICAgYW5kIGhlbmNlIHByb3ZpZGUgdGhlIHdoYXQoKSBtZXRob2QuIEluIFB5dGhvbiBhbmQgUnVieSwgdGhpcyByZXBsYWNlcyB0aGUgbm93CiAgICAgICAgICAgIGRlcHJlY2F0ZWQgRGlyZWN0b3JFeGNlcHRpb246OmdldE1lc3NhZ2UoKSBtZXRob2QuCgoyMDE0LTAxLTE0OiBkaW9yY2V0eQogICAgICAgICAgICBQYXRjaCAjMTEyIC0gRml4IHN5bWJvbCByZXNvbHV0aW9uIGludm9sdmluZyBzY29wZXMgdGhhdCBoYXZlIG11bHRpcGxlIGxldmVscwogICAgICAgICAgICBvZiB0eXBlZGVmcyAtIGZpeGVzIHNvbWUgdGVtcGxhdGUgcmVzb2x1dGlvbnMgYXMgd2VsbCBhcyBzb21lIHR5cGVtYXAgc2VhcmNoZXMuCgoyMDE0LTAxLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYW5kIGRvY3VtZW50IHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgb3ZlcnJpZGUgYmVoYXZpb3VyIC0gdGhlIG5hdHVyYWx2YXIKICAgICAgICAgICAgZmVhdHVyZSBhdHRhY2hlZCB0byBhIHZhcmlhYmxlIG5hbWUgaGFzIHByZWNlZGVuY2Ugb3ZlciB0aGUgbmF0dXJhbHZhcgogICAgICAgICAgICBmZWF0dXJlIGF0dGFjaGVkIHRvIHRoZSB2YXJpYWJsZSdzIHR5cGUuIFRoZSBvdmVycmlkaW5nIHdhcyBub3Qgd29ya2luZwogICAgICAgICAgICB3aGVuIHR1cm5pbmcgdGhlIGZlYXR1cmUgb2ZmIG9uIHRoZSB2YXJpYWJsZSdzIG5hbWUuCgogICAgICAgICAgICBGaXggc28gdGhhdCBhbnkgdXNlIG9mIHRoZSBuYXR1cmFsdmFyIGZlYXR1cmUgd2lsbCBvdmVycmlkZSB0aGUgZ2xvYmFsCiAgICAgICAgICAgIHNldHRpbmcuIFByZXZpb3VzbHkgd2hlbiBzZXQgZ2xvYmFsbHkgYnkgLW5hdHVyYWx2YXIgb3IgJW1vZHVsZShuYXR1cmFsdmFyPTEpLAogICAgICAgICAgICB1c2Ugb2YgdGhlIG5hdHVyYWx2YXIgZmVhdHVyZSB3YXMgbm90IGFsd2F5cyBob25vdXJlZC4KCjIwMTQtMDEtMDY6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBGaXggYnVnIHRoYXQgYnJva2UgdXNpbmcgZGlyZWN0b3JzIGZyb20gYSB0aHJlYWQgbm90CgkgICAgY3JlYXRlZCBieSBHby4KCjIwMTMtMTItMjQ6IHB0b211bGlrCiAgICAgICAgICAgIFtQeXRob25dIFNGIEJ1ZyAjMTI5NwoKICAgICAgICAgICAgUmVzb2x2ZSBzZXZlcmFsIGlzc3VlcyByZWxhdGVkIHRvIHB5dGhvbiBpbXBvcnRzLgogICAgICAgICAgICBGb3IgZXhhbXBsZSwgaXQncyBub3cgcG9zc2libGUgdG8gaW1wb3J0IG1vZHVsZXMgaGF2aW5nIHRoZSBzYW1lIG1vZHVsZQogICAgICAgICAgICBuYW1lcywgYnV0IGJlbG9uZ2luZyBpbiBkaWZmZXJlbnQgcGFja2FnZXMuCiAgICAgICAgICAgIAogICAgICAgICAgICBGcm9tIHRoZSB1c2VyJ3Mgdmlld3BvaW50LCB0aGlzIHBhdGNoIGdpdmVzIGEgbGl0dGxlIGJpdCBtb3JlIGNvbnRyb2wgb24KICAgICAgICAgICAgaW1wb3J0IHN0YXRlbWVudHMgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoZSB1c2VyIG1heSBjaG9vc2UgdG8gdXNlIHJlbGF0aXZlCiAgICAgICAgICAgIG9yIGFic29sdXRlIGltcG9ydHMuCiAgICAgICAgICAgIAogICAgICAgICAgICBTb21lIGRldGFpbHM6CiAgICAgICAgICAgICAgLSB3ZSAoc3RpbGwpIGdlbmVyYXRlIGltcG9ydCBzdGF0ZW1lbnRzIGluIHRoZSBmb3JtICdpbXBvcnQgYS5iLmMnIHdoaWNoCiAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byBhYnNvbHV0ZSBpbXBvcnRzIGluIHB5dGhvbjMgYW5kICh0aGUgb25seSBhdmFpbGFibGUpCiAgICAgICAgICAgICAgICBhbWJpZ3VvdXMgb25lIGluIHB5dGhvbjIuCiAgICAgICAgICAgICAgLSBhZGRlZCAtcmVsYXRpdmVpbXBvcnQgb3B0aW9uIHRvIHVzZSBleHBsaWNpdCByZWxhdGl2ZSBpbXBvcnQgc3ludGF4CiAgICAgICAgICAgICAgICAocHl0aG9uMyksCgogICAgICAgICAgICBUaGUgIlB5dGhvbiBQYWNrYWdlcyIgc2VjdGlvbiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBkaXNjdXNzZXMgaG93IHRvIHdvcmsKICAgICAgICAgICAgd2l0aCBpbXBvcnRpbmcgcGFja2FnZXMgaW5jbHVkaW5nIHRoZSBuZXcgLXJlbGF0aXZlaW1wb3J0IGNvbW1hbmQgbGluZSBvcHRpb24uCgoyMDEzLTEyLTIzOiB2YWR6CiAgICAgICAgICAgIFtPY3RhdmUsIFBlcmwsIFB5dGhvbiwgUiwgUnVieSwgVGNsXSBDaGFuZ2UgdGhlIGxlbmd0aCBvZiBzdHJpbmdzIGNyZWF0ZWQgZnJvbSBmaXhlZC1zaXplIGNoYXIKICAgICAgICAgICAgYnVmZmVycyBpbiBDIGNvZGUuCgogICAgICAgICAgICBUaGlzIGlzIGEgcG90ZW50aWFsIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGJyZWFrOiBhICJjaGFyIGJ1Zls1XSIgY29udGFpbmluZyAiaG9cMGxhIiB3YXMKICAgICAgICAgICAgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDUgYmVmb3JlLCBidXQgaXMgcmV0dXJuZWQgYXMgYSBzdHJpbmcgb2YgbGVuZ3RoIDIgbm93LiBBbHNvLAogICAgICAgICAgICBpdCB3YXMgcG9zc2libGUgdG8gYXNzaWduIGEgKG5vbi1OVUwtdGVybWluYXRlZCkgc3RyaW5nICJoZWxsbyIgdG8gc3VjaCBhIGJ1ZmZlciBiZWZvcmUgYnV0CiAgICAgICAgICAgIG5vdyB0aGlzIGZhaWxzIGFuZCBvbmx5ICJoZWxvIiBjYW4gZml0LgoKICAgICAgICAgICAgQXBwbHkgImNoYXIgRklYU0laRVtBTlldIiB0eXBlbWFwcyB0byBleHBsaWNpdGx5IGNob29zZSB0aGUgb2xkIGJlaGF2aW91ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTMtMTItMjM6IHRhbGJ5CiAgICAgICAgICAgIFtQZXJsXSBBZGQgc3VwcG9ydCBmb3IgZGlyZWN0b3JzLgoKMjAxMy0xMi0xODogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIERvbid0IHJlcXVpcmUgdGhhdCBHbyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmUgc2V0CgkgICAgd2hlbiBydW5uaW5nIGV4YW1wbGVzIG9yIHRlc3RzdWl0ZSB3aGVuIHVzaW5nIEdvIDEgb3IKCSAgICBsYXRlci4KCjIwMTMtMTItMTc6IGlhbmxhbmNldGF5bG9yCgkgICAgW0dvXSBSZW1vdmUgLWxvbmdzaXplIG9wdGlvbiAoZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksCgkgICAgaWdub3JlIGl0IGlmIHNlZW4pLgoKMjAxMy0xMi0xNzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCAtZ28tcGtncGF0aCBvcHRpb24uCgoyMDEzLTEyLTE2OiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gVXBkYXRlIGZvciBHbyAxLjIgcmVsZWFzZS4gIEFkZCBzdXBwb3J0IGZvciBsaW5raW5nCgkgICAgU1dJRyBjb2RlIGRpcmVjdGx5IGludG8gZXhlY3V0YWJsZSwgcmF0aGVyIHRoYW4gdXNpbmcgYQoJICAgIHNoYXJlZCBsaWJyYXJ5LgoKMjAxMy0xMi0xMzogaWFubGFuY2V0YXlsb3IKCSAgICBbR29dIEFkZCBTV0lHIHNvdXJjZSBmaWxlIG5hbWUgYXMgY29tbWVudHMgaW4gZ2VuZXJhdGVkCgkgICAgZmlsZXMuICBUaGlzIGNhbiBiZSB1c2VkIGJ5IEdvIGRvY3VtZW50YXRpb24gdG9vbHMuCgoyMDEzLTEyLTEyOiBqbGV2ZXF1ZQoJICAgIFtMdWFdIEZpeCB0eXBvICh3Y2hhciBpbnN0ZWFkIG9mIHdjaGFyX3QpIHdoaWNoIG1hZGUgd2NoYXIuaQoJICAgIGZvciBMdWEgdXNlbGVzcy4KCjIwMTMtMTItMTI6IHZtaWtsb3MKCSAgICBbUEhQXSBQSFAncyBwZWN1bGlhciBjYWxsLXRpbWUgcGFzcy1ieS1yZWZlcmVuY2UgZmVhdHVyZSB3YXMKCSAgICBkZXByZWNhdGVkIGluIFBIUCA1LjMgYW5kIHJlbW92ZWQgaW4gUEhQIDUuNCwgc28gdXBkYXRlIHRoZSBSRUYKCSAgICB0eXBlbWFwcyBpbiBwaHBwb2ludGVycy5pIHRvIHNwZWNpZnkgcGFzcy1ieS1yZWZlcmVuY2UgaW4gdGhlCgkgICAgZnVuY3Rpb24gZGVmaW5pdGlvbi4gIEV4YW1wbGVzL3BocC9wb2ludGVyIGhhcyBiZWVuIHVwZGF0ZWQKCSAgICBhY2NvcmRpbmdseS4KCjIwMTMtMTItMTI6IG9sbHkKCSAgICBbUEhQXSBUaGUgdXNhZ2Ugb2YgJGlucHV0IGluIFBIUCBkaXJlY3Rvcm91dCB0eXBlbWFwcyBoYXMgYmVlbgoJICAgIGNoYW5nZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIG90aGVyIGxhbmd1YWdlcy4gIFRoZSB0eXBlbWFwcwoJICAgIHByb3ZpZGVkIGJ5IFNXSUcgaGF2ZSBiZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHksIGJ1dCBpZiB5b3UKCSAgICBoYXZlIHdyaXR0ZW4geW91ciBvd24gZGlyZWN0b3JvdXQgdHlwZW1hcHMsIHlvdSdsbCBuZWVkIHRvCgkgICAgdXBkYXRlICRpbnB1dCB0byAmJGlucHV0IChvciBtYWtlIGVxdWl2YWxlbnQgY2hhbmdlcykuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTExLTI3OiB2YWR6CiAgICAgICAgICAgIFtDIywgSmF2YSwgUHl0aG9uXSBBZGQgc3RkX2F1dG9fcHRyLmkgZGVmaW5pbmcgdHlwZW1hcHMgZm9yIHJldHVybmluZyBzdGQ6OmF1dG9fcHRyPD4uCgoyMDEzLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoICM3OSBmcm9tIEJyYW50IEt5c2VyCiAgICAgICAgICAgICAgLSBSZW1vdmUgdXNpbmcgZGlyZWN0aXZlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgQyMgY29kZSBhbmQgZnVsbHkgcXVhbGlmeSB0aGUgdXNlIG9mIGFsbCAuTkVUCiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgdHlwZXMgaW4gb3JkZXIgdG8gbWluaW1pemUgcG90ZW50aWFsIG5hbWUgY29sbGlzaW9ucyBmcm9tIGlucHV0IGZpbGVzIGRlZmluaW5nCiAgICAgICAgICAgICAgICB0eXBlcywgbmFtZXNwYWNlLCBldGMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIC5ORVQgZnJhbWV3b3JrIG1lbWJlcnMuCiAgICAgICAgICAgICAgLSBHbG9iYWxseSBxdWFsaWZ5IHRoZSB1c2Ugb2YgLk5FVCBmcmFtZXdvcmsgdHlwZXMgaW4gdGhlIFN5c3RlbSBuYW1lc3BhY2UKICAgICAgICAgICAgICAtIFJlbW92ZSAuTkVUIDEuMSBzdXBwb3J0LCAuTkVUIDIgaXMgdGhlIG1pbmltdW0gZm9yIHRoZSBDIyBtb2R1bGUKCiAgICAgICAgICAgIFRoaXMgaXMgYSBwb3RlbnRpYWwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYnJlYWsgaWYgY29kZSBoYXMgYmVlbiBhZGRlZCByZWx5aW5nIG9uIHRoZXNlIHVzaW5nCiAgICAgICAgICAgIHN0YXRlbWVudHMgdGhhdCB1c2VkIHRvIGJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgdXNpbmcgU3lzdGVtOwogICAgICAgICAgICAgIHVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKCiAgICAgICAgICAgIFRoZSBxdWljayBmaXggdG8gYWRkIHRoZXNlIGJhY2sgaW4gaXMgdG8gYWRkIHRoZSAtRFNXSUcyX0NTSEFSUCBjb21tYW5kIGxpbmUgb3B0aW9uIHdoZW4KICAgICAgICAgICAgZXhlY3V0aW5nIFNXSUcuIFNlZSBDU2hhcnAuaHRtbCBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm8uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDEzLTExLTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IHNvbWUgY29ybmVyIGNhc2VzIGZvciB0aGUgJHBhY2thZ2VwYXRoLyRqYXZhY2xhc3NuYW1lIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgoKMjAxMy0xMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICM5MSBmcm9tIE1hcnZpbiBHcmVlbmJlcmcgLSBBZGQgZGlyZWN0b3I6ZXhjZXB0IGZlYXR1cmUgZm9yIGltcHJvdmVkCiAgICAgICAgICAgIGV4Y2VwdGlvbiBoYW5kbGluZyBpbiBkaXJlY3RvciBtZXRob2RzIGZvciBKYXZhLgoKMjAxMy0xMC0xNTogdmFkegogICAgICAgICAgICBBbGxvdyB1c2luZyBcbCwgXEwsIFx1LCBcVSBhbmQgXEUgaW4gdGhlIHN1YnN0aXR1dGlvbiBwYXJ0IG9mICUocmVnZXg6L3BhdHRlcm4vc3Vic3QvKQogICAgICAgICAgICBpbnNpZGUgJXJlbmFtZSB0byBjaGFuZ2UgdGhlIGNhc2Ugb2YgdGhlIHRleHQgYmVpbmcgcmVwbGFjZWQuCgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQXBwbHkgIzk2IC0gc3VwZXJjbGFzcyBub3QgbGlzcGlmeQoKMjAxMy0xMC0xMjogd3NmdWx0b24KICAgICAgICAgICAgTWVyZ2UgaW4gQysrMTEgc3VwcG9ydCBmcm9tIHRoZSBnc29jMjAwOS1tYXRldnogYnJhbmNoIHdoZXJlIE1hdGV2eiBKZWtvdmVjIGZpcnN0CiAgICAgICAgICAgIHN0YXJ0ZWQgdGhlIEMrKzB4IGFkZGl0aW9ucy4gRG9jdW1lbnRhdGlvbiBvZiB0aGUgQysrMTEgZmVhdHVyZXMgc3VwcG9ydGVkIGlzIGluIGEKICAgICAgICAgICAgbmV3IENoYXB0ZXIgb2YgdGhlIGRvY3VtZW50YXRpb24sICJTV0lHIGFuZCBDKysxMSIgaW4gRG9jL01hbnVhbC9DUGx1c1BsdXMxMS5odG1sLgoKMjAxMy0xMC0wNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVuYXR1cmFsdmFyIG5vdCBoYXZpbmcgYW55IGFmZmVjdCBvbiB0ZW1wbGF0ZWQgY2xhc3NlcyBpbnN0YW50aWF0ZWQgd2l0aCBhbgogICAgICAgICAgICBlbnVtIGFzIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZS4gUHJvYmxlbSByZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKMjAxMy0wOS0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCBhIG1lbW9yeSBsZWFrIGZvciB0aGUgamF2YSBjaGFyICoqU1RSSU5HX0FSUkFZIHR5cGVtYXBzLgoKVmVyc2lvbiAyLjAuMTIgKDkgRmViIDIwMTQpCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxNC0wMS0xNjogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gRml4IGNvbXBpbGF0aW9uIGVycm9yIGluIFpUUyBtb2RlICg2NCBiaXQgd2luZG93cykgZHVlIHRvIGluY29ycmVjdCBwbGFjZW1lbnQKICAgICAgICAgICAgb2YgVFNSTUxTX0ZFVENIKCkgaW4gU1dJR19QaHBfR2V0TW9kdWxlKCkgYXMgcmVwb3J0ZWQgYnkgTWFyayBEYXdzb24tQnV0dGVyd29ydGguCgoyMDE0LTAxLTEzOiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIHVwZGF0ZSBzdXBwb3J0IHRvIE9jdGF2ZSB2ZXJzaW9uIDMuOC4wCgogICAgICAgICAgICAtIE9jdGF2ZSAzLjguMCBubyBsb25nZXIgZGVmaW5lcyBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLCBidXQgMy44LjEKICAgICAgICAgICAgICB3aWxsIGRlZmluZSBPQ1RBVkVfe01BSk9SLE1JTk9SLFBBVENIfV9WRVJTSU9OIGluc3RlYWQ6IHNlZQogICAgICAgICAgICAgICAgaHR0cDovL2hnLnNhdmFubmFoLmdudS5vcmcvaGd3ZWIvb2N0YXZlL3Jldi9iNmI2ZTBkYzcwMGUKICAgICAgICAgICAgICBTbyB3ZSBub3cgdXNlIGEgbmV3IG1hY3JvIFNXSUdfT0NUQVZFX1BSRVJFUShtYWpvcixtaW5vcixwYXRjaCkgdG8KICAgICAgICAgICAgICBlbmFibGUgZmVhdHVyZXMgcmVxdWlyaW5nIE9jdGF2ZSB2ZXJzaW9uIG1ham9yLm1pbm9yLnBhdGNoIG9yIGxhdGVyLgoKICAgICAgICAgICAgICBGb3IgT2N0YXZlIHZlcnNpb25zIHByaW9yIHRvIDMuOC4xLCB3ZSByZWNvbnN0cnVjdCB2YWx1ZXMgZm9yCiAgICAgICAgICAgICAgT0NUQVZFX3tNQUpPUixNSU5PUixQQVRDSH1fVkVSU0lPTiBiYXNlZCBvbiBPQ1RBVkVfQVBJX1ZFUlNJT05fTlVNQkVSLAogICAgICAgICAgICAgIGV4dHJhY3RlZCBmcm9tIE9jdGF2ZSdzIENoYW5nZUxvZ3MuIEFuIGFkZGl0aW9uYWwgaGFjayBpcyBuZWVkZWQgdG8KICAgICAgICAgICAgICBkaXN0aW5ndWlzaCBiZXR3ZWVuIE9jdGF2ZSA8PSAzLjIueCBhbmQgMy44LjAsIG5laXRoZXIgb2Ygd2hpY2ggZGVmaW5lCiAgICAgICAgICAgICAgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUi4KCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIGRlcHJlY2F0ZXMgc3ltYm9sX3RhYmxlOjp2YXJyZWYoKSwgc28gcmVtb3ZlIGl0cyB1c2UKICAgICAgICAgICAgICBmb3IgdGhpcyBhbmQgZnV0dXJlIHZlcnNpb25zIG9mIE9jdGF2ZS4KCiAgICAgICAgICAgIC0gT2N0YXZlIDMuOC4wIHJlbW92ZXMgb2N0YXZlX3ZhbHVlOjppc19yZWFsX25kX2FycmF5KCksIHVzZWQgaW4KICAgICAgICAgICAgICBvY3RhdmVfc3dpZ190eXBlOjpkaW1zKCkuIEl0cyB1c2UgaXMgbm90IHJlcXVpcmVkIGhlcmUsIHNvIHJlbW92ZSBpdC4KCiAgICAgICAgICAgIC0gUmV0ZXN0ZWQgYWdhaW5zdCBPY3RhdmUgdmVyc2lvbnMgMy4wLjUsIDMuMi40LCAzLjQuMywgMy42LjQsIGFuZCAzLjguMC4KCiAgICAgICAgICAgIC0gVXBkYXRlZCBPY3RhdmUgZG9jdW1lbnRhdGlvbiB3aXRoIHRlc3RlZCBPY3RhdmUgdmVyc2lvbnMsIGFuZCBhZGRlZCBhCiAgICAgICAgICAgICAgd2FybmluZyBhZ2FpbnN0IHVzaW5nIHZlcnNpb25zIDw9IDMueC54LCB3aGljaCBhcmUgbm8gbG9uZ2VyIHRlc3RlZC4KCjIwMTMtMTItMjI6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKzExIHN1cHBvcnQgZm9yIG5ldyB2ZXJzaW9ucyBvZiBlcmFzZSBhbmQgaW5zZXJ0IGluIHRoZSBTVEwgY29udGFpbmVycy4KCiAgICAgICAgICAgIFRoZSBlcmFzZSBhbmQgaW5zZXJ0IG1ldGhvZHMgaW4gdGhlIGNvbnRhaW5lcnMgdXNlIGNvbnN0X2l0ZXJhdG9yIGluc3RlYWQKICAgICAgICAgICAgb2YgaXRlcmF0b3IgaW4gQysrMTEuICBUaGVyZSBhcmUgdGltZXMgd2hlbiB0aGUgbWV0aG9kcyB3cmFwcGVkIG11c3QgbWF0Y2gKICAgICAgICAgICAgdGhlIHBhcmFtZXRlcnMgZXhhY3RseS4gU3BlY2lmaWNhbGx5IHdoZW4gZnVsbCB0eXBlIGluZm9ybWF0aW9uIGZvcgogICAgICAgICAgICB0ZW1wbGF0ZSB0eXBlcyBpcyBtaXNzaW5nIG9yIFNXSUcgZmFpbHMgdG8gbG9vayB1cCB0aGUgdHlwZSBjb3JyZWN0bHksCiAgICAgICAgICAgIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlaW5jbHVkZSA8c3RkX3ZlY3Rvci5pPgogICAgICAgICAgICAgIHR5cGVkZWYgZmxvYXQgUmVhbDsKICAgICAgICAgICAgICAldGVtcGxhdGUoUmVhbFZlY3Rvcikgc3RkOjp2ZWN0b3I8UmVhbD47CgogICAgICAgICAgICBTV0lHIGRvZXMgbm90IGZpbmQgc3RkOjp2ZWN0b3I8UmVhbD46Oml0ZXJhdG9yIGJlY2F1c2UgJXRlbXBsYXRlIHVzaW5nCiAgICAgICAgICAgIHR5cGVkZWZzIGRvZXMgbm90IGFsd2F5cyB3b3JrIGFuZCBzbyBTV0lHIGRvZXNuJ3Qga25vdyBpZiB0aGUgdHlwZSBpcwogICAgICAgICAgICBjb3B5YWJsZSBhbmQgc28gdXNlcyBTd2lnVmFsdWVXcmFwcGVyPGl0ZXJhdG9yPiB3aGljaCBkb2VzCiAgICAgICAgICAgIG5vdCBzdXBwb3J0IGNvbnZlcnNpb24gdG8gYW5vdGhlciB0eXBlIChjb25zdF9pdGVyYXRvcikuIFRoaXMgcmVzdWx0ZWQKICAgICAgICAgICAgaW4gY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gdXNpbmcgdGhlIEMrKzExIHZlcnNpb24gb2YgdGhlIGNvbnRhaW5lcnMuCgogICAgICAgICAgICBDbG9zZXMgIzczCgoyMDEzLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IFNGICMxMzQwIC0gVmlzdWFsIFN0dWRpbyBjb21waWxlIGVycm9yIGluIEMrKyB3cmFwcGVycyBkdWUgdG8gI2luY2x1ZGUgPGV4Y2VwdGlvbj4KICAgICAgICAgICAgd2l0aGluIGV4dGVybiAiQyIgYmxvY2suCgoyMDEzLTEwLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YgIzEzNDUgLSBNaXNzaW5nICNpbmNsdWRlIDxzdGRkZWYuaD4gZm9yIG9mZnNldG9mIHdoZW4gdXNpbmcgLWJ1aWx0aW4uCgoyMDEzLTEwLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSAjOTIgLSBtaXNzaW5nIHJldHVybiBzdGF0ZW1lbnRzIGZvciBTV0lHX0x1YV9hZGRfbmFtZXNwYWNlX2RldGFpbHMoKQogICAgICAgICAgICBhbmQgU1dJR19MdWFfbmFtZXNwYWNlX3JlZ2lzdGVyKCkuCgpWZXJzaW9uIDIuMC4xMSAoMTUgU2VwIDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDktMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggYXR0ZW1wdCB0byBmcmVlIGEgbm9uLWhlYXAgb2JqZWN0IGluIE9VVFBVVCB0eXBlbWFwcyBmb3I6CiAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgKk9VVFBVVAogICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgKk9VVFBVVAogICAgICAgICAgICAgIHNpZ25lZCBsb25nIGxvbmcgKk9VVFBVVAogICAgICAgICAgICAgIGNoYXIgKk9VVFBVVAogICAgICAgICAgICAgIHNpZ25lZCBjaGFyKk9VVFBVVAogICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIqT1VUUFVUCgoyMDEzLTA5LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQdWxsIEdpdCBwYXRjaCAjNjIuCiAgICAgICAgICAgICAgMSkgU3RhdGljIG1lbWJlcnMgYW5kIHN0YXRpYyBmdW5jdGlvbnMgaW5zaWRlIGNsYXNzIGNhbiBiZSBhY2Nlc3NlZCBhcwogICAgICAgICAgICAgICAgIE1vZHVsZU5hbWUuQ2xhc3NOYW1lLkZ1bmN0aW9uTmFtZSAoTWVtYmVyTmFtZSByZXNwZWN0aXZlbHkpLiBPbGQgd2F5IHN1Y2ggYXMKICAgICAgICAgICAgICAgICBNb2R1bGVOYW1lLkNsYXNzTmFtZV9GdW5jdGlvbk5hbWUgc3RpbGwgd29ya3MuCiAgICAgICAgICAgICAgMikgU2FtZSBnb2VzIGZvciBlbnVtcyBpbnNpZGUgY2xhc3NlczogTW9kdWxlTmFtZS5DbGFzc05hbWUuRW51bVZhbHVlMSBldGMuCgoyMDEzLTA5LTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBbVVRMXSBJbmZpbml0eSBpcyBub3cgYnkgZGVmYXVsdCBhbiBhY2NlcHRhYmxlIHZhbHVlIGZvciB0eXBlICdmbG9hdCcuIFRoaXMgZml4IG1ha2VzCiAgICAgICAgICAgIHRoZSBoYW5kbGluZyBvZiB0eXBlICdmbG9hdCcgYW5kICdkb3VibGUnIHRoZSBzYW1lLiBUaGUgaW1wbGVtZW50YXRpb24gcmVxdWlyZXMgdGhlCiAgICAgICAgICAgIEM5OSBpc2Zpbml0ZSgpIG1hY3JvLCBvciBvdGhlcndpc2Ugc29tZSBwbGF0Zm9ybSBkZXBlbmRlbnQgZXF1aXZhbGVudHMsIHRvIGJlIGF2YWlsYWJsZS4KCiAgICAgICAgICAgIFVzZXJzIHJlcXVpcmluZyB0aGUgb2xkIGJlaGF2aW91ciBvZiBub3QgYWNjZXB0aW5nIGluZmluaXR5LCBjYW4gZGVmaW5lIGEgJ2NoZWNrJyB0eXBlbWFwCiAgICAgICAgICAgIHdoZXJldmVyIGEgZmxvYXQgaXMgdXNlZCwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2ssZnJhZ21lbnQ9IjxmbG9hdC5oPiIpIGZsb2F0LCBjb25zdCBmbG9hdCAmICV7CiAgICAgICAgICAgICAgICBpZiAoJDEgPCAtRkxUX01BWCB8fCAkMSA+IEZMVF9NQVgpIHsKICAgICAgICAgICAgICAgICAgU1dJR19leGNlcHRpb25fZmFpbChTV0lHX1R5cGVFcnJvciwgIk92ZXJmbG93IGluIHR5cGUgZmxvYXQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMy0wOC0zMDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gUHVsbCBHaXQgcGF0Y2ggIzgxOiBJbmNsdWRlIEx1YSBlcnJvciBsb2N1cyBpbiBTV0lHIGVycm9yIG1lc3NhZ2VzLiAgCiAgICAgICAgICAgIFRoaXMgaXMgc3RhbmRhcmQgaW5mb3JtYXRpb24gaW4gTHVhIGVycm9yIG1lc3NhZ2VzLCBhbmQgbWFrZXMgaXQgbXVjaAogICAgICAgICAgICBlYXNpZXIgdG8gZmluZCBidWdzLgoKMjAxMy0wOC0yOTogd3NmdWx0b24KICAgICAgICAgICAgUHVsbCBHaXQgcGF0Y2ggIzc1OiBIYW5kbGUgVVRGLTggZmlsZXMgd2l0aCBCT00gYXQgYmVnaW5uaW5nIG9mIGZpbGUuIFdhcyBnaXZpbmcgYW4KICAgICAgICAgICAgJ0lsbGVnYWwgdG9rZW4nIHN5bnRheCBlcnJvci4KCjIwMTMtMDgtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gUHVsbCBHaXQgcGF0Y2ggIzc3OiBBbGxvdyBleHBvcnRpbmcgc3RkOjptYXAgdXNpbmcgbm9uLWRlZmF1bHQgY29tcGFyaXNvbiBmdW5jdGlvbi4KCjIwMTMtMDgtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dICVpbXBsaWNpdGNvbnYgaXMgaW1wcm92ZWQgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLiBMaWtlIGluIEMrKywgdGhlIG1ldGhvZHMKICAgICAgICAgICAgd2l0aCB0aGUgYWN0dWFsIHR5cGVzIGFyZSBjb25zaWRlcmVkIGJlZm9yZSB0cnlpbmcgaW1wbGljaXQgY29udmVyc2lvbnMuIEV4YW1wbGU6CgogICAgICAgICAgICAgICVpbXBsaWNpdGNvbnYgQTsKICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICBBKGludCBpKTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIGNsYXNzIENDQyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludCB4eChpbnQgaSkgeyByZXR1cm4gMTE7IH0KICAgICAgICAgICAgICAgICAgaW50IHh4KGNvbnN0IEEmIGkpIHsgcmV0dXJuIDIyOyB9CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgcHl0aG9uIGNvZGU6CgogICAgICAgICAgICAgIENDQygpLnh4KC0xKQoKICAgICAgICAgICAgd2lsbCBub3cgcmV0dXJuIDExIGluc3RlYWQgb2YgMjIgLSB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBpcyBub3QgZG9uZS4KCjIwMTMtMDgtMjM6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggY2xhbmcrKyB3YXJuaW5nIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUuCgoyMDEzLTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAlaW1wbGljaXRjb252IHdpbGwgbm93IGFjY2VwdCBOb25lIHdoZXJlIHRoZSBpbXBsaWNpdCBjb252ZXJzaW9uIHRha2VzIGEgQy9DKysgcG9pbnRlci4KICAgICAgICAgICAgUHJvYmxlbSBoaWdobGlnaHRlZCBieSBCbyBQZW5nLiBDbG9zZXMgU0YgcGF0Y2ggIzIzMC4KCjIwMTMtMDgtMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFNGIFBhdGNoICMzMjYgZnJvbSBLcmlzIFRoaWVsZW1hbnMgLSBSZW1vdmUgU3dpZ1B5T2JqZWN0X3ByaW50IGFuZCBTd2lnUHlPYmplY3Rfc3RyIGFuZAogICAgICAgICAgICBtYWtlIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciB1c2UgdGhlIGRlZmF1bHQgcHl0aG9uIGltcGxlbWVudGF0aW9ucywgd2hpY2ggd2lsbCBmYWxsIGJhY2sgdG8gcmVwcgogICAgICAgICAgICAoZm9yIC1idWlsdGluIG9wdGlvbikuCgogICAgICAgICAgICBBZHZhbnRhZ2VzOgogICAgICAgICAgICAtIGl0IGF2b2lkcyB0aGUgc3dpZyB1c2VyIGhhdmluZyB0byBqdW1wIHRocm91Z2ggaG9vcHMgdG8gZ2V0IHByaW50IHRvIHdvcmsgYXMgZXhwZWN0ZWQgd2hlbgogICAgICAgICAgICAgIHJlZGVmaW5pbmcgcmVwci9zdHIgc2xvdHMuCiAgICAgICAgICAgIC0gdHlwaW5nIHRoZSBuYW1lIG9mIGEgdmFyaWFibGUgb24gdGhlIHB5dGhvbiBwcm9tcHQgbm93IHByaW50cyB0aGUgcmVzdWx0IG9mIGEgKHBvc3NpYmx5IHJlZGVmaW5lZCkKICAgICAgICAgICAgICByZXByLCB3aXRob3V0IHRoZSBzd2lnIHVzZXIgaGF2aW5nIHRvIGRvIGFueSBleHRyYSB3b3JrLgogICAgICAgICAgICAtIHdoZW4gcmVkZWZpbmluZyByZXByLCB0aGUgc3dpZyB1c2VyIGRvZXNuJ3QgbmVjZXNzYXJpbHkgaGF2ZSB0byByZWRlZmluZSBzdHIgYXMgaXQgd2lsbCBjYWxsIHRoZQogICAgICAgICAgICAgIHJlZGVmaW5lZCByZXByCiAgICAgICAgICAgIC0gdGhlIGJlaGF2aW91ciBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIHdpdGhvdXQgdGhlIC1idWlsdGluIG9wdGlvbiB3aGlsZSByZXF1aXJpbmcgbm8gZXh0cmEgd29yawogICAgICAgICAgICAgIGJ5IHRoZSB1c2VyIChhc2lkZSBmcm9tIGFkZGluZyB0aGUgJWZlYXR1cmUoInB5dGhvbjpzbG90Li4uKSBzdGF0ZW1lbnRzIG9mIGNvdXJzZSkKCiAgICAgICAgICAgIERpc2FkdmFudGFnZToKICAgICAgICAgICAgLSBkZWZhdWx0IHN0cigpIHdpbGwgZ2l2ZSBkaWZmZXJlbnQgKGJ1dCBjbGVhcmVyPykgb3V0cHV0IG9uIHN3aWdnZWQgY2xhc3NlcwoKMjAxMy0wNy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbiwgUnVieV0gRml4ICM2NCAjNjU6IE1pc3NpbmcgY29kZSBpbiBzdGQ6Om11bHRpbWFwIHdyYXBwZXJzLiBQcmV2aW91c2x5IGFuIGluc3RhbnRpYXRpb24KICAgICAgICAgICAgb2YgYSBzdGQ6Om1hcCB3YXMgZXJyb25lb3VzbHkgcmVxdWlyZWQgaW4gYWRkaXRpb24gdG8gYW4gaW5zdGFudGlhdGlvbiBvZiBzdGQ6Om11bHRpbWFwIHdpdGggdGhlCiAgICAgICAgICAgIHNhbWUgdGVtcGxhdGUgcGFyYW1ldGVycyB0byBwcmV2ZW50IGNvbXBpbGF0aW9uIGVycm9ycyBmb3IgdGhlIHdyYXBwZXJzIG9mIGEgc3RkOjptdWx0aW1hcC4KCjIwMTMtMDctMTQ6IGpvZXF1YW50CiAgICAgICAgICAgIFtSXSBDaGFuZ2UgdHlwZXMgZmlsZSB0byBhbGxvdyBmb3IgU0VYUCByZXR1cm4gdmFsdWVzCgoyMDEzLTA3LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgJXB5dGhvbmJlZ2luIGRpcmVjdGl2ZSB3aGljaCB3b3JrcyBsaWtlICVweXRob25jb2RlLCBleGNlcHQgdGhlIHNwZWNpZmllZCBjb2RlIGlzCiAgICAgICAgICAgIGFkZGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGdlbmVyYXRlZCAucHkgZmlsZS4gVGhpcyBpcyBwcmltYXJpbHkgbmVlZGVkIGZvciBpbXBvcnRpbmcgZnJvbQogICAgICAgICAgICBfX2Z1dHVyZV9fIHN0YXRlbWVudHMgcmVxdWlyZWQgdG8gYmUgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLiBFeGFtcGxlOgoKICAgICAgICAgICAgICAlcHl0aG9uYmVnaW4gJXsKICAgICAgICAgICAgICBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCiAgICAgICAgICAgICAgcHJpbnQoIkxvYWRpbmciLCAiV2hpenoiLCAiQmFuZyIsIHNlcD0nIC4uLiAnKQogICAgICAgICAgICAgICV9CgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBTRiBwYXRjaCAjMzQwIC0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXggaW4gU1dJR19QeXRob25fTm9uRHluYW1pY1NldEF0dHIKICAgICAgICAgICAgd2hlbiB1c2luZyAtYnVpbHRpbi4KCjIwMTMtMDctMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBBcHBseSBTRiBwYXRjaCAjMzQxIC0gZml4IGEgY29uc3RfY2FzdCBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IHdhcyBnZW5lcmF0aW5nCiAgICAgICAgICAgIGEgPDo6IGRpZ3JhcGggd2hlbiB1c2luZyB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSAoZ2xvYmFsIHNjb3BlKSBpbiBhIHRlbXBsYXRlIHR5cGUuCgoyMDEzLTA3LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgU0YgcGF0Y2ggIzM0MiBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB0byBmaXggc29tZSBkaXJlY3RvciBjbGFzc2VzIGNyYXNoaW5nIG9uCiAgICAgICAgICAgIG9iamVjdCBkZWxldGlvbiB3aGVuIHVzaW5nIC1idWlsdGluLiBGaXhlcyBTRiBidWcgIzEzMDEuCgoyMDEzLTA2LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgU1dJR19QWVRIT05fSU5URVJQUkVURVJfTk9fREVCVUcgbWFjcm8gd2hpY2ggY2FuIGJlIGRlZmluZWQgdG8gdXNlIHRoZSBSZWxlYXNlIHZlcnNpb24KICAgICAgICAgICAgb2YgdGhlIFB5dGhvbiBpbnRlcnByZXRlciBpbiBEZWJ1ZyBidWlsZHMgb2YgdGhlIHdyYXBwZXJzLiBUaGUgVmlzdWFsIFN0dWRpbyAuZHNwIGV4YW1wbGUKICAgICAgICAgICAgZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIHVzZSB0aGlzIHNvIHRoYXQgRGVidWcgYnVpbGRzIHdpbGwgbm93IHdvcmsgd2l0aG91dCBoYXZpbmcKICAgICAgICAgICAgdG8gaW5zdGFsbCBvciBidWlsZCBhIERlYnVnIGJ1aWxkIG9mIHRoZSBpbnRlcnByZXRlci4KCjIwMTMtMDYtMDc6IHdzZnVsdG9uCgkgICAgW1J1YnldIEdpdCBpc3N1ZSAjNTIuIEZpeCByZWdyZXNzaW9uIHdpdGggbWlzc2luZyByYl9jb21wbGV4X25ldyBmdW5jdGlvbiBmb3IgUnVieQogICAgICAgICAgICB2ZXJzaW9ucyBwcmlvciB0byAxLjkgdXNpbmcgc3RkOjpjb21wbGV4IHdyYXBwZXJzIGlmIGp1c3QgdXNpbmcgc3RkOjpjb21wbGV4IGFzIGFuIG91dHB1dCB0eXBlLgogICAgICAgICAgICBBbHNvIGZpeCB0aGUgQ29tcGxleCBoZWxwZXIgZnVuY3Rpb25zIGV4dGVybmFsIHZpc2liaWxpdHkgKHRvIHN0YXRpYyBieSBkZWZhdWx0KS4KCjIwMTMtMDYtMDQ6IG9sbHkKCSAgICBbUEhQXSBGaXggU1dJR19aVFNfQ29udmVydFJlc291cmNlUHRyKCkgbm90IHRvIGRlcmVmZXJlbmNlIE5VTEwKCSAgICBpZiB0aGUgdHlwZSBsb29rdXAgZmFpbHMuCgpWZXJzaW9uIDIuMC4xMCAoMjcgTWF5IDIwMTMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTMtMDUtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBQeXRob24gMyBpbmNvbnNpc3RlbmN5IHdoZW4gbmVnYXRpdmUgbnVtYmVycyBhcmUgcGFzc2VkCiAgICAgICAgICAgIHdoZXJlIGEgcGFyYW1ldGVyIGV4cGVjdHMgYW4gdW5zaWduZWQgQyB0eXBlLiBBbiBPdmVyRmxvdyBlcnJvciBpcwogICAgICAgICAgICBub3cgY29uc2lzdGVudGx5IHRocm93biBpbnN0ZWFkIG9mIGEgVHlwZUVycm9yLgoKMjAxMy0wNS0yNTogQXJ0ZW0gU2VyZWJyaXlza2l5CiAgICAgICAgICAgIFNWTiBQYXRjaCB0aWNrZXQgIzMzOCAtIGZpeGVzIHRvICVhdHRyaWJ1dGUgbWFjcm9zIGZvciB0ZW1wbGF0ZSB1c2FnZQogICAgICAgICAgICB3aXRoICVhcmcuCgoyMDEzLTA1LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY2NhY2hlLXN3aWcgaW50ZXJuYWwgZXJyb3IgYnVnIGR1ZSB0byBwcmVtYXR1cmUgZmlsZSBjbGVhbnVwLgoKICAgICAgICAgICAgRml4ZXMgU0YgYnVnIDEzMTkgd2hpY2ggc2hvd3MgdXAgYXMgYSBmYWlsdXJlIGluIHRoZSBjY2FjaGUgdGVzdHMgb24KICAgICAgICAgICAgRGViaWFuIDY0IGJpdCBXaGVlenksIHBvc3NpYmx5IGJlY2F1c2UgRU5BQkxFX1pMSUIgaXMgZGVmaW5lZC4KCiAgICAgICAgICAgIFRoaXMgaXMgYSBjb3JuZXIgY2FzZSB3aGljaCB3aWxsIGJlIGhpdCB3aGVuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBmaWxlcwogICAgICAgICAgICBpbiB0aGUgY2FjaGUgaXMgc2V0IHRvIGJlIHF1aXRlIGxvdyAoLUYgb3B0aW9uKSwgcmVzdWx0aW5nIGluIGEgY2FjaGUgbWlzcy4KCjIwMTMtMDUtMDk6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gRml4IGJ1Z3MgaW4gT2N0YXZlIG1vZHVsZSBsb2FkaW5nOgogICAgICAgICAgICAtIGZpeCBhIG1lbW9yeSBsZWFrIGluIHNldHRpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICAtIGluc3RhbGwgZnVuY3Rpb25zIG9ubHkgb25jZSwgdG8gc3BlZWQgdXAgbW9kdWxlIGxvYWRzCgoyMDEzLTA0LTI4OiBnamFuc3NlbnMKICAgICAgICAgICAgW0d1aWxlXSBVcGRhdGVzIGluIGd1aWxlIG1vZHVsZToKICAgICAgICAgICAgLSBBZGQgc3VwcG9ydCBmb3IgZ3VpbGUgMi4wCiAgICAgICAgICAgIC0gRHJvcCBzdXBwb3J0IGZvciBndWlsZSAxLjYKICAgICAgICAgICAgLSBEcm9wIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgd3JhcHBlcnMgdXNpbmcgZ3VpbGUncyBnaCBpbnRlcmZhY2UuCiAgICAgICAgICAgICAgQWxsIGdlbmVyYXRlZCB3cmFwcGVycyB3aWxsIHVzZSB0aGUgc2NtIGludGVyZmFjZSBmcm9tIG5vdyBvbi4KICAgICAgICAgICAgLSBEZXByZWNhdGUgLWdoIGFuZCAtc2NtIG9wdGlvbnMuIFRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgICAgICAgICAgQSB3YXJuaW5nIHdpbGwgYmUgaXNzdWVkIHdoZW4gdGhlc2Ugb3B0aW9ucyBhcmUgc3RpbGwgdXNlZC4KICAgICAgICAgICAgLSBGaXggYWxsIHRlc3RzIGFuZCBleGFtcGxlcyB0byBoYXZlIGEgc3VjY2Vzc2Z1bCB0cmF2aXMgdGVzdAoKMjAxMy0wNC0xODogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgUGF0Y2ggIzM2IGZyb20gSmVzdXMgTG9wZXogdG8gYWRkIHN1cHBvcnQgZm9yICRkZXNjcmlwdG9yKCkgc3BlY2lhbCB2YXJpYWJsZSBtYWNybyBleHBhbnNpb24gCiAgICAgICAgICAgIGluIGZyYWdtZW50cy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZURlc2NyaXB0b3IiLCAiaGVhZGVyIikKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVEZXNjcmlwdG9yID0gIiRkZXNjcmlwdG9yKE5hbWUpIjsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgd2hpY2ggd2lsbCBnZW5lcmF0ZSBpbnRvIHRoZSB3cmFwcGVyIGlmIHRoZSBmcmFnbWVudCBpcyB1c2VkOgoKICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciAqbmFtZURlc2NyaXB0b3IgPSAiU1dJR1RZUEVfTmFtZSI7CgoyMDEzLTA0LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgQnVnICM0MjggLSBTeW50YXggZXJyb3Igd2hlbiBwcmVwcm9jZXNzb3IgbWFjcm9zIGFyZSBkZWZpbmVkIGluc2lkZSBvZiBlbnVtIGxpc3RzLCBzdWNoIGFzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0gewogICAgICAgICAgICAgICAgZVplcm8gPSAwCiAgICAgICAgICAgICAgI2RlZmluZSBPTkUgMQogICAgICAgICAgICAgIH0gRUZvbzsKCiAgICAgICAgICAgIFRoZSBtYWNyb3MgYXJlIHNpbGVudGx5IGlnbm9yZWQuCgoyMDEzLTA0LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFB1bGwgcGF0Y2ggIzM0IGZyb20gQnJhbnRLeXNlciB0byBmaXggc21hcnQgcG9pbnRlcnMgaW4gY29uanVuY3Rpb24gd2l0aCBkaXJlY3RvcnMuCgoyMDEzLTA0LTE1OiBrd3dldHRlCiAgICAgICAgICAgIFtPY3RhdmVdIEZpeCBidWdzIGluIG91dHB1dCBvZiBjbGVhbnVwIGNvZGUuCiAgICAgICAgICAgIC0gQ2xlYW51cCBjb2RlIGlzIG5vdyB3cml0dGVuIGFsc28gYWZ0ZXIgdGhlICJmYWlsOiIgbGFiZWwsIHNvIGl0IHdpbGwgYmUgY2FsbGVkIGlmCiAgICAgICAgICAgICAgYSBTV0lHX2V4Y2VwdGlvbiBpcyByYWlzZWQgYnkgdGhlIHdyYXBwaW5nIGZ1bmN0aW9uLCBjb25zaXN0ZW50IHdpdGggb3RoZXIgbW9kdWxlcy4KICAgICAgICAgICAgLSBPY3RhdmUgbW9kdWxlIG5vdyBhbHNvIHJlY29nbmlzZXMgdGhlICIkY2xlYW51cCIgc3BlY2lhbCB2YXJpYWJsZSwgaWYgbmVlZGVkLgoKMjAxMy0wNC0wODoga3d3ZXR0ZQogICAgICAgICAgICBBZGQgLU1QIG9wdGlvbiB0byBTV0lHIGZvciBnZW5lcmF0aW5nIHBob255IHRhcmdldHMgZm9yIGFsbCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgIC0gUHJldmVudHMgbWFrZSBmcm9tIGNvbXBsYWluaW5nIGlmIGhlYWRlciBmaWxlcyBoYXZlIGJlZW4gZGVsZXRlZCBiZWZvcmUKICAgICAgICAgICAgICB0aGUgZGVwZW5kZW5jeSBmaWxlIGhhcyBiZWVuIHVwZGF0ZWQuCiAgICAgICAgICAgIC0gTW9kZWxsZWQgb24gc2ltaWxhciBvcHRpb24gaW4gR0NDLgoKMjAxMy0wNC0wOTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY2hhciogYW5kIGNoYXJbXSB3aGljaAoJICAgIGZpeGVzIGRpcmVjdG9yX3N0cmluZyB0ZXN0Y2FzZSBmYWlsdXJlLgoKMjAxMy0wNC0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFNGIEJ1ZyAjMTI5MiAtIFJ1bnRpbWUgZml4ZXMgZm9yIFByb2MgY2hhbmdlcyBpbiBydWJ5LTEuOSB3aGVuIHVzaW5nIFNUTAogICAgICAgICAgICB3cmFwcGVycyB0aGF0IG92ZXJyaWRlIHRoZSBkZWZhdWx0IHByZWRpY2F0ZSwgc3VjaCBhczoKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKE1hcCkgc3RkOjptYXA8c3dpZzo6TEFOR1VBR0VfT0JKLCBzd2lnOjpMQU5HVUFHRV9PQkosIHN3aWc6OkJpbmFyeVByZWRpY2F0ZTw+ID47CgoyMDEzLTA0LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gU0YgQnVnICMxMTU5IC0gQ29ycmVjdGx5IGNoZWNrIHJiX3Jlc3BvbmRfdG8gY2FsbCByZXR1cm4gdmFsdWVzIHRvIGZpeCBzb21lCiAgICAgICAgICAgIGZ1cnRoZXIgMS45IHByb2JsZW1zIHdpdGggZnVuY3RvcnMgYW5kIHVzZSBvZiBDb21wbGV4IHdyYXBwZXJzLgoKMjAxMy0wNC0wMjogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIFJ1bnRpbWUgZml4ZXMgZm9yIHN0ZDo6Y29tcGxleCB3cmFwcGVycyBmb3IgcnVieS0xLjkgLSBuZXcgbmF0aXZlIFJ1YnkgY29tcGxleCBudW1iZXJzIGFyZSB1c2VkLgoKMjAxMy0wMy0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBzZWcgZmF1bHQgd2hlbiB1c2luZyBTVEwgY29udGFpbmVycyBvZiBnZW5lcmljIFJ1YnkgdHlwZXMsIEdDX1ZBTFVFIG9yIExBTkdVQUdFX09CSkVDVCwKICAgICAgICAgICAgb24gZXhpdCBvZiB0aGUgUnVieSBpbnRlcnByZXRlci4gTW9yZSBmcmVxdWVudGx5IG9ic2VydmVkIGluIHJ1YnktMS45LgoKMjAxMy0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEZpeCBkZWxldGVfaWYgKHJlamVjdCEpIGZvciB0aGUgU1RMIGNvbnRhaW5lciB3cmFwcGVycyB3aGljaCBwcmV2aW91c2x5IHdvdWxkCiAgICAgICAgICAgIHNvbWV0aW1lcyBzZWcgZmF1bHQgb3Igbm90IHdvcmsuCgoyMDEzLTAzLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc29tZSB1bmRlZmluZWQgYmVoYXZpb3VyIGRlbGV0aW5nIHNsaWNlcyBpbiB0aGUgU1RMIGNvbnRhaW5lcnMuCgoyMDEzLTAzLTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIERdIEZpeCBzZWcgZmF1bHQgaW4gU1dJRyB1c2luZyBkaXJlY3RvcnMgd2hlbiBjbGFzcyBhbmQgdmlydHVhbCBtZXRob2QgbmFtZXMgYXJlCiAgICAgICAgICAgIHRoZSBzYW1lIGV4Y2VwdCBiZWluZyBpbiBkaWZmZXJlbnQgbmFtZXNwYWNlcyB3aGVuIHRoZSAlbnNwYWNlIGZlYXR1cmUgaXMgbm90IGJlaW5nIHVzZWQuCgoyMDEzLTAyLTE5OiBrd3dldHRlCiAgICAgICAgICAgIEZpeCBidWcgaW4gU1dJRydzIGhhbmRsaW5nIG9mIHF1YWxpZmllZCAoZS5nLiBjb25zdCkgdmFyaWFibGVzIG9mIGFycmF5IHR5cGUuIEdpdmVuIHRoZSB0eXBlZGVmCiAgICAgICAgICAgICAgYSg3KS5xKHZvbGF0aWxlKS5kb3VibGUgbXlhcnJheSAgICAgLy8gdHlwZWRlZiB2b2xhdGlsZSBkb3VibGVbN10gbXlhcnJheTsKICAgICAgICAgICAgdGhlIHR5cGUKICAgICAgICAgICAgICBxKGNvbnN0KS5teWFycmF5ICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCBteWFycmF5CiAgICAgICAgICAgIGJlY29tZXMKICAgICAgICAgICAgICBhKDcpLnEoY29uc3Qgdm9sYXRpbGUpLmRvdWJsZSAgICAgICAvLyBjb25zdCB2b2xhdGlsZSBkb3VibGVbN10KICAgICAgICAgICAgUHJldmlvdXNseSwgU3dpZ1R5cGVfdHlwZWRlZl9yZXNvbHZlKCkgcHJvZHVjZXMgdGhlIHR5cGUKICAgICAgICAgICAgICBxKGNvbnN0KS5hKDcpLnEodm9sYXRpbGUpLmRvdWJsZSAgICAvLyBub24tc2Vuc2ljYWwgdHlwZQogICAgICAgICAgICB3aGljaCB3b3VsZCBuZXZlciBtYXRjaCAldHlwZW1hcCBkZWNsYXJhdGlvbnMsIHdob3NlIHR5cGVzIHdlcmUgcGFyc2VkIGNvcnJlY3RseS4KICAgICAgICAgICAgQWRkIHR5cGVtYXBfYXJyYXlfcXVhbGlmaWVycy5pIHRvIHRoZSB0ZXN0IHN1aXRlIHdoaWNoIGNoZWNrcyBmb3IgdGhlIGNvcnJlY3QgYmVoYXZpb3VyLgoKMjAxMy0wMi0xODogd3NmdWx0b24KICAgICAgICAgICAgRGVwcmVjYXRlIHR5cGVkZWYgbmFtZXMgdXNlZCBhcyBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciBuYW1lcyBpbiAlZXh0ZW5kLiBUaGUgcmVhbAogICAgICAgICAgICBjbGFzcy9zdHJ1Y3QgbmFtZSBzaG91bGQgYmUgdXNlZC4KCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgdGFnRVN0cnVjdCB7CiAgICAgICAgICAgICAgICBpbnQgaXZhcjsKICAgICAgICAgICAgICB9IEVTdHJ1Y3Q7CgogICAgICAgICAgICAgICVleHRlbmQgdGFnRVN0cnVjdCB7CiAgICAgICAgICAgICAgICBFU3RydWN0KCkgLy8gaWxsZWdhbCBuYW1lLCBzaG91bGQgYmUgdGFnRVN0cnVjdCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIEVTdHJ1Y3QgKnMgPSBuZXcgRVN0cnVjdCgpOwogICAgICAgICAgICAgICAgICBzLT5pdmFyID0gaXZhcjA7CiAgICAgICAgICAgICAgICAgIHJldHVybiBzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfkVTdHJ1Y3QoKSAvLyBpbGxlZ2FsIG5hbWUsIHNob3VsZCBiZSB+dGFnRVN0cnVjdCgpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIGRlbGV0ZSAkc2VsZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBGb3Igbm93IHRoZXNlIHRyaWdnZXIgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICBleHRlbmRfY29uc3RydWN0b3JfZGVzdHJ1Y3Rvci5pOjEwNzogV2FybmluZyA1MjI6IFVzZSBvZiBhbiBpbGxlZ2FsIGNvbnN0cnVjdG9yIG5hbWUgJ0VTdHJ1Y3QnIGluCiAgICAgICAgICAgICAgJWV4dGVuZCBpcyBkZXByZWNhdGVkLCB0aGUgY29uc3RydWN0b3IgbmFtZSBzaG91bGQgYmUgJ3RhZ0VTdHJ1Y3QnLgogICAgICAgICAgICAgIGV4dGVuZF9jb25zdHJ1Y3Rvcl9kZXN0cnVjdG9yLmk6MTExOiBXYXJuaW5nIDUyMzogVXNlIG9mIGFuIGlsbGVnYWwgZGVzdHJ1Y3RvciBuYW1lICdFU3RydWN0JyBpbgogICAgICAgICAgICAgICVleHRlbmQgaXMgZGVwcmVjYXRlZCwgdGhlIGRlc3RydWN0b3IgbmFtZSBzaG91bGQgYmUgJ3RhZ0VTdHJ1Y3QnLgoKICAgICAgICAgICAgVGhlc2UgJWV4dGVuZCBkZXN0cnVjdG9yIGFuZCBjb25zdHJ1Y3RvciBuYW1lcyB3ZXJlIHZhbGlkIHVwIHRvIHN3aWctMi4wLjQsIGhvd2V2ZXIgc3dpZy0yLjAuNSBpZ25vcmVkCiAgICAgICAgICAgIHRoZW0gYWx0b2dldGhlciBmb3IgQyBjb2RlIGFzIHJlcG9ydGVkIGluIFNGIGJ1ZyAjMTMwNi4gVGhlIG9sZCBiZWhhdmlvdXIgb2YgdXNpbmcgdGhlbSBoYXMgYmVlbgogICAgICAgICAgICByZXN0b3JlZCBmb3Igbm93LCBidXQgaXMgb2ZmaWNpYWxseSBkZXByZWNhdGVkLiBUaGlzIGRvZXMgbm90IGFwcGx5IHRvIGFub255bW91c2x5IGRlZmluZWQgdHlwZWRlZgogICAgICAgICAgICBjbGFzc2VzL3N0cnVjdHMgc3VjaCBhczoKCiAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3Qgey4uLn0gWDsKCjIwMTMtMDItMTc6IGt3d2V0dGUKICAgICAgICAgICAgV2hlbiBnZW5lcmF0aW5nIGZ1bmN0aW9ucyBwcm92aWRlZCBieSAlZXh0ZW5kLCB1c2UgIih2b2lkKSIgZm9yIG5vLWFyZ3VtZW50IGZ1bmN0aW9ucwogICAgICAgICAgICBpbnN0ZWFkIG9mICIoKSIuIFRoaXMgcHJldmVudHMgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCAiZ2NjIC1Xc3RyaWN0LXByb3RvdHlwZXMiLgoKMjAxMy0wMi0xNzoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBNaW5vciBmaXggdG8gYXV0b2RvYyBnZW5lcmF0aW9uOiBnZXQgdGhlIHJpZ2h0IHR5cGUgZm9yIGZ1bmN0aW9ucyByZXR1cm5pbmcgc3RydWN0cy4KCjIwMTMtMDItMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIERlcHJlY2F0ZSB0eXBlZGVmIG5hbWVzIHVzZWQgaW4gJWV4dGVuZCB0aGF0IGFyZSBub3QgdGhlIHJlYWwgY2xhc3Mvc3RydWN0IG5hbWUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCBTdHJ1Y3RCTmFtZSB7CiAgICAgICAgICAgICAgICBpbnQgbXlpbnQ7CiAgICAgICAgICAgICAgfSBTdHJ1Y3RCOwoKICAgICAgICAgICAgICAlZXh0ZW5kIFN0cnVjdEIgewogICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoKSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdpbGwgbm93IHRyaWdnZXIgYSB3YXJuaW5nOgoKICAgICAgICAgICAgICBzd2lnX2V4dGVuZC5pOjE5OiBXYXJuaW5nIDMyNjogRGVwcmVjYXRlZCAlZXh0ZW5kIG5hbWUgdXNlZCAtIHRoZSBzdHJ1Y3QgbmFtZSBTdHJ1Y3RCTmFtZQogICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBTdHJ1Y3RCLgoKICAgICAgICAgICAgVGhpcyBpcyBvbmx5IHBhcnRpYWxseSB3b3JraW5nIGFueXdheSAodGhlICVleHRlbmQgb25seSB3b3JrZWQgaWYgcGxhY2VkIGFmdGVyIHRoZSBjbGFzcwogICAgICAgICAgICBkZWZpbml0aW9uKS4gCgoyMDEzLTAyLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQXBwbHkgcGF0Y2ggIzIyIC0gRml4IG1pc3NpbmcgcGFja2FnZSBiZWZvcmUgJmJvZHkKCjIwMTMtMDEtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBFbnN1cmUgJ2phdmFwYWNrYWdlJyB0eXBlbWFwIGlzIHVzZWQgYXMgaXQgc3RvcHBlZCB3b3JraW5nIGZyb20gdmVyc2lvbiAyLjAuNS4KCjIwMTMtMDEtMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEFwcGx5IHBhdGNoIFNGICMzMzQgLSBGaXggZGVmYXVsdCB2YWx1ZSBjb252ZXJzaW9ucyAiVFJVRSItPlRydWUsICJGQUxTRSItPkZhbHNlLgoKMjAxMy0wMS0yODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoIFNGICMzMzUgLSBUcnVseSBpZ25vcmUgY29uc3RydWN0b3JzIGluIGRpcmVjdG9ycyB3aXRoICVpZ25vcmUuCgoyMDEzLTAxLTE4OiBCcmFudCBLeXNlcgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggIzE1IC0gQWxsb3cgdGhlIHVzZSBvZiB0aGUgbnNwYWNlIGZlYXR1cmUgd2l0aG91dCB0aGUgLXBhY2thZ2UgY29tbWFuZGxpbmUgb3B0aW9uLgogICAgICAgICAgICBUaGlzIHdvcmtzIGFzIGxvbmcgYW5kIHRoZSBuZXcgam5pY2xhc3NwYWNrYWdlIHByYWdtYSBpcyB1c2VkIHRvIHBsYWNlIHRoZSBKTkkgaW50ZXJtZWRpYXRlIGNsYXNzCiAgICAgICAgICAgIGludG8gYSBwYWNrYWdlIGFuZCB0aGUgbnNwYWNlIGZlYXR1cmUgaXMgdXNlZCB0byBwbGFjZSBhbGwgZXhwb3NlZCB0eXBlcyBpbnRvIGEgcGFja2FnZS4KCjIwMTMtMDEtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBWaXN1YWwgU3R1ZGlvIGV4YW1wbGVzIHRvIHdvcmsgd2hlbiBTV0lHIGlzIHVuemlwcGVkIGludG8gYSBkaXJlY3RvcnkgY29udGFpbmluZyBzcGFjZXMuCgoyMDEzLTAxLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBjc3R5cGUgdHlwZW1hcCBsb29rdXAgZm9yIG1lbWJlciB2YXJpYWJsZXMgc28gdGhhdCBhIGZ1bGx5IHF1YWxpZmllZCB2YXJpYWJsZSBuYW1lCiAgICAgICAgICAgIG1hdGNoZXMuIEZvciBleGFtcGxlOgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgYm9vbCBNVmFyOjptdmFyICJNeUJvb2wiCiAgICAgICAgICAgICAgc3RydWN0IE1WYXIgewogICAgICAgICAgICAgICAgYm9vbCBtdmFyOwogICAgICAgICAgICAgIH07CgoyMDEzLTAxLTExOiBCcmFudCBLeXNlcgoJICAgIFtKYXZhLCBDIywgRF0gU0YgQnVnICMxMjk5IC0gRml4IGdlbmVyYXRlZCBuYW1lcyBmb3Igd2hlbiAlbnNwYWNlIGlzIHVzZWQgb24KICAgICAgICAgICAgY2xhc3NlcyB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdHdvIGRpZmZlcmVudCBuYW1lc3BhY2VzLgoKMjAxMy0wMS0xMTogVmxhZGltaXIgS2FsaW5pbgoJICAgIFtDI10gQWRkIHN1cHBvcnQgZm9yIGNzZGlyZWN0b3JpbiAncHJlJywgJ3Bvc3QnIGFuZCAndGVybWluYXRvcicgYXR0cmlidXRlcy4KCjIwMTMtMDEtMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggdG8gd29yayB3aXRoIGEgWlRTIGJ1aWxkIG9mIFBIUCAoYnJva2VuIGluIDIuMC43KS4KCjIwMTMtMDEtMDc6IG9sbHkKCSAgICBGaXggYmFzaGlzbSBpbiBjb25maWd1cmUsIGludHJvZHVjZWQgaW4gMi4wLjkuCgoyMDEzLTAxLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBQdWxsIHBhdGNoICM0IGZyb20gcHRvbXVsaWsgdG8gZml4IFNGIEJ1ZyAjMTI5NiAtIEZpeCBpbmNvcnJlY3Qgd2FybmluZyBmb3IgdmlydHVhbCBkZXN0cnVjdG9ycwogICAgICAgICAgICBpbiB0ZW1wbGF0ZXMsIHN1Y2ggYXM6CiAgICAgICAgICAgICBXYXJuaW5nIDUyMTogSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgQjwgQSA+Ojp+QigpLiBJZ25vcmVkLgoKMjAxMy0wMS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUHVsbCBwYXRjaCAjMyBmcm9tIHB0b211bGlrIHRvIGZpeCBTRiBCdWcgIzEyOTUgLSBzdGFuZGFyZCBleGNlcHRpb25zIGFzCiAgICAgICAgICAgIGNsYXNzZXMgdXNpbmcgdGhlIFNXSUdfU1REX0VYQ0VQVElPTlNfQVNfQ0xBU1NFUyBtYWNyby4KCjIwMTMtMDEtMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQdWxsIHBhdGNoICMyIGZyb20gQnJhbnRLeXNlciB0byBmaXggU0YgQnVnICMxMjgzIC0gZml4IHNtYXJ0IHBvaW50ZXJzIGluIGNvbmp1Y3Rpb24KICAgICAgICAgICAgd2l0aCBkaXJlY3RvcnMuCgoyMDEzLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUHVsbCBwYXRjaCAjMSBmcm9tIEJyYW50S3lzZXIgdG8gZml4IFNGIEJ1ZyAjMTI3OCAtIGZpeCBkaXJlY3RvcnMgYW5kIG5zcGFjZSBmZWF0dXJlIHdoZW4KICAgICAgICAgICAgbXVsdGlsZXZlbCBuYW1lc3BhY2VzIGFyZSB1c2VkLgoKVmVyc2lvbiAyLjAuOSAoMTYgRGVjZW1iZXIgMjAxMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMTItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBnYXJiYWdlIGxpbmUgbnVtYmVyIC8gZW1wdHkgZmlsZSBuYW1lIHJlcG9ydGluZyBmb3Igc29tZSBtaXNzaW5nCiAgICAgICAgICAgICd9JyBvciAnKScgZXJyb3IgbWVzc2FnZXMuCgoyMDEyLTEyLTE1OiBra2FlbXBmCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAzNTMwNDQ0LCBDbGFzcyNtZXRob2RzIGFuZCBDbGFzcyNjb25zdGFudHMgcmV0dXJucyBhcnJheSBvZgogICAgICAgICAgICBzeW1ib2xzIGluIFJ1YnkgMS45KwoKMjAxMi0xMi0xNDoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbHkgcGF0Y2ggMzUzMDQzOSBhbmQgZmluYWxseSByZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyBvZiB0aGUgU1RSMkNTVFIoKSBtYWNybwogICAgICAgICAgICB3aXRoIFN0cmluZ1ZhbHVlUHRyKCkuIFNUUjJDU1RSIHdhcyBkZXByZWNhdGVkIHNpbmNlIHllYXJzIGFuZCBnb3QgcmVtb3ZlZCBpbiBSdWJ5IDEuOQoKMjAxMi0xMi0xNDoga2thZW1wZgogICAgICAgICAgICBbUnVieV0gQXBwbGllZCBwYXRjaGVzICMzNTMwNDQyIGFuZCAzNTMwNDQzIHRvIGFkYXB0IGNvbXBpbGUgYW5kIHJ1bnRpbWUgaW5jbHVkZQogICAgICAgICAgICBwYXRocyB0byBtYXRjaCBSdWJ5IDEuOSsKCjIwMTItMTItMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDRkZJXSBGaXggIzMxNjE2MTQgLSBTb21lIHN0cmluZyBjb25zdGFudHMgYXJlIGluY29ycmVjdAoKMjAxMi0xMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0NGRkldIEZpeCAjMzUyOTY5MCAtIEZpeCBpbmNvcnJlY3QgY29uc3RhbnQgbmFtZXMuCgoyMDEyLTEyLTEyOiBkcmpvZQoJICAgIFtSXSBhZGQgZml4IHRvIGZpbmFsaXplciB0aGF0IHdhcyBtaXNzZWQgZWFybGllcgoKMjAxMi0xMi0xMTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzM1OTA1MjIgLSBmdWxseSBxdWFsaWZpZWQgcGFja2FnZSBwYXRocyBmb3IgUHl0aG9uIDMgZXZlbiBpZiBhIG1vZHVsZSBpcyBpbiB0aGUKICAgICAgICAgICAgc2FtZSBwYWNrYWdlLgoKMjAxMi0xMi0wODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQnVnICMzNTYzNjQ3IC0gUHlJbnRfRnJvbVNpemVfdCB1bmF2YWlsYWJsZSBwcmlvciB0byBQeXRob24gMi41IGZvciB1bnNpZ25lZCBpbnQgdHlwZXMuCgoyMDEyLTEyLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGJ1ZyAjMzU3MTM2MSAtIEMrKyBjb21tZW50IGluIEMgd3JhcHBlcnMuCgoyMDEyLTEyLTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFwcGx5IHBhdGNoICMzNTcxMDI5IHdoaWNoIGFkZHMgbWlzc2luZyBkaXJlY3RvciBzdXBwb3J0IGZvciBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgJi4KCjIwMTItMTEtMjg6IGt3d2V0dGUKICAgICAgICAgICAgW09jdGF2ZV0gU2ltcGxpZmllZCBtb2R1bGUgbG9hZGluZzogbm93IGp1c3QgdGhlIHN5bnRheAogICAgICAgICAgICAkIGV4YW1wbGU7CiAgICAgICAgICAgIGlzIGFjY2VwdGVkLCB3aGljaCBsb2FkcyBmdW5jdGlvbnMgZ2xvYmFsbHkgYnV0IGNvbnN0YW50cyBhbmQgdmFyaWFibGVzIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IHNjb3BlLgogICAgICAgICAgICBUaGlzIG1ha2UgbW9kdWxlIGxvYWRpbmcgYmVoYXZpb3VyIHJlbGlhYmx5IGNvbnNpc3RlbnQsIGFuZCByZWR1Y2VzIHByb2JsZW1zIHdoZW4gbG9hZGluZyBtb2R1bGVzIHdoaWNoCiAgICAgICAgICAgIGRlcGVuZCBvbiBvdGhlciBtb2R1bGVzIHdoaWNoIG1heSBub3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbG9hZGVkLgoKMjAxMi0xMS0yNzogd3NmdWx0b24KICAgICAgICAgICAgW2NmZmldIEZpeCBqdW5rIG91dHB1dCB3aGVuIHdyYXBwaW5nIHNpbmdsZSBjaGFyYWN0ZXIgbGl0ZXJhbCBjb25zdGFudHMuCgoyMDEyLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsLCBNb2R1bGEzXSBBZGQgbWlzc2luZyBzdXBwb3J0IGZvciAtb3V0ZGlyLgoKMjAxMi0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNlZ2ZhdWx0cyB3aGVuIHVzaW5nIGZpbGVuYW1lIHBhdGhzIGdyZWF0ZXIgdGhhbiAxMDI0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLgoKMjAxMi0xMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW2NjYWNoZS1zd2lnXSBBcHBseSBwYXRjaCAjMzU4NjM5MiBmcm9tIEZyZWRlcmlrIERld2VlcmR0IHRvIGZpeCBzb21lIGVycm9yIGNhc2VzIC0gaW5jb3JyZWN0bHkgdXNpbmcKICAgICAgICAgICAgbWVtb3J5IGFmdGVyIGl0IGhhcyBiZWVuIGRlbGV0ZWQuCgoyMDEyLTExLTA5OiB2emVpdGxpbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggb3ZlcmZsb3cgd2hlbiBwYXNzaW5nIHZhbHVlcyBncmVhdGVyIHRoYW4gTE9OR19NQVggZnJvbSBQeXRob24gMyBmb3IgcGFyYW1ldGVycyB3aXRoIHVuc2lnbmVkIGxvbmcgQyB0eXBlLgoKMjAxMi0xMS0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgZmVhdHVyZSBtYXRjaGluZyBpc3N1ZXMgZm9yIGltcGxpY2l0IGRlc3RydWN0b3JzIGFuZCBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgYW5kIGltcGxpY2l0CiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3JzIGFkZGVkIHdpdGggJWNvcHljdG9yLiBQcmV2aW91c2x5IGEgZmVhdHVyZSBmb3IgdGhlc2UgaGFkIHRvIGJlIGZ1bGx5IHF1YWxpZmllZAogICAgICAgICAgICBpbiBvcmRlciB0byBtYXRjaC4gTm93IHRoZSBmb2xsb3dpbmcgd2lsbCBhbHNvIG1hdGNoOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgieHl6IikgflhYWCgpOwogICAgICAgICAgICAgIHN0cnVjdCBYWFgge307CgoyMDEyLTExLTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBGdXJ0aGVyIGNvbnNpc3RlbmN5IGluIG5hbWVkIG91dHB1dCB0eXBlbWFwIGxvb2t1cHMgZm9yIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYW5kCiAgICAgICAgICAgIGltcGxpY2l0IGNvcHkgY29uc3RydWN0b3JzIGFkZGVkIHdpdGggJWNvcHljdG9yLiBQcmV2aW91c2x5IG9ubHkgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIHdhcyBiZWluZwogICAgICAgICAgICB1c2VkLCBub3cgdGhlIHVucXVhbGlmaWVkIG5hbWUgd2lsbCBhbHNvIGJlIHVzZWQuIEZvciBleGFtcGxlLCBwcmV2aW91c2x5OgoKICAgICAgICAgICAgICBleGFtcGxlLmk6Mzg6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogdm9pZCBTcGFjZTo6TW9yZTo6fk1vcmUKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQKCiAgICAgICAgICAgIE5vdyB0aGUgdW5xdWFsaWZpZWQgbmFtZSBpcyBhbHNvIHVzZWQ6CgogICAgICAgICAgICAgIGV4YW1wbGUuaTozODogU2VhcmNoaW5nIGZvciBhIHN1aXRhYmxlICdvdXQnIHR5cGVtYXAgZm9yOiB2b2lkIFNwYWNlOjpNb3JlOjp+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQgU3BhY2U6Ok1vcmU6On5Nb3JlCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogdm9pZCB+TW9yZQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IHZvaWQKCjIwMTItMTEtMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzb21lIHN1YnRsZSBuYW1lZCBvdXRwdXQgdHlwZW1hcCBsb29rdXAgbWlzc2VzLCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgd2FzIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgdXNlZCBmb3IgdmFyaWFibGVzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IEdsb2IgewogICAgICAgICAgICAgICAgaW50IE15VmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQcmV2aW91c2x5IHRoZSBzZWFyY2ggcnVsZXMgKGFzIHNob3duIGJ5IC1kZWJ1Zy10bXNlYXJjaCkgZm9yIHRoZSBnZXR0ZXIgd3JhcHBlciB3ZXJlOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6NDQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnb3V0JyB0eXBlbWFwIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50IE15VmFyCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogaW50CgogICAgICAgICAgICBOb3cgdGhlIHNjb3BlIGlzIG5hbWVkIGNvcnJlY3RseToKCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjQ0OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ291dCcgdHlwZW1hcCBmb3I6IGludCBHbG9iOjpNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBHbG9iOjpNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludCBNeVZhcgogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IGludAoKMjAxMi0xMC0yNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGRpcmVjdG9yIHR5cGVtYXAgc2VhcmNoaW5nIHNvIHRoYXQgYSB0eXBlbWFwIHNwZWNpZmllZCB3aXRoIGEgbmFtZSB3aWxsIGJlIGNvcnJlY3RseSBtYXRjaGVkLiBQcmV2aW91c2x5CiAgICAgICAgICAgIHRoZSBuYW1lIHdhcyBpZ25vcmVkIGR1cmluZyB0aGUgdHlwZW1hcCBzZWFyY2guIEFwcGxpZXMgdG8gdGhlIGZvbGxvd2luZyBsaXN0IG9mIHR5cGVtYXBzOiAKICAgICAgICAgICAgZGlyZWN0b3JvdXQsIGNzZGlyZWN0b3JvdXQsIGNzdHlwZSwgaW10eXBlLCBjdHlwZSwgZGRpcmVjdG9yb3V0LCBkdHlwZSwgZ290eXBlLCBqdHlwZSwgam5pLCBqYXZhZGlyZWN0b3JvdXQuCgoyMDEyLTEwLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBNb3N0IG9mIHRoZSBzcGVjaWFsIHZhcmlhYmxlcyBhdmFpbGFibGUgZm9yIHVzZSBpbiAlZXhjZXB0aW9uIGFyZSBub3cgYWxzbyBhdmFpbGFibGUgZm9yIGV4cGFuc2lvbiBpbgogICAgICAgICAgICAlZXh0ZW5kIGJsb2Nrcy4gVGhlc2UgYXJlOiAkbmFtZSAkc3ltbmFtZSAkb3Zlcm5hbWUgJGRlY2wgJGZ1bGxkZWNsICRwYXJlbnRjbGFzc25hbWUgJHBhcmVudGNsYXNzc3ltbmFtZSwgc2VlIGRvY3MKICAgICAgICAgICAgb24gIkNsYXNzIGV4dGVuc2lvbiIgaW4gU1dJR1BsdXMuaHRtbC4gUGF0Y2ggYmFzZWQgb24gc3VibWlzc2lvbiBmcm9tIEtyaXMgVGhpZWxlbWFucy4KCjIwMTItMTAtMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGl0aW9uYWwgbmV3IHNwZWNpYWwgdmFyaWFibGVzIGluICVleGNlcHRpb24gYXJlIGV4cGFuZGVkIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAgJHBhcmVudGNsYXNzbmFtZSAtIFRoZSBwYXJlbnQgY2xhc3MgbmFtZSAoaWYgYW55KSBmb3IgYSBtZXRob2QuCiAgICAgICAgICAgICAgJHBhcmVudGNsYXNzc3ltbmFtZSAtIFRoZSB0YXJnZXQgbGFuZ3VhZ2UgcGFyZW50IGNsYXNzIG5hbWUgKGlmIGFueSkgZm9yIGEgbWV0aG9kLgoKMjAxMi0xMC0wODogaWFudAoJICAgIFtHb10gR2VuZXJhdGluZyBHbyBjb2RlIG5vdyByZXF1aXJlcyB1c2luZyB0aGUgLWludGdvc2l6ZSBvcHRpb24gdG8KCSAgICBpbmRpY2F0ZSB0aGUgc2l6ZSBvZiB0aGUgJ2ludCcgdHlwZSBpbiBHby4gIFRoaXMgaXMgYmVjYXVzZSB0aGUKCSAgICBzaXplIG9mIHRoZSB0eXBlIGlzIGNoYW5naW5nIGZyb20gR28gMS4wIHRvIEdvIDEuMSBmb3IgeDg2XzY0LiAKCjIwMTItMDktMTQ6IHdzZnVsdG9uCgkgICAgQWRkIG5ldyB3YXJuaW5nIGlmIHRoZSBlbXB0eSB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uIGlzIHVzZWQgYXMgYSBiYXNlIGNsYXNzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEJhc2Uge307CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgQmFzZTxpbnQ+OwogICAgICAgICAgICAgIGNsYXNzIERlcml2ZWQgOiBwdWJsaWMgQmFzZTxpbnQ+IHt9OwoKICAgICAgICAgICAgZ2l2ZXMgdGhlIGZvbGxvd2luZyB3YXJuaW5nIGluc3RlYWQgb2Ygc2lsZW50bHkgaWdub3JpbmcgdGhlIGJhc2U6CgogICAgICAgICAgICBjcHBfaW5oZXJpdC5pOjUyOiBXYXJuaW5nIDQwMTogQmFzZSBjbGFzcyAnQmFzZTwgaW50ID4nIGhhcyBubyBuYW1lIGFzIGl0IGlzIGFuIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRlZCB3aXRoICcldGVtcGxhdGUoKScuIElnbm9yZWQuCiAgICAgICAgICAgIGNwcF9pbmhlcml0Lmk6NTE6IFdhcm5pbmcgNDAxOiBUaGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBtdXN0IGJlIHdyaXR0ZW4gYmVmb3JlICdCYXNlPCBpbnQgPicgaXMgdXNlZCBhcyBhIGJhc2UgY2xhc3MgYW5kIGJlIGRlY2xhcmVkIHdpdGggYSBuYW1lLgoKCjIwMTItMDktMTE6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMzUzNTMwNCAtIERpcmVjdCB1c2Ugb2YgYSB3ZWFrIGdsb2JhbCByZWZlcmVuY2UgaW4gZGlyZWN0b3JzCiAgICAgICAgICAgIHNvbWV0aW1lcyBjYXVzaW5nIHNlZyBmYXVsdHMgZXNwZWNpYWxseSBvbiBBbmRyb2lkLgoKMjAxMi0wOS0wNjogd3NmdWx0b24KCSAgICBbSmF2YV0gRml4IChjaGFyICpTVFJJTkcsIHNpemVfdCBMRU5HVEgpIHR5cGVtYXBzIHRvIGFjY2VwdCBOVUxMIHN0cmluZy4KCjIwMTItMDgtMjY6IGRyam9lCgkgICAgW1JdIG1ha2UgRXh0ZXJuYWxSZWZlcmVuY2Ugc2xvdCByZWYgdG8gY29udGFpbiByZWZlcmVuY2UKCjIwMTItMDgtMjY6IGRyam9lCgkgICAgW1JdIGZpeCBFeGFtcGxlcy9NYWtlZmlsZSB0byB1c2UgQyBpbiAkKENDKSByYXRoZXIgdGhhbiAkKENYWCkKClZlcnNpb24gMi4wLjggKDIwIEF1Z3VzdCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTItMDgtMTU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBZGQgc2l6ZV90eXBlLCB2YWx1ZV90eXBlLCBjb25zdF9yZWZlcmVuY2UgdG8gdGhlIFNUTCBjb250YWluZXJzLgoKMjAxMi0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQWRkIGRpc2NhcmQgYW5kIGFkZCBtZXRob2RzIHRvIHN0ZDo6c2V0IHdyYXBwZXJzIHNvIHRoYXQgcHlhYmMuaSBjYW4gYmUgdXNlZCBlbnN1cmluZwogICAgICAgICAgICBNdXRhYmxlU2V0IGlzIGEgdmFsaWQgYWJzdHJhY3QgYmFzZSBjbGFzcyBmb3Igc3RkOjpzZXQuIEFzIHJlcG9ydGVkIGJ5IEFsZXhleSBTb2tvbG92LgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIHN0ZDo6bXVsdGlzZXQuCgoyMDEyLTA4LTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzM1NDE3NDQgLSBNaXNzaW5nIFB5SW50X0Zyb21TaXplX3QgY2FsbHMgZm9yIFB5dGhvbiAzLgoKMjAxMi0wOC0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gRGF2aWQgQmF1bSB0byBhZGQgdGhlIGFzc3VtZW92ZXJyaWRlIGZlYXR1cmUgZm9yIEphdmEgZGlyZWN0b3JzIHRvCiAgICAgICAgICAgIGltcHJvdmUgcGVyZm9ybWFuY2Ugd2hlbiBhbGwgb3ZlcnJpZGRlbiBtZXRob2RzIGNhbiBiZSBhc3N1bWVkIHRvIGJlIG92ZXJyaWRkZW4uCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSAjMzUzMDAyMSBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAjMzUzNjM2MCAtIEludmFsaWQgY29kZSBzb21ldGltZXMgYmVpbmcgZ2VuZXJhdGVkIGZvciBkaXJlY3RvciBtZXRob2RzCiAgICAgICAgICAgIHdpdGggbWFueSBhcmd1bWVudHMuCgoyMDEyLTA4LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gIzM1NDU4NzcgLSBEb24ndCB1bmRlZmluZSBib29sIGlmIGRlZmluZWQgYnkgQzk5IHN0ZGJvb2wuaCAtIHByb2JsZW0gdXNpbmcgCiAgICAgICAgICAgIFBlcmwgNS4xNiBhbmQgbGF0ZXIuCgoyMDEyLTA4LTA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSZW1vdmUgaW5jb3JyZWN0IHdhcm5pbmcgKDMxNCkgYWJvdXQgdGFyZ2V0IGxhbmd1YWdlIGtleXdvcmRzIHdoaWNoIHdlcmUgdHJpZ2dlcmVkCiAgICAgICAgICAgIGJ5IHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgdXNpbmcgZGlyZWN0aXZlcy4gRm9yIGV4YW1wbGUgJ3N0cmluZycgaXMgYSBrZXl3b3JkIGluIEMjOgogICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgeyBjbGFzcyBzdHJpbmc7IH0KICAgICAgICAgICAgICB1c2luZyBzdGQ6OnN0cmluZzsKCjIwMTItMDctMjE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXNwbGF5IG9mIHBvaW50ZXJzIGluIHZhcmlvdXMgcGxhY2VzIG9uIDY0IGJpdCBzeXN0ZW1zIC0gb25seSAzMiBiaXRzIHdlcmUgYmVpbmcgc2hvd24uCgoyMDEyLTA3LTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2RiIGRlYnVnZ2VyIGZ1bmN0aW9ucyAnc3dpZ3ByaW50JyBhbmQgJ2xvY3N3aWdwcmludCcgdG8gZGlzcGxheSB0byB0aGUgZ2RiIG91dHB1dCB3aW5kb3cKICAgICAgICAgICAgcmF0aGVyIHRoYW4gc3Rkb3V0LiBUaGlzIGZpeGVzIGRpc3BsYXkgcHJvYmxlbXMgaW4gZ2RidHVpIGFuZCB0aGUgZW5zdXJlcyB0aGUgb3V0cHV0CiAgICAgICAgICAgIGFwcGVhcnMgd2hlcmUgZXhwZWN0ZWQgaW4gb3RoZXIgZ2RiIGJhc2VkIGRlYnVnZ2VycyBzdWNoIGFzIEVjbGlwc2UgQ0RULgoKMjAxMi0wNy0yMDoga3d3ZXR0ZQogICAgICAgICAgICBbT2N0YXZlXSBzZWdmYXVsdC1vbi1leGl0IHByZXZlbnRpb24gaGFjayBub3cgcHJlc2VydmVzIGV4aXQgc3RhdHVzLCBhbmQgdXNlcyBDOTkgX0V4aXQoKS4KCjIwMTItMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBEZWJpYW4gYnVnIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvNjcyMDM1LCB0eXBlbWFwIGNvcHkgZmFpbHVyZSAtIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCAKICAgICAgICAgICAgaW4gc3dpZy0yLjAuNToKICAgICAgICAgICAgICAlaW5jbHVkZTxzdGwuaT4KICAgICAgICAgICAgICB1c2luZyBzdGQ6OnBhaXI7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKFN0clBhaXIpIHBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjsKCjIwMTItMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgc28gdGhhdAogICAgICAgICAgICB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlIGZvciB0ZW1wbGF0ZXMuIEV4YW1wbGU6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBPdXRlcjIgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFRoaW5nMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIE91dGVyMjsKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBUaGluZzIge307CiAgICAgICAgICAgICAgLy8gU1RJTEwgQlJPS0VOIHZvaWQgdXNlaXQyKFRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgdm9pZCB1c2VpdDJhKE91dGVyMjo6U3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYig6Ok91dGVyMjo6U3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYyhTcGFjZTI6OlRoaW5nMjxpbnQ+IHQpIHt9CiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICB2b2lkIHVzZWl0MmQoU3BhY2UyOjpUaGluZzI8aW50PiB0KSB7fQogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgJXRlbXBsYXRlKFRoaW5nMkludCkgVGhpbmcyPGludD47CgoKMjAxMi0wNi0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHRlbXBsYXRlIG5hbWVzcGFjZSBwcm9ibGVtcyBmb3Igc3ltYm9scyBkZWNsYXJlZCB3aXRoIGEgZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZTEgewogICAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMiB7CiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBZWVk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgU3BhY2UyOjpZWVkgewogICAgICAgICAgICAgICAgICBUIHl5eShUIGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICAgICAgICAgICAgfSAgICAKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2b2lkIHRlc3RZWVkxKFNwYWNlMTo6U3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTIoU3BhY2UyOjpZWVk8aW50PiB5eSkge30KICAgICAgICAgICAgICAgIHZvaWQgdGVzdFlZWTMoOjpTcGFjZTE6OlNwYWNlMjo6WVlZPGludD4geXkpIHt9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldGVtcGxhdGUoWVlZSW50KSBTcGFjZTE6OlNwYWNlMjo6WVlZPGludD47CgoyMDEyLTA2LTMwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbmFtZXNwYWNlIHByb2JsZW1zIGZvciBzeW1ib2xzIGRlY2xhcmVkIHdpdGggYSBmb3J3YXJkIGNsYXNzIGRlY2xhcmF0aW9ucywgc3VjaCBhczoKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlMSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgc3RydWN0IFhYWDsKICAgICAgICAgICAgICAgICAgc3RydWN0IFlZWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UyOjpZWVkge307CiAgICAgICAgICAgICAgICBzdHJ1Y3QgU3BhY2UxOjpTcGFjZTI6OlhYWCB7fTsKCiAgICAgICAgICAgICAgICB2b2lkIHRlc3RYWFgyKFNwYWNlMjo6WFhYIHh4KSB7fQogICAgICAgICAgICAgICAgdm9pZCB0ZXN0WVlZMihTcGFjZTI6OllZWSB5eSkge30KICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aGVyZSB4eCBhbmQgeXkgd2VyZSBub3QgcmVjb2duaXNlZCBhcyB0aGUgcHJveHkgY2xhc3NlcyBYWFggYW5kIFlZWS4KCjIwMTItMDYtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHdpdGggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbnMgc28gdGhhdAogICAgICAgICAgICB0eXBlcyBhcmUgY29ycmVjdGx5IGZvdW5kIGluIHNjb3BlLiAKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOwogICAgICAgICAgICAgIHVzaW5nIFNwYWNlMjo6VGhpbmcyOwogICAgICAgICAgICAgIGNsYXNzIFRoaW5nMiB7fTsKICAgICAgICAgICAgICAvLyBOb25lIG9mIHRoZSBtZXRob2RzIGJlbG93IGNvcnJlY3RseSB1c2VkIHRoZSBUaGluZzIgcHJveHkgY2xhc3MKICAgICAgICAgICAgICB2b2lkIHVzZWl0MihUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmEoT3V0ZXIyOjpTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIHZvaWQgdXNlaXQyYig6Ok91dGVyMjo6U3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICB2b2lkIHVzZWl0MmMoU3BhY2UyOjpUaGluZzIgdCkge30KICAgICAgICAgICAgICBuYW1lc3BhY2UgT3V0ZXIyIHsKICAgICAgICAgICAgICAgIHZvaWQgdXNlaXQyZChTcGFjZTI6OlRoaW5nMiB0KSB7fQogICAgICAgICAgICAgIH0KCjIwMTItMDYtMjU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1c2luZyBkZWNsYXJhdGlvbnMgY29tYmluZWQgd2l0aCB1c2luZyBkaXJlY3RpdmVzIHNvIHRoYXQgdHlwZXMgYXJlIGNvcnJlY3RseSBmb3VuZCBpbiBzY29wZS4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyMiB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgU3BhY2UyIHsKICAgICAgICAgICAgICAgICAgY2xhc3MgVGhpbmcyIHt9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2UgT3V0ZXIyOyAvLyB1c2luZyBkaXJlY3RpdmUKICAgICAgICAgICAgICB1c2luZyBTcGFjZTI6OlRoaW5nMjsgLy8gdXNpbmcgZGVjbGFyYXRpb24KICAgICAgICAgICAgICB2b2lkIHVzZWl0MihUaGluZzIgdCkge30KCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgdGVtcGxhdGVkIGNsYXNzZXMuCgoyMDEyLTA1LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzM1Mjk2MDEgLSBzZWcgZmF1bHQgd2hlbiBhIHByb3RlY3RlZCBtZXRob2QgaGFzIHRoZSAiZGlyZWN0b3IiCiAgICAgICAgICAgIGZlYXR1cmUgYnV0IHRoZSBwYXJlbnQgY2xhc3MgZG9lcyBub3QuIEFsc28gZml4IHNpbWlsYXIgcHJvYmxlbXMgd2l0aAogICAgICAgICAgICB0aGUgYWxscHJvdGVjdGVkIGZlYXR1cmUuCgoyMDEyLTA1LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IHdoZW4gYXR0ZW1wdGluZyB0byB3YXJuIGFib3V0IGFuIGlsbGVnYWwgZGVzdHJ1Y3RvciAtICMzNTMwMDU1LCAzNTMwMDc4IGFuZCAjMzUzMDExOC4KClZlcnNpb24gMi4wLjcgKDI2IE1heSAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KMjAxMi0wNS0yNjogd3NmdWx0b24KICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZW1hcCBtb2RpZmljYXRpb25zIHNvIHRoZXkgY2FuIGJlIHVzZWQgd2l0aCAlYXBwbHkgZm9yIG90aGVyIHN0cmluZwogICAgICAgICAgICBjbGFzc2VzLgoKMjAxMi0wNS0yNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4ZXMgZm9yIC1leHRlcm5hbC1ydW50aW1lIHRvIHdvcmsgYWdhaW4uCgoyMDEyLTA1LTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBEaXNhbWJpZ3VhdGUgU1dJR19Gcm9tX3Vuc2lnbmVkX1NTX2ludCBhbmQgU1dJR19Gcm9tX3Vuc2lnbmVkX1NTX2xvbmcuCgoyMDEyLTA1LTE4OiBvbGx5CgkgICAgW1BIUF0gRml4IGdldHRlcnMgZm9yIHRlbXBsYXRlIG1lbWJlcnMuIChTRiMzNDI4ODMzLCBTRiMzNTI4MDM1KQoKMjAxMi0wNS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IHNvbWUgbGFuZ3VhZ2UncyBzdGQ6Om1hcCB3cmFwcGVycyB0byByZWNvZ25pc2UgZGlmZmVyZW5jZV90eXBlLCBzaXplX3R5cGUsIGtleV90eXBlCiAgICAgICAgICAgIGFuZCBtYXBwZWRfdHlwZS4KCjIwMTItMDUtMTQ6IGt3d2V0dGUgKHNpZ25lZCBvZmYgYnkgeGF2aWVyOTgpCiAgICAgICAgICAgIFtPY3RhdmVdIFByZXZlbnQgT2N0YXZlIGZyb20gc2VnLWZhdWx0aW5nIGF0IGV4aXQgd2hlbiBTV0lHCiAgICAgICAgICAgIG1vZHVsZXMgYXJlIGxvYWRlZCwgZHVlIHRvIGJ1Z3MgaW4gT2N0YXZlJ3MgY2xlYW51cCBjb2RlOgogICAgICAgICAgICAqIFdyYXBwaW5nIGZ1bmN0aW9ucyBub3cgZGVjbGFyZWQgd2l0aCBPY3RhdmUgREVGVU5fRExEIG1hY3JvLAogICAgICAgICAgICAgIGFuZCBsb2FkZWQgdGhyb3VnaCBPY3RhdmUncyBkeW5hbWljIG1vZHVsZSBsb2FkZXIKICAgICAgICAgICAgKiBHbG9iYWwgdmFyaWFibGVzIG9mIHN3aWdyZWYgdHlwZSBhcmUgbm93IGFzc2lnbmVkIGEgbmV3KCkKICAgICAgICAgICAgICBjb3B5IG9mIHRoZSBzd2lncmVmIGNsYXNzLCB0byBwcmV2ZW50IGRvdWJsZS1mcmVlIGVycm9ycwogICAgICAgICAgICAqIFNXSUcgbW9kdWxlIGF0LWV4aXQgY2xlYW51cCBmdW5jdGlvbiBub3cgY3JlYXRlZCBpbiBPY3RhdmUKICAgICAgICAgICAgICB0aHJvdWdoIGV2YWwoKSwgc28gbm90IGRlcGVuZGVudCBvbiBsb2FkZWQgLm9jdCBsaWJyYXJ5CiAgICAgICAgICAgICogRm9yIE9jdGF2ZSB2ZXJzaW9ucyAzLjEuKiB0byAzLjMuKiwgcmVnaXN0ZXIgQy1sZXZlbCBhdC1leGl0CiAgICAgICAgICAgICAgZnVuY3Rpb24gd2hpY2ggdGVybWluYXRlcyBPY3RhdmUgaW1tZWRpYXRlbHkgKHdpdGggY29ycmVjdAogICAgICAgICAgICAgIHN0YXR1cyBjb2RlKSB3aXRob3V0IHBlcmZvcm1pbmcgbWVtb3J5IGNsZWFudXAuIFRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICBjYW4gYmUgY29udHJvbGxlZCB3aXRoIG1hY3JvcyBpbiBMaWIvb2N0YXZlL29jdHJ1bnRpbWUuc3dnCgogICAgICAgICAgICBbT2N0YXZlXSBOZXcgc3ludGF4IGZvciBkZXRlcm1pbmcgd2hldGhlciBTV0lHIG1vZHVsZSBzaG91bGQgYmUKICAgICAgICAgICAgbG9hZGVkIGdsb2JhbGx5IG9yIG5vbi1nbG9iYWxseS4gVG8gbG9hZCBtb2R1bGUgImV4YW1wbGUiIGdsb2JhbGx5LAogICAgICAgICAgICB0eXBlIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAgICAkIGV4YW1wbGU7CiAgICAgICAgICAgIGFzIGJlZm9yZTsgdG8gbG9hZCBtb2R1bGUgbm9uLWdsb2JhbGx5LCBhc3NpZ24gaXQgdG8gYSB2YXJpYWJsZToKICAgICAgICAgICAgJCBleGFtcGxlID0gZXhhbXBsZTsKICAgICAgICAgICAgb3IKICAgICAgICAgICAgJCBleCA9IGV4YW1wbGU7CiAgICAgICAgICAgIGZvciBhIHNob3J0ZXIgKGxvY2FsKSBtb2R1bGUgbmFtZS4gLWdsb2JhbC8tbm9nbG9iYWwgY29tbWFuZC1saW5lCiAgICAgICAgICAgIG9wdGlvbnMgYW5kIG1vZHVsZSBjb21tYW5kIGxpbmUgYXJlIGRlcHJlY2F0ZWQuIEFkZGVkIHVzYWdlIGluZm8KICAgICAgICAgICAgdG8gbW9kdWxlLCBzbyB0eXBpbmcKICAgICAgICAgICAgJCBoZWxwIGV4YW1wbGUKICAgICAgICAgICAgb3IgaW5jb3JyZWN0IHVzYWdlIHNob3VsZCBkaXNwbGF5IHByb3BlciB1c2FnZSwgd2l0aCBleGFtcGxlcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjIwMTItMDUtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gY29kZSBnZW5lcmF0ZWQgZm9yIGEgY2FsbGJhY2suICBQYXRjaCBmcm9tCgkgICAgU0YgYnVnICMzNTEwODA2LgoKMjAxMi0wNS0xMjogb2xseQoJICAgIFtQSFBdIEF2b2lkIHVzaW5nIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBhcyBpdCBkb2Vzbid0IHdvcmsgd2l0aCBhbGwKCSAgICBidWlsZHMgb2YgUEhQIChTRiBidWcgIzMxNjY0MjMpLiAgSW5zdGVhZCB3ZSBub3cgd3JhcCBpdCBpbiBhCgkgICAgU1dJR19GQUlMKCkgZnVuY3Rpb24gd2hpY2ggd2UgYW5ub3RhdGUgYXMgIm5vcmV0dXJuIiBmb3IgR0NDIHRvCgkgICAgYXZvaWRzIHdhcm5pbmdzLiAgVGhpcyBhbHNvIHJlZHVjZXMgdGhlIHNpemUgb2YgdGhlIGNvbXBpbGVkCgkgICAgd3JhcHBlciAoZS5nLiB0aGUgc3RyaXBwZWQgc2l6ZSBpcyByZWR1Y2VkIGJ5IDYlIGZvciBYYXBpYW4ncyBQSFAKCSAgICBiaW5kaW5ncykuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI4NTUgRml4IHVuaW50ZW5kZWQgdW5pbml0aWFsaXNlZCBtZW1vcnkgYWNjZXNzIGluIE9VVFBVVCB0eXBlbWFwcy4KCjIwMTItMDUtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiBwYXRjaCAjMzUyMjY3NCBGaXggcG9zc2libGUgdW5pbml0aWFsaXNlZCBtZW1vcnkgYWNjZXNzIGluIGNoYXIgKipTVFJJTkdfT1VUCiAgICAgICAgICAgIHR5cGVtYXAuCgoyMDEyLTA1LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU0YgcGF0Y2ggIzM1MjI2MTEgRml4IHVuaW5pdGlhbGlzZWQgc2l6ZSByZWdyZXNzaW9uIGluIGNoYXIgKipTVFJJTkdfQVJSQVkKICAgICAgICAgICAgaW50cm9kdWNlZCBpbiBzd2lnLTIuMC42LgoKMjAxMi0wNS0xMTogd3NmdWx0b24KICAgICAgICAgICAgU0YgYnVnICMzNTI1MDUwIC0gRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTIuMC41IHdoZXJlYnkgZGVmaW5pbmcgb25lIHR5cGVtYXAKICAgICAgICAgICAgbWV0aG9kIHN1Y2ggYXMgYW4gJ291dCcgdHlwZW1hcCBtYXkgaGlkZSBhbm90aGVyIHR5cGVtYXAgbWV0aG9kIHN1Y2ggYXMgYW4gJ2luJyB0eXBlbWFwIC0KICAgICAgICAgICAgb25seSBvY2N1cnMgd2hlbiB0aGUgdHlwZSBpcyBhIHRlbXBsYXRlIHR5cGUgd2hlcmUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIHRoZSBzYW1lCiAgICAgICAgICAgIHZpYSBhIHR5cGVkZWYuCgoyMDEyLTA1LTEwOiBvbGx5CgkgICAgW1BIUF0gRml4IHRoZSBjb25zdGFudCB0eXBlbWFwcyBmb3IgU1dJR1RZUEUsIGV0YyAtIHByZXZpb3VzbHkKCSAgICB0aGVzZSB1c2VkIHRoZSB3cm9uZyBuYW1lIGZvciByZW5hbWVkIGNvbnN0YW50cy4gIEFkZAoJICAgIGF1dG9kb2NfcnVubWUucGhwIHRvIHRoZSB0ZXN0c3VpdGUgYXMgYSByZWdyZXNzaW9uIHRlc3QgZm9yIHRoaXMuCgoyMDEyLTA1LTAyOiBpYW5sYW5jZXRheWxvcgoJICAgIFtHb10gUmVtb3ZlIGNvbXBhdGliaWxpdHkgc3VwcG9ydCBmb3IgZ2NjZ28gNC42LiAgVXNpbmcKCSAgICBTV0lHIHdpdGggZ2NjZ28gd2lsbCBub3cgcmVxdWlyZSBnY2NnbyA0LjcuICBVc2luZyBTV0lHCgkgICAgd2l0aCB0aGUgbW9yZSBjb21tb25seSB1c2VkIGdjIGNvbXBpbGVyIGlzIHVuYWZmZWN0ZWQuCgoyMDEyLTA1LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZ2VuZXJhdGVkIGNvZGUgZm9yIEMgZm9yd2FyZCBlbnVtIGRlY2xhcmF0aW9ucyBpbiBzb21lIGxhbmd1YWdlcy4KClZlcnNpb24gMi4wLjYgKDMwIEFwcmlsIDIwMTIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEyLTA0LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggdW5pbml0aWFsaXNlZCB2YXJpYWJsZSBpbiBTV0lHVFlQRSAqKk9VVFBVVCB0eXBlbWFwcyBhcyByZXBvcnRlZCBieSBKaW0gQW5kZXJzb24uCgoyMDEyLTA0LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gd3JhcHBpbmcgU1RMIGNvbnRhaW5lcnMgb24gTWFjIE9TIFggYW5kIHBvc3NpYmx5IG90aGVyIHN5c3RlbXMuCgoyMDEyLTA0LTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUGF0Y2ggMzUyMTgxMSBmcm9tIExlbyBEYXZpcyAtIGNoYXIgKipTVFJJTkdfQVJSQVkgdHlwZW1hcHMgZml4ZWQgdG8gaGFuZGxlCiAgICAgICAgICAgIG51bGwgcG9pbnRlcnMuCgpWZXJzaW9uIDIuMC41ICgxOSBBcHJpbCAyMDEyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMi0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gQXBwbHkgcGF0Y2ggIzM1MTc0MzUgZnJvbSBNaWxlcyBCYWRlciAtIHByZWZlciB0byB1c2UgTHVhX3B1c2hnbG9iYWx0YWJsZQoKMjAxMi0wNC0xNDogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzNTE3NzY5IGZyb20gUm9iaW4gU3RvY2tlciB0byBmaXggY29tcGlsZSBlcnJvciBvbiBNYWNSdWJ5IHVzaW5nIFJTVFJJTkdfUFRSLgoKMjAxMi0wNC0xMzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzM1MTEwMDkgZnJvbSBMZWlmIE1pZGRlbHNjaHVsdGUgZm9yIHNsaWdodGx5IG9wdGltaXNlZCBjaGFyICogdmFyaWFibGUgd3JhcHBlcnMuCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBcHBseSAjMzIxOTY3NiBmcm9tIFNoYW5lIExpZXNlZ2FuZyB3aGljaCBhZGRzOgogICAgICAgICAgICAtIHN1cHBvcnQgZm9yICVmYWN0b3J5CiAgICAgICAgICAgIC0gYSBfX3Rvc3RyaW5nIG1ldGhvZAogICAgICAgICAgICAtIGEgX19kaXNvd24gbWV0aG9kCgoyMDEyLTA0LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBBcHBseSAjMzUxMzU2OSB3aGljaCBhZGRzIGEgY2F0Y2hsaXN0IHRvIHRoZSB4bWwgb3V0cHV0LgoKMjAxMi0wNC0wNTogb2xseQoJICAgIFtMdWFdIEFkZCBzdXBwb3J0IGZvciBMdWEgNS4yIChwYXRjaCBTRiMzNTE0NTkzIGZyb20gTWlsZXMgQmFkZXIpCgoyMDEyLTAzLTI2OiB4YXZpZXI5OAoJICAgIFtvY3RhdmVdIEFwcGx5IHBhdGNoICMzNDI1OTkzIGZyb20gamdpbGxpczogYWRkIGV4dHJhIGxvZ2ljIHRvIHRoZSBvY3RhdmVfc3dpZ190eXBlOjpkaW1zKHZvaWQpIG1ldGhvZDogaXQgY2hlY2tzIGlmIHRoZSB1c2VyIGhhcyBkZWZpbmVkIGEgX19kaW1zX18gbWV0aG9kIGFuZCB1c2VzIHRoaXMgaW4gc3RlYWQgb2YgcmV0dXJuaW5nICgxLDEpCgkgICAgW29jdGF2ZV0gQXBwbHkgcGF0Y2ggIzM0MjQ4MzMgZnJvbSBqZ2lsbGlzOiBtYWtlIGlzX29iamVjdCByZXR1cm4gdHJ1ZSBmb3Igc3dpZyB0eXBlcwoKMjAxMi0wMy0yNDogd3NmdWx0b24KICAgICAgICAgICAgW0RdIEFwcGx5ICMzNTAyNDMxIHRvIGZpeCBkdXBsaWNhdGUgc3ltYm9scyBpbiBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxMi0wMy0yMTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDk0NzkxIC0gJSRpc2dsb2JhbCBmb3IgJXJlbmFtZSBtYXRjaGluZy4KCjIwMTItMDMtMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzQ4NzcwNiBhbmQgIzMzOTE5MDYgLSBtaXNzaW5nIHN0ZGRlZi5oIGluY2x1ZGUgZm9yIHB0cmRpZmZfdCB3aGVuIHVzaW5nICVpbXBvcnQKICAgICAgICAgICAgZm9yIFNUTCBjb250YWluZXJzIGFuZCBjb21waWxpbmcgd2l0aCBnKystNC42LiBBbiBpbmNsdWRlIG9mIHN0ZGRlZi5oIGlzIG5vdyBvbmx5CiAgICAgICAgICAgIGdlbmVyYXRlZCB3aGVuIFNXSUcgZ2VuZXJhdGVzIFNUTCBoZWxwZXIgdGVtcGxhdGVzIHdoaWNoIHJlcXVpcmUgcHRyZGlmZl90LiBJZiB5b3UgCiAgICAgICAgICAgIHdlcmUgcHJldmlvdXNseSByZWx5aW5nIG9uICIjaW5jbHVkZSA8c3RkZGVmLmg+IiBhbHdheXMgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gdXNpbmcgYQogICAgICAgICAgICAlaW5jbHVkZSBvZiBhbiBTVEwgaGVhZGVyLCB5b3UgbWF5IG5vdyBuZWVkIHRvIGFkZCB0aGlzIGluIG1hbnVhbGx5LgoKMjAxMi0wMy0xNjogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzMzOTIyNjQgZnJvbSBTZWJhc3RpZW4gQmluZSB0byBwYXJzZSAodW5zaWduZWQpIGxvbmcgbG9uZyB0eXBlcyBpbiBlbnVtIHZhbHVlIGFzc2lnbm1lbnQuCgoyMDEyLTAzLTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzUwNTUzMCBmcm9tIEthcmwgV2V0dGUgdG8gYWxsb3cgY3VzdG9tIGFsbG9jYXRvcnMgaW4gU1RMIHN0cmluZyBjbGFzc2VzIGZvciB0aGUgVVRMIGxhbmd1YWdlcy4KCjIwMTItMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGx5IHBhdGNoICMzNDY4MzYyIGZyb20gS2FybCBXZXR0ZSB0byBmaXggJWluY2x1ZGUgaW5zaWRlICVkZWZpbmUuCgoyMDEyLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uLCBSdWJ5LCBPY3RhdmUsIFJdIEZpeCAjMzQ3NTQ5MiAtIGl0ZXJhdGluZyB0aHJvdWdoIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG9mIGVudW1lcmF0aW9ucy4KCjIwMTItMDItMjc6IHhhdmllcjk4IChwYXRjaGVzIGZyb20gS2FybCBXZXR0ZSkKCSAgICBbT2N0YXZlXSBVc2UgLWdsb2JhbHMgLiB0byBsb2FkIGdsb2JhbCB2YXJpYWJsZXMgaW4gbW9kdWxlIG5hbWVzcGFjZQoJICAgIFtPY3RhdmVdIENvbW1lbnQgZGVjbGFyYXRpb24gb2YgdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBzd2lnX3JlZ2lzdGVyX2RpcmVjdG9yCgkgICAgW09jdGF2ZV0gRml4IE9DVEFWRV9QQVRIIGluIG9jdGF2ZSBNYWtlZmlsZXMKCSAgICBbT2N0YXZlXSBBZGQgc3VwcG9ydCBmb3Igc3RkOjpsaXN0IC0gZml4IGxpX3N0ZF9jb250YWluZXJzX2ludCB0ZXN0CgkgICAgW09jdGF2ZV0gRml4IGltcG9ydHMgdGVzdAoKMjAxMi0wMi0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIE1ha2UgZ2VuZXJhdGVkIHN1cHBvcnQgZnVuY3Rpb25zIGluIGFycmF5c19qYXZhLmkgc3RhdGljIHNvIHRoYXQgZ2VuZXJhdGVkIGNvZGUKICAgICAgICAgICAgZnJvbSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgU1dJRyBjYW4gYmUgY29tcGlsZWQgYW5kIGxpbmtlZCB0b2dldGhlciAtIHByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgRXZhbiBLcmF1c2UuCgoyMDEyLTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY3Jhc2ggd2l0aCBiYWQgcmVnZXggLSBidWcgIzM0NzQyNTAuCgoyMDEyLTAxLTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgUHl0aG9uIHN0ZXBwZWQgc2xpY2luZyBzdXBwb3J0IHRvIHRoZSBTVEwgd3JhcHBlcnMgKHN0ZDo6dmVjdG9yLCBzdGQ6Omxpc3QpLgogICAgICAgICAgICBBc3NpZ25pbmcgdG8gYSBzbGljZSwgcmVhZGluZyBhIHNsaWNlIGFuZCBkZWxldGluZyBhIHNsaWNlIHdpdGggc3RlcHMgbm93IHdvcmsuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+CgogICAgICAgICAgICAgIHZpID0gdmVjdG9yX2kocmFuZ2UoMTApKQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgdmlbMTo0OjJdID0gWzExMSwgMzMzXQogICAgICAgICAgICAgIHByaW50IGxpc3QodmkpCiAgICAgICAgICAgICAgZGVsIHZpWzM6MTA6M10KICAgICAgICAgICAgICBwcmludCBsaXN0KHZpKQogICAgICAgICAgICAgIHByaW50IGxpc3QodmlbOjotMV0pCgogICAgICAgICAgICBnaXZlcyAoc2FtZSBiZWhhdmlvdXIgYXMgbmF0aXZlIFB5dGhvbiBzZXF1ZW5jZXMgc3VjaCBhcyBsaXN0KToKCiAgICAgICAgICAgICAgWzAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDldCiAgICAgICAgICAgICAgWzAsIDExMSwgMiwgMzMzLCA0LCA1LCA2LCA3LCA4LCA5XQogICAgICAgICAgICAgIFswLCAxMTEsIDIsIDQsIDUsIDcsIDhdCiAgICAgICAgICAgICAgWzgsIDcsIDUsIDQsIDIsIDExMSwgMF0KCjIwMTItMDEtMjM6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBDb3JyZWN0bHkgYW5ub3RhdGUgZnVuY3Rpb24gcG9pbnRlcnMgd2l0aCBDIGxpbmthZ2UuCiAgICAgICAgICAgIFtEXSBFeGNlcHRpb24gYW5kIEVycm9yIGhhdmUgYmVjb21lIGJsZXNzZWQgbmFtZXM7IHJlbW92ZWQgZF9leGNlcHRpb25fbmFtZSB0ZXN0IGNhc2UuCgoyMDEyLTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc29tZSBpbmRleGluZyBidWdzIGluIFB5dGhvbiBTVEwgd3JhcHBlcnMgd2hlbiB0aGUgaW5kZXggaXMgbmVnYXRpdmUsIGVnOgoKICAgICAgICAgICAgJXRlbXBsYXRlKHZlY3Rvcl9pKSBzdGQ6OnZlY3RvcjxpbnQ+CgogICAgICAgICAgICAgIGl2PXZlY3Rvcl9pKFswLDEsMiwzLDQsNV0pCiAgICAgICAgICAgICAgaXZbLTc6XQoKICAgICAgICAgICAgbm93IHJldHVybnMgWzAsIDEsIDIsIDMsIDQsIDVdIGluc3RlYWQgb2YgWzVdLgoKICAgICAgICAgICAgICB2dls3OjldID0gWzIyLDMzXQoKICAgICAgICAgICAgbm93IHJldHVybnMgWzAsIDEsIDIsIDMsIDQsIDUsIDIyLCAzM10gaW5zdGVhZCBvZiAiaW5kZXggb3V0IHJhbmdlIiBlcnJvci4KCiAgICAgICAgICAgIEFsc28gZml4IHNvbWUgc2VnZmF1bHRzIHdoZW4gcmVwbGFjaW5nIHJhbmdlcywgZWcgd2hlbiBpbCBpcyBhIHN0ZDo6bGlzdCB3cmFwcGVyOgoKICAgICAgICAgICAgICBpbFswOjJdID0gWzExXQoKMjAxMi0wMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgW0dvXSBGaXggZm9yd2FyZCBjbGFzcyBkZWNsYXJhdGlvbiB3aXRoaW4gYSBjbGFzcyB3aGVuIHVzZWQgYXMgYSBiYXNlLgoKMjAxMi0wMS0wNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgc3VwcG9ydCBmb3IgJW5zcGFjZSB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KCjIwMTItMDEtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMzQ1MjU2MCBmcm9tIEJyYW50IEt5c2VyIC0gYWRkIHN1cHBvcnQgZm9yICVuc3BhY2Ugd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoyMDExLTEyLTIxOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgJ2RpcmVjdG9yaW4nIHR5cGVtYXAgbm93IGFjY2VwdHMgJDEsICQyIGV0YyBleHBhbnNpb25zIGluc3RlYWQgb2YgaGF2aW5nIHRvIHVzZSB3b3JrYXJvdW5kcyAtCiAgICAgICAgICAgICQxX25hbWUsICQyX25hbWUgZXRjLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFkZCAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSBkaXJlY3RvciB0eXBlbWFwcy4KCjIwMTEtMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgR28sIEphdmEsIERdIEFkZCBzdXBwb3J0IGZvciB0aGUgJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwLgoKMjAxMS0xMi0yMDogd3NmdWx0b24KICAgICAgICAgICAgW09jYW1sLCBPY3RhdmUsIFBIUCwgUHl0aG9uLCBSdWJ5XSBDb3JyZWN0IHNwZWNpYWwgdmFyaWFibGVzIGluICdkaXJlY3RvcmFyZ291dCcgdHlwZW1hcC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBicmVhayBhbnkgJ2RpcmVjdG9yYXJnb3V0JyB0eXBlbWFwcyB5b3UgbWF5IGhhdmUgd3JpdHRlbi4gUGxlYXNlIGNoYW5nZToKICAgICAgICAgICAgICAkcmVzdWx0IHRvICQxCiAgICAgICAgICAgICAgJGlucHV0IHRvICRyZXN1bHQKCiAgICAgICAgICAgIEFsc28gZml4IHRoZSBuYW1lZCAnZGlyZWN0b3JhcmdvdXQnIERJUkVDVE9ST1VUIHR5cGVtYXBzIGZvciB0aGVzZSBsYW5ndWFnZXMgd2hpY2ggZGlkbid0CiAgICAgICAgICAgIHByZXZpb3VzbHkgY29tcGlsZSBhbmQgYWRkIGluICQxLCAkMiBldGMgZXhwYW5zaW9uLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKMjAxMS0xMi0xMDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTV0lHX2Vycm9yKCkgbm93IGdldHMgZGVjb3JhdGVkIHdpdGggcGVybCBzb3VyY2UgZmlsZS9saW5lIG51bWJlci4KICAgICAgICAgICAgW3Blcmw1XSBlcnJvciBoYW5kbGluZyBub3cgY29uZm9ybXMgdG8gcHVibGljIFhTIGFwaSAoZml4ZXMgcGVybCB2NS4xNCBpc3N1ZSkuCgoyMDExLTEyLTEwOiB3c2Z1bHRvbgogICAgICAgICAgICBbQW5kcm9pZC9KYXZhXSBGaXggZGlyZWN0b3JzIHRvIGNvbXBpbGUgb24gQW5kcm9pZC4KCiAgICAgICAgICAgIEFkZGVkIGRvY3VtZW50YXRpb24gYW5kIGV4YW1wbGVzIGZvciBBbmRyb2lkLgoKMjAxMS0xMi0wODogdmFkegoJICAgIEJ1ZyBmaXg6IEhhbmRsZSBtZXRob2RzIHJlbmFtZWQgb3IgaWdub3JlZCBpbiB0aGUgYmFzZSBjbGFzcyBjb3JyZWN0bHkgaW4gdGhlIGRlcml2ZWQgY2xhc3NlcwoJICAgICh0aGV5IGNvdWxkIGJlIHNvbWV0aW1lcyBteXN0ZXJpb3VzbHkgbm90IHJlbmFtZWQgb3IgaWdub3JlZCB0aGVyZSBiZWZvcmUpLgoKMjAxMS0xMi0wMzoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEZpeCBleGNlcHRpb24gZ2x1ZSBjb2RlIGZvciBuZXdlciBETUQgMiB2ZXJzaW9ucy4KICAgICAgICAgICAgW0RdIERvIG5vdCBkZWZhdWx0IHRvIDMyIGJpdCBnbHVlIGNvZGUgZm9yIERNRCBhbnltb3JlLgogICAgICAgICAgICBbRF0gVXNlIHN0ZGMuY29uZmlnLmNfbG9uZy9jX3Vsb25nIHRvIHJlcHJlc2VudCBDIGxvbmcgdHlwZXMuCgoyMDExLTEyLTAxOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXhlZCBidWcgMzQ0NzQyNjogbWVtb3J5IGxlYWsgaW4gdmVjdG9yLl9fZ2V0aXRlbV9fLgoKMjAxMS0xMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFJlbW92ZSBDKysgY29tbWVudHMgZnJvbSBnZW5lcmF0ZWQgQyBjb2RlLgoKMjAxMS0xMS0yNzogb2xseQoJICAgIFtQeXRob25dIEZpeCBzb21lIHdhcm5pbmdzIHdoZW4gY29tcGlsaW5nIGdlbmVyYXRlZCB3cmFwcGVycyB3aXRoCgkgICAgY2VydGFpbiBHQ0Mgd2FybmluZyBvcHRpb25zIChEZWJpYW4gYnVnICM2NTAyNDYpLgoKMjAxMS0xMS0yODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzNDMzNTQxICV0eXBlbWFwKGluLCBudW1pbnB1dHM9MCkgd2l0aCAxMCsgYXJndW1lbnRzLgoKMjAxMS0xMS0yODogb2xseQoJICAgIFtQZXJsXSBGaXggd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXJzIHdpdGggY2VydGFpbgoJICAgIEdDQyB3YXJuaW5nIG9wdGlvbnMgKERlYmlhbiBidWcgIzQzNjcxMSkuCgoyMDExLTExLTI4OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIGtleXdvcmQgbGlzdCB0byBpbmNsdWRlIGtleXdvcmRzIGFkZGVkIGluIFBIUCByZWxlYXNlcyB1cCB0byA1LjMuCgoyMDExLTExLTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFByb3ZpZGUgYW4gZWFzeSB3YXkgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgdmlzaWJpbGl0eSBmb3IgdGhlIHByb3h5IGNsYXNzIHBvaW50ZXIKICAgICAgICAgICAgY29uc3RydWN0b3JzIGFuZCBnZXRDUHRyKCkgbWV0aG9kLiBUaGUgdmlzaWJpbGl0eSBpcyAnaW50ZXJuYWwnIGJ5IGRlZmF1bHQgYW5kIGlmIG11bHRpcGxlCiAgICAgICAgICAgIFNXSUcgbW9kdWxlcyBhcmUgYmVpbmcgdXNlZCBhbmQgY29tcGlsZWQgaW50byBkaWZmZXJlbnQgYXNzZW1ibGllcywgdGhlbiB0aGV5IG5lZWQgdG8gYmUgCiAgICAgICAgICAgICdwdWJsaWMnIGluIG9yZGVyIHRvIHVzZSB0aGUgY29uc3RydWN0b3Igb3IgZ2V0Q1B0cigpIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IGFzc2VtYmx5LgogICAgICAgICAgICBVc2UgdGhlIGZvbGxvd2luZyBtYWNyb3MgdG8gY2hhbmdlIHRoZSB2aXNpYmlsaXRpZXMgaW4gdGhlIHByb3h5IGFuZCB0eXBlIHdyYXBwZXIgY2xhc3M6CgogICAgICAgICAgICAgIFNXSUdfQ1NCT0RZX1BST1hZKHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKICAgICAgICAgICAgICBTV0lHX0NTQk9EWV9UWVBFV1JBUFBFUihwdWJsaWMsIHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKCiAgICAgICAgICAgIFtKYXZhXSBQcm92aWRlIGFuIGVhc3kgd2F5IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHZpc2liaWxpdHkgZm9yIHRoZSBwcm94eSBjbGFzcyBwb2ludGVyCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZ2V0Q1B0cigpIG1ldGhvZC4gVGhlIHZpc2liaWxpdHkgaXMgJ3Byb3RlY3RlZCcgYnkgZGVmYXVsdCBhbmQgaWYgbXVsdGlwbGUKICAgICAgICAgICAgU1dJRyBtb2R1bGVzIGFyZSBiZWluZyB1c2VkIGFuZCBjb21waWxlZCBpbnRvIGRpZmZlcmVudCBwYWNrYWdlcywgdGhlbiB0aGV5IG5lZWQgdG8gYmUgCiAgICAgICAgICAgICdwdWJsaWMnIGluIG9yZGVyIHRvIHVzZSB0aGUgY29uc3RydWN0b3Igb3IgZ2V0Q1B0cigpIG1ldGhvZCBmcm9tIGEgZGlmZmVyZW50IHBhY2thZ2UuCiAgICAgICAgICAgIFVzZSB0aGUgZm9sbG93aW5nIG1hY3JvcyB0byBjaGFuZ2UgdGhlIHZpc2liaWxpdGllcyBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzczoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9QUk9YWShwdWJsaWMsIHB1YmxpYywgU1dJR1RZUEUpCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9UWVBFV1JBUFBFUihwdWJsaWMsIHB1YmxpYywgcHVibGljLCBTV0lHVFlQRSkKCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGZvciBKYXZhIGhhcyBjaGFuZ2VkIGZyb20gcHVibGljIHRvIHByb3RlY3RlZCBmb3IgdGhlIHByb3h5IGNsYXNzZXMuIFVzZSB0aGUKICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9QUk9YWSBtYWNybyBhYm92ZSB0byByZXN0b3JlIHRvIHRoZSBwcmV2aW91cyB2aXNpYmlsaXRpZXMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAgKioqCgoyMDExLTExLTIyOiBzemFnZXIKCSAgICBbcHl0aG9uXSBCdWcgMzQ0MDA0NDogI2lmZGVmIG91dCBTV0lHX1B5dGhvbl9Ob25EeW5hbWljU2V0QXR0ciBpZiAtYnVpbHRpbgoJICAgIGlzbid0IGJlaW5nIHVzZWQsIHRvIGF2b2lkIHVubmVjZXNzYXJ5IGJpbmFyeSBpbmNvbXBhdGliaWxpdGllcyBiZXR3ZWVuCgkgICAgcHl0aG9uIGluc3RhbGxhdGlvbnMuCgoyMDExLTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBCdWcgZml4OiBSZW1vdmUgcm9vdCBkaXJlY3RvcnkgZnJvbSBkaXJlY3Rvcnkgc2VhcmNoIGxpc3QgaW4gV2luZG93cy4KCjIwMTEtMTEtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCAjMzQyMTg3NiBmcm9tIFJvYmluIFN0b2NrZXIgdG8gZml4ICMzNDE2ODE4IC0gc2FtZSBjbGFzcyBuYW1lIGluIAogICAgICAgICAgICBkaWZmZXJlbnQgbmFtZXNwYWNlcyBjb25mdXNpb24gd2hlbiB1c2luZyBtdWx0aXBsZSBtb2R1bGVzLgoKMjAxMS0xMS0xMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBjcmUtYnVpbGQuc2ggdG8gd29yayB3aXRoIG5vbi1jb21wcmVzc2VkIHRhcmJhbGxzIC0gcHJvYmxlbSByZXBvcnRlZCBieSBBZHJpYW4gQmxha2VseS4KCjIwMTEtMTEtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEV4cGFuZCBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0eXBlbWFwIHdhcm5pbmdzLCBlZzoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sIHdhcm5pbmc9IjEwMDA6VGVzdCB3YXJuaW5nIGZvciAnaW4nIHR5cGVtYXAgZm9yICQxX3R5cGUgJDFfbmFtZSIpIGludCAiLi4uIgoKMjAxMS0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgRml4IG5hbWVkIG91dHB1dCB0eXBlbWFwcyBub3QgYmVpbmcgdXNlZCB3aGVuIHRoZSBzeW1ib2wgdXNlcyBhIHF1YWxpZmllciBhbmQgY29udGFpbnMKICAgICAgICAgICAgYSBudW1iZXIsIGVnOgoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGRvdWJsZSBBQkM6Om0xICIuLi4iCgoyMDExLTEwLTI0OiB0YWxieQogICAgICAgICAgICBbcGVybDVdIFNGIGJ1ZyAjMzQyMzExOSAtIG92ZXJsb2FkIGRpc3BhdGNoIHN0YWNrIGNvcnJ1cHRpb24gZml4LiAgQmV0dGVyLCBidXQgbW9yZSByZXNlYXJjaAogICAgICAgICAgICBpcyBuZWVkZWQgb24gYSBzdGFibGUgcGF0aCBmb3IgdGFpbCBjYWxscyBpbiBYUy4KCiAgICAgICAgICAgIEFsc28sIGZpeCBmb3IgbGFyZ2UgbG9uZyBsb25ncyBpbiAzMiBiaXQgcGVybC4KCjIwMTEtMTAtMTM6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gQWxsb3cgT2N0YXZlIG1vZHVsZXMgdG8gYmUgcmUtbG9hZGVkIGFmdGVyIGEgImNsZWFyIGFsbCIuCgoyMDExLTA5LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIHN3aWctMi4wLjEgcmVwb3J0ZWQgYnkgVGVlbXUgSWtvbm9uZSBsZWFkaW5nIHRvIHVuY29tcGlsYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdHlwZWRlZiBhbmQgZnVuY3Rpb24gcG9pbnRlciByZWZlcmVuY2VzLCBmb3IgZXhhbXBsZTogCgogICAgICAgICAgICAgIHR5cGVkZWYgaW50IEZOKGNvbnN0IGludCAmYSwgaW50IGIpOwogICAgICAgICAgICAgIHZvaWQgKnR5cGVkZWZfY2FsbDEoRk4gKiYgcHJlY2FsbGJhY2ssIEZOICogcG9zdGNhbGxiYWNrKTsKCjIwMTEtMDktMTQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIFBhdGNoICMzNDA4MDEyIGZyb20gUmFtYW4gR29wYWxhbiAtIGFkZCBzdXBwb3J0IGZvciBlbWJlZGRlZCBMdWEgKGVMdWEpCiAgICAgICAgICAgIGluY2x1ZGluZyBvcHRpb25zIGZvciB0YXJnZXRpbmcgTHVhIFRpbnkgUkFNIChMVFIpLgoKMjAxMS0wOS0xNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGQgYm9vc3RfaW50cnVzaXZlX3B0ci5pIGxpYnJhcnkgY29udHJpYnV0aW9uIGZyb20gcGF0Y2ggIzM0MDE1NzEuCgoyMDExLTA5LTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgd2FybmluZ3MgZm9yIGJhZGx5IG5hbWVkIGRlc3RydWN0b3JzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IEtTdHJ1Y3QgewogICAgICAgICAgICAgICAgfk5PVF9LU3RydWN0KCkge30KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgY3BwX2V4dGVuZF9kZXN0cnVjdG9ycy5pOjkyOiBXYXJuaW5nIDUyMTogSWxsZWdhbCBkZXN0cnVjdG9yIG5hbWUgfk5PVF9LU3RydWN0LiBJZ25vcmVkLgoKMjAxMS0wOS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVleHRlbmQgYW5kIGRlc3RydWN0b3JzIGZvciB0ZW1wbGF0ZXMuIFRoZSBkZXN0cnVjdG9yIGluICVleHRlbmQgd2FzIG5vdCBhbHdheXMgd3JhcHBlZCwKICAgICAgICAgICAgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVleHRlbmQgRm9vVCB7CiAgICAgICAgICAgICAgICB+Rm9vVCgpIHsgZGVsZXRlICRzZWxmOyB9IC8vIHdhcyBub3Qgd3JhcHBlZCBhcyBleHBlY3RlZAogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgRm9vVCB7fTsKICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vVGkpIEZvb1Q8aW50PjsKCjIwMTEtMDktMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzcGVjaWFsIHZhcmlhYmxlcyBzdWNoIGFzICIkZGVjbCIgYW5kICIkZnVsbGRlY2wiIGluIGRlc3RydWN0b3JzIHRvIGluY2x1ZGUgdGhlIH4gY2hhcmFjdGVyLgoKMjAxMS0wOS0xMDogdGFsYnkKICAgICAgICAgICAgW3Blcmw1XSBTRiBidWcgIzE0ODE5NTggLSBJbXByb3ZlIHJhbmdlIGNoZWNraW5nIGZvciBpbnRlZ2VyIHR5cGVzLgogICAgICAgICAgICBFbmhhbmNlIGxpX3R5cGVtYXBzX3J1bm1lLnBsCgoyMDExLTA5LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJWV4dGVuZCBvbiB0eXBlZGVmIGNsYXNzZXMgaW4gYSBuYW1lc3BhY2UgdXNpbmcgdGhlIHR5cGVkZWYgbmFtZSwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgJWV4dGVuZCBDU3RydWN0IHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB0YWdDU3RydWN0IHsgLi4uIH0gQ1N0cnVjdDsKICAgICAgICAgICAgfQoKMjAxMS0wOC0zMTogeGF2aWVyOTgKCSAgICBbb2N0YXZlXSBwYXRjaGVzIGZyb20gS2FybCBXZXR0ZTogaW1wcm92ZW1lbnRzIHRvIG1vZHVsZSBsb2FkaW5nIGJlaGF2aW9yOwoJICAgIGFkZGVkIGV4YW1wbGUgb2YgZnJpZW5kIG9wZXJhdG9yIHRvIG9wZXJhdG9yIGV4YW1wbGU7IGZpeGVkIG9jdGF2ZSBwYW5pYy9jcmFzaCBpbiAzLjAuNTsKCSAgICBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cwoKMjAxMS0wOC0zMDogc3phZ2VyCgkgICAgW3B5dGhvbl0gQnVnIDM0MDA0ODYsIGZpeCBlcnJvciBzaWduYWxsaW5nIGZvciBidWlsdC1pbiBjb25zdHJ1Y3RvcnMuCgoyMDExLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbR29dIEZpeCBmaWxlL2xpbmUgbnVtYmVyIGRpc3BsYXkgZm9yICJnb3R5cGUiIHdoZW4gdXNpbmcgdHlwZW1hcCBkZWJ1Z2dpbmcgb3B0aW9ucwogICAgICAgICAgICAtdG1zZWFyY2ggYW5kIC10bXVzZWQuCgoyMDExLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIERdIEZpeCAlY2FsbGJhY2sgd2hpY2ggd2FzIGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIGNvZGUuCgoyMDExLTA4LTI1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggY29uc3RydWN0b3JzIGluIG5hbWVkIHR5cGVkZWYgY2xhc3MgZGVjbGFyYXRpb25zIGFzIHJlcG9ydGVkIGJ5IEdyZWdvcnkgQnJvbm5lcjoKCiAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEEgewogICAgICAgICAgICAgIEEoKXt9IC8vIENvbnN0cnVjdG9yIHdoaWNoIHdhcyBub3QgYWNjZXB0ZWQgYnkgU1dJRwogICAgICAgICAgICAgIEIoKXt9IC8vIE5PVCBhIGNvbnN0cnVjdG9yIC0taWxsZWdhbCwgYnV0IHdhcyBhY2NlcHRlZCBieSBTV0lHCiAgICAgICAgICAgIH0gQjsKCiAgICAgICAgICAgIEZvciBDIGNvZGUsIHRoZSBmaXggbm93IHJlc3VsdHMgaW4gdGhlIHVzZSBvZiAnc3RydWN0IEEgKicgaW5zdGVhZCBvZiBqdXN0ICdCIConIGluCiAgICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgY29kZSB3aGVuIHdyYXBwaW5nIG1lbWJlcnMgaW4gQSwgYnV0IHVsdGltYXRlbHkgdGhpcyBkb2VzIG5vdCBtYXR0ZXIsIGFzCiAgICAgICAgICAgIHRoZXkgYXJlIHRoZSBzYW1lIHRoaW5nLgoKMjAxMS0wOC0yMzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVuZXdvYmplY3Qgd2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggJWZlYXR1cmUoInJlZiIpIGFzIHJlcG9ydGVkIGJ5IEphbiBCZWNrZXIuIFRoZQogICAgICAgICAgICBjb2RlIGZyb20gdGhlICJyZWYiIGZlYXR1cmUgd2FzIG5vdCBhbHdheXMgYmVpbmcgZ2VuZXJhdGVkIGZvciB0aGUgZnVuY3Rpb24gc3BlY2lmaWVkIGJ5ICVuZXdvYmplY3QuCiAgICAgICAgICAgIERvY3VtZW50YXRpb24gZm9yICJyZWYiIGFuZCAidW5yZWYiIG1vdmVkIGZyb20gUHl0aG9uIHRvIHRoZSBDKysgY2hhcHRlci4KCjIwMTEtMDgtMjI6IHN6YWdlcgoJICAgIFtweXRob25dIEZpeGVkIG1lbW9yeSBsZWFrIHdpdGggLS1idWlsdGluIG9wdGlvbiAoYnVnIDMzODUwODkpLgoKMjAxMS0wOC0yMjogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gU0YgcGF0Y2ggIzMzOTQzMzkgZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgLSBuZXcgb3B0aW9uIC1ub21vZHVsZWdsb2JhbCB0byBkaXNhYmxlIGluc3RhbGxpbmcgCiAgICAgICAgICAgIHRoZSBtb2R1bGUgdGFibGUgaW50byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4gUmVxdWlyZSBjYWxsIGFsc28gcmV0dXJucyB0aGUgbW9kdWxlIHRhYmxlIGluc3RlYWQgCiAgICAgICAgICAgIG9mIGEgc3RyaW5nLgoKMjAxMS0wOC0wOTogeGF2aWVyOTgKICAgICAgICAgICAgRml4IGJ1ZyAzMzg3Mzk0OyBPY3RhdmUgcGF0Y2hlcyBmb3IgMy40LjAgY29tcGF0aWJpbGl0eSwgZXRjLiAoZnJvbSBLYXJsIFdldHRlKQoKMjAxMS0wOC0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluICRzeW1uYW1lIGV4cGFuc2lvbiBmb3IgZGlyZWN0b3IgbWV0aG9kcy4KCjIwMTEtMDctMjk6IG9sbHkKCSAgICBbUEhQXSBEb24ndCBnZW5lcmF0ZSAicmV0dXJuICRyOyIgaW4gY2FzZXMgd2hlcmUgJHIgaGFzbid0IGJlZW4gc2V0LgoJICAgIFRoaXMgd2FzIGJhc2ljYWxseSBoYXJtbGVzcywgZXhjZXB0IGl0IGdlbmVyYXRlZCBhIFBIUCBFX05PVElDRSBpZgoJICAgIHRoZSBjYWxsaW5nIGNvZGUgaGFkIGVuYWJsZWQgdGhlbS4KCjIwMTEtMDctMjY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzY29waW5nIG9mIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIG5lc3RlZCB3aXRoaW4gYSBjbGFzcyAoZm9yIEMrKykuIFByZXZpb3VzbHkgdGhlIHN5bWJvbAogICAgICAgICAgICB3YXMgaW5jb3JyZWN0bHkgcHV0IGludG8gdGhlIG91dGVyIG5hbWVzcGFjZSwgZWcKCiAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEtleSwgY2xhc3MgVD4gc3RydWN0IG1hcCB7CiAgICAgICAgICAgICAgICBjbGFzcyBpdGVyYXRvcjsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpdGVyYXRvciB3YXMgc2NvcGVkIGFzIHN0ZDo6aXRlcmF0b3IsIGJ1dCBub3cgaXQgaXMgY29ycmVjdGx5IHN0ZDo6bWFwPEtleSwgVD46Oml0ZXJhdG9yOwoKICAgICAgICAgICAgQWxzbyBmaXhlZCBpcyAldGVtcGxhdGUgYW5kIHRlbXBsYXRlIHBhcmFtZXRlcnMgdGhhdCBhcmUgYSB0eXBlZGVmIHdoZW4gdGhlIHRlbXBsYXRlIGNvbnRhaW5zCiAgICAgICAgICAgIGRlZmF1bHQgdGVtcGxhdGUgcGFyYW1ldGVycywgZWc6CgogICAgICAgICAgICBuYW1lc3BhY2UgU3RkIHsKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBLZXksIGNsYXNzIFQsIGNsYXNzIEMgPSBpbnQ+IHN0cnVjdCBNYXAgewogICAgICAgICAgICAgICAgdHlwZWRlZiBLZXkga2V5X3R5cGU7CiAgICAgICAgICAgICAgICB0eXBlZGVmIFQgbWFwcGVkX3R5cGU7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0eXBlZGVmIGRvdWJsZSBET1VCTEU7CiAgICAgICAgICAgICV0ZW1wbGF0ZShNTSkgU3RkOjpNYXA8aW50LCBET1VCTEU+OwoKICAgICAgICAgICAgQWxsIHN5bWJvbHMgd2l0aGluIE1hcCB3aWxsIGJlIHJlc29sdmVkIGNvcnJlY3RseSwgZWcga2V5X3R5cGUgYW5kIG1hcHBlZF90eXBlIG5vIG1hdHRlciBpZiB0aGUKICAgICAgICAgICAgd3JhcHBlZCBjb2RlIHVzZXMgU3RkOjpNYXA8aW50LCBkb3VibGU+IG9yIHN0ZDo6TWFwPGludCwgRE9VQkxFPiBvciBTdGQ6Ok1hcDxpbnQsIGRvdWJsZSwgaW50PgoKICAgICAgICAgICAgQWxzbyBmaXhlcyBidWcgIzMzNzgxNDUgLSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gMi4wLjQgLSAldGVtcGxhdGUgdXNpbmcgdHJhaXRzLgoKMjAxMS0wNy0yMCAgc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4IGNsb3N1cmUgZm9yIHRwX2NhbGwgc2xvdC4KCjIwMTEtMDctMTY6IHdzZnVsdG9uCgkgICAgW3B5dGhvbl0gRml4IGRpcmVjdG9yIHR5cGVtYXAgdXNpbmcgUHlPYmplY3QgKi4KCjIwMTEtMDctMTM6IHN6YWdlcgoJICAgIFtweXRob25dIFNGIHBhdGNoICMzMzY1OTA4IC0gQWRkIGFsbCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHRvIG1hcCBzdXBwb3J0IGNvZGUgaW4gc3RkX21hcC5pCgoyMDExLTA3LTEzOiBzemFnZXIKCSAgICBbcHl0aG9uXSBGaXggZm9yIGJ1ZyAzMzI0NzUzOiAlcmVuYW1lIG1lbWJlciB2YXJpYWJsZXMgd2l0aCAtYnVpbHRpbi4KCjIwMTEtMDctMDE6IHdzZnVsdG9uCgkgICAgRml4IHNvbWUgc2NvcGUgYW5kIHN5bWJvbCBsb29rdXAgcHJvYmxlbXMgd2hlbiB0ZW1wbGF0ZSBkZWZhdWx0IHBhcmFtZXRlcnMgYXJlIGJlaW5nCiAgICAgICAgICAgIHVzZWQgd2l0aCB0eXBlZGVmLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFhYLCB0eXBlbmFtZSBUVCA9IFNvbWVUeXBlPiBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICB0eXBlZGVmIFhYIFg7CiAgICAgICAgICAgICAgdHlwZWRlZiBUVCBUOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUVD4gc3RydWN0IFVzZXNGb28gewogICAgICAgICAgICAgIHZvaWQgeCh0eXBlbmFtZSBGb288VFQ+OjpULCB0eXBlbmFtZSBGb288VFQ+OjpYKTsKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFsc28gZml4ZXMgdXNlIG9mIHN0ZDo6dmVjdG9yPGludD46OnNpemVfdHlwZSBmb3IgUHl0aG9uIGFzIHJlcG9ydGVkIGJ5IEF1YnJleSBCYXJuYXJkLgoKMjAxMS0wNi0yMzogb2xseQoJICAgIFtQSFBdIEZpeCBkaXJlY3RvciBjb2RlIHRvIHdvcmsgd2hlbiBQSFAgaXMgYnVpbHQgd2l0aCBaVFMgZW5hYmxlZCwKCSAgICB3aGljaCBpcyB0aGUgc3RhbmRhcmQgY29uZmlndXJhdGlvbiBvbiBNaWNyb3NvZnQgV2luZG93cy4KCjIwMTEtMDYtMjE6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICAtIHZhcmlvdXMgc21hbGwgdHdlYWtzIGFuZCBidWcgZml4ZXMuCgkgICAgLSBBdm9pZCBuYW1lIGNvbmZsaWN0cyBiZXR3ZWVuIHNtYXJ0IHBvaW50ZXIgd3JhcHBlcnMgYW5kIHRoZSB3cmFwcGVycyBmb3IKCSAgICB0aGUgYWN0dWFsIGNsYXNzLgoJICAgIC0gRml4IGRlZmF1bHQgdHlwZW1hcHMgZm9yIEMgYmluZGluZ3MsIHdoaWNoIHdlcmUgaW5jb3JyZWN0bHkgYXR0ZW1wdGluZyB0bwoJICAgIGNhbGwgbm9uLWV4aXN0ZW50IGRlc3RydWN0b3JzIG9uIHVzZXItZGVmaW5lZCB0eXBlcy4KCSAgICAtIE5ldyBmZWF0dXJlLCBmZWF0dXJlOmFjbG1peGlucywgZm9yIGFkZGluZyBzdXBlcmNsYXNzIHRvIHRoZSBmb3JlaWduIGNsYXNzCgkgICAgd3JhcHBlcnMuCgkgICAgLSBJbXByb3ZlIGxvbmdsb25nIHR5cGVtYXBzLgoKMjAxMS0wNi0xOTogd3NmdWx0b24KCSAgICBGaXggaW5jb3JyZWN0IHR5cGVtYXBzIGJlaW5nIHVzZWQgZm9yIGEgc3ltYm9sIHdpdGhpbiBhIHRlbXBsYXRlZCB0eXBlLCBlZzoKICAgICAgICAgICAgQTxpbnQ+Ojp2YWx1ZV90eXBlIHdvdWxkIGluY29ycmVjdGx5IHVzZSBhIHR5cGVtYXAgZm9yIHR5cGUgQS4KCjIwMTEtMDYtMTg6IG9sbHkKCSAgICBbVGNsXSBGaXggdmFyaWFibGUgZGVjbGFyYXRpb25zIGluIG1pZGRsZSBvZiBibG9ja3Mgd2hpY2ggaXNuJ3QKCSAgICBwZXJtaXR0ZWQgaW4gQzkwIChpc3N1ZSBwcm9iYWJseSBpbnRyb2R1Y2VkIGluIDIuMC4zIGJ5IHBhdGNoICMzMjI0NjYzKS4KCSAgICBSZXBvcnRlZCBieSBQYXVsIE9iZXJtZWllciBpbiBTRiMzMjg4NTg2LgoKMjAxMS0wNi0xNzogd3NmdWx0b24KCSAgICBbSmF2YV0gU0YgIzMzMTI1MDUgLSBzbGlnaHRseSBlYXNpZXIgdG8gd3JhcCBjaGFyW10gb3IgY2hhcltBTlldIHdpdGggYSBKYXZhIGJ5dGVbXQogICAgICAgICAgICB1c2luZyBhcnJheXNfamF2YS5pLgoKMjAxMS0wNi0xMzogd3NmdWx0b24KCSAgICBbUnVieSwgT2N0YXZlXSBTRiAjMzMxMDUyOCBBdXRvZG9jIGZpeGVzIHNpbWlsYXIgdG8gdGhvc2UgZGVzY3JpYmVkIGJlbG93IGZvciBQeXRob24uCgoyMDExLTA2LTEwOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZldyBzdWJ0bGUgYnVnZml4ZXMgaW4gYXV0b2RvYyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24sCiAgICAgICAgICAgIC0gVW5uYW1lZCBhcmd1bWVudCBuYW1lcyBmaXggZm9yIGF1dG9kb2MgbGV2ZWxzID4gMC4KICAgICAgICAgICAgLSBEaXNwbGF5IG9mIHRlbXBsYXRlIHR5cGVzIGZpeGVkIGZvciBhdXRvZG9jIGxldmVscyA+IDEuCiAgICAgICAgICAgIC0gRml4IFNGICMzMzEwNTI4IC0gZGlzcGxheSBvZiB0eXBlZGVmIHN0cnVjdHMgZm9yIGF1dG9kb2MgbGV2ZWxzID4gMS4KICAgICAgICAgICAgLSBBZGQgbWlzc2luZyB0eXBlIGZvciBzZWxmIGZvciBhdXRvZG9jIGxldmVscyAxIGFuZCAzLgogICAgICAgICAgICAtIGF1dG9kb2MgbGV2ZWxzIDIgYW5kIDMgZG9jdW1lbnRlZC4KICAgICAgICAgICAgLSBNaW5vciB0d2Vha3MgdG8gYXV0b2RvYyBzdHlsZSB0byBjb25mb3JtIHdpdGggUEVQOC4KCjIwMTEtMDUtMzA6IG9sbHkKCSAgICBbUEhQXSBGaXggaGFuZGxpbmcgb2YgZGlyZWN0b3JzIHdoZW4gLXByZWZpeCBpcyB1c2VkLgoKMjAxMS0wNS0yNDogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBtZXRob2RzIG9mIGNsYXNzZXMgd2l0aCBhIHZpcnR1YWwgYmFzZSBjbGFzcyAoU0YjMzEyNDY2NSkuCgpWZXJzaW9uIDIuMC40ICgyMSBNYXkgMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtHdWlsZV0gUGF0Y2ggIzMxOTE2MjUgZml4aW5nIG92ZXJsb2FkaW5nIG9mIGludGVnZXIgdHlwZXMuCgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBQYXRjaCAjMzI2MDI2NSBmaXhpbmcgb3ZlcmxvYWRpbmcgb2Ygbm9uLXByaW1pdGl2ZSB0eXBlcyBhbmQgaW50ZWdlcnMgaW4gCiAgICAgICAgICAgIFBlcmwgNS4xMiBhbmQgbGF0ZXIuCgoyMDExLTA1LTE5OiB3c2Z1bHRvbgoJICAgIFtSdWJ5XSBGaXggJWltcG9ydCB3aGVyZSBvbmUgb2YgdGhlIGltcG9ydGVkIGZpbGVzICVpbmNsdWRlIG9uZSBvZiB0aGUgU1RMIGluY2x1ZGUKICAgICAgICAgICAgZmlsZXMgc3VjaCBhcyBzdGRfdmVjdG9yLmkuCgoyMDExLTA1LTE3OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBBcHBseSAjMzI4OTg1MSBmcm9tIEFsYW4gSGFyZGVyIHRvIGZpeCBtZW1vcnkgbGVhayBpbiBkaXJlY3RvcnMgd2hlbiBjaGVja2luZwogICAgICAgICAgICBmb3IgcGVuZGluZyBleGNlcHRpb25zLgoKMjAxMS0wNS0xNzogd3NmdWx0b24KCSAgICBbVGNsXSBBcHBseSAjMzMwMDA3MiBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB0byBmaXggbXVsdGlwbGUgbW9kdWxlIGxvYWRpbmcgbm90CiAgICAgICAgICAgIGFsd2F5cyBzaGFyaW5nIHZhcmlhYmxlcyBhY3Jvc3MgbW9kdWxlcy4KCjIwMTEtMDUtMTY6IHhhdmllcjk4CgkgICAgW29jdGF2ZV0gRml4IGFuIGluY29tcGF0aWJpbGl0eSB3aXRoIG5ldmVyIHZlcnNpb25zIG9mIE9jdGF2ZS4gQ2FzZSBvbiBPY3RhdmUKCSAgICBBUEkgPj0gNDAgdG8gaGFuZGxlIHJlbmFtZSBvZiBPY3RhdmVfbWFwIHRvIG9jdGF2ZV9tYXAuCgkgICAgW29jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIHkuX19yb3BfXyh4KSBvcGVyYXRvcnMgd2hlbiB4Ll9fb3BfXyh5KSBkb2Vzbid0IGV4aXN0LgoJICAgIFtvY3RhdmVdIEFsbG93IGdsb2JhbCBvcGVyYXRvcnMgdG8gYmUgZGVmaW5lZCBieSBTV0lHLXdyYXBwZWQgZnVuY3Rpb25zLgoJICAgIFtvY3RhdmVdIEZpeCBzZXZlcmFsIGJ1Z3MgYXJvdW5kIG1vZHVsZSBuYW1lc3BhY2VzOyBhZGQgLWdsb2JhbCwgLW5vZ2xvYmFsLAoJICAgIC1nbG9iYWxzIDxuYW1lPiBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byB0aGUgbW9kdWxlLgoKMjAxMS0wNS0xNDogd3NmdWx0b24KCSAgICAldmFyYXJncyB3aGVuIHVzZWQgd2l0aCBhIG51bWVyaWMgYXJndW1lbnQgdXNlZCB0byBjcmVhdGUgYW4gYWRkaXRpb25hbCBhcmd1bWVudCAKICAgICAgICAgICAgd2hpY2ggd2FzIGludGVuZGVkIHRvIHByb3ZpZGUgYSBndWFyYW50ZWVkIHNlbnRpbmVsIHZhbHVlLiBUaGlzIG5ldmVyIHdvcmtlZCBhbmQgbm93CiAgICAgICAgICAgIHRoZSBhZGRpdGlvbmFsIGFyZ3VtZW50IGlzIG5vdCBnZW5lcmF0ZWQuCgoyMDExLTA1LTEzOiB3c2Z1bHRvbgoJICAgIFtweXRob25dIEFkZGl0aW9uYWwgZml4ZXMgZm9yIHB5dGhvbjMuMiBzdXBwb3J0LgoKMjAxMS0wNS0wNzogc3phZ2VyCgkgICAgW3B5dGhvbl0gRml4ZWQgUHlHZXRTZXREZXNjciBmb3IgcHl0aG9uMy4yLgoKMjAxMS0wNS0wNTogd3NmdWx0b24KICAgICAgICAgICAgW0x1YSwgUHl0aG9uLCBUY2xdIEMvQysrIHByb3RvdHlwZXMgc2hvd24gaW4gZXJyb3IgbWVzc2FnZSB3aGVuIGNhbGxpbmcgYW4gb3ZlcmxvYWRlZAogICAgICAgICAgICBtZXRob2Qgd2l0aCBpbmNvcnJlY3QgYXJndW1lbnRzIGltcHJvdmVkIHRvIHNob3cgYWx3YXlzIHNob3cgZnVsbHkgcXVhbGlmaWVkIG5hbWUKICAgICAgICAgICAgYW5kIGlmIGEgY29uc3QgbWV0aG9kLiAKCiAgICAgICAgICAgIEFsc28gZml4ZWQgb3RoZXIgTHVhIGVycm9yIG1lc3NhZ2VzIGluIGdlbmVyYXRlZCBjb2RlIHdoaWNoIHdlcmVuJ3QgY29uc2lzdGVudGx5CiAgICAgICAgICAgIHVzaW5nIHRoZSBmdWxseSBxdWFsaWZpZWQgQysrIG5hbWUgLSByZXF1ZXN0ZWQgYnkgR2VkYWxpYSBQYXN0ZXJuYWsuCgoyMDExLTA0LTI5OiBzemFnZXIKCSAgICBCdWcgMjYzNTkxOTogQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNvbnZlcnQgc3RkOjptYXAgdG8gYSBweXRob24gZGljdC4KCjIwMTEtMDQtMjk6IHN6YWdlcgoJICAgIFtQeXRob25dIEZpeGVkIGJ1ZyAyODExNTQ5OiByZXR1cm4gbm9uLWNvbnN0IGl0ZXJhdG9ycyBmcm9tIFNUTAoJICAgIG1ldGhvZHMgYmVnaW4oKSwgZW5kKCksIHJiZWdpbigpLCByZW5kKCkuCgoyMDExLTA0LTI1OiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBidWcgMTQ5ODkyOTogQWNjZXNzIHRvIG1lbWJlciBmaWVsZHMgaW4gbWFwIGVsZW1lbnRzCgoyMDExLTA0LTIzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gbnNwYWNlOiBDb3JyZWN0bHkgZ2VuZXJhdGUgaWRlbnRpZmllcnMgZm9yIGJhc2UgY2xhc3NlcyB3aGVuCiAgICAgICAgICAgIG5vdCBpbiBzcGxpdCBwcm94eSBtb2RlLgoKMjAxMS0wNC0xMzogc3phZ2VyCgkgICAgRml4ZWQgYnVnIDMyODYzMzM6IGluZmluaXRlIHJlY3Vyc2lvbiB3aXRoIG11dHVhbCAndXNpbmcgbmFtZXNwYWNlJyBjbGF1c2VzLgoKMjAxMS0wNC0xMjogc3phZ2VyCgkgICAgRml4ZWQgYnVnIDExNjM0NDA6IHZhcmFyZyB0eXBlbWFwcy4KCjIwMTEtMDQtMTI6IHN6YWdlcgoJICAgIEZpeGVkIGJ1ZyAjMzI4NTM4NjogcGFyc2UgZXJyb3IgZnJvbSAnb3BlcmF0b3IgVComKCknLiAgQWRkZWQgb3BlcmF0b3JfcG9pbnRlcl9yZWYKCSAgICB0ZXN0IGNhc2UgdG8gZGVtb25zdHJhdGUuCgoyMDExLTA0LTExOiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCBQeVZhck9iamVjdF9IRUFEX0lOSVQgdG8gZWxpbWluYXRlIFZDKysgY29tcGlsZXIgZXJyb3JzIGFib3V0CgkgICAgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdCBtZW1iZXJzIHdpdGggcG9pbnRlcnMuCgoyMDExLTA0LTExOiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzI4NDMyNiBmcm9tIENvbGluIE1jRG9uYWxkIHRvIGZpeCBzb21lIGNvbXBpbGVyIHdhcm5pbmdzLgoKMjAxMS0wNC0xMTogc3phZ2VyCgkgICAgW1B5dGhvbl0gRml4ZWQgUHlWYXJPYmplY3RfSEVBRF9JTklUIHRvIGVsaW1pbmF0ZSBWQysrIGNvbXBpbGVyIGVycm9ycyBhYm91dAoJICAgIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiBzdHJ1Y3QgbWVtYmVycyB3aXRoIHBvaW50ZXJzLgoKMjAxMS0wNC0xMDoga2xpY2t2ZXJib3QKICAgICAgICAgICAgW0RdIEZpeGVkIHdyYXBwaW5nIG9mIGVudW1zIHRoYXQgYXJlIHR5cGUgY2hhciwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgIGVudW0geyBYID0gJ1gnOyB9ICh0aGlzIHdhcyBhbHJlYWR5IGluIDIuMC4zIGZvciBDIyBhbmQgSmF2YSkKCjIwMTEtMDQtMTA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtEXSBuc3BhY2U6IEZpeGVkIHJlZmVyZW5jaW5nIHR5cGVzIGluIHRoZSByb290IG5hbWVzcGFjZSB3aGVuCiAgICAgICAgICAgIG5vdCBpbiBzcGxpdCBwcm94eSBtb2RlLgoKMjAxMS0wNC0wOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gQXBwbGllZCBwYXRjaCAjMTkzMjQ4NDogbWlncmF0ZSBQeUNPYmplY3QgdG8gUHlDYXBzdWxlLgoKMjAxMS0wNC0wOTogc3phZ2VyCgkgICAgW1B5dGhvbl0gQWRkZWQgcHJlcHJvY2Vzc29yIGd1YXJkcyBmb3IgcHl0aG9uIGZ1bmN0aW9ucyBQeVVuaWNvZGVfQXNXaWRlQ2hhciBhbmQKCSAgICBQeVNsaWNlX0dldEluZGljZXMsIHdoaWNoIGNoYW5nZWQgc2lnbmF0dXJlcyBpbiBweXRob24zLjIuCgoyMDExLTA0LTA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgY29uc3QgYXJyYXkgdHlwZWRlZnMgd2hpY2ggd2VyZSBnZW5lcmF0aW5nIHVuY29tcGlsYWJsZSBjb2RlIGFzCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEthcmwgV2V0dGUuCgoyMDExLTA0LTAzOiBzemFnZXIKCSAgICBbUHl0aG9uXSBGaXhlZCB0aGUgYmVoYXZpb3Igb2YgJXB5dGhvbm5vbmR5bmFtaWMgdG8gY29uZm9ybSB0byB0aGUgc3BlYyBpbiBMaWIvcHl1c2VyZGlyLnN3Zy4KCjIwMTEtMDQtMDM6IHN6YWdlcgoJICAgIFtQeXRob25dIE1lcmdlZCBpbiB0aGUgc3phZ2VyLXB5dGhvbi1idWlsdGluIGJyYW5jaCwgYWRkaW5nIHRoZSAtYnVpbHRpbiBmZWF0dXJlCgkgICAgZm9yIHB5dGhvbi4gIFRoZSAtYnVpbHRpbiBvcHRpb24gbWF5IHByb3ZpZGUgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBnYWluCgkgICAgaW4gcHl0aG9uIHdyYXBwZXJzLiAgRm9yIGZ1bGwgZGV0YWlscyBhbmQgbGltaXRhdGlvbnMsIHJlZmVyIHRvIERvYy9NYW51YWwvUHl0aG9uLmh0bWwuCgkgICAgQSBzbWFsbCB0ZXN0IHN1aXRlIGRlc2lnbmVkIHRvIGRlbW9uc3RyYXRlIHRoZSBwZXJmb3JtYW5jZSBnYWluIGlzIGluCgkgICAgRXhhbXBsZXMvcHl0aG9uL3BlcmZvcm1hbmNlLgoKMjAxMS0wNC0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluIG1pc3Npbmcgd3JhcHBlcnMgZm9yIGZyaWVuZCBmdW5jdGlvbnMgZm9yIHNvbWUgdGFyZ2V0IGxhbmd1YWdlcywgbW9zdGx5CiAgICAgICAgICAgIHRoZSBub24tc2NyaXB0aW5nIGxhbmd1YWdlcyBsaWtlIEphdmEgYW5kIEMjLgoKVmVyc2lvbiAyLjAuMyAoMjkgTWFyY2ggMjAxMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMTEtMDMtMjk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBBcHBseSBwYXRjaCAjMzIzOTA3NiBmcm9tIE1hcmllIFdoaXRlIGZpeGluZyBzdHJpbmdzIGZvciBSID49IDIuNy4wCgoyMDExLTAzLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBBcHBseSBwYXRjaCAjMzI0ODI4MCBmcm9tIENocmlzdGlhbiBEZWxiYWVyZSB3aGljaCBhZGRzIGJldHRlciBlcnJvciBtZXNzYWdlcyB3aGVuCiAgICAgICAgICAgIHRoZSBpbmNvcnJlY3QgbnVtYmVyIG9yIHR5cGUgb2YgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gb3ZlcmxvYWRlZCBtZXRob2RzLgoKMjAxMS0wMy0yOTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gQXBwbHkgcGF0Y2ggIzMyMjQ2NjMgZnJvbSBDaHJpc3RpYW4gRGVsYmFlcmUuCiAgICAgICAgICAgIDEuIEZpeCB3aGVuIGZ1bmN0aW9uIHJldHVybnMgYSBOVUxMIHZhbHVlLCBhICJOVUxMIiBjb21tYW5kIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgVGNsIGludGVycHJldGVyCiAgICAgICAgICAgIGFuZCBjYWxsaW5nIHRoaXMgY29tbWFuZCB3aWxsIGNhdXNlIGEgc2VnbWVudGF0aW9uIGZhdWx0LiAKCiAgICAgICAgICAgIDIuIFByZXZpb3VzIGltcGxlbWVudGF0aW9uIHNlYXJjaGVzIGZvciBjbGFzcyBtZXRob2RzIHVzaW5nIGEgbGluZWFyIHNlYXJjaCBjYXVzaW5nIHBlcmZvcm1hbmNlIGlzc3VlcwogICAgICAgICAgICBpbiB3cmFwcGVycyBmb3IgY2xhc3NlcyB3aXRoIG1hbnkgbWVtYmVyIGZ1bmN0aW9ucy4gVGhlIHBhdGNoIGFkZHMgYSBtZXRob2QgaGFzaCB0YWJsZSB0byBjbGFzc2VzIGFuZAogICAgICAgICAgICBjaGFuZ2VzIG1ldGhvZCBuYW1lIGxvb2t1cCB0byB1c2UgdGhlIGhhc2ggdGFibGUgaW5zdGVhZCBvZiBkb2luZyBhIGxpbmVhciBzZWFyY2guCgoyMDExLTAzLTI2OiB3c2Z1bHRvbgoJICAgIFtDIywgSmF2YV0gU0YgYnVnICMzMTk1MTEyIC0gZml4IHdyYXBwaW5nIG9mIGVudW1zIHRoYXQgYXJlIHR5cGUgY2hhciwgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgZW51bSB7IFggPSAnWCc7IH0KCjIwMTEtMDMtMjE6IHZhZHoKCSAgICBBbGxvdyBzZXR0aW5nIFBDUkVfQ0ZMQUdTIGFuZCBQQ1JFX0xJQlMgZHVyaW5nIGNvbmZpZ3VyYXRpb24gdG8gb3ZlcnJpZGUgdGhlIHZhbHVlcyByZXR1cm5lZCBieQoJICAgIHBjcmUtY29uZmlnLCBlLmcuIHRvIGFsbG93IHVzaW5nIGEgc3RhdGljIHZlcnNpb24gb2YgUENSRSBsaWJyYXJ5LgoKMjAxMS0wMy0xNzogd3NmdWx0b24KCSAgICBbVVRMXSBBZGQgbWlzc2luZyBoZWFkZXJzIGluIGdlbmVyYXRlZCBTVEwgd3JhcHBlcnMgdG8gZml4IGNvbXBpbGF0aW9uIHdpdGggZ2NjLTQuNi4KCjIwMTEtMDMtMTc6IHdzZnVsdG9uCgkgICAgRml4IHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiBzd2lnLTIuMC4yIHdoZXJlIGZpbGVuYW1lcyB3aXRoIHNwYWNlcyB3ZXJlIG5vdCBmb3VuZAoJICAgIHdoZW4gdXNlZCB3aXRoICVpbmNsdWRlIGFuZCAlaW1wb3J0LiBSZXBvcnRlZCBieSBTaGFuZSBMaWVzZWdhbmcuCgoyMDExLTAzLTE1OiB3c2Z1bHRvbgoJICAgIFtVVExdIEZpeCBvdmVybG9hZGluZyB3aGVuIHVzaW5nIGNvbnN0IGNoYXJbXSwgcHJvYmxlbSByZXBvcnRlZCBieSBEYXZpZCBNYXh3ZWxsLgogICAgICAgICAgICBTaW1pbGFybHkgZm9yIGNoYXJbQU5ZXSBhbmQgY29uc3QgY2hhcltBTlldLgoKMjAxMS0wMy0xNTogd3NmdWx0b24KCSAgICBbQyNdIEFwcGx5IHBhdGNoICMzMjEyNjI0IGZpeGluZyBzdGQ6Om1hcCBLZXlzIHByb3BlcnR5LgoKMjAxMS0wMy0xNDogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBvdmVybG9hZGVkIG1ldGhvZHMvZnVuY3Rpb25zIHdoZXJlIHNvbWUKCSAgICByZXR1cm4gdm9pZCBhbmQgb3RoZXJzIGRvbid0IC0gd2hldGhlciB0aGlzIHdvcmtlZCBvciBub3QgZGVwZW5kZWQKCSAgICBvbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGVuY291bnRlcmVkIGluIChTRiMzMjA4Mjk5KS4KCQoyMDExLTAzLTEzOiBrbGlja3ZlcmJvdAogICAgICAgICAgICBbRF0gRXh0ZW5kZWQgc3VwcG9ydCBmb3IgQysrIG5hbWVzcGFjZXMgKG5zcGFjZSBmZWF0dXJlKS4KCjIwMTEtMDMtMTI6IG9sbHkKCSAgICBbUEhQXSBGaXggc2hhcmluZyBvZiB0eXBlIGluZm9ybWF0aW9uIGJldHdlZW4gbXVsdGlwbGUgU1dJRy13cmFwcGVkCgkgICAgbW9kdWxlcyAoU0YjMzIwMjQ2MykuCgoyMDExLTAzLTA5OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEZpeCBTRiAjMzE5NDI5NCAtIGNvcm5lciBjYXNlIGJ1ZyB3aGVuICdOVUxMJyBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IHZhbHVlCiAgICAgICAgICAgIGZvciBhIHByaW1pdGl2ZSB0eXBlIHBhcmFtZXRlciBpbiBhIG1ldGhvZCBkZWNsYXJhdGlvbi4KCjIwMTEtMDMtMDc6IG9sbHkKCSAgICBbUEhQXSBEb24ndCB1c2UgemVuZF9lcnJvcl9ub3JldHVybigpIGZvciBjYXNlcyB3aGVyZSB0aGUgZnVuY3Rpb24KCSAgICByZXR1cm5zIHZvaWQgLSBub3cgdGhpcyBpc3N1ZSBjYW4gb25seSBtYXR0ZXIgaWYgeW91IGhhdmUgYSBmdW5jdGlvbgoJICAgIG9yIG1ldGhvZCB3aGljaCBpcyBkaXJlY3RlZCBhbmQgcmV0dXJucyBub24tdm9pZC4KCjIwMTEtMDMtMDY6IG9sbHkKCSAgICBbUEhQXSBBZGQgY2FzdHMgdG8gdGhlIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcKCSAgICBsb25nIHRvIGF2b2lkIGlzc3VlcyB3aGVuIHRoZXkgYXJlIHVzZWQgd2l0aCBzaG9ydGVyIHR5cGVzIHZpYQoJICAgICVhcHBseS4KCjIwMTEtMDMtMDI6IHdzZnVsdG9uCgkgICAgVGVtcGxhdGVkIHNtYXJ0IHBvaW50ZXJzIG92ZXJsb2FkZWQgd2l0aCBib3RoIGNvbnN0IGFuZCBub24gY29uc3Qgb3BlcmF0b3ItPiBnZW5lcmF0ZWQgdW5jb21waWxhYmxlCgkgICAgY29kZSB3aGVuIHRoZSBwb2ludGVlIHdhcyBhIGNsYXNzIHdpdGggZWl0aGVyIHB1YmxpYyBtZW1iZXIgdmFyaWFibGVzIG9yIHN0YXRpYyBtZXRob2RzLgoJICAgIFJlZ3Jlc3Npb24gaW4gMi4wLnggcmVwb3J0ZWQgYXMgd29ya2luZyBpbiAxLjMuNDAgYnkgeGFudGFyZXMgb24gc3dpZy11c2VyIG1haWxpbmcgbGlzdC4KClZlcnNpb24gMi4wLjIgKDIwIEZlYnJ1YXJ5IDIwMTEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDExLTAyLTE5OiB3c2Z1bHRvbgoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIElOUFVULCBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzIGluIHRoZSB0eXBlbWFwcy5pIGxpYnJhcnkKICAgICAgICAgICAgZm9yIHByaW1pdGl2ZSByZWZlcmVuY2UgdHlwZXMgYXMgd2VsbCBhcyBzaWduZWQgY2hhciAqIGFuZCBib29sICouCgoyMDExLTAyLTE5OiBvbGx5CgkgICAgW1BIUF0gQWRkcmVzcyBidWcgaW4gUEhQIG9uIHNvbWUgcGxhdGZvcm1zL2FyY2hpdGVjdHVyZXMgd2hpY2gKCSAgICByZXN1bHRzIGluIHplbmRfZXJyb3Jfbm9yZXR1cm4oKSBub3QgYmVpbmcgYXZhaWxhYmxlIHVzaW5nCgkgICAgU1dJR19aRU5EX0VSUk9SX05PUkVUVVJOIHdoaWNoIGRlZmF1bHRzIHRvIHplbmRfZXJyb3Jfbm9yZXR1cm4gYnV0CgkgICAgY2FuIGJlIG92ZXJyaWRkZW4gd2hlbiBidWlsZGluZyB0aGUgbW9kdWxlIGJ5IHBhc3NpbmcKCSAgICAtRFNXSUdfWkVORF9FUlJPUl9OT1JFVFVSTj16ZW5kX2Vycm9yIHRvIHRoZSBjb21waWxlci4gIFRoaXMgbWF5CgkgICAgcmVzdWx0IGluIGNvbXBpbGVyIHdhcm5pbmdzLCBidXQgc2hvdWxkIGF0IGxlYXN0IGFsbG93IGEgbW9kdWxlCgkgICAgdG8gYmUgYnVpbHQgb24gdGhvc2UgcGxhdGZvcm1zL2FyY2hpdGVjdHVyZXMgKFNGIzMxNjY0MjMpLgoKMjAxMS0wMi0xODogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMzMTg0NTQ5IC0gdmFyYXJnIGZ1bmN0aW9ucyBhbmQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgd2hlbiB1c2luZyB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24uCgoyMDExLTAyLTE4OiBvbGx5CgkgICAgW1BIUF0gQW4gb3ZlcmxvYWRlZCBtZXRob2Qgd2hpY2ggY2FuIHJldHVybiBhbiBvYmplY3Qgb3IgYQoJICAgIHByaW1pdGl2ZSB0eXBlIG5vIGxvbmdlciBjYXVzZXMgU1dJRyB0byBzZWdmYXVsdC4gIFJlcG9ydGVkIGJ5IFBhdWwKCSAgICBDb2xieSBpbiBTRiMzMTY4NTMxLgoKMjAxMS0wMi0xODogb2xseQoJICAgIFtQSFBdIEZpeCBpbnZhbGlkIGVyYXNlIGR1cmluZyBpdGVyYXRpb24gb2Ygc3RkOjptYXAgaW4gZ2VuZXJhdGVkCgkgICAgZGlyZWN0b3IgY29kZS4gIFJlcG9ydGVkIGJ5IENvcnkgQmVubmV0dCBpbiBTRiMzMTc1ODIwLgoKMjAxMS0wMi0xNzogd3NmdWx0b24KICAgICAgICAgICAgUHJlcHJvY2Vzc2luZyBub3cgd2FybnMgaWYgZXh0cmEgdG9rZW5zIGFwcGVhciBhZnRlciAjZWxzZSBhbmQgI2VuZC4KCjIwMTEtMDItMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTY1MzA5MiBQcmVwcm9jZXNzb3IgZG9lcyBub3QgZXJyb3Igb3V0IHdoZW4gI2VsaWYgaXMgbWlzc2luZyBhbiBleHByZXNzaW9uLgogICAgICAgICAgICBUaGlzIGFuZCBvdGhlciBjYXNlcyBvZiBtaXNzaW5nIHByZXByb2Nlc3NvciBleHByZXNzaW9ucyBub3cgcmVzdWx0IGluIGFuIGVycm9yLgoKMjAxMS0wMi0xNDogd3NmdWx0b24KICAgICAgICAgICAgW09jYW1sXSBBcHBseSBwYXRjaCAjMzE1MTc4OCBmcm9tIEpvZWwgUmV5bW9udC4gQnJpbmdzIE9jYW1sIHN1cHBvcnQgdXAgdG8gZGF0ZSAKICAgICAgICAgICAgKHZlciAzLjExIGFuZCAzLjEyKSwgaW5jbHVkaW5nIHN0ZDo6c3RyaW5nLgoKMjAxMS0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEFwcGx5IHBhdGNoICMzMTc2Mjc0IGZyb20gSmFtZXMgTWFzdGVycyAtIHR5cGVjaGVjayB0eXBlbWFwIGZvciB0aW1lX3QuCgoyMDExLTAyLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzE3MTc5MyBmcm9tIHN6YWdlciAtIHByb3RlY3RlZCBkaXJlY3RvciBtZXRob2RzIGZhaWxpbmcgd2hlbiAtZnZpcnR1YWwgaXMgdXNlZC4KCjIwMTEtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTkyNzg1MiAtICNpbmNsdWRlIGRpcmVjdGl2ZXMgZG9uJ3QgcHJlcHJvY2VzcyB0aGUgZmlsZSBwYXNzZWQgdG8gaXQuIFRoZSBmaXggaXMgZm9yCiAgICAgICAgICAgICNpbmNsdWRlIHdpdGggLWltcG9ydGFsbCBvciAtaW5jbHVkZWFsbCwgJWluY2x1ZGUgYW5kICVpbXBvcnQsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgICNkZWZpbmUgRklMRU5BTUUgImFiYy5oIgogICAgICAgICAgICAgICVpbmNsdWRlIEZJTEVOQU1FCgoyMDExLTAyLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5NDA1MzYsIG92ZXJhY3RpdmUgcHJlcHJvY2Vzc29yIHdoaWNoIHdhcyBleHBhbmRpbmcgZGVmaW5lZCguLi4pIG91dHNpZGUgb2YgI2lmIGFuZCAjZWxpZgogICAgICAgICAgICBwcmVwcm9jZXNzb3IgZGlyZWN0aXZlcy4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNelNjaGVtZV0gU0YgIzI5NDI4OTkgQWRkIHVzZXIgc3VwcGxpZWQgZG9jdW1lbnRhdGlvbiB0byBoZWxwIGdldHRpbmcgc3RhcnRlZCB3aXRoIE16U2NoZW1lLgogICAgICAgICAgICBVcGRhdGUgY2hhcHRlciBuYW1lIHRvIE16U2NoZW1lL1JhY2tldCBhY2NvdW50aW5nIGZvciB0aGUgcmVuYW1lIG9mIE16U2NoZW1lIHRvIFJhY2tldC4KCjIwMTEtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU0YgIzMwODU5MDYgLSBQb3NzaWJsZSBmaXggcnVubmluZyB0ZXN0LXN1aXRlIG9uIE1hYyBPUyBYLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzMxNzMzNjcgQmV0dGVyIGluZm9ybWF0aW9uIGR1cmluZyBjb25maWd1cmUgYWJvdXQgQm9vc3QgcHJlcmVxdWlzaXRlIGZvciBydW5uaW5nCiAgICAgICAgICAgIHRoZSB0ZXN0LXN1aXRlLgoKMjAxMS0wMi0wNTogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzMxMjc2MzMgRml4IGluZmluaXRlIGxvb3AgaW4gcmVjdXJzaXZlIHR5cGVkZWYgcmVzb2x1dGlvbi4KCjIwMTEtMDItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBTRiAjMzE2ODY3NiBGaXggJXJlbmFtZSBub3Qgd29ya2luZyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBhbmQgbWV0aG9kcy4KCjIwMTEtMDItMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtjbGlzcF0gU0YgIzMxNDgyMDAgRml4IHNlZ2ZhdWx0IHBhcnNpbmcgbmVzdGVkIHVuaW9ucy4KCjIwMTEtMDItMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRGlyZWN0b3JzIC0gYSBjYWxsIHRvIGEgbWV0aG9kIGJlaW5nIGRlZmluZWQgaW4gdGhlIGJhc2UgY2xhc3MsIG5vdAogICAgICAgICAgICBvdmVycmlkZGVuIGluIGEgc3ViY2xhc3MsIGJ1dCBhZ2FpbiBvdmVycmlkZGVuIGluIGEgY2xhc3MgZGVyaXZlZCBmcm9tCiAgICAgICAgICAgIHRoZSBmaXJzdCBzdWJjbGFzcyB3YXMgbm90IGJlaW5nIGRpc3BhdGNoZWQgY29ycmVjdGx5IHRvIHRoZSBtb3N0IGRlcml2ZWQgY2xhc3MuCiAgICAgICAgICAgIFNlZSBkaXJlY3Rvcl9hbHRlcm5hdGluZy5pIGZvciBhbiBleGFtcGxlLgoKMjAxMS0wMi0wMTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBbnkgJ3VzaW5nJyBzdGF0ZW1lbnRzIGluIHRoZSBwcm90ZWN0ZWQgc2VjdGlvbiBvZiBhIGNsYXNzIHdlcmUgcHJldmlvdXNseQogICAgICAgICAgICBpZ25vcmVkIHdpdGggZGlyZWN0b3IgcHJvdGVjdGVkIChkaXJwcm90KSBtb2RlLgoKMjAxMS0wMS0zMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IG92ZXJsb2FkaW5nIHdpdGggY29uc3QgcG9pbnRlciByZWZlcmVuY2UgKFNXSUdUWVBFICpjb25zdCYpIHBhcmFtZXRlcnMgZm9yIGEKICAgICAgICAgICAgbnVtYmVyIG9mIHNjcmlwdGluZyBsYW5ndWFnZXMuCgoyMDExLTAxLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgd2FybmluZyBmb3Igc21hcnQgcG9pbnRlcnMgaWYgb25seSBzb21lIG9mIHRoZSBjbGFzc2VzIGluIHRoZSBpbmhlcml0YW5jZQogICAgICAgICAgICBjaGFpbiBhcmUgbWFya2VkIGFzIHNtYXJ0IHBvaW50ZXIsIGVnLCAlc2hhcmVkX3B0ciBzaG91bGQgYmUgdXNlZCBmb3IgYWxsIGNsYXNzZXMKICAgICAgICAgICAgaW4gYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5LCBzbyB0aGlzIG5ldyB3YXJuaW5nIGhpZ2hsaWdodHMgY29kZSB3aGVyZSB0aGlzIGlzCiAgICAgICAgICAgIG5vdCB0aGUgY2FzZS4KCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjEyOiBXYXJuaW5nIDUyMDogQmFzZSBjbGFzcyAnQScgb2YgJ0InIGlzIG5vdCBzaW1pbGFybHkgbWFya2VkIGFzIGEgc21hcnQgcG9pbnRlci4KICAgICAgICAgICAgICBleGFtcGxlLmk6MTY6IFdhcm5pbmcgNTIwOiBEZXJpdmVkIGNsYXNzICdDJyBvZiAnQicgaXMgbm90IHNpbWlsYXJseSBtYXJrZWQgYXMgYSBzbWFydCBwb2ludGVyLgoKMjAxMS0wMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgc29tZSBtaXNzaW5nIG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzOiAoY2hhciAqU1RSSU5HLCBzaXplX3QgTEVOR1RIKSBhbmQgCiAgICAgICAgICAgIChjaGFyICpTVFJJTkcsIGludCBMRU5HVEgpLiBEb2N1bWVudGF0aW9uIGZvciB0aGlzIHVwZGF0ZWQuIEphdmEgcGF0Y2ggZnJvbQogICAgICAgICAgICBWb2xrZXIgR3JhYnNjaC4KCjIwMTEtMDEtMTE6IGlhbnQKCSAgICBSZXF1aXJlIEdvIHZlcnNpb24gNzA3NyBvciBsYXRlci4KCjIwMTAtMTItMzA6IGtsaWNrdmVyYm90CiAgICAgICAgICAgIFtDIywgRCwgSmF2YV0gQ2hlY2sgZm9yIGNvbGxpc2lvbiBvZiBwYXJhbWV0ZXIgbmFtZXMgd2l0aCB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2Uga2V5d29yZHMgd2hlbiBnZW5lcmF0aW5nIHRoZSBkaXJlY3RvciBnbHVlIGNvZGUuCiAgICAgICAgICAgIAogICAgICAgICAgICBUaGUgc2l0dWF0aW9uIGluIHdoaWNoIHRoZSBnZW5lcmF0ZWQgY291bGQgd291bGQgcHJldmlvdXNseSBiZQogICAgICAgICAgICBpbnZhbGlkIGlzIGlsbHVzdHJhdGVkIGluIHRoZSBuZXcgJ2RpcmVjdG9yX2tleXdvcmRzJyB0ZXN0IGNhc2UuCgoyMDEwLTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCAkY3NpbnB1dCBzcGVjaWFsIHZhcmlhYmxlIG5vdCBiZWluZyBleHBhbmRlZCBmb3IgY3N2YXJpbiB0eXBlbWFwcwogICAgICAgICAgICB3aGVuIHVzZWQgZm9yIGdsb2JhbCB2YXJpYWJsZXMuIFJlcG9ydGVkIGJ5IFZhZGltIFplaXRsaW4uCgoyMDEwLTEyLTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJGJhc2VtYW5nbGUgZXhwYW5zaW9uIGluIGFycmF5IHR5cGVtYXBzLiBGb3IgZXhhbXBsZSBpZiB0eXBlIGlzIGludCAqWzNdLAogICAgICAgICAgICAkYmFzZW1hbmdsZSBleHBhbmRzIHRvIF9wX2ludC4KCjIwMTAtMTItMDc6IGlhbnQKCSAgICBDaGVjayB0aGF0IHdlIGFyZSB1c2luZyBhIHN1ZmZpY2llbnRseSBuZXcgdmVyc2lvbiBvZiB0aGUKCSAgICA2ZyBvciA4ZyBHbyBjb21waWxlciBkdXJpbmcgY29uZmlndXJlIHRpbWUuIElmIG5vdCwgZGlzYWJsZSBHby4KICAgICAgICAgICAgTWluaW11bSB2ZXJzaW9uIGlzIG5vdyA2NzA3LgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMTItMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMzEyNzM5NCAtIHVzZSBvZiBuZXR3b3JrIHBhdGhzIG9uIFdpbmRvd3MvTVN5cy4KCjIwMTAtMTEtMTg6IGtsaWNrdmVyYm90CgkgICAgW0RdIEFkZGVkIHRoZSBEIGxhbmd1YWdlIG1vZHVsZS4KCjIwMTAtMTEtMTI6IHZhZHoKCSAgICBGaXggaGFuZGxpbmcgb2YgbXVsdGlwbGUgcmVnZXgtdXNpbmcgJXJlbmFtZXMgYXR0YWNoZWQgdG8gdGhlIHNhbWUKCSAgICBkZWNsYXJhdGlvbi4gRm9yIGV4YW1wbGUsIG5vdwoKCSAgICAgICVyZW5hbWUoIiUocmVnZXg6L15TZXQoLiopL3B1dFxcMS8pcyIpICIiOwoJICAgICAgJXJlbmFtZSgiJShyZWdleDovXkdldCguKikvZ2V0XFwxLylzIikgIiI7CgoJICAgIHdvcmtzIGFzIGV4cGVjdGVkIHdoZXJlYXMgYmVmb3JlIG9ubHkgdGhlIGxhc3QgYW5vbnltb3VzIHJlbmFtZSB3YXMKCSAgICB0YWtlbiBpbnRvIGFjY291bnQuCgoyMDEwLTEwLTE3OiBkcmpvZQoJICAgIFtSXSBGaXggZmFpbHVyZSBpbiBvdmVybG9hZGVkIGZ1bmN0aW9ucyB3aGljaCB3YXMgYnJlYWtpbmcKCSAgICBRdWFudExpYi1TV0lHCgoyMDEwLTEwLTE0OiBvbGx5CgkgICAgW1BIUF0gQWxsb3cgY29tcGlsYXRpb24gb24gbm9uLWNvbmZvcm1pbmcgTWljcm9zb2Z0IEMrKyBjb21waWxlcnMKCSAgICB3aGljaCBkb24ndCBhY2NlcHQ6IHJldHVybiBmdW5jdGlvbl9yZXR1cm5pbmdfdm9pZCgpOwoJICAgIFJlcG9ydGVkIGJ5IEZyYW5rIFZhbmRlbiBCZXJnaGVuIG9uIHRoZSBTV0lHIG1haWxpbmcgbGlzdC4KCjIwMTAtMTAtMTI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIChnbG9iYWwgc2NvcGUpIHJlZ3Jlc3Npb24gaW50cm9kdWNlZCBpbiAyLjAuMCwgcmVwb3J0ZWQgYnkKICAgICAgICAgICAgQmVuIFdhbGtlci4gVGhlIG1hbmdsZWQgc3ltYm9sIG5hbWVzIHdlcmUgaW5jb3JyZWN0LCBzb21ldGltZXMgcmVzdWx0aW5nIGluIHR5cGVzIGJlaW5nCiAgICAgICAgICAgIGluY29ycmVjdGx5IHRyZWF0ZWQgYXMgb3BhcXVlIHR5cGVzLgoKICAgICAgICAgICAgQWxzbyBmaXhlcyAjMjk1ODc4MSBhbmQgc29tZSBvdGhlciB0eXBlIHByb2JsZW1zIGR1ZSB0byBiZXR0ZXIgdHlwZWRlZiByZXNvbHV0aW9uLCBlZyAKICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VCAqPjo6dmFsdWVfdHlwZSBkaWRuJ3QgcmVzb2x2ZSB0byBUICogd2hlbiBpdCBzaG91bGQgaGF2ZS4gVGhlIG1hbmdsZWQgdHlwZQogICAgICAgICAgICB3YXMgaW5jb3JyZWN0bHkgU1dJR1RZUEVfc3RkX192ZWN0b3JUX1Rlc3RfcF9zdGRfX2FsbG9jYXRvclRfVGVzdF9wX3RfdF9fdmFsdWVfdHlwZSBhbmQgbm93CiAgICAgICAgICAgIGl0IGlzIGNvcnJlY3RseSBTV0lHVFlQRV9wX1Rlc3QuCgpWZXJzaW9uIDIuMC4xICg0IE9jdG9iZXIgMjAxMCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyMDEwLTEwLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBBcHBseSBwYXRjaCAjMzA2Njk1OCBmcm9tIE1pa2FlbCBKb2hhbnNzb24gdG8gZml4IGRlZmF1bHQgc21hcnQgcG9pbnRlcgogICAgICAgICAgICBoYW5kbGluZyB3aGVuIHRoZSBzbWFydCBwb2ludGVyIGNvbnRhaW5zIGJvdGggYSBjb25zdCBhbmQgbm9uLWNvbnN0IG9wZXJhdG9yLT4uCgoyMDEwLTEwLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgLXBjcmV2ZXJzaW9uIG9wdGlvbiB0byBkaXNwbGF5IFBDUkUgdmVyc2lvbiBpbmZvcm1hdGlvbi4KCjIwMTAtMTAtMDE6IG9sbHkKCSAgICBbUnVieV0gQXZvaWQgc2VnZmF1bHQgd2hlbiBhIG1ldGhvZCBub2RlIGhhcyBubyBwYXJlbnROb2RlCgkgICAgKFNGIzMwMzQwNTQpLgoKMjAxMC0xMC0wMTogb2xseQoJICAgIFtQeXRob25dIEFsbG93IHJlaW5pdGlhbGlzYXRpb24gdG8gd29yayB3aXRoIGFuIGVtYmVkZGVkIFB5dGhvbgoJICAgIGludGVycHJldGVyIChwYXRjaCBmcm9tIEppbSBDYXJyb2xsIGluIFNGIzMwNzUxNzgpLgoKMjAxMC0wOS0yODogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBcHBseSBwYXRjaCBmcm9tIFRvbWFzIERpcnZhbmF1c2thcyBmb3Igc3RkOjptYXAgd3JhcHBlcnMgdG8gYXZvaWQKICAgICAgICAgICAgdGhyb3dpbmcgZXhjZXB0aW9ucyB3aXRoIG5vcm1hbCB1c2FnZSBvZiBpdGVyYXRvcnMuCgoyMDEwLTA5LTI3OiBvbGx5CgkgICAgW1B5dGhvbl0gSW1wcm92ZSBlcnJvciBtZXNzYWdlIGdpdmVuIHdoZW4gYSBwYXJhbWV0ZXIgb2YgdGhlIHdyb25nCgkgICAgdHlwZSBpcyBwYXNzZWQgdG8gYW4gb3ZlcmxvYWRlZCBtZXRob2QgKFNGIzMwMjczNTUpLgoKMjAxMC0wOS0yNTogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgU0YgcGF0Y2ggIzMwNzUxNTAgLSBKYXZhIGRpcmVjdG9ycyB1c2luZyBzdGF0aWMgdmFyaWFibGVzIGluCiAgICAgICAgICAgIG5hbWVkIG5hbWVzcGFjZS4KCjIwMTAtMDktMjQ6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZmlsZSBhbmQgbGluZSBlcnJvci93YXJuaW5nIHJlcG9ydGluZyBmaXhlcyB3aGVyZSBTV0lHIG1hY3JvcwogICAgICAgICAgICBhcmUgdXNlZCB3aXRoaW4ge30gYnJhY2VzICh3aGVyZSB0aGUgcHJlcHJvY2Vzc29yIGV4cGFuZHMgbWFjcm9zKSwKICAgICAgICAgICAgZm9yIGV4YW1wbGUgbWFjcm9zIHdpdGhpbiAlaW5saW5lIHsuLi59IGFuZCAlZnJhZ21lbnQoLi4uKSB7Li4ufQogICAgICAgICAgICBhbmQgbmVzdGVkIHN0cnVjdHMuCgoyMDEwLTA5LTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBNb3JlIGZpbGUgYW5kIGxpbmUgZXJyb3Ivd2FybmluZyByZXBvcnRpbmcgZml4ZXMgZm9yIHZhcmlvdXMgaW5oZXJpdGVkCiAgICAgICAgICAgIGNsYXNzIHByb2JsZW1zLgoKMjAxMC0wOS0xNTogd3NmdWx0b24KICAgICAgICAgICAgQSBtdWNoIGltcHJvdmVkIGRlYnVnZ2luZyBvZiBTV0lHIHNvdXJjZSBleHBlcmllbmNlIGlzIG5vdyBhdmFpbGFibGUgYW5kCiAgICAgICAgICAgIGRvY3VtZW50ZWQgaW4gdGhlICJEZWJ1Z2dpbmcgU1dJRyIgc2VjdGlvbiBpbiB0aGUgRG9jL0RldmVsL2ludGVybmFscy5odG1sCiAgICAgICAgICAgIGZpbGUsIGluY2x1ZGluZyBhIHN3aWcuZGJnIHN1cHBvcnQgZmlsZSBmb3IgdGhlIGdkYiBkZWJ1Z2dlci4KCjIwMTAtMDktMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycy93YXJuaW5ncyB3aGVuIGEgbWFjcm8KICAgICAgICAgICAgZGVmaW5pdGlvbiBlbmRzIHdpdGggJy8nIGFuZCBpdCBpcyBub3QgdGhlIGVuZCBvZiBhIEMgY29tbWVudC4KCjIwMTAtMDktMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3QgbGluZSBudW1iZXIgcmVwb3J0aW5nIGluIGVycm9ycy93YXJuaW5ncyBhZnRlciBwYXJzaW5nCiAgICAgICAgICAgIG1hY3JvIGludm9jYXRpb25zIHdpdGggcGFyYW1ldGVycyBnaXZlbiBvdmVyIG1vcmUgdGhhbiBvbmUgbGluZS4KCjIwMTAtMDktMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBleHRyYW5lb3VzIGV4dHJhIGxpbmUgaW4gcHJlcHJvY2Vzc2VkIG91dHB1dCBhZnRlciBpbmNsdWRpbmcgZmlsZXMKICAgICAgICAgICAgd2hpY2ggd291bGQgc29tZXRpbWVzIGxlYWQgdG8gZXJyb3Ivd2FybmluZyBtZXNzYWdlcyB0d28gbGluZXMgYWZ0ZXIgdGhlCiAgICAgICAgICAgIGVuZCBvZiB0aGUgZmlsZS4KCjIwMTAtMDktMTA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjE0OTUyMyAtIEluY29ycmVjdCBsaW5lIG51bWJlciByZXBvcnRpbmcgaW4gZXJyb3JzIGFmdGVyIHBhcnNpbmcgbWFjcm9zCiAgICAgICAgICAgIGNvbnRhaW5pbmcgQysrIGNvbW1lbnRzLgoKMjAxMC0wOS0wODogb2xseQoJICAgIFtQSFBdIEZpeCBoYW5kbGluZyBvZiBPVVRQVVQgdHlwZW1hcHMgKFBhdGNoIGZyb20gUnlhbiBpbiBTRiMzMDU4Mzk0KS4KCjIwMTAtMDktMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBlcnJvbmVvdXMgbGluZSBudW1iZXJzIGluIGVycm9yIG1lc3NhZ2VzIGZvciBtYWNybyBleHBhbnNpb25zLCBmb3IgZXhhbXBsZSwKICAgICAgICAgICAgdGhlIGVycm9yIG1lc3NhZ2Ugbm93IHBvaW50cyB0byBpbnN0YW50aWF0aW9uIG9mIHRoZSBtYWNybywgaWUgdGhlIGxhc3QgbGluZSBoZXJlOgoKICAgICAgICAgICAgICAjZGVmaW5lIE1BQ1JPMihhLCBiKSAKCiAgICAgICAgICAgICAgI2RlZmluZSBNQUNSTzEoTkFNRSkgTUFDUk8yKE5BTUUsMiwzKSAKCiAgICAgICAgICAgICAgTUFDUk8xKGFiYykKCjIwMTAtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBsaW5lIG51bWJlcnMgaW4gZXJyb3IgYW5kIHdhcm5pbmcgbWVzc2FnZXMgZm9yIHByZXByb2Nlc3NvciBtZXNzYWdlcyB3aXRoaW4KICAgICAgICAgICAgJWlubGluZSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICAjZGVmaW5lIEZPT0JBUiAxCiAgICAgICAgICAgICAgI2RlZmluZSBGT09CQVIgImhpIgogICAgICAgICAgICAgICV9CgoyMDEwLTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbGluZSBudW1iZXJzIGluIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIHdoaWNoIHdlcmUgY3VtdWxhdGl2ZWx5IG9uZQogICAgICAgICAgICBsZXNzIHRoYW4gdGhleSBzaG91bGQgaGF2ZSBiZWVuIGFmdGVyIHBhcnNpbmcgZWFjaCAlaW5jbHVkZS8laW1wb3J0IC0gYnVnCiAgICAgICAgICAgIGludHJvZHVjZWQgaW4gc3dpZy0xLjMuMzIuIEFsc28gZml4IGxpbmUgbnVtYmVycyBpbiBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcwogICAgICAgICAgICB3aGVuIG5ldyBsaW5lIGNoYXJhY3RlcnMgYXBwZWFyIGJldHdlZW4gdGhlICVpbmNsdWRlIC8gJWltcG9ydCBzdGF0ZW1lbnQgYW5kCiAgICAgICAgICAgIHRoZSBmaWxlbmFtZS4KCjIwMTAtMDgtMzA6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBsaW5lIG51bWJlciBhbmQgZmlsZSBuYW1lIHJlcG9ydGluZyBmb3Igc29tZSBtYWNybyBwcmVwcm9jZXNzb3Igd2FybmluZ3MuCiAgICAgICAgICAgIFRoZSBsaW5lIG51bWJlciBvZiB0aGUgbWFjcm8gYXJndW1lbnQgaGFzIGJlZW4gY29ycmVjdGVkIGFuZCB0aGUgbGluZSBudW1iZXIKICAgICAgICAgICAgb2YgdGhlIHN0YXJ0IG9mIHRoZSBtYWNybyBpbnN0ZWFkIG9mIG9uZSBwYXN0IHRoZSBlbmQgb2YgdGhlIG1hY3JvIGlzIHVzZWQuCiAgICAgICAgICAgIFNvbWUgZXhhbXBsZXM6CiAgICAgICAgICAgICAgZmlsZS5oOjExOiBFcnJvcjogSWxsZWdhbCBtYWNybyBhcmd1bWVudCBuYW1lICcuLicKICAgICAgICAgICAgICBmaWxlLmg6MTk6IEVycm9yOiBNYWNybyAnRFVQTElDQVRFJyByZWRlZmluZWQsCiAgICAgICAgICAgICAgZmlsZS5oOjE1OiBFcnJvcjogcHJldmlvdXMgZGVmaW5pdGlvbiBvZiAnRFVQTElDQVRFJy4KICAgICAgICAgICAgICBmaWxlLmg6MjU6IEVycm9yOiBWYXJpYWJsZS1sZW5ndGggbWFjcm8gYXJndW1lbnQgbXVzdCBiZSBsYXN0IHBhcmFtZXRlcgogICAgICAgICAgICAgIGZpbGUuaDozMjogRXJyb3I6IElsbGVnYWwgY2hhcmFjdGVyIGluIG1hY3JvIGFyZ3VtZW50IG5hbWUKICAgICAgICAgICAgICBmaWxlLmk6Mzc6IEVycm9yOiBNYWNybyAnU0lUJyBleHBlY3RzIDIgYXJndW1lbnRzCgoyMDEwLTA4LTI2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggX19MSU5FX18gYW5kIF9fRklMRV9fIGV4cGFuc2lvbiByZXBvcnRlZCBieSBDYW1pbGxlIEdpbGxvdC4gTW9zdGx5IHRoaXMKICAgICAgICAgICAgZGlkIG5vdCB3b3JrIGF0IGFsbC4gQWxzbyBmaXhlcyBTRiAjMjgyMjgyMi4KCjIwMTAtMDgtMTc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBGaXggY29ybmVyIGNhc2UgbWFyc2hhbGxpbmcgb2YgZG91YmxlcyAtIGVycm5vIHdhcyBub3QgYmVpbmcgY29ycmVjdGx5CiAgICAgICAgICAgIHNldCBiZWZvcmUgY2FsbGluZyBzdHJ0b2QgLSBwYXRjaCBmcm9tIEp1c3RpbiBWYWxsb24gLSBTRiBCdWcgIzMwMzg5MzYuCgoyMDEwLTA4LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggbWFrZSBkaXN0Y2xlYW4gd2hlbiBzb21lIG9mIHRoZSBtb3JlIG9ic2N1cmUgbGFuZ3VhZ2VzIGFyZSBkZXRlY3RlZCBieQogICAgICAgICAgICBjb25maWd1cmUgLSBmaXhlcyBmcm9tIFRvcnN0ZW4gTGFuZHNjaG9mZi4KCjIwMTAtMDctMjg6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlc3RvcmUgY29uZmlndXJpbmcgb3V0IG9mIHNvdXJjZSBmb3IgdGhlIHRlc3Qtc3VpdGUgc2luY2UgaXQgYnJva2UgaW4gMS4zLjM3LgogICAgICAgICAgICBBcyBwcmV2aW91c2x5LCBpZiBydW5uaW5nICdtYWtlIGNoZWNrLXRlc3Qtc3VpdGUnIG91dCBvZiBzb3VyY2UsIGl0IG5lZWRzIHRvIGJlCiAgICAgICAgICAgIGRvbmUgYnkgaW52b2tpbmcgY29uZmlndXJlIHdpdGggYSByZWxhdGl2ZSBwYXRoLiBJbnZva2luZyBjb25maWd1cmUgd2l0aCBhbgogICAgICAgICAgICBhYnNvbHV0ZSBwYXRoIHdpbGwgbm90IHdvcmsuIFJ1bm5pbmcgdGhlIGZ1bGwgJ21ha2UgY2hlY2snIHN0aWxsIG5lZWRzIHRvIGJlCiAgICAgICAgICAgIGRvbmUgaW4gdGhlIHNvdXJjZSB0cmVlLgoKMjAxMC0wNy0xNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMgd2hlbiB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgcmV0dXJucyBieSByZWZlcmVuY2UuCgoyMDEwLTA3LTEzOiB2YWR6CiAgICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgdGhlIG9sZCBleHBlcmltZW50YWwgInJ4c3BlbmNlciIgZW5jb2RlciBhbmQKICAgICAgICAgICAgIltub3RdcnhzbWF0Y2giIGluICVyZW5hbWUgKHNlZSB0aGUgMDEvMTYvMjAwNiBlbnRyeSkuIFRoZSBuZXcgYW5kCiAgICAgICAgICAgIG9mZmljaWFsbHkgc3VwcG9ydGVkICJyZWdleCIgZW5jb2RlciBhbmQgIltub3RdcmVnZXhtYXRjaCIgY2hlY2tzCiAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgKHNlZSB0aGUgdHdvIHByZXZpb3VzIGVudHJpZXMpLiBQbGVhc2UKICAgICAgICAgICAgcmVwbGFjZSAiJShyeHNwZW5jZXI6W3BhdF1bc3Vic3RdKXMiIHdpdGggIiUocmVnZXg6L3BhdC9zdWJzdC8pcyIKICAgICAgICAgICAgd2hlbiB1cGdyYWRpbmcuIE5vdGljZSB0aGF0IHlvdSB3aWxsIGFsc28gbmVlZCB0byByZXBsYWNlIHRoZSBiYWNrLQogICAgICAgICAgICByZWZlcmVuY2VzIG9mIGZvcm0gIkAxIiB3aXRoIHRoZSBtb3JlIHN0YW5kYXJkICJcXDEiIGFuZCBtYXkgbmVlZCB0bwogICAgICAgICAgICBhZGp1c3QgeW91ciByZWd1bGFyIGV4cHJlc3Npb25zIHN5bnRheCBhcyB0aGUgbmV3IHJlZ2V4IGVuY29kZXIgdXNlcwogICAgICAgICAgICBQZXJsLWNvbXBhdGlibGUgc3ludGF4IGFuZCBub3QgKGV4dGVuZGVkKSBQT1NJWCBzeW50YXggYXMgdGhlIG9sZCBvbmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDctMTM6IHZhZHoKICAgICAgICAgICAgQWRkICJyZWdleG1hdGNoIiwgInJlZ2V4dGFyZ2V0IiBhbmQgIm5vdHJlZ2V4bWF0Y2giIHdoaWNoIGNhbiBiZQogICAgICAgICAgICB1c2VkIHRvIGFwcGx5ICVyZW5hbWUgZGlyZWN0aXZlcyB0byB0aGUgZGVjbGFyYXRpb25zIG1hdGNoaW5nIHRoZQogICAgICAgICAgICBzcGVjaWZpZWQgcmVndWxhciBleHByZXNzaW9uIG9ubHkuIFRoZSBmaXJzdCB0d28gY2FuIGJlIHVzZWQKICAgICAgICAgICAgaW50ZXJjaGFuZ2VhYmx5LCBib3RoIG9mIHRoZSAlcmVuYW1lcyBiZWxvdyBkbyB0aGUgc2FtZSB0aGluZzoKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgcmVnZXhtYXRjaCRuYW1lPSJPbGQkIikgIiI7CiAgICAgICAgICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgcmVnZXh0YXJnZXQ9MSkgIk9sZCQiOwoKICAgICAgICAgICAgKG5hbWVseSBpZ25vcmUgdGhlIGRlY2xhcmF0aW9ucyBoYXZpbmcgIk9sZCIgc3VmZml4KS4KCiAgICAgICAgICAgICJub3RyZWdleG1hdGNoIiByZXN0cmljdHMgdGhlIG1hdGNoIHRvIG9ubHkgdGhlIGRlY2xhcmF0aW9ucyB3aGljaAogICAgICAgICAgICBkbyBub3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgZS5nLiBoZXJlIGlzIGhvdyB0byByZW5hbWUgdG8KICAgICAgICAgICAgbG93ZXIgY2FzZSB2ZXJzaW9ucyBhbGwgZGVjbGFyYXRpb25zIGV4Y2VwdCB0aG9zZSBjb25zaXN0aW5nIGZyb20KICAgICAgICAgICAgY2FwaXRhbCBsZXR0ZXJzIG9ubHk6CgogICAgICAgICAgICAgICAgJXJlbmFtZSgiJChsb3dlcmNhc2UpcyIsIG5vdHJlZ2V4bWF0Y2gkbmFtZT0iXltBLVpdKyQiKSAiIjsKCjIwMTAtMDctMTM6IHZhZHoKICAgICAgICAgICAgQWRkIHRoZSBuZXcgInJlZ2V4IiBlbmNvZGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4gJXJlbmFtZSwgZS5nLgoKICAgICAgICAgICAgICAgICVyZW5hbWUoInJlZ2V4Oi8oXFx3KylfKC4qKS9cXDIvIikgIiI7CgogICAgICAgICAgICB0byByZW1vdmUgYW55IGFscGhhYmV0aWNhbCBwcmVmaXggZnJvbSBhbGwgaWRlbnRpZmllcnMuIFRoZSBzeW50YXgKICAgICAgICAgICAgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaXMgUGVybC1saWtlIGFuZCBQQ1JFIGxpYnJhcnkKICAgICAgICAgICAgKGh0dHA6Ly93d3cucGNyZS5vcmcvKSBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGlzIGZlYXR1cmUgYnV0IG5vdGljZQogICAgICAgICAgICB0aGF0IGJhY2tzbGFzaGVzIG5lZWQgdG8gYmUgZXNjYXBlZCBhcyB1c3VhbCBpbnNpZGUgQyBzdHJpbmdzLgoKICAgICAgICAgICAgT3JpZ2luYWwgcGF0Y2ggZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDEwLTA3LTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzMwMjQ4NzUgLSBzaGFyZWRfcHRyIG9mIGNsYXNzZXMgd2l0aCBub24tcHVibGljIGRlc3RydWN0b3JzLiBUaGlzIGFsc28gZml4ZXMKICAgICAgICAgICAgdGhlICJ1bnJlZiIgZmVhdHVyZSB3aGVuIHVzZWQgb24gY2xhc3NlcyB3aXRoIG5vbi1wdWJsaWMgZGVzdHJ1Y3RvcnMuCgoyMDEwLTA2LTE3OiBpYW5sYW5jZXRheWxvcgogICAgICAgICAgICBbR29dIEFkZCB0aGUgR28gbGFuZ3VhZ2UgbW9kdWxlLgoKMjAxMC0wNi0xMDogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gRml4IFNXSUdfbHVhX2lzbmlsc3RyaW5nIG11bHRpcGx5IGRlZmluZWQgd2hlbiB1c2luZyBtdWx0aXBsZQogICAgICAgICAgICBtb2R1bGVzIGFuZCB3cmFwcGluZyBzdHJpbmdzLiBQYXRjaCBmcm9tICdOdW1iZXIgQ3J1bmNoZXInLgoKMjAxMC0wNi0xMDogb2xseQoJICAgIFtQSFBdIEZpeCBkaXJlY3RvcnMgdG8gY29ycmVjdGx5IGNhbGwgYSBtZXRob2Qgd2l0aCBoYXMgYQoJICAgIGRpZmZlcmVudCBuYW1lIGluIFBIUCB0byBDKysgKHdlIHdlcmUgYWx3YXlzIHVzaW5nIHRoZSBDKysgbmFtZQoJICAgIGluIHRoaXMgY2FzZSkuCgoyMDEwLTA2LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdW5jb21waWxhYmxlIGNvZGUgd2hlbiAlcmVuYW1lIHJlc3VsdHMgaW4gdHdvIGVudW0gaXRlbXMKICAgICAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lLiBSZXBvcnRlZCBieSBWYWRpbSBaZWl0bGluLgoKVmVyc2lvbiAyLjAuMCAoMiBKdW5lIDIwMTApCj09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAxMC0wNi0wMjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEIG1hY3JvIHVzZWQgaW4gc3RkOjp2ZWN0b3IgdG8gd29yayB3aXRoCiAgICAgICAgICAgIHR5cGVzIGNvbnRhaW5pbmcgY29tbWFzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19TVERfVkVDVE9SX0VOSEFOQ0VEKHN0ZDo6cGFpcjwgZG91YmxlLCBzdGQ6OnN0cmluZyA+KQoKMjAxMC0wNi0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIGluIHN0ZF9zaGFyZWRfcHRyLmkgZm9yIHdyYXBwaW5nIHN0ZDo6c2hhcmVkX3B0ci4gUmVxdWlyZXMgdGhlICVzaGFyZWRfcHRyCiAgICAgICAgICAgIG1hY3JvIGxpa2UgaW4gdGhlIGJvb3N0X3NoYXJlZF9wdHIuaSBsaWJyYXJ5LiBzdGQ6OnRyMTo6c2hhcmVkX3B0ciBjYW4gYWxzbyBiZQogICAgICAgICAgICB3cmFwcGVkIGlmIHRoZSBmb2xsb3dpbmcgbWFjcm8gaXMgZGVmaW5lZDoKCiAgICAgICAgICAgICAgI2RlZmluZSBTV0lHX1NIQVJFRF9QVFJfU1VCTkFNRVNQQUNFIHRyMQogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfc2hhcmVkX3B0ci5pPgoKICAgICAgICAgICAgc2hhcmVkX3B0ciBpcyBhbHNvIGRvY3VtZW50ZWQgaW4gTGlicmFyeS5odG1sIG5vdy4KCjIwMTAtMDUtMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSBmb3IgJHR5cGVtYXAgc3BlY2lhbCB2YXJpYWJsZSBtYWNyb3MgdG8gY2FsbCBvdGhlciAkdHlwZW1hcAogICAgICAgICAgICBzcGVjaWFsIHZhcmlhYmxlIG1hY3JvcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQ0MgIkNDIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQkIgIiR0eXBlbWFwKGNzdHlwZSwgQ0MpIgogICAgICAgICAgICAgICV0eXBlbWFwKGNzdHlwZSkgQUEgIiR0eXBlbWFwKGNzdHlwZSwgQkIpIgogICAgICAgICAgICAgIHZvaWQgaGFoKEFBIGFhKTsKCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBDIyBzdGQ6OnZlY3RvciBjb250YWluZXJzIG9mIHNoYXJlZF9wdHIgYW5kICVzaGFyZWRfcHRyLgoKICAgICAgICAgICAgQWxzbyBhZGRlZCBkaWFnbm9zdGljcyBmb3IgJHR5cGVtYXAgd2l0aCAtZGVidWctdG1zZWFyY2gsIGZvciBleGFtcGxlLCB0aGUKICAgICAgICAgICAgYWJvdmUgZGlzcGxheXMgYWRkaXRpb25hbCBkaWFnbm9zdGljIGxpbmVzIHN0YXJ0aW5nICJDb250YWluaW5nOiAiOgoKICAgICAgICAgICAgICBleGFtcGxlLmk6MzQ6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQUEgYWEKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBBQSBhYQogICAgICAgICAgICAgICAgTG9va2luZyBmb3I6IEFBCiAgICAgICAgICAgICAgICBVc2luZzogJXR5cGVtYXAoY3N0eXBlKSBBQQogICAgICAgICAgICAgICAgQ29udGFpbmluZzogJHR5cGVtYXAoY3N0eXBlLCBCQikKICAgICAgICAgICAgICBleGFtcGxlLmk6MzE6IFNlYXJjaGluZyBmb3IgYSBzdWl0YWJsZSAnY3N0eXBlJyB0eXBlbWFwIGZvcjogQkIKICAgICAgICAgICAgICAgIExvb2tpbmcgZm9yOiBCQgogICAgICAgICAgICAgICAgVXNpbmc6ICV0eXBlbWFwKGNzdHlwZSkgQkIKICAgICAgICAgICAgICAgIENvbnRhaW5pbmc6ICR0eXBlbWFwKGNzdHlwZSwgQ0MpCiAgICAgICAgICAgICAgZXhhbXBsZS5pOjI5OiBTZWFyY2hpbmcgZm9yIGEgc3VpdGFibGUgJ2NzdHlwZScgdHlwZW1hcCBmb3I6IENDCiAgICAgICAgICAgICAgICBMb29raW5nIGZvcjogQ0MKICAgICAgICAgICAgICAgIFVzaW5nOiAldHlwZW1hcChjc3R5cGUpIENDCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgRml4ICVhdHRyaWJ1dGUycmVmIG5vdCB0byBwcm9kdWNlIGEgc3ludGF4IGVycm9yIGlmIHRoZSBsYXN0CgkgICAgYXJndW1lbnQgKEFjY2Vzc29yTWV0aG9kKSBpcyBvbWl0dGVkLiAgUGF0Y2ggZnJvbSBEYXZpZCBQaWVwZ3JhcwoJICAgIGluIFNGIzIyMzU3NTYuCgoyMDEwLTA1LTI2OiBvbGx5CgkgICAgW1BIUF0gV2hlbiB1c2luZyAldGhyb3dzIG9yICVjYXRjaGVzLCBTV0lHLWdlbmVyYXRlZCBQSFA1IHdyYXBwZXJzCgkgICAgbm93IHRocm93IFBIUCBFeGNlcHRpb24gb2JqZWN0cyBpbnN0ZWFkIG9mIGdpdmluZyBhIFBIUCBlcnJvciBvZgoJICAgIHR5cGUgRV9FUlJPUi4KCgkgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkbid0IGNhdXNlIGluY29tcGF0aWJpbGl0eSBpc3N1ZXMsIHNpbmNlIHlvdSBjYW4ndAoJICAgIHNldCBhbiBlcnJvciBoYW5kbGVyIGZvciBFX0VSUk9SLCBzbyBwcmV2aW91c2x5IFBIUCB3b3VsZCBqdXN0IGV4aXQKCSAgICB3aGljaCBhbHNvIGhhcHBlbnMgZm9yIHVuaGFuZGxlZCBleGNlcHRpb25zLiAgVGhlIGJlbmVmaXQgaXMgeW91IGNhbgoJICAgIG5vdyBjYXRjaCB0aGVtIGlmIHlvdSB3YW50IHRvLgoKCSAgICBGaXhlcyBTRiMyNTQ1NTc4IGFuZCBTRiMyOTU1NTIyLgoKMjAxMC0wNS0yNTogb2xseQoJICAgIFtQSFBdIEFkZCBtaXNzaW5nIGRpcmVjdG9yaW4gdHlwZW1hcCBmb3IgY29uc3Qgc3RkOjpzdHJpbmcgJi4KCSAgICBGaXhlcyBTRiMzMDA2NDA0IHJlcG9ydGVkIGJ5IHQtTGVnaWF3LgoKMjAxMC0wNS0yMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggIzI5NTczNzUgLSBTV0lHU3RyaW5nSGVscGVyIGFuZCBTV0lHRXhjZXB0aW9uSGVscGVyIG5vdCBhbHdheXMgYmVpbmcKICAgICAgICAgICAgaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZSBpbiAuTkVUIDQgYXMgdGhlIGNsYXNzZXMgd2VyZSBub3QgbWFya2VkIGJlZm9yZWZpZWxkaW5pdC4KICAgICAgICAgICAgQSBzdGF0aWMgY29uc3RydWN0b3IgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIGludGVybWVkaWFyeSBjbGFzcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICVwcmFnbWEoY3NoYXJwKSBpbWNsYXNzY29kZT0lewogICAgICAgICAgICAgICAgc3RhdGljICRpbWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgSWYgeW91IGhhZCBhZGRlZCB5b3VyIG93biBjdXN0b20gc3RhdGljIGNvbnN0cnVjdG9yIHRvIHRoZSBpbnRlcm1lZGlhcnkgY2xhc3MgaW4KICAgICAgICAgICAgdGhlIHNhbWUgd2F5IGFzIGFib3ZlLCB5b3Ugd2lsbCBoYXZlIHRvIG1vZGlmeSB5b3VyIGFwcHJvYWNoIHRvIHVzZSBzdGF0aWMgdmFyaWFibGUKICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gb3IgZGVmaW5lIFNXSUdfQ1NIQVJQX05PX0lNQ0xBU1NfU1RBVElDX0NPTlNUUlVDVE9SIC0gU2VlIGNzaGFycGhlYWQuc3dnLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDUtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjQwODIzMi4gSW1wcm92ZSBzaGFyZWRfcHRyIGFuZCBpbnRydXNpdmVfcHRyIHdyYXBwZXJzIGZvciBjbGFzc2VzIGluIGFuCiAgICAgICAgICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeS4gTm8gc3BlY2lhbCB0cmVhdG1lbnQgaXMgbmVlZGVkIGZvciBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIFRoZSBwcm94eSBjbGFzcyBhbHNvIG5vIGxvbmdlciBuZWVkcyB0byBiZSBzcGVjaWZpZWQsIGl0IGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgZGVkdWNlZC4gVGhlIGZvbGxvd2luZyBtYWNyb3MgYXJlIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSKFBST1hZQ0xBU1MsIFRZUEUpCiAgICAgICAgICAgICAgU1dJR19TSEFSRURfUFRSX0RFUklWRUQoUFJPWFlDTEFTUywgQkFTRUNMQVNTVFlQRSwgVFlQRSkKICAgICAgICAgICAgYW5kIGhhdmUgYmVlbiByZXBsYWNlZCBieQogICAgICAgICAgICAgICVzaGFyZWRfcHRyKFRZUEUpCiAgICAgICAgICAgIFNpbWlsYXJseSBmb3IgaW50cnVzaXZlX3B0ciB3cmFwcGVycywgdGhlIGZvbGxvd2luZyBtYWNybyBpcyBkZXByZWNhdGVkOgogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICAgIFNXSUdfSU5UUlVTSVZFX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCiAgICAgICAgICAgIGFuZCBoYXZlIGJlZW4gcmVwbGFjZWQgYnkKICAgICAgICAgICAgICAlaW50cnVzaXZlX3B0cihUWVBFKQoKMjAxMC0wNS0yMTogb2xseQoJICAgIFtQSFBdIFN0b3AgZ2VuZXJhdGluZyBhIGJvZ3VzIGxpbmUgb2YgY29kZSBpbiBjZXJ0YWluIGNvbnN0cnVjdG9ycy4KCSAgICBUaGlzIHdhcyBtb3N0bHkgaGFybWxlc3MsIGJ1dCBjYXVzZWQgYSBQSFAgbm90aWNlIHRvIGJlIGlzc3VlZCwgaWYKCSAgICBlbmFibGVkIChTRiMyOTg1Njg0KS4KCjIwMTAtMDUtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggbWVtYmVyIHBvaW50ZXJzIG9uIDY0IGJpdCBwbGF0Zm9ybXMuCgoyMDEwLTA1LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgb2YgQysrIGVudW0gYm9vbGVhbiB2YWx1ZXMgcmVwb3J0ZWQgYnkgVG9yc3RlbiBMYW5kc2Nob2ZmOgogICAgICAgICAgICAgIHR5cGVkZWYgZW51bSB7IFBMQVkgPSB0cnVlLCBTVE9QID0gZmFsc2UgfSBwbGF5X3N0YXRlOwoKMjAxMC0wNS0xNDogb2xseQoJICAgIFtQSFBdIEZpeCB3cmFwcGluZyBvZiBnbG9iYWwgdmFyaWFibGVzIHdoaWNoIHdhcyBwcm9kdWNpbmcKCSAgICB1bmNvbXBpbGFibGUgY29kZSBpbiBzb21lIGNhc2VzLgoKMjAxMC0wNS0xMjogZHJqb2UKCSAgICBbUl0gQWRkIHR3byBtb3JlIGNoYW5nZXMgZnJvbSBXaWwgTm9sYW4uICBHZXQgZ2FyYmFnZQoJICAgIGNvbGxlY3Rpb24gdG8gd29yay4gIEltcGxlbWVudCBuZXdmcmVlCgoyMDEwLTA1LTA5OiBkcmpvZQogICAgICAgICAgICBGaXggYnVnIHJlcG9ydGVkIGJ5IFdpbCBOb2xhbiBjaGFuZ2UgY3JlYXRpb24gb2Ygc3RyaW5nIHNvCiAgICAgICAgICAgIHRoYXQgUiAyLjcuMCsgY2FuIHVzZSBjaGFyIGhhc2hlcwoKMjAxMC0wNS0wNzogd3NmdWx0b24KICAgICAgICAgICAgQXBwbHkgcGF0Y2ggIzI5NTUxNDYgZnJvbSBTZXJnZXkgU2F0c2tpeSB0byBmaXggZXhwcmVzc2lvbnMgY29udGFpbmluZyBkaXZpZGUgYnkKICAgICAgICAgICAgb3BlcmF0b3IgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdHMuCgoyMDEwLTA1LTA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gTWVtb3J5IGxlYWsgZml4IGhhbmRsaW5nIGNvbnN0IHN0ZDo6c3RyaW5nICYgaW5wdXRzLCByZXBvcnRlZCBieSBXaWxsIE5vbGFuLgoKMjAxMC0wNS0wMTogd3NmdWx0b24KICAgICAgICAgICAgVHlwZW1hcCBtYXRjaGluZyBlbmhhbmNlbWVudCBmb3Igbm9uLWRlZmF1bHQgdHlwZW1hcHMuIFByZXZpb3VzbHkgYWxsCiAgICAgICAgICAgIHF1YWxpZmllcnMgd2VyZSBzdHJpcHBlZCBpbiBvbmUgc3RlcCwgbm93IHRoZXkgYXJlIHN0cmlwcGVkIG9uZSBhdCBhIHRpbWUKICAgICAgICAgICAgc3RhcnRpbmcgd2l0aCB0aGUgbGVmdCBtb3N0IHF1YWxpZmllci4gRm9yIGV4YW1wbGUsIGludCBjb25zdCpjb25zdCAKICAgICAgICAgICAgaXMgZmlyc3Qgc3RyaXBwZWQgdG8gaW50ICpjb25zdCB0aGVuIGludCAqLgoKCSAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMTAtMDQtMjU6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggIzI5ODU2NTUgLSBicm9rZW4gY29uc3RydWN0b3IgcmVuYW1pbmcuCgoyMDEwLTA0LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBUeXBlbWFwIGZyYWdtZW50cyBhcmUgbm93IG9mZmljaWFsIGFuZCBkb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMyMDQ4MDY0IGFuZCAjMjQwODAyMC4KICAgICAgICAgICAgQXBwbHkgVWJ1bnR1IHBhdGNoIHRvIGZpeCBSdWJ5IGFuZCBzdGQ6OnZlY3RvciB3cmFwcGVycyB3aXRoIC1taW5oZXJpdC4KICAgICAgICAgICAgaHR0cHM6Ly9idWdzLmxhdW5jaHBhZC5uZXQvdWJ1bnR1Lytzb3VyY2Uvc3dpZzEuMy8rYnVnLzUyMjg3NAoKMjAxMC0wNC0wOTogd3NmdWx0b24KICAgICAgICAgICAgW016c2NoZW1lXSBBcHBseSBVYnVudHUgcGF0Y2ggdG8gZml4IHN0ZDo6bWFwIHdyYXBwZXJzOgogICAgICAgICAgICBodHRwczovL2J1Z3MubGF1bmNocGFkLm5ldC91YnVudHUvK3NvdXJjZS9zd2lnMS4zLytidWcvMjAzODc2CgoyMDEwLTA0LTA5OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBcHBseSBwYXRjaCAjMjk1MjM3NCAtIGZpeCBkaXJlY3RvcnMgYW5kIHRoZSAtbm9ydHRpIG9wdGlvbi4KCjIwMTAtMDQtMDk6IHdzZnVsdG9uCiAgICAgICAgICAgIFtMdWFdIEZpeCAjMjg4NzI1NCBhbmQgIzI5NDYwMzIgLSBTV0lHX0x1YV90eXBlbmFtZSB1c2luZyB3cm9uZyBzdGFjayBpbmRleC4KCjIwMTAtMDQtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBleGNlcHRpb25zIGJlaW5nIHRocm93biB3aXRoIHRoZSAtdGhyZWFkcyBvcHRpb24gYmFzZWQgb24gcGF0Y2ggZnJvbSBBcnRvIFZ1b3JpLgogICAgICAgICAgICBGaXhlcyBidWcgIzI4MTg0OTkuCgoyMDEwLTA0LTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggTWFrZWZpbGUgdGFyZ2V0czogZGlzdGNsZWFuIGFuZCBtYWludGFpbmVyLWNsZWFuCgoyMDEwLTA0LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBGaXggY2hhciBwb2ludGVycywgd2NoYXJfdCBwb2ludGVycyBhbmQgY2hhciBhcnJheXMgc28gdGhhdCBuaWwgY2FuIGJlIHBhc3NlZCBhcyBhCiAgICAgICAgICAgIHZhbGlkIHZhbHVlLiBCdWcgcmVwb3J0ZWQgYnkgR2VkYWxpYSBQYXN0ZXJuYWsuCgoyMDEwLTA0LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBOdW1lcm91cyBzdWJ0bGUgdHlwZW1hcCBtYXRjaGluZyBydWxlIGZpeGVzIHdoZW4gdXNpbmcgdGhlIGRlZmF1bHQgdHlwZS4gVGhlIHR5cGVtYXAKICAgICAgICAgICAgbWF0Y2hpbmcgcnVsZXMgYXJlIHRvIHRha2UgYSB0eXBlIGFuZCBmaW5kIHRoZSBiZXN0IGRlZmF1bHQgdHlwZW1hcCAoU1dJR1RZUEUsIFNXSUdUWVBFKiBldGMpLAogICAgICAgICAgICB0aGVuIGxvb2sgZm9yIHRoZSBuZXh0IGJlc3QgbWF0Y2ggYnkgcmVkdWNpbmcgdGhlIGNob3NlbiBkZWZhdWx0IHR5cGUuIFRoZSB0eXBlIGRlZHVjdGlvbgogICAgICAgICAgICBub3cgZm9sbG93cyBDKysgY2xhc3MgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBtYXRjaGluZyBydWxlcy4KCiAgICAgICAgICAgIEJlbG93IGFyZSB0aGUgc2V0IG9mIGNoYW5nZXMgbWFkZSBzaG93aW5nIHRoZSBkZWZhdWx0IHR5cGUgZGVkdWN0aW9uCiAgICAgICAgICAgIGFsb25nIHdpdGggdGhlIG9sZCByZWR1Y2VkIHR5cGUgYW5kIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgcmVkdWNlZCB0eXBlOgoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICZbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgJltdCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSAoJilbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgY29uc3QgW0FOWV0KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICpbQU5ZXQoKICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIGNvbnN0ICpjb25zdCBbQU5ZXQogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0IFtBTlldCiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRSBjb25zdCAqW0FOWV0KCiAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBjb25zdCAqY29uc3QgJgogICAgICAgICAgICAgIG5ldzogU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIGNvbnN0IComCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICoKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICoKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoqCgogICAgICAgICAgICAgICAgICAgU1dJR1RZUEUgKmNvbnN0ICYKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0ICYKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFIComCgogICAgICAgICAgICBBZGRpdGlvbmFsbHksIGEgY29uc3QgU1dJR1RZUEUgbG9va3VwIGlzIHVzZWQgbm93IGZvciBhbnkgY29uc3RhbnQgdHlwZS4gU29tZSBleGFtcGxlcywgd2hlcmUKICAgICAgICAgICAgVCBpcyBzb21lIHJlZHVjZWQgdHlwZSwgZWcgaW50LCBzdHJ1Y3QgRm9vOgoKICAgICAgICAgICAgICAgICAgIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0CiAgICAgICAgICAgICAgb2xkOiBTV0lHVFlQRQoKICAgICAgICAgICAgICAgICAgIFQgKmNvbnN0CiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAqY29uc3QKICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFICoKCiAgICAgICAgICAgICAgICAgICBUIGNvbnN0W10KICAgICAgICAgICAgICBuZXc6IFNXSUdUWVBFIGNvbnN0W10KICAgICAgICAgICAgICBvbGQ6IFNXSUdUWVBFW10KCiAgICAgICAgICAgICAgICAgICBlbnVtIFQgY29uc3QKICAgICAgICAgICAgICBuZXc6IGVudW0gU1dJR1RZUEUgY29uc3QKICAgICAgICAgICAgICBvbGQ6IGVudW0gU1dJR1RZUEUKCiAgICAgICAgICAgICAgICAgICBUICgqY29uc3QgKVtdCiAgICAgICAgICAgICAgbmV3OiBTV0lHVFlQRSAoKmNvbnN0IClbXQogICAgICAgICAgICAgIG9sZDogU1dJR1RZUEUgKCopW10KCiAgICAgICAgICAgIFJlbWluZGVyOiB0aGUgdHlwZW1hcCBtYXRjaGluZyBydWxlcyBjYW4gbm93IGJlIHNlZW4gZm9yIGFueSB0eXBlcyBiZWluZyB3cmFwcGVkIGJ5IHVzaW5nCiAgICAgICAgICAgIGVpdGhlciB0aGUgLWRlYnVnLXRtc2VhcmNoIG9yIC1kZWJ1Zy10bXVzZWQgb3B0aW9ucy4KCiAgICAgICAgICAgIEluIHByYWN0aWNlIHRoaXMgbGVhZHMgdG8gc29tZSBzdWJ0bGUgbWF0Y2hpbmcgcnVsZSBjaGFuZ2VzIGFuZCB0aGUgbWFqb3JpdHkgb2YgdXNlcnMKICAgICAgICAgICAgd29uJ3Qgbm90aWNlIGFueSBjaGFuZ2VzLCBleGNlcHQgaW4gdGhlIHByaW1lIGFyZWEgb2YgbW90aXZhdGlvbiBmb3IgdGhpcyBjaGFuZ2U6IEltcHJvdmUKICAgICAgICAgICAgU1RMIGNvbnRhaW5lcnMgb2YgY29uc3QgcG9pbnRlcnMgYW5kIHBhc3NpbmcgY29uc3QgcG9pbnRlcnMgYnkgcmVmZXJlbmNlLiBUaGlzIGlzIGZpeGVkCiAgICAgICAgICAgIGJlY2F1c2UgbWFueSBvZiB0aGUgU1RMIGNvbnRhaW5lcnMgdXNlIGEgdHlwZSAnVCBjb25zdCYnIGFzIHBhcmFtZXRlcnMgYW5kIHdoZW4gVCBpcyAKICAgICAgICAgICAgYSBjb25zdCBwb2ludGVyLCBmb3IgZXhhbXBsZSwgJ0sgY29uc3QqJywgdGhlbiB0aGUgZnVsbCB0eXBlIGlzICdLIGNvbnN0KmNvbnN0JicuIFRoaXMKICAgICAgICAgICAgbWVhbnMgdGhhdCB0aGUgJ1NXSUdUWVBFICpjb25zdCYnIHR5cGVtYXBzIG5vdyBtYXRjaCB3aGVuIFQgaXMgZWl0aGVyIGEgbm9uLWNvbnN0IG9yCiAgICAgICAgICAgIGNvbnN0IHBvaW50ZXIuIEZ1cnRoZXJtb3JlLCBzb21lIHRhcmdldCBsYW5ndWFnZXMgaW5jb3JyZWN0bHkgaGFkICdTV0lHVFlQRSAqJicgdHlwZW1hcHMKICAgICAgICAgICAgd2hlbiB0aGVzZSBzaG91bGQgaGF2ZSBiZWVuICdTV0lHVFlQRSAqY29uc3QmJy4gVGhlc2UgaGF2ZSBiZWVuIGNvcnJlY3RlZCAoSmF2YSwgQyMsIEx1YSwgUEhQKS4KCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDEwLTAzLTEzOiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gU29tZSB2ZXJ5IG9sZCBkZXByZWNhdGVkIHByYWdtYSB3YXJuaW5ncyBhcmUgbm93IGVycm9ycy4KCjIwMTAtMDMtMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIEltcHJvdmUgaGFuZGxpbmcgb2YgZmlsZSBuYW1lcyBhbmQgZGlyZWN0b3JpZXMgY29udGFpbmluZyBkb3VibGUvbXVsdGlwbGUgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMy0xMDogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIFVzZSBmdWxseSBxdWFsaWZpZWQgc3ltYm9sIG5hbWUgb2YgY2w6OmlkZW50aXR5IGluIGVtaXRfZGVmdW4oKS4KCjIwMTAtMDMtMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUaGUgaW50ZXJtZWRpYXJ5IEpOSSBjbGFzcyBtb2RpZmllcnMgYXJlIG5vdyBwdWJsaWMgYnkgZGVmYXVsdCBtZWFuaW5nIHRoZXNlCiAgICAgICAgICAgIGludGVybWVkaWFyeSBsb3cgbGV2ZWwgZnVuY3Rpb25zIGFyZSBub3cgYWNjZXNzaWJsZSBieSBkZWZhdWx0IGZyb20gb3V0c2lkZSBhbnkgcGFja2FnZQogICAgICAgICAgICB1c2VkLiBUaGUgcHJveHkgY2xhc3MgcG9pbnRlciBjb25zdHJ1Y3RvciBhbmQgZ2V0Q1B0cigpIG1ldGhvZHMgYXJlIGFsc28gbm93IHB1YmxpYy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIG5zcGFjZSBvcHRpb24gdG8gd29yayB3aXRob3V0IGFueSBvdGhlciBtb2RzLgogICAgICAgICAgICBUaGUgcHJldmlvdXMgZGVmYXVsdCBvZiBwcm90ZWN0ZWQgYWNjZXNzIGNhbiBiZSByZXN0b3JlZCB1c2luZzoKCiAgICAgICAgICAgICAgU1dJR19KQVZBQk9EWV9NRVRIT0RTKHByb3RlY3RlZCwgcHJvdGVjdGVkLCBTV0lHVFlQRSkKICAgICAgICAgICAgICAlcHJhZ21hKGphdmEpIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMgPSAiY2xhc3MiCgoyMDEwLTAzLTA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIHRoZSBuc3BhY2UgZmVhdHVyZSBmb3IgQyMuIERvY3VtZW50YXRpb24gZm9yIHRoZSBuc3BhY2UgZmVhdHVyZSBpcyBub3cgYXZhaWxhYmxlLgoKMjAxMC0wMy0wNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG5zcGFjZSBmZWF0dXJlLiBUaGlzIGFkZHMgc29tZSBpbXByb3ZlZCBuYW1lc3BhY2Ugc3VwcG9ydC4gQ3VycmVudGx5IG9ubHkgSmF2YQogICAgICAgICAgICBpcyBzdXBwb3J0ZWQgZm9yIHRhcmdldCBsYW5ndWFnZXMsIHdoZXJlIEMrKyBuYW1lc3BhY2VzIGFyZSBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZWQgaW50bwogICAgICAgICAgICBKYXZhIHBhY2thZ2VzLiBUaGUgZmVhdHVyZSBvbmx5IGFwcGxpZXMgdG8gY2xhc3NlcyxzdHJ1Y3QsdW5pb25zIGFuZCBlbnVtcyBkZWNsYXJlZCB3aXRoaW4KICAgICAgICAgICAgYSBuYW1lc3BhY2UuIE1ldGhvZHMgYW5kIHZhcmlhYmxlcyBkZWNsYXJlZCBpbiBuYW1lc3BhY2VzIHN0aWxsIGVmZmVjdGl2ZWx5IGhhdmUgdGhlaXIKICAgICAgICAgICAgbmFtZXNwYWNlcyBmbGF0dGVuZWQuIEV4YW1wbGUgdXNhZ2U6CgogICAgICAgICAgICAgICVmZWF0dXJlKG5zcGFjZSkgT3V0ZXI6OklubmVyMTo6Q29sb3I7CiAgICAgICAgICAgICAgJWZlYXR1cmUobnNwYWNlKSBPdXRlcjo6SW5uZXIyOjpDb2xvcjsKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIE91dGVyIHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBJbm5lcjEgewogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQ29sb3IgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmFtZXNwYWNlIElubmVyMiB7CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBDb2xvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRm9yIEphdmEsIHRoZSAtcGFja2FnZSBvcHRpb24gaXMgYWxzbyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZSBuc3BhY2UgZmVhdHVyZS4gU2F5CiAgICAgICAgICAgIHdlIHVzZSAtcGFja2FnZSBjb20ubXljbywgdGhlIHR3byBjbGFzc2VzIGNhbiB0aGVuIGJlIGFjY2Vzc2VkIGFzIGZvbGxvd3MgZnJvbSBKYXZhOgoKICAgICAgICAgICAgICBjb20ubXljby5PdXRlci5Jbm5lcjEuQ29sb3IgYW5kIGNvbS5teWNvLk91dGVyLklubmVyMi5Db2xvci4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSAtZGlydnRhYmxlIGZyb20gdGhlIG9wdGltaXphdGlvbnMgaW5jbHVkZWQgYnkgLU8gYXMgaXQgdGhpcyBvcHRpb24KICAgICAgICAgICAgY3VycmVudGx5IGxlYWRzIHRvIG1lbW9yeSBsZWFrcyBhcyByZXBvcnRlZCBieSBKb2hhbiBCbGFrZS4KCjIwMTAtMDItMjc6IHdzZnVsdG9uCiAgICAgICAgICAgIExpY2Vuc2UgY29kZSBjaGFuZ2VzOiBTV0lHIFNvdXJjZSBpcyBHUEwtdjMgYW5kIGxpYnJhcnkgY29kZSBsaWNlbnNlIGlzIG5vdyBjbGVhcmVyCiAgICAgICAgICAgIGFuZCBpcyBwcm92aWRlZCB1bmRlciBhIHZlcnkgcGVybWlzc2l2ZSBsaWNlbnNlLiBTZWUgaHR0cDovL3d3dy5zd2lnLm9yZy9sZWdhbC5odG1sLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEEgZmV3IGZpeGVzIGZvciBjb21waWxpbmcgdW5kZXIgcnVieS0xLjkueCBpbmNsdWRpbmcgcGF0Y2ggZnJvbSAnTmliYmxlJy4KCjIwMTAtMDItMTM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5XSBBcHBseSBwYXRjaCBmcm9tIFBhdHJpY2sgQmVubmV0dCB0byBmaXggUkFSUkFZX0xFTiBhbmQgUkFSUkFZX1BUUiB1c2FnZSBmb3IgUnVieSAxLjkueAogICAgICAgICAgICB1c2VkIGluIHZhcmlvdXMgU1RMIHdyYXBwZXJzLgoKMjAxMC0wMi0xMzogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggaW5jb3JyZWN0IG11bHRpcGx5IGRlZmluZWQgc3ltYm9sIG5hbWUgZXJyb3Igd2hlbiBhbiBlbnVtIGl0ZW0KICAgICAgICAgICAgYW5kIGNsYXNzIG5hbWUgaGF2ZSB0aGUgc2FtZSBuYW1lLCBhcyByZXBvcnRlZCBieSBOYXRoYW4gS3JpZWdlci4gRXhhbXBsZToKCiAgICAgICAgICAgICAgY2xhc3MgVmVjdG9yIHt9OwogICAgICAgICAgICAgIG5hbWVzcGFjZSBUZXh0IHsKICAgICAgICAgICAgICAgIGVudW0gUHJlZmVyZW5jZSB7IFZlY3RvciB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgYWxzbyBmaXhlcyBvdGhlciBpbmNvcnJlY3QgY29ybmVyIGNhc2UgdGFyZ2V0IGxhbmd1YWdlIHN5bWJvbCBuYW1lIGNsYXNoZXMuCgoyMDEwLTAyLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdGhlIC1kZWJ1Zy1sc3ltYm9scyBvcHRpb24gZm9yIGRpc3BsYXlpbmcgdGhlIHRhcmdldCBsYW5ndWFnZSBsYXllciBzeW1ib2xzLgoKMjAxMC0wMi0wOTogd3NmdWx0b24KICAgICAgICAgICAgRml4IC1NTSBhbmQgLU1NRCBvcHRpb25zIG9uIFdpbmRvd3MuIFRoZXkgd2VyZSBub3Qgb21pdHRpbmcgZmlsZXMgaW4gdGhlIFNXSUcgbGlicmFyeSBhcwogICAgICAgICAgICB0aGV5IHNob3VsZCBiZS4KCjIwMTAtMDItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTgwNzMyOSAtIFdoZW4gTWFrZWZpbGUgZGVwZW5kZW5jaWVzIGFyZSBiZWluZyBnZW5lcmF0ZWQgdXNpbmcgdGhlIC1NIGZhbWlseSBvZiBvcHRpb25zCiAgICAgICAgICAgIG9uIFdpbmRvd3MsIHRoZSBmaWxlIHBhdGhzIGhhdmUgYmVlbiBjb3JyZWN0ZWQgdG8gdXNlIHNpbmdsZSBiYWNrc2xhc2hlcyByYXRoZXIgdGhhbiBkb3VibGUKICAgICAgICAgICAgYmFja3NsYXNoZXMgYXMgcGF0aCBzZXBhcmF0b3JzLgoKMjAxMC0wMi0wNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyOTE4OTAyIC0gbGFuZ3VhZ2Ugc3BlY2lmaWMgZmlsZXMgbm90IGJlaW5nIGdlbmVyYXRlZCBpbiBjb3JyZWN0IGRpcmVjdG9yeSBvbgogICAgICAgICAgICBXaW5kb3dzIHdoZW4gdXNpbmcgZm9yd2FyZCBzbGFzaGVzIGZvciAtbywgZm9yIGV4YW1wbGU6CiAgICAgICAgICAgICAgc3dpZyAtcHl0aG9uIC1jKysgLW8gc3ViZGlyZWN0b3J5L3RoZWludGVyZmFjZV93cmFwLmNwcCBzdWJkaXJlY3RvcnkvdGhlaW50ZXJmYWNlLmkKCjIwMTAtMDItMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMjg5NDQwNSAtIGFzc2VydGlvbiB3aGVuIHVzaW5nIC14bWxvdXQuCgoyMDEwLTAxLTI4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZW1hcCBtYXRjaGluZyBidWcgd2hlbiBhIHRlbXBsYXRlZCB0eXBlIGhhcyBhIHR5cGVtYXAgYm90aCBzcGVjaWFsaXplZCBhbmQgbm90CiAgICAgICAgICAgIHNwZWNpYWxpemVkLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IFhYIHsgLi4uIH07CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFhYICYgIi4uLiIKICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgWFg8IGludCA+ICYgIi4uLiIKCiAgICAgICAgICAgIHJlc3VsdGVkIGluIHRoZSAybmQgdHlwZW1hcCBiZWluZyBhcHBsaWVkIGZvciBhbGwgVCBpbiBYWDwgVCA+LgoKMjAxMC0wMS0yMjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyOTMzMTI5IC0gdHlwZW1hcHMgbm90IGJlaW5nIGZvdW5kIHdoZW4gdGhlIHVuYXJ5IHNjb3BlIG9wZXJhdG9yICg6OikgaXMgdXNlZCB0byBkZW5vdGUKICAgICAgICAgICAgZ2xvYmFsIHNjb3BlLCB0aGUgdHlwZW1hcCBpcyBub3cgdXNlZCBpbiBzaXR1YXRpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IFggJiAiLi4uIgogICAgICAgICAgICAgIHZvaWQgbShjb25zdCA6OlggJik7CgogICAgICAgICAgICBhbmQgdGhpczoKCiAgICAgICAgICAgICAgc3RydWN0IFgge307CiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGNvbnN0IDo6WCAmICIuLi4iCiAgICAgICAgICAgICAgdm9pZCBtKGNvbnN0IFggJik7CgoyMDEwLTAxLTIwOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc29tZSB1bmFyeSBzY29wZSBvcGVyYXRvciAoOjopIGRlbm90aW5nIGdsb2JhbCBzY29wZSBwcm9ibGVtcyBpbiB0aGUgdHlwZXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIGludG8gdGhlIEMrKyBsYXllci4gUHJldmlvdXNseSB0aGUgdW5hcnkgc2NvcGUgb3BlcmF0b3Igd2FzIGRyb3BwZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCiAgICAgICAgICAgIGlmIHRoZSB0eXBlIGhhZCBhbnkgc29ydCBvZiBxdWFsaWZpZXIsIGZvciBleGFtcGxlIHdoZW4gdXNpbmcgcG9pbnRlcnMsIHJlZmVyZW5jZXMsIGxpa2UKICAgICAgICAgICAgOjpmb28qLCA6OmZvbyYsIGJhcjwgOjpmb28qID4uCgoyMDEwLTAxLTEzOiBvbGx5CgkgICAgW1BIUF0gQWRkIGRhdGV0aW1lIHRvIHRoZSBsaXN0IG9mIFBIUCBwcmVkZWZpbmVkIGNsYXNzZXMgKHBhdGNoCgkgICAgZnJvbSBEYXZpZCBGbGV0Y2hlciBpbiBTRiMyOTMxMDQyKS4KCjIwMTAtMDEtMTE6IHdzZnVsdG9uCiAgICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gd2FybmluZywgZXJyb3IgYW5kIGRpYWdub3N0aWMgcmVwb3J0aW5nLiBUaGUgd2FybmluZyBudW1iZXIgaXMgbm8gCiAgICAgICAgICAgIGxvbmdlciBzaG93biB3aXRoaW4gYnJhY2tldHMuIFRoaXMgaXMgdG8gaGVscCBkZWZhdWx0IHBhcnNpbmcgb2Ygd2FybmluZyBtZXNzYWdlcyBieQogICAgICAgICAgICBvdGhlciB0b29scywgdmltIG9uIFVuaXggaW4gcGFydGljdWxhci4KCiAgICAgICAgICAgIEV4YW1wbGUgb3JpZ2luYWwgZGlzcGxheSB1c2luZyAtRnN0YW5kYXJkOgogICAgICAgICAgICAgIGV4YW1wbGUuaToyMDogV2FybmluZyg0MDEpOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0InLiBJZ25vcmVkLgogICAgICAgICAgICBOZXcgZGlzcGxheToKICAgICAgICAgICAgICBleGFtcGxlLmk6MjA6IFdhcm5pbmcgNDAxOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0InLiBJZ25vcmVkLgoKICAgICAgICAgICAgQWxzbyBzdWJ0bGUgZml4IHRvIC1GbWljcm9zb2Z0IGZvcm1hdCBhZGRpbmcgaW4gbWlzc2luZyBzcGFjZS4gRXhhbXBsZSBvcmlnaW5hbCBkaXNwbGF5OgogICAgICAgICAgICAgIGV4YW1wbGUuaSgyMCk6IFdhcm5pbmcoNDAxKTogTm90aGluZyBrbm93biBhYm91dCBiYXNlIGNsYXNzICdCYXNlJy4gSWdub3JlZC4KICAgICAgICAgICAgTmV3IGRpc3BsYXk6CiAgICAgICAgICAgICAgZXhhbXBsZS5pKDIwKSA6IFdhcm5pbmcgNDAxOiBOb3RoaW5nIGtub3duIGFib3V0IGJhc2UgY2xhc3MgJ0Jhc2UnLiBJZ25vcmVkLgoKMjAxMC0wMS0xMDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGEgZmV3IGluY29uc2lzdGVuY2llcyBpbiByZXBvcnRpbmcgb2YgZmlsZS9saW5lIG51bWJlcmluZ3MgaW5jbHVkaW5nIG1vZGlmeWluZwogICAgICAgICAgICB0aGUgb3ZlcmxvYWQgd2FybmluZ3MgNTA5LCA1MTIsIDUxNiwgNDc0LCA0NzUgdG8gbm93IGJlIHR3byBsaW5lIHdhcm5pbmdzLgoKMjAxMC0wMS0xMDogd3NmdWx0b24KICAgICAgICAgICAgTW9kaWZ5IC1kZWJ1Zy10YWdzIG91dHB1dCB0byB1c2Ugc3RhbmRhcmQgZmlsZSBuYW1lL2xpbmUgcmVwb3J0aW5nIHNvIHRoYXQgZWRpdG9ycwogICAgICAgICAgICBjYW4gZWFzaWx5IG5hdmlnYXRlIHRvIHRoZSBhcHByb3ByaWF0ZSBsaW5lcy4KICAgICAgICAgICAgV2FzIHR5cGljYWxseToKICAgICAgICAgICAgICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlICgvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZy5zd2c6MzEyKQogICAgICAgICAgICAgIC4gdG9wIC4gaW5jbHVkZSAuIGluY2x1ZGUgLiBpbmNsdWRlICgvdXNyL3NoYXJlL3N3aWcvdGVtcC90cnVuay9MaWIvc3dpZ3dhcm5pbmdzLnN3ZzozOSkKICAgICAgICAgICAgbm93OgogICAgICAgICAgICAgIC91c3Ivc2hhcmUvc3dpZy90ZW1wL3RydW5rL0xpYi9zd2lnLnN3ZzozMTI6ICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlCiAgICAgICAgICAgICAgL3Vzci9zaGFyZS9zd2lnL3RlbXAvdHJ1bmsvTGliL3N3aWd3YXJuaW5ncy5zd2c6Mzk6ICAuIHRvcCAuIGluY2x1ZGUgLiBpbmNsdWRlIC4gaW5jbHVkZQoKMjAxMC0wMS0wMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IG1pc3NpbmcgZmlsZS9saW5lIG51bWJlcnMgZm9yIHR5cGVtYXAgd2FybmluZ3MgYW5kIGluIG91dHB1dCBmcm9tIHRoZQogICAgICAgICAgIC1kZWJ1Zy10bXNlYXJjaC8tZGVidWctdG11c2VkIG9wdGlvbnMuCgoyMDEwLTAxLTAzOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgdHlwZW1hcHMgdXNlZCBkZWJ1Z2dpbmcgb3B0aW9uICgtZGVidWctdG11c2VkKS4gV2hlbiB1c2VkIGVhY2ggbGluZSBkaXNwbGF5cwogICAgICAgICAgICB0aGUgdHlwZW1hcCB1c2VkIGZvciBlYWNoIHR5cGUgZm9yIHdoaWNoIGNvZGUgaXMgYmVpbmcgZ2VuZXJhdGVkIGluY2x1ZGluZyB0aGUgZmlsZQogICAgICAgICAgICBhbmQgbGluZSBudW1iZXIgcmVsYXRlZCB0byB0aGUgdHlwZS4gVGhpcyBpcyBlZmZlY3RpdmVseSBhIGNvbmRlbnNlZCBmb3JtIG9mIHRoZQogICAgICAgICAgICAtZGVidWctdG1zZWFyY2ggb3B0aW9uLiBEb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTEyLTIzOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVqYXZhZXhjZXB0aW9uIGFuZCBkaXJlY3RvcnMgc28gdGhhdCBhbGwgdGhlIGFwcHJvcHJpYXRlIHRocm93cyBjbGF1c2VzIAogICAgICAgICAgICBhcmUgZ2VuZXJhdGVkLiBQcm9ibGVtIHJlcG9ydGVkIGJ5IFBldGVyIEdyZWVud29vZC4KCjIwMDktMTItMjA6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCAtZGVidWctdG1zZWFyY2ggb3B0aW9uIGZvciBkZWJ1Z2dpbmcgdGhlIHR5cGVtYXAgcGF0dGVybiBtYXRjaGluZyBydWxlcy4KICAgICAgICAgICAgRG9jdW1lbnRlZCBpbiBUeXBlbWFwcy5odG1sLgoKMjAwOS0xMi0xMjogd3NmdWx0b24KICAgICAgICAgICAgW09jdGF2ZV0gUmVtb3ZlIHRoZSAtYXBpIG9wdGlvbiBhbmQgdXNlIHRoZSBuZXcgT0NUQVZFX0FQSV9WRVJTSU9OX05VTUJFUgogICAgICAgICAgICBtYWNybyBwcm92aWRlZCBpbiB0aGUgb2N0YXZlIGhlYWRlcnMgZm9yIGRldGVybWluaW5nIHRoZSBhcGkgdmVyc2lvbiBpbnN0ZWFkLgoKMjAwOS0xMi0wNDogb2xseQoJICAgIFtSdWJ5XSBJbXByb3ZlIHN1cHBvcnQgZm9yIFJ1YnkgMS45IHVuZGVyIEdDQy4gIEFkZHJlc3NlcyBwYXJ0IG9mCgkgICAgU0YjMjg1OTYxNC4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBGaXggaGFuZGxpbmcgb2YgbW9kdWxvIG9wZXJhdG9yICglKSBpbiBjb25zdGFudCBleHByZXNzaW9ucwoJICAgIChTRiMyODE4NTYyKS4KCjIwMDktMTItMDQ6IG9sbHkKCSAgICBbUEhQXSAiZW1wdHkiIGlzIGEgcmVzZXJ2ZWQgd29yZCBpbiBQSFAsIHNvIHJlbmFtZSBlbXB0eSgpIG1ldGhvZAoJICAgIG9uIFNUTCBjbGFzc2VzIHRvICJpc19lbXB0eSgpIiAocHJldmlvdXNseSB0aGlzIHdhcyBhdXRvbWF0aWNhbGx5CgkgICAgcmVuYW1lZCB0byAiY19lbXB0eSgpIikuCgkgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA5LTEyLTAzOiBvbGx5CgkgICAgW1BIUF0gQWRkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZywgYW5kIGZvcgoJICAgIHBvaW50ZXIgdG8gbWV0aG9kLgoKMjAwOS0xMi0wMjogb2xseQoJICAgIFtQSFBdIEZpeCB3YXJuaW5nIGFuZCByZW5hbWUgb2YgcmVzZXJ2ZWQgY2xhc3MgbmFtZSB0byBiZSBjYXNlCgkgICAgaW5zZW5zaXRpdmUuCgoyMDA5LTEyLTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBSZXZlcnQgc3VwcG9ydCBmb3IgJWV4dGVuZCBhbmQgbWVtYmVyaW4gdHlwZW1hcHMgYWRkZWQgaW4gc3dpZy0xLjMuMzkuIFRoZQoJICAgIG1lbWJlcmluIHR5cGVtYXBzIGFyZSBpZ25vcmVkIGFnYWluIGZvciBtZW1iZXIgdmFyaWFibGVzIHdpdGhpbiBhICVleHRlbmQgYmxvY2suCiAgICAgICAgICAgIERvY3VtZW50YXRpb24gaW5jb25zaXN0ZW5jeSByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgoyMDA5LTExLTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBnZW5lcmF0ZWQgcXVvdGluZyB3aGVuIHVzaW5nICVqYXZhY29uc3QoMSkvJWNzY29uc3QoMSkgZm9yIAogICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtZW1iZXIgdmFyaWFibGVzLgoKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIEE7CiAgICAgICAgICAgICAgJWNzY29uc3QoMSkgQTsKICAgICAgICAgICAgICBzdHJ1Y3QgWCB7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBBID0gJ0EnOyAKICAgICAgICAgICAgICB9OwoKMjAwOS0xMS0yNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggJWphdmFjb25zdCgxKS8lY3Njb25zdCgxKSBmb3Igc3RhdGljIGNvbnN0IG1lbWJlciB2YXJpYWJsZXMgdG8KICAgICAgICAgICAgdXNlIHRoZSBhY3R1YWwgY29uc3RhbnQgdmFsdWUgaWYgaXQgaXMgc3BlY2lmaWVkLCByYXRoZXIgdGhhbiB0aGUgQysrIGNvZGUgdG8KICAgICAgICAgICAgYWNjZXNzIHRoZSBtZW1iZXIuCgogICAgICAgICAgICAgICVqYXZhY29uc3QoMSkgRU47CiAgICAgICAgICAgICAgJWNzY29uc3QoMSkgRU47CiAgICAgICAgICAgICAgc3RydWN0IFggewogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludCBFTiA9IDI7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMjM6IHdzZnVsdG9uCiAgICAgICAgICAgIEMrKyBuZXN0ZWQgdHlwZWRlZiBjbGFzc2VzIGNhbiBub3cgYmUgaGFuZGxlZCB0b28sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIHN0cnVjdCBPdXRlciB7CiAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyB7IH0gRm9vVHlwZWRlZjEsIEZvb1R5cGVkZWYyOwogICAgICAgICAgICAgIH07CgoyMDA5LTExLTE4OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgd3JhcHBlcnMgZm9yIEMgbmVzdGVkIHN0cnVjdHMgYXJlIG5vdyBnZW5lcmF0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgZGVjbGFyZWQgCiAgICAgICAgICAgIGluIHRoZSBwYXJzZWQgY29kZS4KCjIwMDktMTEtMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjNDkxNDc2IC0gbXVsdGlwbGUgZGVjbGFyYXRpb25zIG9mIG5lc3RlZCBzdHJ1Y3RzLCBmb3IgZXhhbXBsZToKICAgICAgICAgICAgICBzdHJ1Y3QgT3V0ZXIgewogICAgICAgICAgICAgICAgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgaW50IHZhbDsKICAgICAgICAgICAgICAgIH0gaW5uZXIxLCBpbm5lcjIsICppbm5lcjMsIGlubmVyNFsxXTsKICAgICAgICAgICAgICB9IG91dGVyOwoKMjAwOS0xMS0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHBhcnNpbmcgb2YgZW51bSBkZWNsYXJhdGlvbiBhbmQgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIEFCQyB7CiAgICAgICAgICAgICAgICBhLAogICAgICAgICAgICAgICAgYiwKICAgICAgICAgICAgICAgIGMKICAgICAgICAgICAgICB9IEEgPSBhLCAqcEMgPSAmQywgYXJyYXlbM10gPSB7YSwgYiwgY307CgoyMDA5LTExLTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcGFyc2luZyBvZiBzdHJ1Y3QgZGVjbGFyYXRpb24gYW5kIGluaXRpYWxpemF0aW9uLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgc3RydWN0IFMgewogICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgIH0gaW5zdGFuY2UgPSB7IDEwIH07CgoyMDA5LTExLTE1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE5NjA5NzcgLSBTeW50YXggZXJyb3IgcGFyc2luZyBkZXJpdmVkIG5lc3RlZCBjbGFzcyBkZWNsYXJhdGlvbiBhbmQgbWVtYmVyCiAgICAgICAgICAgIHZhcmlhYmxlIGluc3RhbmNlLgoKMjAwOS0xMS0xNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyMzEwNDgzIC0gZnVuY3Rpb24gcG9pbnRlciB0eXBlZGVmIHdpdGhpbiBleHRlcm4gIkMiIGJsb2NrLgoKMjAwOS0xMS0xMzogd3NmdWx0b24KICAgICAgICAgICAgRml4IHVzYWdlIG9mIG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGhpbiB0ZW1wbGF0ZWQgY2xhc3NlcyBzbyB0aGF0IGNvbXBpbGFibGUgY29kZSAKICAgICAgICAgICAgaXMgZ2VuZXJhdGVkLgoKMjAwOS0xMS0xMzogb2xseQoJICAgIFtwaHBdIEZpeCBwbGFjZSB3aGVyZSBjbGFzcyBwcmVmaXggKGFzIHNwZWNpZmllZCB3aXRoIC1wcmVmaXgpCgkgICAgd2Fzbid0IGJlaW5nIHVzZWQuICBQYXRjaCBmcm9tIGd2ZXJicnVnZ2VuIGluIFNGIzI4OTI2NDcuCgoyMDA5LTExLTEyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdXNhZ2Ugb2YgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgc28gdGhhdCBjb21waWxhYmxlIGNvZGUgaXMgZ2VuZXJhdGVkIC0gdGhlIG5lc3RlZAogICAgICAgICAgICB0ZW1wbGF0ZSBjbGFzcyBpcyBub3cgdHJlYXRlZCBsaWtlIGEgbm9ybWFsIG5lc3RlZCBjbGFzc2VzLCB0aGF0IGlzLCBhcyBhbiBvcGFxdWUgdHlwZQogICAgICAgICAgICB1bmxlc3MgdGhlIG5lc3RlZHdvcmthcm91bmQgZmVhdHVyZSBpcyB1c2VkLgoKMjAwOS0xMS0xMjogd3NmdWx0b24KICAgICAgICAgICAgUmVwbGFjZSBTV0lHV0FSTl9QQVJTRV9ORVNURURfQ0xBU1Mgd2l0aCBTV0lHV0FSTl9QQVJTRV9OQU1FRF9ORVNURURfQ0xBU1MgYW5kCiAgICAgICAgICAgIFNXSUdXQVJOX1BBUlNFX1VOTkFNRURfTkVTVEVEX0NMQVNTIGZvciBuYW1lZCBhbmQgdW5uYW1lZCBuZXN0ZWQgY2xhc3NlcyByZXNwZWN0aXZlbHkuCgogICAgICAgICAgICBOYW1lZCBuZXN0ZWQgY2xhc3MgaWdub3JlZCB3YXJuaW5ncyBjYW4gbm93IGJlIHN1cHByZXNzZWQgYnkgbmFtZSB1c2luZyAld2FybmZpbHRlciwgZWc6CgogICAgICAgICAgICAgICV3YXJuZmlsdGVyKFNXSUdXQVJOX1BBUlNFX05BTUVEX05FU1RFRF9DTEFTUykgT3V0ZXI6OklubmVyOwoKICAgICAgICAgICAgYnV0IGNsZWFybHkgdW5uYW1lZCBuZXN0ZWQgY2xhc3NlcyBjYW5ub3QgYW5kIHRoZSBnbG9iYWwgc3VwcHJlc3Npb24gaXMgc3RpbGwgcmVxdWlyZWQsIGVnOgoKICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPVNXSUdXQVJOX1BBUlNFX1VOTkFNRURfTkVTVEVEX0NMQVNTCgoyMDA5LTExLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCB0aGUgbmVzdGVkd29ya2Fyb3VuZCBmZWF0dXJlIGFzIGEgd2F5IHRvIHVzZSB0aGUgZnVsbCBmdW5jdGlvbmFsaXR5IG9mIGEgbmVzdGVkIGNsYXNzIAogICAgICAgICAgICAoQysrIG1vZGUgb25seSkuIEl0IHJlbW92ZXMgdGhlIG5lc3RlZCBjbGFzcyBmcm9tIFNXSUcncyB0eXBlIGluZm9ybWF0aW9uIHNvIGl0IGlzIGFzIGlmIFNXSUcKICAgICAgICAgICAgaGFkIG5ldmVyIHBhcnNlZCB0aGUgbmVzdGVkIGNsYXNzLiBUaGUgZG9jdW1lbnRlZCBuZXN0ZWQgY2xhc3Mgd29ya2Fyb3VuZHMgdXNpbmcgYSBnbG9iYWwKICAgICAgICAgICAgZmFrZSBjbGFzcyBzdG9wcGVkIHdvcmtpbmcgd2hlbiBTV0lHIHRyZWF0ZWQgdGhlIG5lc3RlZCBjbGFzcyBhcyBhbiBvcGFxdWUgcG9pbnRlciwgYW5kCiAgICAgICAgICAgIHRoaXMgZmVhdHVyZSByZXZlcnRzIHRoaXMgYmVoYXZpb3VyLiBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkIHdpdGggZGV0YWlscyBvZiBob3cKICAgICAgICAgICAgdG8gdXNlIGFuZCBpbXBsZW1lbnQgaXQsIHNlZSB0aGUgIk5lc3RlZCBjbGFzc2VzIiBzZWN0aW9uIGluIFNXSUdQbHVzLmh0bWwuCgoyMDA5LTExLTExOiB3c2Z1bHRvbgogICAgICAgICAgICBUaGVyZSB3ZXJlIGEgbnVtYmVyIG9mIEMrKyBjYXNlcyB3aGVyZSBuZXN0ZWQgY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucyB3ZXJlIGJlaW5nIGhhbmRsZWQKICAgICAgICAgICAgYXMgaWYgQyBjb2RlIHdhcyBiZWluZyBwYXJzZWQgd2hpY2ggd291bGQgb2Z0ZW50aW1lcyBsZWFkIHRvIHVuY29tcGlsYWJsZSBjb2RlIGFzIGFuCiAgICAgICAgICAgIGF0dGVtcHQgd2FzIG1hZGUgdG8gd3JhcCB0aGUgbmVzdGVkIHN0cnVjdHMgbGlrZSBpdCBpcyBkb2N1bWVudGVkIGZvciBDIGNvZGUuIE5vdyBhbGwKICAgICAgICAgICAgbmVzdGVkIHN0cnVjdHMvY2xhc3Nlcy91bmlvbnMgYXJlIGlnbm9yZWQgaW4gQysrIG1vZGUsIGFzIHdhcyBhbHdheXMgZG9jdW1lbnRlZC4gSG93ZXZlciwKICAgICAgICAgICAgdGhlcmUgaXMgYW4gaW1wcm92ZW1lbnQgYXMgdXNhZ2Ugb2YgbmVzdGVkIHN0cnVjdHMvY2xhc3Nlcy91bmlvbnMgaXMgbm93IGFsd2F5cyB0cmVhdGVkCiAgICAgICAgICAgIGFzIGFuIG9wYXF1ZSB0eXBlIGJ5IGRlZmF1bHQsIHJlc3VsdGluZyBpbiBnZW5lcmF0ZWQgY29kZSB0aGF0IHNob3VsZCBhbHdheXMgY29tcGlsZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOS0xMS0wOTogZHJqb2UKCSAgICBGaXggUiBmb3IgLWZjb21wYWN0IGFuZCBhZGQgc3RkX21hcC5pCgoyMDA5LTExLTA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggaW5jb25zaXN0ZW5jeSBmb3IgbmVzdGVkIHN0cnVjdHMvdW5pb25zL2NsYXNzZXMuIFVuY29tcGlsYWJsZSBjb2RlIHdhcyBiZWluZwogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBpbm5lciBzdHJ1Y3QgYW5kIHVuaW9uIGRlY2xhcmF0aW9ucyB3ZXJlIHVzZWQgYXMgdHlwZXMgd2l0aGluIHRoZQogICAgICAgICAgICBpbm5lciBzdHJ1Y3QuIFRoZSBpbm5lciBzdHJ1Y3QvdW5pb24gaXMgbm93IHRyZWF0ZWQgYXMgYSBmb3J3YXJkIGRlY2xhcmF0aW9uIG1ha2luZyB0aGUKICAgICAgICAgICAgYmVoYXZpb3VyIHRoZSBzYW1lIGFzIGFuIGlubmVyIGNsYXNzLiAoQysrIGNvZGUpLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IE91dGVyIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBJbm5lclN0cnVjdCB7IGludCB4OyB9OwogICAgICAgICAgICAgICAgSW5uZXJTdHJ1Y3QqIGdldElubmVyU3RydWN0KCk7CiAgICAgICAgICAgICAgfTsKCjIwMDktMTEtMDg6IHdzZnVsdG9uCgkgICAgSWdub3JlZCBuZXN0ZWQgY2xhc3Mvc3RydWN0IHdhcm5pbmdzIG5vdyBkaXNwbGF5IHRoZSBuYW1lIG9mIHRoZSBpZ25vcmVkIGNsYXNzL3N0cnVjdC4KCjIwMDktMTEtMDc6IHdzZnVsdG9uCgkgICAgQnVnICMxNTE0NjgxIC0gRml4IG5lc3RlZCB0ZW1wbGF0ZSBjbGFzc2VzIHdpdGhpbiBhIG5hbWVzcGFjZSBnZW5lcmF0ZWQgdW5jb21waWxhYmxlCiAgICAgICAgICAgIGNvZGUgYW5kIGludHJvZHVjZWQgc3RyYW5nZSBzaWRlIGVmZmVjdHMgdG8gb3RoZXIgd3JhcHBlciBjb2RlIGVzcGVjaWFsbHkgY29kZQogICAgICAgICAgICBhZnRlciB0aGUgbmVzdGVkIHRlbXBsYXRlIGNsYXNzLiBOb3RlIHRoYXQgbmVzdGVkIHRlbXBsYXRlIGNsYXNzZXMgYXJlIHN0aWxsIGlnbm9yZWQuCgoyMDA5LTExLTA3OiB3c2Z1bHRvbgoJICAgIEFkZCBuZXcgZGVidWcgb3B0aW9uczoKICAgICAgICAgICAgICAtZGVidWctc3ltdGFicyAgICAtIERpc3BsYXkgc3ltYm9sIHRhYmxlcyBpbmZvcm1hdGlvbgogICAgICAgICAgICAgIC1kZWJ1Zy1zeW1ib2xzICAgIC0gRGlzcGxheSB0YXJnZXQgbGFuZ3VhZ2Ugc3ltYm9scyBpbiB0aGUgc3ltYm9sIHRhYmxlcwogICAgICAgICAgICAgIC1kZWJ1Zy1jc3ltYm9scyAgIC0gRGlzcGxheSBDIHN5bWJvbHMgaW4gdGhlIHN5bWJvbCB0YWJsZXMKCjIwMDktMTEtMDM6IHdzZnVsdG9uCgkgICAgRml4IHNvbWUgdXNhZ2Ugb2YgdW5hcnkgc2NvcGUgb3BlcmF0b3IgKDo6KSBkZW5vdGluZyBnbG9iYWwgc2NvcGUsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBuYW1lc3BhY2UgQUEgeyAvKiAuLi4gKi8gfQogICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OkFBOwoKICAgICAgICAgICAgYW5kIGJ1ZyAjMTgxNjgwMiAtIFN3aWdWYWx1ZVdyYXBwZXIgc2hvdWxkIGJlIHVzZWQ6CgogICAgICAgICAgICAgIHN0cnVjdCBDQyB7CiAgICAgICAgICAgICAgICBDQyhpbnQpOyAvLyBubyBkZWZhdWx0IGNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICA6OkNDIHgoKTsKCiAgICAgICAgICAgIGFuZCBpbiB0ZW1wbGF0ZSBwYXJhbWV0ZXIgc3BlY2lhbGl6YXRpb25zOgoKICAgICAgICAgICAgICBzdHJ1Y3QgUyB7fTsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFggeyB2b2lkIGEoKSB7fSB9OwogICAgICAgICAgICAgIHRlbXBsYXRlIDw+IHN0cnVjdCBYPFM+IHsgdm9pZCBiKCkge30gfTsKICAgICAgICAgICAgICAldGVtcGxhdGUoTXlUQ29uY3JldGUpIFg8IDo6UyA+OwoKICAgICAgICAgICAgcGx1cyBwcm9iYWJseSBzb21lIG90aGVyIGNvcm5lciBjYXNlIHVzYWdlIG9mIDo6LgoKMjAwOS0xMS0wMjogb2xseQoJICAgIFtQeXRob25dIEZpeCBwb3RlbnRpYWwgbWVtb3J5IGxlYWsgaW4gaW5pdGlhbGlzYXRpb24gY29kZSBmb3IgdGhlCgkgICAgZ2VuZXJhdGVkIG1vZHVsZS4KCjIwMDktMTAtMjM6IHdzZnVsdG9uCgkgICAgRml4IHNlZyBmYXVsdCB3aGVuIHVzaW5nIGEgbmFtZWQgbmVzdGVkIHRlbXBsYXRlIGluc3RhbnRpYXRpb24gdXNpbmcgJXRlbXBsYXRlKG5hbWUpIAogICAgICAgICAgICB3aXRoaW4gYSBjbGFzcy4gQSB3YXJuaW5nIHRoYXQgdGhlc2UgYXJlIG5vdCBzdXBwb3J0ZWQgaXMgbm93IGlzc3VlZCBwbHVzIHByb2Nlc3NpbmcgCiAgICAgICAgICAgIGNvbnRpbnVlcyBhcyBpZiBubyBuYW1lIHdhcyBnaXZlbi4KCjIwMDktMTAtMjA6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRml4IHN0ZDo6dmVjdG9yPGNvbnN0IFQqPi4gVGhpcyB3b3VsZCBwcmV2aW91c2x5IGNvbXBpbGUsIGJ1dCBub3QgcnVuIGNvcnJlY3RseS4KCjIwMDktMTAtMjA6IHdzZnVsdG9uCgkgICAgRml4ZWQgcHJldmlvdXNseSBmYWlybHkgcG9vciB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFuZCBleHBsaWNpdCAKICAgICAgICAgICAgc3BlY2lhbGl6YXRpb24gc3VwcG9ydC4gTnVtZXJvdXMgYnVncyBpbiB0aGlzIGFyZWEgaGF2ZSBiZWVuIGZpeGVkIGluY2x1ZGluZzoKCiAgICAgICAgICAgIC0gVGVtcGxhdGUgYXJndW1lbnQgZGVkdWN0aW9uIGltcGxlbWVudGVkIGZvciB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50cywgZWcgdGhpcyBub3cKICAgICAgICAgICAgICB3b3JrczoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFggICAgICB7fTsKICAgICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFg8VCAqPiB7fTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShYMSkgWDxjb25zdCBpbnQgKj47IC8vIENob29zZXMgVCAqIHNwZWNpYWxpemF0aW9uCgogICAgICAgICAgICAgIGFuZCBtb3JlIGNvbXBsZXggY2FzZXMgd2l0aCBtdWx0aXBsZSBwYXJhbWV0ZXJzIGFuZCBhIG1peCBvZiB0ZW1wbGF0ZSBhcmd1bWVudAogICAgICAgICAgICAgIGRlZHVjdGlvbiBhbmQgZXhwbGljaXRseSBzcGVjaWFsaXNlZCBwYXJhbWV0ZXJzLCBlZzoKICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+IHN0cnVjdCBUd29QYXJtICAgICAgICAgICAgICAgeyB2b2lkIGEoKSB7fSB9OwogICAgICAgICAgICAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxPiAgICAgICAgICAgICAgc3RydWN0IFR3b1Bhcm08VDEgKiwgaW50ICo+ICB7IHZvaWQgZSgpIHt9IH07CiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRSkgVHdvUGFybTxpbnQgKiosIGludCAqPjsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgcHJpbWFyeSB0ZW1wbGF0ZSBtdXN0IG5vdyBiZSBpbiBzY29wZSwgbGlrZSBpbiBDKyssIHdoZW4KICAgICAgICAgICAgYW4gZXhwbGljaXQgb3IgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcyBpbnN0YW50aWF0ZWQgd2l0aCAldGVtcGxhdGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDktMTQ6IHdzZnVsdG9uCgkgICAgW0MjXSBBZGQgJWNzYXR0cmlidXRlcyBmb3IgYWRkaW5nIEMjIGF0dHJpYnV0ZXMgdG8gZW51bSB2YWx1ZXMsIHNlZSBkb2NzIGZvciBleGFtcGxlLgoKMjAwOS0wOS0xMTogd3NmdWx0b24KCSAgICBGaXggbWVtbW92ZSByZWdyZXNzaW9uIGluIGNkYXRhLmkgYXMgcmVwb3J0ZWQgYnkgQWRyaWFhbiBSZW50aW5nLgoKMjAwOS0wOS0wNzogd3NmdWx0b24KCSAgICBGaXggY29uc3RhbnQgZXhwcmVzc2lvbnMgY29udGFpbmluZyA8PSBvciA+PS4KCjIwMDktMDktMDI6IHdzZnVsdG9uCgkgICAgVGhlIGZvbGxvd2luZyBvcGVyYXRvcnMgaW4gY29uc3RhbnQgZXhwcmVzc2lvbnMgbm93IHJlc3VsdCBpbiB0eXBlIGJvb2wgZm9yIEMrKyAKICAgICAgICAgICAgd3JhcHBlcnMgYW5kIHJlbWFpbiBhcyB0eXBlIGludCBmb3IgQyB3cmFwcGVycywgYXMgcGVyIGVhY2ggc3RhbmRhcmQ6IAoKICAgICAgICAgICAgICAmJiB8fCA9PSAhPSA8ID4gPD0gPj0gKEFjdHVhbGx5IHRoZSBsYXN0IDQgYXJlIHN0aWxsIGJyb2tlbikuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAjZGVmaW5lIEEgMTAKICAgICAgICAgICAgICAjZGVmaW5lIEIgMTAKICAgICAgICAgICAgICAjZGVmaW5lIEFfRVFfQiAgQSA9PSBCIC8vIG5vdyB3cmFwcGVkIGFzIHR5cGUgYm9vbCBmb3IgQysrCiAgICAgICAgICAgICAgI2RlZmluZSBBX0FORF9CIEEgJiYgQiAvLyBub3cgd3JhcHBlZCBhcyB0eXBlIGJvb2wgZm9yIEMrKwoKMjAwOS0wOS0wMjogd3NmdWx0b24KCSAgICBGaXggIzI4NDU3NDYuIHRydWUgYW5kIGZhbHNlIGFyZSBub3cgcmVjb2duaXNlZCBrZXl3b3JkcyAob25seSB3aGVuIHdyYXBwaW5nIEMrKykuCiAgICAgICAgICAgIENvbnN0YW50cyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgYXJlIG5vdyB3cmFwcGVkIChhcyB0eXBlIGJvb2wpOgogICAgICAgICAgICAgICNkZWZpbmUgRk9PIHRydWUKICAgICAgICAgICAgICAjZGVmaW5lIEJBUiBGT08gJiYgZmFsc2UKClZlcnNpb24gMS4zLjQwICgxOCBBdWd1c3QgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wOC0xNzogb2xseQoJICAgIFtQZXJsXSBBZGQgIiN1bmRlZiBkb19leGVjIiB0byBvdXIgY2xlYW4gdXAgb2YgUGVybCBnbG9iYWwKCSAgICBuYW1lc3BhY2UgcG9sbHV0aW9uLgoKMjAwOS0wOC0xNzogb2xseQoJICAgIFtQSFBdIEZpeCB0byB3cmFwIGEgcmVzb3VyY2UgcmV0dXJuZWQgYnkgX19nZXQoKSBpbiBhIFBIUCBvYmplY3QgKFNGIzI1NDkyMTcpLgoKMjAwOS0wOC0xNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMyNzk3NDg1IEFmdGVyIGRvaW5nIGEgJ21ha2UgY2xlYW4nLCBpbnN0YWxsIGZhaWxzIGlmIHlvZGwybWFuIG9yIHlvZGwyaHRtbCAKICAgICAgICAgICAgaXMgbm90IGF2YWlsYWJsZS4KCjIwMDktMDgtMTY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtPY3RhdmVdIENhdWdodCBleGNlcHRpb25zIGRpc3BsYXkgdGhlIHR5cGUgb2YgdGhlIEMrKyBleGNlcHRpb24gaW5zdGVhZCBvZiB0aGUKICAgICAgICAgICAgZ2VuZXJpYyAiYysrLXNpZGUgdGhyZXcgYW4gZXhjZXB0aW9uIiBtZXNzYWdlLgoKMjAwOS0wOC0xNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFdoZW4gJWNhdGNoZXMgaXMgdXNlZCwgZml4IHNvIHRoYXQgYW55IGNsYXNzZXMgc3BlY2lmaWVkIGluIHRoZSAidGhyb3dzIgogICAgICAgICAgICBhdHRyaWJ1dGUgb2YgdGhlICJ0aHJvd3MiIHR5cGVtYXAgYXJlIGdlbmVyYXRlZCBpbnRvIHRoZSBKYXZhIG1ldGhvZCdzIHRocm93cyBjbGF1c2UuCgoyMDA5LTA4LTE2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBleGNlcHRpb24gaGFuZGxpbmcgd2hlbiAlY2F0Y2hlcyBpcyB1c2VkLCByZXBvcnRlZCBieSBKdWFuIE1hbnVlbCBBbHZhcmV6LgoKMjAwOS0wOC0xNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICV0ZW1wbGF0ZSBzZWcgZmF1bHQgb24gc29tZSBjYXNlcyBvZiBvdmVybG9hZGluZyB0aGUgdGVtcGxhdGVkIG1ldGhvZC4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IEphbiBLdXBlYy4KCjIwMDktMDgtMTU6IHdzZnVsdG9uCgkgICAgW1J1YnldIEFkZCBudW1lcm91cyBtaXNzaW5nIHdyYXBwZWQgbWV0aG9kcyBmb3Igc3RkOjp2ZWN0b3I8Ym9vbD4gc3BlY2lhbGl6YXRpb24KICAgICAgICAgICAgYXMgcmVwb3J0ZWQgYnkgWW91c3NlZiBKb25lcy4KCjIwMDktMDgtMTQ6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEFkZCBTV0lHX0NvbnZlcnRQdHJBbmRPd24oKSBtZXRob2QgaW50byB0aGUgcnVudGltZSBmb3Igc21hcnQgcG9pbnRlciAKICAgICAgICAgICAgbWVtb3J5IG93bmVyc2hpcCBjb250cm9sLiBzaGFyZWRfcHRyIHN1cHBvcnQgc3RpbGwgdG8gYmUgYWRkZWQuIFBhdGNoIGZyb20gCiAgICAgICAgICAgIERhdmlkIEZsZXRjaGVyLgoKMjAwOS0wOC0xNDogb2xseQoJICAgIFtQSFBdIFBIUDUgbm93IHdyYXBzIHN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIGFzIGRvY3VtZW50ZWQuCgoyMDA5LTA4LTE0OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBQSFAgImNsYXNzIiBleGFtcGxlIHRvIHdvcmsgd2l0aCBQSFA1IGFuZCB1c2UKCSAgICBtb2Rlcm4gd3JhcHBpbmcgZmVhdHVyZXMuCgoyMDA5LTA4LTEzOiB3c2Z1bHRvbgoJICAgIFtQSFBdIHN0ZDo6dmVjdG9yIHdyYXBwZXJzIG92ZXJoYXVsLiBUaGV5IG5vIGxvbmdlciByZXF1aXJlIHRoZSAKICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfdmVjdG9yKCkgbWFjcm8uIEFkZGVkIHdyYXBwZXJzIGZvciBjYXBhY2l0eSgpIGFuZCByZXNlcnZlKCkuCgoyMDA5LTA4LTEzOiB3c2Z1bHRvbgoJICAgIFtQSFBdIEFkZCBjb25zdCByZWZlcmVuY2UgdHlwZW1hcHMuIGNvbnN0IHJlZmVyZW5jZSBwcmltaXRpdmUgdHlwZXMgYXJlCiAgICAgICAgICAgIG5vdyBwYXNzZWQgYnkgdmFsdWUgcmF0aGVyIHRoYW4gcG9pbnRlciBsaWtlIHRoZSBvdGhlciB0YXJnZXQgbGFuZ3VhZ2VzLgoJICAgIEZpeGVzIFNGIzI1MjQwMjkuCgoyMDA5LTA4LTA4OiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIE1vcmUgdXNlciBmcmllbmRseSBBdHRyaWJ1dGVFcnJvciBpcyByYWlzZWQgd2hlbiB0aGVyZSBhcmUKICAgICAgICAgICAgbm8gY29uc3RydWN0b3JzIGdlbmVyYXRlZCBmb3IgdGhlIHByb3h5IGNsYXNzIGluIHRoZSBldmVudCB0aGF0IHRoZQogICAgICAgICAgICBjbGFzcyBpcyBhYnN0cmFjdCAtIHRoZSBlcnJvciBtZXNzYWdlIGlzIG5vdyAKICAgICAgICAgICAgIk5vIGNvbnN0cnVjdG9yIGRlZmluZWQgLSBjbGFzcyBpcyBhYnN0cmFjdCIgd2hlcmVhcyBpZiB0aGVyZSBhcmUgbm8KICAgICAgICAgICAgcHVibGljIGNvbnN0cnVjdG9ycyBmb3IgYW55IG90aGVyIHJlYXNvbiBhbmQgdGhlIGNsYXNzIGlzIG5vdCBhYnN0cmFjdCwKICAgICAgICAgICAgdGhlIG1lc3NhZ2UgcmVtYWlucwogICAgICAgICAgICAiTm8gY29uc3RydWN0b3IgZGVmaW5lZCIuCiAgICAgICAgICAgIFt0Y2xdIFNpbWlsYXJseSBmb3IgdGNsIHdoZW4gdXNpbmcgLWl0Y2wuCgoyMDA5LTA4LTA0OiBvbGx5CgkgICAgW1BIUF0gRml4IGdlbmVyYXRlZCBjb2RlIHRvIHdvcmsgd2l0aCBQSFAgNS4zLgoKMjAwOS0wOC0wNDogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBWYXJpb3VzIG1hdGhlbWF0aWNhbCBmdW5jdGlvbnMgKHdoaWNoIHdvdWxkIGNvbmZsaWN0CiAgICAgICAgICAgIHdpdGggdGhlIGJ1aWx0LWluIFBIUCBvbmVzKSBhcmUgbm93IGF1dG9tYXRpY2FsbHkgaGFuZGxlZCBieQogICAgICAgICAgICBhZGRpbmcgYSAnY18nIHByZWZpeC4KCjIwMDktMDgtMDM6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVGhlIHN0ZDo6dmVjdG9yPFQ+IGltcGxlbWVudGF0aW9uIGlzIGltcHJvdmVkIGFuZCBub3cgdXNlcyAkdHlwZW1hcCBzdWNoCiAgICAgICAgICAgIHRoYXQgdGhlIHByb3h5IGNsYXNzIGZvciBUIG5vIGxvbmdlciBoYXMgdG8gYmUgc3BlY2lmaWVkIGluIHNvbWUgbWFjcm9zCiAgICAgICAgICAgIGZvciBjb3JyZWN0IEMjIGNvbXBpbGF0aW9uOyB0aGUgZm9sbG93aW5nIG1hY3JvcyBhcmUgZGVwcmVjYXRlZCwgd2hlcmUKICAgICAgICAgICAgQ1NUWVBFIHdhcyB0aGUgQyMgdHlwZSBmb3IgdGhlIEMrKyBjbGFzcyBDVFlQRToKCiAgICAgICAgICAgIFNXSUdfU1REX1ZFQ1RPUl9TUEVDSUFMSVpFX01JTklNVU0oQ1NUWVBFLCBDVFlQRSkKICAgICAgICAgICAgICB1c2FnZSBzaG91bGQgYmUgcmVtb3ZlZCBhbHRvZ2V0aGVyCgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfU1BFQ0lBTElaRShDU1RZUEUsIENUWVBFKQogICAgICAgICAgICAgIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoOgogICAgICAgICAgICBTV0lHX1NURF9WRUNUT1JfRU5IQU5DRUQoQ1RZUEUpCgogICAgICAgICAgICBTb21lIG1vcmUgZGV0YWlscyBpbiBjc2hhcnAvc3RkX3ZlY3Rvci5pCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDctMzE6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggaW5kZW50YXRpb24gc28gdGhhdCB3ZSBnaXZlIGEgdXNlZnVsIGVycm9yIGlmIHRoZQoJICAgIG1vZHVsZSBjYW4ndCBiZSBsb2FkZWQuICBQYXRjaCBmcm9tIEdhZXRhbiBMZWhtYW5uIGluIFNGIzI4Mjk4NTMuCgoyMDA5LTA3LTI5OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgJHR5cGVtYXAobWV0aG9kLCB0eXBlbGlzdCkgc3BlY2lhbCB2YXJpYWJsZSBtYWNyby4gVGhpcyBhbGxvd3MKICAgICAgICAgICAgdGhlIGNvbnRlbnRzIG9mIGEgdHlwZW1hcCB0byBiZSBpbnNlcnRlZCB3aXRoaW4gYW5vdGhlciB0eXBlbWFwLgogICAgICAgICAgICBGdWxseSBkb2N1bWVudGVkIGluIFR5cGVtYXBzLmh0bWwuCgoyMDA5LTA3LTI5OiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIFN0YXRpYyBtZW1iZXIgdmFyaWFibGVzIGFyZSBub3cgcHJlZml4ZWQgd2l0aCB0aGUKICAgICAgICAgICAgY2xhc3MgbmFtZS4gVGhpcyBhbGxvd3Mgc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgd2l0aCB0aGUKICAgICAgICAgICAgc2FtZSBuYW1lIGluIGRpZmZlcmVudCBjbGFzc2VzLgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQeXRob25dIEFkZCBtaXNzaW5nIGxvY2tzIHRvIHN0ZDo6bWFwIHdyYXBwZXJzLiAgUGF0Y2ggZnJvbSAKCSAgICBQYXVsIEhhbXBzb24gaW4gU0YjMjgxMzgzNi4KCjIwMDktMDctMjk6IG9sbHkKCSAgICBbUEhQXSBGaXggbWVtb3J5IGxlYWsgaW4gUEhQIE9VVFBVVCB0eXBlbWFwcy4gIFJlcG9ydGVkIGJ5IEhpdG9zaGkKCSAgICBBbWFubyBpbiBTRiMyODI2MzIyLgoKMjAwOS0wNy0yOTogb2xseQoJICAgIFtQSFBdIEZpeCBtZW1vcnkgbGVhayBpbiBQSFAgcmVzb3VyY2UgZGVzdHJ1Y3RvciBmb3IgY2xhc3NlcwoJICAgIHdpdGhvdXQgYSBkZXN0cnVjdG9yIGFuZCBub24tY2xhc3MgdHlwZXMuICBQYXRjaCBmcm9tIEhpdG9zaGkgQW1hbm8KCSAgICBpbiBTRiMyODI1MzAzLgoKMjAwOS0wNy0yODogb2xseQoJICAgIFtQSFBdIFVwZGF0ZSB3YXJuaW5ncyBhYm91dCBjbGFzaGVzIGJldHdlZW4gaWRlbnRpZmllcnMgYW5kIFBIUAoJICAgIGtleXdvcmRzIGFuZCBhdXRvbWF0aWMgcmVuYW1pbmcgdG8gd29yayB3aXRoIHRoZSBQSFA1IGNsYXNzCgkgICAgd3JhcHBlcnMuICBGaXhlcyBTRiMxNjEzNjc5LgoKMjAwOS0wNy0yODogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBJZiBhIG1lbWJlciBmdW5jdGlvbiBpcyBub3QgcHVibGljIGJ1dCBpdCBoYXMgYSBiYXNlCiAgICAgICAgICAgIHdoaWNoIGlzIHB1YmxpYywgdGhlbiBub3cgYSB3YXJuaW5nIGlzIGlzc3VlZCBhbmQgdGhlIG1lbWJlcgogICAgICAgICAgICBmdW5jdGlvbiB3aWxsIGJlIHB1YmxpYywgYXMgUEhQIHJlcXVpcmVzIHRoaXMuCgoyMDA5LTA3LTIxOiB2bWlrbG9zCiAgICAgICAgICAgIFtQSFBdIERpcmVjdG9yIHN1cHBvcnQgYWRkZWQuCgoyMDA5LTA3LTE1OiBvbGx5CgkgICAgW1BlcmxdIERvbid0IHNwZWNpZnkgUGVybCBwcm90b3R5cGUgIigpIiBmb3IgYSBjb25zdHJ1Y3RvciB3aXRoIGEKCSAgICBkaWZmZXJlbnQgbmFtZSB0byB0aGUgY2xhc3MsIGFzIHN1Y2ggY29uc3RydWN0b3JzIGNhbiBzdGlsbCB0YWtlCgkgICAgcGFyYW1ldGVycy4KCjIwMDktMDctMTI6IHhhdmllcjk4CgkgICAgW09jdGF2ZV0gQWRkIHN1cHBvcnQgZm9yIE9jdGF2ZSAzLjIgQVBJCgoyMDA5LTA3LTA1OiBvbGx5CgkgICAgW1BIUF0gVXBkYXRlIHRoZSBsaXN0IG9mIFBIUCBrZXl3b3JkcyAtICJjZnVuY3Rpb24iIGlzIG5vIGxvbmdlciBhCgkgICAga2V5d29yZCBpbiBQSFA1IGFuZCBQSFAgNS4zIGFkZGVkICJnb3RvIiwgIm5hbWVzcGFjZSIsICJfX0RJUl9fIiwKCSAgICBhbmQgIl9fTkFNRVNQQUNFX18iLgoKMjAwOS0wNy0wMzogb2xseQoJICAgIFtUY2xdIFRvIGNvbXBsZW1lbnQgVVNFX1RDTF9TVFVCUywgYWRkIHN1cHBvcnQgZm9yIFVTRV9US19TVFVCUwoJICAgIGFuZCBTV0lHX1RDTF9TVFVCU19WRVJTSU9OLiAgRG9jdW1lbnQgYWxsIHRocmVlIGluIHRoZSBUY2wgY2hhcHRlcgoJICAgIG9mIHRoZSBtYW51YWwuICBCYXNlZCBvbiBwYXRjaCBmcm9tIFNGIzI4MTAzODAgYnkgQ2hyaXN0aWFuCgkgICAgR29sbHdpdHplci4KCjIwMDktMDctMDI6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gQWRkZWQgZmFjdG9yeS5pIGZvciBQSFAsIHNlZSB0aGUgbGlfZmFjdG9yeSB0ZXN0Y2FzZQogICAgICAgICAgICBmb3IgbW9yZSBpbmZvIG9uIGhvdyB0byB1c2UgaXQuCgoyMDA5LTA3LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggLVdhbGxrdyBvcHRpb24gYXMgcmVwb3J0ZWQgYnkgU29sb21vbiBHaWJicy4KCjIwMDktMDctMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzeW50YXggZXJyb3Igd2hlbiBhIG5lc3RlZCBzdHJ1Y3QgY29udGFpbnMgYSBjb21tZW50IGNvbnRhaW5pbmcgYSAqIGZvbGxvd2VkIAogICAgICAgICAgICBldmVudHVhbGx5IGJ5IGEgLy4gUmVncmVzc2lvbiBmcm9tIDEuMy4zNywgcmVwb3J0ZWQgYnkgU29sb21vbiBHaWJicy4KCjIwMDktMDctMDE6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gVW5rbm93biBwcm9wZXJ0aWVzIGFyZSBubyBsb25nZXIgaWdub3JlZCBpbiBwcm94eQogICAgICAgICAgICBjbGFzc2VzLgoKMjAwOS0wNy0wMTogdm1pa2xvcwogICAgICAgICAgICBbUEhQXSBGaXhlZCAlbmV3b2JqZWN0IGJlaGF2aW91ciwgcHJldmlvdXNseSBhbnkgbWV0aG9kCiAgICAgICAgICAgIG1hcmtlZCB3aXRoICVuZXdvYmplY3Qgd2FzIGhhbmRsZWQgYXMgYSBjb25zdHJ1Y3Rvci4KCjIwMDktMDYtMzA6IG9sbHkKCSAgICBbUnVieV0gVW5kZWZpbmUgY2xvc2UgYW5kIGNvbm5lY3QgbWFjcm9zIGRlZmluZWQgYnkgUnVieSBBUEkKCSAgICBoZWFkZXJzIGFzIHdlIGRvbid0IG5lZWQgdGhlbSBhbmQgdGhleSBjYW4gY2xhc2ggd2l0aCBDKysgbWV0aG9kcwoJICAgIGJlaW5nIHdyYXBwZWQuICBQYXRjaCBmcm9tIFZpdCBPbmRydWNoIGluIFNGIzI4MTQ0MzAuCgoyMDA5LTA2LTI2OiBvbGx5CgkgICAgW1J1YnldIEZpeCB0byBoYW5kbGUgRklYTlVNIHZhbHVlcyBncmVhdGVyIHRoYW4gTUFYSU5UIHBhc3NlZCBmb3IgYQoJICAgIGRvdWJsZSBwYXJhbWV0ZXIuCgoyMDA5LTA2LTI0OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggd3JhcHBpbmcgbWV0aG9kcyB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGFuZCB0aGUgY29tcGFjdGRlZmF1bHRhcmdzIGZlYXR1cmUgCiAgICAgICAgICAgIHdoZXJlIGEgY2xhc3MgaXMgcGFzc2VkIGJ5IHZhbHVlIGFuZCBpcyBhc3NpZ25lZCBhIGRlZmF1bHQgdmFsdWUuIFRoZSBTd2lnVmFsdWVXcmFwcGVyCiAgICAgICAgICAgIHRlbXBsYXRlIHdvcmthcm91bmQgZm9yIGEgbWlzc2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIG5vIGxvbmdlciB1c2VkIGFzIHRoZSBjb2RlIAogICAgICAgICAgICBnZW5lcmF0ZWQgZG9lcyBub3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KCjIwMDktMDYtMTY6IHdzZnVsdG9uCgkgICAgW0phdmEsQyNdIEZpeCBlbnVtIG1hcnNoYWxsaW5nIHdoZW4gJWlnbm9yZSBpcyB1c2VkIG9uIG9uZSBvZiB0aGUgZW51bSBpdGVtcy4KICAgICAgICAgICAgSW5jb3JyZWN0IGVudW0gdmFsdWVzIHdlcmUgYmVpbmcgcGFzc2VkIHRvIHRoZSBDKysgbGF5ZXIgb3IgY29tcGlsYXRpb24gZXJyb3JzIHJlc3VsdGVkLgoKMjAwOS0wNi0wMjogdGFsYnkKCSAgICBbUGVybF0gUmVzb2x2ZWQgcmVmZXJlbmNlLmkgb3ZlcmxvYWQgc3VwcG9ydCBwcm9ibGVtCgkgICAgaWRlbnRpZmllZCBieSBKb2huIFBvdG93c2t5LgoKMjAwOS0wNS0yNjogd3NmdWx0b24KCSAgICBbQyNdIEltcHJvdmVkIHN0ZDo6bWFwIHdyYXBwZXJzIGJhc2VkIG9uIHBhdGNoIGZyb20gWXV2YWwgQmFyb3IuIFRoZSBDIyBwcm94eQogICAgICAgICAgICBub3cgaW1wbGVtZW50cyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYy5JRGljdGlvbmFyeTw+LgoKCSAgICBUaGVzZSBzdGQ6bWFwIHdyYXBwZXJzIGhhdmUgYSBub24tYmFja3dhcmRzIGNvbXBhdGlibGUgb3ZlcmhhdWwgdG8gbWFrZSB0aGVtCiAgICAgICAgICAgIGxpa2UgYSAuTkVUIElEaWN0aW9uYXJ5LiBTb21lIG1ldGhvZCBuYW1lcyBoYXZlIGNoYW5nZWQgYXMgZm9sbG93aW5nOgogICAgICAgICAgICAgIHNldCAtPiBzZXRpdGVtICh1c2UgdGhpc1tdIHByb3BlcnR5IG5vdykKICAgICAgICAgICAgICBnZXQgLT4gZ2V0aXRlbSAodXNlIHRoaXNbXSBwcm9wZXJ0eSBub3cpCiAgICAgICAgICAgICAgaGFzX2tleSAtPiBDb250YWluc0tleQogICAgICAgICAgICAgIGRlbCAtPiBSZW1vdmUKICAgICAgICAgICAgICBjbGVhciAtPiBDbGVhcgoKICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBtYWNyb3MgdXNlZCBmb3Igc3RkOjptYXAgd3JhcHBlcnMgYXJlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgbm8gbG9uZ2VyIHdvcms6CiAgICAgICAgICAgICAgc3BlY2lhbGl6ZV9zdGRfbWFwX29uX2tleQogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl92YWx1ZQogICAgICAgICAgICAgIHNwZWNpYWxpemVfc3RkX21hcF9vbl9ib3RoCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDUtMjA6IHZtaWtsb3MKICAgICAgICAgICAgW1BIUF0gQWRkIHRoZSAndGhpc293bicgbWVtYmVyIHRvIGNsYXNzZXMuIFRoZSB1c2FnZSBvZiBpdAogICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyB0aGUgUHl0aG9uIHRoaXNvd24gb25lOiBpdCdzIDEgYnkgZGVmYXVsdCBhbmQKICAgICAgICAgICAgeW91IGNhbiBzZXQgaXQgdG8gMCBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IGZyZWVpbmcgaXQuIChGb3IKICAgICAgICAgICAgZXhhbXBsZSB0byBwcmV2ZW50IGEgZG91YmxlIGZyZWUuKQoKMjAwOS0wNS0xNDogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEZpeCB0aGUgd3JvbmcgcG9pbnRlciB2YWx1ZSByZXR1cm5lZCBieSBTd2lnUHlPYmplY3RfcmVwcigpLgoKMjAwOS0wNS0xMzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIE1pbm9yIHR3ZWFrIHdoZW4gd3JhcHBpbmcgaW4gLW5vY3dyYXAgbW9kZS4KCjIwMDktMDUtMTE6IHdzZnVsdG9uCgkgICAgW0MjXSBJbXByb3ZlZCBzdGQ6OnZlY3RvciB3cmFwcGVycyBvbiB0aGUgQyMgcHJveHkgc2lkZSBmcm9tIFl1dmFsIEJhcm9yLiBUaGVzZQoJICAgIGltcGxlbWVudCBJTGlzdDw+IGluc3RlYWQgb2YgSUVudW1lcmFibGU8PiB3aGVyZSBwb3NzaWJsZS4KCjIwMDktMDQtMjk6IHdzZnVsdG9uCgkgICAgW0phdmEsIEMjXSBBZGQgdGhlICdub3RkZXJpdmVkJyBhdHRyaWJ1dGUgdG8gdGhlIGphdmFiYXNlIGFuZCBjc2Jhc2UgdHlwZW1hcHMuCgkgICAgV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQsIHRoZSB0eXBlbWFwIHdpbGwgbm90IGFwcGx5IHRvIGNsYXNzZXMgdGhhdCBhcmUgZGVyaXZlZAoJICAgIGZyb20gYSBDKysgYmFzZSBjbGFzcywgZWcgCgkgICAgICAldHlwZW1hcChjc2Jhc2UsIG5vdGRlcml2ZWQ9IjEiKSBTV0lHVFlQRSAiQ29tbW9uQmFzZSIKCjIwMDktMDQtMjk6IG9sbHkKCSAgICBbUHl0aG9uXSBEb24ndCBhdHRlbXB0IHRvIGFjcXVpcmUgdGhlIEdJTCBpbiBzaXR1YXRpb25zIHdoZXJlIHdlCgkgICAga25vdyB0aGF0IGl0IHdpbGwgYWxyZWFkeSBiZSBsb2NrZWQuICBUaGlzIGF2b2lkcyBzb21lIGRlYWQtbG9ja3MKCSAgICB3aXRoIG1vZF9weXRob24gKGR1ZSB0byBtb2RfcHl0aG9uIGJ1Z3Mgd2hpY2ggYXJlIGFwcGFyZW50bHkKCSAgICB1bmxpa2VseSB0byBldmVyIGJlIGZpeGVkKSwgYW5kIHJlc3VsdHMgaW4gc21hbGxlciB3cmFwcGVycyB3aGljaAoJICAgIHJ1biBhIGxpdHRsZSBmYXN0ZXIgKGluIHRlc3RzIHdpdGggWGFwaWFuIG9uIHg4Ni02NCBVYnVudHUgOS4wNCwKCSAgICB0aGUgc3RyaXBwZWQgd3JhcHBlciBsaWJyYXJ5IHdhcyAxMSUgc21hbGxlciBhbmQgcmFuIDIuNyUgZmFzdGVyKS4KCjIwMDktMDQtMjE6IHdzZnVsdG9uCgkgICAgW0MjXSBGaXggIzI3NTM0NjkgLSBib29sICZPVVRQVVQgYW5kIGJvb2wgKk9VVFBVVCB0eXBlbWFwcyBpbml0aWFsaXNhdGlvbi4KCjIwMDktMDQtMDk6IHdzZnVsdG9uCgkgICAgRml4ICMyNzQ2ODU4IC0gQyBtYWNybyBleHByZXNzaW9uIHVzaW5nIGZsb2F0aW5nIHBvaW50IG51bWJlcnMKCjIwMDktMDMtMzA6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVmYXVsdCBvdXQgdHlwZW1hcCBmb3IgY2hhcltBTlldIG5vdyByZXR1cm5zIHRoZSBzdHJpbmcgdXAgdG8gYQoJICAgIHplcm8gYnl0ZSwgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXkgaWYgdGhlcmUgaXMgbm8gemVybyBieXRlLiAgVGhpcwoJICAgIGlzIHRoZSBzYW1lIGFzIFB5dGhvbiBkb2VzLCBhbmQgc2VlbXMgbW9yZSBnZW5lcmFsbHkgdXNlZnVsIHRoYW4KCSAgICB0aGUgcHJldmlvdXMgYmVoYXZpb3VyIG9mIHJldHVybmluZyB0aGUgd2hvbGUgY29udGVudHMgb2YgdGhlIGFycmF5CgkgICAgaW5jbHVkaW5nIGFueSB6ZXJvIGJ5dGVzLiAgSWYgeW91IHdhbnQgdGhlIG9sZCBiZWhhdmlvdXIsIHlvdSBjYW4gcHJvdmlkZQoJICAgIHlvdXIgb3duIHR5cGVtYXAgdG8gZG8gdGhpczoKCgkgICAgJXR5cGVtYXAob3V0KSBjaGFyIFtBTlldCgkgICAgJXsKCQlSRVRWQUxfU1RSSU5HTCgkMSwgJDFfZGltMCwgMSk7CgkgICAgJX0KClZlcnNpb24gMS4zLjM5ICgyMSBNYXJjaCAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDMtMTk6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggdGhlIG1lbW9yeSBsZWFrIHJlbGF0ZWQgdG8gUHl0aG9uIDMgdW5pY29kZSBhbmQgQyBjaGFyKiBjb252ZXJzaW9uLAogICAgICAgICAgICB3aGljaCBjYW4gYmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGJlZm9yZSB0aGlzIGZpeDoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIGZyb20gbGlfY3N0cmluZyBpbXBvcnQgKgogICAgICAgICAgICAgICAgICBpPTAKICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKICAgICAgICAgICAgICAgICAgICAgIGkgKz0gMQogICAgICAgICAgICAgICAgICAgICAgbiA9IHN0cihpKSoxMAogICAgICAgICAgICAgICAgICAgICAgdGVzdDMobikKCiAgICAgICAgICAgIFRoaXMgZml4IGFmZmVjdGVkIFNXSUdfQXNDaGFyUHRyQW5kU2l6ZSgpIHNvIHlvdSBjYW5ub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGgKICAgICAgICAgICAgYSBudWxsIGFsbG9jIGFuZCBub24tbnVsbCBjcHRyIGFyZ3VtZW50IGluIFB5dGhvbiAzLCBvdGhlcndpc2UgYSBydW50aW1lIGVycm9yCiAgICAgICAgICAgIHdpbGwgYmUgcmFpc2VkLgoKMjAwOS0wMy0xODogd3NmdWx0b24KCSAgICBbQyNdIHN0ZDo6dmVjdG9yPFQ+IHdyYXBwZXIgaW1wcm92ZW1lbnRzIGZvciAuTkVUIDIgYW5kIGFsc28gcHJvdmlkaW5nIHRoZQoJICAgIG5lY2Vzc2FyeSBtYWNoaW5lcnkgdG8gdXNlIHRoZSBzdGQ6OnZlY3RvcjxUPiB3cmFwcGVycyB3aXRoIG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMgc3VjaAoJICAgIGFzIExJTlEgLSB0aGUgQyMgcHJveHkgY2xhc3Mgbm93IGRlcml2ZXMgZnJvbSBJRW51bWVyYWJsZTw+LiBUaGUgZGVmYXVsdCBpcyBub3cgdG8gCgkgICAgZ2VuZXJhdGUgY29kZSByZXF1aXJpbmcgLk5FVCAyIGFzIGEgbWluaW11bSwgYWx0aG91Z2ggdGhlIEMjIGNvZGUgY2FuIGJlIGNvbXBpbGVkIAoJICAgIGZvciAuTkVUIDEgYnkgZGVmaW5pbmcgdGhlIFNXSUdfRE9UTkVUXzEgQyMgcHJlcHJvY2Vzc29yIGNvbnN0YW50LiBTZWUgdGhlIAoJICAgIHN0ZF92ZWN0b3IuaSBmaWxlIGZvciBtb3JlIGRldGFpbHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjIwMDktMDMtMTI6IHdzZnVsdG9uCgkgICAgW1J1YnldIEZpeCAjMjY3NjczOCBTV0lHIGdlbmVyYXRlZCBzeW1ib2wgbmFtZSBjbGFzaGVzLgoKMjAwOS0wMy0wMTogYmh5CiAgICAgICAgICAgIFtQeXRob25dIFNvbWUgZml4ZXMgZm9yIFB5dGhvbiAzLjAuMSBhbmQgaGlnaGVyIHN1cHBvcnQuIEluIDMuMC4xLCB0aGUgQyBBUEkgZnVuY3Rpb24KICAgICAgICAgICAgUHlPYmplY3RfQ29tcGFyZSBpcyByZW1vdmVkLCBzbyBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wgaXMgdXNlZCBmb3IgcmVwbGFjZW1lbnQuCiAgICAgICAgICAgIFN0cnVjdCBpbml0aWxpemF0aW9uIG9mIFN3aWdQeU9iamVjdCBhbmQgU3dpZ1B5T2JqZWN0X2FzX251bWJlciBjaGFuZ2VkIHRvIHJlZmxlY3QKICAgICAgICAgICAgdGhlIGRyb3Agb2YgdHBfY29tcGFyZSBhbmQgbmJfbG9uZy4KCjIwMDktMDMtMDE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU4MzE2MC4gTm93IHRoZSBpbXBvcnRlciBpbiBQeXRob24gc2hhZG93IHdyYXBwZXIgdGFrZSBjYXJlIG9mIHRoZQogICAgICAgICAgICBjYXNlIHRoYXQgbW9kdWxlIGFscmVhZHkgaW1wb3J0ZWQgYXQgb3RoZXIgcGxhY2UuCgoyMDA5LTAyLTI4OiBiaHkKICAgICAgICAgICAgW1B5dGhvbl0gRml4IFNGIzI2MzczNTIuIE1vdmUgc3RydWN0IGRlY2xhcmF0aW9uIG9mIFNXSUdfbW9kdWxlIGluIHB5aW5pdC5zd2cgYmVmb3JlCiAgICAgICAgICAgIHRoZSBtZXRob2QgY2FsbHMsIHNpbmNlIHNvbWUgQyBjb21waWxlciBkb24ndCBhbGxvdyBkZWNsYXJhdGlvbiBpbiBtaWRkbGUgb2YgZnVuY3Rpb24KICAgICAgICAgICAgYm9keS4KCjIwMDktMDItMjE6IHdzZnVsdG9uCgkgICAgW0FsbGVncm9jbF0gRml4IHNlZyBmYXVsdCB3cmFwcGluZyBzb21lIGNvbnN0YW50IHZhcmlhYmxlICglY29uc3RhbnQpIHR5cGVzLgoKMjAwOS0wMi0yMDogd3NmdWx0b24KCSAgICBbQ0ZGSV0gRml4IHNlZyBmYXVsdHMgd2hlbiBmb3IgJWV4dGVuZCBhbmQgdXNpbmcgc3RhdGVtZW50cy4KCjIwMDktMDItMjA6IHdzZnVsdG9uCgkgICAgRml4IFNGICMyNjA1OTU1OiAtY28gb3B0aW9uIHdoaWNoIGJyb2tlIGluIDEuMy4zNy4gCgoyMDA5LTAyLTIwOiB3c2Z1bHRvbgoJICAgIE5ldyAlaW5zZXJ0KCJiZWdpbiIpIHNlY3Rpb24gYWRkZWQuIEFsc28gY2FuIGJlIHVzZWQgYXMgJWJlZ2luLiBUaGlzIGlzIGEgbmV3CgkgICAgY29kZSBzZWN0aW9uIHJlc2VydmVkIGVudGlyZWx5IGZvciB1c2VycyBhbmQgdGhlIGNvZGUgd2l0aGluIHRoZSBzZWN0aW9uIGlzIGdlbmVyYXRlZAoJICAgIGF0IHRoZSB0b3Agb2YgdGhlIEMvQysrIHdyYXBwZXIgZmlsZSBhbmQgc28gcHJvdmlkZXMgYSBtZWFucyB0byBwdXQgY3VzdG9tIGNvZGUKCSAgICBpbnRvIHRoZSB3cmFwcGVyIGZpbGUgYmVmb3JlIGFueXRoaW5nIGVsc2UgdGhhdCBTV0lHIGdlbmVyYXRlcy4KCjIwMDktMDItMTc6IHdzZnVsdG9uCgkgICAgJ21ha2UgY2xlYW4tdGVzdC1zdWl0ZScgd2lsbCBub3cgcnVuIGNsZWFuIG9uIEFMTCBsYW5ndWFnZXMuIFByZXZpb3VzbHkgaXQgb25seQoJICAgIHJhbiB0aGUgY29ycmVjdGx5IGNvbmZpZ3VyZWQgbGFuZ3VhZ2VzLiBUaGlzIHdheSBpdCBpcyBub3cgcG9zc2libGUgdG8gY2xlYW4gdXAKCSAgICBwcm9wZXJseSBhZnRlciBydW5uaW5nICdtYWtlIHBhcnRpYWxjaGVjay10ZXN0LXN1aXRlJy4KCjIwMDktMDItMTQ6IHdzZnVsdG9uCgkgICAgRXh0ZW5kIGF0dHJpYnV0ZSBsaWJyYXJ5IHN1cHBvcnQgZm9yIHN0cnVjdHMvY2xhc3NlcyBhbmQgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyB1c2UKCSAgICBwYXNzL3JldHVybiBieSB2YWx1ZSBzZW1hbnRpY3MuIFR3byBuZXcgbWFjcm9zIGFyZSBhdmFpbGFibGUgYW5kIHVzYWdlIGlzIGlkZW50aWNhbAoJICAgIHRvICVhdHRyaWJ1dGUuIFRoZXNlIGFyZSAlYXR0cmlidXRldmFsIGZvciBzdHJ1Y3RzL2NsYXNzZXMgYW5kICVhdHRyaWJ1dGVzdHJpbmcgZm9yCgkgICAgc3RyaW5nIGNsYXNzZXMsIGxpa2Ugc3RkOjpzdHJpbmcuIFNlZSBhdHRyaWJ1dGUuc3dnIGZvciBtb3JlIGRldGFpbHMuCgoyMDA5LTAyLTEzOiB3c2Z1bHRvbgoJICAgIEFkZCBzdXBwb3J0IGZvciAlZXh0ZW5kIGFuZCBtZW1iZXJpbiB0eXBlbWFwcy4gUHJldmlvdXNseSB0aGUgbWVtYmVyaW4gdHlwZW1hcHMgd2VyZQoJICAgIGlnbm9yZWQgZm9yIG1lbWJlciB2YXJpYWJsZXMgd2l0aGluIGEgJWV4dGVuZCBibG9jay4KCjIwMDktMDItMTI6IHdzZnVsdG9uCgkgICAgUmVtb3ZlIHVubmVjZXNzYXJ5IHRlbXBvcmFyeSB2YXJpYWJsZSB3aGVuIHdyYXBwaW5nIHJldHVybiB2YWx1ZXMgdGhhdCBhcmUgcmVmZXJlbmNlcy4gCgkgICAgRXhhbXBsZSBvZiBnZW5lcmF0ZWQgY29kZSBmb3Igd3JhcHBpbmc6CgoJICAgICAgc3RydWN0IFhZWiB7CgkJc3RkOjpzdHJpbmcmIHJlZlJldHVybigpOwoJICAgICAgfTsKCgkgICAgdXNlZCB0byBiZToKCiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKnJlc3VsdCA9IDAgOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZfcmVzdWx0X3JlZiA9IChhcmcxKS0+cmVmUmV0dXJuKCk7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAoc3RkOjpzdHJpbmcgKikgJl9yZXN1bHRfcmVmOwogICAgICAgICAgICAgIH0KCgkgICAgIE5vdyBpdCBpczoKCiAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKnJlc3VsdCA9IDAgOwogICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIHJlc3VsdCA9IChzdGQ6OnN0cmluZyAqKSAmKGFyZzEpLT5yZWZSZXR1cm4oKTsKCjIwMDktMDItMDg6IGJoeQogICAgICAgICAgICBDaGFuZ2UgdGhlIFNJWkUgbWFwcGVkIGJ5ICVweWJ1ZmZlcl9tdXRhYmxlX2JpbmFyeSBhbmQgJXB5YnVmZmVyX2JpbmFyeSBpbiBweWJ1ZmZlci5pIGZyb20KICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgYnVmZmVyIHRvIHRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGJ1ZmZlci4KCjIwMDktMDItMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlZmVhdHVyZSBub3Qgd29ya2luZyBmb3IgY29udmVyc2lvbiBvcGVyYXRvcnMsIHJlcG9ydGVkIGJ5IE1hdHQgU3ByYWd1ZSwgZm9yIGV4YW1wbGU6CgkgICAgICAlZmVhdHVyZSgiY3M6bWV0aG9kbW9kaWZpZXJzIikgb3BlcmF0b3IgYm9vbCAicHJvdGVjdGVkIjsKCjIwMDktMDItMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtNelNjaGVtZV0gQXBwbHkgIzIwODE5NjcgY29uZmlndXJlIGNoYW5nZXMgZm9yIGV4YW1wbGVzIHRvIGJ1aWxkIHdpdGggcmVjZW50IFBMVCB2ZXJzaW9ucy4KCSAgICBBbHNvIGZpeGVzIE1ha2VmaWxlIGVycm9ycyBidWlsZGluZyBTV0lHIGV4ZWN1dGFibGUgd2hlbiBtenNjaGVtZSBwYWNrYWdlIGlzIGluc3RhbGxlZCAKCSAgICAodmVyc2lvbiAzLjcyIGFwcHJveCBhbmQgbGF0ZXIpLgoKMjAwOS0wMi0wNDogdGFsYnkKICAgICAgICAgICAgW1BlcmxdIEZpeCBTRiMyNTY0MTkyIHJlcG9ydGVkIGJ5IERhdmlkIEtvbG92cmF0bmsuCiAgICAgICAgICAgIFNXSUdfQXNDaGFyUHRyQW5kU2l6ZSgpIG5vdyBoYW5kbGVzICJnZXQiIG1hZ2ljLgoKVmVyc2lvbiAxLjMuMzggKDMxIEphbnVhcnkgMjAwOSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjIwMDktMDEtMzE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU1MjQ4OCByZXBvcnRlZCBieSBHYWV0YW4gTGVobWFubi4gTm93ICVweXRob25wcmVwZW5kCiAgICAgICAgICAgIGFuZCAlcHl0aG9uYXBwZW5kIGhhdmUgY29ycmVjdCBpbmRlbnRhdGlvbi4KCjIwMDktMDEtMzE6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXggU0YjMjU1MjA0OCByZXBvcnRlZCBieSBHYWV0YW4gTGVobWFubi4gVGhlIHBhcmFtZXRlciBsaXN0CiAgICAgICAgICAgIG9mIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gaW4gZ2VuZXJhdGVkIHByb3h5IGNvZGUgc2hvdWxkIG5vdCBoYXZlIHRoZQogICAgICAgICAgICAnc2VsZicgcGFyYW1ldGVyLgoKMjAwOS0wMS0yOTogd3NmdWx0b24KCSAgICBGaXggcmVncmVzc2lvbiBpbnRyb2R1Y2VkIGluIDEuMy4zNyB3aGVyZSB0aGUgZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5CgkgICAgZm9yIHRhcmdldCBsYW5ndWFnZSBzcGVjaWZpYyBmaWxlcyAoaW4gdGhlIGFic2VuY2Ugb2YgLW91dGRpcikgd2FzIG5vCgkgICAgbG9uZ2VyIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB0aGUgZ2VuZXJhdGVkIGMvYysrIGZpbGUuCgoyMDA5LTAxLTI4OiB3c2Z1bHRvbgoJICAgIFtKYXZhLCBDI10gRml4IHByb3h5IGNsYXNzIG5vdCBiZWluZyB1c2VkIHdoZW4gdGhlIGdsb2JhbCBzY29wZSBvcGVyYXRvcgoJICAgIHdhcyB1c2VkIGZvciBwYXJhbWV0ZXJzIHBhc3NlZCBieSB2YWx1ZS4gUmVwb3J0ZWQgYnkgRGF2aWQgUGllcGdyYXNzLgoKMjAwOS0wMS0xNTogd3NmdWx0b24KCSAgICBbUGVybF0gRml4IHNlZyBmYXVsdCB3aGVuIHJ1bm5pbmcgd2l0aCAtdiBvcHRpb24sIHJlcG9ydGVkIGJ5IEpvaG4gS3kuCgpWZXJzaW9uIDEuMy4zNyAoMTMgSmFudWFyeSAyMDA5KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMjAwOS0wMS0xMzogbWdvc3NhZ2UKCSAgICBbTHVhXSBBZGRlZCBjb250cmFjdCBzdXBwb3J0IGZvciByZXF1aXJpbmcgdGhhdCB1bnNpZ25lZCBudW1iZXJzIGFyZSA+PTAKCSAgICBSZXdyb3RlIG11Y2ggb2YgRXhhbXBsZXMvTHVhL2VtYmVkMy4gCgkgICAgQWRkZWQgYSBsb3QgdG8gdGhlIEx1YSBkb2N1bWVudGF0aW9uLgoKMjAwOS0wMS0xMzogd3NmdWx0b24KCSAgICBGaXggY29tcGlsYXRpb24gZXJyb3Igd2hlbiB1c2luZyBkaXJlY3RvcnMgb24gcHJvdGVjdGVkIHZpcnR1YWwgb3ZlcmxvYWRlZCAKCSAgICBtZXRob2RzIHJlcG9ydGVkIGJ5IFNhbSBIZW5kbGV5LgoKMjAwOS0wMS0xMjogZHJqb2UKICAgICAgICAgICAgW1JdIEZpeGVkIGhhbmRsaW5nIG9mIGludGVnZXIgYXJyYXlzCgoyMDA5LTAxLTEwOiBkcmpvZQoJICAgIFtSXSBGaXggaW50ZWdlciBoYW5kbGluZyBpbiByIHRvIGRlYWwgY29ycmVjdGx5IHdpdGggc2lnbmVkCgkgICAgYW5kIHVuc2lnbmVkIGlzc3VlcwoKMjAwOS0wMS0xMDogd3NmdWx0b24KCSAgICBQYXRjaCAgIzE5OTI3NTYgZnJvbSBDb2xpbiBNY0RvbmFsZCAtICVjb250cmFjdCBub3Qgd29ya2luZyBmb3IgY2xhc3NlcyAKCSAgICBpbiBuYW1lc3BhY2UKCjIwMDktMDEtMDU6IG9sbHkKCSAgICBNYXJrIFNXSUdQRVJMNSwgU1dJR1BIUDUsIGFuZCBTV0lHVENMOCBhcyBkZXByZWNhdGVkIGluIHRoZSBzb3VyY2UKCSAgICBjb2RlIGFuZCByZW1vdmUgZG9jdW1lbnRhdGlvbiBvZiB0aGVtLgoKMjAwOC0xMi0zMDogd3NmdWx0b24KCSAgICBCdWcgIzI0MzA3NTYuIEFsbCB0aGUgbGFuZ3VhZ2VzIG5vdyBkZWZpbmUgYSBtYWNybyBpbiB0aGUgZ2VuZXJhdGVkIEMvQysrCgkgICAgd3JhcHBlciBmaWxlIGluZGljYXRpbmcgd2hpY2ggbGFuZ3VhZ2UgaXMgYmVpbmcgd3JhcHBlZC4gVGhlIG1hY3JvIG5hbWUgaXMgdGhlCgkgICAgc2FtZSBhcyB0aG9zZSBkZWZpbmVkIHdoZW4gU1dJRyBpcyBydW4sIGVnIFNXSUdKQVZBLCBTV0lHT0NUQVZFLCBTV0lHQ1NIQVJQIGV0YwoJICAgIGFuZCBhcmUgbGlzdGVkIGluIHRoZSAiQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24iIHNlY3Rpb24gaW4gdGhlIGRvY3VtZW50YXRpb24uCgoyMDA4LTEyLTIzOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggIzIxNTM3NzMgLSAlbm9qYXZhZXhjZXB0aW9uIHdhcyBjbGVhcmluZyB0aGUgZXhjZXB0aW9uIGZlYXR1cmUKICAgICAgICAgICAgaW5zdGVhZCBvZiBkaXNhYmxpbmcgaXQuIENsZWFyaW5nIGNoZWNrZWQgSmF2YSBleGNlcHRpb25zIGFsc28gZGlkbid0IHdvcmsuIAoJICAgIFRoZSBuZXcgJWNsZWFyamF2YWV4Y2VwdGlvbiBjYW4gYmUgdXNlZCBmb3IgY2xlYXJpbmcgdGhlIGV4Y2VwdGlvbiBmZWF0dXJlLgoKMjAwOC0xMi0yMjogd3NmdWx0b24KCSAgICBGaXggIzI0MzI4MDEgLSBNYWtlIFN3aWdWYWx1ZVdyYXBwZXIgZXhjZXB0aW9uIHNhZmUgZm9yIHdoZW4gY29weSBjb25zdHJ1Y3RvcnMKCSAgICB0aHJvdyBleGNlcHRpb25zLgoKMjAwOC0xMi0yMTogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMjQ0MDA0NiB3aGljaCBmaXhlcyBwb3NzaWJsZSBzZWcgZmF1bHRzIGZvciBtZW1iZXIgYW5kIGdsb2JhbAoJICAgIHZhcmlhYmxlIGNoYXIgYXJyYXlzIHdoZW4gdGhlIHN0cmluZ3MgYXJlIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgYXJyYXkgc2l6ZS4KCjIwMDgtMTItMjA6IHdzZnVsdG9uCgkgICAgVGhlIGNjYWNoZSBjb21waWxlciBjYWNoZSBoYXMgYmVlbiBhZGFwdGVkIHRvIHdvcmsgd2l0aCBTV0lHIGFuZAoJICAgIG5hbWVkIGNjYWNoZS1zd2lnLiBJdCBub3cgd29ya3Mgd2l0aCBDL0MrKyBjb21waWxlcnMgYXMgd2VsbCBhcyBTV0lHCgkgICAgYW5kIGNhbiByZXN1bHQgaW4gaW1wcmVzc2l2ZSBzcGVlZHVwcyB3aGVuIHVzZWQgdG8gcmVjb21waWxlIHVuY2hhbmdlZAoJICAgIGNvZGUgd2l0aCBlaXRoZXIgYSBDL0MrKyBjb21waWxlciBvciBTV0lHLiBEb2N1bWVudGF0aW9uIGlzIGluIENDYWNoZS5odG1sCgkgICAgb3IgdGhlIGluc3RhbGxlZCBjY2FjaGUtc3dpZyBtYW4gcGFnZS4KCjIwMDgtMTItMTI6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggZnJvbSBLYWx5YW5vdiBEbWl0cnkgd2hpY2ggZml4ZXMgcGFyc2luZyBvZiBuZXN0ZWQgc3RydWN0cwoJICAgIGNvbnRhaW5pbmcgY29tbWVudHMuCgoyMDA4LTEyLTEyOiB3c2Z1bHRvbgoJICAgIEZpeCBlcnJvciBtZXNzYWdlIGluIHNvbWUgbmVzdGVkIHN0cnVjdCBhbmQgJWlubGluZSBwYXJzaW5nIGVycm9yIHNpdHVhdGlvbnMKCSAgICBzdWNoIGFzIHVudGVybWluYXRlZCBzdHJpbmdzIGFuZCBjb21tZW50cy4KCjIwMDgtMTItMDc6IG9sbHkKCSAgICBbUEhQXSBGaXggd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgZ2VuZXJhdGVkIHdyYXBwZXIgd2l0aCBHQ0MgNC4zLgoKMjAwOC0xMi0wNjogd3NmdWx0b24KCSAgICBbUEhQXSBEZXByZWNhdGUgJXByYWdtYShwaHA0KS4gUGxlYXNlIHVzZSAlcHJhZ21hKHBocCkgaW5zdGVhZC4KCSAgICBUaGUgZm9sbG93aW5nIHR3byB3YXJuaW5ncyBoYXZlIGJlZW4gcmVuYW1lZDoKCSAgICBXQVJOX1BIUDRfTVVMVElQTEVfSU5IRVJJVEFOQ0UgLT4gV0FSTl9QSFBfTVVMVElQTEVfSU5IRVJJVEFOQ0UKCSAgICBXQVJOX1BIUDRfVU5LTk9XTl9QUkFHTUEgICAgICAgLT4gV0FSTl9QSFBfVU5LTk9XTl9QUkFHTUEKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMjAwOC0xMi0wNDogYmh5CiAgICAgICAgICAgIFtQeXRob25dIEFwcGxpZWQgcGF0Y2ggU0YjMjE1ODkzODogYWxsIHRoZSBTV0lHIHN5bWJvbCBuYW1lcyBzdGFydGVkIHdpdGggUHkKICAgICAgICAgICAgYXJlIGNoYW5nZWQsIHNpbmNlIHRoZXkgYXJlIGluYXBwcm9wcmlhdGUgYW5kIGRpc2NvdXJhZ2VkIGluIFB5dGhvbgogICAgICAgICAgICBkb2N1bWVudGF0aW9uIChmcm9tIGh0dHA6Ly93d3cucHl0aG9uLm9yZy9kb2MvMi41LjIvYXBpL2luY2x1ZGVzLmh0bWwpOgoKICAgICAgICAgICAgIkFsbCB1c2VyIHZpc2libGUgbmFtZXMgZGVmaW5lZCBieSBQeXRob24uaCAoZXhjZXB0IHRob3NlIGRlZmluZWQgYnkKICAgICAgICAgICAgdGhlIGluY2x1ZGVkIHN0YW5kYXJkIGhlYWRlcnMpIGhhdmUgb25lIG9mIHRoZSBwcmVmaXhlcyAiUHkiIG9yICJfUHkiLgogICAgICAgICAgICBOYW1lcyBiZWdpbm5pbmcgd2l0aCAiX1B5IiBhcmUgZm9yIGludGVybmFsIHVzZSBieSB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgZXh0ZW5zaW9uIHdyaXRlcnMuIFN0cnVjdHVyZSBtZW1iZXIgbmFtZXMgZG8KICAgICAgICAgICAgbm90IGhhdmUgYSByZXNlcnZlZCBwcmVmaXguCgogICAgICAgICAgICBJbXBvcnRhbnQ6IHVzZXIgY29kZSBzaG91bGQgbmV2ZXIgZGVmaW5lIG5hbWVzIHRoYXQgYmVnaW4gd2l0aCAiUHkiIG9yICJfUHkiLgogICAgICAgICAgICBUaGlzIGNvbmZ1c2VzIHRoZSByZWFkZXIsIGFuZCBqZW9wYXJkaXplcyB0aGUgcG9ydGFiaWxpdHkgb2YgdGhlIHVzZXIKICAgICAgICAgICAgY29kZSB0byBmdXR1cmUgUHl0aG9uIHZlcnNpb25zLCB3aGljaCBtYXkgZGVmaW5lIGFkZGl0aW9uYWwgbmFtZXMgYmVnaW5uaW5nCiAgICAgICAgICAgIHdpdGggb25lIG9mIHRoZXNlIHByZWZpeGVzLiIKCiAgICAgICAgICAgIEhlcmUgaXMgYSBicmllZiBsaXN0IG9mIHdoYXQgY2hhbmdlZDoKCiAgICAgICAgICAgICAgICBQeVN3aWcqIC0+IFN3aWdQeSoKICAgICAgICAgICAgICAgIFB5T2JqZWN0X3B0ciAtPiBTd2lnUHRyX1B5T2JqZWN0CiAgICAgICAgICAgICAgICBQeU9iamVjdF92YXIgLT4gU3dpZ1Zhcl9QeU9iamVjdAogICAgICAgICAgICAgICAgUHlTZXF1ZW5jZV9CYXNlLCBQeVNlcXVlbmNlX0NvbnQsIFB5U2VxdWVuY2VfUmVmIC0+CiAgICAgICAgICAgICAgICAgICAgICAgIFN3aWdQeVNlcXVlbmNlX0Jhc2UsIFN3aWdQeVNlcXVlbmNlX0NvbnQsIFN3aWdQeVNlcXVlbmNlX1JlZgogICAgICAgICAgICAgICAgUHlNYXAqIC0+IFN3aWdQeU1hcCoKCiAgICAgICAgICAgIFdlIHByb3ZpZGVkIGEgcHluYW1lX2NvbXBhdC5pIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiBVc2VycyB3aG9zZSBjb2RlIGhhdmluZwogICAgICAgICAgICB0aGVzZSBzeW1ib2xzIGFuZCBkbyBub3Qgd2FudCB0byBjaGFuZ2UgaXQgY291bGQgc2ltcGx5IGluY2x1ZGUgdGhpcyBmaWxlCiAgICAgICAgICAgIGF0IGZyb250IG9mIHlvdXIgY29kZS4gQSBiZXR0ZXIgc29sdXRpb24gaXMgdG8gcnVuIHRoZSBjb252ZXJ0aW5nIHRvb2wgb24KICAgICAgICAgICAgeW91ciBjb2RlLCB3aGljaCBoYXMgYmVlbiBwdXQgaW4gU1dJRydzIFNWTiB0cnVuayAoVG9vbHMvcHluYW1lX3BhdGNoLnB5KSBhbmQKICAgICAgICAgICAgeW91IGNhbiBkb3dubG9hZCBpdCBoZXJlOgogICAgICAgICAgICBodHRwczovL3N3aWcuc3ZuLnNvdXJjZWZvcmdlLm5ldC9zdm5yb290L3N3aWcvdHJ1bmsvVG9vbHMvcHluYW1lX3BhdGNoLnB5IAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoyMDA4LTEyLTAyOiB3c2Z1bHRvbgoJICAgIFtQeXRob25dIEFwcGx5IHBhdGNoICMyMTQzNzI3IGZyb20gU2VyZ2UgTW9ua2V3aXR6IHRvIGZpeCBpbXBvcnRpbmcgYmFzZSBjbGFzc2VzIAoJICAgIHdoZW4gdGhlIHBhY2thZ2Ugb3B0aW9uIGlzIHNwZWNpZmllZCBpbiAlbW9kdWxlIGFuZCB0aGF0IG1vZHVsZSBpcyAlaW1wb3J0J2VkLgoKMjAwOC0xMS0yODogd3NmdWx0b24KCSAgICBbVVRMXSBGaXggIzIwODA0OTcuIFNvbWUgaW5jb3JyZWN0IGFjY2VwdGFuY2Ugb2YgdHlwZXMgaW4gdGhlIFNUTCwgZWcgYSBkb3VibGUgKiBlbGVtZW50CgkgICAgcGFzc2VkIGludG8gYSB2ZWN0b3I8aW50ICo+IGNvbnN0cnVjdG9yIHdvdWxkIGJlIGFjY2VwdGVkLCBidXQgdGhlIGVuc3VpbmcgYmVoYXZpb3VyCgkgICAgd2FzIHVuZGVmaW5lZC4gTm93IHRoZSB0eXBlIGNvbnZlcnNpb24gY29ycmVjdGx5IHJhaXNlcyBhbiBleGNlcHRpb24uCgoyMDA4LTExLTI0OiB3c2Z1bHRvbgoJICAgIEFkZCAtb3V0Y3VycmVudGRpciBvcHRpb24uIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBvdXRwdXQgZGlyZWN0b3J5IHRvIHRoZSBjdXJyZW50IAoJICAgIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIHRoZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgaW5wdXQgZmlsZS4gVGhpcyBvcHRpb24gZW5hYmxlcwoJICAgIGJlaGF2aW91ciBzaW1pbGFyIHRvIGMvYysrIGNvbXBpbGVycy4gTm90ZSB0aGF0IHRoaXMgY29udHJvbHMgdGhlIG91dHB1dCBkaXJlY3RvcnksCgkgICAgYnV0IG9ubHkgaW4gdGhlIGFic2VuY2Ugb2YgdGhlIC1vIGFuZC9vciAtb3V0ZGlyIG9wdGlvbnMuCgoyMDA4LTExLTIzOiB3c2Z1bHRvbgoJICAgIFtydWJ5XSBBcHBseSBwYXRjaCAjMjI2Mzg1MCB0byBmaXggcnVieS9maWxlLmkgLi4uIHJ1Ynlpby5oIGZpbGVuYW1lIGNoYW5nZSBpbiAKCSAgICBydWJ5IDEuOS4KCjIwMDgtMTEtMjM6IHdzZnVsdG9uCgkgICAgQXBwbHkgcGF0Y2ggIzIzMTk3OTAgZnJvbSBKb2hhbiBIYWtlIHRvIGZpeCBzaGFyZWRfcHRyIHVzYWdlIGluIHN0ZDo6dHIxIG5hbWVzcGFjZS4KCjIwMDgtMTEtMjE6IHdzZnVsdG9uCgkgICAgVGhlIHVzZSBvZiB0aGUgaW5jbHVkZSBwYXRoIHRvIGZpbmQgdGhlIGlucHV0IGZpbGUgaXMgbm93IGRlcHJlY2F0ZWQuCgkgICAgVGhpcyBtYWtlcyB0aGUgYmVoYXZpb3VyIG9mIFNXSUcgdGhlIHNhbWUgYXMgQy9DKysgY29tcGlsZXJzIGluIHByZXBhcmF0aW9uCgkgICAgZm9yIHVzZSB3aXRoIGNjYWNoZS4KCjIwMDgtMTEtMTY6IHdzZnVsdG9uCgkgICAgRml4IC1ub3ByZXByb2Nlc3Mgb3B0aW9uIHRvOgoJICAgIC0gY29ycmVjdGx5IHJlcG9ydCBmaWxlIG5hbWVzIGluIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzLgoJICAgIC0gdXNlIHRoZSBvcmlnaW5hbCBpbnB1dCBmaWxlbmFtZSB0aGF0IGNyZWF0ZWQgdGhlIHByZXByb2Nlc3NlZCBvdXRwdXQgd2hlbiAKCSAgICAgIGRldGVybWluaW5nIHRoZSBDKysgd3JhcHBlciBmaWxlIG5hbWUgKGluIHRoZSBhYnNlbmNlIG9mIC1vKS4gUHJldmlvdXNseSAKCSAgICAgIHRoZSBuYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGNvbnRhaW5pbmcgdGhlIHByZXByb2Nlc3NlZCBvdXRwdXQgd2FzIHVzZWQuCgoyMDA4LTExLTExOiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBBZGQgcGF0Y2ggIzIxNTI2OTEgZnJvbSBNQVRTVVVSQSBUYWthbm9yaSB3aGljaCBmaXhlcyBjb21waWxlcyB1c2luZyB0aGUKCSAgICBJbnRlbCBjb21waWxlcgoKMjAwOC0xMS0wMTogd3NmdWx0b24KICAgICAgICAgICAgQWRkIHBhdGNoICMyMTI4MjQ5IGZyb20gQW5hdG9seSBUZWNodG9uaWsgd2hpY2ggY29ycmVjdHMgdGhlIEMvQysrIHByb3h5CiAgICAgICAgICAgIGNsYXNzIGJlaW5nIHJlcG9ydGVkIGZvciBQeXRob24gZG9jc3RyaW5ncyB3aGVuICVyZW5hbWUgaXMgdXNlZC4KCjIwMDgtMTEtMDE6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgc3RyaXAgZW5jb2RlciBwYXRjaCBmcm9tIEFuYXRvbHkgVGVjaHRvbmlrICMyMTMwMDE2LiBUaGlzIGVuYWJsZXMgYW4gCiAgICAgICAgICAgIGVhc3kgd2F5IHRvIHJlbmFtZSBzeW1ib2xzIGJ5IHN0cmlwcGluZyBhIGNvbW1vbmx5IHVzZWQgcHJlZml4IGluIGFsbCB0aGUKICAgICAgICAgICAgZnVuY3Rpb24vc3RydWN0IG5hbWVzLiBJdCB3b3JrcyBpbiB0aGUgc2FtZSB3YXkgYXMgdGhlIG90aGVyIGVuY29kZXJzLCBzdWNoIGFzCiAgICAgICAgICAgIHRpdGxlLCBsb3dlciwgY29tbWFuZCBldGMgb3V0bGluZWQgaW4gQ0hBTkdFUyBmaWxlIGRhdGVkIDEyLzMwLzIwMDUuIEV4YW1wbGUKICAgICAgICAgICAgYmVsb3cgd2lsbCByZW5hbWUgd3hBbm90aGVyV2lkZ2V0IHRvIEFub3RoZXJXaWRnZXQgYW5kIHd4RG9Tb21ldGhpbmcgdG8gCiAgICAgICAgICAgIERvU29tZXRoaW5nOgoKICAgICAgICAgICAgICAlcmVuYW1lKCIlKHN0cmlwOlt3eF0pcyIpICIiOyAKCiAgICAgICAgICAgICAgc3RydWN0IHd4QW5vdGhlcldpZGdldCB7CiAgICAgICAgICAgICAgICAgIHZvaWQgd3hEb1NvbWV0aGluZygpOwogICAgICAgICAgICAgIH07CgoyMDA4LTA5LTI2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgTG90cyBvZiB0ZXN0LXN1aXRlIHdvcmsuCgkgICAgLSBGaXggb3JkZXJpbmcgb2Ygd3JhcHBlciBvdXRwdXQgYW5kICV7ICV9IGhlYWRlciBvdXRwdXQuCgkgICAgLSBGaXggZGVjbGFyYXRpb25zIG9mIGxvY2FsIHZhcnMgaW4gQyB3cmFwcGVycy4KCSAgICAtIEZpeCBkZWNsYXJhdGlvbiBvZiBkZWZpbmVkIGNvbnN0YW50cyBpbiBDIHdyYXBwZXJzLgoJICAgIC0gRml4IGRlY2xhcmF0aW9uIG9mIEVudW1WYWx1ZXMgaW4gQyB3cmFwcGVycy4KCSAgICAtIGFkZCBzb21lIGNvbnN0IHR5cGVtYXBzIHRvIGFsbGVncm9jbC5zd2cKCSAgICAtIGFkZCByZW5hbWUgZm9yIG9wZXJhdG9yIGJvb2woKSBvdmVybG9hZHMuCgkKMjAwOC0wOS0yNTogb2xseQoJICAgIFtQSFA1XSBGaWxsIGluIHR5cGVtYXBzIGZvciBTV0lHVFlQRSBhbmQgdm9pZCAqIChTRiMyMDk1MTg2KS4KCjIwMDgtMDktMjI6IG11dGFuZGl6IChNaWtlbCBCYW5jcm9mdCkKCSAgICBbYWxsZWdyb2NsXQoJICAgIC0gU3VwcG9ydCB3cmFwcGluZyBvZiB0eXBlcyB3aG9zZSBkZWZpbml0aW9ucyBhcmUgbm90IHNlZW4gYnkKCSAgICBTV0lHLiBUaGV5IGFyZSB0cmVhdGVkIGFzIGZvcndhcmQtcmVmZXJlbmNlZCBjbGFzc2VzIGFuZCBpZiBhCgkgICAgZGVmaW5pdGlvbiBpcyBub3Qgc2VlbiBhcmUgdHJlYXRlZCBhcyAoKiA6dm9pZCkuCgkgICAgLSBEb24ndCB3cmFwIHRoZSBjb250ZW50cyBvZiB1bm5hbWVkIG5hbWVzcGFjZXMuCgkgICAgLSBNb3JlIGNvZGUgY2xlYW51cC4gUmVtb3ZlZCBzb21lIGV4dHJhbmVvdXMgd2FybmluZ3MuCgkgICAgLSBzdGFydCB3b3JrIG9uIGhhdmluZyB0aGUgYWxsZWdyb2NsIG1vZCBwYXNzIHRoZSBjcHAgdGVzdC1zdWl0ZS4KCjIwMDgtMDktMTk6IG9sbHkKCSAgICBbUEhQNV0gQWRkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZy4KCjIwMDgtMDktMTg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gQWRkZWQgQyMgYXJyYXkgdHlwZW1hcHMgcHJvdmlkZWQgYnkgQW50dGkgS2FyYW50YS4KICAgICAgICAgICAgVGhlIGFycmF5cyBwcm92aWRlIGEgd2F5IHRvIHVzZSBNYXJzaGFsQXMoVW5tYW5hZ2VkVHlwZS5MUEFycmF5KQogICAgICAgICAgICBhbmQgcGlubmluZyB0aGUgYXJyYXkgdXNpbmcgJ2ZpeGVkJy4gU2VlIGFycmF5c19jc2hhcnAuaSBsaWJyYXJ5IGZpbGUKICAgICAgICAgICAgZm9yIGRldGFpbHMuCgoyMDA4LTA5LTE4OiB3c2Z1bHRvbgoJICAgIERvY3VtZW50IHRoZSBvcHRpb25hbCBtb2R1bGUgYXR0cmlidXRlIGluIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZSwKICAgICAgICAgICAgc2VlIE1vZHVsZXMuaHRtbC4gQWRkIGEgd2FybmluZyBmb3IgUHl0aG9uIHdyYXBwZXJzIHdoZW4gdGhlCiAgICAgICAgICAgIG1vZHVsZSBuYW1lIGZvciBhbiBpbXBvcnRlZCBiYXNlIGNsYXNzIGlzIG1pc3NpbmcsIHJlcXVpcmluZyB0aGUKICAgICAgICAgICAgbW9kdWxlIGF0dHJpYnV0ZSB0byBiZSBhZGRlZCB0byAlaW1wb3J0LCBlZyAKCiAgICAgICAgICAgICAgJWltcG9ydChtb2R1bGU9IkZvb01vZHVsZSIpIGZvby5oCgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIENoYW5nZSB0aGUgZGVmYXVsdCBpbnB1dCB0eXBlbWFwIGZvciBjaGFyICogdG8gdHVybiBQSFAKCSAgICBOdWxsIGludG8gQyBOVUxMIChwcmV2aW91c2x5IGl0IHdhcyBjb252ZXJ0ZWQgdG8gYW4gZW1wdHkgc3RyaW5nKS4KCSAgICBUaGUgbmV3IGJlaGF2aW91ciBpcyBjb25zaXN0ZW50IHdpdGggaG93IHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dAoJICAgIHR5cGVtYXAgd29ya3MgKFNGIzIwMjU3MTkpLgoKCSAgICBJZiB5b3Ugd2FudCB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyLCBhZGQgdGhlIGZvbGxvd2luZyB0eXBlbWFwCgkgICAgdG8geW91ciBpbnRlcmZhY2UgZmlsZSAoUEhQJ3MgY29udmVydF90b19zdHJpbmdfZXgoKSBmdW5jdGlvbiBkb2VzCgkgICAgdGhlIGNvbnZlcnRpbmcgZnJvbSBQSFAgTnVsbCB0byBhbiBlbXB0eSBzdHJpbmcpOgoKCSAgICAldHlwZW1hcChpbikgY2hhciAqIHsKCQljb252ZXJ0X3RvX3N0cmluZ19leCgkaW5wdXQpOwoJCSQxID0gWl9TVFJWQUxfUFAoJGlucHV0KTsKCSAgICB9CgoyMDA4LTA5LTE4OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBleHRyYSBjb2RlIGFkZGVkIHRvIHByb3h5IGNsYXNzIGNvbnN0cnVjdG9ycyBpbiB0aGUgY2FzZQoJICAgIHdoZXJlIHRoZSBvbmx5IGNvbnN0cnVjdG9yIHRha2VzIG5vIGFyZ3VtZW50cy4KCjIwMDgtMDktMTg6IG9sbHkKCSAgICBbUEhQNV0gRml4IHdyYXBwaW5nIG9mIGEgcmVuYW1lZCBlbnVtZXJhdGVkIHZhbHVlIG9mIGFuIGVudW0gY2xhc3MKCSAgICBtZW1iZXIgKFNGIzIwOTUyNzMpLgoKMjAwOC0wOS0xNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgLSBGaXggaG93IGZvcndhcmQgcmVmZXJlbmNlIHR5cGVkZWZzIGFyZSBoYW5kbGVkLCBzbyBhcyBub3QgdG8gY29uZmxpY3QKCSAgICB3aXRoIG90aGVyIGxlZ2l0IHR5cGVkZWZzLgoJICAgIC0gRG9uJ3QgKGZvciBub3cpIHBlcmZvcm0gYW4gZmZpdHlwZSB0eXBlbWFwIGxvb2t1cCB3aGVuIHRyeWluZyB0bwoJICAgIHdoZW4gY2FsbGluZyBjb21wb3NlX2ZvcmVpZ25fdHlwZSgpLiBUaGlzIGlzIGFjdHVhbGx5IGEgdXNlZnVsIHRoaW5nCgkgICAgdG8gZG8gaW4gY2VydGFpbiBjYXNlcywgdGhlIHRlc3QgY2FzZXMgZm9yIHdoaWNoIEkgY2FuJ3QgY3VycmVudGx5CgkgICAgbG9jYXRlIDovLiBJdCdzIGJyZWFraW5nIHNvbWUgd3JhcHBpbmcgYmVoYXZpb3IgdGhhdCBpcyBtb3JlIGNvbW1vbmx5CgkgICAgc2VlbiwgaG93ZXZlci4gSSdsbCByZWFkZCBpbiBhIG1vcmUgYXBwcm9wcmlhdGUgd2F5IHdoZW4gSSBjYW4KCSAgICByZWNyZWF0ZSB0aGUgbmVlZGVkIHRlc3QgY2FzZSwgb3IgYSB1c2VyIGNvbXBsYWlucyAod2hpY2ggbWVhbnMKCSAgICB0aGV5IHByb2JhYmx5IGhhdmUgYSB0ZXN0IGNhc2UpLgoJICAgIC0gZG9jdW1lbnQgdGhlIC1pc29sYXRlIGNvbW1hbmQtbGluZSBhcmcgaW4gdGhlICdzd2lnIC1oZWxwJyBvdXRwdXQuCgkgICAgSXQgd2FzIGluIHRoZSBodG1sIGRvY3MsIGJ1dCBub3QgdGhlcmUuCgkgICAgLSBzbWFsbCBhbW91bnQgb2YgY29kZSBjbGVhbnVwLCByZW1vdmVkIHNvbWUgdW51c2VkIGNvZGUuCgkgICAgLSBzb21lIG1pbm9yIGFlc3RoZXRpYyBjaGFuZ2VzLgoKMjAwOC0wOS0xMjogYmh5CiAgICAgICAgICAgIFtQeXRob25dIFB5dGhvbiAzLjAgc3VwcG9ydCBicmFuY2ggbWVyZ2VkIGludG8gU1dJRyB0cnVuay4gVGhhbmtzIHRvCiAgICAgICAgICAgIEdvb2dsZSBTdW1tZXIgb2YgQ29kZSAyMDA4IGZvciBzdXBwb3J0aW5nIHRoaXMgcHJvamVjdCEgQnkgZGVmYXVsdAogICAgICAgICAgICBTV0lHIHdpbGwgZ2VuZXJhdGUgaW50ZXJmYWNlIGZpbGVzIGNvbXBhdGlibGUgd2l0aCBib3RoIFB5dGhvbiAyLngKICAgICAgICAgICAgYW5kIDMuMC4gQW5kIHRoZXJlJ3MgYWxzbyBzb21lIFB5dGhvbiAzIG5ldyBmZWF0dXJlcyB0aGF0IGNhbiBiZQogICAgICAgICAgICBlbmFibGVkIGJ5IHBhc3NpbmcgYSAiLXB5MyIgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBTV0lHLiBUaGVzZQogICAgICAgICAgICBmZWF0dXJlcyBhcmU6CgogICAgICAgICAgICAgIC0gRnVuY3Rpb24gYW5ub3RhdGlvbiBzdXBwb3J0CiAgICAgICAgICAgICAgICAgIEFsc28sIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiBwcm94eSBmdW5jdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCwKICAgICAgICAgICAgICAgICAgZXZlbiB3aXRob3V0IHRoZSAiLXB5MyIgb3B0aW9uLiBIb3dldmVyLCB0aGUgcGFyYW1ldGVyIGxpc3QKICAgICAgICAgICAgICAgICAgd2lsbCBmYWxsYmFjayB0byAqYXJncyBpZiB0aGUgZnVuY3Rpb24gKG9yIG1ldGhvZCkgaXMgb3ZlcmxvYWRlZC4KICAgICAgICAgICAgICAtIEJ1ZmZlciBpbnRlcmZhY2Ugc3VwcG9ydAogICAgICAgICAgICAgIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBzdXBwb3J0CgogICAgICAgICAgICBGb3IgZGV0YWlscyBvZiBQeXRob24gMyBzdXBwb3J0IGFuZCB0aGVzZSBmZWF0dXJlcywgcGxlYXNlIHNlZSB0aGUKICAgICAgICAgICAgIlB5dGhvbiAzIFN1cHBvcnQiIHNlY3Rpb24gaW4gdGhlICJTV0lHIGFuZCBQeXRob24iIGNoYXB0ZXIgb2YgdGhlIFNXSUcKICAgICAgICAgICAgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSAiLWFwcGx5IiBjb21tYW5kIGxpbmUgb3B0aW9uIGFuZCBzdXBwb3J0IG9mIGdlbmVyYXRpbmcgY29kZXMKICAgICAgICAgICAgdXNpbmcgYXBwbHkoKSBpcyByZW1vdmVkLiBTaW5jZSB0aGlzIGlzIG9ubHkgcmVxdWlyZWQgYnkgdmVyeSBvbGQKICAgICAgICAgICAgUHl0aG9uLgoKICAgICAgICAgICAgVGhpcyBtZXJnZSBhbHNvIHBhdGNoZWQgU1dJRydzIHBhcnNlciB0byBzb2x2ZSBhIGJ1Zy4gQnkgdGhpcyBwYXRjaCwKICAgICAgICAgICAgU1dJRyBmZWF0dXJlcyBhYmxlIHRvIGJlIGNvcnJlY3RseSBhcHBsaWVkIG9uIEMrKyBjb252ZXJzaW9uIG9wZXJhdG9yLAogICAgICAgICAgICBzdWNoIGxpa2UgdGhpczoKICAgICAgICAgICAgICAKICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikgICo6Om9wZXJhdG9yIGJvb2wgJXsgLi4uICV9CgoyMDA4LTA5LTAyOiByaWNoYXJkYgoJICAgIFtQeXRob25dIENvbW1pdCBwYXRjaCAjMjA4OTE0OTogRGlyZWN0b3IgZXhjZXB0aW9uIGhhbmRsaW5nIG1hbmdsZXMKCSAgICByZXR1cm5lZCBleGNlcHRpb24uICBFeGNlcHRpb25zIHJhaXNlZCBieSBQeXRob24gY29kZSBpbiBkaXJlY3RvcnMKCSAgICBhcmUgbm93IHBhc3NlZCB0aHJvdWdoIHRvIHRoZSBjYWxsZXIgd2l0aG91dCBjaGFuZ2UuICBBbHNvLCByZW1vdmUKCSAgICB0aGUgIjogIiBwcmVmaXggd2hpY2ggdXNlZCB0byBiZSBhZGRlZCB0byBvdGhlciBkaXJlY3RvciBleGNlcHRpb25zCgkgICAgKGVnLCB0aG9zZSBkdWUgdG8gaW5jb3JyZWN0IHJldHVybiB0eXBlcykuCgoyMDA4LTA5LTAyOiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBDb21taXQgcGF0Y2ggIzE5ODgyOTYgR0NJdGVtIG11bHRpcGxlIG1vZHVsZSBsaW5raW5nIGlzc3VlIHdoZW4gdXNpbmcgCiAgICAgICAgICAgIGRpcmVjdG9ycy4KCjIwMDgtMDktMDI6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgJ3VzaW5nJyBhbmQgJ2ZpeGVkJyBibG9ja3MgaW4gdGhlICdjc2luJyB0eXBlbWFwIGlzIG5vdwogICAgICAgICAgICBwb3NzaWJsZSB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlIHByZSBhdHRyaWJ1dGUgYW5kIHRoZSBuZXcgdGVybWluYXRvciBhdHRyaWJ1dGUsIGVnCgogICAgICAgICAgICAgICV0eXBlbWFwKGNzaW4sIAogICAgICAgICAgICAgICAgICAgICAgIHByZT0iICAgIHVzaW5nIChDRGF0ZSB0ZW1wJGNzaW5wdXQgPSBuZXcgQ0RhdGUoJGNzaW5wdXQpKSB7IiwKICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdG9yPSIgICAgfSAvLyB0ZXJtaW5hdGUgdGVtcCRjc2lucHV0IHVzaW5nIGJsb2NrIiwKICAgICAgICAgICAgICAgICAgICAgICkgY29uc3QgQ0RhdGUgJgogICAgICAgICAgICAgICAgICAgICAgICIkY3NjbGFzc25hbWUuZ2V0Q1B0cih0ZW1wJGNzaW5wdXQpIgoKICAgICAgICAgICAgU2VlIENTaGFycC5odG1sIGZvciBtb3JlIGluZm8uCgoyMDA4LTA5LTAxOiB3c2Z1bHRvbgogICAgICAgICAgICBbQ0ZGSV0gQ29tbWl0IHBhdGNoICMyMDc5MzgxIHN1Ym1pdHRlZCBieSBCb3JpcyBTbWlsZ2EgLSBjb25zdGFudCBleHBycyBwdXQgaW50byAKICAgICAgICAgICAgbm8tZXZhbCBjb250ZXh0IGluIERFRkNFTlVNCgoyMDA4LTA4LTAyOiB3dXp6ZWIKICAgICAgICAgICAgW0NoaWNrZW4sQWxsZWdyb10gQ29tbWl0IFBhdGNoIDIwMTkzMTQKICAgICAgICAgICAgRml4ZXMgYSBidWlsZCBlcnJvciBpbiBjaGlja2VuLCBhbmQgc2V2ZXJhbCBidWlsZCBlcnJvcnMgYW5kIG90aGVyIGVycm9ycwogICAgICAgICAgICBpbiBBbGxlZ3JvIENMCgoyMDA4LTA3LTE5OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVpbGRpbmcgb2YgVGNsIGV4YW1wbGVzL3Rlc3Qtc3VpdGUgb24gTWFjIE9TIFggcmVwb3J0ZWQgYnkgR2lkZW9uIFNpbXBzb24uCgoyMDA4LTA3LTE3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggU0YgIzIwMTkxNTYgQ29uZmlndXJpbmcgd2l0aCAtLXdpdGhvdXQtb2N0YXZlIG9yIC0td2l0aG91dC1hbGxsYW5nCiAgICAgICAgICAgIGRpZCBub3QgZGlzYWJsZSBvY3RhdmUuCgoyMDA4LTA3LTE0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBkaXJlY3RvciB0eXBlbWFwcyBmb3IgcG9pbnRlcnMgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSBjb3JyZWN0bHkgCiAgICAgICAgICAgIG1hcnNoYWxsZWQgdG8gQyMvSmF2YSBudWxsIGluIGRpcmVjdG9yIG1ldGhvZHMuCgoyMDA4LTA3LTA0OiBvbGx5CgkgICAgW1BIUF0gRm9yIHN0ZF92ZWN0b3IuaSBhbmQgc3RkX21hcC5pLCByZW5hbWUgZW1wdHkoKSB0byBpc19lbXB0eSgpCgkgICAgc2luY2UgImVtcHR5IiBpcyBhIFBIUCByZXNlcnZlZCB3b3JkLiAgQmFzZWQgb24gcGF0Y2ggZnJvbSBNYXJrIEtsZWluCgkgICAgaW4gU0YjMTk0MzQxNy4KCjIwMDgtMDctMDQ6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItbWFrZSIgaGFzIGJlZW4gcmVtb3ZlZC4gIAoJICAgIFNlYXJjaGVzIG9uIEdvb2dsZSBjb2Rlc2VhcmNoIHN1Z2dlc3QgdGhhdCBub2JvZHkgaXMgdXNpbmcgaXQgbm93CgkgICAgYW55d2F5LgoKMjAwOC0wNy0wNDogb2xseQoJICAgIFtQSFBdIFRoZSBTV0lHIGNkYXRhLmkgbGlicmFyeSBtb2R1bGUgaXMgbm93IHN1cHBvcnRlZC4KCjIwMDgtMDctMDM6IG9sbHkKCSAgICBbUEhQXSBUaGUgZGVwcmVjYXRlZCBjb21tYW5kIGxpbmUgb3B0aW9uICItcGhwZnVsbCIgaGFzIGJlZW4KCSAgICByZW1vdmVkLiAgV2UgcmVjb21tZW5kIGJ1aWxkaW5nIHlvdXIgZXh0ZW5zaW9uIGFzIGEgZHluYW1pY2FsbHkKCSAgICBsb2FkYWJsZSBtb2R1bGUuCgoyMDA4LTA3LTAyOiBvbGx5CgkgICAgW1BIUDRdIFN1cHBvcnQgZm9yIFBIUDQgaGFzIGJlZW4gcmVtb3ZlZC4gIFRoZSBQSFAgZGV2ZWxvcGVycyBhcmUKCSAgICBubyBsb25nZXIgbWFraW5nIG5ldyBQSFA0IHJlbGVhc2VzLCBhbmQgd29uJ3QgZXZlbiBiZSBwcm92aWRpbmcKCSAgICBwYXRjaGVzIGZvciBjcml0aWNhbCBzZWN1cml0eSBpc3N1ZXMgYWZ0ZXIgMjAwOC0wOC0wOC4KCjIwMDgtMDctMDI6IG9sbHkKCSAgICBbUHl0aG9uXSBJbXBvcnQgdGhlIEMgZXh0ZW5zaW9uIGRpZmZlcmVudGx5IGZvciBQeXRob24gMi42IGFuZAoJICAgIGxhdGVyIHNvIHRoYXQgYW4gaW1wbGljaXQgcmVsYXRpdmUgaW1wb3J0IGRvZXNuJ3QgcHJvZHVjZSBhCgkgICAgZGVwcmVjYXRpb24gd2FybmluZyBmb3IgMi42IGFuZCBhIGZhaWx1cmUgZm9yIDIuNyBhbmQgbGF0ZXIuCgkgICAgUGF0Y2ggZnJvbSBSaWNoYXJkIEJvdWx0b24gaW4gU0YjMjAwODIyOSwgcGx1cyBmb2xsb3ctdXAgcGF0Y2hlcwoJICAgIGZyb20gUmljaGFyZCBhbmQgSGFveXUgQmFpLgoKVmVyc2lvbiAxLjMuMzYgKDI0IEp1bmUgMjAwOCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA2LzI0LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFJlbW92ZSBkZXByZWNhdGVkIC1jIGNvbW1hbmRsaW5lIG9wdGlvbiAocnVudGltZSBsaWJyYXJ5IGdlbmVyYXRpb24pLgoKMDYvMjQvMjAwODogb2xseQoJICAgIFtQSFBdIEZpeCBhc3NlcnRpb24gZmFpbHVyZSB3aGVuIGhhbmRsaW5nICV0eXBlbWFwKGluLG51bWlucHV0cz0wKQoJICAgICh0ZXN0Y2FzZSBpZ25vcmVfcGFyYW1ldGVyKS4KCjA2LzI0LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggc2VnZmF1bHQgd2hlbiB3cmFwcGluZyBhIG5vbi1jbGFzcyBmdW5jdGlvbiBtYXJrZWQgd2l0aAoJICAgICVuZXdvYmplY3QgKHRlc3RjYXNlIGNoYXJfc3RyaW5ncykuCgowNi8yMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIGEgd2F5IHRvIHVzZSBBdHRhY2hDdXJyZW50VGhyZWFkQXNEYWVtb24gaW5zdGVhZCBvZiBBdHRhY2hDdXJyZW50VGhyZWFkCiAgICAgICAgICAgIGluIGRpcmVjdG9yIGNvZGUuIERlZmluZSB0aGUgU1dJR19KQVZBX0FUVEFDSF9DVVJSRU5UX1RIUkVBRF9BU19EQUVNT04gbWFjcm8sIHNlZQogICAgICAgICAgICBMaWIvamF2YS9kaXJlY3Rvci5zd2cuCgowNi8yMS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGNyYXNoaW5nIGluIHRoZSBTVEwgd3JhcHBlcnMgKHJlamVjdCEgYW5kIGRlbGV0ZV9pZiBtZXRob2RzKQoKMDYvMTkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBDIyBhbmQgSmF2YSBrZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgaW5zdGVhZCBvZiBqdXN0IGlzc3VpbmcgYSB3YXJuaW5nCiAgICAgICAgICAgIGFuZCB0aGVuIGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIGNvZGUuIFdhcm5pbmcgMzE0IGdpdmVzIHRoZSBuZXcgbmFtZSB3aGVuIGEgCiAgICAgICAgICAgIGtleXdvcmQgaXMgZm91bmQuCgowNi8xOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gS2V5d29yZCBoYW5kbGluZyBhZGRlZC4gUiBLZXl3b3JkcyB3aWxsIGJlIHJlbmFtZWQgYXMgbmVjZXNzYXJ5LgogICAgICAgICAgICBXYXJuaW5nIDMxNCBnaXZlcyB0aGUgbmV3IG5hbWUgd2hlbiBhIGtleXdvcmQgaXMgZm91bmQuCgowNi8xNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIGJvb2wmIGFuZCBib29sKi4gQWRkZWQgcnVudGVzdCBmb3IgbGlfdHlwZW1hcHMgdGVzdGNhc2UuCiAgICAgICAgICAgIChCdWcgIzE5MzgxNDIpCgowNi8wNy8yMDA4OiBiaHkKICAgICAgICAgICAgQWRkZWQgdGVzdCBjYXNlIGtleXdvcmRfcmVuYW1lLCB0aGVuIG1hZGUgdGhlIGtleXdvcmQgcmVuYW1pbmcgd29ya3MgcHJvcGVybHkKICAgICAgICAgICAgYnkgZml4aW5nIFN3aWdfbmFtZV9tYWtlKCkgZm9yIGEgaW5jb21wbGV0ZSBjb25kaXRpb24gY2hlY2tpbmcuCgowNi8wMi8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeCBlbnVtIHdyYXBwZXJzIHdoZW4gdXNpbmcgLW5vcHJveHkuCgowNS8zMC8yMDA4OiBiaHkKICAgICAgICAgICAgQWRkZWQgc3RkOjp3c3RyaW5nIGludG8gTGliL3R5cGVtYXBzL3ByaW10eXBlcy5zd2csIHNpbmNlIGl0IGlzIGFsc28gYSBwcmltaXRpdmUgCiAgICAgICAgICAgIHR5cGUgaW4gU1dJRyAtIGZpeGVkIFNGICMxOTc2OTc4LgoKMDUvMjkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggdmFyaWFibGUgd3JhcHBlcnMgd2hlbiB1c2luZyAtbm9wcm94eS4KCjA1LzI5LzIwMDg6IGJoeQogICAgICAgICAgICBbUHl0aG9uXSBGaXhlZCBhIHR5cG8gb2YgJSNpZmRlZiBpbiBMaWIvcHl0aG9uL3B5Y29udGFpbmVyLnN3Zywgd2hpY2ggaXMgcmVsYXRlZCAKICAgICAgICAgICAgdG8gLWV4dHJhbmF0aXZlIFNXSUcgb3B0aW9uIC0gU0YgIzE5NzE5NzcuCgowNS8yMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgcGFydGlhbGNoZWNrIG1ha2VmaWxlIHRhcmdldHMgZm9yIHBhcnRpYWwgdGVzdGluZyBvZiB0aGUgdGVzdC1zdWl0ZS4gVGhlc2UKICAgICAgICAgICAganVzdCBpbnZva2UgU1dJRywgaWUgbm8gY29tcGlsYXRpb24gYW5kIG5vIHJ1bnRpbWUgdGVzdGluZy4gSXQgY2FuIGJlIGZhc3RlcgogICAgICAgICAgICB3aGVuIGRldmVsb3BpbmcgYnkganVzdCBkb2luZyBhIGRpcmVjdG9yeSBkaWZmIG9mIHRoZSBmaWxlcyBTV0lHIGdlbmVyYXRlcwogICAgICAgICAgICBhZ2FpbnN0IHRob3NlIGZyb20gYSBwcmV2aW91cyBydW4uIEV4YW1wbGUgdXNhZ2UgZnJvbSB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeToKCiAgICAgICAgICAgICAgbWFrZSBwYXJ0aWFsY2hlY2stdGVzdC1zdWl0ZQogICAgICAgICAgICAgIG1ha2UgcGFydGlhbGNoZWNrLWphdmEtdGVzdC1zdWl0ZQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmNvbXBhc3NlcyBtb3JlIGZsZXhpYmlsaXR5IGluIHJ1bm5pbmcgdGhlIHRlc3Qtc3VpdGUsIGVnCiAgICAgICAgICAgIGl0IGlzIHBvc3NpYmxlIHRvIHByZWZpeCB0aGUgY29tbWFuZCBsaW5lIHdoaWNoIHJ1bnMgYW55IHRhcmdldCBsYW5ndWFnZSB0ZXN0CiAgICAgICAgICAgIHdpdGggYSB0b29sLiBTZWUgdGhlIFJVTlRPT0wsIENPTVBJTEVUT09MIGFuZCBTV0lHVE9PTCB0YXJnZXRzIGluIHRoZSBjb21tb24ubWsKICAgICAgICAgICAgZmlsZSBhbmQgbWFrZWZpbGVzIGluIHRoZSB0ZXN0LXN1aXRlIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUgaXQgaXMgcG9zc2libGUgdG8gCiAgICAgICAgICAgIHJ1biB0aGUgcnVudGltZSB0ZXN0cyB0aHJvdWdoIHZhbGdyaW5kIHVzaW5nOgoKICAgICAgICAgICAgICBtYWtlIGNoZWNrIFJVTlRPT0w9InZhbGdyaW5kIC0tbGVhay1jaGVjaz1mdWxsIgoKICAgICAgICAgICAgb3IgaW52b2tlIFNXSUcgdW5kZXIgdmFsZ3JpbmQgdXNpbmc6CgogICAgICAgICAgICAgIG1ha2UgY2hlY2sgU1dJR1RPT0w9InZhbGdyaW5kIC0tdG9vbD1tZW1jaGVjayIKCjA1LzE5LzIwMDg6IGRyam9lCiAgICAgICAgICAgIFtSXSBGaXhlZCBkZWZpbmUgdGhhdCB3YXMgYnJlYWtpbmcgcHJlLTIuNy4gIENoZWNrZWQgaW4KICAgICAgICAgICAgcGF0Y2ggZnJvbSBTb3JlbiBTb25uZW5idXJnIHRoYXQgY3JlYXRlcyBzdHJpbmdzIGluICAKCSAgICB2ZXJzaW9uIGluZGVwZW5kZW50IHdheQoKMDUvMTUvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB2YXJpYWJsZSBuYW1lIGNsYXNoIGluIGRpcmVjdG9ycyAtIFNGICMxOTYzMzE2IHJlcG9ydGVkIGJ5IFRyaXN0YW4uCgowNS8xNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGQgYW4gb3B0aW1pc2F0aW9uIGZvciBmdW5jdGlvbnMgdGhhdCByZXR1cm4gb2JqZWN0cyBieSB2YWx1ZSwgcmVkdWNpbmcKICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjb3BpZXMgb2YgdGhlIG9iamVjdCB0aGF0IGFyZSBtYWRlLiBJbXBsZW1lbnRlZCB1c2luZyBhbgogICAgICAgICAgICBvcHRpb25hbCBhdHRyaWJ1dGUgaW4gdGhlICJvdXQiIHR5cGVtYXAgY2FsbGVkICJvcHRpbWFsIi4gRGV0YWlscyBpbiAKICAgICAgICAgICAgVHlwZW1hcHMuaHRtbC4KCjA1LzExLzIwMDg6IG9sbHkKCSAgICBbUEhQXSBDaGVjayBmb3IgJWZlYXR1cmUoIm5vdGFic3RyYWN0Iikgd2hlbiBnZW5lcmF0aW5nIFBIUDUgY2xhc3MKCSAgICB3cmFwcGVyLgoKMDUvMTEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IFNGICMxOTQzNjA4IC0gJHNlbGYgc3Vic3RpdHV0aW9uIGluICVjb250cmFjdCwgcGF0Y2ggc3VibWl0dGVkIGJ5CiAgICAgICAgICAgIFRvb24gVmVyc3RyYWVsZW4uCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gRml4IGNoYXIgKiB0eXBlbWFwcyB0byB3b3JrIHdoZW4gYXBwbGllZCB0byBzaWduZWQgY2hhciAqIGFuZAoJICAgIHVuc2lnbmVkIGNoYXIgKiAodW5jb3ZlcmVkIGJ5IHRlc3RjYXNlIGFwcGx5X3N0cmluZ3MpLgoKMDUvMDkvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIGNoYXIgKiBtZW1iZXIgdmFyaWFibGVzIHdoZW4gdXNpbmcgYWxscHJvdGVjdGVkIG1vZGUuCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBXYXJyZW4gV2FuZy4KCjA1LzA5LzIwMDg6IG9sbHkKCSAgICBbUEhQXSBGaXggYmFkIFBIUCBjb2RlIGdlbmVyYXRlZCB3aGVuIHdyYXBwaW5nIGFuIGVudW0gaW4gYQoJICAgIG5hbWVzcGFjZSAodW5jb3ZlcmVkIGJ5IHRlc3RjYXNlIGFycmF5c19zY29wZSkuCgowNS8wOS8yMDA4OiBvbGx5CgkgICAgW1BIUF0gU1dJRyBub3cgcnVucyB0aGUgUEhQIHRlc3RzdWl0ZSB1c2luZyBQSFA1LCBub3QgUEhQNC4gIFBIUDQKCSAgICBpcyBlc3NlbnRpYWxseSBvYnNvbGV0ZSBub3csIHNvIHdlIGNhcmUgbXVjaCBtb3JlIGFib3V0IHNvbGlkIFBIUDUKCSAgICBzdXBwb3J0LgoKMDUvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgU1RMIGZpeGVzIHdoZW4gdXNpbmcgJWltcG9ydCByYXRoZXIgdGhhbiAlaW5jbHVkZSBhbmQgdGhlIFNvbGFyaXMgV29ya3Nob3AKICAgICAgICAgICAgY29tcGlsZXIgYW5kIHRoZSBSb2d1ZXdhdmUgU1RMLgoKMDUvMDcvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHdyYXBwaW5nIG9mIG92ZXJsb2FkZWQgcHJvdGVjdGVkIG1ldGhvZHMgd2hlbiB1c2luZyBhbGxwcm90ZWN0ZWQgbW9kZS4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IFdhcnJlbiBXYW5nLgoKMDUvMDMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQ29tbWl0IHBhdGNoICMxOTU2NjA3IHRvIGFkZCAtTVQgc3VwcG9ydCBmcm9tIFJpY2hhcmQgQm91bHRvbi4KICAgICAgICAgICAgVGhpcyBwYXRjaCBtaXJyb3JzIHRoZSBnY2MgLU1UIG9wdGlvbiB3aGljaCBhbGxvd3Mgb25lIHRvIGNoYW5nZSB0aGUgZGVmYXVsdAogICAgICAgICAgICBNYWtlZmlsZSB0YXJnZXQgYmVpbmcgZ2VuZXJhdGVkIHdoZW4gZ2VuZXJhdGluZyBtYWtlZmlsZXMgd2l0aCB0aGUgLU0gZmFtaWx5CiAgICAgICAgICAgIG9mIG9wdGlvbnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAkIHN3aWcgLWphdmEgLU1NIC1NVCBvdmVycmlkZGVubmFtZSAtYysrICBleGFtcGxlLmkKICAgICAgICAgICAgICBvdmVycmlkZGVubmFtZTogXAogICAgICAgICAgICAgICBleGFtcGxlLmkgXAogICAgICAgICAgICAgICBleGFtcGxlLmggCgowNC8zMC8yMDA4OiBtZ29zc2FnZQoJICAgIFtMdWFdIFJlbW92ZWQgZ2VuZXJhdGlvbiBvZiBfd3JhcF9kZWxldGVfWFhYWFggKHdyYXBwZXJlZCBkZXN0cnVjdG9yKQoJICAgIHdoaWNoIHdhcyB1bnVzZWQgYW5kIGNhdXNpbmcgd2FybmluZyB3aXRoIGcrKyAtV2FsbC4KCSAgICBSZW1vdmVkIG90aGVyIHVudXNlZCB3YXJuaW5nIGluIHR5cGVtYXBzLmkgYW5kIG90aGVyIHBsYWNlcy4KCSAgICBBZGRlZCBFeGFtcGxlcy9sdWEvZW1iZWQzLCBhbmQgcnVuIHRlc3RzIGEgZmV3IHRlc3QgY2FzZXMuCgowNC8yNC8yMDA4OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGdlbmVyYXRlZCBjb2RlIGZvciBJQk0ncyBDKysgY29tcGlsZXIgb24gQUlYIChwYXRjaAoJICAgIGZyb20gR29lcmFuIFVkZGVib3JnIGluIFNGIzE5MjgwNDgpLgoKMDQvMjQvMjAwODogb2xseQoJICAgIFJlbmFtZSBCU0laRSBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL2FycmF5c19zY29wZS5pIHRvIEJCU0laRSB0bwoJICAgIGF2b2lkIGEgY2xhc2ggd2l0aCBCU0laRSBkZWZpbmVkIGJ5IGhlYWRlcnMgb24gQUlYIHdpdGggUGVybAoJICAgIChyZXBvcnRlZCBpbiBTRiMxOTI4MDQ4KS4KCjA0LzIwLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZCB0aGUgYWJpbGl0eSB0byB3cmFwIGFsbCBwcm90ZWN0ZWQgbWVtYmVycyB3aGVuIHVzaW5nIGRpcmVjdG9ycy4KICAgICAgICAgICAgUHJldmlvdXNseSBvbmx5IHRoZSB2aXJ0dWFsIG1ldGhvZHMgd2VyZSBhdmFpbGFibGUgdG8gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgTm93IGFsbCBwcm90ZWN0ZWQgbWVtYmVycywgKHN0YXRpYyBhbmQgbm9uLXN0YXRpYyB2YXJpYWJsZXMsIG5vbi12aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZXRob2RzKSBhcmUgd3JhcHBlZCB3aGVuIHVzaW5nIHRoZSBhbGxwcm90ZWN0ZWQgbW9kZS4gVGhlIGFsbHByb3RlY3RlZAogICAgICAgICAgICBtb2RlIGlzIHR1cm5lZCBvbiBpbiB0aGUgbW9kdWxlIGRlY2xhcmF0aW9uOgoKICAgICAgICAgICAgICAlbW9kdWxlKGRpcmVjdG9ycz0iMSIsIGFsbHByb3RlY3RlZD0iMSIpIG1vZHVsZW5hbWUKClZlcnNpb24gMS4zLjM1ICg3IEFwcmlsIDIwMDgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowNC8wNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBBZGQgbWlzc2luZyBwb2ludGVyIHJlZmVyZW5jZSB0eXBlbWFwcwoKMDQvMDYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IHN0YWNrIG92ZXJmbG93IHdoZW4gdXNpbmcgdHlwZW1hcCB3YXJuaW5nIHN1cHByZXNzaW9uLCBlZyAKICAgICAgICAgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9UWVBFTUFQX0NIQVJMRUFLX01TRykKCjA0LzA1LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIEZpeCBzaGFyZWRfcHRyIHR5cGVtYXBzIHNvIHRoYXQgJXB5dGhvbm5vbmR5bmFtaWMgY2FuIGJlIHVzZWQuIEFsc28gY29ycmVjdHMKICAgICAgICAgICAgZGlzcGxheSBvZiB0aGUgcHJveHkgY2xhc3MgdHlwZS4gUmVwb3J0ZWQgYnkgUm9iZXJ0IEx1cHRvbi4KCjA0LzA0LzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBBZGQgJW5ld29iamVjdCByZWZlcmVuY2UgdG8gcHl0aG9uIG1lbW9yeSBtYW5hZ2VtZW50IHN1YnNlY3Rpb24gb2YgbWFudWFsCgkgICAgKHBhdGNoIGZyb20gbWRiZWFjaHkgaW4gU0YjMTg5NDYxMCkuCgowMy8yNy8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBGaXggc2hhcmVkX3B0ciB0eXBlbWFwcyB3aGVyZSB0aGUgcG9pbnRlciB0eXBlIGlzIGEgdGVtcGxhdGVkIHR5cGUgd2l0aAogICAgICAgICAgICB3aXRoIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyLiBSZXBvcnRlZCBieSBSb2JlcnQgTHVwdG9uLgoKMDMvMjcvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgYSB0eXBlbWFwIERJU09XTiBmb3IgU1dJR1RZUEUqIGFuZCBTV0lHVFlQRVtdLCBhbmQgc3VwcG9ydCBmb3IgJWRlbG9iamVjdCBmZWF0dXJlLgogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9sdWEvb3duZXIgd2hpY2ggZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIG1lbW9yeSBtYW5hZ2VtZW50LgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEFwcGx5IHBhdGNoICMxODQ0MzAxIGZyb20gTW9udHkgVGF5bG9yIHRvIHN1cHByZXNzIGVudW0gY29uc3RydWN0b3IKICAgICAgICAgICAgdW51c2VkIHdhcm5pbmdzLgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzE5MjQ1MjQgZnJvbSBDYXNleSBSYXltb25kc29uIHdoaWNoIGVuc3VyZXMgdGhlCiAgICAgICAgICAgICJObyBjb25zdHJ1Y3RvciBkZWZpbmVkIiBtZXNzYWdlIGlzIGRpc3BsYXllZCB3aGVuIGF0dGVtcHRpbmcgdG8gY2FsbCBhCiAgICAgICAgICAgIGNvbnN0cnVjdG9yIG9uIGEgY2xhc3MgdGhhdCBkb2Vzbid0IGhhdmUgYSBjb25zdHJ1Y3RvciB3cmFwcGVyLCBlZyBpZgogICAgICAgICAgICB0aGUgQysrIGNsYXNzIGlzIGFic3RyYWN0LgoKMDMvMjYvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gQXBwbHkgcGF0Y2ggIzE5MjU3MDIgZnJvbSBDYXNleSBSYXltb25kc29uIHdoaWNoIHJlbW92ZXMgd2FybmluZyA1MTIKICAgICAgICAgICAgZm9yIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLgoKMDMvMjYvMjAwODogb2xseQoJICAgIFtQeXRob25dIEFwcGx5IEdDQyA0LjMgd2FybmluZ3MgcGF0Y2ggZnJvbSBQaGlsaXBwIFRob21hcwoJICAgIChTRiMxOTI1MTIyKS4KCjAzLzIxLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFRocmVhZCBzYWZldHkgcGF0Y2ggZm9yIFNUTCBpdGVyYXRvcnMgZnJvbSBBYmhpbmFuZGFuIEphaW4uCgowMy8xNy8yMDA4OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCAlbHVhY29kZSBmZWF0dXJlIHRvIGFkZCBzb3VyY2UgY29kZSBpbnRvIHdyYXBwZXJzLgogICAgICAgICAgICBVcGRhdGVkIGRvY3VtZW50YXRpb24gdG8gZG9jdW1lbnQgdGhpcy4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2FycmF5cyB0byBzaG93IGl0cyB1c2UgKGFuZCB0eXBlbWFwcykKCjAzLzE3LzIwMDg6IG9sbHkKCSAgICBGaXggbm9ucG9ydGFibGUgc2VkIHVzYWdlIHdoaWNoIGZhaWxlZCBvbiBNYWMgT1MgWCAoYW5kIHByb2JhYmx5CgkgICAgb3RoZXIgcGxhdGZvcm1zKS4gIEZpeGVzIFNGIzE5MDM2MTIuCgowMy8xNy8yMDA4OiBvbGx5CgkgICAgRml4IG1lbW9yeSBsZWFrIGluIFNXSUcncyBwYXJzZXIgKGJhc2VkIG9uIHBhdGNoIGZyb20gUnVzc2VsbAoJICAgIEJyeWFudCBpbiBTRiMxOTE0MDIzKS4KCjAzLzEyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBidWcgIzE4NzgyODUgLSB1bm5lY2Vzc2FyeSBjYXN0IGZvciBDIHN0cnVjdCBjcmVhdGlvbiB3cmFwcGVycy4KCjAzLzEyLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQeXRob25dIFJlbW92ZSBkZWJ1Z2dpbmcgaW5mbyB3aGVuIHVzaW5nIHNoYXJlZF9wdHIgc3VwcG9ydAoKMDMvMDYvMjAwODogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gVXBkYXRlZCBkb2N1bWVudGF0aW9uIGZvciBMdWEgZXhjZXB0aW9ucy4KICAgICAgICAgICAgQWRkZWQgRXhhbXBsZXMvbHVhL2V4Y2VwdGlvbiBhbmQgRXhhbXBsZXMvbHVhL2VtYmVkMi4KICAgICAgICAgICAgU21hbGwgdXBkYXRlcyB0byB0aGUgdHlwZW1hcHMuCgowMy8wNC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEFkZCBjaGFyIComIHR5cGVtYXBzLgoKMDMvMDQvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgRml4IG9jY2FzaW9uYWwgc2VnIGZhdWx0IHdoZW4gYXR0ZW1wdGluZyB0byByZXBvcnQgb3ZlcmxvYWRlZCBtZXRob2RzIGFzIGJlaW5nIGlnbm9yZWQuCgowMi8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4ICMxOTA0NTM3IFN3aWcgY2F1c2VzIGEgUGVybCB3YXJuaW5nICJ4IHVzZWQgb25seSBvbmNlIiBpbiBQZXJsIDUuMTAKICAgICAgICAgICAgcmVwb3J0ZWQgYnkgQXJpIEpvbG1hCgowMi8yOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgc2hhcmVkX3B0ciB2YXJpbi92YXJvdXQgdHlwZW1hcHMgZm9yIHdyYXBwaW5nIGdsb2JhbCB2YXJpYWJsZXMuCgowMi8yNS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggJHdyYXBuYW1lIHRvIHdvcmsgaW4gJWV4Y2VwdGlvbiAoZml4ZXMgc29tZSB3cmFwOm5hbWUgYXNzZXJ0aW9ucykKClZlcnNpb24gMS4zLjM0ICgyNyBGZWJydWFyeSAyMDA4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAyLzEzLzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSXSBGaXggd3JhcHBpbmcgb2YgZ2xvYmFsIGZ1bmN0aW9uIHBvaW50ZXIgdmFyaWFibGVzLgoKMDIvMTMvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBmb3IgdXNlIHdpdGhpbiAlZXhjZXB0aW9uOgogICAgICAgICAgICAgICR3cmFwbmFtZSAtIGxhbmd1YWdlIHNwZWNpZmljIHdyYXBwZXIgbmFtZQogICAgICAgICAgICAgICRvdmVybmFtZSAtIGlmIGEgbWV0aG9kIGlzIG92ZXJsb2FkZWQgdGhpcyBjb250YWlucyB0aGUgZXh0cmEgbWFuZ2xpbmcgdXNlZCBvbiAKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3ZlcmxvYWRlZCBtZXRob2QKICAgICAgICAgICAgICAkZGVjbCAgICAgLSB0aGUgZnVsbHkgcXVhbGlmaWVkIEMvQysrIGRlY2xhcmF0aW9uIG9mIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZCAKICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRob3V0IHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgICAgICRmdWxsZGVjbCAtIHRoZSBmdWxseSBxdWFsaWZpZWQgQy9DKysgZGVjbGFyYXRpb24gb2YgdGhlIG1ldGhvZCBiZWluZyB3cmFwcGVkIAogICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGluZyB0aGUgcmV0dXJuIHR5cGUKCjAyLzEyLzIwMDg6IGRyam9lCiAgICAgICAgICAgIFtSXSBOb3cgc2V0dGluZyBTNCBmbGFnIGluIFNXSUcgY3JlYXRlZCBvYmplY3RzLiAgVGhpcwogICAgICAgICAgICBmaXhlcyBSLVNXSUcgZm9yIDIuNiBhbmQgd2FybmluZyBmb3IgMi42IGZhaWx1cmUgaGFzIGJlZW4gcmVtb3ZlZC4KCjAyLzExLzIwMDg6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIGEgcGF0Y2ggYnkgVG9yc3RlbiBMYW5kc2Nob2ZmIHRvIGZpeCB0aGUgdW5hcnkgbWludXMgaXNzdWUKICAgICAgICAgICAgUmFuICdhc3R5bGUgLS1zdHlsZT1rciAtMicgYWNyb3NzIGx1YS5jeHggdG8gbmVhdGVuIGl0IHVwCgowMi8xMC8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBCdW1wIFNXSUdfUlVOVElNRV9WRVJTSU9OIHRvIDQuIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgcmVjZW50bHkgaW50cm9kdWNlZCBBUEkgCiAgICAgICAgICAgIGNoYW5nZSBpbiB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMsIGllIGNoYW5nZSBpbiBkZWZpbml0aW9uIG9mIHN3aWdfY29udmVydGVyX2Z1bmMuCiAgICAgICAgICAgIEFueW9uZSBjYWxsaW5nIFNXSUdfVHlwZUNhc3QgbXVzdCBwYXNzIGluIGEgdmFsaWQgdmFsdWUgZm9yIHRoZSBuZXcgYWRkaXRpb25hbAogICAgICAgICAgICAodGhpcmQpIHBhcmFtZXRlciBhbmQgdGhlbiBoYW5kbGUgdGhlIG5ld2x5IGNyZWF0ZWQgbWVtb3J5IGlmIHRoZSByZXR1cm5lZCB2YWx1ZQogICAgICAgICAgICBpcyBzZXQgdG8gU1dJR19DQVNUX05FV19NRU1PUlkgZWxzZSBhIG1lbW9yeSBsZWFrIHdpbGwgZW5zdWUuCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBFeHBlcmltZW50YWwgc2hhcmVkX3B0ciB0eXBlbWFwcyBhZGRlZC4gVXNhZ2UgaXMgdGhlIHNhbWUgYXMgdGhlIHJlY2VudGx5CiAgICAgICAgICAgIGFkZGVkIEphdmEgYW5kIEMjIHNoYXJlZF9wdHIgdHlwZW1hcHMuIFR3byBtYWNyb3MgYXJlIGF2YWlsYWJsZSwgYWx0aG91Z2ggdGhlc2UKICAgICAgICAgICAgbWF5IHdlbGwgY2hhbmdlIGluIGEgZnV0dXJlIHZlcnNpb246CgogICAgICAgICAgICBGb3IgYmFzZSBjbGFzc2VzIG9yIGNsYXNzZXMgbm90IGluIGFuIGluaGVyaXRhbmNlIGNoYWluOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUihQUk9YWUNMQVNTLCBUWVBFKQogICAgICAgICAgICBGb3IgZGVyaXZlZCBjbGFzc2VzOgogICAgICAgICAgICAgIFNXSUdfU0hBUkVEX1BUUl9ERVJJVkVEKFBST1hZQ0xBU1MsIEJBU0VDTEFTU1RZUEUsIFRZUEUpCgogICAgICAgICAgICBUaGUgUFJPWFlDTEFTUyBpcyB0aGUgbmFtZSBvZiB0aGUgcHJveHkgY2xhc3MsIGJ1dCBpcyBvbmx5IHJlcXVpcmVkIGZvciBKYXZhL0MjLgogICAgICAgICAgICBFeGFtcGxlIHVzYWdlOgoKICAgICAgICAgICAgICAlaW5jbHVkZSAiYm9vc3Rfc2hhcmVkX3B0ci5pIgoKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFIoS2xhc3MsIFNwYWNlOjpLbGFzcykKICAgICAgICAgICAgICBTV0lHX1NIQVJFRF9QVFJfREVSSVZFRChLbGFzc0Rlcml2ZWQsIFNwYWNlOjpLbGFzcywgU3BhY2U6OktsYXNzRGVyaXZlZCkKCiAgICAgICAgICAgICAgbmFtZXNwYWNlIFNwYWNlIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBLbGFzcyB7IC4uLiB9OwogICAgICAgICAgICAgICAgc3RydWN0IEtsYXNzRGVyaXZlZCA6IEtsYXNzIHsgLi4uIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgRnVydGhlciBkZXRhaWxzIHRvIGZvbGxvdyBpbiBmdXR1cmUgZG9jdW1lbnRhdGlvbiwgYnV0IHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMKICAgICAgICAgICAgc2hvdWxkIGJlIG5vdGVkOgoKICAgICAgICAgICAgLSBOb3QgcmVzdHJpY3RlZCB0byBib29zdDo6c2hhcmVkX3B0ciwgZWcgc3RkOjp0cjE6OnNoYXJlZF9wdHIgY2FuIGFsc28gYmUgdXNlZC4KICAgICAgICAgICAgLSBBdmFpbGFibGUgdHlwZW1hcCBncm91cHM6CiAgICAgICAgICAgICAgKGEpIFR5cGVtYXBzIGZvciBzaGFyZWRfcHRyIHBhc3NlZCBieSB2YWx1ZSwgcmVmZXJlbmNlLCBwb2ludGVyIGFuZCBwb2ludGVyIAogICAgICAgICAgICAgICAgICByZWZlcmVuY2UuCiAgICAgICAgICAgIC0gKGIpIFR5cGVtYXBzIGZvciBwYXNzaW5nIGJ5IHJhdyB2YWx1ZSwgcmF3IHBvaW50ZXIsIHJhdyByZWZlcmVuY2UsIHJhdyBwb2ludGVyCiAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS4gCiAgICAgICAgICAgIC0gVGhlIGNvZGUgYmVpbmcgd3JhcHBlZCBkb2VzIG5vdCBldmVuIGhhdmUgdG8gdXNlIHNoYXJlZF9wdHIsIFNXSUcgY2FuIHVzZQogICAgICAgICAgICAgIHNoYXJlZF9wdHIgYXMgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBtZWNoYW5pc20gaW5zdGVhZCBvZiBhIHJhdyBwb2ludGVyIGR1ZSB0byAKICAgICAgICAgICAgICB0aGUgdHlwZW1hcHMgaW4gZ3JvdXAgKGIpIGFib3ZlLgogICAgICAgICAgICAtIE5vIGFycmF5IHN1cHBvcnQgYXMgc2hhcmVkX3B0ciBkb2VzIG5vdCBzdXBwb3J0IGFycmF5cy4KICAgICAgICAgICAgLSBUaGlzIHdvcmtzIHF1aXRlIGRpZmZlcmVudGx5IHRvIHRoZSB1c3VhbCBTV0lHIHNtYXJ0IHBvaW50ZXIgc3VwcG9ydCB3aGVuCiAgICAgICAgICAgICAgb3BlcmF0b3ItPiBpcyBwYXJzZWQgYnkgU1dJRzoKICAgICAgICAgICAgICAtIEFuIGFkZGl0aW9uYWwgc21hcnQgcG9pbnRlciBjbGFzcyBpcyBub3QgZ2VuZXJhdGVkIHJlZHVjaW5nIGNvZGUgYmxvYXQgaW4KICAgICAgICAgICAgICAgIHRoZSB3cmFwcGVycy4KICAgICAgICAgICAgICAtIFVzaW5nIHNtYXJ0IHBvaW50ZXJzIGFuZCByYXcgcG9pbnRlcnMgY2FuIGJlIG1peGVkIHNlYW1sZXNzbHkuCiAgICAgICAgICAgICAgLSBNaXNzaW5nIGNvbnN0cnVjdG9ycyBmb3IgdGhlIHNtYXJ0IHBvaW50ZXJzIGlzIG5vIGxvbmdlciBhIHByb2JsZW0gYW5kIHNvCiAgICAgICAgICAgICAgICBzZXBhcmF0ZSBmYWN0b3J5IHR5cGUgZnVuY3Rpb25zIGRvIG5vdCBoYXZlIHRvIGJlIHdyaXR0ZW4gYW5kIHdyYXBwZWQuCiAgICAgICAgICAgICAgLSBUaGUgaW1wbGljaXQgQysrIHNoYXJlZF9wdHI8IGRlcml2ZWQgY2xhc3MgPiB0byBzaGFyZWRfcHRyPCBiYXNlIGNsYXNzID4KICAgICAgICAgICAgICAgIGNhc3QgYWxzbyB3b3JrcyBpbiB0aGUgdGFyZ2V0IGxhbmd1YWdlLiBUaGlzIG5lZ2F0ZXMgdGhlIG5lY2Vzc2l0eSB0byB3cml0ZQogICAgICAgICAgICAgICAgYW4gZXhwbGljaXQgaGVscGVyIGNhc3QgZnVuY3Rpb24gcHJvdmlkaW5nIHRoZSB1cGNhc3Qgd2hpY2ggd291bGQgbmVlZAogICAgICAgICAgICAgICAgY2FsbGluZyBwcmlvciB0byBwYXNzaW5nIGEgZGVyaXZlZCBjbGFzcyB0byBhIG1ldGhvZCB0YWtpbmcgYSBzaGFyZWRfcHRyIHRvCiAgICAgICAgICAgICAgICBhIGJhc2UgY2xhc3MuCgowMi8wOS8yMDA4OiB3c2Z1bHRvbgogICAgICAgICAgICBbUHl0aG9uXSBBZGQgc3VwcG9ydCBmb3Igb3ZlcnJpZGluZyB0aGUgY2xhc3MgcmVnaXN0cmF0aW9uIGZ1bmN0aW9uIHZpYSBhIG5ldwogICAgICAgICAgICAic21hcnRwdHIiIGZlYXR1cmUuIFRoaXMgaXMgYSB2ZXJ5IGxvdyBsZXZlbCBvZiBjdXN0b21pc2F0aW9uIG1vc3QgdXNlcnMKICAgICAgICAgICAgd291bGQgbmV2ZXIgbmVlZCB0byBrbm93LiBUaGUgZmVhdHVyZSB3aWxsIHR5cGljYWxseSBiZSB1c2VkIGZvciBpbnRydXNpdmUgCiAgICAgICAgICAgIHNtYXJ0IHBvaW50ZXJzIGFsb25nIHdpdGggYWRkaXRpb25hbCB0eXBlbWFwcy4gRXhhbXBsZSB1c2FnZSBvZiB0aGUgZmVhdHVyZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoInNtYXJ0cHRyIiwgbm9ibG9jaz0xKSBGb28geyBib29zdDo6c2hhcmVkX3B0cjwgRm9vID4gfQogICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKCiAgICAgICAgICAgIFRoZSBnZW5lcmF0ZWQgRm9vX3N3aWdyZWdpc3RlciBmdW5jdGlvbiB3aWxsIHRoZW4gcmVnaXN0ZXIgYm9vc3Q6OnNoYXJlZCA8IEZvbyA+CiAgICAgICAgICAgIChTV0lHVFlQRV9wX2Jvb3N0X19zaGFyZWRfcHRyVEZvb190IGluc3RlYWQgb2YgU1dJR1RZUEVfcF9Gb28pIGFzIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAgIHR5cGUgZm9yIGluc3RhbnRpYXRpb25zIG9mIEZvby4KCjAyLzA5LzIwMDg6IHdzZnVsdG9uCiAgICAgICAgICAgIEZlYXR1cmVzIG5vdyBzdXBwb3J0cyB0aGUgb3B0aW9uYWwgJ25vYmxvY2snIGF0dHJpYnV0ZSBmb3IgYWxsIHVzYWdlIG9mICVmZWF0dXJlLiAKICAgICAgICAgICAgV2hlbiBzcGVjaWZpZWQsIHRoZSB7IH0gYnJhY2VzIGFyZSByZW1vdmVkIGZyb20gdGhlIGZlYXR1cmUgY29kZS4gVGhpcyBpcyBpZGVudGljYWwKICAgICAgICAgICAgaW4gYmVoYXZpb3VyIHRvIHVzYWdlIG9mICdub2Jsb2NrJyBpbiB0eXBlbWFwcyBhbmQgaXMgdXNlZCB3aGVuIHRoZSBwcmVwcm9jZXNzb3IKICAgICAgICAgICAgaXMgcmVxdWlyZWQgdG8gb3BlcmF0ZSBvbiB0aGUgY29kZSBpbiB0aGUgZmVhdHVyZSBhbmQgdGhlIGVuY2xvc2luZyB7IH0gYnJhY2VzCiAgICAgICAgICAgIGFyZSBub3QgcmVxdWlyZWQuIEV4YW1wbGU6CgogICAgICAgICAgICAgICNkZWZpbmUgRk9PIGZvbwogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIsIG5vYmxvY2s9IjEiKSB7IEZPTzo6YmFyIH0KCiAgICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3IgdGhlbiByZWR1Y2VzIHRoaXMgYXMgaWYgdGhpcyBoYWQgYmVlbiB1c2VkIGluc3RlYWQ6CgogICAgICAgICAgICAgICVmZWF0dXJlKCJzbWFydHB0ciIpICJmb286OmJhciIKCjAyLzAxLzIwMDg6IG9sbHkKCSAgICBbUHl0aG9uXSBGaXggZm9ybWF0IHN0cmluZyBidWcgKFNGIzE4ODIyMjApLgoKMDEvMzEvMjAwODogd3NmdWx0b24KICAgICAgICAgICAgQWRkaXRpb25zIHRvIHRoZSAldHlwZXMgZGlyZWN0aXZlLiBOb3cgdGhlIGNvbnZlcnNpb24gLyBjYXN0aW5nIGNvZGUgY2FuIGJlCiAgICAgICAgICAgIG92ZXJyaWRkZW4gdG8gc29tZSBjdXN0b20gY29kZSBpbiB0aGUgJXR5cGVzIGRpcmVjdGl2ZSwgbGlrZSBzbzoKCiAgICAgICAgICAgICAgJXR5cGVzKGZyb210eXBlID0gdG90eXBlKSAlewogICAgICAgICAgICAgICAgLi4uIGNvZGUgdG8gY29udmVydCBmcm9tdHlwZSB0byB0b3R5cGUgYW5kIHJldHVybiAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIHNwZWNpYWwgdmFyaWFibGUgJGZyb20gd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIG9mIHRoZQogICAgICAgICAgICB0eXBlIGJlaW5nIGNvbnZlcnRlZCBmcm9tLiBUaGUgY29kZSBtdXN0IHJldHVybiB0aGUgdG90eXBlIGNhc3QgdG8gdm9pZCAqLiBFeGFtcGxlOgoKICAgICAgICAgICAgICBjbGFzcyBUaW1lOwogICAgICAgICAgICAgIGNsYXNzIERhdGU7CiAgICAgICAgICAgICAgRGF0ZSAmVGltZTo6ZGF0ZUZyb21UaW1lKCk7CgogICAgICAgICAgICAgICV0eXBlcyhUaW1lID0gRGF0ZSkgJXsKICAgICAgICAgICAgICAgIFRpbWUgKnQgPSAoVGltZSAqKSRmcm9tOwogICAgICAgICAgICAgICAgRGF0ZSAmZCA9IHQtPmRhdGVGcm9tVGltZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuICh2b2lkICopICZkOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICByZXN1bHRpbmcgaW4gdGhlIGNvbnZlcnNpb24gLyBjYXN0aW5nIGNvZGUgbG9va2luZyBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgICAgICAgc3RhdGljIHZvaWQgKl9wX1RpbWVUb19wX0RhdGUodm9pZCAqeCkgewogICAgICAgICAgICAgICAgVGltZSAqdCA9IChUaW1lICopeDsKICAgICAgICAgICAgICAgIERhdGUgJmQgPSB0LT5kYXRlRnJvbVRpbWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiAodm9pZCAqKSAmZDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGlzIGFkdmFuY2VkIHVzYWdlLCBwbGVhc2UgdXNlIG9ubHkgaWYgeW91IHVuZGVyc3RhbmQgdGhlIHJ1bnRpbWUgdHlwZSBzeXN0ZW0uCgowMS8zMC8yMDA4OiBtZ29zc2FnZQoJICAgIFNtYWxsIHVwZGF0ZSB0byBkb2N1bWVudGF0aW9uIGluIFR5cGVtYXBzLmh0bWwsIHRvIHdhcm4gYWJvdXQgdXNlIG9mIGxvY2FsIAoJICAgIHZhcmlhYmxlcyBpbiB0eXBlbWFwcyBmb3IgbXVsdGlwbGUgdHlwZXMuCgowMS8yNS8yMDA4OiB3c2Z1bHRvbgoJICAgIFtKYXZhXSBGaXggYnVnIHJlcG9ydGVkIGJ5IEtldmluIE1pbGxzIGluIEFSUkFZU09GQ0xBU1NFUyB0eXBlbWFwcyB3aGVyZSBhbnkKICAgICAgICAgICAgY2hhbmdlcyBtYWRlIHRvIGFuIGFycmF5IGVsZW1lbnQgcGFzc2VkIGZyb20gSmF2YSB0byBDIGFyZSBub3QgcmVmbGVjdGVkIGJhY2sKICAgICAgICAgICAgaW50byBKYXZhLgoKMDEvMjQvMjAwODogbWdvc3NhZ2UKCSAgICBNb3JlIHVwZGF0ZXMgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yIGRldGVjdGluZyBsdWEuCgkgICAgQWxzbyBsb29rcyBpbiAvdXNyL2luY2x1ZGUvbHVhKgoJICAgIEFsc28gY2hhbmdlZCB0eXBlbWFwcy5pIG5vdCB0byBjaGVjayBmb3IgTlVMTCBiZWZvcmUgZnJlZWluZyBhIHBvaW50ZXIKCjAxLzIxLzIwMDg6IHdzZnVsdG9uCgkgICAgW1B5dGhvbl0gRm9yIFNUTCBjb250YWluZXJzLCBTV0lHIG5vIGxvbmdlciBhdHRlbXB0cyB0byBjb252ZXJ0IGZyb20gb25lCiAgICAgICAgICAgIFNUTCBjb250YWluZXIgdG8gYW5vdGhlciwgZWcgZnJvbSBzdGQ6OnZlY3RvcjxpbnQ+IHRvIHN0ZDo6dmVjdG9yPGRvdWJsZT4KICAgICAgICAgICAgb3Igc3RkOjpsaXN0PGludD4gdG8gc3RkOjp2ZWN0b3I8aW50PiBvciBldmVuIHN0ZDo6dmVjdG9yPEZvbz4gdG8KICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QmFyPiBhcyBpdCBwcmV2aW91c2x5IGRpZC4gSW4gZmFjdCBTV0lHIG5vIGxvbmdlciBhdHRlbXB0cyB0bwogICAgICAgICAgICBjb252ZXJ0IGFueSBTV0lHIHdyYXBwZWQgQysrIHByb3h5IGNsYXNzIHRoYXQgaXMgYWxzbyBhIFB5dGhvbiBzZXF1ZW5jZSwKICAgICAgICAgICAgd2hlcmVhcyBwcmV2aW91c2x5IGl0IHdvdWxkLiBBbnkgbm9uLVNXSUcgUHl0aG9uIHNlcXVlbmNlIHdpbGwgc3RpbGwgYmUKICAgICAgICAgICAgYWNjZXB0ZWQgd2hlcmV2ZXIgYW4gU1RMIGNvbnRhaW5lciBpcyBhY2NlcHRlZC4gT3ZlcmxvYWRlZCBtZXRob2RzIHVzaW5nCiAgICAgICAgICAgIGNvbnRhaW5lcnMgc2hvdWxkIGJlIGZhc3Rlci4KCjAxLzE4LzIwMDg6IHdzZnVsdG9uCgkgICAgW0MjXSBBZGQgJ2RpcmVjdG9yaW5hdHRyaWJ1dGVzJyBhbmQgJ2RpcmVjdG9yb3V0YXR0cmlidXRlcycgdHlwZW1hcCBhdHRyaWJ1dGVzCiAgICAgICAgICAgIGZvciB0aGUgaW10eXBlIHR5cGVtYXAuIFRoZXNlIHNob3VsZCBjb250YWluIEMjIGF0dHJpYnV0ZXMgd2hpY2ggd2lsbAogICAgICAgICAgICBiZSBnZW5lcmF0ZWQgaW50byB0aGUgQyMgZGlyZWN0b3IgZGVsZWdhdGUgbWV0aG9kcy4KCjAxLzE4LzIwMDg6IG9sbHkKCSAgICBGaXggaGFuZGxpbmcgb2YgYnl0ZSB2YWx1ZSAyNTUgaW4gaW5wdXQgZmlsZXMgb24gcGxhdGZvcm1zIHdoZXJlCgkgICAgY2hhciBpcyBzaWduZWQgKGl0IHdhcyBnZXR0aW5nIG1hcHBlZCB0byBFT0YpLiAgRml4ZXMgU0YjMTUxODIxOS4KCjAxLzE2LzIwMDg6IHdzZnVsdG9uCgkgICAgRml4IHRlbXBsYXRlIG1lbWJlciB2YXJpYWJsZXMgd3JhcHBlZCBieSBhIHNtYXJ0IHBvaW50ZXIuIEJ1ZyByZXBvcnRlZCAKICAgICAgICAgICAgYnkgUm9iZXJ0IEx1cHRvbi4KCjAxLzE0LzIwMDg6IG1nb3NzYWdlCgkgICAgU3Vic3RhbnRpYWwgY2hhbmdlcyB0byBjb25maWd1cmUgc2NyaXB0IGZvciBkZXRlY3RpbmcgbHVhLgoJICAgICAgQ29kZSBjYW4gbm93IGxpbmsgdG8gbGlibHVhLmEsIGxpYmx1YTUwLmEgb3IgbGlibHVhNTEuYQoJICAgICAgSXQncyBhbHNvIGEgbG90IG5lYXRlciBub3cuCgoxMi8xNi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBCYWNrZWQgb3V0ICMxNzk4NzI4IC0gbnVtYmVycyBjYW4gYmUgcGFzc2VkIHRvIGZ1bmN0aW9ucyB0YWtpbmcgY2hhciAqCgoxMi8xNi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTgzMjYxMyAtIFRlbXBsYXRlcyBhbmQgc29tZSB0eXBlZGVmcyBpbnZvbHZpbmcgcG9pbnRlcnMgb3IgZnVuY3Rpb24gcG9pbnRlcnMKCjEyLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEZpeCAjMTYzMjYyNSAtIENvbXBpbGF0aW9uIGVycm9ycyBvbiBWaXN1YWwgQysrIDYgd2hlbiB1c2luZyBkaXJlY3RvcnMuCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIFtQZXJsXSBGaXggIzE3OTg3MjggLSBudW1iZXJzIGNhbiBiZSBwYXNzZWQgdG8gZnVuY3Rpb25zIHRha2luZyBjaGFyICouCgoxMi8xMi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTgxOTg0NyAldGVtcGxhdGUgd2l0aCBqdXN0IG9uZSBkZWZhdWx0IHRlbXBsYXRlIHBhcmFtZXRlciAKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCA9IGludD4gY2xhc3MgRm9vIHsuLi59OwogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29EZWZhdWx0KSBGb288PjsKCjEyLzEyLzIwMDc6IG1nb3NzYWdlCgkgICAgW0x1YV0gU21hbGwgY29ycmVjdGlvbiBvbiBMdWEuaHRtbAoKMTIvMDkvMjAwNzogd3NmdWx0b24KCSAgICBBcHBseSBwYXRjaCAjMTgzODI0OCBmcm9tIE1vbnR5IFRheWxvciBmb3IgdnBhdGggYnVpbGRzIG9mIFNXSUcuCgoxMi8wOC8yMDA3OiB3c2Z1bHRvbgoJICAgIFtMdWFdIEZpeGVzIHRvIHJlbW92ZSBnY2MtNC4yIHdhcm5pbmdzCgoxMi8wNi8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAjMTczNDQxNSAtIHRlbXBsYXRlIHRlbXBsYXRlIHBhcmFtZXRlcnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBzdWNoIGFzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSB0X2l0ZW0sIHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyB0X2FsbG9jID0gcGZjOjphbGxvY19mYXN0ID4KICAgICAgICAgICAgICAgIGNsYXNzIGxpc3RfdCA6IHB1YmxpYyBsaXN0X2ltcGxfdDx0X2l0ZW0scGZjOjphcnJheV90PHRfaXRlbSx0X2FsbG9jPiA+IHsgLi4uIH07CgoxMi8wNC8yMDA3OiBtZ29zc2FnZQoJICAgIFtsdWFdIEZpeCBhIGJ1ZyBpbiB0aGUgY2xhc3MgaGllcmFjaHkgY29kZSwgd2hlcmUgdGhlIG1ldGhvZHMgd2VyZSBub3QgcHJvcGFnYXRlZCwgCgkgICAgaWYgdGhlIG5hbWUgb3JkZXJpbmcgd2FzIGluIGEgY2VydGFpbiBvcmRlci4KCSAgICBBZGRlZCBuZXcgZXhhbXBsZSBwcm9ncmFtcyAoZHVhbCwgZW1iZWQpIGFuZCBydW50aW1lIHRlc3RzIGZvciB0ZXN0LXN1aXRlLgoKMTEvMzAvMjAwNzogd3NmdWx0b24KCSAgICBGaXggdXNpbmcgc3RhdGVtZW50cyB1c2luZyBhIGJhc2UgY2xhc3MgbWV0aG9kIHdoZXJlIHRoZSBtZXRob2RzIHdlcmUgb3ZlcmxvYWRlZC4KICAgICAgICAgICAgRGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUgdXNpbmcgc3RhdGVtZW50cyBhbmQgbWV0aG9kIGRlY2xhcmF0aW9ucywgdGhlc2UKICAgICAgICAgICAgd2VyZSBwcmV2aW91c2x5IGdlbmVyYXRpbmcgdW5jb21waWxhYmxlIHdyYXBwZXJzLCBlZzoKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmdW5rKCk7CiAgICAgICAgICAgICAgICB1c2luZyBCYXNlOjpmdW5rOwogICAgICAgICAgICAgIH07CgpWZXJzaW9uIDEuMy4zMyAoTm92ZW1iZXIgMjMsIDIwMDcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzIxLzIwMDc6IG1pa2VsCgkgICAgW2FsbGVncm9jbF0gb21pdCBwcml2YXRlIHNsb3QgdHlwZSBpbmZvIGluIHRoZSBjbGFzc2VzL3R5cGVzCgkgICAgZGVmaW5lZCBvbiB0aGUgbGlzcCBzaWRlLiBGaXggYnVnIGluIG1hcHBpbmcgb2YgQy8rKyB0eXBlcwoJICAgIHRvIGxpc3AgdHlwZXMuIEZpeCB0eXBvIGluIG1vZHVsZXMgZ2VuZXJhdGVkIGRlZnBhY2thZ2UgZm9ybS4KCSAgICBIYXZlIHN0ZDo6c3RyaW5nIConcyBhdXRvbWF0aWNhbGx5IG1hcnNoYWxsZWQgYmV0d2VlbiBmb3JlaWduCgkgICAgYW5kIGxpc3Agc3RyaW5ncy4KCQoxMS8yMC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRmlsbCBpbiBQeXRob24gRGljdGlvbmFyeSBmdW5jdGlvbnMgbGlzdCAocGF0Y2ggZnJvbQoJICAgIEplbG1lciBWZXJub29paiBwb3N0ZWQgdG8gc3dpZy1kZXZlbCkuCgoxMS8yMC8yMDA3OiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSBDIHNjYW5uZXIgcmVsYXRlZCB0byBiYWNrc2xhc2ggY2hhcmFjdGVycy4KCjExLzE5LzIwMDc6IHdzZnVsdG9uCgkgICAgW1BlcmxdIEZpeCBicm9rZW4gY29tcGlsYXRpb24gb2YgQysrIHdyYXBwZXJzIG9uIHNvbWUgY29tcGlsZXJzLgoKMTEvMTYvMjAwNzogb2xseQoJICAgIFtQeXRob25dIERvbid0IHBhc3MgUHlfc3NpemVfdCBmb3IgYSAlZCBwcmludGYtbGlrZSBmb3JtYXQgYXMKCSAgICB0aGF0J3MgdW5kZWZpbmVkIGJlaGF2aW91ciB3aGVuIHNpemVvZihQeV9zc2l6ZV90KSAhPSBzaXplb2YoaW50KS4KClZlcnNpb24gMS4zLjMyIChOb3ZlbWJlciAxNSwgMjAwNykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMTQvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIFBhY2thZ2UgbmFtZSBhbmQgZGxsIG5hbWUgaXMgbm93IHRoZSBzYW1lIGFzIHRoZSBTV0lHIG1vZHVsZQogICAgICAgICAgICBuYW1lLiBJdCB1c2VkIHRvIGJlIHRoZSBtb2R1bGUgbmFtZSB3aXRoIF93cmFwIGFzIGEgc3VmZml4LiBUaGUgcGFja2FnZQogICAgICAgICAgICBhbmQgZGxsIG5hbWVzIGNhbiBiZSBtb2RpZmllZCB1c2luZyB0aGUgLXBhY2thZ2UgYW5kIC1kbGwgY29tbWFuZGxpbmUKICAgICAgICAgICAgb3B0aW9ucy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMTEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1JdIEFkZCBzdXBwb3J0IGZvciBXaW5kb3dzIChWaXN1YWwgQysrIDggdGVzdGVkKQoKMTEvMTAvMjAwNzogb2xseQoJICAgIFtwaHBdIEZpeCBtYWtlZmlsZSBnZW5lcmF0ZWQgYnkgLW1ha2UgKFNGIzE2MzM2NzkpLiAgVXBkYXRlCgkgICAgZG9jdW1lbnRhdGlvbiB0byBtYXJrICItbWFrZSIgYXMgZGVwcmVjYXRlZCAobm9uZSBvZiB0aGUgb3RoZXIKCSAgICBTV0lHIGJhY2tlbmRzIHNlZW0gdG8gb2ZmZXIgc3VjaCBhIGZlYXR1cmUsIGl0IGNhbid0IHJlYWxpc3RpY2FsbHkKCSAgICBnZW5lcmF0ZSBhIGZ1bGx5IHBvcnRhYmxlIG1ha2VmaWxlLCBhbmQgdGhlIGNvbW1hbmRzIHRvIGJ1aWxkIGFuCgkgICAgZXh0ZW5zaW9uIGFyZSBlYXN5IGVub3VnaCB0byB3cml0ZSBmb3IgdGhlIHVzZXIncyBwcmVmZXJyZWQgYnVpbGQKCSAgICB0b29sKS4gIEFsc28gcmVjb21tZW5kIGFnYWluc3QgdGhlIHVzZSBvZiAiLXBocGZ1bGwiIChpdCdzIG9ubHkKCSAgICByZWFsbHkgdXNlZnVsIHdoZW4gc3RhdGljIGxpbmtpbmcsIGFuZCBhIGR5bmFtaWNhbGx5IGxvYWRhYmxlCgkgICAgbW9kdWxlIGlzIHZpcnR1YWxseSBhbHdheXMgdGhlIGJldHRlciBhcHByb2FjaCkuCgoxMS8wOS8yMDA3OiBvbGx5CgkgICAgRml4IC0taGVscCBvdXRwdXQgdG8gbm90ZSB0aGF0IGBleHBvcnQgU1dJR19GRUFUVVJFUycgaXMgcmVxdWlyZWQuCgoxMC8yOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUl0gRml4IHNlZyBmYXVsdCBvbiBXaW5kb3dzCiAgICAgICAgICAgIFtSXSBFeGFtcGxlcyBSIHNjcmlwdHMgYXJlIG5vdyBwbGF0Zm9ybSBpbmRlcGVuZGVudAoKMTAvMzAvMjAwNzogbWdvc3NhZ2UKCSAgICBbbHVhXSBmaXhlZCBidWcgaW4gdGVtcGxhdGUgY2xhc3NlcyB3aGljaCBjYXNlcyB0ZW1wbGF0ZV9kZWZhdWx0MgoJICAgIGFuZCB0ZW1wbGF0ZV9zcGVjaWFsaXphdGlvbl9kZWZhcmcgdG8gZmFpbC4KCSAgICBBZGRlZCBzZXZlcmFsIHdhcm5pbmcgZmlsdGVycyBpbnRvIHRoZSBvdmVybG9hZCdzIHRlc3QgY2FzZXMuCgkgICAgQWRkZWQgcnVudGltZSB0ZXN0cyBmb3Igc2V2ZXJhbCBjb2Rlcy4KCSAgICBZb3UgY2FuIG5vdyBtYWtlIGNoZWNrLWx1YS10ZXN0LXN1aXRlIHdpdGggbm8gZXJyb3JzIGFuZCBvbmx5IGEgZmV3IHdhcm5pbmdzLgoKMTAvMzAvMjAwNzogb2xseQoJICAgIFtndWlsZV0gRml4IHRoZSBjb25maWd1cmUgdGVzdCB0byBwdXQgR1VJTEVMSU5LIGluIExJQlMgbm90IExERkxBR1MKCSAgICAoU0YjMTgyMjQzMCkuCgoxMC8zMC8yMDA3OiBvbGx5CgkgICAgW2d1aWxlXSBGaXggdGhlIGd1aWxlIGV4YW1wbGVzIG9uIDY0LWJpdCBwbGF0Zm9ybXMuCgoxMC8yOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCBtZW1iZXIgcG9pbnRlcnMgb24gNjQgYml0IHBsYXRmb3Jtcy4KCjEwLzI4LzIwMDc6IG9sbHkKCSAgICBbbHVhXSBGaXggc3dpZ19sdWFfY2xhc3MgaW5zdGFuY2VzIHRvIGJlIHN0YXRpYyB0byBhbGxvdyBtdWx0aXBsZQoJICAgIFNXSUcgd3JhcHBlcnMgdG8gYmUgY29tcGlsZWQgaW50byB0aGUgc2FtZSBleGVjdXRhYmxlIHN0YXRpY2FsbHkuCgkgICAgUGF0Y2ggZnJvbSBBbmRyZWFzIEZyZWRyaWtzc29uIChwb3N0ZWQgdG8gdGhlIHN3aWcgbWFpbGluZyBsaXN0KS4KCjEwLzI4LzIwMDc6IG9sbHkKCSAgICBbbHVhXSBGaXggRXhhbXBsZXMvbHVhIHRvIHBhc3MgU1JDUyBmb3IgQyB0ZXN0cyByYXRoZXIgdGhhbiBDWFhTUkNTLgoJICAgIFRoZSBjb2RlIGFzIGl0IHdhcyBoYXBwZW5lZCB0byB3b3JrIG9uIHg4NiwgYnV0IGJyb2tlIG9uIHg4Nl82NCAoYW5kCgkgICAgcHJvYmFibHkgYW55IG90aGVyIHBsYXRmb3JtcyB3aGljaCByZXF1aXJlIC1mUElDKS4KCjEwLzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IGFwcHJvYWNoIGZvciBmaXhpbmcgdW5pbml0aWFsaXNlZCB2YXJpYWJsZSB1c2FnZSBvbiBlcnJvciBpbiBkaXJlY3RvcgogICAgICAgICAgICBtZXRob2RzIHVzaW5nIHRoZSBuZXcgdGVtcGxhdGVkIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIFN3aWdWYWx1ZUluaXQoKS4KCjEwLzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBVc2UgbW9yZSBlZmZpY2llbnQgU3ZQVl9ub2xlbih4KSBpbnN0ZWFkIG9mIFN2UFYoeCxQTF9uYSkgaWYgU3ZQVl9ub2xlbiBpcwogICAgICAgICAgICBzdXBwb3J0ZWQuCgoxMC8yNi8yMDA3OiB3dXp6ZWIKCSAgICBbQ2hpY2tlbl0gRml4IGdsb2JhbCB2YXJpYWJsZXMgb2YgY2xhc3MgbWVtYmVyIGZ1bmN0aW9uIHBvaW50ZXJzLgoJICAgIE90aGVyIG1pbm9yIGZpeGVzLCBzbyBhbGwgdGVzdHMgaW4gdGhlIGNoaWNrZW4gdGVzdCBzdWl0ZSBub3cgcGFzcwoKMTAvMjUvMjAwNzogb2xseQoJICAgIEZpeCBVVEwgdHlwZWNoZWNrIG1hY3JvIGZvciBhIGZ1bmN0aW9uIHRha2luZyBjaGFyW10gb3IgY29uc3QKCSAgICBjaGFyW10gKFNGIzE4MjAxMzIpLgoKMTAvMjIvMjAwNzogbWtvZXBwZQoJICAgIFtHdWlsZV0gRmlsdGVyIG91dCAtYW5zaSAtcGVkYW50aWMgZnJvbSBDRkxBR1Mgd2hpbGUgY29tcGlsaW5nIHRlc3QgcHJvZ3JhbXMgZm9yIEd1aWxlCgkgICAgaW4gY29uZmlndXJlLiAgVGhpcyBlbmFibGVzIHJ1bm5pbmcgdGhlIHRlc3Qgc3VpdGUgZm9yIEd1aWxlIGlmIGl0IGlzIGluc3RhbGxlZCBhbmQKCSAgICB1c2FibGUuCgoxMC8yMi8yMDA3OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dIEZpeCB0ZXN0Y2FzZXMgYXBwbHlfc2lnbmVkX2NoYXIgYW5kIGFwcGx5X3N0cmluZ3MKCSAgICBieSBhZGRpbmcgZXhwbGljaXQgY2FzdHMgdG8gdGhlIGFwcHJvcHJpYXRlICRsdHlwZS4KCjEwLzIyLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgdXNhZ2Ugb24gZXJyb3IgaW4gZGlyZWN0b3IgbWV0aG9kcy4KCjEwLzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gQnVnICMxNzk0MjQ3IC0gZml4IGdlbmVyYXRlZCBjb2RlIGZvciBkZXJpdmVkIGNsYXNzZXMgd2hlbiBjc2Jhc2Ugb3IgamF2YWJhc2UKICAgICAgICAgICAgdHlwZW1hcHMgYXJlIHVzZWQgd2l0aCB0aGUgcmVwbGFjZT0iMSIgYXR0cmlidXRlLgoKMTAvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gRG9jcyB1cGRhdGVkIHRvIHN1Z2dlc3QgdXNpbmcgZGlzdHV0aWxzLiBQYXRjaCAjMTc5NjY4MSBmcm9tIENocmlzdG9waGVyIEJhcmtlci4KCjEwLzE5LzIwMDc6IG9sbHkKCSAgICBbcGVybDVdIENsZWFyIGVycm5vIGJlZm9yZSBjYWxscyB0byBzdHJ0b2woKSwgc3RydG91bCgpLCBzdHJ0b2xsKCkKCSAgICBhbmQgc3RydG91bGwoKSB3aGljaCB3ZSBjaGVjayBlcnJubyBhZnRlciB0byBhdm9pZCBzZWVpbmcgYSBqdW5rCgkgICAgdmFsdWUgb2YgZXJybm8gaWYgdGhlcmUgaXNuJ3QgYW4gZXJyb3IgaW4gdGhlIGNhbGwuCgoxMC8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBEZXByZWNhdGUgJWF0dHJpYnV0ZV9yZWYgYW5kIHJlcGxhY2Ugd2l0aCAlYXR0cmlidXRlcmVmLiBUaGVyZSBpcyBqdXN0IGFuIGFyZ3VtZW50CiAgICAgICAgICAgIG9yZGVyIGNoYW5nZSBpbiBvcmRlciB0byBtYWludGFpbiBjb25zaXN0ZW5jeSB3aXRoICVhdHRyaWJ1dGUsIGZyb206CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKENsYXNzLCBBdHRyaWJ1dGVUeXBlLCBBY2Nlc3Nvck1ldGhvZCwgQXR0cmlidXRlTmFtZSkKICAgICAgICAgICAgdG8KICAgICAgICAgICAgICAlYXR0cmlidXRlcmVmKENsYXNzLCBBdHRyaWJ1dGVUeXBlLCBBdHRyaWJ1dGVOYW1lLCBBY2Nlc3Nvck1ldGhvZCkKCjEwLzE2LzIwMDc6IG9sbHkKCSAgICBbVGNsXSBGaXggc2V2ZXJhbCBvY2N1cnJlbmNlcyBvZiAid2FybmluZzogZGVwcmVjYXRlZCBjb252ZXJzaW9uCgkgICAgZnJvbSBzdHJpbmcgY29uc3RhbnQgdG8gJ2NoYXIqJyIgZnJvbSBHQ0MgNC4yIGluIGdlbmVyYXRlZCBDL0MrKwoJICAgIGNvZGUuCgoxMC8xNi8yMDA3OiBvbGx5CgkgICAgW1BIUF0gRml4IG1hbnkgb2NjdXJyZW5jZXMgb2YgIndhcm5pbmc6IGRlcHJlY2F0ZWQgY29udmVyc2lvbiBmcm9tCgkgICAgc3RyaW5nIGNvbnN0YW50IHRvICdjaGFyKiciIGZyb20gR0NDIDQuMiBpbiBnZW5lcmF0ZWQgQy9DKysgY29kZQoJICAgIHdoZW4gY29tcGlsaW5nIHdpdGggYSBuZXcgZW5vdWdoIHZlcnNpb24gb2YgUEhQIDUgKHRlc3RlZCB3aXRoCgkgICAgUEhQIDUuMi4zLCBidXQgUEhQIDUuMi4xIGlzIHByb2JhYmx5IHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50KS4KCjEwLzE1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICMxNzk3MTMzIGZyb20gRGF2aWQgUGllcGdyYXNzIGZpeGVzICVhdHRyaWJ1dGUgd2hlbiB0aGUgZ2V0dGVyIGhhcyB0aGUgc2FtZSBuYW1lCiAgICAgICAgICAgIGFzIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgbm8gbG9uZ2VyIGdlbmVyYXRlIG5vbi1mdW5jdGlvbmFsIHNldHRlciBmb3IgcmVhZC1vbmx5IGF0dHJpYnV0ZXMuCgoxMC8xNS8yMDA3OiBvbGx5CgkgICAgW1RjbF0gUHJldmVudCBTV0lHX1RjbF9Db252ZXJ0UHRyIGZyb20gY2FsbGluZyB0aGUgdW5rbm93biBwcm9jLgoJICAgIEFkZCBFeGFtcGxlcy90Y2wvc3RkX3ZlY3Rvci8gd2hpY2ggdGhpcyBjaGFuZ2UgZml4ZXMuICBQYXRjaAoJICAgIGlzIGZyb20gIkNsaWZmIEMiIGluIFNGIzE4MDk4MTkuCgoxMC8xMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIERldGFjaEN1cnJlbnRUaHJlYWQgYmFjayBpbiBmb3IgZGlyZWN0b3JzLiBTZWUgZW50cnkgZGF0ZWQgMDgvMTEvMjAwNiBhbmQKICAgICAgICAgICAgc2VhcmNoIGZvciBEZXRhY2hDdXJyZW50VGhyZWFkIG9uIHRoZSBtYWlsaW5nIGxpc3RzIGZvciBkZXRhaWxzLiBUaGUgY3Jhc2hlcyBvbiBTb2xhcmlzCiAgICAgICAgICAgIHNlZW0gdG8gYmUgb25seSBwcmVzZW50IGluIGpkay0xLjQuMiBhbmQgbG93ZXIgKGpkay0xLjUuMCBhbmQgamRrLTEuNi4wIGFyZSBva2F5KSwgc28KICAgICAgICAgICAgYW55b25lIHVzaW5nIGRpcmVjdG9ycyBzaG91bGQgdXNlIGEgcmVjZW50IGpkayBvbiBTb2xhcmlzLCBvciBkZWZpbmUgKHNlZSBkaXJlY3Rvci5zd2cpCiAgICAgICAgICAgIFNXSUdfSkFWQV9OT19ERVRBQ0hfQ1VSUkVOVF9USFJFQUQgdG8gdGhlIEMrKyBjb21waWxlciB0byBnZXQgb2xkIGJlaGF2aW91ci4KCjEwLzEyLzIwMDc6IHdzZnVsdG9uCgkgICAgW0phdmFdIEVuc3VyZSB0aGUgcHJlbWF0dXJlIGdhcmJhZ2UgY29sbGVjdGlvbiBwcmV2ZW50aW9uIHBhcmFtZXRlciAocGdjcHApIGlzIGdlbmVyYXRlZAogICAgICAgICAgICB3aGVuIHRoZXJlIGFyZSBDIGNvbW1lbnRzIGluIHRoZSBqdHlwZSBhbmQganN0eXBlIHR5cGVtYXBzLgoKMTAvMTIvMjAwNzogd3V6emViCgkgICAgQWRkZWQgYSB0ZXN0c3VpdGUgZW50cnkgZm9yIEJ1ZyAjMTczNTkzMQoKMTAvMDkvMjAwNzogb2xseQoJICAgIEF1dG9tYXRpY2FsbHkgcmVydW4gYXV0b2dlbi5zaCBpZiBjb25maWd1cmUuaW4gaXMgbW9kaWZpZWQuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgRW5oYW5jZSBjaGVjay0lLXRlc3Qtc3VpdGUgcnVsZSBhbmQgZnJpZW5kcyB0byBnaXZlIGEgbW9yZSBoZWxwZnVsCgkgICAgZXJyb3IgbWVzc2FnZSBpZiB5b3UgdHJ5IHRoZW0gZm9yIGEgbGFuZ3VhZ2Ugd2hpY2ggZG9lc24ndCBleGlzdAoJICAgIChlLmcuICJtYWtlIGNoZWNrLXBocC10ZXN0LXN1aXRlIiByYXRoZXIgdGhhbiB0aGUgY29ycmVjdAoJICAgICJtYWtlIGNoZWNrLXBocDQtdGVzdC1zdWl0ZSIpLgoKMTAvMDkvMjAwNzogb2xseQoJICAgIEFkZCBtYWtlIHJ1bGUgdG8gcmVnZW5lcmF0ZSBNYWtlZmlsZSBmcm9tIE1ha2VmaWxlLmluIGlmIGl0IGhhcwoJICAgIGNoYW5nZWQuCgoxMC8wOS8yMDA3OiBvbGx5CgkgICAgW3BocF0gRml4IGxvbmctc3RhbmRpbmcgbWVtb3J5IGxlYWsgaW4gd3JhcHBlZCBjb25zdHJ1Y3RvcnMgYW5kCgkgICAgd3JhcHBlZCBmdW5jdGlvbnMvbWV0aG9kcyB3aGljaCByZXR1cm4gYW4gb2JqZWN0LgoKMTAvMDgvMjAwNzogb2xseQoJICAgIEZpeCBNYWtlZmlsZS5pbiB0byByZWFkIGNoZWNrLmxpc3QgZmlsZXMgY29ycmVjdGx5IGluIGEgVlBBVEgKCSAgICBidWlsZC4KCjEwLzA3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gRXhwZXJpbWVudGFsIHNoYXJlZF9wdHIgdHlwZW1hcHMgYWRkZWQKCjA5LzI3LzIwMDc6IG1nb3NzYWdlCgkgICAgW2x1YV0gYWRkZWQgbW9yZSB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzIGZvciBpbmNvcnJlY3QgdHlwZWNoZWNrcy4KCSAgICBBZGRlZCBhIHJvdXRpbmUgd2hpY2ggY2hlY2tzIHRoZSBleGFjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBwYXNzZWQgdG8gYSBmdW5jdGlvbgoJICAgIChicmVha3Mgb3BlcmF0b3Jfb3ZlcmxvYWRpbmcgZm9yIHVuYXJ5IG1pbnVzIG9wZXJhdG9yLCBjdXJyZW50bHkgZGlzYWJsZWQpLgoJICAgIFJlb3JnYW5pc2VkIHRoZSBsdWF0eXBlbWFwcy5zd2cgdG8gdGlkeSBpdCB1cC4KCSAgICBBZGRlZCBhIGxvdCBvZiAlaWdub3JlcyBvbiB0aGUgb3BlcmF0b3JzIG5vdCBzdXBwb3J0ZWQgYnkgbHVhLgoJICAgIEFkZGVkIHN1cHBvcnQgZm9yIGNvbnN0YW50IG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyAmIHJ1bnRlc3QgZm9yIG1lbWJlcl9wb2ludGVyLmkKCSAgICBBZGRlZCBmaXJzdCB2ZXJzaW9uIG9mIHdjaGFyLmkKCjA5LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gdGhyb3dzIHR5cGVtYXBzIGZvciBzdGQ6OndzdHJpbmcgdXNpbmcgQyMgcGF0Y2ggIzE3OTkwNjQgZnJvbSBEYXZpZCBQaWVwZ3Jhc3MKCjA5LzI0LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUY2xdIEFwcGx5ICMxNzcxMzEzIHRvIGZpeCBidWcgIzE2NTAyMjkgLSBmaXhlcyBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZwogICAgICAgICAgICBoYW5kbGluZy4KCjA5LzIwLzIwMDc6IG9sbHkKCSAgICBbSmF2YV0gRWxpbWluYXRlIHNvbWUgdW5uZWNlc3NhcnkgdXNlcyBvZiBhIHRlbXBvcmFyeSBidWZmZXIKCSAgICBhbGxvY2F0ZWQgdXNpbmcgbmV3W10uICBTRiMxNzk2NjA5LgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJGNzaW5wdXQgc3BlY2lhbCB2YXJpYWJsZSBjYW4gYmUgdXNlZCBpbiB0aGUgY3N2YXJpbiB0eXBlbWFwIHdoZXJlIGl0IGlzIGFsd2F5cwogICAgICAgICAgICBleHBhbmRlZCB0byAndmFsdWUnLgoKMDkvMTkvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggYnVnIHJlcG9ydGVkIGJ5IEdsZW5uIEEgV2F0c29uIGFuZCAjMTc5NTI2MCB3aGVyZSB0aGUgY3N0eXBlIHR5cGVtYXAgdXNlZCB0aGUgJ3JlZicKICAgICAgICAgICAga2V5d29yZCBpbiB0aGUgdHlwZW1hcCBib2R5LCBpdCBwcm9kdWNlZCB1bmNvbXBpbGFibGUgQyMgcHJvcGVydGllcyAodmFyaWFibGUgd3JhcHBlcnMpLgogICAgICAgICAgICBUaGUgdHlwZSBmb3IgdGhlIHByb3BlcnR5IG5vdyBjb3JyZWN0bHkgY29tZXMgZnJvbSB0aGUgJ291dCcgYXR0cmlidXRlIGluIHRoZSBjc3R5cGUgdHlwZW1hcC4KCjA5LzE5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggY29uc3Qgc3RkOjp3c3RyaW5nJiB0eXBlbWFwcwoKMDkvMTkvMjAwNzogd3NmdWx0b24KCSAgICBbSmF2YV0gRW5zdXJlIHRoZSBwcmVtYXR1cmUgZ2FyYmFnZSBjb2xsZWN0aW9uIHByZXZlbnRpb24gcGFyYW1ldGVyIChwZ2NwcCkgaXMgZ2VuZXJhdGVkCiAgICAgICAgICAgIHdoZXJlIGEgcGFyYW1ldGVyIGlzIHBhc3NlZCBieSBwb2ludGVyIHJlZmVyZW5jZSwgZWcgaW4gdGhlIHN0ZDo6dmVjdG9yIHdyYXBwZXJzLiBUaGUgcGdjcHAKICAgICAgICAgICAgaXMgYWxzbyBnZW5lcmF0ZWQgbm93IHdoZW4gdXNlcidzIGN1c3RvbSB0eXBlbWFwcyB1c2UgYSBwcm94eSBjbGFzcyBpbiB0aGUganN0eXBlIHR5cGVtYXAKICAgICAgICAgICAgYW5kIGEgJ2xvbmcnIGluIHRoZSBqdHlwZSB0eXBlbWFwLgoKMDkvMTgvMjAwNzogb2xseQoJICAgIFtwaHBdIEFkZCB0eXBlbWFwcyBmb3IgaGFuZGxpbmcgcGFyYW1ldGVycyBvZiB0eXBlIHN0ZDo6c3RyaW5nICYKCSAgICB3aGljaCBhcmUgbW9kaWZpZWQgYnkgdGhlIHdyYXBwZWQgZnVuY3Rpb24uCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3B5dGhvbl0gU3BsaXQgcG90ZW50aWFsbHkgbG9uZyBzdHJpbmcgbGl0ZXJhbHMgdG8gYXZvaWQgaGl0dGluZwoJICAgIE1TVkMncyBsb3cgZml4ZWQgbGltaXQgb24gc3RyaW5nIGxpdGVyYWwgbGVuZ3RoIC0gcGF0Y2ggZnJvbQoJICAgIFNGIzE3MjM3NzAsIGFsc28gcmVwb3J0ZWQgYXMgU0YjMTYzMDg1NS4KCjA5LzE3LzIwMDc6IG9sbHkKCSAgICBbb2NhbWxdIEZpeCByZW5hbWluZyBvZiBvdmVybG9hZGVkIG1ldGhvZHMgaW4gdGhlIG1ldGhvZF90YWJsZSAtCgkgICAgbXkgcGF0Y2ggZnJvbSBTRiM5NDAzOTkuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgW3B5dGhvbl0gU2ltcGxlciBjb2RlIGZvciBTV0lHX0FzVmFsX2Jvb2woKSB3aGljaCBmaXhlcyBhICJzdHJpY3QKCSAgICBhbGlhc2luZyIgd2FybmluZyBmcm9tIEdDQyAtIHBhdGNoIGZyb20gU0YjMTcyNDU4MSBieSBBbmRyZXcKCSAgICBCYXVtYW5uLgoKMDkvMTcvMjAwNzogb2xseQoJICAgIFtwZXJsNV0gVXNlIHN2X3NldHB2bigpIHRvIHNldCBhIHNjYWxhciBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoCgkgICAgLSBwYXRjaCBmcm9tIFNGIzE3NDQ2MCBieSAibWF0c3ViYXJheSIuCgowOS8xNy8yMDA3OiBvbGx5CgkgICAgV2hlbiB3cmFwcGluZyBDKysgY29kZSwgZ2VuZXJhdGUgY29kZSB3aGljaCB1c2VzCgkgICAgc3RkOjpzdHJpbmc6OmFzc2lnbihQVFIsIExFTikgcmF0aGVyIHRoYW4gYXNzaWduaW5nCgkgICAgc3RkOjpzdHJpbmcoUFRSLCBMRU4pLiAgVXNpbmcgYXNzaWduIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlCgkgICAgKHRlc3RlZCB3aXRoIEdDQyA0LjEuMikuCgowOS8wNy8yMDA3OiB3c2Z1bHRvbgoJICAgIEZpeCAlaWdub3JlIG9uIGNvbnN0cnVjdG9ycyB3aGljaCBhcmUgbm90IGV4cGxpY2l0bHkgZGVjbGFyZWQgW1NGICMxNzc3NzEyXQoKMDkvMDUvMjAwNzogd3V6emViIChKb2huIExlbnopCgkgICAgLSBDaGFuZ2Ugcl9sdHlwZSBpbiB0eXBlc3lzLmMgdG8gc3RvcmUgYSBoYXNodGFibGUgaW5zdGVhZCBvZiBhIHNpbmdsZSB2YWx1ZS4KCSAgICAgIHNldmVyYWwgdmVyeSBzdWJ0bGUgYnVncyB3ZXJlIGJlaW5nIGNhdXNlZCBieSBtdWx0aXBsZSBsdHlwZXMgYmVpbmcgbWFwcGVkCgkgICAgICB0byBhIHNpbmdsZSBtYW5nbGVkIHR5cGUsIG1vc3RseSB3aGVuIHVzaW5nIHR5cGVkZWZlZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgoJICAgICAgTm93LCByX2x0eXBlIHN0b3JlcyBhIGhhc2h0YWJsZSBvZiBwb3NzaWJsZSBsdHlwZXMsIGFuZCB3aGVuIGdlbmVyYXRpbmcgdGhlCgkgICAgICB0eXBlIHRhYmxlLCBhbGwgdGhlIGx0eXBlcyBhcmUgYWRkZWQgaW50byB0aGUgc3dpZ190eXBlX2luZm8gc3RydWN0dXJlLgoKMDgvMzEvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgU0YgIzE3NTQ5NjcgZnJvbSBKYW1lcyBCaWdsZXIuCiAgICAgICAgICAgIC0gRml4IGJ1ZyBpbiB0dXJuaW5nIG9uIHdhcm5pbmdzIHRoYXQgd2VyZSB0dXJuZWQgb2ZmIGJ5IGRlZmF1bHQuIEVnICdzd2lnIC13KzMwOScgd2lsbCBub3cKICAgICAgICAgICAgICB0dXJuIG9uIHRoZSBub3JtYWxseSBzdXBwcmVzc2VkIHdhcm5pbmcgMzA5LgoKICAgICAgICAgICAgLSBOZXcgLVdleHRyYSBjb21tYW5kbGluZSBvcHRpb24gd2hpY2ggZW5hYmxlcyB0aGUgZXh0cmEgd2FybmluZyBudW1iZXJzOgogICAgICAgICAgICAgIDIwMiwzMDksNDAzLDUxMiwzMjEsMzIyICh0aGlzIGlzIHRoZSBsaXN0IG9mIHdhcm5pbmdzIHRoYXQgaGF2ZSBhbHdheXMgYmVlbiBzdXBwcmVzc2VkIGJ5CiAgICAgICAgICAgICAgZGVmYXVsdCkuIEJ5IHNwZWNpZnlpbmcgLVdleHRyYSwgYWxsIHdhcm5pbmdzIHdpbGwgYmUgdHVybmVkIG9uLCBidXQgdW5saWtlIC1XYWxsLAogICAgICAgICAgICAgIHdhcm5pbmdzIGNhbiBzdGlsbCBiZSBzZWxlY3RpdmVseSB0dXJuZWQgb24vb2ZmIHVzaW5nICV3YXJuZmlsdGVyLAogICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm4gb3IgZnVydGhlciAtdyBjb21tYW5kbGluZSBvcHRpb25zLCBlZzoKICAgICAgICAgICAgICAgIHN3aWcgLVdleHRyYSAtdzMwOQogICAgICAgICAgICAgIHdpbGwgdHVybiBvbiBhbGwgd2FybmluZ3MgZXhjZXB0IDMwOS4KCjA4LzI4LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIC0gTmV3IGRlYnVnZ2luZyBvcHRpb25zLCAtZGVidWctbW9kdWxlIDxuPiBhbmQgLWRlYnVnLXRvcCA8bj4gdG8gZGlzcGxheSB0aGUgcGFyc2UgdHJlZSBhdAogICAgICAgICAgICAgIHZhcmlvdXMgc3RhZ2VzLCB3aGVyZSA8bj4gaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBzdGFnZXMgMS00LkZvciBleGFtcGxlLCB0bwogICAgICAgICAgICAgIGRpc3BsYXkgdG9wIG9mIHBhcnNlIHRyZWUgYXQgc3RhZ2VzIDEgYW5kIDM6CiAgICAgICAgICAgICAgICBzd2lnIC1kZWJ1Zy10b3AgMSwzCgogICAgICAgICAgICAtIERlcHJlY2F0ZSB0aGUgZm9sbG93aW5nIG9wdGlvbnMgd2hpY2ggaGF2ZSBlcXVpdmFsZW50cyBiZWxvdzoKICAgICAgICAgICAgICAtZHVtcF9wYXJzZV9tb2R1bGUgICAgPT4gICAtZGVidWctbW9kdWxlIDEKICAgICAgICAgICAgICAtZHVtcF9tb2R1bGUgICAgICAgICAgPT4gICAtZGVidWctbW9kdWxlIDQKICAgICAgICAgICAgICAtZHVtcF9wYXJzZV90b3AgICAgICAgPT4gICAtZGVidWctdG9wIDEKICAgICAgICAgICAgICAtZHVtcF90b3AgICAgICAgICAgICAgPT4gICAtZGVidWctdG9wIDQKCiAgICAgICAgICAgIC0gUmVuYW1lZCBzb21lIGNvbW1hbmRsaW5lIG9wdGlvbnMgZm9yIG5hbWluZyBjb25zaXN0ZW5jeSBhY3Jvc3MgYWxsIG9wdGlvbnM6CiAgICAgICAgICAgICAgLWRlYnVnX3RlbXBsYXRlICA9PiAgIC1kZWJ1Zy10ZW1wbGF0ZQogICAgICAgICAgICAgIC1kZWJ1Z190eXBlbWFwICAgPT4gICAtZGVidWctdHlwZW1hcAogICAgICAgICAgICAgIC1kdW1wX2NsYXNzZXMgICAgPT4gICAtZGVidWctY2xhc3NlcwogICAgICAgICAgICAgIC1kdW1wX3RhZ3MgICAgICAgPT4gICAtZGVidWctdGFncwogICAgICAgICAgICAgIC1kdW1wX3R5cGVkZWYgICAgPT4gICAtZGVidWctdHlwZWRlZgogICAgICAgICAgICAgIC1kdW1wX21lbW9yeSAgICAgPT4gICAtZGVidWctbWVtb3J5CgowOC8yNS8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBoYW5kbGluZyBvZiBkb3VibGUgb3IgZmxvYXQgcGFyYW1ldGVycyB3aXRoIGFuIGludGVnZXIKCSAgICBkZWZhdWx0IHZhbHVlLgoKMDgvMjUvMjAwNzogb2xseQoJICAgIFtQSFA1XSBHZW5lcmF0ZSBfX2lzc2V0KCkgbWV0aG9kcyBmb3Igc2V0dGVycyBmb3IgUEhQIDUuMSBhbmQgbGF0ZXIuCgowOC8yMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSBDI10gRml4IGRpcmVjdG9yIGJ1ZyAjMTc3NjY1MSByZXBvcnRlZCBieSBTdGVwaGFuZSBSb3V0ZWxvdXMgd2hpY2ggb2NjdXJyZWQgd2hlbgogICAgICAgICAgICB0aGUgZGlyZWN0b3IgY2xhc3MgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgc3RhcnQgb2Ygc29tZSBvdGhlciBzeW1ib2xzIHVzZWQgd2l0aGluCiAgICAgICAgICAgIHRoZSBkaXJlY3RvciBjbGFzcy4KCjA4LzE3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIENvcnJlY3QgYmVoYXZpb3VyIGZvciB0ZW1wbGF0ZWQgbWV0aG9kcyB1c2VkIHdpdGggJXJlbmFtZSBvciAlaWdub3JlIGFuZCB0aGUgZW1wdHkKICAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb24gLSAldGVtcGxhdGUoKS4gQSB3YXJuaW5nIGlzIGlzc3VlZCBpZiB0aGUgbWV0aG9kIGhhcyBub3QgYmVlbgogICAgICAgICAgICByZW5hbWVkLgoKMDgvMTYvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdIE5hbWUgZ2VuZXJhdGVkIGNsIGZpbGUgYmFzZWQgb24gaW5wdXQgZmlsZSByYXRoZXIgdGhhbiBieQoJICAgIG1vZHVsZSBuYW1lLiBJdCB3YXMgcG9zc2libGUgdG8gZW5kIHVwIHdpdGggYSBteXBhY2thZ2UuY2wgYW5kIGEgdGVzdF93cmFwLmMKCSAgICB3aGVuIHBhcnNpbmcgYSB0ZXN0LmkgaW5wdXQgZmlsZS4gQ29uZnVzaW5nLiBBbHNvLCBpbmNsdWRlIGV4dGVybmFsLWZvcm1hdAoJICAgIHRlbXBsYXRlcyBmb3IgOmZhdCBhbmQgOmZhdC1sZSBhdXRvbWF0aWNhbGx5IHRvIGF2b2lkIHRoZXNlIGJlaW5nIGNvbXBpbGVkCgkgICAgYXQgcnVudGltZS4KCjA4LzE1LzIwMDc6IGVmdXp6eW9uZQogICAgICAgICAgICBbY2ZmaV0gQXBwbHkgcGF0Y2ggIzE3NjYwNzYgZnJvbSBMZWlnaCBTbWl0aCBhZGRpbmcgc3VwcG9ydCBmb3IgbmV3bHkgaW50cm9kdWNlZAogICAgICAgICAgICBpbiBjZmZpIDpsb25nLWxvbmcgYW5kIDp1bnNpZ25lZC1sb25nLWxvbmcuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gQWRkIGRvY3VtZW50YXRpb24gcGF0Y2ggIzE3NDM1NzMgZnJvbSBKZWZmcmV5IFNvcmVuc2VuLiBJdCBjb250YWlucyBhIG5lYXQKICAgICAgICAgICAgaWRlYSB3aXRoIHJlc3BlY3QgdG8gYmV0dGVyIG1lbW9yeSBtYW5hZ2VtZW50IGJ5IHRoZSBKVk0gb2YgQysrIGFsbG9jYXRlZCBtZW1vcnkuCgowOC8xMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQXBwbHkgcGF0Y2ggIzE3NzE0MTAgZnJvbSBXYWRlIEJyYWluZXJkIHRvIGZpeCB0eXBlZGVmIFhTKFN3aWdQZXJsV3JhcHBlcikgaW4KICAgICAgICAgICAgcGVybHJ1bi5zd2cgZm9yIEFjdGl2ZVN0YXRlIFBlcmwgYnVpbGQgODIyIGFuZCBQZXJsIDUuOC45IGFuZCA1LjEwIGJyYW5jaGVzLgoKMDgvMTAvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgW0x1YV0gY29uc3QgZW51bSByZWZlcmVuY2UgdHlwZW1hcHMgZml4ZWQuCgowOC8wOS8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZGVkIG1pc3Npbmcgc3VwcG9ydCBmb3IgQysrIGNsYXNzIG1lbWJlciBwb2ludGVycy4KCjA4LzA5LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gQWRkIHN1cHBvcnQgZm9yICRvd25lciBpbiB0aGUgIm91dCIgdHlwZW1hcHMgbGlrZSBpbiB0aGUgc2NyaXB0aW5nCiAgICAgICAgICAgIGxhbmd1YWdlIG1vZHVsZXMuIE5vdGUgdGhhdCAkb3duZXIgaGFzIGFsd2F5cyBiZWVuIHN1cHBvcnRlZCBpbiB0aGUgImphdmFvdXQiIC8gImNzb3V0IgogICAgICAgICAgICB0eXBlbWFwcy4KCjA4LzAxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBzbWFydCBwb2ludGVyIGhhbmRsaW5nIGZvciBjbGFzc2VzIHRoYXQgaGF2ZSB0ZW1wbGF0ZWQgbWV0aG9kcyB3aXRoaW4gdGhlIHNtYXJ0CiAgICAgICAgICAgIHBvaW50ZXIgdHlwZS4gUHJvYmxlbSByZXBvcnRlZCBieSBjcmFpZ2RvIGF0IGVlLndhc2hpbmd0b24uZWR1LgoKMDcvMzEvMjAwNzogZWZ1enp5b25lCiAgICAgICAgICAgIFtjZmZpXSBmaXhlZCBtZW1vcnkgYWNjZXNzIGFmdGVyIGJlaW5nIGZyZWVkIGJ1Zy4gdGhhbmtzIHRvIE1hcnRpbiBQZXJjb3NzaS4KICAgICAgICAgICAgcGFja2FnZSBuYW1lIGNsb3MgY2hhbmdlZCB0byBjbC4gdGhhbmtzIHRvIFJhbGYgTWF0dGVzCgowNy8yNC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXJhbGxlbCBtYWtlIHN1cHBvcnQgYWRkZWQgZm9yIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSBmb3IgZGV2ZWxvcGVycyB3aG8gaGF2ZQogICAgICAgICAgICBtb3JlIHRoYW4gb25lIENQVS4gTm93IHBhcmFsbGVsIG1ha2UgY2FuIGJlIHVzZWQgZm9yIGNoZWNraW5nIGluIGFkZGl0aW9uIHRvIGJ1aWxkaW5nCiAgICAgICAgICAgIHRoZSBTV0lHIGV4ZWN1dGFibGUuIFNvbWUgdHlwaWNhbCBjaGVja2luZyBleGFtcGxlczoKCiAgICAgICAgICAgICAgbWFrZSAtajggLWsgY2hlY2sKICAgICAgICAgICAgICBtYWtlIC1qNCBjaGVjay1qYXZhLXRlc3Qtc3VpdGUKICAgICAgICAgICAgICBtYWtlIC1qMiBjaGVjay1qYXZhLWV4YW1wbGVzCgowNy8xOS8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBGaXhlZCBidWcgdGhhdCBzdG9wcGVkIGNvbmZpZ3VyZSB3b3JraW5nIG9uIG1pbmd3IChhcHBsaWVkIGRvczJ1bml4IHRvIGNvbmZpZ3VyZS5pbikKCjA3LzEwLzIwMDc6IG1nb3NzYWdlCiAgICAgICAgICAgIFtsdWFdIEV4dHJhIGNvbXBhdGliaWxpdHkgd2l0aCBMdWEgNS4xICh1cGRhdGVkIFNXSUdfaW5pdCwgZG9jcywgZXhhbXBsZXMsIHRlc3Qgc3VpdGUpCgkgICAgUmVtb3ZlZCBuYW1lIGNsYXNoIGZvciBzdGF0aWMgbGluayBvZiBtdWx0aXBsZSBtb2R1bGVzCgowNy8wNS8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBGaXggYSBidWcgaW4gU1dJR19BTExPQ19BUlJBWSgpCiAgICAgICAgICAgIGltcHJvdmVkIHRoZSBlcnJvciBtZXNzYWdlcyBmb3IgaW5jb3JyZWN0IGFyZ3VtZW50cy4KICAgICAgICAgICAgQ2hhbmdlZCB0aGUgb3V0cHV0IG9mIHN3aWdfdHlwZSgpIHRvIHVzZSB0aGUgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiB0aGUgdHlwZSwKCSAgICByYXRoZXIgdGhhbiB0aGUgcmF3IHN3aWcgdHlwZS4KCjA3LzAzLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gRml4IGRpcmVjdG9ycyBmb3Igc29tZSBvdmVybG9hZGVkIG1ldGhvZHMgd2hlcmUgdGhlIGltdHlwZSByZXN1bHRlZCBpbiBpZGVudGljYWwKICAgICAgICAgICAgbWV0aG9kcyBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIEMjIGRpcmVjdG9yIGNsYXNzLCBlZyB2b2lkIGZvbyhpbnQgKikgYW5kIHZvaWQgZm9vKGRvdWJsZSAqKQogICAgICAgICAgICB1c2VkIHRvIGdlbmVyYXRlZCB0d28gb2YgdGhlc2U6CgogICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBTd2lnRGlyZWN0b3Jmb28oSW50UHRyIHApIHsgLi4uIH0KCjA2LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU29tZSBwYXJhbWV0ZXIgbmFtZSBjaGFuZ2VzIGluIHN0ZF92ZWN0b3IuaSBhbGxvd2luZyBiZXR0ZXIgdGFyZ2V0aW5nCiAgICAgICAgICAgIG9mIHR5cGVtYXBzIGZvciBtZXRob2QgcGFyYW1ldGVycyAoZm9yIG1lbW9yeSBtYW5hZ2VtZW50IG9mIGNvbnRhaW5lcnMgb2YgcG9pbnRlcnMpLgoKMDYvMDcvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgZml4IGZvcmVpZ24tdHlwZSBjb25zdHJ1Y3RvciB0byBwcm9wZXJseSBsb29rIGZvciBmZml0eXBlIHR5cGVtYXAKCSAgICBiaW5kaW5ncy4gZml4IGlub3V0X3R5cGVtYXBzLmkgZm9yIHN0cmluZ3MuCgowNi8wNi8yMDA3OiBvbGx5CgkgICAgW1J1YnldCgkgICAgVXNlIHdoaWNoZXZlciBvZiAibG9uZyIgb3IgImxvbmcgbG9uZyIgaXMgdGhlIHNhbWUgc2l6ZSBhcyAidm9pZCoiCgkgICAgdG8gaG9sZCBwb2ludGVycyBhcyBpbnRlZ2VycywgcmF0aGVyIHRoYW4gd2hpY2hldmVyIG1hdGNoZXMgb2ZmX3QuCgkgICAgRml4ZXMgY29tcGlsYXRpb24gb24gT1MgWCBhbmQgR0NDIHdhcm5pbmdzIG9uIHBsYXRmb3JtcyB3aGVyZQoJICAgIHNpemVvZih2b2lkKikgPCBzaXplb2Yob2ZmX3QpIChTRiBwYXRjaCAjMTczMTk3OSkuCgowNi8wNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdCgkgICAgRml4IGhhbmRsaW5nIG9mIGEgcGFydGljdWxhciBjYXNlIGludm9sdmluZyBvdmVybG9hZGVkIGZ1bmN0aW9ucwoJICAgIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzLgoKMDYvMDUvMjAwNzogbXV0YW5kaXogKE1pa2VsIEJhbmNyb2Z0KQoJICAgIFthbGxlZ3JvY2xdCgkgICAgRml4IGNhc2Ugd2hlcmUgd2UnZCBwYXNzIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVycwoJICAgIChpLmUuIE5TMTo6TlMyOjpGT08pIHRvIHN3aWctaW5zZXJ0LWlkLiBBbGwgbmFtZXNwYWNlcwoJICAgIHNob3VsZCBiZSBzdHJpcHBlZC4KCgkgICAgRml4IGJ1ZyBpbiBUeXBlZGVmSGFuZGxlciBpbnRyb2R1Y2VkIGJ5IGxhc3QgZml4LgoKMDYvMDUvMjAwNzogb2xseQoJICAgIEZpeCByZXBvcnRpbmcgb2YgZmlsZW5hbWVzIGluIGVycm9ycyBhZnRlciAlaW5jbHVkZSAocGF0Y2ggZnJvbQoJICAgIExlaWdoIFNtaXRoIGluICMxNzMxMDQwOyBhbHNvIHJlcG9ydGVkIGFzICMxNjk5OTQwKS4KCjA1LzMxLzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEZpeCAibWlzc2luZyBpbml0aWFsaXNlciIgd2FybmluZyB3aGVuIGNvbXBpbGluZyBnZW5lcmF0ZWQgQy9DKysKCSAgICB3cmFwcGVyIGNvZGUgd2l0aCBQeXRob24gMi41IHdpdGggd2FybmluZ3MgZW5hYmxlZCAocGF0Y2ggZnJvbQoJICAgIGJ1ZyMxNzI3NjY4IGZyb20gTHVrZSBNb29yZSkuCgowNS8yOS8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBTcGxpdCBkb2NzdHJpbmdzIGludG8gc2VwYXJhdGUgc3RyaW5nIGxpdGVyYWxzIGF0IGVhY2ggbmV3bGluZSB3aGVuCgkgICAgZ2VuZXJhdGluZyBDL0MrKyB3cmFwcGVyIGNvZGUgKHRoZSBDL0MrKyBjb21waWxlciB3aWxsIGp1c3QgY29tYmluZQoJICAgIHRoZW0gYmFjayBpbnRvIGEgc2luZ2xlIHN0cmluZyBsaXRlcmFsKS4gIFRoaXMgYXZvaWRzIE1TVkMKCSAgICBjb21wbGFpbmluZyB0aGF0IHRoZSBzdHJpbmdzIGFyZSB0b28gbG9uZyAocHJvYmxlbSByZXBvcnRlZCBieQoJICAgIEJvIFBlbmcgb24gdGhlIG1haWxpbmcgbGlzdCkuCgowNS8yOC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0KCSAgICBFc2NhcGUgYmFja3NsYXNoZXMgaW4gZG9jc3RyaW5ncy4KCjA1LzI2LzIwMDc6IG9sbHkKCSAgICBbUHl0aG9uXQoJICAgIEZpeCBhdXRvZG9jIGdlbmVyYXRpb24gb2YgZW51bXMgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggaG93IHRoZQoJICAgIGVudW1zIGFyZSB3cmFwcGVkIC0gcGF0Y2ggIzE2OTcyMjYgZnJvbSBKb3NoIENoZXJyeS4KCjA1LzI2LzIwMDc6IG9sbHkKCSAgICBbUEhQNV0KCSAgICBGaXggd3JhcHBpbmcgb2YgbWV0aG9kcyBhbmQgZnVuY3Rpb25zIHdoaWNoIHJldHVybiBhIHBvaW50ZXIgdG8gYQoJICAgIGNsYXNzIChidWcjMTcwMDc4OCkgYW5kIHRob3NlIHdoaWNoIGhhdmUgb3ZlcmxvYWRlZCBmb3JtcyByZXR1cm5pbmcKCSAgICBib3RoIGNsYXNzZXMgYW5kIG5vbi1jbGFzc2VzIChidWcjMTcxMjcxNywgdGhhbmtzIHRvIFNpbW9uCgkgICAgQmVydGhpYXVtZSBmb3IgdGhlIHBhdGNoKS4KCjA1LzI1LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVkICVyZW5hbWUgaW5jb25zaXN0ZW5jeSBpbiBjb252ZXJzaW9uIG9wZXJhdG9ycyBhcyByZXBvcnRlZCBieSBaaG9uZyBSZW4uIFRoZSBtYXRjaGluZwogICAgICAgICAgICBpcyBub3cgZG9uZSBvbiB0aGUgb3BlcmF0b3IgbmFtZSBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgaXMgZG9uZSBmb3IgcGFyYW1ldGVycy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUob3BBQkMpIFNwYWNlOjpBQkM6Om9wZXJhdG9yIEFCQygpIGNvbnN0OwogICAgICAgICAgICAgICVyZW5hbWUobWV0aG9kQUJDKSBTcGFjZTo6QUJDOjptZXRob2QoQUJDIGEpIGNvbnN0OwogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBjbGFzcyBBQkMgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBtZXRob2QoQUJDIGEpIGNvbnN0IHt9CiAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgQUJDKCkgY29uc3QgeyBBQkMgYTsgcmV0dXJuIGE7IH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZSB0aGF0IHF1YWxpZnlpbmcgdGhlIGNvbnZlcnNpb24gb3BlcmF0b3IgcHJldmlvdXNseSBtYXkgb3IgbWF5IG5vdCBoYXZlIG1hdGNoZWQuCiAgICAgICAgICAgIE5vdyBpdCBkZWZpbml0ZWx5IHdvbid0LCBzbyB0aGlzIHdpbGwgbm90IG1hdGNoOgoKICAgICAgICAgICAgICAlcmVuYW1lKG9wQUJDKSBTcGFjZTo6QUJDOjpvcGVyYXRvciBTcGFjZTo6QUJDKCkgY29uc3Q7CgogICAgICAgICAgICBpbiB0aGUgc2FtZSB3YXkgdGhhdCB0aGlzIGRvZXMgbm90IG1hdGNoOgoKICAgICAgICAgICAgICAlcmVuYW1lKG1ldGhvZEFCQykgU3BhY2U6OkFCQzo6bWV0aG9kKFNwYWNlOjpBQkMgYSkgY29uc3Q7CgogICAgICAgICAgICBUaGUgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiBpbXByb3ZlZCB3aXRoIHJlc3BlY3QgdG8gJXJlbmFtZSwgbmFtZXNwYWNlcyBhbmQgdGVtcGxhdGVzLgogICAgICAgICAgICBDb252ZXJzaW9uIG9wZXJhdG9ycyBkb2N1bWVudGF0aW9uIHRvby4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDUvMTYvMjAwNzogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBiYWQgZ2VuZXJhdGlvbiBvZiBsb2NhbCB2YXIgbHR5cGUncyBpbiBmdW5jdGlvbldyYXBwZXIoKS4KCSAgICBUcnkgdG8gd29yayBiZXR0ZXIgd2l0aCB0aGUgYmFja3dhcmQgb3JkZXIgaW4gd2hpY2ggc3dpZwoJICAgIHVucm9sbHMgbmVzdGVkIGNsYXNzIGRlZmluaXRpb25zLgoJICAgIGNsZWFuZWQgdXAgYSBsaXR0bGUgdW5uZWNlc3NhcnkgY29kZS9kZWJ1ZyBwcmludGYncy4KCSAgICBSZW1vdmUgd2FybmluZyB3aGVuIHJlcGxhY2luZyAkbGRlc3RydWN0b3IgZm9yIGZmOmZvcmVpZ24tcG9pbnRlcgoKMDUvMTIvMjAwNzogb2xseQoJICAgIFtQeXRob25dCgkgICAgc3dpZyAtcHl0aG9uIC10aHJlYWRzIG5vdyBnZW5lcmF0ZXMgQy9DKysgY29kZSB3aGljaCB1c2VzIFB5dGhvbidzCgkgICAgb3duIHRocmVhZGluZyBhYnN0cmFjdGlvbiAoZnJvbSBweXRocmVhZC5oKSByYXRoZXIgdGhhbiBPUyBzcGVjaWZpYwoJICAgIGNvZGUuICBUaGUgb2xkIGNvZGUgZmFpbGVkIHRvIGNvbXBpbGUgb24gTVMgV2luZG93cy4gIChTZWUgU0YgcGF0Y2gKCSAgICB0cmFja2VyICMxNzEwMzQxKS4KCjA1LzA0LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgU1RMIHJlbmFtZXMgdG8gYmUgZ2xvYmFsIHJlbmFtZXMuICBUaGlzIGZpeGVzCgkgICAgU1RMIGZ1bmN0aW9ucyBub3QgYmVpbmcgcmVuYW1lZCB3aGVuIGF1dG9yZW5hbWUgaXMgb24uCiAgICAgICAgICAgIFRoaXMgaXMgYSBub3QgYSB0b3RhbGx5IHBlcmZlY3Qgd29yay1hcm91bmQsIGJ1dCBiZXR0ZXIuCgkgICAgU29tZW9uZSByZWFsbHkgbmVlZHMgdG8gZml4IHRoZSB0ZW1wbGF0ZSByZW5hbWluZyBjb2RlLgoJICAgIChTZWUgYnVnICMxNTQ1NjM0KQoKMDUvMDQvMjAwNyAgZ2dhCgkgICAgW0FsbF0KICAgICAgICAgICAgQ2hhbmdlZCAlcmVuYW1lKCIlKHVuZGVyY2FzZSlzIikgYSBsaXR0bGUgc28gdGhhdCBzaW5nbGUKCSAgICBudW1iZXJzIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbiBhcmUgbm90IHVuZGVyY2FzZWQuICBUaGF0IGlzOgoJCWdldFNvbWV0aGluZyAtPiBnZXRfc29tZXRoaW5nCgkJZ2V0MkQJICAgICAtPiBnZXRfMmQKCQlnZXQyMzQJICAgICAtPiBnZXRfMjM0CgkgICAgQlVUOgoJCWFzRmxvYXQyICAgICAtPiBhc19mbG9hdDIKCSAgICAoQnVnICMxNjk5NzE0KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgTWFkZSBfX3N3aWd0eXBlX18gPT4gQF9fc3dpZ3R5cGVfXyBzbyBpdCBjYW4gYmUgYWNjZXNzZWQKCSAgICBmcm9tIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgKGFuZCBmb2xsb3dzIFJ1YnkncyBvZmZpY2lhbAogICAgICAgICAgICBkb2N1bWVudGF0aW9uLCBqdXN0IGluIGNhc2UpLgoJICAgIE1hZGUgdHJhY2tpbmcgPT4gQF9fdHJhY2tpbmdzX18gZm9yIHNhbWUgcmVhc29uLgoJICAgIEN1cnJlbnRseSBzdG9yaW5nIGl2YXJzIHdpdGhvdXQgdGhlIEAgc2VlbXMgdmFsaWQsIGJ1dAoJICAgIHRoZSBQaWNrQXhlIHNheXMgdGhpcyBpcyBub3QgY29ycmVjdCwgc28ganVzdCBpbiBjYXNlLi4uCgowNS8wMy8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBBcHBsaWVkIHBhdGNoIGZvciAtbWluaGVyaXQgYnVnIGFuZCBleGNlcHRpb24gY2xhc3Nlcy4KCSAgICBUaGlzIGlzc3VlIHNob3VsZCBiZSByZXZpc2l0ZWQgbW9yZSBjbG9zZWx5LCBhcyBNdWx0aXBsZQoJICAgIEluaGVyaXRhbmNlIGluIFJ1YnkgaXMgc3RpbGwgcHJvYmxlbWF0aWMuCgkgICAgKHBhdGNoL2J1ZyAjMTYwNDg3OCkKCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIE92ZXJsb2FkZWQgZnVuY3Rpb25zIGluIHJ1Ynkgd2lsbCBub3cgcmVwb3J0IHRvIHRoZSB1c2VyCiAgICAgICAgICAgIHRoZSBwb3NzaWJsZSBwcm90b3R5cGVzIHdoZW4gdGhlIHVzZXIgbWlzdHlwZXMgdGhlIG51bWJlciBvcgogICAgICAgICAgICB0eXBlIG9mIGEgcGFyYW1ldGVyLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRm9yZ290IHRvIGRvY3VtZW50IHRoZSBidWcgZml4aW5nIG9mIGFuIG9sZCBidWcgcmVnYXJkaW5nCgkgICAgZXhjZXB0aW9ucy4KCSAgICAoYnVnICMxNDU4MjQ3KQoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgUnVieSBkb2N1bWVudGF0aW9uIHRvIHVzZSB0aGUgcHJvcGVyIGNzcyBzdHlsZXMgZm9yCgkgICAgZWFjaCBzZWN0aW9uLiBBZGRlZCBhdXRvZG9jIHNlY3Rpb24gdG8gUnVieSdzIGRvY3MgdG8KCSAgICBkb2N1bWVudCB0aGUgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IFJ1YnkgaW4gZG9jdW1lbnRpbmcgaXRzIG1vZHVsZXMuCgkgICAgTWFkZSByZG9jIGRvY3VtZW50YXRpb24gc3BpdCBvdXQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgY2xhc3MgKwoJICAgIG1ldGhvZCBuYW1lLiAgQWxiZWl0IHRoaXMgd2lsbCBtYWtlIHRoZSBjdXJyZW50IHJkb2Mgbm90IHJlY29nbml6ZQogICAgICAgICAgICB0aGUgbWV0aG9kLCB0aGlzIGlzIHN0aWxsIG5lZWRlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBkaWZmZXJlbnQKICAgICAgICAgICAgY2xhc3NlcyB3aXRoIHNpbWlsYXIgbWV0aG9kcyAocmRvYyB3YXMgY3JlYXRlZCB0byBkb2N1bWVudCB0aGUKCSAgICBydWJ5IHNvdXJjZSB3aGljaCBvbmx5IGNvbnRhaW5zIG9uZSBjbGFzcyBwZXIgYyBmaWxlLCB1bmxpa2Ugc3dpZykKICAgICAgICAgICAgSSBoYXZlIHBhdGNoZWQgcmRvYyB0byBtYWtlIGl0IG1vcmUgZnJpZW5kbHkgdG8gc3dpZy4gIFRoaXMKICAgICAgICAgICAgcGF0Y2ggbmVlZHMgdG8gYmUgbWVyZ2VkIGluIHRoZSBydWJ5IHN0ZCBsaWJyYXJ5IG5vdy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIENoYW5nZWQgZmxhZyAtZmVhdHVyZSB0byBiZSAtaW5pdF9uYW1lIHRvIGJldHRlciByZWZsZWN0IGl0cwoJICAgIHB1cnBvc2UgYW5kIGF2b2lkIGNvbmZ1c2lvbiB3aXRoIC1mZWF0dXJlcy4KCjA1LzAzLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIEltcHJvdmVkIGF1dG9kb2MgZ2VuZXJhdGlvbi4KCSAgICBBZGRlZCBhdXRvZG9jIC5zd2cgZmlsZXMgdG8gUnVieSBsaWJyYXJ5IGZvciBlYXNpbHkgYWRkaW5nCgkgICAgZG9jdW1lbnRhdGlvbiB0byBjb21tb24gUnVieSBtZXRob2RzIGFuZCBTVEwgbWV0aG9kcy4KCSAgICBGaXhlZCBhdXRvZG9jIGRvY3VtZW50aW5nIG9mIGdldHRlcnMgYW5kIHNldHRlcnMgYW5kIG1vZHVsZS4KCSAgICBNYWRlIHRlc3Qgc3VpdGUgYWx3YXlzIGdlbmVyYXRlIGF1dG9kb2NzLgoKMDUvMDMvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUmVtb3ZlZCBzb21lIHdhcm5pbmdzIGZyb20gU1RMIGFuZCB0ZXN0IHN1aXRlLgoKMDUvMDIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ZWQgaXNzdWVzIHdpdGggQysrIGNsYXNzZXMgYW5kIGhpZXJhY2hpZXMgYWNyb3NzIG11bHRpcGxlCgkgICAgc291cmNlIGZpbGVzLiBGaXhlZCBpbXBvcnRzIHRlc3QgY2FzZSAmIGFkZGVkIHJ1biB0ZXN0LgoJICAgIEFkZGVkIEV4YW1wbGVzL2ltcG9ydHMuCgkgICAgQWRkZWQgdHlwZW5hbWUgZm9yIHJhdyBsdWFfU3RhdGUqCgkgICAgQWRkZWQgZG9jdW1lbnRhdGlvbiBvbiBuYXRpdmUgZnVuY3Rpb25zLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRG9jc3RyaW5ncyBhcmUgbm93IHN1cHBvcnRlZC4KCSAgICAlZmVhdHVyZSgiYXV0b2RvYyIpIGFuZCAlZmVhdHVyZSgiZG9jc3RyaW5nIikgYXJlIG5vdwoJICAgIHByb3Blcmx5IHN1cHBvcnRlZCBpbiBSdWJ5LiAgVGhlc2UgZmVhdHVyZXMgd2lsbCBnZW5lcmF0ZQoJICAgIGEgX3dyYXAuY3h4IGZpbGUgd2l0aCByZG9jIGNvbW1lbnRzIGluIHRoZW0uCgowNS8wMi8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBTVEwgZmlsZXMgaGF2ZSBiZWVuIHVwZ3JhZGVkIHRvIGZvbGxvdyB0aGUgbmV3IHN3aWcvcHl0aG9uCgkgICAgTGliL3N0ZCBjb252ZW50aW9ucy4KCSAgICBUaGlzIG1lYW5zIHN0ZDo6dmVjdG9yLCBzdGQ6OnNldCwgc3RkOjptYXAsIHNldDo6bXVsdGltYXAsCgkgICAgc3RkOjptdWx0aXNldCwgc3RkOjpkZXF1ZSBhbmQgc3RkOjpzdHJpbmcgYXJlIG5vdyBwcm9wZXJseQoJICAgIHN1cHBvcnRlZCwgaW5jbHVkaW5nIHRoZWlyIGl0ZXJhdG9ycywgc3VwcG9ydCBmb3IgY29udGFpbmluZwoJICAgIHJ1Ynkgb2JqZWN0cyAoc3dpZzo6R0NfVkFMVUUpIGFuZCBzZXZlcmFsIG90aGVyIHJ1YnkKCSAgICBlbmhhbmNlbWVudHMuCgkgICAgc3RkOjpjb21wbGV4LCBzdGQ6Omlvcywgc3RkOjppb3N0cmVhbSwgc3RkOjppb3N0cmVhbWJ1ZiBhbmQKCSAgICBzdGQ6OnNzdHJlYW0gYXJlIG5vdyBhbHNvIHN1cHBvcnRlZC4KCSAgICBzdGQ6OndzdHJpbmcsIHN0ZDo6d2lvcywgc3RkOjp3aW9zdHJlYW0sIHN0ZDo6d2lvc3RyZWFtYnVmCgkgICAgYW5kIHN0ZDo6d3NzdHJlYW0gYXJlIHN1cHBvcnRlZCB2ZXJiYXRpbSB3aXRoIG5vIHVuaWNvZGUKCSAgICBjb252ZXJzaW9uLgoKCSAgICBzdGRfdmVjdG9yLmkgbm93IG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgUnVieSBBcnJheXMgbXVjaCBtb3JlCgkgICAgY2xvc2VseSwgc3VwcG9ydGluZyBzbGljaW5nLCBzaGlmdGluZywgdW5zaGlmdGluZywKICAgICAgICAgICAgbXVsdGlwbGUgaW5kZXhpbmcgYW5kIHByb3BlciByZXR1cm4gdmFsdWVzIG9uIGFzc2lnbm1lbnQuCgoJICAgIENPTVBBVEFCSUxJVFkgTk9URTogdGhpcyBjaGFuZ2VzIHRoZSBvbGRlciBhcGkgYSBsaXR0bGUgYml0IGluCgkgICAgdGhhdCBpbXByb3BlciBpbmRleGluZyB3b3VsZCBwcmV2aW91c2x5IChpbmNvcnJlY3RseSkgcmFpc2UKCSAgICBleGNlcHRpb25zLiAgTm93LCBuaWwgaXMgcmV0dXJuZWQgaW5zdGVhZCwgZm9sbG93aW5nIHJ1YnkncwoJICAgIHN0YW5kYXJkIEFycmF5IGJlaGF2aW9yLgoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQ2hhbmdlZCB0aGUgdmFsdWUgb2YgU1dJR19UWVBFQ0hFQ0tfQk9PTCB0byBiZSAxMDAwMCAoaWUuIGhpZ2hlcgoJICAgIHRoYW4gdGhhdCBvZiBhbGwgaW50ZWdlcnMpLgoJICAgIFRoaXMgaXMgYmVjYXVzZSBSdWJ5IGFsbG93cyB0eXBlY2FzdGluZwoJICAgIGludGVnZXJzIGRvd24gdG8gYm9vbGVhbnMgd2hpY2ggY2FuIG1ha2Ugb3ZlcmxvYWRlZCBmdW5jdGlvbnMgb24KCSAgICBib29scyBhbmQgaW50ZWdlcnMgdG8gZmFpbC4KCSAgICAoYnVnIyAxNDg4MTQyKQoKMDUvMDIvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgYSBzdWJ0bGUgYnVnIGluIG11bHRpcGxlIGFyZ291dHMgdGhhdCBjb3VsZCBnZXQgdHJpZ2dlcmVkIGlmCgkgICAgdGhlIHVzZXIgcmV0dXJuZWQgdHdvIG9yIG1vcmUgYXJndW1lbnRzIGFuZCB0aGUgZmlyc3Qgb25lIHdhcyBhbgoJICAgIGFycmF5LgoKMDUvMDEvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgSW1wcm92ZWQgdGhlIGRvY3VtZW50YXRpb24gdG8gZG9jdW1lbnQgdGhlIG5ldyBmZWF0dXJlcwogICAgICAgICAgICBhZGRlZCwgYWRkIGRpcmVjdG9yaW4vb3V0L2FyZ291dCB0eXBlbWFwcywgZXRjLgoKMDUvMDEvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgQWRkZWQgJWluaXRzdGFjayBhbmQgJWlnbm9yZXN0YWNrIGRpcmVjdGl2ZXMgZm9yIGRpcmVjdG9yCgkgICAgZnVuY3Rpb25zLiAgVGhlc2UgYWxsb3cgeW91IHRvIGNvbnRyb2wgd2hldGhlciBhIGRpcmVjdG9yCgkgICAgZnVuY3Rpb24gc2hvdWxkIHJlLWluaXQgdGhlIFJ1Ynkgc3RhY2suCgkgICAgVGhpcyBpcyBzb21ldGltZXMgbmVlZGVkIGZvciBhbiBlbWJlZGRlZCBSdWJ5IHdoZXJlIHRoZQoJICAgIGRpcmVjdG9yIG1ldGhvZCBpcyB1c2VkIGFzIGEgQysrIGNhbGxiYWNrIGFuZCBub3QgY2FsbGVkCiAgICAgICAgICAgIGJ5IHRoZSB1c2VyIGZyb20gcnVieSBjb2RlLgoJICAgIEV4cGxhbmF0aW9uOgoJICAgIFJ1YnkncyBHQyBuZWVkcyB0byBiZSBhd2FyZSBvZiB0aGUgcnVubmluZyBPUyBzdGFjayBpbiBvcmRlciB0bwoJICAgIG1hcmsgYW55IFZBTFVFIChSdWJ5IG9iamVjdHMpIGl0IGZpbmRzIHRoZXJlIHRvIGF2b2lkIGNvbGxlY3Rpb24KCSAgICBvZiB0aGVtLiAgVGhpcyBhbGxvd3MgdGhlIHJ1YnkgQVBJIHRvIGJlIHZlcnkgc2ltcGxlIGFuZCBhbGxvd3MKCSAgICB5b3UgdG8gd3JpdGUgY29kZSBsaWtlICJWQUxVRSBhID0gc3RoIiBhbnl3aGVyZSB3aXRob3V0IG5lZWRpbmcKCSAgICB0byBkbyB0aGluZ3MgbGlrZSByZWZjb3VudGluZyBsaWtlIHB5dGhvbi4KCSAgICBCeSBkZWZhdWx0LCB0aGUgc3RhcnQgb2YgdGhlIHN0YWNrIGlzIHNldCB3aGVuIHJ1YnlfaW5pdCgpIGlzCgkgICAgY2FsbGVkLiAgIElmIHJ1YnkgaXMgaW5pdGVkIHdpdGhpbiBtYWluKCksIGFzIGl0IHVzdWFsbHkgaXMgdGhlCgkgICAgY2FzZSB3aXRoIHRoZSBtYWluIHJ1YnkgZXhlY3V0YWJsZSwgcnVieSB3aWxsIGJlIGFibGUgdG8gY2FsY3VsYXRlCgkgICAgaXRzIHN0YWNrIHByb3Blcmx5LiAgSG93ZXZlciwgd2hlbiB0aGlzIGlzIG5vdCBwb3NzaWJsZSwgYXMgd2hlbgoJICAgIHJ1YnkgaXMgZW1iZWRkZWQgYXMgYSBwbHVnaW4gdG8gYW4gYXBwbGljYXRpb24gd2hlcmUgbWFpbiBpcyBub3QKCSAgICBhdmFpbGFibGUsIHJ1YnlfaW5pdCgpIHdpbGwgYmUgY2FsbGVkIGluIHRoZSB3cm9uZyBwbGFjZSwgYW5kCgkgICAgcnVieSB3aWxsIGJlIGluY29ycmVjdGx5IHRyYWNraW5nIHRoZSBzdGFjayBmcm9tIHRoZSBmdW5jdGlvbgoJICAgIHRoYXQgY2FsbGVkIHJ1YnlfaW5pdCgpIGZvcndhcmRzIG9ubHksIHdoaWNoIGNhbiBsZWFkIHRvCgkgICAgYWxsIHNvcnRzIG9mIHdlaXJkIGNyYXNoZXMgb3IgdG8gcnVieSB0aGlua2luZyBpdCBoYXMgcnVuIG91dCBvZgoJICAgIHN0YWNrIHNwYWNlIGluY29ycmVjdGx5LgoJICAgIFRvIGF2b2lkIHRoaXMsIGRpcmVjdG9yIChjYWxsYmFjaykgZnVuY3Rpb25zIGNhbiBub3cgYmUgdGFnZ2VkCgkgICAgdG8gdHJ5IHRvIHJlc2V0IHRoZSBydWJ5IHN0YWNrLCB3aGljaCB3aWxsIHNvbHZlIHRoZSBpc3N1ZXMuCgkgICAgTk9URTogcnVieTEuOC42IHN0aWxsIGNvbnRhaW5zIGEgYnVnIGluIGl0IGluIHRoYXQgaXRzIGZ1bmN0aW9uCgkgICAgdG8gcmVzZXQgdGhlIHN0YWNrIHdpbGwgbm90IGFsd2F5cyBkbyBzby4gIFRoaXMgYnVnIGlzIHRyaWdnZXJlZAoJICAgIHZlcnkgcmFyZWx5LCB3aGVuIHJ1YnkgaXMgY2FsbGVkIGZyb20gdHdvIHZlcnkgZGlzdGluY3QgcGxhY2VzCgkgICAgaW4gbWVtb3J5LCBsaWtlIGEgYnJhbmNoIG9mIG1haW4oKSBhbmQgYW5vdGhlciBkc28uICBUaGlzIGJ1ZwoJICAgIGhhcyBub3cgYmVlbiByZXBvcnRlZCB0byBydWJ5LWNvcmUgYW5kIGlzIHBlbmRpbmcgZnVydGhlcgoJICAgIGludmVzdGlnYXRpb24uCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8zMC8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE3MDc1ODIgLSBSZXN0b3JlIGJ1aWxkaW5nIGZyb20gcmVhZC1vbmx5IHNvdXJjZSBkaXJlY3Rvcmllcy4KCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJ1Ynkgd2lsbCBub3cgcmVwb3J0IHRoZSBwYXJhbWV0ZXIgaW5kZXggcHJvcGVybHkgb24gdHlwZQoJICAgIGVycm9ycyBhcyB3ZWxsIGFzIHRoZSBjbGFzcyBhbmQgdmFsdWUgb2YgdGhlIGluY29ycmVjdAoJICAgIGFyZ3VtZW50IHBhc3NlZC4KCSAgICAoZmVhdHVyZSByZXF1ZXN0ICMxNjk5NjcwKQoKMDQvMzAvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgUnVieSBubyBsb25nZXIgY3JlYXRlcyB0aGUgZnJlZV9DbGFzcyBmdW5jdGlvbiBpZiB0aGUgY2xhc3MKCSAgICBjb250YWlucyBpdHMgb3duIHVzZXIgZGVmaW5lZCBmcmVlIGZ1bmN0aW9uICglZnJlZWZ1bmMpLgoJICAgIChidWcgIzE3MDI4ODIpCgowNC8zMC8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBNYWRlIGRpcmVjdG9ycyByYWlzZSBhIHJ1YnkgZXhjZXB0aW9uIGZvciBpbmNvcnJlY3QgYXJnb3V0CgkgICAgcmV0dXJuZWQgdmFsdWVzIGlmIFJVQllfRU1CRURERUQgaXMgc2V0LCBpbnN0ZWFkIG9mIHRocm93aW5nCgkgICAgYW4gYWN0dWFsIFN3aWdEaXJlY3RvciBleGNlcHRpb24uCgkgICAgVGhpcyB3aWxsIHByZXZlbnQgY3Jhc2hlcyB3aGVuIHJ1YnkgaXMgZW1iZWRkZWQgYW5kIHVuYXdhcmUKCSAgICBvZiB0aGUgU3dpZ0RpcmVjdG9yIGV4Y2VwdGlvbi4KCjA0LzMwLzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFJlbW92ZWQgdGhlIG5lZWQgZm9yIC1EU1dJR0VYVEVSTi4KCSAgICBDaGFuZ2VkIHN3aWdfcnVieV90cmFja2luZ3MgdG8gYmUgYSBzdGF0aWMgdmFyaWFibGUsIGJ1dCBhbHNvCgkgICAgYmUga2VwdCB3aXRoaW4gYSBoaWRkZW4gaW5zdGFuY2UgdmFyaWFibGUgaW4gdGhlIFNXSUcgbW9kdWxlLgoJICAgIFRoaXMgYWxsb3dzIHByb3Blcmx5IGRlYWxpbmcgd2l0aCB0cmFja2luZ3MgYWNyb3NzIG11bHRpcGxlCgkgICAgRFNPcywgd2hpY2ggd2FzIHByZXZpb3VzbHkgYnJva2VuLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIGltcHJvdmVtZW50IHRvIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldIEZpeGVkIEdDIG1lbW9yeSBpc3N1ZXMgd2l0aCB0cmFja2luZ3MgdGhhdCBjb3VsZCBsZWFkCgkgICAgdG8gc2VnZmF1bHRzIHdoZW4gZGVhbGluZywgbWFpbmx5LCB3aXRoIHN0YXRpYyB2YXJpYWJsZXMuCgkgICAgKGJ1ZyAjMTcwMDUzNSBhbmQgcGF0Y2ggIzE3MDI5MDcpCgowNC8yOS8yMDA3OiBnZ2EKCSAgICBbUnVieV0KCSAgICBGaXhlZCBTdHJpbmcgY29udmVyc2lvbiB1c2luZyBvbGQgcnVieTEuNiBtYWNyb3MuICBOb3cKCSAgICBTdHJpbmdWYWx1ZVB0cigpIGlzIHVzZWQgaWYgYXZhaWxhYmxlLiAgVGhpcyByZW1vdmVzIHdhcm5pbmdzCgkgICAgd2hlbiBjb252ZXJ0aW5nIHN0cmluZ3Mgd2l0aCBcMCBpbiB0aGVtLgoJICAgIChidWcgIzE3MDA1MzUgYW5kIHBhdGNoICMxNzAyOTA3KQoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnldCgkgICAgRml4ZWQgdGhlIGFyZ291dCBjb3VudCBpbiBkaXJlY3RvcnMgZm9yIFJ1YnkuICBQcmV2aW91c2x5LAoJICAgIGlnbm9yZWQgb3IgIm51bWlucHV0cz0wIiB0eXBlbWFwcyB3b3VsZCBpbmNvcnJlY3RseSBub3QgZ2V0CgkgICAgY291bnRlZCB0b3dhcmRzIHRoZSBhcmdvdXQgY291bnQuCgkgICAgKGJ1Zy9wYXRjaCAjMTU0NTU4NSkKCjA0LzI5LzIwMDc6IGdnYQoJICAgIFtSdWJ5XQoJICAgIFVwZ3JhZGVkIFJ1YnkgY29udmVydGVyIHRvIHJlY29nbml6ZSAibnVtaW5wdXRzPTAiLiAgUHJldmlvdXNseSwKCSAgICBvbmx5IHRoZSBvbGQgImlnbm9yZSIgZmxhZyB3YXMgY2hlY2tlZCAod2hpY2ggd291bGQgY3VycmVudGx5CgkgICAgc3RpbGwgd29yayBwcm9wZXJseSwgYnV0IGlzIGRlcHJlY2F0ZWQpLgoKMDQvMjkvMjAwNzogZ2dhCgkgICAgW1J1YnkgLSBidXQgc2hvdWxkIGJlIG1hZGUgZ2VuZXJpY10KCgkgICAgJWZlYXR1cmUoIm51bW91dHB1dHMiLCIwIikgYWRkZWQuCgoJICAgIFRoaXMgZmVhdHVyZSBhbGxvd3MgeW91IHRvIGlnbm9yZSB0aGUgb3V0cHV0IG9mIGEgZnVuY3Rpb24gc28KCSAgICB0aGF0IGl0IGlzIG5vdCBhZGRlZCB0byBhIGxpc3Qgb2Ygb3V0cHV0IHZhbHVlcwoJICAgICggaWUuIGFyZ291dHMgKS4KCSAgICBUaGlzIHNob3VsZCBhbHNvIGJlY29tZSBhIGZlYXR1cmUgb2YgJXR5cGVtYXAoZGlyZWN0b3JvdXQpCgkgICAgYXMgIm51bW91dHB1dHMiPTAsIGp1c3QgbGlrZSAibnVtaW5wdXRzIj0wIGV4aXN0cy4KCgkgICAgJWZlYXR1cmUoImRpcmVjdG9ycyI9MSkKCgkgICAgJWluY2x1ZGUgPHR5cGVtYXBzLmk+CgoJICAgICVmZWF0dXJlKCJudW1vdXRwdXRzIiwiMCIpIHsgQ2xhc3M6Om1lbWJlcl9mdW5jdGlvbjEgfTsKCSAgICAldHlwZW1hcChvdXQpIE1TdGF0dXMgeyAvLyBzb21lIGNvZGUsIGxpa2UgY2hlY2sgbXN0YXR1cwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCByYWlzZSBleGNlcHRpb24gaWYgd3JvbmcgfTsKCgkgICAgJWlubGluZSAlewoJICAgICAgdHlwZWRlZiBpbnQgTVN0YXR1czsKCSAgICAgIGNsYXNzIENsYXNzIHsKCgkgICAgICAvLyBvbmUgYXJndW1lbnQgcmV0dXJuZWQsIGJ1dCBkaXJlY3RvciBvdXQgY29kZSBhZGRlZAoJICAgICAgLy8gTVN0YXR1cyBpcyBkaXNjYXJkZWQgYXMgYSByZXR1cm4gKG91dCkgcGFyYW1ldGVyLgoJICAgICAgdmlydHVhbCBNU3RhdHVzIG1lbWJlcl9mdW5jdGlvbjEoIGludCYgT1VUUFVUICk7CgoJICAgICAgLy8gdHdvIGFyZ3VtZW50cyByZXR1cm5lZCwgZGlyZWN0b3Igb3V0IGNvZGUgYWRkZWQKCSAgICAgIC8vIE1TdGF0dXMgaXMgbm90IGRpc2NhcmRlZAoJICAgICAgdmlydHVhbCBNU3RhdHVzIG1lbWJlcl9mdW5jdGlvbjIoIGludCYgT1VUUFVUICk7CgkgICAgICB9OwogICAgICAgICAgICAlfQoKCjA0LzIxLzIwMDc6IG9sbHkKCSAgICBGaXggcGFyc2luZyBvZiBmbG9hdCBjb25zdGFudHMgd2l0aCBhbiBleHBvbmVudCAoZS5nLiAxZS0wMmYpCgkgICAgKGJ1ZyAjMTY5OTY0NikuCgowNC8yMC8yMDA3OiBvbGx5CgkgICAgW1B5dGhvbl0gRml4IGxhY2sgb2YgZ2VuZXJhdGlvbiBvZiBkb2NzdHJpbmdzIHdoZW4gLU8gaXMgdXNlZC4KCSAgICBBbHNvLCBmaXggZ2VuZXJhdGlvbiBvZiBkb2NzdHJpbmdzIGNvbnRhaW5pbmcgYSBkb3VibGUgcXVvdGUKCSAgICBjaGFyYWN0ZXIuICBQYXRjaCBmcm9tIFJpY2hhcmQgQm91bHRvbiBpbiBidWcjMTcwMDE0Ni4KCjA0LzE3LzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gU3VwcG9ydCBmb3IgYWRkaW5nIGluIEphdmEvQyMgY29kZSBiZWZvcmUgYW5kIGFmdGVyIHRoZSBpbnRlcm1lZGlhcnkgY2FsbCwKICAgICAgICAgICAgc3BlY2lmaWNhbGx5IHJlbGF0ZWQgdG8gdGhlIG1hcnNoYWxsaW5nIG9mIHRoZSBwcm94eSB0eXBlIHRvIHRoZSBpbnRlcm1lZGlhcnkgdHlwZS4KICAgICAgICAgICAgVGhlIGphdmFpbi9jc2luIHR5cGVtYXAgbm93IHN1cHBvcnRzIHRoZSAncHJlJyBhbmQgJ3Bvc3QnIGF0dHJpYnV0ZXMgdG8gYWNoaWV2ZSB0aGlzLgogICAgICAgICAgICBUaGUgamF2YWluIHR5cGVtYXAgYWxzbyBzdXBwb3J0cyBhbiBvcHRpb25hbCAncGdjcHBuYW1lJyBhdHRyaWJ1dGUgZm9yIHByZW1hdHVyZSBnYXJiYWdlCiAgICAgICAgICAgIGNvbGxlY3Rpb24gcHJldmVudGlvbiBwYXJhbWV0ZXIgbmFtaW5nIGFuZCB0aGUgY3NpbiB0eXBlbWFwIHN1cHBvcnRzIGFuIG9wdGlvbmFsICdjc2hpbicKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgcGFyYW1ldGVyIHR5cGUgdXNlZCBpbiBhIGNvbnN0cnVjdG9yIGhlbHBlciBnZW5lcmF0ZWQgd2hlbiB0aGUgdHlwZSBpcyB1c2VkCiAgICAgICAgICAgIGluIGEgY29uc3RydWN0b3IuIERldGFpbHMgaW4gdGhlIEphdmEuaHRtbCBhbmQgQ1NoYXJwLmh0bWwgZG9jdW1lbnRhdGlvbi4KCjA0LzE2LzIwMDc6IG9sbHkKCSAgICBEb24ndCB0cmVhdCBgcmVzdHJpY3QnIGFzIGEgcmVzZXJ2ZWQgaWRlbnRpZmllciBpbiBDKysgbW9kZQoJICAgIChidWcjMTY4NTUzNCkuCgowNC8xNi8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIEZpeCBob3cgemVuZF90aHJvd19leGNlcHRpb24oKSBpcyBjYWxsZWQgKGJ1ZyAjMTcwMDc4NSkuCgowNC8xMC8yMDA3OiBvbGx5CgkgICAgRGVmaW5lIFNXSUdURU1QTEFURURJU0FNQklHVUFUT1IgdG8gdGVtcGxhdGUgZm9yIGFDQyAocmVwb3J0ZWQgb24KCSAgICBzd2lnLXVzZXIgdGhhdCB0aGlzIGlzIG5lZWRlZCkuCgowNC8wNC8yMDA3OiBvbGx5CgkgICAgW1BIUDVdIElmIFpUUyBpcyBlbmFibGVkLCByZWxlYXNlIDxtb2R1bGU+X2dsb2JhbHNfaWQgaW4gTVNIVVRET1dOCgkgICAgdG8gYXZvaWQgUEhQIGludGVycHJldGVyIGNyYXNoIG9uIHNodXRkb3duLiAgVGhpcyBzb2x1dGlvbiB3YXMKCSAgICBzdWdnZXN0ZWQgaGVyZTogaHR0cDovL2J1Z3MucGhwLm5ldC9idWcucGhwP2lkPTQwOTg1CgowNC8wMy8yMDA3OiBvbGx5CgkgICAgW1BIUDRdIEFkZCBtaXNzaW5nIFpUUyBhbm5vdGF0aW9ucyB0byBnZW5lcmF0ZWQgQysrIHdyYXBwZXIgY29kZQoJICAgIHRvIGZpeCBjb21waWxhdGlvbiBmYWlsdXJlcyB3aGVuIHVzaW5nIFpUUyBlbmFibGVkIFNXSUcgKExpbnV4CgkgICAgZGlzdHJpYnV0aW9ucyB0ZW5kIHRvIGRpc2FibGUgWlRTLCBidXQgbm90YWJseSB0aGUgV2luZG93cyBidWlsZAoJICAgIHVzZXMgaXQgYnkgZGVmYXVsdCkuCgowNC8wMS8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFBhdGNoICMxNjg0MjYxOiBmaXhlcyBoYW5kbGluZyBvZiB1bnNpZ25lZCBpbnQgbGl0ZXJhbHMsIHRoYW5rcyBMZWlnaCBTbWl0aC4KICAgICAgICAgICAgQWxzbywgaW1wcm92ZWQgZG9jdW1lbnRhdGlvbi4KCjAzLzMwLzIwMDc6IG9sbHkKCSAgICBBdm9pZCBnZW5lcmF0aW5nICc8OicgdG9rZW4gd2hlbiB1c2luZyBTd2lnVmFsdWVXcmFwcGVyPD4gb24gYSB0eXBlCgkgICAgd2hpY2ggc3RhcnRzIHdpdGggJzo6JyAocGF0Y2ggIzE2OTA5NDgpLgoKMDMvMjUvMjAwNzogd3V6emViIChKb2huIExlbnopCgkgICAgW3Blcmw1XSBBZGQgU1dJR19mYWlsIHRvIHRoZSBTV0lHX2V4Y2VwdGlvbiBtYWNyby4gIEZpeGVzIGEgZmV3IHByb2JsZW1zIHJlcG9ydGVkCgkgICAgb24gdGhlIG1haWxpbmcgbGlzdC4KCjAzLzIzLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFN0cmluZyBjb3B5aW5nIHBhdGNoIGZyb20gSm9zaCBDaGVycnkgcmVkdWNpbmcgbWVtb3J5IGNvbnN1bXB0aW9uIGJ5IGFib3V0IDI1JS4KCjAzLzIxLzIwMDc6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBBcHBseSBwYXRjaCAjMTYzMTk4NyBmcm9tIFVscmlrIFBldGVyc29uIC0gYm9vbCBJTk9VVCB0eXBlbWFwcwogICAgICAgICAgICBmYWlsIG9uIGJpZyBlbmRpYW4gbWFjaGluZXMuCgowMy8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0IGdpdmVuIGRvZGd5IEMrKyBjb2RlOiBuYW1lc3BhY2UgYWJjOjpkZWYgeyB9CgowMy8xNi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4ZXMgc28gdGhhdCBBUlJBWVNPRkNMQVNTRVMgYW5kIEFSUkFZU09GRU5VTVMgaW4gYXJyYXlzX2phdmEuaSBjYW4gYmUgYXBwbGllZAogICAgICAgICAgICB0byBwb2ludGVyIHR5cGVzLgoKMDMvMDMvMjAwNzogb2xseQoJICAgIFtQSFA1XSBXaGVuIHdlIGtub3cgdGhlIGxpdGVyYWwgbnVtZXJpYyB2YWx1ZSBmb3IgYSBjb25zdGFudCwgdXNlCgkgICAgdGhhdCB0byBpbml0aWFsaXNlIHRoZSBjb25zdCBtZW1iZXIgaW4gdGhlIFBIUCB3cmFwcGVyIGNsYXNzLgoKMDMvMDIvMjAwNzogb2xseQoJICAgIFtQSFA1XSBGaXggUEhQIHdyYXBwZXIgY29kZSBnZW5lcmF0ZWQgZm9yIGNlcnRhaW4gY2FzZXMgb2YKCSAgICBvdmVybG9hZGVkIGZvcm1zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMuCgowMi8yNi8yMDA3OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIFBhdGNoICMxNjU2Mzk1OiBmaXhlZCBoZXggYW5kIG9jdGFsIHZhbHVlcyBidWcsIHRoYW5rcyB0byBBcnRodXIgU215bGVzLgoKMDIvMjIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ZWQgYnVnIGluIHR5cGVtYXBzIHdoaWNoIGNhdXNlZCBkZXJpdmVkX2J5dmFsdWUgYW5kIHJuYW1lIHRlc3QgY2FzZXMgdG8gZmFpbC4KCSAgICBVcGRhdGVkIGRlcml2ZWRfYnl2YWx1ZS5pIHRvIGV4cGxhaW4gaG93IHRvIGZpbmQgYW5kIGZpeCB0aGUgcHJvYmxlbQoKMDEvMjUvMjAwNzogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxNTM4NTIyIGFuZCAjMTMzODUyNywgZm9yd2FyZCB0ZW1wbGF0ZWQgY2xhc3MgZGVjbGFyYXRpb25zIHdpdGhvdXQgYQogICAgICAgICAgICBuYW1lIGZvciB0aGUgdGVtcGxhdGVkIGNsYXNzIHBhcmFtZXRlcnMsIHN1Y2ggYXM6CgogICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSwgY2xhc3M+IGNsYXNzIFg7CgowMS8yMy8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBQYXRjaCAjMTY0MDg2MjogPG1hbGxvYy5oPiByZXBsYWNlZCBieSA8c3RkbGliLmg+CgkgICAgUGF0Y2ggIzE1OTgwNjMgVHlwbyBpbiB0eXBlbWFwcy5pCgowMS8yMi8yMDA3OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBBZGRlZCBhIGx1YSBzcGVjaWZpYyBjYXJyYXlzLmkgd2hpY2ggYWRkcyB0aGUgb3BlcmF0b3JbXSBzdXBwb3J0LgoJICAgIG1vZGlmaWVkIHRoZSBtYWluIGNvZGUgdG8gbWFrZSBpdCBub3QgZW1pdCBhbGwgdGhlIGNsYXNzIG1lbWJlciBmdW5jdGlvbnMgJiBhY2Nlc3NvcnMKCSAgICBOb3RlOiBDIHN0cnVjdHMgYXJlIGNyZWF0ZWQgdXNpbmcgbmV3X1hYWCgpIHdoaWxlIEMrKyBjbGFzc2VzIHVzZSBYWFgoKSAoc2hvdWxkIGJlIHN0YW5kYXJkaXNlZCkKCSAgICBVcGRhdGVkIHRlc3QgY2FzZTogbGlfY2FycmF5cwoJICAgIFVwZGF0ZWQgdGhlIGRvY3VtZW50YXRpb24uCgowMS8xMi8yMDA3OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGhwXSBBZGQgc3VwcG9ydCBmb3IgbmV3ZnJlZSB0eXBlbWFwcyAoc29tZXRpbWVzIHVzZWQgYnkgJW5ld29iamVjdCkKCjAxLzEyLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IGNvbW1hbmQgbGluZSBvcHRpb24gLW1hY3JvZXJyb3JzLiAgIFdoZW4gc3VwcGxpZWQsIHRoaXMgd2lsbCBmb3JjZQogICAgICAgICAgICB0aGUgQyBzY2FubmVyL3BhcnNlciB0byByZXBvcnQgcHJvcGVyIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciBjb2RlIGNvbnRhaW5lZAogICAgICAgICAgICBpbnNpZGUgU1dJRyBtYWNyb3MgKGRlZmluZWQgd2l0aCAlZGVmaW5lKS4gIEJ5IGRlZmF1bHQsIFNXSUcgbWVyZWx5IHJlcG9ydHMKICAgICAgICAgICAgZXJyb3JzIG9uIHRoZSBsaW5lIGF0IHdoaWNoIGEgbWFjcm8gaXMgdXNlZC4gIFdpdGggdGhpcyBvcHRpb24sIHlvdQogICAgICAgICAgICBjYW4gZXhwYW5kIHRoZSBlcnJvciBiYWNrIHRvIGl0cyBzb3VyY2UtLS1zb21ldGhpbmcgd2hpY2ggbWF5IHNpbXBsaWZ5CiAgICAgICAgICAgIGRlYnVnZ2luZy4KCjAxLzEyLzIwMDc6IGJlYXpsZXkKICAgICAgICAgICAgW0ludGVybmFsc10gTWFqb3Igb3ZlcmhhdWwgb2YgQy9DKysgc2Nhbm5pbmcgaW1wbGVtZW50YXRpb24uICBGb3IgcXVpdGUKICAgICAgICAgICAgc29tZSB0aW1lLCBTV0lHIGNvbnRhaW5lZCB0d28gY29tcGxldGVseSBpbmRlcGVuZGVudCBDL0MrKyB0b2tlbml6ZXJzLS0KICAgICAgICAgICAgdGhlIGxlZ2FjeSBzY2FubmVyIGluIENQYXJzZS9jc2Nhbm5lci5jIGFuZCBhIGdlbmVyYWwgcHVycG9zZSBzY2FubmVyCiAgICAgICAgICAgIGluIFN3aWcvc2Nhbm5lci5jLiBTV0lHIHN0aWxsIGhhcyB0d28gc2Nhbm5pbmcgbW9kdWxlcywgYnV0IHRoZSBDIHBhcnNlcgogICAgICAgICAgICBzY2FubmVyIChDUGFyc2UvY3NjYW5uZXIuYykgbm93IHJlbGllcyB1cG9uIHRoZSBnZW5lcmFsIHB1cnBvc2UKICAgICAgICAgICAgc2Nhbm5lciBmb3VuZCBpbiBTd2lnL3NjYW5uZXIuYy4gIEFzIGEgcmVzdWx0LCBpdCBpcyBtdWNoIHNtYWxsZXIgYW5kCiAgICAgICAgICAgIGxlc3MgY29tcGxpY2F0ZWQuICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG1haW50YWluIGFsbAogICAgICAgICAgICBvZiB0aGUgbG93LWxldmVsIEMgdG9rZW5pemluZyBpbiBvbmUgY2VudHJhbCBsb2NhdGlvbiBpbnN0ZWFkIG9mIHR3bwogICAgICAgICAgICBwbGFjZXMgYXMgYmVmb3JlLgoKICAgICAgICAgICAgKioqUE9URU5USUFMIEZMQUtJTkVTUyoqKgogICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgY2F1c2UgcHJvYmxlbXMgd2l0aCBhY2N1cmF0ZSBsaW5lIG51bWJlciByZXBvcnRpbmcKICAgICAgICAgICAgYXMgd2VsbCBhcyBlcnJvciByZXBvcnRpbmcgbW9yZSBnZW5lcmFsbHkuIEkgaGF2ZSB0cmllZCB0byByZXNvbHZlIHRoaXMKICAgICAgICAgICAgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYnV0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgY29ybmVyIGNhc2VzLgoKMDEvMTIvMjAwNzogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gQWRkZWQgdHlwZW1hcCB0aHJvd3MgZm9yIHN0ZDo6c3RyaW5nKiwgdHlwZW1hcCBmb3IgU1dJR1RZUEUgRFlOQU1JQywKCSAgICBjaGFuZ2VkIHRoZSBleGlzdGluZyB0aHJvd3MgdHlwZW1hcCB0byB0aHJvdyBhIHN0cmluZyBpbnN0ZWFkIG9mIG1ha2luZyBhIGNvcHkgb2YKCSAgICB0aGUgb2JqZWN0ICh1cGRhdGluZyBhIGZldyB0ZXN0IGNhc2VzIHRvIGRlYWwgd2l0aCB0aGUgY2hhbmdlKS4KCSAgICBmaXhlZCB0ZXN0IGNhc2U6IGR5bmFtaWNfY2FzdHMsIGV4Y2VwdGlvbl9wYXJ0aWFsX2luZm8sIGxpX3N0ZF9zdHJpbmcsIHNpemVfdAoKMDEvMDMvMjAwNzogYmVhemxleQogICAgICAgICAgICBbSW50ZXJuYWxzXS4gIFVzZSBvZiBzd2lna2V5cy5jLy5oIHZhcmlhYmxlcyBpcyByZXZva2VkLiAgUGxlYXNlIHVzZQogICAgICAgICAgICBzaW1wbGUgc3RyaW5ncyBmb3IgYXR0cmlidXRlIG5hbWVzLgoKMTIvMzAvMjAwNjogYmVhemxleQogICAgICAgICAgICBJbnRlcm5hbCBBUEkgZnVuY3Rpb25zIEhhc2hHZXRBdHRyKCkgYW5kIEhhc2hDaGVja0F0dHIoKSBoYXZlIGJlZW4gcmV2b2tlZC4KICAgICAgICAgICAgUGxlYXNlIHVzZSBHZXRhdHRyKCkgdG8gcmV0cmlldmUgYXR0cmlidXRlcy4gIFRoZSBmdW5jdGlvbiBDaGVja2F0dHIoKSBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBjaGVjayBhdHRyaWJ1dGVzLiAgTm90ZTogIFRoZXNlIGZ1bmN0aW9ucyBoYXZlIGJlZW4gcmV2b2tlZAogICAgICAgICAgICBiZWNhdXNlIHRoZXkgb25seSBhZGRlZCBhIG1hcmdpbmFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGF0IHRoZSBleHBlbnNlCiAgICAgICAgICAgIGNvZGUgY2xhcml0eS4KCjEyLzI2LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIEFkZGVkIG1vcmUgU1RMIChtb3JlIGV4Y2VwdGlvbnMsIG1hcCwgc2l6ZV90KSwKCSAgICBmaXhlZCB0ZXN0IGNhc2U6IGNvbnZlcnNpb25fbnNfdGVtcGxhdGUuCgoxMi8yMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXSBVcGRhdGUgdG8gdGhyb3cgZXJyb3JzIHdoZW4gc2V0dGluZyBpbW11dGFibGVzLAoJICAgIGFuZCBhbGxvd2luZyB1c2VyIGFkZGl0aW9uIG9mIG1vZHVsZSB2YXJpYWJsZXMuCgoxMi8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggdHlwZWRlZidkIHZhcmlhYmxlIHdyYXBwZXJzIHRoYXQgdXNlICVuYXR1cmFsdmFyLCBlZywgc3RkOjpzdHJpbmcuCgoxMi8xNC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEFkZCBzdGQ6OndzdHJpbmcgYW5kIHdjaGFyX3QgdHlwZW1hcHMKCjEyLzE0LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBGaXggYnVnICMxNjEzNjczIChiYWQgUEhQNSBjb2RlIGdlbmVyYXRlZCBmb3IgZ2V0dGVycyBhbmQKCSAgICBzZXR0ZXJzKS4KCjEyLzAyLzIwMDY6IHdzZnVsdG9uLCBKb2huIExlbnosIERhdmUgQmVhemxleQogICAgICAgICAgICBNb3ZlIGZyb20gY3ZzIHRvIFN1YnZlcnNpb24gZm9yIHNvdXJjZSBjb250cm9sCgoxMS8zMC8yMDA2OiBiZWF6bGV5CiAgICAgICAgICAgIENsZWFuZWQgdXAgc3dpZ3dhcm5pbmdzLnN3ZyBmaWxlIG5vdCB0byB1c2UgbmVzdGVkIG1hY3JvCiAgICAgICAgICAgIGRlZmluaXRpb25zLgoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBGaXggZm9yICVleHRlbmQgdG8gd29yayBmb3Igc3RhdGljIG1lbWJlciB2YXJpYWJsZXMuCgpWZXJzaW9uIDEuMy4zMSAoTm92ZW1iZXIgMjAsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjExLzEyLzIwMDY6IEx1aWdpIEJhbGxhYmlvCiAgICAgICAgICAgIFtQeXRob25dIEFsdGVybmF0ZSBmaXggZm9yIFB5dGhvbiBleGNlcHRpb25zIGJ1ZyAjMTU3ODM0NiAodGhlIHByZXZpb3VzIG9uZSBicm9rZSBQeXRob24KICAgICAgICAgICAgcHJvcGVydGllcyBpbiBtb2Rlcm4gY2xhc3NlcykKCjExLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIC1mYWtldmVyc2lvbiBjb21tYW5kbGluZSBvcHRpb24gbm93IGdlbmVyYXRlcyB0aGUgZmFrZSB2ZXJzaW9uIGludG8gdGhlIGdlbmVyYXRlZCB3cmFwcGVycwogICAgICAgICAgICBhcyB3ZWxsIGFzIGRpc3BsYXlpbmcgaXQgd2hlbiB0aGUgLXZlcnNpb24gY29tbWFuZGxpbmUgb3B0aW9uIGlzIHVzZWQuCgoxNC8xMS8yMDA2OiBtZ29zc2FnZQoJICAgIFtsdWFdIHVwZGF0ZSB0byB0eXBlbWFwIGZvciBvYmplY3QgYnkgdmFsdWUsIHRvIG1ha2UgaXQgYzg5IGNvbXBsaWFudAoKVmVyc2lvbiAxLjMuMzAgKE5vdmVtYmVyIDEzLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbamF2YV0gUmVtb3ZlIERldGFjaEN1cnJlbnRUaHJlYWQgcGF0Y2ggZnJvbSAgMDgvMTEvMjAwNiAtIGl0IGNhdXNlcyBzZWdmYXVsdHMKICAgICAgICAgICAgb24gc29tZSBzeXN0ZW1zLgoKMTEvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW3B5dGhvbl0gRml4ICMxNTc4MzQ2IC0gUHl0aG9uIGV4Y2VwdGlvbnMgd2l0aCAtbW9kZXJuCgoxMS8xMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1OTMyOTEgLSBTbWFydCBwb2ludGVycyBhbmQgaW5oZXJpdGluZyBmcm9tIHRlbXBsYXRlcyAKCjExLzA5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBkaXJlY3RvciBvcGVyYXRvciBwb2ludGVyL3JlZmVyZW5jZSBjYXN0cyAtICMxNTkyMTczLgoKMTEvMDcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgQWRkICRzZWxmIHNwZWNpYWwgdmFyaWFibGUgZm9yICVleHRlbmQgbWV0aG9kcy4gUGxlYXNlIHVzZSB0aGlzIGluc3RlYWQgb2YganVzdCAnc2VsZicKICAgICAgICAgICAgYXMgdGhlIEMrKyAndGhpcycgcG9pbnRlci4KCjExLzA3LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0gCgkgICAgYWxsZWdyb2NsLnN3Zzogc3dpZy1kZWZ2YXIgdXBkYXRlZCB0byBhbGxvdyBzcGVjaWZ5aW5nIG9mCgkgICAgCQkgICBub24tZGVmYXVsdCBmb3JlaWduIHR5cGUgKHZpYSA6ZnR5cGUga2V5d29yZCBhcmcpLgoJICAgIGFsbGVncm9jbC5jeHg6IFNwZWNpZnkgcHJvcGVyIGFjY2VzcyB0eXBlIGZvciBlbnVtIHZhbHVlcy4KCjExLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhL0MjXSBGaXggY29uc3Qgc3RkOjpzdHJpbmcmIHJldHVybiB0eXBlcyBmb3IgZGlyZWN0b3JzIGFzIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIE1hcmsgRG9uc2Vsem1hbm4KCjEwLzI5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZW1vdmUgRGVsZXRlTG9jYWxSZWYgZnJvbSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyBmb3Igbm93IGFzIGl0IGlzIGNhdXNpbmcgYQogICAgICAgICAgICBzZWcgZmF1bHQgd2hlbiBydW4gb24gU29sYXJpcyA4LgoKMTAvMjkvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0d1aWxlXSBQYXRjaCBmcm9tIENocmlzIFNob2VtYWtlciB0byBjbGVhbiB1cCBzb21lIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZS4KCjEwLzI5LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBJbXBvcnRhbnQgZml4IHRvIHByZXZlbnQgZWFybHkgZ2FyYmFnZSBjb2xsZWN0aW9uIG9mIHRoZSBKYXZhIHByb3h5IGNsYXNzCiAgICAgICAgICAgIHdoaWxlIGl0IGlzIGJlaW5nIHVzZWQgaW4gYSBuYXRpdmUgbWV0aG9kLiBUaGUgZmluYWxpemVyIGNvdWxkIGRlc3Ryb3kgdGhlIHVuZGVybHlpbmcKICAgICAgICAgICAgQysrIG9iamVjdCB3aGlsZSBpdCB3YXMgYmVpbmcgdXNlZC4gVGhlIHByb2JsZW0gb2NjdXJzIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIG5vCiAgICAgICAgICAgIGxvbmdlciBzdHJvbmdseSByZWFjaGFibGUgYWZ0ZXIgYSBuYXRpdmUgY2FsbC4gIFRoZSBwcm9ibGVtIHNlZW1zIHRvIG9jY3VyIGluCiAgICAgICAgICAgIG1lbW9yeSBzdHJlc3Mgc2l0dWF0aW9ucyBvbiBzb21lIEpWTXMuIEl0IGRvZXMgbm90IHNlZW0gdG8gb2NjdXIgb24gdGhlCiAgICAgICAgICAgIFN1biBjbGllbnQgSlZNIHVwIHRvIGpkayAxLjUuIEhvd2V2ZXIgdGhlIDEuNiBjbGllbnQgamRrIGhhcyBhIG1vcmUgYWdncmVzc2l2ZSBnYXJiYWdlCiAgICAgICAgICAgIGNvbGxlY3RvciBhbmQgc28gdGhlIHByb2JsZW0gZG9lcyBvY2N1ci4gSXQgZG9lcyBvY2N1ciBvbiB0aGUgU3VuIHNlcnZlcgogICAgICAgICAgICBKVk1zIChjZXJ0YWlubHkgMS40IG9ud2FyZHMpLiBUaGUgZml4IGVudGFpbHMgcGFzc2luZyB0aGUgcHJveHkgY2xhc3MgaW50byB0aGUgbmF0aXZlCiAgICAgICAgICAgIG1ldGhvZCBpbiBhZGRpdGlvbiB0byB0aGUgQysrIHBvaW50ZXIgaW4gdGhlIGxvbmcgcGFyYW1ldGVyLCBhcyBKYXZhIGNsYXNzZXMgYXJlIG5vdAogICAgICAgICAgICBjb2xsZWN0ZWQgd2hlbiB0aGV5IGFyZSBwYXNzZWQgaW50byBKTkkgbWV0aG9kcy4gVGhlIGV4dHJhIHBhcmFtZXRlciBjYW4gYmUgc3VwcHJlc3NlZAogICAgICAgICAgICBieSBzZXR0aW5nIHRoZSBub3BnY3BwIGF0dHJpYnV0ZSBpbiB0aGUganR5cGUgdHlwZW1hcCB0byAiMSIgb3IgdXNpbmcgdGhlIG5ldyAtbm9wZ2NwcAogICAgICAgICAgICBjb21tYW5kbGluZSBvcHRpb24uCgogICAgICAgICAgICBTZWUgSmF2YS5odG1sI2phdmFfcGdjcHAgZm9yIGZ1cnRoZXIgZGV0YWlscyBvbiB0aGlzIHRvcGljLgoKMTAvMjQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggc21hcnQgcG9pbnRlciB3cmFwcGVycy4gVGhlIHZpcnR1YWwvb3ZlcnJpZGUvbmV3IGtleXdvcmQgaXMgbm90IGdlbmVyYXRlZAogICAgICAgICAgICBmb3IgZWFjaCBtZXRob2QgYXMgdGhlIHNtYXJ0IHBvaW50ZXIgY2xhc3MgZG9lcyBub3QgbWlycm9yIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIKICAgICAgICAgICAgY2xhc3MgaW5oZXJpdGFuY2UgaGllcmFyY2h5LiBTRiAjMTQ5NjUzNQoKMTAvMjQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW2x1YV0gYWRkZWQgc3VwcG9ydCBmb3IgbmF0aXZlIG1ldGhvZHMgJiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCiAgICAgICAgICAgIGZpeGVkIHRlc3QgY2FzZXMgYXJyYXlzX2RpbWVuc2lvbmxlc3MgJiBjcHBfYmFzaWMuIEFkZGVkIG5ldyBleGFtcGxlIChmdW5jdG9yKS4KICAgICAgICAgICAgdGlkaWVkIHVwIGEgbGl0dGxlIG9mIHRoZSBjb2RlIChhcm91bmQgY2xhc3NIYW5kbGVyKS4KCjEwLzE3LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gZGlyZWN0b3JvdXQgdHlwZW1hcCBjaGFuZ2VzIHRvIGZhbGwgaW4gbGluZSB3aXRoIHRoZSBvdGhlciBkaXJlY3RvcgogICAgICAgICAgICBsYW5ndWFnZXMuICRyZXN1bHQgaXMgbm93IHVzZWQgd2hlcmUgJDEgdXNlZCB0byBiZSB1c2VkLiBQbGVhc2UgY2hhbmdlIHlvdXIgdHlwZW1hcHMKICAgICAgICAgICAgaWYgeW91IGhhdmUgYSBjdXN0b20gZGlyZWN0b3JvdXQgdHlwZW1hcC4KCjEwLzE4LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNvbWUgZml4ZXMgZm9yIGFwcGx5aW5nIHRoZSBjaGFyIGFycmF5IHR5cGVtYXBzIHRvIHVuc2lnbmVkIGNoYXIgYXJyYXlzLgoKMTAvMTcvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBBZGQgaW4gY29uc3Qgc2l6ZV90JiBhbmQgY29uc3Qgc3RkOjpzaXplX3QmIHR5cGVtYXBzLgoKMTAvMTUvMjAwNjogZWZ1enp5b25lIAogICAgICAgICAgICBbQ0ZGSV0gU3VwcHJlc3MgZ2VuZXJhdGluZyBkZWZjdHlwZSBmb3IgZW51bXMsIHRoYW5rcyB0byBBcnRodXIgU215bGVzLiBQYXRjaCAxNTYwOTgzLiAKCjEwLzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbQ2hpY2tlbl0gTWlub3IgZml4IHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggdGhlIChhcyB5ZXQgdW5yZWxlYXNlZCkgY2hpY2tlbiAyLjUKCiAgICAgICAgICAgIFtHdWlsZSxDaGlja2VuXSBGaXggU0YgQnVnIDE1NzM4OTIuICBBZGRlZCBhbiBleHRfdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSB0byB0ZXN0CiAgICAgICAgICAgIHRoaXMgYnVnLCBidXQgdGhpcyB0ZXN0IGNhbiBub3QgcmVhbGx5IGJlIG1hZGUgZ2VuZXJpYyBiZWNhdXNlIHRoZSBleHRlcm5hbCBjb2RlIG11c3QKICAgICAgICAgICAgcGx1ZyBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgaW50ZXJwcmV0ZXIgZGlyZWN0bHkuCiAgICAgICAgICAgIFNlZSBFeGFtcGxlcy90ZXN0LXN1aXRlL2NoaWNrZW4vZXh0X3Rlc3QuaSBhbmQgZXh0X3Rlc3RfZXh0ZXJuYWwuY3h4CgogICAgICAgICAgICBBZGRlZCBhICUuZXh0ZXJuYWx0ZXN0IHRvIGNvbW1vbi5taywgYW5kIGFueSBpbnRlcmVzdGVkIGxhbmd1YWdlIG1vZHVsZXMgY2FuCiAgICAgICAgICAgIGNvcHkgYW5kIHNsaWdodGx5IG1vZGlmeSBlaXRoZXIgdGhlIGNoaWNrZW4gb3IgdGhlIGd1aWxlIGV4dF90ZXN0LmkKCjEwLzE0LzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdIGFkZGVkIE9VVFBVVCYgZm9yIGFsbCBudW1iZXIgdHlwZXMsIGFkZGVkIGEgbG9uZyBsb25nIHR5cGUKICAgICAgICAgICAgZml4ZWQgc2V2ZXJhbCB0ZXN0IGNhc2VzLgogICAgICAgICAgICB1cGRhdGU6IGNoYW5nZWQgdHlwZW1hcHMgdG8gdXNlIFNXSUdfQ29udmVydFB0ciByYXRoZXIgdGhhbiBTV0lHX011c3RHZXRQb2ludGVyCiAgICAgICAgICAgIHN0YXJ0ZWQgc3BsaXRpbmcgbHVhLnN3ZyBpbnRvIHNtYWxsZXIgcGFydHMgdG8gbWFrZSBpdCBuZWF0ZXIKCjEwLzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gTWFyZ2luYWxseSBiZXR0ZXIgc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2Ugb25seSBpbiB0aGF0IHlvdSBjYW4KICAgICAgICAgICAgY29udHJvbCB3aGF0IHRoZSBiYXNlIGNsYXNzIGlzLiBUaGlzIGlzIGRvbmUgdXNpbmcgdGhlIG5ldyAncmVwbGFjZScgYXR0cmlidXRlIGluIHRoZSAKICAgICAgICAgICAgamF2YWJhc2UvY3NiYXNlIHR5cGVtYXAsIGVnIGluIHRoZSBmb2xsb3dpbmcsICdNZScgd2lsbCBiZSB0aGUgYmFzZSBjbGFzcywKICAgICAgICAgICAgbm8gbWF0dGVyIHdoYXQgRm9vIGlzIHJlYWxseSBkZXJpdmVkIGZyb20gaW4gdGhlIEMrKyBsYXllci4KCiAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWJhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIjsKICAgICAgICAgICAgICAldHlwZW1hcChjc2Jhc2UsIHJlcGxhY2U9IjEiKSBGb28gIk1lIjsKCiAgICAgICAgICAgIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIGphdmFiYXNlL2NzYmFzZSB0eXBlbWFwcyB0byBvdmVycmlkZSB0aGUgQysrIGJhc2UuCgoxMC8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gUmVtb3ZlIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbiBvbiB0aGUgcHJveHkgY2xhc3MnIGRlbGV0ZSgpIG1ldGhvZCAKICAgICAgICAgICAgKGl0IGlzIG5vdyBhIHN5bmNocm9uaXplZCBtZXRob2QsIGJ1dCBpcyBub3cgY3VzdG9taXNhYmxlIGJ5IGNoYW5naW5nIHRoZSAKICAgICAgICAgICAgbWV0aG9kbW9kaWZpZXJzIGF0dHJpYnV0ZSBpbiB0aGUgamF2YWRlc3RydWN0IG9yIGphdmFkZXN0cnVjdF9kZXJpdmVkIHR5cGVtYXApCgogICAgICAgICAgICBbQyNdIFJlbW92ZSBwb3RlbnRpYWwgcmFjZSBjb25kaXRpb24gb24gdGhlIHByb3h5IGNsYXNzJyBEaXNwb3NlKCkgbWV0aG9kLCAKICAgICAgICAgICAgc2ltaWxhciB0byBKYXZhJ3MgZGVsZXRlKCkgYWJvdmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIFJlbW92ZSByZWR1bmRhbnQgZGlyZWN0b3IgY29kZSBpbiAlZXh0ZW5kIG1ldGhvZHMgKCVleHRlbmQKICAgICAgICAgICAgbWV0aG9kcyBjYW5ub3QgYmUgZGlyZWN0b3IgbWV0aG9kcykKCjEwLzEyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob25dIEZpeCAjMTUwNTU5NCAtIGRpcmVjdG9yIG9iamVjdHMgbm90IHJldHVybmVkIGFzIGRpcmVjdG9yIG9iamVjdHMKICAgICAgICAgICAgaW4gJWV4dGVuZCBtZXRob2RzLgoKMTAvMTEvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCAjMTIzODc5OCAtIERpcmVjdG9ycyB1c2luZyB1bnNpZ25lZCBsb25nIGxvbmcgb3IgYW55IG90aGVyIHR5cGUKICAgICAgICAgICAgbWFyc2hhbGxlZCBhY3Jvc3MgdGhlIEpOSSBib3VuZGFyeSB1c2luZyBhIEphdmEgY2xhc3MgKHdoZXJlIHRoZSBqbmkgdHlwZW1hcCAKICAgICAgICAgICAgY29udGFpbnMgam9iamVjdCkuCgoxMC8wNi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzExNjIxOTQgLSAjaW5jbHVkZS8laW5jbHVkZSB3aXRoaW4gYSBzdHJ1Y3R1cmUKCjEwLzA2LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ1MDY2MSwgc3RyaW5nIHRydW5jYXRpb24gaW4gU3RyaW5nX3NlZWsgdHJ1bmNhdGluZyBKYXZhL0MjIGVudW1zLgoKMTAvMDYvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gRml4ICMxNTY5NTg3LiBUaGUgbmFtZSBpcyBub3cgY29ycmVjdC4KCjEwLzA0LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yIGZpeGVzIGZvciB2aXJ0dWFsIGNvbnZlcnNpb24gb3BlcmF0b3JzCgoxMC8wNC8yMDA2OiBvbGx5CgkgICAgW3BocF0gRml4ICMxNTY5NTg3IGZvciBQSFAuICBEb24ndCB1c2Ugc2l6ZW9mKCkgZXhjZXB0IHdpdGggc3RyaW5nCgkgICAgbGl0ZXJhbHMuICBDaGFuZ2Ugc29tZSAiLy8iIGNvbW1lbnRzIHRvICIvKiAqLyIgZm9yIHBvcnRhYmlsaXR5LgoKMTAvMDQvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0gUGFydGlhbCBGaXggIzE1Njk1ODcuIFRoZSB0eXBlIGlzIG5vdyBjb3JyZWN0LCBidXQgdGhlIG5hbWUgaXMgc3RpbGwgbm90IGNvcnJlY3QuCgoxMC8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4ICMxNTI3ODg1IC0gT3ZlcmxvYWRlZCBkaXJlY3RvciB2aXJ0dWFsIG1ldGhvZHMgc29tZXRpbWVzIHByb2R1Y2VkCiAgICAgICAgICAgIHVuY29tcGlsYWJsZSBjb2RlIHdoZW4gdXNlZCB3aXRoIHRoZSBkaXJlY3RvcjpleGNlcHQgZmVhdHVyZS4KCjEwLzAzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIERpcmVjdG9yczogRGlyZWN0b3JzIGFyZSBvdXRwdXQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlY2xhcmVkIGluIAogICAgICAgICAgICB0aGUgQysrIGNsYXNzIHJhdGhlciB0aGFuIGluIHNvbWUgcHNldWRvLXJhbmRvbSBvcmRlci4KCjEwLzAzLzIwMDY6IG1tYXR1cwogICAgICAgICAgICBGaXggIzE0ODYyODEgYW5kICMxNDcxMDM5LgoKMTAvMDMvMjAwNjogb2xseQoJICAgIFtQZXJsXSBGaXggZm9yIGhhbmRsaW5nIHN0cmluZ3Mgd2l0aCB6ZXJvIGJ5dGVzIGZyb20gU3RlcGhlbiBIdXRzYWwuCgowOS8zMC8yMDA2OiBlZnV6enlvbmUKICAgICAgICAgICAgW0NGRkldIEJpdGZpZWxkIHN1cHBvcnQgYW5kIHZhcmFyZyBzdXBwb3J0IGR1ZSB0byBBcnRodXIgU215bGVzLgogICAgICAgICAgICBDIGV4cHJlc3Npb24gdG8gTGlzcCBjb252ZXJzaW9uLCB0aGFua3MgdG8gQXJ0aHVyIFNteWxlcyBmb3IgdGhlIGluaXRpYWwKICAgICAgICAgICAgaWRlYSwgaXQgbm93IHN1cHBvcnRzIGNvbnZlcnNpb24gZm9yIGEgd2hvbGUgcmFuZ2Ugb2YgQyBleHByZXNzaW9ucy4gCgowOS8yOC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggIzE1MDgzMjcgLSBPdmVybG9hZGVkIG1ldGhvZHMgYXJlIGhpZGRlbiB3aGVuIHVzaW5nIC1mdmlydHVhbCBvcHRpbWlzYXRpb24uCiAgICAgICAgICAgIE92ZXJsb2FkZWQgbWV0aG9kcyBhcmUgbm8gbG9uZ2VyIGNhbmRpZGF0ZXMgZm9yIGVsaW1pbmF0aW9uIC0gdGhpcyBtaW1pY3MKICAgICAgICAgICAgQysrIGJlaGF2aW91ciB3aGVyZSBhbGwgb3ZlcmxvYWRlZCBtZXRob2RzIG11c3QgYmUgZGVmaW5lZCBhbmQgaW1wbGVtZW50ZWQKICAgICAgICAgICAgaW4gYSBkZXJpdmVkIGNsYXNzIGluIG9yZGVyIGZvciB0aGVtIHRvIGJlIGF2YWlsYWJsZS4KCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtSdWJ5LCBQeXRob24sIE9jYW1sXSBGaXggIzE1MDU1OTEgVGhyb3dpbmcgZXhjZXB0aW9ucyBpbiBleHRlbmRlZCBkaXJlY3RvcnMKCjA5LzI1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTA1NjEwMCAtIHZpcnR1YWwgb3BlcmF0b3JzLiAKCjA5LzI0LzIwMDY6IG9sbHkKCSAgICBEb24ndCBhY2NpZGVudGFsbHkgY3JlYXRlIGEgIjw6IiB0b2tlbiAod2hpY2ggaXMgdGhlIHNhbWUgYXMgIlsiIGluIEMrKykuCgkgICAgRml4ZXMgYnVnICMgMTUyMTc4OC4KCjA5LzIzLzIwMDY6IG9sbHkKCSAgICBbUnVieV0gU3VwcG9ydCBidWlsZGluZyB3aXRoIHJlY2VudCB2ZXJzaW9ucyBvZiB0aGUgUnVieSAxLjkKCSAgICBkZXZlbG9wbWVudCBicmFuY2guICBGaXhlcyBidWcgIzE1NjAwOTIuCgowOS8yMy8yMDA2OiBvbGx5CgkgICAgVGVtcGxhdGVzIGNhbiBub3cgYmUgaW5zdGFudGlhdGVkIHVzaW5nIG5lZ2F0aXZlIG51bWJlcnMgYW5kCgkgICAgY29uc3RhbnQgZXhwcmVzc2lvbnMsIGUuZy46CgoJICAgIHRlbXBsYXRlPGludCBxPiBjbGFzcyB4IHt9OwoJICAgICV0ZW1wbGF0ZSh4X21pbnVzMSkgeDwtMT47CgkgICAgJXRlbXBsYXRlKHhfMXBsdXMyKSB4PDErMj47CgoJICAgIEFsc28sIGNvbnN0YW50IGV4cHJlc3Npb25zIGNhbiBub3cgaW5jbHVkZSBjb21wYXJpc29ucyAoPiwgPCwgPj0sCgkgICAgPD0sICE9LCA9PSksIG1vZHVsdXMgKCUpLCBhbmQgdGVybmFyeSBjb25kaXRpb25hbHMgKGEgPyBiIDogYykuCgoJICAgIEZpeGVzIGJ1Z3MgIzY0NjI3NSwgIzkyNTU1NSwgIzk1NjI4MiwgIzk5NDMwMS4KCjA5LzIyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAlaWdub3JlIG9uIGRpcmVjdG9yIG1ldGhvZHMgLSBCdWdzICMxNTQ2MjU0LCAjMTU0MzUzMwoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICVpZ25vcmUgb24gZGlyZWN0b3IgY29uc3RydWN0b3JzCgowOS8yMC8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggc2VnIGZhdWx0cyBhbmQgYXNzZXJ0cyB3aGVuIGRpcmVjdG9yIG1ldGhvZHMgYXJlIGlnbm9yZWQgKCMxNTQzNTMzKQoKMDkvMjAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IG91dCBvZiBzb3VyY2UgYnVpbGRzIC0gYnVnICMxNTQ0NzE4CgowOS8yMC8yMDA2OiBvbGx5CgkgICAgVHJlYXQgYSBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbiBhcyBhIGZvcndhcmQgZGVjbGFyYXRpb24gcmF0aGVyCgkgICAgdGhhbiBpZ25vcmluZyBpdCBjb21wbGV0ZWx5LCBzbyB0aGF0IHdlIGdlbmVyYXRlIGNvcnJlY3QgY29kZSBmb3IKCSAgICBwYXNzaW5nIG9wYXF1ZSBwb2ludGVycyB0byB0aGUgbmVzdGVkIGNsYXNzIChmaXhlcyBTRiBidWcgIzkwOTM4NykuCgowOS8yMC8yMDA2OiBvbGx5CiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIFtwaHBdIE92ZXJsb2FkIHJlc29sdXRpb24gbm93IHdvcmtzLiAgSG93ZXZlciB0byBhbGxvdyB0aGlzLCBTV0lHCgkgICAgZ2VuZXJhdGVkIHdyYXBwZXJzIG5vIGxvbmdlciBjb2VyY2UgUEhQIHR5cGVzICh3aGljaCByZXZlcnRzIGEgY2hhbmdlCgkgICAgbWFkZSBpbiAxLjMuMjYpLiAgU28gZm9yIGV4YW1wbGUsIGlmIGEgbWV0aG9kIHRha2VzIGEgc3RyaW5nLCB5b3UKCSAgICBjYW4gbm8gbG9uZ2VyIHBhc3MgYSBudW1iZXIgd2l0aG91dCBleHBsaWNpdGx5IGNvbnZlcnRpbmcgaXQgdG8gYQoJICAgIHN0cmluZyBpbiBQSFAgdXNpbmc6IChzdHJpbmcpeAoKMDkvMTgvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0FMTF0gZml4IG9uIHN3aWdpbml0LnN3ZywgaGFzIGJlZW4gcmVwb3J0ZWQgdG8gY3Jhc2ggb24gc2V2ZXJhbCB0ZXN0IGNhc2VzCgkgICAgZm91bmQgYW5kIGZpeGVkIHByb2JsZW0gaW4gaW1wb3J0cyB1bmRlciBweXRob24gKG1pbmd3KQoKMDkvMTYvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1B5dGhvbl0gUGF0Y2ggZnJvbSBNaWNoYWwgTWFyZWsgZm9yIFB5dGhvbiAyLjUgdG8gZml4IDY0IGJpdCBhcnJheSBpbmRleGVzIG9uCiAgICAgICAgICAgIDY0IGJpdCBtYWNoaW5lcy4KCjA5LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFRoZSBleHBsaWNpdGNhbGwgZmVhdHVyZSBoYXMgYmVlbiBzY3JhcHBlZC4gVGhpcyBmZWF0dXJlIHdhcyBpbnRyb2R1Y2VkIHByaW1hcmlseQogICAgICAgICAgICB0byBzb2x2ZSByZWN1cnNpdmUgZGlyZWN0b3IgbWV0aG9kIGNhbGxzLiBEaXJlY3RvciB1cGNhbGwgaW1wcm92ZW1lbnRzIG1hZGUgaW5zdGVhZDoKCiAgICAgICAgICAgIFtQeXRob24sIFJ1YnksIE9jYW1sXSBUaGUgc3dpZ191cCBmbGFnIGlzIG5vIGxvbmdlciB1c2VkLiBUaGUgcmVxdWlyZWQgbXV0ZXhlcwogICAgICAgICAgICB3cmFwcGluZyB0aGlzIGZsYWcgYXJlIGFsc28gbm8gbG9uZ2VyIG5lZWRlZC4gVGhlIHJlY3Vyc2l2ZSBjYWxscyBnb2luZyBmcm9tIEMrKwogICAgICAgICAgICB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIGFuZCBiYWNrIGFnYWluIGV0YyBhcmUgbm93IGF2b2lkZWQgYnkgYSBzdWJ0bGVseSBkaWZmZXJlbnQKICAgICAgICAgICAgYXBwcm9hY2guIEluc3RlYWQgb2YgdXNpbmcgdGhlIHN3aWdfdXAgZmxhZyBpbiBlYWNoIGRpcmVjdG9yIG1ldGhvZCB0byBpbmRpY2F0ZQogICAgICAgICAgICB3aGV0aGVyIHRoZSBleHBsaWNpdCBDKysgY2FsbCB0byB0aGUgYXBwcm9wcmlhdGUgYmFzZSBjbGFzcyBtZXRob2Qgb3IgYSBub3JtYWwKICAgICAgICAgICAgcG9seW1vcnBoaWMgQysrIGNhbGwgc2hvdWxkIGJlIG1hZGUsIHRoZSBuZXcgYXBwcm9hY2ggbWFrZXMgb25lIG9mIHRoZXNlIGNhbGxzCiAgICAgICAgICAgIGRpcmVjdGx5IGZyb20gdGhlIHdyYXBwZXIgbWV0aG9kLgoKICAgICAgICAgICAgW0phdmEsIEMjXSBUaGUgcmVjdXJzaXZlIGNhbGwgcHJvYmxlbSB3aGVuIGNhbGxpbmcgYSBDKysgYmFzZSBjbGFzcyBtZXRob2QgZnJvbQogICAgICAgICAgICBKYXZhL0MjIGlzIG5vdyBmaXhlZC4gVGhlIGltcGxlbWVudGF0aW9uIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzCiAgICAgICAgICAgIGFzIHRoZSBkZXRlY3Rpb24gYXMgdG8gd2hldGhlciB0aGUgZXhwbGljaXQgY2FsbCBvciBhIG5vcm1hbCBwb2x5bW9ycGhpYyBjYWxsIGlzIG1hZGUKICAgICAgICAgICAgaW4gdGhlIEphdmEvQyMgbGF5ZXIgcmF0aGVyIHRoYW4gaW4gdGhlIEMrKyBsYXllci4KCjA5LzExLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtBTExdIHVwZGF0ZWQgc3dpZ2luaXQuc3dnIHRvIGFsbG93IG11bHRpcGxlIGludGVycHJldGVycyB0byB1c2UgbXVsdGlwbGUKCSAgICBzd2lnIG1vZHVsZXMgYXQgb25jZS4gVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgaW4gTHVhIChtaW5ndyAmIGxpbnV4KSwKCSAgICBwZXJsNSAmIHB5dGhvbiAobGludXgpIG9ubHkuCgowOS8xMS8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbbHVhXSBhZGRlZCBzdXBwb3J0IGZvciBwYXNzaW5nIGZ1bmN0aW9uIHBvaW50ZXJzIGFzIHdlbGwgYXMgbmF0aXZlIGx1YSBvYmplY3QKICAgICAgICAgICAgaW50byB3cmFwcGVyZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIEFkZGVkIGV4YW1wbGUgZnVuY3B0cjMgdG8gZGVtb25zdHJhdGUgdGhpcyBmZWF0dXJlCgowOS8wNS8yMDA2OiBvbGx5CgkgICAgW3BocF0gUmVuYW1lIEVycm9yQ29kZSBhbmQgRXJyb3JNc2cgI2RlZmluZS1zIHRvIFNXSUdfRXJyb3JDb2RlCgkgICAgYW5kIFNXSUdfRXJyb3JNc2cgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIGNvZGUgdGhlIHVzZXIgbWlnaHQgYmUKCSAgICB3cmFwcGluZyAocGF0Y2ggZnJvbSBEYXJyZW4gV2FybmVyIGluIFNGIGJ1ZyAjMTQ2NjA4NikuICBBbnkKCSAgICB1c2VyIHR5cGVtYXBzIHdoaWNoIHVzZSBFcnJvckNvZGUgYW5kL29yIEVycm9yTXNnIGRpcmVjdGx5IHdpbGwKCSAgICBuZWVkIGFkanVzdGluZyAtIHlvdSBjYW4gZWFzaWx5IGZpeCB0aGVtIHRvIHdvcmsgd2l0aCBib3RoIG9sZAoJICAgIGFuZCBuZXcgU1dJRyBieSBjaGFuZ2luZyB0byB1c2UgU1dJR19FcnJvck1zZyBhbmQgYWRkaW5nOgoKCQkjaWZuZGVmIFNXSUdfRXJyb3JNc2cKCQkjZGVmaW5lIFNXSUdfRXJyb3JNc2coKSBFcnJvck1zZygpCgkJI2VuZGlmCgowOC8yOS8yMDA2OiBvbGx5CgkgICAgW3BocF0gTW92ZSBjb25zdGFudCBpbml0aWFsaXNhdGlvbiBmcm9tIFJJTklUIHRvIE1JTklUIHRvIGZpeCBhCgkgICAgd2FybmluZyB3aGVuIHVzaW5nIEFwYWNoZSBhbmQgbW9kX3BocC4gIFdlIG9ubHkgbmVlZCB0byBjcmVhdGUKCSAgICBQSFAgY29uc3RhbnRzIG9uY2Ugd2hlbiB3ZSdyZSBmaXJzdCBpbml0aWFsaXNlZCwgbm90IGZvciBldmVyeSBIVFRQCgkgICAgcmVxdWVzdC4KCjA4LzIxLzIwMDY6IG1nb3NzYWdlCiAgICAgICAgICAgIFtMdWFdCgkgICAgQnVnZml4ICMxNTQyNDY2IGFkZGVkIGNvZGUgdG8gYWxsb3cgbWFwcGluZyBMdWEgbmlsJ3MgPC0+IEMvQysrIE5VTEwncwoJICAgIHVwZGF0ZWQgdmFyaW91cyB0eXBlbWFwcyB0byB3b3JrIGNvcnJlY3RseSB3aXRoIHRoZSBjaGFuZ2VzCgkgICAgYWRkZWQgdm9pZHRlc3RfcnVubWUubHVhIHRvIHNob3cgdGhlIGZlYXR1cmVzIHdvcmtpbmcKCjA4LzE5LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtHdWlsZV0gQWRkIGZlYXR1cmU6Y29uc3Rhc3ZhciB0byBleHBvcnQgY29uc3RhbnRzIGFzIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIGZ1bmN0aW9ucwogICAgICAgICAgICB0aGF0IHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUuCgowOC8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRGV0YWNoQ3VycmVudFRocmVhZCBjYWxscyBoYXZlIGJlZW4gYWRkZWQgc28gdGhhdCBuYXRpdmVseSBjcmVhdGVkIHRocmVhZHMKICAgICAgICAgICAgbm8gbG9uZ2VyIHByZXZlbnQgdGhlIEpWTSBmcm9tIGV4aXRpbmcuIEJ1ZyByZXBvcnRlZCBieSBUaG9tYXMgRHVkemlhayBhbmQKICAgICAgICAgICAgUGF1bCBOb2xsLgoKMDgvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXggZGlyZWN0b3IgcHJvdGVjdGVkIG1ldGhvZHMgc28gdGhleSB3b3JrCgowNy8yNS8yMDA2OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbW9yZSBhZGRpdGlvbnMgdG8gc3RkOjpzdHJpbmcsIHNvbWUgdHdlYWtzIGFuZCBzbWFsbCBidWcgZml4ZXMKCSAgICAtbm9jd3JhcCBtb2RlLgoKMDcvMjEvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0x1YV0KCSAgICBCdWdmaXggIzE1MjYwMjIgcGRhdGVkIHN0ZDo6c3RyaW5nIHRvIHN1cHBvcnQgc3RyaW5ncyB3aXRoICdcMCcgaW5zaWRlIHRoZW0KCSAgICB1cGRhdGVkIHR5cGVtYXBzLmkgdG8gYWRkIHN1cHBvcnQgZm9yIHBvaW50ZXIgdG8gcG9pbnRlcnMKCjA3LzE5LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICAtIEFkZCBzdGRfc3RyaW5nLmkgc3VwcG9ydC4KCSAgICAtIEFkZCBuZXdvYmplY3QgcGF0Y2ggc3VibWl0dGVkIGJ5IG1rb2VwcGUgKHRoYW5rcyEpCgkgICAgLSBGaXggdHlwZSBuYW1lIG1pc21hdGNoIGlzc3VlIGZvciBuZXN0ZWQgdHlwZSBkZWZpbml0aW9ucy4KCSAgICAgIHNwZWNpZmljYWxseSB0eXBlZGVmcyBpbiB0ZW1wbGF0ZWQgY2xhc3MgZGVmbnMuCgowNy8xOC8yMDA2OiBtZ29zc2FnZQoJICAgIEJ1Z2ZpeCAjMTUyMjg1OAoJICAgIHVwZGF0ZWQgbHVhLmN4eCB0byBzdXBwb3J0IC1leHRlcm5hbC1ydW50aW1lIGNvbW1hbmQKCjA3LzE0LzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIEluY3JlbWVudCB0aGUgU1dJR19SVU5USU1FX1ZFUlNJT04gdG8gMywgYmVjYXVzZSBvZiB0aGUKCSAgICBhZGRpdGlvbiBvZiB0aGUgb3duZGF0YSBtZW1iZXIgaW4gc3dpZ190eXBlX2luZm8uCgkgICAgUmVwb3J0ZWQgYnk6IFByYWJodSBSYW1hY2hhbmRyYW4KCjA3LzA1LzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlYXJjaCBwYXRoIGZpeGVzOgogICAgICAgICAgICAtIEZpeCBzZWFyY2ggcGF0aCBmb3IgbGlicmFyeSBmaWxlcyB0byBiZWhhdmUgYXMgZG9jdW1lbnRlZCBpbiBMaWJyYXJ5Lmh0bWwuCiAgICAgICAgICAgIC0gRml4IG1pbmd3L21zeXMgYnVpbGRzIHdoaWNoIGRpZCBub3QgZmluZCB0aGUgU1dJRyBsaWJyYXJ5IHdoZW4gaW5zdGFsbGVkLgogICAgICAgICAgICAtIFdpbmRvd3MgYnVpbGRzIGFsc28gb3V0cHV0IHRoZSBtaW5ndy9tc3lzIGluc3RhbGwgbG9jYXRpb24gd2hlbiBydW5uaW5nCiAgICAgICAgICAgICAgc3dpZyAtc3dpZ2xpYi4KICAgICAgICAgICAgLSBUaGUgbm9uLWV4aXN0ZW50IGFuZCB1bmRvY3VtZW50ZWQgY29uZmlnIGRpcmVjdG9yeSBpbiB0aGUgc2VhcmNoIHBhdGggaGFzCiAgICAgICAgICAgICAgYmVlbiByZW1vdmVkLgoKMDcvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4ICRzeW1uYW1lIHNwZWNpYWwgdmFyaWFibGUgZXhwYW5zaW9uLgoKMDcvMDQvMjAwNjogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dCgkgICAgQWRkICVmZWF0dXJlKCJjb25zdGFzdmFyIiksIHdoaWNoIGluc3RlYWQgb2YgZXhwb3J0aW5nIGEgY29uc3RhbnQgYXMgYQoJICAgIHNjaGVtZSBmdW5jdGlvbiwgZXhwb3J0cyB0aGUgY29uc3RhbnQgYXMgYSBzY2hlbWUgdmFyaWFibGUuICBVcGRhdGUgdGhlCgkgICAgZG9jdW1lbnRhdGlvbiBhcyB3ZWxsLgoKMDcvMDQvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1NlZSBlbnRyeSBvZiAwOS8xMy8yMDA2IC0gZXhwbGljaXRjYWxsIGZlYXR1cmUgYW5kIGRvY3VtZW50YXRpb24gdG8gaXQgcmVtb3ZlZF0KICAgICAgICAgICAgTmV3IGV4cGxpY2l0Y2FsbCBmZWF0dXJlIHdoaWNoIGdlbmVyYXRlcyBhZGRpdGlvbmFsIHdyYXBwZXJzIGZvciB2aXJ0dWFsIG1ldGhvZHMKICAgICAgICAgICAgdGhhdCBjYWxsIHRoZSBtZXRob2QgZXhwbGljaXRseSwgbm90IHJlbHlpbmcgb24gcG9seW1vcnBoaXNtIHRvIG1ha2UgdGhlIG1ldGhvZAogICAgICAgICAgICBjYWxsLiBUaGUgZmVhdHVyZSBpcyBhIGZlYXR1cmUgZmxhZyBhbmQgaXMgZW5hYmxlZCBsaWtlIGFueSBvdGhlciBmZWF0dXJlIGZsYWcuCiAgICAgICAgICAgIEl0IGFsc28gcmVjb2duaXNlcyBhbiBhdHRyaWJ1dGUsICJzdWZmaXgiIGZvciBtYW5nbGluZyB0aGUgZmVhdHVyZSBuYW1lLCBzZWUKICAgICAgICAgICAgU1dJR1BsdXMuaHRtbCNTV0lHUGx1c19leHBsaWNpdGNhbGwgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgW0phdmEsIEMjXQogICAgICAgICAgICBUaGUgZXhwbGljaXRjYWxsIGZlYXR1cmUgaXMgYWxzbyBhIHdvcmthcm91bmQgZm9yIHNvbHZpbmcgdGhlIHJlY3Vyc2l2ZSBjYWxscwogICAgICAgICAgICBwcm9ibGVtIHdoZW4gYSBkaXJlY3RvciBtZXRob2QgbWFrZXMgYSBjYWxsIHRvIGEgYmFzZSBjbGFzcyBtZXRob2QuIFNlZQogICAgICAgICAgICBKYXZhLmh0bWwjamF2YV9kaXJlY3RvcnNfZXhwbGljaXRjYWxsIGZvciB1cGRhdGVkIGRvY3VtZW50YXRpb24uCgowNi8yOC8yMDA2OiBqb2UgKEpvc2VwaCBXYW5nKQoJICAgIFtyXSBJbml0aWFsIHN1cHBvcnQgZm9yIFIKCjA2LzIwLzIwMDY6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQogICAgICAgICAgICBNaW5vciBmaXhlcyB0byBnZXQgYXBwbHlfc3RyaW5ncy5pIHRlc3RzdWl0ZSB0byBwYXNzCgkgICAgUmVtb3ZlIGludGVnZXJzX3J1bm1lLnNjbSBmcm9tIHRoZSB0ZXN0c3VpdGUsIGJlY2F1c2UgU1dJRyBhbmQgQ2hpY2tlbiBkb2VzCiAgICAgICAgICAgIGhhbmRsZSBvdmVyZmxvd3MuCgowNi8xOS8yMDA1OiBvbGx5CgkgICAgW3BocF0gQWRkIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgUEhQNSBjbGFzcyB3cmFwcGVycyBmb3IgQysrCgkgICAgY2xhc3NlcyAodXNlICJzd2lnIC1waHA1IikuCgowNi8xNy8yMDA2OiBvbGx5CgkgICAgW3BocF0gQWRkZWQgc29tZSBtaXNzaW5nIGtleXdvcmRzIHRvIHRoZSBQSFA0IGtleXdvcmQgbGlzdCwgYW5kCgkgICAgZml4ZWQgX19MSU5FX18gYW5kIF9fRklMRV9fIHdoaWNoIHdlcmUgaW4gdGhlIHdyb25nIGNhdGVnb3J5LgoJICAgIEFsc28gYWRkZWQgYWxsIHRoZSBrZXl3b3JkcyBuZXcgaW4gUEhQNSwgYW5kIGFkZGVkIGNvbW1lbnRzCgkgICAgbm90aW5nIHRoZSBQSFA0IGtleXdvcmRzIHdoaWNoIGFyZW4ndCBrZXl3b3JkcyBpbiBQSFA1LgoKMDYvMTcvMjAwNjogb2xseQoJICAgIFtwaHBdIERvbid0IHNlZ2ZhdWx0IGlmIFBIUCBOdWxsIGlzIHBhc3NlZCBhcyB0aGlzIHBvaW50ZXIgKGUuZy4KCSAgICBDbGFzc19tZXRob2QoTnVsbCkpIC0gZ2l2ZSBhIFBIUCBFcnJvciBpbnN0ZWFkLgoKMDYvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIHN0ZDo6bGlzdCBjb250YWluZXIgY2xhc3MuCgkgICAgRml4IGEgZmV3IGJ1Z3MgaW4gaGVscGVyIGZ1bmN0aW9ucy4KCjA1LzEzLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBSZXBsYWNlIEpOSUVYUE9SVCB3aXRoIFNXSUdFWFBPUlQsIHRoZXJlYnkgZW5hYmxpbmcgdGhlIHBvc3NpYmlsaXR5CiAgICAgICAgICAgIG9mIHVzaW5nIGdjYyAtZnZpc2liaWxpdHk9aGlkZGVuIGZvciBwb3RlbnRpYWxseSBzbWFsbGVyIGZhc3RlciBsb2FkaW5nIHdyYXBwZXJzLgoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBNYWtlZmlsZXMgZm9yIGF1dG9jb25mLTIuNjAgYmV0YQoKMDUvMTMvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgVmxhZGltaXIgTWVuc2hha292IHBhdGNoIGZvciBjb21waWxpbmcgd3JhcHBlcnMgd2l0aCBweXRob24tMi41IGFscGhhLgoKMDUvMTIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgRml4IGJ1ZmZlciBvdmVyZmxvdyBlcnJvciB3aGVuIHVzaW5nIGxhcmdlICVmZWF0dXJlKGRvY3N0cmluZykgcmVwb3J0ZWQKICAgICAgICAgICAgYnkgSm9zZXBoIFdpbnN0b24uCgowNS8xMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gT3BlcmF0b3Igb3ZlcmxvYWQgZml4IGZyb20gRGFuaWVsIE1vb3JlLgoKMDUvMjUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gZ2VuZXJhdGlvbiBvZiBDTE9TIHR5cGUgZGVjbGFyYXRpb25zIGZvciB1bmlvbnMKCSAgICBhbmQgZXF1aXZhbGVudCB0eXBlcy4KCjA1LzI0LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBEb24ndCByZXF1aXJlIGEgZnVsbCBjbGFzcyBkZWZpbml0aW9uIHRvIGdlbmVyYXRlIGEgQ0xPUyB3cmFwcGVyLgoKMDUvMjAvMjAwNjogb2xseQoJICAgIFtwaHBdIEdDQyBWaXNpYmlsaXR5IHN1cHBvcnQgbm93IHdvcmtzIHdpdGggUEhQLgoKMDUvMTkvMjAwNjogb2xseQoJICAgIFtwaHBdIFJlbW92ZWQgc3VwcG9ydCBmb3IgLWRsbmFtZSAodXNlIC1tb2R1bGUgaW5zdGVhZCkuICBGaXhlZAoJICAgIG5hbWluZyBvZiBQSFAgZXh0ZW5zaW9uIG1vZHVsZSB0byBiZSBjb25zaXN0ZW50IHdpdGggUEhQCgkgICAgY29udmVudGlvbnMgKG5vICJwaHBfIiBwcmVmaXggb24gVW5peDsgb24gUEhQID49IDQuMy4wLCBoYW5kbGUgVW5peAoJICAgIHBsYXRmb3JtcyB3aGljaCB1c2Ugc29tZXRoaW5nIG90aGVyIHRoYW4gIi5zbyIgYXMgdGhlIGV4dGVuc2lvbi4pCgowNS8xMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIERpcmVjdG9yIHN1cHBvcnQgYWRkZWQKCjA1LzA3LzIwMDY6IG9sbHkKCSAgICBbcGhwXSBEb24ndCBzZWdmYXVsdCBpZiBQSFAgTnVsbCBpcyBwYXNzZWQgd2hlcmUgYSBDKysgcmVmZXJlbmNlCgkgICAgaXMgd2FudGVkLgoKMDUvMDUvMjAwNjogb2xseQoJICAgIFtwaHBdIEZpeCB3cmFwcGVycyBnZW5lcmF0ZWQgZm9yIGdsb2JhbCAnY2hhcicgdmFyaWFibGVzIHRvIG5vdAoJICAgIGluY2x1ZGUgYSB0ZXJtaW5hdGluZyB6ZXJvIGJ5dGUgaW4gdGhlIFBIUCBzdHJpbmcuCgowNS8wMy8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBNb2RpZnkgdHlwZW1hcHMgc28gdGhhdCBjaGFyICogY2FuIGJlIGFwcGxpZWQgdG8gdW5zaWduZWQgY2hhciAqIG9yIHNpZ25lZCBjaGFyICoKICAgICAgICAgICAgdHlwZXMgYW5kIHZpc2EgdmVyc2EuCgowNS8wMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV1UaGFua3MgdG8gTHVrZSBKIENyb29rIGZvciB0aGlzIGlkZWEuCiAgICAgICAgICAgICAtIGEgc3RydWN0L2VudW0vdW5pb24gaXMgcmVwbGFjZWQgd2l0aCA6cG9pbnRlciBvbmx5IGlmCiAgICAgICAgICAgICAgIHRoYXQgc2xvdCBpcyBhY3R1YWxseSBhIHBvaW50ZXIgdG8gdGhhdCB0eXBlLiBTbyw6IAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhX3N0cnVjdCB7IGludCB4OyB9IGFuZAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiX3N0cnVjdCB7IGFfc3RydWN0IHN0cnVjdF8xOyB9OyAKICAgICAgICAgICAgICAgd2lsbCBiZSBjb252ZXJ0ZWQgYXM6CiAgICAgICAgICAgICAgICAgICAoY2ZmaTpkZWZjc3RydWN0IGJfc3RydWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3RfMSBhX3N0cnVjdCkpCiAgICAgICAgICAgICAtIE90aGVyIG1pbm9yIGZpeGVzIGluIGxpc3BpZnlpbmcgbmFtZXMuCgowNS8wMi8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggcG9zc2libGUgcmVkZWZpbml0aW9uIG9mIF9DUlRfU0VDVVJFX05PX0RFUFJFQ0FURSBmb3IgVkMrKy4KCjA0LzE0LzIwMDY6IGVmdXp6eW9uZQoJICAgIFtjZmZpXQogICAgICAgICAgICBUaGFua3MgdG8gVGhvbWFzIFdlaWRuZXIgZm9yIHRoZSBwYXRjaC4KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgZXhwb3J0IGlzIHNldCAoZXhwb3J0ICdmb28pIGlzIAogICAgICAgICAgICAgIGdlbmVyYXRlZCBmb3IgZXZlcnkgc3ltYm9sCiAgICAgICAgICAgIC0gd2hlbiBmZWF0dXJlIGlubGluZSBpcyBzZXQgKGRlY2xhaW0gKGlubGluZSBmb28pKSBpcyAKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYmVmb3JlIGV2ZXJ5IGZ1bmN0aW9uIGRlZmluaXRpb24KICAgICAgICAgICAgLSB3aGVuIGZlYXR1cmUgaW50ZXJuX2Z1bmN0aW9uIGlzIHNldCAKICAgICAgICAgICAgICAjLih2YWx1ZS1vZi1pbnRlcm4tZnVuY3Rpb24gIm5hbWUiICJub2RlVHlwZSIgcGFja2FnZSkKICAgICAgICAgICAgICBpcyBlbWl0dGVkIGluc3RlYWQgb2YgdGhlIHBsYWluIHN5bWJvbC4gQSBzYW1wbGUgc3dpZy1saXNwaWZ5IAogICAgICAgICAgICAgIGlzIHByb3ZpZGVkLgogICAgICAgICAgICAtIGV2ZXJ5IHN5bWJvbCBpcyBwcmVmaXhlZCBieSBpdCdzIHBhY2thZ2UuCgowNC8xMy8yMDA2OiBlZnV6enlvbmUKCSAgICBbY2ZmaV0KCSAgICBGaXhlZCB0aGUgZ2VuZXJhdGlvbiBvZiB3cmFwcGVycyBmb3IgZ2xvYmFsIHZhcmlhYmxlcy4gCiAgICAgICAgICAgIEFkZGVkIHRoZSBvcHRpb24gW25vXXN3aWctbGlzcCB3aGljaCB0dXJucyBvbi9vZmYgZ2VuZXJhdGlvbiAKICAgICAgICAgICAgb2YgY29kZSBmb3Igc3dpZyBoZWxwZXIgbGlzcCBtYWNybywgZnVuY3Rpb25zLCBldGMuCgpWZXJzaW9uIDEuMy4yOSAoTWFyY2ggMjEsIDIwMDYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA0LzA1LzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBGaXggb3V0cHV0IHR5cGVtYXAgb2YgY2hhciBzbyBpdCBwcm9kdWNlcyBhIGNoYXJhY3RlciBpbnN0ZWFkCgkgICAgb2YgYW4gaW50ZWdlci4gQWxzbyBhZGRzIGlucHV0L291dHB1dCB0eXBlbWFwcyBmb3IgJ2NoYXIgKicuCgoJICAgIGFkZCBjb21tYW5kLWxpbmUgYXJndW1lbnQgLWlzb2xhdGUgdG8gZ2VuZXJhdGUgYW4gaW50ZXJmYWNlCgkgICAgZmlsZSB0aGF0IHdvbid0IGludGVyZmVyZSB3aXRoIG90aGVyIFNXSUcgZ2VuZXJhdGVkIGZpbGVzIHRoYXQKCSAgICBtYXkgYmUgdXNlZCBpbiB0aGUgc2FtZSBhcHBsaWNhdGlvbi4KCjAzLzIwLzIwMDU6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBNb3JlIHR3ZWFrcyB0byBJTlBVVC9PVVRQVVQgdHlwZW1hcHMgZm9yIGJvb2wuCgoJICAgIEZpeCBjb25zdGFudFdyYXBwZXIgZm9yIGNoYXIgYW5kIHN0cmluZyBsaXRlcmFscy4KCgkgICAgZmluZC1kZWZpbml0aW9uIGtleWJpbmRpbmdzIHNob3VsZCB3b3JrIGluIEVMSS9TTElNRS4KCSAgICBPdXRwdXQgKGluLXBhY2thZ2UgPG1vZHVsZS1uYW1lPikgdG8gbGlzcCB3cmFwcGVyCgkgICAgaW5zdGVhZCBvZiAoaW4tcGFja2FnZSAjLipzd2lnLW1vZHVsZS1uYW1lKikuCgoJICAgIHNsaWdodCByZXdvcmsgb2YgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KCgkgICAgZG9jIHVwZGF0ZXMuCgowMy8xNy8yMDA1OiBtdXRhbmRpegoJICAgIFthbGxlZ3JvY2xdCgkgICAgbWFuZ2xlIG5hbWVzIG9mIGNvbnN0YW50cyBnZW5lcmF0ZWQgdmlhIGNvbnN0YW50V3JhcHBlci4KCSAgICAKCSAgICBXaGVuIHVzaW5nIE9VVFBVVCB0eXBlbWFwcyBhbmQgdGhlIGZ1bmN0aW9uIGhhcyBhIG5vbi12b2lkCgkgICAgcmV0dXJuIHZhbHVlLCBpdCBzaG91bGQgYmUgZmlyc3QgaW4gdGhlIHZhbHVlcy1saXN0LCBmb2xsb3dlZAoJICAgIGJ5IHRoZSBPVVRQVVQgbWFwcGVkIHZhbHVlcy4KCgkgICAgRml4IGJ1ZyB3aXRoIGJvb2xlYW4gcGFyYW1ldGVycywgd2hpY2ggbmVlZGVkIHRvIGJlCgkgICAgcGFzc2VkIGluIGFzIGludCB2YWx1ZXMsIHJhdGhlciB0aGFuIFQgb3IgTklMLgoKMDMvMTUvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEdlbmVyYXRlIHdyYXBwZXJzIGZvciBjb25zdGFudHMgd2hlbiBpbiBDKysgb3IgLWN3cmFwIG1vZGUuCgkgICAgTWFrZSAtY3dyYXAgdGhlIGRlZmF1bHQsIHNpbmNlIGl0IGlzIG1vc3QgY29ycmVjdC4gVXNlcnMKCSAgICBjYW4gdXNlIHRoZSAtbm9jd3JhcCBvcHRpb24gdG8gYXZvaWQgdGhlIGNyZWF0aW9uIG9mIGEgLmN4eAoJICAgIGZpbGUgd2hlbiBpbnRlcmZhY2luZyB0byBDIGNvZGUuCgoJICAgIFdoZW4gaW4gLW5vY3dyYXAgbW9kZSwgaW1wcm92ZSB0aGUgaGFuZGxpbmcgb2YgY29udmVydGluZwogCSAgICBpbmZpeCBsaXRlcmFscyB0byBwcmVmaXggbm90YXRpb24gZm9yIGxpc3AuIFRoaXMgaXMgdmVyeQoJICAgIGJhc2ljIGFuZCBub3QgbGlrZWx5IHRvIGJlIGltcHJvdmVkIHVwb24gc2luY2UgdGhpcyBvbmx5CgkgICAgYXBwbGllcyB0byB0aGUgLW5vY3dyYXAgY2FzZS4gTGl0ZXJhbHMgd2UgY2FuJ3QgZmlndXJlIG91dAoJICAgIHdpbGwgcmVzdWx0IGluIGEgd2FybmluZyBhbmQgYmUgaW5jbHVkZWQgaW4gdGhlIGdlbmVyYXRlZAoJICAgIGNvZGUuCgoJICAgIHZhbGlkSWRlbnRpZmllciBub3cgbW9yZSBjbG9zZWx5IGFwcHJveGltYXRlcyB3aGF0IG1heSBiZQoJICAgIGEgbGVnYWwgY29tbW9uIGxpc3Agc3ltYm9sLgoKCSAgICBGaXggdHlwZW1hcCBlcnJvciBpbiBhbGxlZ3JvY2wuc3dnCgkgICAgCjAzLzEyLzIwMDY6IG11dGFuZGl6CgkgICAgW2FsbGVncm9jbF0KCSAgICBmaXggdXAgSU5QVVQvT1VUUFVUIHR5cGVtYXBzIGZvciBib29sLgoJICAgIEdlbmVyYXRlIGMrKyBzdHlsZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3Igc3RydWN0L3VuaW9uIG1lbWJlcnMKCSAgICB3aGVuIC1jd3JhcCBvcHRpb24gc3BlY2lmaWVkLgoKMDMvMTAvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEZpeCBidWcgaW4gQyB3cmFwcGVyIGdlbmVyYXRpb24gaW50cm9kdWNlZCBieSBsYXN0IGFsbGVncm9jbAoJICAgIGNvbW1pdC4KCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBDb21taXQgIzE0NDczMzcgLSBEZWxldGUgTG9jYWxSZWZzIGF0IHRoZSBlbmQgb2YgZGlyZWN0b3IgbWV0aG9kcyB0byBmaXggcG90ZW50aWFsIGxlYWsKCjAzLzEwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCAjMTQ0NDk0OSAtIGNvbmZpZ3VyZSBkb2VzIG5vdCBob25vciAtLXByb2dyYW0tcHJlZml4LgogICAgICAgICAgICBSZW1vdmVkIG5vbi1zdGFuZGFyZCBjb25maWd1cmUgb3B0aW9uIC0td2l0aC1yZWxlYXNlLXN1ZmZpeC4gRml4IHRoZSBhdXRvY29uZiBzdGFuZGFyZAogICAgICAgICAgICBvcHRpb25zIC0tcHJvZ3JhbS1wcmVmaXggYW5kIC0tcHJvZ3JhbS1zdWZmaXggd2hpY2ggd2VyZSBiZWluZyBzaG93biBpbiB0aGUgaGVscCwKICAgICAgICAgICAgYnV0IHdlcmUgYmVpbmcgaWdub3JlZC4gVXNlIC0tcHJvZ3JhbS1zdWZmaXggaW5zdGVhZCBvZiAtLXdpdGgtcmVsZWFzZS1zdWZmaXggbm93LgoKMDMvMTAvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIEZpeCAjMTQ0NjMxOSB3aXRoIHBhdGNoIGZyb20gYW5kcmVhc3RoIC0gbW9yZSB0aGFuIG9uZSB3c3RyaW5nIHBhcmFtZXRlciBpbiBkaXJlY3RvciBtZXRob2RzCgowMy8wNy8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlXSAKCSAgICBGaXggZm9yIG1vZHVsZSBuYW1lcyBjb250YWluaW5nIGEgIi0iIGluIG5vbi0ic2hhZG93IiBtb2RlLgoJICAgIFBhdGNoIGZyb20gQWFyb24gVmFuRGV2ZW5kZXIgKCMxNDQxNDc0KS4KCjAzLzA0LzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIC1PIHRvIHRoZSBtYWluIHByb2dyYW0sIHdoaWNoIG5vdyBlbmFibGVzIC1mYXN0ZGlzcGF0Y2gKCSAgICAKCSAgICBbUHl0aG9uXQoKCSAgICAtIEFkZCB0aGUgLWZhc3Rpbml0IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIF9faW5pdF9fCiAgICAgICAgICAgICAgbWV0aG9kcy4gU2V0dGluZyAndGhpcycgYXMgJ3NlbGYudGhpcy5hcHBlbmQodGhpcyknIGluIHRoZSBweXRob24KCSAgICAgIGNvZGUgY29uZnVzZXMgUHlMdWNlbmUuIE5vdyB0aGUgaW5pdGlhbGl6YXRpb24gaXMgZG9uZSBpbiB0aGUKCSAgICAgIHRoZSBDKysgc2lkZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBhbmQgUm9iaW4uCgoJICAgIC0gQWRkIHRoZSAtZmFzdHF1ZXJ5IG9wdGlvbiB0byBlbmFibGUgZmFzdGVyIFNXSUdfVHlwZVF1ZXJ5IHZpYSBhCiAgICAgICAgICAgICAgcHl0aG9uIGRpY3QgY2FjaGUsIGFzIHByb3Bvc2VkIGJ5IEFuZGkgVmFqZGEKCgkgICAgLSBBdm9pZCB0byBjYWxsIFB5T2JqZWN0X0dldEF0dHIgaW5zaWRlIFNXSUdfUHl0aG9uX0dldFN3aWdUaGlzLAoJICAgICAgc2luY2UgdGhpcyBjb25mdXNlcyBQeUx1Y2VuZSwgYXMgcmVwb3J0ZWQgYnkgQW5kaSBWYWpkYS4KCSAgICAKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdCiAgICAgICAgICAgIFJlbW92ZWQgZXh0cmEgKHZvaWQgKikgY2FzdCB3aGVuIGNhc3RpbmcgcG9pbnRlcnMgdG8gYW5kIGZyb20gamxvbmcgYXMgdGhpcwogICAgICAgICAgICB3YXMgc3VwcHJlc3NpbmcgZ2NjJ3MgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZy4gVGhpcyB3YXJuaW5nIGNvdWxkIGJlIGlnbm9yZWQgaW4gdmVyc2lvbnMgb2YgZ2NjIHByaW9yIHRvIDQuMCwgYnV0IG5vdyB0aGUKICAgICAgICAgICAgd2FybmluZyBpcyB1c2VmdWwgYXMgZ2NjIC1PMiBhbmQgaGlnaGVyIG9wdGltaXNhdGlvbiBsZXZlbHMgaW5jbHVkZXMgLWZzdHJpY3QtYWxpYXNpbmcgd2hpY2gKICAgICAgICAgICAgZ2VuZXJhdGVzIGNvZGUgdGhhdCBkb2Vzbid0IHdvcmsgd2l0aCB0aGVzZSBjYXN0cy4gVGhlIGFzc2lnbm1lbnQgaXMgc2ltcGx5IG5ldmVyIG1hZGUuCiAgICAgICAgICAgIFBsZWFzZSB1c2UgLWZuby1zdHJpY3QtYWxpYXNpbmcgdG8gYm90aCBzdXBwcmVzcyB0aGUgd2FybmluZyBhbmQgZml4IHRoZSBiYWQgYXNzZW1ibHkKICAgICAgICAgICAgY29kZSBnZW5lcmF0ZWQuIE5vdGUgdGhhdCB0aGUgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBieSB0aGUgQyBjb21waWxlciwgYnV0IG5vdAogICAgICAgICAgICB0aGUgQysrIGNvbXBpbGVyLCB5ZXQgdGhlIEMrKyBjb21waWxlciB3aWxsIGFsc28gZ2VuZXJhdGUgYnJva2VuIGNvZGUuIEFsdGVybmF0aXZlbHkgdXNlIAogICAgICAgICAgICAtV25vLXN0cmljdC1hbGlhc2luZyB0byBzdXBwcmVzcyB0aGUgd2FybmluZyBmb3IgZ2NjLTMueC4gVGhlIHR5cGVtYXBzIGFmZmVjdGVkCiAgICAgICAgICAgIGFyZSB0aGUgImluIiBhbmQgIm91dCIgdHlwZW1hcHMgaW4gamF2YS5zd2cgYW5kIGFycmF5c19qYXZhLnN3Zy4gVXNlcnMgb3VnaHQgdG8gZml4CiAgICAgICAgICAgIHRoZWlyIG93biB0eXBlbWFwcyB0byBkbyB0aGUgc2FtZS4gTm90ZSB0aGF0IHJlbW92YWwgb2YgdGhlIHZvaWQgKiBjYXN0IHNpbXBseSBwcmV2ZW50cwogICAgICAgICAgICBzdXBwcmVzc2lvbiBvZiB0aGUgd2FybmluZyBmb3IgdGhlIEMgY29tcGlsZXIgYW5kIG5vdGhpbmcgZWxzZS4gVHlwaWNhbCBjaGFuZ2U6CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqICV7ICQxID0gKigkJjFfbHR5cGUpKHZvaWQgKikmJGlucHV0OyAlfQogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAleyAkMSA9ICooJCYxX2x0eXBlKSYkaW5wdXQ7ICV9CgogICAgICAgICAgICBGcm9tOgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgU1dJR1RZUEUgKiAleyAqKCQmMV9sdHlwZSkodm9pZCAqKSYkcmVzdWx0ID0gJDE7ICV9IAogICAgICAgICAgICBUbzoKICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIFNXSUdUWVBFICogJXsgKigkJjFfbHR5cGUpJiRyZXN1bHQgPSAkMTsgJX0gCgowMy8wMi8yMDA2OiBta29lcHBlCgkgICAgW0d1aWxlIC1zY21dCgkgICAgQWRkIHR5cGVtYXBzIGZvciAibG9uZyBsb25nIjsgd2hldGhlciB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMsIGhvd2V2ZXIsIGRlcGVuZHMKCSAgICBvbiB0aGUgdmVyc2lvbiBhbmQgY29uZmlndXJhdGlvbiBvZiBHdWlsZS4KCjAzLzAyLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgQWRkIHN1cHBvcnQgZm9yIGlubmVyIGV4Y2VwdGlvbnMuIElmIGFueSBvZiB0aGUgZGVsZWdhdGVzIGFyZSBjYWxsZWQgd2hpY2ggY29uc3RydWN0CiAgICAgICAgICAgIGEgcGVuZGluZyBleGNlcHRpb24gYW5kIHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIGV4Y2VwdGlvbiwgaXQgd2lsbCBjcmVhdGUgdGhlIG5ldwogICAgICAgICAgICBleGNlcHRpb24gd2l0aCB0aGUgcGVuZGluZyBleGNlcHRpb24gYXMgYW4gaW5uZXIgZXhjZXB0aW9uLgoKMDMvMDIvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW1BocF0KICAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgUGhwNSBleGNlcHRpb25zIGlmIGNvbXBpbGluZyBhZ2FpbnN0IFBocDUgKHBhdGNoIGZyb20gT2xseSBCZXR0cykuCgowMy8wMS8yMDA2OiBtbWF0dXMKCSAgICBVc2UgdGhlIEdDQyB2aXNpYmlsaXR5IGF0dHJpYnV0ZSBpbiBTV0lHRVhQT1JULgoKCSAgICBOb3cgeW91IGNhbiBjb21waWxlICh3aXRoIGdjYyAzLjQgb3IgbGF0ZXIpIHVzaW5nCgkgICAgQ0ZMQUdTPSItZnZpc2liaWxpdHk9aGlkZGVuIi4KCSAgICAKCSAgICBDaGVjayB0aGUgZGlmZmVyZW5jZSBmb3IgdGhlICdzdGRfY29udGFpbmVycy5pJyBweXRob24gCgkgICAgdGVzdCBjYXNlOgogCiAgICAgICAgICAgIFNpemVzOgoKCSAgICAgIDMzMDU0MzIgX3N0ZF9jb250YWluZXJzLnNvCgkgICAgICAyMzgzOTkyIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgRXhwb3J0ZWQgc3ltYm9scyAobm0gLUQgPGZpbGU+LnNvIHwgd2MgLWwpOgoKICAgICAgICAgICAgICA2MTQ2IF9zdGRfY29udGFpbmVycy5zbyAKICAgICAgICAgICAgICAxNzQgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4gCgoJICAgIEV4ZWN1dGlvbiB0aW1lczoKCgkgICAgICByZWFsIDBtMC4wNTBzIHVzZXIgMG0wLjAzOXMgc3lzIDBtMC4wMDVzICAgX3N0ZF9jb250YWluZXJzLnNvCiAgICAgICAgICAgICAgcmVhbCAwbTAuMDM5cyB1c2VyIDBtMC4wMjZzIHN5cyAwbTAuMDA3cyAgIF9zdGRfY29udGFpbmVycy5zby5oaWRkZW4KCgkgICAgUmVhZCBodHRwOi8vZ2NjLmdudS5vcmcvd2lraS9WaXNpYmlsaXR5IGZvciBtb3JlIGRldGFpbHMuCgoKMDIvMjcvMjAwNjogbXV0YW5kaXoKCSAgICBbYWxsZWdyb2NsXQoJICAgIEFkZCBzdXBwb3J0IGZvciBJTlBVVCwgT1VUUFVULCBhbmQgSU5PVVQgdHlwZW1hcHMuCgkgICAgRm9yIE9VVFBVVCB2YXJpYWJsZXMsIHRoZSBsaXNwIHdyYXBwZXIgcmV0dXJucyBtdWx0aXBsZQoJICAgIHZhbHVlcy4KCjAyLzI2LzIwMDY6IG1tYXR1cwoKCSAgICBbUnVieV0gYWRkIGFyZ2Nhcmd2LmkgbGlicmFyeSBmaWxlLgoJICAgIAoJICAgIFVzZSBpdCBhcyBmb2xsb3c6CgoJCSVpbmNsdWRlIGFyZ2Nhcmd2LmkKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWFwcGx5IChpbnQgQVJHQywgY2hhciAqKkFSR1YpIHsgKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgfSAKCSAgICAgIAkJCQkJCQkJCSAKICAgCSAgICAgICAgJWlubGluZSB7CQkJCQogICAJICAgICAgICAgIGludCBtYWluQXBwKHNpemVfdCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikgCQogICAJICAgICAgICAgIHsJCQkJCQkKICAgCSAgICAgICAgICAgIHJldHVybiBhcmdjOwkJCQkJCiAgIAkgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQkJCQkJCQkKCSAgICAgIAkJCQkJCQkKICAgCSAgICB0aGVuIGluIHRoZSBydWJ5IHNpZGU6CQkJCQkKCSAgICAgIAkJCQkJCQkJCiAgIAkgICAgICAgIGFyZ3MgPSBbImFzZGYiLCAiYXNkZjIiXQkJCQkKICAgCSAgICAgICAgbiA9IG1haW5BcHAoYXJncyk7CgkKCgkgICAgVGhpcyBpcyB0aGUgc2ltaWxhciB0byB0aGUgcHl0aG9uIHZlcnNpb24gTGliL3B5dGhvbi9hcmdjYXJndi5pCgowMi8yNC8yMDA2OiBtZ29zc2FnZQoKCSAgICBTbWFsbCB1cGRhdGUgTHVhIGRvY3VtZW50cyBvbiB0cm91Ymxlc2hvb3RpbmcgcHJvYmxlbXMKCSAgICAKMDIvMjIvMjAwNjogbW1hdHVzIAoKCSAgICBGaXggYWxsIHRoZSBlcnJvcnMgcmVwb3J0ZWQgZm9yIDEuMy4yOC4KCSAgICAtIGZpeCBidWcgIzExNTgxNzgKCSAgICAtIGZpeCBidWcgIzEwNjA3ODkKCSAgICAtIGZpeCBidWcgIzEyNjM0NTcKCSAgICAtIGZpeCAnY29uc3QgIGNoYXIqJicgdHlwZW1hcCBpbiB0aGUgVVRMLCByZXBvcnRlZCBieSBHZW9mZiBIdXRjaGlzb24KCSAgICAtIGZpeGVzIGZvciBweXRob24gMi4xIGFuZCB0aGUgcnVudGltZSBsaWJyYXJ5CgkgICAgLSBmaXggY29weWN0b3IgKyB0ZW1wbGF0ZSBidWcgIzE0MzIxMjUKCSAgICAtIGZpeCBbIDE0MzIxNTIgXSAlcmVuYW1lIGZyaWVuZCBvcGVyYXRvcnMgaW4gbmFtZXNwYWNlCgkgICAgLSBmaXggZ2NjIHdhcm5pbmcgcmVwb3J0ZWQgYnkgUi4gQmVybnN0ZWluCgkgICAgLSBhdm9pZCBhc3NlcnQgd2hlbiBmaW5kaW5nIGEgcmVjdXJzaXZlIHNjb3BlIGluaGVyaXRhbmNlLAoJICAgICAgZW1pdCBhIHdhcm5pbmcgaW4gdGhlIHdvcnN0IGNhc2UsIHJlcG9ydGVkIGJ5IE5pdHJvIAoJICAgIC0gZml4IHByZW1hdHVyZSBvYmplY3QgZGVsZXRpb24gcmVwb3J0ZWQgYnkgUGF1bCBpbiB0Y2wzZAoJICAgIC0gZml4IHdhcm5pbmcgcmVwb3J0ZWQgYnkgTml0cm8gaW4gVkM3CgkgICAgLSBtb3JlIGZpeGVzIGZvciBvbGQgU29sYXJpcyBjb21waWxlcgoJICAgIC0gZml4IGZvciBweXRob24gMi4zIGFuZCBnY19yZWZzIGlzc3VlIHJlcG9ydGVkIGJ5IEx1aWdpCgkgICAgLSBmaXggZmFzdHByb3h5IGZvciBtZXRob2RzIHVzaW5nIGt3YXJncwoJICAgIC0gZml4IG92ZXJsb2FkICsgcHJvdGVjdGVkIG1lbWJlciBpc3N1ZSByZXBvcnRlZCBieSBDb2xpbiBNY0RvbmFsZAoJICAgIC0gZml4IHNldGVycm9ybXNnIGFzIHJlcG9ydGVkIGJ5IENvbGluIE1jRG9uYWxkCgkgICAgLSBmaXggZGlyZWN0b3JzLCBub3cgdGhlIHRlc3Qtc3VpdGUgcnVucyBhZ2FpbiB1c2luZyAtZGlyZWN0b3JzCgkgICAgLSBmaXggZm9yIGZyaWVuZCBvcGVyYXRvciBhbmQgVmlzdWFsIHN0dWRpbyBhbmQgYnVnIDE0MzIxNTIKCSAgICAtIGZpeCBidWcgIzE0MzUwOTAKCSAgICAtIGZpeCB1c2luZyArICVleHRlbmQgYXMgcmVwb3J0ZWQgYnkgV2lsbGlhbQoJICAgIC0gZml4IGJ1ZyAjMTA5NDk2NAoJICAgIC0gZml4IGZvciBQeV9Ob3RJbXBsZW1lbnRlZCBhcyByZXBvcnRlZCBieSBPbGx5IGFuZCBBbWF1cnkKCSAgICAtIGZpeCBuZXN0ZWQgbmFtZXNwYWNlIGlzc3VlIHJlcG9ydGVkIGJ5IENoYXJsaWUKCgkgICAgYW5kIGFsc286CgkgICAgCgkgICAgLSBhbGxvdyBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVycyBieSBkZWZhdWx0CgkgICAgLSBkZWxldGUgZXh0cmEgbmV3IGxpbmVzIGluIHN3aWdtYWNyb3NbVVRMXQoJICAgIC0gY29zbWV0aWMgZm9yIGdlbmVyYXRlZCBweXRob24gY29kZQoJICAgIC0gYWRkIHRoZSBmYWN0b3J5LmkgbGlicmFyeSBmb3IgVVRMCgkgICAgLSBhZGQgc3dpZ3JlZ2lzdGVyIHByb3h5IG1ldGhvZCBhbmQgbW92ZSBfX3JlcHJfXyB0byBhCgkgICAgICBzaW5nbGUgZ2xvYmFsIG1vZHVsZSAgW3B5dGhvbl0KCjAyLzIyLzIwMDY6IG1tYXR1cyAKCgkgICAgV2hlbiB1c2luZyBkaXJlY3RvcnMsIG5vdyBzd2lnIHdpbGwgZW1pdCBhbGwgdGhlIHZpcnR1YWwKCSAgICBwcm90ZWN0ZWQgbWV0aG9kcyBieSBkZWZhdWx0LiAKCgkgICAgSW4gcHJldmlvdXMgcmVsZWFzZXMsIHlvdSBuZWVkZWQgdG8gdXNlIHRoZSAnZGlycHJvdCcKCSAgICBvcHRpb24gdG8gYWNoaWV2ZSB0aGUgc2FtZS4KCgkgICAgSWYgeW91IHdhbnQsIHlvdSBjYW4gZGlzYWJsZSB0aGUgbmV3IGRlZmF1bHQgYmVoYXZpb3VyLAoJICAgIHVzZSB0aGUgJ25vZGlycHJvdCcgb3B0aW9uOiAKCgkgICAgICAgc3dpZyAtbm9kaXJwcm90IC4uLgoKCSAgICBhbmQvb3IgdGhlICVub2RpcmVjdG9yIGZlYXR1cmUgZm9yIHNwZWNpZmljIG1ldGhvZHMsIGkuZS46CgoJICAgICAgICVub2RpcmVjdG9yIEZvbzo6YmFyOwoKCSAgICAgICBzdHJ1Y3QgRm9vIHsKCSAgICAgICAgIHZpcnR1YWwgfkZvbygpOwoKCSAgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgICB2aXJ0dWFsIHZvaWQgYmFyKCk7CgkgICAgICAgfTsKCSAgICAKCgkgICAgQXMgYmVmb3JlLCBwdXJlIGFic3RyYWN0IHByb3RlY3RlZCBtZW1iZXJzIGFyZSBhbGx3YXlzCgkgICAgZW1pdHRlZCwgaW5kZXBlbmRlbnQgb2YgdGhlICdkaXJwcm90L25vZGlycHJvdCcgb3B0aW9ucy4KCgowMi8yMi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgdGhlIGZhY3RvcnkuaSBsaWJyYXJ5IGZvciBsYW5ndWFnZXMgdXNpbmcgdGhlIFVUTCAocHl0aG9uLHRjbCxydWJ5LHBlcmwpLgoJICAgIAogICAgICAgICAgICBmYWN0b3J5LmkgaW1wbGVtZW50cyBhIG1vcmUgbmF0dXJhbCB3cmFwIGZvciBmYWN0b3J5IG1ldGhvZHMuIAoKCSAgICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmU6CQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIC0tLS0gIGdlb21ldHJ5LmggLS0tLS0tLS0JCQkJCSAgICAKICAJICAgICAgICAgc3RydWN0IEdlb21ldHJ5IHsgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgIAogIAkgICAgICAgICAgIGVudW0gR2VvbVR5cGV7CQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgICAgICBQT0lOVCwJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICAgIENJUkNMRQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIH5HZW9tZXRyeSgpIHt9ICAgIAkJICAgICAJCSAgICAKICAJICAgICAgICAgICB2aXJ0dWFsIGludCBkcmF3KCkgPSAwOwkJCQkgICAgCiAgCSAgICAJIAkJCQkJCQkgICAgCiAgCSAgICAJIC8vCQkJCQkJCSAgICAKICAJICAgIAkgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgCSAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgICAgc3RhdGljIEdlb21ldHJ5ICpjcmVhdGUoR2VvbVR5cGUgaSk7ICAgICAJCSAgICAKICAJICAgICAgICAgfTsJCQkJCSAgICAgCQkgICAgCiAgCSAgICAgICAgIAkJCQkJICAgICAJCQkgICAgCiAgCSAgICAgICAgIHN0cnVjdCBQb2ludCA6IEdlb21ldHJ5ICB7CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGludCBkcmF3KCkgeyByZXR1cm4gMTsgfQkJICAgICAJCSAgICAKICAJICAgICAgICAgICBkb3VibGUgd2lkdGgoKSB7IHJldHVybiAxLjA7IH0gICAgCSAgICAgCQkgICAgCiAgCSAgICAgICAgIH07CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAJCQkJCSAgICAgCQkJICAgIAogIAkgICAgICAgICBzdHJ1Y3QgQ2lyY2xlIDogR2VvbWV0cnkgIHsJCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgaW50IGRyYXcoKSB7IHJldHVybiAyOyB9CQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGRvdWJsZSByYWRpdXMoKSB7IHJldHVybiAxLjU7IH0gICAgICAgICAgCQkgICAgCiAgCSAgICAgICAgIH07IAkJCQkJICAgICAJCSAgICAKICAJICAgICAgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICAgIC8vCQkJCQkJCSAgICAKICAJICAgICAgICAgLy8gRmFjdG9yeSBtZXRob2QgZm9yIGFsbCB0aGUgR2VvbWV0cnkgb2JqZWN0cwkJICAgIAogIAkgICAgICAgICAvLwkJCQkJCQkgICAgCiAgCSAgICAgICAgIEdlb21ldHJ5ICpHZW9tZXRyeTo6Y3JlYXRlKEdlb21UeXBlIHR5cGUpIHsJCSAgICAKICAJICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsJCQkgICAgIAkJICAgIAogIAkgICAgICAgICAgIGNhc2UgUE9JTlQ6IHJldHVybiBuZXcgUG9pbnQoKTsJICAgICAJCSAgICAKICAJICAgICAgICAgICBjYXNlIENJUkNMRTogcmV0dXJuIG5ldyBDaXJjbGUoKTsgCSAgICAgCQkgICAgCiAgCSAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CQkJICAgICAJCSAgICAKICAJICAgICAgICAgICB9CQkJCQkgICAgIAkJICAgIAogIAkgICAgICAgICB9CQkJCQkgICAgCQkgICAgCiAgCSAgICAtLS0tICBnZW9tZXRyeS5oIC0tLS0tLS0tCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCgkgICAgWW91IGNhbiB1c2UgdGhlICVmYWN0b3J5IHdpdGggdGhlIEdlb21ldHJ5OjpjcmVhdGUgbWV0aG9kIGFzIGZvbGxvd3M6CgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICAgICVuZXdvYmplY3QgR2VvbWV0cnk6OmNyZWF0ZTsJCQkJICAgIAogIAkgICAgICAlZmFjdG9yeShHZW9tZXRyeSAqR2VvbWV0cnk6OmNyZWF0ZSwgUG9pbnQsIENpcmNsZSk7CSAgICAKICAJICAgICAgJWluY2x1ZGUgImdlb21ldHJ5LmgiCQkJCQkgICAgCgkgICAgCQkJCQkJCQkgICAgCiAgCSAgICBhbmQgR2VvbWV0cnk6OmNyZWF0ZSB3aWxsIHJldHVybiBhICdQb2ludCcgb3IgJ0NpcmNsZScgaW5zdGFuY2UgICAKICAJICAgIGluc3RlYWQgb2YgdGhlIHBsYWluICdHZW9tZXRyeScgdHlwZS4gRm9yIGV4YW1wbGUsIGluIHB5dGhvbjoJICAgIAoJICAgIAkJCQkJCQkJICAgIAogIAkgICAgICBjaXJjbGUgPSBHZW9tZXRyeS5jcmVhdGUoR2VvbWV0cnkuQ0lSQ0xFKQkJCSAgICAKICAJICAgICAgciA9IGNpcmNsZS5yYWRpdXMoKQkJCQkJCSAgICAKCSAgICAJCQkJCQkJCSAgICAKICAJICAgIHdoZXJlICdjaXJjbGUnIG5vdyBpcyBhIENpcmNsZSBwcm94eSBpbnN0YW5jZS4JICAgIAkJICAgIAoKCjAyLzE3LzIwMDY6IG1rb2VwcGUKCSAgICBbTXpTY2hlbWVdIFR5cGVtYXBzIGZvciBhbGwgaW50ZWdyYWwgdHlwZXMgbm93IGFjY2VwdCB0aGUgZnVsbCByYW5nZSBvZiBpbnRlZ3JhbAoJICAgIHZhbHVlcywgYW5kIHRoZXkgc2lnbmFsIGFuIGVycm9yIHdoZW4gYSB2YWx1ZSBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBpcyBwYXNzZWQuCgkgICAgW0d1aWxlXSBUeXBlbWFwcyBmb3IgYWxsIGludGVncmFsIHR5cGVzIG5vdyBzaWduYWwgYW4gZXJyb3Igd2hlbiBhIHZhbHVlIG91dHNpZGUKCSAgICB0aGUgdmFsaWQgcmFuZ2UgaXMgcGFzc2VkLgoKMDIvMTMvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgW0RvY3VtZW50c10gdXBkYXRlZCB0aGUgZXh0ZW5kaW5nIGRvY3VtZW50cyB0byBnaXZlIGEgc2tlbGV0b24gc3dpZ2dpbmcgY29kZQogICAgICAgICAgICB3aXRoIGEgZmV3IHR5cGVtYXBzLgogICAgICAgICAgICBbTHVhXSBhZGRlZCBhbiBleHRyYSB0eXBlbWFwIGZvciB2b2lkKiBbaW5dLCBzbyBhIGZ1bmN0aW9uIHdoaWNoIHJlcXVpcmVzIGEgdm9pZCoKICAgICAgICAgICAgY2FuIHRha2UgYW55IGtpbmQgb2YgcG9pbnRlcgoKVmVyc2lvbiAxLjMuMjggKEZlYnJ1YXJ5IDEyLCAyMDA2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMi8xMS8yMDA2OiBtbWF0dXMKCSAgICBGaXggbWFueSBpc3N1ZXMgd2l0aCBsaW5lIGNvdW50aW5nIGFuZCBlcnJvciByZXBvcnRzLgoKMDIvMTEvMjAwNjogbW1hdHVzCgkgICAgW1B5dGhvbl0gQmV0dGVyIHN0YXRpYyBkYXRhIG1lbWJlciBzdXBwb3J0LCBpZiB5b3UgaGF2ZQoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgYmFyOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4gbm93IGlzIHZhbGlkIHRvIGFjY2VzcyB0aGUgc3RhdGljIGRhdGEgbWVtYmVyLCBpZToKCiAgICAgICAgICAgICAgICBmID0gRm9vKCkKICAgICAgICAgICAgICAgIGYuYmFyID0gMwoKCSAgICBqdXN0IGFzIGluIEMrKy4KCgowMi8xMS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0KICAgICAgICAgICAgRml4ZWQgY29kZSBnZW5lcmF0aW9uIHRvIHdvcmsgYWdhaW4gd2l0aCBvbGQgdmVyc2lvbnMgb2YgUGVybAogICAgICAgICAgICAoNS4wMDQgYW5kIGxhdGVyIHRlc3RlZCkKCjAyLzA0LzIwMDY6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCB0aGUgJWV4dGVuZF9zbWFydF9wb2ludGVyKCkgZGlyZWN0aXZlIHRvIGV4dGVuZAoJICAgIFNXSUcgc21hcnQgcG9pbnRlciBzdXBwb3J0IGluIHB5dGhvbi4gCgoJICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHNtYXJ0IHBvaW50ZXIgYXM6CgkgICAgCgkgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gY2xhc3MgUkNQdHIgewoJICAgICAgcHVibGljOgoJICAgICAgICAuLi4KCSAgICAgICAgUkNQdHIoVHlwZSAqcCk7CgkJVHlwZSAqIG9wZXJhdG9yLT4oKSBjb25zdDsKCQkuLi4KCSAgICAgIH07CgkgICAgICAKCSAgICB5b3UgdXNlIHRoZSAlZXh0ZW5kX3NtYXJ0X3BvaW50ZXIgZGlyZWN0aXZlIGFzOgoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSAgUkNQdHI8QT47CgkgICAgCgkgICAgdGhlbiwgaWYgeW91IGhhdmUgc29tZXRoaW5nIGxpa2U6CgoJICAgICAgUkNQdHI8QT4gbWFrZV9wdHIoKTsKCSAgICAgIGludCBmb28oQSAqKTsKCgkgICAgeW91IGNhbiBkbyB0aGUgZm9sbG93aW5nOgoKCSAgICAgIGEgPSBtYWtlX3B0cigpOwoJICAgICAgYiA9IGZvbyhhKTsKCiAgICAgICAgICAgIGllLCBzd2lnIHdpbGwgYWNjZXB0IGEgUkNQdHI8QT4gb2JqZWN0IHdoZXJlIGEgJ0EgKicgaXMKICAgICAgICAgICAgZXhwZWN0ZWQuCgoJICAgIEFsc28sIHdoZW4gdXNpbmcgdmVjdG9ycwoJICAgIAoJICAgICAgJWV4dGVuZF9zbWFydF9wb2ludGVyKFJDUHRyPEE+KTsKCSAgICAgICV0ZW1wbGF0ZShSQ1B0cl9BKSBSQ1B0cjxBPjsKCSAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfQSkgc3RkOjp2ZWN0b3I8UkNQdHI8QT4gPjsKCQkKCSAgICB5b3UgY2FuIHR5cGUKCgkgICAgICBhID0gQSgpOwoJICAgICAgdiA9IHZlY3Rvcl9BKDIpCgkgICAgICB2WzBdID0gYQoKICAgICAgICAgICAgaWUsIGFuICdBIConIG9iamVjdCBpcyBhY2NlcHRlZCwgdmlhIGltcGxpY2l0IGNvbnZlcnNpb24sIAoJICAgIHdoZXJlIGEgUkNQdHI8QT4gb2JqZWN0IGlzIGV4cGVjdGVkLiBBZGRpdGlvbmFsbHkKCgkgICAgICB4ID0gdlswXQoKCSAgICByZXR1cm5zIChhbmQgc2V0cyAneCcgYXMpIGEgY29weSBvZiB2WzBdLCBtYWtpbmcgcmVmZXJlbmNlCgkgICAgY291bnRpbmcgcG9zc2libGUgYW5kIGNvbnNpc3RlbnQuCgoJICAgICVleHRlbmRfc21hcnRfcG9pbnRlciBpcyBqdXN0IGEgY29sbGVjdGlvbnMgb2YgbmV3L29sZAoJICAgIHRyaWNrcywgaW5jbHVkaW5nICV0eXBlbWFwcyBhbmQgdGhlIG5ldyAlaW1wbGljaXRjb252CgkgICAgZGlyZWN0aXZlLgoKMDIvMDIvMjAwNjogbWdvc3NhZ2UKICAgICAgICAgICAgYnVnZml4ICMxMzU2NTc3LCBjaGFuZ2VkIGRvdWJsZT0+bHVhX251bWJlciBpbiBhIGZldyBwbGFjZXMuCiAgICAgICAgICAgIGFkZGVkIHRoZSBzdGQ6OnBhaXIgd3JhcHBpbmcKCjAxLzMwLzIwMDY6IHdzZnVsdG9uCiAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGFuZCBzdGQ6OndzdHJpbmcgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBub3cgdXNlCiAgICAgICAgICAgICVuYXR1cmFsdmFyIGJ5IGRlZmF1bHQsIG1lYW5pbmcgdGhleSB3aWxsIG5vdyBiZSB3cmFwcGVkIGFzIGV4cGVjdGVkIGluIGFsbCBsYW5ndWFnZXMuCiAgICAgICAgICAgIFByZXZpb3VzbHkgdGhlc2Ugd2VyZSB3cmFwcGVkIGFzIGEgcG9pbnRlciByYXRoZXIgdGhhbiBhIHRhcmdldCBsYW5ndWFnZSBzdHJpbmcuCiAgICAgICAgICAgIEl0IGlzIG5vIGxvbmdlciBuZWNlc3NhcnkgdG8gYWRkIHRoZSBmb2xsb3dpbmcgd29ya2Fyb3VuZCB0byB3cmFwIHRoZXNlIGFzIHN0cmluZ3M6CgoJCSVhcHBseSBjb25zdCBzdGQ6OnN0cmluZyAmIHsgc3RkOjpzdHJpbmcgKn0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICAqKioKCjAxLzI4LzIwMDY6IG1rb2VwcGUKCSAgICBbR3VpbGUgLXNjbV0gCgkgICAgQWRkIHR5cGVtYXBzIGZvciBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb24gcG9pbnRlcnMuCgowMS8yNC8yMDA2OiBtbWF0dXMKCSAgICAtIEJldHRlciBzdXBwb3J0IGZvciB0aGUgJW5hdHVyYWx2YXIgZGlyZWN0aXZlLCBub3cgaXQKCSAgICAgIHdvcmtzIHdpdGggdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgYXMgd2VsbCBhcwoJICAgICAgSmF2YS9DIy4KCSAgICAgIAoJICAgICAgTm93LCBpdCBjYW4gYWxzbyBiZSBhcHBsaWVkIHRvIGNsYXNzIHR5cGVzOgoKCSAgICAgICAgJW5hdHVyYWx2YXIgc3RkOjpzdHJpbmc7CgkgICAgICAgICVpbmNsdWRlIDxzdGRfc3RyaW5nLmk+CgkgICAgICAKICAgICAgICAgICAgICB0aGF0IHdpbGwgdGVsbCBzd2lnIHRvIHVzZSB0aGUgJ25hdHVyYWwnIHdyYXBwaW5nCiAgICAgICAgICAgICAgbWVjaGFuaXNtIHRvIGFsbCBzdGQ6OnN0cmluZyBnbG9iYWwgYW5kIG1lbWJlcgogICAgICAgICAgICAgIHZhcmlhYmxlcy4KCgkgICAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlICVhbGxvd2V4Y2VwdCBmZWF0dXJlIGFsb25nIHRoZQogICAgICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZXMsIHdoaWNoIGFsbG93cyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlCiAgICAgICAgICAgICAgdG8gYmUgYXBwbGllZCB0byB0aGUgdmFyaWFibGUgYWNjZXNzIG1ldGhvZHMuIEFsc28sIGFkZAogICAgICAgICAgICAgIHRoZSAlZXhjZXB0aW9udmFyIGRpcmVjdGl2ZSB0byBzcGVjaWZ5IGEgZGlzdGludGljCiAgICAgICAgICAgICAgZXhjZXB0aW9uIG1lY2hhbmlzbSBvbmx5IGZvciB2YXJpYWJsZXMuCgkgICAgICAKCSAgICAKCSAgICAtIEFkZCBtb3JlIGRvY3MgZm9yIHRoZSAlZGVsb2JqZWN0IGRpcmVjdGl2ZSB0byBtYXJrIGEgbWV0aG9kIGFzIGEKCSAgICAgIGRlc3RydWN0b3IsICdkaXNvd25pbmcnIHRoZSBmaXJzdCBhcmd1bWVudC4gRm9yIGV4YW1wbGU6CgoJICAgICAgICAlbmV3b2JqZWN0IGNyZWF0ZV9mb287CgkgICAgICAgICVkZWxvYmplY3QgZGVzdHJveV9mb287CgoJICAgICAgICBGb28gKmNyZWF0ZV9mb28oKSB7IHJldHVybiBuZXcgRm9vKCk7IH0KCSAgICAgICAgdm9pZCBkZXN0cm95X2ZvbyhGb28gKmZvbykgeyBkZWxldGUgZm9vOyB9CgoJICAgICAgb3IgaW4gYSBtZW1iZXIgbWV0aG9kIGFzOgoKCSAgICAgICAgJWRlbG9iamVjdCBGb286OmRlc3Ryb3k7CgoJICAgICAgICBjbGFzcyBGb28gewoJICAgICAgICBwdWJsaWM6CgkgICAgICAgICAgdm9pZCBkZXN0cm95KCkgeyBkZWxldGUgdGhpczt9CgoJICAgICAgICBwcml2YXRlOgoJICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgfTsKCgowMS8yNC8yMDA2OiBtZ29zc2FnZQogICAgICAgICAgICBbTHVhXQoJICAgIC0gUmVtb3ZlZCB0aGUgdHlwZSBzd2lnX2x1YV9jb21tYW5kX2luZm8gJiByZXBsYWNlIHdpdGggbHVhTF9yZWcKCSAgICAgICh3aGljaCB0aGVuIGJyb2tlIHRoZSBjb2RlKSwgZml4ZWQgdGhpcwoJICAgIC0gYWRkZWQgYW4gYWRkaXRpb25hbCBjYXN0IGluIHRoZSB0eXBlbWFwcyBmb3IgZW51bSdzCgkgICAgICBkdWUgdG8gdGhlIGlzc3VlIHRoYXQgVkMuTmV0IHdpbGwgbm90IGFsbG93IGNhc3Rpbmcgb2YKCSAgICAgIGEgZG91YmxlIHRvIGFuIGVudW0gZGlyZWN0bHkuIFRoZXJlZm9yZSBjYXN0IHRvIGludCB0aGVuIHRvIGVudW0KCSAgICAgICh0aGFua3MgdG8gSmFzb24gUmVnbyBmb3IgdGhpcyBvYnNlcnZhdGlvbikKCjAxLzE2LzIwMDY6IG1tYXR1cyAoQ2hhbmdlIGRpc2FibGVkLi4uIHdpbGwgYmUgYmFjayBpbiBDVlMgc29vbikKCSAgICBBZGQgaW5pdGlhbCBzdXBwb3J0IGZvciByZWdleHAgdmlhIHRoZSBleHRlcm5hbCBsaWJyYXJ5CgkgICAgUnhTcGVuY2VyLiBTV0lHIGRvZXNuJ3QgcmVxdWlyZSB0aGlzIGxpYnJhcnkgdG8gY29tcGlsZQoJICAgIGFuZC9vciBydW4uIEJ1dCBpZiB5b3Ugc3BlY2lmeSAtLXdpdGgtcnhzcGVuY2VyLCBhbmQgdGhlCgkgICAgbGlicmFyeSBpcyBmb3VuZCBkdXJpbmcgaW5zdGFsbGF0aW9uLCB0aGVuIHN3aWcgd2lsbCB1c2UKCSAgICBpdCBpbiB0aHJlZSBwbGFjZXM6CgoJICAgIC0gSW4gJXJlbmFtZXMgcnVsZXMsIHZpYSB0aGUgbmV3IHJ4c21hdGNoIHJ1bGVzLCBmb3IgZXhhbXBsZToKCSAgICAJICAKCSAgICAJICAlcmVuYW1lKCIlKGxvd2VyY2FzZSkiLHJ4c21hdGNoJG5hbWU9IkdTTF8uKiIpICIiOwoJICAgIAkgICVyZW5hbWUoIiUobG93ZXJjYXNlKSIscnhzbWF0Y2gkbm9kZVR5cGU9ImVudW0gR1NMXy4qIikgIiI7CgkgICAgCSAKICAgICAgICAgICAgICByeHNtYXRjaCBpcyBzaW1pbGFyIHRvIHRoZSBtYXRjaCBydWxlLCBpdCBqdXN0IHVzZXMKICAgICAgICAgICAgICB0aGUgUnhTcGVuY2VyIHJlZ2V4cCBsaWJyYXJ5IHRvIGRlY2lkZSBpZiB0aGVyZSBpcyBhCiAgICAgICAgICAgICAgbWF0Y2ggd2l0aCB0aGUgcHJvdmlkZWQgcmVnZXhwLiBBcyB3aXRoIHRoZSBtYXRjaAogICAgICAgICAgICAgIHJ1bGUsIHlvdSBjYW4gYWxzbyB1c2UgdGhlIG5lZ2F0ZSBydWxlIG5vdHJ4c21hdGNoLgoKCSAgICAtIEluIHRoZSAlcmVuYW1lIHRhcmdldCBuYW1lIHZpYSB0aGUgcnhzdGFyZ2V0IG9wdGlvbiwgZm9yIGV4YW1wbGU6CgkgICAgCQkgCgkgICAgCSAgJXJlbmFtZSgiJShsb3dlcmNhc2UpIixyeHN0YXJnZXQ9MSkgIkdTTF8uKiI7CgoJICAgIAl3aGVyZSB0aGUgdGFyZ2V0IG5hbWUgIkdTTC4qIiBpcyBub3cgdW5kZXJzdG9vZCBhcyBhCgkgICAgCXJlZ2V4cCB0byBiZSBtYXRjaGVkLiAgCgkgICAgCSAKICAgICAgICAgICAgLSBJbiB0aGUgbmV3IGVuY29kZXIgInJ4c3BlbmNlciIsIHdoaWNoIGxvb2tzIGxpa2U6CgoJICAgIAkgICUocnhzcGVuY2VyOltyZWdleHBdW3JlcGxhY2VdKXMKCgkgICAgCXdoZXJlICJyZWdleHAiIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kICJyZXBsYWNlIgoJICAgIAlpcyBhIHN0cmluZyB1c2VkIGFzIGEgcmVwbGFjZW1lbnQsIHdoZXJlIHRoZSBAMCxAMSwuLi4sQDkKCSAgICAJcHNldWRvIGFyZ3VtZW50cyBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlCgkgICAgCWNvcnJlc3BvbmRpbmcgbWF0Y2hpbmcgaXRlbXMgaW4gdGhlIHJlZyBleHByZXNzaW9uLgoKCSAgICAJRm9yIGV4YW1wbGU6CgkgICAgCQkgICAgICAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBIZWxsbyAgICAtPiAKCSAgICAgICAgJShyeHNwZW5jZXI6W0dTTC4qXVtAMF0pcyAgICAgICA8LSBHU0xIZWxsbyAtPiBHU0xIZWxsbwoJICAgICAgICAlKHJ4c3BlbmNlcjpbR1NMKC4qKV1bQDFdKXMgICAgIDwtIEdTTEhlbGxvIC0+IEhlbGxvCgkgICAgICAgICUocnhzcGVuY2VyOltHU0woLiopXVtnc2xAMV0pcyAgPC0gR1NMSGVsbG8gLT4gZ3NsSGVsbG8KCgkgICAgCUFub3RoZXIgZXhhbXBsZSBjb3VsZCBiZToKCiAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKGxvd2VyY2FzZSlzIixzb3VyY2VmbXQ9IiUocnhzcGVuY2VyOltHU0xfKC4qKV1bQDFdKXMiLCUkaXNmdW5jdGlvbikgIiI7CgoJICAgIAl3aGljaCB0YWtlIG91dCB0aGUgcHJlZml4ICJHU0xfIiBhbmQgcmV0dXJucyBhbGwgdGhlCgkgICAgCWZ1bmN0aW9uIG5hbWVzIGluIGxvd2VyIGNhc2VzLCBhcyBmb2xsb3dpbmc6CgoJICAgIAkgICAgdm9pZCBHU0xfSGVsbG8oKTsgICAtPiAgIGhlbGxvKCk7CgkgICAgCSAgICB2b2lkIEdTTF9IaSgpOyAgICAgIC0+ICAgaGkoKTsKCSAgICAJICAgIGNvbnN0IGludCBHU0xfTUFYOyAgLT4gICBHU0xfTUFYOyAgLy8gbm8gY2hhbmdlLCBpcyBub3QgYSBmdW5jdGlvbgoJCgkgICAgV2UgdXNlIHRoZSBSeFNwZW5jZXIgYXMgYW4gaW5pdGlhbCB0ZXN0IGJlZCB0bwogICAgICAgICAgICBpbXBsZW1lbnRpb24gd2hpbGUgd2UgZGVjaWRlIHdoaWNoIGxpYnJhcnkgd2lsbCBiZQogICAgICAgICAgICBmaW5hbGx5IGFkZGVkIHRvIHN3aWcuCgogICAgICAgICAgICBZb3UgY2FuIG9idGFpbiB0aGUgUnhTcGVuY2VyIGxpYnJhcnkgZnJvbSAKCSAgICAKCSAgICAgIGh0dHA6Ly9hcmdsaXN0LmNvbS9yZWdleCAoVW5peCkKCgkgICAgb3IKCSAgICAgCgkgICAgICBodHRwOi8vZ251d2luMzIuc291cmNlZm9yZ2UubmV0L3BhY2thZ2VzLmh0bWwgKFdpbmRvd3MpCgoJICAgIE9uY2UgaW5zdGFsbGVkLCB1c2UgIm1hbiByeHNwZW5jZXIiIHRvIGdldCBtb3JlIGluZm8KCSAgICBhYm91dCB0aGUgcmVnZXhwIGZvcm1hdCwgb3IganVzdCBnb29nbGUgcnhzcGVuY2VyLgoKCSAgICBTaW5jZSBub3cgeW91IGNhbiBlbmFibGUgdGhlIHJ4c21hdGNoIHJ1bGVzIChzZWUgYWJvdmUpLAogICAgICAgICAgICB0aGUgc2ltcGxlIG9yICd8JyBzdXBwb3J0IGZvciB0aGUgbWF0Y2ggcnVsZXMKICAgICAgICAgICAgKDAxLzEyLzIwMDY6IG1tYXR1cykgaXMgZGlzYWJsZWQuIFN0aWxsLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBwcm9ibGVtcyB3aXRoIHRoZSByeHNwZW5jZXIgbGlicmFyeSwgeW91IGNhbiByZS1lbmFibGUKICAgICAgICAgICAgdGhlIHNpbXBsZSAnbWF0Y2ggb3InIHN1cHBvcnQgdXNpbmcKICAgICAgICAgICAgLURTV0lHX1VTRV9TSU1QTEVfTUFUQ0hPUi4KCSAgCgowMS8xNi8yMDA2OiBtbWF0dXMKCSAgICBDaGFuZ2UgdGhlICVyZW5hbWUgcHJlZGljYXRlcyB0byB1c2UgdGhlIHByZWZpeCAnJSQnLCBhcyBpbjoKCSAgICAKCSAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCUkaXNmdW5jdGlvbiwlJGlzbWVtYmVyKSAiIjsgCgkgICAJCiAgICAgICAgICAgIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBvdGhlciBzd2lnIG1hY3Jvcy9kaXJlY3RpdmVzLgoKMDEvMTQvMjAwNjogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XQoJICAgIEFkZGVkIHN1cHBvcnQgZm9yIFJ1YnkgYmFuZyEgbWV0aG9kcyB2aWEgYSBuZXcgJWJhbmcgZmVhdHVyZS4KCSAgICBCYW5nIG1ldGhvZHMgZW5kIGluIGV4Y2xhbWF0aW9uIHBvaW50cyBhbmQgaW5kaWNhdGUgdGhhdCB0aGUKCSAgICBvYmplY3QgYmVpbmcgcHJvY2Vzc2VkIHdpbGwgYmUgbW9kaWZpZWQgaW4tcGxhY2UgYXMgCgkgICAgb3Bwb3NlZCB0byBiZWluZyBjb3BpZWQuCgowMS8xMi8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgVXBkYXRlZCB0aGUgUnVieSBtb2R1bGUgdG8gYXV0b21hdGljYWxseSBjb252ZXJ0CgkgICAgbWV0aG9kIG5hbWVzIHRvIGxvd2VyX2Nhc2Vfd2l0aF91bmRlcnNjb3JlcyB1c2luZyB0aGUKCSAgICBuZXcgJXJlbmFtZSBmdW5jdGlvbmFsaXR5LgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgYWxpYXNlcyBmb3IgJ2Nhc2UnIGVuY29kZXJzIHVzZWQgd2l0aCAlcmVuYW1lLyVuYW1ld2FybgoKCSAgICAgICUodXBwZXJjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIRUxMT19XT1JMRAoJICAgICAgJShsb3dlcmNhc2UpcyAgIEhlbGxvV29ybGQgIC0+IGhlbGxvd29ybGQKCSAgICAgICUoY2FtZWxjYXNlKXMgICBoZWxsb193b3JsZCAtPiBIZWxsb1dvcmxkCgkgICAgICAlKHVuZGVyY2FzZSlzICAgSGVsbG9Xb3JsZCAgLT4gaGVsbG9fd29ybGQKCgowMS8xMi8yMDA2OiBtbWF0dXMKCSAgICAtIEFkZCB0aGUgLWR1bXBfcGFyc2VfbW9kdWxlIGFuZCAtZHVtcF9wYXJzZV90b3Agb3B0aW9ucywKCSAgICB3aGljaCBhcmUgc2ltaWxhciB0byAtZHVtcF9tb2R1bGUgYW5kIC1kdW1wX3RvcCwgYnV0IHRoZXkKCSAgICBkdW1wIHRoZSBub2RlIHRyZWVzIGp1c3QgYWZ0ZXIgcGFyc2luZywgc2hvd2luZyBvbmx5IHRoZSAKCSAgICBhdHRyaWJ1dGVzIHZpc2libGUgYXQgdGhlIHBhcnNpbmcgc3RhZ2UsIGFuZCBub3QgdGhlIGFkZGVkCgkgICAgbGF0ZXIgaW4gdHlwZW1hcC5jeHgsIGFsbG9jYXRlLmN4eCwgbGFuZy5jeHggb3IgZWxzZXdoZXJlLgoJICAgIAoJICAgIEJlc2lkZXMgZGVidWdnaW5nIHBvcnB1c2VzLCB0aGVzZSBvcHRpb25zIGFyZSB2ZXJ5IHVzZWZ1bAoJICAgIGlmIHlvdSBwbGFuIHRvIHVzZSAlcmVuYW1lIGluIGFuICJhZHZhbmNlIHdheSIsIHNpbmNlIGl0CgkgICAgc2hvd3Mgb25seSBhbmQgYWxsIHRoZSBub2RlJ3MgYXR0cmlidXRlcyB5b3UgY2FuIHVzZQoJICAgIGluc2lkZSB0aGUgbWF0Y2ggcnVsZXMuCgoKMDEvMTIvMjAwNjogbW1hdHVzCgkgICAgLSBBZGQgcHJlZGljYXRlcyB0byAlcmVuYW1lLCBzbywgeW91IGRvbid0IG5lZWQgdG8KCSAgICAgIHJlbWVtYmVyLCBmb3IgZXhhbXBsZSwgaG93IHRvIG1hdGNoIGEgbWVtYmVyIGZ1bmN0aW9uLgoKCSAgICAgIE5vdyBpdCBpcyBlYXN5LCBmb3IgZXhhbXBsZSB0byB1c2UgdGhlICd1dGl0bGUnIGVuY29kZXIgCgkgICAgICBpbiBhbGwgdGhlIG1lbWJlciBtZXRob2RzLCB5b3UgdHlwZToKCgkgICAgICAgICVyZW5hbWUoIiUodXRpdGxlKXMiLCVpc2Z1bmN0aW9uLCVpc21lbWJlcikgIiI7CgoJICAgICAgb3IgdG8gaWdub3JlIGFsbCB0aGUgZW51bWl0ZW1zIGluIGEgZ2l2ZW4gY2xhc3M6CgoJICAgICAgICAlcmVuYW1lKCIkaWdub3JlIiwgJWlzZW51bWl0ZW0sICVjbGFzc25hbWU9Ik15Q2xhc3MiKSAiIjsgIAoKCSAgICAgIEF2YWlsYWJsZSBwcmVkaWNhdGVzIGFyZSAoc2VlIHN3aWcuc3dnKToKCiAgICAgICAgICAgICAgICAlaXNlbnVtICAgICAgICAgCgkJJWlzZW51bWl0ZW0gICAgIAoJCSVpc2FjY2VzcyAgICAgICAKCQklaXNjbGFzcyAgICAgICAgCgkJJWlzZXh0ZW5kICAgICAgIAoJCSVpc2V4dGVuZCAgICAgICAKCQklaXNjb25zdHJ1Y3RvciAgCgkJJWlzZGVzdHJ1Y3RvciAgIAoJCSVpc25hbWVzcGFjZSAgICAKCQklaXN0ZW1wbGF0ZSAgICAgCgkJJWlzY29uc3RhbnQgICAgIAoJCQkJCQoJCSVpc3VuaW9uICAgICAgICAKCQklaXNmdW5jdGlvbiAgICAgCgkJJWlzdmFyaWFibGUgICAgIAoJCSVpc2ltbXV0YWJsZSAgICAKCQkJCQkKCQklaXNzdGF0aWMgICAgICAgCgkJJWlzZnJpZW5kICAgICAgIAoJCSVpc3R5cGVkZWYgICAgICAKCQklaXN2aXJ0dWFsICAgICAgCgkJJWlzZXhwbGljaXQgICAgIAoJCSVpc2V4dGVybiAgICAgICAKCQkJCQkKCQklaXNtZW1iZXIgICAgICAgCgkJJWlzZ2xvYmFsIAoJCSVpbm5hbWVzcGFjZQoKCQklaXNwdWJsaWMgICAgCgkJJWlzcHJvdGVjdGVkIAoJCSVpc3ByaXZhdGUgICAKCQkJCSAgICAgCgkJJWNsYXNzbmFtZSAgIAoKICAgICAgICAgICAgICBUaGVzZSBwcmVkaWNhdGVzIGNvcnJlc3BvbmQgdG8gc3BlY2lmaWMgJ21hdGNoJwogICAgICAgICAgICAgIGRlY2xhcmF0aW9ucywgd2hpY2ggc29tZXRpbWVzIGFyZSBub3QgYXMgZXZpZGVudCBhcyB0aGUKICAgICAgICAgICAgICBwcmVkaWNhdGVzIG5hbWVzLgoKCiAgICAgICAgICAgIC0gQWRkIHRoZSBvciAnfCcgb3BlcmF0aW9uIGluICVyZW5hbWUgbWF0Y2gsIGZvcgogICAgICAgICAgICAgIGV4YW1wbGUgdG8gY2FwaXRhbGl6ZSBhbGwgdGhlIGNvbnN0YW50cyAoJWNvbnN0YW50IG9yCiAgICAgICAgICAgICAgY29uc3QgY2RlY2wpOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiLG1hdGNoPSJjZGVjbHxjb25zdGFudCIsJWlzaW1tdXRhYmxlKSAiIjsKICAgICAgICAgICAgICAgIAoKCjAxLzEyLzIwMDY6IG1nb3NzYWdlCgkgICAgLQlQYXJ0aWFsIGZpeGVkIG9mIGVycm9ycyB1bmRlciBDODksIGJ1ZyAjMTM1NjU3NAoJICAgIAkoY29udmVydGVkIEMrKyBzdHlsZSBjb21tZW50cyB0byBDIHN0eWxlKQoJICAgIC0JQWRkZWQgcGF0Y2hlcyBmcm9tIG5lb21hbnRyYUB1c2Vycy5zZi5uZXQgIzEzNzk5ODggYW5kICMxMzg4MzQzCgkgICAgCW1pc3NpbmcgYSAncmV0dXJuJyBzdGF0ZW1lbnQgZm9yIGVycm9yIGNvbmRpdGlvbnMKCSAgICAJYWxzbyB1cGRhdGVkIHRoZSAlaW5pdCBibG9jayBidWcgIzEzNTY1ODYKCQkgCjAxLzEwLzIwMDY6IG1tYXR1cwoJICAgIC0gQWRkIHRoZSAndXRpdGxlJyBlbmNvZGVyLCBhcyBhbiBleGFtcGxlIG9mIGhvdyB0byBhZGQKCSAgICAgIHlvdXIgb3duIGVuY29kZXIuIEkgYWRkZWQgdGhlIGVuY29kZXIgbWV0aG9kIGluIG1pc2MuYyAKCSAgICAgIGJ1dCBkZXZlbG9wZXJzIGNhbiBhZGQgb3RoZXJzLCB0aGUgc2FtZSB3YXksIGluc2lkZSBhbnkKCSAgICAgIHRhcmdldCBsYW5ndWFnZS4KCSAgICAgIAoJICAgICAgV2VsbCwgJ3V0aXRsZScgaXMgdGhlIHJldmVyc2Ugb2YgJ2N0aXRsZScsIGllOgoKCSAgICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAgLT4gQ2FtZWxDYXNlOwoJICAgICAgICAgJXJlbmFtZSgiJSh1dGl0bGUpcyIpIENhbWVsQ2FzZTsgICAtPiBjYW1lbF9jYXNlOwoJCSAKCjAxLzEwLzIwMDY6IGNmaXNhdmFnZQogICAgICAgICAgICBbUnVieV0KICAgICAgICAgICAgVXBkYXRlZCBSdWJ5IEV4Y2VwdGlvbiBoYW5kbGluZy4gIENsYXNzZXMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRocm93cyBjbGF1c2VzLCAKICAgICAgICAgICAgb3IgYXJlIG1hcmtlZCBhcyAlZXhjZXB0aW9uY2xhc3MsIGFyZSBub3cgaW5oZXJpdGVkIGZyb20gcmJfZVJ1bnRpbWVFcnJvci4gCiAgICAgICAgICAgIFRoaXMgYWxsb3dzIGluc3RhbmNlcyBvZiB0aGVzZSBjbGFzc2VzIHRvIGJlIHJldHVybmVkIHRvIFJ1YnkgYXMgZXhjZXB0aW9ucy4gCiAgICAgICAgICAgIFRodXMgaWYgYSBDKysgbWV0aG9kIHRocm93cyBhbiBpbnN0YW5jZSBvZiBNeUV4Y2VwdGlvbiwgdGhlIGNhbGxpbmcgUnVieSAKICAgICAgICAgICAgbWV0aG9kIHdpbGwgZ2V0IGJhY2sgYSBNeUV4Y2VwdGlvbiBvYmplY3QuICBUbyBzZWUgYW4gZXhhbXBsZSwgCiAgICAgICAgICAgIGxvb2sgYXQgcnVieS9leGFtcGxlcy9leGNlcHRpb25fY2xhc3MuCgowMS8xMC8yMDA2OiBtbWF0dXMKCSAgICAKICAgICAgICAgICAgLSBBZGQgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSwgd2hpY2ggY29tcGxlbWVudHMgdGhlICVleGNlcHRpb24KCSAgICBkaXJlY3RpdmUgaW4gYSBtb3JlIGF1dG9tYXRpYyB3YXkuIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgIGludCBmb28oKSB0aHJvdyhFMSk7CgogICAgICAgICAgICBzd2lnIGdlbmVyYXRlcyB0aGUgcHJvcGVyIHRyeS9jYXRjaCBjb2RlIHRvIGRpc3BhdGNoIEUxLgoJICAgIAoJICAgIEJ1dCBpZiB5b3UgaGF2ZToKCgoJICAgICAgICAgIGludCBiYXJmb28oaW50IGkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAxKSB7CgkgICAgICAgICAgICAgICB0aHJvdyBFMSgpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CgkgICAgICAgICAgICAgIHRocm93IEUyKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZSwgd2hlcmUgdGhlcmUgaXMgbm8gZXhwbGljaXQgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gaW4gdGhlIGRlY2wsIHlvdSAKCSAgICBlbmQgdXAgZG9pbmc6CgkJICAKICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBiYXJmb28gewkJCQoJICAgICAgICAgdHJ5IHsJCQkJCgkgICAgICAgICAgICRhY3Rpb24JCQkKCSAgICAgICAgIH0gY2F0Y2goRTEpIHsJLi4uIH0JCQkJICAKCSAgICAgICAgIH0gY2F0Y2goRTIpIHsJLi4uIH0JCQkJICAKCSAgICAgICB9CQkJCQoJICAgIAoJICAgIHdoaWNoIGlzIHZlcnkgdGVkaW91cy4gV2VsbCwgdGhlICVjYXRjaGVzIGRpcmVjdGl2ZSBkZWZpbmVzCgkgICAgdGhlIGxpc3Qgb2YgZXhjZXB0aW9ucyB0byBjYXRjaCwgYW5kIGZyb20gc3dpZzoKIAkKCSAgICAgICAlY2F0Y2hlcyhFMSxFMikgYmFyZm9vKGludCBpKTsKCSAgICAgICBpbnQgYmFyZm9vKGludCBpKTsKCiAgICAgICAgICAgIGlzIGVxdWl2YWxlbnQgdG8gCgoJICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCgkgICAgTm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgJWNhdGNoZXMgbGlzdCBkb2Vzbid0IGhhdmUgdG8KCSAgICBjb3JyZXNwb25kIHRvIHRoZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24uIEZvciBleGFtcGxlLCBpZiB5b3UKCSAgICBoYXZlOgoKCQlzdHJ1Y3QgRSB7fTsKCQlzdHJ1Y3QgRTEgOiBFIHt9OwoJCXN0cnVjdCBFMiA6IEUge307CgogIAkgICAgICAgIGludCBiYXJmb28oaW50IGkpIHRocm93KEUxLEUyKTsKCiAgICAgICAgICAgIHlvdSBjYW4gZGVmaW5lCgkgICAgICAgIAoJCSVjYXRjaGVzKEUpIGJhcmZvbyhpbnQgaSk7CgkKCSAgICBhbmQgc3dpZyB3aWxsIGdlbmVyYXRlIGFuIGFjdGlvbiBjb2RlIGVxdWl2YWxlbnQgdG8KCgkgICAgICAgICB0cnkgewkJCQkKCSAgICAgICAgICAgJGFjdGlvbgkJCQoJICAgICAgICAgfSBjYXRjaChFICZfZSkgeyAKCQkgICA8cmFpc2UgX2U+OwoJCSB9CQoKICAgICAgICAgICAgT2YgY291cnNlLCB5b3Ugc3RpbGwgaGF2ZSB0byBzYXRpc2Z5IHRoZSBDKysgcmVzdHJpY3Rpb25zLAoJICAgIGFuZCB0aGUgY2F0Y2hlcyBsaXN0IG11c3QgYmUgY29tcGF0aWJsZSAobm90IHRoZSBzYW1lKQoJICAgIGFzIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHR5cGVzIGluIHRoZSBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4KCgkgICAgQWxzbywgeW91IGNhbiBub3cgc3BlY2lmeSB0aGF0IHlvdSB3YW50IHRvIGNhdGNoIHRoZQoJICAgIHVua25vd24gZXhjZXB0aW9uICcuLi4nLCBmb3IgZXhhbXBsZToKCgkgICAgICAgJWNhdGNoZXMoRTEsRTIsLi4uKSBiYXJmb28oaW50KTsKCgkgICAgSW4gYW55IGNhc2UsIHRoZSAlY2F0Y2hlcyBkaXJlY3RpdmUgd2lsbCBlbWl0IHRoZQoJICAgIGNvZGUgdG8gY29udmVydCBpbnRvIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgZXJyb3IvZXhjZXB0aW9uCiAgICAgICAgICAgIHVzaW5nIHRoZSAndGhyb3dzJyB0eXBlbWFwLgoKCSAgICBGb3IgdGhlICcuLi4nIGNhc2UgdG8gd29yaywgeW91IG5lZWQgdG8KCSAgICB3cml0ZSB0aGUgcHJvcGVyIHR5cGVtYXAgaW4geW91ciB0YXJnZXQgbGFuZ3VhZ2UuIEluIHRoZQoJICAgIFVUTCwgdGhpcyBsb29rcyBsaWtlOgoKCSAgICAgICV0eXBlbWFwKHRocm93cykgKC4uLikgewoJICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX1J1bnRpbWVFcnJvciwidW5rbm93biBleGNlcHRpb24iKTsKICAgICAgICAgICAgICB9CgowMS8wOS8yMDA2OiBtdXRhbmRpegoJICAgIFtBbGxlZ3JvY2xdCgogICAgICAgICAgICBGaXhlcyBhIG51bWJlciBvZiBTRUdWcyBwcmltYXJpbHkgaW4gdGhlIGhhbmRsaW5nIG9mCiAgICAgICAgICAgIHZhcmlvdXMgYW5vbnltb3VzIHR5cGVzLiBGb3VuZCBpbiBhIHBhc3MgdGhyb3VnaCB0aGUKICAgICAgICAgICAgc3dpZyB0ZXN0LXN1aXRlLiBTdGlsbCBtb3JlIHRvIGRvIGhlcmUsIGJ1dCB0aGlzIGlzIGEKICAgICAgICAgICAgZ29vZCBjaGVja3BvaW50LgoKICAgICAgICAgICAgQWRkcyAtY3dyYXAgYW5kIC1ub2N3cmFwIGFzIGFuIGFsbGVncm9jbCBzcGVjaWZpYwogICAgICAgICAgICBjb21tYW5kLWxpbmUgYXJndW1lbnQuIENvbnRyb2xzIGdlbmVyYXRpbmcgb2YgYSBDCiAgICAgICAgICAgIHdyYXBwZXIgZmlsZSB3aGVuIHdyYXBwaW5nIEMgY29kZS4gQnkgZGVmYXVsdCBvbmx5IGEKICAgICAgICAgICAgbGlzcCBmaWxlIGlzIGNyZWF0ZWQgZm9yIEMgY29kZSB3cmFwcGluZy4KCiAgICAgICAgICAgIERvYyB1cGRhdGVzIGZvciB0aGUgY29tbWFuZC1saW5lIGFyZ3VtZW50cyBhbmQgZml4ZXMgYXMKICAgICAgICAgICAgcG9pbnRlZCBvdXQgb24gc3dpZy1kZXZlbAoKMDEvMDUvMjAwNjogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIEZpeCB1bnNpZ25lZCBsb25nIGxvbmcgYW5kIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmIHR5cGVtYXBzCiAgICAgICAgICAgIC0gQnVnICMxMzk4Mzk0ICB3aXRoIHBhdGNoIGZyb20gRHJpZXMgRGVjb2NrCgowMS8wNi8yMDA2OiBtbWF0dXMKCSAgICBBZGQgJ25hbWVkJyB3YXJuaW5nIGNvZGVzLCBub3cgaW4gYWRkaXRpb24gdG86CgkgICAgCgkgICAgICAld2FybmZpbHRlcig4MTMpOwoJICAgCgkgICAgeW91IGNhbiB1c2UKCgkgICAgICAld2FybmZpbHRlcihTV0lHV0FSTl9KQVZBX01VTFRJUExFX0lOSEVSSVRBTkNFKTsKCgkgICAganVzdCB1c2UgdGhlIHNhbWUgY29kZSBuYW1lIGZvdW5kIGluICBTb3VyY2UvSW5jbHVkZS9zd2lnd2Fybi5oIAoJICAgIHBsdXMgdGhlICdTV0lHJyBwcmVmaXguCgoJICAgIElmIGEgZGV2ZWxvcGVyIGFkZHMgYSBuZXcgd2FybmluZyBjb2RlLCB0aGUgTGliL3N3aWd3YXJuLnN3ZyBmaWxlCiAgICAgICAgICAgIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcnVubmluZyB0aGUgdG9wIGxldmVsIG1ha2UuCgowMS8wNS8yMDA2OiBjZmlzYXZhZ2UKICAgICAgICAgICAgW1J1YnldCgkgICAgUmVpbXBsZW1lbnRlZCBvYmplY3QgdHJhY2tpbmcgZm9yIFJ1YnkuICBUaGUgbmV3IGltcGxlbWVudGF0aW9uIHdvcmtzCgkgICAgYnkgZXhwYW5kaW5nIHRoZSBzd2lnX2NsYXNzIHN0cnVjdHVyZSBmb3IgUnVieSBieSBhZGRpbmcgYSB0cmFja09iamVjdHMKCSAgICBmaWVsZC4gIFRoaXMgZmllbGQgY2FuIGJlIHNldC91bnNldCB2aWEgJXRyYWNrb2JqZWN0cyBhcyBleHBsYWluZWQKCSAgICBpbiB0aGUgUnVieSBkb2N1bWVudGF0aW9uLiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBpcyBtb3JlIHJvYnVzdAoJICAgIGFuZCB0YWtlcyBsZXNzIGNvZGUgdG8gaW1wbGVtZW50LgoJCQowMS8wNS8yMDA2OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggZm9yICVleHRlbmQgYW5kIHN0YXRpYyBjb25zdCBpbnRlZ3JhbCB0eXBlcywgZWc6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IGJhciA9IDQyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH07IAoKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbmZvIGZvciBvbGQgYW5kIG5ldyBkZWJ1ZyBvcHRpb25zOgogICAgICAgICAgICAgIAogICAgICAgICAgICAtZHVtcF90b3AgICAgICAgLSBQcmludCBpbmZvcm1hdGlvbiBvZiB0aGUgZW50aXJlIG5vZGUgdHJlZSwgaW5jbHVkaW5nIHN5c3RlbSBub2RlcyAgICAKICAgICAJICAgIC1kdW1wX21vZHVsZSAgICAtIFByaW50IGluZm9ybWF0aW9uIG9mIHRoZSBtb2R1bGUgbm9kZSB0cmVlLCBhdm9pZGluZyBzeXN0ZW0gbm9kZXMgICAgIAogICAgIAkgICAgLWR1bXBfY2xhc3NlcyAgIC0gUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzZXMgZm91bmQgaW4gdGhlIGludGVyZmFjZQkgICAgICAgCiAgICAgCSAgICAtZHVtcF90eXBlZGVmICAgLSBQcmludCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdHlwZXMgYW5kIHR5cGVkZWZzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UKICAgICAJICAgIC1kdW1wX3RhZ3MgICAgICAtIFByaW50IGluZm9ybWF0aW9uIGFib3V0IHRoZSB0YWdzIGZvdW5kIGluIHRoZSBpbnRlcmZhY2UJICAgICAgIAogICAgIAkgICAgLWRlYnVnX3R5cGVtYXAgIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0eXBlbWFwcwkJCSAgICAgICAKICAgICAgICAgICAgLWRlYnVnX3RlbXBsYXRlIC0gUHJpbnQgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyB0ZW1wbGF0ZXMJCQkgICAgICAgIAoKCSAgLSBBZGQgdGhlIGZha2V2ZXJzaW9uLiBJZiB5b3UgaGF2ZSBhIHByb2plY3QgdGhhdCB1c2VzCiAgICAgICAgICAgIGNvbmZpZ3VyZS9zZXR1cC5weSwgb3IgYW5vdGhlciBhdXRvbWF0aWMgYnVpbGRpbmcgc3lzdGVtCiAgICAgICAgICAgIGFuZCByZXF1aXJlcyBhIHNwZWNpZmljIHN3aWcgdmVyc2lvbiwgbGV0IHNheSAxLjMuMjIgCgkgICAgeW91IGNhbiB1c2U6CgoJICAgICAgIFNXSUdfRkVBVFVSRVM9Ii1mYWtldmVyc2lvbiAxLjMuMjIiCgoJICAgICBvcgogCiAgICAgICAgICAgICAgIHN3aWcgLWZha2V2ZXJzaW9uIDEuMy4yMgoKICAgICAgICAgICAgIGFuZCB0aGVuIHN3aWcgLXZlcnNpb24gd2lsbCByZXBvcnQgMS4zLjIyIGluc3RlYWQgb2YgdGhlCiAgICAgICAgICAgICBjdXJyZW50IHZlcnNpb24uCgoJICAgICBUeXBpY2FsIHVzZSB3b3VsZCBiZQoKCSAgICAgICBTV0lHX0ZFQVRVUkVTPSItZmFrZXZlcnNpb24gMS4zLjIyIiAuL2NvbmZpZ3VyZSAJICAgICAKCjEyLzMwLzIwMDU6IG1tYXR1cwoKCSAgLSBBZGQgb3B0aW9uL2Zvcm1hdCBzdXBwb3J0IHRvICVyZW5hbWUgYW5kICVuYW1ld2Fybi4JCgkgICAgTm93ICVuYW1ld2FybiBjYW4gZm9yY2UgcmVuYW1pbmcsIGZvciBleGFtcGxlOgoKCSAgICAgICVuYW1ld2FybigiMzE0OiBpbXBvcnQgaXMgYSBrZXl3b3JkIixyZW5hbWU9Il8lcyIpICJpbXBvcnQiOwoJICAgIAoJICAgIGFuZCByZW5hbWUgY2FuIGFsc28gc3VwcG9ydCBmb3JtYXQgZm9ybXM6CgoJICAgICAgICVyZW5hbWUoInN3aWdfJXMiKSBpbXBvcnQ7CgoJICAgIE5vdywgc2luY2UgdGhlIGZvcm1hdCBpcyBwcm9jZXNzZWQgdmlhIHN3aWcgUHJpbnRmLCB5b3UKCSAgICBjYW4gdXNlIGVuY29kZXJzIGFzIGZvbGxvd3M6CgoJICAgICAgICVyZW5hbWUoIiUodGl0bGUpcyIpICBpbXBvcnQ7ICAgICAtPiBJbXBvcnQKCSAgICAgICAlcmVuYW1lKCIlKHVwcGVyKXMiKSAgaW1wb3J0OyAgICAgLT4gSU1QT1JUCgkgICAgICAgJXJlbmFtZSgiJShsb3dlcilzIikgIEltcG9ydDsgICAgIC0+IGltcG9ydAoJICAgICAgICVyZW5hbWUoIiUoY3RpdGxlKXMiKSBjYW1lbF9jYXNlOyAtPiBDYW1lbENhc2UKCSAgICAgICAKCSAgICBUaGlzIHdpbGwgYWxsb3cgdXMgdG8gYWRkIG1vcmUgZW5jb2RlcnMsIGFzIHRoZSAKCSAgICBleHBlY3RlZCBvbmUgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMuIAoKCSAgLSBBZGQgdGhlIGFib3ZlICdjdGl0bGUnIGVuY29kZXIsIHdoaWNoIGRvZXMgdGhlIGNhbWVsIGNhc2U6CgoJICAgICAgICBjYW1lbF9jYXNlIC0+IENhbWVsQ2FzZQogIAoJICAtIEFsc28sIHdoaWxlIHdlIGdldCB0aGUgcmVnZXhwIHN1cHBvcnQsIGFkZCB0aGUgJ2NvbW1hbmQnIGVuY29kZXIsCiAgICAgICAgICAgIHlvdSBjYW4gdXNlIGl0IGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDpzZWQgLWUgJ3MvXChbYS16XVwpL1xVXFwxLycgPDw8IClzIikgaW1wb3J0OyAKCgkgICAgdGhlbiBzd2lnIHdpbGwgcG9wZW4gdGhlIGNvbW1hbmQKCSAgICAKCQkic2VkIC1lICdzL1woW2Etel1cKS9cVVxcMS8nIDw8PCBpbXBvcnQiCgkJCiAgICAgICAgICAgIHNlZSBiZWxvdyBmb3IgYW5vbnltb3VzIHJlbmFtZXMgZm9yIGJldHRlciBleGFtcGxlcy4JCQoKICAgICAgICAgIC0gVGhlIHJlbmFtZSBkaXJlY3RpdmUgbm93IGFsc28gYWxsb3dzOgoKCSAgICAtIHNpbXBsZSBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIGEgdHlwZSBtYXRjaAoJICAgICAgaGFwcGVuLCBmb3IgZXhhbXBsZQoKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2g9ImVudW1pdGVtIikgaGVsbG87CgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoJCSBpbnQgaGVsbG8oKSAgLT4gIGhlbGxvOyAKCgkgICAgLSBleHRlbmRlZCBtYXRjaDogb25seSBhcHBseSB0aGUgcmVuYW1lIGlmIHRoZSAnZXh0ZW5kZWQgYXR0cmlidXRlJyBtYXRjaAoJICAgICAgb2NjdXJyZWQsIGZvciBleGFtcGxlOiAKCgkgICAgICAgICAvLyBzYW1lIGFzIHNpbXBsZSBtYXRjaCAJCQoJCSAlcmVuYW1lKCUodGl0bGUpcyxtYXRjaCRub2RlVHlwZT0iZW51bWl0ZW0iKSBoZWxsbzsgCgoJCSBlbnVtIEhlbGxvIHsKCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgSGVsbG8gIAoJCSB9OwoKCSAgICAgICBOb3RlIHRoYXQgdGhlIHN5bWJvbCAnJCcgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGF0dHJpYnV0ZSBuYW1lIGluCgkgICAgICAgYSAncmVjdXJzaXZlJyB3YXksIGZvciBleGFtcGxlOgoKCQkgLy8gbWF0Y2ggb25seSBoZWxsbyBpbiAnZW51bSBIZWxsbycKCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgaGVsbG87IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIGhpLCBIZWxsbyAgIC8vIG1hdGNoCgkJIH07CgoJCSBlbnVtIEhpIHsKIAkJICAgaGksIGhlbGxvICAtPiAgaGksIGhlbGxvICAgLy8gbm8gbWF0Y2gKCQkgfTsKCiAgICAgICAgICAgICAgIGhlcmUsIGZvciBIZWxsbzo6aGksIHRoZSAicGFyZW50Tm9kZSIgaXMgIkhlbGxvIiwgYW5kIGl0cyAidHlwZSIKICAgICAgICAgICAgICAgaXMgImVudW0gSGVsbG8iLgoJICAgICAgIAoJICAgICAgIAogICAgICAgICAgICAtIEFub255bW91cyByZW5hbWVzOiB5b3UgY2FuIHVzZSAnYW5vbnltb3VzJyByZW5hbWUgZGlyZWN0aXZlcywgZm9yIGV4YW1wbGU6IAoKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgaW4gSGVsbG8KCQkgJXJlbmFtZSglKHRpdGxlKXMsbWF0Y2gkcGFyZW50Tm9kZSR0eXBlPSJlbnVtIEhlbGxvIikgIiI7IAoKCQkgZW51bSBIZWxsbyB7CiAJCSAgIGhpLCBoZWxsbyAgLT4gIEhpLCBIZWxsbyAgIC8vIG1hdGNoIGJvdGgKCQkgfTsKCgkJIGVudW0gSGkgewogCQkgICBoaSwgaGVsbG8gIC0+ICBoaSwgaGVsbG8gICAvLyBubyBtYXRjaAoJCSB9OwoJCSAKCSAgICAgICAgIC8vIHJlbmFtZSBhbGwgdGhlIGVudW0gaXRlbXMgCgkJICVyZW5hbWUoJSh0aXRsZSlzLG1hdGNoJG5vZGVUeXBlPSJlbnVtaXRlbSIpICIiOyAKCgkgICAgICAgICAvLyByZW5hbWUgYWxsIHRoZSBpdGVtcyBpbiBnaXZlbiBjb21tYW5kIChzbG9vb293LCBidXQuLi4pCgkJICVyZW5hbWUoJShjb21tYW5kOjxteSBleHRlcm5hbCBjbWQ+KXMpICIiOyAKCgkKCSAgICAgIEFub255bW91cyByZW5hbWVzIHdpdGggY29tbWFuZHMgY2FuIGJlIHZlcnkgcG93ZXJmdWwsIHNpbmNlIHlvdQoJICAgICAgY2FuICdvdXRzb3VyY2UnIGFsbCB0aGUgcmVuYW1pbmcgbWVjaGFuaXNtIChvciBwYXJ0IG9mIGl0KSB0byBhbgoJICAgICAgZXh0ZXJuYWwgcHJvZ3JhbToKCSAgICAgIAoJICAgICAgICAvLyBVcHBlcmNhc2UgYWxsIChhbmQgb25seSkgdGhlIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCAnaScKCSAgICAgICAgJXJlbmFtZSgiJShjb21tYW5kOmF3ayAnL15pL3twcmludCB0b3VwcGVyKCQxKX0nIDw8PClzIikgIiI7ICAgCgkgICAgICAgCgkgICAgICAgIGludCBpbXBvcnRlZCgpIC0+IElNUE9SVEVEOwoJICAgICAgICBpbnQgaGVsbG8oKSAgICAtPiBoZWxsbwoKCSAgICAgIE5vdGUgdGhhdCBpZiB0aGUgJ2NvbW1hbmQnIGVuY29kZXIgcmV0dXJucyBhbiBlbXB0eSBzdHJpbmcsIHN3aWcKCSAgICAgIHVuZGVyc3RhbmRzIHRoYXQgbm8gcmVuYW1lIGlzIG5lY2Vzc2FyeS4KCgkgICAgICBBbHNvIG5vdGUgdGhhdCAlcmVuYW1lICdwYXNzZXMnIHRoZSBtYXRjaGVkIG5hbWUuIEZvciBleGFtcGxlLCBpbgoJICAgICAgdGhpcyBjYXNlCgoJICAgICAgICBuYW1lc3BhY2UgbnMxIHsKCQkgIGludCBmb28oKTsKCQl9CgoJICAgICAgICBuYW1lc3BhY2UgbnMyIHsKCQkgIGludCBiYXIoKTsKCQl9CgoJICAgICAgdGhlIGV4dGVybmFsIHByb2dyYW0gb25seSByZWNlaXZlcyAiZm9vIiBhbmQgImJhciIuIElmIG5lZWRlZCwKCSAgICAgIGhvd2V2ZXIsIHlvdSBjYW4gcmVxdWVzdCB0aGUgJ2Z1bGxuYW1lJyAKCSAgICAgICAJCgkgICAgICAgICVyZW5hbWUoIiUoY29tbWFuZDphd2sgJ2F3ayAnL25zMTo6L3tsPXNwbGl0KCQxLGEsIjo6Iik7IHByaW50IHRvdXBwZXIoYVtsXSl9JycgPDw8KXMiLGZ1bGxuYW1lPTEpICIiOyAgIAogICAgICAgICAgICAgICAgCgkJbnMxOjpmb28gLT4gRk9PCgkJbnMyOjpiYXIgLT4gYmFyCQoJCgkgICAgLSBNaXhpbmcgZW5jb2RlcnMgYW5kIG1hdGNoaW5nOiBvZiBjb3Vyc2UsIHlvdSBjYW4gZG8gbWl4IGNvbW1hbmRzCgkgICAgICBhbmQgbWF0Y2ggZmllbGRzLCBmb3IgZXhhbXBsZToKCgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGZuY3M+KSIsbWF0Y2g9ImNkZWNsIikgIiI7CgkgICAgICAgICVyZW5hbWUoIiUoPG15IGVuY29kZXIgZm9yIGVudW1zPikiLG1hdGNoPSJlbnVtaXRlbSIpICIiOwoJICAgICAgICAlcmVuYW1lKCIlKDxteSBlbmNvZGVyIGZvciBlbnVtcyBpbnNpZGUgYSBjbGFzcz4pIixtYXRjaD0iZW51bWl0ZW0iLAoJCSAgICAgICAgbWF0Y2gkcGFyZW50Tm9kZSRwYXJlbnROb2RlJG5vZGVUeXBlPSJjbGFzcyIpICIiOwoJCQoJICAgICAgVXNlICJzd2lnIC1kdW1wX3BhcnNlX21vZHVsZSIgdG8gc2VlIHRoZSBhdHRyaWJ1dGUgbmFtZXMgeW91IGNhbiB1c2UgdG8KCSAgICAgIG1hdGNoIGEgc3BlY2lmaWMgY2FzZS4KCQogICAgICAgICAgICAtICdzb3VyY2VmbXQnIGFuZCAndGFyZ2V0Zm10Jzogc29tZXRpbWVzIHlvdSBuZWVkIHRvCiAgICAgICAgICAgICAgcHJvY2VzcyB0aGUgJ3NvdXJjZScgbmFtZSBiZWZvcmUgY29tcGFyaW5nLCBmb3IgZXhhbXBsZQoKCSAgICAgICAgJW5hbWV3YXJuKCIzMTQ6IGVtcHR5IGlzIGEga2V5d29yZCIsc291cmNlZm10PSIlKGxvd2VyKXMiKSAiZW1wdHkiOwoKCSAgICAgIHRoZW4gaWYgeW91IGhhdmUKCgkgICAgICAgIGludCBFbXB0eSgpOyAgLy8gIkVtcHR5IiBpcyB0aGUgc291cmNlIAoJCQoJICAgICAgeW91IHdpbGwgZ2V0IHRoZSBrZXl3b3JkIHdhcm5pbmcgc2luY2UgJ0VtcHR5JyB3aWxsIGJlCgkgICAgICBsb3dlciBjYXNlZCwgdmlhIHRoZSBzb3VyY2VmbXQ9IiUobG93ZXIpcyIgb3B0aW9uLAoJICAgICAgYmVmb3JlIGJlZW4gY29tcGFyZWQgdG8gdGhlICd0YXJnZXQnICJlbXB0eSIuCgoJICAgICAgVGhlcmUgaXMgYW4gYWRkaXRpb25hbCAndGFyZ2V0Zm10JyBvcHRpb24gdG8gcHJvY2VzcyB0aGUKCSAgICAgICd0YXJnZXQnIGJlZm9yZSBjb21wYXJpbmcuCgoJICAgIC0gY29tcGxlbWVudGluZyAnbWF0Y2gnOiB5b3UgY2FuIHVzZSAnbm90bWF0Y2gnLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICVuYW1ld2FybigiMzE0OiBlbXB0eSBpcyBhIGtleXdvcmQiLHNvdXJjZWZtdD0iJShsb3dlcilzIixub3RtYXRjaD0ibmFtZXNwYWNlIikgImVtcHR5IjsKCgkgICAgICBoZXJlLCB0aGUgbmFtZSB3YXJuaW5nIHdpbGwgYmUgYXBwbGllZCB0byBhbGwgdGhlIHN5bWJvbHMgZXhjZXB0IG5hbWVzcGFjZXMuCgkgICAgCiAgICAgIAkKMTIvMzAvMjAwNTogbW1hdHVzCgoJICAtIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIGdjaiBhbmQgSmF2YSAtPiA8dGFyZ2V0IGxhbmd1YWdlPiBtZWNoYW5pc20uCgoJICAgIFNlZQlleGFtcGxlcyBpbjogIAoJICAKCQlFeGFtcGxlcy9weXRob24vamF2YQoJCUV4YW1wbGVzL3J1YnkvamF2YQoJCUV4YW1wbGVzL3RjbC9qYXZhCgogICAgICAgICAgICB0byBzZWUgaG93IHRvIHVzZSBnY2orc3dpZyB0byBleHBvcnQgamF2YSBjbGFzc2VzIGludG8KICAgICAgICAgICAgcHl0aG9uL3J1YnkvdGNsLgoJICAgIAoJICAgIFRoZSBpZGVhIGlzIHRvIHB1dCBhbGwgdGhlIGNvbW1vbiBjb2RlIGZvciBnY2ogaW5zaWRlCgoJICAgICAgICAgIExpYi9nY2oKCiAgICAgICAgICAgIGFuZCBsb2NhbGl6ZSBzcGVjaWZpYyB0eXBlcyBzdWNoIGFzIGpzdHJpbmcsIGFzIGNhbiBiZSBmb3VuZAogICAgICAgICAgICBpbgoKCSAgICAgICAgIExpYi9weXRob24vanN0cmluZy5pCgkgICAgICAgICBMaWIvcnVieS9qc3RyaW5nLmkKCSAgICAgICAgIExpYi90Y2wvanN0cmluZy5pCgogICAgICAgICAgICBVc2luZyB0aGUgVVRMLCB0aGlzIGlzIHZlcnkgZWFzeSwgYW5kIHRoZSBwZXJsIHZlcnNpb24gZm9yCiAgICAgICAgICAgIGpzdHJpbmcuaSB3aWxsIGJlIG5leHQuCgkJIAkgICAgCgoxMi8yOS8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgdGhlIGNvcHljdG9yIGZlYXR1cmUvZGlyZWN0aXZlL29wdGlvbiB0byBlbmFibGUgdGhlIGF1dG9tYXRpYwoJICAgIGdlbmVyYXRpb24gb2YgY29weSBjb25zdHJ1Y3RvcnMuIFVzZSBhcyBpbjoKCgkgICAgICAlY29weWN0b3IgQTsKCgkgICAgICBzdHJ1Y3QgQSB7CgogICAgICAgICAgICAgIH07CgoJICAgIHRoZW4gdGhpcyB3aWxsIHdvcmsKCgkgICAgICBhMSA9IEEoKTsKCSAgICAgIGEyID0gQShhMSk7CgoJICAgIEFsc28sIHNpbmNlIGl0IGlzIGEgZmVhdHVyZSwgaWYgeW91IGp1c3QgdHlwZQoKCSAgICAgICVjb3B5Y3RvcjsKCgkgICAgdGhhdCB3aWxsICBlbmFibGUgdGhlIGF1dG9tYXRpYyBnZW5lcmF0aW9uIGZvciBhbGwgdGhlCgkgICAgY2xhc3Nlcy4gSXQgaXMgYWxzbyBlcXVpdmFsZW50IHRvCgoJICAgICAgIHN3aWcgLWNvcHljdG9yIC1jKysgLi4uCgoJICAgIE5vdGVzOiAKCgkgICAgMS4tIFRoZSBmZWF0dXJlIG9ubHkgd29ya3MgaW4gQysrIG1vZGUuCgoJICAgIDIuLSBUaGUgYXV0b21hdGljIGNyZWF0aW9uIG9mIHRoZSBjb3B5IGNvbnN0cnVjdG9yIHdpbGwKCSAgICAgICAgdXN1YWxseSBwcm9kdWNlIG92ZXJsb2FkaW5nLiBIZW5jZSwgaWYgdGhlIHRhcmdldAoJICAgICAgICBsYW5ndWFnZSBkb2Vzbid0IHN1cHBvcnQgb3ZlcmxvYWRpbmcsIGEgc3BlY2lhbCBuYW1lCgkgICAgICAgIHdpbGwgYmUgdXNlZCAoQV9jb3B5KS4KCSAgICAKCSAgICAzLi0gRm9yIHRoZSBvdmVybG9hZGluZyByZWFzb25zIGFib3ZlLCBpdCBpcyBwcm9iYWJseSBub3QKICAgICAgICAgICAgICAgIGEgZ29vZCBpZGVhIHRvIHVzZSB0aGUgZmxhZyB3aGVuLCBmb3IgZXhhbXBsZSwgeW91IGFyZQoJCXVzaW5nIGtleXdvcmRzIGluIFB5dGhvbi4KCiAgICAgICAgICAgIDQuLSBUaGUgY29weWN0b3IgYXV0b21hdGljIG1lY2hhbmlzbSBmb2xsb3dzIG1vcmUgb3IgbGVzcwoJICAgICAgICB0aGUgc2FtZSBydWxlcyBhcyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBtZWNoYW5pc20sCgkgICAgICAgIGkuZS4sIGEgY29weSBjb25zdHJ1Y3RvciB3aWxsIG5vdCBiZSBhZGRlZCBpZiB0aGUKCSAgICAgICAgY2xhc3MgaXMgYWJzdHJhY3Qgb3IgaWYgdGhlcmUgaXMgYSBwZXJ0aW5lbnQgbm9uLXB1YmxpYyAKCQljb3B5IGN0b3IgaW4gdGhlIGNsYXNzIG9yIGl0cyBoaWVyYXJjaHkuCgoJCUhlbmNlLCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgZm9yIHlvdSB0byBjb21wbGV0ZSB0aGUKCQljbGFzcyBkZWNsYXJhdGlvbiB3aXRoIHRoZSBwcm9wZXIgbm9uLXB1YmxpYyBjb3B5IGN0b3IKCQl0byBhdm9pZCBhIHdyb25nIGNvbnN0cnVjdG9yIGFkZGl0aW9uLgoJCQogICAgICAgICAgLSBGaXggZmVhdHVyZXMvcmVuYW1lIGZvciB0ZW1wbGF0ZXMgY3Rvci9kdG9yIGFuZCBvdGhlcgogICAgICAgICAgICB0aGluZ3MgYXJvdW5kIHdoaWxlIGFkZGluZyB0aGUgY29weWN0b3IgbWVjaGFuaXNtLgoJICAgIAoKMTIvMjcvMjAwNTogbW1hdHVzCgkgIC0gQWRkIHRoZSAnbWF0Y2gnIG9wdGlvbiB0byB0eXBlbWFwcy4gQXNzdW1lIHlvdSBoYXZlOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAqIChpbnQgcmVzKSB7Li59CgkgICAgICAldHlwZW1hcChmcmVlYXJnKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCgkgICAgdGhlbiBpZiB5b3UgZG8KIAoJICAgICAgJXR5cGVtYXAoaW4pIEEgKiB7Li4ufQoKCSAgICBzd2lnIHdpbGwgJ292ZXJsb2FkIHRoZSAnaW4nIHR5cGVtYXAsIGJ1dCB0aGUgJ2ZyZWVhcmcnIAoJICAgIHR5cGVtYXAgd2lsbCBiZSBhbHNvIGFwcGxpZWQsIGV2ZW4gd2hlbiB0aGlzIGlzIHdyb25nLiBUaGUgb2xkCgkgICAgc29sdXRpb25zIGlzIHRvIHdyaXRlOgoKCSAgICAgICV0eXBlbWFwKGluKSBBICogey4uLn0KICAJICAgICAgJXR5cGVtYXAoZnJlZWFnKSBBICogIiI7CgoJICAgIG92ZXJsb2FkICdmcmVlYXJnJyB3aXRoIGFuIGVtcHR5IGRlZmluaXRpb24uCgoJICAgIFRoZSBwcm9ibGVtIGlzLCBob3dldmVyLCB0aGVyZSBpcyBubyB3YXkgdG8ga25vdyB5b3UgbmVlZAoJICAgIHRvIGRvIHRoYXQgdW50aWwgeW91IHN0YXJ0IGdldHRpbmcgYnJva2VuIEMrKyBjb2RlLCBvcgoJICAgIHdvcnNlLCBicm9rZW4gcnVudGltZSBjb2RlLgoKCSAgICBUaGUgc2FtZSBhcHBsaWVzIHRvIHRoZSBpbmZhbW91cyAndHlwZWNoZWNrJyB0eXBlbWFwLAoJICAgIHdoaWNoIGFsd2F5cyBjb25mdXNlcyBwZW9wbGUsIHNpbmNlIHRoZSBmaXJzdCB0aGluZyB5b3UgZG8KCSAgICBpcyB0byBqdXN0IHdyaXRlIHRoZSAnaW4nIHR5cGVtYXAuCgoJICAgIFRoZSAnbWF0Y2gnIG9wdGlvbiBzb2x2ZXMgdGhlIHByb2JsZW0sIGFuZCBpZiBpbnN0ZWFkIHlvdSB3cml0ZToKCgkgICAgICAldHlwZW1hcChpbikgU1dJR1RZUEUgKiAoaW50IHJlcykgey4ufQoJICAgICAgJXR5cGVtYXAoZnJlZWFyZyxtYXRjaD0iaW4iKSBTV0lHVFlQRSAqIHsgaWYgKHJlcyRhcmdudW0pIC4uLn0KCSAgICAgICV0eXBlbWFwKHR5cGVjaGVjayxtYXRjaD0iaW4iLHByZWNlZGVuY2UuLi4pIFNXSUdUWVBFICogey4uLn0KCSAgICAKCSAgICBpdCB3aWxsIHRlbGwgc3dpZyB0byBhcHBseSB0aGUgJ2ZyZWVhcmcvdHlwZWNoZWNrJwoJICAgIHR5cGVtYXBzIG9ubHkgaWYgdGhleSAnbWF0Y2gnIHRoZSB0eXBlIG9mIHRoZSAnaW4nCgkgICAgdHlwZW1hcC4gVGhlIHNhbWUgY2FuIGJlIGRvbmUgd2l0aCBvdGhlciB0eXBlbWFwcyBhczoKCgkgICAgICAldHlwZW1hcChkaXJlY3Rvcm91dCkgU1dJR1RZUEUgKiB7Li4ufQoJICAgICAgJXR5cGVtYXAoZGlyZWN0b3JmcmVlLG1hdGNoPSJkaXJlY3Rvcm91dCIpIFNXSUdUWVBFICogey4uLn0KCSAgICAKCjEyLzI3LzIwMDU6IG1tYXR1cwoJICAtIEFkZCB0aGUgJ25hdHVyYWx2YXInIG9wdGlvbi9tb2RlL2ZlYXR1cmUgdG8gdHJlYXQgbWVtYmVyCgkgICAgdmFyaWFibGVzIGluIGEgbW9yZSBuYXR1cmFsIHdheSwgaWUsIHNpbWlsYXIgdG8gdGhlIGdsb2JhbAoJICAgIHZhcmlhYmxlIGJlaGF2aW9yLgoKCSAgICBZb3UgY2FuIHVzZSBpdCBpbiBhIGdsb2JhbCB3YXkgdmlhIHRoZSBjb21tYW5kIGxpbmUKCgkgICAgICBzd2lnIC1uYXR1cmFsdmFyIC4uLgoKCSAgICBvciB0aGUgbW9kdWxlIG1vZGUgb3B0aW9uCiAKCSAgICAgICVtb2R1bGUobmF0dXJhbHZhcj0xKQoKCSAgICBib3RoIGZvcm1zIG1ha2Ugc3dpZyB0cmVhdCBhbGwgdGhlIG1lbWJlciB2YXJpYWJsZXMgaW4gdGhlCgkgICAgc2FtZSB3YXkgaXQgdHJlYXRzIGdsb2JhbCB2YXJpYWJsZXMuIAoKCSAgICBBbHNvLCB5b3UgY2FuIHVzZSBpdCBpbiBhIGNhc2UgYnkgY2FzZSBhcHByb2FjaCBmb3IKCSAgICBzcGVjaWZpYyBtZW1iZXIgdmFyaWFibGVzIHVzaW5nIHRoZSBkaXJlY3RpdmUgZm9ybToKCgkgICAgICAlbmF0dXJhbHZhciBCYXI6OnM7CgkgICAgCgkgICAgVGhlbiwgaW4gdGhlIGZvbGxvd2luZyBjYXNlIGZvciBleGFtcGxlOgoKCSAgICAgICBzdGQ6OnN0cmluZyBzOwoJICAgICAgIHN0cnVjdCBCYXIgewoJCSBzdGQ6OnN0cmluZyBzOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgeW91IGNhbiBkbzogIAoKCSAgICAgICBiID0gQmFyKCkKCSAgICAgICBiLnMgPSJoZWxsbyIKCSAgICAgICBjdmFyLnMgPSAiaGVsbG8iCgkgICAgICAgCgkgICAgICAgaWYgKGIucyAhPSBjdmFyLnMpOgoJICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgoKCQkgIAogICAgICAgICAgICBUaGlzIGlzIHZhbGlkIGZvciBhbGwgdGhlIGxhbmd1YWdlcywgYW5kIHRoZQogICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBpcyBiYXNlZCBvbiBmb3JjaW5nIHRoZSB1c2Ugb2YgdGhlIAogICAgICAgICAgICBjb25zdCBTV0lHVFlQRSYgKEMrKykvU1dJR1RZUEUgKEMpIHR5cGVtYXBzIGZvciB0aGUKICAgICAgICAgICAgZ2V0L3NldCBtZXRob2RzIGluc3RlYWQgb2YgdGhlIFNXSUdUWVBFICogdHlwZW1hcHMuCgkgICAgSGVuY2UsIGZvciAnbmF0dXJhbHZhcicgdG8gd29yaywgZWFjaCB0YXJnZXQgbGFuZ3VhZ2UKCSAgICBtdXN0IGltcGxlbWVudCAndHlwZW1hcChpbi9vdXQpIGNvbnN0IFR5cGUmJyBwcm9wZXJseS4KCgkgICAgVGhlICduYXR1cmFsdmFyJyBvcHRpb24gcmVwbGFjZXMgb3IgbWFrZXMgd29ya2Fyb3VuZHMgc3VjaCAgYXM6CgkgICAgCgkJJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqfQoKICAgICAgICAgICAgdW5uZWNlc3NhcnkuCgoJICAgIE5vdGUxOiBJZiB5b3VyIGludGVyZmFjZSBoYXMgb3RoZXIga2luZHMgb2Ygd29ya2Fyb3VuZHMgdG8KCSAgICBkZWFsIHdpdGggdGhlIG9sZCAndW5uYXR1cmFsJyB3YXkgdG8gZGVhbCB3aXRoIG1lbWJlcgoJICAgIHZhcmlhYmxlcyAocmV0dXJuaW5nL2V4cGVjdGluZyBwb2ludGVycyksIHRoZQoJICAgICduYXR1cmFsdmFyJyBvcHRpb24gY291bGQgYnJlYWsgdGhlbS4KCSAgICAKCSAgICBOb3RlMjogdGhlIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHVubmFtZWQgdHlwZXMsIHN1Y2gKCSAgICBhcyB1bm5hbWVkIG5lc3RlZCB1bmlvbnMuCgkgICAgCgkgIAoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgbW9yZSAnZXhwcmVzc2l2ZScgcmVzdWx0IHN0YXRlcyBmb3IgdGhlIHR5cGVtYXAKICAgICAgICAgICAgbGlicmFyaWVzLgoKCSAgICBJbiB0aGUgcGFzdCwgZm9yIHNjcmlwdGluZyBsYW5ndWFnZXMsIHlvdSB3b3VsZCBkbyBjaGVja2luZyBzb21ldGhpbmcgbGlrZToKCgkgICAgICBpZiAoQ29udmVydFB0cihvYmosJnZwdHIsdHksZmxhZ3MpICE9IC0xKSB7CgkgICAgICAgIC8vIHN1Y2Nlc3MKICAgICAgICAgICAgICB9IGVsc2UgewoJICAgICAgICAvLyBlcnJvcgoJICAgICAgfQoKCSAgICBOb3cgdGhlIHJlc3VsdCBzdGF0ZSBjYW4gY2FycnkgbW9yZSBpbmZvcm1hdGlvbiwKCSAgICBpbmNsdWRpbmc6CgoJICAgICAgLSBFcnJvciBzdGF0ZTogbGlrZSB0aGUgb2xkIC0xLzAsIGJ1dCB3aXRoIGVycm9yIGNvZGVzIGZyb20gc3dpZ2Vycm9ycy5zd2cuCgoJICAgICAgICAgaW50IHJlcyA9IENvbnZlcnRQdHIob2JqLCZ2cHRyLHR5LGZsYWdzKTsKCQkgaWYgKFNXSUdfSXNPSyhyZXMpKSB7CgkJICAgLy8gc3VjY2VzcyBjb2RlCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCQkgICBTV0lHX0Vycm9yKHJlcyk7IC8vIHJlcyBjYXJyaWVzIHRoZSBlcnJvciBjb2RlCiAgICAgICAgICAgICAgICAgfQoKCSAgICAgIC0gQ2FzdCByYW5rOiB3aGVuIHJldHVybmluZyBhIHNpbXBsZSBzdWNjZXNzZnVsCiAgICAgICAgICAgICAgICBjb252ZXJzaW9uLCB5b3UganVzdCByZXR1cm4gU1dJR19PSywgYnV0IGlmIHlvdSBuZWVkCiAgICAgICAgICAgICAgICB0byBkbyBhICdjYXN0JywgeW91IGNhbiBhZGQgdGhlIGNhc3RpbmcgcmFuaywgaWU6CgkJCgkJICBpZiAoUHlGbG9hdF9DaGVjayhvYmopKSB7CgkJICAgIHZhbHVlID0gUHlGbG9hdF9Bc0RvdWJsZShvYmopOwoJCSAgICByZXR1cm4gU1dJR19PSzsKCQkgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2sob2JqKSkgewoJCSAgICB2YWx1ZSA9IChkb3VibGUpIFB5SW50X0FzTG9uZyhvYmopOwoJCSAgICByZXR1cm4gU1dJR19BZGRDYXN0KFNXSUdfT0spOwkJICAgIAogICAgICAgICAgICAgICAgICB9CgkJCgkJbGF0ZXIsIHRoZSBjYXN0aW5nIHJhbmsgaXMgdXNlZCB0byBwcm9wZXJseSBkaXNwYXRjaAoJCXRoZSBvdmVybG9hZGVkIGZ1bmN0aW9uLCBmb3IgZXhhbXBsZS4gVGhpcyBvZiBjb3Vyc2UKCQlyZXF1aXJlcyB5b3VyIGxhbmd1YWdlIHRvIHN1cHBvcnQgYW5kIHVzZSB0aGUgbmV3CgkJZGlzcGF0Y2ggY2FzdC9yYW5rIG1lY2hhbmlzbSAoTm93IG1haW5seSBzdXBwb3J0ZWQgaW4KCQlwZXJsIGFuZCBweXRob24sIGFuZCBlYXNpbHkgZXhwYW5kYWJsZSB0byBydWJ5IGFuZCB0Y2wpLgoJICAgICAgCgkgIC0gW1VUTF0gQWRkIHN1cHBvcnQgZm9yIHRoZSBuZXcgJ2V4cHJlc3NpdmUnIHJlc3VsdCBzdGF0ZXMuCgoxMi8yNy8yMDA1OiBtbWF0dXMKCSAgLSBBZGQgc3VwcG9ydCBmb3IgdGhlIEMrKyBpbXBsaWNpdCBjb252ZXJzaW9uIG1lY2hhbmlzbSwgd2hpY2gKICAgICAgICAgICAgcmVxdWlyZWQgc29tZSBtb2RpZmljYXRpb25zIGluIHBhcnNlci55ICh0byByZWNvZ25pemUKICAgICAgICAgICAgJ2V4cGxpY2l0JykgYW5kIG92ZXJsb2FkLmN4eCAodG8gcmVwbGFjZSAkaW1wbGljaXRjb252IGFzCiAgICAgICAgICAgIG5lZWRlZCkuCgkgICAgCgkgICAgU3RpbGwsIHJlYWwgc3VwcG9ydCBpbiBlYWNoIHRhcmdldCBsYW5ndWFnZSByZXF1aXJlcyBlYWNoCgkgICAgdGFyZ2V0IGxhbmd1YWdlIHRvIGJlIG1vZGlmaWVkLiBQeXRob24gcHJvdmlkZXMgYW4gZXhhbXBsZSwKICAgICAgICAgICAgc2VlIGJlbG93LgoKCgkgIC0gQWRkIHN1cHBvcnQgZm9yIG5hdGl2ZSBDKysgaW1wbGljaXQgY29udmVyc2lvbnMsIGllLCBpZiB5b3UKICAgICAgICAgICAgaGF2ZQoKCSAgICAgICAgJWltcGxpY2l0Y29udiBBOwoKCSAgICAgICAgc3RydWN0IEEgewoJCSAgIGludCBpaTsKCQkgICBBKCkge2lpID0gMTt9CgkJICAgQShpbnQpIHtpaSA9IDI7fQoJCSAgIEEoZG91YmxlKSB7aWkgPSAzO30KCQkgICBleHBsaWNpdCBBKGNoYXIgKnMpIHtpaSA9IDQ7fQoJCX07CgkJCgkJaW50IGdldChjb25zdCBBJiBhKSB7cmV0dXJuIGEuaWk7fQoKICAgICAgICAgICAgeW91IGNhbiBjYWxsOgoKCSAgICAgICAgYSA9IEEoKQoJICAgICAgICBhaSA9IEEoMSkKCSAgICAgICAgYWQgPSBBKDEuMCkKCSAgICAgICAgYXMgPSBBKCJoZWxsbyIpCgkJCgkJIyBvbGQgZm9ybXMKCSAgICAgICAgZ2V0KGEpICAtPiAxCgkgICAgICAgIGdldChhaSkgLT4gMgoJICAgICAgICBnZXQoYWQpIC0+IDMKCSAgICAgICAgZ2V0KGFzKSAtPiA0CgkJCgkJI2ltcGxpY2l0IGNvbnZlcnNpb25zCgkgICAgICAgIGdldCgxKSAgICAgICAtPiAyCgkgICAgICAgIGdldCgxLjApICAgICAtPiAzCgkgICAgICAgIGdldCgiaGVsbG8iKSAtPiBFcnJvciwgZXhwbGljaXQgY29uc3RydWN0b3IKCiAgICAgICAgICAgIEFsc28sIGFzIGluIEMrKywgbm93IGltcGxpY2l0IGNvbnZlcnNpb25zIGFyZSBzdXBwb3J0ZWQgaW4KICAgICAgICAgICAgdmFyaWFibGUgYXNzaWdtZW50cywgYW5kIGlmIHlvdSBoYXZlOgoKCSAgICAgIEEgZ2E7CgkgICAgICBzdHJ1Y3QgQmFyIHsKCSAgICAgICAgQSBhOwogICAgICAgICAgICAgIH07CgoJICAgIHlvdSBjYW4gZG86CgoJICAgICAgY3Zhci5nYSA9IEEoMSkKCSAgICAgIGN2YXIuZ2EgPSAxCgkgICAgICBjdmFyLmdhID0gMS4wCgkgICAgICBjdmFyLmdhID0gQSgiaGVsbG8iKSAKCSAgICAgIGN2YXIuZ2EgPSAiaGVsbG8iIC0+IGVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKCSAgICAgIGIgPSBCYXIoKQoJICAgICAgYi5hID0gQSgiaGVsbG8iKQoJICAgICAgYi5hID0gMQoJICAgICAgYi5hID0gMS4wCgkgICAgICBiLmEgPSAiaGVsbG8iIC0+IGVycm9yLCBleHBsaWNpdCBjb25zdHJ1Y3RvcgoKCSAgICBOb3RlIHRoYXQgdGhlIGxhc3QgY2FzZSwgYXNzaWduaW5nIGEgbWVtYmVyIHZhciBkaXJlY3RseSwgCgkgICAgYWxzbyByZXF1aXJlcyB0aGUgJ25hdHVyYWx2YXInIG9wdGlvbi4KCgkgICAgVGhpcyBzdXBwb3J0IG5vdyBtYWtlcyB0aGUgb2xkICclaW1wbGljaXQnIG1hY3JvLCB3aGljaAoJICAgIHdhcyBmb3VuZCBpbiAnaW1wbGljaXQuaScgYW5kIGl0IHdhcyBmcmFnaWxlIGluIG1hbnkgd2F5cywKCSAgICBvYnNvbGV0ZSwgYW5kIHlvdSBzaG91bGQgdXNlIHRoZSBuZXcgJyVpbXBsaWNpdGNvbnYnCgkgICAgZGlyZWN0aXZlIGluc3RlYWQuCgoJICAgIE5vdGUgdGhhdCB3ZSBmb2xsb3cgdGhlIEMrKyBjb252ZW50aW9ucywgaWUsIGluIHRoZQoJICAgIGZvbGxvd2luZyB0aGUgaW1wbGljaXQgY29udmVyc2lvbiBpcyBhbGxvd2VkOgoKCQlpbnQgZ2V0KEEgYSkge3JldHVybiBhLmlpO30KCQlpbnQgZ2V0KGNvbnN0IEEmIGEpIHtyZXR1cm4gYS5paTt9CgkgICAgCgkgICAgYnV0IG5vdCBpbiB0aGVzZSBjYXNlczoKCgkJaW50IGdldChBICphKSB7cmV0dXJuIGEtPmlpO30KCQlpbnQgZ2V0KEEmIGEpIHtyZXR1cm4gYS5paTt9CgkJCgkgICAgQWxzbywgaXQgd29ya3MgZm9yIGRpcmVjdG9yIG1ldGhvZHMgdGhhdCByZXR1cm4gYSBieSB2YWx1ZQoJICAgIHJlc3VsdCwgaWUsIHRoZSBmb2xsb3dpbmcgd2lsbCB3b3JrOgoKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSBnZXRfYSgpID0gMDsKCgkJZGVmIGdldF9hKHNlbGYpOgoJCSAgIHJldHVybiAxCgogICAgICAgICAgICBidXQgbm90IGluIHRoaXMgY2FzZToKCiAgICAgICAgICAgICAgICB2aXJ0dWFsIGNvbnN0IEEmIGdldF9hKCkgPSAwOwogICAgICAgICAgICAgICAgdmlydHVhbCBBJiBnZXRfYSgpID0gMDsKICAgICAgICAgICAgICAgIHZpcnR1YWwgQSogZ2V0X2EoKSA9IDA7CgkgICAgCgkgIE5vdGVzOgoKCSAgLSB0aGUgaW1wbGljaXRjb252IG1lY2hhbmlzbSBpcyBpbXBsZW1lbnRlZCBieSBkaXJlY3RseQoJICAgIGNhbGxpbmcvZGlzcGF0Y2hpbmcgdGhlIHB5dGhvbiBjb25zdHJ1Y3RvciwgdHJpZ2dlcmluZyBhCgkgICAgY2FsbCB0byB0aGUgX19pbml0X19tZXRob2QuIEhlbmNlLCBpZiB5b3UgZXhwYW5kZWQgdGhlCgkgICAgX19pbml0X18gbWV0aG9kLCBsaWtlIGluOgoKCSAgICAgICAgY2xhc3MgQToKCQkgICBkZWYgX19pbml0X18oc2VsZixhcmdzKToKCQkgICAgICA8c3dpZyBjb2RlPgoJCSAgICAgIDxteSBjb2RlIGhlcmU+CgogICAgICAgICAgICB0aGVuICdteSBjb2RlJyB3aWxsIGFsc28gYmUgZXhlY3V0ZWQuCgkgICAgCgkgIC0gU2luY2UgdGhlICVpbXBsaWNpdGNvbnYgZGlyZWN0aXZlIGlzIGEgU1dJRyBmZWF0dXJlLCBpZiB5b3UgdHlwZToKCSAgICAKICAJICAgICAgICVpbXBsaWNpdGNvbnY7ICAKCgkgICAgdGhhdCB3aWxsIGVuYWJsZSBpbXBsaWNpdCBjb252ZXJzaW9uIGZvciBhbGwgdGhlIGNsYXNzZXMgaW4KCSAgICB5b3VyIG1vZHVsZS4KCgkgICAgQnV0IGlmIHlvdSBhcmUgd29ycmllZCBhYm91dCBwZXJmb3JtYW5jZSwgbWF5YmUgdGhhdCB3aWxsIGJlCgkgICAgdG9vIG11Y2gsIGVzcGVjaWFsbHkgaWYgeW91IGhhdmUgb3ZlcmxvYWRlZCBtZXRob2RzLCBzaW5jZQoJICAgIHRvIHJlc29sdmUgdGhlIGRpc3BhdGNoaW5nIHByb2JsZW0sIHB5dGhvbiB3aWxsIGVmZWN0aXZlbHkKCSAgICB0cnkgdG8gY2FsbCBhbGwgdGhlIGltcGxpY2l0IGNvbnN0cnVjdG9ycyBhcyBuZWVkZWQuCgoJICAtIEZvciB0aGUgc2FtZSByZWFzb24sIGl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2UKICAgICAgICAgICAgdGhlIG5ldyAnY2FzdG1vZGUnIHdoZW4gbWl4aW5nIGltcGxpY2l0IGNvbnZlcnNpb24gYW5kCiAgICAgICAgICAgIG92ZXJsb2FkaW5nLgoKCSAtIFtweXRob25dIFRoZSAlaW1wbGljaXQgZGlyZWN0aXZlIGlzIGRlY2xhcmVkIG9ic29sZXRlLCBhbmQKICAgICAgICAgICB5b3Ugc2hvdWxkIHVzZSAlaW1wbGljaXRjb252IGluc3RlYWQuIElmIHlvdSBpbmNsdWRlCgkgICB0aGUgaW1wbGljaXQuaSBmaWxlLCBhIHdhcm5pbmcgd2lsbCByZW1pbmQgeW91IG9mIHRoaXMuCgoJICAgTm90ZTogU2luY2UgJWltcGxpY2l0IGlzIGZyYWdpbGUsIGp1c3QgcmVwbGFjaW5nIGl0IGJ5CgkgICAlaW1wbGljaXRjb252IGNvdWxkIGxlYWQgdG8gZGlmZmVyZW50IGJlaGF2aW9yLiBIZW5jZSwgd2UKCSAgIGRvbid0IGF1dG9tYXRpY2FsbHkgc3dpdGNoIGZyb20gdG8gdGhlIG90aGVyLCBhbmQgdGhlIHVzZXIKCSAgIG11c3QgbWlncmF0ZSB0byB0aGUgbmV3ICVpbXBsaWNpdGNvbnYgZGlyZWN0aXZlIG1hbnVhbGx5LgoKCjEyLzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10KICAgICAgICAgICAgTW9kaWZ5IHN0ZDo6dmVjdG9yIHdyYXBwZXJzIHRvIHVzZSBzdGQ6OnZlY3Rvcjo6dmFsdWVfdHlwZSBhcyB0aGlzIGlzCiAgICAgICAgICAgIGNsb3NlciB0byB0aGUgcmVhbCBTVEwgZGVjbGFyYXRpb25zIGZvciBzb21lIG1ldGhvZHMsIGVnIGZvciBwdXNoX2JhY2soKS4KICAgICAgICAgICAgRml4ZXMgc29tZSBjb21waWxhdGlvbiBlcnJvcnMgZm9yIHNvbWUgY29tcGlsZXJzIGVnIHdoZW4gdGhlIHRlbXBsYXRlZAogICAgICAgICAgICB0eXBlIGlzIGEgcG9pbnRlci4KCiAgICAgICAgICAgIFtKYXZhXQogICAgICAgICAgICBzdGQ6OnZlY3RvciBpbXByb3ZlbWVudHMgLSBhIGZldyBtb3JlIG1ldGhvZHMgYXJlIHdyYXBwZWQgYW5kIHNwZWNpYWxpemF0aW9ucyBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHJlcXVpcmVkLiBUaGUgc3BlY2lhbGl6ZV9zdGRfdmVjdG9yIG1hY3JvIGlzIG5vIGxvbmdlciBuZWVkZWQgKGEKICAgICAgICAgICAgd2FybmluZyBpcyBpc3N1ZWQgaWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVzZSBpdCkuCgoxMi8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIEFkZCBpbiBwb2ludGVyIHJlZmVyZW5jZSB0eXBlbWFwcy4gVGhpcyBhbHNvIGVuYWJsZXMgb25lIHRvIGVhc2lseSB3cmFwCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IHdoZXJlIFQgaXMgYSBwb2ludGVyLgoKMTIvMjQvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDRkZJXSBUaGUgY2ZmaSBtb2R1bGUgZm9yIFNXSUc6CiAgICAgICAgICAgICAgLSBGdWxseSBzdXBwb3J0cyBDLCBidXQgcHJvdmlkZXMgbGltaXRlZCBzdXBwb3J0cyBmb3IgQysrLCBpbgogICAgICAgICAgICAgICBwYXJ0aWN1bGFyIEMrKyBzdXBwb3J0IGZvciB0ZW1wbGF0ZXMgYW5kIG92ZXJsb2FkaW5nIG5lZWRzIHRvCiAgICAgICAgICAgICAgIGJlIHdvcmtlZCB1cG9uLiAKCjEyLzIzLzIwMDU6IG1tYXR1cwoJICAgIFtweXRob25dIEFkZCB0aGUgY2FzdG1vZGUgdGhhdCBhbGxvd3MgdGhlIHB5dGhvbgoJICAgIHR5cGUgY2FzdGluZyB0byBvY2N1ci4KCgkgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlICdpbnQgZm9vKGludCknLCBub3cKCSAgICAKCSAgICAgIGNsYXNzIEFpKCk6CgkgICAgICAgICBkZWYgX19pbml0X18oc2VsZix4KTogCgkJICAgIHNlbGYueCA9IHgKCSAgICAgICAgIGRlZiBfX2ludF9fKHNlbGYpOiAKCQkgICAgcmV0dXJuIHNlbGYueAoKCSAgICAgIGZvbygxKSAgIC8vIE9rCgkgICAgICBmb28oMS4wKSAvLyBPawoJICAgICAgZm9vKDEuMykgLy8gRXJyb3IKCSAgICAgIGEgPSBBaSg0KQogICAgICAgICAgICAgIGZvbyhhaSkgIC8vIE9rCgogICAgICAgICAgICBUaGUgY2FzdG1vZGUsIHdoaWNoIGNhbiBiZSBlbmFibGVkIGVpdGhlciB3aXRoIHRoZQogICAgICAgICAgICAnLWNhc3Rtb2RlJyBvcHRpb24gb3IgdGhlICVtb2R1bGUoImNhc3Rtb2RlIikgb3B0aW9uLCB1c2VzCiAgICAgICAgICAgIHRoZSBuZXcgY2FzdC9yYW5rIGRpc3BhdGNoIG1lY2hhbmlzbS4gSGVuY2UsIG5vdyBpZiB5b3UKICAgICAgICAgICAgaGF2ZSAnaW50IGZvbyhpbnQpOyBpbnQgZm9vKGRvdWJsZSk7JywgdGhlIGZvbGxvd2luZyB3b3JrcwogICAgICAgICAgICBhcyBleHBlY3RlZDoKCgkgICAgICBmb28oMSkgICAtPiBmb28oaW50KQoJICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKCSAgICAgIGFpID0gQWkoNCkKCSAgICAgIGZvbyhhaSkgIC0+IGZvbyhpbnQpCgoJICAgIE5vdGUxOiB0aGUgJ2Nhc3Rtb2RlJyBjb3VsZCBkaXNydXB0IHNvbWUgc3BlY2lhbGl6ZWQKCSAgICB0eXBlbWFwcy4gSW4gcGFydGljdWxhciwgdGhlICJpbXBsaWNpdC5pIiBsaWJyYXJ5IHNlZW1zIHRvCgkgICAgaGF2ZSBwcm9ibGVtIHdpdGggdGhlIGNhc3Rtb2RlLiBCdXQgYmVzaWRlcyB0aGF0IG9uZSwgdGhlCgkgICAgZW50aXJlIHRlc3Qtc3VpdGUgY29tcGlsZXMgZmluZSB3aXRoIGFuZCB3aXRob3V0IHRoZQoJICAgIGNhc3Rtb2RlLgoKIAkgICAgTm90ZTI6IHRoZSBjYXN0IG1vZGUgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCB0aGUgZmFzdAoJICAgIGRpc3BhdGNoIG1vZGUsIGllLCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gaGFzIG5vIGVmZmVjdAoJICAgIHdoZW4gdGhlIGNhc3QgbW9kZSBpcyBzZWxlY3RlZC4gVGhlIHBlbmFsdGllcywgaG93ZXZlciwKCSAgICBhcmUgbWluaW11bSBzaW5jZSB0aGUgY2FzdCBkaXNwYXRjaCBjb2RlIGlzIGFscmVhZHkgYmFzZWQKCSAgICBvbiB0aGUgc2FtZSBmYXN0IGRpc3BhdGNoIG1lY2hhbmlzbS4KCgkgICAgU2VlIHRoZSBmaWxlIG92ZXJsb2FkX2Rpc3BhdGNoX2Nhc3RfcnVubWUucHkgZmlsZSBmb3IKCSAgICBuZXcgY2FzZXMgYW5kIGV4YW1wbGVzLgoKMTIvMjIvMjAwNTogbW1hdHVzCgkgICAgQWRkIHRoZSBjYXN0IGFuZCByYW5rIG1lY2hhbmlzbSB0byBkaXNwYXRjaCBvdmVybG9hZGluZwoJICAgIGZ1bmN0aW9ucy4gVGhlIFVURiBzdXBwb3J0cyBpdCBub3csIGJ1dCBmb3IgZWFjaCBsYW5ndWFnZQoJICAgIGl0IG11c3QgYmUgZGVjaWRlZCBob3cgdG8gaW1wbGVtZW50IGFuZC9vciB3aGVuIHRvIHVzZSBpdC4KCgkgICAgW3BlcmxdIE5vdyBwZXJsIHVzZXMgdGhlIG5ldyBjYXN0IGFuZCByYW5rIGRpc3BhdGNoCgkgICAgbWVjaGFuaXNtLCB3aGljaCBzb2x2ZXMgYWxsIHRoZSBwYXN0IHByb2JsZW1zIGtub3duIAoJICAgIGluIHBlcmwsIHN1Y2ggYXMgdGhlIG9sZCAnKyAxJyBwcm9ibGVtOgoKCSAgICAgICAgaW50IGZvbyhpbnQpOwoJICAgIAoJCSRuID0gMQogICAgICAgICAgICAgICAgJG4gPSAkbiArIDEKICAgICAgICAgICAgICAgICRyID0gZm9vKG4pCgogICAgICAgICAgICBhbHNvIHdvcmtzOgoKICAgICAgICAgICAgICAgICBmb28oMSk7CiAgICAgICAgICAgICAgICAgZm9vKCIxIik7CiAgICAgICAgICAgICAgICAgZm9vKDEuMCk7CiAgICAgICAgICAgICAgICAgZm9vKCIxLjAiKTsKCiAgICAgICAgICAgICBidXQgZmFpbHMKCiAgICAgICAgICAgICAgICAgZm9vKCJsIik7CgogICAgICAgICAgICAgYW5kIHdoZW4gb3ZlcmxvYWRpbmcgIGZvbyhpbnQpIGFuZCBmb28oZG91YmxlKTsKCiAgICAgICAgICAgICAgICAgZm9vKDEpIC0+IGZvbyhpbnQpCiAgICAgICAgICAgICAgICAgZm9vKDEuMCkgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oIjEiKSAtPiBmb28oaW50KQogICAgICAgICAgICAgICAgIGZvbygiMS4wIikgLT4gZm9vKGRvdWJsZSkKICAgICAgICAgICAgICAgICBmb28oImwiKSAtPiBlcnJvcgoJCSBmb28oJG4pIC0+IGZvbyhpbnQpICBmb3IgZ29vZCBwZXJsIHZlcnNpb25zCgkJIGZvbygkbikgLT4gZm9vKGRvdWJsZSkgIGZvciBvbGQgYmFkIHBlcmwgdmVyc2lvbnMKCgkgICAgIHdoZW4gb3ZlcmxvYWRpbmcgZm9vKGludCksIGZvbyhjaGFyKikgYW5kIGZvbyhkb3VibGUpOgoKICAgICAgICAgICAgICAgICBmb28oMSkgLT4gZm9vKGludCkKICAgICAgICAgICAgICAgICBmb28oMS4wKSAtPiBmb28oZG91YmxlKQogICAgICAgICAgICAgICAgIGZvbygiMSIpIC0+IGZvbyhjaGFyKikKICAgICAgICAgICAgICAgICBmb28oIjEuMCIpIC0+IGZvbyhjaGFyKikKICAgICAgICAgICAgICAgICBmb28oImwiKSAtPiBmb28oY2hhciopCgogICAgICAgICAgICAgTm90ZTogSW4gcGVybCB0aGUgb2xkIGRpc3BhdGNoIG1lY2hhbmlzbSB3YXMgYnJva2VuLAogICAgICAgICAgICAgc28sIHdlIGRvbid0IHByb3ZpZGUgYW4gb3B0aW9uIHRvIGVuYWJsZSB0aGUgb2xkIG9uZQoJICAgICBzaW5jZSwgYWdhaW4sIGl0IHdhcyByZWFsbHkgcmVhbGx5IGJyb2tlbi4KCgkgICAgIFNlZSAnb3ZlcmxvYWRfc2ltcGxlX3J1bm1lLnBsJyBmb3IgbW9yZSBjYXNlcyBhbmQgdGVzdHMuCgoJICAgICBQUzogYWxsIHRoZSBvbGQga25vd24gaXNzdWVzIGFyZSBkZWNsYXJlZCByZXNvbHZlZCwgYW55CgkgICAgIG5ldyAicHJvYmxlbSIgdGhhdCBjb3VsZCBiZSBkaXNjb3ZlcmVkIGlzIGRlY2xhcmVkLCAKCSAgICAgYSBwcmlvcmksIGFzICJmZWF0dXJlcyIgb2YgdGhlIG5ldyBkaXNwYXRjaCBtZWNoYW5pc20KCSAgICAgKHVudGlsIHdlIGZpbmQgYW5vdGhlciBzb2x1dGlvbiBhdCBsZWFzdCkuCgkgICAgIAoJICAgICAKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgICoqKgoKCSAgICBBcyB3aXRoIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIFVURiwgc29tZSB0aGluZ3MgY291bGQKCSAgICBub3cgc3RhcnQgdG8gd29yayBhcyBleHBlY3RlZCwgYW5kIHBlb3BsZSB1c2VkIHRvIGRlYWwgb3IKCSAgICB3b3JrYXJvdW5kIHByZXZpb3VzIGJ1Z3MgcmVsYXRlZCB0byB0aGUgZGlzcGF0Y2gKCSAgICBtZWNoYW5pc20sIGNvdWxkIHNlZSBub3cgYSBkaWZmZXJlbmNlIGluIHBlcmwgYmVoYXZpb3IuCgoxMi8yMS8yMDA1OiBtbWF0dXMKCSAgLSBUaGUgJy1ub2RlZmF1bHQnIGZsYWcgKHByYWdtYSBhbmQgZmVhdHVyZSkgbm93IGdlbmVyYXRlcwoJICAgIGEgd2FybmluZywgYW5kIHJlY29tbWVuZHMgdG8gdXNlIHRoZSBleHBsaWNpdAoJICAgIC1ub2RlZmF1bHRjdG9yIGFuZCAgLW5vZGVmYXVsdGR0b3Igb3B0aW9ucy4KCSAgICAKCSAgICBUaGUgcmVhc29uIHRvIHNwbGl0IHRoZSAnbm9kZWZhdWx0JyBiZWhhdmlvciBpcyB0aGF0LCBpbgoJICAgIGdlbmVyYWwsIGlnbm9yaW5nIHRoZSBkZWZhdWx0IGRlc3RydWN0b3IgZ2VuZXJhdGVzIG1lbW9yeQoJICAgIGxlYWtzIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuIEhlbmNlLCBpcyB0b28gcmlza3kganVzdCB0bwoJICAgIGRpc2FibGUgYm90aCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvcgoJICAgIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIElmIHlvdSBuZWVkIHRvIGRpc2FibGUgdGhlIGRlZmF1bHQgZGVzdHJ1Y3RvciwgaXQgaXMKCSAgICBhbHNvIHJlY29tbWVuZGVkIHlvdSB1c2UgdGhlIGRpcmVjdGl2ZSBmb3JtOgoKCSAgICAgICAlbm9kZWZhdWx0ZHRvciAgTXlWZXJ5U3BlY2lhbENsYXNzOwoKICAgICAgICAgICAgZm9yIHNwZWNpZmljIGNsYXNzZXMsIGFuZCBhbHdheXMgYXZvaWQgdXNpbmcgdGhlIGdsb2JhbAogICAgICAgICAgICAtbm9kZWZhdWx0IGFuZCAtbm9kZWZhdWx0ZHRvciBvcHRpb25zLgoJICAgIAoxMi8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIEZpeCBpbmNvcnJlY3QgY29kZSBnZW5lcmF0aW9uIHdoZW4gdGhlIGludGVybWVkaWFyeSBjbGFzc25hbWUgaXMgY2hhbmdlZAogICAgICAgICAgICBpbiB0aGUgbW9kdWxlIGRpcmVjdGl2ZSBmcm9tIGl0cyBkZWZhdWx0LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJW1vZHVsZShqbmljbGFzc25hbWU9Im15aW1jbGFzc25ld25hbWUiKSAibXltb2R1bGUiIC8vIEphdmEKICAgICAgICAgICAgICAlbW9kdWxlKGltY2xhc3NuYW1lPSJteWltY2xhc3NuZXduYW1lIikgIm15bW9kdWxlIiAvLyBDIwoKICAgICAgICAgICAgQWRkIGluIG5ldyBzcGVjaWFsIHZhcmlhYmxlICRpbWNsYXNzbmFtZS4gU2VlIGRvY3MuCgoxMi8xNy8yMDA1OiBtbWF0dXMKCSAgW1B5dGhvbl0KCSAgLSBBZGQgdGhlIC1hbGlhc29iajAvLW5vYWxpYXNvYmowIG9wdGlvbnMgdG8gdXNlIHdpdGgKCSAgICAtZmFzdHVucGFjayBhbmQvb3IgLU8gYW5kIG9sZCB0eXBlbWFwcyB0aGF0IHVzZSAnb2JqMCcKCSAgICBkaXJlY3RseS4KCgkgICAgU28sIGlmIHlvdSBjb21waWxlIHlvdXIgY29kZSB1c2luZyAtTyBhbmQgZ2V0IGVycm9ycyBhYm91dAoJICAgIHRoZSB1bmRlY2xhcmVkICdvYmowJyB2YXJpYWJsZSwgcnVuIGFnYWluIHVzaW5nIAoKCQlzd2lnIC1PIC1hbGlhc29iajAgLXB5dGhvbiAuLi4uCgkgICAgCgkgICAgRm9yIG5ldyB0eXBlbWFwcywgbmV2ZXIgdXNlICdvYmowJyBkaXJlY3RseSwgaWYgbmVlZGVkLAoJICAgIHVzZSB0aGUgJyRzZWxmJyBuYW1lIHRoYXQgd2lsbCBiZSBwcm9wZXJseSAgZXhwYW5kZWQgdG8KCSAgICAnb2JqMCcgKG5vZmFzdHVucGFjaykgb3IgJ3N3aWdfb2JqWzBdJyAoZmFzdHVucGFjaykuIAogIAoJICAgIElmIHlvdSBoYXZlIG5vIGlkZWEgd2hhdCBJIGFtIHRhbGtpbmcgYWJvdXQsIGJldHRlciwgdGhhdAoJICAgIG1lYW5zIHlvdSBoYXZlIG5vIHR5cGVtYXAgd2l0aCB0aGlzIHByb2JsZW0uCgoKMTIvMTQvMjAwNTogbW1hdHVzIAkgCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtZmFzdHVucGFjay8tbm9mYXN0dW5wYWNrIG9wdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUKCSAgICB0aGUgdXNlIG9mIHRoZSBpbnRlcm5hbCBVbnBhY2tUdXBsZSBtZXRob2QsIGluc3RlYWQgb2YKCSAgICBjYWxsaW5nIHRoZSBvbmUgZnJvbSB0aGUgcHl0aG9uIEMgQVBJLgoKCSAgICBUaGUgb3B0aW9uIC1PIG5vdyBhbHNvIGltcGxpZXMgLWZhc3R1bnBhY2suCgkgICAgCgoxMi8xMS8yMDA1OiBtbWF0dXMgCgkgIFtQeXRob25dCgkgIC0gQWRkIHRoZSAtcHJveHlkZWwvLW5vcHJveHlkZWwgb3B0aW9ucyB0byBlbmFibGUvZGlzYWJsZQoJICAgIHRoZSBnZW5lcmF0aW9uIG9mIHByb3h5L3NoYWRvdyBfX2RlbF9fIG1ldGhvZHMsIGV2ZW4KCSAgICB3aGVuIG5vdyB0aGV5IGFyZSByZWR1bmRhbnQsIHNpbmNlIHRoZXkgYXJlIGVtcHR5LgoJICAgIEhvd2V2ZXIsIG9sZCBpbnRlcmZhY2VzIGNvdWxkIHJlbHkgb24gY2FsbGluZyB0aGVtLgoKCSAgICBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBnZW5lcmF0ZSB0aGUgX19kZWxfXyBtZXRob2RzCgkgICAgYXMgaW4gMS4zLjI3IG9yIG9sZGVyIHN3aWcgdmVyc2lvbnMuCgoJICAgIFRoZSBvcHRpb24gLU8gbm93IGFsc28gaW1wbGllcyAtbm9wcm94eWRlbC4KCjEyLzEwLzIwMDU6IG1tYXR1cyAKCSAgW1VURl0KICAgICAgICAgIC0gRml4IHVubmVjZXNzYXJ5IGNhbGxzIHRvIFNXSUdfVHlwZVF1ZXJ5IGZvciAnY2hhciAqJwoJICAgIGFuZCAnd2NoYXJfdCAqJywgcHJvYmxlbSBmb3VuZCBieSBDbGF5IEN1bHZlciB3aGlsZQoJICAgIHByb2ZpbGluZyB0aGUgUHlPZ3JlIHByb2plY3QuCgoJICAKCSAgW1B5dGhvbl0gCgkgIC0gQWRkIHRoZSAtZGlydnRhYmxlLy1ub2RpcnZ0YWJsZSB0byBlbmFibGUvZGlzYWJsZQoJICAgIGEgcHNldWRvIHZpcnR1YWwgdGFibGUgdXNlZCBmb3IgZGlyZWN0b3JzLCBhdm9pZGluZwoJICAgIHRoZSBuZWVkIHRvIHJlc29sdmUgdGhlIHB5dGhvbiBtZXRob2QgYXQgZWFjaCBjYWxsLgoJICAgIAoJICAtIEFkZCB0aGUgLXNhZmVjc3RyaW5ncy8tbm9zYWZlY3N0cmluZ3Mgb3B0aW9ucyB0bwoJICAgIGVuYWJsZS9kaXNhYmxlIHRoZSB1c2Ugb2Ygc2FmZSBjb252ZXJzaW9ucyBmcm9tIFB5U3RyaW5nCgkgICAgdG8gY2hhciAqLiBQeXRob24gcmVxdWlyZXMgeW91IHRvIG5ldmVyIGNoYW5nZSB0aGUgaW50ZXJuYWwKCSAgICBidWZmZXIgZGlyZWN0bHksIGFuZCBoZW5jZSAnc2FmZWN0cmluZ3MnIHdhcnJhbnRpZXMgdGhhdAoJICAgIGJ1dCByZXR1cm5pbmcgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCBweXRob24gc3RyaW5nIGJ1ZmZlci4KCgkgICAgVGhlIGRlZmF1bHQsIGFzIGluIHByZXZpb3VzIHJlbGVhc2VzLCBpcyB0byByZXR1cm4gYQoJICAgIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAobm9zYWZlY3N0cmluZ3MpLCBzbywgaXQgaXMgdGhlIHVzZXIncwoJICAgIHJlc3BvbnNpYmlsaXR5IHRvIGF2b2lkIGl0cyBtb2RpZmljYXRpb24uCgkgICAgCgkgIC0gQWRkIHRoZSAtTyBvcHRpb24gdG8gZW5hYmxlIGFsbCB0aGUgb3B0aW1pemF0aW9uIG9wdGlvbnMKCSAgICBhdCBvbmNlLCBpbml0aWFsbHkgZXF1aXZhbGVudCB0bwoKCSAgICAtbW9kZXJuIC1mYXN0ZGlzcGF0Y2ggLWRpcnZ0YWJsZSAtbm9zYWZlY3N0cmluZ3MgLWZ2aXJ0dWFsCgoxMi8wOC8yMDA1OiBtbWF0dXMgCgoJICAtIEFkZCB0aGUgLWZhc3RkaXNwYXRjaCBvcHRpb24gKGZhc3RkaXNwYXRjaCBmZWF0dXJlKS4gVGhpcwoJICAgIGVuYWJsZXMgdGhlICJmYXN0IGRpc3BhdGNoIiBtZWNoYW5pc20gZm9yIG92ZXJsb2FkZWQKCSAgICBtZXRob2RzIHByb3ZpZGVkIGJ5IFNhbHZhZG9yIEZhbmRpfm5vIEdhcmMnaWEgKCM5MzA1ODYpLgoKCSAgICBUaGUgcmVzdWx0aW5nIGNvZGUgaXMgc21hbGxlciBhbmQgZmFzdGVyIHNpbmNlIGxlc3MgdHlwZQoJICAgIGNoZWNraW5nIGlzIHBlcmZvcm1lZC4gSG93ZXZlciwgdGhlIGVycm9yIG1lc3NhZ2VzIHlvdQoJICAgIGdldCB3aGVuIHRoZSBvdmVybG9hZGluZyBpcyBub3QgcmVzb2x2ZWQgY291bGQgYmUKCSAgICBkaWZmZXJlbnQgZnJvbSB3aGF0IHRoZSB0cmFkaXRpb25hbCBtZXRob2QgcmV0dXJucy4KCgkgICAgV2l0aCB0aGUgb2xkIG1ldGhvZCB5b3UgYWx3YXlzIGdldCBhbiBlcnJvciBzdWNoIGFzIAoKCSAgICAgICAiTm8gbWF0Y2hpbmcgZnVuY3Rpb24gZm9yIG92ZXJsb2FkZWQgLi4uIgoKICAgICAgICAgICAgd2l0aCB0aGUgbmV3IG1ldGhvZCB5b3UgY2FuIGFsc28gZ2V0IGVycm9ycyBzdWNoIGFzCgoJICAgICAgICJUeXBlIGVycm9yIGluIGFyZ3VtZW50IDEgb2YgdHlwZSAuLi4iCgoJICAgIFNlZSBidWcgcmVwb3J0ICM5MzA1ODYgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgCiAgCSAgICBTbywgdGhpcyBvcHRpbWl6YXRpb24gbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQgYnkgdXNlcnMuCgoJICAgIFRoZSBuZXcgbWVjaGFuaXNtIGNhbiBiZSB1c2VkIGFzOgoKICAgICAgICAgICAgICBzd2lnIC1mYXN0ZGlzcGF0Y2gKCiAgICAgICAgICAgIG9yIHVzaW5nIHRoZSBmZWF0dXJlIGZvcm0KCgkgICAgICAlZmVhdHVyZSgiZmFzdGRpc3BhdGNoIikgbWV0aG9kOwogICAgICAgICAgICBvcgogICAgICAgICAgICAgICVmYXN0ZGlzcGF0Y2ggbWV0aG9kOwoJICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzIAoKICAgICAgICAgIC0gU2V2ZXJhbCBtZW1vcnkgYW5kIHNwZWVkIGltcHJvdmVtZW50cywgc3BlY2lhbGx5IGZvcgoJICAgIHRlbXBsYXRlcy4gTm93IHN3aWcgaXMgdXAgdG8gMjAgZmFzdGVyIHRoYW4gYmVmb3JlIGZvcgoJICAgIGxhcmdlIHRlbXBsYXRlIGludGVyZmFjZXMsIHN1Y2ggYXMgdGhlIHN0ZF9jb250YWluZXJzLmkKCSAgICBhbmQgdGVtcGxhdGVfbWF0cml4LmkgZmlsZXMgaW4gdGhlIHB5dGhvbiB0ZXN0LXN1aXRlLgoKCSAgICBNZW1vcnkgZm9vdHByaW50IGlzIGFsc28gcmVkdWNlZCBpbiBjb25zaWRlcmF0aW9uIG9mIHNtYWxsCgkgICAgcGNzL2FyY2hpdGVjdHVyZXMuCgoJICAtIGFkZCBjb21tYW5kbGluZSBvcHRpb25zIC1jcHBlcnJhc3dhcm4gYW5kIC1ub2NwcGVycmFzd2FybiIgdG8gZm9yY2UKICAgICAgICAgICAgdGhlIHN3aWcgcHJlcHJvY2Vzc29yIHRvIHRyZWF0IHRoZSAjZXJyb3IgZGlyZWN0aXZlIGFzIGEgI3dhcm5pbmcuCgkgICAgCgkgICAgdGhlIHByYWdtYXMKCiAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBjcHBlcnJhc3dhcm49MQogICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgY3BwZXJyYXN3YXJuPTAKCSAgICAgICAKCSAgICBhcmUgZXF1aXZhbGVudCB0byB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMsIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgIAoKMTIvMDYvMjAwNTogbW1hdHVzCgkgICAgW1B5dGhvbl0gVGhlIGdlbmVyYXRlZCBjb2RlIGlzIG5vdyBtb3JlIHBvcnRhYmxlLCBlc3BlY2lhbGx5CgkgICAgZm9yIFdpbmRvd3MuIEZvbGxvd2luZyAKCiAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5weXRob24ub3JnL2RvYy9mYXEvd2luZG93cy5odG1sCgogICAgICAgICAgICBQeV9Ob25lIGlzIG5ldmVyIGFjY2Vzc2VkIGFzIGEgc3RydWN0dXJlLCBwbHVzIG90aGVyCiAgICAgICAgICAgIHRyaWNrcyBtZW50aW9uZWQgdGhlcmUuCgoxMi8wNi8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBBZGRlZCBpbml0aWFsIHN1cHBvcnQgZm9yIHRocmVhZHMgYmFzZWQgaW4gdGhlCgkgICAgcHJvcG9zYWwgYnkgSm9zZXBoIFdpbnN0b24uCgoJICAgIFRoZSB1c2VyIGludGVyZmFjZSBpcyBhcyBmb2xsb3dzOgoKCSAgICAxLi0gdGhlIG1vZHVsZSB0aHJlYWQgc3VwcG9ydCBpcyBlbmFibGUgdmlhIHRoZSAidGhyZWFkcyIgbW9kdWxlCiAgICAgICAgICAgICAgICBvcHRpb24sIGkuZS4KCiAgICAgICAgICAgICAgICAgICVtb2R1bGUoInRocmVhZHMiPTEpCgogICAgICAgICAgICAyLi0gRXF1aXZhbGVudCB0byB0aGF0LCBpcyB0aGUgbmV3ICctdGhyZWFkcycgc3dpZyBvcHRpb24KCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRocmVhZHMgLXB5dGhvbiAuLi4KCiAgICAgICAgICAgIDMuLSBZb3UgY2FuIHBhcnRpYWxseSBkaXNhYmxlIHRocmVhZCBzdXBwb3J0IGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICBtZXRob2QgdXNpbmc6CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWQiKSBtZXRob2Q7CiAgICAgICAgICAgICAgICBvcgoJCSAgJW5vdGhyZWFkIG1ldGhvZDsKCiAgICAgICAgICAgICAgICBhbHNvLCB5b3UgY2FuIGRpc2FibGUgc2VjdGlvbnMgb2YgdGhlIHRocmVhZCBzdXBwb3J0LCAKICAgICAgICAgICAgICAgIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRibG9jayIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRibG9jayBtZXRob2Q7CgogICAgICAgICAgICAgICAgICAlZmVhdHVyZSgibm90aHJlYWRhbGxvdyIpIG1ldGhvZDsKICAgICAgICAgICAgICAgIG9yCgkJICAlbm90aHJlYWRhbGxvdyBtZXRob2Q7CgogICAgICAgICAgICAgICAgdGhlIGZpcnN0IGRpc2FibGVzIHRoZSBDKysvcHl0aG9uIHRocmVhZCBwcm90ZWN0aW9uLCBhbmQgdGhlCiAgICAgICAgICAgICAgICBzZWNvbmQgZGlzYWJsZXMgdGhlIHB5dGhvbi9DKysgdGhyZWFkIHByb3RlY3Rpb24uIAoKICAgICAgICAgICAgNC4tIFRoZSBjdXJyZW50IHRocmVhZCBzdXBwb3J0IGlzIGJhc2VkIGluIHRoZSBQeUdJTAogICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHByZXNlbnQgaW4gcHl0aG9uIHZlcnNpb24gMi4zIG9yIGxhdGVyLCBidXQKICAgICAgICAgICAgICAgIHlvdSBjYW4gcHJvdmlkZSB0aGUgdGhyZWFkIGNvZGUgZm9yIG9sZGVyIHZlcnNpb25zIGJ5CiAgICAgICAgICAgICAgICBkZWZpbmluZyB0aGUgbWFjcm9zIGluIHB5dGhyZWFkcy5zd2cuCgoJCUlmIHlvdSBnZXQgYSB3b3JraW5nIGltcGxlbWVudGF0aW9uIGZvciBvbGRlciB2ZXJzaW9ucywKCQlwbGVhc2Ugc2VuZCB1cyBhIHBhdGNoLgoKICAgICAgICAgICAgRm9yIHRoZSBjdXJpb3VzIGFib3V0IHBlcmZvcm1hbmNlLCBoZXJlIGFyZSBzb21lIG51bWJlcnMKICAgICAgICAgICAgZm9yIHRoZSBwcm9maWxldGVzdC5pIHRlc3QsIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHNwZWVkCgkgICAgb2YgdGhlIHdyYXBwZWQgY29kZToKCgkgICAgICAgIG5vdGhyZWFkICAgICAgICAgICA5LjZzICAobm8gdGhyZWFkIGNvZGUpCgkJbm90aHJlYWRibG9jayAgICAgMTIuMnMgIChvbmx5ICdhbGxvdycgY29kZSkKCQlub3RocmVhZGFsbG93ICAgICAxMy42cyAgKG9ubHkgJ2Jsb2NrJyBjb2RlKQogICAgICAgICAgICAgICAgZnVsbCB0aHJlYWQgICAgICAgMTUuNXMgICgnYWxsb3cnICsgJ2Jsb2NrJyBjb2RlKQoJICAgIAoJICAgIGkuZS4sIGZ1bGwgdGhyZWFkIGNvZGUgZGVjcmVhc2VzIHRoZSB3cmFwcGluZyBwZXJmb3JtYW5jZSBieQoJICAgIGFyb3VuZCA2MCUuIElmIHRoYXQgaXMgaW1wb3J0YW50IHRvIHlvdXIgYXBwbGljYXRpb24sIHlvdQoJICAgIGNhbiB0dW5lIGVhY2ggbWV0aG9kIHVzaW5nIHRoZSBkaWZmZXJlbnQgJ25vdGhyZWFkJywKCSAgICAnbm90aHJlYWRibG9jaycgb3IgJ25vdGhyZWFkYWxsb3cnIGZlYXR1cmVzIGFzCgkgICAgbmVlZGVkLiBOb3RlIHRoYXQgZm9yIHNvbWUgbWV0aG9kcyBkZWFjdGl2YXRpbmcgdGhlCgkgICAgJ3RocmVhZCBibG9jaycgb3IgJ3RocmVhZCBhbGxvdycgY29kZSBpcyBub3QgYW4gb3B0aW9uLAoJICAgIHNvLCBiZSBjYXJlZnVsLgoJICAgIAoKMTEvMjYvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgU1dJRyBsaWJyYXJ5IGZpbGVzIHVzZSBzeXN0ZW0gYW5nbGUgYnJhY2tldHMgZXZlcnl3aGVyZSBmb3IgJWluY2x1ZGUsIGVnCiAgICAgICAgICAgICAgJWluY2x1ZGUgInN0ZF9jb21tb24uaSIKICAgICAgICAgICAgYmVjb21lcwogICAgICAgICAgICAgICVpbmNsdWRlIDxzdGRfY29tbW9uLmk+CgoxMS8yNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdCiAgICAgICAgICAgIFR5cGVzYWZlIGVudW1zIGFuZCBwcm9wZXIgZW51bXMgaGF2ZSBhbiBleHRyYSBjb25zdHJ1Y3RvciBzbyB0aGF0IGVudW0gaXRlbSB2YWx1ZXMgdGhhdAogICAgICAgICAgICBhcmUgaW5pdGlhbGlzZWQgYnkgYW5vdGhlciBlbnVtIGl0ZW0gdmFsdWUgY2FuIGJlIHdyYXBwZWQgd2l0aG91dCBoYXZpbmcgdG8gdXNlICVqYXZhY29uc3R2YWx1ZS8KICAgICAgICAgICAgJWNzY29uc3R2YWx1ZSBmb3Igd2hlbiB1c2luZyAlamF2YWNvbnN0KDEpLyVjc2NvbnN0KDEpLiBTdWdnZXN0aW9uIGJ5CiAgICAgICAgICAgIEJvYiBNYXJpbmllci9Eb3VnbGFzIFBlYXJzb24uCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0eXBlZGVmIGVudW0KICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgeHl6LAogICAgICAgICAgICAgICAgIGxhc3QgPSB4eXoKICAgICAgICAgICAgICB9IHJlcGVhdDsKCjExLzIxLzIwMDU6IG1tYXR1cwoJICAgIFtydWJ5ICsgcHl0aG9uXQoKCSAgICBGaXhlcyBmb3IgZGlyZWN0b3JzICsgcG9pbnRlcnMuIFRoaXMgaXMgYW4gdWdseSBwcm9ibGVtIHdpdGhvdXQgYW4gZWFzeQoJICAgIHNvbHV0aW9uLiBCZWZvcmUgd2UgaWRlbnRpZmllZCB0aGlzIGNhc2UgYXMgcHJvYmxlbWF0aWM6CgoJICAgICAgICAgIHZpcnR1YWwgY29uc3QgTXlDbGFzcyYgbXlfbWV0aG9kKCk7CgogICAgICAgICAgICBidXQgaXQgdHVybnMgb3V0IHRoYXQgYWxsIHRoZSBjYXNlcyB3aGVyZSBhIHBvaW50ZXIsIGFycmF5IG9yCiAgICAgICAgICAgIHJlZmVyZW5jZSBpcyByZXR1cm5lZCwgYXJlIHByb2JsZW1hdGljLCBldmVuIGZvciAKCSAgICBwcmltaXRpdmUgdHlwZXMgKGFzIGludCwgZG91YmxlLCBjaGFyKiwgZXRjKS4KCgkgICAgVG8gdHJ5IHRvIGZpeCB0aGUgaXNzdWUsIGEgbmV3IHR5cGVtYXAgd2FzIGFkZGVkLAoJICAgICdkaXJlY3RvcmZyZWUnLCB3aGljaCBpcyB1c2VkIHRvICdmcmVlJyB0aGUgcmVzb3VyY2VzCgkgICAgYWxsb2NhdGVkIGR1cmluZyB0aGUgJ2RpcmVjdG9yb3V0JyBwaGFzZS4gQXQgdGhlIHNhbWUKCSAgICB0aW1lLCBhIHByaW1pdGl2ZSBnYXJiYWdlIGNvbGxlY3RvciBlbmdpbmUgd2FzIGFkZGVkIHRvCgkgICAgZGVhbCB3aXRoIG9ycGhhbmVkIGFkZHJlc3Nlcywgd2hlbiBuZWVkZWQuCgkgICAgCgkgICAgVGhlIHNpdHVhdGlvbiBpcyBtdWNoIGJldHRlciBub3csIGJ1dCBzdGlsbCBpdCBpcyBwb3NzaWJsZSB0byBoYXZlCgkgICAgbWVtb3J5IGV4aGF1c3RhdGlvbiBpZiByZWN1cnNpb24gaXMgdXNlZC4KCgkgICAgU28sIHN0aWxsIHlvdSBuZWVkIHRvIGF2b2lkIHJldHVybmluZyBwb2ludGVycywgYXJyYXlzIG9yCgkgICAgcmVmZXJlbmNlcyB3aGVuIHVzaW5nIGRpcmVjdG9yIG1ldGhvZHMuCgoJICAgIC0gQWRkZWQgc3RkaW50LmkgLSB0eXBlbWFwcyBmb3IgbGF0ZXN0IEM5OSBpbnRlZ3JhbCB0eXBlcyBmb3VuZCBpbiBzdGRpbnQuaC4KCSAgICAKMTEvMTQvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgTW9yZSB0eXBlcyBhZGRlZCB0byB3aW5kb3dzLmksIGVnIFVJTlQ4LCBXT1JELCBCWVRFIGV0Yy4gCiAgICAgICAgICAgIEluY2x1ZGluZyB3aW5kb3dzLmkgd2lsbCBhbHNvIGVuYWJsZSBTV0lHIHRvIHBhcnNlIHRoZSBfX2RlY2xzcGVjIE1pY3Jvc29mdAogICAgICAgICAgICBleHRlbnNpb24sIGVnIF9fZGVjbHNwZWMoZGxsaW1wb3J0KS4gQWxzbyBvdGhlciBXaW5kb3dzIGNhbGxpbmcgY29udmVudGlvbnMKICAgICAgICAgICAgc3VjaCBhcyBfX3N0ZGNhbGwuCgoxMS8xMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGZvciBXaW5kb3dzIC0gd2luZG93cy5pLiBUaGlzIGZpbGUgd2lsbCBjb250YWluIHVzZWZ1bCB0eXBlCiAgICAgICAgICAgIGluZm9ybWF0aW9uIGZvciB1c2VycyB3aG8gaW5jbHVkZSB3aW5kb3dzLmguIEluaXRpYWwgc3VwcG9ydCBpcyBmb3IgdGhlCiAgICAgICAgICAgIG5vbiBJU08gaW50ZWdyYWwgdHlwZXM6IF9faW50OCwgX19pbnQxNiwgX19pbnQzMiwgX19pbnQ2NCBhbmQgdW5zaWduZWQgdmVyc2lvbnMuCiAgICAgICAgICAgIFRoZSB1bnNpZ25lZCB2ZXJzaW9ucyBwcmV2aW91c2x5IGNvdWxkIG5vdCBiZSBwYXJzZWQgYnkgU1dJRy4gIFNGICM4NzIwMTMuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFBvcnRhYmlsaXR5IHdhcm5pbmcgZm9yIGZpbGVzIHdoaWNoIHdpbGwgb3ZlcndyaXRlIGVhY2ggb3RoZXIgb24gY2FzZQogICAgICAgICAgICBpbnNlbnNpdGl2ZSBmaWxlIHN5c3RlbXMgc3VjaCBhcyBGQVQzMi9OVEZTLiBUaGlzIHdpbGwgb2NjdXIsIGZvciBleGFtcGxlLCB3aGVuIHR3bwogICAgICAgICAgICBjbGFzcyBuYW1lcyBhcmUgdGhlIHNhbWUgYmFycmluZyBjYXNlLiBUaGUgd2FybmluZyBpcyBpc3N1ZWQgb24gYWxsIHBsYXRmb3JtcyBhbmQKICAgICAgICAgICAgY2FuIGJlIHN1cHByZXNzZWQgd2l0aCB0aGUgdXN1YWwgd2FybmluZyBzdXBwcmVzc2lvbiB0ZWNobmlxdWVzLiBTRiBidWcgIzEwODQ1MDcuCgoxMS8wOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGgtcHl0aG9uIC0td2l0aC1ydWJ5IC0td2l0aC1wZXJsNSBldGMgZW5hYmxlIHRoZXNlIGxhbmd1YWdlcywKICAgICAgICAgICAgaWUgdGhlIC0td2l0aC14eHh4IG9wdGlvbnMsIHdoZXJlIG5vIHBhdGggaXMgc3BlY2lmaWVkLCB3b3JrIHRoZSBzYW1lIGFzIGlmIAogICAgICAgICAgICB0aGUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkIGF0IGFsbC4gQmFzZWQgb24gcGF0Y2hlcyAjMTMzNTA0MiAjMTMyOTA0OCAjMTMyOTA0Ny4KCjExLzA5LzIwMDU6IGRhbmN5CgoJICAgIFtBbGxlZ3JvY2xdCgkgICAgQWRkIEMrKyBzdXBwb3J0IHRvIHRoZSBBbGxlZ3JvY2wgbW9kdWxlLiBGdXJ0aGVyCgkgICAgZW5oYW5jZXMgdGhlIEMgc3VwcG9ydCBhcyB3ZWxsLiBTb21lIG9mIHRoZQoJICAgIGZlYXR1cmVzOgoKCSAgICAtIE1VQ0ggYmV0dGVyIGdlbmVyYXRpb24gb2YgZm9yZWlnbiB0eXBlcyBiYXNlZCBvbgoJICAgIHRoZSBDL0MrKyB0eXBlcyBmb3IgdXNlIGluIGRlZmluaW5nIHRoZSBGRkkgb24KCSAgICB0aGUgbGlzcCBzaWRlLiBXZSBkb24ndCBwYXNzIGV2ZXJ5dGhpbmcgYXMgYSAoKiA6dm9pZCkKCSAgICBhbnkgbG9uZ2VyLgoKCSAgICAtIFVzZXMgdHlwZW1hcHMgZm9yIGJldHRlciBjb250cm9sIG9mIHR5cGUgY29udmVyc2lvbnMKCSAgICBhbmQgY29kZSBnZW5lcmF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgbGlzcCBhbmQgYysrIHdyYXBwZXIKCSAgICBjb2RlLgoKCSAgICAtIENMT1Mgd3JhcHBpbmcgb2YgcG9pbnRlcnMgcmV0dXJuZWQgZnJvbSBmb3JlaWduIHNwYWNlCgkgICAgbWFrZXMgaXQgZWFzaWVyIHRvIGRpZmZlcmVudGlhdGUgcG9pbnRlcnMgaW4gdXNlciBjb2RlLgoJICAgIFRoZSB3cmFwcGluZyBvYmplY3RzIGNhbiBiZSBwYXNzZWQgZGlyZWN0bHkgdG8gRkYgY2FsbHMuCgoJICAgIC0gRGVmdW4gd3JhcHBpbmcgb2YgRkYgY2FsbHMsIGFsbG93aW5nIGZvciBtb3JlIGxpc3B5CgkgICAgaW50ZXJmYWNlLiBDb252ZXJzaW9uLCBHQ2luZywgb2YgbGlzcCBvYmplY3RzIHRvIAoJICAgIGZvcmVpZ24gb2JqZWN0cyBjYW4gYmUgZG9uZSBpbiB0aGUgd3JhcHBpbmcgZGVmdW4gdmlhCgkgICAgdGhlIHVzZSBvZiB0eXBlbWFwcy4KCSAgICAKCSAgICAtIG92ZXJsb2FkIGRpc3BhdGNoaW5nIGltcGxlbWVudGVkIG9uIHRoZSBsaXNwIHNpZGUKCSAgICB1c2luZyBnZW5lcmljIGZ1bmN0aW9ucy4KCgkgICAgLSBUZW1wbGF0ZXMgYW5kIHN5bm9ueW1vdXMgdHlwZXMgc3VwcG9ydGVkLgoKMTEvMDcvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBwcm9wZXIgc3VwcG9ydCBmb3IgbXVsdGktaW5oZXJpdGFuY2UgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUsIGllLCBpZiB5b3UgaGF2ZSB0d28gQysrIHdyYXBwZWQgY2xhc3MsIEZvbwoJICAgIGFuZCBCYXIsIG5vdzoKCgkgICAgICAgY2xhc3MgTXlQeXRob25DbGFzcyhGb28sQmFyKToKCSAgICAgICAgICAuLi4uCgogICAgICAgICAgICB3aWxsIHByb3Blcmx5IHdvcmssIGV2ZW4gd2l0aCBkaXJlY3RvcnMsIGFuZCB0aGUKICAgICAgICAgICAgZGVhbGxvY2F0aW9uIG9mIEZvby50aGlzIGFuZCBCYXIudGhpcyB3aWxsIGZvbGxvdwogICAgICAgICAgICBjb3JyZWN0bHkuIEJlZm9yZSwgYSBjbGFzcyBjb3VsZCBvbmx5IGhhdmUgb25lICd0aGlzJwogICAgICAgICAgICBpbnN0YW5jZSAodW5saWtlIEMrKyksIG9ubHkgdGhlIGxhc3QgYmFzZSBjbGFzcyB3YXMKICAgICAgICAgICAgcHJvcGVybHkgZGVsZXRlZCwgb3IgZGV0ZWN0ZWQgd2l0aCBkaXJlY3RvcnMuCgoJICAgIE5vdyAnc2VsZi50aGlzJyBjYW4gYmUgYSBsaXN0LCB3aGljaCB3aWxsIGNvbnRhaW4gdGhlIEMrKwoJICAgIGluc3RhbmNlIHBvaW50ZXJzIGZvciBhbGwgdGhlIGJhc2UgY2xhc3Nlcy4KCSAgICAKCSAgICBBbHNvLCBzd2lnLnRoaXMgaXMgcmVzcG9uc2libGUgZm9yIGRlYWxsb2NhdGluZyB0aGUgQysrCgkgICAgaW5zdGFuY2UocyksIGFuZCB0aGUgX19kZWxfXyBtZXRob2QgaXMgbm90IGVtaXR0ZWQgdW5sZXNzCgkgICAgdGhlIHVzZXIgcHJlcHBlbmQvYXBwZW5kIHNvbWUgY29kZSB0byBpdC4KCgkgIC0gU3dpZyBjYW4gbm93IGRldGVjdCBtZW1vcnkgbGVha3MsIGllLCBpZiB5b3Ugc3RpbGwKCSAgICBkb24ndCB1c2UgcHJveHkvc2hhZG93IGNsYXNzZXMsIGFuZCB0eXBlIHNvbWV0aGluZyBsaWtlCgkgICAgCgkgICAgICAgICBpbXBvcnQgX2V4YW1wbGUKCSAgICAgICAgIGYgPSBfZXhhbXBsZS5uZXdfRm9vKCkKCgkgICAgYW5kIGZvcmdldCB0byBjYWxsIF9leGFtcGxlLmRlbGV0ZV9Gb28oZiksIHRoZW4gc3dpZyB3aWxsCgkgICAgdGVsbCB5b3UgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrLgoKCSAgICBPdGhlcndpc2UsIGlmIHlvdSBhbHdheXMgdXNlIHRoZSBwcm94eSBjbGFzc2VzLCB5b3UgcHJvYmFibHkKCSAgICB5b3Ugd2lsbCBuZXZlciBldmVyIHNlZSB0aGlzIHdhcm5pbmcgdW5sZXNzIHRoZXJlIGlzCgkgICAgc29tZXRoaW5nIHdyb25nIGluc2lkZSB0aGUgc3dpZyB3cmFwcGluZyBjb2RlLgoJICAgICAgIAoJCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIElmIHlvdSBvdmVybG9hZGVkIHRoZSBfX2RlbF9fIG1ldGhvZCwgYW5kIGNhbGwgdGhlIGJhc2UKCSAgICBvbmUJIHdpdGhvdXQgYSB0cnkgYmxvY2ssIGFzIGluCgoJICAgICAgICAgICBjbGFzcyBNeUNsYXNzKFN3aWdDbGFzcyk6CgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICBTd2lnQ2xhc3MuX19kZWxfXyhzZWxmKQoJCQkgIAogICAgICAgICAgICBweXRob24gY291bGQgY29tcGxhaW4gdGhhdCB0aGUgbWV0aG9kIFN3aWdDbGFzcy5fX2RlbF9fIGlzCiAgICAgICAgICAgIHVuZGVmaW5lZC4gVHJ5IHRvIHVzZSBpbnN0ZWFkOgoJICAgIAoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoJCSAgICAgICAgICB0cnk6IFN3aWdDbGFzcy5fX2RlbF9fKHNlbGYpCgkJCSAgZXhjZXB0OiBwYXNzCgoJICAgIG9yIHNpbXBseSAJCSAgCgoJICAgICAgICAgICAgICBkZWYgX19kZWxfXyhzZWxmKToKCQkgICAgICAgICAgPHlvdXIgY29kZSBoZXJlPgoKMTEvMDIvMjAwNTogbW1hdHVzCgoJICAgIFtQeXRob25dIEFkZGluZyBtb3JlIGZ1biB0byBTVEwvU1REIGNvbnRhaW5lcnMsIG5vdyB5b3UKCSAgICBjYW4gZG8KCgkgICAgICAgJXRlbXBsYXRlKHB5c2V0KSBzdGQ6OnNldDxQeU9iamVjdCAqPjsJCQoJICAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8UHlPYmplY3QgKj47CQoJICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxQeU9iamVjdCAqLFB5T2JqZWN0ICo+OwkKCSAgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPFB5T2JqZWN0ICosUHlPYmplY3QgKj47CgkgICAgICAgLi4uLgoKCSAgICBUaGUgc2FtZSAgYXBwbGllcyB0byBzdGQ6Omxpc3QsIHN0ZDo6ZGVxdWUsIHN0ZDo6bXVsdGlzZXQsIGV0Yy4KCgkgICAgVGhlbiwgYXQgdGhlIHB5dGhvbiBzaWRlIHlvdSBjYW4gZG8gbm93OgoKCSAgICAgICAjIEMrKyBzdGQ6OnZlY3RvciBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgdiA9IHB5dmVjdG9yKFsxLCJoZWxsbyIsKDEsMildKQoJICAgICAgIHByaW50IHZbMV0KCSAgICAgICA+PiAnaGVsbG8nCgkgICAgICAgcHJpbnQgdlsyXQoJICAgICAgID4+ICgxLDIpCgkgICAgICAgCQkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6OnNldCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgcyA9IHB5c2V0KCkJCQkgICAKCSAgICAgICBzLmluc2VydCgoMSwyKSkJCSAgIAoJICAgICAgIHMuaW5zZXJ0KDEpCQkJICAgCgkgICAgICAgcy5pbnNlcnQoImhlbGxvIikKCSAgICAgICBzdW09KCkKCSAgICAgICBmb3IgaSBpbiBzOgoJICAgICAgICAgc3VtICs9KGksKQoJICAgICAgIHByaW50IHN1bQoJICAgICAgID4+PiAoMSwgJ2hlbGxvJywgKDEsIDIpKQoJICAgICAgIAkJCQkgICAKCSAgICAgICAjIEMrKyBzdGQ6Om1hcCBhcyBuYXRpdmUgcHl0aG9uIHNlcXVlbmNlCgkgICAgICAgbSA9IHB5bWFwKCkJCQkgICAKCSAgICAgICBtWyJmb28iXSA9ICJoZWxsbyIJCSAgIAoJICAgICAgIG1bMV0gPSAoMSwyKQoJICAgICAgIHBtID0ge30KCSAgICAgICBmb3IgayBpbiBtOgkgICAgCSAgIAoJICAgICAgICAgcG1ba10gPSBtW2tdCgkgICAgICAgcHJpbnQgcG0KCSAgICAgICA+Pj4gezE6ICgxLCAyKSwgJ2Zvbyc6ICdoZWxsbyd9CgoJICAgIGllLCB0aGUgU1REL1NUTCBjb250YWluZXJzIHdvcmsgYXMgcmVhbCBuYXRpdmUgcHl0aG9uCgkgICAgY29udGFpbmVyLCB3aXRoIGFyYml0cmFyeSBpdGVtIHR5cGVzIGFuZCBzby4KCgkgICAgQnV0IHNpbmNlIG5vcm1hbCBDKysgY29udGFpbmVycyBkbyBub3QgcHJvcGVybHkgcmVmL3VucmVmCgkgICAgdGhlaXIgaXRlbXMsIHlvdSBzaG91bGQgdXNlIHRoZSBzYWZlciB2ZXJzaW9uczoKCSAgICAKCSAgICAgICV0ZW1wbGF0ZShweXNldCkgc3RkOjpzZXQ8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZShweXZlY3Rvcikgc3RkOjp2ZWN0b3I8c3dpZzo6UHlPYmplY3RfcHRyPjsKCSAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6cGFpcjxzd2lnOjpQeU9iamVjdF9wdHIsIHN3aWc6OlB5T2JqZWN0X3B0cj47CgkgICAgICAldGVtcGxhdGUocHl2ZWN0b3IpIHN0ZDo6bWFwPHN3aWc6OlB5T2JqZWN0X3B0cixzd2lnOjpQeU9iamVjdF9wdHI+OwoJICAgICAgLi4uLgoKCSAgICB3aGVyZSBzd2lnOjpQeU9iamVjdF9wdHIgaXMgYSBQeU9iamVjdCAqIGVudmVsb3BlIGNsYXNzIHByb3ZpZGVkCgkgICAgdG8gc2FmZWx5IGluY3JlZi9kZWNyZWYgdGhlIHB5dGhvbiBvYmplY3QuIAoJICAgIAoJICAgIFNvLCBub3cgeW91IGNhbiB1c2UgYWxsIHRoZSBTVEwvU1REIGNvbnRhaW5lcnMgYXMgbmF0aXZlCgkgICAgUHl0aG9uIGNvbnRhaW5lcnMuIAoKCSAgICBOb3RlIDE6IHN0ZDo6bWFwLCBzdGQ6OnNldCBhbmQgdGhlIG90aGVyICdvcmRlcmVkJwoJICAgIGNvbnRhaW5lcnMgd2lsbCBwcm9wZXJseSB1c2UgUHlPYmplY3RfQ29tcGFyZSBmb3Igc29ydGluZywKCSAgICB3aGVuIG5lZWRlZC4KCgkgICAgTm90ZSAyOiBhbGwgdGhlIFNUTC9TVEQgY29udGFpbmVycyBoYXZlIGEgbGltaXQgc2l6ZSBvZgoJICAgIFNJWkVfTUFYLCBpZSwgeW91IGNhbiBoYXZlIG1hbmFnZSBjb250YWluZXJzIGxhcmdlciB0aGFuCgkgICAgSU5UX01BWCwgdGhlIHB5dGhvbiBsaW1pdC4KCSAgICAKCSAgICAgIAoxMS8wMi8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0KCSAgICAtIGFkZCAnaXRlcmF0b3IoKScgbWV0aG9kIGZvciBhbGwgc2VxdWVuY2VzIGFuZCBhZGRpdGlvbmFsbHkKCSAgICAgICdrZXlfaXRlcmF0b3IoKScgZm9yIG1hcHMuCgoJICAgICAgJ2l0ZXJhdG9yKCknIHdpbGwgYWx3YXlzIHJldHVybiB0aGUgbmF0aXZlIEMrKyBpdGVyYXRvci4KCSAgICAgIEFkZGl0aW9uYWxseSwgaW4gbWFwcywgJ2tleV9pdGVyYXRvcigpJyB3aWxsIHJldHVybiBhIHB5dGhvbgoJICAgICAgaXRlcmF0b3IgdXNpbmcgb25seSB0aGUgbWFwIGtleXMuCgkgICAgICAKCSAgICAgIEluIGdlbmVyYWwgdGhlIHNlcXVlbmNlIG1ldGhvZCBfX2l0ZXJfXyB3aWxsIGNhbGwKCSAgICAgICdpdGVyYXRvcigpJywgcmV0dXJuaW5nIHRoZSBuYXRpdmUgQysrIGl0ZXJhdG9yLCBidXQgaW4KCSAgICAgIG1hcHMgaXQgd2lsbCBjYWxsICdrZXlfaXRlcmF0b3IoKScsIG1haW50YWluaW5nCgkgICAgICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgoKCSAgICAgIEhlbmNlLCBmb3Igc3RkOjptYXBzLCB5b3UgY2FuIHBsYXkgdGhlbiB3aXRoIHRoZSBuYXRpdmUKCSAgICAgIEMrKyBpdGVyYXRvciwgd2hpY2ggdmFsdWUgaXMgYSAoa2V5LCB2YWx1ZSkgcGFpciwgYnkKCSAgICAgIGNhbGxpbmcgbWFwLml0ZXJhdG9yKCksIGFzIHdpdGggbWFwLmJlZ2luKCksIG1hcC5lbmQoKSwgZXRjLgoKCSAgICAgIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWFwLml0ZXJhdG9yKCkgcmV0dXJucyBhIHNhZmUKCSAgICAgICdjbG9zZWQnIGl0ZXJhdG9yLCB3aGlsZSBtYXAuYmVnaW4oKSBhbmQgbWFwLmVuZCgpIGFyZQoJICAgICAgJ29wZW4nIGl0ZXJhdG9ycy4KCgkgICAgICBBICdjbG9zZWQnIGl0ZXJhdG9yIGtub3dzIHRoZSBiZWdpbiBhbmQgdGhlIGVuZCBvZiB0aGUKCSAgICAgIHNlcXVlbmNlLCBhbmQgaXQgbmV2ZXIgY2FuIHNlZy4gZmF1bHQuIEFuICdvcGVuJwoJICAgICAgaXRlcmF0b3IsIGFzIGluIEMrKywgY2FuIHNlZy4gZmF1bHQgYXQgdGhlIEMrKyBzaWRlLgoKCSAgICAgICAgICMgYSBjbG9zZWQgaXRlcmF0b3IgaXMgc2FmZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCgkJICMgdGhlIG5leHQoKSBtZXRob2Qgd2lsbCB0aHJvdyBhIFN0b3BJdGVyYXRpb24KCSAgICAgICAgICMgZXhjZXB0aW9uIGFzIG5lZWRlZAoJCgkgICAgICAgICBpID0gc2VxLml0ZXJhdG9yKCkKCQkgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgd2hpbGUgVHJ1ZToKCQkgICAgICAgIHN1bSArPSBpLm5leHQoKQoJCSBleGNlcHQ6IHBhc3MKCQkgCgkJICMgYW4gb3BlbiBpdGVyYXRvciBhbHdheXMgbmVlZCB0byBiZSBjaGVja2VkLAoJCSAjIG9yIGl0IHdpbGwgY3Jhc2ggYXQgdGhlIEMrKyBzaWRlCgoJICAgICAgICAgY3VycmVudCA9IHNlcS5iZWdpbigpCiAgICAgICAgICAgICAgICAgZW5kID0gc2VxLmVuZCgpCgkJIHdoaWxlIChjdXJyZW50ICE9IGVuZCk6CgkJICAgIHN1bSArPSBjdXJyZW50Lm5leHQoKQoJICAgICAgCgkgICAgICAKCSAgICBbUHl0aG9uXQoJICAgIC0gRmluYWxseSwgd2hlbiB3ZSBjYWxsIAoKCSAgICAgICAgZiA9IEZvbygpCgoJICAgICAgdGhlIGNvbnN0cnVjdGlvbiBpcyAnb25lLXdheScuIEJlZm9yZSBjb25zdHJ1Y3Rpb24gIHdhcyBkb25lCgkgICAgICBzb21ldGhpbmcgbGlrZQoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspIAogICAgICAgICAgICAgICAgICBuZXdfRm9vKCkgKEMrKykgLT4gRm9vUHRyKCkgKHB5dGhvbikgCiAgICAgICAgICAgICAgICAgIEZvb1B0cigpIChweXRob24pIC0+IEZvbygpIChweXRob24pCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHdhcyBkb25lIGxpa2UKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAtPiBGb29QdHIoKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICBGb29QdHIocHl0aG9uKSAtPiBGb28oKSAocHl0aG9uKQogICAgICAgICAgICAgICAgICAJCSAgCgoJICAgICAgaWUsIHdlIHdoZW4gZ29pbmcgYmFjayBhbmQgZm9yd2FyZCBiZXR3ZWVuIHRoZSBDKysgYW5kCgkgICAgICBweXRob24gc2lkZS4KCgkgICAgICBOb3cgc2luY2UgdGhlcmUgaXMgbm8gRm9vUHRyIHRoZSBjb25zdHJ1Y3Rpb24gcHJvY2VzcyBpcwoKCSAgICAgICAgICBGb28oKSAocHl0aG9uKSAtPiBfbmV3X0ZvbygpIChDKyspCiAgICAgICAgICAgICAgICAgIF9uZXdfRm9vKCkgKEMrKykgLT4gTmV3UG9pbnRlck9iaigpIChDKyspIChubyBzaGFkb3cgY2xhc3MpCgogICAgICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIGlzIGRvbmUKCiAgICAgICAgICAgICAgICAgIE5ld1BvaW50ZXJPYmooKSAoQysrKSAod2l0aCBzaGFkb3cgY2xhc3MpIC0+IE5ld0luc3RhY2VPYmooKSAoQysrKQoKCSAgICAgIHdoZXJlIE5ld0luc3RhbmNlT2JqIGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aG91dAoJICAgICAgY2FsbGluZyBfX2luaXRfXyBhbmQgaXQgZG9lc24ndCBnbyAnYmFjaycgdG8gcHl0aG9uLCBpcwoJICAgICAgJ3B1cmUnIEMgQVBJLgoKCSAgICAgLSBXaXRoIHRoaXMgY2hhbmdlLCBhbmQgdGhlIG90aGVyIG9uZXMgaW4gdGhlCiAgICAgICAgICAgICAgIFB5U3dpZ09iamVjdCB0eXBlLCB3aGljaCBub3cgY2FycmllcyB0aGUgdGhpc293biBhbmQKICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gcG9pbnRlciwgdGhlIGdlbmVyYXRlZCBjb2RlIHNob3VsZCBiZSBhcwogICAgICAgICAgICAgICBmYXN0IGFzIGJvb3N0OjpQeXRob24gYW5kL29yIHRoZSBvdGhlciBweXRob24gd3JhcHBlcnMKICAgICAgICAgICAgICAgYmFzZWQgaW4gcHVyZSBQeXRob24vQyBBUEkgY2FsbHMuCgoJICAgICAgIEFzIGEgcmVmZXJlbmNlLCB0aGUgcHJvZmlsZXRlc3RfcnVubWUucHkgZXhhbXBsZSwgd2hpY2gKCSAgICAgICBkb2VzIGEgc2ltcGxlIGNhbGwgZnVuY3Rpb24gbWFueSB0aW1lcywgc3VjaCBhcyB0aGlzIGNvZGU6CgogICAgICAgICAgICAgICAgICAgIGltcG9ydCBwcm9maWxldGVzdCAgICAgICAKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSAgICBhID0gcHJvZmlsZXRlc3QuQSgpICAgICAgCgkJICAgIGIgPSBwcm9maWxldGVzdC5CKCkgICAgICAKCQkgICAgZm9yIGkgaW4gcmFuZ2UoMCwxMDAwMDAwKQoJICAgICAgICAgICAgICBhID0gYi5mbihhKSAgICAgICAgICAgIAoKCgkgICAgICAgd2hlcmUgZm4gaXMgZGVmaW5lZCBhcyAnQSogQjo6Zm4oQSAqYSkge3JldHVybiBhO30nLAoJICAgICAgIHByb2R1Y2VzICB0aGUgZm9sbG93aW5nIHRpbWVzCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9tb2Rlcm4gICAgbW9kZXJuCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAxOS43MHMgICAgICA1Ljk4cwogICAgICAgICAgICAgICAgIHN3aWctQ1ZTICAgICAgICAwLjk5cyAgICAgIDAuOThzCgkgICAgICAgCgoJICAgICAgIENsZWFybHksIHRoZXJlIGlzIGEgbGFyZ2UgaW1wcm92ZW1lbnQgZm9yIHRoZSBweXRob24KCSAgICAgICAnbm9tb2Rlcm4nIG1vZGUuIFN0aWxsLCB0aGUgJ21vZGVybicgbW9kZSBpcyBhcm91bmQKCSAgICAgICA2IHRpbWVzIGZhc3RlciB0aGFuIGJlZm9yZS4gRm9yIHRoZSBzYW1lIHRlc3QsIGJ1dAoJICAgICAgIHVzaW5nIHRoZSBub24tc2hhZG93IHZlcnNpb24gb2YgdGhlIG1vZHVsZSwgd2UgZ2V0CgoJICAgICAgICAgICAgICAgICAgICAgICBfcHJvZmlsZXRlc3QgKG5vbi1zaGFkb3cpCgkgICAgICAgICBzd2lnLTEuMy4yNiAgICAgMC44MHMgCiAgICAgICAgICAgICAgICAgc3dpZy1DVlMgICAgICAgIDAuNjBzIAoKCSAgICAgICBIZW5jZSwgbm93IGZvciBwcmFjdGljYWwgcHVycG9zZXMsIHRoZSBwcm94eSBvdmVyaGVhZAoJICAgICAgIGlzIGluc2lnbmlmaWNhbnQuCgoJICAgICAgIE5vdGUgdGhhdCB0aGUgcGVyZm9ybWFuY2UgbnVtYmVycyB3ZSBhcmUgc2hvd2luZyBpcyBmb3IKCSAgICAgICBhIHNpbXBsZSBtb2R1bGUgKHR3byB0eXBlcykgYW5kIGEgc2ltcGxlIGZ1bmN0aW9uIChvbmUKCSAgICAgICBhcmd1bWVudCkuIEZvciByZWFsIHNpdHVhdGlvbnMsIGZvciBtb2R1bGVzIHdpdGggbWFueQoJICAgICAgIG1vcmUgdHlwZXMgYW5kL29yIGZ1bmN0aW9ucyB3aXRoIG1hbnkgbW9yZSBwYXJhbWV0ZXJzLAoJICAgICAgIHlvdSB3aWxsIHNlZSBldmVuIGJldHRlciByZXN1bHRzLgoJICAgICAgIAoJCSAgCSAgICAgIAoxMC8zMS8yMDA1OiBtbWF0dXMKCSAgICBbUHl0aG9uXQoKCSAgICAtIEZpbmFsbHksIG5vIG1vcmUgQ2xhc3NQdHIgcHJveHkgY2xhc3Nlcy4gWW91IHdpbGwgc2VlCgkgICAgICBvbmx5IGEgY2xlYW4gQ2xhc3MgcHJveHkgY2xhc3MgaW4gdGhlIC5weSBmaWxlLgoKCSAgICAtIE5vIG1vcmUgJ3JlYWwnIHRoaXNvd24gYXR0cmlidXRlIGVpdGhlciwgdGhlIFB5U3dpZ09iamVjdCBub3cKICAgICAgICAgICAgICBjYXJyaWVzIHRoZSBvd25lcnNoaXAgaW5mby4KCgkgICAgICBZb3UgY2FuIGFsc28gZG8gc29tZXRoaW5nIGxpa2UKCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IFRydWUKCQkgIAoJCSAgc2VsZi50aGlzLmRpc293bigpCgkJICBzZWxmLnRoaXMub3duKDApCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzLm93bigpIAoJCSAgPj4+IEZhbHNlCQkgIAoKCQkgIHNlbGYudGhpcy5hY3F1aXJlKCkKCQkgIHNlbGYudGhpcy5vd24oMSkKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXMub3duKCkgCgkJICA+Pj4gVHJ1ZQoKCSAgICAgIFN0aWxsIHRoZSBvbGQgd2F5LAoJICAgICAgCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKCQkgIHNlbGYudGhpc293biA9IDAKCSAgICAgICAgICBwcmludCBzZWxmLnRoaXNvd24KCQkgID4+PiBGYWxzZQkJICAKCgkJICBzZWxmLnRoaXNvd24gPSAxCgkgICAgICAgICAgcHJpbnQgc2VsZi50aGlzb3duCgkJICA+Pj4gVHJ1ZQoKICAgICAgICAgICAgICBpcyBzdXBwb3J0ZWQsIGFuZCBweXRob24gZGlzcGF0Y2hlcyB0aGUgcHJvcGVyIG1ldGhvZAogICAgICAgICAgICAgIGNhbGxzIGFzIG5lZWRlZC4gCQkgIAoJICAgICAgIAoKCSAgICAtIFN1cHBvcnQgZm9yIGl0ZXJhdG9ycyBpbiBTVEwvU1REIGNvbnRhaW5lcnMsIGZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQoKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGU8c2V0X3N0cmluZz4gc3RkOjpzZXQ8c3RkOjpzdHJpbmc+OwoJICAgICAgICAgIAogICAgICAgICAgICAgICB5b3UgY2FuIHVzZSB0aGUgQysrIGl0ZXJhdG9ycyBhczogIAoKICAgICAgICAgICAgICAgICAgICAgcyA9IHNldF9zdHJpbmcoKQoJCSAgICAgICAgICAgICAgICAgICAgIAoJCSAgICAgcy5hcHBlbmQoImMiKSAgIAoJCSAgICAgcy5hcHBlbmQoImEiKSAgIAoJICAgICAgICAgICAgIHMuYXBwZW5kKCJiIikKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBiLm5leHQoKSAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgIHByaW50IHN1bQoKICAgICAgICAgICAgICAgICAgICAgPj4+ICJhYmMiIAoKCQlhZHZhbmNlIHRoZSBpdGVyYXRvciBhcyBpbiBDKysKCiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGN1cnJlbnQgKz0gMQogICAgICAgICAgICAgICAgICAgICBwcmludCBjdXJyZW50LnZhbHVlKCkKCQkgICAgID4+PiAiYiIKCQkgICAgIAoJCW5vdyB1c2luZyB0aGUgcmV2ZXJzZSBvcGVyYXRvcnMKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLnJiZWdpbigpICAgICAgCgkJICAgICBlID0gcy5yZW5kKCkgICAgICAgIAoJCSAgICAgc3VtID0gIiIgICAgICAgICAgIAoJCSAgICAgd2hpbGUgKGIgIT0gZSk6ICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGIubmV4dCgpICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgoJICAgICAgICBvciB0aGUgJ3ByZXZpb3VzJyBtZXRob2QKCiAgICAgICAgICAgICAgICAgICAgIGIgPSBzLmJlZ2luKCkgICAgICAKCQkgICAgIGUgPSBzLmVuZCgpICAgICAgICAKCQkgICAgIHN1bSA9ICIiICAgICAgICAgICAKCQkgICAgIHdoaWxlIChiICE9IGUpOiAgICAKICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBlLnByZXZpb3VzKCkKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgc3VtCgogICAgICAgICAgICAgICAgICAgICA+Pj4gImNiYSIgCgogICAgICAgICAgICAgICAgb3IganVzdCBhcyBpbiBhIHB5dGhvbiBmYXNoaW9uCgogICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIE5vdGUgMTogSXRlcmF0b3JzIGluIEMrKyBhcmUgdmVyeSBwb3dlcmZ1bCwgYnV0CiAgICAgICAgICAgICAgICBkYW5nZXJvdXMgdG9vLiBBbmQgaW4gcHl0aG9uIHlvdSBjYW4gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QKICAgICAgICAgICAgICAgIGp1c3QgbGlrZSBpbiBDKyssIHNvLCBiZSBjYXJlZnVsLgoJCQoJCU5vdGUgMjogdGhlIGl0ZXJhdG9ycyBhcmUgJ2xpZ2h0JywgaWUsIHRoZXkgZG8gbm90CgkJY29udmVydCBzZXF1ZW5jZSBlbGVtZW50cyB1bnRpbCB5b3UgcmVxdWVzdCB0byBkbyBzbywgdmlhCgkJbmV4dCgpLCB2YWx1ZSgpIG9yIHByZXZpb3VzKCkuIElmIHlvdSBqdXN0IGluY3JlbWVudC9kZWNyZW1lbnQgb25lCgkJbm8gY29udmVyc2lvbiBpcyBwZXJmb3JtZWQsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICBiID0gcy5iZWdpbigpICAgICAgCgkgICAgICAgICAgICAgYiArPSAxCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigpCiAgICAgICAgICAgICAgICAgICAgIGIuaW5jcigyKQoJCSAgICAgYi5kZWNyKDIpCiAgICAgICAgICAgICAgICAgICAgIGIuZGVjcigpCiAgICAgICAgICAgICAgICAgICAgIGIgLT0gMQoKCQkgb25seSB0aGUgaXRlcmF0b3IgaXMgbW9kaWZpZWQsIGFuZCBub3QgdmFsdWUgd3JhcHBlcgoJCSBpcyBnZW5lcmF0ZWQuIE90aGVyIHR5cGljYWwgQysrIG9wZXJhdGlvbnMgYXJlIGFsc28gCgkJIGF2YWlsYWJsZSwgc3VjaCBhczoKCgkJICAgICBwcmludCBzLmVuZCgpIC0gcy5iZWdpbigpCgkJICAgICA+Pj4gMwoJCSAgICAgZiA9IHMuYmVnaW4oKSArIDEKCQkgICAgIHByaW50IGYudmFsdWUoKQoJCSAgICAgPj4+ICJiIgoJCSAgICAgbCA9IHMuZW5kKCkgLSAxCgkJICAgICBwcmludCBsLnZhbHVlKCkKCQkgICAgID4+PiAiYyIKCQkgCgkJIGV0Yy4gIE9mIGNvdXJzZSwgdGhlICdmaW5kJywgJ2luc2VydCcsICdlcmFzZScsIGFuZAoJCSBzbyBvbiBtZXRob2RzIGFsc28gc3VwcG9ydHMgaXRlcmF0b3JzIG5vdywgaWU6CgoJCSAgICAgIGkgPSBzLmJlZ2luKCkKCQkgICAgICBpICs9IDEKCQkgICAgICBzLmVyYXNlKGkpCiAgICAgICAgICAgICAgICAgICAgICBmb3IgaSBpbiBzOgogICAgICAgICAgICAgICAgICAgICAgICAgc3VtICs9IGkKCQkgICAgICBwcmludCBzdW0KCQkgICAgICA+Pj4gImFjIgoJCSAgICAgIAogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCgkgICAgVGhlcmUgaXMgbm8gbW9yZSAndGhpc293bicgYXR0cmlidXRlLiBJZiB5b3UgdXNlIGl0LCBweXRob24KCSAgICB3aWxsIHRyYW5zbGF0ZSB0aGUgZm9sbG93aW5nIGNvZGUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoc2VsZi50aGlzb3duKTogICA9PT4gICBpZiAoc2VsZi50aGlzLm93bigpKToKCQlzZWxmLnRoaXNvd24gPSAxICAgICA9PT4gICBzZWxmLnRoaXMub3duKDEpCiAgICAgICAgICAgICAgICBzZWxmLnRoaXNvd24gPSAwICAgICA9PT4gICBzZWxmLnRoaXMub3duKDApCgoJICAgIFN0aWxsLCBtYXliZSBpbiBzb21lIHVudXN1YWwgY2FzZXMgdGhlIHRyYW5zbGF0aW9uIHdpbGwgbm90IGJlCgkgICAgMTAwJSBjb3JyZWN0LCBzbyBpZiB5b3UgaGF2ZSBhIHByb2JsZW0sIHBsZWFzZSByZXBvcnQgaXQKCSAgICBhbmQvb3IgdXNlIHRoZSBuZXcgJ3NlbGYudGhpcy5vd24oKScgYWNjZXNzb3IuCgkgICAgCgkgICAgCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoJICAgIAoJICAgIFRoZXJlIGlzIG5vIG1vcmUgQ2xhc3NQdHIgY2xhc3NlcyBpbiB0aGUgcHl0aG9uIGNvZGUuIEhlbmNlLAoJICAgIGlmIGluIHRoZSBwYXN0IHlvdSBuZWVkZWQgdG8gcmVzb3J0IHRvIHNvbWUga2luZCBvZiB0cmlja2VyeQoJICAgIHdpdGggdGhlbSwgb3Igb3ZlcmNvbWUgdGhlaXIgcHJlc2VuY2UsIGl0IGlzIG5vIGxvbmdlcgoJICAgIHJlcXVpcmVkLCBidXQgdGhlIGV4dHJhIGNvZGUgeW91IGFkZGVkIGNvdWxkIG5vdyBicmVhawoJICAgIHRoaW5ncy4KCgkgICAgSWYgbmVlZGVkLCB5b3UgY2FuIHVzZSB0aGUgb3B0aW9uIC1jbGFzc3B0ciwgaS5lLiwKCiAgICAgICAgICAgICAgIHN3aWcgLWNsYXNzcHRyIC1weXRob24gLi4uCgoJICAgIHRvIGdlbmVyYXRlIHRoZSBvbGQgQ2xhc3NQdHIgY2xhc3Nlcy4KCgoxMC8zMC8yMDA1OiBta29lcHBlIAoJICAgIFtHdWlsZV0gTWFrZSBkZWNsYXJlZCBhbmQgZGVmaW5lZCBsaW5rYWdlIG9mIFNXSUdfaW5pdCBjb25zaXN0ZW50LiAgCgkgICAgUmVwb3J0ZWQgYnkgU3RldmVuIEcuIEpvaG5zb24gKFNGIHBhdGNoIDEzMTU0OTgpLgoKMTAvMjYvMjAwNTogbW1hdHVzCgoJICAtIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSBnbG9iYWwgbGlicmFyeSBkaXJlY3Rvci4KCSAgICBOb3cgaXQgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMgdGhhdCBkbyBub3QgdXNlCgkgICAgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5IGFzIHdlbGwuCgoJICAgIFNvLCBpZiB5b3UgaGF2ZSBzb21ldGhpbmcgbGlrZToKCgkgICAgICAgJWluY2x1ZGUgYXR0cmlidXRlLmkKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGUoQSwgaW50LCBhLCBnZXRfYSwgc2V0X2EpOwoJICAgICAgIAkJCQkgICAgICAJICAKCSAgICAgICBzdHJ1Y3QgQQkJCSAgICAgIAkgIAoJICAgICAgIHsgICAgCQkJCSAgCgkgICAgICAgICBpbnQgZ2V0X2EoKSBjb25zdDsgCQkgIAoJICAgICAgICAgdm9pZCBzZXRfYShpbnQgYWEpOyAJCSAgCgkgICAgICAgfTsJCQkJICAKCiAgICAgICAgICAgICAgICVhdHRyaWJ1dGVfcmVmKEIsIGludCwgYyk7CgkgICAgICAgCQkJCQoJICAgICAgIHN0cnVjdCBCCQkJCgkgICAgICAgeyAgICAJCQkKCSAgICAgICAgIGludCYgYygpOyAJCQoJICAgICAgIH07IAoKCSAgICB0aGVuIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdGhlICdBLmEnIGFuZCAnQi5jJyBhdHRyaWJ1dGVzIHdpbGwKCSAgICBiZSB2aXNpYmxlLCBpZSwgeW91IGNhbiBhY2Nlc3MgdGhlbSBhcyBwbGFpbiB2YXJpYWJsZXM6CgogICAgICAgICAgICAgICBmICAgPSBBKCkKICAgICAgICAgICAgICAgZi5hID0gMwogICAgICAgICAgICAgICBnICAgPSBCKCkKICAgICAgICAgICAgICAgZy5jID0gMyAKICAgICAgICAgICAKCSAgICAgICBoICAgPSBmLmEgKyBnLmMKCgkgICAgYW5kIHRoZSBwcm9wZXIgZ2V0L3NldCBtZXRob2RzIHdpbGwgYmUgZGlzcGF0Y2hlZC4gU2VlCgkgICAgYXR0cmlidXRlLmkgZm9yIG1vcmUgaW5mby4KICAgCiAgICAgICAgICAtIE1vcmUgY2xlYW51cHMgYXJvdW5kIGFuZCBhZGRpbmcgbW9yZSB0ZXN0LWNhc2VzLiBUaGUKICAgICAgICAgICAgRElTT1dOIHR5cGVtYXAgbm93IGlzIHRlc3RlZCBhbmQgd29ya2luZyBpbiBhbGwgdGhlCiAgICAgICAgICAgIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnksIGllLCB0Y2wsCiAgICAgICAgICAgIHJ1YnksIHBlcmwgYW5kIHB5dGhvbi4KCSAgICAKCjEwLzI1LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwsIGNvbXBsZXRlIHRoZSBESVNPV04gdHlwZW1hcC4KCSAgICAKCSAgICAtIGFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBmaWxlIHRvIHRoZSB1bmlmaWVkIHR5cGVtYXAKICAgICAgICAgICAgICBsaWJyYXJ5IChiZWZvcmUgd2FzIG9ubHkgdXNhYmxlIGZyb20gcHl0aG9uKS4KCgkgICAgLSB1bmlmeSB0aGUgbmFtZXMgZm9yIHRoZSBzZXR0ZXIgYW5kIGdldHRlciBtZXRob2RzIGluCgkgICAgICBwZXJsLHRjbCxydWJ5IGFuZCBweXRob24sIHNvLCB0aGUgYXR0cmlidXRlLmkgbGlicmFyeQoJICAgICAgY2FuIHdvcmsgYWNyb3NzIHRoZW0uCgkgICAgICAKCSAgICAtIHNlZSB0aGUgbGlfYXR0cmlidXRlLmkgdGVzdC1jYXNlIG9yIHRoZSBsaWJyYXJ5IGZpbGUKCiAJICAgICAgICBMaWIvdHlwZW1hcHMvYXR0cmlidXRlLnN3ZwoKICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvIGFib3V0IGhvdyB0byB1c2UgaXQuCgogCgkgICAgICAKCjEwLzI0LzIwMDU6IG1tYXR1cwoKCSAgICAtIFBlcmwgbm93IHVzZXMgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LgoKCSAgICAtIENoYW5nZXMgaW4gcnVieSB0byB1c2UgdGhlICR0cmFjayBvcHRpb24gaW4gdHlwZW1hcHMuCgoJICAgIC0gQ2hhbmdlcyBpbiB0aGUgdW5pZmllZCB0eXBlbWFwIGxpYnJhcnkgdG8gZm9sbG93IHRoZQoJICAgICAgY29udmVudGlvbiB0aGF0IGFsbCBtYWNyb3MgdGhhdCBhcmUgbm90IHVzZWQgaW4gdGhlCgkgICAgICBDL0MrKyBzaWRlIHN0YXJ0cyB3aXRoICUsIHN1Y2ggYXMKCgkgICAgICAgICAgICVkZWxldGUKCQkgICAlbmV3X2FycmF5CgogICAgICAgICAgICAgIGV0Yy4KCSAgICAgIAoJICAgIC0gRG9jdW1lbnRpbmcgZnJhZ21lbnRzLCBzZWUgZnJhZ21lbnRzLnN3Zy4KCgkgICAgLSBDbGVhbmVyIHdheSB0byB1c2UgdGhlIHVuaWZpZWQgdHlwZW1hcCBsaWJyYXJ5LCBpbmNsdWRlCgkgICAgICBqdXN0IDx0eXBlbWFwcy9zd2lndHlwZXMuc3dnPi4KCgkgICAgICBDaGVjayBzb21lIG9mIHRoZSBzdXBwb3J0ZWQgbGFuZ3VhZ2VzOiBwZXJsLCB0Y2wsIHJ1YnksCgkgICAgICBweXRob24uCgoJICAgICAgQWx3YXlzIHN0YXJ0IHdpdGggdGhlIGhlYWQgZmlsZSwgc3VjaCBhcwoKCSAgICAgICAgIHB5dGhvbi9weXRob24uc3dnCgkgICAgICAgICB0Y2wvdGNsOC5zd2cKCSAgICAgICAgIHJ1YnkvcnVieS5zd2cKCSAgICAgICAgIHBlcmw1L3Blcmw1LnN3ZwoKICAgICAgICAgICAgICBhbmQgdGhlIHByaW5jaXBhbCBmaWxlIHRoYXQgaW52b2tlcyB0aGUgdW5pZmllZCBsaWJyYXJ5LCBzdWNoIGFzCgoJICAgICAgICAgcHl0aG9uL3B5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHRjbC90Y2x0eXBlbWFwcy5zd2cJICAgIAoJICAgICAgICAgcnVieS9ydWJ5dHlwZW1hcHMuc3dnCSAgICAKCSAgICAgICAgIHBlcmwvcGVybHR5cGVtYXBzLnN3ZwkgICAgCgkgICAgCgkgICAgICBUaGUgZmlsZSB0aGF0IHByb3ZpZGUgdGhlIHNwZWNpYWxpemF0aW9uIGZvciBlYWNoCgkgICAgICBsYW5ndWFnZSBhcmUgdGhlIG9uZSB0aGF0IHByb3ZpZGVzIHRoZSBiYXNpYyB0eXBlczoKCgkgICAgICAgICBweXRob24vcHlwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcnVieS9ydWJ5cHJpbXR5cGVzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xwcmltdHlwZXMuc3dnCQoJICAgICAgICAgcGVybDUvcGVybHByaW10eXBlcy5zd2cKCgkgICAgICBhbmQgdGhlIHN0cmluZyBtYW5pcHVsYXRpb246ICAJIAoJICAgIAoJICAgICAgICAgcHl0aG9uL3B5c3RyaW5ncy5zd2cJCgkgICAgICAgICBydWJ5L3J1YnlzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHRjbC90Y2xzdHJpbmdzLnN3ZwkKCSAgICAgICAgIHBlcmw1L3BlcmxzdHJpbmdzLnN3ZwoKCQkgCgkgICAgICBUaGUgcmVzdCBvZiB0aGUgZmlsZXMsIHN1Y2ggYXMgY2FycmF5LmksIGFyZSBtb3N0bHkgb25lIAoJICAgICAgbGluZSBmaWxlcyB0aGF0IGluY2x1ZGUgdGhlIHByb3BlciB0eXBlbWFwIGxpYnJhcnkKCSAgICAgIHZlcnNpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBpbiBQZXJsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgZXhwZWN0ZWQgYmVoYXZpb3IgaW4gUGVybC4KCjEwLzIzLzIwMDU6IHd1enplYgogICAgICAgICAgICBDaGlja2VuOgogICAgICAgICAgICAgICsgcG9pbnRlcnMgdG8gbWVtYmVyIGZ1bmN0aW9ucyBmaW5hbGx5IHdvcmsgcHJvcGVybHkKICAgICAgICAgICAgICArIGFkZCB0ZXN0IG9mIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycyB0byBjcHBfYmFzaWMuaQoKMTAvMjAvMjAwNTogZGFuY3kKCSAgICBbYWxsZWdyb2NsXSBBZGRlZCBDKysgc3VwcG9ydC4gTGFyZ2UgdXBkYXRlLCBtYW55IGNoYW5nZXMuIFNlZQoJICAgIG5ld2x5IGFkZGVkIEFsbGVncm8gQ29tbW9uIExpc3Agc2VjdGlvbiBpbiBsaXNwLmh0bWwKCjEwLzIwLzIwMDU6IG1tYXR1cwoJICAgIFJ1YnksIFRjbCwgUHl0aG9uOgoKCSAgICAtIFVuaWZvcm0gd2F5IHRvIGZhaWwgKGxhYmVsIGZhaWw6KSwgbm93IGZpbmFsbHkKCSAgICAgIFNXSUdfZXhjZXB0aW9uIHdvcmtzIGFjcm9zcyB0aGUgdGhyZWUgbGFuZ3VhZ2VzIGFuZCBhbGwKCSAgICAgIHRoZSB0eXBlbWFwcy4KCgkgICAgLSBBZGQgcHJvcGVyIGNsZWFudXAgY29kZSB0byBydWJ5CgoJICAgIC0gTW9yZSB2YWxncmluZCBmaXhlcwoKCSAgICAtIFNpbXBsaWZ5IHRoZSBpbmxpbmUgdXNlLCBpdCBzZWVtcyBhIHNtYWxsIGludGVyZmFjZSBvZgoJICAgICAgMjAsMDAwIGxpbmVzIChwbHVzIG1hbnkgbWFueSB0ZW1wbGF0ZXMpIGNhbiBicmVhayAKCSAgICAgIGdjYyAtTzMgZWFzaWx5LgoKCSAgICAtIEZpbmFsaXplIHRoZSB0eXBlbWFwcyBsaWJyYXJ5LiBBbGwgdGhlIG9sZCAgKi5pIGZpbGVzCgkgICAgICAoY2FycmF5LmksIGNwb2ludGVyLmksIGV4Y2VwdGlvbi5pKSBoYWQgYmVlbiBpbXBsZW1lbnRlZAoJICAgICAgaW4gdGhlIG5ldyB0eXBlbWFwcyBsaWJyYXJ5LgoJICAgIAoKMTAvMTkvMjAwNTogd3V6emViCgkgICAgVXBkYXRlIHRoZSBSdW50aW1lIFR5cGVtYXAgZG9jdW1lbnRhdGlvbiBpbiBUeXBlbWFwcy5odG1sCgoxMC8xOC8yMDA1OiB3dXp6ZWIKCSAgICBDaGlja2VuOgoJICAgICAgLSBDb3JyZWN0bHkgaGFuZGxlICVpZ25vcmVkIGNsYXNzZXMKICAgICAgICAgICAgICAtIENvcnJlY3RseSBjb252ZXJ0IGxvbmcsIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZywgZXRjCiAgICAgICAgICAgICAgICB0byBjaGlja2VuIHByaW1pdGl2ZXMuIChUaGFua3MgdG8gRmVsaXggV2lua2VsbWFubikKICAgICAgICAgICAgICAtIFVzaW5nIGFyZ291dCBwYXJhbWV0ZXJzIHdoZW4gdGhlIHJldHVybiB2YWx1ZSB3YXMgYQogICAgICAgICAgICAgICAgd3JhcHBlZCBwb2ludGVyIGNhdXNlZCBhIG1lbW9yeSBjb3JydXB0aW9uLiAgVGhlIGNoaWNrZW4KICAgICAgICAgICAgICAgIGdhcmJhZ2UgY29sbGVjdG9yIG1vdmVkIGEgcG9pbnRlciBvdXQgZnJvbSB1bmRlciB1cy4KICAgICAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGJ5IHJ1bm5pbmcgYWxsIHRoZSBwcm94eSBjcmVhdGlvbgogICAgICAgICAgICAgICAgZnVuY3Rpb25zIGFzIGNvbnRpbnVhdGlvbnMgYWZ0ZXIgdGhlIHdyYXBwZXIgZnVuY3Rpb24KICAgICAgICAgICAgICAgIHJldHVybnMuICBBcyBwYXJ0IG9mIHRoaXMsIHdlIG5vIGxvbmdlciBuZWVkIHRoZQogICAgICAgICAgICAgICAgY2hpY2tlbmZhc3Rwcm94eSBmbGFnIG9uIG91dHB1dCB0eXBlbWFwcy4KICAgICAgICAgICAgICAtIHVzaW5nIC1wcm94eSBhbmQgLW5vY29sbGVjdGlvbiB0b2dldGhlciB3b3JrcyBub3cKICAgICAgICAgICAgICAgIEJlZm9yZSwgaXQgd2FzIG5vdCBleHBvcnRpbmcgdGhlIGRlc3RydWN0b3IgaW4gdGhlIHByb3h5CiAgICAgICAgICAgICAgICB3cmFwcGVyLgoKMTAvMTgvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgQWRkZWQgdGhlIFVuaWZpZWQgVHlwZW1hcCBMaWJyYXJ5IChVVEwpLiBJdCB1bmlmaWVzIHRoZSB0eXBlbWFwcyBmb3IKCiAJICAgICAgICBweXRob24sIHJ1YnksIHRjbAoKCSAgICBhbmQgaW4gdGhlIHByb2Nlc3MsIGZpeGVzIHNldmVyYWwgcHJvYmxlbXMgaW4gZWFjaCBvZiB0aGUgdGhyZWUKCSAgICBsYW5ndWFnZXMgdG8gd29yayBpbiBhICJjYW5vbmljYWwiIHdheSBub3cgZXN0YWJsaXNoZWQgaW4KCSAgICB0aGUgdHlwZW1hcCBsaWJyYXJ5CgkgICAgCgkgICAgICAgU1dJRy9MaWIvdHlwZW1wYXMKCgkgICAgVGhlIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSB1bmlmaWNhdGlvbiBpcyB0aGF0IGV2ZXJ5dGhpbmcKCSAgICBjb21waWxlcyBhbmQgcnVucyBpbnNpZGUgdGhlIHRlc3Qtc3VpdGUgYW5kIGV4YW1wbGVzCgkgICAgZGlyZWN0b3JpZXMuIEFuZCBmb3IgdGhlIGZpcnN0IHRpbWUgd2UgaGF2ZSB0aHJlZQoJICAgIGxhbmd1YWdlcyB0aGFuIHBhc3MgdGhlIHByaW1pdGl2ZV90eXBlcy5pIGNhc2UuCgoJICAgIEFsc28sIHdlIGhhdmUgYSB1bmlmb3JtIHdheSB0byB0cmVhdCB0aGUgZXJyb3JzLCBmb3IgZXhhbXBsZQoJICAgIGlmIHlvdSBkbyBzb21ldGhpbmcgbGlrZQoKCSAgICAgID4+PiBmcm9tIHByaW1pdGl2ZV90eXBlcyBpbXBvcnQgKgogICAgICAgICAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTApCiAgICAgICAgICAgICAgMTAKCSAgICAgID4+PiBwcmludCB2YWxfdWNoYXIoMTAwMCkKICAgICAgICAgICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CQkgICAgICAKCSAgICAgICAgRmlsZSAiPHN0ZGluPiIsIGxpbmUgMSwgaW4gPwkJCSAgICAKCSAgICAgIE92ZXJmbG93RXJyb3I6IGluIGFyZ3VtZW50IDEgb2YgdHlwZSAndW5zaWduZWQgY2hhcicKCgkgICAgeW91IGdldCB0aGUgc2FtZSBleGNlcHRpb24gaW4gYWxsIHRoZSB0aHJlZSBsYW5ndWFnZXMuCgkgICAgCgkgICAgQW5kIHdlbGwsIG1hbnkgbW9yZSBnb29kIHRoaW5ncyB3aWxsIGNvbWUgZnJvbSB0aGlzCgkgICAgdW5pZmljYXRpb24sIGZvciBleGFtcGxlLCBwcm9wZXIgc3VwcG9ydCBvZiB0aGUgU1RML1NURCBjbGFzc2VzCgkgICAgZm9yIGFsbCB0aGUgbGFuZ3VhZ2VzLCBhbmQgaG9wZWZ1bGx5LCB3ZSBjYW4ga2VlcAoJICAgIGFkZGluZyBvdGhlciBsYW5ndWFnZXMuCgoJICAgIFRoZSBoYXJkZXN0IHBhcnQsIHdyaXRpbmcgYSBjb21tb24gdHlwZW1hcCBsaWJyYXJ5CgkgICAgdGhhdCBzdWl0ZXMgdGhlIHRocmVlIGRpZmZlcmVudCBsYW5ndWFnZXMsIGlzIGRvbmUsCgkgICAgYW5kIGFkZGluZyBhbm90aGVyIGxhbmd1YWdlIHNob3VsZCBub3cgYmUgZWFzeS4gCgoJICAgIFN0aWxsIHRoZSBnbG9iYWwgdW5pZmljYXRpb24gaXMgbm90IGNvbXBsZXRlLCB0aGUgU1RML1NURCAKCSAgICBwYXJ0IGlzIG5leHQsIGFuZCBwcm9iYWJseSBhcyB3ZWxsIGFzIGFkZGluZyBvbmUgb3IgdHdvIG1vcmUKCSAgICBsYW5ndWFnZXMuCgoJICAgIElmIHlvdSBhcmUgY3VyaW91cywgbG9vayBhdCB0aGUgcHl0aG9uLCBydWJ5IGFuZC9vciB0Y2wKCSAgICBkaXJlY3RvcmllcyB0byBzZWUgd2hhdCBpcyBuZWVkZWQgdG8gc3VwcG9ydCB0aGUgbmV3CgkgICAgY29tbW9uIHR5cGVtYXBzIGxpYnJhcnkuICBTdGlsbCwgdGhlIGZpbmFsIHdheSB0bwoJICAgIGludGVncmF0ZSBhIG5ldyBsYW5ndWFnZSBjb3VsZCBjaGFuZ2UgYXMgd2UgbW92ZSB0bwoJICAgIGludGVncmF0ZSB0aGUgU1REL1NUTC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIGluIFJ1YnkvVGNsICoqKgoKCSAgICBTb21lIG1pc3Npbmcvd3JvbmcgdHlwZW1hcHMgY291bGQgc3RhcnQgd29ya2luZyBwcm9wZXJseSwKCSAgICBhbmQgY2hhbmdlIHRoZSBvbGQgYmVoYXZpb3IsIHNwZWNpYWxseSBpbiBydWJ5IGFuZCB0Y2wuCgpWZXJzaW9uIDEuMy4yNyAoT2N0b2JlciAxNSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB0eXBlc2FmZSBlbnVtIHdyYXBwaW5nIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgdG8KICAgICAgICAgICAgb3ZlcmxvYWQgYSBtZXRob2Qgd2l0aCAyIGRpZmZlcmVudCBlbnVtIHR5cGVzLgoKMTAvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciAlZmVhdHVyZSgiaW1tdXRhYmxlIiwiMCIpIGF0dGVtcHRpbmcgdG8gZ2VuZXJhdGUgc2V0dGVycwogICAgICAgICAgICBmb3IgY29uc3RhbnRzLgoKICAgICAgICAgICAgUmVzdG9yZWQgJWltbXV0YWJsZSBhbmQgJW1ha2VkZWZhdWx0IHRvIGNsZWFyIHRoZSBmZWF0dXJlIGFzIGl0CiAgICAgICAgICAgIGJlaGF2ZWQgaW4gU1dJRy0xLjMuMjUgYW5kIGVhcmxpZXIuCgoxMC8xNC8yMDA1OiBtbWF0dXMKICAgICAgICAgICAgRml4IGJ1ZyBpbiBhbm9ueW1vdXMgdHlwZWRlZiBzdHJ1Y3R1cmVzIHdoaWNoIHdhcyBsZWFkaW5nIHRvCiAgICAgICAgICAgIHN0cmFuZ2UgYmVoYXZpb3VyLgoKMTAvMTMvMjAwNTogbW1hdHVzCgkgICAgU2V2ZXJhbCBtaW5vciBjaGFuZ2VzOgoJICAgIAoJICAgIC0gSW1wcm92ZSB0aGUgd2NoYXJfdCB0eXBlIHN1cHBvcnQKCSAgICAtIEFkZCBhIHdhcm5pbmcgZm9yIHdoZW4geW91IGRlZmluZSB0aGUgJ2luJyB0eXBlbWFwIGJ1dAoJICAgICAgeW91IGRvbid0IGRlZmluZSB0aGUgJ3R5cGVjaGVjaycgb25lLiBWZXJ5IGNvbW1vbiBtaXN0YWtlLgoJICAgIC0gQWRkIHByb3BlciBkZWZhdWx0IHJ1bGUgZm9yIGZ1bmN0aW9uIHBvaW50ZXJzLCBub3cgeW91CgkgICAgICBjYW4gZGVmaW5lIGEgdHlwZW1hcCBzdWNoIGFzOgoKCSAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSAoKCopKEFOWSkpIHsuLi59CgoJICAgICAgVGhhdCB3aWxsIGFwcGx5IHRvIGFsbCB0aGUgcG9pbnRlciB0byBmdW5jdGlvbnMuIFRoZQoJICAgICAgcnVsZSBpbiBDKysgYWxzbyBhcHBseSB0byB0aGUgZnVuY3Rpb24gJ3JlZmVyZW5jZScsIGllLAoJICAgICAgaW4gYm90aCBjYXNlcwoKCSAgICAgICAgdHlwZWRlZiAgaW50ICgqZnB0cikoaW50IGEpOwoJICAgICAgICB0eXBlZGVmICBpbnQgKGZ1bmMpKGludCBhKTsKCgkgICAgICBUaGlzIHdhcyBuZWVkZWQgc2luY2UgaXQgc2VlbXMgdG8gYmUgJ2lsbGVnYWwnIGluIEMrKyB0bwoJICAgICAgZG8gc29tZXRoaW5nIGxpa2U6CgoJICAgICAgICAgdm9pZCAqcHRyID0gc3RhdGljX2Nhc3Q8dm9pZCAqPihmcHRyKTsKCgkgICAgICBhbmQgcHJvYmFibHksIGFzIGZvciBtZW1iZXIgZnVuY3Rpb25zLCBpdCBpcyBub3QKCSAgICAgIHdhcnJhbnRpZWQgdGhhdCB0aGUgcG9pbnRlciBzaXplcyB3aWxsIG1hdGNoLgoKCSAgICAtIEFkZCB0aGUgI2Vycm9yLyN3YXJuaW5nIGRpcmVjdGl2ZXMgdG8gc3dpZydzIGNwcC4KCgkgICAgLSBBZGQgdGhlIG5vYmxvY2sgb3B0aW9uIGZvciB0eXBlbWFwcywgd2hpY2ggaXMgdXNlZCBhcwogICAgICAgICAgICAgIGZvbGxvd3M6IHN1cHBvc2VkIHlvdSBhIHR5cGVtYXAsIGxpa2UgdGhpcwoKCSAgICAgIAoJICAgICAgJXR5cGVtYXAoaW4sbm9ibG9jaz0xKSBIZWxsbyB7CQkJICAgCgkgICAgICAgICAuLi4uCiAgICAgICAgICAgICAgfQoKCSAgICAgIHRoZW4gdGhlIHR5cGVtYXAgd2lsbCBiZSBpbnNlcnRlZCB3aXRob3V0IHRoZSBibG9jawoJICAgICAgaW1wb3NlZCBieSB0aGUgYnJhY2tldHMsIHNpbWlsYXIgdG8KCgkgICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIuLi4iOwoKCSAgICAgIFNvLCB3aHkgeW91IGRvbid0IGp1c3QgdXNlIHRoZSBxdW90ZSBzdHlsZT8sIGJlY2F1c2U6CgkgICAgICAKCSAgICAgICAgIDEuLSBUaGUgcXVvdGUgc3R5bGUgZG9lc24ndCBnZXQgcHJlcHJvY2Vzc2VkLCBmb3IgZXhhbXBsZQoJICAgICAgCgkgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBIZWxsbyAiJDE9IFNXSUdfbWFjcm8oJDEpOyI7CgkgICAgICAKCSAgICAgICAgICAgICBoZXJlLCBTV0lHX21hY3JvIGRvZXNuJ3QgZ2V0IGV4cGFuZGVkCgogICAgICAgICAgICAgICAgIDIuLSBJbnNpZGUgYSBxdW90ZSB0eXBlbWFwLCB5b3UgaGF2ZSB0byB1c2UgCiAgICAgICAgICAgICAgICAgICAgIHF1b3RlcyBjYXJlZnVsbHkKCgkJICAgICAgJXR5cGVtYXAoaW4pIEhlbGxvICIkMSA9IFwiaGVsbG9cIiAiOwoKCQkgMy4tIFlvdSBjYW4ndCBtYWtlIGVtYWNzIGFuZC9vciBvdGhlciBlZGl0b3JzCgkJICAgICB0byBpbmRlbnQgaW5zaWRlIGEgc3RyaW5nIS4gCgoKCSAgICAgIFNvLCB3aHkgZG8geW91IHdhbnQgdG8gcmVtb3ZlIHRoZSBibG9jaz8sIGJlY2F1c2UgYW4gZXh0cmEKCSAgICAgIGJsb2NrIHdoZW4gbm90IG5lZWRlZCAobm8gbG9jYWwgdmFyaWFibGVzIGluIGl0KToKCgkgICAgICAgICAgMS4tIG1ha2VzIHRoZSBjb2RlIGhhcmRlciB0byByZWFkCiAgICAgICAgICAgICAgICAgIDIuLSBtYWtlcyB0aGUgY29kZSBsYXJnZXIKICAgICAgICAgICAgICAgICAgMy4tIG9yIGluIHNob3J0LCBmb3IgdGhlIHNhbWUgcmVhc29uIHdlIGhhdmUgdGhlIHF1b3RlIHN0eWxlLgoKVmVyc2lvbiAxLjMuMjYgKE9jdG9iZXIgOSwgMjAwNSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIEFkZGVkICd0aHJvd3MnIHR5cGVtYXBzLgoKMTAvMDgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yIGxhbmd1YWdlcyB0aGF0IGRvbid0IHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIFRoZQogICAgICAgICAgICBmaXJzdCBub24taWdub3JlZCBjbGFzcyBpbiB0aGUgcHVibGljIGJhc2UgY2xhc3MgbGlzdCBpcyB1c2VkIGZvciBpbmhlcml0YW5jZS4KICAgICAgICAgICAgYnkgdGhlIHByb3h5IGNsYXNzLiBQcmV2aW91c2x5LCBpZiB0aGUgZmlyc3QgY2xhc3MgaW4gdGhlIGxpc3Qgd2FzIGlnbm9yZWQsIHRoZW4KICAgICAgICAgICAgdGhlIHByb3h5IGNsYXNzIHdvdWxkbid0IGhhdmUgYW55IGJhc2UgY2xhc3Nlcy4KCjEwLzA3LzIwMDU6IG1tYXR1cwoJICAgICBVcGRhdGUgbW9yZSBmZWF0dXJlcyB0byBmb2xsb3cgbmV3IGNvbnZlbnRpb24sIGluY2x1ZGluZzoKCgkgICAgICAgY2FsbGJhY2sKCSAgICAgICByZWYvdW5yZWYKCSAgICAgICBleGNlcHQKCSAgICAKCSAgICAgQWxsIG9mIHRoZW0gdXNlIG5vdCBvbmx5IHRoZSBmZWF0dXJlIGFzIGEgZmxhZywgYnV0IGFsc28KCSAgICAgYXMgY29kZSB2YWx1ZS4gVG8gZGVhbCB3aXRoIHRob3NlIGZlYXR1cmVzLCB3ZSB1c2Ugbm93CgkgICAgIEdldEZsYWdBdHRyLCB3aGljaCBpcyBzaW1pbGFyIHRvIEdldEZsYWcsIGJ1dCBpbnN0ZWFkIG9yCgkgICAgIHJldHVybmluZyAxIG9yIDAsIGl0IHJldHVybnMgdGhlIGF0dHIgdmFsdWUsIGlmIGhhcHBlbnMKCSAgICAgdG8gYmUgZGlmZmVyZW50IG9mICIwIiBvZiBjb3Vyc2UuCgoJICAgICBOb3cgdGhlcmUgYXJlIGFsc28gbW9yZSB1bmlmb3JtIGRpcmVjdGl2ZSBuYW1lcyBmb3IgdGhlIAoJICAgICBvbmVzIGJhc2VkIGluIGZlYXR1cmVzLCBmb3IgZXhhbXBsZSwgZm9yIHRoZSBvbGQKCSAgICAgJW5ld29iamVjdCBkaXJlY3RpdmUgbm93IHdlIGhhdmUgdHJlZSBkaXJlY3RpdmVzIGRlZmluZWQ6CgkgICAgIAoKCSAgICAgI2RlZmluZSAlbmV3b2JqZWN0ICAgICAgICAlZmVhdHVyZSgibmV3IikKCSAgICAgI2RlZmluZSAlbm9uZXdvYmplY3QgICAgICAlZmVhdHVyZSgibmV3IiwiMCIpCgkgICAgICNkZWZpbmUgJWNsZWFybmV3b2JqZWN0ICAgJWZlYXR1cmUoIm5ldyIsIiIpCgoJICAgICBhbmQgc28gb24gZm9yIGFsbCB0aGUgb3RoZXIgZmVhdHVyZSBkaXJlY3RpdmVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowOS8zMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHNvbWUgZmVhdHVyZXMuIFByZXZpb3VzbHkgaXQgd2FzIG5vdCBwb3NzaWJsZSB0byBkaXNhYmxlIG1hbnkKICAgICAgICAgICAgZmVhdHVyZXMgb25jZSB0aGV5IGhhZCBiZWVuIGVuYWJsZWQuIFRoaXMgd2FzIGZvciBtb3N0IGZlYXR1cmVzIHRoYXQgYmVoYXZlIGFzCiAgICAgICAgICAgIGZsYWdzLiBUaGVzZSBmZWF0dXJlcyBub3cgd29yayBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgibmFtZSIpICAgICAgICAgICAgICAvLyBlbmFibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiMSIpICAgICAgICAgLy8gZW5hYmxlcyB0aGUgZmVhdHVyZQogICAgICAgICAgICAgICVmZWF0dXJlKCJuYW1lIiwgIjAiKSAgICAgICAgIC8vIGRpc2FibGVzIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgJWZlYXR1cmUoIm5hbWUiLCAiIikgICAgICAgICAgLy8gY2xlYXJzIHRoZSBmZWF0dXJlCgogICAgICAgICAgICBJbiBmYWN0IGFueSBub24tZW1wdHkgdmFsdWUgb3RoZXIgdGhhbiAiMCIgd2lsbCBlbmFibGUgdGhlIGZlYXR1cmUgKGxpa2UgQyBib29sZWFuIGxvZ2ljKS4KICAgICAgICAgICAgUHJldmlvdXNseSAiMSIsICIwIiBvciBhbnkgb3RoZXIgbm9uLWVtcHR5IHZhbHVlIHdvdWxkIGVuYWJsZSB0aGUgZmVhdHVyZSBhbmQgaXQgd291bGQKICAgICAgICAgICAgb25seSBiZSBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSBmZWF0dXJlIGJ5IGNsZWFyaW5nIGl0IChhc3N1bWluZyB0aGVyZSB3YXMgbm8gZ2xvYmFsIGVuYWJsZSkuCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBhZmZlY3RlZDoKCiAgICAgICAgICAgICAgYWxsb3dleGNlcHQKICAgICAgICAgICAgICBjb21wYWN0ZGVmYXVsdGFyZ3MKICAgICAgICAgICAgICBjbGFzc2ljICAgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgY3M6Y29uc3QgICAgICAgICAgICAgICAoQyMpCiAgICAgICAgICAgICAgZGlyZWN0b3IKICAgICAgICAgICAgICBleGNlcHRpb25jbGFzcyAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgaWdub3JlCiAgICAgICAgICAgICAgaW1tdXRhYmxlCiAgICAgICAgICAgICAgamF2YTpjb25zdCAgICAgICAgICAgICAoSmF2YSkKICAgICAgICAgICAgICBqYXZhOmRvd25jYXN0ICAgICAgICAgIChKYXZhKQogICAgICAgICAgICAgIGt3YXJncwogICAgICAgICAgICAgIG1vZGVybiAgICAgICAgICAgICAgICAgKFB5dGhvbikKICAgICAgICAgICAgICBuZXcKICAgICAgICAgICAgICBub2F1dG9kb2MgICAgICAgICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgbm9kZWZhdWx0CiAgICAgICAgICAgICAgbm9kaXJlY3RvcgogICAgICAgICAgICAgIG5vcmVmCiAgICAgICAgICAgICAgbm90YWJzdHJhY3QKICAgICAgICAgICAgICBub3VucmVmCiAgICAgICAgICAgICAgbm92YWx1ZXdyYXBwZXIKICAgICAgICAgICAgICBweXRob246bWF5YmVjYWxsICAgICAgIChQeXRob24pCiAgICAgICAgICAgICAgcHl0aG9uOm5vbmR5bmFtaWMgICAgICAoUHl0aG9uKQogICAgICAgICAgICAgIG1vZHVsYTM6bXVsdGlyZXR2YWwgICAgKE1vZHVsYTMpCiAgICAgICAgICAgICAgcHJlZGljYXRlICAgICAgICAgICAgICAoUnVieSkKICAgICAgICAgICAgICB0cmFja29iamVjdHMgICAgICAgICAgIChSdWJ5KQogICAgICAgICAgICAgIHZhbHVld3JhcHBlcgoKICAgICAgICAgICAgSXQgaXMgbm93IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSB0byBpZ25vcmUgYWxsIG1ldGhvZHMvY2xhc3NlcyBpbiBhIGhlYWRlciBmaWxlLCBleGNlcHQgZm9yIGEKICAgICAgICAgICAgZmV3IHRhcmdldHRlZCBtZXRob2RzLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWZlYXR1cmUoImlnbm9yZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGFsbCBtZXRob2RzL2NsYXNzZXMKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIHNvbWVfZnVuY3Rpb24oaW50LCBkb3VibGUpOyAvLyBkbyBub3QgaWdub3JlIHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczsgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgQ2xhc3MKICAgICAgICAgICAgICAlZmVhdHVyZSgiaWdub3JlIiwiMCIpIFNvbWVDbGFzczo6bWV0aG9kOyAgICAgICAgICAvLyBkbyBub3QgaWdub3JlIHRoaXMgbWV0aG9kCiAgICAgICAgICAgICAgJWluY2x1ZGUgImJpZ2hlYWRlci5oIgoKICAgICAgICAgICAgUmVtb3ZlZCAlcHl0aG9uZHluYW1pYyAtIGl0IG5ldmVyIHdvcmtlZCBwcm9wZXJseS4gVXNlICVweXRob25ub25keW5hbWljIGluc3RlYWQuCiAgICAgICAgICAgIFJlbW92ZWQgJWZlYXR1cmUoIm5va3dhcmdzIikgLSBpdCB3YXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgIC0gdXNlICVmZWF0dXJlKCJrd2FyZ3MiLCIwIikgaW5zdGVhZC4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMDkvMjUvMjAwNTogbWtvZXBwZQoJICAgIFtHdWlsZV0gQWRkICJ0aHJvd3MiIHR5cGVtYXBzLgoKMDkvMjQvMjAwNTogY2Zpc2F2YWdlCiAgICAgICAgICAgIFtSdWJ5XSBBZGRzIG5ldyAldHJhY2tvYmplY3RzIGZ1bmN0aW9uYWxpdHkgdGhhdCBtYXBzIEMrKyBvYmplY3RzIHRvCiAgICAgICAgICAgIFJ1Ynkgb2JqZWN0cy4gIFRoaXMgZnVuY3Rpb25hbGl0eSBtYWtlcyBpdCBtdWNoIGVhc2llciB0byBpbXBsZW1lbnQKICAgICAgICAgICAgbWFyayBmdW5jdGlvbnMgZm9yIHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gIEZvciBtb3JlIGluZm9ybWF0aW9uCiAgICAgICAgICAgIHJlZmVyIHRvIHRoZSB1cGRhdGUgZG9jdW1lbnRhdGlvbiBhbmQgZXhhbXBsZXMuCiAgICAgICAgICAgIAowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gUGF0Y2ggMTExNjQzMSBmcm9tIEpvc2ggQ2hlcnJ5LiBGaXhlcyBub24gbWVtYmVyIGZ1bmN0aW9ucyBpbmFkdmVydGVudGx5CiAgICAgICAgICAgIGJlaW5nIGNhbGxlZCBpbnN0ZWFkIG9mIG1lbWJlciBmdW5jdGlvbnMuCgowOS8yMC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBQYXRjaCBmcm9tIE1hcmsgR29zc2FnZSB0byBhZGQgc3VwcG9ydCBmb3IgTHVhLTUuMSwgc3RkOjpzdHJpbmcsCiAgICAgICAgICAgIHN0ZDo6dmVjdG9yLCBzdGQ6OmV4Y2VwdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4KCjA5LzE0LzIwMDU6IG1tYXR1cwoJICAgIFtQeXRob25dIEFkZCAtbm9jcHBjYXN0LiBOb3cgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8KCSAgICBhbHdheXMgdXNlIHRoZSBjcHBjYXN0IG9wZXJhdG9ycy4gQmVmb3JlIHRoYXQgd2FzIHRoZSBjYXNlCgkgICAgb25seSB3aGVuIHlvdSB1c2VkIHRoZSAtY3BwY2FzdCBvcHRpb24uCgogICAgICAgICAgICBJZiB0aGlzIHNlZW1zIHRvIGJyZWFrIHlvdXIgY29kZS4uLiB5b3VyIHdlbGNvbWUhLCBpdAoJICAgIG1lYW5zIGl0IHdhcyBicm9rZW4gYmVmb3JlLCBhbmQgeW91IG5ldmVyIG5vdGljZS4gCgoJICAgIElmIHlvdSB0aGluZyB0aGUgZXJyb3IgaXMgZHVlIHRvIG9uZSBvZiB0aGUgU1dJRyB0eXBlbWFwcywKCSAgICBzZW5kIHVzIGFuIGV4YW1wbGUuCgoJICAgIFVzZSAtbm9jcHBjYXN0IG9ubHkgd2l0aCB2ZXJ5IG9sZCBDKysgY29tcGlsZXJzIHRoYXQKCSAgICBkbyBub3Qgc3VwcG9ydCB0aGUgY3BwY2FzdCBvcGVyYXRpb25zLiAKCgkgICAgU28sIGhlcmUgYXBwbGllczoKCgkJVGhpcyBjaGFuZ2UgZG9lc24ndCBicmVhayBjb21wYXRpYmlsaXR5LCBpdCB3YXMgYnJva2VuIGJlZm9yZS4KCjA5LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9yIG1ldGhvZHMgd2hlbiBhIGNsYXNzIGlzIHBhc3NlZCBieSB2YWx1ZSBhcyBhCiAgICAgICAgICAgIHBhcmFtZXRlci4KCjA5LzExLzIwMDU6IG1tYXR1cwogICAgICAgICAgICBBZGRpbmcgdGhlIG1vZHVsZSBvcHRpb24gdG8gdGhlICVpbXBvcnQgZGlyZWN0aXZlLiBOb3cgeW91CiAgICAgICAgICAgIGNhbiB1c2UgaXQgYXMKCgkgICAgICAgICVpbXBvcnQobW9kdWxlPSJCaWdNb2R1bGUiKSBmb28uaQoKCSAgICB3aGVyZSBzdWJmaWxlIGNvdWxkIChvciBub3QpIGRlZmluZSB0aGUgbW9kdWxlIG5hbWUgdmlhCgkgICAgdGhlICVtb2R1bGUgZGlyZWN0aXZlLiBUaGUgbW9kdWxlIG9wdGlvbiB0YWtlIHByZWNlZGVuY2UKCSAgICBhbmQgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdHMgdGhhbiBoYXZpbmcgdGhlIGRpcmVjdGl2ZSAKCgkgICAgICAgICVtb2R1bGUgQmlnTW9kdWxlICAKCgkgICAgaW5zaWRlIHRoZSBpbXBvcnRlZCBmaWxlIGZvby5pLgoKCSAgICBZb3UgY2FuIHVzZSB0aGUgb3B0aW9uIGluIG1haW5seSB0d28gY2FzZXM6CgoJICAgIDEuLSBZb3UgdXNlZCB0aGUgLW1vZHVsZSBvcHRpb24gd2hlbiB5b3UgZ2VuZXJhdGVkIHRoZQogICAgICAgICAgICAgICAgbW9kdWxlIHRvIGJlIGltcG9ydGVkLCBhbmQgaGVuY2UgdGhlIG1vZHVsZSBuYW1lIGluCiAgICAgICAgICAgICAgICB0aGUgaW1wb3J0ZWQgJW1vZHVsZSBkaXJlY3RpdmUgaXMgbm90IHJlYWxseSB1c2VmdWwuCgoJICAgIDIuLSBUaGUgbW9kdWxlIHlvdSB3YW50IHRvIGltcG9ydCBpcyB2ZXJ5IGxhcmdlLCBhbmQgaXQKICAgICAgICAgICAgICAgIGhhcyBzZXZlcmFsIC5pLy5oIGZpbGVzLiBUaGVuLCBpZiB5b3UganVzdCBvbmUgdG8KICAgICAgICAgICAgICAgIGltcG9ydCBhIGNsYXNzIG9yIHNvIGZyb20gdGhlIG1vZHVsZSwgc2F5cyAnZm9vJywgYW5kCiAgICAgICAgICAgICAgICBub3QgdGhlIGVudGlyZSBtb2R1bGUgdmlhIGltcG9ydGluZyB0aGUgbWFpbgogICAgICAgICAgICAgICAgQmlnTW9kdWxlLmkgZmlsZSwgdGhlbiB5b3UganVzdCBkbzoKCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmgKCiAgIAkgICAgICAgIG9yCgkJCiAJCSAgICAlaW1wb3J0KG1vZHVsZT0iQmlnTW9kdWxlIikgZm9vLmkKCgkJd2hlcmUgZm9vLmkgY29udGFpbnMgdGhlICdmb28nIGRlY2xhcmF0aW9uIGFuZCBtYXliZSBhCgkJY291cGxlIG9mIGV4dHJhICVpbmNsdWRlIGRpcmVjdGl2ZXMsIGFzIG5lZWRlZC4KCgkgICAgCjA5LzExLzIwMDU6IG1tYXR1cwoJICAgIEZpeCBidWcgIzEyODI2MzcsIGFib3V0IHRoZSAtbW9kdWxlIG9wdGlvbiBub3QgaGF2aW5nIGVmZmVjdAoJICAgIGluIHBsYWNlcyB3aGVyZSBpdCB3YXMgbmVlZGVkLgoKMDkvMTEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgV2hlbiB3cmFwcGluZyB2YXJpYWJsZXMsIGVuc3VyZSB0aGF0IG5vbmUgb2YgdGhlIHR5cGVtYXBzIHVzZWQgZm9yIHRoZQogICAgICAgICAgICBzZXQgd3JhcHBlcnMgYXJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBnZXQgd3JhcHBlcnMuIEkgZG91YnQgdGhpcyB3YXMgYQogICAgICAgICAgICBwcm9ibGVtIGZvciBhbnkgbGFuZ3VhZ2VzIGV4Y2VwdCBmb3IgdGhlIHJlY2VudGx5IGludHJvZHVjZWQgbnVsbCBhdHRyaWJ1dGUKICAgICAgICAgICAgaW4gdGhlIG91dCB0eXBlbWFwIChDIyBvbmx5KS4KCjA5LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vcmUgZGVzY3JpcHRpdmUgZXJyb3IgbWVzc2FnZXMgd2hlbiBmaWxlcyBmYWlsIHRvIG9wZW4uCgowOS8wNi8yMDA1OiBtbWF0dXMgCgoJICAgIEFsbG93IGEgJWRlZmluZSBhIG1hY3JvIGluc2lkZSBhbm90aGVyICVkZWZpbmUgbWFjcm8sIGZvciBleGFtcGxlCgoJICAgICAgJWRlZmluZSBoZWxsbyhuYW1lLCBUeXBlKQoJICAgICAgJWRlZmluZSBuYW1lICMjIGEoVHlwZSkKCSAgICAgICV0eXBlbWFwKGluKSBUeXBlICJoZWxsbzsiOwoJICAgICAgJWVuZGRlZgoJICAgICAgJWVuZGRlZgoJICAgICAgCgkgICAgVG8gbGVhcm4gaG93IHRvIHVzZSB0aGlzIG5ldyBmZWF0dXJlcyBpbiB5b3VyIG93biB0eXBlbWFwcyBsaWJyYXJ5LCBzZWUKCSAgICBweXRob24vY3N0cmluZy5pLCBweXRob24vY3dzdHJpbmcuaSBhbmQgcHl0aG9uL2N3c3RyYmFzZS5pLgkgICAgCgogICAgICAgICAgICBbUHl0aG9uXSBOb3JtYWxpemUgdGhlIGNzdHJpbmcuaSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZnJhZ21lbnRzLCBhbmQgYWRkCiAgICAgICAgICAgIGN3c3RyaW5nLmksIHdoaWNoIGltcGxlbWVudHMgdGhlIHNhbWUgdHlwZW1hcHMgYnV0IGZvciB3Y2hhcl90IHN0cmluZ3MuCgoJICAgIFtQeXRob25dIEJ1ZyBmaXhlZDogMTI0NzQ3NywgMTI0NTU5MSwgMTI0OTg3OCBhbmQgb3RoZXJzLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1J1YnldIEltcGxlbWVudCBzdXBwb3J0IGZvciBTV0lHVFlQRSogRElTT1dOIHR5cGVtYXAgKGxpa2UgaW4gUHl0aG9uKSBmb3IKICAgICAgICAgICAgYmV0dGVyIGNvbnRyb2wgb2YgbWVtb3J5IG1hbmFnZW1lbnQsIGVnIHdoZW4gYWRkaW5nIGFuIG9iamVjdCBjcmVhdGVkIGluIFJ1YnkKICAgICAgICAgICAgdG8gYSBDKysgY29udGFpbmVyLiBQYXRjaCAjMTI2MTY5MiBmcm9tIENoYXJsaWUgU2F2YWdlLgoKMDgvMTgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RjbF0gNjQgYml0IHBsYXRmb3JtIGZpeGVzIGZvciB0aGUgdmFyYXJncyBoYW5kbGluZyBpbiBTV0lHX0dldEFyZ3MuIFRoaXMgaXMgYW4KICAgICAgICAgICAgaW1wcm92ZWQgZml4IGZvciBidWcgIzEwMTE2MDQgYXMgc3VnZ2VzdGVkIGJ5IEplcmVteSBMaW4uCgowOC8xOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbVGNsXSBCdWcgIzEyNDA0NjkgLSAlbmV3b2JqZWN0IHN1cHBvcnQgZm9yIFRjbC4gUGF0Y2ggZnJvbSBCb2IgTWFyaW5pZXIuCgowOC8xNi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gQnVnICMxMjU0NDk0IC0gRml4IGZvciBnbG9iYWwgbmFtZXNwYWNlIHBvbGx1dGlvbiBieSBwZXJsIGhlYWRlciBmaWxlcwogICAgICAgICAgICAoYm9vbCBkZWZpbmUpIHByZXZlbnRlZCBTVEwgaGVhZGVycyBmcm9tIGJlaW5nIHVzZWQgb24gc29tZSBzeXN0ZW1zLCBlZwogICAgICAgICAgICBXaW5kb3dzIHdpdGggVmlzdWFsIFN0dWRpby4KCjA4LzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBCdWcgIzEyNDA5MzcgLSBSZWRlZmluaXRpb24gb2YgX19pbnQ2NCB0eXBlZGVmIGZvciBJbnRlbCBjb21waWxlcnMuCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBCdWcgIzEyNTE4MzIgLSAgQysrIHRlbXBsYXRlIG1heSBnZW5lcmF0ZSBpbnZhbGlkIFhNTCBmaWxlCgowOC8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbTHVhXSBTdXBwb3J0IGFkZGVkIGZvciBMdWEuIFBhdGNoICMxMjQyNzcyIGZyb20gTWFyayBHb3NzYWdlLgogICAgICAgICAgICBJdCBzdXBwb3J0cyBtb3N0IEMvQysrIGZlYXR1cmVzIChmdW5jdGlvbnMsIHN0cnVjdCwgY2xhc3NlcywgYXJyYXlzLCBwb2ludGVycywKICAgICAgICAgICAgZXhjZXB0aW9ucyksIGFzIHdlbGwgYXMgbG90cyBvZiBkb2N1bWVudGF0aW9uIGFuZCBhIGZldyB0ZXN0IGNhc2VzICYgZXhhbXBsZXMuCgowOC8xNC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbWG1sXSBGaXggaW5jb3JyZWN0IHhtbCBlc2NhcGluZyBpbiBiYXNlIGNsYXNzIG5hbWUgd2hlbiBiYXNlIGNsYXNzIGlzIGEgdGVtcGxhdGUuCgowOC8xMy8yMDA1OiBlZnV6enlvbmUKCSAgICBbQ0xJU1BdIEFkZGVkIHN1cHBvcnQgZm9yIGhhbmRsaW5nIGVudW1zLiBEb2VzIG5vdCBhZGRzIHRoZSByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbgoJICAgIHRvIHRoZSBmdW5jdGlvbiBkZWZpbml0aW9uLCBpZiBhIGZ1bmN0aW9uIHJldHVybnMgdm9pZC4KCjA4LzA5LzIwMDU6IG1rb2VwcGUKCSAgICBOZXcgbGFuZ3VhZ2UgbW9kdWxlLCBDb21tb24gTGlzcCB3aXRoIFVGRkksIGZyb20gVXR6LVV3ZSBIYXVzLgoKMDgvMDkvMjAwNTogbWtvZXBwZQoJICAgIEZpeCB0aGUgTGlzcCBzLWV4cHJlc3Npb24gb3V0cHV0IG1vZHVsZTsgaXQgbm8gbG9uZ2VyIGNvbXBsYWlucyBhYm91dCAidW5rbm93biB0YXJnZXRzIi4KCjA3LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgdG8gU1RMIHdyYXBwZXJzIHNvIHRoYXQgaXQgaXMgcG9zc2libGUgZm9yIGEgdXNlcidzICVleGNlcHRpb24gZGlyZWN0aXZlCiAgICAgICAgICAgIHRvIGJlIGFwcGxpZWQgdG8gdGhlIFNUTCB3cmFwcGVyIG1ldGhvZHMuIFByZXZpb3VzbHkgdGhlIGZvbGxvd2luZyBnbG9iYWwgJWV4Y2VwdGlvbgogICAgICAgICAgICBkaXJlY3RpdmUgd291bGQgbm90IGJlIHVzZWQgb24gdGhlIHdyYXBwZXIgbWV0aG9kczoKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsgCiAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBoYW5kbGUgdW5jYXVnaHQgZXhjZXB0aW9ucwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIGhhcyBiZWVuIGltcGxlbWVudGVkIGJ5IHJlcGxhY2luZyAlZXhjZXB0aW9uIGRpcmVjdGl2ZXMgZm9yIHNwZWNpZmljIFNUTCB3cmFwcGVyCiAgICAgICAgICAgIG1ldGhvZHMgd2l0aCBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBkZWNsYXJlZCBvbiB0aGUgd3JhcHBlciBtZXRob2RzLiB0aHJvd3MgdHlwZW1hcHMKICAgICAgICAgICAgYXJlIG5vdyBzdXBwbGllZCBmb3IgaGFuZGxpbmcgdGhlIFNUTCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbi4gVGhlc2UgY2FuIGFsc28gYmUgZWFzaWx5CiAgICAgICAgICAgIG92ZXJyaWRkZW4sIGZvciBleGFtcGxlIHRoZSBzdGQ6Om91dF9vZl9yYW5nZSBleGNlcHRpb24sIHdoaWNoIGlzIHVzZWQgYSBsb3QgaW4gdGhlIFNUTAogICAgICAgICAgICB3cmFwcGVycywgY2FuIGJlIGN1c3RvbWlzZWQgZWFzaWx5OgoKICAgICAgICAgICAgICAlaW5jbHVkZSAic3RkX3ZlY3Rvci5pIgogICAgICAgICAgICAgICV0eXBlbWFwKHRocm93cykgc3RkOjpvdXRfb2ZfcmFuZ2UgewogICAgICAgICAgICAgICAgLy8gY3VzdG9tIGV4Y2VwdGlvbiBoYW5kbGVyCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV0ZW1wbGF0ZShWZWN0SW50KSBzdGQ6OnZlY3RvcjxpbnQ+OwoKMDcvMjIvMjAwNTogZWZ1enp5b25lCiAgICAgICAgICAgIFtDTElTUF0gVGhlIGNsaXNwIG1vZHVsZSBmb3IgU1dJRzoKICAgICAgICAgICAgICAtIEl0IGNhbiBvbmx5IGhhbmRsZSBDLCBjbGlzcCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydHMgZmZpIGJpbmRpbmdzIHRvIEMrKy4KICAgICAgICAgICAgICAtIEl0IGhhcyB0d28gb3B0aW9ucywgKGEpIC1leHRlcm4tYWxsIHRoaXMgd2lsbCBnZW5lcmF0ZSB3cmFwcGVycyBmb3IgYWxsIGZ1bmN0aW9ucwogICAgICAgIAlhbmQgdmFyaWFibGVzdGlvbnMsIChiKSAtZ2VuZXJhdGUtdHlwZWRlZiB0aGlzIHdpbGwgZ2VuZXJhdGUgd3JhcHBlcnMgImRlZi1jLXR5cGUiCgkgICAgICAgIHdyYXBwZXJzIGZvciB0eXBlZGVmcwoJICAgICAgLSBDYW4gaGFuZGxlIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywgY29tcGxleCB0eXBlcyBzdWNoIGFzIG4tZGltZW5zaW9uYWwgYXJyYXlzIG9mIAoJIAlwb2ludGVycyBvZiBkZXB0aCBkCgkgICAgICAtIEdlbmVyYXRlcyB3cmFwcGVycyBmb3IgY29uc3RhbnRzIGFzIHdlbGwgYXMgdmFyaWFibGVzCgkgICAgICAtIENvcnJlY3RseSBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdGhlIGRlY2xhcmF0aW9uIG9mIHZhcmlhYmxlcyBpbiBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMKCSAgICAgIC0gQ3JlYXRlcyBhIGRlZnBhY2thZ2UgImRlY2xhcmF0aW9uIiB3aXRoIHRoZSBtb2R1bGUgbmFtZSBhcyB0aGUgcGFja2FnZSBuYW1lLCB0aGUgY3JlYXRlZCAKCSAgICAJcGFja2FnZSBleHBvcnRzIGJvdGggZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMKCSAgICAgIC0gdHJpZXMgdG8gZ3Vlc3Mgd2hlbiBzaG91bGQgYSBwb2ludGVyIHZhcmlhYmxlIGJlIGRlY2xhcmVkIGFzIGMtcHRyIG9yIGMtcG9pbnRlcgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDaGFuZ2VzIHRvIHN1cHBvcnQgQyMgc3RydWN0cyByZXR1cm5lZCBieSB2YWx1ZS4gVGhlIGNoYW5nZXMgcmVxdWlyZWQgYXJlOgogICAgICAgICAgICAgIC0gVXNpbmcgYW4gb3B0aW9uYWwgJ251bGwnIGF0dHJpYnV0ZSBpbiB0aGUgb3V0IHR5cGVtYXAuIElmIHRoaXMgYXR0cmlidXRlIGlzIHNwZWNpZmllZCwKICAgICAgICAgICAgICAgIHRoZW4gaXQgaXMgdXNlZCBmb3IgdGhlICRudWxsIHNwZWNpYWwgdmFyaWFibGUgc3Vic3RpdHV0aW9uLgogICAgICAgICAgICAgIC0gVGhlIGN0eXBlIHVzZWQgaW4gdGhlIEMvQysrIHdyYXBwZXJzIGlzIG5vIGxvbmdlciBpbml0aWFsaXNlZCB0byAwIG9uIGRlY2xhcmF0aW9uLgogICAgICAgICAgICBCb3RoIG9mIHRoZXNlIGNoYW5nZXMgZml4IHRoZSBzaXR1YXRpb25zIHdoZXJlIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gYXNzaWduIDAgdG8gdGhlCiAgICAgICAgICAgIHJldHVybmVkIHN0cnVjdC4gTWFyc2hhbGxpbmcgc3RydWN0cyBhcyB2YWx1ZSB0eXBlcyBzdGlsbCByZXF1aXJlcyB1c2VyIGRlZmluZWQgdHlwZW1hcHMuCiAgICAgICAgICAgIFNlZSBkb2N1bWVudGF0aW9uIGZvciBhbiBleGFtcGxlLgoKMDcvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjLCBKYXZhXSBGaXggU1dJR19leGNlcHRpb24gdXNhZ2UgdG8gd29yayB3aXRoIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQgZW1wdHkgbWFjcm8KICAgICAgICAgICAgYXJndW1lbnRzLiBVbmZvcnR1bmF0ZWx5IHRoaXMgZml4IHdpbGwgc3RvcCB1c2FnZSBvZiBTV0lHX2V4Y2VwdGlvbiBiZWluZyB1c2VkIHdpdGhpbiB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IHVzZSAiIiBvciAleyAlfSBkZWxpbWl0ZXJzLCBidXQgY29udGludWVzIHRvIHdvcmsgd2l0aCB0eXBlbWFwcyB1c2luZyB7fSBkZWxpbWl0ZXJzLgogICAgICAgICAgICBQbGVhc2UgdXNlIHRoZSBTV0lHX0NTaGFycFNldFBlbmRpbmdFeGNlcHRpb25Bcmd1bWVudCBvciBTV0lHX0phdmFUaHJvd0V4Y2VwdGlvbiBtZXRob2RzIGluc3RlYWQKICAgICAgICAgICAgYXMgU1dJR19leGNlcHRpb24gaXMgcmVhbGx5IGludGVuZGVkIGFzIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFjcm8gZm9yIHRoZSBTV0lHIGxpYnJhcnkgd3JpdGVycy4KCjA3LzE2LzIwMDU6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHNwZWNpZmljIGZvcmVpZ24gdHlwZXMgcmF0aGVyIHRoYW4gKCogOnZvaWQpLiAKCSAgICBVc2UgKnN3aWctaWRlbnRpZmllci1jb252ZXJ0ZXIqLgoKMDYvMjcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRnVuY3Rpb25zIGRlY2xhcmVkIGFzICdleHRlcm4nIG5vIGxvbmdlciBoYXZlIGFuIGFkZGl0aW9uYWwgZnVuY3Rpb24gZGVjbGFyYXRpb24gYWRkZWQgdG8gdGhlIAogICAgICAgICAgICB3cmFwcGVyIGZpbGVzLiBUaGVyZSBhcmUgc29tZSBjYXNlcyB3aGVyZSBTV0lHIGRvZXMgbm90IGdldCB0aGlzIHJpZ2h0LCBlZyBidWcgIzEyMDU4NTkgKGV4dGVybgogICAgICAgICAgICBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyBkZWNsYXJlZCBpbiBhIG5hbWVzcGFjZSkuIEFsc28gU1dJRyBjYW5ub3QgZ2V0IG5vbi1zdGFuZGFyZAogICAgICAgICAgICBjYWxsaW5nIGNvbnZlbnRpb25zIGNvcnJlY3QsIGVnIFdpbmRvd3MgY2FsbGluZyBjb252ZW50aW9ucyBhcmUgdXN1YWxseSBoYW5kbGVkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVCBfX2RlY2xzcGVjKGRsbGltcG9ydCkKICAgICAgICAgICAgICAjZGVmaW5lIFNURENBTEwgX19zdGRjYWxsCiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAjZGVmaW5lIERMTElNUE9SVAogICAgICAgICAgICAgICNkZWZpbmUgU1REQ0FMTAogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBETExJTVBPUlQgZXh0ZXJuIFNURENBTEwgdm9pZCBmdW5jdGlvbihpbnQpOwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBTV0lHIGluY29ycmVjdGx5IGdlbmVyYXRlczoKCiAgICAgICAgICAgIGV4dGVybiB2b2lkIGZ1bmN0aW9uKGludCk7CgogICAgICAgICAgICBUbyB3aGljaCB0aGVyZSBpcyBubyBzb2x1dGlvbiBhcyBTV0lHIGRvZXNuJ3QgaGFuZGxlIG5vbi1zdGFuZGFyZCBjYWxsaW5nIGNvbnZlbnRpb25zLiBUaGUgZXh0cmEKICAgICAgICAgICAgJ2V4dGVybicgZnVuY3Rpb24gdGhhdCBTV0lHIGdlbmVyYXRlcyBpcyBzdXBlcmZsdW91cyB1bmxlc3MgYSB1c2VyIGhhcyBmb3Jnb3R0ZW4gdG8gYWRkIHRoZSBmdW5jdGlvbgogICAgICAgICAgICBkZWNsYXJhdGlvbiBpbnRvIHRoZSB3cmFwcGVycy4KCiAgICAgICAgICAgIFRoZSAtbm9leHRlcm4gY29tbWFuZGxpbmUgYXJndW1lbnQgaXMgbm93IHJlZHVuZGFudCBhbmQgYSBuZXcgY29tbWFuZGxpbmUgYXJndW1lbnQgLWFkZGV4dGVybiBjYW4KICAgICAgICAgICAgYmUgdXNlZCB0byBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91ci4gVGhpcyBzaG91bGRuJ3QgYmUgbmVjZXNzYXJ5IHVubGVzcyB0aGUgaGVhZGVyIGZpbGUKICAgICAgICAgICAgY29udGFpbmluZyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb24gd2FzIGluYWR2ZXJ0ZW50bHkgbm90IGFkZGVkIHRvIHRoZSB3cmFwcGVycy4gVG8gZml4IHRoaXMKICAgICAgICAgICAgYWRkIHRoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvIHlvdXIgd3JhcHBlcnMsIEZvciBleGFtcGxlLCByZXBsYWNlOgoKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKCiAgICAgICAgICAgIHdpdGg6CgogICAgICAgICAgICAgICVpbmxpbmUgJXsKICAgICAgICAgICAgICBleHRlcm4gdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowNi8yMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmEsIE1vZHVsYTMsIE9jYW1sXQogICAgICAgICAgICBUaGUgaW50ZXJtZWRpYXJ5IGZ1bmN0aW9uIG5hbWVzIGhhdmUgYmVlbiBjaGFuZ2VkIHdoZW4gd3JhcHBpbmcgdmFyaWFibGVzIHRvCiAgICAgICAgICAgIG1hdGNoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIHNvIHRoYXQgJWV4dGVuZCBmb3IgYSBtZW1iZXIgdmFyaWFibGUgd29ya3MKICAgICAgICAgICAgdW5pZm9ybWx5IGFjcm9zcyBhbGwgbGFuZ3VhZ2UgbW9kdWxlcywgZWc6CgogICAgICAgICAgICAgICVleHRlbmQgRXh0ZW5kTWUgewogICAgICAgICAgICAgICAgVmFyOwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIEV4dGVuZE1lX1Zhcl9zZXQoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIEV4dGVuZE1lX1Zhcl9nZXQoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIG1ldGhvZHMgaW1wbGVtZW50aW5nIHRoZSBnZXQvc2V0IHVzZWQgdG8gYmU6CgogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICB2b2lkIHNldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKiwgZG91YmxlKSB7Li4ufQogICAgICAgICAgICAgICAgZG91YmxlIGdldF9FeHRlbmRNZV9WYXIoRXh0ZW5kTWUgKikgey4uLn0KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhpcyBhbHNvIGNoYW5nZXMgdGhlIG5hbWUgb2YgdmFyaWFibGUgd3JhcHBlciBmdW5jdGlvbnMgd2hlbiB1c2luZyAtbm9wcm94eS4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIG5hbWVzIGNhbiBiZSBnZW5lcmF0ZWQgd2l0aCB0aGUgLW9sZHZhcm5hbWVzIGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKVmVyc2lvbiAxLjMuMjUgKEp1bmUgMTEsIDIwMDUpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTEvMjAwNjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4IGhhbmRsaW5nIG9mIGFub255bW91cy1lbnVtIHZhcmlhYmxlcy4KCjA2LzEwLzIwMDU6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBmb3IgZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgYXJlIHBhc3NlZCBieQoJICAgIGNvcHktb2YtdmFsdWUuICBGaXggZm9yIGdsb2JhbCAiY29uc3QgY2hhciAqIiB2YXJpYWJsZXMuCgkgICAgRml4IHRlc3RjYXNlcyBhcnJheXNfZGltZW5zaW9ubGVzcywgYXJyYXlzX2dsb2JhbC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3Igd2hlbiBhIGJhc2UgY2xhc3MgZGVmaW5lcyBhIHN5bWJvbCBhcyBhIG1lbWJlciB2YXJpYWJsZSBhbmQgYSBkZXJpdmVkIGNsYXNzIGRlZmluZXMKICAgICAgICAgICAgdGhlIHNhbWUgc3ltYm9sIGFzIGEgbWVtYmVyIG1ldGhvZC4KCjA2LzA4LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIC0gd2hlbiBhIG1ldGhvZCBoYXMgcHJvdGVjdGVkIGFjY2VzcyAKICAgICAgICAgICAgaW4gYmFzZSBhbmQgcHVibGljIGFjY2VzcyBpbiBkZXJpdmVkIGNsYXNzLgoKMDYvMDIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ICMxMDY2MzYzIC0gRm9sbG93IGNvbnZlbnRpb24gb2YgcmVsZWFzZSB0YXJiYWxsIG5hbWUgbWF0Y2hpbmcgZGlyZWN0b3J5IG5hbWUuCgowNi8wMi8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyMsIEphdmFdIEZpeCAjMTIxMTM1MyAtIHR5cGVzYWZlIGVudW1zIChhbmQgSmF2YSBwcm9wZXIgZW51bXMpIHdyYXBwZXJzIHdoZW4gZW51bSB2YWx1ZQogICAgICAgICAgICBpcyBuZWdhdGl2ZS4KCjA1LzI3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1vZGVybmlzZWQgYW5kIHRpZGllZCB1cCBXaW5kb3dzIG1hY3JvcyAtLT4gU1dJR0VYUE9SVCwgU1dJR1NURENBTEwuIFRoZXkgY2FuIGJlIG92ZXJyaWRkZW4KICAgICAgICAgICAgYnkgdXNlcnMgdmlhIC1EIGNvbXBpbGVyIGRpcmVjdGl2ZXMgaWYgbmVlZCBiZS4KCjA1LzI2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgICVjc21ldGhvZG1vZGlmaWVycyBjYW4gYmUgYXBwbGllZCB0byB2YXJpYWJsZXMgYXMgd2VsbCBhcyBtZXRob2RzIG5vdy4KCiAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0ICdwdWJsaWMnIG1vZGlmaWVyIHRoYXQgU1dJRyBnZW5lcmF0ZXMsICVjc21ldGhvZG1vZGlmaWVycyB3aWxsIGFsc28KICAgICAgICAgICAgcmVwbGFjZSB0aGUgdmlydHVhbC9uZXcvb3ZlcnJpZGUgbW9kaWZpZXJzIHRoYXQgU1dJRyB0aGlua3MgaXMgYXBwcm9wcmlhdGUuIFRoaXMgZmVhdHVyZSBpcwogICAgICAgICAgICB1c2VmdWwgZm9yIHNvbWUgb2JzY3VyZSBjYXNlcyB3aGVyZSBTV0lHIG1pZ2h0IGdldCB0aGUgbW9kaWZpZXJzIGluY29ycmVjdCwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZSBhbmQgb3ZlcnJpZGluZyBhIG1ldGhvZCBpbiB0aGUgYmFzZSBjbGFzcy4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNS8yNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGNvbnN0cnVjdG9ycyB0byBzdGQ6OnBhaXIgd3JhcHBlcnMgKHN0ZF9wYWlyLmkpIGZvciBhbGwgbGFuZ3VhZ2VzLgoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBBZGRlZCBzdGQ6OnBhaXIgd3JhcHBlcnMgaW4gc3RkX3BhaXIuaQoKMDUvMjUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgQyMgJ25ldycgYW5kICdvdmVycmlkZScgbW9kaWZpZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIHdoZW4gYSBDKysgY2xhc3MgaW5oZXJpdHMgbWV0aG9kcwogICAgICAgICAgICB2aWEgYSBDKysgJ3VzaW5nJyBkZWNsYXJhdGlvbi4KCjA1LzI1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHByZXZpb3VzbHkgYmVpbmcgaWdub3JlZCBpbiBjbGFzc2VzIHRoYXQgaW5oZXJpdGVkIG1ldGhvZHMKICAgICAgICAgICAgZnJvbSAndXNpbmcnIGRlY2xhcmF0aW9ucywgZWcgY2FsbHMgdG8gRGVyaXZlZDo6YmFyIGJlbG93IHdpbGwgY29udmVydCBDKysgZXhjZXB0aW9ucyBpbnRvCiAgICAgICAgICAgIGEgdGFyZ2V0IGxhbmd1YWdlIGV4Y2VwdGlvbi9lcnJvciwgbGlrZSBpdCBhbHdheXMgaGFzIGRvbmUgZm9yIEJhc2U6OkJhci4KCiAgICAgICAgICAgIGNsYXNzIEJhc2UgewogICAgICAgICAgICAgIHZpcnR1YWwgYmFyKCkgdGhyb3cgKHN0ZDo6c3RyaW5nKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlIHsKICAgICAgICAgICAgICB1c2luZyBCYXNlOjpiYXI7CiAgICAgICAgICAgIH07CgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXhlcyBmb3IgZGV0ZWN0aW5nIHZpcnR1YWwgbWV0aG9kcyBpbiAlZXh0ZW5kIGZvciB0aGUgLWZ2aXJ0dWFsIG9wdGlvbiBhbmQgQyMgb3ZlcnJpZGUgYW5kIG5ldwogICAgICAgICAgICBtZXRob2QgbW9kaWZpZXJzLgoKMDUvMjMvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBUaGUgJ25ldycgbW9kaWZpZXIgaXMgbm93IGdlbmVyYXRlZCBvbiB0aGUgcHJveHkgbWV0aG9kIHdoZW4gYSBtZXRob2QgaW4gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGlzIG5vdCBwb2x5bW9ycGhpYyBhbmQgdGhlIHNhbWUgbWV0aG9kIGV4aXN0cyBpbiB0aGUgZGVyaXZlZCBjbGFzcyAoaWUgaXQgaGlkZXMKICAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MnIG5vbi12aXJ0dWFsIG1ldGhvZCkuCgowNS8yMy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIEZpeGVzIHRvIGRldGVjdGlvbiBvZiBjb3ZhcmlhbnQgcmV0dXJuIHR5cGVzIC0gd2hlbiB0aGUgY2xhc3MgaGllcmFyY2h5IGlzIG1vcmUKICAgICAgICAgICAgdGhhbiAyIGNsYXNzZXMgZGVlcC4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcHMgbW92ZWQgZnJvbSBzdGRfc3RyaW5nLmkgdG8gc3RkX3dzdHJpbmcuaQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBjcmFzaCBpbiBEb2hTdHJzdHIsIGJ1ZyAjMTE5MDkyMQoKMDUvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1RDTF0gRml4IGZvciBtZXRob2RzIHdpdGggc2ltaWxhciBuYW1lcyB3aGVuIHNob3dpbmcgbGlzdCBvZiBuYW1lcyBvbiBlcnJvciAtIGJ1ZyAjMTE5MTgyOC4KICAgICAgICAgICAgUGF0Y2ggZnJvbSBKZXJvZW4gRG9iYmVsYWVyZS4KCjA1LzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtUQ0xdIGxvbmcgbG9uZyBvdmVybG9hZGluZyBmaXggLSBidWcgIzExOTE4MzUsIHBhdGNoIGZyb20gSmVyb2VuIERvYmJlbGFlcmUuCgowNS8yMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBGaXggYnVnICMxMTk2NzU1IHRvIHJlbW92ZSBkZWJ1ZyBmcm9tIHN3aWd0Y2w4LnN3Zy4KCjA1LzE5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgLWZ2aXJ0dWFsIG9wdGlvbl0gRml4IGZvciB0aGUgb3ZlcnJpZGUga2V5IG5vdCBiZWluZyBnZW5lcmF0ZWQgaW4gdGhlIGRlcml2ZWQgY2xhc3Mgd2hlbiBhCiAgICAgICAgICAgIHZpcnR1YWwgbWV0aG9kJ3MgcmV0dXJuIHR5cGUgd2FzIGEgdHlwZWRlZiBpbiBlaXRoZXIgdGhlIGJhc2Ugb3IgZGVyaXZlZCBjbGFzcy4gQWxzbyBlbnN1cmVzIHRoZQogICAgICAgICAgICBtZXRob2QgaXMgZWxpbWluYXRlZCB3aGVuIHVzaW5nIHRoZSAtZnZpcnR1YWwgb3B0aW9uLiBGb3IgZXhhbXBsZSwgRGVyaXZlZC5tZXRob2Qgbm93IGhhcyB0aGUgQyMKICAgICAgICAgICAgb3ZlcnJpZGUga2V5d29yZCBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHR5cGVkZWYgaW50KiBJbnRlZ2VyUHRyOwoKICAgICAgICAgICAgICBzdHJ1Y3QgQmFzZSB7CiAgICAgICAgICAgICAgICB2aXJ0dWFsIEludGVnZXJQdHIgbWV0aG9kKCk7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgIGludCAqIG1ldGhvZCgpIGNvbnN0OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBbQyNdIEZpeCBmb3IgdGhlIG92ZXJyaWRlIGtleSBiZWluZyBpbmNvcnJlY3RseSBnZW5lcmF0ZWQgZm9yIHZpcnR1YWwgbWV0aG9kcyB3aGVuIGEgYmFzZSBjbGFzcwogICAgICAgICAgICBpcyBpZ25vcmVkIHdpdGggJWlnbm9yZS4KCjA1LzEzLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byByZW1vdmUgImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciB3aWxsIGJyZWFrIHN0cmljdC1hbGlhc2luZyBydWxlcyIKICAgICAgICAgICAgd2FybmluZ3MgaW4gQyB3cmFwcGVycyB3aGVuIGNvbXBpbGluZyBDIGNvZGUgd2l0aCAnZ2NjIC1XYWxsIC1mc3RyaWN0LWFsaWFzaW5nJy4gUGF0Y2ggZnJvbQogICAgICAgICAgICBNaWNoYWVsIENhaGlsbC4gVGhpcyBtb2RpZmllcyBtYW55IG9mIHRoZSBjYXN0cyBzbGlnaHRseSwgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBhcmcxID0gKihEQl9FTlYgKiopJmphcmcxOwogICAgICAgICAgICB0bwogICAgICAgICAgICAgIGFyZzEgPSAqKERCX0VOViAqKikodm9pZCAqKSZqYXJnMTsKCjA1LzEyLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gU3VwcG9ydCBmb3IgQyMgYXR0cmlidXRlcy4gQyMgYXR0cmlidXRlcyBjYW4gYmUgZ2VuZXJhdGVkOgogICAgICAgICAgICAxKSBPbiBhIEMvQysrIHR5cGUgYmFzaXMgYnkgc3BlY2lmeWluZyBhbiBpbmF0dHJpYnV0ZXMgYW5kL29yIG91dGF0dHJpYnV0ZXMgdHlwZW1hcCBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgaW4gdGhlIGltdHlwZSBvciBjc3R5cGUgdHlwZW1hcHMgKGZvciBDIyByZXR1cm4gdHlwZSBvciBDIyBwYXJhbWV0ZXIgdHlwZSBhdHRyaWJ1dGVzKS4KICAgICAgICAgICAgMikgT24gYSB3cmFwcGVkIG1ldGhvZCBvciB2YXJpYWJsZSBieSBzcGVjaWZ5aW5nIGEgY3NhdHRyaWJ1dGVzIGZlYXR1cmUgKCVmZWF0dXJlKS4KICAgICAgICAgICAgMykgT24gYSB3cmFwcGVkIHByb3h5IGNsYXNzIG9yIGVudW0gYnkgc3BlY2lmeWluZyBhIGNzYXR0cmlidXRlcyB0eXBlbWFwLgoKICAgICAgICAgICAgRXhhbXBsZXMgYXJlIGluIHRoZSBDIyBkb2N1bWVudGF0aW9uIChDU2hhcnAuaHRtbCkuCgowNC8yOS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBOZXcgY29uZmlndXJlIG9wdGlvbiB0byB0dXJuIG9mZiB0aGUgZGVmYXVsdCBtYXhpbXVtIGNvbXBpbGVyIHdhcm5pbmcgYXMKICAgICAgICAgICAgdGhleSBjb3VsZG4ndCBiZSByZW1vdmVkIGV2ZW4gd2hlbiBvdmVycmlkaW5nIENGTEFHUyBhbmQgQ1hYRkxBR1Mgd2l0aCBjb25maWd1cmUKICAgICAgICAgICAgKC4vY29uZmlndXJlIENGTEFHUz0gQ1hYRkxBR1M9KS4gVG8gdHVybiB0aGUgbWF4aW11bSB3YXJuaW5ncyBvZmYsIHJ1bjogIAoKICAgICAgICAgICAgICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQtbWF4aW11bS1jb21waWxlLXdhcm5pbmdzCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIFNjb3R0IE1pY2hlbCB3aGljaCByZXdvcmtzIHRoZSBKYXZhIGNvbnN0cnVjdG9yIGFuZCBmaW5hbGl6ZS9kZXN0cnVjdG9yIHR5cGVtYXBzLAogICAgICAgICAgICBmb3IgZGlyZWN0b3JzIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG92ZXJhbGwgSmF2YSB0eXBlbWFwcy4gQWRkZWQgdGhlIGRpcmVjdG9yX3Rha2UgYW5kIAogICAgICAgICAgICBkaXJlY3Rvcl9yZWxlYXNlIHR5cGVtYXBzIHRvIGVtdWxhdGUgb3RoZXIgbW9kdWxlcycgX19kaXNvd25fXyBmdW5jdGlvbmFsaXR5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgRElSRUNUT1JTICoqKgoKMDQvMjgvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBGaXhlZCBwcm9ibGVtcyBkdWUgdG8gdGhlIG92ZXIgZWFnZXIgZ2FyYmFnZSBjb2xsZWN0b3IuIE9jY2FzaW9uYWxseSB0aGUKICAgICAgICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd291bGQgY29sbGVjdCBhIEMjIHByb3h5IGNsYXNzIGluc3RhbmNlIHdoaWxlIGl0IHdhcyBiZWluZyB1c2VkCiAgICAgICAgICAgIGluIHVubWFuYWdlZCBjb2RlIGlmIHRoZSBvYmplY3Qgd2FzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byBhIHdyYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSB0aGlzIGNhdXNlZCBoYXZvYyBhcyB0aGUgQyMgcHJveHkgY2xhc3MgY2FsbHMgdGhlIEMrKyBkZXN0cnVjdG9yCiAgICAgICAgICAgIHdoZW4gaXQgaXMgY29sbGVjdGVkLiBQcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcyBub3cgdXNlIGEgSGFuZGxlUmVmLAogICAgICAgICAgICB3aGljaCBob2xkcyBhbiBJbnRQdHIsIGluc3RlYWQgb2YgYSBwbGFpbiBJbnRQdHIgdG8gbWFyc2hhbCB0aGUgQysrIHBvaW50ZXIgdG8gdW5tYW5hZ2VkCiAgICAgICAgICAgIGNvZGUuIFRoZXJlIGRvZXNuJ3QgYXBwZWFyIHRvIGJlIGFueSBwZXJmb3JtYW5jZSBkZWdyYWRhdGlvbiBhcyBhIHJlc3VsdCBvZiB0aGlzCiAgICAgICAgICAgIG1vZGlmaWNhdGlvbi4KCiAgICAgICAgICAgIFRoZSBjaGFuZ2VzIGFyZSBpbiB0aGUgcHJveHkgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzLiBUaGUgc3dpZ0NQdHIgaXMgbm93IG9mIHR5cGUgSGFuZGxlUmVmCiAgICAgICAgICAgIGluc3RlYWQgb2YgSW50UHRyIGFuZCBjb25zZXF1ZW50bHkgdGhlIGdldENQdHIgbWV0aG9kIHJldHVybiB0eXBlIGhhcyBhbHNvIGNoYW5nZWQuIFRoZSBuZXQKICAgICAgICAgICAgZWZmZWN0IGlzIHRoYXQgYW55IGN1c3RvbSB3cml0dGVuIHR5cGVtYXBzIG1pZ2h0IGhhdmUgdG8gYmUgbW9kaWZpZWQgdG8gc3VpdGUuIEFmZmVjdGVkIHVzZXJzCiAgICAgICAgICAgIHNob3VsZCBub3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIG5ldyAnb3V0JyBhdHRyaWJ1dGUgaW4gdGhlIGltdHlwZSB0eXBlbWFwIGFzIHRoZQogICAgICAgICAgICBpbnB1dCB0eXBlIGlzIG5vdyBhIEhhbmRsZVJlZiBhbmQgdGhlIG91dHB1dCB0eXBlIGlzIHN0aWxsIGFuIEludFB0ci4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8yOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFN1cHBvcnQgZm9yIGFzeW1tZXRyaWMgdHlwZSBtYXJzaGFsbGluZyBhZGRlZC4gU29tZXRpbWVzIHRoZSBvdXRwdXQgdHlwZSBuZWVkcyB0byBiZQogICAgICAgICAgICBkaWZmZXJlbnQgdG8gdGhlIGlucHV0IHR5cGUuIFN1cHBvcnQgZm9yIHRoaXMgY29tZXMgaW4gdGhlIGZvcm0gb2YgYSBuZXcgb3B0aW9uYWwgJ291dCcKICAgICAgICAgICAgYXR0cmlidXRlIGZvciB0aGUgY3R5cGUsIGltdHlwZSBhbmQgY3N0eXBlIHR5cGVtYXBzLiBJZiB0aGlzIHR5cGVtYXAgYXR0cmlidXRlIGlzIG5vdAogICAgICAgICAgICBzcGVjaWZpZWQsIHRoZW4gdGhlIHR5cGUgdXNlZCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGlzIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcCwgYXMgaGFzIGFsd2F5cyBwcmV2aW91c2x5IGJlZW4gdGhlIGNhc2UuIElmIHRoaXMgdHlwZW1hcCBhdHRyaWJ1dGUgaXMgc3BlY2lmaWVkLAogICAgICAgICAgICB0aGVuIHRoZSB0eXBlIHNwZWNpZmllZCBpbiB0aGUgYXR0cmlidXRlIGlzIHVzZWQgZm9yIG91dHB1dCB0eXBlcyBhbmQgdGhlIHR5cGUgc3BlY2lmaWVkCiAgICAgICAgICAgIGluIHRoZSB0eXBlbWFwIGl0c2VsZiBpcyB1c2VkIGZvciB0aGUgaW5wdXQgdHlwZS4gQW4gb3V0cHV0IHR5cGUgaXMgYSByZXR1cm4gdmFsdWUgZnJvbQogICAgICAgICAgICBhIHdyYXBwZWQgbWV0aG9kIG9yIHdyYXBwZWQgY29uc3RhbnQgYW5kIGFuIGlucHV0IHR5cGUgaXMgYSBwYXJhbWV0ZXIgaW4gYSB3cmFwcGVkIG1ldGhvZC4KCiAgICAgICAgICAgIEFuIGV4YW1wbGUgc2hvd3MgdGhhdCBjaGFyICogY291bGQgYmUgbWFyc2hhbGxlZCBpbiBkaWZmZXJlbnQgd2F5cywgCgogICAgICAgICAgICAgICV0eXBlbWFwKGltdHlwZSwgb3V0PSJJbnRQdHIiKSBjaGFyICogInN0cmluZyIKICAgICAgICAgICAgICBjaGFyICogZnVuY3Rpb24oY2hhciAqKTsKCiAgICAgICAgICAgIFRoZSBvdXRwdXQgdHlwZSBpcyB0aHVzIEludFB0ciBhbmQgdGhlIGlucHV0IHR5cGUgaXMgc3RyaW5nLiBUaGUgcmVzdWx0aW5nIGludGVybWVkaWFyeSBDIyBjb2RlIGlzOgoKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiBJbnRQdHIgZnVuY3Rpb24oc3RyaW5nIGphcmcxKTsKCjA0LzIyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEZpeCBnZW5lcmF0aW9uIG9mICJkZWZpbmUtbWV0aG9kIiBmb3IgbWV0aG9kcyBvZgoJICAgIGNsYXNzZXMgd2l0aCBhIGNvbnN0cnVjdG9yLiAgUmVwb3J0ZWQgYnkgTHVpZ2kgQmFsbGFiaW8uCgowNC8xNS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKCSAgICBbQ2hpY2tlbl0KCSAgICBGb3Igd3JhcHBlZCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbXVsdGlwbGUgdmFsdWVzICh1c2luZyBhcmdvdXQpLAoJICAgIFNXSUcgQ0hJQ0tFTiBub3cgcmV0dXJucyB0aGVtIGFzIG11bHRpcGxlIHZhbHVlcyBpbnN0ZWFkIG9mIGFzCgkgICAgYSBsaXN0LiAgVGhleSBjYW4gdGhlbiBiZSBhY2Nlc3NlZCB1c2luZyAoY2FsbC13aXRoLXZhbHVlcykuCgowNC8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dCiAgICAgICAgICAgICsgQWRkZWQgYSB3aG9sZSBidW5jaCBvZiBuZXcgX3J1bm1lIHNjcmlwdHMgaW50byB0aGUgY2hpY2tlbiB0ZXN0CiAgICAgICAgICAgIHN1aXRlLiAgQWxzbyBmaXggc29tZSBidWdzIHRoZXNlIG5ldyBzY3JpcHRzIHR1cm5lZCB1cC4KCiAgICAgICAgICAgICsgQWRkZWQgb3B0aW1pemF0aW9uIHdoZW4gcmV0dXJuaW5nIGEgd3JhcHBlZCBwcm94eSBjbGFzcy4gIEJlZm9yZSwKICAgICAgICAgICAgYSBtaW5vciBnYXJiYWdlIGNvbGxlY3Rpb24gd2FzIGludm9rZWQgZXZlcnkgdGltZSBhIGZ1bmN0aW9uIHJldHVybmVkLgoKCSAgICArIEFsbCB0aGUgY2hpY2tlbiBFeGFtcGxlcyBzaG91bGQgbm93IHJ1biBjb3JyZWN0bHkKCjA0LzE0LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTW9yZSBmaXhlcyBmb3IgdHlwZW1hcCBtYXRjaGluZyB3aGVuIHdyYXBwaW5nIHZhcmlhYmxlcywgaW4gcGFydGljdWxhcgogICAgICAgICAgICBzdGQ6OnN0cmluZywgc28gdGhhdCBzdGQ6OnN0cmluZyB2YXJpYWJsZXMgY2FuIGJlIGVhc2lseSBtYXJzaGFsbGVkIHdpdGgKICAgICAgICAgICAgYSBDIyBzdHJpbmcgcHJvcGVydHkgdXNpbmc6CgogICAgICAgICAgICAgICVpbmNsdWRlICJzdGRfc3RyaW5nLmkiCiAgICAgICAgICAgICAgJWFwcGx5IGNvbnN0IHN0ZDo6c3RyaW5nICYgeyBzdGQ6OnN0cmluZyAqdmFyaWFibGVfbmFtZSB9OwogICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhcmlhYmxlX25hbWU7CgogICAgICAgICAgICAoUmVjYWxsIHRoYXQgYWxsIGNsYXNzIHZhcmlhYmxlcyBhcmUgd3JhcHBlZCB1c2luZyBwb2ludGVycykKCjA0LzA1LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgQWRkZWQgRXhhbXBsZXMvY2hpY2tlbi9lZ2csIGFuIGV4YW1wbGUgb24gaG93IHRvIGJ1aWxkIGEgY2hpY2tlbgoJICAgICAgZXh0ZW5zaW9uIGxpYnJhcnkgaW4gdGhlIGZvcm0gb2YgYW4gZWdnLiAgQWxzbyB1cGRhdGVkIHRoZQoJICAgICAgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZGlmZmVyZW50IGxpbmtpbmcgb3B0aW9ucy4KCgkgICAgKyBjaGlja2VuIHRlc3Qtc3VpdGUgbm93IGhhcyBzdXBwb3J0IHRvIGNoZWNrIFNXSUcgd2l0aCB0aGUgLXByb3h5CgkgICAgICBhcmd1bWVudCBpZiB0aGVyZSBleGlzdHMgYSBfcHJveHlfcnVubWUuc3MgZmlsZS4KCgkgICAgKyBNb3JlIGZpeGVzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucyBhbmQgLXByb3h5CgowMy8zMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBUdXJuZWQgb24gZXh0cmEgdGVtcGxhdGUgZmVhdHVyZXMgZm9yIGFsbCBsYW5ndWFnZXMgd2hpY2ggd2VyZQogICAgICAgICAgICBwcmV2aW91c2x5IG9ubHkgYXZhaWxhYmxlIHRvIFB5dGhvbi4KCiAgICAgICAgICAgIFRoaXMgZW5hYmxlcyB0eXBlbWFwcyBkZWZpbmVkIHdpdGhpbiBhIHRlbXBsYXRlZCBjbGFzcyB0byBiZSB1c2VkIGFzCiAgICAgICAgICAgIGV4cGVjdGVkLiBSZXF1aXJlcyAldGVtcGxhdGUgb24gdGhlIHRlbXBsYXRlZCBjbGFzcywgJXRlbXBsYXRlKCkgd2lsbAogICAgICAgICAgICBhbHNvIHBpY2sgdXAgdGhlIHR5cGVtYXBzLiBFeGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb28gImluIHR5cGVtYXAgZm9yIEZvbzxUPiAiCiAgICAgICAgICAgICAgICBvcgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIEZvbzxUPiAiaW4gdHlwZW1hcCBmb3IgRm9vPFQ+ICIKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIAogICAgICAgICAgICAgICV0ZW1wbGF0ZShGb29faSkgRm9vPGludD47CiAgICAgICAgICAgICAgJXRlbXBsYXRlKCkgRm9vPGRvdWJsZT47CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIHdpbGwgZ2VuZXJhdGUgdGhlIHByb3BlciAnaW4nIHR5cGVtYXBzIHdoZXJldmVyIEZvbzxpbnQ+IGFuZCBGb288ZG91YmxlPgogICAgICAgICAgICBhcmUgdXNlZC4KCjAzLzMwLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbTXpTY2hlbWVdIFBhdGNoIGZyb20gSGFucyBPZXN0ZXJob2x0IGZvciBzdXBwb3J0aW5nIE16U2NoZW1lIDMweC4KCjAzLzI5LzIwMDU6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXQoJICAgICsgUmVhbGxvdyBvbGRlciB2ZXJzaW9ucyBvZiBjaGlja2VuICgxLjQwIHRvIDEuODkpIGJ5IHBhc3NpbmcgLW5vY29sbGVjdGlvbgoJICAgICAgYXJndW1lbnQgdG8gU1dJRwoJICAgICsgJWltcG9ydCBub3cgd29ya3MgY29ycmVjdGx5IHdpdGggdGlueWNsb3MuICAoZGVjbGFyZSAodXNlcyAuLi4pKSB3aWxsIGJlCgkgICAgICBleHBvcnRlZCBjb3JyZWN0bHkuCgkgICAgKyBUaW55Q0xPUyBwcm94eSBjbGFzc2VzIG5vdyB3b3JrIGNvcnJlY3RseSB3aXRoIG92ZXJsb2FkZWQgZnVuY3Rpb25zCgkgICAgICBhbmQgY29uc3RydWN0b3JzLgoKMDMvMjkvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3Rvcm91dCB0eXBlbWFwcy4gSmF2YSBkaXJlY3RvcnMKICAgICAgICAgICAgcmVxdWlyZSB0aGUgZGlyZWN0b3JvdXQgdHlwZW1hcHMgbGlrZSB0aGUgb3RoZXIgbGFuZ3VhZ2VzIG5vdy4gVGhlIG5ldwogICAgICAgICAgICB0eXBlbWFwcyBwcm92aWRlIGZpeGVzIGZvciBtZXRob2RzIHdoZXJlIHRoZSByZXR1cm4gdHlwZSBpcyByZXR1cm5lZAogICAgICAgICAgICBieSByZWZlcmVuY2UgKHRoaXMgY2Fubm90IGF1dG9tYXRpY2FsbHkgYmUgbWFkZSB0aHJlYWQgc2FmZSB0aG91Z2gpLgoKMDMvMjIvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRW51bSBjYXN0aW5nIGZpeGVzLiBWaXN1YWwgQysrIGRpZG4ndCBsaWtlIHRoZSBDIHR5cGUgY2FzdGluZyBTV0lHIHByb2R1Y2VkCiAgICAgICAgICAgIHdoZW4gd3JhcHBpbmcgQysrIGVudW0gcmVmZXJlbmNlcywgYXMgcmVwb3J0ZWQgYnkgQWRtaXJlIEthbmRhd2FzdmlrYS4KCjAzLzIxLzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBTRiAjMTEyNDQ5MC4gRml4IFBlcmwgbWFjcm8gY2xhc2hlcyB3aGVuIHVzaW5nIFZpc3VhbCBTdHVkaW8ncyBTVEwgc3RyaW5nLAogICAgICAgICAgICBzbyBub3cgcHJvamVjdHMgY2FuICNpbmNsdWRlIDxzdHJpbmc+LgoKMDMvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgRml4ZWQgJXZhcmFyZ3Mgd2hpY2ggZ290IGJyb2tlbiB3aXRoIHRoZSByZWNlbnQgZGVmYXVsdCBhcmd1bWVudCBjaGFuZ2VzLgogICAgICAgICAgICBBbHNvIHdvcmtzIGZvciBKYXZhIGFuZCBDIyBmb3IgdGhlIGZpcnN0IHRpbWUgbm93LgoKMDMvMTcvMjAwNTogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDaGlja2VuXSAKCSAgICArIEZpeCBhIHdob2xlIGJ1bmNoIG9mIGJ1Z3MgaW4gdGhlIGNoaWNrZW4gbW9kdWxlLiAgVGhlIGVudGlyZQogICAgICAgICAgICAgIHRlc3Qgc3VpdGUgbm93IGNvbXBpbGVzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgdGhlIHRlc3RzIHRoYXQgcmVxdWlyZQoJICAgICAgc3RkX3ZlY3Rvci5pLCBzdGRfZGVxdWUuaSwgYW5kIHNvIG9uLCB3aGljaCBjaGlja2VuIGRvZXMgbm90IGhhdmUgeWV0LgoKCSAgICArIEFkZCBzdXBwb3J0IGZvciAlZXhjZXB0aW9uIGFuZCAldHlwZW1hcChleGNlcHRpb25zKS4gIEV4Y2VwdGlvbnMgYXJlCgkgICAgICB0aHJvd24gd2l0aCBhIGNhbGwgdG8gKGFib3J0KSBhbmQgY2FuIGJlIGhhbmRsZWQgYnkgKGhhbmRsZS1leGNlcHRpb25zKQoKMDMvMTUvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIGZvciBkaXJlY3RvcnMuIE1vZGlmaWNhdGlvbnMgdG8gdGhlIHR5cGVtYXBzCiAgICAgICAgICAgIGdpdmluZyB1c2VycyBmaW5lIGNvbnRyb2wgb3ZlciBtZW1vcnkgb3duZXJzaGlwIGFuZCBsaWZldGltZSBvZiBkaXJlY3RvciBjbGFzc2VzLgogICAgICAgICAgICBEaXJlY3RvciBjbGFzc2VzIG5vIGxvbmdlciBsaXZlIGZvcmV2ZXIgYnkgZGVmYXVsdCBhcyB0aGV5IGFyZSBub3cgY29sbGVjdGFibGUKICAgICAgICAgICAgYnkgdGhlIEdDLgoKMDMvMTUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgW0NoaWNrZW5dIEFkZCBzdXBwb3J0IGZvciBhZGRpbmcgZmluYWxpemVycyBnYXJiYWdlIGNvbGxlY3RlZCBvYmplY3RzLgoJICAgIEZ1bmN0aW9ucyB0aGF0IHJldHVybiBuZXcgb2JqZWN0cyBzaG91bGQgYmUgbWFya2VkIHdpdGggJW5ld29iamVjdCBhbmQKCSAgICBpbnB1dCBhcmd1bWVudHMgd2hpY2ggY29uc3VtZSAob3IgdGFrZSBvd25lcnNoaXApIG9mIGEgcG9pbnRlciBzaG91bGQKCSAgICBiZSBtYXJrZWQgd2l0aCB0aGUgRElTT1dOIHR5cGVtYXAuCgoJICAgIEFsc28gYWRkIHN1cHBvcnQgZm9yIGNvcnJlY3RseSBjaGVja2luZyB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQKCSAgICB0byBhIGZ1bmN0aW9uLCBhbmQgcmFpc2luZyBhbiBlcnJvciBpZiB0aGUgd3JvbmcgbnVtYmVyIGFyZSBwYXNzZWQuCgowMy8xNC8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgQWRkIC0td2l0aG91dC1hbGxsYW5nIG9wdGlvbiB0byBjb25maWd1cmUuaW4sIHdoaWNoIGlzIHRoZSBzYW1lIGFzCiAgICAgICAgICAgIHBhc3NpbmcgYWxsIHRoZSAtLXdpdGhvdXQtcHl0aG9uIC0td2l0aG91dC1wZXJsNSBldGMuLi4gdGhhdCBNYXR0aGlhcyBhZGRlZC4KCjAzLzA5LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQaHBdIE1lbW9yeSBsZWFrIGZpeCBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBjbGFzc2VzL3N0cnVjdHMgYnkgdmFsdWUuCgowMy8wOC8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUGVybF0gRml4IGZvciBQZXJsIGluY29ycmVjdGx5IHRha2luZyBtZW1vcnkgb3duZXJzaGlwIGZvciByZXR1cm4gdHlwZXMgdGhhdAogICAgICAgICAgICBhcmUgdHlwZWRlZnMgdG8gYSBzdHJ1Y3QvY2xhc3MgcG9pbnRlci4gUmVwb3J0ZWQgYnkgSm9zaCBDaGVycnkuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFZhcmlvdXMgZXhjZXB0aW9uIGNoYW5nZXMgZm9yIHRoZSBzdGQ6OnZlY3RvciB3cmFwcGVycy4gVGhlc2Ugbm93IG1vcmUKICAgICAgICAgICAgYWNjdXJhdGVseSBtaXJyb3IgdGhlIHNhbWUgZXhjZXB0aW9ucyB0aGF0IFN5c3RlbS5Db2xsZWN0aW9ucy5BcnJheUxpc3QgdGhyb3cuCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIEZpeCB1bmRlZmluZWQgYmVoYXZpb3VyIGFmdGVyIGFueSBvZiB0aGUgc3RkOjp2ZWN0b3IgbWV0aG9kcwogICAgICAgICAgICB0aHJvdyBhbiBleGNlcHRpb24uCgowMy8wNy8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIFdoZW4gbnVsbCBpcyBwYXNzZWQgZm9yIGEgQysrIHJlZmVyZW5jZSBvciB2YWx1ZSBwYXJhbWV0ZXIsIHRoZSAKICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93biBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gYW4gQXJndW1lbnROdWxsRXhjZXB0aW9uIGluc3RlYWQKICAgICAgICAgICAgb2YgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbiBhcyByZWNvbW1lbmRlZCBpbiB0aGUgLk5FVCBGcmFtZXdvcmsgZG9jdW1lbnRhdGlvbi4KCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyB0dXJuIGEgQysrIGV4Y2VwdGlvbiBpbnRvIGFuIEFwcGxpY2F0aW9uRXhjZXB0aW9uLAogICAgICAgICAgICBub3QgYSBTeXN0ZW1FeGNlcHRpb24gbm93LgoKMDMvMDcvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBOdW1lcm91cyBjaGFuZ2VzIGluIEMjIGV4Y2VwdGlvbiBoYW5kbGluZyBoYXZlIGJlZW4gbWFkZSBvdmVyIHRoZSBwYXN0CiAgICAgICAgICAgIGZldyB3ZWVrcy4gQSBzdW1tYXJ5IGZvbGxvd3M6CgogICAgICAgICAgICBUaGUgd2F5IGluIHdoaWNoIEMrKyBleGNlcHRpb25zIGFyZSBtYXBwZWQgdG8gQyMgZXhjZXB0aW9ucyBpcyBxdWl0ZSBkaWZmZXJlbnQuCiAgICAgICAgICAgIFRoZSBjaGFuZ2UgaXMgdG8gZml4IEMjIGV4Y2VwdGlvbnMgc28gdGhhdCB0aGUgQysrIGV4Y2VwdGlvbiBzdGFjayBpcyBjb3JyZWN0bHkKICAgICAgICAgICAgdW53b3VuZCBhcyBwcmV2aW91c2x5IEMrKyBleGNlcHRpb25zIHdlcmUgYmVpbmcgdGhyb3duIGFjcm9zcyB0aGUgQyBQSW52b2tlIGxheWVyCiAgICAgICAgICAgIGludG8gdGhlIG1hbmFnZWQgd29ybGQuCgogICAgICAgICAgICBOZXcgdHlwZW1hcCBhdHRyaWJ1dGVzIChjYW50aHJvdyBhbmQgZXhjb2RlKSBoYXZlIGJlZW4gaW50cm9kdWNlZCB0byBjb250cm9sIHRoZQogICAgICAgICAgICBtYXBwaW5nIG9mIEMrKyB0byBDIyBleGNlcHRpb25zLiBFc3NlbnRpYWxseSBhIGNhbGxiYWNrIGludG8gdGhlIHVubWFuYWdlZCB3b3JsZAogICAgICAgICAgICBpcyBtYWRlIHRvIHNldCBhIHBlbmRpbmcgZXhjZXB0aW9uLiBUaGUgZXhjZXB0aW9uIHRvIHRocm93IGlzIHN0b3JlZCBpbiB0aHJlYWQgbG9jYWwKICAgICAgICAgICAgc3RvcmFnZSAoc28gdGhlIGFwcHJvYWNoIGlzIHRocmVhZC1zYWZlKS4gVGhlIHR5cGVtYXBzIGFyZSBleHBlY3RlZCB0byByZXR1cm4KICAgICAgICAgICAgZnJvbSB1bm1hbmFnZWQgY29kZSBhcyBzb29uIGFzIHRoZSBwZW5kaW5nIGV4Y2VwdGlvbiBpcyBzZXQuIEFueSBwZW5kaW5nIGV4Y2VwdGlvbnMKICAgICAgICAgICAgYXJlIGNoZWNrZWQgZm9yIGFuZCB0aHJvd24gb25jZSBtYW5hZ2VkIGNvZGUgc3RhcnRzIGV4ZWN1dGluZy4gVGhlcmUgc2hvdWxkCiAgICAgICAgICAgIGJlIG1pbmltYWwgaW1wYWN0IG9uIGV4ZWN1dGlvbiBzcGVlZCBkdXJpbmcgbm9ybWFsIGJlaGF2aW91ci4gRnVsbCBkZXRhaWxzIHdpbGwgYmUKICAgICAgICAgICAgZG9jdW1lbnRlZCBpbiBDU2hhcnAuaHRtbC4KCiAgICAgICAgICAgIFRoZSBTV0lHX0NTaGFycFRocm93RXhjZXB0aW9uKCkgZnVuY3Rpb24gaGFzIGJlZW4gcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCB0aGUKICAgICAgICAgICAgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uQXJndW1lbnQoKSBhbmQgU1dJR19DU2hhcnBTZXRQZW5kaW5nRXhjZXB0aW9uKCkKICAgICAgICAgICAgZnVuY3Rpb25zLiBUaGUgb3JpZ2luYWwgbmFtZSBoYXMgYmVlbiBkZWxpYmVyYXRlbHkgY2hhbmdlZCB0byBicmVhayBvbGQgY29kZSBhcwogICAgICAgICAgICB0aGUgb2xkIGFwcHJvYWNoIHdhcyBzb21ld2hhdCBmbGF3ZWQuIEFueSB1c2VyIGRlZmluZWQgZXhjZXB0aW9ucyB0aGF0IGZvbGxvdyB0aGUKICAgICAgICAgICAgc2FtZSBwYXR0ZXJuIGFzIHRoZSBvbGQgYXBwcm9hY2ggc2hvdWxkIGFsc28gYmUgZml4ZWQuCgogICAgICAgICAgICBOdW1lcm91cyBuZXcgLk5FVCBmcmFtZXdvcmsgZXhjZXB0aW9ucyBhcmUgbm93IGF2YWlsYWJsZSBmb3IgZWFzeSB0aHJvd2luZyBmcm9tIAogICAgICAgICAgICB1bm1hbmFnZWQgY29kZS4gVGhlIGNvbXBsZXRlIGxpc3QgaXM6IAoKICAgICAgICAgICAgICBBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgQXJpdGhtZXRpY0V4Y2VwdGlvbiwgRGl2aWRlQnlaZXJvRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBJbmRleE91dE9mUmFuZ2VFeGNlcHRpb24sIEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCAKICAgICAgICAgICAgICBOdWxsUmVmZXJlbmNlRXhjZXB0aW9uLCBPdXRPZk1lbW9yeUV4Y2VwdGlvbiwgT3ZlcmZsb3dFeGNlcHRpb24sIAogICAgICAgICAgICAgIFN5c3RlbUV4Y2VwdGlvbiwgQXJndW1lbnRFeGNlcHRpb24sIEFyZ3VtZW50TnVsbEV4Y2VwdGlvbiBhbmQKICAgICAgICAgICAgICBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgQyMgTU9EVUxFICoqKgoKMDUvMDUvMjAwNTogbW1hdHVzCgkgICAgCgkgICAgRml4IHNldmVyYWwgbWVtb3J5IGxlYWtzIGFyb3VuZC4gRXZlbiB3aGVuIHdlIHN1cnZpdmUgIGtub3duaW5nCgkgICAgc3dpZyBpcyBhIG1lbW9yeSBsZWFrIGZhY3RvcnksIGl0IHdhcyBhIGxpdHRsZSBvdXQgb2YKCSAgICBjb250cm9sLiBUbyBydW4gc3RkX2NvbnRhaW5lcnMuaSBpbiB0aGUgcHl0aG9uIHRlc3Qtc3VpdGUsCgkgICAgc3dpZyB3YXMgdXNpbmcgfjI2ME1CLCBub3cgaXQgdXNlcyAnb25seScgfjQwTUIsIHdoaWNoIGlzCgkgICAgdGhlIHNhbWUgYW1tb3VudCB0aGF0IGcrKyB1c2VzLCBzbywgaXMgbm90IHRoYXQgYmFkLgoJICAgIEluIHRoZSBwcm9jZXNzLCBJIGZvdW5kIGEgY291cGxlIG9mIGV4dHJhIERlbGV0ZXMsIHdoaWNoCgkgICAgaW4gc29tZSBjYXNlcyBjb3VsZCB0cmlnZ2VyIHNlZy4gZmF1bHRzIGFuZC9vcgoJICAgIERPSC9hc3NlcnRzLgoJICAgIAoJICAgIFtweXRob25dIEJldHRlciBzdXBwb3J0IGZvciBkaXJlY3RvcnMgKyBleGNlcHRpb24uIE1vcmUKCSAgICB2ZXJib3NlIGVycm9ycyBhbmQgYWRkZWQgYW4gdW5leHBlY3RlZCBleGNlcHRpb24gaGFuZGxlci4KCgkgICAgW3B5dGhvbl0gRml4IG1lbW9yeSBsZWFrIGZvciB0aGUKCgkgICAgCSAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxpbnQ+ID4gCgoJICAgIGNhc2UscmVwb3J0ZWQgYnkgQm8gUGVuZy4KCgkgICAgW3B5dGhvbl0gRml4IFN3aWdQeU9iamVjdCBjb21wYXJlIHByb2JsZW0gcmVwb3J0ZSBieQoJICAgIENhbWVyb24gUGF0cmljay4gCgoJICAgIFtweXRob25dIEZpeCBzZXZlcmFsIHdhcm5pbmdzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSAKCSAgICBmb3IgZ251LWdjYywgSW50ZWwgYW5kIFZDNy4xICBjb21waWxlcnMuCgoKMDIvMjUvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgVXBkYXRlIGRvY3VtZW50YXRpb24gdG8gdXNlIENTUyBhbmQgPGRpdj4gaW5zdGVhZCBvZiA8YmxvY2txdW90ZT4KCSAgICBJIHVzZWQgYSBzY3JpcHQgdG8gY29udmVydCB0aGUgZG9jcywgYW5kIGl0IHNldCBhbGwgdGhlIGJveCBjbGFzc2VzCgkgICAgdG8gYmUgImNvZGUiLiAgVGhlcmUgYXJlIGFjdHVhbGx5IDQgZGlmZmVyZW50IGNsYXNzZXMsCgkgICAgInNoZWxsIiwgImNvZGUiLCAidGFyZ2V0bGFuZyIsIGFuZCAiZGlhZ3JhbSIuICBXZSBuZWVkIHRvIGdvIHRocm91Z2gKCSAgICBhbmQgY29udmVydCB0aGUgZGl2cyBkZXBlbmRpbmcgb24gd2hhdCB0aGV5IGNvbnRhaW4uCgowMi8yMy8yMDA1OiBtbWF0dXMKCgkgICAgW1B5dGhvbl0gQWRkZWQgb3B0aW9uIC1ub3J0dGkgdG8gZGlzYWJsZSB0aGUgdXNlIG9mIG5hdGl2ZQoJICAgIEMrKyBSVFRJIHdpdGggZGlyZWN0b3JzIChkeW5hbWljX2Nhc3Q8PiBpcyBub3QgdXNlZCkuCgoJICAgIEFkZCBtb3JlIGNvZGUgZm9yIGRpcmVjdG9ycyB0byBkZXRlY3QgYW5kIHJlcG9ydCBlcnJvcnMgaW4KCSAgICB0aGUgcHl0aG9uIHNpZGUuCgoJICAgIEV4dGVuZCB0aGUgdXNlIG9mIFNXSUdJTlRFUk4gd2hlbmV2ZXIgaXMgcG9zc2libGUuCgoJICAgIFJlbW92ZSB0ZW1wbGF0ZSB3YXJuaW5ncyByZXBvcnRlZCBieSBWQzcuMS4KCgkgICAgUmVtb3ZlIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IGdjYy9nKysuIEZpbmFsbHkgeW91IGNhbgoJICAgIGNvbXBpbGUgdXNpbmcKCgkgICAgICAgZysrIC1XIC1XYWxsIC1jIG15bW9kdWxlX3dyYXAuY3h4CgoJICAgIGFuZCBubyBzcHVyaW91cyBlcnJvcnMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHdyYXBwZXIKCSAgICBjb2RlLgoKMDIvMjMvMjAwNTogd3V6emViIChKb2huIExlbnopCgkgICAgQWRkZWQgLWV4dGVybmFsLXJ1bnRpbWUgYXJndW1lbnQuICBUaGlzIGFyZ3VtZW50IGlzIHVzZWQgdG8gZHVtcAoJICAgIG91dCBhbGwgdGhlIGNvZGUgbmVlZGVkIGZvciBleHRlcm5hbCBhY2Nlc3MgdG8gdGhlIHJ1bnRpbWUgc3lzdGVtLAoJICAgIGFuZCBpdCByZXBsYWNlcyBpbmNsdWRpbmcgdGhlIGZpbGVzIGRpcmVjdGx5LiAgVGhpcyBjaGFuZ2UgYWRkcwoJICAgIHR3byBuZXcgdmlydHVhbCBmdW5jdGlvbnMgdG8gdGhlIExhbmd1YWdlIGNsYXNzLCB3aGljaCBhcmUgdXNlZAoJICAgIHRvIGZpbmQgdGhlIGxhbmd1YWdlIHNwZWNpZmljIHJ1bnRpbWUgY29kZS4gIEkgYWxzbyB1cGRhdGVkCgkgICAgYWxsIGxhbmd1YWdlcyB0aGF0IHVzZSB0aGUgcnVudGltZSB0byBpbXBsZW1lbnQgdGhlc2UgdHdvIGZ1bmN0aW9ucy4KCjAyLzIyLzIwMDU6IG1tYXR1cyAKCSAgICBGaXggJXRlbXBsYXRlICsgcHJpdmF0ZSBlcnJvciBTRiMxMDk5OTc2LgoKMDIvMjEvMjAwNTogbW1hdHVzIAoKCSAgICBGaXggc3dpZ3J1bi5zd2cgd2FybmluZ3MgcmVwb3J0ZWQgd2hlbiB1c2luZyAiZ2NjIC1XIC1XYWxsIgoJICAgIChzdGF0aWMvaW5saW5lIG5vdCB1c2VkIGluIGZyb250IG9mIGEgZnVuY3Rpb24KCSAgICBkZWNsYXJhdGlvbiksIGFuZCBhZGQgU1dJR1VOVVNFRCBhdHRyaWJ1dGUgdG8gYXZvaWQKCSAgICB1bnVzZWQgd2FybmluZ3MgZWxzZXdoZXJlLgoKCSAgICBGaXggdW51c2VkIHZhcmlhYmxlIHdhcm5pbmdzLgoKCSAgICBbUHl0aG9uXSBVc2UgbmV3IFNXSUdVTlVTRUQgYXR0cmlidXRlIHRvIGF2b2lkIHdhcm5pbmdzIGluCgkgICAgU1dJR0lOVEVSTiBtZXRob2RzLgoKCSAgICBbUHl0aG9uXSBGaXggUHlPU19zbnByaW50ZiBmb3IgcHl0aG9uIHZlcnNpb25zIDwgMi4yIChTRiAjMTEwNDkxOSkuCgoJICAgIFtQeXRob25dIEZpeCBtYXAvbXVsdGltYXAgdG8gYWxsb3cgZW1wdHkgbWFwcyAocmVwb3J0ZWQgYnkKICAJICAgIFBoaWxpcHBlIEhldHJveSkuCgoJICAgIFtEb2NzXSBBZGQgc29tZSBkb2N1bWVudGF0aW9uIHRvIFB5dGhvbi5odG1sIGFuZAoJICAgIFNXSUdQbHVzLmh0bWwsIGluY2x1ZGluZyBmb3IgZXhhbXBsZSB0aGUgZmFjdCB0aGF0CgkgICAgJ2ZyaWVuZHMnIGFyZSBub3cgc3VwcG9ydGVkLgoKMDIvMjEvMjAwNTogd3NmdWx0b24KICAgICAgICAgICAgW1BIUF0gUGF0Y2ggZnJvbSBPbGx5IEJldHRzLCBzbyB0aGF0IHdyYXBwZXJzIGNvbXBpbGUgd2l0aCBaZW5kIHRocmVhZCBzYWZldHkgZW5hYmxlZC4KCjAyLzE3LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIE1lbW9yeSBsZWFrIGZpeCBpbiBzb21lIG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2UgbW9kdWxlcyB3aGVuIHVzaW5nIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGluIGNvbnN0cnVjdG9ycy4gVGhlIHNjcmlwdGluZyBsYW5ndWFnZSB3YXMgbm90IHRha2luZyBvd25lcnNoaXAgb2YgdGhlCiAgICAgICAgICAgIEMrKyBvYmplY3QgbWVtb3J5IHdoZW4gYW55IG9mIHRoZSBjb25zdHJ1Y3RvcnMgdGhhdCB1c2UgZGVmYXVsdCBhcmd1bWVudHMgd2FzIGNhbGxlZC4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFNGICMxMTE1MDU1OiBGYWlsZWQgbWFrZSBpbnN0YWxsLiBQYXRjaCBmcm9tIFJvYiBTdG9uZS4KCjAyLzE2LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBTRiAjMTEyMzQxNiBmcm9tIFBhdWwgTW9vcmUuIENvcnJlY3QgbWVtb3J5IGFsbG9jYXRpb24gZm9yIFNUUklOR0FSUkFZCiAgICAgICAgICAgIHR5cGVtYXBzIGluIHZhcmlvdXMuaS4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIERpc2FibGVkIHR5cGVtYXAgc2VhcmNoIGNoYW5nZXMgZm9yIG5vdyAoc2VlIGVudHJ5IDE5LzEyLzIwMDQpLiBJdCBicmVha3MKICAgICAgICAgICAgb2xkIHR5cGVtYXBzLCBsZW5ndGhlbnMgdGhlIGV4ZWN1dGlvbiB0aW1lIGJ5IGFib3V0IDI1JSBhbmQgaW50cm9kdWNlcwogICAgICAgICAgICBpbmNvbnNpc3RlbmNpZXMuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBzd2lnIC1oZWxwIGZvbGxvd3Mgb3RoZXIgc29mdHdhcmUgYnkgcHJpbnRpbmcgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyIG5vdy4KICAgICAgICAgICAgc3dpZyAtdmVyc2lvbiBhbHNvIGRpc3BsYXlzIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyciBub3cuCiAgICAgICAgICAgIEJlaGF2aW91ciByZXBvcnRlZCBieSBUb3JzdGVuIExhbmRzY2hvZmYuCgowMi8xNS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbUnVieV0gRml4IGZvciB0aGUgbGVzcyBjb21tb25seSB1c2VkIG9yZGVyaW5nIG9mICVpbmNsdWRlIGFuZCAjaW5jbHVkZSwgc28KICAgICAgICAgICAgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29tcGlsZXMuIEJ1ZyByZXBvcnRlZCBieSByZXBvcnRlZCBieSBNYXggQm93c2hlci4KICAgICAgICAgICAgICAlaW5jbHVkZSBmb28uaAogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgI2luY2x1ZGUgZm9vLmgKICAgICAgICAgICAgICAlfSAKCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gU1dJR19leGNlcHRpb24gbWFjcm8gd2lsbCBub3cgcmV0dXJuIGZyb20gdW5tYW5hZ2VkIGNvZGUgLyBuYXRpdmUgY29kZQogICAgICAgICAgICBhcyBzb29uIGFzIGl0IGlzIGNhbGxlZC4gRml4ZXMgcG9zc2libGUgSlZNIGNyYXNoZXMgYW5kIG90aGVyIGNvZGUgdW5leHBlY3RlZGx5CiAgICAgICAgICAgIGJlaW5nIGV4ZWN1dGVkLiBOb3RlIFNXSUdfZXhjZXB0aW9uIGlzIG9ubHkgb2NjYXNpb25hbGx5IHVzZWQgYnkgU1dJRyBsaWJyYXJ5CiAgICAgICAgICAgIHdyaXRlcnMsIGFuZCBpcyBiZXN0IGF2b2lkZWQgYnkgU1dJRyB1c2Vycy4KCjAyLzE1LzIwMDU6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIywgSmF2YV0gVHlwZW1hcHMgY2FuIG5vdyBiZSB0YXJnZXRlZCBhdCBnbG9iYWwgdmFyaWFibGUgbmFtZXMKICAgICAgICAgICAgYW5kIHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgbmFtZXMuIFByZXZpb3VzbHkgdGhlIHR5cGVtYXBzIGZvciAKICAgICAgICAgICAgdGhlIHNldHRlcnMgd2VyZSBpZ25vcmVkLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBnbG9iYWxpbnQgIi4uLiIKICAgICAgICAgICAgICBpbnQgZ2xvYmFsaW50OwoKMDIvMTMvMjAwNTogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQWRkICV0eXBlY2hlY2sgZm9yIFNXSUdUWVBFLCBhZGQgJXR5cGVjaGVjayBmb3IgcHRyZGlmZl90LCBmaXgKCSAgICB0eXBlbWFwcyBmb3Igc2l6ZV90LgoKCSAgICBbUGlrZV0gTWVyZ2UgcGF0Y2ggZnJvbSBUb3JzdGVuIExhbmRzY2hvZmYgZm9yIGltcHJvdmVkIFBpa2UgY29uZmlndXJhdGlvbi4KCjAyLzEyLzIwMDU6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgY29uZmlndXJlIHN3aXRjaGVzIC0td2l0aG91dC10Y2wsIC0td2l0aG91dC1weXRob24gZXRjLiBhbGxvdyB0bwogICAgICAgICAgICBkaXNhYmxlIHRoZSBzZWFyY2ggZm9yIGluc3RhbGxlZCBsYW5ndWFnZXMuCgowMS8zMS8yMDA1OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBBZGQgRG9oU29ydExpc3QgdG8gRE9ICgkgICAgCgkgICAgLSBJbXByb3ZlIHRoZSBydW50aW1lIHR5cGUgc3lzdGVtOgogICAgICAgICAgICAgICArIFNwZWVkLiBUeXBlIGxvYWRpbmcgaXMgbm93IE8obiBsb2cgbikgaW5zdGVhZCBvZiBPKE5eMiksIHdoaWNoCgkgICAgICAgICBmb3IgbGFyZ2UgbW9kdWxlcyBpcyBhIGh1Z2UgaW1wcm92ZW1lbnQuCiAgICAgICAgICAgICAgICsgQSB3aG9sZSBidW5jaCBvZiBmdW5jdGlvbnMgaW4gc3dpZ3J1bi5zd2cgbm8gbG9uZ2VyIG5lZWQgdGhlIAogICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9saXN0X2hhbmRsZSBwYXNzZWQgdG8gdGhlbS4gIFRoZSBvbmx5IG9uZSBsZWZ0IGlzIAoJCSBUeXBlUXVlcnkuICBUaGlzIGFsc28gbWFrZXMgcnVudGltZS5zd2cgYSBsb3Qgc21hbGxlci4KCSAgICAgICArIFNwbGl0IHVwIHN3aWdfdHlwZV9pbmZvIHN0cnVjdHVyZSBpbnRvIHR3byBzdHJ1Y3R1cmVzCgkgICAgICAgICAoc3dpZ190eXBlX2luZm8gYW5kIHN3aWdfY2FzdF9pbmZvKQoJICAgICAgICsgU3RvcmUgYSBwb2ludGVyIHRvIGEgc3dpZ190eXBlX2luZm8gcmF0aGVyIHRoYW4ganVzdCB0aGUgdHlwZQoJICAgICAgICAgbmFtZSBzdHJpbmcgaW4gdGhlIGxpbmtlZCBsaXN0IG9mIGNhc3RzLiBGaXJzdCBvZmYsIHRoaXMgbWFrZXMKCSAgICAgICAgIHRoZSBndWlsZSBtb2R1bGUgYSBsaXR0bGUgZmFzdGVyLCBhbmQgc2Vjb25kLCB0aGUKCSAgICAgICAgIFNXSUdfVHlwZUNsaWVudERhdGEoKSBmdW5jdGlvbiBpcyBmYXN0ZXIgdG9vLiAKCSAgICAgICArIEFkZCB0aGUgaWRlYSBvZiBhIG1vZHVsZSBpbnRvIHRoZSB0eXBlIHN5c3RlbS4gIEJlZm9yZSwgYWxsIHRoZQoJICAgICAgICAgdHlwZXMgd2VyZSBzdG9yZWQgaW4gb25lIGh1Z2UgbGlua2VkIGxpc3QuIE5vdywgYW5vdGhlciBsZXZlbCBpcwoJICAgICAgICAgYWRkZWQsIGFuZCB0aGUgdHlwZSBzeXN0ZW0gc3RvcmVzIGEgbGlua2VkIGxpc3Qgb2YgbW9kdWxlcywgZWFjaAoJICAgICAgICAgb2Ygd2hpY2ggc3RvcmVzIGFuIGFycmF5IG9mIHR5cGVzIGFzc29jaWF0ZWQgd2l0aCBpdC4KCSAgICAgICArIEZvciBtb3JlIGluZm9ybWF0aW9uIG9mIGhvdyB0aGUgcnVudGltZSB0eXBlIHN5c3RlbSBub3cgd29ya3MsCgkgICAgICAgICBwbGVhc2Ugc2VlIERvYy9NYW51YWwvdHlwZW1hcHMuaHRtbCBhbmQgRG9jL0RldmVsL3J1bnRpbWUudHh0CgkJIAoJICAgIC0gVXBkYXRlIGFsbCBsYW5ndWFnZSBtb2R1bGVzIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgVGhlIGNoYW5nZXMKCSAgICAgIHRvIGVhY2ggbGFuZ3VhZ2UgbW9kdWxlIGFyZSBtaW5vci4gIEFsbCBsYW5ndWFnZXMgYXJlIG5vdyBhYmxlIHRvCgkgICAgICB1c2UgcnVudGltZS5zd2cgZm9yIGV4dGVybmFsIGFjY2VzcyB0byB0aGUgdHlwZSBzeXN0ZW0uICBCZWZvcmUKCSAgICAgIG9ubHkgcHl0aG9uIGFuZCBwZXJsIGRpZC4KCgkgICAgLSBbZ3VpbGUsIG16c2NoZW1lLCBvY2FtbCwgYW5kIHBocDRdICBUaGVzZSBsYW5ndWFnZXMgb3BlbmVkIHVwIHRoZQoJICAgICAgaW5pdCBmdW5jdGlvbiBpbnNpZGUgdGhlIC5jeHggY29kZSwgYW5kIGFueSBjb2RlIGluIHRoZSAuc3dnIGZpbGVzCgkgICAgICBpbiB0aGUgaW5pdCBzZWN0aW9uIHdhcyBpbnNpZGUgdGhpcyBmdW5jdGlvbi4gIFRoaXMgd2FzIGEgcHJvYmxlbQoJICAgICAgZm9yIHN3aWdpbml0LnN3Zywgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoZSBTV0lHX2luaXQKCSAgICAgIGZ1bmN0aW9uIGlzIG9wZW5lZC4gIFRodXMgSSBjaGFuZ2VkIHRoZXNlIGxhbmd1YWdlcyB0byBiZSBsaWtlCgkgICAgICBweXRob24gb3IgcGVybCwgd2hlcmUgdGhlIGluaXQgZnVuY3Rpb24gaXMgZGVjbGFyZWQgaW4gdGhlIC5zd2cKCSAgICAgIGZpbGUuCgkgICAgICAKCSAgICAtIFtSdWJ5XSBJbnN0ZWFkIG9mIG1vdmluZyB0aGUgaW5pdCBmdW5jdGlvbiB0byB0aGUgLnN3ZyBmaWxlLCBJCgkgICAgICBhZGRlZCBhIG5ldyBzZWN0aW9uIGluaXRiZWZvcmVmdW5jLCBhbmQgdGhlbiBhZGRlZAoJICAgICAgJWluc2VydChpbml0YmVmb3JlZnVuYykgInN3aWdpbml0LnN3ZyIKCgkgICAgLSBbTXpTY2hlbWVdIEZpeCBlbnVtcyBhbmQgZml4IEV4YW1wbGVzL01ha2VmaWxlLmluIHNvIHRoYXQgaWYKCSAgICAgIG11bHRpcGxlIC1JIGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBJTkNMVURFUyB2YXJpYWJsZSwgZWFjaAoJICAgICAgZ2V0cyBhICsrY2NmLgoKCSAgICAtIFtHdWlsZSBHSF0gVXBkYXRlIEd1aWxlIEdIIHRvIHVzZSB0aGUgbmV3IHR5cGUgc3lzdGVtLiAgU2VlCgkgICAgICBEb2MvTWFudWFsL0d1aWxlLmh0bWwgZm9yIGhvdyBzbW9icyBhcmUgbm93IHVzZWQuCgowMS8xMS8yMDA1OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyB0eXBlbWFwIGNhbGxlZCAnY3Njb25zdHJ1Y3QnLiBUaGUgY29kZSBpbiB0aGlzIHR5cGVtYXBzIHdhcyBwcmV2aW91c2x5IGhhcmQKICAgICAgICAgICAgY29kZWQgYW5kIGNvdWxkIG5vdCBiZSBjdXN0b21pc2VkIGJ5IGEgdXNlci4gVGhpcyB0eXBlbWFwIGNvbnRhaW5zIHRoZSBjb2RlIHRoYXQgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGludG8gYSBwcm94eSBjbGFzcydzIGNvbnN0cnVjdG9yLgoKICAgICAgICAgICAgW0phdmFdIE5ldyB0eXBlbWFwIGNhbGxlZCAnamF2YWNvbnN0cnVjdCcuIFRoZSBjb2RlIGluIHRoaXMgdHlwZW1hcHMgd2FzIHByZXZpb3VzbHkgaGFyZAogICAgICAgICAgICBjb2RlZCBhbmQgY291bGQgbm90IGJlIGN1c3RvbWlzZWQgYnkgYSB1c2VyLiBUaGlzIHR5cGVtYXAgY29udGFpbnMgdGhlIGNvZGUgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgaW50byBhIHByb3h5IGNsYXNzJ3MgY29uc3RydWN0b3IuIEFub3RoZXIgdHlwZW1hcCBuYW1lZCAnamF2YWNvbnN0cnVjdF9kaXJlY3RvcicKICAgICAgICAgICAgaXMgdXNlZCBpbnN0ZWFkIHdoZW4gdGhlIHByb3h5IGNsYXNzIGlzIGEgZGlyZWN0b3IgY2xhc3MuCgogICAgICAgICAgICBbQyMsIEphdmFdIElmIGEgQysrIGNsYXNzIGRpZCBub3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IsIGEgcHJvdGVjdGVkIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IFNXSUcuIFRoaXMgc2VlbXMgaXMgdW5uZWNlc3NhcnkgYW5kIGhhcyBiZWVuIHJlbW92ZWQKICAgICAgICAgICAgYW5kIHRoZXJlYnkgZ2l2aW5nIHRoZSB1c2VyIGFsbW9zdCBjb21wbGV0ZSBjb250cm9sIG92ZXIgdGhlIGdlbmVyYXRlZCBjb2RlIGFsb25nIHdpdGggdGhlCiAgICAgICAgICAgIG5ldyB0eXBlbWFwcyBhYm92ZS4KCjE5LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICBbRGlzYWJsZWQsIHNlZSBlbnRyeSAwMi8xNS8yMDA0XQogICAgICAgICAgICAtIEZpeCB0eXBlbWFwIHNlYXJjaCwgbm93IHRoZSAib3V0IiB0eXBlbWFwIHNlYXJjaCBpcyBkb25lIGFzIGZvbGxvd3MKCiAgICAgICAgICAgICAgICAgaW50ICpGb286OmZvbyhpbnQgYmFyKSAgIC0+ICBpbnQgKkZvbzo6Zm9vKGludCBiYXIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKkZvbzo6Zm9vCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+ICBpbnQgKmZvbyhpbnQgYmFyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiAgaW50ICpmb28KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gIGludCAqCgogICAgICAgICAgICAgICB0aGVuLCBub3cgeW91IGNhbiBiZSBtb3JlIHNwZWNpZmljLCBhbmQgZGVmaW5lCgogICAgICAgICAgICAgIC8qIGFwcGx5IG9ubHkgZm9yICAnRm9vOjpmb28nIG1ldGhvZCAqLwogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgaW50ICogRm9vOjpmb28oaW50ICpiYXIpIC4uLjsgCgogICAgICAgICAgICAgIC8qIGFwcGx5IGZvciBhbGwgJ2ZvbycgZnVuY3Rpb25zL21ldGhvZHMgKi8KICAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGludCAqIGZvbyhpbnQgKmJhcikgLi4uOyAKCiAgICAgICAgICAgICAgJWlubGluZSB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGludCAqZm9vKGludCAqYmFyKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgfQoJICAKCjE1LzEyLzIwMDQ6IG1tYXR1cwogICAgICAgICAgICAtIE1vcmUgZml4ZXMgZm9yIHRlbXBsYXRlcyBhbmQgdGVtcGxhdGUgZGVmYXVsdCBhcmdzLgogICAgICAgICAgICAgIFNlZSB0ZW1wbGF0ZV9kZWZhdWx0LmkgZm9yIHNjYXJ5IGNhc2VzIHRoYXQgbm93IGFyZSAKICAgICAgICAgICAgICBzdXBwb3J0ZWQsIGJlc2lkZXMgdGhlIGFscmVhZHkgdWdseSBTVEwvc3RkIGNhc2VzLgogICAgICAgICAgICAgIAogICAgICAgICAgICAtIENvc21ldGljcyBhbmQgbW9yZSB1c2Ugb2YgJ2NvbnN0JyB3aGVyZSBpdCB3YXMgaW1wbGljaXQuCiAgICAgICAgICAgIC0gT3RoZXIgZml4ZXMgZm9yIE9TUywgd2hpY2ggaXMgbm93IHdvcmtpbmcgYWdhaW4gd2l0aCAxLjMuMjUuCgkKVmVyc2lvbiAxLjMuMjQgKERlY2VtYmVyIDE0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMi8xMi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIEZpeCBhIGJ1bmNoIG9mIGJ1Z3MgcmVsYXRpbmcgdG8gLXByb3h5IHN1cHBvcnQKCSAgICAgICsgbm9uLWNsYXNzIHZhcmlhYmxlcyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBzdGF0aWMgbWVtYmVyIGZ1bmN0aW9ucyBub3cgZXhwb3J0IHByb3Blcmx5IHVzaW5nIC1wcm94eQoJICAgICAgKyBtZW1iZXIgY2xhc3MgdmFyaWFibGVzIG5vdyBleHBvcnQgcHJvcGVybHkgdXNpbmcgLXByb3h5CgkgICAgICArIGFkZGVkIGEgLW5vdW5pdCBhcmd1bWVudCwgd2hpY2ggZG9lcyBub3QgZXhwb3J0IHRoZSAoZGVjbGFyZSAodW5pdCAuLi4pKQoJICAgICAgKyBjb3JyZWN0bHkgaW5zdGFsbCBzd2lnY2xvc3ByZWZpeC5zY20KCSAgICAgICsgY29uc3RhbnRzIChlbnVtcywgZGVmaW5lcykgbm93IGNvcnJlY2x5IGV4cG9ydCB3aGVuIHVzaW5nIC1wcm94eQoKMTIvMTEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgY29uZmlndXJlIGZpeCBmb3Igd2hlbiBtb3JlIHRoYW4gb25lIHZlcnNpb24gb2Ygam5pX21kLmggaXMgZm91bmQKICAgICAgICAgICAgaW4gdGhlIEphdmEgaW5jbHVkZSBkaXJlY3RvcnkgKHdhcyBnZW5lcmF0aW5nIGxvdHMgb2Ygc2VkIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2VzKS4KCjEyLzA4LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXhlcyB0byBhcnJheXNfamF2YS5pIHNvIHRoYXQgb25lIGNhbiBhcHBseSB0aGUgYXJyYXkKICAgICAgICAgICAgdHlwZW1hcHMgdG8gZnVuY3Rpb25zIHRha2luZyBwb2ludGVycyBhcyBpbnB1dCwgZWcKCiAgICAgICAgICAgICAgICAlaW5jbHVkZSAiYXJyYXlzX2phdmEuaSIKICAgICAgICAgICAgICAgICVhcHBseSBpbnRbXSB7aW50Kn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgKmEpOwoKMTIvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIERpcmVjdG9yIG1vZHMgY29udHJpYnV0ZWQgYnkgU2NvdHQgTWljaGVsLiBOZXcgdHlwZW1hcHMKICAgICAgICAgICAgZGlyZWN0b3JkaXNjb25uZWN0IGFuZCBkaXJlY3RvcmRpc2Nvbm5lY3RfZGVyaXZlZCBmb3IgdGhlIAogICAgICAgICAgICBzd2lnRGlyZWN0b3JEaXNjb25uZWN0KCkgbWV0aG9kLiBBbHNvIGZpeCB0byBnZXQgdGhlIGphdmFwYWNrYWdlCiAgICAgICAgICAgIHR5cGVtYXAgd29ya2luZyBhZ2Fpbi4KCjEyLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gRmluaXNoaW5nIHRoZSBmaXhlcyBmb3IgdGVtcGxhdGVzICsgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncyArIHNwZWNpYWxpemF0aW9ucy4KCiAgICAgICAgICAgIC0gW1B5dGhvbl0gTm93IHdlIHVzZSB0aGUgbmV3IHRlbXBsYXRlcyArIGRlZmF1bHQgdGVtcGxhdGUKCSAgICAgIGFyZ3MgaW4gdGhlIHN0ZC9TVEwgbGlicmFyeS4gVGhhdCBtZWFucyB0aGUgaW50ZXJuYWwKCSAgICAgIHN3aWcgZmlsZXMgYXJlIGdldHRpbmcgdWdsaWVyIHNpbmNlIHdlIG5vdyBzdXBwb3J0IHRoZQoJICAgICAgb3JpZ2luYWwgZGVjbGFyYXRpb25zOgoKCSAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1RwLCBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjwgX1RwID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJLi4uLgoJCX07CgkgICAgICAJICAgICAKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIF9LZXksIGNsYXNzIF9UcCwgY2xhc3MgX0NvbXBhcmUgPSBzdGQ6Omxlc3M8X0tleSA+LAoJICAgICAgICBjbGFzcyBfQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjxzdGQ6OnBhaXI8Y29uc3QgX0tleSwgX1RwID4gPiA+CiAgICAgICAgICAgICAgICBjbGFzcyBtYXAgewoJCS4uLi4KCQl9OwogCiAgICAgICAgICAgICAgYW5kIHRoZSB1c2VyIGNhbiB1c2UgdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXMKCgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludD47CgkgICAgICAgICV0ZW1wbGF0ZSgpIHN0ZDo6dmVjdG9yPGludCwgc3RkOjphbGxvY2F0b3I8aW50PiA+OwoJICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQsIE15QWxsb2NhdG9yPGludD4gPjsKCiAgICAgICAgICAgICAgTm93IHdlIGFyZSBjbG9zZXIgdG8gdGhlIGNsZWFuaW5nL3Jld3JpdGluZyBvZiB0aGUKCSAgICAgIHB5dGhvbiBzdGQvU1RMIHN1cHBvcnQsIHN1Y2ggdGhhdCB3ZSByZWNvdmVyIHN1cHBvcnQgZm9yCgkgICAgICBNU1ZDKysgNi4wLCBhbmQgd2UgY2FuIGFkZCBzdXBwb3J0IGZvciBvdGhlciBsYW5ndWFnZXMKCSAgICAgIHRvby4KCgoxMi8wMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBkaXJlY3RvcnMgd2hlbiB3cmFwcGluZyBtZXRob2RzIHVzaW5nIGEgbWVtYmVyIGVudW0KICAgICAgICAgICAgYW5kIHR5cGVzYWZlL3Byb3BlciBlbnVtcyBlbmFibGVkLgoKMTIvMDEvMjAwNDogbW1hdHVzCgkgICAgLSBGaXggdHlwZW1hcHMgdG8gd29yayB3aXRoIHRlbXBsYXRlcyBhbmQgZGVmYXVsdCB0ZW1wbGF0ZQoJICAgICAgYXJncywgaWUKCgkgICAgICAgdGVtcGxhdGUgPGNsYXNzIEEsIGNsYXNzIEIgPSBpbnQ+CiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewoJICAgICAgIH07CgoJICAgICAgICV0eXBlbWFwKGluKSBGb288aW50PiAqey4uLn0KCSAgICAgICAldHlwZW1hcChvdXQpIEZvbzxpbnQsaW50PiAqey4uLn0KCgkgICAgICAgRm9vPGludD4gKiBmb28oIEZvbzxpbnQ+ICpmMSwgRm9vPGludCxpbnQ+ICpmMik7CgoJICAgICAgbm93ICdmMScsICdmMicgYW5kIHRoZSByZXR1cm4gdmFsdWUgcmVzb2x2ZSB0aGUgcHJvdmlkZWQKCSAgICAgIHR5cGVtYXBzIHByb3Blcmx5LgoKCSAgICAgIFRoaXMgaXMgaGlnaGx5IG5lZWRlZCBmb3IgcHJvcGVyIFNUTCBzdXBwb3J0LCBzZWUgbmV3IAoJICAgICAgc3RkX2Jhc2ljX3N0cmluZy5pLCBzdGRfc3N0cmVhbS5pLCBldGMuCgoJICAgIC0gQWRkZWQgc3RkX3NzdHJlYW0uaSwgYW5kIGZpeCBzdGRfYmFzaWNfc3RyaW5nLmkgdG8gdXNlCgkgICAgICB0aGUgbmV3IHR5cGVtYXBzICsgdGVtcGxhdGUgZGVmLiBhcmcgbWVjaGFuaXNtLiBBbHNvLAoJICAgICAgYWRkZWQgdGhlIG5lZWRlZCBzdGRfYWxsb2MuaS4gTm93LCBhbGwgdGhlIGNvbnRhaW5lcnMKCSAgICAgIGNhbiBiZSBtb2RpZmllZCB0byBzdXBwb3J0IHN0ZDo6YWxsb2NhdG9yLCBsaWtlIGluOgoJICAgICAgCgkgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIEEgPSBzdGQ6OmFsbG9jYXRvcjxUID4gPgoJCWNsYXNzIHZlY3RvciB7CgkJcHVibGljOgoJCS4uLi4KCQl9OwoJICAgICAgCgkgICAgICBUaGlzIGNoYW5nZSBpcyBvbmx5IGNvbXBsZXRlZCBieSBub3cgZm9yIGJhc2ljX3N0cmluZy4KCgkgICAgLSBGaXggZm9yIHNtYXJ0IHBvaW50ZXJzICsgbWVtYmVycyArIGV4dGVuc2lvbnM6CgoJICAgICAgJWV4dGVuZCBGb28gewoJICAgICAgICBpbnQgZXh0ZW5zaW9uKGludCBpLCBpbnQgaikgeyByZXR1cm4gaTsgfQoJCWludCBleHRlbnNpb24oKSB7IHJldHVybiAxOyB9CgkgICAgICB9CgoJICAgICAgJWlubGluZSAlewoKCSAgICAgIGNsYXNzIEZvbyB7CgkgICAgICBwdWJsaWM6CgkJaW50IHk7CgkJc3RhdGljIGNvbnN0IGludCB6OwoJICAgICAgfTsKICAKCSAgICAgIGNsYXNzIEJhciB7CgkgICAgICAgIEZvbyAqZjsKCSAgICAgIHB1YmxpYzoKCSAgICAgICAgQmFyKEZvbyAqZikgOiBmKGYpIHsgfQoJCUZvbyAqb3BlcmF0b3ItPigpIHsKCQkgIHJldHVybiBmOwoJCX0KCSAgICAgIH07CgoJICAgICAgbm93IHlvdSBjYW4gCgkgICAgIAoJICAgICAgZiA9IEZvbygpCgkgICAgICBmLnkgPSAzCgkgICAgICBhID0gZi56CgkgICAgICBmLT5leHRlbnNpb24oKQogCgkgICAgICBiID0gQmFyKGYpCgkgICAgICBiLnkgPSAzCgkgICAgICBhID0gYi56CgkgICAgICBiLT5leHRlbnNpb24oKQoKCSAgICAtIE90aGVyIHNtYWxsIGVycm9ycyBmaXhlcywgbW9zdGx5IHB5dGhvbi4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOdW1lcm91cyBkaXJlY3RvciBidWcgZml4ZXMgc28gdGhhdCB0aGUgY29ycmVjdCBqYXZhIHR5cGVzCiAgICAgICAgICAgIGFuZCBjYW5vbmljYWxpemVkIHR5cGVzIGluIHRoZSBKTkkgY29kZSBhcmUgZW1pdHRlZC4gVXNlIG9mIHRoZQogICAgICAgICAgICAkamF2YWNsYXNzbmFtZSBzcGVjaWFsIHZhcmlhYmxlcyBpbiB0aGUgZGlyZWN0b3IgdHlwZW1hcHMgbm93CiAgICAgICAgICAgIGNvbnNpc3RlbnQgd2l0aCB0aGUgbm9uLWRpcmVjdG9yIHR5cGVtYXBzLiBUaGUgdHlwZXMgdXNlZCBmb3IgCiAgICAgICAgICAgIHR5cGVtYXAgbG9va3VwcyBhcmUgYWxzbyBjb3JyZWN0ZWQgaW4gYSBmZXcgcGxhY2VzLiBJZiB5b3UgCiAgICAgICAgICAgIHByZXZpb3VzbHkgaGFkIHlvdXIgb3duIGRpcmVjdG9yIHR5cGVtYXBzLCBlbnN1cmUgdGhleSBhcmUgdXNpbmcgdGhlCiAgICAgICAgICAgIGNvcnJlY3QgQysrIHR5cGUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBESVJFQ1RPUlMgKioqCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBjb25zdCBlbnVtIFNXSUdUWVBFICYgdHlwZW1hcHMgYWRkZWQuIFRoZXNlIHdyYXAgY29uc3QgZW51bSByZWZlcmVuY2VzCiAgICAgICAgICAgIGFzIGlmIHRoZXkgd2VyZSBwYXNzZWQgYnkgdmFsdWUuIENvbnN0IGVudW0gcmVmZXJlbmNlcyB0aHVzIHdvcmsgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgY29uc3QgcmVmZXJlbmNlIHByaW1pdGl2ZSB0eXBlcyBzdWNoIGFzIGNvbnN0IGRvdWJsZSAmLCAKICAgICAgICAgICAgY29uc3QgaW50ICYgZXRjLiBUeXBlbWFwcyBhZGRlZCBmb3IgSmF2YSwgQyMsIFJ1YnksIFRjbCwgUGVybCBhbmQgUGlrZS4KCjExLzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gTmV3IHNwZWNpYWwgdmFyaWFibGU6ICQqamF2YWNsYXNzbmFtZSwgc2ltaWxhciB0byAkamF2YWNsYXNzbmFtZQogICAgICAgICAgICBhbmQgJCZqYXZhY2xhc3NuYW1lLiBUaGUgbmV3IG9uZSByZW1vdmVzIGEgcG9pbnRlciBmcm9tIHRoZSBDIHR5cGUgYmVmb3JlCiAgICAgICAgICAgIG9idGFpbmluZyB0aGUgSmF2YSBjbGFzcyBuYW1lLiBPbmUgb3IgbW9yZSBvZiAkamF2YWNsYXNzbmFtZSwKICAgICAgICAgICAgJCZqYXZhY2xhc3NuYW1lIG9yICQqamF2YWNsYXNzbmFtZSBtYXkgbm93IGFwcGVhciBpbiBhIHR5cGVtYXAuIExpa2V3aXNlIGZvcgogICAgICAgICAgICBDIyB1c2luZyBjc2NsYXNzbmFtZSBpbnN0ZWFkIG9mIGphdmFjbGFzc25hbWUuCgoxMS8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgbGFzdCB2ZXN0aWdlcyBvZiBlbnVtcyBiZWluZyBoYW5kbGVkIGFzIGludGVnZXJzIHJlbW92ZWQgZnJvbSB0aGUKICAgICAgICAgICAgaW50ZXJuYWxzLiBUaGUgd3JhcHBlciBtZXRob2RzIHVzZSB0aGUgZW51bSB0eXBlIHJhdGhlciB0aGFuIGFuIGludAogICAgICAgICAgICBub3cuIFRoZSBuZXQgcmVzdWx0IGlzIGFkZGVkIHR5cGUgc2FmZXR5IGZvciBlbnVtcyB3aGVuIGhhbmRsZWQgYXMKICAgICAgICAgICAgcG9pbnRlcnMsIHJlZmVyZW5jZXMgZXRjLiBQcmV2aW91c2x5IGluIHNpdHVhdGlvbnMgc3VjaCBhcyBhIG1ldGhvZAogICAgICAgICAgICB0YWtpbmcgYSBwb2ludGVyIHRvIGFuIGVudW0sIGEgcG9pbnRlciB0byBhbiBpbnQgb3IgYSBwb2ludGVyIHRvIGFuCiAgICAgICAgICAgIGVudW0gb2Ygc29tZSBvdGhlciB0eXBlIGNvdWxkIGluYWR2ZXJ0YW50bHkgYmUgcGFzc2VkIHRvIHRoZSBtZXRob2QuCiAgICAgICAgICAgIFRoaXMgaXMgbm93IGZpeGVkIGFzIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBlbnVtIGlzIG5vIGxvbmdlciBiYXNlZCBvbgogICAgICAgICAgICBhbiBpbnQsIGJ1dCB0aGUgZW51bSB0eXBlIGluc3RlYWQuIEFub255bW91cyBlbnVtcyBhcmUgc3RpbGwgaGFuZGxlZAogICAgICAgICAgICBhcyBpbnRlZ2Vycy4KCiAgICAgICAgICAgIFRoZSBjb25zZXF1ZW5jZSBmb3Igc2NyaXB0aW5nIGxhbmd1YWdlIHVzZXJzIGluIGNvcnJlY3QgdXNhZ2Ugb2YgZW51bXMKICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBub3RpY2VhYmxlLiBUaGVyZSBpcyBubyBjaGFuZ2UgZm9yIGFueSBvZiB0aGUgbGFuZ3VhZ2VzCiAgICAgICAgICAgIHdoZXJlIGVudW1zIGFyZSBwYXNzZWQgYnkgdmFsdWUgLSBtb3N0IG9mIHRoZSBzY3JpcHRpbmcgbGFuZ3VhZ2VzIHdpbGwKICAgICAgICAgICAgc3RpbGwgYWNjZXB0IGFuIGludGVnZXIgZm9yIGFuIGVudW0gdmFsdWUgYW5kIHRoZSBzdHJvbmdseSB0eXBlZAogICAgICAgICAgICBsYW5ndWFnZXMgc3RpbGwgdXNlIGVpdGhlciB0eXBlc2FmZSBlbnVtcywgaW50ZWdlcnMgb3IgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIGRlcGVuZGluZyBvbiB3aGF0IHRoZSB1c2VyIGNvbmZpZ3VyZXMuIEZvciBKYXZhIGFuZCBDIyB1c2VycyBhIGNoYW5nZQogICAgICAgICAgICBpbiB0aGUgdHlwZXdyYXBwZXIgY2xhc3MgbmFtZSBoYXMgb2NjdXJyZWQgKGZvciBlbnVtIHBvaW50ZXJzLAogICAgICAgICAgICByZWZlcmVuY2VzIGV0YykuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyBvbmU9MSwgdHdvIH07CiAgICAgICAgICAgICAgZW51bSBOdW1iZXJzKiBudW1iZXIoKTsKCiAgICAgICAgICAgIEluIEphdmEgYW5kIEMjIHRoaXMgbXVzdCBub3cgYmUgY29kZWQgYXMKCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9OdW1iZXJzIG4gPSBtb2R1bGVuYW1lLm51bWJlcigpOwoKICAgICAgICAgICAgcmF0aGVyIHRoYW4KCiAgICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQgbiA9IG1vZHVsZW5hbWUubnVtYmVyKCk7CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIxLzIwMDQ6IHdzZnVsdG9uL21tYXR1cwogICAgICAgICAgICBBZGRlZCBtaXNzaW5nIGRlcHJlY2F0ZWQgd2FybmluZyBmb3IgJW5hbWUgYW5kIHJlbW92ZSByZW1haW5pbmcgJW5hbWUKICAgICAgICAgICAgdXNhZ2UgaW4gdGhlIFNXSUcgbGlicmFyaWVzLgoKMTEvMjEvMDQ6IG1tYXR1cwoJICAgIC0gW1B5dGhvbl0gQWRkaW5nIHRoZSBQeVN3aWdPYmplY3QgdG8gYmUgdXNlZCBmb3IgY2FycnlpbmcKCSAgICAgIHRoZSBpbnN0YW5jZSBDL0MrKyBwb2ludGVycy4gVGhpcyBpcyB1c2VkIGluc3RlYWQgb2YKCSAgICAgIHN0cmluZyBhbmQgUHlDT2JqZWN0cy4KCgkgICAgICBUaGUgbmV3IFB5U3dpZ09iamVjdCBpcyBldmVuIHNhZmVyIHRoYW4gUHlDT2JqZWN0LCBhbmQKCSAgICAgIG1vcmUgZnJpZW5kbHkgdGhhbiBwbGFpbiBzdHJpbmdzOgoKCSAgICAgIG5vdyB5b3UgY2FuIGRvCgoJICAgICAgICBwcmludCBhLnRoaXMKCQk8U3dpZyBPYmplY3QgYXQgXzAwNjkxNjA4X3BfQT4KCgkJcHJpbnQgc3RyKGEudGhpcykKCQlfMDA2OTE2MDhfcF9BCgoJCXByaW50IGxvbmcoYS50aGlzKQoJCTEzNTY4NjQwMAoKCQlwcmludCAiJXMgMHgleCIgJSAoYS50aGlzLCBhLnRoaXMpCgkJXzAwNjkxNjA4X3BfQSAweDgxNjY5MDAKCgkgICAgICB0aGUgbGFzdCBvbmUgaXMgdmVyeSB1c2VmdWwgd2hlbiBkZWJ1Z2dpbmcgdGhlIEMvQysrCgkgICAgICBzaWRlLCBzaW5jZSBpcyB0aGUgcG9pbnRlciB2YWx1ZSB5b3Ugd2lsbCB1c3VhbGx5IGdldAoJICAgICAgZnJvbSB0aGUgZGVidWdnZXIuCgoJICAgICAgQWxzbywgaWYgeW91IGhhdmUgc29tZSBvbGQgY29kZSB0aGF0IHVzZXMgdGhlIHN0cmluZwoJICAgICAgcmVwcmVzZW50YXRpb24gIl8wMDY5MTYwOF9wX0EiLCB5b3UgY2FuIHVzZSBpdCBub3cgYWdhaW4KCSAgICAgIHVzaW5nICdzdHIocHRyKScsIG9yIGJ5IGNhbGxpbmcgJ3N0ciA9IFB5T2JqZWN0X1N0cihvYmopJwoJICAgICAgaW4gdGhlIEMvQysrIHNpZGUuCiAKCSAgICAgIFRoaXMgY2hhbmdlIGlzIG1haW5seSBmb3Igbm9zdGFsZ2ljIHN3aWcgdXNlcnMgdGhhdCBtaXNzCgkgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBidXQgYWxzbyBhbGxvd3MgdG8gc2F5IGFnYWluCgoJICAgICAgICBpZiBhLnRoaXMgPT0gYi50aGlzOgoJCSAgcmV0dXJuICJhIGlzIGIiCgoJICAgICAgYW5kIHdlbGwsIHNpbmNlIHRoZSBjaGFuZ2Ugd2VyZSByZWFsbHkgc2ltcGxlLCBtYXliZSBpbgoJICAgICAgdGhlIGZ1dHVyZSB3ZSB3aWxsIGJlIGFibGUgdG8gZG8KICAgCgkJbmV4dCA9IGEudGhpcyArIDEKCgkgICAgICBvciBhZGQgbmF0aXZlIHB5dGhvbiBpdGVyYXRpb24gb3ZlciBuYXRpdmUgQy9DKysgYXJyYXlzLAoJICAgICAgaWUsIG5vIG5lZWQgdG8gY3JlYXRlL2NvcHkgbmV3IHR1cGxlcyB3aGVuIHJldHVybmluZyBhbmQKCSAgICAgIGFycmF5IG9yIHZlY3Rvci4KCgkgICAgICBBbHNvLCBhIFB5U3dpZ1BhY2tlZCBvYmplY3Qgd2FzIGFkZGluZyB0byBjYXJyeSBhIG1lbWJlcgoJICAgICAgbWV0aG9kIHBvaW50ZXIsIGJ1dCB0aGlzIGlzIHByb2JhYmx5IGEgdGVtcG9yYWwgc29sdXRpb24KCSAgICAgIHVudGlsIGEgbW9yZSBnZW5lcmFsIG9iamVjdCBmb3IgbWV0aG9kcyBpcyBhZGRlZC4KCgkgICAgICBCZSBhd2FyZSB0aGF0IHRvIHNpbXBsaWZ5IG1haW50YWluaW5nIGFuZCBjb21wYXRpYmlsaXR5CgkgICAgICB3aXRoIG90aGVyIHRvb2xzLCB0aGUgb2xkIHN0cmluZyBhbmQgUHlDT2JqZWN0cwoJICAgICAgcmVwcmVzZW50YXRpb24gY291bGQgZGlzYXBwZWFyIHZlcnkgc29vbiwgYW5kIHRoZQoJICAgICAgU1dJR19DT0JKRUNUU19UWVBFUyBvciBTV0lHX05PX09CSkVDVF9UWVBFUyBtYWNyb3Mgd2lsbAoJICAgICAgaGF2ZSBubyBlZmZlY3QgYXQgY29tcGlsYXRpb24gdGltZS4gU3RpbGwsIHRoZSB0aHJlZQoJICAgICAgbWVjaGFuaXNtcyBhcmUgcHJlc2VudCBpbiB0aGUgY29kZSBqdXN0IGZvciB0ZXN0aW5nLAoJICAgICAgZGVidWdnaW5nIGFuZCBjb21wYXJpc29uIHB1cnBvc2VzLgoJICAgICAgCjExLzIxLzA0OiBtbWF0dXMKCgkgICAgLSBbUHl0aG9uXSBBZGRpbmcgYmFjayBzdXBwb3J0IGZvciB1c2luZyB0aGUgc3dpZyBydW50aW1lIGNvZGUKCSAgICAgIGluc2lkZSB0aGUgdXNlciBjb2RlLiBXZSBqdXN0IGFsbG93IHRoZSB1c2VyIHRvIGluY2x1ZGUKCSAgICAgIHRoZSBtaW5pbWFsIGNvZGUgbmVlZGVkIHRvIGltcGxlbWVudCB0aGUgcnVudGltZQoJICAgICAgbWVjaGFuaXNtIHN0YXRpY2FsbHksIGp1c3QgYXMgaW4gZG9uZSBpbiB0aGUgc3dpZwoJICAgICAgbW9kdWxlcy4KCSAgICAgIAoJICAgICAgVG8gdXNlIHRoZSBzd2lnIHJ1bnRpbWUgY29kZSwgZm9yIGV4YW1wbGUgd2l0aCBweXRob24sCgkgICAgICB0aGUgdXNlciBuZWVkcyBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CiAKICAgICAgICAgICAgICAgI2luY2x1ZGUgPFB5dGhvbi5oPiAgICAgICAgIC8vIG9yIHVzaW5nIHlvdXIgZmF2b3JpdGUgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgI2luY2x1ZGUgPHN3aWdydW4uc3dnPgogICAgICAgICAgICAgICAjaW5jbHVkZSA8cHl0aG9uL3B5cnVuLnN3Zz4gLy8gb3IgdXNpbmcgeW91ciBmYXZvcml0ZSBsYW5ndWFnZQogICAgICAgICAgICAgICAjaW5jbHVkZSA8cnVudGltZS5zd2c+CgoJICAgICAgdGhlIGZpbGVzIHN3aWdydW4uc3dnLCBweXJ1bi5zd2cgYW5kIHJ1bnRpbWUuc3dnIGNhbiAKCSAgICAgIGJlIGNoZWNrZWQgb3V0IGJ5IHVzaW5nIHN3aWcgLWNvLCBvciB0aGV5IGNhbiBzaW1wbHkgCgkgICAgICBiZSBmb3VuZCBieSBhZGRpbmcgdGhlIHN3aWcgbGliIGRpcmVjdG9yeSB0byB0aGUKCSAgICAgIGNvbXBpbGVyIGluY2x1ZGUgZGlyZWN0b3J5IGxpc3QsIGZvciBleGFtcGxlCgoJICAgICAgIFNXSUdMSUI9YHN3aWcgLXN3aWdsaWJgCgkgICAgICAgYysrIC1JJHtTV0lHTElCfSAuLgoKCSAgICAgIG9mIGJldHRlciwgdXNpbmcgdGhlIENQUEZMQUdTLCBidXQgdGhhdCBkZXBlbmRzIG9uIHlvdXIKCSAgICAgIGVudmlyb25tZW50LgoJICAgICAgIAoJICAgICAgVGhpcyBjaGFuZ2UgY2FuIGJlIHBvcnRlZCB0byB0aGUgb3RoZXIgbGFuZ3VhZ2VzIHRvbywKCSAgICAgIHlvdSBqdXN0IG5lZWQgdG8gaXNvbGF0ZSB0aGUgbmVlZGVkIHJ1bnRpbWUgY29kZSBpbgoJICAgICAgYSBzaW5nbGUgZmlsZSBsaWtlICdweXJ1bi5zd2cnLCBhbmQgcHJvdmlkZSB0aGUgCgkgICAgICBTV0lHX1J1bnRpbWVfR2V0VHlwZUxpc3QoKSBtZXRob2QuIExvb2sgYXQgdGhlCgkgICAgICBMaWIvcHl0aG9uL3B5cnVuLnN3ZyBmaWxlIGFuZCB0aGUgRXhhbXBsZXMvcHl0aG9uL3N3aWdydW4KCSAgICAgIGV4YW1wbGUuCgoxMS8xNS8wNDogbW1hdHVzCgkgICAgLSBGaXggbWl4ZWRfdHlwZXMuaSArIGdjYy0zLjQsIGllLCBhcnJheXMgKyByZWZlcmVuY2VzICsKCSAgICAgIHR5cGVkZWZzCgoJICAgIC0gRml4IG11bHRpZGltIGFycmF5cyArIHR5cGVkZWZzLGllCgoJICAgICAgIHR5cGVkZWYgY2hhciBjaGFyYWN0ZXJbMV07CgkgICAgICAgdHlwZWRlZiBjaGFyYWN0ZXIgd29yZFs2NF07CgoJICAgIC0gUHJvY2VzcyBwcm90ZWN0ZWQvcHJpdmF0ZSBiYXNlcyBpbiB0aGUgc2FtZSB3YXkgYmVmb3JlCgkgICAgICB3ZSBwcm9jZXNzIHByb3RlY3RlZC9wcml2YXRlIG1lbWJlcnMsIGllLCB3ZSBjaGVjawoJICAgICAgZm9yIGNvbnN0cnVjdG9ycywgb3BlcmF0b3IgbmV3LCB2aXJ0dWFsIG1lbWJlcnMsIGV0Yy4KICAgCgkgICAgLSBGaXggUnVieS9KYXZhIHRvIHdvcmsgKG9yIGlnbm9yZSkgbXVsdGktaW5oZXJpdGFuY2UgKwogICAgICAgICAgICAgIGRpcmVjdG9ycy4gQWxsb3cgb3RoZXIgbGFuZ3VhZ2VzIHRvIGRlZmluZSBpZiBpdCBpcwogICAgICAgICAgICAgIHN1cHBvcnRlZCBvciBub3QuCgkgICAgCgkgICAgLSBOb3cgeW91IGNhbiBydW4KCiAgICAgICAgICAgICAgICBTV0lHX0ZFQVRVUkVTPSItZGlyZWN0b3JzIC1kaXJwcm90IiAKICAgICAgICAgICAgICAgIG1ha2UgY2hlY2stcnVieS10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlCiAgICAgICAgICAgICAgICBtYWtlIGNoZWNrLWphdmEtdGVzdC1zdWl0ZQogICAgICAgICAgICAgICAgbWFrZSBjaGVjay1vY2FtbC10ZXN0LXN1aXRlCgoJICAgICAgYW5kIHlvdSB3aWxsIGdldCBvbmx5ICdyZWFsJyBlcnJvcnMuIHJ1YnkgYW5kIHB5dGhvbgoJICAgICAgY29tcGlsZSB3aXRoIG5vIGVycm9ycywgamF2YSBzaG93cyBzb21lIHByb2JsZW1zLgkKClZlcnNpb24gMS4zLjIzIChOb3ZlbWJlciAxMSwgMjAwNCkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggIzk4Mjc1MyBmcm9tIEZhYnJpY2UgU2FsdmFpcmU6IEFkZHMgZGVwZW5kZW5jaWVzIGdlbmVyYXRpb24gZm9yCiAgICAgICAgICAgIGNvbnN0cnVjdGluZyBtYWtlZmlsZXMuIE5ldyBjb21tYW5kIGxpbmUgb3B0aW9ucyAtTUYgLU1EIC1NTUQgdG8gd29yawogICAgICAgICAgICB3aXRoIHRoZSBjdXJyZW50IG9wdGlvbnMgLU0gYW5kIC1NTS4gVGhlc2Ugb3B0aW9ucyBhcmUgbmFtZWQgdGhlIHNhbWUKICAgICAgICAgICAgYW5kIHdvcmsgdGhlIHNhbWUgYXMgaW4gZ2NjLgoKMTEvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgJWlnbm9yZS8lcmVuYW1lIGNoYW5nZXMgZm9yIG1ldGhvZHMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB0byBtaXJyb3IKICAgICAgICAgICAgJWZlYXR1cmUgYmVoYXZpb3VyLiBTZWUgcHJldmlvdXMgZW50cnkuCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMS8wNC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICAlZmVhdHVyZSBpbXByb3ZlbWVudHMgZm9yIGZpbmUgdHVuaW5nIHdoZW4gd3JhcHBpbmcgbWV0aG9kcyB3aXRoCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLiBBbnkgJWZlYXR1cmUgdGFyZ2V0aW5nIGEgbWV0aG9kIHdpdGggZGVmYXVsdCBhcmd1bWVudHMKICAgICAgICAgICAgd2lsbCBhcHBseSB0byBhbGwgdGhlIGV4dHJhIG92ZXJsb2FkZWQgbWV0aG9kcyB0aGF0IFNXSUcgZ2VuZXJhdGVzIGlmIHRoZQogICAgICAgICAgICBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlLiBJZiB0aGUgZGVmYXVsdCBhcmd1bWVudHMgYXJlCiAgICAgICAgICAgIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGZlYXR1cmUsIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBtYXRjaCB0aGF0IGV4YWN0CiAgICAgICAgICAgIHdyYXBwZXIgbWV0aG9kIG9ubHkgYW5kIG5vdCB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2RzIHRoYXQgU1dJRyBnZW5lcmF0ZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgaGVsbG8oaW50IGk9MCwgZG91YmxlIGQ9MC4wKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHdpbGwgYXBwbHkgdGhlIGZlYXR1cmUgdG8gYWxsIHRocmVlIHdyYXBwZXIgbWV0aG9kcywgdGhhdCBpczoKCiAgICAgICAgICAgICAgdm9pZCBoZWxsbyhpbnQgaSwgZG91YmxlIGQpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgSWYgdGhlIGRlZmF1bHQgYXJndW1lbnRzIGFyZSBub3Qgc3BlY2lmaWVkIGluIHRoZSBmZWF0dXJlOgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZXhjZXB0IikgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKICAgICAgICAgICAgICB2b2lkIGhlbGxvKGludCBpPTAsIGRvdWJsZSBkPTAuMCk7CgogICAgICAgICAgIHRoZW4gdGhlIGZlYXR1cmUgd2lsbCBvbmx5IGFwcGx5IHRvIHRoaXMgd3JhcHBlciBtZXRob2Q6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGksIGRvdWJsZSBkKTsKCiAgICAgICAgICAgYW5kIG5vdCB0aGVzZSB3cmFwcGVyIG1ldGhvZHM6CgogICAgICAgICAgICAgIHZvaWQgaGVsbG8oaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgaGVsbG8oKTsKCiAgICAgICAgICAgVGhpcyBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIG1ha2UgJWZlYXR1cmUgbW9yZSBwb3dlcmZ1bCB0byBlYXNlIHRoZSBtaWdyYXRpb24KICAgICAgICAgICB0byBuZXcgZGVmYXVsdCBhcmd1bWVudHMgd3JhcHBpbmcgYXBwcm9hY2guCgogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgogICAgICAgICAgIElmIHlvdSBwcmV2aW91c2x5IGhhZCBhICVmZWF0dXJlIGFuZCBkaWRuJ3Qgc3BlY2lmeSB0aGUgZGVmYXVsdCBhcmd1bWVudHMsCiAgICAgICAgICAgeW91IHdpbGwgaGF2ZSB0byBhZGQgdGhlbSBpbiBub3cgb3IgeW91IGNhbiBvYnRhaW4gdGhlIG9yaWdpbmFsIGJlaGF2aW91cgogICAgICAgICAgIGJ5IHVzaW5nICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKS4KCjExLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVHlwZW1hcHMgZm9yIHN0ZDo6dmVjdG9yIGFkZGVkIGludG8gc3RkX3ZlY3Rvci5pLiBUaGUgcHJveHkgY2xhc3NlcwogICAgICAgICAgICBnZW5lcmF0ZWQgYXJlIG1vZGVsbGVkIG9uIHRoZSAuTkVUIEFycmF5TGlzdCBjbGFzcy4gVGhpcyBpc24ndCBxdWl0ZQogICAgICAgICAgICByZWFkeSBmb3IgZ2VuZXJhbCBjb25zdW1wdGlvbiB5ZXQsIGJ1dCB3aWxsIHdvcmsgd2l0aCB2ZWN0b3JzIG9mIHByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyBhbmQgc29tZSBjbGFzc2VzLgoKMTAvMy8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0dVSUxFXSBUaGUgLXNjbSBpbnRlcmZhY2UgaXMgbm93IHRoZSBkZWZhdWx0LiAgVGhlIG9sZCBHSCBpbnRlcmZhY2UgY2FuCgkgICAgc3RpbGwgYmUgZW5hYmxlZCBieSBwYXNzaW5nIC1naCB0byBTV0lHLgoKMTAvMi8yMDA0OiBtbWF0dXMKCgkgICAgLSBNb3JlIGZpeGVzIGZvciBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMuCgkgICAgICBBcyBhbiBleHRyYSBib251cywgd2UgZ2V0ICV0ZW1wbGF0ZSBzdXBwb3J0IGZvciBzdGF0aWMvbWVtYmVycyBjbGFzcwoJICAgICAgbWV0aG9kcywgaWUsIG5vdyB5b3UgY2FuIHNheToKCgkgICAgICAgIG5hbWVzcGFjZSBzcGFjZSB7CiAgICAgICAgICAgICAgICAgc3RydWN0IEEJCQkgICAgCgkgICAgICAgICB7CQkJCSAgICAKCSAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFk+CSAgICAKCSAgICAgICAgICAgc3RhdGljIHZvaWQgZm9vVChZIHkpIHsgfQoJICAgICAgICAgfTsJCgkJfQkJCSAgICAKCSAgICAgIAkgICAgICAJCQkgICAgCgkgICAgICAgIHN0cnVjdCBCCQkJICAgIAoJICAgICAgICB7CQkJCSAgICAKCSAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgWT4JCSAgICAKCSAgICAgICAgICB2b2lkIGJhclQoWSB5KSB7fSAKCSAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAKCgkJJXRlbXBsYXRlKGZvbykgc3BhY2U6OkE6OmZvb1Q8ZG91YmxlPjsKCQkldGVtcGxhdGUoZm9vKSBzcGFjZTo6QTo6Zm9vVDxpbnQ+OwoJCSV0ZW1wbGF0ZShmb28pIHNwYWNlOjpBOjpmb29UPGNoYXI+OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoJCSV0ZW1wbGF0ZShiYXIpIEI6OmJhclQ8ZG91YmxlPjsKCQkldGVtcGxhdGUoYmFyKSBCOjpiYXJUPGludD47CgkJJXRlbXBsYXRlKGJhcikgQjo6YmFyVDxjaGFyPjsKCgkgICAgICBhbmQgY2FsbAoKCSAgICAgICAgQS5mb28oMSkKCQliID0gQigpCgkJYi5iYXIoMSkKCSAgICAgIAoJICAgICAgbm90ZSB0aGUgbWV0aG9kcyBhcmUgZW1pdHRlZCBpbnNpZGUgdGhlIGNsYXNzZXMsCgkgICAgICBhbmQgaGVuY2UsIHRoZSAldGVtcGxhdGUgbmFtZSByZWZlcnMgdG8gdGhlICdtZW1iZXInCgkgICAgICBtZXRob2QgbmFtZSwgbm90IGEgZ2xvYmFsIG5hbWVzcGFjZSBuYW1lLgoKMTAvMzEvMjAwNDogbW1hdHVzCgkgICAgLSBTb2x2ZSBuYW1lc3BhY2UgKyBjbGFzcyBkZWNsYXJhdGlvbnMsIGFzIGluCgoJICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgIHN0cnVjdCBCYXI7CgkJIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHN0cnVjdCBmb286OkJhciA6IEZvbyB7CiAgICAgICAgICAgICAgIH07CgoJICAgICAgIHNlZSBuYW1lc3BhY2VfY2xhc3MuaSBmb3IgbW9yZSBleGFtcGxlcy4KCiAgICAgICAgICAgIC0gRml4ICV0ZW1wbGF0ZSBkaXJlY3RpdmUgdG8gcHJvcGVybHkgdXNlIG5hbWVzcGFjZXMsCiAgICAgICAgICAgICAgaW5jbHVkaW5nIHRoZSBjYXNlOgoKCQkgICBuYW1lc3BhY2Ugb25lCgkJICAgewoJCSAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KCQkgICAgICAgc3RydWN0IFB0ciB7fTsKICAgICAgICAgICAgICAgICAgIH0KCgkJICAgbmFtZXNwYWNlIG9uZQoJCSAgIHsJCSAgCgkJICAgICAgIHN0cnVjdCBPYmoxIHt9OwoJCSAgICAgICB0eXBlZGVmIFB0cjxPYmoxPiBPYmoxX3B0cjsKICAJCSAgICAgICAldGVtcGxhdGUoT2JqMV9wdHIpIFB0cjxPYmoxPjsgCgkJICAgfQkJCQkgIAoJCSAgIAkJCQkgIAoJCSAgIG5hbWVzcGFjZSB0d28gIAoJCSAgIHsKCQkgICAgICAgc3RydWN0IE9iajIge307CQoJCSAgICAgICB0eXBlZGVmIG9uZTo6UHRyPE9iajI+IE9iajJfcHRyOwoJCSAgICAgICAldGVtcGxhdGUoT2JqMl9wdHIpIG9uZTo6UHRyPE9iajI+OwoJCSAgIH0KCgkgICAgICB0aGlzIGlzIGRvbmUgYnkgdXNpbmcgdGhlIG5hbWVzcGFjZSBuYW1lICdvbmUnIHRvIGNyZWF0ZQogICAgICAgICAgICAgIGEgbmFtZXNwYWNlIG5vZGUgdG8gZW1pdCB0aGUgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwKICAgICAgICAgICAgICBqdXN0IGFzIGJlZm9yZSwgYnV0IHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSByZXNvbHZlZAogICAgICAgICAgICAgIGFuZCBxdWFsaWZpZWQgaW4gdGhlIGN1cnJlbnQgbmFtZXNwYWNlICgnb25lJyBvciAndHdvJykuCiAgICAgICAgICAgICAgVGhpcyBpcyBzYW1lIHdheSB0aGF0IHR5cGVkZWYgd29ya3MuIAoKCSAgICAgIFRoaXMgcmVzb2x2ZSB0aGUgc21hcnRfcG9pbnRlcl9uYW1lc3BhY2UyLmkgY2FzZSwgYW5kIGF0CiAgICAgICAgICAgICAgdGhlIHNhbWUgdGltZSwgc2V2ZXJhbCBvdGhlciBvbmVzIHdoZXJlIGJlZm9yZSBzd2lnIHdhcwogICAgICAgICAgICAgIGdlbmVyYXRpbmcgdGhlCgoJICAgICAgICAiQ2FuJ3QgaW5zdGFudGlhdGUgdGVtcGxhdGUgJ3h4JyBpbnNpZGUgbmFtZXNwYWNlICd5eSciCgkgICAgICAKCSAgICAgIGVycm9yIG1lc3NhZ2UuIEluIGZhY3QsIHRoYXQgZXJyb3IgZG9lc24ndCBleGlzdAoJICAgICAgYW55bW9yZS4gWW91IGNhbiBvbmx5IGdldCBhbiBlcnJvciBpZiB5b3UgdXNlIGEgYmFkCgkgICAgICBuYW1lc3BhY2UgbmFtZSBvciBzby4KCjEwLzMwLzIwMDQ6IG1tYXR1cwoJICAgIC0gW3J1YnldIERpcmVjdG9ycyBmaXhlczoKCSAgICAgIC0gZW51bXMgYW5kIHN0ZDo6c3RyaW5ncyBhcmUgd29ya2luZyBub3cgKHNldmVyYWwKCSAgICAgICAgcmVwb3J0cyBpbiBidWcgdHJhY2sgc3lzdGVtKQoJICAgICAgLSBhZGRlZCBwYXRjaCAxMDI1ODYxIGZvciBkaXJlY3RvciArIGV4Y2VwdGlvbnMKCQkKICAgICAgICAgICAgICAqKiogQXR0ZW50aW9uICoqKjogcnVieSB3aXRoIGRpcmVjdG9ycyArIHByb3RlY3RlZAogICAgICAgICAgICAgIG1lbWJlcnMgd29yayB3aXRoIHZlcnNpb24gMS43Ky4gT2xkZXIgdmVyc2lvbnMgc2VlbXMgdG8KICAgICAgICAgICAgICBoYXZlIGEgYnJva2VuIHNpZ25hdHVyZSBmb3IncmJfcHJvdGVjdCcuCgkJCgkgICAgICBJZiB5b3UgbmVlZCB0byB1c2UgYW4gb2xkIHZlcnNpb24sIGxvb2sgYXQKCgkgICAgICBodHRwOi8vZXhjcnVieS5zb3VyY2Vmb3JnZS5uZXQvZG9jcy9odG1sL3J1YnlfX2hhY2tzXzhocHAtc291cmNlLmh0bWwKICAJICAgICAgZm9yIHdvcmthcm91bmRzLgoJICAgICAgCiAgICAgICAgICAgIC0gW3J1YnldIEZpeCBtZW1vcnkgYWxsb2NhdGlvbiBwcm9ibGVtIGluIHR5cGVtYXAgKGJ1ZyAxMDM3MjU5KQoKCSAgICAtIFt0Y2xdIEZpeCAoZW51bXN8Y29uc3RhbnRzKSArIG5hbWVzcGFjZSBvcHRpb24gCgkgICAgICAgICAgICAocmVwb3J0ZWQgYnkgamFzb24ubS5zdXJwcmlzZUBpbnRlbC5jb20pLgoKICAgICAgICAgICAgLSBbcGVybF0gQWRkIHBhdGNoIDk2MjE2OCBmb3IgbXVsdGlwbGUgaW5oZXJldGFuY2UKCSAgICAKCSAgICAtIEZpeCAnZGVmaW5lZCcgYXMgdmFyaWFibGUgbmFtZS4KCjEwLzI5LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFNlZyBmYXVsdCBmaXggZm9yIGdsb2JhbCBzY29wZSBvcGVyYXRvciB1c2VkIGZvciBmcmllbmQgbWV0aG9kczoKCiAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBmcmllbmQgdm9pZCA6Omdsb2JhbHNjb3BlKCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKMTAvMjgvMjAwNDptbWF0dXMKCSAgICAtIEFkZGVkIG1vZHVsZSBhbmQgc3dpZyBvcHRpb24gInRlbXBsYXRlcmVkdWNlIiB0byBmb3JjZSBzd2lnCgkgICAgICB0byByZWR1Y2UgYW55IHR5cGUgbmVlZGVkIHdpdGggdGVtcGxhdGVzLCBpZSwgaW4gdGhlc2UgY2FzZXMKCiAgICAgICAgICAgICAgICAlbW9kdWxlKCJ0ZW1wbGF0ZXJlZHVjZSIpIHRlc3QKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEEgeyB9OwoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludDsKCSAgICAgICAgJXRlbXBsYXRlKEFfSW50KSBBPEludD4gID09PiAgJXRlbXBsYXRlKEFfSW50KSBBPGludD4KCiAgICAgICAgICAgICAgICB0eXBlZGVmIEIqIEJwOwoJICAgICAgICAldGVtcGxhdGUoQV9CcCkgQTxCcD4gID09PiAgJXRlbXBsYXRlKEFfQnApIEE8Qio+CgogICAgICAgICAgICAgIHN3aWcgcmVkdWNlcyB0aGUgdHlwZXMgSW50IGFuZCBCcCB0byB0aGVpciBwcmltaXRpdmVzCiAgICAgICAgICAgICAgaW50IGFuZCBCKi4gVGhpcyBpcyBjbG9zZXIgdG8gdGhlIHVzdWFsIGNvbXBpbGVyCiAgICAgICAgICAgICAgcmVzb2x1dGlvbiBtZWNoYW5pc20sIGFuZCBpdCBpcyByZWFsbHkgbmVlZGVkIHNvbWV0aW1lcwogICAgICAgICAgICAgIHdoZW4geW91IG1peCB0ZW1wbGF0ZXMgKyB0eXBlZGVmcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgICBEb24ndCB1c2UgaXQgaWYgeW91IGRvbid0IGhhdmUgYW55IHByb2JsZW0gYWxyZWFkeSwKCSAgICAgIHNpbmNlIHRoZSB0eXBlIHJlZHVjdGlvbiBjYW4gaW50ZXJmZXJlIHdpdGggc29tZQoJICAgICAgdXNlciB0eXBlbWFwcywgc3BlY2lhbGx5IGlmIHlvdSBkZWZpbmVkIHNvbWV0aGluZyBsaWtlCgoJCSAgIHR5cGVkZWYgaW50IEludDsKCQkgICAldHlwZW1hcChpbikgSW50IC4uLjsKCiAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlLCB3aGVuIHlvdSB1c2UgdGhlICJ0ZW1wbGF0ZXJlZHVjZSIgb3B0aW9uLAoJICAgICAgc3dpZyB3aWxsIGlnbm9yZSB0aGUgdXNlciB0eXBlbWFwLCBzaW5jZSB0aGUgInR5cGVkZWYgaW50IEludCIKCSAgICAgIHdpbGwgdGFrZSBwcmVjZWRlbmNlLCBhbmQgdGhlIHVzdWFsICJpbnQiIHR5cGVtYXAgd2lsbCBiZQoJICAgICAgYXBwbGllZC4gCgoJICAgICAgTm90ZSB0aGF0IHRoZSBwcmV2aW91cyBjYXNlIGlzIG5vdCBjb21tb24sIGFuZCBzaG91bGQgYmUKCSAgICAgIGF2b2lkZWQsIGllLCBpcyBub3QgcmVjb21tZW5kZWQgdG8gdXNlIGEgdHlwZWRlZiBhbmQgYQoJICAgICAgdHlwZW1hcCBhdCB0aGUgc2FtZSB0aW1lLCBzcGVjaWFsbHkgaWYgeW91IGFyZSBnb2luZyB0bwoJICAgICAgdXNlIHRlbXBsYXRlcyArIHNwZWNpYWxpemF0aW9ucy4KCgkgICAgLSBEaXJlY3RvcnM6CgoJICAgICAgICB2aXJ0dWFsIGRlc3RydWN0b3IgaXMgYWx3YXlzIGVtaXR0ZWQgbm93LCB0aGlzIGRvZXNuJ3QKCSAgICAgICAgY2F1c2UgYW55IGhhcm0sIGFuZCBjb3VsZCBzb2x2ZSBzb21lIG5hc3R5IGFuZAoJICAgICAgICBteXN0ZXJpb3VzIGVycm9ycywgbGlrZSB0aGUgb25lIG1lbnRpb25lZCBieSBTY290dC4KCgkJYWxzbyB0aGUgZGVzdHJ1Y3RvciBpcyBub3QgaW4tbGluZWQsIHNvLCB0aGF0IGNhbiBzb2x2ZQoJCXNvbWUgb3RoZXIgbXlzdGVyaW91cyBlcnJvcnMgd2hlbiBtaXhpbmcgZGlyZWN0b3JzICsKCQlpbXBvcnRzICsgZW1iZWRkZWQgYXBwbGljYXRpb25zICsgc29tZSBzcGVjaWZpYyBjb21waWxlcnMuCgkJCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gdHlwZW1hcHMuaSBsaWJyYXJ5IGZpbGUgd2l0aCBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBhZGRlZC4KCjEwLzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBzdGQ6OndzdHJpbmcgdHlwZW1hcCBmaXhlcyBpbiBzdGRfc3RyaW5nLmkgZnJvbSBSdXNzZWxsIEtlaXRoLU1hZ2VlLgoKMTAvMjUvMjAwNDogbW1hdHVzIAoKCSAgICAtIFVzaW5nICsgbmFtZXNwYWNlIGlzIHdvcmtpbmcgbm93ICh1c2luZ19uYW1lc3BhY2UuaSkuCgoJICAgIC0gRGVyaXZlZCArIG5lc3RlZCBjbGFzc2VzIGlzIHdvcmtpbmcgbm93CgkgICAgICAoZGVyaXZlcl9uZXN0ZWQuaSksIGJ1dCBvZiBjb3Vyc2UsIHdlIGFyZSBzdGlsbCB3YWl0aW5nCgkgICAgICBmb3IgdGhlIG5lc3RlZCBjbGFzcyBzdXBwb3J0LgoJICAgIAoJICAgIC0gRGlyZWN0b3JzOgoJICAgICAgLSB1bm5hbWVkIHBhcmFtZXRlcnMgc3VwcG9ydCwKCgkgICAgICAtIHByb3RlY3RlZCBjb25zdHJ1Y3RvciBzdXBwb3J0IChhdXRvbWF0aWMgYW5kIHdpdGgKICAgICAgICAgICAgICAgIGRpcnByb3QgbW9kZSksCgoJICAgICAgLSBkZXRlY3Rpb24gb2YgcmVhbGx5IG5lZWRlZCBwcm90ZWN0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAobWVtYmVycyBhbmQgY29uc3RydWN0b3JzKSBub3cgaXMgZG9uZSBhdXRvbWF0aWNhbGx5LgogICAgICAgICAgICAgICAgRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIHRoZSAnZGlycHJvdCcgbW9kZSwgc3dpZyB3aWxsCiAgICAgICAgICAgICAgICB3cmFwIHdoYXQgaXMgbWluaW1hbGx5IG5lZWRlZCAoYW5kIHByb3RlY3RlZCkgZm9yIHRoZQogICAgICAgICAgICAgICAgY29kZSB0byBjb21waWxlLgoJCQoJCXdoYXQgaXMgcHVibGljLCBhcyB1c3VhbCwgaXMgYWx3YXlzIHdyYXBwZWQsIGFuZCBpZgoJCXlvdSB1c2UgdGhlICdkaXJwb3J0JwoJCQoKCSAgICAtIEZpbmFsIGZpeGVzIGZvciB0aGUgT1NTIHRvIGNvbXBpbGUgd2l0aCBTV0lHIDEuMy4yMyAobXkKCSAgICAgIHZlcnkgdmVyeSB1Z2x5IEMrKyArIHRlbXBsYXRlcyArIGV2ZXJ5dGhpbmcgbW91bnRlcnMgd3JhcCkuCgoxMC8yNS8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbQyNdIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLWRsbGltcG9ydC4gVGhpcyBlbmFibGVzIG9uZSB0byBzcGVjaWZ5CiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBETEwgZm9yIHRoZSBEbGxJbXBvcnQgYXR0cmlidXRlLiBOb3JtYWxseSB0aGlzIG5hbWUKICAgICAgICAgICAgY29tZXMgZnJvbSB0aGUgbW9kdWxlIG5hbWUsIHNvIG5vdyBpdCBpcyBwb3NzaWJsZSB0byBvdmVycmlkZSB0aGlzOgoKICAgICAgICAgICAgICBzd2lnIC1jc2hhcnAgLWRsbGltcG9ydCB4eXogZXhhbXBsZS5pCgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGZvciBhbGwgdGhlIHdyYXBwZWQgUEludm9rZSBtZXRob2RzOgoKICAgICAgICAgICAgICBbRGxsSW1wb3J0KCJ4eXoiLCBFbnRyeVBvaW50PSIuLi4iKV0KICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGV4dGVybiAuLi4KCiAgICAgICAgICAgIFRoZSB3cmFwcGVycyBmcm9tIG1hbnkgZGlmZmVyZW50IFNXSUcgaW52b2NhdGlvbnMgY2FuIHRodXMgYmUgY29tcGlsZWQKICAgICAgICAgICAgaW50byBvbmUgRExMLgoKICAgICAgICAgICAgQSBuZXcgc3BlY2lhbCB2YXJpYWJsZSAkZGxsaW1wb3J0IGNhbiBhbHNvIGJlIHVzZWQgaW4gdHlwZW1hcHMsIHByYWdtYXMsCiAgICAgICAgICAgIGZlYXR1cmVzIGV0Yy4gVGhpcyB3aWxsIGdldCB0cmFuc2xhdGVkIGludG8gdGhlIHZhbHVlIHNwZWNpZmllZCBieSAtZGxsaW1wb3J0CiAgICAgICAgICAgIGlmIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHRoZSBtb2R1bGUgbmFtZS4KCjEwLzIyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBQYXRjaCAjMTA0OTQ5NiBmcm9tIFNjb3R0IE1pY2hlbCBmaXhlcyBkaXJlY3RvcnMgbWV0aG9kcyB3aXRoIAogICAgICAgICAgICBlbnVtcyB3aGVuIHdyYXBwZWQgd2l0aCB0eXBlc2FmZSBvciBwcm9wZXIgSmF2YSBlbnVtcy4KCjEwLzIxLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyBpbiBkaXJlY3RvciBjb25zdHJ1Y3RvcnMgKFB5dGhvbiwgUnVieSwgT2NhbWwpLgoKMTAvMjEvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctY3BsdXNjYXN0JyBvcHRpb24gdG8gZW5hYmxlIHRoZSAnbmV3JwoJICAgICAgQysrIGNhc3Rpbmcgb3BlcmF0b3JzLCBzdWNoIGFzICdzdGF0aWNfY2FzdCcsIGluc2lkZSB0aGUKCSAgICAgIHR5cGVtYXBzLiBCeSBkZWZhdWx0IHN3aWcgdXNlIHRoZSBvbGQgQyBjYXN0IHN0eWxlLCBldmVuCgkgICAgICB3aGVuIHBhcnNpbmcgQysrLgoJICAgICAgCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbmV3X3Z3bScgb3B0aW9uIHRvIGVuYWJsZSB0aGUgbmV3CiAgICAgICAgICAgICAgU3dpZ1ZhbHVlV3JhcHBlciBtb2RlLiBOb3cgdGhpcyBpcyBtYWlubHkgZm9yIHRlc3RpbmcKICAgICAgICAgICAgICB0aGF0IHRoZSB0eXBlbWFwcyBhcmUgcmVhbGx5IHNhZmUgZm9yIGFueSBmdXR1cmUKICAgICAgICAgICAgICBzb2x1dGlvbiwgYnV0IHlvdSBjYW4gdXNlIGl0IGlmIHlvdSBoYXZlIGEgdmVyeSBzdHJhbmdlCiAgICAgICAgICAgICAgZXJyb3Igd2l0aCBkZWZhdWx0IGNvc250cnVjdG9ycyBtaXNzaW5nICsgJWFwcGx5ICsKICAgICAgICAgICAgICAldHlwZW1hcCwgYW5kIGlmIGV2ZXJ5dGhpbmcgZWxzZSBmYWlscyAoc2VlCiAgICAgICAgICAgICAgdmFsdXdyYXBwZXJfb3BhcXVlLmkgZm9yIGFsdGVybmF0aXZlIGFuZCBjdXJyZW50CiAgICAgICAgICAgICAgc29sdXRpb25zKS4gSWYgeW91IGFyZSBhIHVzZXIgdGhhdCBkb24ndCBrbm93IHdoYXQgaXMKICAgICAgICAgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBkb24ndCBldmVuIHRyeSBpdC4KCgkgICAgLSBbUHl0aG9uXSBBZGQgdGhlICctbm9oJyBvcHRpb24gdG8gYmUgdXNlZCB3aXRoIGRpcmVjdG9ycwoJICAgICAgYW5kIHdoZW4geW91IHByZWZlciB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQoJICAgICAgZGlyZWN0b3IgaGVhZGVyIGZpbGUuIElmIG5vdCB1c2VkLCBzd2lnIHdpbGwgd29yayBhcwoJICAgICAgdXN1YWwgZ2VuZXJhdGluZyBib3RoIHRoZSB3cmFwLmN4eCBhbmQgd3JhcC5oIGZpbGVzLiBJZgoJICAgICAgeW91IHVzZSBpdCwgc3dpZyB3aWxsIG9ubHkgZ2VuZXJhdGUgd3JhcC5jeHguCgoxMC8yMS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBJZiB5b3UgZGVmaW5lIFNXSUdfVFlQRV9UQUJMRSB3aGVuIGNvbXBpbGluZyBhIHdyYXBwZXIgZmlsZSwKCSAgICAgIHRoZSBydW50aW1lIHR5cGVzIHdpbGwgYmUgc3RvcmVkIGluIHRoZSBnaXZlbiB0eXBlIHRhYmxlIG5hbWUuCgkgICAgICBVc2luZyB0aGlzLCB5b3UgY2FuIHNlcGVyYXRlIGRpZmZlcmVudCBtb2R1bGVzIHRvIHNoYXJlIHRoZWlyCgkgICAgICBvd24gdHlwZSBzeXN0ZW1zLiAgLURTV0lHX1RZUEVfVEFCTEU9TXl0YWJsZQoKCSAgICAtIFtQeXRob25dIElmIHlvdSBkZWZpbmUgU1dJR19TVEFUSUNfUlVOVElNRSB0aGVuIHRoZSB0eXBlIGluZm9ybWF0aW9uCgkgICAgICB3aWxsIGJlIHN0YXRpYyB0byB0aGlzIHdyYXBwZXIuICBOb3RoaW5nIHdpbGwgYmUgc2hhcmVkIHdpdGggYW55CgkgICAgICBvdGhlciBtb2R1bGVzCgoJICAgIC0gW1B5dGhvbl0gSWYgeW91IGRlZmluZSBTV0lHX0xJTktfUlVOVElNRSwgdGhlbiBpbnN0ZWFkIG9mIHVzaW5nCgkgICAgICB0aGUgbmV3IHdheSBvZiBzaGFyaW5nIHR5cGUgaW5mb3JtYXRpb24sIHRoZSB3cmFwcGVyIHdpbGwgZXhwZWN0CgkgICAgICB0byBiZSBsaW5rZWQgYWdhaW5zdCB0aGUgTGliL2xpbmtydW50aW1lLmMgZmlsZS4gIEFueSBtb2R1bGVzIGNvbXBpbGVkCgkgICAgICB3aXRoIFNXSUdfTElOS19SVU5USU1FIGFuZCBsaW5rZWQgYWdhaW5zdCBsaW5rcnVudGltZS5jIHdpbGwgYWxsCgkgICAgICBzaGFyZSB0eXBlIGluZm9ybWF0aW9uLgoKMTAvMjAvMjAwNDogbW1hdHVzCgkgICAgLSBbUHl0aG9uXSBJbml0aWFsIGZpeCBmb3IgcHl0aG9uL2ltcG9ydCBleGFtcGxlLiBQbGVhc2UKCSAgICAgIHVwZGF0ZSB0aGUgTWFrZWZpbGUgKGF1dG9jb25mLCBjb25maWd1cmUsIGV0YywgZXhwZXJ0KSwKCSAgICAgIHNpbmNlIG5vdyBwcm9iYWJseSBpcyBvbmx5IHdvcmtpbmcgd2l0aCBnKyssIGljYyBhbmQgYQoJICAgICAgZmV3IG90aGVyIGNvbXBpbGVycyB0aGF0IGhhdmUgdGhlIC1zaGFyZWQgb3B0aW9uLgoKCSAgICAgIFdlIG5lZWQgdG8gY3JlYXRlIGFkZGl0aW9uYWwgc2hhcmVkIGxpYnJhcmllcyBmb3IgdGhlCgkgICAgICB2aXJ0dWFsIGRlc3RydWN0b3JzLiBPbGQgYW5kIHVzdWFsbHkgZm9yZ290dGVuIEMrKwoJICAgICAgcmVxdWlyZW1lbnQuCgkgICAgICAKCSAgICAgIFNhbWUgZml4IG5lZWQgdG8gYmUgdXNlZCBpbiBwZXJsLCBJIHRoaW5rLgoKICAgICAgICAgICAgLSBbUHl0aG9uXSBGaXggZ2VuZXJhdGlvbiBvZiBoZWFkZXIgZmlsZSBmb3IgZGlyZWN0b3JzLAogICAgICAgICAgICAgIG5vdyBkaXJlY3RvcnMuc3dnIGlzIGFsc28gaW5jbHVkZWQsIHNvLCBpdCBjYW4gYmUgcmVhbGx5CgkgICAgICB1c2VkIGZyb20gQysrLCBhbmQgaXQgc29sdmVzIHNvbWUgcHJvYmxlbSB3aXRoIGNvbXBpbGVyCgkgICAgICB0aGF0IHJlcXVpcmUgdGhhdCwgZXZlbiB3aXRoIHRoZSBzaW1wbGUgc3dpZyBpbmNsdXNpb24uICAKCiAgICAgICAgICAgIC0gW1B5dGhvbl0gUmVvcmRlcmluZyB0aGUgbWV0aG9kcyBhbmQgbW92aW5nIHNvbWUgYm9kaWVzCiAgICAgICAgICAgICAgb3V0c2lkZSB0aGUgY2xhc3MgZGVjbGFyYXRpb24uIFRoaXMgaXMgbmVlZGVkIGR1ZSB0bwogICAgICAgICAgICAgIHNvbWUgZ2NjLTIuOTYgaW50ZXJuYWwgY29tcGlsZXIgZXJyb3JzLiBJdCBzZWVtcyB0aGUKICAgICAgICAgICAgICBQWVRIT04gY2xhc3MgaXMgZ2V0dGluZyB0b28gbGFyZ2UgdG8gYmVlbiBkZWNsYXJlZCBhbmQKICAgICAgICAgICAgICBkZWZpbmVkIGF0IHRoZSBzYW1lIHRpbWUuCgoJICAgIC0gQWRkIHRoZSAtb2ggb3B0aW9uIHRvIGNoYW5nZSB0aGUgb3V0cHV0IGhlYWRlciBmaWxlIG5hbWUKICAgICAgICAgICAgICBpZiBuZWVkZWQ6CgogICAgICAgICAgICAgICAgIHN3aWcgLWMrKyAtcHl0aG9uIHRlc3QuaSAtbyB0ZXN0LkNDIC1vaCB0ZXN0LkhICgkgICAgICAKICAgICAgICAgICAgICB0aGlzIGlzIG1haW5seSBuZWVkZWQgd2hlbiB1c2luZyBkaXJlY3RvcnMsIGFuZCBpZiB0aGUKICAgICAgICAgICAgICBjdXJyZW50IGRlZmF1bHQgaGVhZGVyIGZpbGUgbmFtZSBpcyBub3QgZ29vZCBmb3IgeW91LAogICAgICAgICAgICAgIHdoaWNoIGlzIGdlbmVyYXRlZCBhcyBmb2xsb3c6CSAgICAgIAoKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgICAgICAgICAgICAgPT4gdGVzdF93cmFwLmgKICAgICAgICAgICAgICAgICBzd2lnIC1jKysgLXB5dGhvbiB0ZXN0LmkgLW8gdGVzdC5DQyAgPT4gdGVzdC5oCgoKMTAvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgMSkgQ29tcGFjdCBkZWZhdWx0IGFyZ3VtZW50cyBmZWF0dXJlIGFkZGVkLiBUaGlzIGZlYXR1cmUgYWxsb3dzIG9uZQogICAgICAgICAgICAgIHRvIHVzZSB0aGUgZGVmYXVsdCBhcmd1bWVudCBjb2RlIGdlbmVyYXRpb24gdGhhdCB3YXMgdXNlZCBpbgogICAgICAgICAgICAgIFNXSUctMS4zLjIyIGFuZCBlYXJsaWVyIHZlcnNpb25zLiBJdCBwcm9kdWNlcyBtb3JlIGNvbXBhY3Qgd3JhcHBlcnMKICAgICAgICAgICAgICBhcyBvbmx5IG9uZSB3cmFwcGVyIG1ldGhvZCBpcyBnZW5lcmF0ZWQgZm9yIGFueSBtZXRob2Qgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgICAgYXJndW1lbnRzLiBTbyB0aGUgYWR2YW50YWdlIGlzIGl0IGdlbmVyYXRlcyBsZXNzIGNvZGUgYnV0IGhhcyB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBsaW1pdGF0aW9ucywgbGlrZSBpdCBpdCBkb2VzIG5vdCB3b3JrIHdpdGggYWxsIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgYW5kIGRlZmF1bHQgYXJndW1lbnRzIGNhbm5vdCBiZSB0YWtlbiBhZHZhbnRhZ2Ugb2YgaW4gdGhlIHN0cm9uZ2x5IHR5cGVkCiAgICAgICAgICAgICAgbGFuZ3VhZ2VzIChDIyBhbmQgSmF2YSkuIEl0IGlzIGltcGxlbWVudGVkIHZpYSB0aGUgdXN1YWwgJWZlYXR1cmUgbWVjaGFuaXNtOgoKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJjb21wYWN0ZGVmYXVsdGFyZ3MiKTsKCiAgICAgICAgICAgIDIpIEtleXdvcmQgYXJndW1lbnRzIChrd2FyZ3MpIGFyZSB3b3JraW5nIGFnYWluIGZvciBkZWZhdWx0IGFyZ3VtZW50cwogICAgICAgICAgICAgICBpbiB0aGUgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCBpdCwgaWUsIFB5dGhvbiBhbmQgUnVieS4gVGhlIG5ldyBkZWZhdWx0CiAgICAgICAgICAgICAgIGFyZ3VtZW50IHdyYXBwaW5nIGFwcHJvYWNoIHVzaW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBjYW5ub3Qgc3VwcG9ydCBrd2FyZ3MKICAgICAgICAgICAgICAgc28gdGhlIGNvbXBhY3QgZGVmYXVsdCBhcmd1bWVudCBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgdHVybmVkIG9uIHdoZW4KICAgICAgICAgICAgICAga3dhcmdzIGFyZSBzcGVjaWZpZWQsIGJ5ICVmZWF0dXJlKCJrd2FyZ3MiKS4KCiAgICAgICAgICAgIDMpIENvbXBhY3QgZGVmYXVsdCBhcmd1bWVudHMgYXJlIGFsc28gYXV0b21hdGljYWxseSB0dXJuZWQgb24gd2hlbiB3cmFwcGluZwogICAgICAgICAgICAgICBDIChub3QgQysrKSBjb2RlLiBUaGlzIGlzIHRvIHN1cHBvcnQgdGhlIGJpemFycmUgbm90aW9uIG9mIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgICAgIGZvciBDIGNvZGUuCgoxMC8yMC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBPdmVybG9hZGVkIHRlbXBsYXRlZCBmdW5jdGlvbnMgaW4gbmFtZXNwYWNlcyBhbHNvIHdvcmtpbmcgbm93LgogICAgICAgICAgICBUZW1wbGF0ZWQgZnVuY3Rpb25zIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgaW4gbmFtZXNwYWNlcyB0b28uCgoxMC8xOS8yMDA0OiBtbWF0dXMKCgkgICAgLSBBbGxvdyB0byBkaXNhYmxlIHRoZSBuZXcgU3dpZ1ZhbHVlV3JhcHBlciBtZWNoYW5pc20sCgkgICAgICBpZiB5b3UgYWRkIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB5b3VyIGxhbmd1YWdlIG1haW4uCgoJCSAvKiBUdXJuIG9uIHNhZmUgdmFsdWUgd3JhcHBlciB1c2UgbW9kZSAqLwogICAgICAgICAgICAgICAgIFN3aWdfdmFsdWVfd3JhcHBlcl9tb2RlKDEpOwoKCSAgICAgIAoJICAgICAgTm93IGlzIG9ubHkgYWN0aXZlIGluIHB5dGhvbi4gQWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICAgIGFyZSB1c2luZyB0aGUgb2xkIHJlc29sdXRpb24sIGJ1dCB0aGV5ICBjYW4gYWxzbyB1c2UgdGhlCgkgICAgICAidmFsdWV3cmFwcGVyIi8ibm92YWx1ZXdyYXBwZXIiIGZlYXR1cmVzIHRvIGZpeCBzb21lCgkgICAgICBvZiB0aGUgb2xkIGJyb2tlbiBjYXNlcy4gTm90ZSwgaG93ZXZlciwgIHRoYXQgbm90IGFsbCAKCSAgICAgIHRoZSBicm9rZW4gY2FzZXMgY2FuIGJlIHNvbHZlZCBpbiB0aGF0IHdheS4KCgkgICAgICBUaGUgbmV3IG1lY2hhbmlzbSBzZWVtcyB0byBiZSB3b3JraW5nIGZpbmUgaW4gcGVybCwgcnVieQoJICAgICAgYW5kIHRjbCwgYnV0IGZhaWxpbmcgaW4gc29tZSB0eXBlbWFwcyBpbiBqYXZhLgoKCSAgICAgIEhlbmNlLCBpcyB1cHRvIHRoZSBsYW5ndWFnZSBtYWludGFpbmVyIHRvIHRlc3QgaXQsIGFuZAoJICAgICAgZGVjaWRlIHRvIGVuYWJsZSBpdCBvciBub3QuCgoJICAgICAgTG9vayBhdCB0aGUgdmFsdWV3cmFwcGVyX29wYXF1ZS5pIGZvciBleGFtcGxlcy4KCgkgICAgLSBGaXggbW9yZSBTd2lnVmFsdWVXcmFwcGVyIGNhc2VzIHdoZW4gdGhlIG5ldyBtZWNoYW5pc20KCSAgICAgIGlzIGFjdGl2ZS4gTm93IGl0IGFsc28gY2hlY2sgZm9yIGxvY2FsIHR5cGVtYXAKCSAgICAgIHZhcmlhYmxlcywgc2VlIHZhbHVld3JhcHBlcl9vcGFxdWUuaSBmb3IgYW4gZXhhbXBsZSB3aGVuCgkgICAgICB0aGlzIGlzIG5lZWRlZC4gQnV0IGFnYWluLCB0aGlzIGV4dHJhIGNoZWNraW5nIHdpbGwgb25seQoJICAgICAgYmUgYWN0aXZhdGVkIHdoZW4gdXNpbmcgdGhlIG5ldyB2YWx1ZSB3cmFwcGVyIG1vZGUuCgoJICAgIC0gW1B5dGhvbl0gRml4IHZhcmlhYmxlIHdyYXBwaW5nIG9mIGNsYXNzZXMgd2l0aCBwcml2YXRlCgkgICAgICBhc3NpZ24gb3BlcmF0b3JzLiBJdCBzaG91bGQgYmUgZWFzeSB0byBmaXggaW4gYWxsIHRoZSAKCSAgICAgIG90aGVyIG1vZHVsZXMsIGluc3RlYWQgb2YgY2hlY2tpbmcKCgkgICAgICAgICBpZiAoIUdldGF0dHIobiwiaW1tdXRhYmxlIikpIC4uLgoJCgkgICAgICB5b3UgbmVlZCB0byB2ZXJpZnkKCgkgICAgICAgICBpZiAoaXNfYXNzaWduYWJsZShuKSkgLi4uCgoJICAgICAgTG9vayBhdCB0aGUgcHJpdmF0ZV9hc3NpZ24uaSBmb3IgYW4gZXhhbXBsZS4KCjEwLzE4LzIwMDQ6IG1tYXR1cwoJICAgIC0gJWZlYXR1cmVzICJkaXJlY3RvciIvIm5vZGlyZWN0b3IiIG5vdyB3b3JrIGFzIGV4cGVjdGVkLgogICAgICAgICAgICAtIEdlbmVyYWwgZml4ZXMgaW4gJWZlYXR1cmUgdG8gcmVzb2x2ZSBmdW5jdGlvbiBkZWNsCgkgICAgICBwcm9wZXJseSwKCSAgICAgIAoJICAgICAgICAlZmVhdHVyZSgiaGVsbG8iKSBmb28oKTsKCSAgICAgICAgY2hhciBmb28oKSAtPiAgZigpICAgIC8vIHdhcyB3b3JraW5nCgkgICAgICAgIGNoYXIgKmZvbygpIC0+IGYoKS5wICAvLyBpdCB3YXNuJ3QKIAoKICAgICAgICAgICAgLSBUZW1wbGF0ZSArIHNwZWNpYWxpemF0aW9uICsgZGVmYXVsdCB0ZW1wbGF0ZSBhcmdzIG5vdyBpcwoJICAgICAgd29ya2luZywgKGRvbid0IGNvbmZ1c2Ugd2l0aCB0ZW1wbGF0ZSArIGRlZmF1bHQgYXJnCgkgICAgICB2YWx1ZXMsIHRoYXQgd2FzIHNvbHZlZCBiZWZvcmUpLCBub3cgdGhpcyB1Z2x5IGNhc2UgaXMKCSAgICAgIHdvcmtpbmc6CgoJICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQSA9IEFsbG9jPFQ+ID4KCQlzdHJ1Y3QgVmVjdG9yCgkJewoJCSAgIFZlY3RvcihUIGEpe30KCQl9OwkJICAgCgoJCXRlbXBsYXRlIDw+CgkJc3RydWN0IFZlY3Rvcjxkb3VibGU+CgkJewoJCSAgVmVjdG9yKCl7fQoJCSAgaW50IGZvbygpIHsgcmV0dXJuIDA7IH0KICAgICAgICAgICAgICAgIH07CgoJICAgICAgICAldGVtcGxhdGUoVl9jKSBWZWN0b3I8Y2hhciwgQWxsb2M8Y2hhcj4gPjsKCSAgICAgICAgJXRlbXBsYXRlKFZfaSkgVmVjdG9yPGludD47ICAgIC8vIHBpY2tzIFZlY3RvcjxpbnQsQWxsb2M8aW50PiA+CgkgICAgICAgICV0ZW1wbGF0ZShWX2QpIFZlY3Rvcjxkb3VibGU+OyAvLyBwaWNrcyB0aGUgc3BlY2lhbGl6YXRpb24KCSAgICAgIAogICAgICAgICAgICAgIHRoaXMgaXMgbmVlZGVkIGZvciBhdXRvbWF0aWMgU1RMIHN1cHBvcnQgKGxhdGVyIHdpbGwKICAgICAgICAgICAgICBiZSkuCgoJICAgIC0gRml4IHRoZSB0ZW1wbGF0ZSArIHR5cGVkZWYgZXJyb3JzIGluIHRlc3Qtc3VpdGUsIHdoaWNoCiAgICAgICAgICAgICAgcHJvYmFibHkgd2lsbCBmaXggYW5vdGhlciBncm91cCBvZiBzdHJhbmdlIHRlbXBsYXRlICsKICAgICAgICAgICAgICBuYW1lc3BhY2VzICsgdHlwZWRlZnMgZXJyb3JzLgoKCSAgICAtICV3YXJuZmlsdGVyIGlzIHdvcmtpbmcgYmV0dGVyIG5vdywgcGFyc2VyLnkgdHJpZXMgdG8gdXNlCgkgICAgICB0aGVtIHdoZW4gbmVlZGVkLgoKCSAgICAtICoqKiogTmV3IGRlZmF1bHQgdHlwZSByZXNvbHV0aW9uIG1ldGhvZCAoc3R5cGUuYykgKioqKiogCgoJICAgICAgSXQgcHJlc2VydmVzIHRoZSBvcmlnaW5hbCBtaXhlZCB0eXBlcywgdGhlbiBpdCBnb2VzCgkgICAgICAnYmFja3dhcmQnIGZpcnN0IGRlbGV0aW5nIHRoZSBxdWFsaWZpZXIsIHRoZW4gdGhlIGlubmVyCgkgICAgICB0eXBlcywgZm9yIGV4YW1wbGU6CiAgICAJCSAJCQkJCQkJICAKICAgIAkJIHR5cGVkZWYgQSAqQXB0cjsJCQkJICAKICAgIAkJIGNvbnN0IEFwdHImOwkJCQkJCQogICAgCQkgci5xKGNvbnN0KS5BcHRyICAgICAgIC0+IHIucShjb25zdCkucC5TV0lHVFlQRQkJCiAgICAJCSByLnEoY29uc3QpLnAuU1dJR1RZUEUgLT4gci5wLlNXSUdUWVBFCQkJCiAgICAJCSByLnAuU1dJR1RZUEUgICAgICAgICAgLT4gci5TV0lHVFlQRQkJCQogICAgCQkgci5TV0lHVFlQRSAgICAgICAgICAgIC0+IFNXSUdUWVBFCQkJCgkJIAkJCQkJCQkKICAgIAkJIGVudW0gSGVsbG8ge307CQkJCQkJCiAgICAJCSBjb25zdCBIZWxsbyYgaGk7CQkJCQkKICAgIAkJIHIucShjb25zdCkuSGVsbG8gICAgICAgICAgLT4gci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFCQogICAgCQkgci5xKGNvbnN0KS5lbnVtIFNXSUdUWVBFICAtPiByLmVudW0gU1dJR1RZUEUJCQogICAgCQkgci5lbnVtIFNXSUdUWVBFICAgICAgICAgICAtPiByLlNXSUdUWVBFCQkKICAgIAkJIHIuU1dJR1RZUEUgICAgICAgICAgICAgICAgLT4gU1dJR1RZUEUJCQkKCQkgCQkJCQkJCQogICAgCQkgaW50IGFbMl1bNF07CQkJCQkJCiAgICAJCSBhKDIpLmEoNCkuaW50ICAgICAgICAgICAtPiBhKEFOWSkuYShBTlkpLlNXSUdUWVBFCQogICAgCQkgYShBTlkpLmEoQU5ZKS5TV0lHVFlQRSAgLT4gYShBTlkpLmEoKS5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkuYSgpLlNXSUdUWVBFICAgICAtPiBhKEFOWSkucC5TV0lHVFlQRQkJCiAgICAJCSBhKEFOWSkucC5TV0lHVFlQRSAgICAgICAtPiBhKEFOWSkuU1dJR1RZUEUJCQogICAgCQkgYShBTlkpLlNXSUdUWVBFICAgICAgICAgLT4gYSgpLlNXSUdUWVBFCQkKICAgIAkJIGEoKS5TV0lHVFlQRSAgICAgICAgICAgIC0+IHAuU1dJR1RZUEUJCQkKICAgIAkJIHAuU1dJR1RZUEUgICAgICAgICAgICAgIC0+IFNXSUdUWVBFICAgICAgICAgICAgICAgICAgICAKCgkgICAgICBiZWZvcmUgaXQgYWx3YXlzIHN0b3BzIGFmdGVyIGZpbmRpbmcgcmVmL3BvaW50ZXIvZW51bS9hcnJheS9ldGMuCgkgICAgICAgCgkgICAgICBOb3csIHRoZW4sIHlvdSBjYW4gZGVmaW5lICh1c2UgYW5kIGFwcGx5KSAnaGlnaGVyJyB0eXBlbWFwcyBzdWNoIGFzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBTV0lHVFlQRSogY29uc3QmICAKCSAgICAgICAgJXR5cGVtYXAob3V0KSBjaGFyIEZJWFNJWkVbQU5ZXQogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFKiBjb25zdCYgIAoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgZW51bSBTV0lHVFlQRSYKCSAgICAgICAgJXR5cGVtYXAoaW4pIFNXSUdUWVBFW0FOWV1bQU5ZXQoJICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAoJilbQU5ZXQoJICAgICAgIAoJICAgICAgSXQgaXMgcG9zc2libGUgd2l0aCB0aGlzIGNoYW5nZSB0aGF0IHByZXZpb3VzIHR5cGVtYXBzCgkgICAgICB0aGF0IHdlcmUgZGVmaW5lZCAoYnV0IGlnbm9yZWQpLCBub3cgd2lsbCBzdGFydCB0byB3b3JrLgoKCSAgICAgIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSBjaGVjayBmb3IgdGhlICcldHlwZW1hcCh2YXJpbikgU1dJR1RZUEVbXScsCgkgICAgICBiZWZvcmUgaXQgd2FzIHVzdWFsbHkgbm90IGRlZmluZWQgKGJ1dCBjaGFyW10gd2FzKSwKCSAgICAgIGFuZCB0aGF0IGNhbiBwcm9kdWNlIHNvbWUgaW5jb25zaXN0ZW5jaWVzLgoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKCSAgICAgIFRoaXMgY2hhbmdlIHdhcyBuZWVkZWQgZm9yIFNUTCwgc2luY2Ugc3RkOjp2ZWN0b3I8ZW51bSBIZWxsbz4gCgkgICAgICBzdGQ6OnZlY3RvcjxBKj4sIGV0Yywgd2lsbCBhbHdheXMgZ2VuZXJhdGUgbWV0aG9kcyB0aGF0CgkgICAgICBtaXggY29uc3QgcmVmZXJlbmNlcyB3aXRoIHRoZSB2ZWN0b3IgdHlwZS4KCgkgICAgICBOb3cgdGhhdCBpcyB3b3JraW5nLCBhbGwgdGhlIHN0ZDo6Y29udGFpbmVyPFQqPgoJICAgICAgc3BlY2lhbGl6YXRpb24gd2lsbCBub3QgYmUgbmVlZGVkIGFueW1vcmUsIHdlbGwsIGluCgkgICAgICB0aGVvcnkuIAoKCSAgICAgIEluIHRoZSBwcmFjdGljZSwgZXZlcnl0aGluIGlzIHdvcmtpbmcgYXMgYmVmb3JlIHVudGlsCgkgICAgICB0aGUgcHJvcGVyIG1peGVkIHR5cGVzIGFyZSBkZWZpbmVkIGFuZCB0aGUgbGlicmFyaWVzCgkgICAgICBzaW1wbGlmaWVkIHRvIHVzZSB0aGVtLgoKCSAgICAtIENoYW5nZSB0aGUgYmVoYXZpb3Igb2YgZXh0ZXJuICJqYXZhIi8iZm9ydHJhbiIvImV0YyIsIAoJICAgICAgbm93IHN3aWcgcHJvZHVjZXMgYSB3YXJuaW5nLCBhbmQgdXNlIGV4dGVybiAiQyIgaW5zdGVhZC4KCSAgICAgIFRoZSB3YXJuaW5nIGNhbiBhbHNvIGJlIGRpc2FibGUgd2l0aCB0aGUgIi13IDMxMyIgZmxhZy4KCSAgICAgIChXQVJOX1BBUlNFX1VOREVGSU5FRF9FWFRFUk4pLgoKCSAgICAtIFN3aWdWYWx1ZVdyYXBwZXIgaXMgbm93IG1vcmUgc2VsZWN0aXZlIChsYW5nLmN4eCkuCgogICAgICAgICAgICBbUGVybC9UY2xdCgkgICAgLSBGaXggc29tZSB0eXBlbWFwcyAocGVybC90Y2wpIHRvIHdvcmsgcHJvcGVybHkgd2l0aAoJICAgICAgU3dpZ1ZhbHVlV3JhcHBlci4gVGhpcyB3YXMgbm90IGEgcHJvYmxlbSB3aXRoCgkgICAgICBTd2lnVmFsdWVXcmFwcGVyLCBidXQgd2l0aCB0aGUgdHlwZW1hcHMgdGhhdCBub3cgYXJlCgkgICAgICBzYWZlIHRvIHVzZSB3aXRoICVhcHBseS4KCgkgICAgW1B5dGhvbl0KCiAgICAgICAgICAgIC0gRml4ICVjYWxsYmFjay8lcHl0aG9uY2FsbGJhY2sgd29yayBub3cgYXMgYmVmb3JlIGFmdGVyCgkgICAgICB0aGUgZGVmIGFyZ3MgY2hhbmdlcy4gQWxzbywgJWNhbGxiYWNrIG5vdyBpcyBhbiBhbGlhcwoJICAgICAgZm9yICVweXRob25jYWxsYmFjaywgc28sIHRoZXkgZG8gdGhlIHNhbWUuCgoJICAgIFtQeXRob24vUnVieV0KCSAgICAtICVjYWxsYmFjayBpcyBtb3JlIHVzYWJsZSBhbmQgdW5pZm9ybToKCiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpIGZvbygpOyAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlc19jYiIpOyAgICAgICAgLy8gZm9yIGJvdGgsIHB5dGhvbi9ydWJ5CiAgICAgICAgICAgICAgICAgJWNhbGxiYWNrKDEpIGZvbygpOyAgICAgICAgLy8gb25seSBpbiBweXRob24uCgoxMC8xNy8yMDA0OiBhcnR5CgkgICAgW09DQU1MXQoJICAgIC0gVHdlYWsgdG8gZW51bSB0eXBpbmcgZm9yIHNvdW5kbmVzcyBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUKCSAgICAgIG1vZHVsZXMuCgkgICAgLSBnbG9iYWwgZnVuY3Rpb25zIGFyZSBub3cgdW5hbWJpZ3VvdXMgaW4gbXVsdGlwbGUgbG9hZGVkIG1vZHVsZXMuCgkgICAgLSBGaXhlZCB0ZXN0IGNhc2UgY29kZSB0byBidWlsZCBtdWx0aW1vZHVsZSB0ZXN0IGNhc2VzIGNvcnJlY3RseS4KCSAgICAtIFRoZXJlIGlzIG5vIHdheSB0byBzaGFyZSBvdmVybG9hZCByZXNvbHV0aW9uIGFjcm9zcyBtb2R1bGVzCgkgICAgICBiZWNhdXNlIG9mIHNvdW5kbmVzcyBpc3N1ZXMuICBJZiB0aGUgdXNlciB3YW50cyB0byBjYWxsIHNvbWUKCSAgICAgIGZ1bmN0aW9uIGZvbyBmcm9tIGFuIGFyYml0cmFyeSBtb2R1bGUgYmFyLCB0aGV5IHdpbGwgaGF2ZSB0bwoJICAgICAgdXNlIEJhci5fZm9vIHRvIGNhbGwgaXQgY29ycmVjdGx5LiAgTGF0ZXIgSSB3aWxsIGZpeCB0aGUgCgkgICAgICBjYW1scDQgbW9kdWxlIHRvIGRvIHNvbWV0aGluZyBjbGV2ZXIgaW4gdGhpcyBjYXNlLiAgCiAgICAgICAgICAgIC0gUHJvbWlkZWQgcGVyZm9ybWFuY2Ugb3ZlcmhhdWwgb2YgY2xhc3MgbWVjaGFuaXNtLgoJICAgIC0gUmVtb3ZlZCBzeW1ib2wgaGFjayBmb3Igb2NhbWwtMy4wNyBhbmQgYmVsb3cgd2hpY2ggaXMgbm90IG5lZWRlZAoJICAgICAgZm9yIG9jYW1sLTMuMDggYW5kIGFib3ZlLgoKMTAvMTYvMjAwNDogd3V6emViIChKb2huIExlbnopCiAgICAgICAgICAgIFtDSElDS0VOXQoJICAgIC0gQ29tcGxldGx5IGNoYW5nZSBob3cgY2hpY2tlbi5jeHggaGFuZGxlcyBDTE9TIGFuZCBnZW5lcmljIGNvZGUuCgkgICAgICBjaGlja2VuIG5vIGxvbmdlciBleHBvcnRzIC1jbG9zLnNjbSBhbmQgLWdlbmVyaWMuc2NtLiAgVGhlIGNsb3MKCSAgICAgIGNvZGUgaXMgZXhwb3J0ZWQgZGlyZWN0bHkgaW50byB0aGUgbW9kdWxlLnNjbSBmaWxlIGlmIC1wcm94eSBpcyBwYXNzZWQuCgkgICAgLSBUaGUgY29kZSBub3cgYWx3YXlzIGV4cG9ydHMgYSB1bml0LiAgUnVubmluZyB0aGUgdGVzdC1zdWl0ZSBpcyBub3cKCSAgICAgIG1ham9ybHkgYnJva2VuLCBhbmQgbmVlZHMgdG8gYmUgZml4ZWQuCgkgICAgLSBDTE9TIG5vdyBnZW5lcmF0ZXMgdmlydHVhbCBzbG90cyBmb3IgbWVtYmVyIHZhcmlhYmxlcyBzaW1pbGFyIHRvIGhvdwoJICAgICAgR09PUFMgc3VwcG9ydCB3b3JrcyBpbiB0aGUgZ3VpbGUgbW9kdWxlLgoJICAgIC0gY2hpY2tlbiBubyBsb25nZXIgcHJlZml4ZXMgc3ltYm9scyBieSB0aGUgbW9kdWxlIG5hbWUsIGFuZCBubyBsb25nZXIKCSAgICAgIGZvcmNlcyBhbGwgbmFtZXMgdG8gbG93ZXIgY2FzZS4gIEl0IG5vdyBoYXMgLXVzZWNsYXNzcHJlZml4IGFuZCAtY2xvc3ByZWZpeAoJICAgICAgc2ltaWxhciB0byBob3cgZ3VpbGUgaGFuZGxlcyBHT09QUyBuYW1lcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFRlbXBsYXRlZCBmdW5jdGlvbnMgd2l0aCBkZWZhdWx0IGFyZ3VtZW50cyB3b3JraW5nIHdpdGggbmV3IGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgd3JhcHBpbmcgYXBwcm9hY2guIFRoZSBuZXcgYXBwcm9hY2ggbm8gbG9uZ2VyIGZhaWxzIHdpdGggdGhlIGZvbGxvd2luZyBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50IHBhdHRlcm4gKHByZXZpb3VzbHkgZmFpbGVkIHdpdGggc29tZSBwcmltaXRpdmUgdHlwZXMsIGxpa2UgCiAgICAgICAgICAgIHVuc2lnbmVkIHByaW1pdGl2ZSB0eXBlcyk6CgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludCBmb28oY29uc3QgVCYgdSA9IFQoKSk7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGZvbykgZm9vPHVuc2lnbmVkIGludD47CgogICAgICAgICAgICBUaGlzIHJlbGllcyBvbiB0aGUgdGVtcGxhdGVkIGZ1bmN0aW9uIG92ZXJsb2FkaW5nIHN1cHBvcnQganVzdCBhZGRlZCwgc28gYWxsCiAgICAgICAgICAgIHRoZSBjb21iaW5hdGlvbnMgb2Ygb3ZlcmxvYWRpbmcgYnkgdGVtcGxhdGUgcGFyYW1ldGVycyBhbmQgbm9ybWFsIHBhcmFtZXRlcnMKICAgICAgICAgICAgYXMgd2VsbCBhcyBvdmVybG9hZGluZyB3aXRoIGRlZmF1bHQgcGFyYW1ldGVycyB3b3Jrcy4KCjEwLzE2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHRoZSBsYXJnZSByYW5nZSBvZiB0ZW1wbGF0ZWQgZnVuY3Rpb24gb3ZlcmxvYWRpbmcgdGhhdCBDKysKICAgICAgICAgICAgc3VwcG9ydHMuCgogICAgICAgICAgICAtIE92ZXJsb2FkZWQgdGVtcGxhdGVkIGZ1bmN0aW9ucywgZWcKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50IG92ZXJsb2FkKFQgdCwgY29uc3QgVCAmcik7CgogICAgICAgICAgICAtIEZpeGVzIHdoZXJlIHRoZSB0ZW1wbGF0ZWQgdHlwZSBpcyBub3QgdXNlZCBpbiB0aGUgcGFyYW1ldGVyIGxpc3QsIGVnCgogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgeHl6KCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIHh5ejxkb3VibGU+KCk7CgogICAgICAgICAgICAtIEZpeGVzIGZvciBvdmVybG9hZGluZyBvZiBwbGFpbiBmdW5jdGlvbnMgYnkgYSB0ZW1wbGF0ZWQgZnVuY3Rpb246CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwoKICAgICAgICAgICAgLSBPdmVybG9hZGluZyBieSB0ZW1wbGF0ZWQgcGFyYW1ldGVycyBmaXhlZDoKCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBmb28oVCB0KSB7fQogICAgICAgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHZvaWQgZm9vKFQgdCwgVSB1KSB7fQoKICAgICAgICAgICAgICAldGVtcGxhdGUoZm9vKSBmb288ZG91YmxlLCBkb3VibGU+OwoKICAgICAgICAgICAgLSBBbGwgY29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBhbHNvIHdvcmtpbmcgaW5jbHVkaW5nIHNwZWNpYWxpemF0aW9ucywgZWc6CgogICAgICAgICAgICAgIHZvaWQgYWJjKGRvdWJsZSBkKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFiYyhUIHQpOwogICAgICAgICAgICAgIHRlbXBsYXRlPD4gdm9pZCBhYmM8ZG91YmxlPihkb3VibGUgdCk7CiAgICAgICAgICAgICAgdGVtcGxhdGU8PiB2b2lkIGFiYyhpbnQgdCk7CgoxMC8xNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW1vdmUgdGhlIGFiaWxpdHkgdG8gc2hhcmUgdHlwZSBpbmZvcm1hdGlvbiBieSB1c2luZyBjIGxpbmtpbmcuCiAgICAgICAgICAgICAgQWxsIHR5cGUgc2hhcmluZyBoYXBwZW5zIHRocm91Z2ggYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgICAgICAgICsgUmVtb3ZlIFNXSUdfTk9JTVBPUlQsIFNXSUdfUlVOVElNRSwgYW5kIHJlbGF0ZWQgZGVmaW5lcy4KICAgICAgICAgICAgICAgICsgRGVwcmVjYXRlIC1ydW50aW1lLCAtbm9ydW50aW1lIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgICAgICAgICAgICArIFVwZGF0ZSB0ZXN0LXN1aXRlIGNvbW1vbi5tayB0byBjb3JyZWN0bHkgYnVpbGQgbXVsdGljcHB0ZXN0CiAgICAgICAgICAgICAgICArIFJlbW92ZSByZWZlcmVuY2UgdG8gcHJlY29tbW9uLnN3ZwogICAgICAgICAgICAgICAgKyBVcGRhdGUgdGhlIGd1aWxlX2doIGludGVyZmFjZSB0byBzaGFyZSBkYXRhIGJ5IGEgZ2xvYmFsIHZhciBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgIG9mIGMgbGlua2FnZS4KCiAgICAgICAgICAgIC0gUmVtb3ZlIEFkdmFuY2VkLmh0bWwsIHNpbmNlIGV2ZXJ5dGhpbmcgaW4gaXQgaXMgbm93IG9ic29sZXRlCgoxMC8wOS8yMDA0OiBtbWF0dXMKCSAgICAtIFNwbGl0IHRoZSBweXRob24gc3RkL1NUTCBDKysgbGlicmFyeSBmaWxlcywgbm93CgkgICAgICBhbGwgdGhlIGxhbmd1YWdlIGluZGVwZW5kZW50IGRlZmluaXRpb25zIGFyZSB1bmRlcgoJICAgICAgdGhlIGRpcmVjdG9yeQoJICAgICAgCgkJTGliL3N0ZAoKCSAgICAgIGFuZCBoZW5jZSwgY2FuIGJlIHVzZWQgZnJvbSBvdGhlciBsYW5ndWFnZXMuCgoJICAgIC0gQWRkIG1vcmUgZG9jdW1lbnRhdGlvbiB0byB0aGUgUHl0aG9uIFNUTCwgYW5kCgkgICAgICBjbGVhbiB1bm5lY2Vzc2FyeSBjb2RlLgoKCSAgICAtIEFkZCBpbml0aWFsIEM5OSBjb21wbGV4IHN1cHBvcnQsIGFuZCBzb21lIGZpeGVzCgkgICAgICBmb3IgbG9uZyBkb3VibGUuCgoxMC8wOC8yMDA0OiBtbWF0dXMKCSAgICAtIEZpeCB0aGUgU3dpZ1ZhbHVlV3JhcHBlciBmb3Igb3BhcXVlIHR5cGVzLCBub3cgaXQgaXMgCgkgICAgICBhcHBsaWVkIGZvciBvcGFxdWUgdGVtcGxhdGVzIGFuZCBjbGFzc2VzLCBmb3Igd2hpY2ggd2UKCSAgICAgIGRvbid0IGtub3cgaWYgdGhlcmUgaXMgb3Igbm90IGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgaWUKCiAgICAgICAgICAgICAgICAgc3RydWN0IEEgeyAKICAgICAgICAgICAgICAgICAgIEEoaW50KTsKICAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgU3RpbGwsIGlmIHlvdSBrbm93IHRoYXQgeW91IGNsYXNzIGhhcyBhIGRlZmF1bHQKICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgYW5kIGZvciBzb21lIHZlcnkgdmVyeSBwYXJ0aWN1bGFyIHJlYXNvbgogICAgICAgICAgICAgIHlvdSB3YW50IHRvIGF2b2lkIHRoZSBTd2lnVmFsdWVXcmFwcGVyLCBhbmQgeW91IGRvbid0CiAgICAgICAgICAgICAgd2FudCBvciBjYW4ndCBleHBvc2UgdGhlIGNsYXNzIHRvIHN3aWcsIG5vdyB5b3UgY2FuCiAgICAgICAgICAgICAgc2F5CgogICAgICAgICAgICAgICAgICVmZWF0dXJlKCJub3ZhbHVld3JhcHBlciIpIEE7ICAgIAogICAgICAgICAgICAgICAgIGNsYXNzIEE7CiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIG9yIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBpZiB0aGUgY2xhc3MgaGFzIGEgZGVmYXVsdAogICAgICAgICAgICAgIGNvbnN0cnVjdG9yLCBidXQgeW91IHdhbnQgdG8gdXNlIHRoZSB2YWx1ZSB3cmFwcGVyLCB5b3UKICAgICAgICAgICAgICBjYW4gc2F5CgogICAgICAgICAgICAgICAgICVmZWF0dXJlKCJ2YWx1ZXdyYXBwZXIiKSBBOwogICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsgCiAgICAgICAgICAgICAgICAgICBBKCk7CgkJICAgLi4uLgogICAgICAgICAgICAgICAgIH07ICAgCiAgICAgIAoJICAgIC0gRml4IGZvciBjaGFyID4gMTI4LCBpZQoKICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgdGlsZGVfYSA9ICdcMzQxJzsKCiAgICAgICAgICAgIC0gQWRkIHBhdGNoIDEwNDE4NTggZm9yICRsZXh0eXBlLCB3aGljaCBjYXJyaWVzIHRoZSAKICAgICAgICAgICAgICBsaXRlcmFsIHR5cGUgb2YgYSBzeW1ib2wuIFNlZSBsZXh0eXBlLmkgaW4gdGhlCiAgICAgICAgICAgICAgdGVzdC1zdWl0ZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogCgoxMC8wNy8yMDA0OiB3c2Z1bHRvbgoJICAgIHtSdWJ5LCBKYXZhXSBGaXggZGlyZWN0b3IgKyAnZW1wdHknIHRocm93cwoKCQkgICAgc3RydWN0IEEgewoJCSAgICAgIEEoKSB0aHJvdygpOwoJCSAgICAgIHZpcnR1YWwgfkEoKSB0aHJvdygpOwoJCSAgICAgIGludCBmb28oKSB0aHJvdygpOwoJCSAgICB9OwoKCjEwLzA2LzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQogICAgICAgICAgICBbVENMXQogICAgICAgICAgICAtIEZpeCBidWcgcmVwb3J0ZWQgYnkgV2lsbGlhbSBBLiBIb2ZmbWFuIHByb3BhZ2F0aW5nIGNsaWVudGRhdGEKICAgICAgICAgICAgYmV0d2VlbiBtb2R1bGVzLiAgQWRkZWQgY2xpZW50ZGF0YV9wcm9wLm11bHRpY3BwdGVzdCB0byBjaGVjayBmb3IKICAgICAgICAgICAgdGhpcyBidWcuICBUaGUgZml4IGludm9sdmVkIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAgICsgU3dpZ1R5cGVfY2xpZW50ZGF0YV9jb2xsZWN0IGRvZXMgbm90IG5lZWQgdG8gY2hlY2sKICAgICAgICAgICAgICAgIHR5cGVzIGluIHJfcmVzb2x2ZWQgYmVjYXVzZSB3ZSBvbmx5IHdhbnQgdG8gcHJvcGFnYXRlIGNsaWVudGRhdGEKICAgICAgICAgICAgICAgIHRvIHR5cGVkZWZlZCBjbGFzc2VzLCBhbmQgcl9tYW5nbGVkIGFscmVhZHkgdGFrZXMgY2FyZSBvZiB0eXBlZGVmcy4KCiAgICAgICAgICAgICAgICArIFNXSUdfVHlwZVJlZ2lzdGVyIG5vdyBjb3BpZXMgdGhlIGNsaWVudGRhdGEgZmllbGQgY29ycmVjdGx5CgogICAgICAgICAgICAgICAgKyBNb3ZlIFNXSUdfR3VpbGVfUHJvcGFnYXRlQ2xpZW50RGF0YSBmdW5jdGlvbiBmcm9tIGd1aWxlIG1vZHVsZQogICAgICAgICAgICAgICAgaW50byBjb21tb24uc3dnLCBiZWNhdXNlIHdlIG5lZWQgdG8gY2FsbCBpdCBmcm9tIGJvdGggZ3VpbGUgYW5kIHRjbC4KCiAgICAgICAgICAgICAgICArIEFkZCBiYXNlX25hbWVzIHRvIHN3aWdfY2xhc3MgdG8gZGVsYXkgdGhlIGxvb2t1cCBvZiBiYXNlcy4gIFNXSUcKICAgICAgICAgICAgICAgIG5vdyBleHBvcnRzIHRoZSBiYXNlIG5hbWVzIGFuZCBvbmx5IHdoZW4gdGhlIGJhc2Ugc3dpZ19jbGFzcyBpcwogICAgICAgICAgICAgICAgbmVlZGVkIGlzIFNXSUdfVHlwZVF1ZXJ5KG5hbWUpLT5jbGllbnRkYXRhIGxvb2tlZCB1cC4KCiAgICAgICAgICAgIC0gY29udmVyc2lvbl9uc190ZW1wbGF0ZSB0ZXN0c3VpdGUgdGVzdCB3YXMgZmFpbGluZyBiZWNhdXNlCiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIHdhcyBub3QgY2FsY3VsYXRlZAogICAgICAgICAgICBjb3JyZWN0bHkgZm9yIHN0cnVjdHMuICBGaXhlZC4KCjEwLzA2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciBkZWZhdWx0IGFyZ3VtZW50cyB1c2VkIGluIGRpcmVjdG9ycyAtIGluIHZpcnR1YWwKICAgICAgICAgICAgbWV0aG9kcyBhbmQgZGlyZWN0b3IgY29uc3RydWN0b3JzLgoKMTAvMDYvMjAwNDogbW1hdHVzCgkgICAgRml4IHRoZSBfX2NwbHVzcGx1cyBtYWNybywgYW5kIGJ1ZyAxMDQxMTcwLgoJICAgIE5vdyBpdCBpcyB3b3JraW5nIGFzIHN1cHBvc2VkLCBpZSwgeW91IGNhbiBzYWZlbHkgdXNlCgoJICAgICAgI2lmZGVmIF9fY3BsdXNwbHVzCgkgICAgICAuLi4KCSAgICAKCSAgICBhbGwgb3ZlciBzd2lnLCBpbmNsdWRpbmcgaW5zaWRlICVkZWZpbmVzIGFuZCAleyAlfSBib2RpZXMuCgoJICAgIAogICAgICAgICAgICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoJICAgIFRoZSBvbGQgdHJpY2sgb2YgdXNpbmcKCgkgICAgICAjaWYgX19jcGx1c3BsdXMKCgkgICAgZG9lc24ndCB3b3JrIGFueSBtb3JlLiBTbywgaWYgeW91IGhhdmUgeW91ciBvd24gdHlwZW1hcHMKCSAgICB1c2luZyB0aGF0IHN5bnRheCwgeW91IHdpbGwgbmVlZCB0byBtaWdyYXRlIHRoZW0gdG8gdXNlCgkgICAgIiNpZmRlZiBfX2NwbHVzcGx1cyIuCgoxMC8wNS8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgLSBSZW9yZ2FuaXplIGhvdyBydW50aW1lIHR5cGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGFuZCBzaGFyZWQKCSAgICBiZXR3ZWVuIG1vZHVsZXMuICBGb3IgY2hpY2tlbiBhbmQgbXpzY2hlbWUsIEkgcmVtb3ZlZAoJICAgIHRoZSBhYmlsaXR5IHRvIHVzZSBydW50aW1lIGxpYnJhcmllcywgd2hpbGUgcGVybCwgdGNsLCBweXRob24sIGFuZAoJICAgIHJ1YnkgZGVmYXVsdCB0byB1c2luZyB0aGUgbmV3IG1ldGhvZCBidXQgY2FuIGdvIGJhY2sgdG8gdGhlIG9sZAoJICAgIG1ldGhvZCBieSBkZWNsYXJpbmcgU1dJR19BTExPV19SVU5USU1FLgoKCSAgICAtIGxpbmUgNTgyIGluIG16c2NoZW1lLmN4eCB3YXMgZ2VuZXJhdGluZyBhIHNlZ2ZhdWx0IG9uIAoJICAgIGltcG9ydHMubXVsdGljcHB0ZXN0LCBzbyBJIGZpeGVkIGl0LgoKMTAvMDUvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4ZXMgZm9yICVleHRlbmQgYW5kIG92ZXJsb2FkZWQgc3RhdGljIG1ldGhvZHMgd2l0aCBkZWZhdWx0CiAgICAgICAgICAgIGFyZ3VtZW50cy4KCjEwLzA1LzIwMDQ6IG1tYXR1cwoJICAgIC0gW3B5dGhvbl0gRml4IGRpcmVjdG9yICsgbWV0aG9kIHdpdGggJ2VtcHR5JyB0aHJvdywgaWUKCgkJICAgIHN0cnVjdCBBIHsKCQkgICAgICB2aXJ0dWFsIGludCBmb28oKSB0aHJvdygpOwoJCSAgICB9OwoJCSAgICAKCSAgICAgIG90aGVyIGxhbmd1YWdlcyBzaG91bGQgYWxzbyBlYXN5IHRvIGZpeCwgbG9vayBmb3IKCSAgICAgIEdldGF0dHIobiwidGhyb3ciKSBpbiBweXRob24uY3h4LgoKCSAgICAtIEZpeCBkaXJlY3RvciArIGRlc3RydWN0b3Igd2l0aCAnZW1wdHknIHRocm93CgoJCSAgICBzdHJ1Y3QgQSB7CgkJICAgICAgdmlydHVhbCB+QSgpIHRocm93KCk7CgkJICAgIH07CgoJICAgIC0gTm93IFNXSUdfRkVBVFVSRVMgcGFyc2UgYWxsIGFuZCB0aGUgc2FtZSAgb3B0aW9ucyB5b3UKICAgICAgICAgICAgICBjYW4gcGFzcyB0byBzd2lnIGluIHRoZSBjb21tYW5kIGxpbmUuCgkgICAgICAKCSAgICAtIE5ldyBjb21tYW5kIGxpbmUgZmxhZzogLWZlYXR1cmVzIDxsaXN0PiwgYXMgaW4KCgkgICAgICAgIHN3aWcgLWZlYXR1cmVzIGF1dG9kb2M9MyxkaXJlY3RvcgoKCSAgICAgIGllLCBhbnkgZ2xvYmFsIGZlYXR1cmUgY2FuIGJlIGluaXRpYWxpemVkIGZyb20gdGhlCgkgICAgICBjb21tYW5kIGxpbmUuIFRoaXMgaXMgbWFpbmx5IGZvciB0ZXN0aW5nLCBidXQgdXNlcnMKCSAgICAgIGNhbiBhbHNvIHRha2UgYWR2YW50YWdlIG9mIGl0LgoKMTAvMDQvMjAwNDogbW1hdHVzCgkgICAgLSBQcm9wZXJseSBxdWFsaWZ5IHR5cGUgaW4gc3ludGF4IGFzICdsb25nKDIpJyBvciAnRm9vKCknLAoJICAgICAgdGhpcyBzb2x2ZSBvbGQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgYXJncywgYW5kIHByb2JhYmx5CgkgICAgICBvdGhlciBwcm9ibGVtcyBhcm91bmQuIEhvd2V2ZXIsIHRoZSBkZWZhdWx0IGFyZyBwcm9ibGVtCgkgICAgICB3YXMgYWxzbyBhbHJlYWR5IHNvbHZlZCBieSBXaWxsaWFtIChzZWUgYmVsbG93KS4KCgkgICAgLSBGaXggZmVhdHVyZV9zZXQgYW5kIGZlYXR1cmVfZ2V0IG1ldGhvZHMuIEJlZm9yZQoJICAgICAgdGhleSBsb29rIGZyb20gcGFydGljdWxhciB0byBnZW5lcmFsIGFuZCBrZWVwIHRoZSBmaXJzdAoJICAgICAgZmVhdHVyZSBmb3VuZC4gVGhpcyBkaWRuJ3Qgd29yayB3ZWxsIHdpdGggdGVtcGxhdGVzLgoJICAgICAgTm93IHRoZSBtZXRob2RzIGxvb2sgZnJvbSBnZW5lcmFsIHRvIHBhcnRpY3VsYXIsIGFuZAoJICAgICAgb3ZlcnJpZGUgYW55IGZvdW5kIGZlYXR1cmUuCgogICAgICAgICAgICAtIFByZXZpb3VzbHkgYSBmZWF0dXJlIGNvdWxkIG5vdCBiZSBhcHBsaWVkIHRvIGNvbnN0cnVjdG9ycwogICAgICAgICAgICAgIG9yIGRlc3RydWN0b3JzIHRoYXQgd2VyZW4ndCBleHBsaWNpdGx5IGRlY2xhcmVkIGluIHRoZSBjbGFzcy4KICAgICAgICAgICAgICBUaGlzIGlzIG5vdyBmaXhlZCwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIikgRm9vKCkgIi4uLiIKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJmZWF0dXJlbmFtZSIpIH5Gb28oKSAiLi4uIgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLy8gaW1wbGljaXQgRm9vKCkgYW5kIH5Gb28oKQogICAgICAgICAgICAgICAgfTsKCgkgICAgLSBGaXggbWlzc2luZyBmZWF0dXJlcyBmb3IgZGVmYXVsdCBjb25zdC9kZXN0LCBieSByZWFsbHkKCSAgICAgICdjcmVhdGluZycgdGhlIG1ldGhvZHMgYW5kIGFwcGx5aW5nIHRoZSBmZWF0dXJlcy4KCgkgICAgLSBGaXggcmV0dXJuX2NvbnN0X3ZhbHVlLmkgY2FzZSBieSBhZGRpbmcgU3dpZ1ZhbHVlV3JhcHBlcjxjb25zdCBUPgoJICAgICAgc3BlY2lhbGl6YXRpb24uCgoJICAgIC0gRml4ICVleHRlbmQgKyBvdmVybG9hZCwgaW5jbHVkaW5nIG92ZXJsb2FkaW5nIGFjdHVhbAogICAgICAgICAgICAgIGNsYXNzIG1ldGhvZHMuIAoKCSAgICAtIEFkZGluZyBtb3JlIGNhc2VzIGluIHJlbGF0ZWQgZmlsZXMgaW4gdGhlIHRlc3Qtc3VpdGUuICAKCjEwLzA0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENoYW5nZXMgdG8gdGhlIHdheSBkZWZhdWx0IGFyZ3VtZW50cyBhcmUgd3JhcHBlZC4gUHJldmlvdXNseSBhIHNpbmdsZQogICAgICAgICAgICBtZXRob2Qgd2FzIGdlbmVyYXRlZCBmb3IgZWFjaCBtZXRob2QgdGhhdCBoYWQgZGVmYXVsdCBhcmd1bWVudHMuIElmCiAgICAgICAgICAgIGEgbWV0aG9kIGhhZCA1IGFyZ3VtZW50cywgc2F5LCBvZiB3aGljaCAxIGhhZCBhIGRlZmF1bHQgYXJndW1lbnQKICAgICAgICAgICAgdGhlbiB0aGUgY2FsbCB0byB0aGUgd3JhcHBlZCBtZXRob2Qgd291bGQgcGFzcyA1IGFyZ3VtZW50cy4gVGhlIGRlZmF1bHQKICAgICAgICAgICAgdmFsdWUgd2FzIGNvcGllZCBpbnRvIHRoZSB3cmFwcGVyIG1ldGhvZCBhbmQgdXNlZCBpZiB0aGUgc2NyaXB0aW5nCiAgICAgICAgICAgIGxhbmd1YWdlIHBhc3NlZCBqdXN0IDQgYXJndW1lbnRzLiBIb3dldmVyLCB0aGlzIHdhcyBmbGF3ZWQgYXMgdGhlCiAgICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnQgc29tZXRpbWVzIGRvZXMgbm90IGhhdmUgZ2xvYmFsIGFjY2VzcywgZm9yIGV4YW1wbGUKICAgICAgICAgICAgU1dJRyB3b3VsZCBnZW5lcmF0ZSBjb2RlIHRoYXQgY291bGRuJ3QgY29tcGlsZSB3aGVuIHdyYXBwaW5nOgoKICAgICAgICAgICAgICBjbGFzcyBUcmlja3kgewogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwgPSBwcml2YXRldmFsdWUpOwogICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50IHZhbCA9IFRyaWNreTo6Z2V0RGVmYXVsdCgpKTsKICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgc3RhdGljIGludCBnZXREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBlbnVtIHsgcHJpdmF0ZXZhbHVlID0gMjAwIH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEFsc28gYnVncyBpbiByZXNvbHZpbmcgc3ltYm9scyBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGUsIGZvciBleGFtcGxlCiAgICAgICAgICAgIChwcm9iYWJseSBmaXhhYmxlIHRob3VnaCk6CgogICAgICAgICAgICAgIG5hbWVzcGFjZSBTcGFjZSB7CiAgICAgICAgICAgICAgICBjbGFzcyBLbGFzcyB7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgS2xhc3MgY29uc3RydWN0b3JjYWxsKGNvbnN0IEtsYXNzJiBrID0gS2xhc3MoKSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGFwcHJvYWNoIGFsc28gZG9lcyBub3Qgd29yayBmb3Igc3RhdGljYWxseSB0eXBlZCBsYW5ndWFnZXMgKEMjIGFuZCBKYXZhKQogICAgICAgICAgICBhcyB0aGVzZSBsYW5ndWFnZXMgZG8gbm90IGFsbG93IG1ldGhvZHMgdG8gaGF2ZSB2YXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzLgogICAgICAgICAgICBBbHRob3VnaCBDIyBoYXMgYSBtZWNoYW5pc20gdG8gcGFzcyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMgdGhleQogICAgICAgICAgICBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGFyZSBtb3JlIGxpa2UgdmFyYXJncy4KCiAgICAgICAgICAgIFRoZSBuZXcgYXBwcm9hY2ggc29sdmVzIHRoZSBhYm92ZSBwcm9ibGVtcyBhbmQgd3JhcHMgbWV0aG9kcyB3aXRoIGRlZmF1bHQKICAgICAgICAgICAgYXJndW1lbnRzIGFzIGlmIHRoZSBtZXRob2Qgd2FzIG92ZXJsb2FkZWQuIFNvIFNXSUcgd2lsbCBub3cgdHJlYXQKCiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFzIGlmIGl0IGhhZCBwYXJzZWQ6CgogICAgICAgICAgICAgIHZvaWQgZm9vKGludCk7CiAgICAgICAgICAgICAgdm9pZCBmb28oKTsKCiAgICAgICAgICAgIFRoZSBjb2RlIGdlbmVyYXRlZCBpcyB0aGVuIGV4YWN0bHkgdGhlIHNhbWUgYXMgaWYgU1dJRyBoYWQgcGFyc2VkIHRoZSB0d28KICAgICAgICAgICAgb3ZlcmxvYWRlZCBtZXRob2RzLiBUaGUgc2NyaXB0aW5nIGxhbmd1YWdlcyBjb3VudCB0aGUgYXJndW1lbnRzIHBhc3NlZCBhbmQgY2FsbAogICAgICAgICAgICB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kLCBqdXN0IGxpa2Ugb3ZlcmxvYWRlZCBtZXRob2RzLiBDIyBhbmQgSmF2YSBhcmUgbm93IGFibGUKICAgICAgICAgICAgdG8gcHJvcGVybHkgd3JhcCBtZXRob2RzIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYnkgZ2VuZXJhdGluZyBleHRyYSBtZXRob2RzLAogICAgICAgICAgICBhZ2FpbiBhcyBpZiB0aGUgbWV0aG9kIHdhcyBvdmVybG9hZGVkLCBzbyBmb3I6CgogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzPSJoZWxsbyIsIGRvdWJsZSBkPTEwLjAsIGludCBpPTApOwoKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBwcm94eSBtZXRob2RzIGFyZSBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzLCBkb3VibGUgZCwgaW50IGkpOwogICAgICAgICAgICAgIHZvaWQgYmFyKHN0cmluZyBzLCBkb3VibGUgZCk7CiAgICAgICAgICAgICAgdm9pZCBiYXIoc3RyaW5nIHMpOwogICAgICAgICAgICAgIHZvaWQgYmFyKCk7CgogICAgICAgICAgICBUaGUgbmV3IGFwcHJvYWNoIGNvbWVzIHdpdGggYSBjb3VwbGUgb2YgbWlub3Iga25vY2sgb24gZWZmZWN0cy4KCiAgICAgICAgICAgIDEpIFNXSUcgc3VwcG9ydCBmb3IgZGVmYXVsdCBhcmd1bWVudHMgZm9yIEMgKG5vdCBDKyspIGNvZGUgbm8gbG9uZ2VyIHdvcmtzLgogICAgICAgICAgICBQcmV2aW91c2x5IHlvdSBjb3VsZCBoYXZlIHRoaXMgaW50ZXJmYWNlOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbD0wKTsKCiAgICAgICAgICAgIGFuZCBjYWxsIHRoZSB3cmFwcGVkIG1ldGhvZCBmcm9tIGEgc2NyaXB0aW5nIGxhbmd1YWdlIGFuZCBwYXNzIG5vIGFyZ3VtZW50cwogICAgICAgICAgICB3aGVyZXVwb24gdGhlIGRlZmF1bHQgb2YgMCB3YXMgdXNlZC4gWW91IGNhbiBnZXQgdGhlIHNhbWUgYmVoYXZpb3VyIGZvciBDCiAgICAgICAgICAgIGNvZGUgYnkgdXNpbmcgdGhlICJkZWZhdWx0IiB0eXBlbWFwOgoKICAgICAgICAgICAgICAldHlwZW1hcChkZWZhdWx0KSBpbnQgdmFsICIkMSA9IDA7IjsKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWwpOwogICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHZhbCk7CgogICAgICAgICAgICBvciB5b3UgY291bGQgb2YgY291cnNlIGNvbXBpbGUgeW91ciBjb2RlIGFzIEMrKyBpZiB5b3Ugd2FudCBDKysgZmVhdHVyZXMgOikgOgoKICAgICAgICAgICAgICAlewogICAgICAgICAgICAgIHZvaWQgZm9vKGludCB2YWw9MCk7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgQSBjb3VwbGUgb2YgU1dJRydzIGxpYnJhcmllcyB1c2VkIHRoaXMgQyBleHRlbnNpb24gYW5kIHRoZXNlIGhhdmUgYmVlbiBtb2RpZmllZAogICAgICAgICAgICB0byB1c2UgdGhlICJkZWZhdWx0IiB0eXBlbWFwLiBUaGUgImRlZmF1bHQiIHR5cGVtYXAgaXMgdGh1cyB1bmNoYW5nZWQgKGFuZCBzdGlsbAogICAgICAgICAgICBpcyBub3QgYW5kIGlzIG5vdCBmdWxseSBzdXBwb3J0ZWQgYnkgQyMgYW5kIEphdmEsIGFuZCBpcyBsaWtlbHkgdG8gcmVtYWluIHNvKS4KCgogICAgICAgICAgICAyKSBBbGwgZmVhdHVyZXMgKCVmZWF0dXJlLCAlcmVuYW1lLCAlaWdub3JlIGV0Yykgbm8gbG9uZ2VyIHdvcmsgYXMgaWYgdGhlIG1ldGhvZAogICAgICAgICAgICB3aXRoIGRlZmF1bHQgYXJndW1lbnRzIGlzIGp1c3Qgb25lIG1ldGhvZC4gRm9yIGV4YW1wbGUsIHByZXZpb3VzbHkKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKCiAgICAgICAgICAgIHdvdWxkIGhhdmUgaWdub3JlZCB0aGUgbWV0aG9kIGNvbXBsZXRlbHkuIE5vdyBpdCB3aWxsIG9ubHkgaWdub3JlIGZvbyhpbnQpIGJ1dAogICAgICAgICAgICBub3QgdGhlIGV4dHJhIGZvbygpIG1ldGhvZC4gSW5zdGVhZCB1c2U6CgogICAgICAgICAgICAgICVpZ25vcmUgZm9vOwoKICAgICAgICAgICAgdG8gaWdub3JlIHRoZW0gYWxsLiBvcgoKICAgICAgICAgICAgICAlaWdub3JlIGZvbyhpbnQpOwogICAgICAgICAgICAgICVpZ25vcmUgZm9vKCk7CgogICAgICAgICAgICBUaGlzIG9mIGNvdXJzZSBhbGxvd3Mgb25lIHRvIGZpbmUgdHVuZSB0aGUgd3JhcHBpbmcsIGZvciBleGFtcGxlIG9uZSBjb3VsZCB1c2U6CgogICAgICAgICAgICAgICVyZW5hbWUoZm9vaW50KSBmb28oaW50KTsKICAgICAgICAgICAgICAlcmVuYW1lKGZvb2RlZmF1bHRzKSBmb28oKTsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgYW5kIGNhbGwgdGhlbSBmcm9tIGFueSBsYW5ndWFnZSBsaWtlIHNvOgoKICAgICAgICAgICAgICBmb29pbnQoMjAwKQogICAgICAgICAgICAgIGZvb2RlZmF1bHRzKCkKCiAgICAgICAgICAgIG9yIGZvciBleGFtcGxlIGlnbm9yZSB0aGUgZXh0cmEgb3ZlcmxvYWRlZCBtZXRob2QsIHNvIHRoZSBkZWZhdWx0cyBjYW5ub3QgYmUgdXNlZDoKCiAgICAgICAgICAgICAgJWlnbm9yZSBmb28oKTsKICAgICAgICAgICAgICB2b2lkIGZvbyhpbnQgdmFsPTApOwoKICAgICAgICAgICAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTAvMi8yMDA0OiBtbWF0dXMKCSAgIFtQeXRob25dCgkgICAtIE1vcmUgY2xlYW5pbmcgdXAgYW5kIHVuaWZvcm1hdGlvbiBvbiB0aGUgUHl0aG9uIExpYgoKCSAgIC0gQWRkZWQgUm9iaW4ncyBkb2NzdHJpbmcgcGF0Y2gsIHBsdXMgc29tZSBmaXhlcywgcGx1cwoJICAgICBzb21lIGV4dGVuc2lvbnMsIHNlZSBhdXRvZG9jLmkgZXhhbXBsZSBpbiB0aGUgdGVzdC1zdWl0ZSwKCSAgICAgYW5kIHRyeSB1c2luZyAlZmVhdHVyZSgiYXV0b2RvYyIsImV4dGVuZGVkIikuCgkgICAgCgkgICAgIFRoaXMgcGF0Y2ggaXMgbm90IGEgY29tcGxldGUgc29sdXRpb24gZm9yIHRoZQoJICAgICBkb2N1bWVudGF0aW9uIHByb2JsZW0sIGp1c3QgZW5vdWdoIHRvIGluZm9ybSBweXRob24gYWJvdXQKCSAgICAgdGhlIHBhcmFtZXRlciBsaXN0LgoKCSAgICAgVGhlIGV4cGVjdGVkIHN3aWcgZG9jdW1lbnRhdGlvbiBzdXBwb3J0IGlzIGZhciBmYXIgYXdheSB5ZXQuCgkgICAgIAoKMTAvMS8yMDA0OiBtbWF0dXMKCSAgIC0gRml4IHRoZSAlY2FsbGJhY2sgZmVhdHVyZSAob25seSB1c2VkIGluIHJ1YnkgYW5kIHB5dGhvbiBleGFtcGxlcywKCSAgICAgYnkgbm93LCBidXQgaXQgc2hvdWxkIGJlIGdlbmVyaWMpLCBub3cgbWVtYmVyIGNhbGxiYWNrcwoJICAgICBhcmUgd29ya2luZyBhZ2FpbgoJICAgICAKCSAgIC0gRml4IHdyYXBwaW5nIG9mIGZ1bmN0aW9ucyBwb2ludGVycyBsaWtlCgoJCSBzdGQ6Om9zdHJlYW0mIHN0ZDo6ZW5kbChzdGQ6Om9zdHJlYW0mKTsKCgkgICAgIGllLCB0aGUgb25lcyB0aGF0IHJldHVybiByZWZlcmVuY2VzIG9yIGVudW1zLgoJIAoJICAgW1B5dGhvbl0gQWRkIHRoZSAlcHl0aG9uY2FsbGJhY2sgZGlyZWN0aXZlLCB3aGljaCBpcyAKCSAgIGFuIGltcHJvdmVkIHZlcnNpb24gb2YgJWNhbGxiYWNrLCBpZSwKCgkgICAgICVweXRob25jYWxsYmFjaygxKSBmb287CgkgICAgICVweXRob25jYWxsYmFjaygxKSBBOjpiYXI7CgkgICAgICVweXRob25jYWxsYmFjaygxKSBBOjpiYXJtOwoKCSAgICAgaW50IGZvbyhpbnQgYSkgewoJICAgICAgICAgcmV0dXJuIGE7CgkgICAgIH0KICAKCSAgICAgc3RydWN0IEEgCgkgICAgIHsKCSAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgYSk7CgkgICAgICAgaW50IGJhcm0oaW50IGEpOwoKCSAgICAgfTsKCiAgICAgICAgICAgICBpbnQgZm9vYmFyKGludCBhLCBpbnQgKCpwZikoaW50IGEpKTsKCgkgICBpbiBweXRob24geW91IGNhbiB1c2UKCiAgICAgICAgICAgICBmb28oMikKCSAgICAgZm9vYmFyKDIsZm9vKQogICAgICAgICAgICAgQS5iYXIoMikKCSAgICAgZm9vYmFyKDIsQS5iYXIpCiAgICAgICAgICAKICAgICAgICAgICBpZSwgbm8gYWRkaXRpb25hbCBwb2ludGVyIGVsZW1lbnRzIGFyZSBjcmVhdGVkLCBhbmQKCSAgIHRoZSBvcmlnaW5hbCAnZm9vJyBhbmQgJ0EuYmFyJyBjYW4gYmUgdXNlZCBhcyBwYXJhbWV0ZXJzLgoKCSAgIEluIHRoZSBjYXNlIG9mIG1lbWJlciBmdW5jdGlvbiBob3dldmVyLCBzdGlsbCB5b3UgbmVlZAoJICAgdG8gdXNlIHRoZSBzcGVjaWFsIHZhcmlhYmxlIENsYXNzOjo8Zm5jX25hbWU+X2NiX3B0ciwgaWU6CgogCSAgICAgZm9vYmFybSgzLCBhLCBBLmJhcm1fY2JfcHRyKQoJICAgCgkgICB3ZSB3aWxsIHRyeSB0byBmaXggdGhpcyBzaXR1YXRpb24gYWxzbywgYnV0IGxhdGVyLiAgCgoJICAgW1B5dGhvbl0gQWRkIG1vcmUgZWxlbWVudHMgZnJvbSB0aGUgU1RMIGxpYnJhcnksIG5vdwoJICAgeW91IGNhbiB1c2UKCgkgICAgIGltcG9ydCBzdGQKCSAgICAgc3RkLmNvdXQgPDwgImhlbGxvICIgPDwgMTIzIDw8IHN0ZC5lbmRsCgoJICAgW1B5dGhvbl0gRml4IGluL291dCByZXR1cm4gbWVjaGFuaXNtLCBub3cgc3dpZyB3aWxsIGJlaGF2ZQoJICAgYXMgMS4zLjIxIGJ1dCB1c2luZyBhIHB5dGhvbiBsaXN0IHdoZW4gbmVlZGVkLiBUaGUgcHJvYmxlbQoJICAgaXMgdGhhdCB0aGUgdHlwZXMgc3RkOjpwYWlyLHN0ZDo6dmVjdG9yLGV0YywgdXNlIHR1cGxlcywKCSAgIGFuZCB0aGV5IGludGVyZmVyIHdpdGggdGhlIHByZXZpb3VzIGlub3V0IHR1cGxlIHR5cGUuCgoJICAgQnkgdXNpbmcgbGlzdHMgd2Ugc29sdmUgdGhlIGNvbmZsaWN0cywgc3dpZyBhY3RzIGFzIGJlZm9yZSwKCSAgIGJ1dCByZXR1cm5zIGEgbGlzdCB3aGVuIG1vcmUgdGhhbiBvbmUgcGFyYW1ldGVyIGFyZSB1c2luZwoJICAgdGhlIE9VVCB0eXBlbWFwLiBTZWUgdGhlIG5ldyBpbm91dC5pIGV4YW1wbGUgaW4gdGhlCgkgICB0ZXN0LXN1aXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgkJICAgCiAgICAgICAgICAgW1B5dGhvbl0gTXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIGJhZCBhcmd1bWVudHMsIG5vdwoJICAgeW91IGFsd2F5cyBnZXQgdGhlIGFyZ3VtZW50IG51bWJlciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuCgowOS8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCBmcm9tIEJpbGwgQ2xhcmtlIC0KICAgICAgICAgICAgMSkgV2FybmluZyBlbWl0dGVkIHdoZW4gLWltcG9ydGFsbCBhbmQgLWluY2x1ZGVhbGwgaXMgdXNlZCB0b2dldGhlciwKICAgICAgICAgICAgICAgd2l0aCAtaW5jbHVkZWFsbCB0YWtpbmcgcHJlY2VkZW5jZS4KICAgICAgICAgICAgMikgRW5zdXJlIFNXSUdJTVBPUlRFRCBpcyBhbHdheXMgZGVmaW5lZCB3aGVuIGEgZmlsZSBpcyBiZWluZwogICAgICAgICAgICAgICBpbXBvcnRlZCB3aXRoICVpbXBvcnQuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBTV0lHSU1QT1JULAogICAgICAgICAgICAgICB3aGljaCBnZXRzIGRlZmluZWQgaW4gYWxsIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGVzLgoKMDkvMjYvMjAwNDogbW1hdHVzCgoJICAgIC0gYWRkICVmZWF0dXJlKCJleGNlcHRpb25jbGFzcyIpIHRvIGlkZW50aWZ5IGEgY2xhc3MgdXNlZAoJICAgICAgYXMgZXhjZXB0aW9uLiBCZWZvcmUgc3dpZyBpZGVudGlmaWVkIGFuZCBtYXJrZWQgYSBjbGFzcwoJICAgICAgdXNpbmcgdGhlICJjcGx1czpleGNlcHRpb25jbGFzcyIgYXR0cmlidXRlLiBIb3dldmVyLCB0aGUKCSAgICAgIGNsYXNzIG5lZWRlZCB0byBhcHBlYXIgb24gYW4gdGhyb3coKSBzdGF0ZW1lbnQuICBOb3cKCSAgICAgIHN3aWcga2VlcHMgdHJ5aW5nIHRvIGlkZW50aWZ5IHRoZSBleGNlcHRpb24gY2xhc3NlcywgYXMKCSAgICAgIGJlZm9yZSwgYnV0IGl0IGFsc28gYWxsb3dzIHRoZSB1c2VyIHRvIG1hcmsgYSBjbGFzcyBieQoJICAgICAgdXNpbmcgdGhlICVmZWF0dXJlIGV4cGxpY2l0bHkuIChtb3N0bHkgcmVsZXZhbnQgZm9yCgkgICAgICBweXRob24gYW5kIGNoaWNrZW4pCgoJICAgIFtQeXRob25dCgoJICAgIC0gZml4IC1tb2Rlcm4gb3B0aW9uICsgZXhjZXB0aW9ucywgd2hpY2ggbWl4IG9sZCBjbGFzcwoJICAgICAgc3R5bGUgd2l0aCB0aGUgbmV3IG9uZS4gU28sIHdlIGFsd2F5cyBuZWVkIHRvIGVtaXQKCSAgICAgIHRoZSAibm9ubW9kZXJuIiBweXRob24gY29kZS4KCgkgICAgLSBhZGQgdGhlICJweXRob246bm9uZHluYW1pYyIgZmVhdHVyZSBhbmQgaXRzIGhhbmRsZXIKCgkgICAgICBub3cgaWYgeW91IGhhdmUKCSAgICAgIAoJICAgICAgJXB5dGhvbm5vbmR5bmFtaWMgQTsKCSAgICAgIAoJICAgICAgc3RydWN0IEEgewoJICAgICAgIGludCBhOwoJICAgICAgIGludCBiOwoJICAgICAgfTsKCgkgICAgICB0aGVuLCBpbiB0aGUgcHl0aG9uIHNpZGUKCSAgICAgIAoJICAgICAgYWEgPSBBKCkKCSAgICAgIAoJICAgICAgYWEuYSA9IDEgIyBvawoJICAgICAgYWEuYiA9IDIgIyBvawoJICAgICAgYWEuYyA9IDMgIyBlcnJvciwgdGhlIGNsYXNzIGNhbiBub3QgYmUgZXh0ZW5kZWQgZHluYW1pY2FsbHkuCgoJICAgIAoJICAgIFNpbmNlIHRoaXMgaXMgYSBmZWF0dXJlLCB5b3UgY2FuIHVzZQoKCSAgICAgICVweXRob25ub25keW5hbWljOwoKICAgICAgICAgICAgb3IgCgoJICAgICAgJXB5dGhvbmR5bmFtaWM7IFsgTm90ZTogJXB5dGhvbmR5bmFtaWMgc2luY2UgZGVwcmVjYXRlZCBdCiAgIAoJICAgIHRvIGZvcmNlIGFsbCB0aGUgd3JhcHBlZCBjbGFzc2VzIHRvIGJlICJub25keW5hbWljIiBvbmVzLgoKCSAgICBUaGUgZGVmYXVsdCwgYXMgaW4gcmVndWxhciBweXRob24sIGlzIHRoYXQgYWxsIHRoZSB3cmFwcGVkCgkgICAgY2xhc3NlcyBhcmUgZHluYW1pY3MuIFNvLCBjYXJlZnVsIHdpdGggeW91ciBzcGVsbGluZy4KCjA5LzE0LzIwMDQ6IG1tYXR1cyAKCSAgICAtIFN1cHBvcnQgdGhlIC1JLSBvcHRpb24uCgoJICAgIC0gRGlmZmVyZW50aWF0ZSBiZXR3ZWVuICVpbmNsdWRlIDxmaWxlPiBhbmQgJWluY2x1ZGUgImZpbGUiLgoJICAgICAgVGhpcyBmaXggc2V2ZXJhbCBjb3JuZXIgY2FzZXMuCgoJICAgIAoJICAgIFtQeXRob25dIFNldmVyYWwgcGF0Y2hlczoKCgkgICAgLSBOb3JtYWxpemUgdGhlIExpYiBmaWxlIG5hbWVzOiAKCQkqLnN3ZyBpbnRlcm5hbCBmaWxlcywgCgkJKi5pICAgdXNlciBmaWxlcy4KCgkgICAgLSBGaXggQ2hhcltBTlldIHR5cGVtYXBzLCBzbyB0aGV5IGFsc28gZGVsZXRlIGFueSBleHRyYSAnXDAnIGNoYXJzLAoJICAgICAgbm93IHRoZXkgYmVoYXZlIGFzIGJlZm9yZSAoMS4zLjIxKS4gU3RpbGwsIHlvdSBjYW4gdXNlCgkgICAgICB0aGUgU1dJR19QUkVTRVJWRV9DQVJSQVlfU0laRSBtYWNybyBpZiB5b3UgbmVlZCB0bwoJICAgICAgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHNpemUgKHNlZSBweXN0cmJhc2Uuc3dnKS4KCgkgICAgLSBBZGQgdGhlIENoYXIgRklYU0laRVtBTlldIHR5cGVtYXBzLCB0byBwcmVzZXJ2ZSB0aGUKICAgICAgICAgICAgICBvcmlnaW5hbCBDIGFycmF5IHNpemVzIChzZWUgYWJvdmUpLiBUaG91Z2gsIHlvdSBjYW4ndAogICAgICAgICAgICAgIHVzZSB0aGVtIHlldCBzaW5jZSAlYXBwbHkgYW5kIGFycmF5cyBhcmUgbm90IHdvcmtpbmcKICAgICAgICAgICAgICB0b2dldGhlci4KCiAgICAgICAgICAgIC0gQWRkIHB5ZnJhZ21lbnRzLnN3Zywgbm93IHRoZSB1c2VyIGNhbiBhZGQgZnJhZ21lbnRzCgkgICAgICB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvbmVzLgoKMDkvMTAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUGF0Y2ggZnJvbSBCaWxsIENsYXJrZSB3aGljaCBmaXhlcyBzcHVyaW91cyBwcmVwcm9jZXNzb3IgYnVnIHdoaWNoCiAgICAgICAgICAgIHNob3dzIG9uIFNvbGFyaXMgYW5kIGdjYywgZWc6CiAgICAgICAgICAgICAgICBXYXJuaW5nKDIwMik6IENvdWxkIG5vdCBldmFsdWF0ZSAnIWRlZmluZWQoU1dJR0pBVkEpICYmCiAgICAgICAgICAgICAgICAhKGRlZmluZWQoU1dJR0NTSEFSUCknCiAgICAgICAgICAgIEFsc28gZml4ZXMgYSBidWcgd2hlcmUgJyNpZiAiYSIgPT0gImIiID09IDEnIHdvdWxkbid0IGhhdmUgd29ya2VkIAoKMDkvMTAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgUmVzdG9yZWQgbXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgZm9yIHRoZSB0ZXN0LXN1aXRlLiBQYXRjaCBmcm9tCiAgICAgICAgICAgIEJpbGwgQ2xhcmtlLgoKMDkvMDYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQWRkZWQgdGhlIG1pc3NpbmcgcnVudGltZS5kc3AgVmlzdWFsIFN0dWRpbyBwcm9qZWN0IGZpbGVzIGZvciB0aGUKICAgICAgICAgICAgaW1wb3J0IGV4YW1wbGVzIHRvIHdvcmsuCgoKVmVyc2lvbiAxLjMuMjIgKFNlcHRlbWJlciA0LCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOS8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBUaGUgc3dpZy5tNCBtYWNybyBmb3IgdXNlIHdpdGggdGhlIEF1dG9jb25mL0F1dG9tYWtlL0xpYnRvb2wgaGFzCiAgICAgICAgICAgIGJlZW4gcmVtb3ZlZCBhbmQgaXMgbm8gbG9uZ2VyIGluc3RhbGxlZC4gUGxlYXNlIHVzZSB0aGUgbmV3IGFuZCBiZXR0ZXIKICAgICAgICAgICAgbWFpbnRhaW5lZCB2ZXJzaW9uIGRlcml2ZWQgZnJvbSBzd2lnLm00IGluIHRoZSBBdXRvY29uZiBtYWNybyBhcmNoaXZlLgogICAgICAgICAgICBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2FjLWFyY2hpdmUvaHRtbGRvYy9hY19wa2dfc3dpZy5odG1sIGFuZAogICAgICAgICAgICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYWMtYXJjaGl2ZS9odG1sZG9jL2FjX3B5dGhvbl9kZXZlbC5odG1sLgoKMDkvMDEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW1BlcmxdIEFwcGxpZWQgcGF0Y2ggIzEwMTk2NjkgZnJvbSBDaHJpc3RvcGggRmxhbW0uIEFkZHMgc3VwcG9ydAogICAgICAgICAgICBmb3IgJWZlYXR1cmUoInNoYWRvdyIpIGluIHRoZSBzYW1lIHdheSBhcyBpdCB3b3JrcyBpbiBQeXRob24uIFRoaXMKICAgICAgICAgICAgZW5hYmxlcyBvbmUgdG8gb3ZlcnJpZGUgdGhlIGdlbmVyYXRlZCBzaGFkb3cvcHJveHkgbWV0aG9kcywgaW5jbHVkaW5nCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAvKiBMZXQncyBtYWtlIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgY2xhc3MgU3F1YXJlIG1vcmUgdmVyYm9zZSAqLwoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2hhZG93IikgU3F1YXJlKGRvdWJsZSB3KQogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBzdWIgbmV3IHsKICAgICAgICAgICAgICAgICAgbXkgJHBrZyA9IHNoaWZ0OwogICAgICAgICAgICAgICAgICBteSAkc2VsZiA9IGV4YW1wbGVjOjpuZXdfU3F1YXJlKEBfKTsKICAgICAgICAgICAgICAgICAgcHJpbnQgU1RERVJSICJDb25zdHJ1Y3RlZCBhbiBAe1tyZWYoJHNlbGYpXX1cbiI7CiAgICAgICAgICAgICAgICAgIGJsZXNzICRzZWxmLCAkcGtnIGlmIGRlZmluZWQoJHNlbGYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgIGNsYXNzIFNxdWFyZSB7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgU3F1YXJlKGRvdWJsZSB3KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CgowOC8zMS8yMDA0OiBtbWF0dXMgCgkgICAgW1B5dGhvbl0gSW5jb21wYXRpYmlsaXR5IHJlcG9ydGVkIGJ5IEJpbGwgQ2xhcmtlIChsbGliQGNvbXB1dGVyLm9yZyk6CgkgICAgCgkgICAgSWYgeW91IGFyZSB1c2luZyBTdW4gU3R1ZGlvIDggKGFuZCBwb3NzaWJseSBlYXJsaWVyCgkgICAgdmVyc2lvbnMpIHRvIGNvbXBpbGUgdGhlIG91dHB1dCBwcm9kdWNlZCBieSBzd2lnCgkgICAgMS4zLjIycmMxLCBhbmQgeW91IGFyZSB1c2luZyBDKysgYW5kIFNUTCB0ZW1wbGF0ZXMgdGhlbgoJICAgIHlvdSBuZWVkIHRvIHVzZSBlaXRoZXIgIi1ydW50aW1lIiBvciAiLW5vcnVudGltZSIuICBJZiB5b3UKCSAgICB1c2UgbmVpdGhlciBvZiB0aGVzZSBvcHRpb25zIHRoZW4geW91IHdpbGwgcHJvYmFibHkgZ2V0CgkgICAgY29tcGlsZXIgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgdGhlIHdyYXBwZXIgZmlsZTsKCSAgICB0aGUgZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGxpa2UgdGhpczogVGhlIG5hbWUKCSAgICBTV0lHX1B5dGhvbl9Db252ZXJ0UHRyWy4uLl0gaXMgdW51c2FibGUgaW4gc3RhdGljCgkgICAgc3dpZ3B5Ojp0cmFpdHNfYXNwdHJbLi4uXSAgSWYgeW91IGdldCB0aGlzIGVycm9yIG1lc3NhZ2UsCgkgICAgeW91IG5lZWQgdG8gcmVnZW5lcmF0ZSB5b3VyIHdyYXBwZXIgZmlsZSB1c2luZyAnc3dpZwoJICAgIC1ydW50aW1lJyBvciAnc3dpZyAtbm9ydW50aW1lJy4KCgkgICAgWW91IHNob3VsZG4ndCBnZXQgdGhpcyBwcm9ibGVtIHdpdGggU3VuIFN0dWRpbyA5LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIFBZVEhPTiBNT0RVTEUgKioqCgkgICAgCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBBcHBsaWVkICM5MzIzMzMgZnJvbSBJa2VnYW1pIFRzdXRvbXUuIEZpeGVzIGxvbmcgbG9uZyAqT1VUUFVUCiAgICAgICAgICAgIGFuZCB1bnNpZ25lZCBsb25nIGxvbmcgKk9VVFBVVCB0eXBlbWFwcyBpbiB0eXBlbWFwcy5pLgoKMDgvMjYvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXBwbGllZCBwYXRjaCAjODU3MzQ0IGZyb20gQXJ0IFllcmtlcy4gV29ya2Fyb3VuZCBmb3IgYXV0b2NvbmYgYnVnIHdoZW4KICAgICAgICAgICAgcnVubmluZyAnbWFrZSBpbnN0YWxsJy4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtQZXJsXSBQYXJ0IG9mIHBhdGNoICM5ODI3NTMgYXBwbGllZC4gVGhpcyBpbXBsZW1lbnRzIGEgJXBlcmxjb2RlIGRpcmVjdGl2ZS4KICAgICAgICAgICAgSXQgYWxsb3dzIG9uZSB0byBhZGQgUGVybCBjb2RlIHRvIHRoZSBnZW5lcmF0ZWQgLnBtIGZpbGUuIFdvcmtzIHRoZSBzYW1lIAogICAgICAgICAgICBhcyAlcHl0aG9uY29kZS4KCjA4LzI2LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIGRpcmVjdG9ycyB3aGVuIHdyYXBwaW5nIHZpcnR1YWwgbWV0aG9kcyB3aXRoIGV4Y2VwdGlvbgogICAgICAgICAgICBzcGVjaWZpY2F0aW9ucyB0aGF0IHdlcmUgbm90IHNpbXBsZSB0eXBlcy4gUHJldmlvdXNseSBjb2RlIHdhcyBnZW5lcmF0ZWQgdGhhdAogICAgICAgICAgICBkaWRuJ3QgY29tcGlsZSwgZm9yIGV4YW1wbGUgd2hlbiB0aGUgZXhjZXB0aW9uIHNwZWNpZmljYXRpb24gd2FzIGEgcG9pbnRlci4KCjA4LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gVHlwZW1hcCBmaXggZm9yIG1ldGhvZHMgdGhhdCByZXR1cm4gY2hhciAqLiBUaGUgQ0xSIHdvdWxkIGluY29ycmVjdGx5CiAgICAgICAgICAgIGRlbGV0ZSB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgY2hhciAqLiBBbHNvIGFwcGxpZWQgdGhlIHNhbWUgY29ycmVjdGlvbiB0bwogICAgICAgICAgICB0aGUgY2hhciBhcnJheSB0eXBlbWFwcy4KCjA4LzI0LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeGVzIGZvciAtZm1pY3Jvc29mdCBlcnJvci93YXJuaW5nIG1lc3NhZ2UgZGlzcGxheTogCiAgICAgICAgICAgIC0gRW5kIG9mIGZpbGUgKEVPRikgd2FybmluZyBtZXNzYWdlcyBub3QgZGlzcGxheWluZyBpbiBjb3JyZWN0IGZvcm1hdAogICAgICAgICAgICAtIFNvbWUgbWVzc2FnZXMgY29udGFpbmluZyBhIGZpbGUgcGF0aCB3ZXJlIGRpc3BsYXlpbmcgYSBkb3VibGUgYmFja3NsYXNoCiAgICAgICAgICAgICAgaW5zdGVhZCBvZiBhIHNpbmdsZSBiYWNrc2xhc2gKCjA4LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEFwcGxpZWQgcGF0Y2ggIzEwMTE2MDQgc3VibWl0dGVkIGJ5IENoYXJsZXMgU2Nod2lldGVycy4gRml4IGZvciA2NCBiaXQgdGNsCiAgICAgICAgICAgIGludGVycHJldGVycy4KCjA4LzIzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEZpeCBmb3IgYnVnICM4NzU1ODMgLSBlbnVtIGZvcndhcmQgZGVjbGFyYXRpb25zIHByZXZpb3VzbHkgZ2F2ZSBhIHN5bnRheCBlcnJvci4KCjA4LzIzLzIwMDQ6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gVXNlIHR5cGVtYXBzICJmZml0eXBlIiBhbmQgImxpc3B0eXBlIiB0byBkZXRlcm1pbmUgdGhlIEZGSSB0eXBlCgkgICAgc3BlY2lmaWVycyBmcm9tIHRoZSBDIHR5cGUuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlLCBmb3IgaW5zdGFuY2UsIHRvIGNvbnRyb2wKCSAgICB3aGV0aGVyIGEgQyAiY2hhciIgYXJndW1lbnQgdGFrZXMgYSBMaXNwIGNoYXJhY3RlciBvciBhIExpc3AgaW50ZWdlciB2YWx1ZS4KCSAgICBUaGUgZGVmYXVsdCAodGFraW5nIExpc3AgY2hhcmFjdGVycykgaXMgZG9uZSBieSB0aGVzZSBidWlsdC1pbiB0eXBlbWFwczoKCSAgICAgICV0eXBlbWFwKGZmaXR5cGUpIGNoYXIgIjpjaGFyIjsgJXR5cGVtYXAobGlzcHR5cGUpIGNoYXIgImNoYXJhY3RlciI7CgkgICAgSWYgY2hhciBtZWFucyBhbiBpbnRlZ2VyIGluc3RlYWQsIHVzZSB0aGVzZSB0eXBlbWFwczoKCSAgICAgICV0eXBlbWFwKGZmaXR5cGUpIGNoYXIgIjpjaGFyIjsgJXR5cGVtYXAobGlzcHR5cGUpIGNoYXIgImludGVnZXIiOwoKMDgvMjIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgQXMgZGlzY3Vzc2VkIGluIGJ1ZyAjNzcyNDUzLCB0aGUgU1dJRyBsaWJyYXJ5IGRpcmVjdG9yeSBpcyBub3cgaW5zdGFsbGVkCiAgICAgICAgICAgIGludG8gYSBkaWZmZXJlbnQgZGVmYXVsdCBkaXJlY3RvcnkuIFRoZSBsaWJyYXJ5IHVzZWQgdG8gYmUgaW5zdGFsbGVkIHRvCiAgICAgICAgICAgIC91c3IvbG9jYWwvbGliL3N3aWcxLjMuIEl0IGlzIG5vdyBpbiB0aGUgbW9yZSB1c3VhbCBhcmNoaXRlY3R1cmUgaW5kZXBlbmRlbnQKICAgICAgICAgICAgZGlyZWN0b3J5IGFuZCBJIGhhdmUgYWRkaXRpb25hbGx5IHVzZWQgYSB2ZXJzaW9uIHNwZWNpZmljIHN1YmRpcmVjdG9yeSBhcwogICAgICAgICAgICB0aGUgbGlicmFyeSB3aWxsIHJhcmVseSB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgU1dJRy4gVGhpcyByZWxlYXNlCiAgICAgICAgICAgIHdpbGwgdGh1cyB1c2UgL3Vzci9sb2NhbC9zaGFyZS9zd2lnLzEuMy4yMiBieSBkZWZhdWx0LCB3aGljaCBjYW4gYmUKICAgICAgICAgICAgdGFpbG9yZWQgYXMgYmVmb3JlIHVzaW5nICcuL2NvbmZpZ3VyZSAtLXN3aWdsaWJkaXInLgoKMDgvMTcvMjAwNDogbWtvZXBwZQoJICAgIFtNelNjaGVtZV0gQWRkIHN1cHBvcnQgdG8gY3JlYXRlIG5hdGl2ZSBNelNjaGVtZSBzdHJ1Y3R1cmVzIGZyb20gQyBzdHJ1Y3R1cmVzLgoJICAgIFRvIGNvbnZlcnQgYSBDIHN0cnVjdHVyZSB0byBhbiBNelNjaGVtZSBzdHJ1Y3R1cmUsIHVzZSB0aGUgbmV3IHJ1bnRpbWUgbWFjcm8KCSAgICBTV0lHX05ld1N0cnVjdEZyb21QdHIgaW4gYSB0eXBlbWFwLiAgUGF0Y2ggZnJvbSBEbWl0cml5IFphdmluLiAKCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoICM4Mzc3MTUgZnJvbSBCZW4gUmVzZXIgdG8gY29ycmVjdGx5IGRldGVjdCBQeXRob24gbGliIGRpcmVjdG9yeQogICAgICAgICAgICBvbiA2NCBiaXQgc3lzdGVtcy4KCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gUHJldmVudCBtZW1vcnkgbGVha3MgaW4gdGhlIGNhc2Ugb2YgZWFybHkgcmV0dXJuCiAgICAgICAgICAgIGZyb20gd3JhcHBlciBtZXRob2RzIHVzaW5nIGNvbnN0IHN0ZDo6c3RyaW5nICYgcGFyYW1ldGVycy4gTW9kaWZpZWQKICAgICAgICAgICAgTWFyayBUcmF1ZHQgcGF0Y2ggIzk1MTU2NS4KCjA4LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIEJ1ZyAjOTQzNzgzIHdpdGggcGF0Y2ggZml4ZXMgcGhwIGNoYXIgKiBvdXQgdHlwZW1hcCBOVUxMIHZhbHVlcy4KCjA4LzAzLzIwMDQ6IEFobW9uIERhbmN5ICA8ZGFuY3lAZGFuY3k+CgogICAgICAgICAgICBbYWxsZWdyb2NsXSBBZGRpdGlvbmFsIGNhc2UgbW9kZSBmaXhlcy4gIEFsc28sIG1ha2Ugc3VyZQoJICAgIGZvcmVpZ24gdHlwZXMgYXJlIGV4cG9ydGVkLgoKMDcvMjQvMjAwNDogbWtvZXBwZSAKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgU1dJRyBtb2R1bGVzIG5vdyBleGNoYW5nZSB0aGVpciBwb2ludGVyIHR5cGUKCSAgICBpbmZvcm1hdGlvbiB2aWEgdGhlIEd1aWxlIGludGVycHJldGVyLiAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBidWlsZCBhCgkgICAgcnVudGltZSBsaWJyYXJ5IG9yIHRvIHVzZSAtbm9ydW50aW1lIGFuZCAtcnVudGltZSBldGMuCgkgICAgCgkgICAgVGhlIG1vZHVsZSAoU3dpZyBzd2lncnVuKSB3aGljaCB3YXMgaW50cm9kdWNlZCBpbiB0aGUgY2hhbmdlIG9mIDA1LzE3LzIwMDQgaXMKCSAgICBubyBsb25nZXIgYXV0b21hdGljYWxseSBidWlsdC4gIElmIHlvdSBuZWVkIGl0LCBydW4gU1dJRyBvbiB0aGUgaW50ZXJmYWNlIGZpbGUKCSAgICBzd2lncnVuLmkuIAoKMDcvMjMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBCdWcgIzkxNzYwMSBNYXBwaW5nIEMrKyBib29sIGZpeCBmcm9tIE1hcmsgVHJhdWR0CgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBSUE0gZml4ZXMgZm9yIGxhdGVzdCBDVlMgdmVyc2lvbiBpbmNsdWRpbmcgcmVtb3ZhbCBvZiBydW50aW1lCiAgICAgICAgICAgIGxpYnJhcnkuCgowNy8yMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjOTA4OTU1IGZyb20gUm9iZXJ0IEggRGUgVnJpZXMuCiAgICAgICAgICAgIFJQTSBmaWxlIGdlbmVyYXRpb24gZml4IGZvciBGZWRvcmUgQ29yZSAxIGFuZCBSZWRoYXQgQVMyLjEuCgowNy8xMi8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBQYXRjaCAjODY0Njg5IGZyb20gUm9iaW4gRHVubjoKCiAgICAgICAgICAgIFRoaXMgcGF0Y2ggY29ycmVjdHMgdHdvIHByb2JsZW1zIGluIHRoZSBYTUwgb3V0cHV0IG9mIFNXSUc6CiAgICAgICAgICAgICAKICAgICAgICAgICAgICAxLiBUaGVyZSB3ZXJlIG9mdGVuIGV4dHJhICcvPlxuJyBpbiB0aGUgb3V0cHV0LgogICAgICAgICAgICAgIAogICAgICAgICAgICAgIDIuIHZhbHVlIGF0dHJpYnV0ZXMgd2VyZSBvdXRwdXQgd2l0aCAnXG4nIGluIHRoZW0gYnV0CiAgICAgICAgICAgICAgc2luY2UgdGhhdCBpcyBub3QgdGVjaG5pY2FsbHkgbGVnYWwgbW9zdCAoYWxsPykgWE1MCiAgICAgICAgICAgICAgcGFyc2VycyB3aWxsIHN0cmlwIHRoZW0gb3V0LiBSZXBsYWNpbmcgdGhlICdcbicgd2l0aAogICAgICAgICAgICAgIHRoZSAnJiMxMDsnIGVudGl0eSByZWZlcmVuY2Ugc29sdmVzIHRoaXMgYXMgdGhhdCBpcwogICAgICAgICAgICAgIGxlZ2FsIGFuZCBYTUwgcGFyc2VycyB3aWxsIGNvbnZlcnQgaXQgdG8gYSAnXG4nIHdoZW4KICAgICAgICAgICAgICByZWFkaW5nIHRoZSB2YWx1ZXMgYmFjayBpbi4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBUaGlzIHBhdGNoIGFsc28gYWRkcyBhIG5ldyBnbG9iYWwgY29tbWFuZCBsaW5lIG9wdGlvbgogICAgICAgICAgICAgIHRoYXQgd2lsbCBhbGxvdyB0aGUgcGFyc2UgdHJlZSB0byBiZSB3cml0dGVuIG91dCBpbiBYTUwKICAgICAgICAgICAgICAqYWZ0ZXIqIHNvbWUgb3RoZXIgbGFuZ3VhZ2UgbW9kdWxlIGhhcyBiZWVuIHJ1biwgaW4KICAgICAgICAgICAgICBvcmRlciB0byBiZSBhYmxlIHRvIGdldCBleHRyYSBpbmZvIHRoYXQgdGhlIGxhbmd1YWdlCiAgICAgICAgICAgICAgbW9kdWxlIHB1dHMgaW4gdGhlIHRyZWUuIEluIHRoaXMgd2F5IHRoZSBYTUwgaXMgYQogICAgICAgICAgICAgIHBvc3QtcHJvY2Vzc2VkIHZlcnNpb24gb2YgdGhlIHRyZWUgcmF0aGVyIHRoYW4gYQogICAgICAgICAgICAgIHByZS1wcm9jZXNzZWQgdmVyc2lvbi4gCiAKICAgICAgICAgICAgICBDb21tYW5kIGxpbmUgb3B0aW9uIGlzIC1kdW1wX3htbCBvciAteG1sb3V0IDxmaWxlPgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmFdIFBhdGNoIGZyb20gU2NvdHQgTWljaGVsIHRvIGZpeCB0eXBlc2FmZSBlbnVtcyBhbmQgcHJvcGVyIGVudW1zCiAgICAgICAgICAgIHdpdGggZGlyZWN0b3JzLgoKMDcvMTIvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgSFRNTCBkb2N1bWVudGF0aW9uIChtYWtlY2hhcC5weSkgZmlsZSBnZW5lcmF0b3IgbWlzc2luZyBlbmQgb2YgbGluZQogICAgICAgICAgICBwYXRjaCAjOTA4OTUxIGZyb20gUm9iZXJ0IGRlIFZyaWVzLgoKMDcvMDgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgVGhlIGRlcHJlY2F0ZWQgcnVudGltZSBsaWJyYXJ5IGJ1aWxkIGhhcyBiZWVuIHJlbW92ZWQuIFRoaXMgYWxzbyByZW1vdmVzCiAgICAgICAgICAgIHRoZSBkZXBlbmRlbmN5IG9uIExpYnRvb2wuIExpYnRvb2wgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIHRvIGJ1aWxkIFNXSUcuCiAgICAgICAgICAgIFRoZSBhc3NvY2lhdGVkIC1sZGZsYWdzIFNXSUcgY29tbWFuZGxpbmUgb3B0aW9uIGhhcyBhbHNvIGJlZW4gcmVtb3ZlZC4KCiAgICAgICAgICAgIFRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSB0ZXN0Y2FzZXMgdGhhdCB1c2VkIHRoZSBydW50aW1lIGxpYnJhcnkgaGF2ZQogICAgICAgICAgICBiZWVuIHVwZGF0ZWQgdG8gdXNlIHRoZSByZXBsYWNlbWVudCBhcHByb2FjaCB0byB1c2luZyBTV0lHIGFjcm9zcyAKICAgICAgICAgICAgbXVsdGlwbGUgbW9kdWxlcywgdGhhdCBpcyB0aGV5IHVzZSB0aGUgLW5vcnVudGltZSBhbmQgLXJ1bnRpbWUgY29tbWFuZGxpbmUKICAgICAgICAgICAgb3B0aW9ucywgc2VlIE1vZHVsZXMuaHRtbC4gRWZmZWN0aXZlbHkgdGhleSBidWlsZCB0aGVpciBvd24gcnVudGltZQogICAgICAgICAgICBsaWJyYXJpZXMgdXNpbmcgLXJ1bnRpbWUuIFRoZSBleGFtcGxlcyBhcmUgaW1wb3J0IGFuZCBpbXBvcnRfdGVtcGxhdGUuCiAgICAgICAgICAgIFRoZSB0ZXN0IGNhc2VzIGFyZSBpbiB0aGUgaW1wb3J0cyBhbmQgdGVtcGxhdGVfdHlwZWRlZl9pbXBvcnQgZGlyZWN0b3JpZXMuCgogICAgICAgICAgICBBbnlvbmUgd2hvIHdhbnRzIHRoZSBvcmlnaW5hbCBydW50aW1lIGxpYnJhcmllcyBjYW4gZWl0aGVyIHJ1biB0aGUgdGVzdC1zdWl0ZQogICAgICAgICAgICBvciBidWlsZCB0aGUgZXhhbXBsZXMgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUgc2hhcmVkIG9iamVjdC9ETEwgdGhhdCBpcwogICAgICAgICAgICBnZW5lcmF0ZWQgd2l0aCB0aGUgLXJ1bnRpbWUgY29tbWFuZGxpbmUgb3B0aW9uLiBGb3IgZXhhbXBsZSBsaWJpbXBvcnRzX3J1bnRpbWUuc28KICAgICAgICAgICAgKFB5dGhvbiBjYWxscyBpdCBsaWJfaW1wb3J0c19ydW50aW1lLnNvKSBpcyBnZW5lcmF0ZWQgYWZ0ZXIgcnVubmluZyB0aGUgCiAgICAgICAgICAgICdtYWtlIGltcG9ydHMubXVsdGljcHB0ZXN0JyB0ZXN0Y2FzZSBpbiB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS88bGFuZz4KICAgICAgICAgICAgZGlyZWN0b3J5LiBPciB1c2UgbGlicnVudGltZS5zbyAvIHJ1bnRpbWUuZGxsIGFmdGVyIGJ1aWxkaW5nIHRoZSBpbXBvcnQKICAgICAgICAgICAgZXhhbXBsZXMgaW4gRXhhbXBsZXMvPGxhbmc+L2ltcG9ydC4KCjA3LzA3LzIwMDQ6IG1rb2VwcGUKCSAgICBbQWxsZWdybyBDTF0gQ29udmVydCBjaGFyYWN0ZXIgYW5kIHN0cmluZyBsaXRlcmFscyBpbiBjb25zdGFudHMgdG8gCgkgICAgQ0wgc3ludGF4LiAgRml4IEZGOkRFRi1GT1JFSUdOLUNBTEwgZm9yIG1peGVkLWNhc2UgQyBmdW5jdGlvbnMuCgowNi8yNy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gTmV3IGZlYXR1cmUgZm9yIEphdmEgZXhjZXB0aW9ucyB3aXRoIGZvcm1hdCAlamF2YWV4Y2VwdGlvbihleGNlcHRpb25jbGFzc2VzKS4KICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGEgc2xpZ2h0IGVuaGFuY2VtZW50IHRvICVleGNlcHRpb24gYW5kIHRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhlIAogICAgICAgICAgICBhZGRpdGlvbiBvZiB0aGUgZXhjZXB0aW9uIGNsYXNzZXMgd2hpY2ggYXJlIGdlbmVyYXRlZCBpbnRvIGEgdGhyb3dzIGNsYXVzZS4KICAgICAgICAgICAgVGhlICdleGNlcHRpb25jbGFzc2VzJyBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGNsYXNzZXMgd2hpY2ggd2lsbCBiZQogICAgICAgICAgICBhZGRlZCB0byB0aGUgYXNzb2NpYXRlZCBwcm94eSBtZXRob2QncyB0aHJvd3MgY2xhdXNlLiBUaGUgJ2V4Y2VwdGlvbmNsYXNzZXMnCiAgICAgICAgICAgIGFyZSBzcGVjaWZpZWQgbGlrZSB0aGUgZXhjZXB0aW9uIGNsYXNzZXMgaW4gdGhlICd0aHJvd3MnIGF0dHJpYnV0ZSBpbiB0aGUKICAgICAgICAgICAgdHlwZW1hcHMuIFRoaXMgZmVhdHVyZSBzaG91bGQgYmUgdXNlZCBmb3IgY29ycmVjdGx5IGhhbmRsaW5nIGNoZWNrZWQgZXhjZXB0aW9ucwogICAgICAgICAgICB0aHJvd24gZnJvbSBKTkkgY29kZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVqYXZhZXhjZXB0aW9uKCJqYXZhLmxhbmcuRXhjZXB0aW9uIikgdGhyb3dFeGNlcHRpb24gJXsKICAgICAgICAgICAgICAgIC4uLiBjb252ZXJ0IGEgc3RkOjpsb2dpY19lcnJvciBpbnRvIGEgamF2YS5sYW5nLkV4Y2VwdGlvbiB1c2luZyBKTkkgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAjaW5jbHVkZSA8c3RkZXhjZXB0PgogICAgICAgICAgICAgIHZvaWQgdGhyb3dFeGNlcHRpb24oKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBzdGQ6OmxvZ2ljX2Vycm9yKCJMb2dpYyBlcnJvciEiKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICB3aWxsIGdlbmVyYXRlIGEgbWV0aG9kIHdpdGggYSB0aHJvd3MgY2xhdXNlIGluIHRoZSBtb2R1bGUgY2xhc3M6CgogICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0aHJvd0V4Y2VwdGlvbigpIHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uIHsgLi4uIH0KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtDI10gTmV3ICVjc2NvbnN0dmFsdWUodmFsdWUpIGZlYXR1cmUgZGlyZWN0aXZlIGZvciB1c2Ugd2l0aCBjb25zdGFudHMgYW5kCiAgICAgICAgICAgIGVudW1zLiBUaGlzIHdvcmtzIHRoZSBzYW1lIHdheSBhcyAlamF2YWNvbnN0dmFsdWUuIEZvciBDIywgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICAgaXMgdGhlIG9ubHkgd2F5IHRoYXQgb25lIGNhbiBmaXggd3JhcHBpbmcgb2YgQy9DKysgZW51bXMgd2l0aCBwcm9wZXIgQyMKICAgICAgICAgICAgZW51bXMgaWYgdGhlIGVudW0gaXRlbSdzIGluaXRpYWxpc2VyIGNhbm5vdCBjb21waWxlIGFzIEMjIGNvZGUuIFRoaXMgaXMKICAgICAgICAgICAgYmVjYXVzZSBKYXZhIGVudW1zIGNhbiB1c2UgYSBjYWxsIGludG8gQyBjb2RlIHRvIGluaXRpYWxpc2UgdGhlIGVudW0gaXRlbSwKICAgICAgICAgICAgd2hlcmVhcyBpbiBDIywgdGhlIGVudW0gdmFsdWUgbXVzdCBiZSBhIGNvbXBpbGUgdGltZSBjb25zdGFudC4gVGhhdCBpcywKICAgICAgICAgICAgdXNpbmcgJWNzY29uc3QoMCkgY2Fubm90IGJlIHVzZWQgaW4gQyMgdG8gaW5pdGlhbGlzZSB0aGUgQyMgZW51bSBpdGVtIHZpYQogICAgICAgICAgICBhIFBJTlZPS0UgY2FsbC4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBOZXcgJWphdmFjb25zdHZhbHVlKHZhbHVlKSBmZWF0dXJlIGRpcmVjdGl2ZSBmb3IgdXNlIHdpdGggY29uc3RhbnRzIGFuZAogICAgICAgICAgICBlbnVtcy4gU29tZXRpbWVzIHRoZSB1c2Ugb2YgJWphdmFjb25zdCgxKSB3aWxsIHByb2R1Y2UgY29kZSB0aGF0IHdvbid0IGNvbXBpbGUKICAgICAgICAgICAgdW5kZXIgSmF2YS4gSWYgYSBjb21waWxlIHRpbWUgY29uc3RhbnQgaXMgcmVxdWlyZWQsICVqYXZhY29uc3QoMCkgaXMgbm90IGFuCiAgICAgICAgICAgIG9wdGlvbi4gVGhlICVqYXZhY29uc3R2YWx1ZSBkaXJlY3RpdmUgYWNoaWV2ZXMgdGhpcyBnb2FsIGFuZCB0aGUgdmFsdWUgc3BlY2lmaWVkCiAgICAgICAgICAgIGlzIGdlbmVyYXRlZCBhcyBKYXZhIGNvZGUgdG8gaW5pdGlhbGlzZSB0aGUgY29uc3RhbnQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWphdmFjb25zdCgxKTsKICAgICAgICAgICAgICAlamF2YWNvbnN0dmFsdWUoMTAwMCkgQklHOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgibmV3IGphdmEubWF0aC5CaWdJbnRlZ2VyKFwiMjAwMFwiKSIpIExBUkdFOwogICAgICAgICAgICAgICVqYXZhY29uc3R2YWx1ZSgxMCkgYmFyOwogICAgICAgICAgICAgICV7CiAgICAgICAgICAgICAgICBjb25zdCBpbnQgYmFyID0gMTA7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgICAjZGVmaW5lIEJJRyAxMDAwTEwKICAgICAgICAgICAgICAgICNkZWZpbmUgTEFSR0UgMjAwMFVMTAogICAgICAgICAgICAgICAgZW51bSBGb28geyBCQVIgPSA6OmJhciB9OwogICAgICAgICAgICAgICV9CgogICAgICAgICAgICBHZW5lcmF0ZXM6CgogICAgICAgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgZXhhbXBsZUNvbnN0YW50cyB7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gMTAwMDsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5tYXRoLkJpZ0ludGVnZXIgTEFSR0UgPSBuZXcgamF2YS5tYXRoLkJpZ0ludGVnZXIoIjIwMDAiKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIEZvbyBCQVIgPSBuZXcgRm9vKCJCQVIiLCAxMCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICBQcmV2aW91c2x5LCBub25lIG9mIEJJRywgTEFSR0Ugb3IgQkFSIHdvdWxkIGhhdmUgcHJvZHVjZWQgY29tcGlsYWJsZSBjb2RlCiAgICAgICAgICAgIHdoZW4gdXNpbmcgJWphdmFjb25zdCgxKS4KCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGVuaGFuY2VtZW50cy4gRmVhdHVyZXMgY2FuIG5vdyB0YWtlIGFuIHVubGltaXRlZCBudW1iZXIgb2YgYXR0cmlidXRlcwogICAgICAgICAgICBpbiBhZGRpdGlvbiB0byB0aGUgZmVhdHVyZSBuYW1lIGFuZCBmZWF0dXJlIHZhbHVlLiBUaGUgYXR0cmlidXRlcyBhcmUgb3B0aW9uYWwgCiAgICAgICAgICAgIGFuZCBhcmUgbXVjaCB0aGUgc2FtZSBhcyB0aGUgdHlwZW1hcCBhdHRyaWJ1dGVzLiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZwogICAgICAgICAgICBzcGVjaWZpZXMgdHdvIG9wdGlvbmFsIGF0dHJpYnV0ZXMsIGF0dHJpYjEgYW5kIGF0dHJpYjI6CgogICAgICAgICAgICAgJWZlYXR1cmUoZmVhdHVyZW5hbWUsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZSAidmFsIjsKICAgICAgICAgICAgICVmZWF0dXJlKGZlYXR1cmVuYW1lLCB2YWwsIGF0dHJpYjE9ImF0dHJpYnZhbDEiLCBhdHRyaWIyPSJhdHRyaWJ2YWwyIikgbmFtZTsKCjA2LzI3LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgICVmZWF0dXJlIGltcHJvdmVtZW50cyBmb3IgdGhlIHN5bnRheCB0aGF0IHRha2VzIHRoZSBmZWF0dXJlIHZhbHVlIHdpdGhpbiB0aGUKICAgICAgICAgICAgJWZlYXR1cmUoKSBicmFja2V0cy4gVGhlIHZhbHVlIHNwZWNpZmllZCBpcyBubyBsb25nZXIgcmVzdHJpY3RlZCB0byBiZWluZyBqdXN0CiAgICAgICAgICAgIGEgc3RyaW5nLiBJdCBjYW4gYmUgYSBzdHJpbmcgb3IgYSBudW1iZXIuIEZvciBleGFtcGxlLCB0aGlzIGlzIG5vdyBhY2NlcHRhYmxlCiAgICAgICAgICAgIHN5bnRheDoKICAgICAgICAgICAgICAlZmVhdHVyZSgiZmVhdHVyZW5hbWUiLDIwLjApOwogICAgICAgICAgICB3aGVyZWFzIHByZXZpb3VzbHkgaXQgd291bGQgaGF2ZSB0byBoYXZlIGJlZW46CiAgICAgICAgICAgICAgJWZlYXR1cmUoImZlYXR1cmVuYW1lIiwiMjAuMCIpOwogICAgICAgICAgICBVc2VmdWwgZm9yIGZlYXR1cmVzIHRoYXQgYXJlIGltcGxlbWVudGVkIGFzIGEgbWFjcm8sIGZvciBleGFtcGxlOgogICAgICAgICAgICAgICNkZWZpbmUgJXNvbWVmZWF0dXJlKHZhbHVlKSAgICAgICVmZWF0dXJlKCJzb21lZmVhdHVyZSIsdmFsdWUpCiAgICAgICAgICAgIFRoZXNlIHdpbGwgbm93IHdvcmsgYWNjZXB0aW5nIGVpdGhlciBhIHN0cmluZyBvciBhIG51bWJlcjoKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoIkZyZWQiKTsKICAgICAgICAgICAgICAlc29tZWZlYXR1cmUoNCk7CgowNi8wNi8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW4sIEd1aWxlXQogICAgICAgICAgICAgLSBDcmVhdGVkIHRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL3NjaGVtZXJ1bm1lIGRpcmVjdG9yeSwgd2hpY2ggaG9sZHMgYWxsIHRoZQoJICAgICAgIHJ1bm1lIHNjcmlwdHMgZm9yIGd1aWxlIGFuZCBjaGlja2VuIChhbmQgcG9zc2libHkgbXpzY2hlbWUuLi4pLiAgVGhlIGd1aWxlCgkgICAgICAgYW5kIGNoaWNrZW4gX3J1bm1lIGZpbGVzIHRoZW4gKGxvYWQgIi4uL3NjaGVtZXJ1bm1lL2Zvby5zY20iKS4KICAgICAgICAgICAgIC0gSW4gY2hpY2tlbiBtb2R1bGUsIGZpeCBhIGZldyBidWdzIGludmxvbHZpbmcgZHluYW1pYyBjYXN0cy4KCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIHRvIGZpeCB3cmFwcGluZyBvZiB0ZW1wbGF0ZWQgbWV0aG9kcy4gSVNPIGNvbXBsaWFudCBjb21waWxlcnMsIGxpa2UKICAgICAgICAgICAgQ29tZWF1IGFuZCBHQ0MtMy40LjAsIGRvbid0IGxpa2UgdGhlIHRlbXBsYXRlIHNwZWNpZmllciB0aGF0IFNXSUcgd2FzIGdlbmVyYXRpbmcKICAgICAgICAgICAgd2hlbiBjYWxsaW5nIHRoZSBtZXRob2QuIFRoaXMgZml4IG1heSBicmVhayBzb21lIG5vbiBzdGFuZGFyZCBjb21wbGlhbnQgY29tcGlsZXJzLAogICAgICAgICAgICBmb3IgZXhhbXBsZSwgU3VuIHdvcmtzaG9wIGNvbXBpbGVycyBwcmlvciB0byB2ZXJzaW9uIDYuMi5wMi4gUGF0Y2ggc3VibWl0dGVkCiAgICAgICAgICAgIGJ5IEJpbGwgQ2xhcmtlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBVbmRvY3VtZW50ZWQgc3BlY2lhbCB2YXJpYWJsZSAkaW1jbGFzc25hbWUgcmVtb3ZlZC4KICAgICAgICAgICAgTmV3IHNwZWNpYWwgdmFyaWFibGUgJG1vZHVsZSBpcyByZXBsYWNlZCBieSB0aGUgbW9kdWxlIG5hbWUsIGFzIHNwZWNpZmllZAogICAgICAgICAgICBieSAlbW9kdWxlIG9yIC1tb2R1bGUgY29tbWFuZGxpbmUgb3B0aW9uLiAkaW1jbGFzc25hbWUgY2FuIGJlIGNyZWF0ZWQgZnJvbSAkbW9kdWxlLgoKMDYvMDMvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBTYW1lIGFzIGZvciBKYXZhIGJlbG93LiBUaGUgbmV3IHR5cGVtYXBzIGFyZSBuYW1lZCBkaWZmZXJlbnRseSwgbmFtZWx5LAogICAgICAgICAgICBjc2JvZHkgYW5kIGNzYm9keV9kZXJpdmVkLiBUaGUgZGVwcmVjYXRlZCB0eXBlbWFwcyBhcmUgY3NnZXRjcHRyIGFuZAogICAgICAgICAgICBjc3B0cmNvbnN0cnVjdG9ybW9kaWZpZXJzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA2LzAzLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBUeXBlbWFwIGNoYW5nZXMgZm9yIHRoZSBKYXZhIHByb3h5IC8gdHlwZXdyYXBwZXIgYW5kIGVudW0gY2xhc3Nlcy4gQSBuZXcKICAgICAgICAgICAgdHlwZW1hcCBjYWxsZWQgamF2YWJvZHkgY29udGFpbnMgdGhlIGVzc2VudGlhbCBzdXBwb3J0IGNvZGUgZm9yIGdlbmVyYXRpb24gaW50byB0aGUgYm9keQogICAgICAgICAgICBvZiB0aGVzZSBjbGFzc2VzLiBUaGVyZSBpcyBhbHNvIGEgbmV3IGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcCB3aGljaCBpcyB1c2VkIGluc3RlYWQgZm9yCiAgICAgICAgICAgIHdyYXBwZWQgY2xhc3NlcyB0aGF0IGhhdmUgYSB3cmFwcGVkIGJhc2UgY2xhc3MuIFRoZSBjb2RlIGlzIGJhc2ljYWxseSwgdGhlIGdldENQdHIoKQogICAgICAgICAgICBtZXRob2QgYW5kIHN3aWdDUHRyIGFuZCBzd2lnQ01lbU93biBtZW1iZXIgdmFyaWFibGVzLiBUaGVzZSB1c2VkIHRvIGJlIGhhcmQgY29kZWQKICAgICAgICAgICAgd2l0aCBubyB3YXkgdG8gbW9kaWZ5IHRoZSBjb2RlLiBUaGUgaW50cm9kdWN0aW9uIG9mIHRoaXMgdHlwZW1hcCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IKICAgICAgICAgICAgdGhlIHVzZXIgdG8gdGFpbG9yIG5lYXJseSBldmVyeSBhc3BlY3Qgb2YgdGhlIGNvZGUgZ2VuZXJhdGlvbi4KICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBub3cgaXMgdGhlIGNvZGUgZm9yIGRpcmVjdG9yIGNsYXNzZXMuCgogICAgICAgICAgICBUaGUgamF2YWdldGNwdHIgYW5kIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycyB0eXBlbWFwcyBhcmUgZGVwcmVjYXRlZCBhbmQgYXJlCiAgICAgICAgICAgIG5vIGxvbmdlciB1c2VkIGFzIHRoZSBjb2RlIHRoYXQgdGhlc2UgZ2VuZXJhdGVkIGNhbiBiZSBwdXQgaW4gdGhlIG1vcmUgZmxleGlibGUKICAgICAgICAgICAgamF2YWJvZHkgYW5kIGphdmFib2R5X2Rlcml2ZWQgdHlwZW1hcHMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIG1hY3JvcyBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwgbWF5IGhlbHAgeW91IHVwZ3JhZGUgaWYgeW91IGhhdmUgdXNlZAogICAgICAgICAgICB0aGUgamF2YWdldGNwdHIgdHlwZW1hcDoKCiAgICAgICAgICAgICAgICAvKiBVdGlsaXR5IG1hY3JvIGZvciBtYW5pcHVsYXRpbmcgdGhlIEphdmEgYm9keSBjb2RlIG1ldGhvZCBhdHRyaWJ1dGVzICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFNXSUdKQVZBX0FUVFJJQlMoVFlQRU5BTUUsIENUT1JfQVRUUklCLCBHRVRDUFRSX0FUVFJJQikKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFib2R5KSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHN3aWdDTWVtT3duOwoKICAgICAgICAgICAgICAgICAgQ1RPUl9BVFRSSUIgJGphdmFjbGFzc25hbWUobG9uZyBjUHRyLCBib29sZWFuIGNNZW1vcnlPd24pIHsKICAgICAgICAgICAgICAgICAgICBzd2lnQ01lbU93biA9IGNNZW1vcnlPd247CiAgICAgICAgICAgICAgICAgICAgc3dpZ0NQdHIgPSBjUHRyOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICBHRVRDUFRSX0FUVFJJQiBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqID09IG51bGwpID8gMCA6IG9iai5zd2lnQ1B0cjsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhYm9keV9kZXJpdmVkKSBUWVBFTkFNRSAlewogICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgc3dpZ0NQdHI7CgogICAgICAgICAgICAgICAgICBDVE9SX0FUVFJJQiAkamF2YWNsYXNzbmFtZShsb25nIGNQdHIsIGJvb2xlYW4gY01lbW9yeU93bikgewogICAgICAgICAgICAgICAgICAgIHN1cGVyKCRtb2R1bGVKTkkuU1dJRyRqYXZhY2xhc3NuYW1lVXBjYXN0KGNQdHIpLCBjTWVtb3J5T3duKTsKICAgICAgICAgICAgICAgICAgICBzd2lnQ1B0ciA9IGNQdHI7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIEdFVENQVFJfQVRUUklCIHN0YXRpYyBsb25nIGdldENQdHIoJGphdmFjbGFzc25hbWUgb2JqKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChvYmogPT0gbnVsbCkgPyAwIDogb2JqLnN3aWdDUHRyOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgICAgJWVuZGRlZgoKICAgICAgICAgICAgICAgIC8qIFRoZSBkZWZhdWx0IGlzIHByb3RlY3RlZCBnZXRDUHRyLCBwcm90ZWN0ZWQgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIFNXSUdKQVZBX0FUVFJJQlMoU1dJR1RZUEUsIHByb3RlY3RlZCwgcHJvdGVjdGVkKQoKICAgICAgICAgICAgICAgIC8qIFB1YmxpYyBnZXRDUHRyIG1ldGhvZCwgcHJvdGVjdGVkIGNvbnN0cnVjdG9yICovCiAgICAgICAgICAgICAgICAlZGVmaW5lIFBVQkxJQ19HRVRDUFRSKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHJvdGVjdGVkLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICAgICAgLyogUHVibGljIGdldENQdHIgbWV0aG9kLCBwdWJsaWMgY29uc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgICVkZWZpbmUgUFVCTElDX0JPRFlNRVRIT0RTKFRZUEVOQU1FKQogICAgICAgICAgICAgICAgU1dJR0pBVkFfQVRUUklCUyhUWVBFTkFNRSwgcHVibGljLCBwdWJsaWMpCiAgICAgICAgICAgICAgICAlZW5kZGVmCgowNi8wMy8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSBjb250ZW50cyBvZiB0aGUgY2xhc3MgbW9kaWZpZXIgdHlwZW1hcHMgYW5kIHByYWdtYXMgaGF2ZSBjaGFuZ2VkLgogICAgICAgICAgICBUaGV5IG11c3Qgbm93IGluY2x1ZGUgdGhlIGNsYXNzIHR5cGUuIFByZXZpb3VzbHkgJ2NsYXNzJyB3YXMgaGFyZCBjb2RlZC4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZW5hYmxlcyBmbGV4aWJpbGl0eSBpbnRvIHdoYXQgdHlwZSBvZiBjbGFzcyBpcyBnZW5lcmF0ZWQsCiAgICAgICAgICAgIGZvciBleGFtcGxlIHRoZSBwcm94eSBjbGFzcyBjb3VsZCBiZSBhbiBpbnRlcmZhY2UgaW5zdGVhZCBvZiBhIGNsYXNzLgoKICAgICAgICAgICAgRm9yIEphdmEgdGhpcyBhZmZlY3RzIHRoZSBqYXZhY2xhc3Ntb2RpZmllcnMgdHlwZW1hcCBhbmQgdGhlIGpuaWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBGb3IgQyMgdGhpcyBhZmZlY3RzIHRoZSBjc2NsYXNzbW9kaWZpZXJzIHR5cGVtYXAgYW5kIHRoZSBpbWNsYXNzY2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYW5kIG1vZHVsZWNsYXNzbW9kaWZpZXJzIHByYWdtYXMuCgogICAgICAgICAgICBVbmxlc3MgeW91IGhhdmUgb3ZlcnJpZGRlbiB0aGUgZGVmYXVsdCB2ZXJzaW9ucyBvZiB0aGVzZSB0eXBlbWFwcyBvciBwcmFnbWFzLCB5b3UKICAgICAgICAgICAgc2hvdWxkbid0IGJlIGFmZmVjdGVkLiBIb3dldmVyLCBpZiB5b3UgaGF2ZSwgdXBncmFkaW5nIGlzIGVhc3ksIGZvciBleGFtcGxlCgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHt9OwogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSBGb28gInB1YmxpYyBmaW5hbCIKCiAgICAgICAgICAgIG11c3Qgbm93IGJlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7fTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjbGFzc21vZGlmaWVycykgRm9vICJwdWJsaWMgZmluYWwgY2xhc3MiCgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgRml4IGZvciBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHRoYXQgYXJlIHJlZmVyZW5jZXMuIFByb2JsZW0gcmVwb3J0ZWQgYnkKICAgICAgICAgICAgT3JlbiBNaWxsZXIuIEFsc28gaW1wcm92ZXMgdGhlIGdlbmVyYXRlZCBleGNlcHRpb24gZGVjbGFyYXRpb25zIGluIHRoZQogICAgICAgICAgICBjYXRjaCBoYW5kbGVyIGZvciBwb2ludGVycyAtIGEgcG9pbnRlciBpcyB1c2VkIGluc3RlYWQgb2YgYSByZWZlcmVuY2UgdG8KICAgICAgICAgICAgYSBwb2ludGVyLiBBZGRlZCBkZWZhdWx0IHRocm93cyB0eXBlbWFwcyBmb3IgU1dJR1RZUEUgJiwgU1dJR1RZUEUgKiBhbmQKICAgICAgICAgICAgU1dJR1RZUEVbQU5ZXSAoSmF2YSBhbmQgQyMpLgoKMDUvMzEvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBTb21lIG1pbm9yIHR5cGVzYWZlIGVudW0gaW1wcm92ZW1lbnRzLCBpbmNsdWRpbmcgc3RvcmluZyB0aGUgbmFtZSBvZgogICAgICAgICAgICB0aGUgZW51bSBpdGVtLiBUaGUgdG9TcmluZygpIC8gVG9TdHJpbmcoKSBtZXRob2RzIGFyZSBvdmVycmlkZGVuIHRvIHJldHVybiB0aGlzIG5hbWUuCgowNS8zMC8yMDA0OiB3dXp6ZWIgKEpvaG4gTGVueikKICAgICAgICAgICAgW0NoaWNrZW5dIAoJICAgICAtIFVwZGF0ZSBob3cgZXhhbXBsZXMgYW5kIHRoZSB0ZXN0IHN1aXRlIGFyZSBidWlsdC4KCSAgICAgLSBTeW1ib2wgbmFtZXMgYXJlIG5vIGxvbmdlciBjb252ZXJ0ZWQgdG8gbG93ZXIgY2FzZQoJICAgICAtIEFkZGVkIHVuaW9uX3J1bm1lLnNzLCB3aGljaCB3YXMgY29waWVkIGFuZCBtb2RpZmllZCBmcm9tIHRoZSBndWlsZSBtb2R1bGUKCjA1LzI2LzIwMDQ6IGxiYWxsYWJpbyAoTHVpZ2kgQmFsbGFiaW8pCiAgICAgICAgICAgIENvbW1pdHRlZCBvbiBiZWhhbGYgb2YgTWFyY2VsbyAod2hvIHN0aWxsIGhhcyBwcm9ibGVtcyB3aXRoIAoJICAgIHRoZSBTb3VyY2VGb3JnZSBDVlMuKQoKCSAgICBBZGRlZCBQeXRob24gdHlwZW1hcHMgZm9yIEZJTEUqIHdpdGggKFB5dGhvbi1vbmx5KSB0ZXN0LgoKNS8yNC8yMDA0OiAgZGFuY3kKCgkqIEFsbGVncm8gQ0wgbW9kdWxlOiAgTm93IHVzaW5nIHNvbWUgbWFjcm9zIChkZWZpbmVkIGluCglMaWIvYWxsZWdyb2NsL2FsbGVncm9jbC5zd2cpLCBzd2lnLWRlZmNvbnN0YW50IGFuZCBzd2lnLWRlZnVuLCBmb3IKCWRlZmluaW5nIGNvbnN0YW50cyBhbmQgZm9yZWlnbiBmdW5jdGlvbnMuICBUaGlzIG1ha2VzIHRoZQoJZ2VuZXJhdGVkIGZpbGUgYSBiaXQgbmVhdGVyLiAgICAKCglOb3cgc3RyaXBzIGEgbGF5ZXIgb2YgcGFyZW50aGVzaXMgZnJvbSBjb25zdGFudHMuCgoJVXNlcyAoKiA6dm9pZCkgaW5zdGVhZCBvZiA6Zm9yZWlnbi1hZGRyZXNzIG5vdy4KCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFVubmFtZWQgZW51bSBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3cgc3VwcG9ydGVkIGluIGFkZGl0aW9uCiAgICAgICAgICAgIHRvIHRoZSByZWNlbnRseSBhZGRlZCBzdXBwb3J0IGZvciB1bm5hbWVkIGVudW0gbWVtYmVyIHZhcmlhYmxlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgIGVudW0geyBlbnVtMSwgZW51bTIgfSBNZW1iZXJJbnN0YW5jZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBlbnVtIHsgZW51bTMsIGVudW00IH0gR2xvYmFsSW5zdGFuY2U7CgogICAgICAgICAgICBUaGUgaW50IHR5cGVtYXBzIGFyZSB1c2VkIGZvciB3cmFwcGluZyB0aGUgZ2V0L3NldCBhY2Nlc3NvciBtZXRob2RzLgogICAgICAgICAgICBJZiB0aGUgc2l6ZW9mIGFuIGVudW0gaXMgbm90IHRoZSBzYW1lIHNpemUgYXMgYW4gaW50IHRoZW4gc2V0dGluZyB0aGUKICAgICAgICAgICAgdmFyaWFibGUgd2lsbCBzaWxlbnRseSBkbyBub3RoaW5nIGFzIHRoZSBjYXN0cyBjYW5ub3QgYmUgZWFzaWx5IGFuZCBwb3J0YWJseQogICAgICAgICAgICBnZW5lcmF0ZWQuIElmIHlvdSBuZWVkIHRvIHNvbHZlIHRoaXMgaGlnaGx5IG9ic2N1cmUgc2l0dWF0aW9uLCB3cml0ZQogICAgICAgICAgICB0aGUgYXNzaWdubWVudCB1c2luZyB0aGUgJWV4Y2VwdGlvbiBmZWF0dXJlLgoKMDUvMjAvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0MjXSBDIyBlbnVtIHdyYXBwaW5nIG1vZHMuIFNpbWlsYXIgdG8gdGhlIEphdmEgbW9kdWxlLCBlbnVtcyBjYW4gYmUgd3JhcHBlZCB1c2luZwogICAgICAgICAgICBvbmUgb2YgMyBhcHByb2FjaGVzOgoKICAgICAgICAgICAgMSkgUHJvcGVyIEMjIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtcy5zd2ciCiAgICAgICAgICAgIDIpIFR5cGVzYWZlIGVudW1zIC0gdXNlICVpbmNsdWRlICJlbnVtdHlwZXNhZmUuc3dnIgogICAgICAgICAgICAzKSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWNzZW51bSh3cmFwYXBwcm9hY2gpOwoKICAgICAgICAgICAgd2hlcmUgd3JhcGFwcHJvYWNoIHNob3VsZCBiZSBvbmUgb2Y6ICJwcm9wZXIiLCAidHlwZXNhZmUiLCAidHlwZXVuc2FmZSIgb3IgInNpbXBsZSIuCiAgICAgICAgICAgIFtObyBpbXBsZW1lbnRhdGlvbiBkZWVtZWQgbmVjZXNzYXJ5IGZvciB0eXBlIHVuc2FmZSBlbnVtc10uCgogICAgICAgICAgICBUaGUgZGVmYXVsdCBhcHByb2FjaCBpcyBwcm9wZXIgQyMgZW51bXMuIEFub255bW91cyBlbnVtcyBhcmUgYWx3YXlzIHdyYXBwZWQgYnkKICAgICAgICAgICAgY29uc3RhbnQgaW50ZWdlcnMuIAoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEMjIE1PRFVMRSAqKioKCjA1LzIwLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIGVudW0gc3VwcG9ydCBhZGRlZC4gVGhlcmUgYXJlIG5vdyA0IHdheXMgaW4gd2hpY2ggZW51bXMgY2FuIGJlIHdyYXBwZWQ6CgogICAgICAgICAgICAxKSBQcm9wZXIgSmF2YSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXMuc3dnIgogICAgICAgICAgICAyKSBUeXBlc2FmZSBlbnVtcyAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGVzYWZlLnN3ZyIKICAgICAgICAgICAgMykgVHlwZSB1bnNhZmUgZW51bXMgKGNvbnN0YW50IGludGVnZXJzKSAtIHVzZSAlaW5jbHVkZSAiZW51bXR5cGV1bnNhZmUuc3dnIgogICAgICAgICAgICA0KSBTaW1wbGUgY29uc3RhbnQgaW50ZWdlcnMgKG9yaWdpbmFsIGFwcHJvYWNoKSAtIHVzZSAlaW5jbHVkZSAiZW51bXNpbXBsZS5zd2ciCgogICAgICAgICAgICBTZWUgZWFjaCBvZiB0aGVzZSBmaWxlcyBmb3IgZnVydGhlciBkZXRhaWxzLiBFYWNoIG9mIHRoZXNlIGZpbGVzIHVzZSB0eXBlbWFwcwogICAgICAgICAgICBhbmQgYSBuZXcgZmVhdHVyZSB0byBjb250cm9sIHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhlIGZlYXR1cmUgaXM6CgogICAgICAgICAgICAgICAgJWphdmFlbnVtKHdyYXBhcHByb2FjaCk7CgogICAgICAgICAgICB3aGVyZSB3cmFwYXBwcm9hY2ggc2hvdWxkIGJlIG9uZSBvZjogInByb3BlciIsICJ0eXBlc2FmZSIsICJ0eXBldW5zYWZlIiBvciAic2ltcGxlIi4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcHMgd2lsbCBoYW5kbGUgZW51bXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBoYXZlIHNwZWNpZmllZCBpbml0aWFsCiAgICAgICAgICAgIHZhbHVlcywgZm9yIGV4YW1wbGUgdGVuIGlzIHNwZWNpZmllZDoKCiAgICAgICAgICAgICAgICBlbnVtIE51bWJlcnMgeyB6ZXJvLCB0ZW4oMTApIH07CgogICAgICAgICAgICBIb3dldmVyLCB0aGUgYW1vdW50IG9mIGdlbmVyYXRlZCBKYXZhIGNvZGUgY2FuIGJlIGN1dCBkb3duLCBieSBtb2RpZnlpbmcgdGhlc2UgdHlwZW1hcHMKICAgICAgICAgICAgaWYgbm9uZSBvZiB0aGUgZW51bXMgaGF2ZSBpbml0aWFsIHZhbHVlcyAocHJvcGVyIEphdmEgZW51bXMgYW5kIHR5cGVzYWZlIGVudW1zIGFwcHJvYWNoKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGFwcHJvYWNoIGlzIHR5cGVzYWZlIGVudW1zLiBBbm9ueW1vdXMgZW51bXMgYXJlIGFsd2F5cyB3cmFwcGVkIGJ5CiAgICAgICAgICAgIGNvbnN0YW50IGludGVnZXJzLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA1LzExLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFtKYXZhLCBDI10gRml4IGJ1ZyB1c2luZyAlcmVuYW1lIG9uIGVudW0gaXRlbXMgYW5kIHdoZW4gdXNpbmcKICAgICAgICAgICAgJWphdmFjb25zdCgxKSAvICVjc2NvbnN0KDEpCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSB0aGF0IHdvdWxkbid0IGNvbXBpbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShPYmopIE9iamVjdDsKICAgICAgICAgICAgICAgIGVudW0gR3JhbW1hciB7IFN1YmplY3QsIE9iamVjdCB9OwoKMDQvMjgvMjAwNDogd3NmdWx0b24KICAgICAgICAgICAgW0phdmEsIEMjXSBNaW5vciBmaXhlcyB3aGVuIHVzaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgCiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzLCBqYXZhYmFzZSwgY3NpbnRlcmZhY2VzIGFuZCBjc2Jhc2UgdHlwZW1hcHMuCgowNS8xOC8yMDA0OiB3c2Z1bHRvbgogICAgICAgICAgICBbSmF2YV0gSlZNIGxpbmsgZmFpbHVyZSBvbiBzb21lIHN5c3RlbXMgZml4ZWQgd2hlbiB1c2luZyBzdGRfdmVjdG9yLmkuCiAgICAgICAgICAgIEFsc28gYWRkcyBkZWZhdWx0IHZlY3RvciBjb25zdHJ1Y3RvciBmb3IgdXNlIGZyb20gSmF2YS4KCjA1LzE3LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCgkgICAgW0d1aWxlXSBOZXcgcnVudGltZSBmdW5jdGlvbnMgU1dJR19Qb2ludGVyQWRkcmVzcywKCSAgICBTV0lHX1BvaW50ZXJUeXBlLCBTV0lHX0lzUG9pbnRlck9mVHlwZSwgU1dJR19Jc1BvaW50ZXIuCgoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB3cmFwIHNldmVyYWwgU1dJRyBydW50aW1lIGZ1bmN0aW9ucwoJICAgIGFuZCBleHBvcnQgdGhlbSBpbnRvIHRoZSBtb2R1bGUgKFN3aWcgc3dpZ3J1bikuICBUaGUKCSAgICBydW50aW1lIG1vZHVsZSBpcyBub3cgYnVpbHQgd2l0aCAibW9kdWxlIiBsaW5rYWdlLgoKCSAgICBbR3VpbGVdIEdPT1BTIHByb3h5IG9iamVjdHMgbm93IGFsc28gcHJpbnQgdGhlIHBvaW50ZXIKCSAgICBhZGRyZXNzIG9mIHRoZSBDIG9iamVjdC4KCjA1LzE0LzIwMDQ6IGx5bGUKICAgICAgICAgICAgQWRkZWQgS291J3MgcGF0Y2ggZm9yIHRoZSBSdWJ5ICVpbXBvcnQgZGlyZWN0aXZlIHNvIHRoYXQgbW9kdWxlcwogICAgICAgICAgICB3aXRoICJuZXN0ZWQiIG5hbWVzIGFyZSBoYW5kbGVkIHByb3Blcmx5LiBDb25zaWRlciBhbiBpbnRlcmZhY2UKICAgICAgICAgICAgZmlsZSBmb28uaSB0aGF0IGhhcyB0aGlzICVtb2R1bGUgZGVjbGFyYXRpb24gYXQgaXRzIHRvcDoKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJtaXNjOjp0ZXh0Ojpmb28iCgogICAgICAgICAgICBOb3cgY29uc2lkZXIgYW5vdGhlciBpbnRlcmZhY2UgZmlsZSBzcGFtLmkgdGhhdCBpbXBvcnRzIGZvby5pOgoKICAgICAgICAgICAgICAgICVpbXBvcnQgZm9vLmkKICAgICAgICAgICAgCiAgICAgICAgICAgIEJlZm9yZSB0aGlzIHBhdGNoLCB0aGlzIHdvdWxkIHJlc3VsdCBpbiB0aGUgZm9sbG93aW5nIGNvZGUgYmVpbmcKICAgICAgICAgICAgZ2VuZXJhdGVkIGZvciBzcGFtX3dyYXAuYzoKCiAgICAgICAgICAgICAgICByYl9yZXF1aXJlKCJtaXNjOjp0ZXh0Ojpmb28iKTsKCiAgICAgICAgICAgIFdpdGggdGhpcyBwYXRjaCwgaG93ZXZlciwgeW91J2xsIGdldCB0aGUgY29ycmVjdCBwYXRoIG5hbWUKICAgICAgICAgICAgZm9yIHRoZSBjYWxsIHRvIHJiX3JlcXVpcmUoKSwgZS5nLgoKICAgICAgICAgICAgICAgIHJiX3JlcXVpcmUoIm1pc2MvdGV4dC9mb28iKTsKCiAgICAgICAgICAgIFNlZSBTb3VyY2VGb3JnZSBCdWcgIzkyODI5OS4KCjA1LzEyLzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIFBhdGNoIGZvciBlbWl0dGluZyBkaXJlY3RvcnMgd2hlbiAlZmVhdHVyZSgiZGlyZWN0b3IiKSBzcGVjaWZpZWQKICAgICAgICAgICAgZm9yIGEgY2xhc3Mgd2l0aCBubyB2aXJ0dWFsIG1ldGhvZHMsIGJ1dCBkb2VzIGhhdmUgYSB2aXJ0dWFsIGRlc3RydWN0b3IuCiAgICAgICAgICAgIFN1Ym1pdHRlZCBieSBLZXZpbiBTbWl0aC4KCjA1LzA2LzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBOZXcgU1dJRyBydW50aW1lIGZ1bmN0aW9uIFNXSUdfVHlwZVByZXR0eU5hbWUsIHdoaWNoIAoJICAgIHJldHVybnMgYW4gdW5tYW5nbGVkIHR5cGUgbmFtZSBmb3IgYSBzd2lnX3R5cGVfaW5mbwoJICAgIG9iamVjdC4gCgoJICAgIFtHdWlsZV06IFVzZSBpdCBmb3IgcHJpbnRpbmcgcG9pbnRlciBvYmplY3RzLgoKMDUvMDMvMjAwNDogIGRhbmN5IChBaG1vbiBEYW5jeSkKCgkqIExpYi9hbGxlZ3JvY2wvYWxsZWdyb2NsLnN3ZzogIFVwZGF0ZWQgY29tbWVudHMgYWJvdXQgaWRlbnRpZmVyCgljb252ZXJzaW9uLiAgCgoJKiBTb3VyY2VzL01vZHVsZXMvYWxsZWdyb2NsLmN4eDogIFJlZ2lzdGVyIC9kZXYvbnVsbCBmb3IgImhlYWRlciIKCXRhcmdldC4gICBBbHNvLCBkaXNyZWdhcmQgImNvbnN0IiBxdWFsaWZpZXJzIGR1cmluZyB0eXBlCgljb252ZXJzaW9uLiAgCgoJCjA1LzAyLzIwMDQ6IHd1enplYiAoSm9obiBMZW56KQoJICAgIFtDaGlja2VuXSBGaXggYnVnIDc4MjQ2OC4KCSAgICBUbyBmaXggdGhpcyBidWcsIHRoZSBydW50aW1lIGNvZGUgaGFzIGJlZW4gcmV3cml0dGVuLCBhbmQKCSAgICBwb2ludGVycyBhcmUgbm93IHJlcHJlc2VudGVkIGFzIGEgQ19TV0lHX1BPSU5URVJfVFlQRS4KCgkgICAgQ2hpY2tlbiB2ZXJzaW9uID4gMS40MCBpcyBub3cgcmVxdWlyZWQhCgoJICAgICogVHlwZW1hcCBpbmNvbXBhdGliaWxpdHk6ICB0eXBlbWFwcyBubyBsb25nZXIgdXNlIGNoaWNrZW5fd29yZHMuCgkgICAgICBJZiBhIHR5cGVtYXAgbmVlZHMgc29tZSBzcGFjZSwgaXQgc2hvdWxkIGp1c3QgY2FsbCBDX2FsbG9jCgoJICAgICogYXJnb3V0IHR5cGVtYXBzIG5vIGxvbmdlciB1c2UgdGhlIC8qIGlmIE9ORSAqLyBjb25zdHJ1Y3QgdG8KCSAgICAgIGJ1aWxkIGFuIG91dHB1dCBsaXN0LiAgQSBTV0lHX0FQUEVORF9WQUxVRSBtYWNybywgZXhhY3RseSBsaWtlCgkgICAgICBndWlsZSBhbmQgbXpzY2hlbWUgaXMgbm93IHVzZWQuCgowNC8yNS8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiB0aGUgZ2VuZXJhdGVkIEdPT1BTIGNvZGUsIGRvbid0IGNyZWF0ZSBtZXRob2RzCgkgICAgdGhhdCB3b3VsZCBub3Qgc3BlY2lhbGl6ZSBhbnkgYXJndW1lbnRzOyBzaW1wbHkgcmUtZXhwb3J0CgkgICAgdGhlIHByaW1pdGl2ZSBmdW5jdGlvbnMuICAoVGhpcyBpcyBhIHBlcmZvcm1hbmNlCgkgICAgb3B0aW1pemF0aW9uIHdoaWNoIHJlZHVjZXMgbG9hZCB0aW1lIGFuZCBleGVjdXRpb24gdGltZS4pCgoJICAgIFtHdWlsZV0gSW4gLWdoIG1vZGUsIGZpeCB0aGUgInRvbyBtYW55IGluaXRpYWxpemVycyIgZXJyb3IKCSAgICB3aGljaCB3YXMgY2F1c2VkIGJ5IGFuIGluY29tcGF0aWJsZSBzd2lnX3R5cGVfaW5mbyBsYXlvdXQuCgoJICAgIFtHdWlsZV0gVGhlIHR5cGVtYXAgZm9yIEZJTEUgKiBpbiBwb3J0cy5pIG5vdyBhbHNvIGFjY2VwdHMKCSAgICBhIHJlZ3VsYXIgRklMRSAqIHBvaW50ZXIgb2JqZWN0LiAgQWxzbyBhIGJ1ZyB3aXRoIFNjaGVtZQoJICAgIGZpbGUgcG9ydHMgdGhhdCBhcmUgb3BlbiBmb3IgaW5wdXQgYW5kIG91dHB1dCBoYXMgYmVlbgoJICAgIGZpeGVkLiAKCjA0LzI1LzIwMDQ6IHdzZnVsdG9uCiAgICAgICAgICAgIENoYW5nZSBlbnRyeSAwMy8yMS8yMDA0IHJldm9rZWQuIFRoZSBjaGFuZ2UgaW50cm9kdWNlZCBhbm90aGVyCiAgICAgICAgICAgIGluY29uc2lzdGVuY3kgKHJlZmVyZW5jZSB0eXBlbWFwcyBiZWluZ3MgdXNlZCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXIgdHlwZW1hcHMgZm9yIG1lbWJlciB2YXJpYWJsZXMgYXMgd2VsbCBhcyBzdGF0aWMKICAgICAgICAgICAgbWVtYmVyIHZhcmlhYmxlcyBhbmQgZ2xvYmFsIHZhcmlhYmxlcyBmb3Igc29tZSBsYW5ndWFnZXMsCiAgICAgICAgICAgIGJ1dCBvbmx5IGZvciBDKysgYW5kIG5vdCBDKS4gVGhpcyB3b3VsZCBicmVhayB1c2VyJ3MgY3VycmVudAogICAgICAgICAgICB0eXBlbWFwcyBhbmQgaW50cm9kdWNlIGZ1cnRoZXIgaW5jb25zaXN0ZW5jaWVzLiBBbHRlcm5hdGl2ZQogICAgICAgICAgICBzb2x1dGlvbiByZXF1aXJlZCBhbmQgYmVpbmcgZGlzY3Vzc2VkLgoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBBZGRlZCB0aGUgLWRpcmVjdG9ycyBmbGFnLiBUaGlzIGVuYWJsZXMgdGhlIGRpcmVjdG9yCgkgICAgbW9kZSBmb3IgdGhlIGludGVyZmFjZSBhbmQgYWxsIHRoZSBjbGFzc2VzIHRoYXQKCSAgICBkb24ndCBzZXQgdGhlICJmZWF0dXJlOm5vZGlyZWN0b3IiIGV4cGxpY2l0bHkuCgoJICAgIFlvdSBjYW4gdXNlIHRoaXMgaW4geW91ciBtb2R1bGUgaWYgeW91IHdhbnQgdG8gdXNlIHRoZQoJICAgIGRpcmVjdG9yIGZlYXR1cmUgaW4gYWxsIHlvdXIgY2xhc3NlcywgYnV0IGl0IGlzIG1vc3QKCSAgICBpbnRlbmRlZCBmb3IgdGVzdGluZyBwdXJwb3NlcywgbGlrZToKCgkgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9Ii4uLy4uLy4uL3N3aWcgIC1kaXJlY3RvcnMiCgkgICAgICBtYWtlIGNoZWNrLXJ1YnktdGVzdC1zdWl0ZSBTV0lHPSIuLi8uLi8uLi9zd2lnICAtZGlyZWN0b3JzIgoJICAgICAgbWFrZSBjaGVjay1qYXZhLXRlc3Qtc3VpdGUgU1dJRz0iLi4vLi4vLi4vLi4vc3dpZyAgLWRpcmVjdG9ycyIKCgkgICAgVGhlc2UgY29tbWFuZHMgd2lsbCBydW4gdGhlIGVudGlyZSB0ZXN0LXN1aXRlIHVzaW5nCgkgICAgZGlyZWN0b3JzLCBhbmQgbm90IG9ubHkgdGhlIHNwZWNpZmljICdkaXJlY3RvcnNfKicKCSAgICBjYXNlcy4gVGhpcyBzaG91bGQgYmUgZG9uZSBmcm9tIHRpbWUgdG8gdGltZS4KCjA0LzEwLzIwMDQ6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykgCgkgICAgCgkgICAgW3B5dGhvbl0gQWRkZWQgc3VwcG9ydCBmb3Igc3RkOjp3c3RyaW5nIGFuZCB3Y2hhcl90LAoJICAgIGZvciBjb21waWxlciBhbmQgcHl0aG9uIHZlcnNpb25zIHRoYXQgc3VwcG9ydCB0aGVtLgoJICAgIAoJICAgIFdoZW4gbmVlZGVkLCB1c2UgCgoJICAgICAlaW5sY3VkZSBzdGRfc3RyaW5nLmkgICAgICAvLyAnY2hhcicgc3RyaW5ncwoJICAgICAlaW5sY3VkZSBzdGRfd3N0cmluZy5pICAgICAvLyAnd2NoYXJfdCcgc3RyaW5ncwoJICAgIAoKMDQvMTAvMjAwNDogbW1hdHVzIChNYXJjZWxvIE1hdHVzKSAKCSAgICAKCSAgICBbcHl0aG9uXSBGaXggdGhlIGRlZmF1bHQgYmVoYXZpb3VyIChzZWcuIGZhdWx0KSB3aGVuIGFuCgkgICAgaW5wbGFjZSBvcGVyYXRvciAoKz0sLT0sLi4uKSB3YXMgd3JhcHBlZCwgYXMgcmVwb3J0ZWQgYnkKCSAgICBMdWNyaXogKGx1Y3JpekBzaXRpbGFuZGlhLml0KSwgd2hlbiB0aGUgbW9zdCBjb21tb24KCSAgICBmb3JtIHdhcyB1c2VkOgoKICAgICAgICAgICAgICAgICAgIEEmICBBOjpvcGVyYXRvcis9KGludCBpKSB7IC4uLjsgcmV0dXJuICp0aGlzOyB9CiAgICAgICAgICAgICAgICAgIF5eXl4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl4KCSAgICAKCgkgICAgaWUsIGFuIG9iamVjdCBpcyByZXR1cm5lZCBhbmQgaXRzIGNvbnRhaW5zIHRoZSBzYW1lICd0aGlzJwoJICAgIHZhbHVlIHRoYW4gdGhlIGlucHV0IG9iamVjdCwgd2hpY2ggaXMgZGVsZXRlZCBhZnRlciB0aGUKCSAgICBvcGVyYXRpb24gImEgKz0gYiIsIGxlYXZpbmcgdGhlIHJlc3VsdCB3aXRoIG5vIHJlYWwKCSAgICBvYmplY3QsIGJ1dCBhIHNlZy4gZmF1bHQuCgoJICAgIFRvIGZpeCBpdCwgd2UgbmVlZGVkIHRvIGludHJvZHVjZSBhIG5ldyBmZWF0dXJlIGFuZCB1c2UgYW4KCSAgICBvbGQgb25lOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoInNlbGY6ZGlzb3duIikgQTo6b3BlcmF0b3IrPTsKICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5ldyIpIEE6Om9wZXJhdG9yKz07CgkgICAgCgkgICAgaGVyZSwgInNlbGY6ZGlzb3duIiBkaXNhYmxlIHRoZSBvd25lcnNoaXAgb2YgdGhlICdzZWxmJwoJICAgIG9yIGlucHV0IG9iamVjdCwgYW5kIHRoZSAibmV3IiBmZWF0dXJlIHRyYW5zZmVycyB0aGUKCSAgICBvd25lcnNoaXAgdG8gdGhlIHJlc3VsdCBvYmplY3QuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUvc29sdXRpb24gY291bGQgYWxzbyBiZSB1c2VkIGluIG90aGVyIGxhbmd1YWdlcwoJICAgIHRoYXQgdXNlIGdjIGFuZCBpbXBsZW1lbnQgdGhlIGlucGxhY2Ugb3BlcmF0b3JzLCBvciBvdGhlcgoJICAgIG9wZXJhdG9ycywgaW4gYSBzaW1pbGFyIHdheS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQeXRob24gTU9EVUxFICoqKgoKCSAgICBJZiB5b3UgYWxyZWFkeSBhcmUgdXNpbmcgdGhlIGlucGxhY2Ugb3BlcmF0b3JzIGluIHB5dGhvbiwKCSAgICBhbmQgeW91IGltcGxlbWVudGVkIHNvbWUga2luZCBvZiB3b3JrYXJvdW5kIHRvIHRoZSBwcm9ibGVtCgkgICAgZml4ZWQgaGVyZSwgaXQgaXMgcG9zc2libGUgeW91IGNvdWxkIGVuZCB3aXRoICdmcmVlJwoJICAgIG9iamVjdHMgdGhhdCBuZXZlciBnZXQgZGVsZXRlZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgYW5kCgkgICAgeW91IHdhbnQgdG8gZGlzYWJsZSB0aGUgY3VycmVudCBmaXgsIHVzZToKCiAgICAgICAgICAgICAgICVmZWF0dXJlKCJzZWxmOmRpc293biIsIiIpIEE6Om9wZXJhdG9yKz07CiAgICAgICAgICAgICAgICVmZWF0dXJlKCJuZXciLCIiKSBBOjpvcGVyYXRvcis9OwoKCjA0LzA3LzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEMrKyBlbnVtcyBhcmUgbm8gbG9uZ2VyIHdyYXBwZWQgYnkgaW50ZWdlcnMsIHRoZXkgYXJlIG5vdyB3cmFwcGVkIGJ5IAogICAgICAgICAgICBDIyBlbnVtcy4gRm9yIEV4YW1wbGUsIGdpdmVuIEMrKzoKCiAgICAgICAgICAgICAgICBlbnVtIEFuRW51bSB7IGZvbywgYmFyIH07CiAgICAgICAgICAgICAgICB0eXBlZGVmIEFuRW51bSBBbkVudW1lcmF0aW9uOwogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoQW5FbnVtIGUsIEFuRW51bWVyYXRpb24gZik7CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgZW51bSBBbkVudW0gewogICAgICAgICAgICAgICAgICBmb28sCiAgICAgICAgICAgICAgICAgIGJhcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNvbWV0aGluZyhBbkVudW0gZSwgQW5FbnVtIGYpIHsuLi59CgogICAgICAgICAgICBOb3RlIHRoYXQgYSBnbG9iYWwgZW51bSBsaWtlIEFuRW51bSBhYm92ZSBpcyBnZW5lcmF0ZWQgaW50byBpdHMgb3duCiAgICAgICAgICAgIGZpbGUgY2FsbGVkIEFuRW51bS5jcy4gRW51bXMgZGVmaW5lZCB3aXRoaW4gYSBDKysgY2xhc3MgYXJlIGRlZmluZWQKICAgICAgICAgICAgd2l0aGluIHRoZSBDIyBwcm94eSBjbGFzcy4gU29tZSBvZiB0aGUgdHlwZW1hcHMgZm9yIG1vZGlmeWluZyBDIyBwcm94eQogICAgICAgICAgICBjbGFzc2VzIGFsc28gd29yayBmb3IgZW51bXMuIEZvciBleGFtcGxlIGdsb2JhbCBlbnVtcyBjYW4gdXNlCgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NpbXBvcnRzKSB0byBhZGQgaW4gZXh0cmEgdXNpbmcgc3RhdGVtZW50cy4KCiAgICAgICAgICAgIEdsb2JhbCBlbnVtcyBhbmQgY2xhc3MgZW51bXMgY2FuIHVzZQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIHRvIG1ha2UgdGhlIGVudW0gcHJpdmF0ZSwgcHVibGljIGV0Yy4KICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzYmFzZSkgdG8gY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGVudW0gdHlwZSAoZW51bSBiYXNlKQoKICAgICAgICAgICAgSWYgd2UgYWRkIHRoaXMgZm9yIHRoZSBhYm92ZSBleGFtcGxlOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGNzY2xhc3Ntb2RpZmllcnMpIEFuRW51bSAicHJvdGVjdGVkIgogICAgICAgICAgICAgICAgJXR5cGVtYXAoY3NiYXNlKSBBbkVudW0gImxvbmciCgogICAgICAgICAgICB0aGUgZm9sbG93aW5nIGlzIGdlbmVyYXRlZDoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgZW51bSBBbkVudW0gOiBsb25nIHsKICAgICAgICAgICAgICAgICAgZm9vLAogICAgICAgICAgICAgICAgICBiYXIKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNC8wNy8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU2VnIGZhdWx0IGZpeCBmb3IgZW1wdHkgZW51bXMsIGxpa2UKICAgICAgICAgICAgICAgIGVudW0gRm9vIHt9OwoKMDMvMjEvMjAwNDogbW1hdHVzCiAgICAgICAgICAgIFtOb3RlOiB0aGlzIGNoYW5nZSByZXZva2VkIG9uIDA0LzI1LzIwMDRdCgkgICAgW1B5dGhvbl0gTWFrZXMgdGhlIGZvbGxvd2luZyAndmFyJyBjYXNlcyBtb3JlIHVuaWZvcm06CgogICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2E7CiAKICAgICAgICAgICAgICAgIHN0cnVjdCBBIHsKICAgICAgICAgICAgICAgICAgc3RhdGljIHN0ZDo6c3RyaW5nIHNhOwogICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBtYTsKICAgICAgICAgICAgICAgIH07CgoKICAgICAgICAgICAgbm93IHRoZSB0aHJlZSB2YXJpYWJsZXMgKGdhLCBzYSwgbWEpIGNhbiBiZSBhc3NpZ25lZCBhczoKCgogICAgICAgICAgICAgICAgICBjdmFyLmdhID0gImhlbGxvIjsKICAgICAgICAgICAgICAgICAgQS5zYSA9ICJoZWxsbyI7CiAgICAgICAgICAgICAgICAgIGEubWEgPSAiaGVsbG8iOwoKICAgICAgICAgICAgaWUsIG5vdyAnbWEnIHdpbGwgYWxzbyB1c2UgYSBzdGQ6OnN0cmluZyB0eXBlbWFwICdpbicgaWYKICAgICAgICAgICAgZGVmaW5lZCwgYmVmb3JlIGl0IHdhcyBvbmx5IGFjY2VwdGluZyBhICdwX3N0ZF9zdHJpbmcnCiAgICAgICAgICAgIHBvaW50ZXIuICBOb3RlLCBob3dldmVyLCB0aGF0ICdtYScgd2lsbCBub3QgdXNlIHRoZQogICAgICAgICAgICAndmFyaW4vdmFyb3V0JyB0eXBlbWFwcyAodGhhdCBwcm9iYWJseSBjb3VsZCBiZSBtb3JlCiAgICAgICAgICAgIG5hdHVyYWwpLCBidXQgaXQgd2lsbCBwaWNrIHVwIHRoZSAnaW4nIHR5cGVtYXAgZm9yIGNvbnN0CiAgICAgICAgICAgIHN0ZDo6c3RyaW5nJiAod2hpY2ggaXMgZWFzaWVyKS4KCgkgICAgVGhlIGNoYW5nZXMgaW4gY3dyYXAuYyBhbmQgbGFuZy5jeHggd2lsbCBwcm9iYWJseSBmaXggdGhlCgkgICAgYmVoYXZpb3VyIGluIG90aGVyIGxhbmd1YWdlcyB0aGF0IGRvIG5vdCBvdmVybG9hZCB0aGUKCSAgICBtZW1iZXJ2YXJIYW5kbGVyIG1ldGhvZCAidG9vIG11Y2giLgogCiAgICAgICAgICAgIAowMy8yMS8yMDA0OiBtbWF0dXMKCSAgICBbUHl0aG9uXSBEaXNhYmxpbmcgdGhlIGRlZmF1bHQgaW5zdGFudGlhdGlvbnMgbGlrZToKCgkgICAgICAldGVtcGxhdGUoKSBzdGQ6OnBhaXI8aW50LGludD47CgogICAgICAgICAgICBmb3IgYWxsIHRoZSBwcmltaXRpdmUgdHlwZXMgYW5kIFNUTCBjb250YWluZXJzL2NsYXNzZXMuCgkgICAgVGhleSBhcmUgZXhwZW5zaXZlLCBzcGVjaWFsbHkgZm9yIHBhaXIgYW5kIG1hcCwgYW5kIHRoZQoJICAgIHByZXZpb3VzIGJlaGF2aW91ciBhbHNvIHJlcXVpcmVzIHRoZSB1c2VyIHRvIHBlcmZvcm0KCSAgICBtYW51YWwgaW5zdGFudGlhdGlvbnMuIFN0aWxsLCBpZiB0aGUgc3BlZWQgZGlmZmVyZW5jZSBpcwoJICAgIG5vdCBpbXBvcnRhbnQsIGl0IGNhbiBiZSByZS1lbmFibGVkIGJ5IGRlZmluaW5nIHRoZSBtYWNybwoJICAgIFNXSUdfU1REX0RFRkFVTFRfSU5TVEFOVElBVElPTiAoc2VlIHN0ZF9jb21tb24uaSkuCgoJICAgIEFsc28sIG5vcm1hbGl6aW5nIHRoZSBJTlBVVC9PVVRQVVQvSU5PVVQgdHlwZW1hcHMuIE5vdwoJICAgIHRoZXkgdXNlIHRoZSBzYW1lIGNvbnZlcnNvcnMgdGhhbiB0aGUgcmVzdCBvZiB0aGUKCSAgICB0eXBlbWFwcywgYW5kIHlvdSBjYW4gdXNlIHRoZW0gZm9yIHN0ZDo6cGFpciwgc3RkOjpzdHJpbmcKCSAgICBhbmQgYWxsIHRoZSBvdGhlciBTVEwgdHlwZXMsIGxpa2UgaW46CgoJICAgICAgdm9pZCBwX2lub3V0ZChzdGQ6OnBhaXI8ZG91YmxlLCBkb3VibGU+ICpJTk9VVCk7CgoJICAgIEFkZGVkIHRoZSBhdHRyaWJ1dGUuaSBhbmQgaW1wbGljaXQuaSBmaWxlcyB3aXRoIG1hY3JvcyB0bwoJICAgIHRyYW5zZm9ybSBmdW5jdGlvbnMgcGFpcnMgbGlrZSAnc2V0X3gnLydnZXRfeCcgCgkgICAgKG9yICdUJiB4KCknLydjb25zdCBUJiB4KCkgY29uc3QnKSBpbnRvIGFuIGF0dHJpYnV0ZSwKCSAgICBhbmQgYWxsb3dpbmcgdGhlIHVzZSBvZiBpbXBsaWNpdCBjb25zdHJ1Y3RvcnMgaW4gdHlwZW1hcHMKCSAgICAoc2VlIHRoZSBmaWxlcyBmb3IgbW9yZSBkZXRhaWxzKS4KCjAzLzIxLzIwMDQ6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCB0aGUgZG9jdW1lbnRhdGlvbiBzdHJpbmdzIG9mIGZ1bmN0aW9ucyB3aXRoCgkgICAgYW5vbnltb3VzIGFyZ3VtZW50cy4KCjAzLzE4LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIE1vcmUgZ2VuZXJhbCBzdGRfc3RyaW5nLmkgaW50ZXJmYWNlLgoJICAgIE5vdyB5b3UgY2FuIHdyYXAgaXQgdXNpbmcKCgkgICAgICAldGVtcGxhdGUoc3RyaW5nKSBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPjsKCiAgICAgICAgICAgIGFuZCB1c2UgdGhlIHN0ZDo6c3RyaW5nIGFzIGEgYmFzZSBjbGFzczoKCgkgICAgICBzdHJ1Y3QgQSA6IHN0ZDo6c3RyaW5nIHsKICAgICAgICAgICAgICB9OwoKCSAgICBCdXQgbW9yZSBpbXBvcnRhbnQsIHN3aWcgd2lsbCByZWNvZ25pemUgCgkgICAgYm90aCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyPiBhbmQgc3RkOjpzdHJpbmcgYXMKCSAgICB0aGUgc2FtZSB0eXBlLgoKMDMvMTYvMjAwNDogbW1hdHVzCgkgICAgUHJldmlvdXNseSBhZGRlZCwgYnV0IG5vdCBtZW50aW9uZWQgYmVmb3JlOgoKCSAgICAtIGZyaWVuZCBkZWNsYXJhdGlvbiBzdXBwb3J0LCBzd2lnIG5vdyBlbWl0cyBhIGdsb2JhbAoJICAgICAgZnVuY3Rpb24gaW4gdGhlIHNhbWUgY2xhc3Mgc2NvcGUuCgoJICAgIC0gcmVmL3VucmVmIGZlYXR1cmVzOiB0byBtaXggcmVmIGNvdW50aW5nIEMrKyBjbGFzc2VzCgkgICAgICBhbmQgbmF0aXZlIHNjcmlwdCByZWYgY291bnRpbmcgbWVjaGFuaXNtcyAobGlrZSBpbiBweXRob24pLgoJICAgIAoJICAgICAgVXNlIGl0IGxpa2U6CgogCSAgICAgICAgJWZlYXR1cmUoInJlZiIpICAgUkNPYmogIiR0aGlzLT5yZWYoKTsiCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgidW5yZWYiKSBSQ09iaiAiJHRoaXMtPnVucmVmKCk7IgoKCSAgICAgIEFuZCB0aGUgY2xhc3MgUkNPYmosIGFuZCBhbGwgdGhlIGRlcml2ZWQgb25lcywgd2lsbAoJICAgICAgcGVyZm9ybSB0aGUgcmlnaHQgcmVmL3VucmVmIGNhbGxzIHdoZW4gYSBuZXcgcG9pbnRlciAgCgkgICAgICBpcyByZXR1cm5lZCB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlLCBvciB3aGVuIHRoZSB0YXJnZXQKCSAgICAgIGxhbmd1YWdlIGF0dGVtcHRzIHRvIGRlbGV0ZSB0aGUgb2JqZWN0LgoJICAgICAgCgkgICAgICBTZWUgdGhlIHJlZmNvdW50LmkgZmlsZSBpbiB0aGUgdGVzdC1zdWl0ZSBmb3IgbW9yZQoJICAgICAgZGV0YWlscy4KCgkgICAgCjAzLzE2LzIwMDQ6IG1tYXR1cwoJICAgIFtQeXRob25dIFVzaW5nIHRoZSBuZXcgJWZyYWdtZW50IHN1cHBvcnQsIG1ham9yIHJld3JvdGUgCgkgICAgb2YgdGhlIHB5dGhvbiBzd2lnIGxpYnJhcnksIGluY2x1ZGluZzoKCgkgICAgLSBBbG1vc3QgYXV0b21hdGljIHRlbXBsYXRlL3R5cGVtYXAgaW5zdGFudGlhdGlvbiBmb3IKCSAgICAgIHRoZSBTVEwgY29tcG9uZW50cy4gRm9yIGV4YW1wbGUsIG5vdyB5b3UgY2FuIHdyaXRlOgoKCQkgICAldGVtcGxhdGUodmVjdG9yX2kpIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICAgIGFuZCBhIHNwZWNpYWxpemVkIHZlY3Rvcl9pIGNsYXNzIGlzIGVtaXR0ZWQgd2l0aCBhbGwKCSAgICAgIHRoZSBuZWVkZWQgdHlwZW1hcHMuIE5vIG5lZWQgdG8gdXNlIHRoZSBvbGQKCSAgICAgICdzcGVjaWFsaXplX3ZlY3RvcicgbWFjcm9zLgoKCSAgICAgIE5vdGUgeW91IGNhbiBhbHNvIGRlZmluZQoKCSAgICAgICAgICAldGVtcGxhdGUobWF0cml4X2kpICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8aW50PiA+OwoJICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JfcGlpKSBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LGludD4gPjsKCgkgICAgLSBUaGUgZW1wdHkgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKIAkgCiAgICAgICAgICAgCSAgJXRlbXBsYXRlKCkgc3RkOjp2ZWN0b3I8aW50PjsKCgkgICAgICBkZWZpbmVzIHRoZSB2ZWN0b3IgdHlwZW1hcHMsIGJ1dCBubyBwcm94eSBjbGFzcy4gRm9yIGFsbCB0aGUKICAgICAgICAgICAgICBmdW5kYW1lbnRhbCB0eXBlcywgdGhlIGVtcHR5IHRlbXBsYXRlIGluc3RhbnRpYXRpb24gYXJlCiAgICAgICAgICAgICAgZGVmaW5lZCwgc28sIHlvdSBjYW4gc2F5CgoJICAgICAgJWluY2x1ZGUgc3RkX3ZlY3RvcgoKCSAgICAgIGludCBmdW5jKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGEpOwoJICAgICAgCgkgICAgICB3aGVyZSB0aGUgcHJvcGVyIHR5cGVtYXAgaXMgYXBwbGllZCB0byAnYScsIGJ1dCBubwoJICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwcm94eSBpcyBnZW5lcmF0ZWQuCgkgICAgICAKCiAgICAgICAgICAgIC0gQWxsIHRoZSBTVEwgY29udGFpbmVycyBwcmVzZW50IGEgbW9yZSB1bmlmb3JtIGJlaGF2aW9yIGFuZAoJICAgICAgbW9yZSBjb21wbGV0ZSBpbnRlcmZhY2UgZGVjbGFyYXRpb24uIFRoZSBmb2xsb3dpbmcgYXJlIAoJICAgICAgbm93IHN1cHBvcnRlZDoKCgkJICBzdGQ6OnZlY3RvcjxUPgoJCSAgc3RkOjpsaXN0PFQ+CgkJICBzdGQ6OmRlcXVlPFQ+CgkJICBzdGQ6OnNldDxUPgoJCSAgc3RkOjptdWx0aXNldDxUPgoJCSAgc3RkOjptYXA8VD4KCQkgIHN0ZDo6bXVsdGltYXA8VD4KICAgICAgICAgICAgICAKICAgICAgICAgICAgICBub3QgYSBjb250YWluZXIsIGJ1dCBhbHNvIHN1cHBvcnRlZDoKCgkJICBzdGQ6OnBhaXI8VCxVPgoKICAgICAgICAgICAgICBhbHNvLCBtb3JlIHR5cGVtYXBzIGFyZSBkZWZpbmVkIGZvciBhbGwgb2YgdGhlbSwKCSAgICAgIGluY2x1ZGluZyB2YXJpbiwgdmFyb3V0LCB0eXBlY2hlY2ssIGV0Yy4KCiAgICAgICAgICAgIC0gSW5pdGlhbCBhdHRlbXB0IHRvIGltcGxlbWVudCB0aGUgU1RMIGNvbnRhaW5lcnMKICAgICAgICAgICAgICBjb25zaWRlcmluZyBhbGxvY2F0b3JzLCBpZToKCgkgICAgICAgICAgc3RkOjp2ZWN0b3I8VCxBPgkJCQoKCSAgICAgIGl0IGlzIHBhcnRpYWxseSB3b3JraW5nLCBidXQgaXQgaXMganVzdCBhIHdvcmthcm91bmQKCSAgICAgIHdoaWxlIHN3aWcgaW1wcm92ZXMgaXRzIHRlbXBsYXRlIHR5cGUgc3VwcG9ydC4KCSAgICAgIAoJICAgICAgCgkgICAgIFBsZWFzZSB0ZXN0IHdpdGggeW91ciBwYXJ0aWN1bGFyIHNldHVwLiBJdCBzZWVtcyB0byBiZQoJICAgICB3b3JraW5nIHdpdGggZysrIDMuMi4yLCBnKysgMi45NiwgSW50ZWwgaWNjIGFuZCBTR0kgQ0MKCSAgICAgY29tcGlsZXJzLCBwbHVzIHB5dGhvbiAxLjUuMiwgMi4wIGFuZCAyLjMsIGJ1dCBzaW5jZQoJICAgICB3ZSBhcmUgdXNpbmcgdGVtcGxhdGVzLCB0aGVyZSBpcyBhIGNoYW5jZSB5b3UgY2FuIGZpbmQKCSAgICAgc29tZSBwcm9ibGVtcyB3aGVuIHVzaW5nIHdpdGggYW4gb2xkIEMrKyBjb21waWxlci4KCjAzLzE2LzIwMDQ6IG1tYXR1cwoKICAgICAgICAgICAgLSBBbGxvd2luZyB0aGUgZW1wdHkgJXRlbXBsYXRlIGRpcmVjdGl2ZSwgc3VjaCBhcwoKICAgICAgICAgICAgICAgICAldGVtcGxhdGUoKSBzdGQ6OnZlY3RvcjxpbnQ+OwoKCSAgICAgIHRvIHByb2Nlc3MgdGhlIGNsYXNzICJ0eXBlZGVmInMgYW5kICJ0eXBlbWFwInMuIEJlZm9yZQoJICAgICAgb25seSB0aGUgaW50ZXJuYWwgInR5cGVkZWYicyB3ZXJlIHByb2Nlc3NlZC4KCiAgICAgICAgICAgICAgVGhpcyBtYWtlcyBwb3NzaWJsZSB0byBlbWl0IHRoZSBkZWZhdWx0IGluL291dAogICAgICAgICAgICAgIHR5cGVtYXBzIHdpdGhvdXQgdGhlIG5lZWQgb2Ygd3JhcHBpbmcgYW4gc3BlY2lhbGl6ZWQKICAgICAgICAgICAgICB2ZWN0b3IgaW5zdGFuY2UuCgoJICAgIC0gQWRkaW5nIHRoZSBwcmVwcm9jZXNzb3IgZXh0ZW5zaW9uICNAIHdoaWNoIG1hbmdsZXMgdGhlCiAgICAgICAgICAgICAgZm9sbG93aW5nIG1hY3JvIGFyZ3VtZW50LCBsaWtlIGluOgoKICAgICAgICAgICAgICAgICNkZWZpbmUgbWFjcm8oWCkgICNAWAogICAgICAgICAgICAgICAgbWFjcm8oaW50KSAgICAgICAgIC0+IGludAogICAgICAgICAgICAgICAgbWFjcm8oc3RkOjpzdHJpbmcpIC0+IHN0ZF9zX3Nfc3RyaW5nCiAgICAgICAgICAgICAgICAKCSAgICAtIEZyYWdtZW50cyBjYW4gbm93IGJlICJ0eXBlIHNwZWNpYWxpemVkIiwgYXMgdGhlIHR5cGVtYXBzLiBUaGUKCSAgICAgIHN5bnRheCBpcyBhcyBmb2xsb3dzCiAKICAgICAgICAgICAgICAgICVmcmFnbWVudCgibmFtZSIsImhlYWRlciIpIAogICAgICAgICAgICAgICAgICB7IC8qIGEgdHlwZSBpbmRlcGVuZGVudCBmcmFnbWVudCAob2xkIHN5bnRheCkgKi8gfQogICAgICAgICAgICAgICAgJWZyYWdtZW50KCJuYW1lIiB7VHlwZX0sICJoZWFkZXIiKSAKICAgICAgICAgICAgICAgICAgeyAvKiB0aGUgZnJhZ21lbnQgaXMgdHlwZSBkZXBlbmRlbnQgKi99CiAKICAgICAgICAgICAgICBOb3cgZnJhZ21lbnRzIGNhbiBhbHNvIGJlIHVzZWQgaW5zaWRlIHRlbXBsYXRlczogCgogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAlZnJhZ21lbnQoImluY29kZSJ7QTxUPn0sImhlYWRlciIpIHsKCQkgICAgICAvKiAnaW5jb2RlJyBzcGVjaWFsaXplZCBmcmFnbWVudCAqLwoJCSAgIH0KIAoJCSAgICV0eXBlbWFwKGluLGZyYWdtZW50PSJpbmNvZGUie0E8VD59KSB7CgkJICAgICAgLyoKCQkgICAgICAgICBoZXJlIHdlIHVzZSB0aGUgJ3R5cGUgc3BlY2lhbGl6ZWQnIAogICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnQgImluY29kZSJ7QTxUPn0KICAgICAgICAgICAgICAgICAgICAgICovCgkJICAgIH0KICAgICAgICAgICAgICAgIH07CgkJCSAgICAgCQoKMDMvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvciBidWcgd2hpY2ggbWVhbnQgdGhhdCBzb21lIHZpcnR1YWwgZnVuY3Rpb25zIG92ZXJyaWRkZW4gaW4KICAgICAgICAgICAgSmF2YSB3ZXJlIG5vdCBiZWluZyBjYWxsZWQgb24gc29tZSBvcGVyYXRpbmcgc3lzdGVtcy4gQnVnIHJlcG9ydGVkIGFuZCBmaXhlZAogICAgICAgICAgICBieSBSb2JlcnQgZGUgVnJpZXMgYW5kIFNjb3R0IE1pY2hlbC4KCjAzLzAyLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEluIC1zY20gbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNoZWNrIHRoZSB0eXBlIG9mIHN0cmluZyBhcmd1bWVudHMuCgowMi8yNC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBOZXcgY29tbWFuZGxpbmUgb3B0aW9uIC1uYW1lc3BhY2UgPG5hbWU+LiBUaGlzIGFsbG93cyBvbmUgdG8gc3BlY2lmeQogICAgICAgICAgICBhIEMjIG5hbWVzcGFjZSBpbnRvIHdoaWNoIGFsbCBDIyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQuCgowMi8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpIAoJICAgIFtNelNjaGVtZV0gVXNlIEZVTkNfTkFNRSByYXRoZXIgdGhhbiBhIGJvZ3VzIHR5cGVtYXAgdmFyaWFibGUgZm9yIHNpZ25hbGxpbmcKCSAgICBlcnJvcnMuICBDYWxsIHNjaGVtZV93cm9uZ190eXBlIHdpdGggYSB6ZXJvLWJhc2VkIGFyZ3VtZW50IG51bWJlci4gIAoJICAgIFJlcG9ydGVkIGJ5IE9uZHJlaiBQYWNvdnNreSwgU0YgIzkwMjYyMS4KCgkgICAgW0d1aWxlXSBEZWZpbmUgRlVOQ19OQU1FIGFsc28gaW4gdGhlIGRpc3BhdGNoIHdyYXBwZXIgZm9yIG92ZXJsb2FkZWQKCSAgICBmdW5jdGlvbnMuICBQYXRjaCBieSBKb2huIExlbnosIFNGICM4OTYyNTUuCgowMi8yMi8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtc2NtIG1vZGUsIGRvbid0IHRyeSB0byBpbnZva2UgYSBudWxsIGRlc3RydWN0b3IgZnVuY3Rpb24uCgowMi8yMC8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgc28gdGhhdCB0aGUgU1dJRyBzb3VyY2Ugd2lsbCBjb21waWxlIHVzaW5nIHRoZSBEaWdpdGFsIE1hcnMgQ29tcGlsZXIKICAgICAgICAgICAgKGZvcm1lcmx5IFN5bWFudGljIGNvbXBpbGVyKSBvbiBXaW5kb3dzLiBTdWJtaXR0ZWQgYnkgU2NvdHQgTWljaGVsLgoKMDIvMTMvMjAwNDogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gTmV3IGNvbW1hbmQtbGluZSBhcmd1bWVudCAtbm9pbml0LiAgVXNlIGl0IGZvciBidWlsZGluZwoJICAgIHRoZSBydW50aW1lIGxpYnJhcnksIHdoZXJlIHdlIGRvbid0IHdhbnQgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbnMKCSAgICBzY2hlbWVfaW5pdGlhbGl6ZSBldGMuICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTE3NTQuCgoJICAgIFtNelNjaGVtZV0gRG9uJ3QgcHJvZHVjZSBpbnZhbGlkIEMgY29kZSB3aGVuIGludm9rZWQgd2l0aCB0aGUKCSAgICAtZGVjbGFyZW1vZHVsZSBvcHRpb24uICBSZXBvcnRlZCBieSBUaW0gQnJvd24sIFNGICM4OTExMDguCgkgICAgCgkgICAgW0d1aWxlXSBCdWlsZCB0aGUgcnVudGltZSBsaWJyYXJ5IHdpdGggcGFzc2l2ZSBsaW5rYWdlLCB0byByZW5hbWUKCSAgICB0aGUgU1dJR19pbml0IGZ1bmN0aW9uIHVuaXF1ZWx5LgoKMDIvMTIvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gUGF0Y2ggc3VibWl0dGVkIGJ5IEJpbGwgSG9mZm1hbiB3aGljaCBwcmV2ZW50cyBTV0lHIGZyb20gY3Jhc2hpbmcKICAgICAgICAgICAgd2hlbiBhIGZpbGUgZm9yIHRoZSB0eXBld3JhcHBlciBjbGFzcyBjYW5ub3QgYmUgb3BlbmVkLgoKMDIvMTEvMjAwNDogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gT3ZlcmxvYWRpbmcgY2hhbmdlczoKICAgICAgICAgICAgICAtIE1ldGhvZHMgd2hpY2ggYXJlIG92ZXJsb2FkZWQgaW4gY29uc3Qgb25seSBubyBsb25nZXIgZ2VuZXJhdGUgSmF2YQogICAgICAgICAgICAgICAgY29kZSB0aGF0IHdvbid0IGNvbXBpbGUgLSB0aGUgZmlyc3QgbWV0aG9kIHBhcnNlZCBpcyB1c2VkIGFuZCBhCiAgICAgICAgICAgICAgICB3YXJuaW5nIGlzIGRpc3BsYXllZC4gTm90ZSB0aGF0IHRoaXMgYmVoYXZpb3VyIGlzIHNsaWdodGx5IGRpZmZlcmVudAogICAgICAgICAgICAgICAgdG8gdGhlIHNjcmlwdGluZyBsYW5ndWFnZXMgd2hpY2ggYWx3YXlzIHVzZXMgdGhlIG5vbi1jb25zdCBtZXRob2QuCiAgICAgICAgICAgICAgLSBXYXJuaW5nIG1lc3NhZ2VzIDUwOSBhbmQgNTEyIHJlcGxhY2VkIGJ5IG5ldyB3YXJuaW5nIG51bWJlciA1MTYsIHdoaWNoIAogICAgICAgICAgICAgICAgaXMgbW9yZSByZWxldmFudCB0byB0aGVzZSBzdGF0aWNhbGx5IHR5cGVkIGxhbmd1YWdlcyBhcyB0aGUgb3ZlcmxvYWRlZAogICAgICAgICAgICAgICAgbWV0aG9kcyBhcmVuJ3QgJ3NoYWRvd2VkJywgdGhleSBhcmUgaWdub3JlZC4KCjAxLzIzLzIwMDQ6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIFJlcGxhY2UgdGhlICJrbm93bl9jbGFzc2VzIiBoYXNoIHRhYmxlIGJ5IGEgbm9kZQoJICAgIGF0dHJpYnV0ZS4gIE1ldGhvZHMgb2YgY2xhc3NlcyBpbiBDKysgbmFtZXNwYWNlcyBub3cgZ2V0CgkgICAgdGhlIHByb3BlciBzcGVjaWFsaXplciBpbiB0aGUgR09PUFMgZGVjbGFyYXRpb24uCgkgICAgUmVwb3J0ZWQgYnkgcm1AbWgtZnJlaWJ1cmcuZGUuCgowMS8yMy8yMDA0OiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBVbmlxdWlmeSB0aGUgYXJndW1lbnQgbmFtZXMgaW4gR09PUFMgc2hhZG93IG1ldGhvZAoJICAgIGRlY2xhcmF0aW9ucy4gIFJlcG9ydGVkIGJ5IHJtQG1oLWZyZWlidXJnLmRlLgoKMDEvMjEvMjAwNDogc3Vuc2hpbmUgKEVyaWMgU3Vuc2hpbmUpCiAgICAgICAgICAgIFJldml2ZWQgdGhlIE5leHRTdGVwIHBvcnQgb2YgU1dJRy4KCiAgICAgICAgICAgIEZpeGVkIGZhdGFsIHByb2JsZW0gaW4gRG9oU3Ryc3RyKCkgY2F1c2VkIGJ5IGRpZmZlcmVuY2UgaW4gc3Ryc3RyKCkKICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gd2hpY2ggbWFkZSAlYXBwbHkgYmVjb21lIGVudGlyZWx5IGR5c2Z1bmN0aW9uYWwuICBPbgogICAgICAgICAgICBOZXh0U3RlcCwgc3Ryc3RyKCJmb28iLCIiKSBldmFsdWF0ZXMgdG8gTlVMTDsgd2hlcmVhcywgb24gbW9kZXJuCiAgICAgICAgICAgIHBsYXRmb3JtcywgaXQgZXZhbHVhdGVzIHRvICJmb28iLiAgJWFwcGx5IHJlbGllcyBleHRlbnNpdmVseSB1cG9uCiAgICAgICAgICAgIHN0cnN0cigiZm9vIiwiIikgZXZhbHVhdGluZyB0byBub24tTlVMTCwgdGhlcmVmb3JlIGl0IGZhaWxlZAogICAgICAgICAgICBjYXRhc3Ryb3BoaWNhbGx5IHdoZW4gZmFjZWQgd2l0aCBOZXh0U3RlcCdzIHN0cnN0cigpLgoKICAgICAgICAgICAgQWRkZWQgYGJvb2wnIGNoZWNrIHRvIGNvbmZpZ3VyZS5pbiBzaW5jZSBOZXh0U3RlcCdzIEMrKyBjb21waWxlcgogICAgICAgICAgICBkb2VzIG5vdCBzdXBwbHkgdGhpcyB0eXBlLiAgc3dpZy5oIG5vdyBmYWtlcyB1cCBgYm9vbCcgaWYgbmVlZGVkLgoKICAgICAgICAgICAgV29ya2VkIGFyb3VuZCBOZXh0U3RlcCBDKysgY29tcGlsZXIgYnVnIGluIHdoaWNoIEMrKyBjb2RlIGlzCiAgICAgICAgICAgIGRpc2FsbG93ZWQgaW5zaWRlIGV4dGVybiAiQyIgZnVuY3Rpb25zLiAgVGhpcyBwcm9ibGVtIGFmZmVjdGVkIGFsbAogICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLCBzaW5jZSB0aGV5IHB1Ymxpc2ggaG9vayBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXcgRk9PKCk7IH0KICAgICAgICAgICAgRml4ZWQgYnkgY3JlYXRpbmcgYSBDKysgd3JhcHBlcjoKICAgICAgICAgICAgICAgIHN0YXRpYyBMYW5ndWFnZSAqbmV3X3N3aWdfZm9vKCkgeyByZXR1cm4gbmV3IEZPTygpOyB9CiAgICAgICAgICAgICAgICBleHRlcm4gIkMiIExhbmd1YWdlICpzd2lnX2Zvbyh2b2lkKSB7IHJldHVybiBuZXdfc3dpZ19mb28oKTsgfQoKICAgICAgICAgICAgRW5zdXJlZCB0aGF0IFN3aWdfY29weV9zdHJpbmcoKSBpcyB1c2VkIGluIHBsYWNlIG9mIHN0cmR1cCgpIHNpbmNlCiAgICAgICAgICAgIE5leHRTdGVwIGRvZXMgbm90IHN1cHBseSBzdHJkdXAoKS4KCiAgICAgICAgICAgIEZpeGVkIGRldGVjdGlvbiBvZiBSdWJ5IGxpYnJhcnkgbmFtZSBhbmQgbG9jYXRpb24gaW4gY29uZmlndXJlLmluLgogICAgICAgICAgICBQcm9ibGVtIDE6IEFzc3VtZWQgdGhhdCBsaWJyYXJ5IGFsd2F5cyByZXNpZGVkIGluIFJ1YnkncyAiYXJjaGRpciIsCiAgICAgICAgICAgIHdoaWNoIHdhcyBjb3JyZWN0IGZvciBSdWJ5IDEuNi54LCBidXQgd2hpY2ggaXMgaW5jb3JyZWN0IGZvciBSdWJ5CiAgICAgICAgICAgIDEuOC54LCBpbiB3aGljaCBjYXNlIHRoZSBsaWJyYXJ5IG5vcm1hbGx5IHJlc2lkZXMgaW4gUnVieSdzCiAgICAgICAgICAgICJsaWJkaXIiLiAgUHJvYmxlbSAyOiBBc3N1bWVkIHRoYXQgdGhlIGxpYnJhcnkgY291bGQgYWx3YXlzIGJlCiAgICAgICAgICAgIGxpbmtlZCB2aWEgIi1sIitSVUJZX0lOU1RBTExfTkFNRSAod2hlcmUgUlVCWV9JTlNUQUxMX05BTUUKICAgICAgICAgICAgdHlwaWNhbGx5IGlzICJydWJ5IiksIGhvd2V2ZXIgdGhpcyBmYWlsZWQgZm9yIHBsYXRmb3Jtcywgc3VjaCBhcwogICAgICAgICAgICBOZXh0U3RlcCwgd2hpY2ggZG8gbm90IHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcy4gIEluIHRoaXMgY2FzZSwgdGhlCiAgICAgICAgICAgIHN0YXRpYyBsaWJyYXJ5IG5hbWUgaW4gMS44LnggaXMgbGlicnVieS1zdGF0aWMuYSwgdGh1cwogICAgICAgICAgICAtbHJ1Ynktc3RhdGljIGlzIHJlcXVpcmVkLiAgVGhlIG5ldyBsb2dpYyB3b3JrcyBjb3JyZWN0bHkgZm9yCiAgICAgICAgICAgIHN0YXRpYyBhbmQgc2hhcmVkIGxpYnJhcmllcyBmb3IgMS42LnggYW5kIDEuOC54LgoKICAgICAgICAgICAgRml4ZWQgZGV0ZWN0aW9uIG9mIFBlcmwgQ0ZMQUdTIGluIGNvbmZpZ3VyZS5pbiBmb3IgTmV4dFN0ZXAuCiAgICAgICAgICAgIERldGVjdGlvbiBjb2RlIGV4dHJhY3RlZCBDRkxBR1MgZnJvbSBQZXJsJ3MgJUNvbmZpZyBoYXNoIGJ1dAogICAgICAgICAgICBuZWdsZWN0ZWQgdG8gYWRkIGEgbmV3bGluZSB0byB0aGUgdmFsdWUgYmVmb3JlIHBhc3NpbmcgaXQgdGhyb3VnaAogICAgICAgICAgICBgc2VkJy4gIE5leHRTdGVwJ3MgYW5jaWVudCBgc2VkJyBkaXNjYXJkcyBpbnB1dCB3aGljaCBpcyBub3QKICAgICAgICAgICAgdGVybWluYXRlZCB3aXRoIGEgbmV3bGluZSwgdGh1cyBQZXJsIENGTEFHUyBhbHdheXMgZXZhbHVhdGVkIHRvIHRoZQogICAgICAgICAgICBlbXB0eSBzdHJpbmcuCgowMS8xNi8yMDA0OiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGlkeSB1cCBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgdGhhdCBpcyBnZW5lcmF0ZWQgd2hlbgogICAgICAgICAgICBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIGFyZSB3cmFwcGVkIHdpdGggdGhlIHRocm93cyB0eXBlbWFwLgogICAgICAgICAgICBUaGlzIHJlZHVuZGFudCBjb2RlIGlzIG5vIGxvbmdlciBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgY2F0Y2goLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3c7IAogICAgICAgICAgICAgICAgfQoKMDEvMTIvMjAwNDogd3NmdWx0b24gb24gYmVoYWxmIG9mIG1tYXR1cyAobWFyY2VsbyBtYXR1cykgCiAgICAgICAgICAgIGlmIGEgbWV0aG9kIHVzZXMgJWV4Y2VwdGlvbiBhbmQgdGhlIG1ldGhvZCByZXF1aXJlcyB0aGUgdXNlCiAgICAgICAgICAgIG9mIHRoZSB0aHJvd3MgdHlwZW1hcCwgdGhlIGNvZGUgaW4gYSB0aHJvd3MgdHlwZW1hcCB3aWxsIGJlCiAgICAgICAgICAgIGdlbmVyYXRlZCBpbnNpZGUgdGhlIHRyeSBib2R5LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBtZXRob2QgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFjdGlvbiAKICAgICAgICAgICAgICAgICAgJGFjdGlvbgogICAgICAgICAgICAgICAgfSBjYXRjaCAoaW50IGkpIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGludCBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICB9IGNhdGNoICguLi4pIHsKICAgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGdlbmVyaWMgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MpIEV4Y2VwdCAlewogICAgICAgICAgICAgICAgLy8gdGhyb3dzIHR5cGVtYXAgRXhjZXB0IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAlaW5saW5lICV7CiAgICAgICAgICAgICAgY2xhc3MgRXhjZXB0IHt9OwogICAgICAgICAgICAgIHZvaWQgbWV0aG9kKGludCBpKSB0aHJvdyAoRXhjZXB0KTsKCiAgICAgICAgICAgIFdpbGwgZ2VuZXJhdGU6CgogICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBhY3Rpb24gCiAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZChhcmcxKTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIGNhdGNoKEV4Y2VwdCAmX2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJvd3MgdHlwZW1hcCBFeGNlcHQgY2F0Y2ggaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGludCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgaW50IGNhdGNoIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAvLyBtZXRob2QgZ2VuZXJpYyBjYXRjaCBoYW5kbGVyCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgoKICAgICAgICAgICAgQXMgY2FuIGJlIHNlZW4sIHRoZSBpbm5lciB0cnkgY2F0Y2ggYmxvY2sgaXMgZm9yIHRoZSB0aHJvd3MgdHlwZW1hcHMuCiAgICAgICAgICAgIFByZXZpb3VzbHksIHRoaXMgd2FzIHJldmVyc2VkIHNvIHRoYXQgdGhlIGlubmVyIHRyeSBjYXRjaCBibG9jawogICAgICAgICAgICB3YXMgdGhlICVleGNlcHRpb24gY29kZS4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIGl0IHdvdWxkIGhhdmUgYmVlbgogICAgICAgICAgICBpbXBvc3NpYmxlIHRvIGNhdGNoIEV4Y2VwdCBhcyB0aGUgY2F0Y2ggYWxsICguLi4pIHdvdWxkIGNhdGNoIHRoZQogICAgICAgICAgICBleGNlcHRpb24gaW5zdGVhZC4KClZlcnNpb24gMS4zLjIxIChKYW51YXJ5IDExLCAyMDA0KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAxLzEwLzIwMDQ6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBUaGUgb3V0cHV0IGZvcm1hdCBmb3IgYm90aCB3YXJuaW5ncyBhbmQgZXJyb3JzIGNhbiBiZSBzZWxlY3RlZCBmb3IKICAgICAgICAgICAgaW50ZWdyYXRpb24gd2l0aCB5b3VyIGZhdm91cml0ZSBJREUvZWRpdG9yLiBFZGl0b3JzIGFuZCBJREVzIGNhbiB1c3VhbGx5CiAgICAgICAgICAgIHBhcnNlIGVycm9yIG1lc3NhZ2VzIGFuZCBpZiBpbiB0aGUgYXBwcm9wcmlhdGUgZm9ybWF0IHdpbGwgZWFzaWx5IHRha2UgeW91IAogICAgICAgICAgICBkaXJlY3RseSB0byB0aGUgc291cmNlIG9mIHRoZSBlcnJvci4gVGhlIHN0YW5kYXJkIGZvcm1hdCBpcyB1c2VkIGJ5IAogICAgICAgICAgICBkZWZhdWx0IGV4Y2VwdCBvbiBXaW5kb3dzIHdoZXJlIHRoZSBNaWNyb3NvZnQgZm9ybWF0IGlzIHVzZWQgYnkgZGVmYXVsdC4KICAgICAgICAgICAgVGhlc2UgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICQgc3dpZyAtcHl0aG9uIC1Gc3RhbmRhcmQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmk6NDogU3ludGF4IGVycm9yIGluIGlucHV0LgogICAgICAgICAgICAgICAgJCBzd2lnIC1weXRob24gLUZtaWNyb3NvZnQgZXhhbXBsZS5pCiAgICAgICAgICAgICAgICBleGFtcGxlLmkoNCk6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4NzE5MDkgXSBzaW1wbGUgbmFtZXNwYWNlIHByb2JsZW0uCiAgICAgICAgICAgIFRoaXMgd2FzIGEgcHJvYmxlbSB1c2luZyBhbm9ueW1vdXMgc3RydWN0dXJlcyBpbiBhIG5hbWVzcGFjZS4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIG5zIHsKICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0ICB7CiAgICAgICAgICAgICAgICAgICAgICBpbnQgbjsKICAgICAgICAgICAgICAgICAgIH0gUzsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NoIENoZXJyeS4KCjAxLzA5LzIwMDQ6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc29tZSBicm9rZW4gUGVybCBleGFtcGxlcy4KCjEyLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSBhbmQgQyNdIEZpeGVzIGZvciB3cmFwcGluZyBjb3ZhcmlhbnQgKHBvbHltb3JwaGljKSByZXR1cm4gdHlwZXMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHN0cnVjdCBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCB+QmFzZSgpOwogICAgICAgICAgICAgICAgICB2aXJ0dWFsIEJhc2UqIGNvcHkoKSBjb25zdCA9IDA7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgc3RydWN0IERlcml2ZWQgOiBCYXNlIHsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBEZXJpdmVkKiBjb3B5KCkgY29uc3Q7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIERlcml2ZWQ6OmNvcHkgcHJveHkgbWV0aG9kIHJldHVybnMgQmFzZSBub3QgRGVyaXZlZC4gQSB3YXJuaW5nIGlzIGlzc3VlZAogICAgICAgICAgICBhYm91dCB0aGlzLiBQcmV2aW91c2x5IHRoZSBwb2ludGVyIHVzZWQgYnkgdGhlIHByb3h5IGNsYXNzIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICB0cmVhdGVkIGFzIGEgQmFzZSogaW5zdGVhZCBvZiBhIERlcml2ZWQqLgoKMTIvMTgvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBzbyB0aGF0IFdpbmRvd3MgcGF0aHMgYXJlIGRpc3BsYXllZCBjb3JyZWN0bHkgd2hlbiByZXBvcnRpbmcgZXJyb3JzLgogICAgICAgICAgICBBbiBlcnJvciBwcmV2aW91c2x5IHdvdWxkIGhhdmUgYmVlbiBzaG93biBzb21ldGhpbmcgbGlrZToKCiAgICAgICAgICAgICAgLj94YW1wbGUuaToxNDogU3ludGF4IGVycm9yIGluIGlucHV0LgoKICAgICAgICAgICAgaW5zdGVhZCBvZjoKCiAgICAgICAgICAgICAgLlxleGFtcGxlLmk6MTQ6IFN5bnRheCBlcnJvciBpbiBpbnB1dC4KCgpWZXJzaW9uIDEuMy4yMCAoRGVjZW1iZXIgMTcsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzE3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgTGFzdCBtaW51dGUgbW9kaWZpY2F0aW9ucy4gICBQZXJsNSBtb2R1bGUgbm93IGdlbmVyYXRlcyBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgICBieSBkZWZhdWx0IGxpa2UgYWxsIG9mIHRoZSBvdGhlciBtb2R1bGVzLiAgUEhQNCB3cmFwcGVycyBubyBsb25nZXIKICAgICAgICAgICAgaW5jbHVkZSAiY29uZmlnLmgiLiAKCjEyLzE0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgV2Vha2VuZWQgd2FybmluZyBtZXNzYWdlIHJlbGF0ZWQgdG8gY29uc3RydWN0b3IgbmFtZXMgc28gdGhhdCBhbgogICAgICAgICAgICB1bnVzdWFsIG5lc3RlZC1jbGFzcyB3cmFwcGluZyB0ZWNobmlxdWUgd291bGQgd29yayBhZ2FpbiAoYXBwYXJlbnRseQogICAgICAgICAgICBpdCB3b3JrZWQgaW4gc29tZSBvbGRlciBTV0lHIHJlbGVhc2VzKS4gICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIFNjb3BlIHsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzQjsKICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgY2xhc3MgU2NvcGU6OkNsYXNzQSB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICBjbGFzcyBTY29wZTo6Q2xhc3NCIHsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIE5vdGU6ICBUaGVyZSBpcyBzdGlsbCBzb21lIG9kZCBpbnRlcmFjdGlvbiB3aXRoIHRoZSBTV0lHIHN5bWJvbAogICAgICAgICAgICB0YWJsZS90eXBlIHN5c3RlbSB0aGF0IHdpbGwgbmVlZCB0byBiZSBsb29rZWQgYXQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR3VzdGF2byBOaWVtZXllci4KCgoxMi8xMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3RlY3RlZCBjbGFzcyBtZXRob2RzIGFyZSB3cmFwcGVkIGFzIHByb3RlY3RlZCBKYXZhIG1ldGhvZHMgCiAgICAgICAgICAgIHdoZW4gdXNpbmcgdGhlIGRpcnByb3QgZGlyZWN0b3IgZmVhdHVyZS4gVGhpcyBjYW4gYmUgY2hhbmdlZCB1c2luZwogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyB0byBzb21ldGhpbmcgZWxzZSBzaG91bGQgdGhlIG5lZWQgYXJpc2UsIGZvcgogICAgICAgICAgICBleGFtcGxlLCBwcml2YXRlIG9yIHBhY2thZ2UgYWNjZXNzLgoKMTIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhLCBDI10gCiAgICAgICAgICAgICVqYXZhbWV0aG9kbW9kaWZpZXJzIChKYXZhKSBhbmQgJWNzbWV0aG9kbW9kaWZpZXJzIChDIykgb3BlcmF0ZSBzbGlnaHRseSAKICAgICAgICAgICAgZGlmZmVyZW50bHkuIFByZXZpb3VzbHkgdGhpcyBmZWF0dXJlIGhhZCB0byBiZSBwcmVzZW50IHRvIHNldCB0aGUgbWV0aG9kCiAgICAgICAgICAgIG1vZGlmaWVycy4gTm93IGl0IGlzIG9ubHkgdXNlZCBpZiBpdCBleGlzdHMgZm9yIHRoZSBtZXRob2QgYmVpbmcgd3JhcHBlZC4KICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgInB1YmxpYyIgYXMgcHJldmlvdXMgaG93ZXZlciwgd2hlbiB3cmFwcGluZyBwcm90ZWN0ZWQKICAgICAgICAgICAgZGlyZWN0b3IgbWV0aG9kcyBpdCBpcyAicHJvdGVjdGVkIi4gVGhpcyBjaGFuZ2Ugd2lsbCBub3QgYWZmZWN0IGV4aXN0aW5nCiAgICAgICAgICAgIHVzZSBvZiB0aGUgJWphdmFtZXRob2Rtb2RpZmllcnMgb3IgJWNzbWV0aG9kbW9kaWZpZXJzLgoKMTIvMTEvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGlzIGZpeCBzb21lIHJlY3VycmluZyByZXBvcnRzIGFib3V0IGtleXdvcmRzIG5vdCBiZWVuCgkgICAgcHJvcGVybHkgaWRlbnRpZmllZCBhbmQgd2FybmVkLCBhbmQgaXQgc29sdmVzIHRoZSBwcm9ibGVtCgkgICAgb2YgaG93IHRvIGFkZCBhIHRlc3QgZmlsZSB0byB0aGUgdGVzdC1zdWl0ZSBzdWNoIHRoYXQgaXQKCSAgICBkb2Vzbid0IHVzZSBhbnkga2V5d29yZCBvZiBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMKCSAgICAoYW5kIGRvaW5nIGl0IHdpdGhvdXQgY29tcGlsaW5nIHRoZSB0ZXN0IGZvciBhbGwgdGhlCgkgICAgc3VwcG9ydGVkIGxhbmd1YWdlcywgdGhpbmcgdGhhdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlLAoJICAgIGFuZCB3aXRob3V0IHJlcXVpcmluZyB5b3UgdG8ga25vdyBhbGwgdGhlIHN1cHBvcnRlZAoJICAgIGxhbmd1YWdlIGtleXdvcmRzLCB0aGluZyB0aGF0IGlzIGFsd2F5cyBpbXBvc3NpYmxlKS4KCgkgICAgU28gdGhlc2UgYXJlIHRoZSBjaGFuZ2VzIGdsb2JhbGx5IHNwZWFraW5nOgoKCSAgICAtIFVuaWZvcm0gdGhlIGRlZmluaXRpb24gb2YgdGhlIGtleXdvcmQgd2FybmluZ3MgdGhyb3VnaAoJICAgICAgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXM6IGFsbCB0aGUgbGFuZ3VhZ2VzIGhhcyBub3cgYQoJICAgICAgc2VwYXJhdGUgZmlsZSB0aGF0IGRlZmluZXMgdGhlIGtleXdvcmRzIG9yIGJhZCBuYW1lczoKCgkJICBweXRob24vcHl0aG9ua3cuc3dnCgkJICBjaGlja2VuL2NoaWNrZW5rdy5zd2cKICAgICAgICAgICAgICAgICAgLi4uLgoKCSAgICAtIEFkZGVkIGtleXdvcmQgbGlzdCBmb3IgbW9zdCBvZiB0aGUgbGFuZ3VhZ2VzIHRoYXQgZGlkbid0CgkgICAgICBoYXZlIG9uZSAodXNpbmcgdGhlIG5ldyBzZXBhcmF0ZWQgZmlsZSkuCgkJICAgIAkgICAgCgkgICAgLSBBZGRlZCB0aGUgIkFsbCBrZXl3b3JkcyIgd2FybmluZyBzdXBwb3J0OiAtV2FsbGt3IG9wdGlvbi4KCiAgICAgICAgICAgICAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBpbmNsdWRlIGFsbCB0aGUga25vd24ga2V5d29yZHMKCSAgICAgIGZvciBhbGwgdGhlIHN1cHBvcnRlZCBsYW5ndWFnZXMsIGFuZCBjYW4gYmUgdXNlZCBhczoKCiAgICAgICAgICAgICAgICAgc3dpZyAtV2FsbGt3IC4uLi4KCSAgICAKCSAgICAgIFRoaXMgd2lsbCBoZWxwIHRvIHRoZSBwcm9jZXNzIG9mIGFkZGluZyBhIHRlc3Qtc3VpdGUKCSAgICAgIGZpbGUgdGhhdCBjYW4gYmUgY29tcGlsZWQgaW4gYWxsIHRoZSBzd2lnIHN1cHBvcnRlZAoJICAgICAgbGFuZ3VhZ2VzLCBhbmQgaXQgd2lsbCBiZSBhbHNvIGhlbHBmdWwgZm9yIHVzZXJzIHdobwoJICAgICAgd2FudCB0byBjcmVhdGUgbXVsdGktbGFuZ3VhZ2UgbGlicmFyaWVzLgoJICAgIAoJICAgIEFuZCB0aGVzZSBhcmUgdGhlIGRldGFpbGVkIGNoYW5nZXMgKG1vc3RseSBmaWxlIGFkZGl0aW9uKToKCgkgICAgLSBGb3IgdGhlIGxhbmd1YWdlcyB0aGF0IGFscmVhZHkgaGF2ZSBzb21lIHNvcnQgb2Yga2V5d29yZAoJICAgICAgd2FybmluZyBsaXN0LCBtb3ZlIGl0IHRvIGFuIGV4dGVybmFsIGxhbmd1YWdla3cuc3dnCgkgICAgICBmaWxlLCBpZToKCSAgICAKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSBweXRob24uc3dnIC0+IHB5dGhvbmt3LnN3ZwoJICAgICAgICAgbW92ZSBrZXl3b3JkcyBmcm9tIGNoaWNrZW4uc3dnIC0+IGNoaWNrZW5rdy5zd2cKCSAgICAgICAgIG1vdmUga2V5d29yZHMgZnJvbSB0Y2w4LnN3ZyAtPiB0Y2xrdy5zd2cKIAogICAgICAgICAgICAgIGFuZCByZS1pbmNsdWRlIGxhbmd1YWdla3cuc3dnIGZyb20gbGFuZ3VhZ2Uuc3dnLgoJICAgIAoJICAgIC0gRm9yIHRoZSBsYW5ndWFnZSB0aGF0IGRpZG4ndCBoYXZlIGEga2V5d29yZCBsaXN0LCBhbmQKCSAgICAgIGZvciB0aGUgb25lcyB0aGF0IEkgY291bGQgZmluZCBhIGxpc3QsIGFkZCB0aGUKCSAgICAgIGxhbmd1YWdla3cuc3dnIGZpbGUsIGllOgoKICAgICAgICAgICAgICAgICBjc2hhcnAvY3NoYXJwa3cuc3dnCiAgICAgICAgICAgICAgICAgamF2YS9qYXZha3cuc3dnCiAgICAgICAgICAgICAgICAgcGhwNC9waHBrdy5zd2cKCQkgcGlrZS9waWtla3cuc3dnCSAKCQkgcnVieS9ydWJ5a3cuc3dnCgoKICAgICAgICAgICAgICBhbHNvIGFkZCBhIGxpbmUgaW4gbGFuZ3VhZ2Uuc3dnIHRvIGluY2x1ZGUKCSAgICAgIGxhbmd1YWdla3cuc3dnLCBidXQgbm93IGl0IGlzIGNvbW1lbnRlZCEhISwgbGlrZSBpbgoJICAgICAgamF2YS5zd2c6CgogICAgICAgICAgICAgICAgICAvKiBqYXZhIGtleXdvcmRzICovCiAgICAgICAgICAgICAgICAgIC8qIHBsZWFzZSB0ZXN0IGFuZCBhY3RpdmF0ZSAqLwogICAgICAgICAgICAgICAgICAvLyVpbmNsdWRlICJqYXZha3cuc3dnIgoKCSAgICAgIGllLCB0aGVyZSB3aWxsIGJlIG5vIGNoYW5nZSBpbiBob3cgc3dpZyBydW5zIG5vcm1hbGx5CgkgICAgICB1bnRpbCB0aGUgbGFuZ3VhZ2UgbWFpbnRhaW5lciB0ZXN0IGFuZCB1bmNvbW1lbnQgdGhhdAoJICAgICAgbGluZS4KCSAgICAgIAoJICAgICAgU28sIHBsZWFzZSBjaGVjayBlYWNoIGxhbmd1YWdla3cuc3dnIGZpbGUgKEkgbGVmdCB0aGUKCSAgICAgIGxpbmsgdG8gdGhlIGtleXdvcmQgbGlzdCBzb3VyY2UgZm9yIGNoZWNraW5nKSwgYW5kIGFmdGVyCgkgICAgICB0ZXN0aW5nLCB1bmNvbW1lbnQgdGhlICVpbmNsdWRlIGxpbmUuCgoJICAgIC0gQWRkZWQgdGhlIGZpbGUgYWxsa3cuc3dnLCB3aGljaCBpbmNsdWRlcyBhbGwgdGhlCiAgICAgICAgICAgICAgbGFuZ3VhZ2Vrdy5zd2cgZmlsZXMuCgoJICAgICAgRm9yIHRoZSBsYW5ndWFnZXMgdGhhdCBoYXMgbm8gbGFuZ3VhZ2Vrdy5zd2cgZmlsZSByaWdodAoJICAgICAgbm93LCBhbmQgaWYgdGhleSBuZWVkIG9uZSwgYWRkIHRoZSBmaWxlIGludG8gdGhlCgkgICAgICBsYW5ndWFnZSBkaXJlY3RvcnksIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmcgaW5jbHVkZQoJICAgICAgbGluZSBpbnRvIHRoZSBhbGxrdy5zd2cgZmlsZS4KCSAgICAgIAoJICAgIC0gQWRkZWQgdGhlIC1XYWxsa3cgdGhhdCBpbmNsdWRlcyB0aGUgYWxsa3cuc3dnIGZpbGUuCgkgICAgICBOb3RlIHRoYXQgdGhlIG9sZCAtbGFsbGt3LnN3ZyBvcHRpb24gY291bGRuJ3QgYmUgdXNlZAoJICAgICAgc2luY2UgaXQgaW5jbHVkZSB0aGUgZmlsZSBhZnRlciBpdCB3b3VsZCBiZSBuZWVkZWQuCgoKCSAgICBIb3BlZnVsbHksIHRoZSAtV2FsbGt3IG9wdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkZWZhdWx0CgkgICAgcnVsZXMgaW4gdGhlIHJlbGF0ZWQgdGVzdC1zdWl0ZSBNYWtlZmlsZXMsIHNvLCB3aGVuCgkgICAgY3JlYXRpbmcgYSBuZXcgdGVzdCwgb3IgYWRkaW5nIGEgbmV3IHN3aWcgbGlicmFyeSBmaWxlCgkgICAgKGxpa2UgX3N0ZF9kZXF1ZS5pKSwgc3dpZyB3aWxsIHdhcm4geW91IGlmIHlvdSBhcmUgdXNpbmcgYQoJICAgIGJhZCBuYW1lLCBjb25zaWRlcmluZyBhbGwgdGhlIGxhbmd1YWdlIHdoZXJlIGl0IG5lZWRzIHRvCgkgICAgcnVuLgoJICAgIAoJICAgIFJpZ2h0IG5vdyB5b3UgY2FuIHRlc3QgaXQgYnkgdXNpbmc6CgogICAgICAgICAgICAgICBtYWtlIGNoZWNrLXB5dGhvbi10ZXN0LXN1aXRlIFNXSUc9InN3aWcgLVdhbGxrdyIKCgkgICAgb3IgdXNpbmcgeW91ciBmYXZvcml0ZSB0YXJnZXQgbGFuZ3VhZ2UsIGl0IGRvZXNuJ3QgbWF0dGVyLgoKCSAgICBBbmQgeWVzLCB0aGVyZSBhcmUgc2V2ZXJhbCBleGFtcGxlcyB0aGF0IGFyZSB1c2luZwoJICAgIHJlc2VydmVkIGtleXdvcmRzLCBzcGVjaWFsbHkgZnJvbSBjc2hhcnAuCiAgICAgICAgICAKCSAgICAqKiogUmVtZW1iZXIgKioqKjogdGhlIG5ldyBrZXl3b3JkIHdhcm5pbmcgbGlzdHMgYXJlIG5vdAoJICAgIGluY2x1ZGVkIGJ5IGRlZmF1bHQgaW4gYW55IG9mIGxhbmd1YWdlIHRoYXQgYmVmb3JlIGRpZG4ndAoJICAgIGhhdmUgb25lLiBUbyBlbmFibGUgdGhlIGtleXdvcmQgd2FybmluZ3MgYXMgdGhlIGRlZmF1bHQKCSAgICBiZWhhdmlvciwgdGhlIGluY2x1c2lvbiBvZiB0aGUgbGFuZ3VhZ2Vrdy5zd2cgZmlsZSBoYXMgdG8KCSAgICBiZSB1bmNvbW1lbnRlZCBhdCBlYWNoIGxhbmd1YWdlLnN3ZyBmaWxlLgoKCSAgICBTbywgYWxsIHRoZSBsYW5ndWFnZSBtYWludGFpbmVycywgcGxlYXNlIGNoZWNrIHRoZQoJICAgIGtleXdvcmRzIGxpc3QuIAoKCSAgICBBbHNvLCB5b3UgY2FuIGFkZCBidWl0LWluIG5hbWVzLCBhbmQgbm90IG9ubHkga2V5d29yZHMsIGxpa2UKCSAgICAnVHJ1ZS9GYWxzZScgaW4gcHl0aG9uLiAgUmVtZW1iZXIgdGhhdCB5b3UgY2FuIGJlIG1vcmUKCSAgICBzcGVjaWZpYyBhbmQgcmVmZXIgb25seSB0byBtZW1iZXIgbmFtZXMsIGxpa2UgKjo6Y29uZmlndXJlCgkgICAgb3IgKjo6Y2dldCAoc2VlIGFuIGV4YW1wbGUgaW4gdGhlIHRjbDgvdGNsOGt3LnN3ZyBmaWxlKSwKCSAgICBvciBvbmx5IGdsb2JhbCBuYW1lcywgbGlrZSA6OnJhbmdlIChzZWUgYW4gZXhhbXBsZSBpbiB0aGUKCSAgICBweXRob24vcHl0aG9ua3cuc3dnIGZpbGUuCgoJICAgIEp1c3QgdG8gYmUgY29uc2lzdGVudCwgdXNlIHRoZSBmb2xsb3dpbmcgY29kZXM6CgoJICAgIC0gVXNlIGNvZGUgMzE0IGZvciBrZXl3b3JkIGFuZC9vciBmYXRhbCBiYWQgbmFtZXMuCgkgICAgLSBVc2UgY29kZSAzMjEgZm9yIGJ1aXQtaW4gYW5kL29yIG5vdCBmYXRhbCBiYWQgbmFtZXMuCiAgICAgICAgICAgCiAgICAgICAgICAgIHNvLCB0aGV5IGNhbid0IGJlIGRpc2FibGVkL2VuYWJsZWQgaW5kZXBlbmRlbnRseSAoc2VlCgkgICAgcHl0aG9uL3B5aHRvbmt3LnN3ZyBmb3IgZXhhbXBsZXMpLgoKCSAgICAqKioqIEFuZCBkb24ndCBhZGQgYW55IG5ldyB0ZXN0IGZpbGUgd2l0aG91dCBjaGVja2luZyBpdAoJICAgIHdpdGggdGhlIC1XYWxsa3cgb3B0aW9uISEgKHRoYXQgaW5jbHVkZXMgbWUpICoqKioqLgoJICAKCjEyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBTRiBidWcgIzg1NDYzNAogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhY2NlcHRpbmcgdGhlIFVuaXggZGlyZWN0b3J5IHNlcGFyYXRvciAnLycgb24gCiAgICAgICAgICAgIFdpbmRvd3MgYW5kIHRoZSBNYWMgaW4gYWRkaXRpb24gdG8gdGhlIG5hdGl2ZSBvbmUgKCAnXCcgb24gCiAgICAgICAgICAgIFdpbmRvd3MpLiBUaGlzIGNhbiBiZSB1c2VkIGluICVpbXBvcnQsICVpbmNsdWRlIGFuZCBjb21tYW5kbGluZSAKICAgICAgICAgICAgb3B0aW9ucyB0YWtpbmcgYSBwYXRoLCBmb3IgZXhhbXBsZSAtSS4gT24gQ3lnd2luLCBib3RoIHRoZSBXaW5kb3dzCiAgICAgICAgICAgIGFuZCBVbml4IGRpcmVjdG9yeSBzZXBhcmF0b3IgY2FuIG5vdyBiZSB1c2VkICh3YXMgJy8nIG9ubHkpLgogICAgICAgICAgICAKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKICAgICAgICAgICAgW3B5dGhvbl0gSW1wbGVtZW50aW5nIHRoZSBydW50aW1lICJyZXByb3RlY3RlZCIgZGlyZWN0b3IKCSAgICBtZW1iZXJzLCBpZiB5b3UgaGF2ZToKICAgIAogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICB2aXJ0dWFsIH5CYXIoKTsKICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgaGVsbG8oKSB7IHJldHVybiBkb19oZWxsbygpOykKCiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQ6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50IGRvX2hpKCkge3JldHVybiAwO30KICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZG9faGVsbG8oKSB7cmV0dXJuIDA7fQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIHRoZW4sIGF0IHRoZSBweXRob24gc2lkZQoKICAgICAgICAgICAgICAgIGltcG9ydCBteV9tb2R1bGUKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28obXlfbW9kdWxlLkJhcik6CiAgICAgICAgICAgICAgICAgIGRlZiBkb19oZWxsbyhzZWxmKToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICAgICAgCgkgICAgICAgIGIgPSBCYXIoKSAjIFB1cmUgQysrIERpcmVjdG9yIGNsYXNzCiAgICAgICAgICAgICAgICBmID0gRm9vKCkgIyBDKysgRGlyZWN0b3IgKyBweXRob24gbWV0aG9kcwoKICAgICAgICAgICAgICAgIGIuaGVsbG8oKSAjIE9rLCBhbmQgaXQgY2FsbHMgQysrIEJhcjo6ZG9faGVsbG8oKQogICAgICAgICAgICAgICAgZi5oZWxsbygpICMgT2ssIGFuZCBpdCBjYWxscyBQeXRob24gRm9vOjpkb19oZWxsbygpCgogICAgICAgICAgICAgICAgYi5kb19oaSgpICMgUnVudGltZUVycm9yLCBkb19oaSgpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hpKCkgIyBSdW50aW1lRXJyb3IsIGRvX2hpKCkgaXMgcHJvdGVjdGVkISEKIAogICAgICAgICAgICAgICAgYi5kb19oZWxsbygpICMgUnVudGltZUVycm9yLCBkb19oZWxsbygpIGlzIHByb3RlY3RlZCEhCiAgICAgICAgICAgICAgICBmLmRvX2hlbGxvKCkgIyBPaywgc2luY2UgaXQgaXRzIHJlZGVmaW5lZCBpbiBweXRob24uCgogICAgICAgICAgICBIZXJlIEJhci5kb19oZWxsbyBpcyBhbHdheXMgcHJvdGVjdGVkLCBidXQgRm9vLmRvX2hlbGxvCiAgICAgICAgICAgIGlzICJwdWJsaWMiLCBiZWNhdXNlIGl0IGlzIHJlZGVmaW5lZCBpbiBweXRob24uIEJlZm9yZSwKCSAgICBhbGwgdGhlICdkb19oZWxsbycgbWV0aG9kcyB3ZXJlIHB1YmxpYy4KCgkgICAgVGhpcyBzZWVtcyB0byBiZSBhIGdvb2QgY29tcHJvbWlzZSBiZXR3ZWVuIEMrKyBhbmQgcHl0aG9uCgkgICAgcGhpbG9zb3BoaWVzLCBpZSwgYWxsIHRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWV0aG9kcyBrZWVwCgkgICAgcHJvdGVjdGVkIGF0IHRoZSB1c2VyIHNpZGUgKEMrKyB3YXkpIHVudGlsIHRoZXkgYXJlCgkgICAgcmVkZWZpbmVkIChweXRob24gd2F5LCB3ZXJlIGFsbCBkZWZpbmVkIG1ldGhvZHMgYXJlIGFsd2F5cwoJICAgIHB1YmxpYykuIEFuZCB0aGlzIGlzIG5vdCBvbmx5IGEgZ29vZCBjb21wcm9taXNlLCBpdCBhbHNvCgkgICAgc2VlbXMgdG8gYmUgdGhlIG9ubHkgd2F5IHRvIGRvIGl0IDopLgoKCSAgICBOb3cgcnVieSBoYXMgbmF0aXZlIGRpcmVjdG9yIHByb3RlY3RlZCBtZW1iZXJzLCBhbmQgcHl0aG9uCgkgICAgcHVyZSBydW50aW1lIHN1cHBvcnQuIEkgZ3Vlc3MgdGhlc2UgYXJlIHRoZSB0d28gcG9zc2libGUKCSAgICBleHRyZW1lIGNhc2VzLiBBbmQgaG9wZWZ1bGx5LCB0aGV5IGNvdWxkIGJlIHVzZWQgYXMKCSAgICB0ZW1wbGF0ZXMgdG8gbW9kaWZ5IHRoZSBvdGhlciBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0CgkgICAgZGlyZWN0b3JzLCBzbyB0aGV5IGNhbiAicmVwcm90ZWN0IiB0aGUgcHJvdGVjdGVkIGRpcmVjdG9yCgkgICAgbWVtYmVycyBhdCB0aGUgdGFyZ2V0IGxhbmd1YWdlIHNpZGUuCgoJICAgIFRoaXMgZmluaXNoZWQgdGhlIGRpcmVjdG9yIHByb3RlY3RlZCBzdXBwb3J0IGZvciB0aGUgCgkgICAgcHl0aG9uIGxhbmd1YWdlLiBPY2FsbSB3aWxsIG5lZWQgdG8gYWRkIHRoZQoJICAgICJyZXByb3RlY3Rpb24iIGxhdGVyLgoKMTIvMTAvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICBUaGUgZm9sbG93aW5nIGNhc2UgKHJlcG9ydGVkIGJ5IEx5bGUgSm9obnNvbikgd2FzIGZpeGVkOgoKCSAgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CiAKCSAgICAgIGNsYXNzIEZvbyB7IAoJICAgICAgcHVibGljOgoJICAgICAgICB2b2lkIHkoKTsKCgkgICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgIGludCB4OwoJICAgICAgfTsKCgkgICBzd2lnIHdhcm5lZCB0aGF0IHRoZSBzeW1ib2wgJ3gnIHdhcyBhbHJlYWR5IGRlZmluZWQsIGFuZAogICAgICAgICAgIHRoZSByZW5hbWluZyBmYWlscy4gJ3gnIHdhcyBub3QgZW1pdHRlZCwgc2luY2UgaXQgaXMKICAgICAgICAgICBwcm90ZWN0ZWQsIGJ1dCBpdCB3YXMga2VwdCBpbiB0aGUgc3ltYm9sIHRhYmxlIHdpdGggdG9vCiAgICAgICAgICAgbXVjaCBpbmZvcm1hdGlvbi4KCgkgICBOb3cgc3dpZyB3b3JrcyBmb3IgYWxsIHRoZSBjYXNlcyAocGxhaW4sIGRpcmVjdG9yIGFuZAoJICAgZGlycHJvdCkgYWdhaW4uIFRoaXMgd2FzIGZpeGVkIGJ5IGFsbG93aW5nIHRoZSBwYXJzZXIueSB0bwoJICAgZGVjaWRlIG11Y2ggY2xvc2VyIHdoYXQgdG8gZG8gd2l0aCAneCcuIEJlZm9yZSBhbGwgdGhlCgkgICBkaXNjYXJkaW5nIG9yIGdlbmVyYXRpb24gd2FzIHJlc29sdmVkIGF0IHRoZSBsYW5nLmN4eAoJICAgc3RhZ2UuIEFsc28gdGhlIGNoYW5nZXMgaW4gcGFyc2VyLnkgdG8gaW1wbGVtZW50IHRoZQoJICAgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUgYXJlIG5vdyBtdWNoIG1vcmUgZW5jYXBzdWxhdGVkLCBhbmQKCSAgIHRoZXkgZ2V0IGRpc2FibGVkIGlmIHRoZSBtb2RlIGlzIG5vdCBlbmFibGVkLiBCZWZvcmUgdGhlCgkgICBkZWFjdGl2YXRpb24gd2FzIGRvbmUgYXQgdGhlIGdlbmVyYXRpb24gc3RhZ2UgKGxhbmcuY3h4KS4KCgkgICBCeSB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGRpcmVjdG9yIG1vZGUgaXMgZW5hYmxlZCwgYW5kCgkgICAlcmVuYW1lIGlzIGRvbmUsIHJldXNpbmcgYSBwcm90ZWN0ZWQgbWVtYmVyIG5hbWUsIHRoZXJlIGlzCgkgICBhIHBhdGhvbG9naWNhbCBjYXNlOgoKCSAgICAgJXJlbmFtZSh4KSBGb286OnkoKTsKIAogICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEEgewoJICAgICBwdWJsaWM6CgkgICAgICAgdm9pZCB5KCk7CgoJICAgICBwcm90ZWN0ZWQ6CgkgICAgICAgaW50IHg7ICAgICAgICAgICAgLyogd29ya3MgKi8KCSAgICAgICBzdGF0aWMgIGludCB4OyAgICAvKiB3b3JrcyAqLwoJICAgICAgIHN0YXRpYyAgdm9pZCB4KCk7IC8qIHdvcmtzICovCgkgICAgICAgdHlwZWRlZiB2b2lkIHgoKTsgLyogd29ya3MgKi8KCgkgICAgICAgdmlydHVhbCB2b2lkIHgoKTsgLyogYWx3YXlzIGZhaWxzLCBhcyBpdCBzaG91bGQsIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbzo6eCgpIHdpbGwgYmUgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3IgKi8KCgkgICAgICAgdm9pZCB4KCk7IC8qIGFsd2F5cyBmYWlscywgYnV0IHNvbWV0aW1lcyBpdCBzaG91bGRuJ3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSB0aGUgRm9vOjp4KCkgd2lsbCBub3QgYmUgZW1pdHRlZCBpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgbm90IHZpcnR1YWwgKi8KCgkgICAgIH07CgoJICAgVGhlIGxhc3QgY2FzZSBpcyBub3QgYWx3YXlzIHJpZ2h0IGJlY2F1c2UgYXQgdGhlIHBhcnNlci5weQoJICAgc3RhZ2UgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRlY2lkZSBpZiB0aGUgcHJvdGVjdGVkIG1lbWJlcgoJICAgRm9vOjp4KCkgY291bGQgb3Igbm90IGNvbmZsaWN0IHdpdGggdGhlIHJlbmFtZWQgRm9vOjp5KCksCgkgICBzaW5jZSBGb286OngoKSBjb3VsZCBiZSB2aXJ0dWFsIGJ5IGluaGVyaXRhbmNlLgoKCSAgIEkgZ3Vlc3MgdGhpcyBqdXN0IGFuIGludHJpbnNpYyBsaW1pdGF0aW9uLCBhbmQgbm8gbXVjaCBjYW4KCSAgIGJlIGRvbmUgYWJvdXQgaXQgd2l0aG91dCByZXNvcnRpbmcgaW50byBsYXJnZXIgY2hhbmdlcyB0bwoJICAgcG9zdHBvbmUsIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucywgdGhlIG11bHRpcGx5IHN5bWJvbAoJICAgZGV0ZWN0aW9uIChsYW5nLmN4eCBzdGFnZSkuCgkgICAKCSAgIFNvLCBieSBub3csIGl0IGlzIGp1c3QgY29uc2lkZXJlZCBhIHdlbGwga25vd24gImZlYXR1cmUiIGluCgkgICB0aGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1vZGUuIFRoZSBnb29kIG5ld3MgaXMgdGhhdCBpdCBzZWVtcwoJICAgdG8gYmUgYSByYXJlIGNhc2UsIGFuZCBpdCBjYW4gYmUgYXZvaWRlZCBieSB0aGUgdXNlciBieQoJICAgaGlkaW5nICd4JyBiZWZvcmUgcmVuYW1pbmcgJ3knOgoKCSAgICAgJXJlbmFtZShfeCkgRm9vOjp4KCk7CgkgICAgICVyZW5hbWUoeCkgRm9vOjp5KCk7CgkgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgdmlydHVhbCBtZXRob2QgZGV0ZWN0aW9ucyBub3cgcHJvcGVybHkKCSAgICB0cmVhdHMgdGhlIGZvbGxvd2luZyBjYXNlczoKCiAgICAgICAgICAgICBuYW1lc3BhY2UgZm9vIHsgdHlwZWRlZiBpbnQgSW50OyB9CgkgICAgIHN0cnVjdCBBIHt9OwoJICAgICB0eXBlZGVmIEEgQjsKCiAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgdmlydHVhbCB+Rm9vKCkge30KCiAgICAgICAgICAgICAgIHZpcnR1YWwgRm9vKiBjbG9uZXIoKSA9IDA7CgkgICAgICAgdmlydHVhbCBpbnQgZ2V0X3ZhbHVlKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgQSogZ2V0X2NsYXNzKCkgPSAwOwoJICAgICAgIHZpcnR1YWwgdm9pZCBqdXN0X2RvX2l0KCkgPSAwOwoJICAgICB9OwoKICAgICAgICAgICAgIHN0cnVjdCBCYXIgOiBGb28KICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgQmFyKiBjbG9uZXIoKTsKICAgICAgICAgICAgICAgZm9vOjpJbnQgZ2V0X3ZhbHVlKCk7CiAgICAgICAgICAgICAgIEIqIGdldF9jbGFzcygpOwogICAgICAgICAgICAgICB2b2lkIGp1c3RfZG9faXQoKTsKICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgQWxsIHRoZSBGb28gYW5kIEJhciBtZXRob2RzIGFyZSB2aXJ0dWFsLiAgQSBuZXcgYXR0cmlidXRlCgkgICAgInZpcnR1YWw6dHlwZSIgcmVjb3JkIHRoZSBiYXNlIHBvbHltb3JwaGljIHR5cGUuIEluIHRoZQoJICAgIHByZXZpb3VzIGNhc2VzIHdlIGhhdmU6CgoJICAgICAgIHR5cGUgOiBCYXIgICAgICAgdmlydHVhbDp0eXBlIDogRm9vCgkgICAgICAgdHlwZSA6IGZvbzo6SW50ICB2aXJ0dWFsOnR5cGUgOiBpbnQKCSAgICAgICB0eXBlIDogQiAgICAgICAgIHZpcnR1YWw6dHlwZSA6IEEKCSAgICAgICB0eXBlIDogdm9pZCAgICAgIHZpcnR1YWw6dHlwZSA6IHZvaWQKCiAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGlzIHVzZWZ1bCBpbiBsYW5ndWFnZXMgKGphdmErZGlyZWN0b3JzKQoJICAgIHRoYXQgY291bGQgaGF2ZSBwcm9ibGVtcyByZWRlZmluaW5nIEJhciogQmFyOjpjbG9uZXIoKS4KCgkgICAgSWYgeW91IG5ldmVyIGhhZCBjb2RlIGxpa2UgdGhlIGFib3ZlLCB5b3Ugd2lsbCBzZWUgbm8KCSAgICBlZmZlY3RzLiBCdXQgaWYgeW91IGhhdmUgc29tZSBjb2RlIGxpa2UgdGhhdCwgeW91CgkgICAgd2lsbCBzZWUgc29tZSBlZmZlY3RzIHNpbmNlIHNvbWUgbWV0aG9kcyB0aGF0CgkgICAgYmVmb3JlIHdlcmUgbm90IHByb3Blcmx5IHRyZWF0ZWQgYXMgdmlydHVhbCwKCSAgICB3aWxsIHN0YXJ0IHRvIGFjdCBsaWtlIHRoYXQuIFRoaXMgY291bGQgZW5sYXJnZQoJICAgIHlvdXIgZGlyZWN0b3IgY2xhc3Nlcy4KCSAgICAKCjEyLzA4LzIwMDM6IG1tYXR1cyAoTWFyY2VsbyBNYXR1cykKCSAgICBUaGUgZGlyZWN0b3IgcHJvdGVjdGVkIG1lbWJlciBzdXBwb3J0IChkaXJwcm90KQoJICAgIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCgkgICAgCgkgICAgSXQgY2FuIGJlIGVuYWJsZSBieSB1c2luZyAnLWRpcnByb3QnIG9yIGJ5IGFkZGluZwoJICAgIHRoZSBvcHRpb24gdG8gdGhlIG1vZHVsZSBkZWNsYXJhdGlvbiwgbGlrZToKCiAgICAgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIixkaXJwcm90PSIxIikgbXlfbW9kdWxlCgoJICAgIFRoaXMgbW9kdWxlIG9wdGlvbiB3YXMgYWRkZWQgdG8gcHJvcGVybHkgY29tcGlsZSB0aGUKCSAgICBkaXJlY3Rvcl9wcm90ZWN0ZWQuaSBhbmQgZGlyZWN0b3JfbmVzdGVkLmkgZXhhbXBsZXMuCgkgICAgCgkgICAgVGhlIGZlYXR1cmUgaGFzIGJlZW4gdGVzdGVkIHdpdGggcHl0aG9uWzIuMiwyLjNdIAoJICAgIGFuZCBydWJ5WzEuNi43XSwgYm90aCBhdCBjb21waWxhdGlvbiBhbmQgcnVudGltZSwgYW5kIAoJICAgIGphdmFbajJzZGsxLjQuMV8wMV0sIGJ1dCBvbmx5IGF0IGNvbXBpbGF0aW9uIChteSBqYXZhCgkgICAgaW5zdGFsbGF0aW9uIGRvZXNuJ3QgcnVuIGFueSBvZiB0aGUgZGlyZWN0b3IgZXhhbXBsZXMsCgkgICAgb2xkcyBub3IgbmV3cykuCgoJICAgIFBsZWFzZSB0ZXN0IGZvciBvY2FtbCBhbmQgamF2YS4KCSAgICAKCSAgICBUaGUgZXJyb3JzIHJlcG9ydGVkIGJ5IFdpbGxpYW0gYW5kIFNjb3R0IHdlcmUgZml4ZWQsCgkgICAgZXhjZXB0IGZvciBhIHdhcm5pbmcgYWJvdXQgIFNXSUdfSmF2YVRocm93RXhlY3B0aW9uKCkKCSAgICBtdWx0aXBseSBkZWZpbmVkLiBJIGNhbid0IHJlcHJvZHVjZSB0aGlzIGVycm9yIHdpdGggbXkKCSAgICBleGFtcGxlcy4gV2Ugd2lsbCB3YWl0IGZvciBTY290dCB0byBzZW5kIHVzIGEgbWluaW1hbAoJICAgIGNhc2UuCgoKMTIvMDcvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoJICAgIFRoZSBkaXJlY3RvciBwcm90ZWN0ZWQgbWVtYmVyIHN1cHBvcnQgaGFzIGJlZW4KCSAgICBjb21wbGV0bHkgbW92ZWQgb3V0IGZyb20gcHl0aG9uLmN4eCwgYW5kIG5vdwoJICAgIHJlc2lkZXMgaW4gdGhlIGNvbW1vbiBsYW5nLmN4eCwgZW1pdC5jeHggYW5kCgkgICAgYWxsb2NhdGUuY3h4IGZpbGVzLiAKCgkgICAgVGhpcyBtZWFucyBpdCBzaG91bGQgd29yayBmb3IgYWxsIHRoZSBvdGhlciBsYW5ndWFnZXMKCSAgICB0aGF0IGN1cnJlbnRseSBzdXBwb3J0IGRpcmVjdG9ycywgaWUsIHB5dGhvbiwgamF2YSwgb2NhbG0KCSAgICBhbmQgcnVieS4KCgkgICAgVGhlIGNoYW5nZSBoYXMgYmVlbiB0ZXN0ZWQgd2l0aCBweXRob24gKGNvbXBpbGF0aW9uK3J1bnRpbWUpCgkgICAgYW5kIGphdmEgKGp1c3QgY29tcGlsYXRpb24pLgoJICAgIAoJICAgIFBsZWFzZSBhZGQgcnVudGltZSB0ZXN0cyBmb3IgdGhlIG1pc3NpbmcgbGFuZ3VhZ2VzIAoJICAgIGFuZCB0ZXN0IGl0LgoKCSAgICBUaGUgJy1ub2RpcnByb3QnIG9wdGlvbiB3YXMgbW92ZWQgdG8gdGhlIHByaW5jaXBhbCBtYWluLAoJICAgIGFuZCBjYW4gYmUgdXNlZCBmcm9tIGFsbCB0aGUgbGFuZ3VhZ2VzLgoKMTIvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXhlZCBhbmQgaW1wcm92ZWQgZXJyb3IgY2hlY2tpbmcgb2YgU1RSSU5HX09VVCB0eXBlbWFwcyBpbiAKICAgICAgICAgICAgdmFyaW91cy5pLgoKMTIvMDQvMjAwMzogbW1hdHVzIChNYXJjZWxvIE1hdHVzKQoKCSAgICAtIE5vdyB0aGUgdmlydHVhbCBtZW1iZXJzIHdpdGggbm8gZXhwbGljaXQgZGVjbGFyYXRvcgoJICAgIGFyZSBwcm9wZXJseSBpZGVudGlmaWVkOgoJICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQiA6IEEgewogICAgICAgICAgICAgICAgICBpbnQgZigpOwogICAgICAgICAgICAgICAgfTsKCgkgICAgSGVyZSwgQjo6ZigpIGlzIHZpcnR1YWwsIGFuZCB0aGUgZGlyZWN0b3IgYW5kIHRoZQoJICAgIHZpcnR1YWwgZWxpbWluYXRpb24gbWVjaGFuaXNtIG5vdyByZWNvZ25pemUgdGhhdC4KCiAgICAgICAgICAgIC0gW0MjXSBUaGlzIGZpeCBhbHNvIGZpeGVzIHRoZSBwcm9ibGVtIHdoZXJlICdvdmVycmlkZScgd2FzIG5vdCBiZWluZyAKICAgICAgICAgICAgdXNlZCBvbiBhbnkgb3ZlcnJpZGRlbiB2aXJ0dWFsIG1ldGhvZCwgc28gZm9yIHN0cnVjdCBCIGFib3ZlLCAKICAgICAgICAgICAgdGhpcyBDIyBjb2RlIGlzIGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgICBwdWJsaWMgY2xhc3MgQiA6IEEgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBmKCkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKCSAgICAtIEluaXRpYWwgc3VwcG9ydCBmb3IgcHJvdGVjdGVkIHZpcnR1YWwgbWV0aG9kcy4gVGhleSBhcmUgbm93CgkgICAgcHJvcGVybHkgZW1pdHRlZCB3aGVuIHVzaW5nIHdpdGggZGlyZWN0b3IgKHB5dGhvbiBvbmx5IGJ5CgkgICAgbm93KS4KCSAgICAKICAgICAgICAgICAgICAgICVmZWF0dXJlKCJkaXJlY3RvciIpIEE7ICAgIAogICAgICAgICAgICAgICAgc3RydWN0IEEgIHsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMSgpID0gMDsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgQjsKICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogQXsKICAgICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgICAgaW50IGYxKCk7CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgZjIoKTsKICAgICAgICAgICAgICAgIH07CgoJICAgIFRoaXMgY2FuIGJlIGRpc3NhYmxlZCBieSB1c2luZyB0aGUgJy1ub2RpcnByb3QnIG9wdGlvbi4KCgkgICAgLSBUaGUgZmVhdHVyZSAnbm9kaXJlY3RvcicgaXMgd29ya2luZyBub3cgYXQgdGhlIHRvcCBsZXZlbCwKCSAgICBzbywgaXQgbXVzdCB3b3JrIGZvciBhbGwgdGhlIGxhbmd1YWdlczoKCiAgICAgICAgICAgICAgICAlZmVhdHVyZSgiZGlyZWN0b3IiKSBBOwogICAgICAgICAgICAgICAgJWZlYXR1cmUoIm5vZGlyZWN0b3IiKSBBOjpmMjsKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZjEoKTsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmMigpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIAoJICAgIGluIHRoaXMgY2FzZSwgb25seSAnZjEnIGlzIGV4cG9ydGVkIHRvIHRoZSBkaXJlY3RvciBjbGFzcy4KCSAgICAKCSAgICAtIEFkZGVkIGRpcmVjdG9yIHN1cHBvcnQgZm9yIGNvbnN0IFRZUEUmIGFyZ3VtZW50cyAocHl0aG9uKS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciBJTk9VVCBhbmQgT1VUUFVUIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkgZm9yIHdoZW4gdGhlIEpOSSB0eXBlIAogICAgICAgICAgICBpcyBiaWdnZXIgdGhhbiB0aGUgQyB0eXBlLiBGb3IgZXhhbXBsZSwgdW5zaWduZWQgbG9uZyAoMzJiaXRzIG9uIG1vc3Qgc3lzdGVtcykKICAgICAgICAgICAgaXMgbWFwcGVkIHRvIGpsb25nICg2NGJpdHMpLiBSZXR1cm5lZCB2YWx1ZSB3YXMgaW5jb3JyZWN0LiBCdWcgcmVwb3J0ZWQgYnkgCiAgICAgICAgICAgIEJyaWFuIEhhd2xleS4KCjEyLzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyMgYW5kIEphdmFdIEJldHRlciBmaXggZm9yIGVudHJ5IGRhdGVkIDA1LzExLzIwMDMuIEZpeGVzIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgdHlwZW1hcHM6CgogICAgICAgICAgICBKYXZhOiBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgogICAgICAgICAgICBDIzogY3NiYXNlLCBjc2ludGVyZmFjZXMsIGNzaW1wb3J0cywgY3NjbGFzc21vZGlmaWVycywKICAgICAgICAgICAgY3NwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgY3NmaW5hbGl6ZSwgY3NnZXRjcHRyICYgY3Njb2RlLgoKICAgICAgICAgICAgSXQgYWxzbyBmaXhlcyBidWcgaW4gdXNpbmcgYXJyYXlzIG9mIEMgc3RydWN0cyB3aXRoIGFycmF5c19qYXZhLmkgCiAgICAgICAgICAgIGFzIHJlcG9ydGVkIFNjb3R0IE1pY2hlbC4KCjEyLzAyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEZpeGVkIFsgODUyMTE5IF0gcmVjdXJzaXZlIGluaGVyaXRhbmNlIGluIG91dHB1dCAucG0sIHBlcmw1LgogICAgICAgICAgICBSZXBvcnRlZCBieSBXaWxsaWFtIERvd2xpbmcuCgoxMi8wMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIEZpeGVkIFsgNzU1MzgyIF0gY2FsbGluZyBmdW5jKGNvbnN0IHZlY3RvcjxUPiYgcCkgZXZhbHVhdGVzIHBbMF0gaW4gaW50ZXJwLgogICAgICAgICAgICBUaGUgVGNsIHR5cGUgY2hlY2tlciB3YXMgaW1wcm9wZXJseSBoYW5kbGluZyB0aGUgaW50ZXJwcmV0ZXIgcmVzdWx0IHdoZW4KICAgICAgICAgICAgdHlwZSB2aW9sYXRpb25zIHdlcmUgc3VwcG9zZWQgdG8gYmUgaWdub3JlZC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRmxhdml1IFBvcHAtTm93YWsuCgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA1NDUwNTggXSBjb25maWd1cmUncyAtLXdpdGgtdGNsaW5jbCBoYXMgbm8gZWZmZWN0CgoxMS8zMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIFsgNzY2NDA5IF0gbWlzc2luZyBzeW1ib2wgU1dJR19KYXZhVGhyb3dFeGNlcHRpb24gZHVyaW5nIG1vZHVsZSBsb2FkCiAgICAgICAgICAgIFNXSUcncyBpbnRlcm5hbCBmdW5jdGlvbnMgYXJlIGFsbCBzdGF0aWMgYXMgdGhlcmUgaXMgbm8gbmVlZCBmb3IgZGlmZmVyZW50IFNXSUcKICAgICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMgdG8gc2hhcmUgYW55IGNvZGUgYXQgcnVudGltZS4KCjExLzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gQWRkZWQgc3VwcG9ydCBmb3IgQysrIHBvaW50ZXJzIHRvIG1lbWJlcnMuCgoxMS8yOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZWQgWyA4NDgzMzUgXSBEaXJlY3RvcnM6ICNpbmNsdWRlIHdyYXBwZXIgLmggZmlsZSAtIHdhcyBpbmNvcnJlY3RseQogICAgICAgICAgICBhZGRpbmcgYSBkaXJlY3RvcnkgdG8gdGhlIGdlbmVyYXRlZCAjaW5jbHVkZSAiZm9vX3dyYXAuaCIgc3RhdGVtZW50CiAgICAgICAgICAgIGluIHNvbWUgc2l0dWF0aW9ucy4KCjExLzI4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgWyA4NDkwNjQgXSBKQVZBIDogQWNjZXNzIG1vZGlmaWVyIGZvciBkZXJpdmVkIGNsYXNzIHdyb25nLgogICAgICAgICAgICBUaGUgZGVsZXRlKCkgbWV0aG9kIGlzIGFsd2F5cyBwdWJsaWMgbm93LiBJdCB1c2VkIHRvIGJlIHByb3RlY3RlZCB3aGVuZXZlciBhIAogICAgICAgICAgICBkZXN0cnVjdG9yIHdhcyBub24gcHVibGljLiBBbiBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBydW50aW1lIAogICAgICAgICAgICBleGNlcHRpb24gaXMgdGhyb3duIGluc3RlYWQgb2YgbWFraW5nIGRlbGV0ZSgpIHByb3RlY3RlZCBub3cuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gQWRkZWQgc3VwcG9ydCBmb3IgQysrIHBvaW50ZXJzIHRvIG1lbWJlcnMuCgoxMS8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODUwMTUxIF0gUFlWRVJTSU9OIHdpdGggcHl0aG9uMi4zIGluIGNvbmZpZ3VyZSBvZiBTV0lHIDEuMy4xOSAoTWF5YmUpLgoKMTEvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCAgWyA4NTA2NjYgXSAjaW5jbHVkZSBleHRyYSBsaW5lIGFkZGVkLiAgCiAgICAgICAgICAgIFRoaXMgc2hvdWxkIGZpeCBzb21lIHByb2JsZW1zIHdpdGggZ2V0dGluZyBjb3JyZWN0IGxpbmUgbnVtYmVycyBvbgogICAgICAgICAgICBlcnJvciBtZXNzYWdlcy4KCjExLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYW5vdGhlciBvbmUgb2YgTWFyY2VsbydzIGV2aWwgdGVtcGxhdGUgYnVncyAoaW5maW5pdGUKICAgICAgICAgICAgcmVjdXJzaW9uKS4gWyA4NDk1MDQgXSB0ZW1wbGF0ZSBhbmQgdHlwZWRlZiAtPiBpbmYuIHJlY3Vyc2lvbi4KCjExLzI2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcGFyc2luZyBwcm9ibGVtIHdpdGggZGVjbGFyYXRpb25zIGxpa2UgdGhpczoKCgkgICAgICAgICBpbnQgKnggPSAmc29tZWFycmF5WzBdOwoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc1NjU1MiBdIG1pc3NpbmcgZGVmYXVsdCBhcmd1bWVudCBjbGFzcyBzY29wZSB3aXRoICJ8Ii4KICAgICAgICAgICAgVGhpcyBpcyByZWFsbHkgb25seSBhIGJhbmQtYWlkIGZpeCBmb3IgdXNlIG9mIGNsYXNzLWVudW1zIGluCiAgICAgICAgICAgIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICBlbnVtIEZsYWcgeyBmbGFnMSA9IDB4MSwgZmxhZzIgPSAweDIgfTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IHggPSBmbGFnMSB8IGZsYWcyKTsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE5vdGU6IHRoZXJlIGFyZSBzdGlsbCBzb21lIChtb3JlIHN1YnRsZSkgY2FzZXMgdGhhdCBhcmUgYnJva2VuLAogICAgICAgICAgICBidXQgaGFyZCB0byBmaXggZHVlIHRvIGFuIGlzc3VlIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uLiBXaWxsCiAgICAgICAgICAgIGFkZHJlc3MgbGF0ZXIuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERtaXRyeSBNaXJvbm92LgoKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgWyA4NDA4NzggXSBzdXBwb3J0IGZvciAlaW5saW5lIHsgLi4uIH0gKFBBVENIKS4KICAgICAgICAgICAgVGhpcyBhZGRzIHN1cHBvcnQgZm9yIHRoZSBmb2xsb3dpbmc6CgogICAgICAgICAgICAgICAgICAlaW5saW5lIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQgJWlubGluZSAleyAuLi4gJX0gaXMgdGhhdCB0aGUKICAgICAgICAgICAgZW5jbG9zZWQgdGV4dCBpcyBwcm9jZXNzZWQgYnkgdGhlIFNXSUcgcHJlcHJvY2Vzc29yLiAgIFRoaXMKICAgICAgICAgICAgYWxsb3dzIHNwZWNpYWwgbWFjcm9zIGFuZCBvdGhlciBwcm9jZXNzaW5nIHRvIGJlIHVzZWQgaW4gCiAgICAgICAgICAgIGNvbmp1bmN0aW9uIHdpdGggJWlubGluZS4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGlubyBHYXJjaWEuCgoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODM2OTAzIF0gQysrIGluY29uc2lzdGVuY3kgKHdpdGggdm9pZCBhcmd1bWVudHMpLgogICAgICAgICAgICBTV0lHIHdhcyBoYXZpbmcgZGlmZmljdWx0eSB3aXRoIGYoKSB2cyBmKHZvaWQpIGluIEMrKyBwcm9ncmFtcy4KICAgICAgICAgICAgRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICAgICAgY2xhc3MgQSB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmKHZvaWQpID0gMDsKICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEIgewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZigpOyAgICAvLyBOb3QgbWF0Y2hlZCB0byBmKHZvaWQpIGNvcnJlY3RseQogICAgICAgICAgICAgICAgICB9OyAKCiAgICAgICAgICAgIFRoZSBwYXJzZXIgbm93IG5vcm1hbGl6ZXMgYWxsIGRlY2xhcmF0aW9ucyBvZiB0aGUgZm9ybSBmKHZvaWQpIAogICAgICAgICAgICBpbiBDKysgY2xhc3NlcyB0byBmKCkuICBUaGlzIHNob3VsZCBmaXggYSB2YXJpZXR5IG9mIHN1YnRsZSAKICAgICAgICAgICAgcHJvYmxlbXMgd2l0aCBpbmhlcml0YW5jZSwgb3B0aW1pemF0aW9ucywgb3ZlcmxvYWRpbmcsIGV0Yy4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBQYXJ0aG8gQmhvd21pY2suCiAKMTEvMjUvMjAwMzogYmVhemxleQogICAgICAgICAgICBbUGVybDVdIEluY29ycG9yYXRlZCBbIDg0MTA3NCBdIGJldHRlciBjcm9ha2luZyAoUEFUQ0gpLiAgVGhpcyBmaXhlcyBzb21lIHByb2JsZW1zCiAgICAgICAgICAgIHdpdGggc3RyaW5ncyBhbmQgcHJvdmlkZXMgc29tZSBuZXcgZXJyb3IgZnVuY3Rpb25zLiAKICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGlubyBHYXJjaWEuCiAgICAgICAgICAgIAoxMS8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNzkxODM1IF0gRGVmYXVsdCBhcmd1bWVudCB3aXRoIGNhc3Q6IHR4dCA9IChjaGFyICopInR4dCIgc3ludGF4IEVycm9yLgogICAgICAgICAgICBUaGUgcGFyc2VyIHNob3VsZCBub3cgYWNjZXB0IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNoYXIgKnMgPSAoY2hhciAqKSAiSGVsbG8iKTsKCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQ2xhdWRpdXMgU2Nobm9yci4KCjExLzI0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1RjbF0gRml4ZWQgcHJvYmxlbSB3aXRoIGNyb3NzIG1vZHVsZSBsaW5raW5nLiAgUHJldmlvdXNseSBtb2R1bGVzIHJlZmVycmVkCiAgICAgICAgICAgIHRvIGJhc2UgY2xhc3NlcyB0aHJvdWdoIGEgZ2xvYmFsIHZhcmlhYmxlLiAgIE5vdywgdGhlIG1vZHVsZSBsb29rcyB1cCBiYXNlCiAgICAgICAgICAgIGNsYXNzZXMgdGhyb3VnaCB0aGUgdHlwZSBzeXN0ZW0gaXRzZWxmLS0tYXZvaWRpbmcgdGhlIG5lZWQgdG8gbGluayB0byBhIGdsb2JhbAogICAgICAgICAgICBsaWtlIGJlZm9yZS4gIENhdmVhdDogIG1vZHVsZXMgd2l0aCBiYXNlIGNsYXNzZXMgbXVzdCBiZSBsb2FkZWQgYmVmb3JlCiAgICAgICAgICAgIG1vZHVsZXMgd2l0aCBkZXJpdmVkIGNsYXNzZXMuCiAKMTEvMjQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gSW4gLXNjbSBtb2RlLCB1c2UgKCkgdG8gcmVwcmVzZW50IG51bGwgcG9pbnRlcnMsCgkgICAgYXMgaXQgaXMgZG9uZSBpbiAtZ2ggbW9kZS4KCjExLzIzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBBZGQgYSBnZW5lcmF0ZWQgc2NyaXB0ICJwcmVpbnN0LXN3aWciLCB3aGljaCBjYW4gYmUgdXNlZAoJICAgIHRvIGludm9rZSBTV0lHIGJlZm9yZSBpdCBoYXMgYmVlbiBpbnN0YWxsZWQuICBJdCBhcnJhbmdlcwoJICAgIHRoYXQgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGZyb20gdGhlIHNvdXJjZSBkaXJlY3RvcnkgYXJlCgkgICAgdXNlZC4gCgoxMS8yMy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbiAtZ2ggbW9kZSwgZG9uJ3QgZm9yZ2V0IHRvIGNhbGwgU1dJR19HdWlsZV9Jbml0LgoJICAgIEFkZCBhIFNXSUdfY29udHJhY3RfYXNzZXJ0IG1hY3JvLgoKMTEvMjMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtNelNjaGVtZV0gVXBkYXRlIHRoZSBjb25maWd1cmUgY2hlY2sgZm9yIHRoZSBkeW5leHQgb2JqZWN0IHRvIHdvcmsKCSAgICB3aXRoIE16U2NoZW1lIDIwNS4KCjExLzIwLzIwMDM6IG1tYXR1cwoJICAgIEZpeGVkIHRoZSBpbmNsdWRlL2ltcG9ydCBlcnJvciByZXBvcnRlZCBieSBLZXJpbSBCb3JjaGFldiwKCSAgICB3aGVyZSB0d28gZmlsZXMgd2l0aCBuYW1lcyBsaWtlCgoJICAgICdkaXIxL2hlbGxvLmknCgkgICAgJ2RpcjIvaGVsbG8uaScKCSAgICAKCSAgICBjYW4gbm90IGJlIGluY2x1ZGUgYXQgdGhlIHNhbWUgdGltZS4gU3dpZyB3YXMgaW5jbHVkaW5nCgkgICAganVzdCB0aGUgZmlyc3Qgb25lLCBhc3N1bWluZyB0aGUgc2Vjb25kIG9uZSB3YXMgbm90IGEKCSAgICBkaWZmZXJlbnQgb25lLCBzaW5jZSBpdCB3YXMgY2hlY2tpbmcva2VlcGluZyBqdXN0IHRoZQoJICAgIGJhc2VuYW1lICdoZWxsby5pJy4KCjExLzE5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlcyB0byB0aGUgU1dJRyBydW50aW1lIGxpYnJhcnkgc3VwcG9ydC4gCiAgICAgICAgICAgICAgLSAgVGhlIC1jIGNvbW1hbmQgbGluZSBvcHRpb24gaGFzIGJlZW4gcmVuYW1lZCB0byAtbm9ydW50aW1lCiAgICAgICAgICAgICAgLSAgTmV3IGNvbW1hbmQgbGluZSBvcHRpb246IC1ydW50aW1lLiAgV2hlbiBzdXBwbGllZCwgdGhpcwogICAgICAgICAgICAgICAgIGluc2VydHMgdGhlIHN5bWJvbCBTV0lHX0dMT0JBTCBpbnRvIHRoZSB3cmFwcGVyIGNvZGUuICBUaGlzLAogICAgICAgICAgICAgICAgIGluIHR1cm4sIG1ha2VzIGFsbCBvZiB0aGUgcnVudGltZSBzdXBwb3J0IGZ1bmN0aW9ucyBnbG9iYWxseQogICAgICAgICAgICAgICAgIHZpc2libGUuCiAgICAgICAgICAgICAgIC0gTmV3IGxpYnJhcnkgZmlsZTogc3dpZ3J1bi5pLiAgIFVzZWQgdG8gY3JlYXRlIG1vZHVsZXMKICAgICAgICAgICAgICAgICBmb3IgcnVudGltZSBsaWJyYXJ5IChpZiBuZWVkZWQpLgogICAgCjExLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICAnbWFrZSBzcmNycG0nIHJwbWJ1aWxkIGZpeCAtIHBhdGNoIGZyb20gSm9lIENvb3BlcgoKMTEvMTgvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gQ2hhbmdlIG1lYW5pbmcgb2YgY29uZmlndXJlIG9wdGlvbiAtLXdpdGgtZ3VpbGUgdG8KCSAgICB0aGUgbmFtZSBvZiB0aGUgR3VpbGUgZXhlY3V0YWJsZS4gIFRoZSBuZXcgb3B0aW9uIC0td2l0aC1ndWlsZS1wcmVmaXggCgkgICAgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdHJlZSB3aGVyZSBHdWlsZSBpcwoJICAgIGluc3RhbGxlZC4gIChIb3dldmVyLCB1c3VhbGx5IGl0IHN1ZmZpY2VzIHRvIHVzZSB0aGUKCSAgICBzaW5nbGUgb3B0aW9uIC0td2l0aC1ndWlsZS1jb25maWcuKSAgCgkgICAgV2hlbiBydW5uaW5nIHRoZSBydW4gdGVzdHMgdGVzdC1zdWl0ZSwgbWFrZSBzdXJlIHRvIHVzZSB0aGUKCSAgICB2ZXJzaW9uIG9mIEd1aWxlIHRoYXQgU1dJRyB3YXMgY29uZmlndXJlZCBmb3IuCgoxMS8xNy8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBJbXByb3ZlbWVudHMgdG8gb2JqZWN0LW93bmVyc2hpcCBtYW5hZ2VtZW50IGluIAoJICAgICItc2NtIiBtb2RlLiAgKFRoZXkgZG8gbm90IGFwcGx5IHRvIHRoZSBkZWZhdWx0ICItZ2giIG1vZGUuKQoJICAgICogUmVuYW1lZCB0aGUgc21vYiB0eXBlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIG9iamVjdCBjYW4KCSAgICAgIGJlIGdhcmJhZ2UgY29sbGVjdGVkIGZyb20gImNvbGxlY3RlZCBzd2lnIiB0byAiY29sbGVjdGFibGUKCSAgICAgIHN3aWciLCB3aGljaCBpcyBtb3JlIHByZWNpc2UuICAKCSAgICAqIEV4cG9ydCB0aGUgZGVzdHJ1Y3RvciBmdW5jdGlvbnMgYWdhaW4uICBJdCBpcyBub3cKIAkgICAgICBhbGxvd2VkIHRvIGV4cGxpY2l0bHkgY2FsbCBkZXN0cnVjdG9ycywgZXZlbiBmb3IKCSAgICAgIGdhcmJhZ2UtY29sbGVjdGVkIHBvaW50ZXIgb2JqZWN0cy4gIEEgcG9pbnRlciBvYmplY3QKCSAgICAgIHRoYXQgaGFzIGJlZW4gcGFzc2VkIHRvIGEgZGVzdHJ1Y3RvciBpcyBtYXJrZWQgaW4gYQoJICAgICAgc3BlY2lhbCB3YXkgdXNpbmcgYSBuZXcgc21vYiB0eXBlLCAiZGVzdHJveWVkIHN3aWciLgoJICAgICAgKFRoaXMgaGVscHMgYXZvaWQgbmFzdHkgbWVtb3J5IGJ1Z3MsIHdoZXJlIHJlZmVyZW5jZXMgdG8KCSAgICAgIGRlYWQgQyBvYmplY3RzIGFyZSBzdGlsbCBoZWxkIGluIFNjaGVtZS4gTW9yZW92ZXIsIHRoZQoJICAgICAgZ2FyYmFnZSBjb2xsZWN0b3Igd2lsbCBub3QgdHJ5IHRvIGZyZWUgYSBkZXN0cm95ZWQKCSAgICAgIG9iamVjdCBvbmNlIG1vcmUuKQoJICAgICogRGVzdHJ1Y3Rvci1saWtlIGZ1bmN0aW9ucyBjYW4gYWxzbyBtYXJrIHRoZWlyIGFyZ3VtZW50cyAKCSAgICAgIGFzIGRlc3Ryb3llZCBieSBhcHBseWluZyB0aGUgdHlwZW1hcCBTV0lHVFlQRSAqREVTVFJPWUVELgoJICAgICAgKEl0IGNhbGxzIHRoZSBmdW5jdGlvbiBTV0lHX0d1aWxlX01hcmtQb2ludGVyRGVzdHJveWVkLikKCSAgICAqIEZ1bmN0aW9ucyB0aGF0ICJjb25zdW1lIiB0aGVpciBvYmplY3RzIChvciB0aGF0ICJvd24iCgkgICAgICB0aGVtIGFmdGVyIHRoZSBjYWxsKSBjYW4gbWFyayB0aGVpciBhcmd1bWVudHMgYXMKCSAgICAgIG5vdCBnYXJiYWdlIGNvbGxlY3RhYmxlLiAgVGhpcyBjYW4gYmUgZG9uZSBieSBhcHBseWluZwoJICAgICAgdGhlIHR5cGVtYXAgU1dJR1RZUEUgKkNPTlNVTUVELiAgKEl0IGNhbGxzIHRoZSBmdW5jdGlvbgoJICAgICAgU1dJR19HdWlsZV9NYXJrUG9pbnRlck5vbmNvbGxlY3RhYmxlLikKCSAgICAqIFRoZSBtYWNybyBUWVBFTUFQX1BPSU5URVJfSU5QVVRfT1VUUFVUIGZyb20gbGlicmFyeQoJICAgICAgcG9pbnRlci1pbi1vdXQuaSBjcmVhdGVzIGFkZGl0aW9uYWwgdHlwZW1hcHMgCgkgICAgICBQVFJUWVBFICpJTlBVVF9DT05TVU1FRCwgUFRSVFlQRSAqSU5QVVRfREVTVFJPWUVELgoJICAgICAgVGhleSBtYXJrIHRoZSBwYXNzZWQgcG9pbnRlciBvYmplY3QgbGlrZXdpc2UuCgkgICAgICBUaGUgdHlwZW1hcCBQVFJUWVBFICpPVVRQVVQgY3JlYXRlcyBhIGdhcmJhZ2UtY29sbGVjdGFibGUKCSAgICAgIHBvaW50ZXIgb2JqZWN0LCBsaWtlICVuZXdvYmplY3QgZG9lcyBmb3IgYSByZXR1cm5lZCAKCSAgICAgIHBvaW50ZXIuICBVc2UgdGhlIG5ldyB0eXBlbWFwIFBUUlRZUEUgKk9VVFBVVF9OT05DT0xMRUNUQUJMRQoJICAgICAgdG8gY3JlYXRlIGEgcG9pbnRlciBvYmplY3QgdGhhdCB3aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KCjExLzE3LzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEhhbmRsZSAkaW5wdXQgaW4gImZyZWVhcmciIHR5cGVtYXBzLgoJICAgIE5ldmVyIHF1YWxpZnkgR09PUFMgc2xvdCBuYW1lcyB3aXRoIHRoZSBjbGFzcyBuYW1lLiAKCSAgICBIYW5kbGUgb3B0aW9uYWwgYXJndW1lbnRzIHByb3Blcmx5IGluIHRoZSBHT09QUyBtZXRob2RzLgoKMTEvMTYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBpbnN0YWxsYXRpb24gdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBBdXRvbWFrZS0xLjguCiAgICAgICAgICAgIG1raW5zdGFsbGRpcnMgd2FzIGJlaW5nIHVzZWQgYnkgYSBub24tQXV0b21ha2UgbWFrZWZpbGUuIAogICAgICAgICAgICBta2luc3RhbGxkaXJzIGlzIGJlaW5nIHBoYXNlZCBvdXQgYW5kIHNvIHdhcyBub3QgYmVpbmcKICAgICAgICAgICAgY3JlYXRlZCBieSBBdXRvbWFrZS4gaW5zdGFsbC1zaCB1c2VkIGluc3RlYWQuCgoxMS8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIE51bWVyb3VzIGRpcmVjdG9yIGltcHJvdmVtZW50cywgdHdlYWtzIGFuZCBidWcgZml4ZXMgc2luY2UgCiAgICAgICAgICAgIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9uIGhhdmUgYmVlbiBjb250cmlidXRlZCBieSBTY290dCBNaWNoZWwuCgoxMS8xMi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIFdoZW4gJWZlYXR1cmUoInNoYWRvdyIpIGlzIHVzZWQgdG8gYWRkIGNvZGUgdG8gc2hhZG93CiAgICAgICAgICAgIGNsYXNzZXMsIHRoZSBzcGVjaWFsIHZhcmlhYmxlICRhY3Rpb24gZXhwYW5kcyB0byB0aGUgbmFtZSBvZiB0aGUKICAgICAgICAgICAgdW5kZXJseWluZyB3cmFwcGVyIGZ1bmN0aW9uIHRoYXQgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCBub3JtYWxseS4KCjExLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gV2hlbiBnZW5lcmF0aW5nIHByb3h5IGNsYXNzIGNvZGUsIFNXSUcgZW1pdHMgYSBmZXcKICAgICAgICAgICAgZGVmYXVsdCBtZXRob2RzIGZvciBfX3JlcHJfXygpIGFuZCBvdGhlciBQeXRob24gc3BlY2lhbAogICAgICAgICAgICBtZXRob2RzLiAgU29tZSBvZiB0aGVzZSBtZXRob2RzIGFyZSBlbWl0dGVkIGFmdGVyIGFsbCBvZiB0aGUKICAgICAgICAgICAgY29udGVudHMgb2YgYSBjbGFzcy4gSG93ZXZlciwgdGhpcyBtYWtlcyBpdCBoYXJkIHRvIG92ZXJyaWRlCiAgICAgICAgICAgIHRoZSBtZXRob2RzIHVzaW5nICVweXRob25jb2RlIGFuZCBzb21lIG90aGVyIGRpcmVjdGl2ZXMgdGhhdAogICAgICAgICAgICBhbGxvdyBjb2RlIHRvIGJlIGluc2VydGVkIGludG8gYSBjbGFzcy4gIFRoZXNlIHNwZWNpYWwgbWV0aG9kcwogICAgICAgICAgICBhcmUgbm93IGVtaXR0ZWQgaW50byB0aGUgY29kZSAqYmVmb3JlKiBhbGwgb2YgdGhlIG90aGVyIG1ldGhvZHMuCiAgICAgICAgICAgIFN1Z2dlc3RlZCBieSBFcmljIEpvbmVzLgogCjExLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUHJlcHJvY2Vzc29yIGVuaGFuY2VtZW50LiAgIEZvciBpbmNsdWRlIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgImZvby9iYXIuaSIKCiAgICAgICAgICAgIHRoZSBkaXJlY3RvcnkgImZvbyIgaXMgbm93IGFkZGVkIHRvIHRoZSBzZWFyY2ggcGF0aCB3aGlsZSAKICAgICAgICAgICAgcHJvY2Vzc2luZyB0aGUgY29udGVudHMgb2YgYmFyLmkuICBUaHVzLCBpZiBiYXIuaSBpbmNsdWRlcyBvdGhlcgogICAgICAgICAgICBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnksIHRoZXkgd2lsbCBiZSBmb3VuZC4gUHJldmlvdXNseSwKICAgICAgICAgICAgeW91IHdvdWxkIGhhdmUgdG8gYWRkIGFkZGl0aW9uYWwgZGlyZWN0b3JpZXMgdXNpbmcgLUkgdG8gbWFrZSB0aGlzCiAgICAgICAgICAgIHdvcmsgY29ycmVjdGx5LiAgTm90ZTogdGhlIEMgcHJlcHJvY2Vzc29yIHNlZW1zIHRvIGJlaGF2ZSBpbgogICAgICAgICAgICBhbiBpZGVudGljYWwgbWFubmVyIG9uIG1hbnkgKG1vc3Q/IGFsbD8pIHN5c3RlbXMuCiAgICAgICAgICAgIFN1Z2dlc3RlZCBieSBLZXJpbSBCb3JjaGFldi4KCjExLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIG9uIE1hYyBPUyBYIDEwLjMueCAoUGFudGhlcikuCiAgICAgICAgICAgIFRlc3RlZCB3aXRoIFB5dGhvbiwgVGNsLCBQZXJsLCBhbmQgUnVieS0tLWFsbCBvZiB3aGljaCBzZWVtIHRvIHdvcmsuCgoxMS8wOC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVkIHRoZSB0eXBlbWFwcyBpbiB2YXJpb3VzLmkgd2hpY2ggd2VyZSBtb3N0bHkgYnJva2VuLgogICAgICAgICAgICBjaGFyICoqU1RSSU5HX0lOIGFuZCBjaGFyICoqU1RSSU5HX1JFVCB0eXBlbWFwcyByZXBsYWNlZCB3aXRoIAogICAgICAgICAgICBTVFJJTkdfQVJSQVkuIGZsb2F0ICpGTE9BVF9BUlJBWV9SRVRVUk4gdHlwZW1hcCByZW1vdmVkLgoKMTEvMDgvMjAwMzogYmVhemxleQogICAgICAgICAgICBbVGNsXSBUY2wgbW9kdWxlIG5vdyBlbWl0cyBhIHNhZmUgbW9kdWxlIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGJ5CiAgICAgICAgICAgIGRlZmF1bHQuICBJdCBjYW4gYmUgcmVtb3ZlZCBieSBydW5uaW5nICdzd2lnIC1ub3NhZmUnLgoKMTEvMDQvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gT25seSB1c2UgdGhlIFNDTV8gQVBJIHdoZW4gdGhlIGZ1bmN0aW9uCgkgICAgYHNjbV9zbG90X2V4aXN0c19wJyBleGlzdHMgKG5lZWRlZCBmb3IgR09PUFMgc3VwcG9ydCkuICAKCSAgICBUaGlzIGZ1bmN0aW9uIHdhcyByZW5hbWVkIGR1cmluZyB0aGUgR3VpbGUgMS41IHNlcmllcwoJICAgIGZyb20gYHNjbV9zbG90c19leGlzdHNfcCcuCgkgICAgUmVwb3J0IHRoZSByaWdodCBydW50aW1lIGxpYnJhcnkgd2hlbiBpbnZva2VkIHdpdGgKCSAgICAtc2NtIC1sZGZsYWdzLgoKMTEvMDMvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBGaXggIzc4MjA1Mi4gIFRoZSAtLXdpdGgtY2hpY2tlbmNmZyBjb25maWd1cmUKCSAgICBvcHRpb24gKGFuZCBvdGhlcnMpIHdlcmUgbm90IGFjY2VwdGVkLgoKMTEvMDIvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtHdWlsZV0gTWVyZ2UgbmV3IHNldCBvZiBHT09QUyBjaGFuZ2VzIGJ5IEpvaG4gTGVuei4KCSAgICBHT09QUyBvYmplY3RzIGFyZSBub3cgbWFuaXB1bGF0ZWQgZGlyZWN0bHkgYnkgdGhlIEMgY29kZS4KCSAgICBTb21lIGZpeGVzIHRvIHR5cGVtYXAtR09PUFMgaW50ZXJhY3Rpb24uCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBSZW1vdmUgdGhlIGZpbGUgYXJndW1lbnQgdG8gLXNjbXN0dWIgYW5kIC1nb29wcy4KCSAgICBUaGUgU2NoZW1lIGZpbGVzIGFyZSBub3cgYWx3YXlzIGNhbGxlZCBNT0RVTEUuc2NtIG9yCgkgICAgTU9EVUxFLXByaW1pdGl2ZS5zY20sIHdoZXJlIE1PRFVMRSBpcyB0aGUgbW9kdWxlIG5hbWUgYW5kIAoJICAgICJwcmltaXRpdmUiIGNhbiBiZSBjaGFuZ2VkIGJ5IHRoZSAtcHJpbXN1ZmZpeCBvcHRpb24uCgkgICAgVGhlIFNjaGVtZSBmaWxlcyBhcmUgbm93IHBsYWNlZCBpbiB0aGUgZGlyZWN0b3J5IGdpdmVuIGJ5CgkgICAgdGhlIC1vdXRkaXIgb3B0aW9uLCBvciB0aGUgY3VycmVudCBkaXJlY3RvcnkuCgkgICAgKFBhdGNoIGJ5IEpvaG4gTGVueiwgc2xpZ2h0bHkgbW9kaWZpZWQuKQoKCSAgICAqKiogSU5DT01QQVRJQklMSVRZIFtHdWlsZV0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgVW5pZnkgdGhlIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4gIFRoZSBzdGFuZGFyZAoJICAgIGZ1bmN0aW9ucyBhcmU6CgkgICAgICogU1dJR19OZXdQb2ludGVyT2JqIChQT0lOVEVSLCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gQ3JlYXRlIGFuIHNjcmlwdGluZyBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgdHlwZWQKCQkgICBwb2ludGVyLiBGTEFHUyBhcmUgbGFuZ3VhZ2Ugc3BlY2lmaWMuCgkgICAgICogU1dJR19Db252ZXJ0UHRyIChJTlBVVCwgUkVTVUxULCBUWVBFLCBGTEFHUykKCSAgICAgICAgLS0gR2V0IGEgcG9pbnRlciBmcm9tIHRoZSBzY3JpcHRpbmcgb2JqZWN0IElOUFVUIGFuZAoJCSAgIHN0b3JlIGl0IGluIHRoZSBwbGFjZSBSRVNVTFQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCAKCQkgICBvY2N1cnMsIHJldHVybiBub256ZXJvLgoJICAgICAqIFNXSUdfTXVzdEdldFB0ciAoSU5QVVQsIFRZUEUsIEFSR05VTSwgRkxBR1MpCgkgICAgICAgIC0tIEdldCBhIHBvaW50ZXIgZnJvbSB0aGUgc2NyaXB0aW5nIG9iamVjdCBJTlBVVCBhbmQKCQkgICByZXR1cm4gaXQuICBXaGVuIGEgdHlwZSBtaXNtYXRjaCBvY2N1cnMsIHRocm93IGFuCgkJICAgZXhjZXB0aW9uLiAgSWYgQVJHTlVNID4gMCwgcmVwb3J0IGl0IGFzIHRoZSAKCQkgICBhcmd1bWVudCBudW1iZXIgdGhhdCBoYXMgdGhlIHR5cGUgbWlzbWF0Y2guCiAgICAgICAgICAgIFtHdWlsZV06ICAgIE5vIGNoYW5nZXMuCgkgICAgW016U2NoZW1lXTogTm8gY2hhbmdlcy4KCSAgICBbUGVybF06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iai4KCQkgICAgICAgIFRoZSBmdW5jdGlvbiBTV0lHX01ha2VQdHIgaXMga2VwdC4KCQkJVGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ciBpcyBjdXJyZW50bHkgbm90CgkJCXN1cHBvcnRlZC4KCSAgICBbUHl0aG9uXTogICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbUnVieV06ICAgICBBZGQgdGhlIGZ1bmN0aW9uIFNXSUdfTXVzdEdldFB0ci4KCSAgICBbVGNsXTogICAgICBSZW1vdmUgdGhlICJpbnRlcnAiIGFyZ3VtZW50IG9mCgkJICAgICAgICBTV0lHX05ld0luc3RhbmNlT2JqLCBTV0lHX0NvbnZlcnRQdHIsCgkJICAgICAgICBTV0lHX0NvbnZlcnRQYWNrZWQsIGFuZCBTV0lHX0NvbnZlcnRQdHJGcm9tU3RyaW5nLgoJCQlUaGUgZnVuY3Rpb24gU1dJR19NdXN0R2V0UHRyIGlzIGN1cnJlbnRseSAKCQkJbm90IHN1cHBvcnRlZC4KCSAgICBObyBjaGFuZ2VzIHRvIFBpa2UgYmVjYXVzZSBpdHMgcG9pbnRlciBjb252ZXJzaW9uIGNvZGUgZGlkCgkgICAgbm90IGxvb2sgY29tcGxldGUuICBObyBjaGFuZ2VzIHRvIFBIUDQsIGJlY2F1c2UgSSBkaWQgbm90CgkgICAgdW5kZXJzdGFuZCBpdHMgcnVudGltZSBjb2RlLiAgTm8gY2hhbmdlcyB0byBDaGlja2VuCgkgICAgYmVjYXVzZSBtYWpvciBjaGFuZ2VzIGFyZSBleHBlY3RlZCBzb29uIGFueXdheS4gIE5vCgkgICAgY2hhbmdlcyB0byBKYXZhLCBPQ2FtbCwgQyMgYmVjYXVzZSB0aGV5IGRvIG5vdCBzZWVtIHRvCgkgICAgaGF2ZSBhIHBvaW50ZXItY29udmVyc2lvbiBydW50aW1lIEFQSS4KCiAgICAgICAgICAgICoqKiBJTkNPTVBBVElCSUxJVFkgW1RjbF0gKioqCgoxMS8wMi8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW1Blcmw1LCBQSFA0LCBQaWtlLCBQeXRob24sIFJ1YnksIFRjbF06IFVzZSB0aGUKCSAgICBwcmVwcm9jZXNzb3IgdG8gcmVuYW1lIGV4dGVybmFsIGZ1bmN0aW9ucyBvZiB0aGUgU1dJRwoJICAgIHJ1bnRpbWUgQVBJIHRvIGZvbGxvdyB0aGUgbmFtaW5nIGNvbnZlbnRpb24KCSAgICBTV0lHXzxsYW5ndWFnZT5fPGZ1bmN0aW9uPi4gIFRoaXMgc2hvdWxkIGFsbG93IGxpbmtpbmcKCSAgICBtb3JlIHRoYW4gb25lIGludGVycHJldGVyIGludG8gYSBwcm9ncmFtLgoKMTAvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRml4IHNpbmNlIGludHJvZHVjaW5nIHRoZSBleGNlcHRpb24gYW5kIHN0ZDo6c3RyaW5nIGRlbGVnYXRlcy4KICAgICAgICAgICAgVGhlIGZpeCBvdmVyY29tZXMgbGlua2VyIGVycm9ycyB3aGVuIHVzaW5nIG1vcmUgdGhhbiBvbmUgU1dJRyBtb2R1bGUuCiAgICAgICAgICAgIFByb2JsZW0gcmVwb3J0ZWQgYnkgQW5kcmVhcyBTY2j2cmsuCgoxMC8zMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBwYXRjaDogWyA4MjMzMDIgXSBJbmNyIFRjbCBzdXBwb3J0LgogICAgICAgICAgICBDb250cmlidXRlZCBieSBBbGV4ZXkgRHlhY2hlbmtvLgogICAgICAgICAgICBOb3RlOiBuZWVkcyBkb2N1bWVudGF0aW9uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzI1IF0gbmV3IFB5dGhvbiBNb2R1bGUgb3B0aW9ucyBhbmQgZmVhdHVyZXMuCiAgICAgICAgICAgIFJvYmluIER1bm4gd3JpdGVzOgoKICAgICAgICAgICAgVGhpcyBwYXRjaCBtYWtlcyBhIG51bWJlciBvZiBjaGFuZ2VzIHRvIHRoZSBTV0lHIHB5dGhvbiBtb2R1bGUuCgogICAgICAgICAgICAxLiBBZGQgLWFwcGx5IG9wdGlvbiwgYW5kIGNoYW5nZSB0aGUgZGVmYXVsdCBjb2RlCiAgICAgICAgICAgIG91dHB1dCB0byB1c2UgdGhlIGZvbygqYXJncywgKiprdykgY2FsbGluZyBzeW50YXgKICAgICAgICAgICAgaW5zdGVhZCBvZiB1c2luZyBhcHBseSgpLiBJZiB0aGUgLWFwcGx5IG9wdGlvbiBpcwogICAgICAgICAgICBnaXZlbiB0aGVuIGNvZGUgaXMgZ2VuZXJhdGVkIGFzIGJlZm9yZS4gVGhpcyBpcyB2ZXJ5CiAgICAgICAgICAgIHNpbWlsYXIgdG8gUGF0Y2ggIzczNzI4MSBidXQgdGhlIG5ldyAtbW9kZXJuIG9wdGlvbgogICAgICAgICAgICBtYWtlcyB0aGUgc2Vjb25kIGhhbGYgb2YgdGhhdCBwYXRjaCB1bm5lY2Vzc2FyeSBzbyBpdAogICAgICAgICAgICBpcyBub3QgaW5jbHVkZWQgaGVyZS4KCSAgICAKICAgICAgICAgICAgMi4gQWRkIC1uZXdfcmVwciBvcHRpb24uIFRoaXMgaXMgdGhlIHNhbWUgYXMgbXkgUGF0Y2gKICAgICAgICAgICAgIzc5NzAwMiB3aGljaCBJIHdpbGwgbWFyayBhcyBjbG9zZWQgc2luY2UgaXQgaXMgbm8KICAgICAgICAgICAgbG9uZ2VyIG5lZWRlZC4gV2hlbiB0aGlzIG5ldyBvcHRpb24gaXMgdXNlZCB0aGVuIHRoZQogICAgICAgICAgICBfX3JlcHJfXyBtZXRob2RzIHRoYXQgYXJlIGdlbmVyYXRlZCBmb3IgcHJveHkgY2xhc3NlcwogICAgICAgICAgICB3aWxsIGJlIG1vcmUgaW5mb3JtYXRpdmUgYW5kIGdpdmUgZGV0YWlscyBhYm91dCB0aGUKICAgICAgICAgICAgcHl0aG9uIGNsYXNzIGFuZCB0aGUgQysrIGNsYXNzLgoJICAgIAogICAgICAgICAgICAzLiBBZGQgJWZlYXR1cmUoImFkZHRvZnVuYyIpLiBJdCBhbGxvd3MgeW91IHRvIGluc2VydAogICAgICAgICAgICBvbmUgb3IgbW9yZSBsaW5lcyBvZiBjb2RlIGluc2lkZSB0aGUgc2hhZG93IG1ldGhvZCBvcgogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGlzIGFscmVhZHkgZ2VuZXJhdGVkLCBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHJlcGxhY2luZyB0aGUgd2hvbGUgdGhpbmcgbGlrZSAlZmVhdHVyZSgic2hhZG93IikgZG9lcy4KICAgICAgICAgICAgRm9yIF9faW5pdF9fIGl0IGdvZXMgYXQgdGhlIGVuZCwgZm9yIF9fZGVsX18gaXQgZ29lcwogICAgICAgICAgICBhdCB0aGUgYmVnaW5pbmcgYW5kIGZvciBhbGwgb3RoZXJzIHRoZSBjb2RlIGdlbmVyYXRlZAogICAgICAgICAgICBpcyBleHBhbmRlZCBvdXQgdG8gYmUgbGlrZQoJICAgIAogICAgICAgICAgICBkZWYgQmFyKCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIHZhbCA9IF9tb2R1bGUuRm9vX0JhcigqYXJncywgKiprd2FyZ3MpCiAgICAgICAgICAgIHJldHVybiB2YWwKCSAgICAKICAgICAgICAgICAgYW5kIHRoZSAiYWRkdG9mdW5jIiBjb2RlIGlzIGluc2VydGVkIGp1c3QgYmVmb3JlIHRoZQogICAgICAgICAgICByZXR1cm4gc3RhdGVtZW50LiBJZiB0aGUgZmVhdHVyZSBpcyBub3QgdXNlZCBmb3IgYQogICAgICAgICAgICBwYXJ0aWN1bGFyIG1ldGhvZCBvciBmdW5jdGlvbiB0aGVuIHRoZSBzaG9ydGVyIGNvZGUgaXMKICAgICAgICAgICAgZ2VuZXJhdGVkIGp1c3QgbGlrZSBiZWZvcmUuCgkgICAgCiAgICAgICAgICAgIDQuIEEgbGl0dGxlIGJpdCBvZiByZWZhY3RvcmluZyB0byBtYWtlIGltcGxlbWVudGluZwogICAgICAgICAgICBhZGR0b2Z1bmMgYSBsaXR0bGUgZWFzaWVyLgoJICAgIAogICAgICAgICAgICA1LiBBZGRlZCBhIC1tb2Rlcm4gY29tbWFuZC1saW5lIGZsYWcgdGhhdCB3aWxsIGNhdXNlCiAgICAgICAgICAgIFNXSUcgdG8gb21pdCB0aGUgY3J1ZnQgaW4gdGhlIHByb3h5IG1vZHVsZXMgdGhhdCBhbGxvd3MKICAgICAgICAgICAgaXQgdG8gd29yayB3aXRoIHZlcnNpb25zIG9mIFB5dGhvbiBwcmlvciB0byAyLjIuIFRoZQogICAgICAgICAgICByZXN1bHQgaXMgYSBzaW1wbGVyLCBjbGVhbmVyIGFuZCBmYXN0ZXIgcHl0aG9uIHByb3h5CiAgICAgICAgICAgIG1vZHVsZSwgYnV0IG9uZSB0aGF0IHJlcXVpcmVzIFB5dGhvbiAyLjIgb3IgZ3JlYXRlci4gCgoxMC8zMS8yMDAzOiBiZWF6bGV5IAogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE5IF0gWE1MIG1vZHVsZSB0d2Vha3MuCiAgICAgICAgICAgIFRoaXMgYWRkcyBhIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uIC14bWxsaXRlIHRoYXQgCiAgICAgICAgICAgIGdyZWF0bHkgcmVkdWNlcyB0aGUgYW1vdW50IG9mIGVtaXR0ZWQgWE1MIGNvZGUgYnkKICAgICAgICAgICAgZWxpbWluYXRpbmcgc29tZSBmaWVsZHMgbW9zdGx5IHVzZWQgaW4gU1dJRydzCiAgICAgICAgICAgIGludGVybmFsIHByb2Nlc3NpbmcuICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMzEvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgcGF0Y2g6IFsgODI5MzE3IF0gQWRkcyBEb2hTcGxpdExpbmVzIGZ1bmN0aW9uLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKMTAvMjkvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDgyNzkwNyBdIGFyZ291dCBvYmplY3RzIG5vdCBiZWluZyB3cmFwcGVkIHByb3Blcmx5IChQQVRIKS4KICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgkgICAgIAoxMC8yOS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODI2OTk2IF0gcGVybCB0eXBlIGNoZWNraW5nIGlnbm9yZXMgcGVybCBzdWJjbGFzc2VzLgogICAgICAgICAgICBUaGlzIGVuaGFuY2VtZW50IG1ha2VzIGl0IHNvIHdyYXBwZWQgY2xhc3NlcyBhbmQgc3RydWN0cyBjYW4KICAgICAgICAgICAgYmUgc3ViY2xhc3NlZCBpbiBQZXJsIGFuZCB1c2VkIG5vcm1hbGx5LiAKICAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgU2FsdmFkb3IgRmFuZGnxbyBHYXJj7WEuCgoxMC8xNi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbnRQdHIgbWFyc2hhbGxlZCB3aXRoIGEgdm9pZCogaW5zdGVhZCBvZiBpbnQgaW4gQyBmdW5jdGlvbiAKICAgICAgICAgICAgZGVjbGFyYXRpb25zLiBUaGUgY2FzdHMgdGh1cyBsb29rIG1vcmUgY29udmVudGlvbmFsLCBmb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAvLyBvbGQKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KGludCBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAqKFNoYXBlICoqKSZqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBuZXcKICAgICAgICAgICAgICAgIERsbEV4cG9ydCBkb3VibGUgU1dJR1NURENBTEwgQ1NoYXJwX2dldF9TaGFwZV94KHZvaWQgKiBqYXJnMSkgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFNoYXBlICphcmcxID0gKFNoYXBlICopIDAgOwogICAgICAgICAgICAgICAgICAgIGFyZzEgPSAoU2hhcGUgKilqYXJnMTsgCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgoKMTAvMTQvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzIGFuZCBzbWFydCBwb2ludGVycy4KICAgICAgICAgICAgSWYgYSBjbGFzcyBoYXMgb3ZlcmxvYWRlZCBtZXRob2RzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50IHgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50IGJhcihpbnQgeCwgaW50IHkpOwogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBhbmQgdGhlIGNsYXNzIGlzIHVzZWQgYXMgYSBzbWFydCBwb2ludGVyOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvb1B0ciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBTV0lHIHdvdWxkIHRyeSB0byBleHBvc2UgdGhlIHN0YXRpYyBtZW1iZXIgRm9vOjpiYXIKICAgICAgICAgICAgdGhyb3VnaCBGb29QdHItLS1yZXN1bHRpbmcgYm9ndXMgd3JhcHBlciBjb2RlIGFuZCBhIGNvbXBpbGVyCiAgICAgICAgICAgIGVycm9yLgoKICAgICAgICAgICAgRHVlIHRvIHRoZSB3YXkgaW4gd2hpY2ggb3ZlcmxvYWRpbmcgaXMgaGFuZGxlZCwgaXQgaXMKICAgICAgICAgICAgZXh0cmVtZWx5IGRpZmZpY3VsdCB0byBlbGltaW5hdGUgdGhlIHN0YXRpYyBtZXRob2QgaW4KICAgICAgICAgICAgdGhpcyBjYXNlLiAgVGhlcmVmb3JlLCBpdCBpcyBzdGlsbCBleHBvc2VkLiAgSG93ZXZlciwKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBjb2RlIG5vdyBjb21waWxlcyBhbmQgd29ya3MuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlLCBNelNjaGVtZSwgQ2hpY2tlbl06IFJlbW92ZSBzeW1ib2wgY2xhc2hlcyBiZXR3ZWVuCgkgICAgdGhlIHJ1bnRpbWUgbGlicmFyaWVzIGJ5IHJlbmFtaW5nIGFsbCBleHRlcm4gY29tbW9uLnN3ZwoJICAgIGZ1bmN0aW9ucyB3aXRoIHRoZSBwcmVwcm9jZXNzb3IuCgoxMC8wNS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBBZGRlZCBiYXNpYyBHT09QUyBzdXBwb3J0LCBjb250cmlidXRlZCBieSBKb2huIExlbnouCgkgICAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgoJICAgIAogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMC8wNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBOZXcgb3B0aW9uLCAtb25seS1zZXR0ZXJzLCB3aGljaCBkaXNhYmxlcwoJICAgIHRyYWRpdGlvbmFsIGdldHRlciBhbmQgc2V0dGVyIHByb2NlZHVyZXMgZm9yIHN0cnVjdHVyZSBzbG90cy4KCjEwLzAzLzIwMDM6IG1rb2VwcGUgKE1hdHRoaWFzIEtvZXBwZSkKCSAgICBbR3VpbGVdIEFkZGVkIHJ1biB0ZXN0IGZvciByZWZlcmVuY2VfZ2xvYmFsX3ZhcnMgYnkgSm9obiBMZW56LgoKMDkvMzAvMjAwMzogYmVhemxleQogICAgICAgICAgICBQYXJ0aWFsIHNvbHV0aW9uIHRvIFsgNzkyMTgwIF0gQysrIHNtYXJ0LXBvaW50ZXIvbmFtZXNwYWNlIG1peHVwIHJldmlzaXRlZC4KICAgICAgICAgICAgVGhlIHByb2JsZW0gaXMgbm90IGVhc3kgdG8gZml4IChhdCBsZWFzdCBpdCBkb2Vzbid0IHNlZW0gc28pLCBidXQgaXMKICAgICAgICAgICAgcmVsYXRlZCB0byB0aGUgaW5zdGFudGlhdGlvbiBvZiBxdWFsaWZpZWQgdGVtcGxhdGVzIGluc2lkZSBvZiBvdGhlcgogICAgICAgICAgICBuYW1lc3BhY2VzLiAgIFNXSUcgbm93IGdlbmVyYXRlcyBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZSByYXRoZXIKICAgICAgICAgICAgdGhhbiBnZW5lcmF0aW5nIGJyb2tlbiB3cmFwcGVycy4KCjA5LzMwLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA4MDAwMTIgXSBFTlRFUiBtYWNybyBmcm9tIENPUkUvc2NvcGUuaCBjbGFzaGVzIHdpdGggbGliYyBzZWFyY2guaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJpdHRvbiBMZW8gS2VyaW4uCgowOS8zMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODExNTE4IF0gQ2FzdGluZyBpbnRzIHRvIGRvdWJsZXMgKHcvIHNvbHV0aW9uPykKICAgICAgICAgICAgQWRkcmVzc2VzIGEgcHJvYmxlbSB3aXRoIG92ZXJsb2FkaW5nIGluIHRoZSBQZXJsIG1vZHVsZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgR2VyYWxkIERhbGxleS4KCjA5LzI4LzIwMDM6IG1rb2VwcGUKCSAgICBbR3VpbGUgd2l0aCAtc2NtIG9wdGlvbl0gRml4IHR5cG8gaW4gZ2VuZXJhdGVkIGNvZGUgZm9yCgkgICAgcHJvY2VkdXJlcy13aXRoLXNldHRlcnMuICBSZXBvcnRlZCBieSBKb2huIExlbnouCgowOS8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgODEyNTI4IF0gZXh0ZXJucyBub3QgY29ycmVjdCB3aGVuIHRocm93IGlzIGluIHNpZ25hdHVyZS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9zZXBoIFdpbnN0b24uCiAgICAgICAgICAgIAowOS8yMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgU1dJRyB3YXMgZ2VuZXJhdGluZyBhIG51bWJlciBvZiBzeW1ib2xzIHRoYXQgZGlkbid0IGNvbXBseSB3aXRoIAogICAgICAgICAgICB0aGUgSVNPIEMvQysrIHN0YW5kYXJkLCBpbiBwYXJ0aWN1bGFyIElTTy9JRUMgMTQ4ODI6MTk5OChFKSAxNy40LjMuMS4yCiAgICAgICAgICAgIHdoZXJlIGRvdWJsZSB1bmRlcnNjb3JlcyBhcmUgZm9yYmlkZGVuIGFzIHdlbGwgYXMgc3ltYm9scyBzdGFydGluZyB3aXRoCiAgICAgICAgICAgIGFuIHVuZGVyc2NvcmUgZm9sbG93ZWQgYnkgYW4gdXBwZXIgY2FzZSBsZXR0ZXIuIE1vc3Qgb2YgdGhlc2UgaGF2ZQogICAgICAgICAgICBiZWVuIHJvb3RlZCBvdXQuIFNlZSBuZXcgc2VjdGlvbiBhZGRlZCB0byBpbnRlcm5hbHMuaHRtbCBkZXZlbG9wbWVudAogICAgICAgICAgICBtYW51YWwgJ1N5bWJvbCBOYW1pbmcgR3VpZGVsaW5lcyBmb3IgR2VuZXJhdGVkIEMvQysrIENvZGUnLgoKMDkvMjMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpcmVjdG9yIHR5cGVtYXAgbmFtZSBjaGFuZ2VzOgogICAgICAgICAgICBpbnYgICAgID0+IGRpcmVjdG9yaW4KICAgICAgICAgICAgb3V0diAgICA9PiBkaXJlY3Rvcm91dAogICAgICAgICAgICBhcmdvdXR2ID0+IGRpcmVjdG9yYXJnb3V0CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzE5LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFtQeXRob25dIERpcmVjdG9yIGNvbnN0cnVjdG9ycyBub3cgZGVmYXVsdCB0byBfX2Rpc293biA9IDAsIAoJICAgIHdoaWNoIGlzIHRoZSBpbnRlbmRlZCBiZWhhdmlvciBhbmQgZml4ZXMgdGhlIGRpcmVjdG9yX2ZpbmFsaXplciAKCSAgICB0ZXN0IGNhc2UgdW5kZXIgcHl0aG9uLgoKMDkvMTIvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gLSBUeXBlbWFwcyBhZGRlZCBmb3Igc3RkOjpzdHJpbmcgYW5kIGNvbnN0IHN0ZDo6c3RyaW5nICYuCiAgICAgICAgICAgICAgICAgLSBOZXcgZGVsZWdhdGUgZm9yIGNyZWF0aW5nIGEgQyMgc3RyaW5nIGdpdmVuIGEgY2hhciAqLiBJdAogICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgYnkgY2FsbGluZyBTV0lHX2NzaGFycF9zdHJpbmdfY2FsbGJhY2sgYXMgc2hvd24KICAgICAgICAgICAgICAgICAgIGluIHRoZSBzdGQ6OnN0cmluZyAnb3V0JyB0eXBlbWFwLiBVc2VmdWwgaWYgdGhlIHJldHVybiB0eXBlIGlzCiAgICAgICAgICAgICAgICAgICBtYXBwZWQgdG8gYSBDIyBzdHJpbmcgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIAogICAgICAgICAgICAgICAgICAgZm9yIGNsZWFuaW5nIHVwIG1lbW9yeSBhcyB0aGUgQyMgZ2FyYmFnZSBjb2xsZWN0b3IgZG9lc24ndAogICAgICAgICAgICAgICAgICAgZnJlZSB0aGUgbWVtb3J5IGNyZWF0ZWQgaW4gQy9DKysgYW5kIHRoZW4gcmV0dXJuZWQgYXMgYSBDIyBzdHJpbmcuCiAgICAgICAgICAgICAgICAgLSBUaGUgZXhjZXB0aW9uIGRlbGVnYXRlcyBoYXZlIG1vdmVkIGludG8gYW4gaW5uZXIgY2xhc3MgaW4gdGhlCiAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGUgY2xhc3MsIHRoZXJlYnkgZnJlZWluZyB1cCB0aGUgc3RhdGljIGNvbnN0cnVjdG9yLgoKMDkvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICAoSW50ZXJuYWxzKQogICAgICAgICAgICBNYWpvciByZWZhY3RvcmluZyBvZiBpdGVyYXRpb24gb3ZlciBsaXN0cyBhbmQgaGFzaGVzLiAgVGhlCiAgICAgICAgICAgIERPSCBsaWJyYXJ5IG5vdyB1c2VzIGl0ZXJhdG9ycy4gIFRoZXkgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgTGlzdCAqbCA9IChzb21lIGxpc3QpOwoKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGk7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGkuaXRlbSBjb250YWlucyB0aGUgYWN0dWFsIGxpc3QgaXRlbS4KICAgICAgICAgICAgICAgICAgICAvLyBpLml0ZW0gaXMgTlVMTCBhdCBlbmQgb2YgbGlzdAogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIEhhc2ggKmggPSAoc29tZSBoYXNoKTsKICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGo7CiAgICAgICAgICAgICAgICBmb3IgKGogPSBGaXJzdChoKTsgai5pdGVtOyBqID0gTmV4dChqKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGouaXRlbSBjb250YWlucyBoYXNoIHRhYmxlIGl0ZW0KICAgICAgICAgICAgICAgICAgICAvLyBqLmtleSAgY29udGFpbnMgaGFzaCB0YWJsZSBrZXkKICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIGouaXRlbSBhbmQgai5rZXkgYXJlIE5VTEwgYXQgZW5kCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgVGhlIG9sZCBpdGVyYXRpb24gZnVuY3Rpb25zIEZpcnN0aXRlbSgpLCBOZXh0aXRlbSgpLCBGaXJzdGtleSgpLAogICAgICAgICAgICBhbmQgTmV4dGtleSgpIGFyZSBnb25lLiAgCgogICAgICAgICAgICBUaGUgbmV3IGl0ZXJhdG9ycyBhcmUgc2ltcGxlciwgcmVzdWx0IGluIGJldHRlciBtZW1vcnkgdXNlLAogICAgICAgICAgICBhbmQgbWF5IGJlIGZhc3Rlci4gIEFsc28sIHRoZXJlIGFyZSBubyBsb25nZXIgYW55IHByb2JsZW1zCiAgICAgICAgICAgIGl0ZXJhdGluZyBvdmVyIHRoZSBzYW1lIGxpc3QvaGFzaCBpbiBtdWx0aXBsZSBwbGFjZXMgYXQKICAgICAgICAgICAgdGhlIHNhbWUgdGltZS4gIEZvciBleGFtcGxlLCB0aGlzIGlzIGZpbmU6CgogICAgICAgICAgICAgICAgIEl0ZXJhdG9yIGksajsKICAgICAgICAgICAgICAgICBmb3IgKGkgPSBGaXJzdChsKTsgaS5pdGVtOyBpID0gTmV4dChpKSkgewogICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IEZpcnN0KGwpOyBqLml0ZW07IGogPSBOZXh0KGopKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgKFRoaXMgbmV2ZXIgd29ya2VkIGluIHByZXZpb3VzIHZlcnNpb25zKS4KICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLiAgVGhpcyB3aWxsIHByb2JhYmx5IGJyZWFrIAogICAgICAgICAgICB0aGlyZCBwYXJ0eSBleHRlbnNpb25zIHRvIFNXSUcgKG9yIGdpdmUgdGhlbSBmdXJ0aGVyIGVuY291cmFnZW1lbnQKICAgICAgICAgICAgdG8gam9pbiB0aGUgU1dJRyBDVlMtdHJlZSA6LSkuCgowOS8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0d1aWxlXSBGaXggbWVtb3J5IGxlYWtzIGluIHRoZSAibGlzdC12ZWN0b3IuaSIgdHlwZW1hcHMuCgowOS8wOS8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIFVzZSBDX21rX2Jvb2wgcmF0aGVyIHRoYW4gQ19ta2Jvb2wuICBUaGlzIGZpeGVzCgkgICAgdGhlIHdyYXBwaW5nIG9mIGJvb2xlYW4gdmFsdWVzIGZvciBDaGlja2VuIDEuMTAgYW5kIG5ld2VyLgoJICAgIFJlcG9ydGVkIGJ5IERhdmUgPGh1bmRvQHlhaG9vLmNvbT4gLyBGZWxpeCBXaW5rZWxtYW5uCgkgICAgPGZlbGl4QHByb3hpbWEtbXQuZGU+LgoKMDkvMDUvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEaXJlY3RvcnMgaW1wbGVtZW50ZWQgZm9yIEphdmEuIEluIHN1bW1hcnkgdGhpcyBpcyBhIGJpZyBuZXcgZmVhdHVyZSAKICAgICAgICAgICAgd2hpY2ggc3VwcG9ydHMgdXBjYWxscyBmcm9tIEMrKyB0byBKYXZhLiBDb2RlIGlzIGdlbmVyYXRlZCB0byBzdXBwb3J0IEMrKyAKICAgICAgICAgICAgY2FsbGJhY2tzIHRvIGNhbGwgaW50byBKYXZhIGFuZCB0cnVlIHBvbHltb3JwaGljIGJlaGF2aW91ciBmb3IgSmF2YSBjbGFzc2VzIAogICAgICAgICAgICBkZXJpdmVkIGZyb20gQysrIGNsYXNzZXMuIFNlZSBqYXZhLmh0bWwgZm9yIGRldGFpbHMuIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBTY290dCBNaWNoZWwuCgowOS8wNS8yMDAzOiBUaWdlcgogICAgICAgICAgICBDcmVhdGVkIGNvbnRyYWN0IGV4YW1wbGUgZGlyZWN0b3J5IGF0IC9TV0lHL0V4YW1wbGVzL2NvbnRyYWN0CiAgICAgICAgICAgIEFkZGVkIHNpbXBsZSBjb250cmFjdCBleGFtcGxlcyAoc2ltcGxlX2MgJiBzaW1wbGVfY3h4KQogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBtb2R1bGUncyBvdXRwdXQgZm9ybWF0CgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8wMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVGVzdC1zdWl0ZSBidWlsZCBpbXByb3ZlbWVudHM6CiAgICAgICAgICAgIC0gTXVsdGlwbGUgYnVpbGQgZGlyZWN0b3JpZXMgd29ya2luZyBmb3IgdGhlIHRlc3Qgc3VpdGUsIHNvIGl0IGlzIG5vdwogICAgICAgICAgICAgIHBvc3NpYmxlIHRvIHJ1biBjb25maWd1cmUgaW4gbXVsdGlwbGUgc3ViZGlyZWN0b3JpZXMgYW5kIHJ1biB0aGUgdGVzdAogICAgICAgICAgICAgIHN1aXRlIGluIGVhY2ggb2YgdGhlc2Ugc3ViIGRpcmVjdG9yaWVzLgogICAgICAgICAgICAtICdtYWtlIGRpc3RjbGVhbicgZml4ZWQgc28gaXQgZG9lc24ndCBib21iIG91dCBvbiB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5CiAgICAgICAgICAgICAgd2hlbiB1c2luZyBtdWx0aXBsZSBzdWJkaXJldG9yeSBidWlsZHMuIFJlcXVpcmVkIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMKICAgICAgICAgICAgICB0byBiZSBtb3ZlZDoKICAgICAgICAgICAgICAgIEV4YW1wbGVzL0dJRlBsb3QvUGVybCAtPiBFeGFtcGxlcy9HSUZQbG90L1Blcmw1CiAgICAgICAgICAgICAgICBFeGFtcGxlcy9HSUZQbG90L1BocCAgLT4gRXhhbXBsZXMvR0lGUGxvdC9QaHA0CiAgICAgICAgICAgICAgVGhlc2UgbmV3IGRpcmVjdG9yaWVzIHVzZWQgdG8gYmUgc3ltYm9saWMgbGlua3MgdG8gdGhlIG9sZCBkaXJlY3RvcnkuCiAgICAgICAgICAgICAgQWxzbyB0aGUgRXhhbXBsZXMvdGVzdC1zdWl0ZS9QZXJsIHN5bWJvbGljIGxpbmsgaGFzIGJlZW4gcmVtb3ZlZC4KICAgICAgICAgICAgLSBSdW5uaW5nIHRoZSB0ZXN0LXN1aXRlLCBvdGhlciB0aGFuIGZyb20gdGhlIHJvb3QgZGlyZWN0b3J5LCBzYXkKICAgICAgICAgICAgICBpbiBFeGFtcGxlcy90ZXN0LXN1aXRlL3B5dGhvbiB3aWxsIG5vdyBkaXNwbGF5IGFsbCB0aGUgY29kZSBiZWluZwogICAgICAgICAgICAgIGV4ZWN1dGVkLgogICAgICAgICAgICAtIFRoZSBmb2xsb3dpbmcgMyBDIyBjb21waWxlcnMgYXJlIGRldGVjdGVkIGR1cmluZyBjb25maWd1cmUgYW5kIHdvcmsgd2l0aCAKICAgICAgICAgICAgICB0aGUgdGVzdC1zdWl0ZTogTW9ubywgUG9ydGFibGUuTkVUIGFuZCBNaWNyb3NvZnQuCgowOS8wMS8yMDAzOiBUaWdlcgogICAgICAgICAgICBBZGRlZCBpbmhlcml0YW5jZSBzdXBwb3J0IGZvciBkZXNpZ24gYnkgY29udHJhY3QgZmVhdHVyZS4KCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTQ5MTQgXSBXcm9uZyB0eXBlcyBpbiB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgU1dJRyB3YXMgbm90IGhhbmRsaW5nIGFyZ3VtZW50cyBjb3JyZWN0bHkgaW4gdGVtcGxhdGUgCiAgICAgICAgICAgIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb288VCAqPiB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgVCAqYmxhaCgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vSW50KSBGb288aW50ICo+OwoKICAgICAgICAgICAgaW4gdGhpcyBjbGFzcywgdGhlIHJldHVybiB0eXBlIG9mIGJsYWggd2FzIHNldCB0bwogICAgICAgICAgICAnaW50ICoqJywgYnV0IGl0IHNob3VsZCByZWFsbHkgYmUgJ2ludCAqJy4gIFRoaXMgaGFzIGJlZW4KICAgICAgICAgICAgZml4ZWQsIGJ1dCBpdCB3aWxsIGFmZmVjdCBhbGwgcHJpb3IgdXNlcyBvZiBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uLgogCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3ODYzOTQgXSBQYXRjaCBmb3IgZ2VuZXJhdGVkIHBlcmwgY29kZSBkb2VzIG5vdCBjb21waWxlIHVuZGVyIFJlZEhhdDkuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNjb3R0IEZpbm5lcmFuLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5MTU3OSBdICh1bnNpZ25lZCkgbG9uZyBsb25nIGhhbmRsZWQgaW5jb3JyZWN0bHkgKFRjbCkuCiAgICAgICAgICAgIFRoaXMgd2FzIGFuIGVycm9yIGluIHRoZSBUY2wgdHlwZW1hcHMuaSBmaWxlLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgS2plbGwgV29vZGluZy4KICAgICAgICAKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5NzU3MyBdIG5vIHdheSB0byByZW5hbWUgY2xhc3NlcyBjb21pbmcgZnJvbSBDIHN0cnVjdHVyZXMuCiAgICAgICAgICAgIFRoaXMgcHJvYmxlbSByZWxhdGVzIHRvIHJlbmFtaW5nIG9mIGFub255bW91cyBzdHJ1Y3R1cmVzIHdpdGggYQogICAgICAgICAgICB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6IAoKICAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfSBGb287CgogICAgICAgICAgICBSZXBvcnRlZCBieSBCcml0dG9uIExlbyBLZXJpbi4KICAgICAgICAgICAgCjA5LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3OTc1NzYgXSAtaGVscCBzZWVtcyB0byBpbXBseSB0aGF0IG9ubHkgdGNsLXNwZWNpZmljIG9wdGlvbnMgZXhpc3QuCiAgICAgICAgICAgIEFkZGVkIGEgY29tbWVudCB0byBhbGVydCB1c2VyIHRvIG90aGVyIG9wdGlvbnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaXR0b24gTGVvIEtlcmluLgoKMDkvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc5ODIwNSBdIFNlZ2ZhdWx0IGluIFNXSUdfQ29udmVydFB0ci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUHJhYmh1IFJhbWFjaGFuZHJhbi4KCjA4LzMwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIE1vZGlmaWVkIHRoZSBkaXJlY3RvciB0eXBlbWFwcyBpbiBweXRob24vc3RkX2NvbXBsZXguaSB0byB1c2UgdGhlIAoJICAgIG5ldy1zdHlsZSBtYWNybyBhbmQgY29udmVyc2lvbiBmdW5jdGlvbnMsIHdoaWNoIGVsaW1pbmF0ZWQgc29tZQoJICAgIHJlZHVuZGFudCBjb2RlLiAgRml4ZWQgYSBmZXcgYnVncyBpbiB0aGVzZSB0eXBlbWFwcyBhcyB3ZWxsLCBhbHRob3VnaAoJICAgIG1vcmUgdGVzdGluZyBpcyBuZWVkZWQuCgowOC8yOS8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBDb21wbGV0ZWQgaW5pdGlhbCBzdXBwb3J0IGZvciB3cmFwcGluZyBhYnN0cmFjdCBjbGFzc2VzIHdpdGggZGlyZWN0b3JzLgoJICAgIENvbnN0cnVjdG9yIHdyYXBwZXJzIHdpbGwgYmUgZ2VuZXJhdGVkIGZvciBhYnN0cmFjdCBjbGFzc2VzIHRoYXQgaGF2ZQoJICAgIGRpcmVjdG9ycywgYW5kIGluc3RhbmNlcyBvZiB0aGUgZGlyZWN0b3IgY2xhc3NlcyB3aWxsIGJlIGNyZWF0ZWQgcmVnYXJkbGVzcwoJICAgIG9mIHdoZXRoZXIgdGhlIHByb3h5IGNsYXNzIGhhcyBiZWVuIHN1YmNsYXNzZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4KCSAgICBObyBjaGVja3MgYXJlIG1hZGUgZHVyaW5nIGNvbnN0cnVjdGlvbiB0byBlbnN1cmUgdGhhdCBhbGwgcHVyZSB2aXJ0dWFsCgkgICAgbWV0aG9kcyBhcmUgaW1wbGVtZW50ZWQgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEluc3RlYWQsIGNhbGxzIHRvCgkgICAgdW5pbXBsZW1lbnRlZCBtZXRob2RzIHdpbGwgdGhyb3cgU1dJR19ESVJFQ1RPUl9QVVJFX1ZJUlRVQUxfRVhDRVBUSU9OCgkgICAgZXhjZXB0aW9ucyBpbiBDKysuCgoJICAgIEludGVncmF0ZWQgUHJhYmh1IFJhbWFjaGFuZHJhbidzIHR5cGVtYXAgcGF0Y2hlcywgd2hpY2ggcHJvdmlkZSBkaXJlY3RvcgoJICAgIHR5cGVtYXAgc3VwcG9ydCBmb3IgZW51bXMgYW5kIHN0ZDo6c2l6ZV90LCBhbmQgZml4IGEgY291cGxlIGJ1Z3MgaW4gdGhlIAoJICAgIGRpcmVjdG9yIHN0ZDo6dmVjdG9yPD4gdHlwZW1hcHMuCgowOC8yOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBJbXBsZW1lbnRlZCBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHRocm93aW5nIEMjIGV4Y2VwdGlvbnMgZnJvbSBDL0MrKyBjb2RlLgogICAgICAgICAgICBBIGZldyBkZWxlZ2F0ZSBmdW5jdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgY2FsbGluZyB3aGljaCB0aGVuIHRocm93IHRoZSBDIwogICAgICAgICAgICBleGNlcHRpb24uIFVzZSB0aGUgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbiBmdW5jdGlvbiBmcm9tIEMvQysrIHR5cGVtYXBzLgogICAgICAgICAgICBTZWUgdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgb3IgY3NoYXJwaGVhZC5zd2cgZm9yIGFsbCBhdmFpbGFibGUgZXhjZXB0aW9ucy4KICAgICAgICAgICAgRXhhbXBsZToKCiAgICAgICAgICAgICAgU1dJR19DU2hhcnBUaHJvd0V4Y2VwdGlvbihTV0lHX0NTaGFycEV4Y2VwdGlvbiwgImV4Y2VwdGlvbiBkZXNjcmlwdGlvbiIpOwoKICAgICAgICAgICAgVGhlICd0aHJvd3MnIHR5cGVtYXBzIGFyZSBhbHNvIG5vdyBpbXBsZW1lbnRlZCwgc28gY29kZSBpcyBhdXRvbWF0aWNhbGx5IAogICAgICAgICAgICBnZW5lcmF0ZWQgdG8gY29udmVydCBhbnkgQysrIGV4Y2VwdGlvbiBpbnRvIGEgQyMgU3lzdGVtLkV4Y2VwdGlvbiB3aGVuIHRoZSBDKysgCiAgICAgICAgICAgIG1ldGhvZCBkZWNsYXJlcyBhbiBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBzdWNoIGFzOgoKICAgICAgICAgICAgICAgaW50IGZvbygpIHRocm93KEJhcik7CgogICAgICAgICAgICBBbHNvIGFueSBwYXJhbWV0ZXJzIHRoYXQgYXJlIHJlZmVyZW5jZXMgdG8gYSBDKysgY2xhc3Mgb3IgYSBjbGFzcyBwYXNzZWQgYnkgdmFsdWUKICAgICAgICAgICAgYW5kIGFyZSBwYXNzZWQgYXMgYSBDIyBudWxsIHdpbGwgbm93IHRocm93IGEgQyMgTnVsbFJlZmVyZW5jZUV4Y2VwdGlvbi4KCjA4LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEZpeCB0byBtYXRjaCB0aGUgY2FsbGluZyBjb252ZW50aW9uIG9mIGFsbCBwaW52b2tlIG1ldGhvZHMgc28gdGhhdCB0aGV5CiAgICAgICAgICAgIG1hdGNoIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBieSBkZWZhdWx0IGluIHRoZSBDIyAnc3RhdGljIGV4dGVybicgZGVjbGFyYXRpb25zIAogICAgICAgICAgICAoX19zdGRjYWxsIGlzIHVzZWQgb24gV2luZG93cykuCgowOC8xOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFJld29ya2VkIHN0ZDo6c3RyaW5nIHR5cGVtYXBzLiBGaXhlcyBhIG51bWJlciBvZiBzdHJpbmcgaW4gc3RkIG5hbWVzcGFjZSAKICAgICAgICAgICAgcHJvYmxlbXMuIEZvciBleGFtcGxlICV0ZW1wbGF0ZSB2ZWN0b3I8c3RyaW5nPi4gVGhlIHRlbXBsYXRlZCBjbGFzcycgZ2V0IG1ldGhvZCAKICAgICAgICAgICAgd2Fzbid0IHJldHVybmluZyBhIEphdmEgU3RyaW5nLCBidXQgYSBTV0lHVFlQRV9wX3N0cmluZy4gUmVwb3J0ZWQKICAgICAgICAgICAgYnkgWmFjaCBCYXVtLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzUyMiBdIDEuMy4xOSBzZWdmYXVsdCBpbiBTd2lnVHlwZV9hZGRfcG9pbnRlci9Eb2hJbnNlcnRpdGVtLgogICAgICAgICAgICBSZWxhdGVkIHRvIHByb2JsZW0gd2l0aCB1bm5hbWVkIGNsYXNzIGhhbmRsaW5nIGluIFBlcmwgbW9kdWxlLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc2MzU2MyBdIE1pc3NpbmcgaW5kaWNhdGlvbiBvZiBvcHRpb25hbCBhcmd1bWVudHMuCiAgICAgICAgICAgIFRjbCBtb2R1bGUuICBSZXBvcnRlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMDgvMTUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc4NzQzMiBdIGxvbmcgcGFyYW0gaGFuZGxlZCBhcyBpbnQuICBUY2wgbW9kdWxlCiAgICAgICAgICAgIG5vdyB1c2VzIFRjbF9HZXRMb25nRnJvbU9iaiB0byBjb252ZXJ0IGludGVnZXIgdmFsdWVzLgoKMDgvMTEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTk4OSBdIG51bWVyaWMgdGVtcGxhdGUgcGFyYW1ldGVycy4gICBUaGVyZSB3ZXJlCiAgICAgICAgICAgIHNvbWUgZXJyb3JzIGluIHRlbXBsYXRlIGV4cGFuc2lvbiByZWxhdGVkIHRvIHRoZSB1c2Ugb2YKICAgICAgICAgICAgYXJyYXlzIHdoZXJlIHRoZSBhcnJheSBkaW1lbnNpb24gd2FzIGEgdGVtcGxhdGUgcGFyYW1ldGVyLgogICAgICAgICAgICBJdCBzaG91bGQgd29yayBub3cuICBSZXBvcnRlZCBieSBCcnlhbiBHcmVlbi4KCjA4LzEwLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIGEgZGlyZWN0b3IgdHlwZW1hcCAob3V0dikgZm9yIHJldHVybiBieSB2YWx1ZSBhbmQgY2xlYW5lZCB1cCB1cCBhIGZldyAKCSAgICBvZiB0aGUgY29tbWVudGVkIGRpcmVjdG9yIHR5cGVtYXBzLgoKMDgvMTAvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgY29uc3RydWN0b3IgZ2VuZXJhdGlvbiBmb3IgZGlyZWN0b3IgY2xhc3NlcyB0byBpZ25vcmUgcHJpdmF0ZQoJICAgIGNvbnN0cnVjdG9ycy4gIFByb3RlY3RlZCBjb25zdHJ1Y3RvcnMgYXJlIGFsc28gaWdub3JlZCBmb3Igbm93LCBwZW5kaW5nCgkgICAgYSBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBvZiB3cmFwcGluZyBjbGFzc2VzIHRoYXQgb25seSBkZWZpbmUgcHJvdGVjdGVkCgkgICAgY29uc3RydWN0b3JzLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE5ldyBjb21tYW5kbGluZSBvcHRpb24gLW91dGRpciA8ZGlyPiB0byBzcGVjaWZ5IHdoZXJlIHRoZSBsYW5ndWFnZSBzcGVjaWZpYwogICAgICAgICAgICBmaWxlcyBhcmUgdG8gYmUgZ2VuZXJhdGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGFyZ2V0IGxhbmd1YWdlcyBsaWtlIFB5dGhvbiwKICAgICAgICAgICAgSmF2YSBldGMgd2hpY2ggZ2VuZXJhdGUgcHJveHkgZmlsZXMgaW4gdGhlIGFwcHJvcHJpYXRlIGxhbmd1YWdlLgogICAgICAgICAgICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhcHBseSB0byB0aGUgQy9DKysgd3JhcHBlciBmaWxlLgoKMDgvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE9uIFdpbmRvd3MgdGhlIGdlbmVyYXRlZCBmaWxlcyAob3RoZXIgdGhhbiB0aGUgX3dyYXAuYyBvciBfd3JhcC5jeHggZmlsZXMpCiAgICAgICAgICAgIHdlcmUgc29tZXRpbWVzIGluY29ycmVjdGx5IGJlaW5nIGdlbmVyYXRlZCBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1bmxlc3MKICAgICAgICAgICAgdGhlIGlucHV0IGZpbGUgdXNlZCB0aGUgVW5peCBwYXRoIHNlcGFyYXRvci4gVGhlIFdpbmRvd3MgcGF0aCBzZXBhcmF0b3IgCiAgICAgICAgICAgIHNob3VsZCBub3cgYmUgdXNlZC4gQnVnIHJlcG9ydGVkIGJ5IFJvYmVydCBEYXZpZXMuCgowOC8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFycmF5IHZhcmlhYmxlIHNldCB0eXBlbWFwIHRvIFBlcmwgbW9kdWxlLgoKMDgvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDc3NTY3NyBdIEFycmF5IGluaXQgY2F1c2VzIGNvZGVnZW4gYnVnLi4KCjA4LzA3LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA3NzkwNjIgXSBDbGFzcyJcbiI6OmZvbyBub3Qgc3VwcG9ydGVkLiAgU1dJRwogICAgICAgICAgICBzaG91bGQgbm93IGNvcnJlY3RseSBoYW5kbGUgd2hpdGVzcGFjZSBpbiBiZXR3ZWVuIAogICAgICAgICAgICBuYW1lc3BhY2UgcXVhbGlmaWVycy4gIEZvciBleGFtcGxlICJBIDo6IEZvbyA6OiBCYXIiLgogICAgICAgICAgICAKMDcvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeGVzIGZvciBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjbGFzc2VzIHRoYXQgYXJlIHBhc3NlZCBieSB2YWx1ZSBhbmQgaGF2ZSAKICAgICAgICAgICAgYSBkZWZhdWx0IHZhbHVlLiBBIGNvcHkgY29uc3RydWN0b3IgZm9yIFN3aWdWYWx1ZVdyYXBwZXIgaXMgcmVxdWlyZWQgCiAgICAgICAgICAgIChTRiAjNzgwMDU2KS4gQWxzbyBmaXhlZCBtZW1vcnkgbGVhayBpbiB0aGVzZSBjaXJjdW1zdGFuY2VzLiBUaGVzZSBtb2RzCiAgICAgICAgICAgIGFsc28gZml4IFNGICM3ODAwNTQuCgowNy8yOC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEltcHJvdmVkIHJ1bi10aW1lIGVycm9yIG1lc3NhZ2UgZm9yIHBvaW50ZXJzIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IFpvb2tvLgoKMDcvMTAvMjAwMzogYmFsbGFiaW8gKEx1aWdpIEJhbGxhYmlvKQogICAgICAgICAgICBbQWxtb3N0IGFsbCBsYW5ndWFnZXNdIFdyYXBwZXJzIGZvciBzdGQ6OnBhaXIgYWRkZWQuCgkgICAgVHlwZW1hcHMgZm9yIFB5dGhvbiwgUnVieSwgR3VpbGUgYW5kIE16U2NoZW1lLgoKMDcvMDEvMjAwMzogbWtvZXBwZSAoTWF0dGhpYXMgS29lcHBlKQoJICAgIFtDaGlja2VuXSBIYW5kbGUgdGhlIGNhc2Ugb2YgbW9yZSB0aGFuIG9uZSBhcmdvdXQgdHlwZW1hcAoJICAgIHBlciBmdW5jdGlvbi4KCjA2LzI5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFNGICM2NzA5NDkgcmVxdWVzdC4gVGhlIGRlc3RydWN0b3Igd3JhcHBlciBmdW5jdGlvbiBuYW1lIGlzIG5vdyAKICAgICAgICAgICAgY29uZmlndXJhYmxlLiAgQSBuZXcgYXR0cmlidXRlIGNhbGxlZCBtZXRob2RuYW1lIGluIHRoZSAKICAgICAgICAgICAgamF2YWRlc3RydWN0L2phdmFkZXN0cnVjdF9kZXJpdmVkIChKYXZhKSBvciBjc2Rlc3RydWN0L2NzZGVzdHJ1Y3RfZGVyaXZlZCAoQyMpCiAgICAgICAgICAgIHR5cGVtYXBzIHNwZWNpZmllcyB0aGUgbWV0aG9kIG5hbWUuIEZvciBleGFtcGxlIGluIEphdmEgdGhlIGRlc3RydWN0b3IgaXMgCiAgICAgICAgICAgIHdyYXBwZWQgYnkgZGVmYXVsdCB3aXRoIHRoZSBkZWxldGUgbWV0aG9kOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFkZXN0cnVjdCwgbWV0aG9kbmFtZT0iZGVsZXRlIikgU1dJR1RZUEUgey4uLn0KCjA2LzI3LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YSwgQyNdIFRoZSB0aHJvd3MgYXR0cmlidXRlIGZvciBhZGRpbmcgZXhjZXB0aW9uIGNsYXNzZXMgdG8gdGhlIHRocm93cwogICAgICAgICAgICBjbGF1c2UgYWxzbyBub3cgd29ya3Mgd2l0aCB0aGUgZm9sbG93aW5nIHR5cGVtYXBzOiAKICAgICAgICAgICAgbmV3ZnJlZQogICAgICAgICAgICBqYXZhaW4sIGphdmFvdXQgKEphdmEpCiAgICAgICAgICAgIGNzaW4sIGNzb3V0IChDIykKCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGUgJ0FuRXhjZXB0aW9uJyB3aWxsIGJlIGFkZGVkIHRvIHRoZSB0aHJvd3MgY2xhdXNlIGluIHRoZQogICAgICAgICAgICBwcm94eSBmdW5jdGlvbjoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQsIHRocm93cz0iQW5FeGNlcHRpb24iKSBpbnQgewogICAgICAgICAgICAgICAgaW50IHJldHVyblZhbHVlPSRqbmljYWxsOwogICAgICAgICAgICAgICAgaWYgKHJldHVyblZhbHVlPT0wKSB0aHJvdyBuZXcgQW5FeGNlcHRpb24oIlZhbHVlIG11c3Qgbm90IGJlIHplcm8iKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKICAgICAgICAgICAgfQoKMDYvMjUvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgW1B5dGhvbl0gRGlyZWN0b3IgdHlwZW1hcCBtYXJzaGFsbGluZyBjaGVja3MgZm9yIG51bGwgcG9pbnRlcnMgd2hlbgoJICAgIHdhbGtpbmcgdGhlIHBhcmFtZXRlciBsaXN0IGluc3RlYWQgb2YgcmVseWluZyBzb2xleSBvbiB0aGUgcGFyYW1ldGVyCgkgICAgY291bnQuICBDdXJlcyBhIHNlZ2ZhdWx0IHRoYXQgb2NjdXJyZWQgZm9yIG11bHRpcGxlIGFyZ3VtZW50IGludiB0eXBlbWFwcy4KCSAgICBTb21lb25lIHdpdGggbW9yZSBTd2lnIGV4cGVyaWVuY2Ugc2hvdWxkIHByb2JhYmx5IHJldmlldyB0aGlzIGNvZGUuCgowNi8yNC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW0NoaWNrZW5dIERvbid0IGVtaXQgY2FsbHMgdG8gIkNfY2hlY2tfZm9yX2ludGVycnVwdCIsCgkgICAgd2hpY2ggbWF5IHJlc3VsdCBpbiBhbiBlbmRsZXNzIGxvb3AuICBQYXRjaCBieSBmZWxpeEBwcm94aW1hLW10LmRlLgoKMDYvMjAvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gRmluYWxpemVycyBub3cgdXNlIGRlc3RydWN0b3Igc3ludGF4IGFzIHRoZSBvdmVycmlkZSB3aGljaCB3YXMgdXNlZCBpbiAKICAgICAgICAgICAgdGhlIEZpbmFsaXplIG1ldGhvZCBpcyBub3QgaW4gdGhlIEVDTUEgc3RhbmRhcmRzLCBzcG90dGVkIGJ5IHRoZSBNUyBjb21waWxlci4KCjA2LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIEEgbnVtYmVyIG9mIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgdG8gcmVtb3ZlIHRoZSBKYXZhIG5hbWluZyAKICAgICAgICAgICAgdGhhdCB3YXMgdXNlZCBpbiB0aGUgQyMgbW9kdWxlLgogICAgICAgICAgICAKICAgICAgICAgICAgVHlwZW1hcCBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGpuaSAgICAgICAgICAgICAgICAgICAgICAgICAtPiBjdHlwZQogICAgICAgICAgICBqdHlwZSAgICAgICAgICAgICAgICAgICAgICAgLT4gaW10eXBlCiAgICAgICAgICAgIGpzdHlwZSAgICAgICAgICAgICAgICAgICAgICAtPiBjc3R5cGUKICAgICAgICAgICAgamF2YWluICAgICAgICAgICAgICAgICAgICAgIC0+IGNzaW4KICAgICAgICAgICAgamF2YW91dCAgICAgICAgICAgICAgICAgICAgIC0+IGNzb3V0CiAgICAgICAgICAgIGphdmFpbnRlcmZhY2VzICAgICAgICAgICAgICAtPiBjc2ludGVyZmFjZXMKICAgICAgICAgICAgamF2YWJhc2UgICAgICAgICAgICAgICAgICAgIC0+IGNzYmFzZQogICAgICAgICAgICBqYXZhY2xhc3Ntb2RpZmllcnMgICAgICAgICAgLT4gY3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqYXZhY29kZSAgICAgICAgICAgICAgICAgICAgLT4gY3Njb2RlCiAgICAgICAgICAgIGphdmFpbXBvcnRzICAgICAgICAgICAgICAgICAtPiBjc2ltcG9ydHMKICAgICAgICAgICAgamF2YXB0cmNvbnN0cnVjdG9ybW9kaWZpZXJzIC0+IGNzcHRyY29uc3RydWN0b3Jtb2RpZmllcnMKICAgICAgICAgICAgamF2YWdldGNwdHIgICAgICAgICAgICAgICAgIC0+IGNzZ2V0Y3B0cgogICAgICAgICAgICBqYXZhZmluYWxpemUgICAgICAgICAgICAgICAgLT4gY3NmaW5hbGl6ZQoKICAgICAgICAgICAgRmVhdHVyZSBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgIGphdmFjb25zdCAgICAgICAgICAgICAgICAgICAtPiBjc2NvbnN0CiAgICAgICAgICAgIGphdmFtZXRob2Rtb2RpZmllcnMgICAgICAgICAtPiBjc21ldGhvZG1vZGlmaWVycwoKICAgICAgICAgICAgUHJhZ21hIGNoYW5nZXM6CiAgICAgICAgICAgIHByYWdtYShqYXZhKSAgICAgICAgICAgICAgICAtPiBwcmFnbWEoY3NoYXJwKQogICAgICAgICAgICBqbmljbGFzc2Jhc2UgICAgICAgICAgICAgICAgLT4gaW1jbGFzc2Jhc2UKICAgICAgICAgICAgam5pY2xhc3NjbGFzc21vZGlmaWVycyAgICAgIC0+IGltY2xhc3NjbGFzc21vZGlmaWVycwogICAgICAgICAgICBqbmljbGFzc2NvZGUgICAgICAgICAgICAgICAgLT4gaW1jbGFzc2NvZGUKICAgICAgICAgICAgam5pY2xhc3NpbXBvcnRzICAgICAgICAgICAgIC0+IGltY2xhc3NpbXBvcnRzCiAgICAgICAgICAgIGpuaWNsYXNzaW50ZXJmYWNlcyAgICAgICAgICAtPiBpbWNsYXNzaW50ZXJmYWNlcwoKICAgICAgICAgICAgU3BlY2lhbCB2YXJpYWJsZSBuYW1lIGNoYW5nZXM6CiAgICAgICAgICAgICRqYXZhY2xhc3NuYW1lICAgICAgICAgICAgICAtPiAkY3NjbGFzc25hbWUKICAgICAgICAgICAgJGphdmFpbnB1dCAgICAgICAgICAgICAgICAgIC0+ICRjc2lucHV0CiAgICAgICAgICAgICRqbmljYWxsICAgICAgICAgICAgICAgICAgICAtPiAkaW1jYWxsCgogICAgICAgICAgICBUaGlzIHdpbGwgYnJlYWsgU1dJRyBpbnRlcmZhY2UgZmlsZXMgdGhhdCB1c2UgdGhlc2UgdHlwZW1hcHMsIGZlYXR1cmVzCiAgICAgICAgICAgIGFuZCBwcmFnbWFzLiBQbGVhc2UgdXBkYXRlIHlvdXIgY29kZSBvciB1c2UgbWFjcm9zIGZvciBiYWNrd2FyZHMKICAgICAgICAgICAgY29tcGF0aWJpbGl0eS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBDIyBNT0RVTEUgKioqCgowNi8xMC8yMDAzOiBta29lcHBlIChNYXR0aGlhcyBLb2VwcGUpCgkgICAgW016U2NoZW1lXSBBcHBsaWVkIE16U2NoZW1lIG1vZHVsZSB1cGRhdGVzIGNvbnRyaWJ1dGVkIGJ5CgkgICAgSm9obiBMZW56IDxqZWxlbnpAc3R1ZGVudHMud2lzYy5lZHU+LgoKICAgICAgICAgICAgLSBVcGRhdGVkIG16c2NoZW1lIHRvIHVzZSBTV0lHJ3MgY29tbW9uIHJ1bnRpbWUgdHlwZQogICAgICAgICAgICAgIHN5c3RlbSBmcm9tIGNvbW1vbi5zd2cuIAoKCSAgICAtIFRoZSBMaWIvbXpzY2hlbWUgZGlyZWN0b3J5IGhhcyBiZWVuIHJlb3JnYW5pemVkIHRvCiAgICAgICAgICAgICAgc3RhbmRhcmRpemUgbmFtZXMgYWNyb3NzIHRoZSBsYW5ndWFnZSBtb2R1bGVzOgogICAgICAgICAgICAgIG16c2NoZW1lLmkgd2FzIG1vdmVkIHRvIG16c2NoZW1lLnN3ZywgbXpzY2hlbWUuc3dnIGFuZAogICAgICAgICAgICAgIG16c2NoZW1lZGVjLnN3ZyBoYXZlIGJlZW4gcmVtb3ZlZCwgbXpydW4uc3dnICh3aGljaAogICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBydW50aW1lIGNvZGUpIGhhcyBiZWVuIGFkZGVkLgoKICAgICAgICAgICAgLSBUaGUgc3dpZ19wcm94eSBzdHJ1Y3R1cmUgd2FzIHJlbmFtZWQgdG8gc3dpZ19tel9wcm94eS4KICAgICAgICAgICAgICBzd2lnX216X3Byb3h5IG5vdyBjb250YWlucyBhIHBvaW50ZXIgdG8gYSBzd2lnX3R5cGVfaW5mbwogICAgICAgICAgICAgIHN0cnVjdHVyZS4gIAoKCSAgICAtIEFkZGVkIHZhcmluIGFuZCB2YXJvdXQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFIFtdIGFuZAogICAgICAgICAgICAgIFNXSUdUWVBFICYuCgoJICAgIC0gR2FyYmFnZSBjb2xsZWN0aW9uIGJ5IGNhbGxpbmcgc2NoZW1lX2FkZF9maW5hbGl6ZXIoKSBoYXMKICAgICAgICAgICAgICBiZWVuIGFkZGVkLgoKCSAgICAqKiogTkVXIEZFQVRVUkUgW016U2NoZW1lXSAqKioKCjA2LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IHR5cGVtYXBzOiBqYXZhZGVzdHJ1Y3QgYW5kIGphdmFkZXN0cnVjdF9kZXJpdmVkCiAgICAgICAgICAgIGZvciB0aGUgQysrIGRlc3RydWN0b3Igd3JhcHBlci4gVGhlIGphdmFkZXN0cnVjdCB2ZXJzaW9uIGdldHMgdXNlZCBieQogICAgICAgICAgICBjbGFzc2VzIGF0IHRoZSB0b3Agb2YgYW4gaW5oZXJpdGFuY2UgY2hhaW4gYW5kIHRoZSBqYXZhZGVzdHJ1Y3RfZGVyaXZlZCAKICAgICAgICAgICAgdmVyc2lvbiBnZXRzIHVzZWQgYnkgb3RoZXIgY2xhc3Nlcy4KCiAgICAgICAgICAgIFtDI10gY2lsZGlzcG9zZSBhbmQgY2lsZGlzcG9zZW92ZXJyaWRlIHR5cGVtYXBzIHJlcGxhY2VkIGJ5CiAgICAgICAgICAgIGNzZGVzdHJ1Y3QgYW5kIGNzZGVzdHJ1Y3RfZGVyaXZlZCB0eXBlbWFwcy4gVGhlIGRlbGV0ZSgpCiAgICAgICAgICAgIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGFuZCBpdHMgZnVuY3Rpb25hbGl0eSBwdXQgaW50byB0aGVzZQogICAgICAgICAgICB0eXBlbWFwcyBkZXNpZ25lZCBmb3IgdGhlIERpc3Bvc2UoKSBtZXRob2QuCgogICAgICAgICAgICAtIE5ldyB0eXBlbWFwcyBjc2ludGVyZmFjZXMgYW5kIGNzaW50ZXJmYWNlc19kZXJpdmVkIHJlcGxhY2UKICAgICAgICAgICAgdGhlIGphdmFpbnRlcmZhY2VzIHR5cGVtYXAuIEFsc28gZml4ZXMgdGhlIHBlY3VsaWFyaXR5IG9mIGFsbCBjbGFzc2VzCiAgICAgICAgICAgIGluIGFuIGluaGVyaXRhbmNlIGNoYWluIGluZGl2aWR1YWxseSBkZXJpdmluZyBmcm9tIHRoZSBJRGlzcG9zYWJsZSAKICAgICAgICAgICAgaW50ZXJmYWNlLgoKICAgICAgICAgICAgLSBOZXcgdHlwZW1hcCBjc2ZpbmFsaXplIGZvciBmaW5hbGl6ZXJzLiBDKysgZGVzdHJ1Y3RvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgICAgICAgYnkgZ2FyYmFnZSBjb2xsZWN0b3IgZHVyaW5nIGZpbmFsaXphdGlvbi4gUHJvYmxlbSByZXBvcnRlZCBieSAKICAgICAgICAgICAgQW5kcmVhcyBTY2j2cmsuCgowNi8xMC8yMDAzOiBUaWdlcgoJICAgIE1vZGlmaWVkIGNvbnRyYWN0IGNvZGUgZm9yIGVycm9yIG1lc3NhZ2Ugb3V0cHV0LgogICAgICAgICAgICBDb250cmFjdCBjb2RlIGNhbiBub3cgcHJpbnQgb3V0IHNpbXBsZSBlcnJvciBtZXNzYWdlLgogICAgICAgICAgICBNb2RpZmllZCBjb250cmFjdCBjb2RlIHRvIHByZXBhcmUgZm9yIGluaGVyaXRhbmNlCiAgICAgICAgICAgIAowNi8wMy8yMDAzOiBta29lcHBlCgkgICAgW0d1aWxlXSBBcHBsaWVkIEd1aWxlIG1vZHVsZSB1cGRhdGVzIGNvbnRyaWJ1dGVkIGJ5IAoJICAgIEpvaG4gTGVueiA8amVsZW56QHN0dWRlbnRzLndpc2MuZWR1Pi4gCgoJICAgIC0gU1dJRyBjdXJyZW50bHkgdXNlcyBHdWlsZSdzIGdoXyBBUEksIHdoaWNoIGlzIG1hcmtlZCBhcwoJICAgICAgZGVwcmVjYXRlZCBpbiBHdWlsZSAxLjYgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBHdWlsZQoJICAgICAgMS45LiAgVGhpcyBjaGFuZ2UgaW50cm9kdWNlcyBhIGNvbW1hbmQtbGluZSBmbGFnICItc2NtIgoJICAgICAgd2hpY2ggY2F1c2VzIFNXSUcgdG8gZ2VuZXJhdGUgd3JhcHBlcnMgdGhhdCB1c2UgR3VpbGUncwoJICAgICAgU0NNIEFQSSBpbnN0ZWFkOyB0aGlzIHJlcXVpcmVzIEd1aWxlID49IDEuNi4KCSAgICAKCSAgICAtIFRoZSBMaWIvZ3VpbGUgZGlyZWN0b3J5IGhhcyBiZWVuIHJlb3JnYW5pemVkIHRvCiAgICAgICAgICAgICAgc3RhbmRhcmRpemUgbmFtZXMgYWNyb3NzIGxhbmd1YWdlIG1vZHVsZXM6IGd1aWxlZGVjLnN3ZwogICAgICAgICAgICAgIGFuZCBndWlsZS5zd2cgaGF2ZSBiZWVuIG1vdmVkIGludG8gZ3VpbGVfZ2hfcnVuLnN3ZywKICAgICAgICAgICAgICBndWlsZS5pIGhhcyBiZWVuIG1vdmVkIHRvIGd1aWxlX2doLnN3ZywgZ3VpbGVfc2NtLnN3ZwogICAgICAgICAgICAgIGFuZCBndWlsZV9zY21fcnVuLnN3ZyB3aGljaCBjb250YWluIHRoZSBTQ00gQVBJIHN0dWZmCiAgICAgICAgICAgICAgaGF2ZSBiZWVuIGFkZGVkCgoJICAgIC0gZ2hpbnRlcmZhY2UuaSwgd2hpY2ggY29udGFpbnMgdGhlIGRlZmluZXMgZnJvbSB0aGUgZ2hfCiAgICAgICAgICAgICAgZnVuY3Rpb25zIHRvIHRoZSBzY21fZnVuY3Rpb25zIGhhcyBiZWVuIGFkZGVkCgoJICAgIC0gVGhlIEFQSSBmb3IgZGVhbGluZyB3aXRoIHBvaW50ZXIgb2JqZWN0cyBpcyBub3cKCSAgICAgIFNXSUdfQ29udmVydFB0ciwgU1dJR19NdXN0R2V0UHRyLCBTV0lHX05ld1BvaW50ZXJPYmouCgogICAgICAgICAgICAtIEFkZGVkIHZhcmluIGFuZCB2YXJvdXQgdHlwZW1hcHMgZm9yIFNXSUdUWVBFIFtdIGFuZCBTV0lHVFlQRSAmCgogICAgICAgICAgICAtIEdhcmJhZ2UgY29sbGVjdGlvbiBoYXMgYmVlbiBhZGRlZC4KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSBbR3VpbGVdICoqKgoJICAgIAkKMDYvMDEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIERpbWVuc2lvbmxlc3MgYXJyYXlzIHN1Y2ggYXMgCgogICAgICAgICAgICAgICAgaW50IGZvb1tdID0gezEsIDJ9OwogICAgICAgICAgICAgICAgZXh0ZXJuIGludCBiYXJbXTsKCiAgICAgICAgICAgIHByb2R1Y2UgYSB3YXJuaW5nIHRoYXQgdGhlIHZhcmlhYmxlIGlzIHJlYWQtb25seS4gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQKICAgICAgICAgICAgbGFuZ3VhZ2UsIHRoaXMgdXNlZCB0byBjYXVzZSBjb21waWxlIGVycm9ycyBvciBnZW5lcmF0ZSBhIHNldHRlciB0aGF0CiAgICAgICAgICAgIGdlbmVyYXRlZCBhIHJ1bnRpbWUgZXJyb3IuIEEgc2V0dGVyIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZAogICAgICAgICAgICBiZWNhdXNlIHRoZSBhcnJheSBzaXplIGNhbm5vdCBiZSBkZXRlcm1pbmVkIGJ5IFNXSUcuIEEgdmFyaW4sIGdsb2JhbGluIAogICAgICAgICAgICBvciBtZW1iZXJpbiB0eXBlbWFwIChkZXBlbmRpbmcgb24gdGhlIHRhcmdldCBsYW5ndWFnZSkgbXVzdCBiZSB3cml0dGVuIAogICAgICAgICAgICBieSB0aGUgdXNlci4KCjA1LzI5LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUmVmaW5lbWVudCB0byBkZWZhdWx0IHR5cGVtYXAgbWF0Y2hpbmcgYW5kIGFycmF5cy4gIFdoZW4gYW4KICAgICAgICAgICAgYXJyYXkgaXMgZGVjbGFyZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgICBpbnQgZm9vWzRdOwoKICAgICAgICAgICAgVGhlIGRlZmF1bHQgdHlwZW1hcCBub3cgcmVzb2x2ZXMgdG8gCgogICAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtBTlldCgogICAgICAgICAgICBJZiBubyBtYXRjaCBpcyBmb3VuZCBmb3IgdGhhdCwgaXQgdGhlbiByZXNvbHZlcyB0bwoKICAgICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSBbXQoKICAgICAgICAgICAgSWYgbm8gYXJyYXkgZGltZW5zaW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgZGVjbGFyYXRpb24sCiAgICAgICAgICAgIHRoZSBTV0lHVFlQRSBbXSBpcyB1c2VkIHJpZ2h0IGF3YXkuIAoKICAgICAgICAgICAgTm90ZTogVGhpcyBjaGFuZ2UgaGFzIGJlZW4gbWFkZSB0byByZXNvbHZlIHByb2JsZW1zIHJlbGF0ZWQgdG8KICAgICAgICAgICAgYXJyYXlzIHdpdGggYW5kIHdpdGhvdXQgZGltZW5zaW9ucy4gIEZvciBleGFtcGxlLCBzb21ldGltZXMgU1dJRwogICAgICAgICAgICB3YXMgZ2VuZXJhdGluZyBzZXR0ZXIgZnVuY3Rpb25zIGZvciBhcnJheSB2YXJpYWJsZXMgd2l0aCBubyBkaW1lbnNpb25zCiAgICAgICAgICAgIChhbiBlcnJvcikuIExpa2V3aXNlLCBTV0lHIHNvbWV0aW1lcyBtYWRlIGFycmF5cyB3aXRoIGRpbWVuc2lvbnMKICAgICAgICAgICAgcmVhZC1vbmx5IChhbHNvIGFuIGVycm9yKS4gIFRoaXMgZml4ZXMgdGhlIGFycmF5c19nbG9iYWwgdGVzdAogICAgICAgICAgICBwcm9ibGVtLgogICAgICAgICAgICAgICAgICAgICAgICAKMDUvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgdHlwZSBoYW5kbGluZyBidWcgd2l0aCByZWZlcmVuY2VzIGFuZCBwb2ludGVycy4KICAgICAgICAgICAgSWYgeW91IGhhZCBmdW5jdGlvbnMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBGb28gQmFyOwoKICAgICAgICAgICAgICAgICAgRm9vICpmdW5jMSgpOwogICAgICAgICAgICAgICAgICB2b2lkIGZ1bmMyKEJhciAmeCk7CgogICAgICAgICAgICBUaGVuIGZ1bmMyKCkgd291bGRuJ3QgYWNjZXB0IG9iamVjdHMgcmV0dXJuZWQgYnkgZnVuYzEoKQogICAgICAgICAgICBiZWNhdXNlIG9mIGEgdHlwZSBlcnJvci4gICBJdCBzaG91bGQgd29yayBub3cuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEJyaWFuIFlhbmcuCgowNS8yMS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4ZXMgdG8gc29tZSBvZiB0aGUgVmlzdWFsIEMrKyBleGFtcGxlIHByb2plY3QgZmlsZXMgd2hpY2ggd291bGQgbm90IAogICAgICAgICAgICB3b3JrIHdpdGggc3BhY2VzIGluIHRoZSBwYXRocyBoZWxkIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdXNlZCB0byAKICAgICAgICAgICAgcG9pbnQgdG8gdGhlIHRhcmdldCBsYW5ndWFnZSdzIGxpYnJhcnkgLyBpbmNsdWRlIGRpcmVjdG9yeS4KICAgICAgICAgICAgU0YgYnVnICM3NDA3NjkKCjA1LzIxLzIwMDM6ICBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIEFkZGVkIC1jb250cmFjdHMgb3B0aW9uLgogICAgICAgICAgICBGaXJzdCB0cnkgb2YgdGhlIGlkZWEgb2YgIldyYXAgYnkgQ29udHJhY3QiOiAKICAgICAgICAgICAgYnVpbGQgdXAgcmVhbGlhYmxlIGNyb3NzLWxhbmd1YWdlIG1vZHVsZSBieSB3cmFwcGluZyB3aXRoIFNXSUcuCiAgICAgICAgICAgIEltcGxlbWVudGVkIGJhc2ljIGFzc2VydGlvbgogICAgICAgICAgICAocHJlYXNzZXJ0aW9uICYgcG9zdGFzc2VydGlvbiAmIGludmFyaWFudCkKICAgICAgICAgICAgZm9yIHNpbXBsZSBDL0MrKyBmdW5jdGlvbnMuCiAgICAgICAgICAgIAogICAgICAgICAgICBDdXJyZW50IGZvcm1hdCBvZiBjb250cmFjdHMgYXJlOgogICAgICAgICAgICAlY29udHJhY3QgY2xhc3NfbmFtZSA6OiBmdW5jX25hbWUgKHBhcmFzLi4uKSB7CiAgICAgICAgICAgIHJlcXVpcmU6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHJzOwogICAgICAgICAgICAgICAgICAgZXhwcnM7CiAgICAgICAgICAgIGVuc3VyZToKICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXhwcjsKICAgICAgICAgICAgICAgICAgIGV4cHJzOwogICAgICAgICAgICBpbnZhcmlhbnQ6CiAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cHI7CiAgICAgICAgICAgICAgICAgICBleHByczsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoJICAgIAkKMDUvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIHR3ZWFrcy4gVGhlcmUgd2VyZSBhIGZldyBwcmVwcm9jZXNzb3IgZGVmaW5pdGlvbnMgd2hpY2ggd2VyZQogICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIE1ha2VmaWxlIGZvciBwYXNzaW5nIG9uIHRoZSBjb21tYW5kbGluZSB3aGVuIGNvbXBpbGluZy4KICAgICAgICAgICAgVGhlc2UgYXJlIG5vdyBhbGwgZGVmaW5lZCBpbiBzd2lnY29uZmlnLmguIEF1dG9jb25mIGRvZXNuJ3Qgbm9ybWFsbHkgCiAgICAgICAgICAgIGFsbG93IGluc3RhbGxhdGlvbiBkaXJlY3RvcmllcyB0byBiZSBkZWZpbmVkIGluIHRoaXMgY29uZmlnIGhlYWRlciBmaWxlLCAKICAgICAgICAgICAgYnV0IGFuIGF1dG9jb25mIGFyY2hpdmUgbWFjcm8gZW5hYmxlcyB0aGlzLiBUaGlzIG1hY3JvIGFsb25nIHdpdGggZnV0dXJlIAogICAgICAgICAgICBhdXRvY29uZiBtYWNyb3MgYXJlIGdvaW5nIHRvIGJlIHB1dCBpbiB0aGUgVG9vbHMvY29uZmlnIGRpcmVjdG9yeS4KCiAgICAgICAgICAgICdzd2lnIC12ZXJzaW9uJyBub3cgcmVwb3J0cyB0aGUgdGFyZ2V0IGJ1aWxkIHBsYXRmb3JtLgoKMDUvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gRml4IHRvIHRoZSBmb2xsb3dpbmcgdHlwZW1hcHM6CgogICAgICAgICAgICBqYXZhYmFzZSwgamF2YWludGVyZmFjZXMsIGphdmFpbXBvcnRzLCBqYXZhY2xhc3Ntb2RpZmllcnMsCiAgICAgICAgICAgIGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycywgamF2YWZpbmFsaXplLCBqYXZhZ2V0Y3B0ciAmIGphdmFjb2RlLgoKICAgICAgICAgICAgVGhlc2UgYXJlIHRoZSB0eXBlbWFwcyBmb3IgbW9kaWZ5aW5nL2dlbmVyYXRpbmcgcHJveHkgY2xhc3Nlcy4KICAgICAgICAgICAgUHJldmlvdXNseSB0aGUgdHlwZW1hcHMgd291bGQgdXNlIHRoZSBwcm94eSBjbGFzcyBuYW1lIGFuZCBub3QgdGhlIAogICAgICAgICAgICBDKysgdHlwZSwgd2hpY2ggd2FzIGluY29uc2lzdGVudCB3aXRoIGFsbCBvdGhlciB0eXBlbWFwcy4gCgogICAgICAgICAgICBJbiBtb3N0IGNpcmN1bXN0YW5jZXMgdGhlIHByb3h5IGNsYXNzIG5hbWUgYW5kIHRoZSBDKysgY2xhc3MgbmFtZS90eXBlIAogICAgICAgICAgICBpcyB0aGUgc2FtZSBleGNlcHQgZm9yIGNsYXNzZXMgaW4gbmFtZXNwYWNlLCB0ZW1wbGF0ZWQgY2xhc3NlcyBldGMuIHNvCiAgICAgICAgICAgIHRoaXMgc2hvdWxkbid0IGFmZmVjdCBtb3N0IGNhc2VzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgYW5kIEMjIE1PRFVMRVMgKioqCgowNS8wOS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgVmlzdWFsIEMrKyBQcm9qZWN0IGZpbGVzIGhhdmUgYmVlbiBhZGRlZCBzbyB0aGF0IHRoZSBydW50aW1lIGxpYnJhcmllcwogICAgICAgICAgICBjYW4gYmUgYnVpbHQgb24gV2luZG93cyAoZm9yIFRjbCwgUGVybCwgUHl0aG9uIGFuZCBSdWJ5KS4KCjA1LzAxLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHJldHVybiBieSB2YWx1ZSwgY29uc3QsIGFuZCBwcml2YXRlIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgQiB7CiAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgQigpOwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgQihjb25zdCBCJik7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBjb25zdCBCIHJldHVybkIoKSBjb25zdDsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByb2JsZW0gYW5kIHBhdGNoIHN1Z2dlc3Rpb24gcmVwb3J0ZWQgYnkgQmlsbCBIb2ZmbWFuLgoKMDQvMjkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEJ1aWxkIGNoYW5nZXM6CiAgICAgICAgICAgIC0gU2luZ2xlIGF1dG9jb25mIGludm9jYXRpb24gLSBhdXRvY29uZiBpbiB0aGUgVG9vbHMgZGlyZWN0b3J5IGhhcyBnb25lLgoKICAgICAgICAgICAgLSBMaWJ0b29sIGJvb3RzdHJhcHBlZCB3aGVuIHJ1bm5pbmcgYXV0b2dlbi5zaC4gVGhpcyByZXF1aXJlcyBhbnlvbmUKICAgICAgICAgICAgICB1c2luZyB0aGUgY3ZzIHZlcnNpb24gb2YgU1dJRyB0byBoYXZlIGxpYnRvb2wgaW5zdGFsbGVkIG9uIHRoZWlyCiAgICAgICAgICAgICAgbWFjaGluZS4gU3VnZ2VzdCB2ZXJzaW9uIDEuNC4yIG9yIGhpZ2hlciwgcHJlZmVyYWJseSB0aGUgbGF0ZXN0IC0gMS41LgoKICAgICAgICAgICAgLSBBdXRvbWFrZSBpcyBub3cgdXNlZCB0byBidWlsZCB0aGUgcnVudGltZSBsaWJyYXJpZXMgaW4gY29uanVuY3Rpb24gCiAgICAgICAgICAgICAgd2l0aCBsaWJ0b29sLgoKICAgICAgICAgICAgLSBSdW50aW1lIGxpYnJhcmllcyBhcmUgbm93IHN1Y2Nlc3NmdWxseSBidWlsdCBhcyBETExzIG9uIEN5Z3dpbi4KCiAgICAgICAgICAgIC0gU2tpcHBpbmcgbGFuZ3VhZ2VzIGlzIG5vIGxvbmdlciBqdXN0IGRldGVybWluZWQgaW4gdGhlIHRvcCBsZXZlbCAKICAgICAgICAgICAgICBtYWtlZmlsZSBidXQgaW4gY29uZmlndXJlLmluLiBUaGlzIGluZm8gaXMgdXNlZCBmb3IgYnVpbGRpbmcKICAgICAgICAgICAgICB0aGUgcnVudGltZSBsaWJyYXJpZXMgYW5kIGZvciBydW5uaW5nIHRoZSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZS4KCiAgICAgICAgICAgIC0gVGhlc2UgY2hhbmdlcyBoYXZlIGZpeGVkIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yeSBidWlsZHMsIHRoYXQgaXMKICAgICAgICAgICAgICBidWlsZGluZyBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4gdGhlIHRvcCBsZXZlbCBkaXJlY3RvcnkuIAogICAgICAgICAgICAgIEluc3RhbGxhdGlvbiBmcm9tIG11bHRpcGxlIGJ1aWxkIGRpcmVjdG9yaWVzIGFsc28gd29ya2luZy4gQW4gaW5pdGlhbAogICAgICAgICAgICAgIGNvbmZpZ3VyZSBpbiB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpcyBubyBsb25nZXIgbmVlZGVkIGFzIGRlc2NyaWJlZAogICAgICAgICAgICAgIGluIDA0LzAyLzIwMDMgZW50cnkuIEEgJ21ha2UgZGlzdGNsZWFuJyB3aWxsIGJlIG5lZWRlZCBiZWZvcmUgYnVpbGRpbmcKICAgICAgICAgICAgICBpbiBhIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IGlmIHRoZSBhdXRvdG9vbHMgCiAgICAgICAgICAgICAgaGF2ZSBiZWVuIHJ1biBmcm9tIHRoaXMgdG9wIGxldmVsIGRpcmVjdG9yeSBhdCBzb21lIHBvaW50LCBidXQgCiAgICAgICAgICAgICAgYXV0b2NvbmYgd2lsbCB0ZWxsIHlvdSB0aGlzLiBOb3RlIHRoYXQgJ21ha2UgY2hlY2snIG9ubHkgd29ya3MgZnJvbSAKICAgICAgICAgICAgICB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBhdCB0aGUgbW9tZW50LgoKMDQvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDcyMzQ3MSBdIFdyYXBwZXJfcHJpbnQoKSBmYWlscyB3aXRoIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzLgoKMDQvMjgvMjAwMzogYmVhemxleQogICAgICAgICAgICBNaW5vciByZWZpbmVtZW50IG9mIGNvbnN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUgaGFuZGxpbmcgCiAgICAgICAgICAgIGRlc2NyaWJlZCBpbiBDSEFOR0VTIDA4LzExLzIwMDIuICAgUHJldmlvdXNseSwgU1dJRyBtZXJlbHkKICAgICAgICAgICAgY2hlY2tlZCB0byBzZWUgaWYgdGhlcmUgd2FzIGFuIGluaXRpYWxpemVyIGluIHRoZSBkZWNsYXJhdGlvbi4KICAgICAgICAgICAgTm93LCBTV0lHIGFkZGl0aW9uYWxseSBjaGVja3MgdG8gbWFrZSBzdXJlIHRoZSBzdGF0aWMgbWVtYmVyCiAgICAgICAgICAgIGlzIGNvbnN0LgoKMDQvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEga2luZCBvZiBsaW1pdGVkIHN1cHBvcnQgZm9yIG11bHRpcGxlIGluaGVyaXRhbmNlLAogICAgICAgICAgICBhY3RpdmF0ZWQgdXNpbmcgdGhlIC1taW5oZXJpdCBjb21tYW5kLWxpbmUgb3B0aW9uLiBJJ3ZlIGFsc28gdXBkYXRlZAogICAgICAgICAgICB0aGUgIkMrKyBJbmhlcml0YW5jZSIgc2VjdGlvbiBvZiB0aGUgUnVieSBkb2N1bWVudGF0aW9uIHRvIGRpc2N1c3MKICAgICAgICAgICAgaG93IHRoaXMgd29ya3MsIGFuZCBpdHMgbGltaXRhdGlvbnMuIEFsc28gYWxzbyBtb2RpZmllZCB0aGUgbWluaGVyaXQuaQogICAgICAgICAgICB0ZXN0IGNhc2UgdG8gcnVuIGFnYWluc3QgdGhpcy4KCjA0LzI1LzIwMDM6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCB0aGUgLWdsb2JhbG1vZHVsZSBjb21tYW5kLWxpbmUgb3B0aW9uIGZvciB0aGUgUnVieQogICAgICAgICAgICBtb2R1bGUsIGZvciB3cmFwcGluZyBzdHVmZiBpbnRvIHRoZSBnbG9iYWwgbW9kdWxlIChLZXJuZWwpIGluc3RlYWQKICAgICAgICAgICAgb2YgYSBuZXN0ZWQgbW9kdWxlLiBVcGRhdGVkIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nbHkuCgowNC8yMy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBGaXhlZCBzeW1uYW1lIGVycm9yIGluIGRpcmVjdG9yIGNhbGxzIHRvIFB5dGhvbiBtZXRob2RzCgkgICAgdGhhdCBleHRlbmQgQysrIG9wZXJhdG9ycy4KCgkgICAgU3RvcHBlZCBkaXJlY3RvciBkZXN0cnVjdG9yIHdyYXBwZXJzIGZyb20gY2FsbGluZyBfX3NldF91cCwKCSAgICB3aGljaCB3YXMgbGVhdmluZyB0aGUgZGlyZWN0b3IgZmxhZyBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuCgowNC8yMy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBuYW1lc3BhY2UgcmVzb2x1dGlvbiBhbmQgbmVzdGVkIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFsZnJlZCBMb3JiZXIgKGFuZCBNYXJjZWxvIE1hdHVzKS4KCjA0LzE2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBQYXRjaCBmb3IgSmF2YSBleGFtcGxlcyBhbmQgdGVzdC1zdWl0ZSB0byBydW4gb24gTWFjIE9TIFguCgowNC8xNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gSW5jb3Jwb3JhdGVkIE5vYnUgTmFrYWRhJ3MgcGF0Y2hlcyBmb3Igc3VwcG9ydGluZyB0aGUgUnVieQogICAgICAgICAgICAxLjggYWxsb2NhdGlvbiBmcmFtZXdvcmsuCgowNC8xNS8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gUmVwbGFjZWQgYWxsIHVzZXMgb2YgdGhlIGRlcHJlY2F0ZWQgU1RSMkNTVFIoKSBtYWNybyB3aXRoIHRoZQogICAgICAgICAgICBzYWZlciBTdHJpbmdWYWx1ZVB0cigpIG1hY3JvLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHJ1YnktdGFsazo2NzA1OQogICAgICAgICAgICBhbmQgZm9sbG93LXVwcyB0byB0aGF0IHBvc3QuCgowNC8xMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBwcmVwcm9jZXNzb3IgbWFjcm8gZXhwYW5zaW9uLiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgICNkZWZpbmUgbWluKHgseSkgKCh4KSA8ICh5KSkgPyAoeCkgOiAoeSkgCiAgICAgICAgICAgICAgICBpbnQgZihpbnQgbWluKTsKCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IFNlYmFzdGllbiBSZWNpby4KCjA0LzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgYSBydW50aW1lIGNoZWNrIHRvIHR5cGVtYXBzIGluIGFycmF5c19qYXZhLmkgbGlicmFyeSB0byBjaGVjayAKICAgICAgICAgICAgdGhhdCB0aGUgSmF2YSBhcnJheSBwYXNzZWQgaW4gaXMgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgQyBhcnJheSBhbmQgdGhyb3cgYW4gCiAgICAgICAgICAgIGV4Y2VwdGlvbiBpZiBub3QuCgogICAgICAgICAgICBBbHNvIGZpeCB0byB1c2UgZGVsZXRlIGluc3RlYWQgb2YgZnJlZSBmb3IgYXJyYXlzIGNyZWF0ZWQgdXNpbmcgbmV3LgoKMDQvMDcvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFJlbW92ZSBHQ0MzIHdhcm5pbmcgd2hlbiBjb21waWxpbmcgdGhlIGV4YW1wbGVzIGFuZCB0ZXN0LXN1aXRlOgoKICAgICAgICAgICAgICBjYzFwbHVzOiB3YXJuaW5nOiBjaGFuZ2luZyBzZWFyY2ggb3JkZXIgZm9yIHN5c3RlbSBkaXJlY3RvcnkgIi91c3IvaW5jbHVkZSIKICAgICAgICAgICAgICBjYzFwbHVzOiB3YXJuaW5nOiBhcyBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZCBhcyBhIG5vbi1zeXN0ZW0gZGlyZWN0b3J5IAoKICAgICAgICAgICAgU2VlIFNGIHBhdGNoICM3MTU1MzEgc3VibWl0dGVkIGJ5IEdlcmFsZCBXaWxsaWFtcwoKMDQvMDMvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDI10gSW1wcm92ZWQgd3JhcHBpbmcgb2YgZW51bXMgYW5kIGNvbnN0YW50cy4gVGhlc2Ugd2VyZSBwcmV2aW91c2x5CiAgICAgICAgICAgIHdyYXBwZWQgYXMgQyMgdmFyaWFibGVzIHJhdGhlciB0aGFuIGNvbnN0YW50cy4gRWl0aGVyIHRoZXNlIGFyZSB3cmFwcGVkCiAgICAgICAgICAgIGFzIHJlYWRvbmx5IChydW50aW1lKSBjb25zdGFudHMgb3IgY29tcGlsZSB0aW1lIGNvbnN0YW50cywgZGVwZW5kaW5nIG9uCiAgICAgICAgICAgIHRoZSAlamF2YWNvbnN0IGRpcmVjdGl2ZSAoVGhlIGRpcmVjdGl2ZSBpcyBsaWtlbHkgdG8gY2hhbmdlIG5hbWUgc29vbikuCiAgICAgICAgICAgIEZvciBleGFtcGxlIHdyYXBwaW5nOgogICAgICAgICAgICAgICVqYXZhY29uc3QoMCk7CiAgICAgICAgICAgICAgI2RlZmluZSBBQkMgMjIKICAgICAgICAgICAgICAlamF2YWNvbnN0KDEpIFhZWjsKICAgICAgICAgICAgICAjZGVmaW5lIFhZWiAzMwogICAgICAgICAgICBpcyBub3c6CiAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyByZWFkb25seSBpbnQgQUJDID0gZXhhbXBsZVBJTlZPS0UuZ2V0X0FCQygpOwogICAgICAgICAgICAgIHB1YmxpYyBjb25zdCBpbnQgWFlaID0gMzM7CgowNC8wMy8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEdsb2JhbCBjb25zdGFudHMgYW5kIGVudW1zIGFyZSBwdXQgaW4gdGhlaXIgb3duIGludGVyZmFjZSBjYWxsZWQKICAgICAgICAgICAgeHh4Q29uc3RhbnRzLCB3aGVyZSB4eHggaXMgdGhlIG1vZHVsZSBuYW1lLiBUaGlzIGlzIGFuIGltcHJvdmVtZW50IGFzIAogICAgICAgICAgICBpdCBpcyBwb3NzaWJsZSB0byBkZXJpdmUgKGltcGxlbWVudCkgYSBKYXZhIGNsYXNzIGZyb20gdGhlIHh4eENvbnN0YW50cwogICAgICAgICAgICBpbnRlcmZhY2UgdG8gaW1wcm92ZSB0aGUgc3ludGF4OyBuYW1lbHkgd2hlbiB3cmFwcGluZzoKICAgICAgICAgICAgICBlbnVtIHtPTkU9MSwgVFdPLCBUSFJFRX07CiAgICAgICAgICAgIGFjY2Vzc2luZyB0aGVzZSBmcm9tIGEgSmF2YSBjbGFzcyBpbXBsZW1lbnRpbmcgeHh4Q29uc3RhbnRzIGlzIG5lYXRlcjoKICAgICAgICAgICAgICBpbnQgbnVtYmVyID0gT05FOwogICAgICAgICAgICB0aGFuIHRoZSBwcmV2aW91czoKICAgICAgICAgICAgICBpbnQgbnVtYmVyID0geHh4Lk9ORTsKCiAgICAgICAgICAgIFBhdGNoIHN1Ym1pdHRlZCBieSBEYXZlIERyaWJpbi4KCjA0LzAyLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBCdWlsZCBpbXByb3ZlbWVudHMgZm9yIG11bHRpcGxlIGJ1aWxkcy4gVGhpcyBhbGxvd3Mgb25lIHRvIGJ1aWxkCiAgICAgICAgICAgIHRoZSBTV0lHIGV4ZWN1dGFibGUgYW5kIHJ1bnRpbWUgbGlicmFyaWVzIGZvciBkaWZmZXJlbnQgcGxhdGZvcm1zL2NvbXBpbGVycyAKICAgICAgICAgICAgZXRjIGJ5IHJ1bm5pbmcgY29uZmlndXJlIGluIGRpZmZlcmVudCBkaXJlY3Rvcmllcy4gVGhpcyBpc24ndCAxMDAlIGp1c3QgCiAgICAgICAgICAgIHlldCBhbmQgd29uJ3QgYmUgdW50aWwgbGlidG9vbCBpcyBiZXR0ZXIgY29uZmlndXJlZC4uLiBhICdjb25maWd1cmUnIGFuZCAKICAgICAgICAgICAgJ21ha2UgZGlzdGNsZWFuJyBuZWVkcyB0byBiZSBydW4gaW4gdGhlIHJvb3QgZGlyZWN0b3J5IGJlZm9yZSBpdCBhbGwgd29ya3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogICAgICAgICAgICAgICQgLi9jb25maWd1cmUKICAgICAgICAgICAgICAkIG1ha2UgZGlzdGNsZWFuCiAgICAgICAgICAgICAgJCBta2RpciBjb25maWcxOyBjZCBjb25maWcxOyAuLi9jb25maWd1cmUgQ0M9Z2NjIENYWD1nKys7IG1ha2U7IGNkIC4uCiAgICAgICAgICAgICAgJCBta2RpciBjb25maWcyOyBjZCBjb25maWcyOyAuLi9jb25maWd1cmUgQ0M9Y2MgQ1hYPWMrKzsgbWFrZTsgY2QgLi4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRvIGJlIGltcHJvdmVkLiBBICdtYWtlIGNoZWNrJyBkb2VzIG5vdCB3b3JrIHlldCBlaXRoZXIuIAoKMDQvMDEvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIGFyZ3VtZW50IGV4cGFuc2lvbiBidWcuCiAgICAgICAgICAgIFRoaXMgc2hvd2VkIHVwIHdoZW4gdHJ5aW5nIHRvIHVzZSBzdGRfdmVjdG9yLmkgd2l0aCB2ZWN0b3JzCiAgICAgICAgICAgIG9mIHBvaW50ZXJzLgoKMDMvMzEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3IgcGFyYWxsZWwgbWFrZSBidWlsZHMgb2YgU1dJRywgZm9yIGV4YW1wbGUKICAgICAgICAgICAgICBtYWtlIC1qIDQKICAgICAgICAgICAgQnVpbGQgZmFpbHVyZSByZXBvcnRlZCBieSBCaWxsIENsYXJrZS4KCjAzLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgUmVsZWFzZWQgMS4zLjE5LgoKCgpWZXJzaW9uIDEuMy4xOSAoTWFyY2ggMjgsIDIwMDMpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjAzLzI4LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgVmFyaWV0eSBvZiBtaW5vciBidWcgZml4ZXMgdG8gdGhlIDEuMy4xOCByZWxlYXNlIGluY2x1ZGluZzoKCiAgICAgICAgICAgICAgICAtIFNlZ21lbnRhdGlvbiBmYXVsdCB3aXRoICVleHRlbmQgZGlyZWN0aXZlLgogICAgICAgICAgICAgICAgLSBUeXBlbWFwIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiBidWcuCiAgICAgICAgICAgICAgICAtIEV4cHJlc3Npb24gZXZhbHVhdGlvbiBidWcuCiAgICAgICAgICAgICAgICAtIExhcmdlIG1lbW9yeSBsZWFrIHdpdGggdGVtcGxhdGUgZXhwYW5zaW9uLgoKVmVyc2lvbiAxLjMuMTggKE1hcmNoIDIzLCAyMDAzKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMy8yMS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHR3byBwcm9ibGVtcyB3aXRoIHRoZSAlZXh0ZW5kIGRpcmVjdGl2ZSwgb3ZlcmxvYWRpbmcsIGFuZAogICAgICAgICAgICB0ZW1wbGF0ZSBleHBhbnNpb24uICBTZWUgdGhlICd0ZW1wbGF0ZV9leHRlbmRfb3ZlcmxvYWQnIGFuZAogICAgICAgICAgICAndGVtcGxhdGVfZXh0ZW5kX292ZXJsb2FkXzInIHRlc3RzIGluIEV4YW1wbGVzL3Rlc3Qtc3VpdGUgZm9yCiAgICAgICAgICAgIGRldGFpbHMuCgowMy8yMC8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBBZGRlZCBzb21lIHR5cGVtYXBzIGFzIHN1Z2dlc3RlZCBieSBBbmRyZWFzIFNjaG9lcmsgZm9yIGhhbmRsaW5nCiAgICAgICAgICAgIHBhcmFtZXRlcnMgdGhhdCBhcmUgcGFzc2VkIGFzIHBvaW50ZXJzIG9yIGJ5IHJlZmVyZW5jZS4gVGhlc2UgaGF2ZQogICAgICAgICAgICBiZWVuIHB1dCBpbiB0eXBlbWFwcy5pLgoKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIEMrKyBzY29waW5nIGJ1ZyByZWxhdGVkIHRvIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBGb286OmJhcigpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFByZXZpb3VzbHksIFNXSUcganVzdCB0b3NzZWQgb3V0IHRoZSBGb286OmJhcigpIGRlY2xhcmF0aW9uLiBOb3csCiAgICAgICAgICAgIHRoZSBkZWNsYXJhdGlvbiBpcyB3cmFwcGVkIHByb3ZpZGVkIHRoYXQgdGhlIHByZWZpeCBpcyBleGFjdGx5IHRoZQogICAgICAgICAgICBzYW1lIGFzIHRoZSBjdXJyZW50IHNjb3BlIChpbmNsdWRpbmcgYW55IGVuY2xvc2luZyBuYW1lc3BhY2VzKS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJ1Y2UgTG93ZXJ5LgoKMDMvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBJbmNvcnBvcmF0ZWQgWyA2OTY1MTYgXSBFbmFibGluZyBleGNlcHRpb24gcHJvY2Vzc2luZyBmb3IgZGF0YSBtZW1iZXIgYWNjZXNzLgogICAgICAgICAgICBJbiBzb21lIGNvbXBpbGVycywgYXR0cmlidXRlIGFjY2VzcyBjYW4gZ2VuZXJhdGUgZXhjZXB0aW9ucy4gIEhvd2V2ZXIsCiAgICAgICAgICAgIFNXSUcgb3JkaW5hcmlseSBhc3N1bWVzIHRoYXQgbm8gZXhjZXB0aW9ucyB3aWxsIGJlIHJhaXNlZC4gIFRvIGRpc2FibGUgdGhpcywKICAgICAgICAgICAgdXNlIHRoZSAlZmVhdHVyZSgiYWxsb3dleGNlcHQiKS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFsbG93ZXhjZXB0IikgRm9vOjp4OwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IHg7ICAgICAvKiBFeGNlcHRpb24gaGFuZGxpbmcgZW5hYmxlZCAqLwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBZYWtvdiBNYXJrb3ZpdGNoLiAKIAowMy8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEluY29ycG9yYXRlZCBQYXRjaC4gWyA3MDE4NjAgXSBJbXByb3ZlIFBlcmZvcm1hbmNlIChweXRob24gcHJveGllcykuCiAgICAgICAgICAgIEdpdmVzIGEgcGVyZm9ybWFuY2UgYm9vc3QgdG8gcHJveHkgY2xhc3MgY29kZSBhbmQgdGhlIG1hbmFnZW1lbnQgb2YgdGhlCiAgICAgICAgICAgIC50aGlzIGFuZCAudGhpc293biBhdHRyaWJ1dGVzLiAgQ29udHJpYnV0ZWQgYnkgTWlrZSBSb21iZXJnLgoKMDMvMTkvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtDIyBhbmQgSmF2YV0gQWRkZWQgbWlzc2luZyB2YXJhcmcgc3VwcG9ydC4KCjAzLzE4LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIFJlbW92ZWQgY29kZSByZWxhdGVkIHRvIHRhZ2dpbmcgaW5kaXZpZHVhbCBtZXRob2RzIGZvciBkaXJlY3RvcnMuCgkgICAgVGhlIGNvbmNlcHQgb2YgaGF2aW5nIGRpcmVjdG9ycyBmb3Igc29tZSBidXQgbm90IGFsbCB2aXJ0dWFsIG1ldGhvZHMKCSAgICBvZiBhIGNsYXNzIGlzIGRlZXBseSBmbGF3ZWQuICBUaGUgJWZlYXR1cmUoIm5vZGlyZWN0b3IiKSB0YWcgaXMgYWxzbwoJICAgIGdvbmUuICAKCSAgICAKCSAgICBEaXJlY3RvcnMgYXJlIG9mZiBieSBkZWZhdWx0LiAgVG8gZW5hYmxlIHRoZW0gZm9yIGEgY2xhc3MsIGlzc3VlCgkgICAgJWZlYXR1cmUoImRpcmVjdG9yIikgY2xhc3NuYW1lOyB3aGljaCB3aWxsIGNyZWF0ZSBkaXJlY3RvciBtZXRob2RzCgkgICAgZm9yIGV2ZXJ5IHZpcnR1YWwgbWV0aG9kIGluIHRoZSBoaWVyYXJjaHkgb2YgdGhlIGNsYXNzLgoKMDMvMTcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIHN1YnRsZSBwcm9ibGVtIHdpdGggcGFzc2luZyBhcmd1bWVudHMgb2YgdHlwZSBmdW5jdGlvbi4gIEZvcgogICAgICAgICAgICBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgeChpbnQsIGludCkpOwoKICAgICAgICAgICAgb3IKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IGJpbm9wX3QoaW50LCBpbnQpOwogICAgICAgICAgICAgICBpbnQgZm9vKGJpbm9wX3QgeCk7CgogICAgICAgICAgICBJbiBvbGQgdmVyc2lvbnMsIHRoaXMgd291bGQgcHJvZHVjZSBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZS4gIE5vdywKICAgICAgICAgICAgU1dJRyBtZXJlbHkgYWRkcyBhbiBleHRyYSBwb2ludGVyLCBtYWtpbmcgdGhlc2UgZGVjbGFyYXRpb25zIHRoZSBzYW1lCiAgICAgICAgICAgIGFzOgoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgKCp4KShpbnQsIGludCkpOwoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgYmlub3BfdChpbnQsIGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oYmlub3BfdCAqeCk7CgogICAgICAgICAgICBSZXBvcnRlZCBieSBHYXJ0aCBCdXNoZWxsLgoKMDMvMTcvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgRml4ZWQgdGhlIHJldHVybiBzdGF0ZW1lbnQgZm9yIGRpcmVjdG9yIGJhc2UgY2xhc3MgY2FsbHMgdGhhdCBoYXZlIG5vCiAgICAgICAgICAgIHJldHVybiB2YWx1ZS4KCjAzLzE1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggY29uc3Qgc21hcnQtcG9pbnRlciB3cmFwcGluZy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcigpIGNvbnN0OwogICAgICAgICAgICAgICAgICAgIHZvaWQgc3BhbSgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgY29uc3QgRm9vICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIG9ubHkgIngiIGFuZCAiYmFyIiBhcmUgdmlzaWJsZSBmcm9tIEJsYWggKHNpbmNlIGFwcGxpY2F0aW9uCiAgICAgICAgICAgIG9mIHNwYW0gdmlvbGF0ZXMgY29uc3RuZXNzKS4gIE1vcmVvdmVyLCBhY2Nlc3MgdG8gIngiIGlzIHJlYWQtb25seS4KICAgICAgICAgICAKMDMvMTUvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgQ2xlYW5lZCB1cCB0d28gc2lnbmVkIHZlcnN1cyB1bnNpZ25lZCBjb21wYXJpc29ucyBpbiBweXRob24vc3RkX3ZlY3Rvci5pLgoJICAgIAowMy8xNS8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBHbG9iYWwgdmFyaWFibGVzIGFyZSB3cmFwcGVkIHVzaW5nIHByb3BlcnRpZXMgaW5zdGVhZCBvZiBnZXQgYW5kIHNldCBtZXRob2RzLgogICAgICAgICAgICBNZW1iZXIgdmFyaWFibGUgd3JhcHBpbmcgYnVnIGZpeGVzLCBmb3IgZXhhbXBsZSB3cmFwcGluZyBwb2ludGVycyB3b3JrIG5vdy4KICAgICAgICAgICAgVHlwZW1hcHMgYXJlIHVzZWQgZm9yIGFsbCB2YXJpYWJsZSB3cmFwcGluZyB0byBnZW5lcmF0ZSB0aGUgcHJvcGVydHkgY29kZS4KCjAzLzEzLzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEZpeGVkIGEgYnVnIGluIHRoZSB2aXJ0dWFsIG1ldGhvZCB1bnJvbGxpbmcgZm9yIGRpcmVjdG9ycy4gCgkgICAgVGhlIG9yZGVyIG9mIHVucm9sbGluZyBpcyBub3cgZnJvbSBiYXNlIHRvIGRlcml2ZWQsIHRvIGVuc3VyZQoJICAgIHRoYXQgdGhlIG1vc3QgZGVyaXZlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIGRpcmVjdG9yIG1ldGhvZCBpcwoJICAgIGZvdW5kLgoKCSAgICBEaXJlY3RvciBtZXRob2RzIGZvciBwdXJlIHZpcnR1YWwgbWV0aG9kcyBub3cgdGhyb3cKCSAgICBESVJFQ1RPUl9QVVJFX1ZJUlRVQUxfRVhDRVBUSU9OIGlmIF91cCBpcyBzZXQuCgowMy8xMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0MjXSBQb2x5bW9ycGhpc20gZml4OiB2aXJ0dWFsIGZ1bmN0aW9ucyBub3cgdXNlIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICAgICBrZXl3b3JkIGluIHRoZSBDIyBwcm94eSBjbGFzcywgdmlydHVhbCBvciBvdmVycmlkZS4KICAgICAgICAgICAgU29tZSAndXNpbmcgU3lzdGVtOycgc3RhdGVtZW50IGZpeGVzIG5lZWRlZCBieSB0aGUgTW9ubyBjb21waWxlci4KCjAzLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIGJ1ZyBpbiB0aGUgYXBwbGljYXRpb24gb2YgU3dpZ1ZhbHVlV3JhcHBlcjw+IHRvCiAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzZXMgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEJydWNlIExvd2VyeS4KCjAzLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICRkZXNjcmlwdG9yKHR5cGUpIHZhcmlhYmxlIGlzIG5vdyBleHBhbmRlZCBpbiBjb2RlIHN1cHBsaWVkIHRvCiAgICAgICAgICAgICVleHRlbmQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgY2VydGFpbiBraW5kcyBvZiBhZHZhbmNlZCB3cmFwcGluZyAKICAgICAgICAgICAgKGVzcGVjaWFsbHkgY29udGFpbmVyIGNsYXNzZXMpLgoKMDMvMTEvMjAwMzogbHVpZ2kKICAgICAgICAgICAgU3VwcG9ydCBmb3Igc3RkOjptYXAuCiAgICAgICAgICAgIChhKSBJbnRlZ3JhdGlvbiB3aXRoIHNjcmlwdGluZyBsYW5ndWFnZSAoYSBsYSBzdGQ6OnZlY3RvcikgZm9yCiAgICAgICAgICAgICAgICBQeXRob24sIFJ1YnksIE16U2NoZW1lLCBhbmQgR3VpbGU7CiAgICAgICAgICAgIChiKSBTaW1wbGUgd3JhcHBlciBmb3Igb3RoZXIgbGFuZ3VhZ2VzCgowMy8xMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBlc2NhcGUgc2VxdWVuY2VzIGluIHN0cmluZyBhbmQgY2hhcmFjdGVyIGNvbnN0YW50cy4gIFNXSUcKICAgICAgICAgICAgd2Fzbid0IHBhcnNpbmcgY2VydGFpbiBvY3RhbCBjb2RlcyBjb3JyZWN0bHkuCgowMy8wNy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgdmFyaWV0eSBvZiBzdWJ0bGUgcHJlcHJvY2Vzc29yIHByb2JsZW1zIHJlcG9ydGVkIGJ5CiAgICAgICAgICAgIFNlYmFzdGllbiBSZWNpby4KCiAgICAgICAgICAgIChhKSBFbXB0eSBwcmVwcm9jZXNzb3IgdmFsdWVzIG5vIGxvbmdlciBnZW5lcmF0ZSAiYmFkIGNvbnN0YW50CiAgICAgICAgICAgIHZhbHVlIiBlcnJvcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PIEJBUgoKICAgICAgICAgICAgKGIpIE1hY3JvIG5hbWVzIGNhbiBub3cgc3BhbiBtdWx0aXBsZSBsaW5lcyAodGVjaG5pY2FsbHkgdmFsaWQsCiAgICAgICAgICAgIGFsdGhvdWdoIHF1ZXN0aW9uYWJsZSBwcmFjdGljZSkuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICNkZWZpbmUgQV9MT05HX01BQ1JPX1wKICAgICAgICAgICAgICAgICAgTkFNRSA0MgoKICAgICAgICAgICAgKGMpIFdoaXRlc3BhY2UgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGJlZm9yZSBjZXJ0YWluIG1hY3JvIHZhbHVlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjZGVmaW5lIEZPTyJIZWxsbyIKICAgICAgICAgICAgICAgICAgI2RlZmluZSBCQVJcCiAgICAgICAgICAgICAgICAgICJIZWxsbyIKIAowMy8wNy8yMDAzOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbWlzc2luZyBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlbWFwcwogICAgICAgICAgICBpbiB0aGUgTGliL3J1YnkvdHlwZW1hcHMuaSBsaWJyYXJ5IGZpbGUuCgowMy8wNy8yMDAzOiBtcm9zZSAoTWFyayBSb3NlKQogICAgICAgICAgICBBZGRlZCBFeGFtcGxlcy9weXRob24vY2FsbGJhY2sgdG8gZGVtb3N0cmF0ZSBob3cgZGlyZWN0b3JzIGNhbgoJICAgIGJlIHVzZWQgdG8gaW1wbGVtZW50IGNhbGxiYWNrcyBpbiBQeXRob24KCSAgICBBZGRlZCBFeGFtcGxlcy9weXRob24vZXh0ZW5kIHRvIGRlbW9uc3RyYXRlIHZpcnR1YWwgbWV0aG9kCgkgICAgY2FsbHMgZnJvbSBDKysgdG8gUHl0aG9uIChyZWFsbHkgdGhlIHNhbWUgYXMgdGhlIGNhbGxiYWNrCgkgICAgZXhhbXBsZSwganVzdCBhIGRpZmZlcmVudCBjb250ZXh0KS4KCSAgICBBZGRlZCBmb3VyIHRlc3RzIGZvciB2ZXJ5IGJhc2ljIGRpcmVjdG9yIGZ1bmN0aW9uYWxpdHkuICBUaGVzZQoJICAgIGhhdmUgcnVudGltZSB0ZXN0cyB1bmRlciBweXRob24uCgkgICAgVGhlIFB5dGhvbiBtb2R1bGUgbm93IGVtaXRzICNkZWZpbmUgU1dJR19ESVJFQ1RPUlMgbmVhciB0aGUKCSAgICB0b3Agb2YgdGhlIG91dHB1dCBmaWxlIGlmIGRpcmVjdG9ycyBhcmUgZW5hYmxlZC4gIFRoaXMgaXMgdXNlZnVsCgkgICAgZm9yIGRpc2FibGluZyBwYXJ0cyBvZiB0ZXN0cyBpbiB0YXJnZXQgbGFuZ3VhZ2VzIHRoYXQgZG9uJ3QKCSAgICBzdXBwb3J0IGRpcmVjdG9ycy4KCjAzLzA2LzIwMDM6IG1yb3NlIChNYXJrIFJvc2UpCiAgICAgICAgICAgIEFkZGVkIGEgc2VjdGlvbiB0byBEb2MvTWFudWFsL1B5dGhvbi5odG1sIG9uIGNyb3NzIGxhbmd1YWdlCgkgICAgcG9seW1vcnBoaXNtIChkaXJlY3RvcnMpLgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgVGhlIHNob3J0LWxpdmVkICItZmRpcmVjdG9ycyIgY29tbWFuZCBsaW5lIG9wdGlvbiBoYXMgYmVlbgoJICAgIHJlbW92ZWQuICBUbyBlbmFibGUgZGlyZWN0b3JzLCBpbnN0ZWFkIHVzZSB0aGUgZXh0ZW5kZWQgJW1vZHVsZSAKCSAgICBkaXJlY3RpdmUgYXMgZm9sbG93czoKCgkgICAgICAgICVtb2R1bGUoZGlyZWN0b3JzPSIxIikgbW9kdWxlbmFtZQoKMDMvMDYvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFRoZSBsb25nIGxvbmcgdHlwZW1hcHMgaGF2ZSBiZWVuIHJld3JpdHRlbiBzbyB0aGF0IHRoZXkgY2FuIGJlIG1vcmUKICAgICAgICAgICAgZWFzaWx5IHVzZWQgd2l0aCBub24gSVNPIGNvbXBpbGVycywgbGlrZSBWaXN1YWwgQysrLiBGb3IgZXhhbXBsZQogICAgICAgICAgICBpZiB5b3UgYXJlIHdyYXBwaW5nIHRoZSBXaW5kb3dzIDY0IGJpdCB0eXBlIF9faW50NjQgdGhlIGxvbmcgbG9uZwogICAgICAgICAgICB0eXBlbWFwcyBjYW4gYmUgdXNlZCB3aXRoICVhcHBseToKCiAgICAgICAgICAgICAgICAlYXBwbHkgbG9uZyBsb25nIHsgX19pbnQ2NCB9OwogICAgICAgICAgICAgICAgX19pbnQ2NCB2YWx1ZTEoX19pbnQ2NCB4KTsKCiAgICAgICAgICAgIF9faW50NjQgd2lsbCBub3cgYXBwZWFyIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBpbnN0ZWFkIG9mIGxvbmcgbG9uZy4KICAgICAgICAgICAgCjAzLzA2LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgKioqIERFVkVMT1BFUiBDSEFOR0UgKioqCiAgICAgICAgICAgIFN3aWcgbW9kdWxlIG11dGF0aW9uIGhhcyBiZWVuIGNoYW5nZWQgc2xpZ2h0bHkuICBXaGVuIGEgbGFuZ3VhZ2UKICAgICAgICAgICAgY2xhc3MgbWV0aG9kIHdhbnRzIHRvIHNhdmUgbm9kZSBhdHRyaWJ1dGVzLCBpdCBub3cgdXNlcyBvbmUgb2YgdGhlCiAgICAgICAgICAgIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgICAgICAgICBTd2lnX3JlcXVpcmUoKQogICAgICAgICAgICAgICAgICBTd2lnX3NhdmUoKQoKICAgICAgICAgICAgVGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZXNlIGZ1bmN0aW9ucyBpcyBhIG5hbWVzcGFjZSBpbiB3aGljaAogICAgICAgICAgICBzYXZlZCBhdHRyaWJ1dGVzIGFyZSBwbGFjZWQuICBGb3IgZXhhbXBsZSx0aGlzIGNvZGUKCiAgICAgICAgICAgICAgICAgIE5vZGUgKm47CiAgICAgICAgICAgICAgICAgIFN3aWdfc2F2ZSgiY0RlY2xhcmF0aW9uIixuLCJ0eXBlIiwicGFybXMiLCJuYW1lIixOSUwpOwoKICAgICAgICAgICAgc2F2ZXMgdGhlIGF0dHJpYnV0ZXMgYXMgImNEZWNsYXJhdGlvbjp0eXBlIiwgImNEZWNsYXJhdGlvbjpwYXJtcyIsCiAgICAgICAgICAgIGFuZCBzbyBmb3J0aC4gICBJZiBuZWNlc3NhcnksIGEgbGFuZ3VhZ2UgbW9kdWxlIGNhbiByZWZlciB0bwogICAgICAgICAgICBvbGQgdmFsdWVzIGJ5IHVzaW5nIHRoaXMgc3BlY2lhbCBuYW1lc3BhY2UgcXVhbGlmaWVyLgoKICAgICAgICAgICAgSW4gYWRkaXRpb24gdG8gdGhpcywgYSBzcGVjaWFsIGF0dHJpYnV0ZSAidmlldyIgY29udGFpbnMgdGhlIG5hbWUKICAgICAgICAgICAgb2YgdGhlIGxhc3QgbmFtZXNwYWNlIHVzZWQgdG8gc2F2ZSBhdHRyaWJ1dGVzLiAgSW4gdGhlIGFib3ZlIAogICAgICAgICAgICBleGFtcGxlLCAidmlldyIgd291bGQgaGF2ZSB0aGUgdmFsdWUgImNEZWNsYXJhdGlvbiIuICAgVGhlIHZhbHVlCiAgICAgICAgICAgIG9mICJjRGVjbGFyYXRpb246dmlldyIgd291bGQgaGF2ZSB0aGUgcHJldmlvdXMgdmlldyBhbmQgc28gZm9ydGguCgogICAgICAgICAgICBTd2lnX3Jlc3RvcmUobikgcmVzdG9yZXMgYSBub2RlIHRvIHRoZSBzdGF0ZSBiZWZvcmUgdGhlIGxhc3QKICAgICAgICAgICAgU3dpZ19yZXF1aXJlKCkgb3IgU3dpZ19zYXZlKCkgY2FsbC4KCiAgICAgICAgICAgIE5vdGU6ICBUaGlzIGNoYW5nZSBtYWtlcyBpdCBlYXNpZXIgZm9yIGxhbmd1YWdlIG1vZHVsZXMgdG8gcmVmZXIKICAgICAgICAgICAgdG8gb2xkIHZhbHVlcyBvZiBhdHRyaWJ1dGVzLiAgCgoKMDMvMDYvMjAwMzogbXJvc2UgKE1hcmsgUm9zZSkKICAgICAgICAgICAgTWVyZ2VkIHRoZSBjcm9zcy1sYW5ndWFnZSBwb2x5bW9ycGhpc20gcGF0Y2guICBXaGVuIGVuYWJsZWQsIEMrKyAKCSAgICAicHJveHkiIGNsYXNzZXMgKGNhbGxlZCBkaXJlY3RvcnMpIGFyZSBnZW5lcmF0ZWQgZm9yIGVhY2ggc3BlY2lmaWVkIAoJICAgIEMrKyBjbGFzcy4gIERpcmVjdG9ycyBwYXNzIG1ldGhvZCBjYWxscyBmcm9tIEMrKyB0byBQeXRob24sIHNpbWlsYXIgCgkgICAgdG8gdGhlIHdheSB0aGUgdXN1YWwgcHJveHkgKHNoYWRvdykgY2xhc3NlcyBwYXNzIG1ldGhvZCBjYWxscyBmcm9tIAoJICAgIFB5dGhvbiB0byBDKysuICBUb2dldGhlciwgdGhlc2UgdHdvIHR5cGVzIG9mIHByb3hpZXMgYWxsb3cgQysrIAoJICAgIGNsYXNzZXMgdGhhdCBhcmUgZXh0ZW5kZWQgaW4gUHl0aG9uIHRvIGJlaGF2ZSBqdXN0IGxpa2Ugb3JkaW5hcnkgCgkgICAgQysrIGNsYXNzZXMgYW5kIGJlIHVzZWQgaW4gQysrIGxpa2UgbmF0aXZlIG9iamVjdHMuICAKCSAgICAKCSAgICBUaGlzIGZlYXR1cmUgaXMgc3RpbGwgdmVyeSBleHBlcmltZW50YWwgYW5kIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCgkgICAgVG8gZW5hYmxlIGRpcmVjdG9yIHN1cHBvcnQsIHNwZWNpZnkgJy1mZGlyZWN0b3JzJyBvbiB0aGUgU1dJRyBjb21tYW5kCgkgICAgbGluZSBvciBpbiB0aGUgU1dJR19GRUFUVVJFUyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEluIHRoZSBpbnRlcmZhY2UKCSAgICBmaWxlLCBhZGQgJWZlYXR1cmUoImRpcmVjdG9yIikgdG8gZ2VuZXJhdGUgZGlyZWN0b3JzIGZvciBhbGwgY2xhc3NlcwoJICAgIHRoYXQgaGF2ZSB2aXJ0dWFsIG1ldGhvZHMuICAKCSAgICAKCSAgICBTZWUgaHR0cDovL3N0bS5sYmwuZ292L350bTIvc3dpZy9Qcm94eURvYy5odG1sIGZvciBtb3JlIGRldGFpbHMuCgkgICAgCgowMy8wMy8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgc21hbGwgZ2xpdGNoIGluIHR5cGVtYXAgbG9jYWwgdmFyaWFibGUgcmVwbGFjZW1lbnQuICBJZiB5b3UgaGFkCiAgICAgICAgICAgIGEgdHlwZW1hcCBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB0eXBlICgkMV90eXBlIHRlbXApIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgdGVtcCA9IC4uLjsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFuZCBubyBvY2N1cnJlbmNlIG9mICIkMV90eXBlIiBhcHBlYXJlZCBpbiB0aGUgYm9keSwgdGhlbiB0aGUgbG9jYWwKICAgICAgICAgICAgdmFyaWFibGUgdHlwZSB3b3VsZG4ndCBiZSBzdWJzdGl0dXRlZC4KCjAzLzAzLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbQyNdIE5ldyB2ZXJzaW9uIG9mIHRoZSBDU2hhcnAgbW9kdWxlIHdoaWNoIGlzIHR5cGVtYXAgYmFzZWQuCiAgICAgICAgICAgIEl0IGFsc28gdXNlcyBFQ01BIEMjIGFuZCBubyBsb25nZXIgdXNlcyBNaWNyb3NvZnQgVmlzdWFsIEMrKy5ORVQgCiAgICAgICAgICAgIGdsdWUuIFRoaXMgbWVhbnMgdGhhdCBpdCB3aWxsIHdvcmsgb24gbm9uLVdpbmRvd3MgcGxhdGZvcm1zLgogICAgICAgICAgICBDb250cmlidXRlZCBieSBOZWlsIENhd3NlLgoKMDIvMjcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY1MzU0OCBdIGVycm9yIHBhcnNpbmcgY2FzdGluZyBvcGVyYXRvciBkZWZpbml0aW9uLgogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIGNhc3Rpbmcgb3BlcmF0b3JzIGRlY2xhcmVkIG91dHNpZGUgb2YgYSBjbGFzcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW5saW5lIEE6Om9wZXJhdG9yIGNoYXIgKigpIHsgLi4uIH0KCiAgICAgICAgICAgIEJ1ZyByZXBvcnRlZCBieSBNYXJ0aW4gQ2FzYWRvLgoKMDIvMjcvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBhbm9ueW1vdXMgYml0LWZpZWxkcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgIGludCB4IDogNDsKICAgICAgICAgICAgICAgICAgICAgIGludCAgIDogNDsKICAgICAgICAgICAgICAgICAgICAgIGludCB5IDogODsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQW5vbnltb3VzIGJpdC1maWVsZHMgYXJlIGlnbm9yZWQgYnkgU1dJRy4gICBQcm9ibGVtCiAgICAgICAgICAgIHJlcG9ydGVkIGJ5IEZyYW56IEj2cGZpbmdlci4KCjAyLzI2LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQmV0dGVyIHR5cGVtYXBzIGluIHRoZSBFeGFtcGxlcy9qYXZhL3R5cGVtYXAgZXhhbXBsZSBhbmQgYWxzbyAKICAgICAgICAgICAgZml4ZXMgc3VidGxlIGJ1ZyB3aGVuIHVzaW5nIHRoZSBTdHJpbmdCdWZmZXIgdHlwZW1hcHMgbW9yZSB0aGFuIG9uY2UuCgowMi8yNi8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjQyMTEyIF0gQ29uc3RhbnRzIGNoYXIgYnVnLgoKMDIvMjYvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY3NTMzNyBdIFBhcnRpYWwgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gbm90IGVudGlyZWx5IHdvcmtpbmcuCiAgICAgICAgICAgIFRoZXJlIHdhcyBhIHN1YnRsZSBwcm9ibGVtIHJlbGF0ZWQgdG8gdGhlIG5hbWluZyBhbmQgb3JkZXJpbmcgb2YKICAgICAgICAgICAgdGVtcGxhdGUgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBhcmd1bWVudHMuICBNYXRjaGluZyB3b3JrZWQgb2theSwKICAgICAgICAgICAgdGhlIHJlc3VsdGluZyB0ZW1wbGF0ZXMgd2VyZW4ndCBleHBhbmRlZCBjb3JyZWN0bHkuCgowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBwYXJzaW5nIChhbmQgZ2VuZXJhdGluZyBjb2RlKSBmb3IgCiAgICAgICAgICAgIHJlZmVyZW5jZXMgdG8gYXJyYXlzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgaW50IGZvbyhpbnQgKCZ4KVsxMF0pOwogIAowMi8yNS8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjM1MzQ3IF0gQ29tcGlsYXRpb24gd2FybmluZyBmcm9tIGxpYnB5LmMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IERhbmllbCBMLiBSYWxsLgogCjAyLzI1LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHZpcnR1YWwgbWV0aG9kIGltcGxlbWVudGF0aW9uCiAgICAgICAgICAgIGNoZWNraW5nIGFuZCB0eXBlZGVmLgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAqaW50cHRyOwoKICAgICAgICAgICAgICAgICBzdHJ1Y3QgQSB7CiAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgKmZvbygpID0gMDsKICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogcHVibGljIEEgewogICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgaW50cHRyIGZvbygpIHsgfTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyB3YXMgdHJlYXRpbmcgdGhlc2UgZGVjbGFyYXRpb25zIGFzIGRpZmZlcmVudCBldmVuIHRob3VnaAogICAgICAgICAgICB0aGV5IGFyZSB0aGUgc2FtZSAodmlhIHR5cGVkZWYpLgoKMDIvMjUvMjAwMzogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHJhbmdlIGNoZWNraW5nIGZvciB0aGUgTlVNMlVTSFJUIG1hY3JvLCBwZXIgWyA2NzUzNTMgXS4KCjAyLzI0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBzdWJ0bGUgcHJvYmxlbSB3aXRoIHRoZSBjb2RlIHRoYXQgZGV0ZXJtaW5lZCBpZiBhIGNsYXNzIGlzIGFic3RyYWN0CiAgICAgICAgICAgIGFuZCBjYW4gYmUgaW5zdGFudGlhdGVkLiAgICBJZiB5b3UgaGFkIGNsYXNzZXMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgc3RydWN0IEEgewogICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCBmb28oaW50KSA9IDA7CiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIHN0cnVjdCBCIDogdmlydHVhbCBBIHsKICAgICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBzdHJ1Y3QgQyA6IHZpcnR1YWwgQSB7IAogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICAgLyogTm90ZSBvcmRlciBvZiBiYXNlIGNsYXNzZXMgKi8JCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBEIDogQiwgQyB7IH07ICAgIC8qIE9rICovCiAgICAgICAgICAgICAgICAgIHN0cnVjdCBFIDogQywgQiB7IH07ICAgIC8qIEJyb2tlbiAqLwoKICAgICAgICAgICAgdGhlbiBTV0lHIGRldGVybWluZWQgdGhhdCBpdCBjb3VsZCBpbnN0YW50aWF0ZSBEKCksIGJ1dCBub3QgRSgpLgogICAgICAgICAgICBUaGlzIGluY29uc2lzdGVuY3kgYXJvc2UgZnJvbSB0aGUgZGVwdGgtZmlyc3Qgc2VhcmNoIG9mIHRoZSAKICAgICAgICAgICAgaW5oZXJpdGFuY2UgaGllcmFyY2h5IHRvIGxvY2F0ZSB0aGUgaW1wbGVtZW50YXRpb25zIG9mIHZpcnR1YWwKICAgICAgICAgICAgbWV0aG9kcy4gICBUaGlzIHByb2JsZW0gc2hvdWxkIG5vdyBiZSBmaXhlZC0tLVNXSUcgd2lsbCBhdHRlbXB0CiAgICAgICAgICAgIHRvIGxvY2F0ZSBhbnkgdmFsaWQgaW1wbGVtZW50YXRpb24gb2YgYSB2aXJ0dWFsIG1ldGhvZCBieQogICAgICAgICAgICB0cmF2ZXJzaW5nIG92ZXIgdGhlIGVudGlyZSBoaWVyYXJjaHkuCgowMi8yMi8yMDAzOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgdXNpbmcgZW51bSB0eXBlbWFwcy4gVGhlIEphdmEgZmluYWwgc3RhdGljIHZhcmlhYmxlIHR5cGUKICAgICAgICAgICAgY2FuIGJlIHNldCB1c2luZyB0aGUganN0eXBlIHR5cGVtYXAsIGVuYWJsaW5nIGVudW1zIHRvIGJlIG1hcHBlZCB0byAKICAgICAgICAgICAgc29tZXRoaW5nIG90aGVyIHRoYW4gaW50LiBCdWcgcmVwb3J0ZWQgYnkgSGVpbmVyIFBldGl0aC4KCjAyLzIxLzIwMDM6IHNvbmd5YW5mIChUaWdlcikKICAgICAgICAgICAgQWRkZWQgQ1NoYXJwIChDIykgbW9kdWxlIHByb3RvdHlwZQogICAgICAgICAgICBpLmUuIGNzaGFycC5jeHggJiBjc2hhcnAuaCBhdCBTb3VyY2UvTW9kdWxlcy8uCiAgICAgICAgICAgIFRoZXkgYXJlIGZvciB0ZXN0IHVzYWdlIG9ubHkgbm93IGFuZCBuZWVkIGltcHJvdmVtZW50LgogICAgICAgICAgICBUaGUgaW50ZXJmYWNlIGFsc28gbmVlZCB0byBiZSBtb2RpZmllZC4KCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAKMDIvMjAvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZWRlZiB3aXRoIC1mdmlydHVhbC4KICAgICAgICAgICAgU2ltaWxhciBhcyBiZWF6bGV5J3MgbW9kaWZpY2F0aW9uIHRvZGF5LgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBnY2Mtc3R5bGUgdmFyaWFkaWMgcHJlcHJvY2Vzc29yIG1hY3Jvcy4gIAogICAgICAgICAgICBQYXRjaCBbIDYyMzI1OCBdIEdDQy1zdHlsZSB2YXJhcmcgbWFjcm8gc3VwcG9ydC4KICAgICAgICAgICAgQ29udHJpYnV0ZWQgYnkgSm9lIE1hc29uLgoKMDIvMjAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwNTE2MiBdIFR5cGVtYXAgbG9jYWwgdmFyaWFibGVzLgogICAgICAgICAgICBSZXBvcnRlZCBieSBMeWxlIEpvaG5zb24uCgowMi8yMC8yMDAzOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBhYnN0cmFjdCBjbGFzc2VzIGFuZCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oaW50IHgpID0gMDsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oSW50ZWdlciB4KTsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFNXSUcgd2FzIGdldHRpbmcgY29uZnVzZWQgYWJvdXQgdGhlIGxhdHRlciBtZXRob2QtLS1tYWtpbmcgQmFyCiAgICAgICAgICAgIGFic3RyYWN0LiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjAyLzE5LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gJWphdmFjb25zdChmbGFnKSBjYW4gYWxzbyBiZSB1c2VkIG9uIGVudW1zIGFzIHdlbGwgYXMgY29uc3RhbnRzLgogICAgICAgICAgICBUaGlzIGZlYXR1cmUgZW5hYmxlcyB0cnVlIEphdmEgY29tcGlsZXIgY29uc3RhbnRzIHNvIHRoYXQgdGhleSBjYW4gYmUgCiAgICAgICAgICAgIHVzZWQgaW4gSmF2YSBzd2l0Y2ggc3RhdGVtZW50cy4gVGhhbmtzIHRvIEhlaW5lciBQZXRpdGggZm9yIHBhdGNoZXMuCgowMi8xOS8yMDAzOiBzb25neWFuZiAoVGlnZXIpCiAgICAgICAgICAgIE1vZGlmaWVkIC1mY29tcGFjdCBmZWF0dXJlIHRvIGRlYWwgd2l0aCBQUCBsaW5lcwoKMDIvMTgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY4OTA0MCBdIE1pc3NpbmcgcmV0dXJuIHZhbHVlIGluIHN0ZF92ZWN0b3IuaS4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUm9iZXJ0IEguIGRlIFZyaWVzLgoKMDIvMTgvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGZldyBldmlsIHNjb3BpbmcgcHJvYmxlbXMgd2l0aCB0ZW1wbGF0ZXMsIG5hbWVzcGFjZXMsIGFuZCB0aGUKICAgICAgICAgICAgJWV4dGVuZCBkaXJlY3RpdmUuICBQcm9ibGVtIHJlcG9ydGVkIGJ5IEx1aWdpIEJhbGxhYmlvLgoKCjAyLzE4LzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbUnVieV0gSW1wcm92ZWQgc3VwcG9ydCBmb3IgVmlzdWFsIEMrKyBhbmQgb3RoZXIgbmF0aXZlIFdpbmRvd3MgY29tcGlsZXJzLiAKICAgICAgICAgICAgSXQgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSB0byBzcGVjaWZ5ICIvRVhQT1JUOkluaXRfPG1vZHVsZT4iLCB3aGVyZSA8bW9kdWxlPiBpcyB0aGUKICAgICAgICAgICAgc3dpZyBtb2R1bGUgbmFtZSB3aGVuIGxpbmtpbmcgdXNpbmcgdGhlc2UgbmF0aXZlIFdpbmRvd3MgY29tcGlsZXJzLgoKMDIvMTUvMjAwMzogc29uZ3lhbmYgKFRpZ2VyKQogICAgICAgICAgICBBZGRlZCAtZnZpcnR1YWwgb3B0aW9uLgogICAgICAgICAgICBSZWR1Y2UgdGhlIGxpbmVzIGFuZCBzaXplIG9mIHRoZSB3cmFwcGVyIGZpbGUKICAgICAgICAgICAgYnkgb21pdHRpbmcgcmVkaWZpbmVkIHZpcnR1YWwgZnVuY3Rpb24gaW4gY2hpbGRyZW4gY2xhc3Nlcy4KCiAgICAgICAgICAgIE1vZGlmaWVkIC1jb21wYWN0IG9wdGlvbiB0byAtZmNvbXBhY3Qgb3B0aW9uCgogICAgICAgICAgICBBZGRlZCAtc21hbGwgb3B0aW9uLgogICAgICAgICAgICAtc21hbGwgPSAtZnZpcnR1YWwgLWZjb21wYWN0CiAgICAgICAgICAgIEFuZCBpdCBjYW4gYmUgZXh0ZW5kZWQgYnkgZnV0dXJlIGZlYXR1cmUgb3B0aW9ucywKICAgICAgICAgICAgd2hpY2ggYXJlIHVzZWQgdG8gcmVkdWNlIHdyYXBwZXIgZmlsZSBzemllLgoKICAgICAgICAgICAgQWRkZWQgU1dJR19GRUFUVVJFUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjaGVjay4KICAgICAgICAgICAgVG8gZHluYW1pY2FsbHkgc2V0IHRoZSBmZWF0dXJlIG9wdGlvbnMgc3VjaCBhcyAtZmNvbXBhY3QgJiAtZnZpcnR1YWwKICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDIvMTMvMjAwMzogbGVuegogICAgICAgICAgICBVcGRhdGVkIERvYy9NYW51YWwvUGVybDUuaHRtbCB0byB0YWxrIGFib3V0IEMrKyBjb21waWxlIHByb2JsZW1zCiAgICAgICAgICAgIGNvbmZpZ3VyZS5pbiBub3cgY2hlY2tzIGZvciBQRVJMNV9DQ0ZMQUdTCiAgICAgICAgICAgIFJ1bnRpbWUvTWFrZWZpbGUuaW4gYW5kIEV4YW1wbGUvTWFrZWZpbGUuaW4gbm93IHVzZSBQRVJMNV9DQ0ZMQUdTCiAgICAgICAgICAgIEFkZGVkIExpYi9wZXJsNS9ub2VtYmVkLmggd2hpY2ggY29udGFpbnMgYWxsIHRoZSBrbm93biBtYWNybyBjb25mbGljdHMKCjAyLzEyLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA2ODU0MTAgXSBDKysgRXhwbGljaXQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiBjYXVzZXMgU1dJRyB0byBleGl0LgogICAgICAgICAgICBGaXhlcyBhIHN5bnRheCBlcnJvciB3aXRoIGRlY2xhcmF0aW9ucyBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICAgIHRlbXBsYXRlIGNsYXNzIHN0ZDo6dmVjdG9yPGludD47CgogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIHRoZSBpbnN0YW50aWF0aW9uIGFuZCBnZW5lcmF0ZXMgYSB3YXJuaW5nIG1lc3NhZ2UuCiAgICAgICAgICAgIFdlIG1pZ2h0IGRvIG1vcmUgbGF0ZXIuICBSZXBvcnRlZCBieSBUaG9tYXMgV2lsbGlhbXNvbi4KCjAyLzExLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBSZXdyb3RlIGJvb2wgdHlwZW1hcHMgdG8gcmVtb3ZlIHBlcmZvcm1hbmNlIHdhcm5pbmcgZm9yIGNvbXBpbGluZyBnZW5lcmF0ZWQgY29kZQogICAgICAgICAgICB1bmRlciBWaXN1YWwgQysrLgoKMDIvMTEvMjAwMzogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIEZpeCBmb3Igd3JhcHBpbmcgcmVmZXJlbmNlIHZhcmlhYmxlcyAoY29uc3Qgbm9uLXByaW1pdGl2ZSBhbmQgYWxsIG5vbi1jb25zdCB0eXBlcykgCiAgICAgICAgICAgIGZvciBleGFtcGxlOgogICAgICAgICAgICAgIGludCYgaTsKICAgICAgICAgICAgICBDbGFzcyYgYzsKICAgICAgICAgICAgICBjb25zdCBDbGFzcyYgYzsKCjAyLzExLzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgbW9yZSB2ZXJ5IHN1YnRsZSBwcmVwcm9jZXNzb3IgY29ybmVyIGNhc2VzIHJlbGF0ZWQgdG8gcmVjdXJzaXZlCiAgICAgICAgICAgIG1hY3JvIGV4cGFuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICNkZWZpbmUgY2F0KHgseSkgeCAjIyB5CgogICAgICAgICAgICAgICAgICAgY2F0KGNhdCgxLDIpLDMpICAgIC8vIFByb2R1Y2VzOiBjYXQoMSwyKTMKICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgI2RlZmluZSB4Y2F0KHgseSkgY2F0KHgseSkKCiAgICAgICAgICAgICAgICAgICB4Y2F0KHhjYXQoMSwyKSwzKSAgLy8gUHJvZHVjZXMgMTIzCgogICAgICAgICAgICBTZWUgSyZSLCAybmQgRWQuIHAuIDIzMS4KCjAyLzEwLzIwMDM6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBGaXhlZCBbIDY4Mzg4MiBdIC0gcGF0Y2ggc3VibWl0dGVkIGJ5IEYuIFBvc3RtYSBmb3IgU1dJRyB0byBjb21waWxlIG9uIEhQLVVYLgoKMDIvMTAvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzdWJ0bGUgcHJlcHJvY2Vzc29yIGFyZ3VtZW50IGV4cGFuc2lvbiBidWcuIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowMi8xMC8yMDAzOiBzb25neWFuZgogICAgICAgICAgICBBZGRlZCAtY29tcGFjdCBvcHRpb24uCiAgICAgICAgICAgIFJlZHVjZSB0aGUgbGluZXMgYW5kIHNpemUgb2YgdGhlIHdyYXBwZXIgZmlsZQogICAgICAgICAgICBieSBvbWl0dGluZyBjb21tZW50cyBhbmQgY29tYmluaW5nIHNob3J0IGxpbmVzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAKMDIvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY1MTM1NSBdIFN5bnRheCBlcnJvciB3aXRoIGNzdHJpbmcuaQogICAgICAgICAgICBSZXBvcnRlZCBieSBPbXJpIEJhcmVsLgoKMDIvMDcvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY2MzYzMiBdIGluY29tcGF0aWJpbGl0eSB3aXRoIHN0YW5kYXJkIGNwcC4KICAgICAgICAgICAgVGhpcyBpcyBhIHJlZmluZW1lbnQgdGhhdCBmaXhlcyB0aGlzIHByb2JsZW06CgogICAgICAgICAgICAgICAgIC8vIFNvbWUgbWFjcm8gd2l0aCBhbiBhcmd1bWVudAogICAgICAgICAgICAgICAgICNkZWZpbmUgRk9PKHgpICAgICAgIHgKCiAgICAgICAgICAgICAgICAgaW50IEZPTzsgICAgICAgIC8qIE5vdCBhIG1hY3JvLS0tbm8gYXJndW1lbnRzICovCiAKMDIvMDUvMjAwMzogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDY3NTQ5MSBdIHBhcnNlIGVycm9yIHdpdGggZ2xvYmFsIG5hbWVzcGFjZSBxdWFsaWZpY2F0aW9uLgogICAgICAgICAgICBTdWJtaXR0ZWQgYnkgSmVyZW15IFlhbGxvcC4KCjAyLzA0LzIwMDM6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIGluIHZhcmFyZ3MgcHJvY2Vzc2luZyBpbnRyb2R1Y2VkIGJ5IHRoZSBudW1pbnB1dHMgdHlwZW1hcCBwYXJhbWV0ZXIuCgowMS8wOC8yMDAzOiB0dG4KCSAgICBbeG1sXSBGaXggc3RyaW5nLXJlcGxhY2VtZW50IG9yZGVyaW5nIGJ1Z2xldC4KCSAgICBUaGFua3MgdG8gR2FyeSBIZXJyb24uCgoxMi8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRnVydGhlciBidWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIFRoZSBTV0lHIGV4ZWN1dGFibGUgaXMgbm93IGJ1aWx0IHVzaW5nIGEgc2luZ2xlIE1ha2VmaWxlLgogICAgICAgICAgICAtIFRoaXMgbWFrZWZpbGUgaXMgZ2VuZXJhdGVkIGJ5IEF1dG9tYWtlIChTb3VyY2UvTWFrZWZpbGUuYW0pLgogICAgICAgICAgICAtIERlcGVuZGVuY3kgdHJhY2tpbmcgYW5kIHRhZ3Mgc3VwcG9ydCBhcmUgaW4gdGhpcyBtYWtlZmlsZS4KICAgICAgICAgICAgLSBBdXRvbWFrZSAxLjcuMiBhbmQgQXV0b2NvbmYgMi41NCBtaW5pbXVtIHZlcnNpb25zIGFyZSBuZWVkZWQgdG8gYnVpbGQgU1dJRyBmcm9tIENWUy4KICAgICAgICAgICAgLSBSdW5uaW5nIC4vYXV0b2dlbi5zaCBub3cgaW5zdGFsbHMgQXV0b2NvbmYvQXV0b21ha2Ugc3VwcG9ydCBmaWxlcyBpbnRvCiAgICAgICAgICAgICAgVG9vbHMvY29uZmlnIGFuZCB0aGVzZSBmaWxlcyBhcmUgbm8gbG9uZ2VyIHN0b3JlZCBpbiBDVlMuCiAgICAgICAgICAgIC0gQnVnIGZpeGVzIGluICdtYWtlIGluc3RhbGwnIGZvciBzeXN0ZW1zIHVzaW5nIC5leGUgZXhlY3V0YWJsZSBleHRlbnNpb24gYW5kCiAgICAgICAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXJlbGVhc2Utc3VmZml4PXdoYXRldmVyCgoxMi8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgTW9yZSBidWlsZCBjaGFuZ2VzOgogICAgICAgICAgICAtIEF1dG9jb25mJ3MgQUNfQ0FOT05JQ0FMX0hPU1QgcmVwbGFjZXMgcHJvcHJpZXRhcnkgYXBwcm9hY2ggZm9yIGRldGVjdGluZyBidWlsZCBob3N0LgogICAgICAgICAgICAtIEF1dG9jb25mIHN1cHBvcnQgZmlsZXMgbW92ZWQgdG8gVG9vbHMvY29uZmlnLgoKMTIvMTYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIE1vZGlmaWNhdGlvbnMgdG8gcnVuIG9uIE1hY09TLCBzdWJtaXR0ZWQgYnkgQmVybmFyZCBEZXNncmF1cGVzLgogICAgICAgICAgICBNYWlubHkgZW5zdXJpbmcgZ2VuZXJhdGVkIGZpbGVzIGFyZSBvdXRwdXQgaW4gdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBmb3IKICAgICAgICAgICAgc29tZSBtb2R1bGVzLgoKMTIvMTEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFZhcmlvdXMgYnVpbGQgbW9kaWZpY2F0aW9ucyBhbmQgYnVnIGZpeGVzOgogICAgICAgICAgICAtIFNpbXBsaWZpY2F0aW9uIG9mIHZlcnNpb24gc3RyaW5nLiBVc2UgYXV0b2NvbmYncyBQQUNLQUdFX1ZFUlNJT04gaW5zdGVhZC4KICAgICAgICAgICAgLSBCdWlsZCB0aW1lIHJlbW92ZWQgZnJvbSBTV0lHIHZlcnNpb24uCiAgICAgICAgICAgIC0gVXNpbmcgc3RhbmRhcmQgYXV0b2NvbmYgY29uZmlnIGhlYWRlciBnZW5lcmF0aW9uLgogICAgICAgICAgICAtIFVwZGF0ZWQgb2xkIGF1dG9jb25mIG1hY3JvcyBhcyByZXBvcnRlZCBieSBhdXRvdXBkYXRlLgogICAgICAgICAgICAtIFJlbW92ZWQgJHByZWZpeCBpbiBhdXRvY29uZiBmcm9tIHNlYXJjaCBwYXRocyBhcyBhdXRvY29uZiB3b24ndCBleHBhbmQgdGhlbS4KICAgICAgICAgICAgLSBTdWJ0bGUgYnVnIGZpeCB3aGVyZSAnbWFrZSBwcmVmaXg9L3NvbWV3aGVyZTsgbWFrZSBjbGVhbjsgbWFrZSBwcmVmaXg9L3NvbXdoZXJlL2Vsc2UnCiAgICAgICAgICAgICAgcHJvZHVjZWQgYW4gZXhlY3V0YWJsZSB1c2luZyB0aGUgaW5jb3JyZWN0IGxpYnJhcnkgZGlyZWN0b3JpZXMuCiAgICAgICAgICAgIC0gQWRkZWQgLWxkZmxhZ3MgY29tbWFuZGxpbmUgb3B0aW9uIGZvciBNelNjaGVtZSwgT2NhbWwsIFBpa2UgYW5kIFBIUC4KICAgICAgICAgICAgLSBGaXhlZCByZXBvcnRpbmcgb2YgY29tcGlsZXIgdXNlZCB3aGVuIHVzaW5nIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbi4KICAgICAgICAgICAgLSBTV0lHIHdlYiBhZGRyZXNzIGFkZGVkIHRvIC12ZXJzaW9uIGNvbW1hbmRsaW5lIG9wdGlvbi4KCjEyLzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZml4IHRvIFRjbCBkeW5hbWljIGNhc3QgdHlwZW1hcHMuIFJlcG9ydGVkIGJ5CiAgICAgICAgICAgIEtyaXN0b3BoZXIgQmxvbS4KCjEyLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHRlbXBsYXRlIGFyZ3VtZW50IHJlcGxhY2UgYnVnLiAgUmVwb3J0ZWQgYnkKICAgICAgICAgICAgQ2hyaXMgRmxhdGxleS4KCjEyLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV2ZXJ0ZWQgQ0hBTkdFUyAwOS8wMy8yMDAyLCBwcmVwcm9jZXNzb3IgYXJndW1lbnQgZXZhbHVhdGlvbi4gIEFyZ3VtZW50cwogICAgICAgICAgICBhcmUgbm90IGV2YWx1YXRlZCBkdXJpbmcgY29sbGVjdGlvbiwgSyZSLCBwLiAyMzAuCgoxMi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjQ5MDIyIF0gQ29tcGlsYXRpb24gcHJvYmxlbXMgd2l0aCBLQUkvS0NDCgoxMi8wMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgJ3JlbC0xLTMnIENWUyBicmFuY2ggbWVyZ2VkIGJhY2sgaW50byB0aGUgbWFpbiBicmFuY2guCgoKVmVyc2lvbiAxLjMuMTcgKE5vdmVtYmVyIDIyLCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjEzOTIyIF0gcHJlcHJvY2Vzc29yIGVycm9ycyB3aXRoIEhBVkVfTE9OR19MT05HLgogICAgICAgICAgICAKMTEvMTkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYxNTQ4MCBdIG16c2NoZW1lIFNXSUdfTXVzdEdldFB0cl8uCgoxMS8xOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNjM1MTE5IF0gU1dJR19jcm9hayBjYXVzZXMgY29tcGlsZXIgd2FybmluZy4KCjExLzE2LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgdHlwZW1hcHMgZm9yIHBvaW50ZXJzIHRvIGNsYXNzIG1lbWJlcnMuCgoxMS8xNS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE92ZXJsb2FkZWQgQysrIGZ1bmN0aW9ucyB3aGljaCBjYW5ub3QgYmUgb3ZlcmxvYWRlZCBpbiBKYXZhIAogICAgICAgICAgICBvbmNlIGFnYWluIGlzc3VlIGEgd2FybmluZy4KCjExLzE0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSGFuZGxpbmcgb2YgTlVMTCBwb2ludGVycyBpcyBpbXByb3ZlZC4gQSBqYXZhIG51bGwgb2JqZWN0IHdpbGwgbm93CiAgICAgICAgICAgIGJlIHRyYW5zbGF0ZWQgdG8gYW5kIGZyb20gYSBOVUxMIEMvQysrIHBvaW50ZXIgYnkgZGVmYXVsdC4gUHJldmlvdXNseSB3aGVuIAogICAgICAgICAgICB3cmFwcGluZzoKCiAgICAgICAgICAgICAgICBjbGFzcyBTb21lQ2xhc3Mgey4uLn07CiAgICAgICAgICAgICAgICB2b2lkIGZvbyhTb21lQ2xhc3MgKnMpOwoKICAgICAgICAgICAgYW5kIGl0IHdhcyBjYWxsZWQgZnJvbSBKYXZhIHdpdGggbnVsbDoKCiAgICAgICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhudWxsKQoKICAgICAgICAgICAgYSBKYXZhIE51bGxQb2ludGVyRXhjZXB0aW9uIHdhcyB0aHJvd24uIEV4dHJhIHR5cGVtYXBzIGhhZCB0byBiZSB3cml0dGVuIGluCiAgICAgICAgICAgIG9yZGVyIHRvIG9idGFpbiBhIE5VTEwgcG9pbnRlciB0byBwYXNzIHRvIGZ1bmN0aW9ucyBsaWtlIHRoaXMgb25lLiBOb3cgdGhlIAogICAgICAgICAgICBkZWZhdWx0IHdyYXBwaW5nIHdpbGwgZGV0ZWN0ICdudWxsJyBhbmQgdHJhbnNsYXRlIGl0IGludG8gYSBOVUxMIHBvaW50ZXIuCiAgICAgICAgICAgIEFsc28gaWYgYSBmdW5jdGlvbiByZXR1cm5zIGEgTlVMTCBwb2ludGVyLCBlZzoKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBTb21lQ2xhc3MgKmJhcigpIHsgcmV0dXJuIE5VTEw7IH0KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZW4gdGhpcyB1c2VkIHRvIGJlIHdyYXBwZWQgd2l0aCBhIFNvbWVDbGFzcyBwcm94eSBjbGFzcyBob2xkaW5nIGEgTlVMTAogICAgICAgICAgICBwb2ludGVyLiBOb3cgbnVsbCBpcyByZXR1cm5lZCBpbnN0ZWFkLiBUaGVzZSBjaGFuZ2VzIGFyZSBzdWJ0bGUgYnV0IHVzZWZ1bC4KICAgICAgICAgICAgVGhlIG9yaWdpbmFsIGJlaGF2aW91ciBjYW4gYmUgb2J0YWluZWQgYnkgdXNpbmcgdGhlIG9yaWdpbmFsIHR5cGVtYXBzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIFNXSUdUWVBFIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICQmamF2YWNsYXNzbmFtZSgkam5pY2FsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFvdXQpIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3ICRqYXZhY2xhc3NuYW1lKCRqbmljYWxsLCAkb3duZXIpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhZ2V0Y3B0cikgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICV7CiAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBzdGF0aWMgbG9uZyBnZXRDUHRyKCRqYXZhY2xhc3NuYW1lIG9iaikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoKMTEvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggYWJzdHJhY3QgbWV0aG9kcyBhbmQgc2lnbmF0dXJlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgY2xhc3MgYWJzdHJhY3RfZm9vIHsgCiAgICAgICAgICAgIHB1YmxpYzogCiAgICAgICAgICAgICAgICB2aXJ0dWFsIGludCAgIG1ldGgoaW50IG1ldGhfcGFyYW0pID0gMDsgCiAgICAgICAgICAgIH07IAogCiAKICAgICAgICAgICAgY2xhc3MgYWJzdHJhY3RfYmFyIDogcHVibGljIGFic3RyYWN0X2ZvbyB7IAogICAgICAgICAgICBwdWJsaWM6IAogICAgICAgICAgICAgICAgaW50IG1ldGgoaW50IG1ldGhfcGFyYW1fMSwgaW50IG1ldGhfcGFyYW1fMikgeyByZXR1cm4gMDsgfQogICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCBhYnN0cmFjdF9iYXIgaXMgc3RpbGwgYWJzdHJhY3QuCgogICAgICAgICAgICBGaXhlcyBbIDYyODQzOCBdIERlcml2ZWQgYWJzdHJhY3QgY2xhc3Mgbm90IGFic3RyYWN0LgogICAgICAgICAgICBSZXBvcnRlZCBhbmQgcGF0Y2hlZCBieSBTY290dCBNaWNoZWwuCgoxMS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgbWF0Y2hpbmcgcHJvYmxlbSB3aXRoIHR5cGVtYXBzIGFuZCBhcnJheSBkaW1lbnNpb25zLiAgRm9yIGV4YW1wbGUsIGlmIHlvdQogICAgICAgICAgICBoYWQgdGhpczoKCiAgICAgICAgICAgICAgIHR5cGVkZWYgY2hhciBibGFoWzIwXTsKCiAgICAgICAgICAgIGFuZCBhIHR5cGVtYXA6CgogICAgICAgICAgICAgICAldHlwZW1hcCgpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICAgLi4uICQxX2RpbTAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZW4gJDFfZGltKiB2YXJpYWJsZXMgd2VyZW4ndCBiZSBleHBhbmRlZCBwcm9wZXJseS4gIEl0IHNob3VsZCB3b3JrIG5vdy4KICAgICAgICAgICAgUHJvYmxlbSByZXBvcnRlZCBieSBQYW5rYWogS3VtYXIgR29lbC4KICAgICAgICAgICAgICAgCjExLzA3LzIwMDI6IG1rb2VwcGUKCSAgICBBZGRlZCBhbiBleHBlcmltZW50YWwgbmV3IG1vZHVsZSB0aGF0IGR1bXBzIFNXSUcncyBwYXJzZQoJICAgIHRyZWUgYXMgKENvbW1vbikgTGlzcCBzLWV4cHJlc3Npb25zLiAgVGhlIG1vZHVsZSBpcwoJICAgIGludm9rZWQgd2l0aCBTV0lHJ3MgLXNleHAgY29tbWFuZC1saW5lIHN3aXRjaC4gIFRoZSBvdXRwdXQKCSAgICBjYW4gYmUgcmVhZCBpbnRvIENvbW1vbiBMaXNwLiAgVGhlcmUgaXMgKHByb3RvdHlwZSkKCSAgICBleGFtcGxlIExpc3AgY29kZSB0aGF0IGdlbmVyYXRlcyBGb3JlaWduIEZ1bmN0aW9uIEludGVyZmFjZQoJICAgIGRlZmluaXRpb25zIGZvciB1c2Ugd2l0aCBLZXZpbiBSb3NlbmJlcmcncyBVRkZJLgoKCSAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMTEvMDcvMjAwMjogbWtvZXBwZQoJICAgIFJlbW92ZWQgZHVwbGljYXRlIGRlY2xhcmF0aW9uIG9mICJjcHBfdGVtcGxhdGVfZGVjbCIgaW4KCSAgICBwYXJzZXIueTsgYmlzb24gMS43NSBjb21wbGFpbmVkLgoKMTEvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBEZWZhdWx0IHByaW1pdGl2ZSBhcnJheSBoYW5kbGluZyBoYXMgY2hhbmdlZCBsaWtlIGFycmF5cyBvZiBjbGFzc2VzLiAKICAgICAgICAgICAgQyBwcmltaXRpdmUgYXJyYXlzIGFyZSBubyBsb25nZXIgd3JhcHBlZCBieSBhIEphdmEgYXJyYXkgYnV0IHdpdGggYSBwb2ludGVyIAogICAgICAgICAgICAodHlwZSB3cmFwcGVyIGNsYXNzKS4gQWdhaW4gdGhlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUgZm9yIGVmZmljaWVuY3kgcmVhc29ucy4gCiAgICAgICAgICAgIFRoZSBvcmlnaW5hbCB0eXBlbWFwcyBoYXZlIGJlZW4gbW92ZWQgaW50byBhcnJheXNfamF2YS5pLCBzbyB0aGUgb3JpZ2luYWwgCiAgICAgICAgICAgIGJlaGF2aW91ciBjYW4gYmUgb2J0YWluZWQgbWVyZWx5IGluY2x1ZGluZyB0aGlzIGZpbGU6CgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCgogICAgICAgICAgICBUaGUgYXJyYXkgc3VwcG9ydCBmdW5jdGlvbnMgYXJlIG5vIGxvbmdlciBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gVGhleSBhcmUgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBpbmNsdWRpbmcgdGhpcyBmaWxlLCB0aHVzIHRoaXMgb2Z0ZW4gdW51c2VkIGNvZGUgaXMgb25seQogICAgICAgICAgICBnZW5lcmF0ZWQgd2hlbiBzcGVjaWZpY2FsbHkgcmVxdWlyaW5nIHRoaXMgdHlwZSBvZiBhcnJheSBzdXBwb3J0LgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMTEvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHN1cHBvcnQgZm9yIG5lc3RlZCBtb2R1bGUgZGVjbGFyYXRpb25zIChhcyB3YXMKICAgICAgICAgICAgcHJldmlvdXNseSBhZGRlZCBmb3IgdGhlIFBlcmwgbW9kdWxlKS4gU28gYSAlbW9kdWxlIGRpcmVjdGl2ZQogICAgICAgICAgICBvZiB0aGUgZm9ybToKCiAgICAgICAgICAgICAgICAlbW9kdWxlICJPdXRlcjo6SW5uZXI6OkZvbyIKCiAgICAgICAgICAgIHdpbGwgbmVzdCBldmVyeXRoaW5nIGFzIChpbiBSdWJ5IGNvZGUpOgoKICAgICAgICAgICAgICAgIG1vZHVsZSBPdXRlcgogICAgICAgICAgICAgICAgICBtb2R1bGUgSW5uZXIKICAgICAgICAgICAgICAgICAgICBtb2R1bGUgRm9vCiAgICAgICAgICAgICAgICAgICAgICAjIHN0dWZmIGdvZXMgaGVyZQogICAgICAgICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICAgIGVuZAogCjExLzA1LzIwMDI6IG1rb2VwcGUgCgkgICAgW016U2NoZW1lXSBBZGQgYW4gYXJndW1lbnQgKC1kZWNsYXJlbW9kdWxlKSB0aGF0IGdlbmVyYXRlcwoJICAgIGNvZGUgdG8gY29ycmVjdGx5IGRlY2xhcmUgYSBwcmltaXRpdmUgbW9kdWxlIGV4dGVuc2lvbi4KCSAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgQnJ1Y2UgQnV0dGVyZmllbGQuCgoxMS8wMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHBhdGNoIHN1Ym1pdHRlZCBieSBNaWNoYWVsIENhaGlsbCB0byByZW1vdmUgdW51c2VkIHBhcmFtZXRlcgogICAgICAgICAgICB3YXJuaW5ncyBmb3IgdGhlIGplbnYgYW5kIGNscyBwYXJhbWV0ZXJzLiBUaGlzIHBhdGNoIGFsc28gYWxzbyBhbGxvd3Mgb25lCiAgICAgICAgICAgIHRvIHVzZSAidm9pZCIgaW4gdGhlIGpuaSB0eXBlbWFwIGZvciBhbnkgdHlwZSB3aXRob3V0IGNvZGUgYmVpbmcgZ2VuZXJhdGVkCiAgICAgICAgICAgIGF0dGVtcHRpbmcgdG8gcmV0dXJuIGEgdmFsdWUuCgoxMC8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFycmF5IGhhbmRsaW5nIGlzIGRpZmZlcmVudC4gQXJyYXlzIG9mIGNsYXNzZXMgYXJlIG5vIGxvbmdlciB3cmFwcGVkCiAgICAgICAgICAgIHdpdGggcHJveHkgYXJyYXlzLCBlZyB3cmFwcGluZwoKICAgICAgICAgICAgICAgIGNsYXNzIFggey4uLn07CiAgICAgICAgICAgICAgICBYIGZvb1sxMF07CiAgICAgICAgICAgIAogICAgICAgICAgICB1c2VkIHRvIGJlIHdyYXBwZWQgd2l0aCB0aGVzZSBKYXZhIGdldHRlcnMgYW5kIHNldHRlcnM6CgogICAgICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEZvbyhYW10gdmFsdWUpIHsuLi59CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFhbXSBnZXRGb28oKSB7Li4ufQoKICAgICAgICAgICAgVGhpcyBhcHByb2FjaCBpcyB2ZXJ5IGluZWZmaWNpZW50IGFzIHRoZSBlbnRpcmUgYXJyYXkgaXMgY29waWVkIG51bWVyb3VzCiAgICAgICAgICAgIHRpbWVzIG9uIGVhY2ggaW52b2NhdGlvbiBvZiB0aGUgZ2V0dGVyIG9yIHNldHRlci4gVGhlc2UgYXJyYXlzIGFyZSBub3cKICAgICAgICAgICAgd3JhcHBlZCB3aXRoIGEgcG9pbnRlciBzbyBpdCBpcyBvbmx5IHBvc3NpYmxlIHRvIGFjY2VzcyB0aGUgZmlyc3QgYXJyYXkgZWxlbWVudCAKICAgICAgICAgICAgdXNpbmcgYSBwcm94eSBjbGFzczoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Rm9vKFggdmFsdWUpIHsuLi59CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIFggZ2V0Rm9vKCkgey4uLn0KCiAgICAgICAgICAgIEFycmF5cyBvZiBlbnVtcyBoYXZlIGFsc28gYmVlbiBzaW1pbGFybHkgY2hhbmdlZC4gVGhpcyBiZWhhdmlvdXIgaXMgbm93IGxpa2UgdGhlIAogICAgICAgICAgICBvdGhlciBTV0lHIGxhbmd1YWdlJ3MgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBhcnJheSBsaWJyYXJ5IHNob3VsZCBiZSB1c2VkIHRvIAogICAgICAgICAgICBhY2Nlc3MgdGhlIG90aGVyIGVsZW1lbnRzLiBUaGUgb3JpZ2luYWwgYmVoYXZpb3VyIGNhbiBiZSBhY2hpZXZlZCB1c2luZyB0aGUgCiAgICAgICAgICAgIG1hY3JvcyBhbmQgdHlwZW1hcHMgaW4gYXJyYXlzX2phdmEuaSwgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWluY2x1ZGUgImFycmF5c19qYXZhLmkiCiAgICAgICAgICAgICAgICBKQVZBX0FSUkFZU09GQ0xBU1NFUyhYKQogICAgICAgICAgICAgICAgY2xhc3MgWCB7Li4ufTsKICAgICAgICAgICAgICAgIFggZm9vWzEwXTsKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjEwLzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVHdvIG5ldyB0eXBlbWFwcyBqYXZhaW4gYW5kIGphdmFvdXQgZm9yIGdlbmVyYXRpbmcgdGhlIHByb3h5IGNsYXNzIAogICAgICAgICAgICBhbmQgdHlwZSB3cmFwcGVyIGNsYXNzIG1ldGhvZCBjYWxscyB0byB0aGUgSk5JIGNsYXNzLiBUaGUgbmV3IHR5cGVtYXBzIGFyZSAKICAgICAgICAgICAgcmVhbGx5IHVzZWQgZm9yIHRyYW5zZm9ybWluZyB0aGUganN0eXBlICh1c2VkIGluIHByb3h5IGNsYXNzIGFuZCB0eXBlIHdyYXBwZXIKICAgICAgICAgICAgY2xhc3NlcykgdG8gdGhlIGp0eXBlICh1c2VkIGluIHRoZSBKTkkgY2xhc3MpIGFuZCB2aXNhIHZlcnNhLiBBIGphdmFpbiB0eXBlbWFwCiAgICAgICAgICAgIGlzIHJlcXVpcmVkIHdoZW5ldmVyIGFuIGluIHR5cGVtYXAgaXMgd3JpdHRlbiBhbmQgc2ltaWxhcmx5IGphdmFvdXQgZm9yIGFuIG91dAogICAgICAgICAgICB0eXBlbWFwLiBBbiBleGFtcGxlIGlzIHByb2JhYmx5IGJlc3QgdG8gc2hvdyB0aGVtIHdvcmtpbmc6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoamF2YWluKSBDbGFzcyAiQ2xhc3MuZ2V0Q1B0cigkamF2YWlucHV0KSIKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbikgdW5zaWduZWQgc2hvcnQgIiRqYXZhaW5wdXQiCiAgICAgICAgICAgICAgICAldHlwZW1hcChqYXZhb3V0KSBDbGFzcyAqIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENsYXNzKCRqbmljYWxsLCAkb3duZXIpOwogICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJWlubGluZSAlewogICAgICAgICAgICAgICAgICAgIGNsYXNzIENsYXNzIHt9OwogICAgICAgICAgICAgICAgICAgIENsYXNzICogYmFyKENsYXNzIGNscywgdW5zaWduZWQgc2hvcnQgdXNoKSB7IHJldHVybiBuZXcgQ2xhc3MoKTsgfTsKICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICBUaGUgZ2VuZXJhdGVkIHByb3h5IGNvZGUgaXMgdGhlbjoKCiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIENsYXNzIGJhcihDbGFzcyBjbHMsIGludCB1c2gpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGFzcyhleGFtcGxlSk5JLmJhcihDbGFzcy5nZXRDUHRyKGNscyksIHVzaCksIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KCgogICAgICAgICAgICBTb21lIG5ldyBzcGVjaWFsIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW50cm9kdWNlZCBpbiBvcmRlciB0byB1c2UgdGhlc2UgdHlwZW1hcHMuCiAgICAgICAgICAgIEhlcmUgJGphdmFpbnB1dCBoYXMgYmVlbiByZXBsYWNlZCBieSAnY2xzJyBhbmQgJ3VzaCcuICRqbmljYWxsIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IAogICAgICAgICAgICB0aGUgbmF0aXZlIG1ldGhvZCBjYWxsLCAnZXhhbXBsZUpOSS5iYXIoLi4uKScgYW5kICRvd25lciBoYXMgYmVlbiByZXBsYWNlZCBieSAnZmFsc2UnLgogICAgICAgICAgICAkamF2YWlucHV0IGlzIGFuYWxvZ291cyB0byB0aGUgJGlucHV0IHNwZWNpYWwgdmFyaWFibGUuIEl0IGlzIHJlcGxhY2VkIGJ5IHRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgICAgJGpuaWNhbGwgaXMgYW5hbG9nb3VzIHRvICRhY3Rpb24gaW4gJWV4Y2VwdGlvbi4gSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGNhbGwgdG8gdGhlIG5hdGl2ZQogICAgICAgICAgICBtZXRob2QgaW4gdGhlIEpOSSBjbGFzcy4KICAgICAgICAgICAgJG93bmVyIGlzIHJlcGxhY2VkIGJ5IGVpdGhlciB0cnVlIGlmICVuZXdvYmplY3QgaGFzIGJlZW4gdXNlZCBvdGhlcndpc2UgZmFsc2UuCgogICAgICAgICAgICBUaGUgamF2YS5zd2cgZmlsZSBjb250YWlucyBkZWZhdWx0IGphdmFpbiBhbmQgamF2b3V0IHR5cGVtYXBzIHdoaWNoIHdpbGwgcHJvZHVjZSB0aGUgc2FtZSBjb2RlCiAgICAgICAgICAgIGFzIHByZXZpb3VzbHkuIFRoaXMgY2hhbmdlIGlzIG9ubHkgb2YgY29uY2VybiB0byB0aG9zZSB3aG8gaGF2ZSB3cml0dGVuIHRoZWlyIG93biB0eXBlbWFwcyBhcwogICAgICAgICAgICB5b3Ugd2lsbCB0aGVuIG1vc3QgbGlrZWx5IGhhdmUgdG8gd3JpdGUgeW91ciBvd24gamF2YWluIGFuZCBqYXZhb3V0IHR5cGVtYXBzLgoKICAgICAgICAgICAgVGhlIGphdmFvdXQgdHlwZW1hcCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvIHVzZSBhIEphdmEgZG93bmNhc3QgdG8gYmUgdXNlZCBvbiBhYnN0cmFjdCAKICAgICAgICAgICAgcHJveHkgYmFzZSBjbGFzc2VzLiBTZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBvbiBkeW5hbWljX2Nhc3QuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgoxMC8yNC8yMDAyOiB0dG4KCSAgICBbTWV0aG9kb2xvZ3ldIFVwZ2FkZWQgdG8gbGlidG9vbCAxLjQuMywgcHJlc3VtYWJseSB3LyBiZXR0ZXIKCSAgICBzdXBwb3J0IGZvciBuZXdpc2ggcGxhdGZvcm1zIChsaWtlIE1hY09TIFgpLgoKMTAvMjEvMjAwMjogdHRuCgkgICAgRml4ZWQgUnVudGltZS9NYWtlZmlsZS5pbiBidWcgLS0gdGhhbmtzIHRvIFJpY2hhcmQgQ2FsbWJhY2guCgoxMC8xOC8yMDAyOiB0dG4KCSAgICBGaXhlZCB0eXBvIGluIGRvaC5oIC0tIHRoYW5rcyB0byBNYXggSG9ybi4KClZlcnNpb24gMS4zLjE2IChPY3RvYmVyIDE0LCAyMDAyKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEwLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggJWV4dGVuZCBkaXJlY3RpdmUgYW5kICVmZWF0dXJlIHJlcG9ydGVkCiAgICAgICAgICAgIGJ5IFdpbGxpYW0gRnVsdG9uLgoKMTAvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBPcGVuVk1TIGJ1aWxkIGRpcmVjdG9yeSAodm1zKS4gIENvbnRyaWJ1dGVkIGJ5IAogICAgICAgICAgICBKZWFuLUZyYW7nb2lzIFBpZXJvbm5lLgoKMTAvMDkvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBBZGRlZCB0aHJvd3MgY2xhdXNlIHRvIHRoZSBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBKTkkgY2xhc3MuCiAgICAgICAgICAgIFRoZSB0aHJvd3MgY2xhdXNlIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgZ2VuZXJhdGVkIGZvciBwcm94eSBmdW5jdGlvbnMKICAgICAgICAgICAgYW5kIG1vZHVsZSBjbGFzcyBmdW5jdGlvbnMuCgowOS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgYW5kIGNsYXNzZXMgdGhhdAogICAgICAgICAgICB3ZXJlIGRlZmluZWQgYnV0IG5vdCB3cmFwcGVkLiAgUHJvYmxlbSByZXBvcnRlZCBieSBMZXNsaWUgQnJvb2tzLAogICAgICAgICAgICBHZXJyeSBXb29kcywgYW5kIG90aGVycy4KCjA5LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU29tZSBlcnJvciBjaGVja2luZyBhZGRlZDoKICAgICAgICAgICAgMSkgT3V0T2ZNZW1vcnlFeGNlcHRpb24gY2hlY2sgaW4gdGhlIGNoYXIgKiB0eXBlbWFwcy4gCiAgICAgICAgICAgIDIpIEFzIFNXSUcgdHJlYXRzIHBvaW50ZXJzLCByZWZlcmVuY2VzIGFuZCBwYXNzaW5nIGJ5IHZhbHVlIGFsbCB0aGUKICAgICAgICAgICAgc2FtZSwgaXQgaXMgcG9zc2libGUgdG8gcGFzcyBhIE5VTEwgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgZXhwZWN0cwogICAgICAgICAgICBhbiBvYmplY3QgcGFzc2VkIGJ5IHZhbHVlIG9yIGJ5IHJlZmVyZW5jZS4gQSBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyAKICAgICAgICAgICAgbm93IHRocm93biB1bmRlciB0aGlzIHNjZW5hcmlvLgoKMDkvMjAvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBSZXdvcmtlZCAibWFrZSBjbGVhbiIgYW5kICJtYWtlIGluc3RhbGwiCgkJCSAgdG8gYmUgbW9yZSB0YWJsZSBkcml2ZW4uCgkgICAgW0RvY3NdIEV4cGxhaW4gaG93IHRvIGV4dGVuZCAibWFrZSBpbnN0YWxsIiB3LyBleHRyYS1pbnN0YWxsLmxpc3QuCgowOS8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIERlcHJlY2F0aW9uIG9mIHRoZSAiaWdub3JlIiB0eXBlbWFwLiAgIFRoZSAiaWdub3JlIiB0eXBlbWFwIGhhcwogICAgICAgICAgICBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYSBnZW5lcmFsaXphdGlvbiBvZiB0aGUgImluIiB0eXBlbWFwLgogICAgICAgICAgICBUbyBpZ25vcmUgYW4gYXJndW1lbnQsIHVzZSBzb21ldGhpbmcgbGlrZSB0aGlzIGluc3RlYWQ6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4sbnVtaW5wdXRzPTApIGludCAqb3V0cHV0IChpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICAkMSA9ICZ0ZW1wOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgZml4ZXMgYSBudW1iZXIgb2Ygc3VidGxlIGJ1Z3MgcmVsYXRlZCB0byB0aGUgaW50ZXJhY3Rpb24KICAgICAgICAgICAgb2YgdGhlICJpbiIgYW5kICJpZ25vcmUiIHR5cGVtYXBzICh3aGljaCB3ZXJlIHN1cHBvc2VkIHRvIGJlCiAgICAgICAgICAgIG11dHVhbGx5IGV4Y2x1c2l2ZSkuCgogICAgICAgICAgICBUaGUgdXNlIG9mIHRoZSBudW1pbnB1dHMgYXJndW1lbnQgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24uCiAgICAgICAgICAgIEN1cnJlbnRseSwgdmFsdWVzID4xIHdpbGwgZ2VuZXJhdGUgYW4gZXJyb3IuICBIb3dldmVyLCBmdXR1cmUKICAgICAgICAgICAgcmVsZWFzZXMgb2YgU1dJRyBtYXkgdXRpbGl6ZSB0aGF0IHRvIHN1cHBvcnQgbXVsdGktaW5wdXQgdHlwZW1hcHMuCgogICAgICAgICAgICAldHlwZW1hcChpZ25vcmUpIHN0aWxsIHdvcmtzLCBidXQgZ2VuZXJhdGVzIGEgd2FybmluZyBtZXNzYWdlIGFuZCBpcwogICAgICAgICAgICB0cmFuc2xhdGVkIHRvICV0eXBlbWFwKGluLG51bWlucHV0cz0wKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowOS8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNlZ21lbnRhdGlvbiBmYXVsdCBmb3IgdW5uYW1lZCBzdHJ1Y3R1cmVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0eXBlZGVmIHN0cnVjdCB7CiAgICAgICAgICAgICAgIH0gKmJsYWg7CgoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgUm9nZXIgR2lic29uLgogICAgICAgICAgICBOb3RlOiB3ZSBtaWdodCBiZSBhYmxlIHRvIGdlbmVyYXRlIHdyYXBwZXJzIGluIHNwZWNpYWwgY2FzZXMuCgowOS8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIG1vZGlmaWNhdGlvbiB0byBnZW5lcmF0ZWQgd3JhcHBlciBmdW5jdGlvbnMuICBQb2ludGVyIGFyZ3VtZW50cyBhcmUgbm93CiAgICAgICAgICAgIGFsd2F5cyBzZXQgdG8gYW4gaW5pdGlhbCB2YWx1ZSBvZiAwLiAgIFNpbXBsaWZpZXMgdHlwZW1hcCB3cml0aW5nIGFuZCBjbGVhbnVwCiAgICAgICAgICAgIGNvZGUgKHNpbmNlIHlvdSBjYW4gcmVseSBvbiB6ZXJvLXZhbHVlIGluaXRpYWxpemF0aW9uKS4gICBUaGlzIGFsc28gZ3JlYXRseQogICAgICAgICAgICByZWR1Y2VzIHRoZSBuZWVkIHRvIGV2ZXIgd3JpdGUgYW4gImFyZ2luaXQiIHR5cGVtYXAuCgowOS8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGVuaGFuY2VtZW50IHRvIHNtYXJ0LXBvaW50ZXIgc3VwcG9ydC4gIElmIG9wZXJhdG9yLT4oKQogICAgICAgICAgICBpcyBwYXJ0IG9mIGFuIGlnbm9yZWQgYmFzZSBjbGFzcyBsaWtlIHRoaXMsCgogICAgICAgICAgICAgICAgICVpZ25vcmUgQmFyOwoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgeyAgICAgICAgIC8qIElnbm9yZWQgKi8KICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBCYXIgeyB9OwoKICAgICAgICAgICAgdGhlbiBtZXRob2RzIGZyb20gRm9vIGFyZSBzdGlsbCBhdmFpbGFibGUuICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgPj4+IHMgPSBTcGFtKCkKICAgICAgICAgICAgICAgICA+Pj4gcy5ibGFoKCkKICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgPj4+CgogICAgICAgICAgICAgVGhlIG9ubHkgY2F0Y2ggaXMgdGhhdCB0aGUgb3BlcmF0b3ItPigpIGl0c2VsZiBpcyBub3QgYXZhaWxhYmxlCiAgICAgICAgICAgICAoc2luY2UgaXQgd2Fzbid0IHdyYXBwZWQpLiAgIFRoZXJlZm9yZSwgdGhlcmUgd29uJ3QgYmUgYW55CiAgICAgICAgICAgICBfX2RlcmVmX18oKSBvcGVyYXRpb24gdW5sZXNzIGl0IGlzIGV4cGxpY2l0bHkgYWRkZWQgdG8gU3BhbQogICAgICAgICAgICAgKGVpdGhlciB1c2luZyAlZXh0ZW5kIG9yIGp1c3QgcGxhY2luZyBvcGVyYXRvci0+KCkgaW4gdGhlCiAgICAgICAgICAgICBkZWZpbml0aW9uIG9mIFNwYW0pLgoKMDkvMTEvMjAwMjogdHRuCgkgICAgW01ldGhvZG9sb2d5XSBSZXdvcmtlZCAibWFrZSBjaGVjayIgdG8gYmUgbW9yZSB0YWJsZSBkcml2ZW4uCgkgICAgW0RvY3NdIERvY3VlbWVudGVkIG1ldGhvZG9sb2d5IGluIE1hbnVhbC9FeHRlbmRpbmcuaHRtbC4KCjA5LzExLzIwMDI6IHR0bgoJICAgIFtEb2NzXSBQcmVmaXhlZCBNYW51YWwvKi5odG1sIHdpdGggIjwhRE9DVFlQRSBodG1sIC4uLj4iIHRvCgkgICAgcGFuZGVyIGRvdGluZ2x5IHRvIChvdmVyLSlzZW5zaXRpdmUgZWRpdG9ycy4KCjA5LzEwLzIwMDI6IHR0bgoJICAgIFtHdWlsZV0gQ29udmVydGVkIEV4YW1wbGVzL2d1aWxlL3NpbXBsZSAibWFrZSBjaGVjayIKCSAgICBiZWhhdmlvciB0byBhY3R1YWxseSBjaGVjayBleGVjdXRpb24gcmVzdWx0cy4gIFJlZHVjZWQKCSAgICBpdGVyYXRpb24gY291bnRzIHNvIHRoYXQgdGhlIHRlc3QgZG9lc24ndCB0YWtlIHRvbyBsb25nLgoKMDkvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHLTEuMy4xNSByZWxlYXNlZC4KCgpWZXJzaW9uIDEuMy4xNSAoU2VwdGVtYmVyIDksIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjA5LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgbmFzdHkgcnVudGltZSB0eXBlIGNoZWNraW5nIGJ1ZyB3aXRoIHN1YnR5cGVzIGFuZCBpbmhlcml0YW5jZQogICAgICAgICAgICBhbmQgdGVtcGxhdGVzLiAKCjA5LzA5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gSmF2YSBleGNlcHRpb24gY2xhc3NlcyBmb3IgYSBtZXRob2QncyB0aHJvd3MgY2xhdXNlIGNhbiBiZSBnZW5lcmF0ZWQgYnkgCiAgICAgICAgICAgIHNwZWNpZnlpbmcgdGhlbSBpbiBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IGluIHRoZSB0aHJvd3MgYXR0cmlidXRlIGluIGFueSBvbmUKICAgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyB0eXBlbWFwczogaW4sIG91dCwgY2hlY2ssIGZyZWVhcmcsIGFyZ291dCBhbmQgdGhyb3dzLiBBIGNsYXNzaWMKICAgICAgICAgICAgZXhhbXBsZSB3b3VsZCBiZSB0byBjb252ZXJ0IEMrKyBleGNlcHRpb25zIGludG8gYSBzdGFuZGFyZCBKYXZhIGV4Y2VwdGlvbjoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0aHJvd3MsIHRocm93cz0iamF2YS5pby5JT0V4Y2VwdGlvbiIpIGZpbGVfZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICBqY2xhc3MgZXhjZXAgPSBqZW52LT5GaW5kQ2xhc3MoImphdmEvaW8vSU9FeGNlcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhjZXApCiAgICAgICAgICAgICAgICAgICAgICAgIGplbnYtPlRocm93TmV3KGV4Y2VwLCAkMS53aGF0KCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAkbnVsbDsgLy8gb3IgdXNlIFNXSUdfZmFpbAogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNsYXNzIGZpbGVfZXhjZXB0aW9uIHsuLi59OwogICAgICAgICAgICAgICAgdm9pZCBvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKSB0aHJvdyhmaWxlX2V4Y2VwdGlvbik7CgogICAgICAgICAgICBUaGUgSmF2YSBtZXRob2Qgd2lsbCB0aGVuIGJlIGRlY2xhcmVkIHdpdGggYSB0aHJvd3MgY2xhdXNlOgoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBvcGVuKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gey4uLn0KCjA5LzA4LzIwMDI6IG1rb2VwcGUKCSAgKiBbR3VpbGVdIEltcHJvdmVkIHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbS4gIFRoZSBhcmdsaXN0IG5vCgkgICAgbG9uZ2VyIGdldHMgY2x1dHRlcmVkIHdpdGggdHlwZSBzcGVjaWZpY2F0aW9uLCBtYWtpbmcgaXQKCSAgICBtb3JlIHJlYWRhYmxlLiAgKEFsc28gdGhlIElMSVNQIGZ1bmN0aW9uIEMtdSBNLXgKCSAgICBgYXJnbGlzdC1saXNwJyBSRVQgd29ya3MgYmV0dGVyIHRoaXMgd2F5LikgIFRoZSB0eXBlcyBvZgoJICAgIGFyZ3VtZW50cyBhcmUgZXhwbGFpbmVkIGluIGFuIGV4dHJhIHNlbnRlbmNlIGFmdGVyIHRoZQoJICAgIGFyZ2xpc3QuIAoJICAgIAoJICAgIFRoZXJlIGFyZSBub3cgdHdvIGRvY3VtZW50YXRpb24tcmVsYXRlZCB0eXBlbWFwIGFyZ3VtZW50czoKCgkgICAgICAgICV0eXBlbWFwKGluLCBkb2M9IiROQU1FIGlzIGEgdmVjdG9yIG9mIGludGVnZXJzIiwgCgkJCSBhcmdsaXN0PSIkbmFtZSIpICBpbnQgKlZFQ1RPUiB7IC4uLiB9CgkJCSAKICAgICAgICAgICAgVGhlICJhcmdsaXN0IiB0ZXh0cyBvZiBhbGwgYXJndW1lbnRzIG9mIGEgZnVuY3Rpb24gbWFrZSB1cAoJICAgIGl0cyBhcmdsaXN0IGluIHRoZSBkb2N1bWVudGF0aW9uLiAgVGhlICJkb2MiIHRleHRzIG9mIGFsbAoJICAgIGFyZ3VtZW50cyBhcmUgY29sbGVjdGVkIHRvIG1ha2UgYSBzZW50ZW5jZSB0aGF0IGRlc2NyaWJlcwoJICAgIHRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzLiAgUmVhc29uYWJsZSBkZWZhdWx0cyBhcmUKCSAgICBwcm92aWRlZC4gCgoJICAgIEFzIHVzdWFsLCAkbmFtZSBpcyBzdWJzdGl0dXRlZCBieSB0aGUgbmFtZSBvZiB0aGUKCSAgICBhcmd1bWVudC4gVGhlIG5ldyB0eXBlbWFwIHZhcmlhYmxlICROQU1FIGlzIGxpa2UgJG5hbWUsCgkgICAgYnV0IG1hcmtlZC11cCBhcyBhIHZhcmlhYmxlLiAgVGhpcyBtZWFucyB0aGF0IGl0IGlzCgkgICAgdXBwZXItY2FzZWQ7IGluIFRlWGluZm8gbW9kZSAoIi1wcm9jZG9jZm9ybWF0IHRleGluZm8iKSBpdAoJICAgIGNvbWVzIG91dCBhcyBAdmFye25hbWV9LiAKCSAgICAKCSAgICBUaGUgZGlyZWN0aXZlcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgICVtdWx0aXBsZV92YWx1ZXMgbm93IGFsc28gaGF2ZSBhbiBlZmZlY3Qgb24gdGhlCgkgICAgZG9jdW1lbnRhdGlvbi4gKFRoaXMgaXMgYWNoaWV2ZWQgdmlhIHRoZSBuZXcgcHJhZ21hcwoJICAgIHJldHVybl9ub3RoaW5nX2RvYywgcmV0dXJuX29uZV9kb2MsIHJldHVybl9tdWx0aV9kb2MuKQoKCSAgICBEb2N1bWVudGF0aW9uIGhhcyBhbHNvIGltcHJvdmVkIGZvciB2YXJpYWJsZXMgdGhhdCBhcmUKCSAgICB3cmFwcGVkIGFzIHByb2NlZHVyZXMtd2l0aC1zZXR0ZXJzIChjb21tYW5kLWxpbmUgc3dpdGNoCgkgICAgIi1lbWl0LXNldHRlcnMiKS4KCiAgICAgICAgICAqIFtHdWlsZV0gRW1pdCBjb25zdGFudHMgYXMgX2ltbXV0YWJsZV8gdmFyaWFibGVzLiAgKFRoaXMKICAgICAgICAgICAgd2FzIGJyb2tlbiByZWNlbnRseS4pCgowOS8wNy8yMDAyOiBta29lcHBlCgkgICAgW0d1aWxlXSBVcGRhdGVkIHRoZSB0eXBlbWFwcyBpbiBsaXN0LXZlY3Rvci5pLgoKMDkvMDcvMjAwMjogbWtvZXBwZQoJICAgIFNob3J0LWNpcmN1aXQgdGhlIHR5cGVjaGVja3MgZm9yIG92ZXJsb2FkZWQgZnVuY3Rpb25zLgoJICAgIChUaGUgY2hhbmdlcyBpbiBjb2RlIGdlbmVyYXRpb24gYXJlIHZpc2libGUgaW4gdGhlIG5ldwoJICAgIHRlc3RjYXNlICJvdmVybG9hZF9jb21wbGljYXRlZCIuKQoKMDkvMDYvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBTb2x1dGlvbiBmb3IgWyA1OTY0MTMgXQogICAgICAgICAgICBOZXcgdHlwZW1hcCBzbyB0aGF0IHRoZSBKYXZhIHByb3h5IGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzCiAgICAgICAgICAgIHdyYXBwZXIgY29uc3RydWN0b3IgbW9kaWZpZXIgY2FuIGJlIHRhaWxvcmVkIGJ5IHVzZXJzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAKICAgICAgICAgICAgcHJvdGVjdGVkLiBOb3JtYWxseSBTV0lHIGdlbmVyYXRlcyBhIGNvbnN0cnVjdG9yIGxpa2UgdGhpcyB3aGljaCBjYW4gb25seSAKICAgICAgICAgICAgYmUgYWNjZXNzZWQgd2l0aGluIG9uZSBwYWNrYWdlOgoKICAgICAgICAgICAgICBwcm90ZWN0ZWQgQmFyKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKSB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgSWYgeW91IGFyZSB1c2luZyBTV0lHIGFjcm9zcyBtdWx0aXBsZSBwYWNrYWdlcyBvciB3YW50IHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yCiAgICAgICAgICAgIGFueXdheSwgaXQgY2FuIG5vdyBiZSBhY2Nlc3NlZCBvdXRzaWRlIHRoZSBwYWNrYWdlLiBUbyBtb2RpZnkgdXNlIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChqYXZhcHRyY29uc3RydWN0b3Jtb2RpZmllcnMpIFNXSUdUWVBFICJwdWJsaWMiCgogICAgICAgICAgICB0byBjaGFuZ2UgdG8gcHVibGljIGZvciBhbGwgcHJveHkgY2xhc3NlcyBhbmQgc2ltaWxhcmx5IGZvciBhbGwgdHlwZSB3cmFwcGVyIGNsYXNzZXM6CiAgICAgICAgICAgIAogICAgICAgICAgICAgICV0eXBlbWFwKGphdmFwdHJjb25zdHJ1Y3Rvcm1vZGlmaWVycykgU1dJR1RZUEUsIFNXSUdUWVBFICosIFNXSUdUWVBFICYsIFNXSUdUWVBFIFtdICJwdWJsaWMiCgowOS8wNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEFkZGVkIHRocm93cyB0eXBlbWFwcyBmb3IgdGhlIEphdmEgbW9kdWxlLiBDKysgZXhjZXB0aW9ucyBnZXQgY29udmVydGVkIGludG8KICAgICAgICAgICAgamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24gSmF2YSBleGNlcHRpb25zLiAKICAgICAgICAgICAgCiAgICAgICAgICAgIFdhcm5pbmc6IFRoaXMgbWF5IGNoYW5nZSBmcm9tIGphdmEubGFuZy5SdW50aW1lIGV4Y2VwdGlvbiBpbiB0aGUgZnV0dXJlLgoKMDkvMDUvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGaXggZm9yIHZhcmlhYmxlcyBkZWNsYXJlZCBhcyByZWZlcmVuY2VzLgoKMDkvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwNTE2MiBdIFR5cGVtYXAgbG9jYWwgdmFyaWFibGVzLiBSZXBvcnRlZCBieSBMeWxlIEpvaG5zb24uCgowOS8wNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTW9yZSB1cGRhdGVzIHRvIHRoZSBSdWJ5IG1vZHVsZSBkb2N1bWVudGF0aW9uLCBpbmNsdWRpbmcKCSAgICBhIG5ldyB0eXBlbWFwIGV4YW1wbGUgdGhhdCBkZW1vbnN0cmF0ZXMgaG93IHRvIGNvbGxlY3Qga2V5LXZhbHVlCgkgICAgcGFpcnMgZnJvbSBhbiBhcmd1bWVudCBsaXN0IGludG8gYSBIYXNoLgoKMDkvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBidWcgd2l0aCB0ZW1wbGF0ZSBleHBhbnNpb24gYW5kIGNvbnN0cnVjdG9ycy4KCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEZvbzxUPigpIHsgfQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBleHRyYSA8VD4gaW4gdGhlIGNvbnN0cnVjdG9yIHdhcyBjYXJyaWVkIHRocm91Z2ggaW4gdGhlCiAgICAgICAgICAgIG5hbWUtLWNhdXNpbmcgcnVudGltZSBwcm9ibGVtcyBpbiBnZW5lcmF0ZWQgbW9kdWxlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9yZGkgQXJuYWJhdCBCZW5lZGljdG8uCiAKMDkvMDUvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gU3VwcG9ydCBvdmVybG9hZGluZy4KCjA5LzA0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBVcGRhdGVkIHR5cGVtYXBzIGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyB0eXBlcwoJICAgIHRvIHVzZSBSdWJ5IDEuNyBzdXBwb3J0IGZvciB0aGVzZSB0eXBlcyB3aGVuIGF2YWlsYWJsZS4KCjA5LzA0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBvdXRwdXQgdHlwZW1hcHMgZm9yIGNvbnN0IHJlZmVyZW5jZSB0byBwcmltaXRpdmUKCSAgICB0eXBlcy4KCjA5LzA0LzIwMDI6IG1rb2VwcGUKCSAgICBbR3VpbGVdIEZpeCBwYXNzLWJ5LXZhbHVlIHR5cGVtYXBzLiAgUmVwb3J0ZWQgYnkgQXJubwoJICAgIFBldGVycyB2aWEgRGViaWFuIGJ1Z3RyYWNraW5nICgjMTU2OTAyKSwgcGF0Y2ggYnkgVG9yc3RlbgoJICAgIExhbmRzY2hvZmYgPHRvcnN0ZW5AZGViaWFuLm9yZz4uCgowOS8wMy8yMDAyOiBzYW1qYW0gKFNhbSBMaWRkaWNvdHQpCgkgICAgQmV0dGVyIHJlZmVyZW5jZSBzdXBwb3J0LgoJICAgIEZ1bmN0aW9ucyB0aGF0IHdhbnQgYSB2b2lkKiogY2FuIHRha2UgYSBOVUxMIGJ5IHJlZmVyZW5jZSBhbmQKCSAgICB0aGUgdm9pZCogd2lsbCBiZSBtYWRlIGZvciB5b3UgYW5kIHRoZW4gcGFzc2VkLWJ5LXJlZmVyZW5jZQoKCSAgICBBbHNvIGFsbCBpbnRlZ2VyLWNsYXNzIG5hdGl2ZSB0eXBlcyBjYW4gYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZQoJICAgIHdoZXJlIGFuIGludCogb3IgaW50JiBldGMgaXMgbmVlZGVkCgowOS8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZWQgdGhlIGV2YWx1YXRpb24gb3JkZXIgb2YgcHJlcHJvY2Vzc29yIG1hY3JvIGFyZ3VtZW50cy4KICAgICAgICAgICAgQXJndW1lbnRzIGFyZSBub3cgZXhwYW5kZWQgYnkgdGhlIHByZXByb2Nlc3NvciAqYmVmb3JlKiB0aGV5CiAgICAgICAgICAgIGFyZSBwYXNzZWQgdG8gbWFjcm8gZXhwYW5zaW9uLiAgVGhpcyBmaXhlcyBhIHN1YnRsZSBleHBhbnNpb24KICAgICAgICAgICAgYnVnIHJlcG9ydGVkIGJ5IEFudGhvbnkgSGVhZGluZy4KCjA5LzAzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgdGhlIGZpbGUgaW5jbHVkZSBvcmRlciAoYWdhaW4sIGFwcGFyZW50bHkpLiBTZWUgMi8yNy85OS4KCjA5LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1BlcmxdIEJldHRlciBleGNlcHRpb24gaGFuZGxpbmcgc3VwcG9ydC4gIFNpbmNlIFBlcmwgZXJyb3IgaGFuZGxpbmcKICAgICAgICAgICAgcmVsaWVzIG9uIHNldGptcC9sb25nam1wLCB3cmFwcGVyIGZ1bmN0aW9ucyBoYXZlIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkKICAgICAgICAgICAgdG8gcHJvdmlkZSBhbiBleHRyYSBibG9jayBzY29wZToKCiAgICAgICAgICAgICAgICBYUyhmb28pIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgX3N3aWdtc2dbU1dJR19NQVhfRVJSTVNHXSA9ICIiOwogICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqX3N3aWdlcnIgPSBfc3dpZ21zZzsKICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgIC8qIE5vcm1hbCB3cmFwcGVyIGZ1bmN0aW9uIGhlcmUgKi8KICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgU1dJR19jcm9haygiQW4gZXJyb3Igb2NjdXJyZWRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgICBYU1JFVFVSTihhcmd2aSk7ICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gKi8KICAgICAgICAgICAgICAgICAgICAgIGZhaWw6CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNsZWFudXAgY29kZSAqLwogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgY3JvYWsoX3N3aWdfZXJyKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZSBtYWNybyBTV0lHX2Nyb2FrKHgpIHNldHMgdGhlIHZhbHVlIG9mIF9zd2lnZXJyIHRvIHggYW5kCiAgICAgICAgICAgIGV4ZWN1dGVzIGEgImdvdG8gZmFpbCIuICBUaGUgd2hvbGUgd3JhcHBlciBmdW5jdGlvbiBpcyBlbmNsb3NlZAogICAgICAgICAgICBibG9jayBzY29wZSB0byBwcm92aWRlIHByb3BlciBjbGVhbnVwIG9mIEMrKyBvYmplY3RzLiAgU2luY2UKICAgICAgICAgICAgY3JvYWsgZXhlY3V0ZXMgYSBsb25nam1wKCksIHRoZXJlIGlzIG5vIHdheSB0byBwcm9wZXJseSByZWNsYWltCiAgICAgICAgICAgIHJlc291cmNlcyBpZiB0aGlzIGV4ZWN1dGVzIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSB3cmFwcGVyCiAgICAgICAgICAgIGZ1bmN0aW9uLgoKICAgICAgICAgICAgVGhlIF9zd2lnbXNnW10gdmFyaWFibGUgaXMgbm9ybWFsbHkgdW51c2VkLCBidXQgY2FuIGJlIHVzZWQKICAgICAgICAgICAgdG8gc3RvcmUgc21hbGwgZXJyb3IgbWVzc2FnZXMgdXNpbmcgc3ByaW50ZiBvciBzbnByaW50Zi4gSXQKICAgICAgICAgICAgaGFzIGEgY2FwYWNpdHkgb2YgYXQgbGVhc3QgMjU2IGJ5dGVzIChTV0lHX01BWF9FUlJNU0cpLgogICAgICAgICAgICAKMDkvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBbVGNsXSBBZGRlZCBiZXR0ZXIgc3VwcG9ydCBmb3IgZXhjZXB0aW9ucy4gIEluc3RlYWQgb2YgcmV0dXJuaW5nIFRDTF9FUlJPUiwKICAgICAgICAgICAgdXNlIHRoZSBtYWNybyBTV0lHX2ZhaWwgdG8gcmV0dXJuIHdpdGggYW4gZXJyb3IuICBUaGlzIGVuc3VyZXMgdGhhdAogICAgICAgICAgICBhcmd1bWVudHMgYXJlIHByb3Blcmx5IGNsZWFuZWQgdXAuICBFeGNlcHRpb24gc3BlY2lmaWVycyBhcmUgbm93CiAgICAgICAgICAgIGhhbmRsZWQgYnkgZGVmYXVsdC4KCjA5LzAyLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBUaGUgdHlwZS1jaGVja2luZyBzeXN0ZW0gZm9yIHRoZSBSdWJ5IG1vZHVsZSBoYXMgaGFkIGEgZmxhdwoJICAgIGluIHRoYXQgc29tZSB0eXBlcyB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBlcXVpdmFsZW50CgkgICAgd2VyZW4ndC4gVGhpcyBidWcgd2FzIGJlc3QgZGVtb25zdHJhdGVkIGJ5IHRoZSBpbmhlcml0X21pc3NpbmcuaQoJICAgIHRlc3Qgc3VpdGUgY2FzZSwgd2hpY2ggZGVmaW5lcyBhIGJhc2UgY2xhc3MgIkZvbyIgdGhhdCBpcwoJICAgIHN1YmNsYXNzZWQgYnkgIkJhciIuIFRoZSAiRm9vIiBjbGFzcyBpc24ndCBhY3R1YWxseSB3cmFwcGVkIChpLmUuCgkgICAgaXQncyBub3QgZGlyZWN0bHkgYWNjZXNzaWJsZSBmcm9tIFJ1YnkpIGJ1dCB3ZSdkIHN0aWxsIGxpa2UgdG8gYmUKCSAgICBhYmxlIHRvIHBhc3MgIkJhciIgaW5zdGFuY2VzIHRvIGZ1bmN0aW9ucyBleHBlY3RpbmcgRm9vcyBhbmQgaGF2ZQoJICAgIHRoYXQgd29yazsgaXQgd2Fzbid0LiBUaGUgcmV2aXNlZCBpbXBsZW1lbnRhdGlvbiAoc2ltaWxhciB0byB0aGF0CgkgICAgdXNlZCBmb3Igc29tZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzKSBhZGRzIGEgbmV3IGluc3RhbmNlIHZhcmlhYmxlCgkgICAgKF9fc3dpZ3R5cGVfXykgdG8gZWFjaCBvYmplY3QgdGhhdCBpbmRpY2F0ZXMgaXRzIFNXSUcgdHlwZTsKCSAgICB0aGF0IGlzLCBlYWNoICJCYXIiIGluc3RhbmNlIHdpbGwgbm93IGhhdmUgYSBzdHJpbmcgaW5zdGFuY2UKCSAgICB2YXJpYWJsZSBjYWxsZWQgIl9fc3dpZ3R5cGVfXyIgd2hvc2UgdmFsdWUgaXMgIl9wX0JhciIuCgogICAgICAgICAgICBVbmxlc3MgZGV2ZWxvcGVycyB3ZXJlIHRha2luZyBhZHZhbnRhZ2Ugb2YgdGhpcyBsb3ctbGV2ZWwKCSAgICBpbXBsZW1lbnRhdGlvbiBkZXRhaWwsIHRoZXkgc2hvdWxkbid0IG5vdGljZSBhbnkgY29tcGF0aWJpbGl0eQoJICAgIHByb2JsZW1zOyBuZXZlcnRoZWxlc3MsIEknbSBtYXJraW5nIGl0IGFzIGEgInBvdGVudGlhbAoJICAgIGluY29tcGF0aWJpbGl0eSIuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA5LzAxLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBGaXhlZCBTRiBCdWcgIzYwMzE5OS4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQWRkZWQgT1VUUFVULCBJTlBVVCBhbmQgSU5PVVQgdHlwZW1hcHMgaW4gdHlwZW1hcHMuaSBmb3IgQysrIAogICAgICAgICAgICByZWZlcmVuY2VzLgoKMDgvMjcvMjAwMjogbWtvZXBwZQoJICAgIFtHdWlsZV0gRml4ZWQgZXJyb3IgaW4gImxpYl9zdGRfdmVjdG9yIiB0ZXN0Y2FzZSBhbmQKCSAgICBjb21waWxlciB3YXJuaW5nIGluICJsaWJfY2RhdGEiIHRlc3RjYXNlLgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiJW1peGluIiBkaXJlY3RpdmUsIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0bwoJICAgIHNwZWNpZnkgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBtb2R1bGUgbmFtZXMgdG8gbWl4LWluIHRvIGEKCSAgICBjbGFzcy4gU28sIGZvciBleGFtcGxlLCBpZiB5b3UnZCBsaWtlIHRvIHNwZWNpZnkgdGhhdCBSdWJ5J3MKCSAgICBFbnVtZXJhYmxlIG1vZHVsZSBzaG91bGQgYmUgbWl4ZWQtaW4gdG8geW91ciBjbGFzcyBGb28sIHlvdSdkCgkgICAgd3JpdGU6CgkgICAgCgkgICAgICAgICVtaXhpbiBGb28gIkVudW1lcmFibGUiOwoJCQogICAgICAgICAgICBvciB0byBzcGVjaWZ5IHRoYXQgdGhlIG1vZHVsZXMgRmVlLCBGaWUgYW5kIEZvIHNob3VsZCBiZSBtaXhlZAoJICAgIGluIHRvIEZvbzoKCSAgICAKCSAgICAgICAgJW1peGluIEZvbyAiRmVlLEZpZSxGbyI7CgkJCgkgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDgvMjcvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1vZGlmaWVkIHRoZSAlYWxpYXMgZGlyZWN0aXZlIHNvIHRoYXQgbXVsdGlwbGUgYWxpYXNlcwoJICAgIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGFuIGluc3RhbmNlIG1ldGhvZCBieSB1c2luZyBhIGNvbW1hLXNlcGFyYXRlZAoJICAgIGxpc3Qgb2YgYWxpYXNlcy4KCjA4LzI3LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCAidGhyb3ciIHR5cGVtYXBzIGZvciB0aGUgUnVieSBtb2R1bGUuCgowOC8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFR3byBuZXcgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIHByaW50aW5nIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgJ3N3aWcgLU0nIGxpc3RzIGFsbCBmaWxlIGRlcGVuZGVuY2llcy4gICdzd2lnIC1NTScgbGlzdHMKICAgICAgICAgICAgZGVwZW5kZW5jaWVzLCBidXQgZXhjbHVkZXMgZmlsZXMgaW4gdGhlIFNXSUcgbGlicmFyeS4gCiAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgICAlIHN3aWcgLU0gLXB5dGhvbiBleGFtcGxlLmkKICAgICAgICAgICAgICAgZXhhbXBsZV93cmFwLmN4eDogXAogICAgICAgICAgICAgICAgL3UwL2JlYXpsZXkvUHJvamVjdHMvbGliL3N3aWcxLjMvc3dpZy5zd2cgXAogICAgICAgICAgICAgICAgL3UwL2JlYXpsZXkvUHJvamVjdHMvbGliL3N3aWcxLjMvcHl0aG9uL3B5dGhvbi5zd2cgXAogICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCiAgICAgICAgICAgICAgICUgc3dpZyAtTU0gLXB5dGhvbiBleGFtcGxlLmkKICAgICAgICAgICAgICAgZXhhbXBsZV93cmFwLmN4eDogXAogICAgICAgICAgICAgICAgZXhhbXBsZS5pIFwKICAgICAgICAgICAgICAgIGV4YW1wbGUuaCAKCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1OTc1OTkgXSB1bmlvbiBpbiBjbGFzczogaW5jb3JyZWN0IHNjb3BlLgogICAgICAgICAgICBSZXBvcnRlZCBieSBBcnQgWWVya2VzLgoKMDgvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDYwMDEzMiBdIERlZmF1bHQgYXJndW1lbnQgd2l0aCBuYW1lc3BhY2UuIAogICAgICAgICAgICBSZXBvcnRlZCBieSBTaGlidWthd2EgWW9zaGlraS4KIAowOC8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEF1dG9tYXRpYyBDKysgZXhjZXB0aW9uIGhhbmRsaW5nIGVuYWJsZWQgZm9yIGFsbCBsYW5ndWFnZSBtb2R1bGVzLiAgICBUaGlzIGlzCiAgICAgICAgICAgIHByZXR0eSBzaW1wbGUuICBJZiB5b3UgaGF2ZSBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coRm9vKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgd3JhcF9CYXJfYmxhaCgpIHsKICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLT5ibGFoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgfSAKICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRm9vICZfZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAidGhyb3ciIHR5cGVtYXAgY29kZSBpbnNlcnRlZC4gJDEgPSBfZSAqLwogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoLi4uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3c7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIFRoZSAidGhyb3ciIHR5cGVtYXAgY2FuIGJlIHVzZWQgdG8gcmFpc2UgYW4gZXJyb3IgaW4gdGhlIHRhcmdldCAKICAgICAgICAgICAgbGFuZ3VhZ2UuICBJdCBjYW4gZG8gYW55dGhpbmcuICBIZXJlIGlzIGEgdmVyeSBzaW1wbGUgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAoInRocm93IikgRm9vIHsKICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkZvbyBleGNlcHRpb24iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVG8gbWFrZSB0aGlzIHdvcmsgaW4gZWFjaCBsYW5ndWFnZSBtb2R1bGUsIHNpbXBseSBkZWZpbmUgYSBmZXcgZGVmYXVsdAogICAgICAgICAgICAidGhyb3ciIHR5cGVtYXBzIGZvciBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgaW50LCBjb25zdCBjaGFyICosIGFuZCBhCiAgICAgICAgICAgIGZldyBjb21tb24gZXhjZXB0aW9uIHR5cGVzLiAgIFRoYXQncyBhbGwgdGhlcmUgaXMgdG8gaXQuCgogICAgICAgICAgICBBdXRvbWF0aWMgZXhjZXB0aW9uIGhhbmRsaW5nIGNhbiBiZSBkaXNhYmxlZCB1c2luZyAtbm9leGNlcHQgb3IKICAgICAgICAgICAgc2V0dGluZyB0aGUgTm9FeGNlcHQgZ2xvYmFsIHZhcmlhYmxlIHRvIDEuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA4LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgWyBQeXRob24gXQogICAgICAgICAgICBBdXRvbWF0aWMgdHJhbnNsYXRpb24gb2YgQysrIGV4Y2VwdGlvbiBzcGVjaWZpY2F0aW9ucyBpbnRvIGVycm9yIGhhbmRsaW5nIGNvZGUuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coRm9vKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgRm9vIGlzIHdyYXBwZWQgYXMgYSBjbGFzc2ljLXN0eWxlIGNsYXNzIChjb21wYXRpYmxlCiAgICAgICAgICAgIHdpdGggZXhjZXB0aW9uIGhhbmRsaW5nKS4gIEZ1cnRoZXJtb3JlLCB5b3UgY2FuIHdyaXRlIFB5dGhvbiBjb2RlCiAgICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBiID0gQmFyKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICBiLmJsYWgoKTsKICAgICAgICAgICAgICAgIGV4Y2VwdCBGb28sZTogICAgICMgTm90ZSB1c2Ugb2YgZXhjZXB0aW9uIGNsYXNzIGhlcmUhCiAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgRm9vIGVycm9yCiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICBUaGUgb2JqZWN0ICJlIiBpbiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgaXMganVzdCBhIHdyYXBwZWQgRm9vCiAgICAgICAgICAgIG9iamVjdC4gIEFjY2VzcyBpdCBsaWtlIGEgbm9ybWFsIG9iamVjdC4KCiAgICAgICAgICAgIElmIGFuIGV4Y2VwdGlvbiBpcyBub3Qgd3JhcHBlZCBhcyBhIGNsYXNzLCBhIFJ1bnRpbWVFcnJvcgogICAgICAgICAgICBleGNlcHRpb24gaXMgcmFpc2VkLiAgVGhlIGFyZ3VtZW50IHRvIHRoaXMgZXhjZXB0aW9uIGlzCiAgICAgICAgICAgIHRoZSBleGNlcHRpb24gb2JqZWN0LiAgRm9yIGV4YW1wbGU6CiAKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgdGhyb3coaW50KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBiID0gQmFyKCkKICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgIGIuYmxhaCgpOwogICAgICAgICAgICAgICAgZXhjZXB0IFJ1bnRpbWVFcnJvcixlOgogICAgICAgICAgICAgICAgICAgcHJpbnQgZS5hcmdzWzBdICAgICAgICMgSW50ZWdlciBleGNlcHRpb24gdmFsdWUKCiAgICAgICAgICAgIENvbW1lbnRzOgoKICAgICAgICAgICAgICAgIC0gIElmIGEgY2xhc3MgaXMgdXNlZCBhcyBhbiBleGNlcHRpb24sIGl0ICptdXN0KiBiZSB3cmFwcGVkCiAgICAgICAgICAgICAgICAgICBhcyBhIFB5dGhvbiBjbGFzc2ljLXN0eWxlIGNsYXNzIChuZXcgY2xhc3NlcyBkb24ndCB3b3JrKS4KCiAgICAgICAgICAgICAgICAtICBBdXRvbWF0aWMgZXhjZXB0aW9uIGhhbmRsaW5nIGlzIGNvbXBhdGlibGUgd2l0aCAlZXhjZXB0aW9uLgoKICAgICAgICAgICAgICAgIC0gIFVzZSAtbm9leGNlcHQgdG8gdHVybiBvZmYgdGhpcyBmZWF0dXJlLgoKICAgICAgICAgICAgICAgIC0gIFRoZSBuZXdseSBpbnRyb2R1Y2VkICJ0aHJvdyIgdHlwZW1hcCBpcyB1c2VkIHRvIHJhaXNlCiAgICAgICAgICAgICAgICAgICBQeXRob24gZXJyb3JzIChuYXR1cmFsbHkpLgoKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKCjA4LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW5mb3JtYXRpb24gZnJvbSB0aHJvdygpIHNwZWNpZmllcnMgaXMgbm93IHN0b3JlZCBpbiB0aGUgcGFyc2UKICAgICAgICAgICAgdHJlZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIGludCBibGFoKCkgdGhyb3coc3BhbSxiYXIpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIHN0b3JlZCBpbmZvcm1hdGlvbiBpcyBmdWxseSBjb3JyZWN0ZWQgZm9yIG5hbWVzcGFjZXMgYW5kIHdvcmtzCiAgICAgICAgICAgIHdpdGggdGVtcGxhdGVzLiAgVXNlcyB3aWxsIGZvbGxvdy4KICAgICAgICAgICAgCjA4LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgaXMgbm8gbG9uZ2VyIGFwcGxpZWQgdG8gbWVtYmVyIGFjY2VzcwogICAgICAgICAgICBmdW5jdGlvbi4gIEZvciBleGFtcGxlLCBpbiB0aGlzIGNvZGUKCiAgICAgICAgICAgICAgICAlZXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAkYWN0aW9uCiAgICAgICAgICAgICAgICAgICB9IGNhdGNoKHdoYXRldmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGlzIG5vdCBhcHBsaWVkIHRvIGFjY2Vzc29yIGZ1bmN0aW9ucwogICAgICAgICAgICBmb3IgRm9vOjp4LiAgIFRoaXMgc2hvdWxkIHJlZHVjZSB0aGUgYW1vdW50IG9mIGV4dHJhIGNvZGUKICAgICAgICAgICAgZ2VuZXJhdGVkLgoKICAgICAgICAgICAgQ2F2ZWF0OiAgRXhjZXB0aW9uIGhhbmRsaW5nIGNvZGUgKmlzKiB1c2VkIHdoZW4gYXR0cmlidXRlcyBhcmUKICAgICAgICAgICAgYWNjZXNzZWQgdGhyb3VnaCBhIHNtYXJ0LXBvaW50ZXIgb3IgYSBzeW50aGVzaXplZCBhdHRyaWJ1dGVkCiAgICAgICAgICAgIGFkZGVkIHdpdGggJWV4dGVuZCBpcyB1c2VkLgoKMDgvMjIvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWRlIG1vcmUgcGF0Y2hlcyB0byBob3BlZnVsbHkgZWxpbWluYXRlIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIFNXSUcgCiAgICAgICAgICAgIGFzIGEgNjQtYml0IGV4ZWN1dGFibGUuCgowOC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggY29uc3QgcmVmZXJlbmNlIG1lbWJlcnMsIHZhcmlhYmxlcywgYW5kIHN0YXRpYyBtZW1iZXJzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50ICZyZWY7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIHdhcyB0cnlpbmcgdG8gZ2VuZXJhdGUgInNldCIgZnVuY3Rpb25zIHdoaWNoIHdvdWxkbid0IGNvbXBpbGUuIAoKMDgvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWRlIHRoZSB3YXJuaW5nIG1lc3NhZ2UgZm9yICJDbGFzcyBYIG1pZ2h0IGFic3RyYWN0IiBvZmYgYnkgZGVmYXVsdC4KICAgICAgICAgICAgRW5hYmxlIHdpdGggLVdhbGwuCgowOC8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgaGFuZGxpbmcgb2YgY29uc3QgYW5kIG5vbi1jb25zdCBvdmVybG9hZGVkIG1ldGhvZHMuICBJZgogICAgICAgICAgICBhIGNsYXNzIGRlZmluZXMgYSBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgaW50IGJhcihpbnQpOwogICAgICAgICAgICAgICAgICAgIGludCBiYXIoaW50KSBjb25zdDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoZW4gdGhlIG5vbi1jb25zdCBtZXRob2QgaXMgKmFsd2F5cyogc2VsZWN0ZWQgaW4gb3ZlcmxvYWRpbmcgYW5kCiAgICAgICAgICAgIHRoZSBjb25zdCBtZXRob2Qgc2lsZW50bHkgZGlzY2FyZGVkLiAgSWYgcnVubmluZyB3aXRoIC1XYWxsLCBhIHdhcm5pbmcKICAgICAgICAgICAgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCjA4LzE5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQmV0dGVyIHN1cHBvcnQgZm9yIHVzaW5nIGRlY2xhcmF0aW9ucyBhbmQgaW5oZXJpdGFuY2UuICAgQ29uc2lkZXIgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoaW50IHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGJsYWgoZG91YmxlIHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBGb29CYXIgOiBwdWJsaWMgRm9vLCBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJsYWgoY2hhciAqeCk7CiAgICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286OmJsYWg7CiAgICAgICAgICAgICAgICAgICAgICB1c2luZyBCYXI6OmJsYWg7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93IFNXSUcgd3JhcHMgRm9vQmFyOjpibGFoIGFzIGFuIG92ZXJsb2FkZWQgbWV0aG9kIHRoYXQgdXNlcyBhbGwKICAgICAgICAgICAgYWNjZXNzaWJsZSB2ZXJzaW9ucyBvZiBibGFoKCkuICBTZWUgc2VjdGlvbiAxNS4yLjIgaW4gU3Ryb3VzdHJ1cCwgM3JkIEVkLgoKICAgICAgICAgICAgU1dJRyBhbHNvIHN1cHBvcnRzIGFjY2VzcyBjaGFuZ2UgdGhyb3VnaCB1c2luZyBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAgaW50IGJsYWgoaW50IHgpOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdXNpbmcgRm9vOjp4OwogICAgICAgICAgICAgICAgICAgICB1c2luZyBGb286OmJsYWg7CiAgICAgICAgICAgICAgICB9OwoKCiAgICAgICAgICAgIENhdmVhdDogICBTV0lHIGRvZXMgbm90IGFjdHVhbGx5IGNoZWNrIHRvIHNlZSBpZiBkZWNsYXJhdGlvbnMgaW1wb3J0ZWQKICAgICAgICAgICAgdmlhICd1c2luZycgYXJlIGluIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkuICBJZiB0aGlzIG9jY3VycywgdGhlCiAgICAgICAgICAgIHdyYXBwZXIgY29kZSB3b24ndCBjb21waWxlIGFueXdheXMtLS1ub3Qgc3VyZSBpdCdzIHdvcnRoIHdvcnJ5aW5nIGFib3V0LgogICAgICAgICAgCjA4LzE4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgb3ZlcmxvYWRpbmcgZGlzcGF0Y2ggdG8gbm90IGluY2x1ZGUgbm9kZXMgd2l0aCBhbiAiZXJyb3IiIGF0dHJpYnV0ZS4KICAgICAgICAgICAgQSBsYW5ndWFnZSBtb2R1bGUgY2FuIHNldCB0aGlzIGlmIGEgbm9kZSBjb3VsZG4ndCBiZSB3cmFwcGVkIGFuZCB5b3UgZG9uJ3Qgd2FudAogICAgICAgICAgICBpdCBpbmNsdWRlZCBpbiB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24uCgowOC8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50IHRvIG92ZXJsb2FkZWQgZnVuY3Rpb24gZGlzcGF0Y2guICAgVGhlIGRpc3BhdGNoZXIgaXMgbm93IGF3YXJlIG9mCiAgICAgICAgICAgIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcHMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgfTsKICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciA6IHB1YmxpYyBGb28geyB9OwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgdm9pZCBzcGFtKEZvbyAqZik7CiAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGRpc3BhdGNoZXIgcmUtb3JkZXJzIHRoZSBmdW5jdGlvbnMgc28gdGhhdCBzcGFtKEJhciAqYikgaXMKICAgICAgICAgICAgY2hlY2tlZCBmaXJzdC0tLWl0IGlzIG1vcmUgc3BlY2lmaWMgdGhhbiBzcGFtKEZvbyAqZikuCgowOC8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIC1XZXJyb3IgY29tbWFuZCBsaW5lIG9wdGlvbi4gICBJZiBzdXBwbGllZCwgd2FybmluZyBtZXNzYWdlcyBhcmUgdHJlYXRlZAogICAgICAgICAgICBhcyBlcnJvcnMgYW5kIFNXSUcgd2lsbCByZXR1cm4gYSBub24temVybyBleGl0IGNvZGUuCgowOC8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTk2MTM1IF0gVHlwZWRlZiBvZiByZWZlcmVuY2UgY2FuJ3QgY29tcGlsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCAmSW50UmVmOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKEludFJlZiBpKTsKCiAgICAgICAgICAgIFNXSUctMS4zLjE0IGdlbmVyYXRlZCBjb2RlIHRoYXQgd291bGRuJ3QgY29tcGlsZS4KClZlcnNpb24gMS4zLjE0IChBdWd1c3QgMTIsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBTdGF0aWMgY29uc3QgbWVtYmVycyBpbml0aWFsaXplZCBkdXJpbmcgZGVjbGFyYXRpb24sIGFuZAoJICAgIG9ubHkgdGhlbSwgaWU6CgoJICAgIHN0cnVjdCBBCgkgICAgewkJIAoJCXN0YXRpYyBjb25zdCBpbnQgYSA9IDEgOyAgLy8gdGhpcyBvbmUKCQlzdGF0aWMgY29uc3QgaW50IGI7ICAgICAgIC8vIG5vdCB0aGlzIG9uZQogICAgICAgICAgICB9OyAgICAgCgoJICAgIGFyZSBlbWl0dGVkIGxpa2UgY29uc3RhbnRzIChlcXVpdmFsZW50IHRvIGVudW1zIG9yCgkgICAgZXhwbGljaXQgJWNvbnN0YW50KS4KCSAgICAKCSAgICBUaGlzIGlzIGJlY2F1c2UgdGhleSBjYW5ub3QgYmUgYWRkZWQgZGlyZWN0bHkgdG8gJ2N2YXInCgkgICAgc2luY2UgdGhleSBsYWNrIHRoZSBuZWVkZWQgcmVmZXJlbmNlICh3ZWxsLCB5b3UgY2FuIGZvcmNlCgkgICAgdGhlbSB0byBoYXZlIGEgcmVhbCByZWZlcmVuY2UsIGJ1dCBpbiBhbiB1Z2x5IHdheSB3aGljaAoJICAgIGdvZXMgY29tcGxldGVseSBhZ2FpbiB0aGUgb3JpZ2luYWwgcHVycG9zZSBvZiBpbml0aWFsaXplCgkgICAgdGhlbSBkdXJpbmcgZGVjbGFyYXRpb24sIHlvdSBhbHNvIGhhdmUgdG8gZGVhbCB3aXRoIGV4dHJhCgkgICAgbGlua2luZyBtYXR0ZXJzLCBhbmQgaXQgdGFrZSBhIHdoaWxlIHRvIGZpZ3VyZSBvdXQgd2hhdCBpcwoJICAgIHRoZSBwcm9ibGVtIGFuZCBob3cgdG8gc29sdmUgaXQpLgoJICAgIAoJICAgIFBsZWFzZSB0ZXN0IGl0IHdpdGggeW91ciBwcmVmZXJyZWQgdGFyZ2V0IGxhbmd1YWdlLCBhbmQKCSAgICBub3Qgb25seSB0aGUgY29kZSBnZW5lcmF0aW9uLCBidXQgcmVhbGx5IHJ1biB0aGUgZXhhbXBsZQoJICAgIGluIHRoZSB0ZXN0LXN1aXRlIChzdGF0aWMtY29uc3QtbWVtYmVyLTIuaSkgYmVjYXVzZSB0aGUKCSAgICBwcm9ibGVtIGFuZCB0aGUgc29sdXRpb24gY2Fubm90IGJlICJmdWxseSIgYXBwcmVjaWF0ZWQKCSAgICB1bnRpbCB5b3UgdHJ5IHRvIGxvYWQgdGhlIG1vZHVsZSBhbmQgcnVuIGl0LgoKCSAgICBJbiBzb21lIHRhcmdldCBsYW5ndWFnZXMgKHB5dGhvbiBzcGVjaWFsbHkpLCB0aGlzIGNhbgoJICAgIHByb2R1Y2VzIGEgZGlmZmVyZW5jZSBpbiB0aGUgd2F5IHRoYXQgdGhlIHN0YXRpYyBjb25zdGFudAoJICAgIG1lbWJlcnMgJ2EnIGFuZCAnYicgYXJlIGludGVybmFsbHkgd3JhcHBlZC4gSG9wZWZ1bGx5LAoJICAgIHRoZXkgc3RpbGwgY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSBzYW1lIHdheS4KCgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBbcHl0aG9uXSBOb3cgc3RhdGljIGNvbnN0IG1lbWJlcnMgY2FuIGJlIGFjY2Vzc2VkIGluIGEgbW9yZQoJICAgIG5hdHVyYWwgd2F5LCBpZSwgaWYgeW91IGhhdmUKCgkgICAgc3RydWN0IEEKICAgICAgICAgICAgIHsJCSAKCQl0eXBlZGVmIHVuc2lnbmVkIGludCB2aWV3ZmxhZ3M7CgkJc3RhdGljIGNvbnN0IHZpZXdmbGFncyBmb3J3YXJkX2ZpZWxkID0gMDsKCQlzdGF0aWMgY29uc3Qgdmlld2ZsYWdzIGJhY2t3YXJkX2ZpZWxkOwogICAgICAgICAgICB9OyAgICAgCgkgICAgCgkgICAgbm93IHlvdSBjYW4gZG86CgoJCXByaW50IEEuYmFja3dhcmRfZmllbGQKCgkgICAgYW5kIGFsc28KCgkgICAgICAgIGEgPSBBKCkKCQlwcmludCBhLmZvcndhcmRfZmllbGQKCQkKCSAgICBOb3RlIHRoYXQgaWYgdGhlIHN0YXRpYyBjb25zdCBtZW1iZXJzIGRvbid0IGhhdmUgYW4KCSAgICBpbml0aWFsaXplciAobGlrZSBiYWNrd2FyZF9maWVsZCksIHN0aWxsIHlvdSBjYW4gYWNjZXNzCgkgICAgdGhlbSBpbiB0aGUgc2FtZSB3YXkgaW4gdGhlIHB5dGhvbiBzaWRlLCBidXQgdGhlCgkgICAgaW1wbGVtZW50YXRpb24gaXMgYSBxdWl0ZSBkaWZmZXJlbnQ6IGJhY2t3YXJkX2ZpZWxkIHdpbGwKCSAgICBzdGlsbCBhcHBlYXIgaW4gdGhlIGN2YXIgZW50aXR5LCBhbmQgYWxzbywgeW91IGFyZSAKCSAgICByZXNwb25zaWJsZSB0byBpbml0aWFsaXplIGl0IGluIHNvbWUgY29kZSB1bml0LCBhbmQgbGluayBpdAoJICAgIHByb3Blcmx5LiBmb3J3YXJkX2ZpZWxkLCBieSB0aGUgb3RoZXIgaGFuZCwgd2lsbCBub3QKCSAgICBhcHBlYXIgaW4gdGhlIGN2YXIgZW50aXR5IGJ1dCBvbmx5IGFzIGEgQSBtZW1iZXIsIHNpbWlsYXIKCSAgICB0byB3aGF0IGhhcHBlbiB3aXRoIGVudW0gb3IgJWNvbnN0YW50IG1lbWJlcnMuCgowOC8xMS8yMDAyOiBtbWF0dXMKCSAgICBbcHl0aG9uXSBDb21tb24gY29kZSBpbiB0aGUgX19zZXRhdHRyX18vX19nZXRhdHRyX18gbm93CgkgICAgZ29lcyB0byB0d28gImZyZWUiIG1ldGhvZHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJveHkKCSAgICBmaWxlLCBmcm9tIHdoZXJlIGVhY2ggY2xhc3MgdXNlIGl0LiBUaGlzIGNoYW5nZSByZWR1Y2VzCgkgICAgdGhlIHNpemUgb2YgdGhlIHByb3h5IGZpbGUsIHNwZWNpYWxseSBpZiB5b3Ugd3JhcCBhIGxvdCBvZgoJICAgIHNtYWxsIGNsYXNzZXMgaW4gb25lIG1vZHVsZSAodXAgdG8gMzMlIGluIHNvbWUgY2FzZXMpLAoJICAgIG1ha2luZyBpdCBmYXN0ZXIgdG8gbG9hZCB0b28uCgowOC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQZXJsNV0gSWYgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgY2hhciAqIHJldHVybnMgTlVMTCwKICAgICAgICAgICAgdW5kZWYgaXMgcmV0dXJuZWQgdG8gdGhlIFBlcmwgaW50ZXJwcmV0ZXIuCiAKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggdG8gY29udmVyc2lvbiBvcGVyYXRvcnMgYW5kIG5hbWVzcGFjZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgbnMgewogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBGb28geyB9OwogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBCYXIgewogICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRvciBGb28qKCk7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoZSB3cmFwcGVyIGNvZGUsIFNXSUcgd2FzIHVzaW5nIC0+b3BlcmF0b3IgRm9vKigpCiAgICAgICAgICAgIHdoZW4gaXQgc2hvdWxkIGhhdmUgYmVlbiB1c2luZyAtPm9wZXJhdG9yIG5zOjpGb28qKCkuCgogICAgICAgICAgICBOb3RlOiBpZiB1c2luZyAlcmVuYW1lIHdpdGggYSBjb252ZXJzaW9uIG9wZXJhdG9yLCB5b3UKICAgICAgICAgICAgbWlnaHQgaGF2ZSB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJXJlbmFtZSh0b0Zvb1B0cikgbnM6Om9wZXJhdG9yIG5zOjpGb28qKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBeXl5eIG5vdGUgZXh0cmEgcXVhbGlmaWVyCiAgICAgICAgICAgICAgIG5hbWVzcGFjZSBucyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICAKMDgvMDkvMjAwMjogYmVhemxleQogICAgICAgICAgICBbUHl0aG9uXSBNaW5vciBlbmhhbmNlbWVudCB0byAnY29uc3QnIHZhcmlhYmxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgIE5vcm1hbGx5IGNvbnN0IGRlY2xhcmF0aW9ucyBhcmUgd3JhcHBlZCBhcyByZWFkLW9ubHkgdmFyaWFibGVzCiAgICAgICAgICAgIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIHRoZSBjdmFyIGF0dHJpYnV0ZSAoc2VlIFNXSUcuaHRtbCBmb3IKICAgICAgICAgICAgYSBkaXNjdXNzaW9uIG9mIHdoeSkuICBIb3dldmVyLCBpbiBtYW55IHByb2dyYW1zLCAiY29uc3QiIAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbWF5IGp1c3QgYmUgY29uc3RhbnRzLS0tbWFraW5nIHRoZSBjdmFyLiBhY2Nlc3MKICAgICAgICAgICAgYXdrd2FyZC4gIFRvIGZpeCB0aGlzLCAiY29uc3QiIGRlY2xhcmF0aW9ucyBhcmUgbm93IGF2YWlsYWJsZQogICAgICAgICAgICBib3RoIHRocm91Z2ggY3Zhci4gYW5kIGFzIGEgc2ltcGxlIG5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgY29uc3QgaW50IEZPTyA9IDQyOwoKICAgICAgICAgICAgSW4gUHl0aG9uOgoKICAgICAgICAgICAgICAgICA+Pj4gcHJpbnQgZXhhbXBsZS5jdmFyLkZPTwogICAgICAgICAgICAgICAgIDQyCiAgICAgICAgICAgICAgICAgPj4+IHByaW50IGV4YW1wbGUuRk9PCiAgICAgICAgICAgICAgICAgNDIKCiAgICAgICAgICAgIE5vdGU6IFRoZXJlIGFyZSBjYXNlcyB3aGVyZSB0aGUgdmFsdWUgb2YgYSAiY29uc3QiIHZhcmlhYmxlCiAgICAgICAgICAgIG1pZ2h0IGNoYW5nZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICBjaGFyICpjb25zdCBCQVIgPSAiSGVsbG8gV29ybGQiOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgcG9pbnRlciBpdHNlbGYgY2FuIG5vdCBjaGFuZ2UsIGJ1dCB0aGUgCiAgICAgICAgICAgIGRhdGEgYmVpbmcgcG9pbnRlZCB0byBjb3VsZCBiZSBtb2RpZmllZC4gIEluIHRoZXNlIHNpdHVhdGlvbnMsCiAgICAgICAgICAgIGN2YXIuQkFSIHNob3VsZCBiZSBhY2Nlc3NlZCB0byBvYnRhaW5lZCB0aGUgY3VycmVudCB2YWx1ZS4KCjA4LzA4LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbl0gRml4ZWQgZ2VuZXJhdGlvbiBvZiB0aGUgcHJveHkgY29kZSAoLnB5IGZpbGVzKSB0byBtb3JlCiAgICAgICAgICAgIGNsb3NlbHkgZm9sbG93IHRoZSBvcmRlciBvZiBkZWNsYXJhdGlvbnMgYXMgdGhleSBhcHBlYXIgaW4KICAgICAgICAgICAgdGhlIC5pIGZpbGUuICAgSW4gdGhlIHBhc3QsIGFsbCBvZiB0aGUgY2xhc3Mgd3JhcHBlcnMgYXBwZWFyZWQKICAgICAgICAgICAgZmlyc3QsIGZvbGxvd2VkIGJ5IGZ1bmN0aW9uIHN0dWJzLCBpbnNlcnRlZCBQeXRob24gY29kZSwgYW5kCiAgICAgICAgICAgIG90aGVyIGRldGFpbHMuCgowOC8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3h5IG1ldGhvZCBfZGVsZXRlKCkgY2hhbmdlZCB0byBkZWxldGUoKS4gVGhlcmUgc2hvdWxkbid0IGV2ZXIKICAgICAgICAgICAgYmUgYSB3cmFwcGVkIGZ1bmN0aW9uIGNhbGxlZCBkZWxldGUoKSBhcyBpdCBpcyBhIEMrKyBrZXl3b3JkIGFuZCB0aGVyZQogICAgICAgICAgICBpcyBubyBzdWNoIHRoaW5nIGFzIGEgbWVtYmVyIGZ1bmN0aW9uIGluIEMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgogICAgICAgICAgICBCYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoZSBmdW5jdGlvbiBiYWNrIGluCiAgICAgICAgICAgIGZvciBhbGwgcHJveHkgY2xhc3NlczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpIFNXSUdUWVBFICV7CiAgICAgICAgICAgICAgcHVibGljIHZvaWQgX2RlbGV0ZSgpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIEphdmEgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgc3VtbWFyeQogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiBjaGFuZ2VzIHRoYXQgaGF2ZSBiZWVuIG1hZGUgaW4gaW1wcm92aW5nIHRoZSBKYXZhIG1vZHVsZSAKICAgICAgICAgICAgZm9yIHZlciAxLjMuMTQuICBJZiBhdCBhbGwgcG9zc2libGUgY2hhbmdlIHlvdXIgY29kZSB0byB0YWtlIGFkdmFudGFnZXMgb2YgdGhlIAogICAgICAgICAgICBpbXByb3ZlbWVudHMuIElmIHlvdSB3ZXJlIHVzaW5nIHByb3h5IGNsYXNzZXMgeW91IG1heSBub3Qgbm90aWNlIGFueSBiYWNrd2FyZHMgCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgaXNzdWVzLiBIZXJlIGlzIGFuIGV4YW1wbGUgd2hpY2ggd2lsbCBoZWxwIHdpdGggbW9zdCBiYWNrd2FyZHMgCiAgICAgICAgICAgIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgd2hlcmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgY29kZSB0aGF0IHVzZXMKICAgICAgICAgICAgdGhlIGdlbmVyYXRlZCBvdXRwdXQ6CgogICAgICAgICAgICBSZXBsYWNlOgogICAgICAgICAgICAgICAgJW1vZHVsZSBtb2R1bGVuYW1lCgogICAgICAgICAgICBXaXRoOgogICAgICAgICAgICAgICAgJW1vZHVsZSAoam5pY2xhc3NuYW1lPSJtb2R1bGVuYW1lIikgbW9kdWxlbmFtZTsKICAgICAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENQdHIkamF2YWNsYXNzbmFtZSgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN3aWdDUHRyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBfZGVsZXRlKCkgewogICAgICAgICAgICAgICAgICAgICAgZGVsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICAgICVwcmFnbWEoamF2YSkgam5pY2xhc3NjbGFzc21vZGlmaWVycz0icHVibGljIjsKCiAgICAgICAgICAgIFRoZSBwcm94eSBjb25zdHJ1Y3RvcnMgdGhhdCB0b29rIHBhcmFtZXRlcnMgKGxvbmcgY1B0ciwgYm9vbGVhbiBjTWVtb3J5T3duKQogICAgICAgICAgICB3ZXJlIHB1YmxpYyBhbmQgYXJlIG5vdyBwcm90ZWN0ZWQuIElmIHlvdSB3ZXJlIG1ha2luZyB1c2Ugb2YgdGhlc2UgdGhlbiB5b3UnbGwgCiAgICAgICAgICAgIGhhdmUgdG8gbW9kaWZ5IHlvdXIgY29kZSBhbmQgdGhlIGJlc3Qgc29sdXRpb24gd291bGQgYmUgdG8gdXNlIHRoZSBuZXcgdHlwZSAKICAgICAgICAgICAgd3JhcHBlciBjbGFzc2VzLgoKICAgICAgICAgICAgVGhlIG90aGVyIG1haW4gYXJlYXMgYXJlIHRoZSBwcmFnbWFzIGFuZCBnbG9iYWwgdmFyaWFibGUgd3JhcHBpbmcuIFJlcGxhY2UgCiAgICAgICAgICAgIHRoZSBwcmFnbWFzIHdpdGggb25lIG9mIHRoZSBuZXcgZGlyZWN0aXZlcyBvciB0eXBlbWFwcyBtZW50aW9uZWQgYmVsb3cgYW5kIHVzZQogICAgICAgICAgICAlcmVuYW1lIG9uIHRoZSB2YXJpYWJsZXMuCgogICAgICAgICAgICBJZiB5b3Ugd2VyZSBub3QgdXNpbmcgcHJveHkgY2xhc3NlcywgeW91IHdpbGwgaGF2ZSB0byBkZWZpbmUgYSBqc3R5cGUgdHlwZW1hcAogICAgICAgICAgICBhcyB3ZWxsIGFzIGEganR5cGUgdHlwZW1hcC4KCjA4LzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4IGZvciB3cmFwcGluZyB0d28gZGltZW5zaW9uIGFycmF5IHZhcmlhYmxlcy4KCjA4LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbixUY2xdCiAgICAgICAgICAgIE9iamVjdCBtYW5hZ2VtZW50IG5vdyBoYXMgYSBtdWNoIGJldHRlciBzZW5zZSBvZiBvd25lcnNoaXAuCiAgICAgICAgICAgIE93bmVyc2hpcCBiaXRzIGlzIGNoYW5nZWQgd2hlbmV2ZXIgYW4gb2JqZWN0IGlzIHN0b3JlZCBpbiBhCiAgICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSBvciBzdHJ1Y3R1cmUgbWVtYmVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgaW50IHZhbDsKICAgICAgICAgICAgICAgICAgICBGb28gKm5leHQ7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTm93IGluIFB5dGhvbgoKICAgICAgICAgICAgICAgPj4+IGYgPSBGb28oKQogICAgICAgICAgICAgICA+Pj4gZi50aGlzb3duCiAgICAgICAgICAgICAgIDEKICAgICAgICAgICAgICAgPj4+IGcgPSBGb28oKQogICAgICAgICAgICAgICA+Pj4gZy5uZXh0ID0gZiAgICAgICAgICAjIEFzc2lnbiBhIHBvaW50ZXIKICAgICAgICAgICAgICAgPj4+IGYudGhpc293biAgICAgICAgICAgIyBOb3RpY2Ugb3duZXJzaGlwIGNoYW5nZQogICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgID4+PgoKICAgICAgICAgICAgVGhpcyBzY2hlbWUgaXMgbW9zdGx5IGEgY29uc2VydmF0aXZlIGhldXJpc3RpYyBkZXNpZ25lZCB0byAKICAgICAgICAgICAgcHJvdmlkZSBzZWdtZW50YXRpb24gZmF1bHRzLiAgSXQgY291bGQgY2F1c2UgYSBtZW1vcnkgbGVhawogICAgICAgICAgICBpZiBvd25lcnNoaXAgaXMgY2hhbmdlZCB1bm5lY2Vzc2FyaWx5LiAgSW4gdGhpcyBjYXNlLCB5b3UgY2FuCiAgICAgICAgICAgIGVpdGhlciB3cml0ZSBhIHR5cGVtYXAgKHRoYXQgZG9lc24ndCBjaGFuZ2Ugb3duZXJzaGlwKSwgb3IKICAgICAgICAgICAgbWFudWFsbHkgc2V0IHRoZSB0aGlzb3duIGF0dHJpYnV0ZSBiYWNrIHRvIDEuCgowOC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtUY2xdIE1ham9yIHVzYWJpbGl0eSBpbXByb3ZlbWVudHMgdG8gdGhlIG9iamVjdCBpbnRlcmZhY2UuCiAgICAgICAgICAgIFN1cHBvc2UgeW91IGhhZCBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7IAogICAgICAgICAgICAgICAgICAgICBpbnQgeDsKICAgICAgICAgICAgICAgICAgICAgaW50IHNwYW0oKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICB2b2lkICBibGFoKEZvbyAqZik7CgogICAgICAgICAgICBJbiBwYXN0IHZlcnNpb25zIG9mIFNXSUcsIHlvdSBjb3VsZCBjcmVhdGUgb2JqZWN0cyBhbmQgdXNlCiAgICAgICAgICAgIHRoZW0gbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICUgRm9vIGYKICAgICAgICAgICAgICAgICUgZiBjb25maWd1cmUgLXggMwogICAgICAgICAgICAgICAgJSBmIHNwYW0KICAgICAgICAgICAgICAgIDM3CiAgICAKICAgICAgICAgICAgVGhlIG9ubHkgcHJvYmxlbSBpcyB0aGF0IGlmIHlvdSB0cmllZCB0byBjYWxsIGJsYWgoKSwgaXQgZGlkbid0CiAgICAgICAgICAgIHdvcms6CgogICAgICAgICAgICAgICAgJSBibGFoIGYKICAgICAgICAgICAgICAgIFR5cGUgRXJyb3IuIEV4cGVjdGVkIF9wX0ZvbwogICAgICAgICAgICAgICAgJQoKICAgICAgICAgICAgSW5zdGVhZCwgeW91IGhhZCB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICUgYmxhaCBbZiBjZ2V0IC10aGlzXQogIAogICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGV4dHJhY3RzIHRoZSAtdGhpcyBwb2ludGVyLCBhdm9pZGluZyB0aGlzCiAgICAgICAgICAgIHByb2JsZW0uICBUaGlzIG1lYW5zIHRoYXQgc2F5aW5nICJibGFoIGYiIGlzIHBlcmZlY3RseSBsZWdhbCBhbmQKICAgICAgICAgICAgZXZlcnl0aGluZyB3aWxsIHN0aWxsIHdvcmsgbm9ybWFsbHkuCgogICAgICAgICAgICBDYXZlYXQ6IFNpbmNlIHBvaW50ZXIgc3RyaW5ncyBzdGFydCB3aXRoIGEgbGVhZGluZyB1bmRlcnNjb3JlIChfKSwKICAgICAgICAgICAgZG9uJ3QgdXNlIHRoaXMgaW4gb2JqZWN0IG5hbWVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJSBGb28gX2YgCiAgICAgICAgICAgICAgICAlIGJsYWggX2YgICAgICAgICMgUG90ZW50aWFsIGNyYXNoCgogICAgICAgICAgICBPYmplY3RzIG5vdyBoYXZlIGEgLXRoaXNvd24gYXR0cmlidXRlIHRoYXQgc2hvd3MgdGhlIG93bmVyc2hpcC4KICAgICAgICAgICAgVGhpcyBidWlsZHMgdXBvbiB0aGUgQ0hBTkdFUyAxMS8yNC8yMDAxIGVudHJ5LgoKMDgvMDcvMjAwMjogc2FtamFtLCBTYW0gTGlkZGljb3R0CiAgICAgICAgICAgIFByb3Blcmx5IGltcGxlbWVudGVkIHBvaW50ZXIgc3lzdGVtIHVzaW5nIHBocCByZXNvdXJjZXMuCiAgICAgICAgICAgIFN0aWxsIG5lZWQgdG8gd29yayBvdXQgd2hldGhlciBvciBub3QgdG8gbGV0IHNjcmlwdC11c2VycyBjYWxsCiAgICAgICAgICAgIGRlc3RydWN0b3JzIGRpcmVjdGx5CgowOC8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVwZ3JhZGVkIG16c2NoZW1lIG1vZHVsZSB0byBzdXBwb3J0IHZlcnNpb24gMjAxIGFuZCBhZGRlZAogICAgICAgICAgICBvdmVybG9hZGluZyBzdXBwb3J0LgoKMDgvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIGV4dHJhIGdyb3VwaW5nIChpbiB2ZXJ5IGxpbWl0ZWQgY2FzZXMpLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKEZ1bmNQdHIpKGludCwgZG91YmxlKTsKCiAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgKioqCiAgICAgICAgICAgIAowOC8wMy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gVXBkYXRlcyB0byB0eXBlbWFwcy5pIGFzIHRob3NlIGRvbmUgcHJldmlvdXNseSBmb3IgUGVybCwKICAgICAgICAgICAgUHl0aG9uIGFuZCBUY2wgbW9kdWxlcy4gTm93IHN1cHBvcnRzIHJlZmVyZW5jZSB0eXBlcyB3aXRoIElOUFVULAogICAgICAgICAgICBPVVRQVVQgYW5kIElOT1VUIHR5cGVtYXBzLgoKMDgvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBOZXcgbGlicmFyeSBmaWxlIGNzdHJpbmcuaSBhZGRlZC4gIFByb3ZpZGVzIG1hY3JvcyBmb3IKICAgICAgICAgICAgbWFuaXB1bGF0aW5nIGNoYXIgKiBkYXRhLgogCjA4LzAyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICBVc2UgJW5ld29iamVjdCBpbnN0ZWFkLiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlbmV3b2JqZWN0IGZvbzsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIGNoYXIgKmZvbygpOwoKICAgICAgICAgICAgJW5ld29iamVjdCBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLAogICAgICAgICAgICBldGMuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjA4LzAxLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IGF0dHJpYnV0ZSAnam5pY2xhc3NuYW1lJyBmb3IgdGhlIG1vZHVsZSBkaXJlY3RpdmUgYWxsb3dzIGEgd2F5IG9mCiAgICAgICAgICAgIGNoYW5naW5nIHRoZSBKTkkgY2xhc3MgbmFtZSBmcm9tIHRoZSBkZWZhdWx0IHdoaWNoIHVzZXMgdGhlIG1vZHVsZW5hbWUgd2l0aCBKTkkKICAgICAgICAgICAgYXBwZW5kZWQgYWZ0ZXIgaXQuCgogICAgICAgICAgICAgICAgJW1vZHVsZSAoam5pY2xhc3NuYW1lPSJuYW1lIikgbW9kdWxlbmFtZQoKICAgICAgICAgICAgSWYgJ25hbWUnIGlzIHRoZSBzYW1lIGFzICdtb2R1bGVuYW1lJyB0aGVuIHRoZSBtb2R1bGUgY2xhc3MgbmFtZSBnZXRzIGNoYW5nZWQKICAgICAgICAgICAgZnJvbSAnbW9kdWxlbmFtZScgdG8gbW9kdWxlbmFtZU1vZHVsZS4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIGZpbGUgaW5jbHVkZSBvcmRlci4gIExhbmd1YWdlIHNwZWNpZmljCiAgICAgICAgICAgIGRpcmVjdG9yaWVzIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBnZW5lcmljIGRpcmVjdG9yaWVzLgogICAgICAgICAgICBGb3IgZXhhbXBsZTogICJzd2lnX2xpYi9weXRob24vZm9vLmkiIHNob3VsZCBiZSBsb2FkZWQgYmVmb3JlCiAgICAgICAgICAgICJzd2lnX2xpYi9mb28uaSIuICAgIEkgdGhvdWdodCB0aGlzIHdhcyB0aGUgY2FzZSBhbHJlYWR5LCBidXQKICAgICAgICAgICAgYXBwYXJlbnRseSBpdCBoYXMgYmVlbiBicm9rZW4gZm9yIHF1aXRlIHNvbWUgdGltZS4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgc3RkX2RlcXVlLmkgbGlicmFyeSBmaWxlLiAgV29yayBpbiBwcm9ncmVzcy4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW1B5dGhvbixUY2wsUGVybF0KICAgICAgICAgICAgSW1wcm92ZW1lbnRzIHRvIHR5cGVtYXBzLmkuICBJTlBVVC9JTk9VVCB0eXBlbWFwcyBwZXJmb3JtIGJldHRlcgogICAgICAgICAgICBlcnJvciBjaGVja2luZy4gIFR5cGVtYXBzIGFyZSBub3cgc3VwcGxpZWQgZm9yIHJlZmVyZW5jZXMgbGlrZSAKICAgICAgICAgICAgaW50ICZPVVRQVVQsIGRvdWJsZSAmSU5PVVQsIGV0Yy4KICAgICAgICAgIAowOC8wMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtQeXRob25dIERlcHJlY2F0ZWQgdGhlIFRfKiBhbmQgTF8qIHR5cGVtYXBzIGluIHR5cGVtYXBzLmkuCiAgICAgICAgICAgIE11bHRpcGxlIHJldHVybiB2YWx1ZXMgYXJlIGFsd2F5cyBwbGFjZWQgaW4gYSB0dXBsZS4gRGVwcmVjYXRlZAogICAgICAgICAgICB0aGUgQk9USCB0eXBlbWFwcy4gIFRoaXMgaXMgbm93IElOT1VUIChlLmcuLCBpbnQgKklOT1VUKS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBQWVRIT04gTU9EVUxFICoqKgoKMDgvMDEvMjAwMjogYmVhemxleQogICAgICAgICAgICBEZXByZWNhdGVkIHRoZSBhcnJheS5pLCBjYXJyYXkuaSwgYW5kIHRpbWVyLmkgbGlicmFyeSBmaWxlcy4KCjA4LzAxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgcG9pbnRlci5pIGxpYnJhcnkgZmlsZS4gIFVzZSBjcG9pbnRlci5pIGluc3RlYWQuCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgICAKMDgvMDEvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBGb3IgY29uc2lzdGVuY3kgdGhlIGdsb2JhbCB2YXJpYWJsZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHVzZSB0aGUgSmF2YUJlYW4gCiAgICAgICAgICAgIHByb3BlcnR5IGRlc2lnbiBwYXR0ZXJuIGxpa2UgbWVtYmVyIHZhcmlhYmxlcyBhbHdheXMgaGF2ZS4gVGhpcyBtZWFucyBpZiB5b3UgYXJlIAogICAgICAgICAgICB3cmFwcGluZyBhIHZhcmlhYmxlIGNhbGxlZCBmb28sIHRoZSBnZXR0ZXIgaXMgY2FsbGVkIGdldEZvbygpIGFuZCB0aGUgc2V0dGVyIGlzIAogICAgICAgICAgICBjYWxsZWQgc2V0Rm9vKCkuIEJlZm9yZSB0aGUgcmVjZW50IGNoYW5nZXMgdG8gdGhlIEphdmEgbW9kdWxlIHRoZSBnZXR0ZXJzIGFuZCAKICAgICAgICAgICAgc2V0dGVycyB3ZXJlIGNhbGxlZCBnZXRfZm9vKCkgYW5kIHNldF9mb28oKS4gSWYgeW91IHJlYWxseSB3YW50IHRoZSBvcmlnaW5hbCAKICAgICAgICAgICAgZnVuY3Rpb24gbmFtZXMgdXNlIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBsaWtlIHRoaXM6ICVyZW5hbWUoX2ZvbykgRm9vOwoKMDcvMzEvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBjYXN0aW5nIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBpbmhlcml0YW5jZS4gIElmIHlvdSBoYWQgdGhpcywKCiAgICAgICAgICAgICAgICAgIGNsYXNzIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3MgYmFyIDogcHVibGljIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3MgYmF6IDogcHVibGljIGZvbyB7fTsKICAgICAgICAgICAgICAgICAgY2xhc3Mgc3BhbSA6IHB1YmxpYyBiYXIsIHB1YmxpYyBiYXoge307CgogICAgICAgICAgICB0aGVuIHRoZSB3cmFwcGVycyB3b3VsZG4ndCBjb21waWxlIGR1ZSB0byBhbiBhbWJpZ3VvdXMgY2FzdC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQXJ0IFllcmtlcy4KCjA3LzMwLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRHVlIHRvIG5ldyBzdGF0aWMgdHlwZWNoZWNraW5nIGFsbCBwb2ludGVycyBoZWxkIGluIGEgSmF2YSBsb25nIGFyZSBwYXJ0IG9mIAogICAgICAgICAgICB0aGUgaW50ZXJuYWwgd29ya2luZ3MgYW5kIHRoaXMgcG9pbnRlciB2YWx1ZSBpbiB0aGUgSmF2YSBsb25nIGhhcyBiZWNvbWUgYWJzdHJhY3RlZAogICAgICAgICAgICBkYXRhLiBUaGUgdHlwZSB3cmFwcGVyIGNvbnN0cnVjdG9yIGFuZCBnZXRDUHRyKCkgbWV0aG9kcyBhcmUgYXMgc3VjaCBwcm90ZWN0ZWQuCiAgICAgICAgICAgIElmIHlvdSBuZWVkIHRvIG1lc3MgYXJvdW5kIHdpdGggcG9pbnRlcnMgZnJvbSBKYXZhIG9yIGZvciBleGFtcGxlIGNyZWF0ZSBhIHByb3h5IAogICAgICAgICAgICBjbGFzcyBvciB0eXBlIHdyYXBwZXIgY2xhc3MgYXJvdW5kIGEgbnVsbCBwb2ludGVyLCBhZGQgYSBmdW5jdGlvbi9jb25zdHJ1Y3RvciAKICAgICAgICAgICAgdG8gZG8gc28gd2l0aCB0aGUgJWphdmFjb2RlIHR5cGVtYXAuIFlvdSBjYW4gYWxzbyBtYWtlIGdldENQdHIoKSBwdWJsaWMgYWdhaW4gd2l0aAogICAgICAgICAgICB0aGUgJWphdmFnZXRjcHRyIHR5cGVtYXAuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeGVzIGZvciAldHlwZW1hcChpZ25vcmUpLiBJbiBwYXJ0aWN1bGFyIHdoZW4gaWdub3JpbmcgdGhlIGxhc3QgcGFyYW1ldGVyCiAgICAgICAgICAgIGluIGEgZnVuY3Rpb24uIEFsc28gZm9yIGFsbCBwYXJhbWV0ZXJzIGluIGNvbnN0cnVjdG9ycy4gVGhlc2UgbW9kcyBoYXZlIGFsc28gZml4ZWQKICAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMgZm9yIHByb3h5IGNsYXNzZXMgLSBTRiA1ODE3OTEuCgowNy8zMC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdICVuZXdvYmplY3QgKHJlcGxhY2VtZW50IGZvciAlbmV3KSBub3cgaW1wbGVtZW50ZWQgZm9yIEphdmEuIAoKMDcvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdHlwZW1hcCBjb3BpZXMsICVhcHBseSwgYW5kICVjbGVhciBpbnNpZGUKICAgICAgICAgICAgQysrIG5hbWVzcGFjZXMuCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBKTkkgY2xhc3Mgbm93IGhhcyBwYWNrYWdlIGFjY2VzcyBhcyB0aGUgY2xhc3MgbW9kaWZpZXIKICAgICAgICAgICAgaGFzIGJlZW4gY2hhbmdlZCBmcm9tICJwdWJsaWMiIHRvIG5vdGhpbmcuIFRoaXMgaGFzIGJlZW4gZG9uZQogICAgICAgICAgICBhcyB0aGlzIGNsYXNzIGlzIG5vdyBtb3JlIGZvciB0aGUgaW50ZXJuYWwgd29ya2luZ3Mgb2YgU1dJRyBzaW5jZSB0aGUgbW9kdWxlCiAgICAgICAgICAgIGNsYXNzIGhhcyBzdGF0aWMgdHlwZSBjaGVja2luZyBmb3IgYWxsIHR5cGVzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIHRoZSAlam5pY2xhc3NjbGFzc21vZGlmaWVyIAogICAgICAgICAgICBwcmFnbWEgdG8gY2hhbmdlIGl0IGJhY2sgdG8gInB1YmxpYyIuCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFByb3h5L1NoYWRvdyBjbGFzc2VzIGFyZSBnZW5lcmF0ZWQgYnkgZGVmYXVsdC4gVGhlIC1wcm94eSBhbmQgCiAgICAgICAgICAgIC1zaGFkb3cgY29tbWFuZCBsaW5lIG9wdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIElmIHlvdSB3YW50IHRvIHVzZSB0aGUgCiAgICAgICAgICAgIGxvdy1sZXZlbCBmdW5jdGlvbmFsIGludGVyZmFjZSB0aGVuIHVzZSB0aGUgbmV3IC1ub3Byb3h5IGNvbW1hbmRsaW5lIG9wdGlvbi4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjA3LzI4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gUmVtYWluaW5nIHByYWdtYXMgc2hha2V1cC4gVGhlc2Ugd2VyZSB0aGUgcmVtYWluaW5nIHByYWdtYXMgYW5kIHRoZWlyCiAgICAgICAgICAgIG5ldyBuYW1lcyB3aGVyZSBjaGFuZ2VkOgoKICAgICAgICAgICAgbW9kdWxlYmFzZQogICAgICAgICAgICBtb2R1bGVjb2RlCiAgICAgICAgICAgIG1vZHVsZWNsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIG1vZHVsZWltcG9ydCA9PiBtb2R1bGVpbXBvcnRzCiAgICAgICAgICAgIG1vZHVsZWludGVyZmFjZSA9PiBtb2R1bGVpbnRlcmZhY2VzCgogICAgICAgICAgICBUaGUgbW9kdWxlaW1wb3J0cyB3b3JrcyBzbGlnaHRseSBkaWZmZXJlbnRseSB0byBob3cgdGhlIG1vZHVsZWltcG9ydCBwcmFnbWEgd29ya2VkLiAKICAgICAgICAgICAgTm93IGl0IGFjdHVhbGx5IHRha2VzIGNvZGUgd2hpY2ggZ2V0cyBwbGFjZWQgYmVmb3JlIHRoZSBjbGFzcyBkZWZpbml0aW9uIHNvIHRoZSAKICAgICAgICAgICAgd2hvbGUgaW1wb3J0IHN0YXRlbWVudCBoYXMgdG8gYmUgZ2l2ZW4sIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBtb2R1bGVpbXBvcnRzPSV7CiAgICAgICAgICAgIGltcG9ydCBqYXZhLmlvLio7CiAgICAgICAgICAgIGltcG9ydCBqYXZhLm1hdGguKjsKICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZSBtb2R1bGVpbnRlcmZhY2VzIGlzIHNsaWdodGx5IGRpZmZlcmVudCB0byB0aGUgb2xkIG1vZHVsZWludGVyZmFjZSBpbiB0aGF0IGlmIAogICAgICAgICAgICBtb3JlIHRoYW4gb25lIGludGVyZmFjZSBpcyByZXF1aXJlZCB0aGV5IG11c3QgYmUgY29tbWEgc2VwYXJhdGVkIGluIG9uZSB1c2Ugb2YgCiAgICAgICAgICAgIHRoZSBwcmFnbWEsIGZvciBleGFtcGxlOgoKICAgICAgICAgICAgJXByYWdtYShqYXZhKSBtb2R1bGVpbnRlcmZhY2VzPSJTZXJpYWxpemFibGUsIE15SW50ZXJmYWNlIgoKICAgICAgICAgICAgVGhlc2UgbGFzdCB0d28gcHJhZ21hcyBhcmUgY29uc2lzdGVudCB3aXRoIHRoZSBqYXZhaW50ZXJmYWNlcyBhbmQgamF2YWltcG9ydHMgCiAgICAgICAgICAgIHR5cGVtYXAuCgogICAgICAgICAgICBBIHNpbWlsYXIgc2V0IG9mIHByYWdtYXMgaGFzIGJlZW4gaW50cm9kdWNlZCwgbmFtZWx5OgoKICAgICAgICAgICAgam5pY2xhc3NiYXNlCiAgICAgICAgICAgIGpuaWNsYXNzY29kZQogICAgICAgICAgICBqbmljbGFzc2NsYXNzbW9kaWZpZXJzCiAgICAgICAgICAgIGpuaWNsYXNzaW1wb3J0CiAgICAgICAgICAgIGpuaWNsYXNzaW50ZXJmYWNlCgogICAgICAgICAgICBUaGVzZSB3b3JrIGluIHRoZSBzYW1lIHdheSBhcyB0aGVpciBtb2R1bGUgY291bnRlcnBhcnRzLiBOb3RlIHRoYXQgcHJldmlvdXNseQogICAgICAgICAgICB0aGUgbW9kdWxlWFhYIHByYWdtYXMgd29ya2VkIG9uIHRoZSBvbGQgbW9kdWxlIGNsYXNzIHdoaWNoIGlzIG5vdyBjYWxsZWQgdGhlCiAgICAgICAgICAgIEpOSSBjbGFzcyAodGhlIGNsYXNzIHdpdGggdGhlIG5hdGl2ZSBmdW5jdGlvbnMpLiBUaGUgam5pY2xhc3NYWFggcHJhZ21hcyBub3cgCiAgICAgICAgICAgIHdvcmsgb24gdGhlIG5ldyBtb2R1bGUgY2xhc3MgKHRoZSBjbGFzcyB0aGF0IGhhcyBhbGwgdGhlIGdsb2JhbCBmdW5jdGlvbnMgYW5kCiAgICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzIHdoZW4gdXNpbmcgcHJveHkgY2xhc3NlcywgcGx1cyBhbGwgb3RoZXIKICAgICAgICAgICAgcmVtYWluaW5nIGZ1bmN0aW9ucyB3aGVuIHVzaW5nIHRoZSBsb3ctbGV2ZWwgcHJvY2VkdXJhbCBpbnRlcmZhY2UpLgoKICAgICAgICAgICAgSW4gc3VtbWFyeSB0aGUgY29udGVudHMgb2YgdGhlIHByYWdtYXMgbWFrZSB1cCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgIDxqbmljbGFzc2ltcG9ydHM+CiAgICAgICAgICAgIDxqbmljbGFzc21vZGlmaWVycz4gY2xhc3MgbW9kdWxlbmFtZSBleHRlbmRzIDxqbmljbGFzc2Jhc2U+IGltcGxlbWVudHMgPGpuaWNsYXNzaW50ZXJmYWNlcz4gewogICAgICAgICAgICAgICAgPGpuaWNsYXNzY29kZT4KICAgICAgICAgICAgICAgIC4uLiBTV0lHIGdlbmVyYXRlZCBmdW5jdGlvbnMgLi4uCiAgICAgICAgICAgIH0KfQogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8yOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIERlcHJlY2F0ZWQgbW9kdWxlbWV0aG9kbW9kaWZpZXJzIHByYWdtYSBhbmQgcmVwbGFjZWQgd2l0aCAKICAgICAgICAgICAgYSBiZXR0ZXIgJWZlYXR1cmUgYmFzZWQgZGlyZWN0aXZlIGNhbGxlZCAlamF2YW1ldGhvZG1vZGlmaWVycy4KICAgICAgICAgICAgQSB1c2VmdWwgZXhhbXBsZSB3b3VsZCBiZSBmb3Igc3luY2hyb25pc2F0aW9uIGluIG11bHRpLXRocmVhZGVkIGFwcHM6CgogICAgICAgICAgICAlamF2YW1ldGhvZG1vZGlmaWVycyBmb28oaW50IGEpICJwdWJsaWMgc3luY2hyb25pemVkIjsKCiAgICAgICAgICAgIENoYW5nZXMgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBkZWZhdWx0ICgicHVibGljIikgdG8gInB1YmxpYyBzeW5jaHJvbml6ZWQiLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDcvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICBTZXZlcmFsIGRpcmVjdGl2ZXMgbm93IGFsbG93IG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KICAgICAgICAgICAgVGhlc2UgaW5jbHVkZToKCiAgICAgICAgICAgICAgICAlbW9kdWxlKG5hbWU9InZhbHVlIiwgbmFtZT0idmFsdWUiLCAuLi4pIG1vZHVsZW5hbWUKICAgICAgICAgICAgICAgICVpbXBvcnQobmFtZT0idmFsdWUiLCAuLi4pICJmaWxlbmFtZS5pIgogICAgICAgICAgICAgICAgJWV4dGVuZChuYW1lPSJ2YWx1ZSIsIC4uLikgY2xhc3NuYW1lIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhlc2UgY3VycmVudGx5IGhhdmUgbm8gZWZmZWN0IGFuZCBhcmUgcmVzZXJ2ZWQgZm9yCiAgICAgICAgICAgIGZ1dHVyZSBleHBhbnNpb24uCiAgICAgICAgICAgICAgIAowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEVuaGFuY2VtZW50cyB0byBzbWFydC1wb2ludGVyIGhhbmRsaW5nLiAgU1dJRyBvbmx5IHByb3ZpZGVzCiAgICAgICAgICAgIGV4dHJhIHN1cHBvcnQgZm9yIGEgc21hcnQtcG9pbnRlciBpZiBvcGVyYXRvci0+KCkgcmV0dXJucwogICAgICAgICAgICBhIHByb3BlciBwb2ludGVyLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIEZvbyAqb3BlcmF0b3ItPigpOwoKICAgICAgICAgICAgSWYgb3BlcmF0b3ItPigpIHJldHVybnMgYW4gb2JqZWN0IGJ5IHZhbHVlIG9yIHJlZmVyZW5jZSwKICAgICAgICAgICAgdGhlbiBTV0lHIGV4YW1pbmVzIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gc2VlIGlmIGl0IGFsc28KICAgICAgICAgICAgaW1wbGVtZW50cyBvcGVyYXRvci0+KCkuICBJZiBzbywgU1dJRyBjaGFzZXMgb3BlcmF0b3ItPigpCiAgICAgICAgICAgIHVudGlsIGl0IGNhbiBmaW5kIG9uZSB0aGF0IHJldHVybnMgYSBwb2ludGVyLiAgVGhpcyBhbGxvd3MKICAgICAgICAgICAgY2FzZXMgbGlrZSB0aGlzIHRvIHdvcms6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBGb28gKm9wZXJhdG9yLT4oKTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBCYXIgb3BlcmF0b3ItPigpOwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICA+Pj4gcyA9IFNwYW0oKQogICAgICAgICAgICAgICAgID4+PiBzLmJsYWgoKSAgICAgICMgSW52b2tlcyBGb286OmJsYWgoKQoKICAgICAgICAgICAgVGhlIHMuYmxhaCgpIGNhbGwgYWN0dWFsbHkgaW52b2tlczoKCiAgICAgICAgICAgICAgICAgICgocy5vcGVyYXRvci0+KCkpLm9wZXJhdG9yLT4oKSktPmJsYWgoKTsKIAowNy8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggdHlwZWRlZiBhbmQgcmVmZXJlbmNlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICB0eXBlZGVmIEZvbyAmIEZvb1JlZjsKICAgICAgICAgICAgICAgICBGb29SZWYgYmxhaCgpOwoKICAgICAgICAgICAgUHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRyBnZW5lcmF0ZWQgY29kZSB0aGF0IHdvdWxkbid0CiAgICAgICAgICAgIGNvbXBpbGUuCgowNy8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFdyYXBwaW5nIG9mIHN0YXRpYyBtZXRob2RzIGhhcyBiZWVuIGltcHJvdmVkIGluIHByb3h5IGNsYXNzZXMuICBJbiBvbGRlcgogICAgICAgICAgICB2ZXJzaW9ucyBvZiBTV0lHLCBpZiB5b3UgaGFkIHRoaXM6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpYyB2b2lkIGJhcigpOwogICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhlIHN0YXRpYyBtZXRob2Qgd2FzIG9ubHkgYXZhaWxhYmxlIGFzIGEgZnVuY3Rpb24gRm9vX2JhcigpLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICA+Pj4gRm9vX2JhcigpCgogICAgICAgICAgICBOb3csIHRoZSBzdGF0aWMgbWV0aG9kIGNhbiBhbHNvIGJlIGludm9rZWQgdGhyb3VnaCBhbiBpbnN0YW5jZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICA+Pj4gZiA9IEZvbygpCiAgICAgICAgICAgICAgICAgID4+PiBmLmJhcigpICAgICAgICAjIEludm9rZXMgc3RhdGljIG1ldGhvZAoKICAgICAgICAgICAgVGhpcyB3b3JrcyB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBQeXRob24uICBBZGRpdGlvbmFsbHksIGZvciBQeXRob24tMi4yLAogICAgICAgICAgICB0aGUgc3RhdGljIG1ldGhvZCBjYW4gYmUgaW52b2tlZCBhczoKCiAgICAgICAgICAgICAgICAgID4+PiBGb28uYmFyKCkKCiAgICAgICAgICAgIFRoZSBvbGQtc3R5bGUgZnVuY3Rpb24gaXMgc3RpbGwgc3VwcG9ydCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIElmCiAgICAgICAgICAgIHlvdSBjYXJlIGFib3V0IG1ha2luZyB5b3VyIGNvZGUgYWNyb3NzIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiBQeXRob24sCiAgICAgICAgICAgIGVpdGhlciB1c2UgRm9vX2JhcigpIG9yIGFjY2VzcyB0aGUgbWV0aG9kIHRocm91Z2ggYW4gaW5zdGFuY2UuCiAKMDcvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBDaGFuZ2VzIHRvIHRoZSBQeXRob24gbW9kdWxlLiAgUHJveHkgY2xhc3NlcyBub3cgdXRpbGl6ZSBuZXcgUHl0aG9uLTIuMgogICAgICAgICAgICBmZWF0dXJlcyBpbmNsdWRpbmcgcHJvcGVydGllcyBhbmQgc3RhdGljIG1ldGhvZHMuICBIb3dldmVyLCB0aGVzZSBmZWF0dXJlcwogICAgICAgICAgICBhcmUgc3VwcG9ydGVkIGluIGEgd2F5IHRoYXQgcHJvdmlkZXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlcgogICAgICAgICAgICBQeXRob24gdmVyc2lvbnMuICBJbiBvdGhlciB3b3JkcywgcHJveHkgY2xhc3NlcyB3b3JrIHdpdGggYWxsIHZlcnNpb25zCiAgICAgICAgICAgIG9mIFB5dGhvbiBhbmQgb25seSB1c2UgbmV3IGZlYXR1cmVzIHdoZW4gcnVubmluZyBvbiBQeXRob24tMi4yLgoKCjA3LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgJWV4dGVuZCBzbyB0aGF0IG92ZXJsb2FkZWQgbWV0aG9kcyBjYW4gYmUgYWRkZWQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlZXh0ZW5kIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCB4KSB7IH07CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgYmFyKGNoYXIgKnMpIHsgfTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGlzIHdvcmtzIHdpdGggYm90aCBDKysgKmFuZCogQy4KCjA3LzI0LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTW9yZSBuZXcgdHlwZW1hcHMgc28gdGhhdCB0aGUgSmF2YSBwcm94eSBjbGFzc2VzIGFuZCB0eXBlIHdyYXBwZXIgY2xhc3NlcwogICAgICAgICAgICBjYW4gYmUgZnVydGhlciB0YWlsb3JlZCBieSB1c2Vycy4gVGhlc2UgYXJlIHRoZSBkZWZhdWx0IGNvZGUgZm9yIGdlbmVyYXRpbmcgdGhlIAogICAgICAgICAgICBmaW5hbGl6ZSgpIG1ldGhvZHMgKHByb3h5IGNsYXNzZXMgb25seSkgYW5kIHRoZSBnZXRDUHRyKCkgbWV0aG9kcyBmb3IgcHJveHkgCiAgICAgICAgICAgIGNsYXNzZXMgYW5kIHR5cGUgd3JhcHBlciBjbGFzc2VzOgoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWZpbmFsaXplKSBTV0lHVFlQRSAlewogICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgewogICAgICAgICAgICAgICAgX2RlbGV0ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgJX0KICAgICAgICAgICAgCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFnZXRjcHRyKSBTV0lHVFlQRSwgU1dJR1RZUEUgKiwgU1dJR1RZUEUgJiwgU1dJR1RZUEUgW10gJXsKICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGxvbmcgZ2V0Q1B0cigkamF2YWNsYXNzbmFtZSBvYmopIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmouc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgVGhlIGphdmFnZXRjcHRyIHR5cGVtYXAgd2lsbCBlbmFibGUgdXNlcnMgdG8gaGFuZGxlIEphdmEgbnVsbCBieSBvdmVycmlkaW5nCiAgICAgICAgICAgIHRoaXMgdHlwZW1hcCAtIGEgcmVxdWVzdGVkIGZlYXR1cmUuCgogICAgICAgICAgICBUaGUgLW5vZmluYWxpemUgY29tbWFuZGxpbmUgb3B0aW9uIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFRoZSBqYXZhZmluYWxpemUKICAgICAgICAgICAgdHlwZW1hcCBpcyBtb3JlIHBvd2VyZnVsIGFzIGl0IHdpbGwgYWxsb3cgdGhlIHJlbW92YWwgb2YgdGhlIGZpbmFsaXplIG1ldGhvZHMgCiAgICAgICAgICAgIGZvciBhbGwgb3IgYW55IG9uZSBvciBtb3JlIHBhcnRpY3VsYXIgcHJveHkgY2xhc3MuCgowNy8yMy8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBnZXRDUHRyWFhYKCkgZnVuY3Rpb24gaGFzIGJlZW4gY2hhbmdlZCB0byBhIHN0YXRpYyBmdW5jdGlvbiBhbmQKICAgICAgICAgICAgaXMgbm93IG9mIHRoZSBmb3JtOgoKICAgICAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBsb25nIGdldENQdHIoWFhYIG9iaikgey4uLn0KCiAgICAgICAgICAgIFRoaXMgaXMgYSByZXF1ZXN0ZWQgY2hhbmdlIHdoaWNoIHdpbGwgYWxsb3cgSmF2YSBudWxsIHBvaW50ZXJzIHRvIGJlIHVzZWQgYXMgbnVsbAogICAgICAgICAgICBjYW4gYmUgcGFzc2VkIGluIGZvciBvYmouIEhvd2V2ZXIsIHRvIGFjaGlldmUgdGhpcyB0aGUgYXBwcm9wcmlhdGUgY29kZSBtdXN0IGJlCiAgICAgICAgICAgIHdyaXR0ZW4gdXNpbmcgdGhlIG5ldyBqYXZhZ2V0Y3B0ciB0eXBlbWFwIGRpcmVjdGl2ZS4KCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCiAgICAgICAgICAgIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGNhbiBiZSBhY2hpZXZlZCBieSBhZGRpbmcgdGhpcyBmdW5jdGlvbiBiYWNrIGluIHVzaW5nIHRoZQogICAgICAgICAgICBuZXcgamF2YWNvZGUgdHlwZW1hcDoKCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFjb2RlKSBTV0lHVFlQRSAlewoKICAgICAgICAgICAgICAvLyBTV0lHLTEuMy4xMiBhbmQgU1dJRy0xLjMuMTMKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyJGphdmFjbGFzc25hbWUoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIFNXSUctMS4zLjExIGFuZCBlYXJsaWVyCiAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0Q1B0cigpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzd2lnQ1B0cjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAlfQoKCjA3LzIzLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gTmV3IGRpcmVjdGl2ZSB0byBjb250cm9sIGNvbnN0YW50IGNvZGUgZ2VuZXJhdGlvbiAtICVqYXZhY29uc3QuCiAgICAgICAgICAgIFRoZSBkZWZhdWx0IGhhbmRsaW5nIGZvciBoYW5kbGluZyBjb25zdGFudHMgaXMgdG8gZ2V0IHRoZSB2YWx1ZSB0aHJvdWdoCiAgICAgICAgICAgIGEgSk5JIGNhbGwsIGVnCgogICAgICAgICAgICAjZGVmaW5lIFlFTExPVyA1CiAgICAgICAgICAgICNkZWZpbmUgQklHIDEyMzRMTAoKICAgICAgICAgICAgcmVzdWx0cyBpbjoKCiAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFlFTExPVyA9IG1vZHVsZW5hbWUuZ2V0X1lFTExPVygpOwogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gbW9kdWxlbmFtZS5nZXRfQklHKCk7CgogICAgICAgICAgICBFYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBKYXZhIG1vZHVsZSBpbml0aWFsaXNlZCB0aGUgdmFsdWUgdXNpbmcgdGhlIEMgdmFsdWU6CgogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBZRUxMT1cgPSA1OwogICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgQklHID0gMTIzNExMOwoKICAgICAgICAgICAgVGhpcyB3b3JrcyBpbiBtb3N0IGNhc2VzLCBidXQgdGhlIHZhbHVlIGZvciBCSUcgd29uJ3QgY29tcGlsZSBhcyAxMjM0TEwgaXMgbm90CiAgICAgICAgICAgIHZhbGlkIEphdmEgY29kZSBhbmQgdGhpcyBpcyBvbmUgb2YgdGhlIHJlYXNvbnMgd2h5IHRoZSBkZWZhdWx0IGlzIG5vdyB0byBnZXQgdGhlIAogICAgICAgICAgICB2YWx1ZXMgdGhyb3VnaCBhIEpOSSBjYWxsLiBUaGUgc2lkZSBlZmZlY3QgaXMgdGhhdCB0aGVzZSAnY29uc3RhbnRzJyBjYW5ub3QgYmUgdXNlZCAKICAgICAgICAgICAgaW4gc3dpdGNoIHN0YXRlbWVudHMuIFRoZSAlamF2YWNvbnN0IGRpcmVjdGl2ZSBhbGxvd3Mgb25lIHRvIHNwZWNpZnkgdGhlCiAgICAgICAgICAgIHdheSB0aGUgY29uc3RhbnQgdmFsdWUgaXMgaW5pdGlhbGlzZWQgYW5kIHdvcmtzIGxpa2Ugb3RoZXIgJWZlYXR1cmUKICAgICAgICAgICAgZGlyZWN0aXZlcywgZWcKCiAgICAgICAgICAgICVqYXZhY29uc3QoMCk7ICAgICAvLyBhbGwgY29uc3RhbnRzIGZyb20gdGhpcyBwb2ludCBvbiBhcmUgaW5pdGlhbGlzZWQgdXNpbmcgdGhlIEMgdmFsdWUKICAgICAgICAgICAgJWphdmFjb25zdCgxKSBCSUc7IC8vIGp1c3QgQklHIGluaXRpYWxpc2VkIHVzaW5nIEpOSSBjYWxsIChtdXN0IGJlIHBhcnNlZCBiZWZvcmUgQklHIGlzIGRlZmluZWQpCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICoqKiBJTVBPUlRBTlQgQ0hBTkdFUyBUTyBUSEUgUFlUSE9OIE1PRFVMRSAqKioKCiAgICAgICAgICAgICgxKSBUaGUgUHl0aG9uIG1vZHVsZSBub3cgZW5hYmxlcyBzaGFkb3cvcHJveHkgY2xhc3NlcyBieSBkZWZhdWx0LgogICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdHdvIGZpbGVzIGFyZSBhbHdheXMgY3JlYXRlZCBieSBTV0lHLiAgRm9yCiAgICAgICAgICAgIGluc3RhbmNlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICAgICAvLyBmaWxlOiBmb28uaQogICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vCiAgICAgICAgICAgICAgICAgLi4uCgogICAgICAgICAgICBUaGVuIHN3aWcgZ2VuZXJhdGVzIHR3byBmaWxlcyAiZm9vX3dyYXAuYyIgYW5kICJmb28ucHkiLgoKICAgICAgICAgICAgKDIpIFRoZSBuYW1lIG9mIHRoZSBsb3ctbGV2ZWwgQyBleHRlbnNpb24gbW9kdWxlIGhhcyBiZWVuIGNoYW5nZWQKICAgICAgICAgICAgdG8gc3RhcnQgd2l0aCBhIGxlYWRpbmcgdW5kZXJzY29yZS4gICBUaGlzIG1lYW5zIHRoYXQgeW91IGhhdmUKICAgICAgICAgICAgdG8gY29tcGlsZSB0aGUgbW9kdWxlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgJCBjYyAtYyAtSS91c3IvbG9jYWwvaW5jbHVkZS9weXRob24yLjIgZm9vX3dyYXAuYwogICAgICAgICAgICAgICAgJCBjYyAtc2hhcmVkIGZvb193cmFwLm8gJChPQkpTKSAtbyBfZm9vLnNvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90ZSBleHRyYSB1bmRlcnNjb3JlCgogICAgICAgICAgICBUaGlzIG5hbWluZyBzY2hlbWUgaXMgY29uc2lzdGVudCB3aXRoIG90aGVyIFB5dGhvbiBtb2R1bGVzIHRoYXQKICAgICAgICAgICAgdXRpbGl6ZSBleHRlbnNpb24gY29kZS4gIEZvciBpbnN0YW5jZSwgdGhlIHNvY2tldCBtb2R1bGUgY29uc2lzdHMKICAgICAgICAgICAgb2YgIl9zb2NrZXQuc28iIGFuZCAic29ja2V0LnB5Ii4gIEluIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsCiAgICAgICAgICAgIHRoZSBzaGFyZWQgb2JqZWN0IGZpbGUgd2FzIG5hbWVkICJmb29jbW9kdWxlLnNvIi4KCiAgICAgICAgICAgICgzKSBBIG5ldyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gaW5zZXJ0IFB5dGhvbiBjb2RlIGludG8KICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgLnB5IGZpbGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlcHl0aG9uY29kZSAlewogICAgICAgICAgICAgICAgZGVmIGZvbygpOgogICAgICAgICAgICAgICAgICAgIHByaW50ICJIZWxsbyBXb3JsZCIKICAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgVGhpcyBkaXJlY3RpdmUgYWxsb3dzIHlvdSB0byBjcmVhdGUgbW9kdWxlcyBhcyBhIG1peCBvZiBDIGFuZCBQeXRob24uCiAgICAgICAgICAgICBQeXRob24gY29kZSBpcyBzZWFtbGVzc2x5IGFkZGVkIHRvIHRoZSBtb2R1bGUuCgogICAgICAgICAgICAoNCkgVGhlIC1zaGFkb3cgY29tbWFuZCBsaW5lIG9wdGlvbiBpcyBkZXByZWNhdGVkLiAgVGhpcyBpcyB0dXJuZWQgb24KICAgICAgICAgICAgYnkgZGVmYXVsdC4KCiAgICAgICAgICAgICg1KSBUbyBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBleHRyYSBweXRob24gZmlsZSwgdXNlIHRoZSAiLW5vcHJveHkiCiAgICAgICAgICAgIGNvbW1hbmQgbGluZSBvcHRpb24uCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgVGhpcyBjaGFuZ2Ugd2lsbCBsaWtlbHkgYnJlYWsgdGhlIGJ1aWxkIGVudmlyb25tZW50IG9mIHByb2plY3RzIHRoYXQKICAgICAgICAgICAgdXRpbGl6ZSBzaGFkb3cgY2xhc3Nlcy4gICBUbyBmaXggdGhpcywgeW91IHByb2JhYmx5IG9ubHkgbmVlZCB0bwogICAgICAgICAgICBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIHRhcmdldCAuc28gZmlsZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZQogICAgICAgICAgICBNYWtlZmlsZSBpbmZvcm1hdGlvbiBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgVEFSR0VUID0gZXhhbXBsZWNtb2R1bGUuc28KCiAgICAgICAgICAgIEp1c3QgY2hhbmdlIGl0IHRvOgoKICAgICAgICAgICAgICAgICAgIFRBUkdFVCA9IF9leGFtcGxlLnNvCgogICAgICAgICAgICAqKiogRE9DVU1FTlRBVElPTiBVUERBVEUgKioqCiAgICAgICAgICAgIFRoZSBmaWxlIERvYy9NYW51YWwvUHl0aG9uLmh0bWwgaGFzIGJlZW4gdXBkYXRlZCB0byBkZXNjcmliZSB0aGVzZSBjaGFuZ2VzLgoKCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgLW5vZXh0ZXJuIG9wdGlvbi4gICBJZiBzdXBwbGllZCwgU1dJRyB3aWxsIG5vdCBnZW5lcmF0ZQogICAgICAgICAgICBleHRyYSBleHRlcm4gZGVjbGFyYXRpb25zLiAgVGhpcyBpcyBzb21ldGltZXMgYW4gaXNzdWUgb24gCiAgICAgICAgICAgIG5vbi11bml4IHBsYXRmb3Jtcy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYSB3YXJuaW5nIGZvciBpZ25vcmVkIGZyaWVuZCBmdW5jdGlvbnMuCgowNy8yMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTc0NDk4IF0gLXByb3h5IGFuZCAlaW5jbHVkZSAicG9pbnRlci5pIiBjbGFzaC4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgRGF2aWQgQ3JlYXN5LgoKMDcvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU3NjEwMyBdIGdsb2JhbCBkZXN0cnVjdGlvbiB3YXJuaW5nIHdpdGggc2hhZG93LgogICAgICAgICAgICBQZXJsIGV4dGVuc2lvbnMgc2hvdWxkIG5vIGxvbmdlciByZXBvcnQgdGhlIHdhcm5pbmcKCiAgICAgICAgICAgICAgICJVc2Ugb2YgdW5pbml0aWFsaXplZCB2YWx1ZSBkdXJpbmcgZ2xvYmFsIGRlc3RydWN0aW9uLiIKIAogICAgICAgICAgICB3aGVuIHJ1bm5pbmcgd2l0aCAicGVybCAtdyIuICBSZXBvcnRlZCBieQogICAgICAgICAgICBCcmV0dCBXaWxsaWFtcy4KCjA3LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW4gQysrIG1vZGUsIFNXSUcgbm93IGFsd2F5cyBkZWZpbmVzIG5hbWVzcGFjZSBzdGQuICBCeSBkZWZhdWx0LAogICAgICAgICAgICBpdCdzIGVtcHR5LiAgSG93ZXZlciwgdGhpcyB3aWxsIHNpbGVuY2UgZXJyb3JzIGZyb20gcHJvZ3JhbXMKICAgICAgICAgICAgdGhhdCBpbmNsdWRlIHN0YXRlbWVudHMgc3VjaCBhcyAidXNpbmcgbmFtZXNwYWNlIHN0ZDsiLgogICAgICAgICAgICBUaGlzIGZpeGVzIEJ1ZyBbIDU4NDAxNyBdIHVzaW5nIG5hbWVzcGFjZSBzdGQgZ2VuZXJhdGVzIGVycm9yLgogICAgICAgICAgICBSZXBvcnRlZCBieSBKb3NlcGggV2luc3Rvbi4KCjA3LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgYSBuZXcgd2FybmluZyBtZXNzYWdlIGZvciAlYXBwbHkuICBJZiB5b3UgdXNlICVhcHBseSBidXQgbm8gdHlwZW1hcHMKICAgICAgICAgICAgYXJlIGRlZmluZWQsIHlvdSB3aWxsIGdldCBhIHdhcm5pbmcgbWVzc2FnZS4gIFRoaXMgc2hvdWxkIGhlbHAgd2l0aAogICAgICAgICAgICBwcm9ibGVtcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgJWFwcGx5IGNoYXIgKk9VVFBVVCB7IC4uLiB9OwoKICAgICAgICAgICAgSW4gb2xkIHZlcnNpb25zIG9mIFNXSUcsIHRoaXMgc2lsZW50bHkgZGlkIG5vdGhpbmcuICBOb3cgeW91IGdldCBhbiBlcnJvciBsaWtlIHRoaXM6CiAgCiAgICAgICAgICAgICAgICAgICBmaWxlOmxpbmUuIFdhcm5pbmcuIENhbid0IGFwcGx5IChjaGFyICpPVVRQVVQpLiBObyB0eXBlbWFwcyBhcmUgZGVmaW5lZC4KCjA3LzIyLzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gU3RhcnRlZCBKYXZhIHByYWdtYSBkZXByZWNhdGlvbi4gUmVwbGFjZW1lbnRzIHVzZSAldHlwZW1hcCBiYXNlZCAKICAgICAgICAgICAgZGlyZWN0aXZlcyBhbmQgZW5hYmxlIHByb3h5IGNsYXNzZXMgYW5kIHRoZSBuZXcgdHlwZSB3cmFwcGVyIGNsYXNzZXMgdG8gYmUgCiAgICAgICAgICAgIHRhaWxvcmVkIGluIHZhcmlvdXMgd2F5cy4gVGhlc2UgYXJlIHRoZSBuZXcgdHlwZW1hcHM6CiAgICAgICAgICAgIAogICAgICAgICAgICAldHlwZW1hcChqYXZhYmFzZSkgICAgICAgICAgIC0gYmFzZSAoZXh0ZW5kcykgZm9yIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNsYXNzbW9kaWZpZXJzKSAtIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIEphdmEgY2xhc3M6IGRlZmF1bHQgaXMgInB1YmxpYyIKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWNvZGUpICAgICAgICAgICAtIGphdmEgY29kZSBpcyBjb3BpZWQgdmVyYmF0aW0gdG8gdGhlIEphdmEgY2xhc3MKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpICAgICAgICAtIGltcG9ydCBzdGF0ZW1lbnRzIGZvciBKYXZhIGNsYXNzCiAgICAgICAgICAgICV0eXBlbWFwKGphdmFpbnRlcmZhY2VzKSAgICAgLSBpbnRlcmZhY2VzIChleHRlbmRzKSBmb3IgSmF2YSBjbGFzcwogICAgICAgICAgICAKICAgICAgICAgICAgQW5kIHRoZXNlIGFyZSB0aGUgJXByYWdtYSBkaXJlY3RpdmVzIGJlaW5nIGRlcHJlY2F0ZWQ6CiAgICAgICAgICAgIGFsbHNoYWRvd2Jhc2UKICAgICAgICAgICAgYWxsc2hhZG93Y2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgYWxsc2hhZG93Y29kZQogICAgICAgICAgICBhbGxzaGFkb3dpbXBvcnQKICAgICAgICAgICAgYWxsc2hhZG93aW50ZXJmYWNlCiAgICAgICAgICAgIHNoYWRvd2Jhc2UKICAgICAgICAgICAgc2hhZG93Y2xhc3Ntb2RpZmllcnMKICAgICAgICAgICAgc2hhZG93Y29kZQogICAgICAgICAgICBzaGFkb3dpbXBvcnQKICAgICAgICAgICAgc2hhZG93aW50ZXJmYWNlCiAgICAgICAgICAgIAogICAgICAgICAgICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gdGFyZ2V0IGEgcGFydGljdWxhciBwcm94eSBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIEZvbyAiaW1wb3J0IGphdmEudXRpbC4qIjsKICAgICAgICAgICAgb3IgYSBwYXJ0aWN1bGFyIHR5cGUgd3JhcHBlciBjbGFzczoKICAgICAgICAgICAgJXR5cGVtYXAoamF2YWltcG9ydHMpIGRvdWJsZSogImltcG9ydCBqYXZhLm1hdGguKiI7CiAgICAgICAgICAgIE5vdGUgdGhhdCAkamF2YWNsYXNzbmFtZSBpbiB0aGVzZSB0eXBlbWFwcyBhcmUgc3Vic3RpdHV0ZWQgd2l0aCBlaXRoZXIgdGhlIHByb3h5IAogICAgICAgICAgICBjbGFzc25hbWUgd2hlbiB1c2luZyBwcm94eSBjbGFzc2VzIG9yIHRoZSBTV0lHVFlQRSBjbGFzcyBuYW1lLgoKMDcvMTgvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBKYXZhIG1vZHVsZSBvdmVyaGF1bCB0byBpbXBsZW1lbnQgc3RhdGljIHR5cGUgY2hlY2tpbmcgb2YgYWxsIAogICAgICAgICAgICB0eXBlcy4gCiAgICAgICAgICAgIAogICAgICAgICAgICAxKSBDaGFuZ2VzIHdoZW4gdXNpbmcgSmF2YSBQcm94eSBjbGFzc2VzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgIFByZXZpb3VzbHkgd2hlbiB3cmFwcGluZyBnbG9iYWwgZnVuY3Rpb25zOiAKCiAgICAgICAgICAgIGNsYXNzIFNvbWVDbGFzc3t9OwogICAgICAgICAgICB2b2lkIGZvbyhTb21lQ2xhc3MqIHMpOwogICAgICAgICAgICBTb21lQ2xhc3MqIGJhcigpOwoKICAgICAgICAgICAgVGhlIG5hdGl2ZSBtZXRob2QgcHJvdG90eXBlcyB1c2VkIGEgbG9uZyBmb3IgcG9pbnRlcnMgYW5kIGxvb2tlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICBwdWJsaWMgY2xhc3MgbW9kdWxlbmFtZSAgewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGZvbyhsb25nIGphcmcxKTsKICAgICAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbmF0aXZlIGxvbmcgYmFyKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGFuZCB1bmxpa2UgbWVtYmVyIGZ1bmN0aW9ucyBvZiBhIEMrKyBjbGFzcyB0aGVyZSB3YXMgbm8gd3JhcHBlciBhcm91bmQgdGhlIG5hdGl2ZSBjYWxscyAKICAgICAgICAgICAgdG8gbWFrZSB0aGUgdXNlIG9mIHRoZW0gbW9yZSB1c2VyIGZyaWVuZGx5LiBUaGV5IHdvdWxkIGJlIHVzZWQgZnJvbSBKYXZhIGxpa2UgdGhpczoKCiAgICAgICAgICAgIFNvbWVDbGFzcyBzID0gbmV3IFNvbWVDbGFzcyhtb2R1bGVuYW1lLmJhcigpLCBmYWxzZSk7CiAgICAgICAgICAgIG1vZHVsZW5hbWUuZm9vKHMuZ2V0Q1B0clNvbWVDbGFzcygpKTsKCiAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgZm9sbG93aW5nIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3QsIGJ1dCB0aGVuIGl0IHdvdWxkIG5vdCBoYXZlIAogICAgICAgICAgICBiZWVuIHBvc3NpYmxlIHRvIGNhbGwgYW55IHByb3h5IG1lbWJlciBmdW5jdGlvbnMgaW4gU29tZUNsYXNzOgoKICAgICAgICAgICAgbG9uZyBzID0gbW9kdWxlbmFtZS5iYXIoKTsKICAgICAgICAgICAgbW9kdWxlbmFtZS5mb28ocyk7CgogICAgICAgICAgICBOb3cgd3JhcHBlciBmdW5jdGlvbnMgYXJlIGdlbmVyYXRlZDoKCiAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBtb2R1bGVuYW1lICB7CiAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgZm9vKFNvbWVDbGFzcyBzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2FsbHMgdGhlIG5hdGl2ZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU29tZUNsYXNzIGJhcigpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjYWxscyB0aGUgbmF0aXZlIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFdoaWNoIG1lYW5zIHRoZXNlIGZ1bmN0aW9ucyBjYW4gbm93IGJlIHVzZWQgbW9yZSBuYXR1cmFsbHkgd2l0aCBwcm94eSBjbGFzc2VzOgoKICAgICAgICAgICAgU29tZUNsYXNzIHMgPSBtb2R1bGVuYW1lLmJhcigpOwogICAgICAgICAgICBtb2R1bGVuYW1lLmZvbyhzKTsKCiAgICAgICAgICAgIDIpIENoYW5nZXMgd2hlbiBub3QgdXNpbmcgSmF2YSBQcm94eSBjbGFzc2VzCiAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgICAgICBUaGUgc28gY2FsbGVkIGxvdy1sZXZlbCBpbnRlcmZhY2Ugd2FzIHJhdGhlciBsb3ctbGV2ZWwgaW5kZWVkLiBUaGUgCiAgICAgICAgICAgIG5ldyBzdGF0aWMgdHlwZSBjaGVja2luZyBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBsZXNzIHNvIGJ1dCBpdCByZW1haW5zIGEKICAgICAgICAgICAgZnVuY3Rpb25hbCBpbnRlcmZhY2UgdG8gdGhlIEMvQysrIHdvcmxkLiBQcm94eSBjbGFzc2VzIGFyZSB0aGUgb2J2aW91cyB3YXkgdG8gdXNlCiAgICAgICAgICAgIFNXSUcgZ2VuZXJhdGVkIGNvZGUsIGJ1dCBmb3IgdGhvc2Ugd2hvIHdhbnQgYSBmdW5jdGlvbmFsIGludGVyZmFjZSBhbGwgbm9uLXByaW1pdGl2ZQogICAgICAgICAgICB0eXBlcyBub3cgaGF2ZSBhIHNpbXBsZSBKYXZhIGNsYXNzIHdyYXBwZXIgYXJvdW5kIHRoZSBDL0MrKyB0eXBlLiBQb2ludGVycyBhbmQKICAgICAgICAgICAgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUgdHlwZXMgYXJlIGFsc28gd3JhcHBlZCBieSB0eXBlIHdyYXBwZXIgY2xhc3Nlcy4gVGhlIHR5cGUKICAgICAgICAgICAgd3JhcHBlciBjbGFzc25hbWVzIGFyZSBiYXNlZCBvbiB0aGUgU1dJRyBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBvdGhlciBsYW5ndWFnZSAKICAgICAgICAgICAgbW9kdWxlcy4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICBDL0MrKyB0eXBlICAgICAgSmF2YSB0eXBlIHdyYXBwZXIgY2xhc3MgbmFtZQogICAgICAgICAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBpbnQqICAgICAgICAgICAgU1dJR1RZUEVfcF9pbnQKICAgICAgICAgICAgZG91YmxlKiogICAgICAgIFNXSUdUWVBFX3BfcF9kb3VibGUKICAgICAgICAgICAgU29tZUNsYXNzKiAgICAgIFNXSUdUWVBFX3BfU29tZUNsYXNzCiAgICAgICAgICAgIFNvbWVDbGFzcyYgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcwogICAgICAgICAgICBTb21lQ2xhc3MgICAgICAgU1dJR1RZUEVfcF9Tb21lQ2xhc3MKCiAgICAgICAgICAgIE5vdGUgdGhhdCBldmVyeXRoaW5nIHdyYXBwZWQgYnkgU1dJRyBpcyBhY2Nlc3NlZCB2aWEgYSBwb2ludGVyIGV2ZW4gd2hlbiB3cmFwcGluZyAKICAgICAgICAgICAgZnVuY3Rpb25zIHRoYXQgcGFzcyBieSB2YWx1ZSBvciByZWZlcmVuY2UuIFNvIHRoZSBwcmV2aW91cyBleGFtcGxlIHdvdWxkIG5vdyBiZSAKICAgICAgICAgICAgdXNlZCBsaWtlIHRoaXM6CgogICAgICAgICAgICBTV0lHVFlQRV9wX1NvbWVDbGFzcyBzID0gZXhhbXBsZS5iYXIoKTsKICAgICAgICAgICAgZXhhbXBsZS5mb28ocyk7CgogICAgICAgICAgICBOb3RlIHRoYXQgdHlwZWRlZnMgdGhhdCBTV0lHIGtub3dzIGFib3V0IGFyZSByZXNvbHZlZCwgc28gdGhhdCBpZiBvbmUgaGFzIAoKICAgICAgICAgICAgY2xhc3MgRm9ve307CiAgICAgICAgICAgIHR5cGVkZWYgRm9vIEJhcjsKCiAgICAgICAgICAgIHRoZW4gYW55IHVzZSBvZiBCYXIgd2lsbCByZXF1aXJlIG9uZSB0byB1c2UgU1dJR1RZUEVfcF9Gb287CgogICAgICAgICAgICBTb21lIGNvbnNpZGVyYXRpb25zOgogICAgICAgICAgICBNYWtlIHN1cmUgeW91IG1ha2UgYSBmaXJtIGRlY2lzaW9uIHRvIHVzZSBlaXRoZXIgcHJveHkgY2xhc3NlcyBvciB0aGUgZnVuY3Rpb25hbCAKICAgICAgICAgICAgaW50ZXJmYWNlIGVhcmx5IG9uIGFzIHRoZSBjbGFzc25hbWVzIGFyZSBkaWZmZXJlbnQuCgogICAgICAgICAgICAzKSBQb2ludGVycyBhbmQgbm9uLXBhcnNlZCB0eXBlcwogICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICBTb21ldGltZXMgU1dJRyBjYW5ub3QgZ2VuZXJhdGUgYSBwcm94eSBjbGFzcy4gVGhpcyBvY2N1cnMgd2hlbiB0aGUgZGVmaW5pdGlvbiBvZiAKICAgICAgICAgICAgYSB0eXBlIGlzIG5vdCBwYXJzZWQgYnkgU1dJRywgYnV0IGlzIHRoZW4gdXNlZCBhcyBhIHZhcmlhYmxlIG9yIGEgcGFyYW1ldGVyLiAKICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICB2b2lkIGZvbyhTbmF6enkgc2RzKTsKCiAgICAgICAgICAgIElmIFNXSUcgaGFzIG5vdCBwYXJzZWQgU25henp5IGl0IGhhbmRsZXMgaXQgc2ltcGx5IGFzIGEgcG9pbnRlciB0byBhIFNuYXp6eS4KICAgICAgICAgICAgVGhlIEphdmEgbW9kdWxlIGdpdmVzIGl0IGEgdHlwZSB3cmFwcGVyIGNsYXNzIGFyb3VuZCB0aGUgcG9pbnRlciBhbmQgY2FsbHMgaXQgCiAgICAgICAgICAgIFNXSUdUWVBFX3BfU25henp5LiBJbiBvdGhlciB3b3JkcyBpdCBoYW5kbGVzIGl0IGluIHRoZSBzYW1lIG1hbm5lciBhcyB0eXBlcyBhcmUgCiAgICAgICAgICAgIGhhbmRsZWQgaW4gdGhlIGxvdy1sZXZlbCBmdW5jdGlvbmFsIGludGVyZmFjZS4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIGZvciBhbGwgCiAgICAgICAgICAgIG5vbi1wcm94eSBjbGFzc2VzLCBlZyBhbGwgcG9pbnRlciB0byBwb2ludGVycyBhbmQgcG9pbnRlcnMgdG8gcHJpbWl0aXZlIHR5cGVzLgoKICAgICAgICAgICAgNCkgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgaXMgbm90IGFuIGlzc3VlIGlmIHlvdSBoYXZlIGJlZW4gdXNpbmcgcHJveHkgY2xhc3NlcyBhbmQgCiAgICAgICAgICAgIG5vIGdsb2JhbCB2YXJpYWJsZXMvZnVuY3Rpb25zLiBPdGhlcndpc2Ugc29tZSBjaGFuZ2VzIHdpbGwgaGF2ZSB0byBiZSBtYWRlLiAKICAgICAgICAgICAgVGhlIG5hdGl2ZSBtZXRob2RzIHN0aWxsIGV4aXN0IGJ1dCB0aGV5IGFyZSBub3cgaW4gYSBKTkkgY2xhc3MsIHdoaWNoIGlzIGNhbGxlZCAKICAgICAgICAgICAgbW9kdWxlbmFtZUpOSS4gQXMgdGhpcyBjbGFzcyBpcyByZWFsbHkgcGFydCBvZiB0aGUgaW50ZXJuYWwgd29ya2luZ3MsCiAgICAgICAgICAgIGl0IHNob3VsZCBub3QgYmUgcmVxdWlyZWQgc28gdGhlIGNsYXNzIGhhcyBiZWNvbWUgcHJvdGVjdGVkLiBTb21lIHByYWdtYXMvZGlyZWN0aXZlcwogICAgICAgICAgICB3aWxsIGhvcGVmdWxseSBiZSBhZGRlZCB0byBoZWxwIHdpdGggYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgowNy8xOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vZGlmaWVkIHdyYXBwaW5nIG9mIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlcyByZXR1cm5lZCBieQogICAgICAgICAgICB2YWx1ZS4gIEp1c3QgdG8gYmUgc2FmZSwgdGhleSBhcmUgbm93IHdyYXBwZWQgYnkgU3dpZ1ZhbHVlV3JhcHBlcjw+CiAgICAgICAgICAgIGp1c3QgaW4gY2FzZSB0aGV5IGRvbid0IGRlZmluZSBhIGRlZmF1bHQgY29uc3RydWN0b3IuICBUaGlzCiAgICAgICAgICAgIHdvdWxkIGJlIHVzZWQgaWYgeW91IGhhZCBjb2RlIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICBGb288aW50PiBibGFoKCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgbW9yZWJsYWgoRm9vPGludD4geCk7CgogICAgICAgICAgICBidXQgeW91IGRpZG4ndCBpbnN0YW50aWF0ZSBGb288aW50PiB1c2luZyAldGVtcGxhdGUuICAKICAgICAgICAgICAgV2Ugc2hvdWxkIHByb2JhYmx5IGFkZCBhIHdhcm5pbmcgZm9yIHRoaXMuCgowNy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkIGFuIGVycm9yIGNoZWNrIHRvIGRldGVjdCBzaGFkb3dlZCB0ZW1wbGF0ZSBwYXJhbWF0ZXJzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgaW50IFQ7CiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gYW4gZXJyb3IsIG5vdCBhIHdhcm5pbmcuICBUaGlzIHdhcm5pbmcgaXMKICAgICAgICAgICAgYWxzbyBuZWVkZWQgdG8gZml4IHNvbWUgcmF0aGVyIGluc2lkaW91cyBwcm9ibGVtcyBsaWtlCiAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBUIHsKICAgICAgICAgICAgICAgICAgICAgIGludCAgYmxhaDsKICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgVCBUcmFpdHM7ICAgIC8vIFdoaWNoIFQgaXMgdGhpcz8/Pz8KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIFQgc2hhZG93cyB0aGUgb3V0ZXIKICAgICAgICAgICAgc3RydWN0dXJlICh3aGljaCBpcyB3aGF0IHlvdSB3YW50KS4KCjA3LzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBmb3IgdGVtcGxhdGVzIHdpdGggaW50ZWdlciBhcmd1bWVudHMuICBTV0lHIGlzCiAgICAgICAgICAgIG11Y2ggbW9yZSBhd2FyZSBvZiBzaXR1YXRpb25zIHN1Y2ggYXMgdGhpczoKCiAgICAgICAgICAgICAgICBjb25zdCBpbnQgU2l6ZSA9IDEwMDsKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoRm9vMTAwKSBGb288MTAwPjsKICAgICAgICAgICAgICAgIHZvaWQgYmFyKEZvbzxTaXplPiAqeCk7ICAgLy8gS25vd3MgdGhhdCBGb288U2l6ZT4gaXMgdGhlIHNhbWUgYXMgRm9vPDEwMD47CgowNy8xNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoICVmZWF0dXJlLyVpZ25vcmUvJXJlbmFtZSBhbmQgbmFtZXNwYWNlcy4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA3LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBjb25zdHJ1Y3RvcnMgdGhhdCB0cnkgdG8gY2F0Y2gKICAgICAgICAgICAgZXhjZXB0aW9ucyBpbiBpbml0aWFsaXplcnMuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgQmFyIGI7CiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEZvbyhpbnQgeCkgdHJ5IAogICAgICAgICAgICAgICAgICAgICA6IGIoeCkgeyAuLi4gfQogICAgICAgICAgICAgICAgIGNhdGNoKGludCkgewogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgVGhpcyBoYXMgbm8gZWZmZWN0IG9uIHRoZSBnZW5lcmF0ZWQgd3JhcHBlcnMuICBIb3dldmVyLCB0aGUgdHJ5IGFuZCBjYXRjaAogICAgICAgICAgICBwYXJ0cyBvZiB0aGUgZGVjbGFyYXRpb24gYXJlIGlnbm9yZWQuICBTZWUgU3Ryb3VzdHJ1cCwgM3JkIEVkLCBzZWN0aW9uIAogICAgICAgICAgICAxNC40LjYuMSBmb3IgZGV0YWlscy4KICAgICAgICAgICAgICAgICAgIAowNy8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyBpbiB0ZW1wbGF0ZSBzeW1ib2wgdGFibGUgbWFuYWdlbWVudC4gIFRoaXMgZml4ZXMKICAgICAgICAgICAgdHdvIGJ1Z3MuICBGaXJzdCwgbWl4aW5nIGFic3RyYWN0IG1ldGhvZHMsIHRlbXBsYXRlcywgYW5kIAogICAgICAgICAgICBpbmhlcml0YW5jZSBubyBsb25nZXIgZ2VuZXJhdGVzIGEgZmFpbGVkIGFzc2VydGlvbi4KIAogICAgICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIFQ+CiAgICAgICAgICAgICAgICBjbGFzcyBBIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBmb28oKSA9IDA7CiAgICAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgogICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEE8VD4KICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAldGVtcGxhdGUoQV9pbnQpIEE8aW50PjsKICAgICAgICAgICAgICAgJXRlbXBsYXRlKEJfaW50KSBCPGludD47CgogICAgICAgICAgICBUaGlzIGZpeCBhbHNvIGZpeGVzIGEgc3VidGxlIHByb2JsZW0gd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQKICAgICAgICAgICAgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQz4KICAgICAgICAgICAgICAgc3RydWN0IEIgewogICAgICAgICAgICAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgc2l6ZV90eXBlOwogICAgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBuaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KC0xKTsKICAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKHNpemVfdHlwZSBpbmRleCA9IG5pbmRleCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBCdWdzIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgoKMDcvMDUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIENoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIFNXSUdfQ29udmVydFB0cigpIGZ1bmN0aW9uCgkgICAgZm9yIHRoZSBTV0lHL1J1YnkgcnVudGltZSBzdXBwb3J0IHNvIHRoYXQgaXQgbG9va3MgbGlrZSB0aGUKCSAgICBQeXRob24gdmVyc2lvbi4gSWYgdGhlIGxhc3QgYXJndW1lbnQgKGZsYWdzKSBpcyBub24temVybywKCSAgICBTV0lHX0NvbnZlcnRQdHIoKSB3aWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBmb3IgdHlwZSBtaXNtYXRjaGVzCgkgICAgYXMgYmVmb3JlLiBJZiBmbGFncyBpcyB6ZXJvLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIC0xIGZvcgoJICAgIHR5cGUgbWlzbWF0Y2hlcyB3aXRob3V0IHJhaXNpbmcgYW4gZXhjZXB0aW9uLiAKCiAgICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBSVUJZIE1PRFVMRSAqKioKCjA3LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgT3ZlcmxvYWRlZCBmdW5jdGlvbnMvbWV0aG9kcy9jb25zdHJ1Y3RvcnMgbm93IHdvcmsgaW4gbWFueSBsYW5ndWFnZQogICAgICAgICAgICBtb2R1bGVzLiAgVGhlIHN1cHBvcnQgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudC0tanVzdCBjYWxsIHRoZQogICAgICAgICAgICBmdW5jdGlvbiBub3JtYWxseSBhbmQgU1dJRyB3aWxsIGRpc3BhdGNoIHRvIHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uLgogICAgICAgICAgICBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGlzc3VlcyBhc3NvY2lhdGVkIHdpdGggdGhpcy4gIFBsZWFzZSByZWZlcgogICAgICAgICAgICB0byB0aGUgb3ZlcmxvYWRpbmcgc2VjdGlvbiBvZiBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwgZm9yIGRldGFpbHMuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA3LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBidWcgd2l0aCBuYW1lc3BhY2VzLCBlbnVtcywgYW5kIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgbmFtZXNwYWNlIGhlbGxvIHsKICAgICAgICAgICAgICAgICAgZW51bSBIZWxsbyB7IEhpLCBIb2xhIH07CiAKICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPEhlbGxvIEg+CiAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdHJhaXRzCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgdmFsdWVfdHlwZTsKICAgICAgICAgICAgICAgICAgICAgIH07CiAKICAgICAgICAgICAgICAgICB0cmFpdHM8SGk+Ojp2YWx1ZV90eXBlIHNheV9oaSgpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFpdHM8SGk+Ojp2YWx1ZV90eXBlKDEpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQogICAgICAgICAgICBTV0lHIHdhc24ndCBnZW5lcmF0aW5nIHdyYXBwZXJzIHRoYXQgcHJvcGVybHkgcXVhbGlmaWVkIAogICAgICAgICAgICB0cmFpdHM8SGk+LiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4gICAgICAgICAKCjA2LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3VwcGxpZWQgYXJyYXkgdmFyaWFibGUgdHlwZW1hcHMgZm9yIFRjbCBtb2R1bGUuICAgSWYgeW91IGhhdmUgYQogICAgICAgICAgICB2YXJpYWJsZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgaW50IGZvb1sxMF07CgogICAgICAgICAgICB0aGVuIGEgc2V0IGZ1bmN0aW9uIGxpa2UgdGhpcyBpcyBnZW5lcmF0ZWQ6CgogICAgICAgICAgICAgICAgdm9pZCBmb29fc2V0KGludCAqeCkgewogICAgICAgICAgICAgICAgICAgbWVtbW92ZShmb28seCwxMCpzaXplb2YoaW50KSk7CiAgICAgICAgICAgICAgICB9CgowNi8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyAlZnJhZ21lbnQgZGlyZWN0aXZlLiAgIFdoZW4gd3JpdGluZyB0eXBlbWFwcywgaXQgY2FuIGJlIGVhc3kgdG8KICAgICAgICAgICAgZ2V0IGNhcnJpZWQgYXdheSBhbmQgd3JpdGUgYSBsb3Qgb2YgY29kZS4gIEhvd2V2ZXIsIGRvaW5nIHNvIGNhdXNlcwogICAgICAgICAgICB0cmVtZW5kb3VzIGNvZGUgYmxvYXQuICAgQSBjb21tb24gd2F5IHRvIHNvbHZlIHRoaXMgaXMgdG8gd3JpdGUgCiAgICAgICAgICAgIGhlbHBlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlewogICAgICAgICAgICAgICAgdm9pZCBzb21lX2hlbHBlcl9mdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAlfQoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB0eXBlIHsKICAgICAgICAgICAgICAgICAgIHNvbWVfaGVscGVyX2Z1bmN0aW9uKC4uLik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBUaGUgb25seSBwcm9ibGVtIHdpdGggdGhpcyBpcyB0aGF0IHRoZSB3cmFwcGVyIGZpbGUgZ2V0cyBwb2xsdXRlZAogICAgICAgICAgICB3aXRoIGhlbHBlciBmdW5jdGlvbnMgZXZlbiBpZiB0aGV5IGFyZW4ndCB1c2VkLiAgICBUbyBmaXggdGhpcywKICAgICAgICAgICAgYSBuZXcgZnJhZ21lbnQgZGlyZWN0aXZlIGlzIGF2YWlsYWJsZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgKGNvcnJlY3RlZCB0eXBvIGluIGxpbmUgYmVsb3cgLSAwNi8yNi8yMDA4KQogICAgICAgICAgICAgICAlZnJhZ21lbnQoInR5cGVfaGVhZGVyIiwiaGVhZGVyIikgJXsKICAgICAgICAgICAgICAgICAgdm9pZCBzb21lX2hlbHBlcl9mdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV9CgogICAgICAgICAgICAgICAldHlwZW1hcChpbiwgZnJhZ21lbnQ9InR5cGVfaGVhZGVyIikgdHlwZSB7CiAgICAgICAgICAgICAgICAgICBzb21lX2hlbHBlcl9mdW5jdGlvbiguLi4pOwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBjb2RlIGZyYWdtZW50IGlzIG9ubHkgZW1pdHRlZCBpZiB0aGUgdHlwZW1hcCBpcwogICAgICAgICAgICBhY3R1YWxseSB1c2VkLiAgIEEgc2ltaWxhciBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIGZvciBkZWNsYXJhdGlvbgogICAgICAgICAgICBhbm5vdGF0aW9uIGFuZCB0aGUgJWZlYXR1cmUgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAlZmVhdHVyZSgiZnJhZ21lbnQiLCJ0eXBlX2hlYWRlciIpICBTb21lRGVjbGFyYXRpb247CgogICAgICAgICAgICBUaGUgZmlyc3QgYXJndW1lbnQgdG8gJWZyYWdtZW50IGlzIHRoZSBmcmFnbWVudCBuYW1lLiAgVGhlIHNlY29uZCBhcmd1bWVudAogICAgICAgICAgICBpcyB0aGUgZmlsZSBzZWN0aW9uIHdoZXJlIHRoZSBmcmFnbWVudCBzaG91bGQgYmUgZW1pdHRlZC4gIAoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgZGlyZWN0aXZlIGlzIGZvciB3cml0ZXJzIG9mIGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgICAgYW5kIGFkdmFuY2VkIHVzZXJzIHdhbnRpbmcgdG8gc3RyZWFtbGluZSB0eXBlbWFwIGNvZGUuCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgoKMDYvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdXBwbGllZCBtZW1iZXJpbiB0eXBlbWFwcyBmb3IgYWxsIGFycmF5cyBpbiBhbiBhdHRlbXB0IHRvIGVsaW1pbmF0ZQogICAgICAgICAgICBjb25mdXNpb24gYWJvdXQgdGhlaXIgdXNlLgoKMDYvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3Igc21hcnQtcG9pbnRlcnMuICBXaGVuIGEgY2xhc3MgZGVmaW5lcwogICAgICAgICAgICBvcGVyYXRvci0+KCkgbGlrZSB0aGlzCgogICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgQmFyICpvcGVyYXRvci0+KCk7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgU1dJRyBsb2NhdGVzIGNsYXNzIEJhciBhbmQgdHJpZXMgdG8gd3JhcCBpdHMgbWVtYmVyIHZhcmlhYmxlcyBhbmQKICAgICAgICAgICAgbWV0aG9kcyBhcyBwYXJ0IG9mIEZvby4gIEZvciBleGFtcGxlLCBpZiBCYXIgd2FzIGRlZmluZWQgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIGludCBzcGFtKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBZb3UgY291bGQgZG8gdGhpcyAoaW4gdGhlIHRhcmdldCBsYW5ndWFnZSk6CgogICAgICAgICAgICAgIGYgPSBGb28oKQogICAgICAgICAgICAgIGYueCA9IDQgICAgICAgICAgICAjIEFjY2Vzc2VzIEJhcjo6eAogICAgICAgICAgICAgIGYuc3BhbSgpICAgICAgICAgICAjIEFjY2Vzc2VzIEJhcjo6c3BhbQoKICAgICAgICAgICAgVGhlIHByaW1hcnkgdXNlIG9mIHRoaXMgZmVhdHVyZSBpcyB0byBlbXVsYXRlIHRoZSBiZWhhdmlvciBvZiBDKysKICAgICAgICAgICAgc21hcnQtcG9pbnRlcnMtLS13aGljaCBhbGxvdyBhdHRyaWJ1dGVzIHRvIGFjY2Vzc2VkIHRyYW5zcGFyZW50bHkKICAgICAgICAgICAgdGhyb3VnaCBvcGVyYXRvci0+LgoKICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIHN1cHBvcnRlZCBhdXRvbWF0aWNhbGx5IGluIFNXSUctLS1ubyBzcGVjaWFsIGRpcmVjdGl2ZXMKICAgICAgICAgICAgYXJlIG5lZWRlZC4gICBUbyBkaXNhYmxlIHRoaXMgYmVoYXZpb3IuICBVc2UgJWlnbm9yZSB0byBpZ25vcmUgCiAgICAgICAgICAgIG9wZXJhdG9yLT4uCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA2LzI2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRGVwcmVjYXRlZCB0aGUgJWV4Y2VwdCBkaXJlY3RpdmUuICAgJWV4Y2VwdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLgoKMDYvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBNYWpvciBjbGVhbnVwIG9mIHRoZSBtb2R1bGVzIGRpcmVjdG9yeS4gIEVsaW1pbmF0ZWQgbW9zdAogICAgICAgICAgICBoZWFkZXIgZmlsZXMsIGNvbnNvbGlkYXRlZCBtb2R1bGUgY29kZSBpbnRvIHNpbmdsZSBmaWxlcy4KCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGluc3RhbnRpYXRpb24gb2YgbGFuZ3VhZ2UgbW9kdWxlcy4gIEFsbCBsYW5ndWFnZQogICAgICAgICAgICBtb2R1bGVzIG11c3Qgbm93IGRlZmluZSBhIGZhY3RvcnkgZnVuY3Rpb24gc2ltaWxhciB0byB0aGlzOgoKICAgICAgICAgICAgICAgIGV4dGVybiAiQyIgTGFuZ3VhZ2UgKgogICAgICAgICAgICAgICAgc3dpZ19weXRob24odm9pZCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQWVRIT04oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdGhlbiBwbGFjZWQgaW4gYSB0YWJsZSBhbmQgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAgICAgIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBpbiBzd2lnbWFpbi5jeHguICAKCiAgICAgICAgICAgIFRoaXMgYXBwcm9hY2ggaGFzIGEgbnVtYmVyIG9mIGJlbmVmaXRzLiAgSXQgZGVjb3VwbGVzIHRoZSAKICAgICAgICAgICAgU1dJRyBtYWluIHByb2dyYW0gZnJvbSBoYXZpbmcgdG8ga25vdyBhYm91dCB0aGUgY2xhc3MKICAgICAgICAgICAgZGVmaW5pdGlvbnMgZm9yIGVhY2ggbW9kdWxlLiAgQWxzbywgYnkgdXNpbmcgYSBmYWN0b3J5CiAgICAgICAgICAgIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGVhc2llciB0byBpbXBsZW1lbnQgZHluYW1pYyBsb2FkaW5nCiAgICAgICAgICAgIG9mIG1vZHVsZXMgKHNpbXBseSBsb2FkIHRoZSBmaWxlIGFuZCBpbnZva2UgdGhlIGZhY3RvcnkKICAgICAgICAgICAgZnVuY3Rpb24pLgoKMDYvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3IgZm9yIHJlZmVyZW5jZSBjb252ZXJzaW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3IgRm9vICYoKTsKCjA2LzI0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3ludGF4IGVycm9yIGZvciBvcGVyYXRvciBuZXdbXSBhbmQgb3BlcmF0b3IgZGVsZXRlW10uCgowNi8yNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBwcm9ibGVtIGZvciBjb25zdGFudHMgYW5kIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICAgIGludm9sdmluZyB0ZW1wbGF0ZXMuCgowNi8xOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgYSBidWcgZm9yIHRoZSAnLWZlYXR1cmUnIGNvbW1hbmQgbGluZSBhcmd1bWVudDsKICAgICAgICAgICAgdGhhdCBzZXR0aW5nIHdhcyBlZmZlY3RpdmVseSBiZWluZyBpZ25vcmVkIGFuZCBzbyB0aGUgZmVhdHVyZQogICAgICAgICAgICBuYW1lIHdhcyBhbHdheXMgc2V0IGVxdWFsIHRvIHRoZSBtb2R1bGUgbmFtZS4KCjA2LzE3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbXMgd2l0aCBzdGF0aWMgbWVtYmVycyBhbmQgZW51bXMgaW4gdGVtcGxhdGVzLgoKVmVyc2lvbiAxLjMuMTMgKEp1bmUgMTcsIDIwMDIpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMDYvMTYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIF9fRklMRV9fIGV4cGFuc2lvbiBpbiB0aGUgcHJlcHJvY2Vzc29yLiAgIE9uIFdpbmRvd3MsCiAgICAgICAgICAgIHRoZSBiYWNrc2xhc2ggKFwpIGlzIG5vdyBjb252ZXJ0ZWQgdG8gKFxcKSBpbiB0aGUgc3RyaW5nIGxpdGVyYWwKICAgICAgICAgICAgdXNlZCBmb3IgX19GSUxFX18uICBSZXBvcnRlZCBieSBTdGV2ZSBHbGFzZXIuCgowNi8xNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHdhcm5pbmcgbWVzc2FnZSBhYm91dCAnbmFtZSBwcml2YXRlIGluIHRoaXMgY29udGV4dCcuICBUaGUKICAgICAgICAgICAgd2FybmluZyBpcyBvbmx5IGdlbmVyYXRlZCBmb3IgcHVibGljIG1ldGhvZHMuICBSZXBvcnRlZCBieQogICAgICAgICAgICBTY290dCBNaWNoZWwuCiAKMDYvMTQvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGVtcGxhdGUgaW5zdGFudGlhdGlvbiAKICAgICAgICAgICAgYW5kIG5hbWVzcGFjZXMuICAgV2hlbiBTV0lHIGV4cGFuZHMgYSB0ZW1wbGF0ZSwgaXQgZG9lcwogICAgICAgICAgICBzbyB3aXRoIGZ1bGx5IHJlc29sdmVkIHR5cGVzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoaXM6CgogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgZm9vIHsgfTsKICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIERvdWJsZTsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShmb29fZCkgZm9vPERvdWJsZT47CgogICAgICAgICAgICB0aGVuLCBpdCBpcyBoYW5kbGVkIGFzIGZvbzxkb3VibGU+IGluIHRoZSB0eXBlc3lzdGVtLgogICAgICAgICAgICBUaGlzIGZpeGVzIGEgbnVtYmVyIG9mIHN1YnRsZSBwcm9ibGVtcyB3aXRoIGluaGVyaXRhbmNlCiAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZXMuCgowNi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbWlzc2luZyBib29sIHR5cGVtYXBzIGZvciBJTlBVVCwgT1VUUFVUIGFuZAoJICAgIElOT1VUIGluIExpYi9ydWJ5L3R5cGVtYXBzLmkuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgYSBjb3VwbGUgb2YgYnJva2VuIHByYWdtYXMuCgowNS8yOS8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgRml4IGZvciB1bm5lY2Vzc2FyeSBjYXN0IHdoZW4gd3JhcHBpbmcgZ2xvYmFsIHZhcmlhYmxlIHdoZXJlIAogICAgICAgICAgICB0aGUgdHlwZSBpcyBub3QgcGFyc2VkIGJ5IFNXSUcgLSBKYXZhIHZhcmlhYmxlcyBleGFtcGxlIAogICAgICAgICAgICBmYWlsdXJlIGFzIHJlcG9ydGVkIGJ5IExhcnJ5IFZpcmRlbi4KCjA2LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgJXRlbXBsYXRlIHRvIGFsbG93IGZvciBlbXB0eSBpbnN0YW50aWF0aW9ucy4KCiAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSgpIGZvbzxpbnQsaW50PjsKCiAgICAgICAgICAgIFRoaXMgcmVnaXN0ZXJzIGZvbzxpbnQsaW50PiB3aXRoIHRoZSB0eXBlIHN5c3RlbSwgYnV0CiAgICAgICAgICAgIGRvZXNuJ3Qgd3JhcCBpdCAoc2FtZSBhcyAlaWdub3JlKS4gICBUaGlzIG1heSBvbmx5IGJlIGEKICAgICAgICAgICAgdGVtcG9yYXJ5IG1lYXN1cmUuICAgU1dJRyBtaWdodCBiZSBhYmxlIHRvIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgaW5zdGFudGlhdGUgdGVtcGxhdGVzIGluIGNlcnRhaW4gY2FzZXMuCgowNi8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGZ1bmN0aW9uIHByb3RvdHlwZSBwcm9ibGVtcyB3aXRoIFRjbCA4LjQKCjA2LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSB3aXRoIHRlbXBsYXRlcyBhbmQgbG9jYXRpb24gb2YgYmFzZSBjbGFzc2VzLiAgCiAgICAgICAgICAgIFRoaXMgb25lIGlzIGEgbGl0dGxlIG1pbmQtYmVuZGluZywgYnV0IGhlcmUgaXMgYW4gZXhhbXBsZQogICAgICAgICAgICB0aGF0IGlsbHVzdHJhdGVzOgogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUmVzVHlwZT4KICAgICAgICAgICAgIHN0cnVjdCB0cmFpdHMKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgdHlwZWRlZiBBcmdUeXBlIGFyZ190eXBlOwogICAgICAgICAgICAgICAgICB0eXBlZGVmIFJlc1R5cGUgcmVzX3R5cGU7CiAgICAgICAgICAgICB9OwogCiAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgQXJnVHlwZSwgY2xhc3MgUmVzVHlwZT4KICAgICAgICAgICAgIHN0cnVjdCBGdW5jdGlvbgogICAgICAgICAgICAgewogICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgdGVtcGxhdGUgPGNsYXNzIEFGLCBjbGFzcyBBRz4KICAgICAgICAgICAgIHN0cnVjdCBDbGFzcyA6IEZ1bmN0aW9uPHR5cGVuYW1lIHRyYWl0czxBRiwgQUc+OjphcmdfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHRyYWl0czxBRiwgQUc+OjpyZXNfdHlwZT4KICAgICAgICAgICAgIHsKICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgJXRlbXBsYXRlKHRyYWl0c19kZCkgdHJhaXRzIDxkb3VibGUsIGRvdWJsZT47CiAgICAgICAgICAgICAldGVtcGxhdGUoRnVuY3Rpb25fZGQpIEZ1bmN0aW9uIDxkb3VibGUsIGRvdWJsZT47CiAgICAgICAgICAgICAldGVtcGxhdGUoQ2xhc3NfZGQpIENsYXNzIDxkb3VibGUsIGRvdWJsZT47CgoKICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgYmFzZSBjbGFzcyBvZiAnQ2xhc3MnIGlzIGRldGVybWluZWQgZnJvbQogICAgICAgICAgICB0aGUgRnVuY3Rpb24gdGVtcGxhdGUsIGJ1dCB0aGUgdHlwZXMgYXJlIG9idGFpbmVkIHRocm91Z2ggdHlwZWRlZnMuCiAgICAgICAgICAgIEJlY2F1c2Ugb2YgdGhpcywgU1dJRyBjb3VsZCBub3QgbG9jYXRlIHRoZSB3cmFwcGVkIGJhc2UgY2xhc3MKICAgICAgICAgICAgKEZ1bmN0aW9uPGRvdWJsZSxkb3VibGU+KS4gICBTaG91bGQgYmUgZml4ZWQgaW4gMS4zLjEzIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIEkgY2FuIHRoaW5rIG9mIGEgbWlsbGlvbiBvdGhlciB0aGluZ3MgdGhhdCBtaWdodAogICAgICAgICAgICBhbHNvIGJlIGJyb2tlbi4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggY29udmVyc2lvbiBvcGVyYXRvcnMuICBJZiB5b3UgaGFkIGFuCiAgICAgICAgICAgIG9wZXJhdG9yIGxpa2UgdGhpcywKCiAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGRvdWJsZSgpIGNvbnN0OwoKICAgICAgICAgICAgU1dJRyB3YXMgb21taXR0aW5nIHRoZSAiY29uc3QiIHF1YWxpZmllci4gIFRoaXMgYWZmZWN0ZWQKICAgICAgICAgICAgJXJlbmFtZSBhbmQgb3RoZXIgZGlyZWN0aXZlcy4gIFJlcG9ydGVkIGJ5IFpob25nIFJlbi4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTGVzc2VuZWQgdGhlIHN0cmljdG5lc3Mgb2YgYWJzdHJhY3QgY2xhc3MgY2hlY2tpbmcuICBJZgogICAgICAgICAgICB5b3UgaGF2ZSBjb2RlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdmlydHVhbCBpbnQgbWV0aG9kKCkgPSAwOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICBCYXIoKTsKICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgU1dJRyB3aWxsIGdvIGFoZWFkIGFuZCBnZW5lcmF0ZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9ycwogICAgICAgICAgICAgZm9yIEJhci4gIEhvd2V2ZXIsIGl0IHdpbGwgYWxzbyBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSAKICAgICAgICAgICAgIHRoYXQgIkJhciIgbWlnaHQgYmUgYWJzdHJhY3QgKHNpbmNlIG1ldGhvZCgpIGlzbid0IGRlZmluZWQpLgogICAgICAgICAgICAgSW4gU1dJRy0xLjMuMTIsIFNXSUcgcmVmdXNlZCB0byBnZW5lcmF0ZSBhIGNvbnN0cnVjdG9yIGF0IGFsbC4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQ2hhbmdlIHRvICV0ZW1wbGF0ZSBkaXJlY3RpdmUuICBJZiB5b3Ugc3BlY2lmeSBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2aSkgc3RkOjp2ZWN0b3I8aW50PjsKCiAgICAgICAgICAgIEl0IGlzICpleGFjdGx5KiB0aGUgc2FtZSBhcyB0aGlzOgogCiAgICAgICAgICAgICAgICBuYW1lc3BhY2Ugc3RkIHsKICAgICAgICAgICAgICAgICAgICAldGVtcGxhdGUodmkpIHZlY3RvcjxpbnQ+OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgU1dJRy0xLjMuMTIgdHJpZWQgdG8gaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG91dHNpZGUgb2YgdGhlIG5hbWVzcGFjZQogICAgICAgICAgICB1c2luZyBzb21lIHRyaWNrLiAgSG93ZXZlciwgdGhpcyB3YXMgZXh0cmVtZWx5IHByb2JsZW1hdGljIGFuZCBmdWxsCiAgICAgICAgICAgIGhvbGVzLiAgIFRoaXMgdmVyc2lvbiBpcyBzYWZlci4KCjA2LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgYnVnIHdpdGggc2NvcGUgcXVhbGlmaWNhdGlvbiBhbmQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIEE8Qjo6Qz46OkRECgogICAgICAgICAgICBCZWZvcmUsIHRoaXMgd2FzIHNlcGFyYXRlZCBhcyBzY29wZXMgQTxCLCBDPiwgYW5kIERELiAgRml4ZWQgbm93LgoKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBBbGxvdyB0aGUgZm9sbG93aW5nIHN5bnRheDogCiAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICBjbGFzcyBBIHsgfTsKICAgICAgICAgICAgICAgc3RydWN0IEIgOiBBIHsgLi4uIH07CgogICAgICAgICAgICBBIGJhc2UgY2xhc3Mgd2l0aG91dCBhIHNwZWNpZmllciBpcyBhc3N1bWVkIHRvIGJlIHB1YmxpYyBmb3IgYSBzdHJ1Y3QuCiAKMDYvMDYvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzeW50YXggZXJyb3Igd2l0aCB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBpbml0aWFsaXplcnMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNi8wNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJ1ZyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzLiAKICAgICAgICAgICAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA2LzA1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgc3VidGxlIHByb2JsZW1zIHdpdGggJXJlbmFtZSBkaXJlY3RpdmUgYW5kIHRlbXBsYXRlCiAgICAgICAgICAgIGV4cGFuc2lvbi4KCiAgICAgICAgICAgIENvZGUgbGlrZSB0aGlzIHNob3VsZCBub3cgd29yazoKCiAgICAgICAgICAgICAgICVyZW5hbWUoYmxhaCkgZm9vPGRvdWJsZT46Om1ldGhvZDsKICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgIHZvaWQgbWV0aG9kKCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAldGVtcGxhdGUod2hhdGV2ZXIpIGZvbzxkb3VibGU+OwoKMDYvMDUvMjAwMjogYmVhemxleQogICAgICAgICAgICBSZXNvbHZlZCBzb21lIHRyaWNreSBpc3N1ZXMgb2YgbXVsdGktcGFzcyBjb21waWxhdGlvbiBhbmQgCiAgICAgICAgICAgIGFuZCBpbmhlcml0YW5jZS4gIFRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uIG5vdyBnZW5lcmF0ZXMKICAgICAgICAgICAgYW4gZXJyb3I6CgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBnZW5lcmF0ZXMgYSB3YXJuaW5nIGFib3V0IGluY29tcGxldGUgY2xhc3Nlcy4KCiAgICAgICAgICAgICAgICAgIGNsYXNzIEJhcjsKICAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7IH07CgogICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgZ2VuZXJhdGVzIGEgd2FybmluZyBhYm91dCBhbiB1bmRlZmluZWQgY2xhc3MuCgogICAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyIHsgfTsgIC8vIEJhciB1bmRlZmluZWQKCiAgICAgICAgICAgIFRoaXMgZml4ZXMgYSBmYWlsZWQgYXNzZXJ0aW9uIGJ1ZyByZXBvcnRlZCBieSBKYXNvbiBTdGV3YXJ0LgoKMDYvMDUvMjAwMjogbGpvaG5zb24KICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIGZvciB0aGUgUnVieSBtb2R1bGUgYWJvdXQgdGhlIGxhY2sKICAgICAgICAgICAgb2Ygc3VwcG9ydCBmb3IgbXVsdGlwbGUgaW5oZXJpdGFuY2UuIE9ubHkgdGhlIGZpcnN0IGJhc2UgY2xhc3MKICAgICAgICAgICAgbGlzdGVkIGlzIHVzZWQgYW5kIHRoZSBvdGhlcnMgYXJlIGlnbm9yZWQuIChSZXBvcnRlZCBieSBDcmFpZwogICAgICAgICAgICBGaWxlcykuCiAgICAgICAgICAgIAowNi8wMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgYnVnIHdpdGggc3RydWN0IGRlY2xhcmF0aW9ucyBhbmQgdHlwZWRlZi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IEZvbyBGb287CiAgICAgICAgICAgICAgICAgc3RydWN0IEZvbyB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEEgZmV3IG90aGVyIHN1YnRsZSBzdHJ1Y3QgcmVsYXRlZCB0eXBpbmcgcHJvYmxlbXMgd2VyZQogICAgICAgICAgICBhbHNvIHJlc29sdmVkLgoKVmVyc2lvbiAxLjMuMTIgKEp1bmUgMiwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgCjA1LzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgcHJvYmxlbSByZWxhdGVkIHRvIGZvcndhcmQgdGVtcGxhdGUgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgICBuYW1lc3BhY2VzLiAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEFkZGVkICdtYWtlIHVuaW5zdGFsbCcgdGFyZ2V0LiAgQ29udHJpYnV0ZWQgYnkgSm9lbCBSZWVkLgoKMDUvMjkvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCByYXRoZXIgaW5zaWRpb3VzIGJ1ZyB3aXRoICVyZW5hbWUsICVmZWF0dXJlIGFuZCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJWV4Y2VwdGlvbiB2ZWN0b3I6Ol9fZ2V0aXRlbV9fIHsKICAgICAgICAgICAgICAgICAgICAgLi4uIHNvbWUgZXhjZXB0aW9uIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvciB7CiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgVCBfX2dldGl0ZW1fXyhpbnQgaW5kZXgpOyAgICAgICAvLyBGaW5lCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIHRlbXBsYXRlPD4gY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgIFQgX19nZXRpdGVtX18oaW50IGluZGV4KTsgICAgICAgLy8gT29wcy4KICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3csIHRoZSAlZXhjZXB0aW9uIGRpcmVjdGl2ZSAoYW5kIG90aGVyIGZlYXR1cmVzKSBzaG91bGQgY29ycmVjdGx5IGFwcGx5IHRvCiAgICAgICAgICAgIGJvdGggdmVjdG9yIGFuZCBzcGVjaWFsaXphdGlvbnMuCgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2VzIHRvICV0ZW1wbGF0ZSgpIGRpcmVjdGl2ZS4gICBUZW1wbGF0ZSBhcmd1bWVudHMgYXJlIG5vdwogICAgICAgICAgICByZWR1Y2VkIHRvIHByaW1pdGl2ZSB0eXBlcyBpbiB0ZW1wbGF0ZSBtYXRjaGluZy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yPFQgKj4gewogICAgICAgICAgICAgICAgLi4uIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIHR5cGVkZWYgaW50ICpJbnRQdHI7ICAgICAvLyBHcm9zcyB0eXBlZGVmCgogICAgICAgICAgICAgICAvLyBHZXRzIHRoZSBhYm92ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWN0b3JJbnRQdHIpIHZlY3RvcjxJbnRQdHI+OwoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgZXh0cmVtZWx5IHN1YnRsZSwgYnV0IGl0IGZpeGVzIGEgbnVtYmVyIG9mIHBvdGVudGlhbAogICAgICAgICAgICBob2xlcyBpbiBMdWlnaSdzIFNUTCBsaWJyYXJ5IG1vZHVsZXMuICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEludGVnZXI7CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjdG9yaSkgdmVjdG9yPGludD47CgowNS8yOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHJhdGhlciBpbnNpZGlvdXMgdHlwZW1hcCBidWcgcmVsYXRlZCB0byBjb25zdC4gIGNvbnN0CiAgICAgICAgICAgIHdhcyBiZWluZyBkaXNjYXJkZWQgdGhyb3VnaCB0eXBlZGVmcy4KCjA1LzI5LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBpbnB1dCB0eXBlbWFwcyBmb3IgY29uc3QgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUKICAgICAgICAgICAgdHlwZXMgKGluIExpYi9ydWJ5L3J1Ynkuc3dnKS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gVGhlIGphdmEgYXJycmF5IHN1cHBvcnQgZnVuY3Rpb25zIGFyZSBlbmNsb3NlZCBieSAKICAgICAgICAgICAgYSBTV0lHX05PQVJSQVlTICNkZWZpbmUuIFVzZWZ1bCBpZiBub3QgdXNpbmcgYXJyYXlzIGFuZCAKICAgICAgICAgICAgaXQgaXMgZGVzaXJhYmxlIHRvIG1pbmltaXNlIHRoZSBhbW91bnQgb2YgY29tcGlsZWQgY29kZS4KCjA1LzI5LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRW51bXMgd2VyZSBub3QgcmVuYW1lZCB3aGVuIHVzaW5nICVuYW1lIG9yICVyZW5hbWUKICAgICAgICAgICAgZml4LgoKMDUvMjgvMjAwMjogbGpvaG5zb24KICAgICAgICAgICAgW1J1YnldIE1vZGlmaWVkIHRoZSBuYW1lIG9mIHRoZSB3cmFwcGVyIGZ1bmN0aW9ucyBmb3IgdGhlCgkgICAgIm5ldyIgc2luZ2xldG9uIG1ldGhvZCBhbmQgImluaXRpYWxpemUiIGluc3RhbmNlIG1ldGhvZCBmb3IKCSAgICBjb25zaXN0ZW5jeSB3aXRoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzLiBUaGUgd3JhcHBlciBuYW1lCgkgICAgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgIm5ldyIgaXMgYWxsb2NfY2xhc3NuYW1lIGFuZAoJICAgIHRoZSB3cmFwcGVyIG5hbWUgZm9yIHRoZSBmdW5jdGlvbiB0aGF0IGltcGxlbWVudHMgImluaXRpYWxpemUiCgkgICAgaXMgbmV3X2NsYXNzbmFtZS4KCgowNS8yNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZXMgdG8gcnVudGltZS4gIFBvaW50ZXIgY29udmVyc2lvbi9jcmVhdGlvbiBmdW5jdGlvbnMKICAgICAgICAgICAgbm93IGFsbW9zdCBhbHdheXMgaGF2ZSBhbiBleHRyYSAiZmxhZ3MiIGFyZ3VtZW50LiAgRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgIFNXSUdfQ29udmVydFB0cihvYmosIHZvaWQgKiosIHN3aWdfdHlwZV9pbmZvICp0eSwgaW50IGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl4KICAgICAgICAgICAgVGhpcyBleHRyYSBwYXJhbWV0ZXIgaXMgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBleHBhbnNpb24gYW5kIHdpbGwKICAgICAgICAgICAgYmUgdXNlZCBmb3IgbW9yZSBjb250cm9sIG92ZXIgcG9pbnRlcnMgaW4gZnV0dXJlIHZlcnNpb25zLgoKMDUvMjcvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXggZm9yIEMrKyBjbGFzc2VzIHdpdGggcHJpdmF0ZSBhc3NpZ25tZW50IG9wZXJhdG9ycy4gIEl0CiAgICAgICAgICAgIGlzIG5vdyBwb3NzaWJsZSB0byBzYWZlbHkgcmV0dXJuIG9iamVjdHMgbGlrZSB0aGlzIGJ5IHZhbHVlLgogICAgICAgICAgICBDYXZlYXQ6ICB0aGUgY2xhc3MgbXVzdCBwcm92aWRlIGEgY29weSBjb25zdHJ1Y3Rvci4KCSAgICAKMDUvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgICAtcHJveHkgb3B0aW9uIGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4gIFRoaXMgaXMgdGhlCiAgICAgICAgICAgIHNhbWUgYXMgLXNoYWRvdy4gIFdlIGFyZSBtZXJlbHkgY2hhbmdpbmcgdGVybWlub2xvZ3kuCiAgICAgICAgICAgIAowNS8yNi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBzb21lIGluY29uc2lzdGVuY2llcyBpbiB0aGUgLXBhY2thZ2Ugb3B0aW9uLgogICAgICAgICAgICAtcGFja2FnZSBtZXJlbHkgc2V0cyB0aGUgcGFja2FnZSBuYW1lIHRvIGJlIHVzZWQgb24gdGhlCiAgICAgICAgICAgIHdyYXBwZXJzLiAgSXQgZG9lcyBub3QgY2hhbmdlIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgbGlicmFyeQogICAgICAgICAgICBmaWxlIG9yIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgLnBtIGZpbGUuICBUaGlzIHdhcwogICAgICAgICAgICBicm9rZW4gYXQgc29tZSBwb2ludCwgYnV0IHdvcmtzIGFnYWluIG5vdy4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgW3BlcmxdIEZpeGVkIFsgNDc1NDUyIF0gbWVtb3J5IGxlYWsgaW4gcmV0dXJuLWJ5LXZhbHVlLgogICAgICAgICAgICBQcm9ibGVtIHJlbGF0ZWQgdG8gc3RhdGljIG1lbWJlciB2YXJpYWJsZXMgcmV0dXJuaW5nIG5ld2x5CiAgICAgICAgICAgIGFsbG9jYXRlZCBvYmplY3RzLiBSZXBvcnRlZCBieSBSb3kgTGVjYXRlcy4KIAowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFtwZXJsXSBGaXhlZCBbIDUxMzEzNCBdICVCTEVTU0VETUVNQkVSUyBpc24ndCBhbHdheXMgcmlnaHQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEZsZXVyIERpYW5hIERyYWdhbi4KCjA1LzI1LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1NDA3MzUgXSAtaW1wb3J0YWxsIGFuZCB0aGUgLUkgb3B0aW9uLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBbZ3VpbGVdIEZpeGVkIFsgNTMyNzIzIF0gRGVmYXVsdCBhcmcgZm9yIGNoYXIqIGNhbiBTZWdWLiAgCiAgICAgICAgICAgIEVycm9yIGluIGd1aWxlIG1vZHVsZS4gIFJlcG9ydGVkIGJ5IEJyZXR0IFdpbGxpYW1zLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBTdWJ0bGUgY2hhbmdlIHRvIHR5cGVtYXAgYXBwbGljYXRpb24gY29kZS4gIFRoZSAiZnJlZWFyZyIKICAgICAgICAgICAgdHlwZW1hcCBtdXN0IGV4YWN0bHkgbWF0Y2ggdXAgd2l0aCB0aGUgImluIiBvciAiaWdub3JlIgogICAgICAgICAgICB0eXBlbWFwLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoY2hhciAqZGF0YSwgaW50IGxlbikgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAldHlwZW1hcChmcmVlYXJnKSBjaGFyICpkYXRhIHsgLi4uIH07IAoKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhjaGFyICpkYXRhLCBpbnQgbGVuKTsKCiAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSAiaW4iIHR5cGVtYXAgaXMgYXBwbGllZCwgYnV0IHRoZQogICAgICAgICAgICAgZnJlZWFyZyB0eXBlbWFwIGlzIG5vdC4gIFRoaXMgaXMgYmVjYXVzZSB0aGUgZnJlZWFyZwogICAgICAgICAgICAgdHlwZW1hcCBkb2Vzbid0IG1hdGNoIHVwIHdpdGggdGhlIGlucHV0IGFyZ3VtZW50IHNlcXVlbmNlLgoKMDUvMjUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0ODI3MiBdIERlZmF1bHQgYXJndW1lbnQgY29kZSBtaXNzaW5nIGJyYWNlcy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQnJldHQgV2lsbGlhbXMuCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTQ3NzMwIF0gU3dpZ1ZhbHVlV3JhcHBlciBuZWVkZWQgZm9yIGNvbnN0cnVjdG9ycy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowNS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFVuZGVmaW5lZCBpZGVudGlmaWVycyBub3cgZXZhbHVhdGUgdG8gMCB3aGVuIGV2YWx1YXRpbmcKICAgICAgICAgICAgcHJlcHJvY2Vzc29yIGV4cHJlc3Npb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAjaWYgIUZPTwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgI2VuZGlmCiAgICAgIAogICAgICAgICAgICB3aGVyZSBGT08gaXMgdW5kZWZpbmVkIG9yIHNldCB0byBzb21lIG5vbi1udW1lcmljIHZhbHVlLgoKICAgICAgICAgICAgRml4ZXMgWyA1NDA4NjggXSAjaWYgZGVmaW5lZCB3aGF0ZXZlciAtIG5vdCBwYXJzZWQuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IEFkYW0gSHVwcC4KCiAKMDUvMjQvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIG5vdyBpZ25vcmVzIHRoZSBDKysgJ2V4cG9ydCcga2V5d29yZC4KCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSByZWZpbmVtZW50IG9mIHR5cGUtbmFtZSBtYW5nbGluZyB0byBhY2NvdW50IGZvciBwb2ludGVycywgYXJyYXlzLAogICAgICAgICAgICByZWZlcmVuY2VzLCBhbmQgb3RoZXIgZW1iZWRkZWQgdHlwZSBjb25zdHJ1Y3RzLgoKMDUvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBJbml0aWFsIGF0dGVtcHQgYXQgc3VwcG9ydGluZyB0ZW1wbGF0ZSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiAgQXQKICAgICAgICAgICAgdGhlIHZlcnkgbGVhc3QsIGl0IGlzIHBhcnNlZCBhbmQgdGhlIGNsYXNzZXMgYXJlIHN0b3JlZC4gIE1hdGNoaW5nCiAgICAgICAgICAgIG9mIGluc3RhbnRpYXRpb25zIHRvIHNwZWNpYWxpemVkIHZlcnNpb24gaXMgbW9yZSBsaW1pdGVkIGFuZCBiYXNlZCBvbgogICAgICAgICAgICB0aGUgU1dJRyBkZWZhdWx0IHR5cGVtYXAgcnVsZXM6CgogICAgICAgICAgICAgICAgICAgICBTV0lHVFlQRSAqCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFIFtdCiAgICAgICAgICAgICAgICAgICAgIFNXSUdUWVBFICYKCiAgICAgICAgICAgIE5vdywgd2h5IGluIHRoZSB3b3JsZCB3b3VsZCB5b3Ugd2FudCB0byB1c2UgdGhpcyBmZWF0dXJlPyAgT3RoZXIKICAgICAgICAgICAgdGhhbiBhbGxvd2luZyBmb3Igc2xpZ2h0bHkgbW9kaWZpZWQgY2xhc3MgQVBJcywgdGhpcyBjYXBhYmlsaXR5IGlzCiAgICAgICAgICAgIHByaW1hcmlseSB1c2VkIHRvIHByb3ZpZGUgYWR2YW5jZWQgd3JhcHBpbmcgc3VwcG9ydCBmb3IgU1RMLWxpa2UKICAgICAgICAgICAgb2JqZWN0cy4gIEl0IGNhbiBhbHNvIGJlIG1peGVkIHdpdGggdHlwZW1hcHMuICBIZXJlIGlzIGFuIGV4YW1wbGU6CgoKICAgICAgICAgICAgICAgIC8qIEdlbmVyaWMgdmVyc2lvbiAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPFQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBvYmplY3RzIAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvKiBQYXJ0aWFsIHNwZWNpYWxpemF0aW9uIChwb2ludGVycykgKi8KICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIHZlY3RvcjxUICo+IHsKICAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgdmVjdG9yPFQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBwb2ludGVycyB0byBvYmplY3RzLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvKiBTcGVjaWFsaXphdGlvbiAoaW50ZWdlcnMpLiAqLwogICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGNvbnRhaW5lciBvZiBpbnRlZ2Vycy4KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKICAgICAgICAgICAgCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRW5oYW5jZW1lbnQgdG8gdHlwZW1hcHMuICAgTm9ybWFsbHksIHR5cGVtYXAgdmFyaWFibGVzIGFyZQogICAgICAgICAgICByZW5hbWVkIHRvIGF2b2lkIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAqIChpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBjb2RlIHRoYXQgY3JlYXRlcyBhbmQgdXNlcyB2YXJpYWJsZXMgInRlbXAxIiwidGVtcDIiLCAKICAgICAgICAgICAgInRlbXAzIiBhbmQgc28gZm9ydGggZGVwZW5kaW5nIG9uIGhvdyBtYW55IHRpbWVzIHRoZSB0eXBlbWFwIGlzIHVzZWQuCiAgICAgICAgICAgIFNvbWV0aW1lcyB5b3Ugd2FudCBhIHNpbmdsZSB2YXJpYWJsZSBpbnN0ZWFkLiAgVG8gZG8gdGhhdCwgdXNpbmcKICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBuYW1pbmcgc2NoZW1lOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgKihpbnQgX2dsb2JhbF90ZW1wKSB7CiAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgSXMgdGhpcyBjYXNlLCBhIHNpbmdsZSB2YXJpYWJsZSBfZ2xvYmFsX3RlbXAgaXMgZW1pdHRlZCBpbiB0aGUKICAgICAgICAgICAgd3JhcHBlciBmdW5jdGlvbnMuICBJdCBpcyBzaGFyZWQgYWNyb3NzIGFsbCB0eXBlbWFwcy4gIFJlcGVhdGVkCiAgICAgICAgICAgIHR5cGVtYXBzIGRvIG5vdCByZXBsaWNhdGUgdGhlIHZhcmlhYmxlLS0tdGhleSB1c2UgdGhlIGZpcnN0IG9uZQogICAgICAgICAgICBlbWl0dGVkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjA1LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTWlub3IgZW5oYW5jZW1lbnQgdG8gdHlwZW1hcHMuICBJZiB5b3UgaGF2ZSB0aGlzIGNvZGUsCgogICAgICAgICAgICAgICAldHlwZW1hcChpbikgRm9vIChpbnQgc29tZXZhciA9IDMpIHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBzb21ldmFyIGlzIG5vdyBlbWl0dGVkIGludG8gdGhlIHdyYXBwZXIgY29kZS4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgJWV4dGVuZCB0byBiZSBiZXR0ZXIgYmVoYXZlZCBpbiBuYW1lc3BhY2VzLiAgSWYgeW91IGhhdmUgY29kZQogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBiYXIgewogICAgICAgICAgICAgICAgICAgICAgICAlZXh0ZW5kIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAKICAgICAgICAgICAgU1dJRyBtYXRjaGVzIHRoZSBibGFoKCkgbWV0aG9kIHRvIGEgQyBmdW5jdGlvbiBuYW1lZCAKICAgICAgICAgICAgdm9pZCBmb29fYmFyX2JsYWgoZm9vOjpiYXIgKnNlbGYpLgoKICAgICAgICAgICAgVGhpcyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIG5vbi1uYW1lc3BhY2UgdmVyc2lvbi4KICAgICAgICAgICAgQnVnIHJlcG9ydGVkIGJ5IE1hcmNlbG8gTWF0dXMuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBsaWJyYXJ5IGZpbGVzOiBjcG9pbnRlci5pLCBjYXJyYXlzLmksIGNtYWxsb2MuaS4gIFRoZXNlCiAgICAgICAgICAgIHByb3ZpZGUgYWNjZXNzIHRvIEMgcG9pbnRlcnMgYW5kIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9ucy4KICAgICAgICAgICAgU2VlIERvYy9NYW51YWwvTGlicmFyeS5odG1sIGZvciBkZXRhaWxzLgoKMDUvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBDIHR5cGUgY2hhciBubyBsb25nZXIgbWFwcyB0byBKYXZhIHR5cGUgYnl0ZSwgYnV0IHRvIEphdmEgdHlwZSBjaGFyLgogICAgICAgICAgICBJdCBpcyBub3cgdHJlYXRlZCBhcyBhIGNoYXJhY3RlciByYXRoZXIgdGhhbiBhIHNpZ25lZCBudW1iZXIuIFRoaXMgZml0cyBpbgogICAgICAgICAgICB3aXRoIHRoZSBvdGhlciBsYW5ndWFnZSBtb2R1bGVzIGFuZCBpcyBhIG1vcmUgbmF0dXJhbCBtYXBwaW5nIGFzIGNoYXIqIGlzIAogICAgICAgICAgICBtYXBwZWQgYXMgYSBzdHJpbmcgb2YgY2hhcmFjdGVycy4gTm90ZSB0aGF0IHRoZSBDIHNpZ25lZCBjaGFyIHR5cGUgaXMgc3RpbGwKICAgICAgICAgICAgbWFwcGVkIHRvIGEgSmF2YSBieXRlLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMjIvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBJbXByb3ZlZCBjb25zdGFudHMgd3JhcHBpbmcuIENvbnN0YW50cyAoI2RlZmluZSBhbmQgJWNvbnN0YW50KSB2YWx1ZXMgCiAgICAgICAgICAgIGFyZSBub3cgb2J0YWluZWQgdGhyb3VnaCBhIEpOSSBjYWxsLiBQcmV2aW91c2x5IHRoZSB2YWx1ZSB3YXMgY29tcGlsZWQgYXMgCiAgICAgICAgICAgIEphdmEgY29kZSwgYnV0IHRoaXMgZGlkbid0IHdvcmsgZm9yIGFsbCBjYXNlcywgZWcgI2RlZmluZSAxMjNVTEwuCgowNS8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGJvZ3VzIGVycm9yIG1lc3NhZ2Ugd2l0aCAlZXh0ZW5kIGRpcmVjdGl2ZSBhbmQgQysrCiAgICAgICAgICAgIGFjY2VzcyBzcGVjaWZpZXJzLiAgUmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmFtZXNwYWNlcyBhbmQgZW51bXMgbm93IHdvcmsgY29ycmVjdGx5LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgZW51bSBCYXIgeyBBLCBCIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgTWFyY2VsbyBNYXR1cy4KCjA1LzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICV0eXBlcyBkaXJlY3RpdmUgY2FuIG5vdyBiZSB1c2VkIHRvIHNwZWNpZnkgaW5oZXJpdGFuY2UgcmVsYXRpb25zaGlwcwogICAgICAgICAgICBpbiB0aGUgcnVudGltZSB0eXBlIHN5c3RlbS4gIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAgICV0eXBlcyhGb28gPSBCYXIpOwoKICAgICAgICAgICAgc3BlY2lmaWVzIHRoYXQgRm9vIGlzYSBCYXIuICAgIFVzaW5nIHRoaXMgaXMgcG90ZW50aWFsbHkgcXVpdGUgZGFuZ2Vyb3VzLgogICAgICAgICAgICBIb3dldmVyLCB0aGlzIGlzIHVzZWZ1bCBpbiBjZXJ0YWluIGNhc2VzIChhbmQgaW4gdGhlIFNXSUcgbGlicmFyeSkuCiAgICAgICAgICAgIAowNS8yMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgICVub2RlZmF1bHQgYW5kICVtYWtlZGVmYXVsdCBkaXJlY3RpdmVzIG5vdyByZXF1aXJlIGEgdHJhaWxpbmcgc2VtaWNvbG9uLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAlbm9kZWZhdWx0OwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAlbWFrZWRlZmF1bHQ7CgogICAgICAgICAgICBJbiBhZGRpdGlvbiBib3RoIGRpcmVjdGl2ZXMgY2FuIHRha2UgYSBjbGFzcyBuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdCBGb287CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsgICAvKiBObyBkZWZhdWx0IGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgKi8KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsgIC8qIERlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciBnZW5lcmF0ZWQgKi8KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgSWYgeW91IGRvbid0IHVzZSB0aGUgdHJhaWxpbmcgc2VtaWNvbG9uLCB0aGluZ3Mgd2lsbCBteXN0ZXJpb3VzbHkgYnJlYWsuCgowNS8yMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1vcmUgaW1wcm92ZW1lbnRzIHRvIHR5cGUgc3lzdGVtIGhhbmRsaW5nLiAgU1dJRyBub3cgY29ycmVjdGx5IGhhbmRsZXMKICAgICAgICAgICAgdGVtcGxhdGUgbmFtZXMgYW5kIHBhcmFtZXRlcnMgaW4gYSBuYW1lc3BhY2UuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBmb28gewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGNsYXNzIGJhciB7IH07CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGJhcjxJbnRlZ2VyPiAqeCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgSW4gdGhlIGdlbmVyYXRlZCBjb2RlLCBhbGwgb2YgdGhlIHR5cGVuYW1lcyBhcmUgcHJvcGVybHkgcXVhbGlmaWVkLgoKMDUvMTcvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBkZXByZWNhdGVkIGJyb2tlbiAtam5pYyBhbmQgLWpuaWNwcCBjb21tYW5kbGluZSBvcHRpb25zLiBUaGUgQyBvciBDKysgCiAgICAgICAgICAgIEpOSSBjYWxsaW5nIGNvbnZlbnRpb24gaXMgbm93IGRldGVybWluZWQgZnJvbSB0aGUgLWMrKyBjb21tYW5kbGluZSBvcHRpb24uCgowNS8xNi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFRoZSBKQ0FMTCBtYWNyb3Mgd2hpY2ggZXhpc3Qgc28gdGhhdCB0aGUgc2FtZSB0eXBlbWFwcyBjYW4gYmUgdXNlZAogICAgICAgICAgICBmb3IgZ2VuZXJhdGluZyBib3RoIHRoZSBDIGFuZCBDKysgSk5JIGNhbGxpbmcgY29udmVudGlvbnMgbm8gbG9uZ2VyIGFwcGVhcgogICAgICAgICAgICBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUuIFRoaXMgaXMgYmVjYXVzZSB0aGUgb3V0cHV0IGlzIG5vdyBwYXNzZWQgdGhyb3VnaCB0aGUgCiAgICAgICAgICAgIFNXSUcgcHJlcHJvY2Vzc29yIHdoaWNoIGRvZXMgdGhlIG1hY3JvIGV4cGFuc2lvbiBmb3IgZWl0aGVyIEMgb3IgQysrIChkZXBlbmRpbmcKICAgICAgICAgICAgb24gd2hldGhlciAtYysrIGlzIHBhc3NlZCBvbiB0aGUgU1dJRyBjb21tYW5kbGluZSkuCgogICAgICAgICAgICBUaGUgZ2VuZXJhdGlvbiBvZiB0aGUgZnVuY3Rpb25zIHVzZWQgaW4gdGhlIGFycmF5IHR5cGVtYXBzIGhhdmUgYmVlbiBhZGp1c3RlZCAKICAgICAgICAgICAgdG8gdGFrZSBhY2NvdW50IG9mIHRoaXMuIFRoZSBzaWRlIGVmZmVjdCBpcyB0aGF0IGFueSB0eXBlbWFwcyB3aGljaCBjb250YWluZWQgCiAgICAgICAgICAgIEpDQUxMIG1hY3JvcyB3aXRoaW4gJXsgJX0gYnJhY2tldHMgd2lsbCBoYXZlIHRvIGJlIG1vdmVkIHdpdGhpbiB7fSBicmFja2V0cyAKICAgICAgICAgICAgc28gdGhhdCB0aGUgU1dJRyBwcmVwcm9jZXNzb3IgY2FuIGV4cGFuZCB0aGUgbWFjcm9zLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDUvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBDbGFzcyB0ZW1wbGF0ZXMgbWF5IG5vdyBiZSB1c2VkIGFzIHRlbXBsYXRlIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVCwgdGVtcGxhdGU8Y2xhc3M+IGNsYXNzIEM+IGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgJXRlbXBsYXRlKEZvb2kpIEZvbzxpbnQsIEJhcj47CiAgICAgCiAgICAgICAgICAgIFNXSUcgZG9lc24ndCByZWFsbHkgZG8gYW55dGhpbmcgc3BlY2lhbCB3aXRoIHRoaXMtLS1pdCdzIGp1c3QKICAgICAgICAgICAgYW5vdGhlciB3YXkgb2Ygc3BlY2lmeWluZyBhIHRlbXBsYXRlIHBhcmFtZXRlci4gIAogICAgICAgICAKMDUvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciByZWZpbmVtZW50IG9mIHRlbXBsYXRlIHN1cHBvcnQuICBUZW1wbGF0ZSBwYXJhbWV0ZXIgbmFtZXMgYXJlIG5vIGxvbmdlcgogICAgICAgICAgICByZXF1aXJlZCBmb3IgdHlwZXMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTxib29sPiBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE9idmlvdXNseSwgbmFtZXMgYXJlIHJlcXVpcmVkIGZvciB0ZW1wbGF0ZTxjbGFzcyBUPjsKCjA1LzEyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IG1hY3JvIGV4cGFuc2lvbiBpbiB0eXBlbWFwcy4gIFRoZSBzZXF1ZW5jZToKCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcih0eXBlKQoKICAgICAgICAgICAgV2lsbCBleHBhbmQgaW50byB0aGUgU1dJRyB0eXBlIGRlc2NyaXB0b3Igc3RydWN0b3IgZm9yCiAgICAgICAgICAgIHRoZSBnaXZlbiB0eXBlLiAgVHlwZSBtYXkgYmUgYW55IGFic3RyYWN0IGRhdGF0eXBlLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcihpbnQgKikKICAgICAgICAgICAgICAgICRkZXNjcmlwdG9yKGludCAoKikoaW50LGRvdWJsZSkpCiAgICAgICAgICAgICAgICAkZGVzY3JpcHRvcih2ZWN0b3I8aW50PiAqKQoKICAgICAgICAgICAgQ2F2ZWF0OiBJdCBpcyAqTk9UKiBjdXJyZW50bHkgbGVnYWwgdG8gdXNlIG90aGVyIHR5cGVtYXAKICAgICAgICAgICAgc3Vic3RpdHV0aW9uIHZhcmlhYmxlcyBpbiB0aGUgbWFjcm8uICBGb3IgZXhhbXBsZSAKICAgICAgICAgICAgJGRlc2NyaXB0b3IoJDFfdHlwZSkuCgogICAgICAgICAgICBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbW9kaWZpY2F0aW9uIGlzIHRvIGJldHRlcgogICAgICAgICAgICBzdXBwb3J0IHR5cGVtYXBzIGZvciBjb250YWluZXIgb2JqZWN0cyBvciB0byBhbGxvdyB0eXBlbWFwcwogICAgICAgICAgICB0aGF0IG1pZ2h0IGJlIHBlcmZvcm1pbmcgdHlwZSBjb252ZXJzaW9ucy4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMTEvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgd3JhcHBpbmcgb2YgcmVmZXJlbmNlcyB0byBwcmltaXRpdmUgdHlwZXMgaGFzIGJlZW4KICAgICAgICAgICAgY2hhbmdlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgQXJndW1lbnRzIG9mIHR5cGUgJ2NvbnN0IHByaW1pdGl2ZSAmJyBhcmUgbm93IHBhc3NlZAogICAgICAgICAgICBieSB2YWx1ZSBhcyBvcHBvc2VkIHRvIHBvaW50ZXJzLiAgUmV0dXJuIHZhbHVlcyBvZgogICAgICAgICAgICB0eXBlICdjb25zdCBwcmltaXRpdmUgJicgYXJlIHJldHVybmVkIGFzIHZhbHVlcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgIHBvaW50ZXJzLgoKICAgICAgICAgICAgJ3ByaW1pdGl2ZScgaXMgYW55IG9uZSBvZiBpbnQsIHNob3J0LCBsb25nLCBsb25nIGxvbmcsCiAgICAgICAgICAgIGNoYXIsIGZsb2F0LCBkb3VibGUsIGJvb2wgKGFzIHdlbGwgYXMgdW5zaWduZWQgdmFyaWFudHMpLgogICAgICAgICAgICAKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSB0byBiZXR0ZXIgc3VwcG9ydCBDKysgd3JhcHBpbmctLWVzcGVjaWFsbHkKICAgICAgICAgICAgY29kZSB0aGF0IG1ha2VzIHVzZSBvZiB0ZW1wbGF0ZXMgYW5kIHRoZSBTVEwuCiAgICAgICAgICAgIAowNS8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCB0byBhY2Nlc3MgdGVtcGxhdGVzCiAgICAgICAgICAgIGluIGEgbmFtZXNwYWNlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIHN0ZCB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgY29tcGxleCB7CiAgICAgICAgICAgICAgICAgICAgICAgVCByZSwgaW07CiAgICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXgoVCBfciA9IFQoKSwgVCBfaSA9IFQoKSkgOiByZShfciksIGltKF9pKSB7IH0KICAgICAgICAgICAgICAgICAgICAgICBUIHJlYWwoKSB7IHJldHVybiByZTsgfQogICAgICAgICAgICAgICAgICAgICAgIFQgaW1hZygpIHsgcmV0dXJuIGltOyB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAldGVtcGxhdGUoY29tcGxleCkgc3RkOjpjb21wbGV4PGRvdWJsZT47CgogICAgICAgICAgICBOb3RlOiBUaGVyZSBhcmUgc29tZSB2ZXJ5IHN1YnRsZSBuYW1lc3BhY2Uvc3ltYm9sIHRhYmxlIAogICAgICAgICAgICBtYW5hZ2VtZW50IGlzc3VlcyBpbnZvbHZlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcy4KICAgICAgICAgICAgSXQgbWF5IG5vdCB3b3JrIGluIGNlcnRhaW4gY2FzZXMuCgowNS8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1lbWJlciB0ZW1wbGF0ZSBjb25zdHJ1Y3RvciBzdXBwb3J0IGFkZGVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4gCiAgICAgICAgICAgICAgIHN0cnVjdCBwYWlyIHsKICAgICAgICAgICAgICAgICBfVDEgZmlyc3Q7CiAgICAgICAgICAgICAgICAgX1QyIHNlY29uZDsKICAgICAgICAgICAgICAgICBwYWlyKCkgOiBmaXJzdChfVDEoKSksIHNlY29uZChfVDIoKSkgeyB9CiAgICAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgX1UxLCBjbGFzcyBfVTI+IHBhaXIoY29uc3QgcGFpcjxfVTEsX1UyPiAmeCk7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBUbyBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUsIHVzZSAldGVtcGxhdGUgYW5kICVleHRlbmQuCiAgICAgICAgICAgIEZvciBleGFtcGxlLCB0aGlzIGV4cGFuZHMgdGhlIGNvbnN0cnVjdG9yIGludG8gYSBkZWZhdWx0CiAgICAgICAgICAgIGNvcHkgY29uc3RydWN0b3I6CgogICAgICAgICAgICAgICAlZXh0ZW5kIHBhaXIgewogICAgICAgICAgICAgICAgICAldGVtcGxhdGUocGFpcikgcGFpcjxfVDEsX1QyPjsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgSGlnaGx5IGV4cGVyaW1lbnRhbC4gIE90aGVyIHVzZXMgbWF5IGJlIGJyb2tlbi4KCjA1LzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGhlICVleHRlbmQgKCVhZGRtZXRob2RzKSBkaXJlY3RpdmUgbm8gbG9uZ2VyIHdvcmtzIHVubGVzcwogICAgICAgICAgICBpdCBhcHBlYXJzIGluIHRoZSBwdWJsaWMgc2VjdGlvbiBvZiBhIGNsYXNzLiAgIEFuIGVycm9yCiAgICAgICAgICAgIG1lc3NhZ2UgaXMgbm93IGdlbmVyYXRlZCAoYXMgb3Bwb3NlZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdCkuCgowNS8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyAld2FybmZpbHRlcigpIGRpcmVjdGl2ZS4gIFRoaXMgZGlyZWN0aXZlIGF0dGFjaGVzIGEgd2FybmluZwogICAgICAgICAgICBmaWx0ZXIgdG8gc3BlY2lmaWMgZGVjbGFyYXRpb25zIGFuZCBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzCiAgICAgICAgICAgICVyZW5hbWUsICVpZ25vcmUsICVmZWF0dXJlLCBhbmQgc28gZm9ydGguICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICV3YXJuZmlsdGVyKDUwMSkgZm9vOyAgIC8vIFN1cHByZXNzIG92ZXJsb2FkZWQgd2FybmluZwogICAgICAgICAgICAgICBpbnQgZm9vKGludCk7CiAgICAgICAgICAgICAgIGludCBmb28oZG91YmxlKTsgCgogICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAgJXdhcm5maWx0ZXIoNTAxKSBPYmplY3Q6OmZvbyhkb3VibGUpOwogICAgICAgICAgICAgICBjbGFzcyBPYmplY3QgewogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgIGludCBmb28oaW50KTsKICAgICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyBmZWF0dXJlIG9ubHkgc3VwcHJlc3NlcyB3YXJuaW5ncyBpbiBsYXRlciBzdGFnZXMgb2YgY29kZQogICAgICAgICAgICBnZW5lcmF0aW9uLiAgSXQgZG9lcyBub3Qgc3VwcHJlc3Mgd2FybmluZ3MgcmVsYXRlZCB0byBwcmVwcm9jZXNzaW5nCiAgICAgICAgICAgIG9yIHBhcnNpbmcuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA5LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU1dJRyBub3cgc3VwcG9ydHMgQzk5IHZhcmlhZGljIHByZXByb2Nlc3NvciBtYWNyb3MuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICNkZWZpbmUgZGVidWdmKGZtdCwuLi4pIGZwcmludGYoc3RkZXJyLGZtdCxfX1ZBX0FSR1NfXykKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCAiLi4uIiBpcyB1c2VkIHRvIGluZGljYXRlIHZhcmlhYmxlIGFyZ3VtZW50cyB3aGljaAogICAgICAgICAgICBhcmUgYWxsIHBsYWNlZCBpbnRvIHRoZSBzcGVjaWFsIGFyZ3VtZW50IG5hbWUgX19WQV9BUkdTX18gaW4KICAgICAgICAgICAgdGhlIG1hY3JvIGV4cGFuc2lvbi4gIAoKICAgICAgICAgICAgU1dJRyBhbHNvIGltcGxlbWVudHMgdGhlIEdOVSAoIyMpIGV4dGVuc2lvbiBmb3Igc3dhbGxvd2luZyB0aGUKICAgICAgICAgICAgcHJlY2VkaW5nIGNvbW1hIHdoZW4gX19WQV9BUkdTX18gaXMgZW1wdHkuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgI2RlZmluZSBkZWJ1Z2YoZm10LC4uLikgZnByaW50ZihzdGRlcnIsZm10LCAjI19fVkFfQVJHU19fKQoKICAgICAgICAgICAgSGVyZSBpcyBob3cgdGhpcyBpcyBleHBhbmRlZDoKCiAgICAgICAgICAgICAgIGRlYnVnZigiJWQiLCAzKSAgLS0+IGZwcmludGYoc3RkZXJyLCIlZCIsMykKICAgICAgICAgICAgICAgZGVidWdmKCJIZWxsbyIpICAtLT4gZnByaW50ZihzdGRlcnIsIkhlbGxvIiApCgogICAgICAgICAgICAobm90aWNlIHRoZSBkZWxldGVkIGNvbW1hKS4KICAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMDUvMDgvMjAwMjogc2FtamFtIChTYW0gTGlkZGljb3R0KQogICAgICAgICAgICBNYW55IGNoYW5nZXMgdG8gcGhwIG1vZHVsZS4gIFNoYWRvdyBjbGFzc2VzIGFyZSBub3cgaW1wbGVtZW50ZWQKICAgICAgICAgICAgZW50aXJlbHkgaW4gbmF0aXZlIEMgYW5kIG5vIG5lZWQgZm9yIHBocC1jb2RlIHNoYWRvdyB3cmFwcGVycwogICAgICAgICAgICBQb3B1bGF0ZWQgdGVtcGxhdGUgY29uZmlnLm00IGFuZCBNYWtlZmlsZS5pbiBhcyBuZWVkZWQgYnkKICAgICAgICAgICAgcGhwaXplIGFyZSBnZW5lcmF0ZWQuCgowNS8wOC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQSBjb3B5IGNvbnN0cnVjdG9yIGlzIG5vdyB0dXJuZWQgaW50byBhICJjbG9uZSIKICAgICAgICAgICAgaW5zdGFuY2UgbWV0aG9kIChzZWUgRGF2ZSdzIGNoYW5nZSBmb3IgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgICAgZGF0ZWQgNC83LzIwMDIpLiBUaGlzIHNlZW1zIGxpa2UgdGhlIGFwcHJvcHJpYXRlIHRoaW5nCiAgICAgICAgICAgIHRvIGRvIGZvciBSdWJ5IGNvZGUuCgowNS8wOC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1NTM4NjQgXSBJbmxpbmUgZGVzdHJ1Y3RvciBjb2RlIG5vdCB3cml0dGVuLgoKMDUvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICAlaWdub3JlIGJlaGF2ZXMgYmV0dGVyIHdpdGggY29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycywgYW5kIHRoZQogICAgICAgICAgICB0eXBlIHN5c3RlbSBpbiBnZW5lcmFsLiAgIEZvciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLAogICAgICAgICAgICAlaWdub3JlIG5vdyBzdXBwcmVzc2VzIHRoZSBjcmVhdGlvbiBvZiBhIGRlZmF1bHQgY29uc3RydWN0b3IKICAgICAgICAgICAgb3IgZGVzdHJ1Y3Rvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlaWdub3JlIH5Gb287CiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbygpOwogICAgICAgICAgICAgICAgICAgIH5Gb28oKTsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEluIFNXSUctMS4zLjExLCB+Rm9vKCkgc2ltcGx5ICJkaXNhcHBlYXJlZCIgYW5kIHRoZSBjb2RlIGdlbmVyYXRvcgogICAgICAgICAgICBjcmVhdGVkIGEgd3JhcHBlciBmb3IgYSBkZWZhdWx0IGRlc3RydWN0b3IgKGFzIGlmIGl0IHdhcyBuZXZlcgogICAgICAgICAgICBkZWNsYXJlZCBpbiB0aGUgaW50ZXJmYWNlKS4gIEluIFNXSUctMS4zLjEyLCAlaWdub3JlIHN1cHByZXNzZXMKICAgICAgICAgICAgdGhlIGNyZWF0aW9uIG9mIGEgZGVzdHJ1Y3RvciBpZiBvbmUgaXMgYWN0dWFsbHkgZGVmaW5lZC4gCgogICAgICAgICAgICBTaW1pbGFybHksIGV2ZW4gdGhvdWdoIGEgZGVjbGFyYXRpb24gaXMgaWdub3JlZCwgaW5mb3JtYXRpb24KICAgICAgICAgICAgbWF5IHN0aWxsIGJlIG5lZWRlZCB0byBwcm9wZXJseSBoYW5kbGUgdHlwZXMuIEZvciBleGFtcGxlLCBoZXJlCiAgICAgICAgICAgIGlzIGEgdmVyeSBzdWJ0bGUgZXJyb3IgdGhhdCBpcyBmaXhlZCBieSB0aGlzIGNoYW5nZToKCiAgICAgICAgICAgICAgICAlaWdub3JlIHN0ZDo6c3RyaW5nOyAgICAgICAgIC8vIFByZXZlbnQgY2xhc3Mgd3JhcHBpbmcKICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBzdGQgewogICAgICAgICAgICAgICAgICAgY2xhc3Mgc3RyaW5nIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHN0cmluZyAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIHZvaWQgZm9vKHN0ZDo6c3RyaW5nICpzKTsgICAvLyBCcm9rZW4uCgogICAgICAgICAgICBCZWZvcmUgdGhpcyBmaXgsICVpZ25vcmUgd291bGQgY2F1c2UgdGhlIGNsYXNzIGRlZmluaXRpb24gdG8gZGlzYXBwZWFyLgogICAgICAgICAgICBUaGlzLCBpbiB0dXJuLCB3b3VsZCBjYXVzZSB0aGUgdHlwZW1hcCB0byBiZSBtaXNhcHBsaWVkLiAKIAowNS8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1pbm9yIGNoYW5nZXMgdG8gJXJlbmFtZSwgJWlnbm9yZSwgJWZlYXR1cmUsIGFuZCByZWxhdGVkIGRpcmVjdGl2ZXMKICAgICAgICAgICAgZm9yIGJldHRlciBzdXBwb3J0IG9mIGRlc3RydWN0b3JzLiAgRGVzdHJ1Y3RvcnMgY2FuIG5vdyBiZSBwcmVjaXNlbHkKICAgICAgICAgICAgdGFnZ2VkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6fkZvbzsKICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFjdGlvbiIpIH5CYXIgewogICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAqRGV2ZWxvcGVyIHdhcm5pbmcqIAogICAgICAgICAgICBPcGVyYXRpb25zIHN1Y2ggYXMgcmVuYW1pbmcgYW5kIGZlYXR1cmUgYXR0YWNobWVudCBmb3IgY2xhc3NlcyB1c2VkIHRvCiAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gZGVzdHJ1Y3RvcnMgYXMgd2VsbC4gIEZvciBpbnN0YW5jZSwgaWYgeW91IGRpZCB0aGlzOgogCiAgICAgICAgICAgICAgICAgJXJlbmFtZShCYXIpIEZvbzsKCiAgICAgICAgICAgIFRoZSBvcGVyYXRpb24gYXBwbGllZCB0byB0aGUgY2xhc3MgaXRzZWxmLCB0aGUgY29uc3RydWN0b3IsIGFuZAogICAgICAgICAgICB0aGUgZGVzdHJ1Y3Rvci4gICBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gIE5vdyBzdWNoIG9wZXJhdGlvbnMKICAgICAgICAgICAgd2lsbCBvbmx5IGFwcGx5IHRvIHRoZSBjbGFzcyBhbmQgdGhlIGNvbnN0cnVjdG9yLiAgTm90ZTogaWYgeW91CiAgICAgICAgICAgIHdlcmUgcmVseWluZyBvbiB0aGlzIGZvciBjbGFzcyByZW5hbWluZywgYmUgYXdhcmUgdGhhdCByZW5hbWVkCiAgICAgICAgICAgIGNsYXNzZXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIGhhbmRsZWQgYXQgdGhlIGxldmVsIG9mIHRoZSBjbGFzcyBpdHNlbGYKICAgICAgICAgICAgYW5kIG5vdCB0aGUgbGV2ZWwgb2YgaW5kaXZpZHVhbCBkZWNsYXJhdGlvbnMgaW4gdGhlIGNsYXNzIChhbHRob3VnaAogICAgICAgICAgICB0aGV5IGNhbiBiZSByZW5hbWVkIGluZGl2aWR1YWxseSBpZiBuZWVkZWQpLiAgQXMgZmFyIGFzIEkga25vdywKICAgICAgICAgICAgdGhlIExhbmd1YWdlIGNsYXNzIGlzIGFscmVhZHkgdGFraW5nIGNhcmUgb2YgdGhpcyBjYXNlIGNvcnJlY3RseS4KCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTmV3IHNldCBvZiB0ZXN0cy4gIFRoZSBFeGFtcGxlcy90ZXN0LXN1aXRlL2Vycm9ycyBkaXJlY3RvcnkgY29udGFpbnMKICAgICAgICAgICAgdGVzdHMgdGhhdCB0cnkgdG8gZXhlcmNpc2UgYWxsIG9mIFNXSUcncyBlcnJvciBhbmQgd2FybmluZyBtZXNzYWdlcy4KCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU3RhcnQgb2YgYSB3YXJuaW5nIGZyYW1ld29yay4gIFdhcm5pbmcgbWVzc2FnZXMgYXJlIG5vdyBhc3NpZ25lZCBudW1lcmljIHZhbHVlcwogICAgICAgICAgICB0aGF0IGFyZSBzaG93biBpbiB3YXJuaW5nIG1lc3NhZ2VzLiAgIFRoZXNlIGNhbiBiZSBzdXBwcmVzc2VkIHVzaW5nIHRoZQogICAgICAgICAgICAtdyBvcHRpb24uICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgc3dpZyAtdzMwMiBleGFtcGxlLmkKICAgICAgICAgICAgICAgICBzd2lnIC13MzAyLDMwNSBleGFtcGxlLmkKCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksIHRoZSAjcHJhZ21hIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8gZGlzYWJsZSB0aGlzOgoKICAgICAgICAgICAgICAgICAjcHJhZ21hIFNXSUcgbm93YXJuPTMwMgogICAgICAgICAgICAgICAgICNwcmFnbWEgU1dJRyBub3dhcm49MzAyLDMwNQoKICAgICAgICAgICAgTm90ZTogU2luY2UgU1dJRyBpcyBhIG11bHRpLXBhc3MgY29tcGlsZXIsIHRoaXMgcHJhZ21hIHNob3VsZAogICAgICAgICAgICBvbmx5IGJlIHVzZWQgdG8gY2hhbmdlIGdsb2JhbCBzZXR0aW5ncyBvZiB0aGUgd2FybmluZyBmaWx0ZXIuICBJdCBzaG91bGQKICAgICAgICAgICAgbm90IGJlIHVzZWQgdG8gc2VsZWN0aXZlbHkgZW5hYmxlL2Rpc2FibGUgd2FybmluZ3MgaW4gYW4gaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICAgIFRoZSBoYW5kbGluZyBvZiAjcHJhZ21hIG9jY3VycyBpbiB0aGUgQysrIHByZXByb2NvZXNzb3IgYW5kIGFmZmVjdHMgYWxsIAogICAgICAgICAgICBzdWJzZXF1ZW50IHN0YWdlcyBvZiBjb21waWxhdGlvbi4KCiAgICAgICAgICAgIFRoZSAtV2FsbCBvcHRpb24gdHVybnMgb24gYWxsIHdhcm5pbmdzIGFuZCBvdmVycmlkZXMgYW55IGZpbHRlcnMgdGhhdAogICAgICAgICAgICBtaWdodCBoYXZlIGJlZW4gc2V0LgoKICAgICAgICAgICAgV2FybmluZ3MgY2FuIGJlIGlzc3VlZCBmcm9tIGFuIGludGVyZmFjZSB1c2luZyAld2Fybi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAld2FybiAiMTEwOiVzZWN0aW9uIGlzIGRlcHJlY2F0ZWQiCgogICAgICAgICAgICBUaGUgZmlyc3QgcGFydCBvZiBhIHdhcm5pbmcgbWVzc2FnZSBpcyBhbiBvcHRpb25hbCB3YXJuaW5nIG51bWJlci4KICAgICAgICAgICAgQSBjb21wbGV0ZSBzZXQgb2Ygd2FybmluZyBudW1iZXJzIGlzIGZvdW5kIGluIFNvdXJjZS9JbmNsdWRlL3N3aWd3YXJuLmguCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjA1LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgSW50ZXJuYWwgcGFyc2luZyBjaGFuZ2UuICAgRGlyZWN0aXZlcyB0byBpbmNsdWRlIGZpbGVzIG5vdyB1c2UgYnJhY2tldHMgWyAuLi4gXQogICAgICAgICAgICBpbnN0ZWFkIG9mIHsgLi4uIH0uICAgCgogICAgICAgICAgICAgICAgICAlaW5jbHVkZWZpbGUgImZvby5pIiBbCiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICBdCgogICAgICAgICAgICBUaGUgdXNlIG9mIHsgLi4uIH0gd2FzIGEgYmFkIGNob2ljZSBiZWNhdXNlIHRoZXkgd2VyZSBpbmNsdWRlZCBpbXBsaWNpdGx5IGJ5CiAgICAgICAgICAgIHRoZSBwcmVwcm9jZXNzb3IgYW5kIG1hZGUgaXQgaW1wb3NzaWJsZSB0byBwcm9wZXJseSBkZXRlY3QgbGVnaXRpbWF0ZSBtaXNzaW5nICd9JyAKICAgICAgICAgICAgZXJyb3JzLgoKMDQvMTYvMjAwMi0KMDUvMDIvMjAwMjogYmVhemxleQogICAgICAgICAgICBTV0lHIEV1cm9wZWFuIFRvdXI6IFBhcmlzLUFtc3RlcmRhbS1CYXRoLgoKMDQvMjMvMjAwMjogYmVhemxleQogICAgICAgICAgICBUaGUgJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGhhcyBiZWVuIHJlbmFtZWQgdG8gJWV4dGVuZC4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgICAlZXh0ZW5kIEZvbyB7CiAgICAgICAgICAgICAgICAgICBpbnQgYmxhaCgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICBpbnQgYmFyKCkgeyAuLi4gfTsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIE1vdGl2YXRpb246IHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgZm9yIG1hbnkKICAgICAgICAgICAgb3RoZXIgdGFza3MgaW5jbHVkaW5nIGFkZGluZyBzeW50aGVzaXplZCBhdHRyaWJ1dGVzLCBjb25zdHJ1Y3RvcnMsCiAgICAgICAgICAgIGFuZCB0eXBlbWFwcy4gQmVjYXVzZSBvZiB0aGlzLCAiYWRkbWV0aG9kcyIgaXMgc29tZXdoYXQgbWlzbGVhZGluZy4KICAgICAgICAgICAgJWV4dGVuZCBtb3JlIHByZWNpc2VseSBkZXNjcmliZXMgdGhpcyBvcGVyYXRpb24tLS1leHRlbnNpb24gb2YgYQogICAgICAgICAgICBjbGFzcyBvciBzdHJ1Y3R1cmUuCgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgJWFkZG1ldGhvZHMgc3RpbGwgd29ya3MgdmlhIGEgbWFjcm8gZGVmaW5pdGlvbi4gICBIb3dldmVyLAogICAgICAgICAgICBhIHdhcm5pbmcgbWVzc2FnZSBtYXkgYmUgZ2VuZXJhdGVkLiAgIEVycm9ycyBpbnZvbHZpbmcgJWFkZG1ldGhvZHMKICAgICAgICAgICAgd2lsbCBhY3R1YWxseSByZWZlciB0byB0aGUgJWV4dGVuZCBkaXJlY3RpdmUuICAKICAgICAgICAgICAgCjA0LzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRnVydGhlciByZWZpbmVtZW50IG9mIHRoZSB0eXBlIHN5c3RlbS4gIFR5cGVkZWYgbm93CiAgICAgICAgICAgIHByb3BhZ2F0ZXMgdGhyb3VnaCBmdW5jdGlvbnMsIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucywKICAgICAgICAgICAgYW5kIHBvaW50ZXJzIHRvIG1lbWJlciBmdW5jdGlvbnMuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgSW50ZWdlcjsKICAgICAgICAgICAgICAgdm9pZCBmb28oaW50ICgqeCkoaW50KSwgSW50ZWdlciAoKnkpKEludGVnZXIpKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYXJndW1lbnRzICd4JyBhbmQgJ3knIGhhdmUgZXhhY3RseQogICAgICAgICAgICB0aGUgc2FtZSB0eXBlIChhbmQgd291bGQgb2J2aW91c2x5IGFjY2VwdCBvYmplY3RzCiAgICAgICAgICAgIG9mIGVpdGhlciB0eXBlKS4KCiAgICAgICAgICAgIFNpbWlsYXJseSwgY29uc2lkZXIgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB0eXBlZGVmIEZvbyBCYXI7CiAgICAgICAgICAgICAgIHZvaWQgYmFyKGludCAoRm9vOjoqeCkoaW50KSwgaW50IChCYXI6Oip5KShpbnQpKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgYXJndW1lbnRzIHggYW5kIHkgYXJlIHRoZSBzYW1lIAogICAgICAgICAgICB0eXBlICh2aWEgdHlwZWRlZikuCiAgICAgICAgICAgIAowNC8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNXSUcgbm93IGdlbmVyYXRlcyBhIHdhcm5pbmcgbWVzc2FnZSBpZiBhbnkgcGFydCBvZgogICAgICAgICAgICBhbiBleHByZXNzaW9uIGludm9sdmVzIHZhbHVlcyBmcm9tIGEgcHJpdmF0ZSBwYXJ0IG9mIGEgY2xhc3MuCiAgICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQgWDsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludCBhLCBpbnQgYiA9IFgpOyAgIC8vIFdhcm5pbmcKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHRoZSBkZWZhdWx0IGFyZ3VtZW50IGlzIGlnbm9yZWQuICBUaGVyZQogICAgICAgICAgICBhcmUgd29ya2Fyb3VuZHMsIGJ1dCB0aGV5IGFyZSByYXRoZXIgY2x1bXN5LiAgRm9yIGluc3RhbmNlLAogICAgICAgICAgICB5b3UgbWlnaHQgZG8gdGhpczoKCiAgICAgICAgICAgICAgICAgICAgJWZlYXR1cmUoImFjdGlvbiIpIGJsYWgoaW50LGludCkgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkbmFyZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJsYWgoYXJnMSk7CiAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBibGFoKGFyZzEsYXJnMik7CiAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50IGEsIGludCBiID0gMCk7CgoKMDQvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBVc2Ugb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlIGluc2lkZSBhIG5hbWVzcGFjZSBpcwogICAgICAgICAgICBmb3JiaWRkZW4gYW5kIG5vdyBnZW5lcmF0ZXMgYW4gZXJyb3IgbWVzc2FnZS4gICBUaGlzIGlzCiAgICAgICAgICAgIG5vdCBhbGxvd2VkIHNpbmNlIHRoZSBpbmxpbmVkIGNvZGUgdGhhdCBpcyBlbWl0dGVkIGlzCiAgICAgICAgICAgIG5vdCBwbGFjZWQgaW5zaWRlIGEgbmFtZXNwYWNlLiAgVGhpcyBjb25mdXNlcyBvdGhlcgogICAgICAgICAgICBzdGFnZXMgb2YgcGFyc2luZy4KICAgICAgICAgICAgICAgICAgICAKMDQvMjEvMjAwMjogYmVhemxleQogICAgICAgICAgICBTb21lIGJ1ZyBmaXhlcyB0byBjYXN0aW5nIG9wZXJhdGlvbnMgYW5kIGV4cHJlc3Npb24KICAgICAgICAgICAgcGFyc2luZy4gICBEdWUgdG8gc29tZSBwYXJzaW5nIGlzc3VlcywgaXQgaXMgbm90IAogICAgICAgICAgICBjdXJyZW50bHkgcG9zc2libGUgdG8gdXNlIGNhc3RzIGZvciBhbGwgcG9zc2libGUKICAgICAgICAgICAgZGF0YXR5cGVzLiAgIEhvd2V2ZXIsIHRoZSBjb21tb24gY2FzZXMgd29yay4KCjA0LzIwLzIwMDI6IGJlYXpsZXkgKEFtc3RlcmRhbSkKICAgICAgICAgICAgTWVtYmVyIHRlbXBsYXRlcyBub3cgd29yay4gIFNpbXBseSB1c2UgdGhlICV0ZW1wbGF0ZQogICAgICAgICAgICBkaXJlY3RpdmUgaW5zaWRlIGEgY2xhc3Mgb3IgJWFkZG1ldGhvZHMgdG8gY3JlYXRlCiAgICAgICAgICAgIGluc3RhbnRpYXRpb25zIChzZWUgRG9jL01hbnVhbC9TV0lHUGx1cy5odG1sKS4gIFN1cHBvcnRpbmcKICAgICAgICAgICAgdGhpcyB3YXMgZWFzeS0tLWVhcmxpZXIgY2hhbmdlcyB0byB0ZW1wbGF0ZXMgbWFkZSBpdAogICAgICAgICAgICBwb3NzaWJsZSB1c2luZyBvbmx5IGEgdHdvLWxpbmUgbW9kaWZpY2F0aW9uIHRvIHRoZSBwYXJzZXIKICAgICAgICAgICAgYW5kIGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgZWxzZXdoZXJlLiAgSG1tbSwgY29tZSB0byAKICAgICAgICAgICAgdGhpbmsgb2YgaXQsIHRoZSBzbW9rZSB3YXMgcmF0aGVyIHRoaWNrIGluIHRoYXQgSW50ZXJuZXQgImNhZmUiLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAowNC8xOS8yMDAyOiBiZWF6bGV5IChUR1YpCiAgICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIG5vbi10eXBlIHRlbXBsYXRlIHBhcmFtZXRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgdmVjdG9yPGludCwxMDA+OwoKICAgICAgICAgICAgU2ltcGxlIG51bWJlcnMgYW5kIHN0cmluZ3MgY2FuIGJlIHVzZWQgd2l0aCB0aGUgJXRlbXBsYXRlCiAgICAgICAgICAgIGRpcmVjdGl2ZSBhcyB3ZWxsLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQxMDApIHZlY3RvcjxpbnQsMTAwPjsKCiAgICAgICAgICAgIE5vdGU6IEFyaXRobWV0aWMgZXhwcmVzc2lvbnMgYXJlIG5vdCBjdXJyZW50bHkgYWxsb3dlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgIERlZmF1bHQgdGVtcGxhdGUgYXJndW1lbnRzIG5vdyB3b3JrIGFuZCBkbyBub3QgaGF2ZSB0bwogICAgICAgICAgICBiZSBnaXZlbiB0byAldGVtcGxhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgIAowNC8xOC8yMDAyOiBiZWF6bGV5IChQYXJpcykKICAgICAgICAgICAgQ2hhbmdlIGluIGludGVybmFsIHRlbXBsYXRlIGhhbmRsaW5nLiAgVGVtcGxhdGUKICAgICAgICAgICAgcGFyYW1ldGVycyBhcmUgbm93IGZ1bGx5IGludGVncmF0ZWQgaW50byB0aGUgdHlwZQogICAgICAgICAgICBzeXN0ZW0gYW5kIGFyZSBhd2FyZSBvZiB0eXBlZGVmcywgZXRjLiAgVGhpcyBidWlsZHMKICAgICAgICAgICAgdXBvbiB0aGUgY2hhbmdlIGJlbG93LiAgIAoKICAgICAgICAgICAgKioqIERFVkVMT1BFUiBXQVJOSU5HICoqKgogICAgICAgICAgICBXb3JkIG9mIGNhdXRpb24gdG8gbGFuZ3VhZ2UgbW9kdWxlIHdyaXRlcnMuICBUaGUgIm5hbWUiCiAgICAgICAgICAgIHBhcmFtZXRlciBvZiBjZXJ0YWluIHBhcnNlIHRyZWUgbm9kZXMgKGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikKICAgICAgICAgICAgbWF5IGJlIHBhcmFtZXRlcml6ZWQgd2l0aCB0eXBlcy4gICBUaGlzIHBhcmFtZXRlcml6YXRpb24gaXMKICAgICAgICAgICAgZG9uZSB1c2luZyBTV0lHIHR5cGUtc3RyaW5ncyBhbmQgbm90IHRoZSB1bmRlcmx5aW5nIEMgdmVyc2lvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICBpbnQgbWF4PGludCAqPihpbnQgKixpbnQgKikgIAoKICAgICAgICAgICAgaGFzIGEgbmFtZSBvZiAibWF4PChwLmludCk+Ii4gIElmIHlvdSB1c2UgdGhlIG5hbWUgZGlyZWN0bHksCiAgICAgICAgICAgIHlvdSBtYXkgZ2V0IHN5bnRheCBlcnJvcnMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlLiAgVG8gZml4IHRoaXMsCiAgICAgICAgICAgIHVzZSBTd2lnVHlwZV9uYW1lc3RyKG5hbWUpIHRvIGNvbnZlcnQgYSBwYXJhbWV0ZXJpemVkIG5hbWUgCiAgICAgICAgICAgIHRvIGEgQyBuYW1lIHdpdGggdmFsaWQgc3ludGF4LiAgVGhlIGludGVybmFsIHZlcnNpb24gaXMKICAgICAgICAgICAgdXNlZCB0byByZWR1Y2UgdGVtcGxhdGUgdHlwZXMgdG8gYSBjb21tb24gcmVwcmVzZW50YXRpb24gCiAgICAgICAgICAgIGFuZCB0byBoYW5kbGUgaXNzdWVzIG9mIHR5cGVkZWYuCiAgICAgICAgICAgIAowNC8xNi8yMDAyOiBiZWF6bGV5IChzb21ld2hlcmUgb3ZlciB0aGUgQXRsYW50aWMpCiAgICAgICAgICAgIEVuaGFuY2VtZW50IG9mIHR5cGVkZWYgcmVzb2x1dGlvbi4gIFRoZSB0eXBlIHN5c3RlbSBpcyBub3cKICAgICAgICAgICAgYXdhcmUgb2YgdGVtcGxhdGUgYXJndW1lbnRzIGFuZCB0eXBlZGVmLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICB0eXBlZGVmIGludCBJbnRlZ2VyOwogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICBmb28odmVjdG9yPGludD4gKngsIHZlY3RvcjxJbnRlZ2VyPiAqeSk7CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHZlY3RvcjxpbnQ+IGFuZCB2ZWN0b3I8SW50ZWdlcj4gYXJlCiAgICAgICAgICAgIHRoZSBzYW1lIHR5cGUuICAgVGhlcmUgaXMgc29tZSBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoaXMKICAgICAgICAgICAgbWVjaGFuaXNtIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgdHlwZW1hcHMuICBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgYSB0eXBlbWFwIGRlZmluZWQgZm9yIHZlY3RvcjxpbnQ+ICogd291bGQgYXBwbHkgdG8gZWl0aGVyIHR5cGUuCiAgICAgICAgICAgIEhvd2V2ZXIsIGEgdHlwZW1hcCBmb3IgdmVjdG9yPEludGVnZXI+ICogd291bGQgb25seSBhcHBseSB0bwogICAgICAgICAgICB0aGF0IHR5cGUuCgogICAgICAgICAgICBUeXBlZGVmcyBhbmQgdHlwZW1hcHMgYW5kIG1hdGNoZWQgYnkgbGVmdC1tb3N0IGV4cGFuc2lvbi4KICAgICAgICAgICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgIHZlY3RvcjxJbnRlZ2VyLEludGVnZXI+IC0tPiAKICAgICAgICAgICAgICB2ZWN0b3I8aW50LCBJbnRlZ2VyPiAtLT4KICAgICAgICAgICAgICB2ZWN0b3I8aW50LCBpbnQ+CgoKMDQvMjQvMjAwMjogY2hlZXRhaCAoV2lsbGlhbSBGdWx0b24pCiAgICAgICAgICAgIFtKYXZhXSBDaGFuZ2VzIHRvIEphdmEgc2hhZG93IGNsYXNzZXMuCiAgICAgICAgICAgIE92ZXJjb21lcyBhIGJ1ZyB3aGVyZSB0aGUgbW9kdWxlIGFzc3VtZWQgdGhhdCBhIHBvaW50ZXIgdG8gYSBkZXJpdmVkCiAgICAgICAgICAgIGNsYXNzIGNvdWxkIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYSBwb2ludGVyIHRvIGEgYmFzZSBjbGFzcy4gVGhhbmtzIAogICAgICAgICAgICB0byBTdGVwaGVuIE1jQ2F1bCBmb3IgYW5hbHlzaW5nIHRoZSBidWcgYW5kIHN1Ym1pdHRpbmcgcGF0Y2hlcy4KCiAgICAgICAgICAgIEEgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGUgZ2V0Q1B0cigpIG1ldGhvZCBpbiBlYWNoIHNoYWRvdyBjbGFzcyBoYXMKICAgICAgICAgICAgZGlzYXBwZWFyZWQgYW5kIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYSBnZXRDUHRyWFhYKCksIHdoZXJlIFhYWCBpcyB0aGUgCiAgICAgICAgICAgIHNoYWRvdyBjbGFzcyBuYW1lLiBJZiB5b3UgaGF2ZSBjb2RlIHRoYXQgcHJldmlvdXNseSB1c2VkIGdldENQdHIoKSwgCiAgICAgICAgICAgIGFuZCB0aGUgYXNzb2NpYXRlZCBjbGFzcyBpcyB3cmFwcGluZyBhIEMgc3RydWN0IG9yIGEgQysrIGNsYXNzIHRoYXQKICAgICAgICAgICAgaXMgbm90IGludm9sdmVkIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLCBqdXN0IHVzZSB0aGUgbmV3IG1ldGhvZC4gSWYKICAgICAgICAgICAgaG93ZXZlciwgdGhlIGNsYXNzIGlzIGludm9sdmVkIGluIGFuIGluaGVyaXRhbmNlIGNoYWluLCB5b3UnbGwgaGF2ZQogICAgICAgICAgICB0byBjaG9vc2Ugd2hpY2ggcG9pbnRlciB5b3UgcmVhbGx5IHdhbnQuIEJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IAogICAgICAgICAgICBoYXMgYmVlbiBicm9rZW4gYXMgbm90IHVzaW5nIHRoZSBjb3JyZWN0IHBvaW50ZXIgY2FuIGxlYWQgdG8gd2VpcmQgYnVncwogICAgICAgICAgICB0aHJvdWdoIGlsbC1kZWZpbmVkIGJlaGF2aW91ci4gSWYgeW91IGFyZSBzdXJlIHlvdSB3YW50IHRoZSBvbGQgbWV0aG9kcywgCiAgICAgICAgICAgIHlvdSBjb3VsZCBhZGQgdGhlbSBiYWNrIGludG8gYWxsIHNoYWRvdyBjbGFzc2VzIGJ5IGFkZGluZyB0aGlzIGF0IHRoZSAKICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHlvdXIgaW50ZXJmYWNlIGZpbGU6CgogICAgICAgICAgICAlcHJhZ21hKGphdmEpIGFsbHNoYWRvd2NvZGU9JXsKICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDUHRyKCl7CiAgICAgICAgICAgICAgICByZXR1cm4gc3dpZ0NQdHI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAlfQoKICAgICAgICAgICAgUGxlYXNlIHNlZSBlbnRyeSBkYXRlZCAwNy8yMy8yMDAyIHRvIHNlZSBob3cgdG8gZG8gdGhpcyBhZnRlciB0aGUgZGVwcmVjYXRpb24KICAgICAgICAgICAgb2YgdGhlIGFsbHNoYWRvd2NvZGUgcHJhZ21hLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgRk9SIEpBVkEgTU9EVUxFICoqKgoKMDQvMTMvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIHJlZmVyZW5jZXMuICAgRGVjbGFyYXRpb25zIHN1Y2ggCiAgICAgICAgICAgIGFzIHRoaXMgc2hvdWxkIG5vdyB3b3JrOgoKICAgICAgICAgICAgICAgIHZvaWQgZm9vKGNvbnN0IHN0cmluZyAmeCA9ICJIZWxsbyIpOwoKMDQvMTIvMjAwMjogYmVhemxleQogICAgICAgICAgICBBZGRlZCB0eXBlbWFwICQqIHN1YnN0aXR1dGlvbnMgZm9yIHR5cGVtYXBzIGludm9sdmluZyBhcnJheXMuCiAgICAgICAgICAgIFJlcXVlc3RlZCBieSBXaWxsaWFtIEZ1bHRvbi4KCjA0LzExLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gaXMgbm93IHN1cHBvcnRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgdGVtcGxhdGU8PiBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgV2hlbiB0aGUgJXRlbXBsYXRlIGRpcmVjdGl2ZSBpcyB1c2VkLCBpdCB3aWxsIHVzZSBhIHNwZWNpYWxpemF0aW9uCiAgICAgICAgICAgIGlmIG9uZSBpcyBkZWZpbmVkLiAgIFRoZXJlIGFyZSBzdGlsbCBzb21lIGxpbWl0YXRpb25zLiBQYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuICBBIHRlbXBsYXRlIG9mIHR5cGUgPHZvaWQgKj4gZG9lcwogICAgICAgICAgICBub3QgbWF0Y2ggYWxsIHBvaW50ZXJzLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowNC8xMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE1ham9yIGNoYW5nZSB0byB0ZW1wbGF0ZSB3cmFwcGluZyBpbnRlcm5hbHMuIFRlbXBsYXRlIGRlY2xhcmF0aW9ucyBhcmUKICAgICAgICAgICAgbm8gbG9uZ2VyIHByb2Nlc3NlZCBhcyBtYWNyb3MgYnV0IG5vdyByZXN1bHQgaW4gcmVhbCBwYXJzZS10cmVlCiAgICAgICAgICAgIG5vZGVzLiAgVGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgZXhwYW5kcyB0aGVzZSBub2RlcyBpbnRvIGEKICAgICAgICAgICAgc3BlY2lmaWMgaW5zdGFudGlhdGlvbi4gICBUaGlzIGNoYW5nZSBlbmFibGVzIGEgbnVtYmVyIG9mCiAgICAgICAgICAgIG5ldyBhbmQgaW50ZXJlc3RpbmcgY2FwYWJpbGl0aWVzOgoKICAgICAgICAgICAgRGlyZWN0aXZlcyBzdWNoIGFzICVyZW5hbWUsICVmZWF0dXJlLCBhbmQgJWFkZG1ldGhvZHMgY2FuCiAgICAgICAgICAgIG5vdyBiZSBhcHBsaWVkIHRvIHVuaW5zdGFudGlhdGVkIHRlbXBsYXRlcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcnNpemUpIHZlY3Rvcjo6YmFyKGNoYXIgKmJ1ZiwgaW50IGxlbik7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBiYXIoY2hhciAqYnVmKTsKICAgICAgICAgICAgICAgICB2b2lkIGJhcihjaGFyICpidWYsIGludCBsZW4pOyAgIC8vIFJlbmFtZWQKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAldGVtcGxhdGUoaW50dmVjdG9yKSB2ZWN0b3I8aW50PjsgICAvLyBSZW5hbWluZyBjYXJyaWVzIHRocm91Z2gKCiAgICAgICAgICAgIAogICAgICAgICAgICBCeSBwYXJzaW5nIHRlbXBsYXRlcyBpbnRvIGFuIGludGVybmFsIGRhdGEgc3RydWN0dXJlLCBpdCB3aWxsCiAgICAgICAgICAgIGJlIHBvc3NpYmxlIHRvIHN1cHBvcnQgc3BlY2lhbGl6YXRpb24gKGFuZCBtYXliZSBwYXJ0aWFsCiAgICAgICAgICAgIHNwZWNpYWxpemF0aW9uKS4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbCBhbmQgYSB3b3JrIGluIHByb2dyZXNzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIEluIFNXSUctMS4zLjExLCB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgd2VyZSBzaW1wbHkgcHJvY2Vzc2VkCiAgICAgICAgICAgIGFzIHdlaXJkIG1hY3Jvcy4gIE5vIG90aGVyIGluZm9ybWF0aW9uIHdhcyByZXRhaW5lZC4gICBUaGlzIAogICAgICAgICAgICBtYWRlIGl0IGltcG9zc2libGUgdG8gc3VwcG9ydCBtb3JlIGFkdmFuY2VkIGZlYXR1cmVzIGFuZCAKICAgICAgICAgICAgY29tcGxpY2F0ZWQgbWFueSBvdGhlciBwYXJ0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24uCgowNC8wOS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byB0ZW1wbGF0ZSBjbGFzcyB3cmFwcGluZy4gICBUaGVyZSB3ZXJlIGEgdmFyaWV0eSBvZgogICAgICAgICAgICAiaXNzdWVzIiB3aXRoIHRoZSBvbGQgYXBwcm9hY2ggcmVsYXRlZCB0byBwYXJzaW5nLCB0aGUgdHlwZQogICAgICAgICAgICBzeXN0ZW0sIGFuZCBuYW1lc3BhY2VzLiAgIFRoZXNlIGNoYW5nZXMgYXJlIG1lYW50IHRvIHJlY3RpZnkKICAgICAgICAgICAgc29tZSBvZiB0aGVzZSBwcm9ibGVtczoKCiAgICAgICAgICAgIEEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBvZiBhIHRlbXBsYXRlIGNhbiBub3cgYmUgc3BlY2lmaWVkCiAgICAgICAgICAgIGJ5IGluY2x1ZGluZyB0aGUgY2xhc3MgaW5saW5lIGxpa2UgdGhpczoKIAogICAgICAgICAgICAgICAgICBjbGFzcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgIH52ZWN0b3IoKTsKICAgICAgICAgICAgICAgICAgICAgICAuLi4gd2hhdGV2ZXIgLi4uCgkgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgVGhpcyBpcyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiwgYnV0IHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gaXMKICAgICAgICAgICAgbm90IHlldCBpbXBsZW1lbnRlZC4KICAgICAgICAgICAgCiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGV4cGFuZCByb3VnaGx5IGFzCiAgICAgICAgICAgIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNpbnQpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgICAgICAlcmVuYW1lKHZlY2ludD4gdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgY2xhc3MgdmVjdG9yPGludD4gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgdmVjdG9yKCk7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBzaW1wbHkgYnVpbGRzIHVwb24gdGhlIGNvZGUgYWJvdmUgKHRlbXBsYXRlcwogICAgICAgICAgICBpbmNsdWRlZCBpbmxpbmUpLgoKICAgICAgICAgICAgVGhpcyBtb2RpZmllZCBhcHByb2FjaCB0byB3cmFwcGluZyBmaXhlcyBzb21lIHN1YnRsZSB0eXBlCiAgICAgICAgICAgIGlzc3Vlcy4gIEZvciBpbnN0YW5jZSwgeW91IGNhbiBub3cgZGVmaW5lIHR5cGVtYXBzIGFuZCB0eXBlZGVmcwogICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSB2ZWN0b3I8aW50PiAqIHsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdHlwZWRlZiB2ZWN0b3I8aW50PiBpbnR2ZWN0b3I7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGludHZlY3RvciAqdik7ICAgLy8gR2V0cyB0aGUgYWJvdmUgdHlwZW1hcAoKICAgICAgICAgICAgVGhpcyBkaWQgbm90IHdvcmsgaW4gU1dJRy0xLjMuMTEgZHVlIHRvIGEgcGVjdWxpYXJpdHkgb2YKICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGltcGxlbWVudGF0aW9uLgoKICAgICAgICAgICAgJXRlbXBsYXRlKG5hbWUpIG5vIGxvbmdlciBpbnN0YWxscyB0aGUgdGVtcGxhdGUgYXMgYSBjbGFzcwogICAgICAgICAgICB3aXRoIG5hbWUgIm5hbWUiLiAgIFRoaXMgbWlnaHQgYnJlYWsgJWFkZG1ldGhvZHMgYXMgZGVzY3JpYmVkCiAgICAgICAgICAgIGluIHRoZSBtYW51YWwuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgJXRlbXBsYXRlKHZlY2ludCkgdmVjdG9yPGludD47CiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgdmVjaW50IHsgICAgLy8gRmFpbHMuIHZlY2ludCBub3QgYSBjbGFzcwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAKICAgICAgICAgICAgVG8gZml4IHRoaXMsIGp1c3QgdXNlIHRoZSB0ZW1wbGF0ZSBuYW1lIGluc3RlYWQ6CgogICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHZlY3RvcjxpbnQ+IHsKICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgTm90ZTogVGhpcyB0ZWNobmlxdWUgbWlnaHQgYmUgYSB3YXkgdG8gaW1wbGVtZW50IHNvbWUgYml6YXJyZQogICAgICAgICAgICB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0ZWNobmlxdWVzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlYWRkbWV0aG9kcyB2ZWN0b3I8aW50PiB7CiAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgYXBwbGllZCBpZiB2ZWN0b3I8aW50PiBpbnN0YW50aWF0ZWQgbGF0ZXIKICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIHZlY3RvcjxpbnQ+ICogewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICAKMDQvMDgvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBbIDU0MDg2OCBdICNpZiBkZWZpbmVkIHdoYXRldmVyIC0gbm90IHBhcnNlZC4gIFNXSUcgc2hvdWxkCiAgICAgICAgICAgIG5vdyBjb3JyZWN0bHkgaGFuZGxlIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAjaWYgZGVmaW5lZCBfX2NwbHVzcGx1cwogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgIAogICAgICAgICAgICBOb3RlOiB3YXMgaW1wbGVtZW50ZWQgcHJldmlvdXNseSwgYnV0IHRoZXJlIHdhcyBhIG1pbm9yIGJ1Zy4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgQWRhbSBIdXBwLgogICAgICAgICAgICAgICAgICAgCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGFyZSBkZXByZWNhdGVkIGR1ZSB0byBhIGNoYW5nZSBpbiB0aGUgCiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uLiAgSW5zdGVhZCBvZiBiZWluZyBwcmFnbWFzLCBtdXRhYmlsaXR5IGlzIG5vdwogICAgICAgICAgICBjb250cm9sbGVkIGFzIGEgImZlYXR1cmUiIHVzaW5nIHRoZSBmb2xsb3dpbmcgdHdvIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICAgICVpbW11dGFibGU7CiAgICAgICAgICAgICAgICAgaW50IHg7ICAgICAgICAgICAvLyByZWFkLW9ubHkgdmFyaWFibGUKICAgICAgICAgICAgICAgICBpbnQgeTsgICAgICAgICAgIC8vIHJlYWQtb25seSB2YXJpYWJsZQogICAgICAgICAgICAgICAgICVtdXRhYmxlOwogICAgICAgICAgICAgICAgIGludCB6OyAgICAgICAgICAgLy8gTW9kaWZpYWJsZQoKICAgICAgICAgICAgJWltbXV0YWJsZSBhbmQgJW11dGFibGUgYXJlIG11Y2ggbW9yZSBwb3dlcmZ1bCB0aGFuIHRoZWlyIG9sZGVyCiAgICAgICAgICAgIGNvdW50ZXJwYXJ0cy4gIFRoZXkgY2FuIG5vdyBwaW5wb2ludCBhIHNwZWNpZmljIGRlY2xhcmF0aW9uIGxpa2UKICAgICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIHg7ICAgICAgICAgLyogQW55IHggKi8KICAgICAgICAgICAgICAgJWltbXV0YWJsZSAgRm9vOjp4OyAgICAvKiB4IGluIGNsYXNzIEZvbyAqLwoKICAgICAgICAgICAgSW4gZmFjdCwgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSBpcyB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZSwgCiAgICAgICAgICAgICVpZ25vcmUsIGFuZCBvdGhlciBkaXJlY3RpdmVzLiAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGVjbGFyYXRpb24KICAgICAgCiAgICAgICAgICAgICAgICVpbW11dGFibGUgIEZvbzo6eDsKCiAgICAgICAgICAgIHdvdWxkIG5vdCBvbmx5IGFwcGx5IHRvIGNsYXNzIEZvbyBidXQgdG8gYWxsIGRlcml2ZWQgY2xhc3NlcwogICAgICAgICAgICBhcyB3ZWxsLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgICVpbW11dGFibGUgYW5kICVtdXRhYmxlIG11c3QgYmUgdGVybWluYXRlZCBieSBhIHNlbWktY29sb24uICBUaGlzCiAgICAgICAgICAgIGRpZmZlcnMgc2xpZ2h0bHkgZnJvbSB0aGUgb2xkZXIgJXJlYWRvbmx5IGFuZCAlcmVhZHdyaXRlIGRpcmVjdGl2ZXMuCiAgICAgICAgICAgIFNpbmNlICVpbW11dGFibGUgYW5kICVtdXRhYmxlIGNhbiBiZSBhcHBsaWVkIHRvIGRlY2xhcmF0aW9ucyB0aGUKICAgICAgICAgICAgc2VtaWNvbG9uIGlzIG5lZWRlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgZ2xvYmFsIGZlYXR1cmUgYW5kIAogICAgICAgICAgICBvbmUgdGFyZ2V0ZWQgdG8gYSBzaW5nbGUgZGVjbGFyYXRpb24uICBOb3RlOiB0aGlzIGluY29tcGF0aWJpbGl0eSBpcyB0aGUKICAgICAgICAgICAgcHJpbWFyeSByZWFzb24gZm9yIGNoYW5naW5nIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RpdmUuCgowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIE5ldyBoYW5kbGluZyBvZiBjb3B5IGNvbnN0cnVjdG9ycy4gIElmIGEgY2xhc3MgZGVmaW5lcyAKICAgICAgICAgICAgY29uc3RydWN0b3JzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgRm9vKCk7CiAgICAgICAgICAgICAgICAgICAgICBGb28oY29uc3QgRm9vICYpOyAgICAgICAvLyBDb3B5IGNvbnN0cnVjdG9yCiAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgYSBmdW5jdGlvbiBjb3B5X0ZvbygpIGZvciB0aGUgY29weQogICAgICAgICAgICBjb25zdHJ1Y3Rvci4KCiAgICAgICAgICAgIEluIHByZXZpb3VzIHZlcmlvbnMsIHRoaXMgZ2VuZXJhdGVkIGEgbmFtZS1jbGFzaCBhbmQgYW4KICAgICAgICAgICAgZXJyb3IgbWVzc2FnZS4gICBUbyBwcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgU1dJRwogICAgICAgICAgICBkb2VzIG5vdCBjaGFuZ2UgdGhlIGJlaGF2aW9yIGlmICVyZW5hbWUgaXMgdXNlZCB0byByZXNvbHZlCiAgICAgICAgICAgIHRoZSBuYW1lIGNvbmZsaWN0LiAgIEhvd2V2ZXIsIGlmIG5vIG5hbWUgcmVzb2x1dGlvbiBpcyBtYWRlLAogICAgICAgICAgICB0aGlzIG5ldyBhcHByb2FjaCBpcyB1c2VkLgoKICAgICAgICAgICAgQ29weSBjb25zdHJ1Y3RvcnMgbWF5IGJlIGhhbmRsZWQgYXMgYSBzcGVjaWFsIGNhc2UgaW4gdGhlCiAgICAgICAgICAgIHRhcmdldCBsYW5ndWFnZS4gIEhvd2V2ZXIsIHRoaXMgaXMgdXAgdG8gdGhlIGxhbmd1YWdlIG1vZHVsZQogICAgICAgICAgICBpdHNlbGYuCiAgICAgICAgICAgICAgICAgIAowNC8wNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFRoZSAldGVtcGxhdGUgZGlyZWN0aXZlIGlzIG5vdyBuYW1lc3BhY2UgYXdhcmUuICAgVGhpcyBhbGxvd3MKICAgICAgICAgICAgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGZvbyB7CiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gbWF4KFQgYSwgVCBiKSB7IHJldHVybiBhID4gYiA/IGEgOiBiOyB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIGZvbzsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAgIC8vIE9rCgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIGJhciB7CiAgICAgICAgICAgICAgICAgICB1c2luZyBmb286Om1heDsKICAgICAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhkb3VibGUpIG1heDxkb3VibGU+OyAgIC8vIE9rCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBDYXZlYXQ6IHRoZSB0ZW1wbGF0ZSBuYW1lIHN1cHBsaWVkIHRvICV0ZW1wbGF0ZSBtdXN0IGJlIGRlZmluZWQgaW4gdGhlCiAgICAgICAgICAgIHNhbWUgc2NvcGUgaW4gd2hpY2ggdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgYXBwZWFycy4gICBUaGlzIGNvZGUgaXMKICAgICAgICAgICAgaWxsZWdhbDoKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUobWF4aW50KSBmb286Om1heDxpbnQ+OwoKMDQvMDcvMjAwMjogYmVhemxleQogICAgICAgICAgICBNaW5vciBlbmhhbmNlbWVudCB0byBwcmVwcm9jZXNzb3IuICAgVGhlIHByZXByb2Nlc3NvciBjYW4gbm93IHBlcmZvcm0KICAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24uICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAjZGVmaW5lIEEgImhlbGxvIgogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgI2lmIEEgPT0gImhlbGxvIgogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBUaGUgcHJpbWFyeSB1c2Ugb2YgdGhpcyBpcyBpbiBTV0lHIG1hY3Jvcy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlZGVmaW5lIEZPTyh4KSAKICAgICAgICAgICAgICAjaWYgI3ggPT0gImludCIKICAgICAgICAgICAgICAvKiBTcGVjaWFsIGhhbmRsaW5nIGZvciBpbnQgKi8KICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgICBOb3JtYWwgdXNlcnMgY2FuIHByb2JhYmx5IHNhZmVseSBpZ25vcmUgdGhpcyBmZWF0dXJlLiAgSG93ZXZlciwgaXQgbWF5CiAgICAgICAgICAgIGJlIHVzZWQgaW4gcGFydHMgb2YgdGhlIFNXSUcgbGlicmFyeS4KCjA0LzA3LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRnVydGhlciByZWZpbmVtZW50IG9mIGRlZmF1bHQgY29uc3RydWN0b3IvZGVzdHJ1Y3RvciB3cmFwcGVyIGdlbmVyYXRpb24uCiAgICAgICAgICAgIFNXSUcgaXMgbm93IG11Y2ggbW9yZSBhd2FyZSBvZiBwdXJlIHZpcnR1YWwgbWV0aG9kcy4gRm9yIGluc3RhbmNlOgoKICAgICAgICAgICAgICBjbGFzcyBBIHsgICAgICAgICAgICAgLyogQWJzdHJhY3QgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDEoKSA9IDA7CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDIoKSA9IDA7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICBjbGFzcyBCIDogcHVibGljIEEgeyAgLyogQWJzdHJhY3QgKi8KICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIG1ldGhvZDEoKSB7IH07CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgY2xhc3MgQyA6IHB1YmxpYyBCIHsgIC8qIE9rICovCiAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBtZXRob2QyKCkgeyB9OwogICAgICAgICAgICAgIH07CgogICAgICAgICAgICBJbiB0aGlzIGNhc2UsIFNXSUcgd2lsbCBvbmx5IGdlbmVyYXRlIGRlZmF1bHQgY29uc3RydWN0b3JzIGZvciBDLgogICAgICAgICAgICBFdmVuIHRob3VnaCBCIGxvb2tzIGZpbmUsIGl0J3MgbWlzc2luZyBhIHJlcXVpcmVkIG1ldGhvZCBhbmQgaXMgYWJzdHJhY3QuCgowNC8wNC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFN1YnRsZSBjaGFuZ2UgdG8gc3RydWN0dXJlIGRhdGEgbWVtYmVyIGFjY2Vzcy4gIElmIHlvdQogICAgICAgICAgICBoYXZlIGEgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgICBCYXIgICBiOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIGIgYXJlIGdlbmVyYXRlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgKDEpIElmIGIgaXMgKm5vdCogZGVmaW5lZCBhcyBhIHN0cnVjdHVyZSBvciBjbGFzczoKCiAgICAgICAgICAgICAgICBCYXIgRm9vX2JfZ2V0KEZvbyAqc2VsZikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLT5iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdm9pZCBGb29fYl9zZXQoRm9vICpzZWxmLCBCYXIgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmLT5iID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAoMikgSWYgYiAqaXMqIGRlZmluZWQgYXMgYSBzdHJ1Y3R1cmUgb3IgY2xhc3M6CgogICAgICAgICAgICAgICAgQmFyICpGb29fYl9nZXQoRm9vICpzZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICZzZWxmLT5iOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdm9pZCBGb29fYl9zZXQoRm9vICpzZWxmLCBCYXIgKnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZi0+YiA9ICp2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgU2VlIHRoZSAiU3RydWN0dXJlIGRhdGEgbWVtYmVycyIgc2VjdGlvbiBvZiBEb2MvTWFudWFsL1NXSUcuaHRtbAogICAgICAgICAgICBmb3IgZnVydGhlciBkZXRhaWxzLgoKICAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICAgIFRoaXMgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdCByZWxpZWQgb24gYSBsb3Qgb2YgYSB1bmRlY2xhcmVkCiAgICAgICAgICAgIHN0cnVjdHVyZSBhbmQgY2xhc3MgbmFtZXMuICAgIFRvIGdldCB0aGUgb2xkIGJlaGF2aW9yLCBzaW1wbHkKICAgICAgICAgICAgdXNlIGEgZm9yd2FyZCBkZWNsYXJhdGlvbiBzdWNoIGFzICJzdHJ1Y3QgQmFyOyIKICAgICAgICAgICAgCjA0LzA0LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQysrIG5hbWVzcGFjZSBzdXBwb3J0IGFkZGVkLiAgU1dJRyBzdXBwb3J0cyBhbGwgYXNwZWN0cyBvZgogICAgICAgICAgICBuYW1lc3BhY2VzIGluY2x1ZGluZyBuYW1lc3BhY2UsIHVzaW5nLCBhbmQgbmFtZXNwYWNlIGFsaWFzCiAgICAgICAgICAgIGRlY2xhcmF0aW9ucy4gICAgVGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgU1dJRyBpcyB0byBmbGF0dGVuCiAgICAgICAgICAgIG5hbWVzcGFjZXMgaW4gdGhlIHRhcmdldCBsYW5ndWFnZS4gIEhvd2V2ZXIsIG5hbWVzcGFjZXMgYXJlCiAgICAgICAgICAgIGZ1bGx5IHN1cHBvcnRlZCBhdCB0aGUgQysrIGxldmVsIGFuZCBpbiB0aGUgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAgIFNlZSBEb2MvTWFudWFsL1NXSUdQbHVzLmh0bWwgZm9yIGRldGFpbHMgb24gdGhlIGltcGxlbWVudGF0aW9uLgogICAgIAowNC8wMi8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIFN1biBoYXMgbW9kaWZpZWQgamF2YWMgaW4gamRrMS40IHRvIG5vIGxvbmdlciBjb21waWxlCiAgICAgICAgICAgIGFuIGltcG9ydCBvZiBhbiB1bm5hbWVkIG5hbWVzcGFjZS4gVG8gZml4IHRoaXMgU1dJRyBubyBsb25nZXIgCiAgICAgICAgICAgIGdlbmVyYXRlcyB0aGUgaW1wb3J0IGZvciBwYWNrYWdlbGVzcyBjbGFzc2VzLgogICAgICAgICAgICBodHRwOi8vZGV2ZWxvcGVyLmphdmEuc3VuLmNvbS9kZXZlbG9wZXIvYnVnUGFyYWRlL2J1Z3MvNDM2MTU3NS5odG1sCiAgICAgICAgICAgIEFzIHJlcG9ydGVkIFNGICM1Mzg0MTUuCgowMy8yNy8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgc3VwcG9ydCBmb3IgcG9pbnRlci10by1tZW1iZXIsIHNpbWlsYXIgdG8gdGhhdAogICAgICAgICAgICBmb3IgdGhlIFB5dGhvbiBtb2R1bGUuIFJlbWFya2FibHkgc2ltaWxhci4gQWxzbyBhZGRlZCBhIG5ldwogICAgICAgICAgICBleGFtcGxlIGZvciB0aGlzIChFeGFtcGxlcy9ydWJ5L21wb2ludGVyKSwgd2hpY2ggaXMgcmVtYXJrYWJseQogICAgICAgICAgICBzaW1pbGFyIHRvIHRoZSBQeXRob24gZXhhbXBsZSBvZiB0aGUgc2FtZSBuYW1lLgoKMDMvMjYvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIE1hZGUgYSBmZXcgbWlub3IgZWRpdHMgdG8gdGhlICJBZHZhbmNlZCBUb3BpY3MiCiAgICAgICAgICAgIGNoYXB0ZXIgb2YgdGhlIFNXSUcgbWFudWFsIGFuZCBhZGRlZCBhIG5ldyBtYWpvciBzZWN0aW9uCiAgICAgICAgICAgIGFib3V0IGhvdyB0byBjcmVhdGUgbXVsdGktbW9kdWxlIFJ1YnkgcGFja2FnZXMgd2l0aCBTV0lHLgoKMDMvMjYvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIFJlbW92ZWQgYWxsIG9mIHRoZSBvbGQgUnVieSBwcmFnbWFzLiBJZiBhbnkgb2YgdGhpcwogICAgICAgICAgICBmdW5jdGlvbmFsaXR5IGlzIHRydWx5IG1pc3NlZCB3ZSBjYW4gcmVzdXJyZWN0IGl0LCBwcmVmZXJhYmx5CiAgICAgICAgICAgIHdpdGggc29tZSBraW5kIG9mIGZlYXR1cmUtYmFzZWQgZGlyZWN0aXZlLgogICAgICAgICAgICAKMDMvMjUvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEZpeGVkIFNXSUcgZXhjZXB0aW9uIGxpYnJhcnkgc3VwcG9ydCBmb3IgUnVieSwgd2hpY2gKICAgICAgICAgICAgaGFzIGFwcGFyZW50bHkgYmVlbiBicm9rZW4gZm9yIHNvbWUgdGltZS4gTHVja2lseSwgbm8gb25lIHNlZW1zCiAgICAgICAgICAgIHRvIGhhdmUgbm90aWNlZC4KCjAzLzIzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgQysrLW5hbWVzcGFjZSBzdXBwb3J0IGluIFNXSUcgZGlyZWN0aXZlcy4KCiAgICAgICAgICAgICVhZGRtZXRob2RzOiAKCiAgICAgICAgICAgIFRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUgbm93IGFjY2VwdHMgYSBmdWxseSBxdWFsaWZpZWQgY2xhc3NuYW1lCiAgICAgICAgICAgIGFuZCBjYW4gYmUgdXNlZCBpbnNpZGUgQysrIG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgLy8gQXR0YWNoZXMgdG8gdGhlIGNsYXNzIEZvbzo6QmFyIGJlbG93CiAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgRm9vOjpCYXIgewogICAgICAgICAgICAgICAgICAgICBpbnQgc29tZW1ldGhvZCgpIHsgLi4uIH0KICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgICBuYW1lc3BhY2UgRm9vIHsKICAgICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgewogICAgICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyBBdHRhY2hlcyB0byB0aGUgY2xhc3MgQmFyIGFib3ZlCiAgICAgICAgICAgICAgICAgICAgJWFkZG1ldGhvZHMgQmFyIHsKICAgICAgICAgICAgICAgICAgICAgIGludCBvdGhlcm1ldGhvZCgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICVmZWF0dXJlLCAlcmVuYW1lLCAlaWdub3JlLCAlZXhjZXB0aW9uLCBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzOgoKICAgICAgICAgICAgTmFtZXNwYWNlcyBhcmUgZnVsbHkgaW50ZWdyYXRlZCBpbnRvIHRoZSByZW5hbWluZyBhbmQgZGVjbGFyYXRpb24KICAgICAgICAgICAgbWF0Y2hlci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIEZvbzo6cHJpbnQ7ICAgICAgICAgIC8vIFJlbmFtZSBpbiBuYW1lc3BhY2UgRm9vCiAgICAgICAgICAgICAgICAgJWlnbm9yZSBGb286OkJhcjo6YmxhaDsgICAgICAgICAgICAgICAvLyBJZ25vcmUgYSBkZWNsYXJhdGlvbgoKICAgICAgICAgICAgJXJlbmFtZSBkaXJlY3RpdmVzIGNhbiBiZSBwbGFjZWQgaW5zaWRlIG5hbWVzcGFjZSBibG9ja3MgYXMgd2VsbC4gRm9yCiAgICAgICAgICAgIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgbmFtZXNwYWNlIEZvbyB7CiAgICAgICAgICAgICAgICAgICAlcmVuYW1lKGRpc3BsYXkpIHByaW50OyAgICAgICAgIC8vIEFwcGxpZXMgdG8gcHJpbnQgYmVsb3cKCiAgICAgICAgICAgICAgICAgICB2b2lkIHByaW50KCk7CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgTW9zdCBvdGhlciBTV0lHIGRpcmVjdGl2ZXMgc2hvdWxkIHdvcmsgcHJvcGVybHkgaW5zaWRlIG5hbWVzcGFjZXMuCiAgICAgICAgICAgIE5vIG90aGVyIGNoYW5nZXMgYXJlIG5lZWRlZC4KICAgICAgCjAzLzIyLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgU29tZSBjaGFuZ2VzIHRvIGludGVybmFsIHN5bWJvbCB0YWJsZSBoYW5kbGluZy4gICBTV0lHIG5vIGxvbmdlcgogICAgICAgICAgICBtYW5hZ2VzIHN0cnVjdHVyZXMgYW5kIHVuaW9ucyBpbiBhIHNlcGFyYXRlIG5hbWVzcGFjZSB0aGFuIG5vcm1hbAogICAgICAgICAgICBkZWNsYXJhdGlvbnMgbGlrZSBBTlNJIEMuICBUaGlzIG1lYW5zIHlvdSBjYW4ndCBoYXZlIGEgc3RydWN0dXJlCiAgICAgICAgICAgIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGludCBGb28oKSB7IC4uLiB9CgogICAgICAgICAgICBUaGlzIGFwcHJvYWNoIGlzIG1vcmUgbGlrZSBDKysuICAgSXQncyBub3QgY2xlYXIgdGhhdCBTV0lHIGV2ZXIKICAgICAgICAgICAgcmVhbGx5IHN1cHBvcnRlZCB0aGUgQU5TSSBDIGFueXdheXMtLS11c2luZyB0aGUgc2FtZSBuYW1lIHdvdWxkCiAgICAgICAgICAgIGFsbW9zdCBjZXJ0YWlubHkgZ2VuZXJhdGUgYSBuYW1lLWNsYXNoIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgowMy8yMi8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gRml4ZWQgWyA1MTczMDIgXSBmb3IgaGFuZGxpbmcgb2YgcmVuYW1lZCBvdmVybG9hZGVkCiAgICAgICAgICAgIGNvbnN0cnVjdG9ycy4gTm93LCByZW5hbWVkIG92ZXJsb2FkZWQgY29uc3RydWN0b3JzIGFyZSBjb252ZXJ0ZWQKICAgICAgICAgICAgaW50byBjbGFzcyBzaW5nbGV0b24gbWV0aG9kcyAoYmFzaWNhbGx5IGFjdGluZyBhcyAiZmFjdG9yeSIKICAgICAgICAgICAgbWV0aG9kcykuCgowMy8yMS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFsgNTMyOTU3IF0gJWlnbm9yZSBwYXJzZSBlcnJvciBhbmQgY2FzdGluZyBvcGVyYXRvci4KICAgICAgICAgICAgUmVwb3J0ZWQgYnkgV2lsbGlhbSBGdWx0b24uCgowMy8xOC8yMDAyOiBiZWF6bGV5ICgqKiBBRFZBTkNFRCBVU0VSUyBPTkxZICoqKQogICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBkeW5hbWljIGNhc3RpbmcgaW4gcmV0dXJuIHZhbHVlcy4gIEEgc29tZXdoYXQKICAgICAgICAgICAgY29tbW9uIHByb2JsZW0gaW4gY2VydGFpbiBDKysgcHJvZ3JhbXMgaXMgZnVuY3Rpb25zIHRoYXQgaGlkZQogICAgICAgICAgICB0aGUgaWRlbnRpdHkgb2YgdW5kZXJseWluZyBvYmplY3RzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgCiAgICAgICAgICAgIGZyb20gbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAgRm9yIGV4YW1wbGUsIGEgcHJvZ3JhbSBtaWdodCBpbmNsdWRlCiAgICAgICAgICAgIHNvbWUgZ2VuZXJpYyBtZXRob2QgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgIE5vZGUgKmdldE5vZGUoKTsKCiAgICAgICAgICAgIEhvd2V2ZXIsIE5vZGUgKiBtYXkganVzdCBiZSBiYXNlIGNsYXNzIHRvIGEgd2hvbGUgaGllcmFyY2h5CiAgICAgICAgICAgIG9mIGRpZmZlcmVudCBvYmplY3RzLiAgIEluc3RlYWQgb2YgcmV0dXJuaW5nIHRoaXMgZ2VuZXJpYyBOb2RlICosCiAgICAgICAgICAgIGl0IG1pZ2h0IGJlIG5pY2UgdG8gYXV0b21hdGljYWxseSBkb3duY2FzdCB0aGUgb2JqZWN0IGludG8gdGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHR5cGUgdXNpbmcgc29tZSBraW5kIGR5bmFtaWMgY2FzdC4KCiAgICAgICAgICAgIEFzc3VtaW5nIHlvdSB1bmRlcnN0YW5kIHRoZSBwZXJpbCBpbnZvbHZlZCwgYSBkb3duY2FzdCBjYW4gbm93CiAgICAgICAgICAgIGJlIHBlcmZvcm1lZCB1c2luZyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uIGluIHRoZSBydW4tdGltZSB0eXBlCiAgICAgICAgICAgIGNoZWNrZXI6CgogICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICpTV0lHX1R5cGVEeW5hbWljQ2FzdChzd2lnX3R5cGVfaW5mbyAqLCB2b2lkICoqcHRyKTsKCiAgICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgdHlwZSBjYW4gYmUgY29udmVydGVkIHRvIGFub3RoZXIKICAgICAgICAgICAgdHlwZS4gIElmIHNvLCBhIGRpZmZlcmVudCB0eXBlIGRlc2NyaXB0b3IgKGZvciB0aGUgY29udmVydGVkIHR5cGUpCiAgICAgICAgICAgIGlzIHJldHVybmVkLiAgIFRoaXMgdHlwZSBkZXNjcmlwdG9yIHdvdWxkIHRoZW4gYmUgdXNlZCB0byBjcmVhdGUKICAgICAgICAgICAgYSBwb2ludGVyIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCgogICAgICAgICAgICBUbyB1c2UgdGhpcywgeW91IHdvdWxkIHdyaXRlIGEgdHlwZW1hcCBzaW1pbGFyIHRvIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqIHsKICAgICAgICAgICAgICAgIHN3aWdfdHlwZV9pbmZvICp0eSA9IFNXSUdfVHlwZUR5bmFtaWNDYXN0KCQxX2Rlc2NyaXB0b3IsICh2b2lkICoqKSAmJDEpOwogICAgICAgICAgICAgICAgJHJlc3VsdCA9IFNXSUdfTmV3UG9pbnRlck9iaigkMSwgdHkpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEFsdGVybmF0aXZlbHksCgogICAgICAgICAgICAgICV0eXBlbWFwKG91dCkgTm9kZSAqID0gU1dJR1RZUEUgKkRZTkFNSUM7CgogICAgICAgICAgICBUbyBtYWtlIHRoZSB0eXBlbWFwIGhhdmUgYW55IGVmZmVjdCwgeW91IGhhdmUgdG8gd3JpdGUgYSBzdXBwb3J0aW5nIAogICAgICAgICAgICBmdW5jdGlvbiB0aGF0IGtub3dzIGhvdyB0byBwZXJmb3JtIGRvd25jYXN0aW5nLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICBzdGF0aWMgc3dpZ190eXBlX2luZm8gKgogICAgICAgICAgICAgIE5vZGVfZHluYW1pY19jYXN0KHZvaWQgKipwdHIpIHsKICAgICAgICAgICAgICAgICBOb2RlICoqbnB0ciA9IChOb2RlICoqKSBwdHI7CiAgICAgICAgICAgICAgICAgRWxlbWVudCAqZSA9IGR5bmFtaWNfY2FzdDxFbGVtZW50ICo+KCpucHRyKTsKICAgICAgICAgICAgICAgICBpZiAoZSkgewogICAgICAgICAgICAgICAgICAgICpwdHIgPSAodm9pZCAqKSBlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBTV0lHVFlQRV9wX0VsZW1lbnQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIERhdGEgKmQgPSBkeW5hbWljX2Nhc3Q8RGF0YSAqPigqbnB0cik7CiAgICAgICAgICAgICAgICAgaWYgKGQpIHsKICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHZvaWQgKikgZDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1dJR1RZUEVfcF9EYXRhOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgIFRoZXJlIGlzIG5vIHJlc3RyaWN0aW9uIG9uIGhvdyB0eXBlcyBhcmUgZGV0ZXJtaW5lZC4gZHluYW1pY19jYXN0PD4KICAgICAgICAgICAgdXNlcyBDKysgUlRUSS4gIEhvd2V2ZXIsIGlmIHlvdSBoYWQgc29tZSBvdGhlciBtZWNoYW5pc20gZm9yIGRldGVybWluaW5nCiAgICAgICAgICAgIHRoZSB0eXBlLCB5b3UgY291bGQgdXNlIHRoYXQgaGVyZS4gIE5vdGU6IGl0IGlzIGltcG9ydGFudCB0byBzYXZlCiAgICAgICAgICAgIHRoZSBuZXcgcG9pbnRlciB2YWx1ZSBiYWNrIGludG8gdGhlIGFyZ3VtZW50IGFzIHNob3duLiAgV2hlbiBkb3duY2FzdGluZywKICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIGNvdWxkIGNoYW5nZS4gCgogICAgICAgICAgICBGaW5hbGx5LCB0byBtYWtlIHRoZSBjYXN0aW5nIGZ1bmN0aW9uIGF2YWlsYWJsZSwgeW91IGhhdmUgdG8gcmVnaXN0ZXIKICAgICAgICAgICAgaXQgd2l0aCB0aGUgcnVuLXRpbWUgdHlwZSBjaGVja2VyLiBQdXQgdGhpcyBtYWNybyBpbiB5b3VyIGludGVyZmFjZSBmaWxlLgoKICAgICAgICAgICAgICAgRFlOQU1JQ19DQVNUKFNXSUdUWVBFX3BfTm9kZSwgTm9kZV9keW5hbWljX2Nhc3QpOwoKICAgICAgICAgICAgTm90ZTogdGhpcyBmZWF0dXJlIGRvZXMgbm90IGludHJvZHVjZSBhIHBlcmZvcm1hbmNlIHBlbmFsdHkgb24gCiAgICAgICAgICAgIG5vcm1hbCBTV0lHIG9wZXJhdGlvbi4gIFRoZSBmZWF0dXJlIGlzIG9ubHkgZW5hYmxlZCBieSB3cml0aW5nCiAgICAgICAgICAgIGEgbmV3IHR5cGVtYXAgdGhhdCBleHBsaWNpdGx5IGNhbGxzIFNXSUdfVHlwZUR5bmFtaWNDYXN0KCkgdG8KICAgICAgICAgICAgbWFrZSBhIGNvbnZlcnNpb24uIAogIAogICAgICAgICAgICBFeGFtcGxlcy90ZXN0LXN1aXRlL2R5bmFtaWNfY2FzdC5pIGNvbnRhaW5zIGEgc2ltcGxlIGV4YW1wbGUuCiAgICAgICAgICAgIFRoaXMgZmVhdHVyZSBpcyBub3Qgc3VwcG9ydGVkIGluIHRoZSBKYXZhIG1vZHVsZSBkdWUgdG8gZGlmZmVyZW5jZXMKICAgICAgICAgICAgaW4gdGhlIHR5cGUtY2hlY2tpbmcgaW1wbGVtZW50YXRpb24uCgogICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIEZFQVRVUkUgKioqCgowMy8xNy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNtYWxsIGNoYW5nZSB0byB0eXBlLW5hbWUgaGFuZGxpbmcgb2YgdW5uYW1lZCBzdHJ1Y3R1cmVzIGFuZAogICAgICAgICAgICB0eXBlZGVmLiAgSWYgYSBzdHJ1Y3R1cmUgb2YgdGhpcyBmb3JtIGFwcGVhcnM6CgogICAgICAgICAgICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgIH0gRm9vOwoKICAgICAgICAgICAgVGhlbiAnRm9vJyBpcyB1c2VkIGFzIHRoZSBwcm9wZXIgdHlwZW5hbWUgZm9yIHRoZSBzdHJ1Y3R1cmUuCiAgICAgICAgICAgIEZ1cnRoZXJtb3JlLCBGb28gY2FuIG5vdyBiZSB1c2VkIGFzIGEgbmFtZSBpbiBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIFNXSUcgd2FzIGFscmVhZHkga2luZCBvZiBkb2luZyB0aGlzLCBidXQgdGhpcyBtb2RpZmljYXRpb24gcmVmaW5lcwogICAgICAgICAgICB0aGUgaW1wbGVtZW50YXRpb24gdG8gbW9yZSBjbG9zZWx5IGZvbGxvdyB0aGUgQysrIEFSTSwgc2VjdGlvbgogICAgICAgICAgICA3LjEuMywgcC4gMTA2LiAgVGhpcyBmaXhlcyBhIGNvdXBsZSBvZiBvYnNjdXJlIGNvcm5lciBjYXNlcy4KCjAzLzE2LzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgTW9kaWZpZWQgQysrIGluaGVyaXRhbmNlIHdpdGggYSBmZXcgZW5oYW5jZW1lbnRzLiAgRmlyc3QsIHR5cGUgaW5mb3JtYXRpb24KICAgICAgICAgICAgbmVlZGVkIGZvciBjYXN0aW5nIGFuZCB0eXBlLWVxdWl2YWxlbmNlIGlzIGdlbmVyYXRlZCBldmVuIHdoZW4gYmFzZS1jbGFzc2VzCiAgICAgICAgICAgIGFyZW4ndCBkZWZpbmVkIGluIHRoZSBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBjbGFzcyBGb28gOiBwdWJsaWMgQmFyICB7ICAgIC8qIEJhciB1bnNwZWNpZmllZCAqLwogICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICB2b2lkIGJsYWgoQmFyICpiKTsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJsYWgoKSBmdW5jdGlvbiBzdGlsbCBhY2NlcHRzIEZvbyAqIGV2ZW4gdGhvdWdoIG5vdGhpbmcKICAgICAgICAgICAgaXMgcmVhbGx5IGtub3duIGFib3V0IEJhci4gICBQcmV2aW91cyBTV0lHIHZlcnNpb25zIHdvdWxkIGp1c3QgZ2VuZXJhdGUKICAgICAgICAgICAgYSB0eXBlIGVycm9yLgoKICAgICAgICAgICAgSW5oZXJpdGFuY2UgaGFzIGFsc28gYmVlbiBtb2RpZmllZCB0byB3b3JrIHRocm91Z2ggdHlwZWRlZi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICAgIHR5cGVkZWYgQmFyIE90aGVyQmFyOwogICAgICAgICAgICAgICBjbGFzcyBGb286IHB1YmxpYyBPdGhlckJhciB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIGJhc2UgY2xhc3Mgb2YgT3RoZXJCYXIgaXMgY29ycmVjdGx5IHJlc29sdmVkIGJhY2sgdG8KICAgICAgICAgICAgQmFyLiAgIFRoZSB1c2Ugb2YgdGhlIG5hbWUgT3RoZXJCYXIgaXMgbG9zdCBpbiB0aGlzIHJlc29sdXRpb24gKHRoZSB3cmFwcGVycwogICAgICAgICAgICB3aWxsIHNpbXBseSB1c2UgQmFyIGluc3RlYWQgb2YgdGhlIHR5cGVkZWYgbmFtZSBPdGhlckJhcikuCiAgICAgICAgICAgCjAzLzEzLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgJXR5cGVtYXAsICVhcHBseSwgYW5kIHJlbGF0ZWQgZGlyZWN0aXZlcyBjYW4gbm93IGFwcGVhciBpbnNpZGUKICAgICAgICAgICAgY2xhc3MgZGVmaW5pdGlvbnMuICAgCgowMy8xMy8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIGEgdmFyaWV0eSBvZiBwcm9ibGVtcyByZWxhdGVkIHRvIGNvbXBpbGluZyBTV0lHIG9uIDY0LWJpdAogICAgICAgICAgICBwbGF0Zm9ybXMuCgowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCAiaWdub3JlIiBhbmQgImluIiB0eXBlbWFwcy4gIExvY2FsIHZhcmlhYmxlcwogICAgICAgICAgICBhc3NvY2lhdGVkIHdpdGggImluIiB3ZXJlIGJlaW5nIGFkZGVkIHRvIHRoZSB3cmFwcGVyIGZ1bmN0aW9uIGV2ZW4KICAgICAgICAgICAgdGhvdWdoIHRoZXkgd2VyZSBuZXZlciB1c2VkLiAgIE1vc3RseSBoYXJtbGVzcywgYnV0IGl0IHdvdWxkIGxlYWQKICAgICAgICAgICAgdG8gYSB2YXJpZXR5IG9mIGNvbXBpbGF0aW9uIHdhcm5pbmdzLgogIAowMy8xMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFNvbWUgY2hhbmdlcyB0byB0aGUgaW50ZXJuYWwgdHlwZSBzeXN0ZW0gYW5kIGhhbmRsaW5nIG9mIG5lc3RlZCBDKysKICAgICAgICAgICAgdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgaWYgeW91IGhhZCB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgaW50IEJsYWg7CiAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICBjbGFzcyBCYXIgOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzb21lbWV0aG9kKEJsYWggeCk7CiAgICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIFRoZSBhcmd1bWVudCB0eXBlIGluIHNvbWVtZXRob2QoKSB3b3VsZCBpbXBsaWNpdGx5IGJlIHNldCB0byBCYXI6OkJsYWguCiAgICAgICAgICAgIEFsdGhvdWdoIHRoaXMgaXMgdGVjaG5pY2FsbHkgYWxsb3dlZCwgaXQgYnJlYWtzIHR5cGVtYXBzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBGb286OkJsYWggeyAuLi4gfQoKICAgICAgICAgICAgZG9lc24ndCBtYXRjaCBsaWtlIHlvdSBleHBlY3QuICAgVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIGluIFNXSUctMS4zLjEyLgogICAgICAgICAgICBOb3csIHR5cGVzIGFyZSBleHBhbmRlZCB1c2luZyB0aGUgY2xhc3MgaW4gd2hpY2ggdGhleSB3ZXJlIGRlZmluZWQuCiAgICAgICAgICAgIFNvLCB0aGUgYXJndW1lbnQgdHlwZSBpbiBzb21lbWV0aG9kKCkgd2lsbCBiZSBGb286OkJsYWgtLS1zaW5jZSB0aGUKICAgICAgICAgICAgdHlwZSBCbGFoIHdhcyBkZWZpbmVkIGluIEZvby4KIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIHNvbWUgc3VidGxlIHR5cGUgc2NvcGluZyBwcm9ibGVtcyB3aXRoIHR5cGVkZWYgYW5kIEMrKyBjbGFzc2VzLgogICAgICAgICAgICBGb3IgZXhhbXBsZToKIAogICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgQmxhaDsKICAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiBkb3VibGUgQmxhaDsKICAgICAgICAgICAgICAgICAgICB2b2lkIGZvbyhCbGFoIHgsIDo6QmxhaCB5KTsKICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKMDMvMTAvMjAwMjogYmVhemxleQogICAgICAgICAgICBIaWdobHkgZXhwZXJpbWVudGFsIGNoYW5nZSB0byBoYW5kbGUgdmFyaWFibGUgbGVuZ3RoIGFyZ3VtZW50cy4KICAgICAgICAgICAgRmlyc3QsIHRoZXJlIGlzIG5vIHBvcnRhYmxlIG9yIHJlbGlhYmxlIHdheSB0byB3cmFwCiAgICAgICAgICAgIGEgdmFyYXJncyBmdW5jdGlvbiBpbiBmdWxsIGdlbmVyYWxpdHkuICBIb3dldmVyLCB5b3UgKmNhbiogY2hhbmdlCiAgICAgICAgICAgIHRoZSBmdW5jdGlvbiBzaWduYXR1cmUgdXNpbmcgJXZhcmFyZ3MuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICopIGZwcmludGY7CiAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB2b2lkIGZwcmludGYoRklMRSAqZiwgY2hhciAqZm10LCAuLi4pOwoKICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdmFyaWFibGUgbGVuZ3RoIHBhcmFtZXRlciAiLi4uIiBpcwogICAgICAgICAgICBzaW1wbHkgcmVwbGFjZWQgYnkgdGhlIHBhcmFtZXRlcnMgZ2l2ZW4gaW4gJXZhcmFyZ3MuIFRoaXMKICAgICAgICAgICAgcmVzdWx0cyBpbiBhIGZ1bmN0aW9uIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIHZvaWQgZnByaW50ZihGSUxFICpmLCBjaGFyICpmbXQsIGNoYXIgKnMpOwoKICAgICAgICAgICAgTW9yZSB0aGFuIG9uZSBhcmd1bWVudCBjYW4gYmUgdXNlZCBhbmQgZGVmYXVsdCB2YWx1ZXMKICAgICAgICAgICAgY2FuIGJlIGRlZmluZWQuICBGb3IgZXhhbXBsZSwgdGhpcyBjb2RlIHNwZWNpZmllcyBhCiAgICAgICAgICAgIG1heGltdW0gb2YgZm91ciBhcmd1bWVudHMuCgogICAgICAgICAgICAgICAldmFyYXJncyhjaGFyICp4MSA9IDAsIGNoYXIgKngyID0gMCwgY2hhciAqeDMgPSAwLCBjaGFyICp4NCA9IDApIGZwcmludGY7CiAKICAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBORVcgRkVBVFVSRSAqKioKIAowMy8xMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIENoYW5nZSB0byBoYW5kbGluZyBvZiB2YXJpYWJsZSBsZW5ndGggYXJndW1lbnRzLiAgdmFyYXJncwogICAgICAgICAgICBpcyBub3cgaGFuZGxlZCBhcyBhIHByb3BlciBwYXJhbWV0ZXIgYW5kIGlzIHBhc3NlZCB0byB0aGUKICAgICAgICAgICAgY29kZSBnZW5lcmF0b3IuICBIb3dldmVyLCBpdCBzdGlsbCBjYW4ndCBiZSBoYW5kbGVkIGNvcnJlY3RseQogICAgICAgICAgICAoYW5kIHdpbGwgZ2VuZXJhdGUgYSB0eXBlbWFwIHdhcm5pbmcpLiAgIFRoaXMgY2hhbmdlIGhhcyBiZWVuCiAgICAgICAgICAgIG1hZGUgdG8gYmV0dGVyIGluY29ycG9yYXRlIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMgd2l0aCBvdGhlcgogICAgICAgICAgICBkaXJlY3RpdmVzIHN1Y2ggYXMgJWlnbm9yZSwgJXJlbmFtZSwgJWZlYXR1cmUsIGFuZCBzbyBmb3J0aC4KCjAzLzEwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgRml4ZWQgWyA1MjI1NTUgXSBTeW50YXggZXJyb3IgcGFyc2luZyAiZGVmaW5lIiBjb25zdHJ1Y3QuIFNXSUcKICAgICAgICAgICAgaXMgYSBsaXR0bGUgbW9yZSByZXN0cmljdGl2ZSBpbiBkZXRlcm1pbmluZyAjZGVmaW5lIHN0YXRlbWVudHMKICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHdyYXBwZWQgYXMgY29uc3RhbnRzLiAgQWxzbyBhZGRlZCBhIGJldHRlciBwYXJzZXIKICAgICAgICAgICAgZXJyb3IgcnVsZSBmb3IgaGFuZGxpbmcgYmFkIGNvbnN0YW50cy4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gQnVnIGZpeDogQ2xhc3NlcyByZW5hbWVkIHdpdGggJXJlbmFtZSB0aGF0IGFyZSBkZXJpdmVkIGZyb20gCiAgICAgICAgICAgIGFub3RoZXIgY2xhc3MgZ2VuZXJhdGUgbW9yZSBhcHByb3ByaWF0ZSBzaGFkb3cgY2xhc3MgY29kZS4KCjAzLzA4LzIwMDI6IGNoZWV0YWggKFdpbGxpYW0gRnVsdG9uKQogICAgICAgICAgICBbSmF2YV0gRml4ZWQgU0YgWyAjNTIzNjMyIF0gYW5kIFsgIzUxMzMzNSBdIGJvdGggcmVwb3J0ZWQgYnkgSXNyYWVsIAogICAgICAgICAgICBUYW5uZXIuIFN1cHBvcnQgZm9yIHR5cGVzIHRoYXQgYXJlIHVzZWQgd2hpY2ggYXJlIGluIGEgdHlwZWRlZi4gVGhlCiAgICAgICAgICAgIGFwcHJvcHJpYXRlIHNoYWRvdyBjbGFzcyBuYW1lIGlzIGdlbmVyYXRlZC4gQWxzbyBnZW5lcmF0ZWQgY29ycmVjdAogICAgICAgICAgICBzaGFkb3cgY2xhc3NuYW1lIHdoZW4gYSB0ZW1wbGF0ZWQgY2xhc3MgaXMgdXNlZCB3aXRoaW4gYW5vdGhlciAKICAgICAgICAgICAgdGVtcGxhdGVkIGNsYXNzLiBTZWUgdGhlIGNwcF90eXBlZGVmLmkgdGVzdGNhc2UuCgowMy8wOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgW0phdmFdIEJ1ZyBmaXg6IE5vIHR5cGUgd2FzIGdlbmVyYXRlZCBpbiBzaGFkb3cgY2xhc3NlcyBmb3IgdHlwZXMgCiAgICAgICAgICAgIHRoYXQgd2VyZW4ndCB3cmFwcGVkIGJ5IFNXSUcuICBUaGUgdHlwZSBpcyB0cmVhdGVkIGFzIGEgcmF3IAogICAgICAgICAgICBwb2ludGVyLCBpZSBubyBzaGFkb3cgY2xhc3MuCgowMi8yMi8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIFJlZmluZWQgdGhlIG1hdGNoaW5nIGFsZ29yaXRobSB1c2VkIGJ5ICVyZW5hbWUsICVpZ25vcmUsIGFuZAogICAgICAgICAgICAlZmVhdHVyZS4gICBJZiBhIHR5cGUgc2lnbmF0dXJlIGlzIHN1cHBsaWVkLCBpdCBtdXN0IGV4YWN0bHkKICAgICAgICAgICAgbWF0Y2ggdGhhdCB1c2VkIGluIHRoZSBkZWNsYXJhdGlvbi0tLWluY2x1ZGluZyBhbnkgdXNlIG9mCiAgICAgICAgICAgIGNvbnN0LiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgJXJlbmFtZShmb28xKSAgIGZvbyhpbnQpOwogICAgICAgICAgICAgICAgJXJlbmFtZShiYXIxKSAgIGJhcihpbnQpIGNvbnN0OwoKICAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsgICAgICAgLy8gTWF0Y2hlZCAtLT4gZm9vMQogICAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KSBjb25zdDsgLy8gTm90IG1hdGNoZWQgCiAgICAgICAgICAgICAgICAgICAgICB2b2lkIGJhcihpbnQpOyAgICAgICAvLyBOb3QgbWF0Y2hlZAogICAgICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KSBjb25zdDsgLy8gTWF0Y2hlZCAtLT4gYmFyMQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgbm9uLWNvbnN0IHNwZWNpZmljYXRpb24gd291bGQgbWF0Y2gKICAgICAgICAgICAgYm90aCB0aGUgbm9uLWNvbnN0IGFuZCBjb25zdCBkZWNsYXJhdGlvbnMuICBIb3dldmVyLCB0aGUgd2hvbGUKICAgICAgICAgICAgcG9pbnQgb2YgJXJlbmFtZSBhbmQgcmVsYXRlZCBkaXJlY3RpdmVzIGlzIHRoYXQgdGhleSBiZSBhYmxlCiAgICAgICAgICAgIHRvIHByZWNpc2VseSBwaW5wb2ludCBleGFjdCBkZWNsYXJhdGlvbnMgaW4gYW4gaW50ZXJmYWNlLiAgVGhpcwogICAgICAgICAgICBmaXhlcyB0aGUgcHJvYmxlbS4KCjAyLzIxLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgUmV3b3JrZWQgdGhlIGhhbmRsaW5nIG9mIGRlZmF1bHQgY29uc3RydWN0b3IgYW5kIGRlc3RydWN0b3JzLgogICAgICAgICAgICBTV0lHIG5vdyBtYWtlcyBhIHByZWxpbWluYXJ5IHBhc3Mgb3ZlciB0aGUgcGFyc2UgdHJlZSB0byBkaXNjb3ZlcgogICAgICAgICAgICB3aGljaCBjbGFzc2VzIHN1cHBvcnQgZGVmYXVsdCBhbGxvY2F0aW9uLiAgIFRoaXMgZml4ZXMgYSBudW1iZXIKICAgICAgICAgICAgb2YgdmVyeSBzdWJ0bGUgaXNzdWVzIGluIGNvZGUgZ2VuZXJhdGlvbiBhbmQgY2FsbC9yZXR1cm4gYnkgdmFsdWUuCgowMi8xOC8yMDAyOiBjaGVldGFoIChXaWxsaWFtIEZ1bHRvbikKICAgICAgICAgICAgSW1wcm92ZWQgc3VwcG9ydCBvbiBDeWd3aW46IFBlcmwsIFB5dGhvbiwgVGNsLCBSdWJ5IGFuZCBKYXZhIHNob3VsZAogICAgICAgICAgICB3b3JrIG91dCBvZiB0aGUgYm94LCBiYXJyaW5nIHRoZSBydW50aW1lIGxpYnJhcnkuIFJlbW92ZWQgZGxsd3JhcCAKICAgICAgICAgICAgYW5kIHJlcGxhY2VkIHdpdGggbmV3bHkgd29ya2luZyBnY2MgLXNoYXJlZCBpbnN0ZWFkIGZvciBDeWd3aW4uIAogICAgICAgICAgICBBbGwgdGhpcyB3aWxsIHJlcXVpcmUgdGhlIG5ldyBpbXByb3ZlZCBiaW51dGlscyAyMDAxMDgwMiBhbmQgbGF0ZXIsCiAgICAgICAgICAgIGJ1dCB0aGUgbGF0ZXN0IEN5Z3dpbiBpcyB1c3VhbGx5IHRoZSBiZXN0IHJlY29tbWVuZGF0aW9uLgoKMDIvMTUvMjAwMjogYmVhemxleQogICAgICAgICAgICBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gd3JhcHBpbmcgb2YgZ2xvYmFsIHZhcmlhYmxlcwogICAgICAgICAgICBhbmQgUGVybCBzaGFkb3cgY2xhc3Nlcy4gUmVwb3J0ZWQgYnkgQ2hpYS1saWFuZyBLYW8uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFkZSBhIGZpeCB0byB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciBDKysgY2xhc3MKICAgICAgICAgICAgY29uc3RydWN0b3JzIHNvIHRoYXQgd2UgZ2V0IGJvdGggYSAibmV3IiBzaW5nbGV0b24gbWV0aG9kCiAgICAgICAgICAgIGFuZCBhbiAiaW5pdGlhbGl6ZSIgaW5zdGFuY2UgbWV0aG9kIGZvciBlYWNoIGNsYXNzLiBUaGlzCiAgICAgICAgICAgIGNoYW5nZSBlbmFibGVzIGRldmVsb3BlcnMgdG8gZGVyaXZlIG5ldyBSdWJ5IGNsYXNzZXMgZnJvbQogICAgICAgICAgICBTV0lHLXdyYXBwZWQgQysrIGNsYXNzZXMgYW5kIHRoZW4gb3ZlcnJpZGUgdGhlaXIgaW5pdGlhbGl6ZQogICAgICAgICAgICBtZXRob2RzIHRvIHByb3ZpZGUgc3ViY2xhc3Mtc3BlY2lmaWMgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24uCgowMi8xNS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gTWFzc2l2ZSBkb2N1bWVudGF0aW9uIHVwZGF0ZSBmb3IgdGhlIFJ1YnkgbW9kdWxlLAogICAgICAgICAgICBjb250cmlidXRlZCBieSBDcmFpZyBGaWxlcy4KCjAyLzE0LzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBCdWcgZml4OiBBbiBlcnJvciBpbiB0aGUgU1dJRyBydW50aW1lIHN1cHBvcnQgZm9yIFJ1YnkKICAgICAgICAgICAgd2FzIGNhdXNpbmcgc2V2ZXJhbCBvZiB0aGUgZXhhbXBsZXMgdG8gZmFpbC4gUmVwb3J0ZWQgYnkKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uCgowMi8xNC8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQnVnIGZpeDogRW51bWVyYXRpb25zIGRlZmluZWQgd2l0aGluIGEgY2xhc3MgKHN1Y2gKICAgICAgICAgICAgYXMgdGhvc2Ugc2VlbiBpbiB0aGUgRXhhbXBsZXMvcnVieS9lbnVtIGV4YW1wbGUpIHdlcmUgbm90CiAgICAgICAgICAgIGJlaW5nIGV4cG9ydGVkIHdpdGggdGhlIGNvcnJlY3QgbmFtZXMuIFJlcG9ydGVkIGJ5IFdpbGxpYW0KICAgICAgICAgICAgRnVsdG9uLgoKMDIvMTMvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIGEgd2FybmluZyBtZXNzYWdlIHdoZW4gd2UgcnVuIGFjcm9zcyBvdmVybG9hZGVkCiAgICAgICAgICAgIGNsYXNzIGNvbnN0cnVjdG9ycyBmb3IgQysrIGNvZGUsIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgbm90CiAgICAgICAgICAgIHN1cHBvcnRlZCAoZXZlbiBpZiB0aGUgb3ZlcmxvYWRzIGhhdmUgYmVlbiAlcmVuYW1lZCkuIEZvciBhbgogICAgICAgICAgICBleGFtcGxlIG9mIHdoZXJlIHRoaXMgZG9lc24ndCB3b3JrLCBzZWUgRXhhbXBsZXMvcnVieS9vcGVyYXRvci4KCjAyLzEzLzIwMDI6IGxqb2huc29uIChMeWxlIEpvaG5zb24pCiAgICAgICAgICAgIFtSdWJ5XSBBZGRlZCBhbiAiaWdub3JlZCIgd2FybmluZyBtZXNzYWdlIHdoZW4gdGhlIHBhcnNlciBydW5zCiAgICAgICAgICAgIGFjcm9zcyBhbiBvcGVyYXRvciE9KCkgZGVjbGFyYXRpb24gZm9yIEMrKyBjb2RlLgoKMDIvMTEvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgW1J1YnldIEFkZGVkIHRoZSAiaW1wb3J0IiwgImltcG9ydF90ZW1wbGF0ZSIsICJvcGVyYXRvciIgYW5kCiAgICAgICAgICAgICJ0ZW1wbGF0ZSIgZXhhbXBsZXMuCgowMi8xMS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgbXVsdGktbW9kdWxlIHN1cHBvcnQuCgowMi8wOS8yMDAyOiBsam9obnNvbiAoTHlsZSBKb2huc29uKQogICAgICAgICAgICBbUnVieV0gQWRkZWQgdGhlIG1pc3NpbmcgIiNkZWZpbmUgU1dJR19OT0lOQ0xVREUiIGF0IHRoZSB0b3Agb2YKICAgICAgICAgICAgdGhlIHdyYXBwZXIgY29kZSB3aGVuIHRoZSAnLWMnIG9wdGlvbiBpcyB1c2VkLgoKMDIvMDkvMjAwMjogbGpvaG5zb24gKEx5bGUgSm9obnNvbikKICAgICAgICAgICAgQ29ycmVjdGVkIGEgbWlub3Igb2ZmLWJ5LW9uZSBlcnJvciBmb3IgdGhlIHNpemUgb2YgdGhlCiAgICAgICAgICAgIHN3aWdfdHlwZXNbXSBhcnJheSB0aGF0J3MgZ2VuZXJhdGVkIGluIHRoZSB3cmFwcGVyIGNvZGUuCgowMi8wOC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeGVkIFNGIFsgIzUxNTA1OCBdIFdyb25nIGNvZGUgZm9yIEMrKyB0ZW1wbGF0ZXMuCiAgICAgICAgICAgIFJlcG9ydGVkIGJ5IElzcmFlbCBUYWxsZXIuCgpWZXJzaW9uIDEuMy4xMSAoSmFudWFyeSAzMSwgMjAwMikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgowMS8zMC8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgIEZpeCB0byBwYXNzL3JldHVybiBieSB2YWx1ZSBmb3IgQysrIG9iamVjdHMgdGhhdCBkZWZpbmUKICAgICAgICAgICAgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4gIENoYW5nZXMgdG8gdGhlIHR5cGVtYXAgc3lzdGVtCiAgICAgICAgICAgIG1hZGUgaXQgaW1wb3NzaWJsZSB0byB3cmFwIEMrKyBvYmplY3RzIHdpdGggbm8gZGVmYXVsdAogICAgICAgICAgICBjb25zdHJ1Y3Rvci4gICBUaGlzIGhhcyBiZWVuIGZpeGVkLCBidXQgdGhlIHNvbHV0aW9uIAogICAgICAgICAgICBpbnZvbHZlcyBzb21lIGNsZXZlciB0ZW1wbGF0ZSBtYWdpYyBjb250cmlidXRlZCBieSAKICAgICAgICAgICAgV2lsbGlhbSBGdWx0b24uICBQbGVhc2Ugc2VlIHRoZSBjb21tZW50cyBpbiB0aGUgZmlsZQogICAgICAgICAgICBMaWIvc3dpZy5zd2cgZm9yIGZ1cnRoZXIgZGV0YWlscy4gIFRoaXMgc29sdXRpb24gaXMKICAgICAgICAgICAgZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmVmaW5lZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgoKMDEvMzAvMjAwMjogYmVhemxleQogICAgICAgICAgICBHbG9iYWwgdmFyaWFibGVzIGFuZCBtZW1iZXIgZGF0YSBvZiB0eXBlICJjb25zdCBjaGFyICoiCiAgICAgICAgICAgIGNhbiBiZSBzZXQsIGJ1dCB0aGUgb2xkIHZhbHVlIGlzIHNpbGVudGx5IGRpc2NhcmRlZCB3aXRob3V0CiAgICAgICAgICAgIGFueSBnYXJiYWdlIGNvbGxlY3Rpb24uICAgVGhpcyBtYXkgZ2VuZXJhdGUgYSBtZW1vcnkgbGVhay4KICAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgbmVlZGVkIHRvIG1vcmUgc2FmZWx5IGhhbmRsZSB2YXJpYWJsZXMKICAgICAgICAgICAgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmZvbyA9ICJIZWxsbyBXb3JsZFxuIjsKCiAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgaXQncyBub3Qgc2FmZSB0byBmcmVlIHRoZSBvbGQgdmFsdWUuICBIb3dldmVyLAogICAgICAgICAgICBTV0lHIGNhbiBkeW5hbWljYWxseSBhbGxvY2F0ZSBhIG5ldyB2YWx1ZSBhbmQgbWFrZSBmb28gcG9pbnQKICAgICAgICAgICAgdG8gaXQuICAgVG8gZml4IHRoaXMgbWVtb3J5IGxlYWssIHlvdSBjYW4gcHJvYmFibHkgZG8gdGhpczoKCiAgICAgICAgICAgICAgICVjbGVhciBjb25zdCBjaGFyICpmb287CiAgICAgICAgICAgICAgICVhcHBseSBjaGFyICoge2NvbnN0IGNoYXIgKmZvb307CgogICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICAgCjAxLzMwLzIwMDI6IGJlYXpsZXkKICAgICAgICAgICAgVHdvIG1pbm9yIHR5cGVtYXAgZW5oYW5jZW1lbnRzIGhhdmUgYmVlbiBhZGRlZC4gIEZpcnN0LAogICAgICAgICAgICB0eXBlbWFwcyBjYW4gaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2UgYnkgaW5jbHVkaW5nIGEgc3BlY2lhbAogICAgICAgICAgICB3YXJuaW5nIGF0dHJpYnV0ZS4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoaW4sd2FybmluZz0iSSdtIGdvaW5nIHRvIGRvIHNvbWV0aGluZyBkYW5nZXJvdXMiKSAuLi4KCiAgICAgICAgICAgIFRoZSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBzaG93IHVwIHdoZW5ldmVyIHRoZSB0eXBlbWFwIGlzCiAgICAgICAgICAgIGFwcGxpZWQuCgogICAgICAgICAgICBTZWNvbmQsIGEgdHlwZW1hcCBjYW4gZm9yY2UgYSBuby1tYXRjaCBieSBkZWZpbmluZwoKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBzb21ldHlwZSAicGFzcyI7CgogICAgICAgICAgICBJZiB0aGlzIGlzIHVzZWQsIHRoZSB0eXBlbWFwIHN5c3RlbSB3aWxsICpub3QqIHJlY29yZCBhCiAgICAgICAgICAgIHR5cGVtYXAgbWF0Y2ggZm9yICJzb21ldHlwZSIuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBibG9jawogICAgICAgICAgICBzZWxlY3RlZCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvIGRpc2FibGUKICAgICAgICAgICAgYSB0eXBlbWFwIGZlYXR1cmUgZm9yIHNvbWUgdHlwZSwgeW91IGNvdWxkIGRvIHRoaXMuCgogICAgICAgICAgICAgICAvLyBEbyBub3QgYWxsb3cgZ2xvYmFsIHZhcmlhYmxlcyBvZiB0eXBlICdjb25zdCBjaGFyIConIHRvIGJlIHNldC4KICAgICAgICAgICAgICAgJXR5cGVtYXAodmFyaW4pIGNvbnN0IGNoYXIgKiAicGFzcyI7CgogICAgICAgICAgICBJdCBtaWdodCBhbHNvIGJlIHBvc3NpYmxlIHRvIHVzZSB0aGlzIHRvIGRvIHN1YnRsZSBhbmQKICAgICAgICAgICAgc3RyYW5nZSB0aGluZ3Mgd2l0aCB0eXBlbWFwcy4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCiAgICAgICAgICAgIG1ha2UgJ2JsYWggKicgYW4gb3V0cHV0IHZhbHVlIGFuZCAnY29uc3QgYmxhaCAqJyBhbiBpbnB1dAogICAgICAgICAgICBwYXJhbWV0ZXIsIHlvdSBtaWdodCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGlnbm9yZSkgYmxhaCAqKGJsYWggdGVtcCkgewogICAgICAgICAgICAgICAgICAgICQxID0gJnRlbXA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAldHlwZW1hcChhcmdvdXQpIGJsYWggKiB7CiAgICAgICAgICAgICAgICAgICAgLi4uIHJldHVybiBhIHZhbHVlIC4uLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogQmxvY2sgdW5xdWFsaWZpZWQgdHlwZW1hcHMgZGVmaW5lZCBhYm92ZSAqLwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaWdub3JlKSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBjb25zdCBibGFoICogInBhc3MiOwogICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pICAgICBjb25zdCBibGFoICogewogICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgaW5wdXQgdmFsdWUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgKFRoaXMgcG90ZW50aWFsIGFwcGxpY2F0aW9ucyBvZiB0eXBlbWFwcyBzdWdnZXN0ZWQgYnkgR3JlZyBTdGVpbikuCiAgICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjAxLzI5LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCdWcgZml4OiBObyBlbnVtZXJhdGlvbnMgd2VyZSB3cmFwcGVkIHdoZW4gdGhlIC1zaGFkb3cgCiAgICAgICAgICAgY29tbWFuZGxpbmUgb3B0aW9uIHdhcyBub3Qgc3BlY2lmaWVkLiBSZXBvcnRlZCBieSBJc3JhZWwgVGFsbGVyLgoKMDEvMjgvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEdsb2JhbCBhcnJheXMgYXJlIHN1Y2Nlc3NmdWxseSB3cmFwcGVkLiBJbiBmYWN0IHRoZXkgc3RhcnRlZAogICAgICAgICAgIG1vc3RseSB3b3JraW5nIGluIFNXSUctMS4zLjEwLgoKMDEvMjgvMjAwMjpyaWNoYXJkcAoJICAgQWRkZWQgZmlyc3QgYXR0ZW1wdCBhdCBDKysgYW5kIC1zaGFkb3cgc3VwcG9ydCBmb3IgUEhQNCBtb2R1bGUsCgkgICBwbGVhc2UgdGVzdCBhbmQgbWFpbCBtZSBpZiBhbnkgcHJvYmxlbXMvaWRlYXMgb24gaW1wcm92aW5nIGl0LgoKCSAgIFRoZXJlIGlzIGEga25vd24gcHJvYmxlbSB3aXRoIHVuaW5pdGlhbGl6ZWQgbWVtYmVyIHZhcmlhYmxlcywKCSAgIHBsZWFzZSBzZWUgRXhhbXBsZXMvcGhwNC9zeW5jL1JFQURNRSBmb3IgZGV0YWlscy4KCgkgICBBbHNvIG1vcmUgUEhQIGRvY3VtZW50YXRpb24gYWRkZWQgdG8gRG9jL01hbnVhbC9QaHAuaHRtbAoKMDEvMjcvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgVGhlIEFOU0kgQyBzaXplX3QgdHlwZSBpcyBub3cgcmVjb2duaXplZCBhcyBhbiBpbnRlZ2VyIGJ5IGRlZmF1bHQuCgowMS8yNi8yMDAyOmJlYXpsZXkKICAgICAgICAgICBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZyBzdXBwb3J0IGFkZGVkIHRvIG1hbnkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICBUaGlzIGlzIG5vdCBhIHBvcnRhYmxlIGZlYXR1cmUgYW5kIHdpbGwgcmVxdWlyZSBjb21waWxlciBzdXBwb3J0CiAgICAgICAgICAgZm9yIHRoZSBsb25nIGxvbmcgdHlwZS4gIEluIHRhcmdldCBsYW5ndWFnZXMgdGhhdCBkbyBub3Qgc3VwcG9ydAogICAgICAgICAgIGxvbmcgbG9uZyAoZS5nLiwgVGNsIGFuZCBQZXJsKSwgbnVtYmVycyBhcmUgY29udmVydGVkIHRvIGEgc3RyaW5nCiAgICAgICAgICAgb2YgZGlnaXRzLiAgVGhpcyBwcmV2ZW50cyB0aGVpciB1c2UgaW4gYXJpdGhtZXRpYyBjYWxjdWxhdGlvbnMsIGJ1dAogICAgICAgICAgIHN0aWxsIGFsbG93cyB2YWx1ZXMgdG8gYmUgc2V0IGZyb20gYSBzdHJpbmcuICAKCiAgICAgICAgICAgbG9uZyBsb25nIHN1cHBvcnQgcmVxdWlyZXMgdGhlIHVzZSBvZiB0aGUgc3RydG9sbCgpIGFuZCBzdHJ0b3VsbCgpCiAgICAgICAgICAgZnVuY3Rpb25zIGFzIHdlbGwgYXMgdGhlICdsbGQnIGFuZCAnbGx1JyBmb3JtYXQgc3BlY2lmaWVycwogICAgICAgICAgIG9mIHNwcmludGYoKS4KCjAxLzI2LzIwMDI6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzUwMTgyNyBdIERlbGV0ZSBtZXRob2QgaXMgbm90IGNhbGxlZC4gICBUaGUgVGNsCiAgICAgICAgICAgbW9kdWxlIHdhc24ndCBjb3JyZWN0bHkgY2FsbGluZyBkZXN0cnVjdG9ycyB3aGVuIHRoZXkKICAgICAgICAgICB3ZXJlIGRlZmluZWQgdXNpbmcgJWFkZG1ldGhvZHMuICBUaGlzIGhhcyBiZWVuIGZpeGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IFJlaW5oYXJkIEZvYmJlLgoKMDEvMjYvMjAwMjogYmVhemxleQogICAgICAgICAgIEJldHRlciBzdXBwb3J0IGZvciBsb25nIGxvbmcgYW5kIHVuc2lnbmVkIGxvbmcgbG9uZy4gIFR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIGluY2x1ZGVkIGluIGEgbnVtYmVyIG9mIG1vZHVsZXMgZm9yIGhhbmRsaW5nIHRoZXNlIHR5cGVzLgogICAgICAgICAgIEluIGFkZGl0aW9uLCB0aGUgcGFyc2VyIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGFjY2VwdCBsb25nIGxvbmcKICAgICAgICAgICBsaXRlcmFscyBzdWNoIGFzIDEyMzRMTCBhbmQgMTIzNFVMTC4KCjAxLzI3LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBBIEMgY2hhcltdIGlzIG1hcHBlZCB0byBhIEphdmEgU3RyaW5nIHdoaWNoIGlzIHRoZSBkZWZhdWx0IAogICAgICAgICAgIFNXSUcgaGFuZGxpbmcgb2YgY2hhcltdIGFuZCBjaGFyKi4gSXQgdXNlZCB0byBiZSBtYXBwZWQgdG8gYnl0ZVtdLiAKICAgICAgICAgICBOb3RlIHRoYXQgYSBDIHNpZ25lZCBjaGFyW10gYXJyYXkgaXMgbWFwcGVkIHRvIGJ5dGVbXS4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgowMS8yNS8yMDAyOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgYSBwcm9ibGVtIHdpdGggcmV0dXJuLWJ5LXZhbHVlLCBDKyssIGFuZAogICAgICAgICAgIG9iamVjdHMgdGhhdCBkZWZpbmUgbm8gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBKb2VsIFJlZWQuCgowMS8yNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gT3ZlcmhhdWwgb2YgdGhlIEphdmEgbW9kdWxlLiBUaGUgQyBjb2RlIGdlbmVyYXRpb24gaXMgbm93IAogICAgICAgICAgIGRvbmUgZnJvbSB0eXBlbWFwcy4KCjAxLzI0LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBTdXBwb3J0IGZvciBhcnJheXMgb2YgZW51bSBwb2ludGVycwoKMDEvMjAvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEVycm9yIGNoZWNraW5nIGZvciBudWxsIEphdmEgb2JqZWN0cyBiZWluZyBwYXNzZWQgdG8gbmF0aXZlIAogICAgICAgICAgIGZ1bmN0aW9ucy4gIEV4Y2VwdGlvbiB0aHJvd24gbm93IHdoZXJlYXMgYmVmb3JlIHRoZSBKVk0gY3Jhc2hlZC4KCjAxLzE4LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBDb3JyZWN0ZWQgYmVoYXZpb3VyIGZvciBmdW5jdGlvbnMgdGhhdCB0YWtlIGFycmF5cy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIHdoZW4gdGhpcyBjIGZ1bmN0aW9uOiAKCiAgICAgICAgICAgdm9pZCBhcnJheWZuKGludCBhcnJheVtdKTsKICAgICAgICAgICAKICAgICAgICAgICBpcyB3cmFwcGVkIHRoZSBjb3JyZXNwb25kaW5nIG5hdGl2ZSBmdW5jdGlvbgoKICAgICAgICAgICBwdWJsaWMgZmluYWwgc3RhdGljIG5hdGl2ZSB2b2lkIGFycmF5Zm4oaW50W10gYXJyYXkpOwoKICAgICAgICAgICBpcyBwcm9kdWNlZC4gUHJldmlvdXNseSBpZiB0aGUgQyBmdW5jdGlvbiBtYWRlIGFueSBjaGFuZ2VzIHRvIHRoZSAKICAgICAgICAgICBhcnJheSBlbGVtZW50cywgdGhlc2Ugd2VyZSBub3QgcmVmbGVjdGVkIGJhY2sgaW50byB0aGUgSmF2YSBhcnJheS4gCiAgICAgICAgICAgVGhpcyBoYXMgbm93IGJlZW4gY29ycmVjdGVkIHNvIHRoYXQgdGhlIGNoYW5nZXMgYXJlIHByb3BvZ2F0ZWQgYmFjawogICAgICAgICAgIHRvIEphdmEgYW5kIHRoZSBjYWxsaW5nIGZ1bmN0aW9uIHdpbGwgc2VlIHRoZXNlIGNoYW5nZXMuIFRoaXMgaXMgCiAgICAgICAgICAgaG93IHB1cmUgSmF2YSBmdW5jdGlvbnMgd29yaywgaWUgYXJyYXlzIGFyZSBwYXNzZWQgYnkgcmVmZXJlbmNlLgoKMDEvMTUvMjAwMjpta29lcHBlCiAgICAgICAgICAgW0d1aWxlXSBOZXcgZmlsZSBjcGx1c3BsdXMuaSB3aXRoIEMrKyB0eXBlbWFwcyBjb250cmlidXRlZAogICAgICAgICAgIGJ5IE1hcmNpbyBMdWlzIFRlaXhlaXJhIDxtYXJjaW90QGhvbGx5LmNvbG9zdGF0ZS5lZHU+LgoKMDEvMTEvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIENoYW5nZWQgbWFwcGluZyBvZiBDIGxvbmcgdG8gSmF2YSB0eXBlLiBXYXMgbWFwcGVkIHRvIEphdmEKICAgICAgICAgICBsb25nLCBub3cgbWFwcGVkIHRvIEphdmEgaW50LiBJZiB5b3Ugd2FudCB0aGUgcHJldmlvdXMgbWFwcGluZyB0byAKICAgICAgICAgICBKYXZhIGxvbmcgdXNlIHRoaXMgYXBwcm9hY2ggaW4geW91ciBpbnRlcmZhY2UgZmlsZToKICAgICAgICAgICAKICAgICAgICAgICAgICVjbGVhciBsb25nOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nICAgICAgICAgICAgICJqbG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGp0eXBlKSBsb25nICAgICAgICAgICAibG9uZyIKICAgICAgICAgICAgICV0eXBlbWFwKGpzdHlwZSkgbG9uZyAgICAgICAgICAibG9uZyIKCiAgICAgICAgICAgICAlY2xlYXIgbG9uZ1tBTlldOwogICAgICAgICAgICAgJXR5cGVtYXAoam5pKSBsb25nW0FOWV0gICAgICAgICJqbG9uZ0FycmF5IgogICAgICAgICAgICAgJXR5cGVtYXAoanR5cGUpIGxvbmdbQU5ZXSAgICAgICJsb25nW10iCiAgICAgICAgICAgICAldHlwZW1hcChqc3R5cGUpIGxvbmdbQU5ZXSAgICAgImxvbmdbXSIKICAgICAgICAgICAgICV0eXBlbWFwKGluKSBsb25nW0FOWV0gICAgICAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CiAgICAgICAgICAgICAldHlwZW1hcChvdXQpIGxvbmdbQU5ZXSAgICAgICAge3dyaXRlIG1lIGZvciBhcnJheSBzdXBwb3J0fQogICAgICAgICAgICAgJXR5cGVtYXAoYXJnb3V0KSBsb25nW0FOWV0gICAgIHt3cml0ZSBtZSBmb3IgYXJyYXkgc3VwcG9ydH0KICAgICAgICAgICAgICV0eXBlbWFwKGZyZWVhcmcpIGxvbmdbQU5ZXSAgICB7d3JpdGUgbWUgZm9yIGFycmF5IHN1cHBvcnR9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKICAgICAgICAgICBUaGlzIG5ldyBtYXBwaW5nIGlzIG1vcmUgYXBwcm9wcmlhdGUgd2hlbiBpbnRlcmZhY2luZyB0byAzMiBiaXQgCiAgICAgICAgICAgYXBwbGljYXRpb25zIHdoaWNoIGFyZSB1c2VkIGluIHRoZSBjdXJyZW50IDMyLWJpdCBKVk1zLiBGb3IgZnV0dXJlIAogICAgICAgICAgIDY0LWJpdCBKVk1zIHlvdSBtYXkgaGF2ZSB0byBjaGFuZ2UgdGhlc2UgbWFwcGluZ3MgLSBlZyBvbiBVbml4IExQNjQgCiAgICAgICAgICAgc3lzdGVtcywgYnV0IG5vdCBvbiBNaWNyb3NvZnQgNjRiaXQgV2luZG93cyB3aGljaCB3aWxsIGJlIHVzaW5nIGEgCiAgICAgICAgICAgUDY0IElMMzIgbW9kZWwuIFRoaXMgbWF5IGJlIGF1dG9tYXRlZCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIFNXSUcuCgowMS8xMC8yMDAyOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbIDUwMTY3NyBdICVpbml0IGJsb2NrIGluIHdyb25nIHBsYWNlLiBSZXBvcnRlZAogICAgICAgICAgIGJ5IEx1aWdpIEJhbGxhYmlvLgoKMDEvMDkvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIERlZmF1bHQgc3VwcG9ydCBmb3IgdGhlIGxvbmcgbG9uZyB0eXBlLiBzaWduZWQgbG9uZyBsb25nIGlzIAogICAgICAgICAgIG1hcHBlZCB0byBhIEphdmEgbG9uZy4gdW5zaWduZWQgbG9uZyBsb25nIGlzIG1hcHBlZCB0byBCaWdJbnRlZ2VyLgoKMDEvMDkvMjAwMjpiZWF6bGV5CiAgICAgICAgICAgRXhwZXJpbWVudGFsIGNoYW5nZSB0byBwYXJzZXIgdG8gYmV0dGVyIHN1cHBvcnQgbWl4aW5nIG9mCiAgICAgICAgICAgaW50LCBsb25nLCBzaG9ydCwgdW5zaWduZWQsIGZsb2F0LCBhbmQgZG91YmxlLiAgIFRoZSBwYXJzZXIKICAgICAgICAgICBzaG91bGQgbm93IHN1cHBvcnQgdHlwZXMgbGlrZSB0aGlzOgogICAgCiAgICAgICAgICAgICAgICBzaG9ydCB1bnNpZ25lZCBpbnQKICAgICAgICAgICAgICAgIGludCAgIHVuc2lnbmVkIHNob3J0CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBpbnQKICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzaG9ydAoKICAgICAgICAgICAgVGhpcyBjaGFuZ2UgYWxzbyBlbmFibGVzIGEgdHlwZSBvZiAnbG9uZyBkb3VibGUnIChwcmV2aW91c2x5CiAgICAgICAgICAgIHVuc3VwcG9ydGVkKSB0byBiZSB1c2VkLgogICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgowMS8wNS8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gQ2FzdGluZyBmaXggZm9yIHdoZW4gZnVuY3Rpb24gcmV0dXJuIHR5cGUgaXMgYSBwb2ludGVyIGFzIAogICAgICAgICAgIHJlcG9ydGVkIGJ5IEdhcnkgUGVubmluZ3RvbiAyMDAyLTAxLTA1LiBUaGUgdXBwZXIgMzJiaXRzIG9mIHRoZSAKICAgICAgICAgICA2NCBiaXQgamxvbmcgd2lsbCBoYXZlIGNvbnRhaW5lZCBqdW5rIGZvciAzMmJpdCBwb2ludGVycy4KCjAxLzA1LzIwMDI6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBCZXR0ZXIgcG9pbnRlciBoYW5kbGluZyBpbiBKYXZhIGlzIHBvc3NpYmxlIGFzIHRoZSAKICAgICAgICAgICBJTlBVVCwgT1VUUFVUIGFuZCBJTk9VVCB0eXBlbWFwcyBoYXZlIGJlZW4gYWRkZWQgaW50byB0eXBlbWFwcy5pLgoKMDEvMDUvMjAwMjogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdICRudWxsIGNhbiBiZSB1c2VkIGluIGlucHV0IHR5cGVtYXBzIHRvIHJldHVybiBlYXJseSBmcm9tIEpOSSAKICAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBoYXZlIGVpdGhlciB2b2lkIG9yIGEgbm9uLXZvaWQgcmV0dXJuIHR5cGUuIEV4YW1wbGU6CgogICAgICAgICAgICAgJXR5cGVtYXAoY2hlY2spIGludCAqICV7IAogICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICBTV0lHX2V4Y2VwdGlvbihTV0lHX0luZGV4RXJyb3IsICJBcnJheSBlbGVtZW50IGVycm9yIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuICRudWxsOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAlfQoKICAgICAgICAgICBJZiB0aGUgdHlwZW1hcCBnZXRzIHB1dCBpbnRvIGEgZnVuY3Rpb24gd2l0aCB2b2lkIGFzIHJldHVybiwgJG51bGwgCiAgICAgICAgICAgd2lsbCBleHBhbmQgdG8gbm90aGluZzoKCiAgICAgICAgICAgICB2b2lkIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH0KCiAgICAgICAgICAgb3RoZXJ3aXNlICRudWxsIGV4cGFuZHMgdG8gemVybywgd2hlcmUgamF2YXJldHVybnR5cGUgaXMgZWl0aGVyIGEgCiAgICAgICAgICAgcG9pbnRlciBvciBhIHByaW1pdGl2ZSB0eXBlOgoKICAgICAgICAgICAgIGphdmFyZXR1cm50eXBlIGpuaV9mbiguLi4pIHsKICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgIFNXSUdfZXhjZXB0aW9uKFNXSUdfSW5kZXhFcnJvciwgIkFycmF5IGVsZW1lbnQgZXJyb3IiKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9CgowMS8wMi8yMDAyOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gVGhlIEphdmEgbW9kdWxlIGluY29ycmVjdGx5IHVzZWQgYXJnb3V0IHR5cGVtYXBzIGZvciAKICAgICAgICAgICBzdHJpbmdzLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQgYW5kIHRoZSBjb2RlIG5vdyByZXNpZGVzCiAgICAgICAgICAgaW4gdGhlIGZyZWVhcmcgdHlwZW1hcC4gVGhlIGFyZ291dCBhcnJheSB0eXBlbWFwcyBoYXZlIGJlZW4gc3BsaXQgaW50byAKICAgICAgICAgICBhcmdvdXQgYW5kIGZyZWVhcmcgdHlwZW1hcHMuIFRoaXMgY29ycmVjdGlvbiBtYXkgcmVxdWlyZSBzb21lIHVzZXIgCiAgICAgICAgICAgd3JpdHRlbiB0eXBlbWFwcyB0byBiZSBtb2RpZmllZC4gCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8yOC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gTXVsdGkgdHlwZW1hcHMgbm93IHdvcmtpbmcgZm9yIEphdmEgc2VlIG11bHRpbWFwIGV4YW1wbGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgLSBmcmVlYXJnIHR5cGVtYXAgY29kZSB3YXMgYXBwZWFyaW5nCiAgICAgICAgICAgYmVmb3JlIHRoZSBmdW5jdGlvbiBjYWxsLgoKMTIvMjgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgW0phdmFdIEpDQUxMIG1hY3JvIGZvciBKTkkgY2FsbHMgdGhhdCB3b3JrIGluIGJvdGggQyBhbmQgQysrIHR5cGVtYXBzCiAgICAgICAgICAgaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggSkNBTEwwLCBKQ0FMTDEsIEpDQUxMMiwgSkNBTEwzIGFuZCBKQ0FMTDQgCiAgICAgICAgICAgbWFjcm9zLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTIvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgUmVzb2x2ZWQgc29tZSBpbmNvbnNpc3RlbnQgYmVoYXZpb3Igd2l0aCAlcmVuYW1lIGFuZCBjbGFzcyByZW5hbWluZy4KICAgICAgICAgICBJZiB5b3Ugc3BlY2lmeSB0aGUgZm9sbG93aW5nOgogCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAgQmFyOwoKICAgICAgICAgICAgICAgY2xhc3MgQmFyIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgIEJhcigpOwogICAgICAgICAgICAgICAgICAgIH5CYXIoKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGVuIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZSBhcHBsaWVzIHRvIHRoZSBjbGFzcyBpdHNlbGYsIHRoZSBjb25zdHJ1Y3RvciwKICAgICAgICAgICBhbmQgdGhlIGRlc3RydWN0b3IgKGFsbCB3aWxsIGJlIHJlbmFtZWQgdG8gRm9vKS4KCiAgICAgICAgICAgSWYgYSBjbGFzcyBkZWZpbmVzIG1vcmUgdGhhbiBvbmUgY29uc3RydWN0b3IsIHRoZSBvdmVybG9hZGVkIHZhcmlhbnRzCiAgICAgICAgICAgY2FuIHN0aWxsIGJlIHJlbmFtZWQgYnkgc3BlY2lmeWluZyBwYXJhbWV0ZXJzIHRvICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVyZW5hbWUoQmFyX2NvcHkpIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgIGNsYXNzIEJhciB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgQmFyKCk7CiAgICAgICAgICAgICAgICAgICAgIEJhcihCYXIgJik7CiAgICAgICAgICAgICAgICAgICAgfkJhcigpOwogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUaGVyZSBhcmUgc3RpbGwgc29tZSBvZGQgY29ybmVyIGNhc2VzLiAgSWYgeW91IHNwZWNpZnkKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSA6OkJhcjsKCiAgICAgICAgICAgdGhlbiBvbmx5IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBjaGFuZ2VkIGFuZCB0aGUgY29uc3RydWN0b3IvZGVzdHJ1Y3RvcgogICAgICAgICAgIG5hbWVzIGFyZSBsZWZ0IHVubW9kaWZpZWQuICBJZiB5b3Ugc3BlY2lmeSAKCiAgICAgICAgICAgICAgICVyZW5hbWUoRm9vKSAqOjpCYXI7CgogICAgICAgICAgIHRoZW4gdGhlIG5hbWVzIG9mIHRoZSBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yIGZ1bmN0aW9ucyBhcmUgbW9kaWZpZWQgYnV0CiAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIG5vdC4KCjEyLzIxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIFtKYXZhXSBqbmksIGp0eXBlIGFuZCBqc3R5cGUgdHlwZW1hcHMgbm8gbG9uZ2VyIGhhcmRjb2RlZCBidXQgcmVhbCAKICAgICAgICAgICB0eXBlbWFwcy4gTmV3IHZhcmlhYmxlIHN1YnN0aXR1dGlvbiwgJGphdmFjbGFzc25hbWUsIGNhbiBiZSB1c2VkIGluCiAgICAgICAgICAgdGhlIGpzdHlwZSB0eXBlbWFwcy4gSXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUgSmF2YSBzaGFkb3cgY2xhc3MgbmFtZQogICAgICAgICAgIHdoZXJlIGFwcGxpY2FibGUuCiAgICAgICAgICAgW0phdmFdIEZpeCBmb3IgcmVjZW50bHkgaW50cm9kdWNlZCBidWcgdG8gZG8gd2l0aCBpbmhlcml0YW5jZSB3aGVuIAogICAgICAgICAgIHVzaW5nICVpbXBvcnQuCiAgICAgICAgICAgW0phdmFdIEEgZmV3IG1vcmUgYnVnIGZpeGVzLCB0b2RvIHdpdGggJXJlbmFtZSBhbmQgdXNpbmcgdGhlIGtpbmQKICAgICAgICAgICB3aXRoIHRoZSB0eXBlLCBlZyAKICAgICAgICAgICB2b2lkIGZuKHVuaW9uIHVuaSBteXVuaSwgc3RydWN0IHN0ciBteXN0ciwgY2xhc3MgY2wgbXljbCk7CgoxMi8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0OTQ1MjQgXSBQcmVwcm9jZXNzb3IgYnVnIC0gYXBvc3Ryb3BoZSBhbmQgI3N1YnN0LgoKMTIvMjAvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgU1dJR19WRVJTSU9OIHByZXByb2Nlc3NvciBzeW1ib2wuICAgVGhpcyBpcyBhIGhleGFkZWNpbWFsCiAgICAgICAgICAgaW50ZWdlciBzdWNoIGFzIDB4MDEwMzExIChjb3JyZXNwb25kaW5nIHRvIFNXSUctMS4zLjExKS4gIFRoaXMgY2FuCiAgICAgICAgICAgYmUgdXNlZCBpbiB0aGUgaW50ZXJmYWNlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAjaWYgU1dJR19WRVJTSU9OID49IDB4MDEwMzExCiAgICAgICAgICAgICAgIC8qIFVzZSBzb21lIGZhbmN5IG5ldyBmZWF0dXJlICovCiAgICAgICAgICAgICAgICNlbmRpZgoKICAgICAgICAgICBOb3RlOiBUaGUgdmVyc2lvbiBzeW1ib2wgaXMgbm90IGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCBTV0lHCiAgICAgICAgICAgd3JhcHBlciBmaWxlLgoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMi8yMC8yMDAxOm1rb2VwcGUKCSAgIFtNelNjaGVtZV06IFJlbmFtZWQgbXpzd2lnX21ha2VfYm9vbGVhbiB0bwoJICAgc3dpZ19tYWtlX2Jvb2xlYW4sIGFzIHRoZSBsYXR0ZXIgaXMgdXNlZCBpbiB0aGUgdHlwZW1hcHMuCgkgICBSZXBvcnRlZCBieSBMdWlnaSBCYWxsYWJpby4KCjEyLzE3LzIwMDE6bWtvZXBwZQoJICAgW0d1aWxlXTogUmV3cm90ZSBsaXN0LXZlY3Rvci5pIHVzaW5nIG11bHRpLWRpc3BhdGNoCgkgICB0eXBlbWFwcy4gIFVwZGF0ZWQgcG9pbnRlci1pbi1vdXQuaS4gIE1ha2UgdGhlCgkgICBkZXByZWNhdGVkIHR5cGVtYXAtc3Vic3RpdHV0aW9uIG9mICIkc291cmNlIiBpbiAiYXJnb3V0IgoJICAgd29yayBhcyBiZWZvcmUuCgoxMi8xNi8yMDAxOm1rb2VwcGUKCSAgIFtHdWlsZV06IEZpeGVkIG1hY3JvcyAldmFsdWVzX2FzX2xpc3QsICV2YWx1ZXNfYXNfdmVjdG9yLAoJICAgJW11bHRpcGxlX3ZhbHVlcyB0byB1c2UgdGhlIHByb3BlciAlcHJhZ21hIHN5bnRheC4gIE5ldwoJICAgR3VpbGUgZXhhbXBsZS90ZXN0ICJtdWx0aXZhbHVlIjsgbmV3IEd1aWxlIHJ1bi10ZXN0IGZvcgoJICAgdGVzdC1zdWl0ZSBpdGVtICJsaXN0LXZlY3RvciIgKGN1cnJlbnRseSBicm9rZW4pLgoKMTIvMTQvMjAwMTpta29lcHBlCgkgICBbR3VpbGVdOiBGaXhlZCB0eXBlbWFwLXN1YnN0aXRpb24gYnVnIGZvciAidmFyaW4iLiAgUmVsYXhlZAoJICAgdmFsaWQtaWRlbnRpZmllciBjaGVjayB0byBhbGxvdyBhbGwgUjVSUyBpZGVudGlmaWVycy4KCgpWZXJzaW9uIDEuMy4xMCAoRGVjZW1iZXIgMTAsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkICV0eXBlbWFwIHNvIHRoYXQgJXsgLi4uICV9IGNhbiBhbHNvIGJlIHVzZWQgYXMgYQogICAgICAgICAgIGNvZGUgYmxvY2sgKG1vc3RseSBmb3IgY29tcGxldGVuZXNzKS4gIEZvciBleGFtcGxlOgogCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGJsYWggJXsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgICBUaGlzIGZvcm0gZG9lcyBub3QgaW50cm9kdWNlIGEgbmV3IGJsb2NrIHNjb3BlLiAgQWxzbywgdGhlCiAgICAgICAgICAgY29kZSBlbmNsb3NlZCBpbiAleyAuLi4gJX0gaXMgbm90IHByb2Nlc3NlZCBieSB0aGUgcHJlcHJvY2Vzc29yLgoKMTIvMDgvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgWyAjNDU5NjE0IF0gU1dJRyB3aXRoIG11bHRpcGxlIFRDTCBpbnRlcnByZXRlcnMuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0MTcxNDEgXSBydWJ5ZGVjLnN3ZyBpcyB3cm9uZwogICAgICAgICAgIFJlcG9ydGVkIGJ5IFBhdWwgQnJhbm5hbi4KCjEyLzA4LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQxMDU1NyBdIFByb2JsZW0gd2l0aCAlYWRkbWV0aG9kcyBvbiBOVC4KICAgICAgICAgICBSZXBvcnRlZCBieSBNYWdudXMgTGp1bmcuCgoxMi8wOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBbICM0NDUyMzMgXSBFbmhhbmNlbWVudDogaGFuZGxlIGFjY2VzcyBjaGFuZ2UuCiAgICAgICAgICAgU1dJRyBub3cgcGFyc2VzIChidXQgaWdub3JlcykgQysrIGFjY2VzcyBjaGFuZ2VzIGZvciB0aGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgIGNsYXNzIEEgewogICAgICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgICAgdm9pZCBzb21ldGhpbmcoKSB7IH0KICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEEoKSB7fQogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICBjbGFzcyBCIDogcHJpdmF0ZSBBIHsKICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgIEIoKSA6IEEoKSB7IH0KICAgICAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgICAgIEE6OnNvbWV0aGluZzsgICAgPC0tLS0gUGFyc2VkLCBidXQgaWdub3JlZAogICAgICAgICAgICAgfTsKIAogICAgICAgICAgIFN1Z2dlc3RlZCBieSBLcnp5c3p0b2YgS296bWluc2tpLgoKMTIvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgRml4IGZvciBSdWJ5IHRvIHdvcmsgdXNpbmcgVmlzdWFsIEMrKy4KCjEyLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFsgIzQ2NTY4NyBdIHVuc2lnbmVkIHNob3J0IHBhcmFtZXRlcnMgZmFpbC4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0ODk1OTQgXSBQeVN0cmluZ19Gcm9tU3RyaW5nIGNhbid0IHRha2UgTlVMTCBhcmcuCiAgICAgICAgICAgUmVwb3J0ZWQgYnkgSm9obiBNZXJyaXR0LiAgIFNXSUcgbm93IGNvbnZlcnRzIHN0cmluZyB2YWx1ZXMKICAgICAgICAgICB0byBQeXRob24gdXNpbmcgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgIHJlc3VsdG9iaiA9IHJlc3VsdCA/IFB5U3RyaW5nX0Zyb21TdHJpbmcocmVzdWx0KSA6IFB5X0J1aWxkVmFsdWUoIiIpOwoKMTIvMDYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgWyAjNDYzNTYxIF0gVHlwZSBjb252ZXJzaW9ucyBub3QgZ2VuZXJhdGVkLgogICAgICAgICAgIFJlcG9ydGVkIGJ5IEdlcmFsZCBXaWxsaWFtcy4KCQoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzAyMTcgXSBUY2wgZGVmYXVsdCBhcmd1bWVudCBoYW5kbGluZy4KICAgICAgICAgICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ3MjA4OCBdIGRlZmluZWQoTUFDUk8pIGV4cGFuZGVkIGV2ZXJ5d2hlcmUuCiAgICAgICAgICAgRW1iZWRkZWQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgc3VjaCBhcwoKICAgICAgICAgICAgICAlI2lmIGRlZmluZWQoRk9PKQoKICAgICAgICAgICBhcmUgbm90IGV4cGFuZGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBSZXBvcnRlZCBieSBHZXJhbGQgV2lsbGlhbXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0NzY0NjcgXSBQcm9ibGVtcyB3aXRoICNkZWZpbmUgJiBjb21tYXMuCgoxMi8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBbICM0Nzc1NDcgXSB3cm9uZyBkZWNsYXJhdGlvbiBvZiBwb2ludGVyIGZ1bmN0aW9ucy4KICAgICAgICAgICBCYWQgcHJvdG90eXBlcyBpbiBMaWIvdGNsL3B0cmxhbmcuaS4KCjEyLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIFsgIzQ4MzE4MiBdIENvbnN0YW50cyBjYW4gdGFrZSBhcmdzIGJ5IG1pc3Rha2UuIAogICAgICAgICAgIFdoZW4gc3dpZyAtcGVybDUgLWNvbnN0IGlzIHVzZWQsIGNvbnN0YW50cyBhcmUgZGVjbGFyZWQKICAgICAgICAgICB3aXRoIGEgdm9pZCBwcm90b3R5cGUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdWIgSUNPTlNUICgpIHsgJGV4YW1wbGVjOjpJQ09OU1QgfQoKICAgICAgICAgICBQYXRjaCBzdWJtaXR0ZWQgYnkgUmljaCBXYWxlcy4KCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIE5ldyAlZXhjZXB0aW9uIGRpcmVjdGl2ZS4gICBUaGlzIGlzIGludGVuZGVkIHRvIHJlcGxhY2UgJWV4Y2VwdC4KICAgICAgICAgICBJdCB3b3JrcyBpbiBleGFjdGx5IHRoZSBzYW1lIG1hbm5lciBleGNlcHQgaXQgZG9lcyBub3QgYWNjZXB0IGEgCiAgICAgICAgICAgbGFuZ3VhZ2Ugc3BlY2lmaWVyLiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICVleGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRhY3Rpb24KICAgICAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICAgICAgICBjYXRjaChTb21lRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICBlcnJvcgogICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICB9CgogICAgICAgICAgICVleGNlcHRpb24gaXMgYWxzbyBuYW1lIGF3YXJlLS0tYWxsb3dpbmcgaXQgdG8gYmUgYXBwbGllZCB0bwogICAgICAgICAgIHNwZWNpZmljIGRlY2xhcmF0aW9ucyBpbiBhbiBpbnRlcmZhY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJWV4Y2VwdGlvbiBmb28gewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBhbnkgZnVuY3Rpb24vbWV0aG9kIGZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICVleGNlcHRpb24gRm9vOjpiYXIgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyIGluIGNsYXNzIEZvbwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAlZXhjZXB0aW9uIEZvbzo6YmFyKGRvdWJsZSkgewogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGZvciBtZXRob2QgYmFyKGRvdWJsZSkgaW4gY2xhc3MgRm9vCiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgVGhlIHNlbWFudGljcyBvZiB0aGlzIG5hbWUgbWF0Y2hpbmcgaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBmb3IgJXJlbmFtZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjEyLzAzLzIwMDE6YmVhemxleQogICAgICAgICAgIFN1YnN0YW50aWFsIGNsZWFudXAgb2YgdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgY29kZS4gIFNoYWRvdyBjbGFzc2VzCiAgICAgICAgICAgdXNlZCB0byBiZSBjcmVhdGVkIGluIHRoaXMgcmF0aGVyIGNvbXBsaWNhdGVkIG1hbm5lciBpbnZvbHZpbmcgYWJvdXQKICAgICAgICAgICBhIGhhbGYtZG96ZW4gc3RyaW5ncyBjcmVhdGVkIGluIGJpdHMgYW5kIHBpZWNlcy4gICBTaGFkb3cgY2xhc3NlcwogICAgICAgICAgIGFyZSBub3cgZ2VuZXJhdGVkIGluIGEgbW9yZSBzdHJhaWdodGZvcndhcmQgbWFubmVyLS1pbiB0aGUgc2FtZQogICAgICAgICAgIG9yZGVyIHRoYXQgYXBwZWFycyBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIFRoZSBvcmRlciBpbiB3aGljaCBkZWNsYXJhdGlvbnMgYXBwZWFyIGluIHRoZSBzaGFkb3cgZmlsZSBtYXkgZGlmZmVyLgogICAgICAgICAgIAoxMi8wMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJWluc2VydCBkaXJlY3RpdmUgKCV7IC4uLiAlfSwgJXJ1bnRpbWUsICVoZWFkZXIsICV3cmFwcGVyLCBldGMuKQogICAgICAgICAgIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUgb2YgYSBjbGFzcyBkZWZpbml0aW9uLiAgIFRoaXMgaGFzIHBvdGVudGlhbAogICAgICAgICAgIHVzZXMgd2hlbiBnZW5lcmF0aW5nIHNoYWRvdyBjbGFzcyBjb2RlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICVpbnNlcnQoInNoYWRvdyIpICV7CiAgICAgICAgICAgICAgICAgIyBTb21lIHB5dGhvbiBjb2RlCiAgICAgICAgICAgICAgICAgZGVmIGJsYWgoc2VsZik6CiAgICAgICAgICAgICAgICAgICAgICBwcmludCAiSSdtIGJsYWghIgogICAgICAgICAgICAgICAgICV9CiAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgIFRoZSBzdXBwb3J0IGZvciBjbGFzcyBjb2RlIGluc2VydGlvbiBkZXBlbmRzIG9uIHRoZSBsYW5ndWFnZSBtb2R1bGUuCiAgICAgICAgICAgSG93ZXZlciwgdGhlIGludGVudCBvZiB0aGlzIGZlYXR1cmUgaXMgdG8gc2ltcGxpZnkgdGhlIHRhc2sgb2YgZXh0ZW5kaW5nCiAgICAgICAgICAgc2hhZG93IGNsYXNzIGNvZGUuICAgSW4gdGhlIFB5dGhvbiBtb2R1bGUsIHRoaXMgaW5zZXJ0cyBjb2RlIHdpdGggdGhlCiAgICAgICAgICAgcHJvcGVyIGxldmVsIG9mIGluZGVuZGF0aW9uIChyZWdhcmRsZXNzIG9mIHdoYXQgd2FzIHVzZWQgaW4gdGhlIFNXSUcKICAgICAgICAgICBpbnRlcmZhY2UpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzI5LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgIE1vZGlmaWNhdGlvbnMgZm9yIEphdmEgYW5kIFB5dGhvbiBtb2R1bGVzIHRvIHdvcmsgb24gY3lnd2luLgogICAgICAgICAgIFVuZm9ydHVuYXRlbHkgYSBsb3Qgb2YgdGhlIHB5dGhvbiBtb2R1bGUgaGFzIHN0YXJ0ZWQgdG8gcHJvZHVjZXMgY29kZSAKICAgICAgICAgICB3aGljaCBjYW5ub3QgYmUgYXV0by1pbXBvcnRlZCB1c2luZyBjeWd3aW4gbGlidG9vbHMgc28gbW9zdCBvZiBpdCBpcyAKICAgICAgICAgICBzdGlsbCBicm9rZW4uCgoxMS8yOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgJXJlbmFtZSBhbmQgJWZlYXR1cmUgZGlyZWN0aXZlIGNhbiBub3cgYmUgdXNlZCBpbnNpZGUKICAgICAgICAgICBvZiBhIGNsYXNzIGRlZmluaXRpb24uIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29faSkgZm9vKGludCk7CiAgICAgICAgICAgICAgICAgJXJlbmFtZShmb29fZCkgZm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgdm9pZCBmb28oaW50KTsKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgV2hlbiB1c2VkIGluIHRoaXMgbWFubmVyLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgb25seSBhcHBsaWVzCiAgICAgICAgICAgdG8gbWVtYmVycyBvZiB0aGUgY2xhc3MgaW4gd2hpY2ggaXQgYXBwZWFycyBhcyB3ZWxsIGFzIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3Nlcy4gIEluIGZhY3QsIHRoaXMgaXMgcmVhbGx5IGp1c3QgdGhlIHNhbWUKICAgICAgICAgICBhcyBzYXlpbmc6CgogICAgICAgICAgICAgJXJlbmFtZShmb29faSkgRm9vOjpmb28oaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoZm9vX2QpIEZvbzo6Zm9vKGRvdWJsZSk7CiAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgoxMS8yNi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCB0aGUgZXhwZXJpbWVudGFsICVmZWF0dXJlIGRpcmVjdGl2ZS4gICVmZWF0dXJlIGNhbiBiZQogICAgICAgICAgIHVzZWQgdG8gYXR0YWNoIGFyYml0cmFyeSBzdHJpbmcgYXR0cmlidXRlcyB0byBwYXJzZSB0cmVlIG5vZGVzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWZlYXR1cmUoImV4Y2VwdCIpIGJsYWggewogICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICB3aGF0ZXZlcjsgICAgICAKICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgic2V0IikgKjo6eF9zZXQgIngiOwoKICAgICAgICAgICBvcgoKICAgICAgICAgICAgICAlZmVhdHVyZSgiYmxhaCIpIEZvbzo6YmFyKGludCxkb3VibGUpIGNvbnN0ICJzcGFtIjsKCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBib3Jyb3dlZCBmcm9tIHRoZSAlcmVuYW1lIGRpcmVjdGl2ZS4gIEluIGZhY3QsIHRoZQogICAgICAgICAgIGV4YWN0IHNhbWUgc2VtYW50aWNzIGFwcGx5IChpbmhlcml0YW5jZSwgbWF0Y2hpbmcsIGV0Yy4pLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBhIHZlcnkgcG93ZXJmdWwgbG93LWxldmVsIHByaW1pdGl2ZSB0aGF0IGNhbiBiZSB1c2VkIHRvCiAgICAgICAgICAgY3VzdG9taXplIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyBhbmQgdG8gcHJvdmlkZSBoaW50cyB0byAKICAgICAgICAgICBhbnkgc3RhZ2Ugb2YgY29kZSBnZW5lcmF0aW9uLiAgIEZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0bwogICAgICAgICAgIHBhcnNlIHRyZWUgbm9kZXMgYXMgYXR0cmlidXRlcyB3aXRoIG5hbWVzIGxpa2UgImZlYXR1cmU6KiIgd2hlcmUgKiAKICAgICAgICAgICBpcyByZXBsYWNlZCBieSB0aGUgZmVhdHVyZSBuYW1lIChlLmcuLCAiZmVhdHVyZTpleGNlcHQiLCAiZmVhdHVyZTpzZXQiLCAKICAgICAgICAgICBldGMuKS4gICBMYW5ndWFnZSBtb2R1bGVzIGNhbiB0aGVuIGxvb2sgZm9yIHRoZSBmZWF0dXJlcyB1c2luZyAKICAgICAgICAgICBhIHNpbXBsZSBhdHRyaWJ1dGUgbG9va3VwLgoKICAgICAgICAgICAlZmVhdHVyZSBpcyBpbnRlbmRlZCB0byBiZSBhIHJlcGxhY2VtZW50IGZvciBhIG51bWJlciBvZgogICAgICAgICAgIG9sZGVyIFNXSUcgZGlyZWN0aXZlcyBpbmNsdWRpbmcgJWV4Y2VwdCBhbmQgc3BlY2lhbGl6ZWQKICAgICAgICAgICBwcmFnbWFzLiBJdCBpcyBtb3JlIHBvd2VyZnVsIChkdWUgdG8gaXRzIHBhcmFtZXRlcml6ZWQKICAgICAgICAgICBuYW1lIG1hdGNoaW5nKSBhbmQgaXQgcHJvdmlkZXMgdmVyeSBwcmVjaXNlIGNvbnRyb2wgb3ZlcgogICAgICAgICAgIGhvdyBjdXN0b21pemF0aW9uIGZlYXR1cmVzIGFyZSBhdHRhY2hlZCB0byBpbmRpdmlkdWFsCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgIFRoZXJlIGFyZSBmdXR1cmUgZXhwYW5zaW9uIHBsYW5zIHRoYXQgd2lsbAogICAgICAgICAgIGJ1aWxkIHVwb24gdGhpcyBjYXBhYmlsaXR5IGFzIHdlbGwuCgogICAgICAgICAgIEl0J3Mgbm90IGNlcnRhaW4gdGhhdCAlZmVhdHVyZSB3aWxsIGV2ZXIgYmUgdXNlZCBkaXJlY3RseQogICAgICAgICAgIGJ5IFNXSUcgdXNlcnMuICBJbnN0ZWFkLCBpdCBtYXkgYmUgYSBsb3ctbGV2ZWwgcHJpbWl0aXZlCiAgICAgICAgICAgdGhhdCBpcyB1c2VkIGluIGhpZ2gtbGV2ZWwgbWFjcm8gZGVmaW5pdGlvbnMuICBGb3IgaW5zdGFuY2UsCiAgICAgICAgICAgdG8gc3VwcG9ydCBwcm9wZXJ0aWVzLCB5b3UgbWlnaHQgZGVmaW5lIGEgbWFjcm8gbGlrZSB0aGlzOgoKICAgICAgICAgICAlZGVmaW5lICVwcm9wZXJ0eShuYW1lLCBzZXRmLCBnZXRmKQogICAgICAgICAgICVmZWF0dXJlKCJzZXQiKSBzZXRmICNuYW1lOwogICAgICAgICAgICVmZWF0dXJlKCJnZXQiKSBnZXRmICNuYW1lOwogICAgICAgICAgICVlbmRkZWYKCiAgICAgICAgICAgV2hpY2ggYWxsb3dzIGEgdXNlciB0byBzcGVjaWZ5IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgICVwcm9wZXJ0eShwLCBnZXRfcCwgc2V0X3ApOwoKICAgICAgICAgICBjbGFzcyBCbGFoIHsKICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgaW50ICBnZXRfcCgpOwogICAgICAgICAgICAgIHZvaWQgc2V0X3AoaW50KTsKICAgICAgICAgICB9OwoKICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogIAoxMS8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgVGNsIG1vZHVsZSBoYXMgYmVlbiBleHBhbmRlZCB3aXRoIHNvbWUgbmV3IGZlYXR1cmVzIGZvcgogICAgICAgICAgIG1hbmFnaW5nIG9iamVjdCBvd25lcnNoaXAuICBGb3IgZXhhbXBsZToKICAgICAgICAgCiAgICAgICAgICAgICAgICBzZXQgYyBbQ2lyY2xlIC1hcmdzIDIwXQogICAgICAgICAgICAgICAgJGMgYXJlYSAgICAgICAgICAgICAjIEludm9rZSBhIG1ldGhvZAogICAgICAgICAgICAgICAgJGMgLWRpc293biAgICAgICAgICAjIFJlbGVhc2VzIG93bmVyc2hpcCBvZiB0aGUgb2JqZWN0CiAgICAgICAgICAgICAgICAkYyAtYWNxdWlyZSAgICAgICAgICMgQWNxdWlyZXMgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QKCiAgICAgICAgICAgSWYgVGNsIG93bnMgdGhlIG9iamVjdCwgaXRzIGRlc3RydWN0b3IgaXMgaW52b2tlZCB3aGVuIHRoZSAKICAgICAgICAgICBjb3JyZXNwb25kaW5nIG9iamVjdCBjb21tYW5kIGlzIGRlbGV0ZWQgaW4gVGNsLiAgCgogICAgICAgICAgIFRvIHNpbXBsaWZ5IHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLCB0aGUgZm9sbG93aW5nIHN5bnRheAogICAgICAgICAgIGNhbiBiZSB1c2VkOgoKICAgICAgICAgICAgICAgICRjIC1kZWxldGUgICAgICAgICAjIERlbGV0ZSBhbiBvYmplY3QKCiAgICAgICAgICAgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBmb3IgdGhlIG1vcmUgb2JzY3VyZSB2YXJpYW50IG9mIAoKICAgICAgICAgICAgICAgIHJlbmFtZSAkYyB7fQoKICAgICAgICAgICBUaGVzZSBmZWF0dXJlcyBhbHNvIGFkZCBmdW5jdGlvbmFsaXR5IGF0IHRoZSBDIEFQSSBsZXZlbC4KICAgICAgICAgICBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBtYW5hZ2Ugb3duZXJzaGlwIGZyb20gQyBhbmQKICAgICAgICAgICBjYW4gYmUgdXNlZCBpbiB0eXBlbWFwcy4KCiAgICAgICAgICAgICAgICBTV0lHX0FjcXVpcmUodm9pZCAqcHRyKTsKICAgICAgICAgICAgICAgIFNXSUdfRGlzb3duKHZvaWQgKnB0cik7CgogICAgICAgICAgIEEgbmV3IGZ1bmN0aW9uIGZvciBjb25zdHJ1Y3RpbmcgaW5zdGFuY2VzIGlzIGFsc28gYXZhaWxhYmxlOgoKICAgICAgICAgICAgICAgIFRjbF9PYmogKgogICAgICAgICAgICAgICAgU1dJR19OZXdJbnN0YW5jZU9iaihUY2xfSW50ZXJwICppbnRlcnAsIHZvaWQgKnB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpZ190eXBlX2luZm8gKnR5cGUsIGludCBvd24pOwoKICAgICAgICAgICBXaGVuIHVzZWQgaW4gYSB0eXBlbWFwLCB0aGlzIGNyZWF0ZXMgYSBwb2ludGVyIG9iamVjdCBhbmQKICAgICAgICAgICBhbiBpbnRlcnByZXRlciBjb21tYW5kIHRoYXQgY2FuIGJlIHVzZWQgdG8gaXNzdWUgbWV0aG9kcyBhbmQKICAgICAgICAgICBhY2Nlc3MgYXR0cmlidXRlcyBhcyBzaG93biBhYm92ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIzLzIwMDE6YmVhemxleQogICAgICAgICAgIEFsbCBQeXRob24tcmVsYXRlZCAlcHJhZ21hIG9wZXJhdGlvbnMgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQuCiAgICAgICAgICAgTW9zdCBvZiB0aGVzZSB3ZXJlIHdyaXR0ZW4gZm9yIG9sZGVyIFNXSUcgdmVyc2lvbnMgaW4gb3JkZXIgdG8KICAgICAgICAgICBjb21wZW5zYXRlIGZvciBsaW1pdGF0aW9ucyBpbiBlYXJsaWVyIHJlbGVhc2VzLiAgSW4gYW4gZWZmb3J0CiAgICAgICAgICAgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgY29kZS1jbHV0dGVyIGFuZCBwb3RlbnRpYWwgZm9yIGVycm9ycywKICAgICAgICAgICBpdCBpcyBlYXNpZXIgdG8gc2ltcGx5IGVsaW1pbmF0ZSB0aGUgcHJhZ21hcyBhbmQgdG8gc3RhcnQgb3ZlcgogICAgICAgICAgIChpZiBuZWVkZWQpLiAgVG8gYmUgaG9uZXN0LCBJJ20gbm90IGV2ZW4gc3VyZSB0aGUgcHJhZ21hcwogICAgICAgICAgIHdvcmtlZCBpbiAxLjMuOSBhbmQgcmVjZW50IHJlbGVhc2VzLgoKICAgICAgICAgICBOb3RlOiBJZiB5b3UgbmVlZCB0byBpbnNlcnQgY29kZSBpbnRvIHRoZSBzaGFkb3cgY2xhc3MgZmlsZQogICAgICAgICAgIGNyZWF0ZWQgYnkgU1dJRywgc2ltcGx5IHVzZSB0aGUgJXNoYWRvdyBkaXJlY3RpdmUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlc2hhZG93ICV7CiAgICAgICAgICAgICAgZGVmIHNvbWVfcHl0aG9uX2NvZGUoKTogICAgICAgICAKICAgICAgICAgICAgICAgICAgcHJpbnQgImJsYWghIgogICAgICAgICAgICAgICV9CgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3dlZXBpbmcgY2hhbmdlcyB0byB0aGUgd2F5IGluIHdoaWNoIHRoZSBQeXRob24gbW9kdWxlIGhhbmRsZXMKICAgICAgICAgICBzaGFkb3cgY2xhc3Nlcy4gICBJbiBlYXJseSBpbXBsZW1lbnRhdGlvbnMsIHNoYWRvdyBjbGFzc2VzIHdlcmUKICAgICAgICAgICBtZXJlbHkgUHl0aG9uIHdyYXBwZXJzIGFyb3VuZCB0eXBlZCBwb2ludGVyIG9iamVjdHMuIEhvd2V2ZXIsIAogICAgICAgICAgIHNvbWUgdXNlcnMgYWN0dWFsbHkgd2FudGVkIHRvIHJlY2VpdmUgdGhlIHNoYWRvdyBjbGFzcyBvYmplY3QgaW4gQy4KICAgICAgICAgICBUbyBhY2NvbW1vZGF0ZSB0aGlzLCB0aGUgZGVyZWZlcmVuY2luZyBvZiB0aGUgInRoaXMiIHBvaW50ZXIgaW4KICAgICAgICAgICBhIHNoYWRvdyBjbGFzcyB3YXMgbW92ZWQgdG8gQyBhcyBkZXNjcmliZWQgaW4gQ0hBTkdFUyBbOC84Lzk5XS4KICAgICAgICAgICBIb3dldmVyLCB0aGUgcHJvY2VzcyBvZiByZXR1cm5pbmcgcG9pbnRlcnMgdG8gUHl0aG9uIHdhcyBzdGlsbAogICAgICAgICAgIHNvbWV3aGF0IHByb2JsZW1hdGljLiAgU3BlY2lmaWNhbGx5LCBzaGFkb3cgY2xhc3NlcyBuZXZlciB3b3JrZWQKICAgICAgICAgICBpbiBzaXR1YXRpb25zIHN1Y2ggYXMgdGhlc2U6CgogICAgICAgICAgICAgLSAgIFVzZSBvZiBhbnkga2luZCBvZiBvdXRwdXQgdHlwZW1hcCAoJ291dCcgb3IgJ2FyZ291dCcpCiAgICAgICAgICAgICAtICAgR2xvYmFsIHZhcmlhYmxlcyAoYnJva2VuIGFzIGZhciBhcyBJIGNhbiB0ZWxsKS4KCiAgICAgICAgICAgSW4gdGhlIHBhc3QsIHNvbWUgdXNlcnMgaGF2ZSBkZWFsdCB3aXRoIHRoaXMgYnkgbWFudWFsbHkgdHJ5aW5nCiAgICAgICAgICAgdG8gY3JlYXRlIHNoYWRvdyBjbGFzcyBvYmplY3RzIHRoZW1zZWx2ZXMgZnJvbSBDL0MrKy4gIEhvd2V2ZXIsCiAgICAgICAgICAgdGhpcyB3YXMgZGlmZmljdWx0IGJlY2F1c2UgdGhlIEMgd3JhcHBlcnMgZG9uJ3QgcmVhbGx5IGtub3cgaG93CiAgICAgICAgICAgdG8gZ2V0IGFjY2VzcyB0byB0aGUgY29ycmVzcG9uZGluZyBQeXRob24gY2xhc3MuCgogICAgICAgICAgIFRoZSBQeXRob24gbW9kdWxlIGhhcyBub3cgYmVlbiBtb2RpZmllZCB0byBhdXRvbWF0aWNhbGx5IGF0dGFjaAogICAgICAgICAgIHNoYWRvdyBjbGFzcyBvYmplY3RzIHRvIHBvaW50ZXJzIHdoZW4gdGhleSBhcmUgcmV0dXJuZWQgdG8gCiAgICAgICAgICAgUHl0aG9uLiAgIFRoaXMgcHJvY2VzcyBvY2N1cnMgaW4gdGhlIGZ1bmN0aW9uIFNXSUdfTmV3UG9pbnRlck9iaigpCiAgICAgICAgICAgc28gdGhlIHByb2Nlc3MgaXMgY29tcGxldGVseSB0cmFuc3BhcmVudCB0byB1c2Vycy4gICAgQXMgYSByZXN1bHQsCiAgICAgICAgICAgc2hhZG93IGNsYXNzZXMgYXJlIG5vdyBtb3JlIHNlYW1sZXNzbHkgaW50ZWdyYXRlZCB3aXRoIHR5cGVtYXBzCiAgICAgICAgICAgYW5kIG90aGVyIGZlYXR1cmVzIG9mIFNXSUcuCgogICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBpbnRyb2R1Y2UgYSBudW1iZXIgb2YgaW5jb21wYXRpYmlsaXRpZXMuICBUaGUKICAgICAgICAgICBTV0lHX05ld1BvaW50ZXJPYmooKSBub3cgdGFrZXMgYW4gZXh0cmEgcGFyYW1ldGVyICJvd24iIHRvIAogICAgICAgICAgIGluZGljYXRlIG9iamVjdCBvd25lcnNoaXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byByZXR1cm4gYSBwb2ludGVyCiAgICAgICAgICAgdG8gUHl0aG9uIHRoYXQgUHl0aG9uIHNob3VsZCBkZXN0cm95LiAgIEluIGFkZGl0aW9uLCBvbGRlciBjb2RlCiAgICAgICAgICAgdGhhdCB0cmllcyB0byBtYW51YWxseSBjb25zdHJ1Y3Qgc2hhZG93IGNsYXNzIG9iamVjdHMgb3Igd2hpY2gKICAgICAgICAgICBleHBlY3RzIGJhcmUgcG9pbnRlcnMgbWF5IGJyZWFrLS0tc3VjaCBwb2ludGVycyBtYXkgYWxyZWFkeSBiZQogICAgICAgICAgIGVuY2Fwc3VsYXRlZCBieSBhIHNoYWRvdyBjbGFzcy4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSAlaW5zZXJ0IGRpcmVjdGl2ZSB0byBhY2NlcHQgc2luZ2xlIGJyYWNlcyB7IC4uLiB9LgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVpbnNlcnQoImhlYWRlciIpIHsKICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgd29ya3MgZXhhY3RseSBsaWtlICV7IC4uLiAlfSBleGNlcHQgdGhhdCB0aGUgY29kZSBpbiB0aGUKICAgICAgICAgICBicmFjZXMgaXMgcHJvY2Vzc2VkIHVzaW5nIHRoZSBwcmVwcm9jZXNzb3IuICAgVGhpcyBjYW4gYmUgdXNlZnVsCiAgICAgICAgICAgaW4gY2VydGFpbiBjb250ZXh0cyBzdWNoIGFzIGxvdy1sZXZlbCBjb2RlIGdlbmVyYXRpb24gaW4gCiAgICAgICAgICAgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgCjExLzIwLzIwMDE6YmVhemxleQogICAgICAgICAgIENvbW1hbmQgbGluZSBvcHRpb25zIGFyZSBub3cgdHJhbnNsYXRlZCBpbnRvIHByZXByb2Nlc3NvcgogICAgICAgICAgIHN5bWJvbHMuICBGb3IgZXhhbXBsZToKCQogICAgICAgICAgICAgIC4vc3dpZyAtcHl0aG9uIC1zaGFkb3cgLW1vZHVsZSBibGFoIGludGVyZmFjZS5pCgogICAgICAgICAgIENyZWF0ZXMgdGhlIHN5bWJvbHM6CgogICAgICAgICAgICAgIFNXSUdPUFRfUFlUSE9OIDEKICAgICAgICAgICAgICBTV0lHT1BUX1NIQURPVyAxCiAgICAgICAgICAgICAgU1dJR09QVF9NT0RVTEUgYmxhaAogICAgICAgICAgICAgIAogICAgICAgICAgIE1vZHVsZXMgY2FuIGxvb2sgZm9yIHRoZXNlIHN5bWJvbHMgdG8gYWx0ZXIgdGhlaXIgY29kZSBnZW5lcmF0aW9uCiAgICAgICAgICAgaWYgbmVlZGVkLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAgICAgICAgIAoxMS8yMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNYXNzaXZlIG92ZXJoYXVsIG9mIHRoZSBQZXJsNSBtb2R1bGUuICBBIGxvdCBvZiBjb2RlIGdlbmVyYXRpb24gaXMKICAgICAgICAgICBub3cgZHJpdmVuIGJ5IHRhYmxlcyBhbmQgdHlwZW1hcHMuICAgVGhlIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgCiAgICAgICAgICAgYWxzbyBtYWtlcyB1c2Ugb2YgdGFibGVzIHRvIGluc3RhbGwgY29uc3RhbnRzLCB2YXJpYWJsZXMsIGFuZAogICAgICAgICAgIGZ1bmN0aW9ucyBpbnN0ZWFkIG9mIGlubGluaW5nIGEgYnVuY2ggb2YgcHJvY2VkdXJlIGNhbGxzLiAgVGhlCiAgICAgICAgICAgc2VwYXJhdGUgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gaXMgZ29uZS4gICBNb3N0CiAgICAgICAgICAgY29kZSBnZW5lcmF0aW9uIGlzIGNvbnRyb2xsZWQgdmlhIHRoZSBwZXJsNS5zd2cgZmlsZSBpbiB0aGUKICAgICAgICAgICBsaWJyYXJ5LgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIAoxMS8xMy8yMDAxOmJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSBDKysgdHlwZW5hbWUga2V5d29yZC4gIFByaW1hcmlseSB0aGlzCiAgICAgICAgICAgaXMgYWRkZWQgdG8gYmV0dGVyIHN1cHBvcnQgdGVtcGxhdGVzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCAgYmxhaChDJiB2KSB7CiAgICAgICAgICAgICAgICAgdHlwZW5hbWUgQzo6aXRlcmF0b3IgaSA9IHYuYmVnaW4oKTsKICAgICAgICAgICAgIH0KCiAgICAgICAgICAgTm90ZTogdHlwZW5hbWUgaXMgc3VwcG9ydGVkIGluIHRoZSBwYXJzZXIgaW4gdGhlIHNhbWUgd2F5IGFzICdzdHJ1Y3QnCiAgICAgICAgICAgb3IgJ2NsYXNzJy4gIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdXNlIGl0IGFueXdoZXJlIGV4Y2VwdCBpbiB0ZW1wbGF0ZXMuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTEvMTEvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgTWFzc2l2ZSBvdmVyaGF1bCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlIEFQSS4gICBNb3N0IGZ1bmN0aW9ucyBub3cKICAgICAgICAgICB1c2UgYSBjb21tb24sIHZlcnkgc2ltcGxlLCAgQVBJLiAgIFRoZXJlIGFyZSBhbHNvIGEgbnVtYmVyIG9mCiAgICAgICAgICAgaW50ZXJlc3Rpbmcgc2VtYW50aWMgc2lkZS1lZmZlY3RzIG9mIGhvdyBjb2RlIGlzIGFjdHVhbGx5IGdlbmVyYXRlZC4KICAgICAgICAgICBEZXRhaWxzIHdpbGwgYmUgZm9ydGhjb21pbmcgaW4gRG9jL01hbnVhbC9FeHRlbmRpbmcuaHRtbC4KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIExhbmd1YWdlIG1vZHVsZXMgd3JpdHRlbiBmb3IKICAgICAgICAgICBwcmV2aW91cyB2ZXJzaW9ucyBvZiBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdvcmssCgoxMS8xMC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIHZlcnkgc3VidGxlIGJ1ZyBkdWUgdG8gdW5uYW1lZCBjbGFzcyB3cmFwcGluZy4gRm9yIGV4YW1wbGUsIGlmCiAgICAgICAgICAgeW91IGRpZCB0aGlzCgogICAgICAgICAgICAgIHR5cGVkZWYgc3RydWN0IHsKICAgICAgICAgICAgICAgICAgaW50IHgseTsKICAgICAgICAgICAgICB9IGdkUG9pbnQsICpnZFBvaW50UHRyOwoKICAgICAgICAgICAgICB2b2lkIGZvbyhnZFBvaW50UHRyIHgpOwoKICAgICAgICAgICBUaGVuIHRoZSBmb28gZnVuY3Rpb24gd291bGQgZ2V0IGEgdHlwZS1lcnJvci4gICBUaGUgcHJvYmxlbSBoYXMKICAgICAgICAgICB0byBkbyB3aXRoIGludGVybmFsIHR5cGVkZWYgaGFuZGxpbmcgYW5kIHRoZSBmYWN0IHRoYXQgdGhlIHR5cGVkZWYKICAgICAgICAgICBkZWNsYXJhdGlvbnMgYWZ0ZXIgdGhlIHN0cnVjdCBhcHBlYXIgbGF0ZXIgaW4gdGhlIHBhcnNlIHRyZWUuCiAgICAgICAgICAgSXQgc2hvdWxkIHdvcmsgbm93LiAgUHJvYmxlbSByZXBvcnRlZCBieSBWaW4gSm92YW5vdmljLgoKMTEvMDkvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgU3VidGxlIGNoYW5nZSB0byAib3V0IiB0eXBlbWFwcyAoYW5kIHJlbGF0ZWQgdmFyaWF0aW9ucykuICBUaGUgbmFtZQogICAgICAgICAgIHRoYXQgaXMgYXR0YWNoZWQgdG8gdGhlIHR5cGVtYXAgaXMgbm93IHRoZSByYXcgQyBpZGVudGlmaWVyIHRoYXQKICAgICAgICAgICBhcHBlYXJzIG9uIGEgZGVjbGFyYXRpb24uICBUaGlzIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mCiAgICAgICAgICAgbWVtYmVyIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgZm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgIGNsYXNzIEJsYWggewogICAgICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgICAgaW50IGZvbygpOyAgICAvLyB0eXBlbWFwIGdldHMgYXBwbGllZAogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgIFByZXZpb3VzIHZlcnNpb25zIG5ldmVyIHJlYWxseSBzcGVjaWZpZWQgaG93IHRoaXMgd2FzIHN1cHBvc2VkIHRvCiAgICAgICAgICAgd29yay4gIEluIFNXSUcxLjEsIHlvdSBjb3VsZCBwcm9iYWJseSB3cml0ZSBhIHR5cGVtYXAgZm9yIHRoZQogICAgICAgICAgIHdyYXBwZXIgbmFtZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAob3V0KSBpbnQgQmxhaF9mb28geyAuLi4gfQoKICAgICAgICAgICBIb3dldmVyLCB0aGlzIG9sZCBiZWhhdmlvciBpcyBub3cgd2l0aGRyYXduIGFuZCBub3Qgc3VwcG9ydGVkLiAKICAgICAgICAgICBKdXN0IHVzZSB0aGUgbWVtYmVyIG5hbWUgd2l0aG91dCBhbnkgc29ydCBvZiBzcGVjaWFsIHByZWZpeC4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjExLzA2LzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gVGNsIG1vZHVsZSBpbml0aWFsaXphdGlvbjoKCiAgICAgICAgICAgKDEpIFNXSUcgbm93IGF1dG9tYXRpY2FsbHkgaW5jbHVkZXMgdGhlIGNvZGUgbmVlZGVkIHRvIHdvcmsgd2l0aAogICAgICAgICAgICAgICAgVGNsIHN0dWJzLiAgU2ltcGx5IGNvbXBpbGUgd2l0aCAtRFVTRV9UQ0xfU1RVQlMuCgogICAgICAgICAgICgyKSBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGNhbGxzIFRjbF9Qa2dQcm92aWRlIHRvIHJlZ2lzdGVyCiAgICAgICAgICAgICAgIGEgcGFja2FnZSBuYW1lLiAgVGhlIHBhY2thZ2UgbmFtZSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZQogICAgICAgICAgICAgICBzcGVjaWZpZWQgd2l0aCB0aGUgJW1vZHVsZSBkaXJlY3RpdmUuICBUaGUgdmVyc2lvbiBudW1iZXIgaXMKICAgICAgICAgICAgICAgc2V0IHRvICIwLjAiIGJ5IGRlZmF1bHQuICBUbyBjaGFuZ2UgdGhlIHZlcnNpb24gbnVtYmVyLCB1c2UKICAgICAgICAgICAgICAgc3dpZyAtcGtndmVyc2lvbiAxLjIgaW50ZXJmYWNlLmkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgIE1vZHVsZXMgdGhhdCBwcm92aWRlZCBzdHVicyBhbmQgVGNsX1BrZ1Byb3ZpZGUgb24gdGhlaXIgb3duIG1pZ2h0CiAgICAgICAgICAgYnJlYWsuICBTaW1wbHkgcmVtb3ZlIHRoYXQgY29kZS4KCjExLzA1LzIwMDE6YmVhemxleQogICAgICAgICAgIENoYW5nZWQgY29kZSBnZW5lcmF0aW9uIG9mIGNvbnN0YW50cyBpbiB0aGUgVGNsIG1vZHVsZS4gIENvbnN0YW50cwogICAgICAgICAgIGFyZSBub3cgc3RvcmVkIGluIGEgbGFyZ2UgdGFibGUgdGhhdCBnZXQgaW5zdGFsbGVkIGF0IG1vZHVsZSBzdGFydHVwLgogICAgICAgICAgIFRoZXJlIGFyZSBhbHNvIG5vIGxvbmdlciBhbnkgc3RhdGljIHZhcmlhYmxlcyBzbyBpdCBzaG91bGQgZ2VuZXJhdGUKICAgICAgICAgICBzb21ld2hhdCBsZXNzIGNvZGUuCgoxMS8wNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBUaGUgImNvbnN0IiB0eXBlbWFwIGhhcyBiZWVuIHJlbmFtZWQgdG8gImNvbnN0YW50IiBpbiBtYW55IGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcy4gICJjb25zdCIgaXMgYSBDIGtleXdvcmQgd2hpY2ggbWFkZSB0aGUgaGFuZGxpbmcgb2YgdGhlIHR5cGVtYXAKICAgICAgICAgICBkaXJlY3RpdmUgc29tZXdoYXQgYXdrd2FyZCBpbiB0aGUgcGFyc2VyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMDQvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgJXR5cGVtYXAgZGlyZWN0aXZlIGNhbiBub3cgYWNjZXB0IG5lYXJseSBhcmJpdHJhcnkga2V5d29yZCBwYXJhbWV0ZXJzLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAldHlwZW1hcChpbixwYXJzZT0iaSIsZG9jPSJpbnRlZ2VyIikgaW50ICIuLi4iOwoKICAgICAgICAgICBUaGUgcHVycG9zZSBvZiB0aGUga2V5d29yZCBwYXJhbWV0ZXJzIGlzIHRvIHN1cHBseSBjb2RlIGdlbmVyYXRpb24KICAgICAgICAgICBoaW50cyB0byB0aGUgdGFyZ2V0IGxhbmd1YWdlIG1vZHVsZS4gICBUaGUgaW50ZXByZXRhdGlvbiBvZiB0aGUKICAgICAgICAgICBwYXJhbWV0ZXJzIGlzIGxhbmd1YWdlIHNwZWNpZmljLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzA0LzIwMDE6YmVhemxleQogICAgICAgICAgIFNsaWdodCBzZW1hbnRpYyBjaGFuZ2UgdG8gaW50ZXJuYWwgY2FsbC9yZXR1cm4gYnkgdmFsdWUgaGFuZGxpbmcuCiAgICAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgY2FsbC1ieS12YWx1ZSB3YXMgdHJhbnNsYXRlZAogICAgICAgICAgIGludG8gcG9pbnRlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGRvdWJsZSBkb3RfcHJvZHVjdChWZWN0b3IgYSwgVmVjdG9yIGIpOwoKICAgICAgICAgICB0dXJuZWQgaW50byB0aGlzOgoKICAgICAgICAgICAgICAgZG91YmxlIHdyYXBfZG90X3Byb2R1Y3QoVmVjdG9yICphLCBWZWN0b3IgKmIpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdF9wcm9kdWN0KCphLCpiKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIHRyYW5zbGF0aW9uIHdhcyBub3JtYWxseSBwZXJmb3JtZWQgYnkgdGhlIFNXSUcgY29yZSwgb3V0c2lkZQogICAgICAgICAgIG9mIHRoZSBjb250cm9sIG9mIGxhbmd1YWdlIG1vZHVsZXMuICBIb3dldmVyLCBhIHNpZGUgZWZmZWN0CiAgICAgICAgICAgb2YgdGhpcyB3YXMgYSBsb3Qgb2YgYml6YXJyZSB0eXBlbWFwIGJlaGF2aW9yLiAgIEZvciBleGFtcGxlLAogICAgICAgICAgIGlmIHlvdSBkaWQgc29tZXRoaW5nIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgaW50MzIgewogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBZb3Ugd291bGQgZmluZCB0aGF0IGludDMyIHdhcyB0cmFuc2Zvcm1lZCBpbnRvIGEgcG9pbnRlciBldmVyeXdoZXJlIQogICAgICAgICAgIChuZWVkbGVzcyB0byBzYXksIHN1Y2ggYmVoYXZpb3IgaXMgdW5leHBlY3RlZCBhbmQgcXVpdGUgYXdrd2FyZCB0bwogICAgICAgICAgIGRlYWwgd2l0aCkuICBUbyBtYWtlIG1hdHRlcnMgd29yc2UsIGlmIGEgdHlwZWRlZiB3YXMgYWxzbyB1c2VkLAogICAgICAgICAgIHRoZSBwb2ludGVyIGJlaGF2aW9yIHN1ZGRlbmx5IGRpc2FwcGVhcmVkLgoKICAgICAgICAgICBUbyBmaXggdGhpcywgdGhlIHBvaW50ZXIgdHJhbnNmb3JtYXRpb24gaXMgbm93IHB1c2hlZCB0byB0aGUKICAgICAgICAgICBsYW5ndWFnZSBtb2R1bGVzLiAgIFRoaXMgcHJvZHVjZXMgd3JhcHBlcnMgdGhhdCBsb29rIHJvdWdobHkKICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICBkb3VibGUgd3JhcF9kb3RfcHJvZHVjdChWZWN0b3IgKmEsIFZlY3RvciAqYikgewogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMSA9ICphOwogICAgICAgICAgICAgICAgICBWZWN0b3IgYXJnMiA9ICpiOwogICAgICAgICAgICAgICAgICByZXR1cm4gZG90X3Byb2R1Y3QoYXJnMSxhcmcyKTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGlzIGNoYW5nZSBhbHNvIG1ha2VzIGl0IGVhc3kgdG8gZGVmaW5lIHR5cGVtYXBzIGZvcgogICAgICAgICAgIGFyYml0cmFyeSB1bmRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSwgeW91IGNhbiBkbyB0aGlzIChhbmQgaXQKICAgICAgICAgICB3aWxsIHdvcmsgcmVnYXJkbGVzcyB3aGF0IGludDMyIGlzKToKCiAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQzMiB7CiAgICAgICAgICAgICAgICAgICQxID0gKGludDMyKSBQeUludF9Bc0xvbmcoJGlucHV0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAqKiogUE9URU5USUFMIElNQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgICBUaGlzIGNoYW5nZSBtYXkgYnJlYWsgY2FsbC9yZXR1cm4gYnkgdmFsdWUgY29kZSBnZW5lcmF0aW9uIGluCiAgICAgICAgICAgc29tZSBsYW5ndWFnZSBtb2R1bGVzLgoKMTEvMDMvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlZCB0aGUgbmFtZSBvZiB0aGUgZGVmYXVsdCB0eXBlbWFwcyB0byB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAgeyAKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBvYmplY3QgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAqIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHBvaW50ZXIgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSAmIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIFtdIHsKICAgICAgICAgICAgICAgICAgIC4uLiBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIGVudW0gU1dJR1RZUEUgewogICAgICAgICAgICAgICAgICAuLi4gYW4gZW51bSB2YWx1ZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdUWVBFIChDTEFTUzo6KikgewogICAgICAgICAgICAgICAgICAgLi4uIHBvaW50ZXIgdG8gbWVtYmVyIC4uLgogICAgICAgICAgICAgICB9CgoKICAgICAgICAgICBUaGVzZSB0eXBlcyBhcmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBmb3IgYWxsIHR5cGVzIHRoYXQgZG9uJ3QgbWF0Y2gKICAgICAgICAgICBhbnl0aGluZyBlbHNlLiAgU2VlIENIQU5HRVMgbG9nIGVudHJ5IGZvciA4LzI3LzIwMDAgZm9yIHRoZQogICAgICAgICAgIG9sZCBiZWhhdmlvci4gIFRoZSByb2xlIG9mIHRoZXNlIHR5cGVzIGlzIGFsc28gZGVzY3JpYmVkIGluIAogICAgICAgICAgIERvYy9NYW51YWwvVHlwZW1hcHMuaHRtbAoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIAoxMC8yNS8yMDAxOmJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCBHdWlsZSBhbmQgTXpzY2hlbWUgbW9kdWxlcyB0byBzdXBwb3J0CiAgICAgICAgICAgbXVsdGktYXJndW1lbnQgdHlwZW1hcHMuCgoxMC8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gRml4IHRvIGhhbmRsZSBwb2ludGVycyB0byBhcnJheXMuCgoxMC8yNC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBEZWZpbmluZyBhIHR5cGVtYXAgcnVsZSBmb3IgZW51bSBTV0lHRU5VTSBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgICB0byBkZWZpbmUgZGVmYXVsdCBiZWhhdmlvciBmb3IgZW51bSB2YXJpYWJsZXMuCgoxMC8yMi8yMDAxOmJlYXpsZXkKICAgICAgICAgICBSdWJ5IG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IG11bHRpLWFyZ3VtZW50IHR5cGVtYXBzLgoKMTAvMjIvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgVGhlIFJ1YnkgbW9kdWxlIGNhbiBub3cgaGFuZGxlIGZ1bmN0aW9ucyB3aXRoIGFuIGFyYml0cmFyeQogICAgICAgICAgIG51bWJlciBvZiBhcmd1bWVudHMuICBQcmV2aW91cyB2ZXJzaW9ucyB3ZXJlIGxpbWl0ZWQgdG8gCiAgICAgICAgICAgdG8gZnVuY3Rpb25zIHdpdGggb25seSA5IG9yIDE2IGFyZ3VtZW50cyBkZXBlbmRpbmcgb24KICAgICAgICAgICB0aGUgdXNlIG9mIGRlZmF1bHQgYXJndW1lbnRzLiAgIE5vdGU6IGZyb20gc29tZSBpbnNwZWN0aW9uCiAgICAgICAgICAgb2YgdGhlIFJ1YnkgaW50ZXJwcmV0ZXIgc291cmNlLCB0aGUgbmV3IGFwcHJvYWNoIG1pZ2h0IGJlCiAgICAgICAgICAgYSBsaXR0bGUgZmFzdGVyIGFzIHdlbGwuCgoxMC8xOC8yMDAxOmJlYXpsZXkKICAgICAgICAgICBGaXhlZCBhIGJ1ZyB3aXRoIGZvcndhcmQgY2xhc3MgZGVjbGFyYXRpb25zIGFuZAogICAgICAgICAgIHRlbXBsYXRlcy4KCiAgICAgICAgICAgICAgICAgY2xhc3MgRm9vIDxTLFQ+OwoKICAgICAgICAgICBCdWcgcmVwb3J0ZWQgYnkgSXJpbmEgS290bG92YS4KCjEwLzE2LzIwMDE6YmVhemxleQogICAgICAgICAgIFN1cHBvcnQgZm9yIG11bHRpdmFsdWVkIHR5cGVtYXBzIGFkZGVkLiAgVGhlIHR5cGVtYXBzCiAgICAgICAgICAgYXJlIHNwZWNpZmllZCB1c2luZyB0aGUgc3ludGF4IGJlbG93LiAgIFdpdGhpbiBlYWNoCiAgICAgICAgICAgdHlwZW1hcCwgdmFyaWFibGUgc3Vic3RpdHV0aW9uIGlzIGhhbmRsZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CiAgICAgICAgICAgICAgICAgICRhcmc7ICAvLyBUaGUgaW5wdXQgb2JqZWN0IGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UKICAgICAgICAgICAgICAgICAgJDE7ICAgIC8vIEMgbG9jYWwgdmFyaWFibGUgZm9yIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgICAgICAgICAgICQyOyAgICAvLyBDIGxvY2FsIHZhcmlhYmxlIGZvciBzZWNvbmQgYXJndW1lbnQKCiAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHZhcmlhYmxlcyByZWZlciB0byBlaXRoZXIgYXJndW1lbnQKICAgICAgICAgICAgICAgICAgJDFfdHlwZSwgJDFfbHR5cGUsICQxX2Jhc2V0eXBlLCBldGMuLi4gIChhcmdjKQogICAgICAgICAgICAgICAgICAkMl90eXBlLCAkMl9sdHlwZSwgJDJfYmFzZXR5cGUsIGV0Yy4uLiAgKGFyZ3ZbXSkKCiAgICAgICAgICAgICAgICAgIC8vIEFycmF5IGRpbWVuc2lvbiBvZiBhcmd2CiAgICAgICAgICAgICAgICAgICQyX2RpbTAKICAgICAgICAgICAgICB9CgogICAgICAgICAgIEJhc2ljYWxseSBhbnkgdmFyaWFibGUgdGhhdCB3YXMgYXZhaWxhYmxlIGluIG5vcm1hbCB0eXBlbWFwcwogICAgICAgICAgIGlzIGF2YWlsYWJsZSBmb3IgZWl0aGVyIGFyZ3VtZW50IGJ5IHByZWZhY2luZyB0aGUgdmFyaWFibGUKICAgICAgICAgICBuYW1lIGJ5ICckbl8nIHdoZXJlIG4gaXMgdGhlIGFyZ3VtZW50IHBvc2l0aW9uLgoKICAgICAgICAgICBOb3RlczogIAogICAgICAgICAgICgxKSBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgY2FuIG9ubHkgYmUgYXBwbGllZCB0byBhIHNpbmdsZQogICAgICAgICAgICAgICBvYmplY3QgaW4gdGhlIHRhcmdldCBzY3JpcHRpbmcgbGFuZ3VhZ2UuICAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgIHlvdSBjYW4gc3BsaXQgYSBzdHJpbmcgaW50byBhIChjaGFyICosIGludCkgcGFpciBvcgogICAgICAgICAgICAgICBzcGxpdCBhIGxpc3QgaW50byBhIChpbnQsIGNoYXIgW10pIHBhaXIuICBJdCBpcyBub3QKICAgICAgICAgICAgICAgcG9zc2libGUgdG8gbWFwIG11bHRpcGxlIG9iamVjdHMgdG8gbXVsdGlwbGUgYXJndW1lbnRzLgoKICAgICAgICAgICAoMikgVG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIFNXSUcgdmVyc2lvbnMsIHRoZQogICAgICAgICAgICAgICB2YXJpYWJsZXMgc3VjaCBhcyAkdGFyZ2V0IGFuZCAkdHlwZSBhcmUgcHJlc2VydmVkIGFuZAogICAgICAgICAgICAgICBhcmUgbWFwcGVkIG9udG8gdGhlIGZpcnN0IGFyZ3VtZW50IG9ubHkuCgogICAgICAgICAgICgzKSBUaGlzIHNob3VsZCBub3QgYWZmZWN0IGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBjb2RlLgogICAgICAgICAgICAgICBNdWx0aS12YWx1ZWQgdHlwZW1hcHMgYXJlIGFuIGV4dGVuc2lvbiB0byB0eXBlbWFwIGhhbmRsaW5nLgogICAgICAgICAgICAgICBTaW5nbGUgdmFsdWVkIHR5cGVtYXBzIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHVzdWFsCiAgICAgICAgICAgICAgIHdheS4KCiAgICAgICAgICAgVGhlIG9sZCAkc291cmNlIGFuZCAkdGFyZ2V0IHZhcmlhYmxlcyBhcmUgb2ZmaWNpYWxseQogICAgICAgICAgIGRlcHJlY2F0ZWQuICBJbnB1dCB2YXJpYWJsZXMgYXJlIHJlZmVyZW5jZWQgdGhyb3VnaAogICAgICAgICAgICRhcmckIGFuZCBvdXRwdXQgdmFsdWVzIGFyZSByZWZlcmVuY2UgdGhyb3VnaCAkcmVzdWx0JC4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvMTYvMjAwMTpiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgcGFyc2luZyBzdXBwb3J0IGZvciBtdWx0aXZhbHVlZCB0eXBlbWFwcy4gIFRoZSBzeW50YXgKICAgICAgICAgICBpcyBhIGxpdHRsZSBmdW5reSwgYnV0IGhlcmUgZ29lczoKCiAgICAgICAgICAgICAgLy8gRGVmaW5lIGEgbXVsdGl2YWx1ZWQgdHlwZW1hcAogICAgICAgICAgICAgICV0eXBlbWFwKGluKSAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBNdWx0aXZhbHVlZCB0eXBlbWFwIHdpdGggbG9jYWxzCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnYywgY2hhciAqYXJndltdKShpbnQgdGVtcCkgewogICAgICAgICAgICAgICAgICAgIC4uLiB0eXBlbWFwIGNvZGUgLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIAogICAgICAgICAgICAgIC8vIENvcHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSA9IChpbnQgYXJnYywgY2hhciAqYXJndltdKTsKCiAgICAgICAgICAgICAgLy8gQXBwbHkgYSBtdWx0aXZhbHVlZCB0eXBlbWFwCiAgICAgICAgICAgICAgJWFwcGx5IChpbnQgYXJnYywgY2hhciAqYXJndltdKSB7IChpbnQgYXJnY291bnQsIGNoYXIgKiphcmd2KSB9OwoKICAgICAgICAgICBOb3RlOiB0aGlzIGV4dHJhIHBhcnNpbmcgc3VwcG9ydCBpcyBhZGRlZCBmb3IgZnV0dXJlIGV4dGVuc2lvbi4KICAgICAgICAgICBObyBsYW5ndWFnZSBtb2R1bGVzIGN1cnJlbnRseSBzdXBwb3J0IG11bHRpLXZhbHVlZCB0eXBlbWFwcy4KCjEwLzExLzIwMDE6YmVhemxleQogICAgICAgICAgIE1vZGlmaWVkIHRoZSB0eXBlbWFwIG1hdGNoaW5nIGNvZGUgdG8gZGlzY2FyZCBxdWFsaWZpZXJzIHdoZW4KICAgICAgICAgICBjaGVja2luZyBmb3IgYSBtYXRjaC4gICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBkZWNsYXJhdGlvbgogICAgICAgICAgIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAgdm9pZCBibGFoKGNvbnN0IGNoYXIgKngpOwoKICAgICAgICAgICBUaGUgdHlwZW1hcCBjaGVja2VyIGNoZWNrcyBmb3IgYSBtYXRjaCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgoKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp4CiAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICAgY2hhciAqeAogICAgICAgICAgICAgICAgIGNoYXIgKgoKICAgICAgICAgICBJZiB0eXBlZGVmJ3MgYXJlIGludm9sdmVkLCBxdWFsaWZpZXIgc3RyaXBwaW5nIG9jY3VycyBiZWZvcmUKICAgICAgICAgICB0eXBlZGVmIHJlc29sdXRpb24uICBTbyBpZiB5b3UgaGFkIHRoaXMsCgogICAgICAgICAgICAgICAgdHlwZWRlZiBjaGFyICpzdHJpbmc7CiAgICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3Qgc3RyaW5nIHgpOwoKICAgICAgICAgICB0eXBlbWFwIGNoZWNraW5nIHdvdWxkIGJlIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nIHgKICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZwogICAgICAgICAgICAgICAgc3RyaW5nIHgKICAgICAgICAgICAgICAgIHN0cmluZwogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqeAogICAgICAgICAgICAgICAgY29uc3QgY2hhciAqCiAgICAgICAgICAgICAgICBjaGFyICp4CiAgICAgICAgICAgICAgICBjaGFyICoKCiAgICAgICAgICAgVGhlIHByaW1hcnkgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBzaW1wbGlmeSB0aGUgaW1wbGVtZW50YXRpb24KICAgICAgICAgICBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV2l0aG91dCBxdWFsaWZpZXIgc3RyaXBwaW5nLCBvbmUgaGFzIHRvIHdyaXRlCiAgICAgICAgICAgc2VwZXJhdGUgdHlwZW1hcHMgZm9yIGFsbCB2YXJpYXRpb25zIG9mIGNvbnN0IGFuZCB2b2xhdGlsZSAod2hpY2gKICAgICAgICAgICBpcyBhIHBhaW4pLgoKICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogIFR5cGVtYXBzIG1pZ2h0IGJlIGFwcGxpZWQgaW4KICAgICAgICAgICBwbGFjZXMgd2hlcmUgdGhleSB3ZXJlbid0IGJlZm9yZS4KCgoxMC85LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBnZW5lcmF0ZXMgd3JhcHBlcnMgdGhhdCBwcm9wZXJseSBkaXNhbWJpZ3VhdGUKICAgICAgICAgICBvdmVybG9hZGVkIG1ldGhvZHMgdGhhdCBvbmx5IHZhcnkgaW4gY29uc3RuZXNzLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoKTsKICAgICAgICAgICAgICAgICAgdm9pZCBibGFoKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBUbyBoYW5kbGUgdGhpcywgdGhlICVyZW5hbWUgZGlyZWN0aXZlIGNhbiBiZSB1c2VkIG5vcm1hbGx5LgogICAgICAgICAgIAogICAgICAgICAgICAgICAlcmVuYW1lKGJsYWhfY29uc3QpIGJsYWgoKSBjb25zdDsKCiAgICAgICAgICAgSW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUsIG1ldGhvZCBjYWxscyBsaWtlIHRoaXMKICAgICAgICAgICBhcmUgbm93IGdlbmVyYXRlZDoKCiAgICAgICAgICAgICAgIChvYmopLT5ibGFoKCkgICAgICAgICAgICAgICAvLyBOb24tY29uc3QgdmVyc2lvbgogICAgICAgICAgICAgICAoKEZvbyBjb25zdCAqKW9iaiktPmJsYWgoKSAgLy8gY29uc3QgdmVyc2lvbgoKICAgICAgICAgICBUaGlzIHNob3VsZCBmb3JjZSB0aGUgcmlnaHQgbWV0aG9kIHRvIGJlIGludm9rZWQuCiAgICAgICAgICAgQWRtaXR0ZWRseSwgdGhpcyBpcyBwcm9iYWJseSBvYnNjdXJlLCBidXQgd2UgbWlnaHQKICAgICAgICAgICBhcyB3ZWxsIGdldCBpdCByaWdodC4KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSBwcmVwcm9jZXNzb3Igbm93IGlnbm9yZXMgJ1xyJyBpbiB0aGUgaW5wdXQuCiAgICAgICAgICAgVGhpcyBzaG91bGQgZml4IHRoZSBmb2xsb3dpbmcgYnVnOgogICAgICAgICAgIFsgIzQ2ODQxNiBdIFNXSUcgdGhpbmtzIG1hY3JvIGRlZnMgYXJlIGRlY2xhcmF0aW9ucz8KCjEwLzgvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIHx8LCAmJiwgYW5kICEgaW4gY29uc3RhbnRzLiAgVGhpcwogICAgICAgICAgIGZpeGVzIFNGIFsgIzQ2ODk4OCBdIExvZ2ljYWwgb3BzIGJyZWFrIHByZXByb2Nlc3Nvci4KICAgICAgICAgICBIb3dldmVyLCBhdCB0aGlzIHRpbWUsIGNvbnN0YW50cyB1c2luZyB0aGVzZSBvcGVyYXRvcnMKICAgICAgICAgICBhcmUgbm90IHN1cHBvcnRlZCAodGhlIHBhcnNlciB3aWxsIGlzc3VlIGEgd2FybmluZykuCgoxMC80LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAtc2hvd190ZW1wbGF0ZXMgY29tbWFuZCBsaW5lIG9wdGlvbi4gIFRoaXMgbWFrZXMKICAgICAgICAgICBTV0lHIGRpc3BsYXkgdGhlIGNvZGUgaXQgYWN0dWFsbHkgcGFyc2VzIHRvIGdlbmVyYXRlCiAgICAgICAgICAgdGVtcGxhdGUgd3JhcHBlcnMuICBNb3N0bHkgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHNlbWFudGljcyBvZiAldGVtcGxhdGUgZGlyZWN0aXZlLiAgV2hlbgogICAgICAgICAgIHVzaW5nICV0ZW1wbGF0ZSwgdGhlIHRlbXBsYXRlIGFyZ3VtZW50cyBhcmUgaGFuZGxlZAogICAgICAgICAgIGFzIHR5cGVzIGJ5IGRlZmF1bHQuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50PjsKICAgICAgICAgICAgICAgICV0ZW1wbGF0ZSh2ZWNkb3VibGUpIHZlY3Rvcjxkb3VibGU+OwoKICAgICAgICAgICBUbyBzcGVjaWZ5IGEgdGVtcGxhdGUgYXJndW1lbnQgdGhhdCBpcyAqbm90KiBhIHR5cGUsIHlvdQogICAgICAgICAgIG5lZWQgdG8gdXNlIGRlZmF1bHQtdmFsdWUgc3ludGF4LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjaW50KSB2ZWN0b3I8aW50LGludD01MD47CiAgICAgICAgICAgICAgICAldGVtcGxhdGUodmVjZG91YmxlKSB2ZWN0b3I8aW50LHNpemU9MTAwPjsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBuYW1lIGRvZXNuJ3QgcmVhbGx5IG1hdHRlci0tb25seQogICAgICAgICAgIHRoZSBkZWZhdWx0IHZhbHVlIChlLmcuLCA1MCwgMTAwKSBpcyB1c2VkIGR1cmluZwogICAgICAgICAgIGV4cGFuc2lvbi4gIFRoaXMgZGlmZmVycyBmcm9tIG5vcm1hbCBDKyssIGJ1dCBJIGNvdWxkbid0CiAgICAgICAgICAgZmlndXJlIG91dCBhIGJldHRlciB3YXkgdG8gZG8gaXQgaW4gdGhlIHBhcnNlci4gIE1pZ2h0CiAgICAgICAgICAgaW1wbGVtZW50IGFuIGFsdGVybmF0aXZlIGxhdGVyLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgCjEwLzQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1ham9yIGNoYW5nZXMgdG8gdGVtcGxhdGUgaGFuZGxpbmcgaW4gb3JkZXIgdG8gcHJvdmlkZQogICAgICAgICAgIGJldHRlciBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBDKysgdHlwZS1zeXN0ZW0uIFRoZSBtYWluCiAgICAgICAgICAgcHJvYmxlbSBpcyBhcyBmb2xsb3dzOgoKICAgICAgICAgICBTdXBwb3NlIHlvdSBoYXZlIGEgdGVtcGxhdGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBUPiB2b2lkIGJsYWgoY29uc3QgVCB4KSB7IHN0dWZmIH07CiAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICBOb3cgc3VwcG9zZSwgdGhhdCB5b3UgaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIG9uIGEKICAgICAgICAgICB0eXBlIGxpa2UgdGhpcyBpbiBTV0lHOgoKICAgICAgICAgICAgICAldGVtcGxhdGUoYmxhaGludCkgYmxhaDxpbnQgKj47CgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyAqc3VwcG9zZWQqIHRvIGdlbmVyYXRlIGNvZGUgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoaW50ICpjb25zdCB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIEhvd2V2ZXIsIGluIFNXSUctMS4zLjksIHRoZSB0ZW1wbGF0ZSBzdWJzdGl0dXRpb24gZ2V0cyBpdCB3cm9uZwogICAgICAgICAgIGFuZCBwcm9kdWNlcwoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgaW50ICp4KSB7IHN0dWZmIH07CgogICAgICAgICAgIChub3RpY2UgdGhlIGJhZCBwbGFjZW1lbnQgb2YgdGhlICdjb25zdCcgcXVhbGlmaWVyKS4KCiAgICAgICAgICAgVG8gZml4IHRoaXMsIHRoZSBTV0lHIHBhcnNlciBub3cgZ2VuZXJhdGVzIGltcGxpY2l0IHR5cGVkZWZzCiAgICAgICAgICAgZm9yIHRlbXBsYXRlIHR5cGUgYXJndW1lbnRzIHRoYXQgcHJvZHVjZXMgY29kZSByb3VnaGx5CiAgICAgICAgICAgZXF1aXZhbGVudCB0byBkb2luZyB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCAqX19zd2lndG1wbDE7CiAgICAgICAgICAgICAgJXRlbXBsYXRlKGJsYWhpbnQpIGJsYWg8X19zd2lndG1wbDE+OwoKICAgICAgICAgICB3aGljaCBnZW5lcmF0ZXMgY29kZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHZvaWQgYmxhaChjb25zdCBfX3N3aWd0bXBsMSB4KSB7IHN0dWZmIH07CgogICAgICAgICAgIFNpbmNlIHRoaXMgaXMgY29ycmVjdCBpbiBib3RoIEMrKyBhbmQgU1dJRywgaXQgcHJvdmlkZXMgdGhlIHJpZ2h0CiAgICAgICAgICAgc2VtYW50aWNzIGFuZCBhbGxvd3MgZXZlcnl0aGluZyB0byBjb21waWxlIHByb3Blcmx5LiAgSG93ZXZlciwKICAgICAgICAgICB0byBjbGVhbiB1cCB0aGUgZ2VuZXJhdGVkIGNvZGUgYSBsaXR0bGUgYml0LCB0aGUgcGFyc2VyIGtlZXBzCiAgICAgICAgICAgdHJhY2sgb2YgdGhlIHRlbXBsYXRlIHR5cGVzIGFuZCBwZXJmb3JtcyBiYWNrLXN1YnN0aXR1dGlvbiB0bwogICAgICAgICAgIHRoZSBvcmlnaW5hbCB0eXBlIHdoZW4gYnVpbGRpbmcgdGhlIHBhcnNlIHRyZWUuICBUaHVzLCBldmVuCiAgICAgICAgICAgdGhvdWdoIHRoZSBpbXBsaWNpdCB0eXBlZGVmIGlzIHVzZWQgaW4gdGhlIGlucHV0IGFuZCBtYXkgYXBwZWFyCiAgICAgICAgICAgaW4gdGhlIGdlbmVyYXRlZCB3cmFwcGVyIGZpbGUgKGZvciBwcm9wZXIgY29tcGlsYXRpb24pLCB0aGUgcGFyc2UKICAgICAgICAgICB0cmVlIHdpbGwgaGlkZSBhIGxvdCBvZiB0aGVzZSBkZXRhaWxzLiAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB2b2lkIGJsYWgoY29uc3QgX19zd2lndG1wbDEgeCkgeyBzdHVmZiB9OwoKICAgICAgICAgICB3aWxsIGxvb2sgbGlrZSBpdCB3YXMgZGVjbGFyZWQgYXMgZm9sbG93cyAod2hpY2ggaXMgd2hhdAogICAgICAgICAgIHlvdSB3YW50KToKCiAgICAgICAgICAgICAgdm9pZCBibGFoKGludCAqY29uc3QgeCkgeyBzdHVmZiB9CgogICAgICAgICAgIFRoZSBvbmx5IHBsYWNlIHlvdSBhcmUgbGlrZWx5IHRvIG5vdGljZSB0aGUgdHlwZWRlZiBoYWNrCiAgICAgICAgICAgaXMgaW4gYm9kaWVzIG9mIHRlbXBsYXRlIGZ1bmN0aW9ucy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICBkaWQgdGhpcywKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgYmxhaCB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICVhZGRtZXRob2RzIHsKICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNwYW0oKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgVCAgdGVtcHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CgogICAgICAgICAgIHlvdSB3aWxsIGZpbmQgdGhhdCAnVCB0ZW1wdmFsdWUnIGdvdCBleHBhbmRlZCBpbnRvIHNvbWUKICAgICAgICAgICBzdHJhbmdlIHR5cGVkZWYgdHlwZS4gIFRoaXMgKnN0aWxsKiBjb21waWxlcyBjb3JyZWN0bHkgCiAgICAgICAgICAgc28gaXQncyBub3QgYSBiaWcgZGVhbCAob3RoZXIgdGhhbiBsb29raW5nIGtpbmQgb2YgdWdseQogICAgICAgICAgIGluIHRoZSB3cmFwcGVyIGZpbGUpLgoKMTAvNC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgc29tZSBpbmhlcml0YW5jZSBwcm9ibGVtcyBpbiBUY2wgT2JqZWN0IGludGVyZmFjZS4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIFRjbCBtb2R1bGUgaGFzIGNoYW5nZWQgdG8gdXNlIGJ5dGUtYmFja2VkIHBvaW50ZXIgc3RyaW5ncy4gIFRoaXMKICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgc2FmZSBvbiA2NC1iaXQgcGxhdGZvcm1zLiAgSG93ZXZlciwKICAgICAgICAgICB0aGUgb3JkZXIgaW4gd2hpY2ggZGlnaXRzIGFwcGVhciBpbiBwb2ludGVyIHZhbHVlcyBubyBsb25nZXIKICAgICAgICAgICBkaXJlY3RseSBjb3JyZXNwb25kcyB0byB0aGUgYWN0dWFsIG51bWVyaWNhbCB2YWx1ZSBvZiBhCiAgICAgICAgICAgcG9pbnRlciAob24gbGl0dGxlLWVuZGlhbiBtYWNoaW5lcywgcGFpcnMgb2YgZGlnaXRzIGFwcGVhcgogICAgICAgICAgIGluIHJldmVyc2Ugb3JkZXIpLgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUGVybDUgbW9kdWxlIGlzIG5vdyBkcml2ZW4gYnkgYSBjb25maWd1cmF0aW9uIGZpbGUgJ3Blcmw1LnN3ZycKICAgICAgICAgICBpbiB0aGUgU1dJRyBsaWJyYXJ5LgoKMTAvMS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlIHBlcmw1IG1vZHVsZSBubyBsb25nZXIgdHJpZXMgdG8gYXBwbHkgdGhlICJvdXQiIHR5cGVtYXAKICAgICAgICAgICBpbiBjb2RlIGdlbmVyYXRlZCBmb3IgbWFnaWMgdmFyaWFibGVzLiAgSSdtIHN1cnByaXNlZCB0aGF0CiAgICAgICAgICAgdGhpcyBldmVyIHdvcmtlZCBhdCBhbGwgKHNpbmNlIGFsbCBvZiB0aGUgY29kZSB0aGF0IHdhcyB0aGVyZQogICAgICAgICAgIHdhcyB3cm9uZyBhbnl3YXlzKS4gICBVc2UgdGhlICJ2YXJvdXQiIHR5cGVtYXAgdG8gaGFuZGxlCiAgICAgICAgICAgZ2xvYmFsIHZhcmlhYmxlcy4KCjEwLzEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIGEgYnVnIHJlbGF0ZWQgdG8gY2hhcmFjdGVyIGFycmF5IG1lbWJlcnMgb2Ygc3RydWN0dXJlcy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgRm9vIHsKICAgICAgICAgICAgICAgICAgIGNoYXIgbmFtZVszMl07CiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICBTV0lHIGlzIG5vcm1hbGx5IHN1cHBvc2VkIHRvIHJldHVybiBhIHN0cmluZywgYnV0IHRoaXMgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy45LiAgIFRoZSByZWFzb24gaXQgd2FzIGJyb2tlbiB3YXMgYWN0dWFsbHkKICAgICAgICAgICBkdWUgdG8gYSBzdWJ0bGUgbmV3IGZlYXR1cmUgb2YgdHlwZW1hcHMuICBXaGVuIGEgZGF0YSBtZW1iZXIKICAgICAgICAgICBpcyBzZXQgdG8gYW4gYXJyYXkgbGlrZSB0aGlzLCB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHJlbGF0ZWQKICAgICAgICAgICBhY2Nlc3NvciBmdW5jdGlvbiBpcyBhY3R1YWxseSBzZXQgdG8gYW4gYXJyYXkuICBUaGlzIG1lYW5zCiAgICAgICAgICAgdGhhdCB5b3UgY2FuIG5vdyB3cml0ZSB0eXBlbWFwcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICV0eXBlbWFwKHB5dGhvbixvdXQpIGNoYXIgW0FOWV0gewogICAgICAgICAgICAgICAgICR0YXJnZXQgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgkc291cmNlLCRkaW0wKTsKICAgICAgICAgICAgICB9CgogICAgICAgICAgIFRoaXMgZnVuY3Rpb25hbGl0eSBjYW4gYmUgdXNlZCB0byByZXBsYWNlIHRoZSBkZWZ1bmN0CiAgICAgICAgICAgbWVtYmVyb3V0IHR5cGVtYXAgaW4gYSBtb3JlIGVsZWdhbnQgbWFubmVyLgoKOS8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgU29tZSBmdXJ0aGVyIHJlZmluZW1lbnQgb2YgcXVhbGlmaWVkIEMrKyBtZW1iZXIgZnVuY3Rpb25zLgogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAoaSkgVGhlIFNXSUcgcGFyc2VyIHdhcyBleHRlbmRlZCBzbGlnaHRseSB0byBhbGxvdyAndm9sYXRpbGUnCiAgICAgICAgICAgYW5kIGNvbWJpbmF0aW9ucyBvZiAnY29uc3QnIGFuZCAndm9sYXRpbGUnIHRvIGJlIHVzZWQuICBUaGlzCiAgICAgICAgICAgaXMgcHJvYmFibHkgcmFyZSwgYnV0IHRlY2huaWNhbGx5IGxlZ2FsLiAgT25seSBhZGRlZCBmb3IKICAgICAgICAgICBjb21wbGV0ZW5lc3MuCgogICAgICAgICAgIChpaSkgRm9yIHRoZSBwdXJwb3NlcyBvZiBvdmVybG9hZGluZywgcXVhbGlmaWVkIGFuZCBub24tcXVhbGlmaWVkCiAgICAgICAgICAgZnVuY3Rpb25zIGFyZSBkaWZmZXJlbnQuICBUaHVzLCB3aGVuIGEgY2xhc3MgaGFzIG1ldGhvZHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgICB2b2lkIGZvbygpOwogICAgICAgICAgICAgICAgIHZvaWQgZm9vKCkgY29uc3Q7CgogICAgICAgICAgIFR3byBkaXN0aW5jdCBtZXRob2RzIGFyZSBkZWNsYXJlZC4gIFRvIGRlYWwgd2l0aCB0aGlzLCAlcmVuYW1lCiAgICAgICAgICAgYW5kIHNpbWlsYXIgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZXh0ZW5kZWQgdG8gcmVjb2duaXplIGNvbnN0LgogICAgICAgICAgIFRodXMsIG9uZSBjYW4gZGlzYW1iaWd1YXRlIHRoZSB0d28gZnVuY3Rpb25zIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlcmVuYW1lKGZvb2NvbnN0KSBGb286OmZvbygpIGNvbnN0OwoKICAgICAgICAgICBvciBzaW1wbHkgaWdub3JlIHRoZSBjb25zdCB2YXJpYW50IGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICAlaWdub3JlIEZvbzo6Zm9vKCkgY29uc3Q7CgogICAgICAgICAgIE5vdGU6IFNXSUcgY3VycmVudGx5IGhhcyBubyB3YXkgdG8gYWN0dWFsbHkgaW52b2tlIHRoZSBjb25zdAogICAgICAgICAgIG1lbWJlciBzaW5jZSB0aGUgJ2NvbnN0JyBpcyBkaXNjYXJkZWQgd2hlbiBnZW5lcmF0aW5nIHdyYXBwZXJzCiAgICAgICAgICAgZm9yIG9iamVjdHMuICAKCjkvMjcvMjAwMTogYmVhemxleQogICAgICAgICAgIE5ldyBkaXJlY3RpdmUuICVuYW1ld2FybiBjYW4gYmUgdXNlZCB0byBpc3N1ZSB3YXJuaW5nCiAgICAgICAgICAgbWVzc2FnZXMgZm9yIGNlcnRhaW4gZGVjbGFyYXRpb24gbmFtZXMuICAgVGhlIG5hbWUKICAgICAgICAgICBtYXRjaGluZyBpcyB0aGUgc2FtZSBhcyBmb3IgdGhlICVyZW5hbWUgZGlyZWN0aXZlLgogICAgICAgICAgIFRoZSBpbnRlbnQgb2YgdGhpcyBkaXJlY3RpdmUgaXMgdG8gaXNzdWUgd2FybmluZ3MgZm9yCiAgICAgICAgICAgcG9zc2libGUgbmFtZXNwYWNlIGNvbmZsaWN0cy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlbmFtZXdhcm4oInByaW50IGlzIGEgcHl0aG9uIGtleXdvcmQiKSBwcmludDsKCiAgICAgICAgICAgVGhlIG5hbWUgbWF0Y2hpbmcgYWxnb3JpdGhtIGlzIHBlcmZvcm1lZCBhZnRlciBhIG5hbWUKICAgICAgICAgICBoYXMgYmVlbiByZXNvbHZlZCB1c2luZyAlcmVuYW1lLiAgVGhlcmVmb3JlLCBhCiAgICAgICAgICAgZGVjbGFyYXRpb24gbGlrZSB0aGlzIHdpbGwgbm90IGdlbmVyYXRlIGEgd2FybmluZzoKCiAgICAgICAgICAgICAgJXJlbmFtZSgiUHJpbnQiKSBwcmludDsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB2b2lkIHByaW50KCk7ICAgIC8qIE5vIHdhcm5pbmcgZ2VuZXJhdGVkICovCgogICAgICAgICAgIFNpbmNlIHRoZSB3YXJuaW5nIG1lY2hhbmlzbSBmb2xsb3dzICVyZW5hbWUgc2VtYW50aWNzLCBpdCBpcwogICAgICAgICAgIGFsc28gdG8gaXNzdWUgd2FybmluZ3MgZm9yIHNwZWNpZmljIGNsYXNzZXMgb3IganVzdCBmb3IKICAgICAgICAgICBjZXJ0YWluIG1lbWJlciBmdW5jdGlvbiBuYW1lcy4KCiAgICAgICAgICAgKERhdmUgLSBJJ3ZlIGJlZW4gdGhpbmtpbmcgYWJvdXQgYWRkaW5nIHNvbWV0aGluZyBsaWtlIHRoaXMKICAgICAgICAgICBmb3IgcXVpdGUgc29tZSB0aW1lLiAgSnVzdCBuZXZlciBnb3QgYXJvdW5kIHRvIGl0KQogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCgo5LzI3LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBFbmhhbmNlZCB0aGUgJWlnbm9yZSBkaXJlY3RpdmUgc28gdGhhdCB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICAgY2FuIGJlIGlzc3VlZCB0byB1c2Vycy4gICBUaGlzIGlzIGRvbmUgdXNpbmcgJWlnbm9yZXdhcm4KICAgICAgICAgICBsaWtlIHRoaXM6CgogICAgICAgICAgICAgJWlnbm9yZXdhcm4oIm9wZXJhdG9yIG5ldyBpZ25vcmVkIikgb3BlcmF0b3IgbmV3OwoKICAgICAgICAgICBUaGUgbmFtZXMgYW5kIHNlbWFudGljcyBvZiAlaWdub3Jld2FybiBpcyBleGFjdGx5IHRoZSAKICAgICAgICAgICBzYW1lIGFzICVpZ25vcmUuIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBkaXJlY3RpdmUKICAgICAgICAgICBpcyBmb3IgbW9kdWxlIHdyaXRlcnMgd2hvIHdhbnQgdG8gaWdub3JlIGNlcnRhaW4gdHlwZXMKICAgICAgICAgICBvZiBkZWNsYXJhdGlvbnMsIGJ1dCB3aG8gYWxzbyB3YW50IHRvIGFsZXJ0IHVzZXJzIGFib3V0IGl0LgogICAgICAgICAgIEEgdXNlciBtaWdodCBhbHNvIHVzZSB0aGlzIGZvciBkZWJ1Z2dpbmcgKHNpbmNlIG1lc3NhZ2VzCiAgICAgICAgICAgd2lsbCBhcHBlYXIgd2hlbmV2ZXIgYW4gaWdub3JlZCBkZWNsYXJhdGlvbiBhcHBlYXJzKS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo5LzI2LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTdXBlci1leHBlcmltZW50YWwgc3VwcG9ydCBmb3Igb3ZlcmxvYWRlZCBvcGVyYXRvcnMuIAogICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc2lzdHMgb2YgYSBmZXcgZGlmZmVyZW50IHBhcnRzLgoKICAgICAgICAgICAoaSkgT3BlcmF0b3IgbmFtZXMgc3VjaCBhcyAnb3BlcmF0b3IrJyBhcmUgbm93IGFsbG93ZWQKICAgICAgICAgICBhcyB2YWxpZCBkZWNsYXJhdG9yIG5hbWVzLiAgVGh1cyB0aGUgJ29wZXJhdG9yJyBzeW50YXgKICAgICAgICAgICBjYW4gYXBwZWFyICphbnlwbGFjZSogYSBub3JtYWwgZGVjbGFyYXRvciBuYW1lIHdhcyB1c2VkCiAgICAgICAgICAgYmVmb3JlLiAgT24gdGhlIHN1cmZhY2UsIHRoaXMgbWVhbnMgdGhhdCBvcGVyYXRvcnMgY2FuCiAgICAgICAgICAgYmUgcGFyc2VkIGp1c3QgbGlrZSBub3JtYWwgZnVuY3Rpb25zIGFuZCBtZXRob2RzLiAKICAgICAgICAgICBIb3dldmVyLCBpdCBhbHNvIG1lYW5zIHRoYXQgb3BlcmF0b3IgbmFtZXMgY2FuIGJlIHVzZWQKICAgICAgICAgICBpbiBtYW55IG90aGVyIFNXSUcgZGlyZWN0aXZlcyBsaWtlICVyZW5hbWUuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICVyZW5hbWUoX19hZGRfXykgQ29tcGxleDo6b3BlcmF0b3IrKGNvbnN0IENvbXBsZXggJik7CgogICAgICAgICAgIChpaSkgT3BlcmF0b3JzIGFyZSB3cmFwcGVkICpleGFjdGx5KiBsaWtlIG5vcm1hbCBmdW5jdGlvbnMKICAgICAgICAgICBhbmQgbWV0aG9kcy4gIEludGVybmFsbHksIHRoZSBvcGVyYXRvciBuYW1lIGlzIHVzZWQgCiAgICAgICAgICAgZGlyZWN0bHkgbWVhbmluZyB0aGF0IHRoZSB3cmFwcGVyIGNvZGUgbWlnaHQgY29udGFpbgogICAgICAgICAgIHN0YXRlbWVudHMgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAgIGFyZzAtPm9wZXJhdG9yKigoQ29tcGxleCBjb25zdCAmKSphcmcxKTsKCiAgICAgICAgICAgVGhpcyBhbGwgc2VlbXMgdG8gcGFyc2UgYW5kIGNvbXBpbGUgY29ycmVjdGx5IChhdCBsZWFzdAogICAgICAgICAgIG9uIG15IG1hY2hpbmUpLgoKICAgICAgICAgICAoaWlpKSBTV0lHIHdpbGwgbm8gbG9uZ2VyIHdyYXAgYSBkZWNsYXJhdGlvbiBpZiBpdHMgc3ltYm9sCiAgICAgICAgICAgdGFibGUgbmFtZSBjb250YWlucyBpbGxlZ2FsIGlkZW50aWZpZXIgY2hhcmFjdGVycy4gIElmCiAgICAgICAgICAgaWxsZWdhbCBjaGFyYWN0ZXJzIGFyZSBkZXRlY3RlZCwgeW91IHdpbGwgc2VlIGFuIGVycm9yCiAgICAgICAgICAgbGlrZSB0aGlzOgogCiAgICAgICAgICAgICAgICBXYXJuaW5nLiBDYW4ndCB3cmFwIG9wZXJhdG9yKiB1bmxlc3MgcmVuYW1lZCB0byBhIHZhbGlkIGlkZW50aWZpZXIuCgogICAgICAgICAgIFRoZSBvbmx5IHdheSB0byBmaXggdGhpcyBpcyB0byB1c2UgJXJlbmFtZSBvciAlbmFtZSB0byBiaW5kCiAgICAgICAgICAgdGhlIG9wZXJhdG9yIHRvIGEgbmljZSBuYW1lIGxpa2UgImFkZCIgb3Igc29tZXRoaW5nLiBOb3RlOgogICAgICAgICAgIHRoZSBsZWdhbCBpZGVudGlmaWVyIGNoYXJhY3RlcnMgYXJlIGRldGVybWluZWQgYnkgdGhlIHRhcmdldAogICAgICAgICAgIGxhbmd1YWdlLgoKICAgICAgICAgICBUaGVyZSBhcmUgY2VydGFpbiBpc3N1ZXMgd2l0aCBmcmllbmQgZnVuY3Rpb25zIGFuZCBvcGVyYXRvcnMuCiAgICAgICAgICAgU29tZXRpbWVzLCBmcmllbmRzIGFyZSB1c2VkIHRvIGRlZmluZSBtaXhlZCBvcGVyYXRvcnMgc3VjaAogICAgICAgICAgIGFzIGFkZGluZyBhIENvbXBsZXggYW5kIGEgZG91YmxlIHRvZ2V0aGVyLiAgQ3VycmVudGx5LCBTV0lHCiAgICAgICAgICAgaWdub3JlcyBhbGwgZnJpZW5kIGRlY2xhcmF0aW9ucyBpbiBhIGNsYXNzLiAgQSBnbG9iYWwgb3BlcmF0b3IKICAgICAgICAgICBkZWNsYXJhdGlvbiBjYW4gcHJvYmFibHkgYmUgbWFkZSB0byB3b3JrLCBidXQgeW91J2xsIGhhdmUgdG8KICAgICAgICAgICByZW5hbWUgaXQgYW5kIGl0IHByb2JhYmx5IHdvbid0IHdvcmsgdmVyeSBjbGVhbmx5IGluIHRoZQogICAgICAgICAgIHRhcmdldCBsYW5ndWFnZSBzaW5jZSBpdCdzIG5vdCBhIGNsYXNzIG1lbWJlci4KCiAgICAgICAgICAgU1dJRyBkb2Vzbid0IGtub3cgaG93IHRvIGhhbmRsZSBvcGVyYXRvciBzcGVjaWZpY2F0aW9ucyAKICAgICAgICAgICBzb21ldGltZXMgdXNlZCBmb3IgYXV0b21hdGljIHR5cGUgY29udmVyc2lvbi4gRm9yIGV4YW1wbGU6CgogICAgICAgICAgIGNsYXNzIFN0cmluZyB7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgb3BlcmF0b3IgY29uc3QgY2hhciooKTsKICAgICAgICAgICAgICAuLi4KICAgICAgICAgICB9OwoKICAgICAgICAgICAodGhpcyBkb2Vzbid0IHBhcnNlIGNvcnJlY3RseSBhbmQgZ2VuZXJhdGVzIGEgc3ludGF4IGVycm9yKS4KCiAgICAgICAgICAgQWxzbzogb3BlcmF0b3JzIG5vIGxvbmdlciBzaG93IHVwIGFzIHNlcGFyYXRlIHBhcnNlLXRyZWUKICAgICAgICAgICBub2RlcyAoaW5zdGVhZCB0aGV5IGFyZSBub3JtYWwgJ2NkZWNsJyBub2RlcykuICBJIG1heQogICAgICAgICAgIHNlcGFyYXRlIHRoZW0gYXMgYSBzcGVjaWFsIGNhc2UgbGF0ZXIuCgogICAgICAgICAgIFNlZSBFeGFtcGxlcy9weXRob24vb3BlcmF0b3IgZm9yIGFuIGV4YW1wbGUuCgogICAgICAgICAgICoqKiBTVVBFUi1FWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqCgpWZXJzaW9uIDEuMy45IChTZXB0ZW1iZXIgMjUsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMjUvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIHBhcnNpbmcgcHJvYmxlbSB3aXRoIHR5cGUgZGVjbGFyYXRpb25zIGxpa2UgCiAgICAgICAgICAgJ2NoYXIgKiogY29uc3QnLiAgU1dJRyBwYXJzZWQgdGhpcyBjb3JyZWN0bHksIGJ1dCB0aGUKICAgICAgICAgICBpbnRlcm5hbCB0eXBlIHdhcyByZXByZXNlbnRlZCBpbmNvcnJlY3RseSAodGhlIHBvaW50ZXJzCiAgICAgICAgICAgYW5kIHF1YWxpZmllcnMgd2VyZSBpbiB0aGUgd3Jvbmcgb3JkZXIpLgoKOS8yNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgV2l0aGRyZXcgZXhwZXJpbWVudGFsIGZlYXR1cmUgKG5vdGVkIGJlbG93KSB0aGF0IHdhcwogICAgICAgICAgIGNhdXNpbmcgc2VyaW91cyBwYXJzaW5nIHByb2JsZW1zLgoKVmVyc2lvbiAxLjMuOCAoU2VwdGVtYmVyIDIzLCAyMDAxKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCBpbXByb3ZlZCBkaXN0dXRpbHMgc2V0dXAucHkgZmlsZSBpbiB0aGUgVG9vbHMgCiAgICAgICAgICAgZGlyZWN0b3J5IChsb29rIGZvciB0aGUgc2V0dXAucHkudG1wbCBmaWxlKS4gIENvbnRyaWJ1dGVkIGJ5CiAgICAgICAgICAgVG9ueSBTZXdhcmQuCgo5LzIzLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBJbmNsdWRlZCB0d28gbmV3IFJQTSBzcGVjIGZpbGVzIGluIHRoZSBUb29scyBkaXJlY3RvcnkuIENvbnRyaWJ1dGVkCiAgICAgICAgICAgYnkgVG9ueSBTZXdhcmQgYW5kIFV3ZSBTdGVpbm1hbm4uCiAgCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjM2MzUgXSBQZXJsNS5zd2cgZG9lcyBub3QgY29tcGlsZSBpbiBWaXN1YWwgQysrCgo5LzIxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBUd28gbmV3IGRpcmVjdGl2ZXMgY29udHJvbCB0aGUgY3JlYXRpb24gb2YgZGVmYXVsdAogICAgICAgICAgIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnM6CgogICAgICAgICAgICAgICAgJW5vZGVmYXVsdAogICAgICAgICAgICAgICAgJW1ha2VkZWZhdWx0CgogICAgICAgICAgIFRoZXNlIHJlcGxhY2UgJXByYWdtYSBub2RlZmF1bHQgYW5kICVwcmFnbWEgbWFrZWRlZmF1bHQuCiAgICAgICAgICAgKG9sZCBjb2RlIHdpbGwgc3RpbGwgd29yaywgYnV0IGRvY3VtZW50YXRpb24gd2lsbCBvbmx5CiAgICAgICAgICAgZGVzY3JpYmUgdGhlIG5ldyBkaXJlY3RpdmVzKS4KCjkvMjEvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIEJ1ZyBbICM0NjIzNTQgXSAlaW1wb3J0IGJyb2tlbiBpbiAxLjMuNy4KCjkvMjAvMjAwMTogYmVhemxleQoKICAgICAgICAgICBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIG91dC1vZi1jbGFzcyBjb25zdHJ1Y3RvcgogICAgICAgICAgIGFuZCBkZXN0cnVjdG9yIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgaW5saW5lIEZvbzo6Rm9vKCkgOgogICAgICAgICAgICAgICAgICAgIEJhcigiZm9vIikKICAgICAgICAgICAgICAgeyAKICAgICAgICAgICAgICAgfSAKCiAgICAgICAgICAgICAgIGlubGluZSBGb286On5Gb28oKSB7CiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgU3VnZ2VzdGVkIGJ5IEphc29uIFN0ZXdhcnQuCiAgICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKgoKOS8yMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTW9kaWZpZWQgdGhlIHBhcnNlciB0byBpZ25vcmUgZm9yd2FyZCB0ZW1wbGF0ZSBjbGFzcwogICAgICAgICAgIGRlY2xhcmF0aW9ucy4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgViwgbG9uZyBTPiBjbGFzcyBNYXBJdGVyOwoKICAgICAgICAgICBTdWdnZXN0ZWQgYnkgYW4gZW1haWwgZXhhbXBsZSBmcm9tIElyaW5hIEtvdGxvdmEuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdW5kZWNsYXJlZCB0Y2xfcmVzdWx0IHZhcmlhYmxlIGluIAogICAgICAgICAgIHRoZSAib3V0IiB0eXBlbWFwIGZvciBUY2wuICBSZXBvcnRlZCBieSBTaGF1biBMb3dyeS4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEluY29ycG9yYXRlZCBjaGFuZ2VzIHRvIG1ha2UgU1dJRyB3b3JrIHdpdGggQWN0aXZlUGVybC4gIAogICAgICAgICAgIENvbnRyaWJ1dGVkIGJ5IEpvZWwgUmVlZC4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNpbmcgb2YgQysrIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycy4KICAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgY2xhc3MgRm9vIDogcHVibGljIEJhciB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICBGb28oKSA6IEJhciguLi4pIHsuLi59CiAgICAgICAgICAgfTsKCiAgICAgICAgICAgU1dJRyBub3cgZGlzY2FyZHMgdGhlIGNvbnRlbnRzIG9mIHRoZSAoLi4uKSByZWdhcmRsZXNzIG9mIAogICAgICAgICAgIHdoYXQgbWlnaHQgZW5jbG9zZWQgKGV2ZW4gaWYgc3ludGFjdGljYWxseSB3cm9uZykuICBTV0lHCiAgICAgICAgICAgZG9lc24ndCBuZWVkIHRoaXMgaW5mb3JtYXRpb24gYW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwogICAgICAgICAgIG5lZWRsZXNzIGFkZCBzeW50YXggcnVsZXMgdG8gaGFuZGxlIGFsbCBvZiB0aGUgcG9zc2liaWxpdGllcwogICAgICAgICAgIGhlcmUuCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdHlwZW1hcHMgZm9yIHN0cnVjdHVyZSBtZW1iZXJzLiAgSWYgeW91IGhhdmUgYQogICAgICAgICAgIHN0cnVjdHVyZSBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIHN0cnVjdCBWZWN0b3IgewogICAgICAgICAgICAgICAgaW50ICpiYXI7CiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVGhlIG1lbWJlciBuYW1lICdiYXInIGlzIG5vdyB1c2VkIGluIGFueSBhY2Nlc3NvciBmdW5jdGlvbnMuCiAgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlICJpbiIgdHlwZW1hcCB0byBiZSB1c2VkIHdoZW4gc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoaXMgdHlwZW1hcAoKICAgICAgICAgICAgICAgJXR5cGVtYXAocHl0aG9uLGluKSBpbnQgKmJhciB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBub3cgbWF0Y2hlcyBWZWN0b3I6OmJhci4gIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IHRoaXMgd2lsbCBhbHNvCiAgICAgICAgICAgbWF0Y2ggYW55IGZ1bmN0aW9uIHdpdGggYW4gYXJndW1lbnQgb2YgImludCAqYmFyIiAoc28geW91IHNob3VsZAogICAgICAgICAgIGJlIGNhcmVmdWwpLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRS4gUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYyNjQyIHNldHRpbmcgc3RyaW5nIHZhbHVlcyBpbiBzdHJ1Y3R1cmVzCgo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2MjM5OCBwcm9ibGVtIHdpdGggbmVzdGVkIHRlbXBsYXRlcy4KCjkvMjAvMjAwMTogYmVhemxleQogICAgICAgICAgIEZpeGVkIFNGIGJ1ZyAjNDYxNjI2IHByb2JsZW0gd2l0aCBmb3JtYXR0aW5nIGFuZCBDKysgY29tbWVudHMuCiAgICAgICAgICAgIAo5LzIwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBidWcgIzQ2Mjg0NSBXcm9uZyBvd25lcnNoaXAgb2YgcmV0dXJuZWQgb2JqZWN0cy4KICAgICAgICAgICAKOS8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgU0YgYnVnICM0NTkzNjcuICBEZWZhdWx0IGNvbnN0cnVjdG9ycyBmb3IgY2xhc3NlcwogICAgICAgICAgIHdpdGggcHVyZSB2aXJ0dWFsIG1ldGhvZHMuCgo5LzE5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggZGVmYXVsdCBhcmd1bWVudHMgYW5kIGNsYXNzIHNjb3BlLiAgRm9yCiAgICAgICAgICAgZXhhbXBsZToKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgZW51bSBiYXIgeyBGT08sIEJBUiB9OwogICAgICAgICAgICAgICAgICB2b2lkIGJsYWgoYmFyIGIgPSBGT08pOwogICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBTV0lHIG5vdyBjb3JyZWN0bHkgZ2VuZXJhdGVzIGEgZGVmYXVsdCB2YWx1ZSBvZiAiRm9vOjpGT08iIGZvcgogICAgICAgICAgIHRoZSBibGFoKCkgbWV0aG9kIGFib3ZlLiAgVGhpcyB1c2VkIHRvIHdvcmsgaW4gMS4xLCBidXQgd2FzCiAgICAgICAgICAgYnJva2VuIGluIDEuMy43LiAgIEJ1ZyByZXBvcnRlZCBieSBNaWtlIFJvbWJlcmcuCgpWZXJzaW9uIDEuMy43ICAoU2VwdGVtYmVyIDMsIDIwMDEpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIEFkZGVkIHNwZWNpYWwgJWlnbm9yZSBkaXJlY3RpdmUgdG8gaWdub3JlIGRlY2xhcmF0aW9ucy4gIFRoaXMKICAgICAgICAgICBmZWF0dXJlIHdvcmtzIGV4YWN0bHkgbGlrZSAlcmVuYW1lLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSAgZm9vOyAgICAgICAgLy8gSWdub3JlIGFsbCBkZWNsYXJhdGlvbnMgZm9vCiAgICAgICAgICAgICAlaWdub3JlICA6OmZvbzsgICAgICAvLyBPbmx5IGlnbm9yZSBmb28gaW4gZ2xvYmFsIHNjb3BlCiAgICAgICAgICAgICAlaWdub3JlICBTcGFtOjpmb287ICAvLyBPbmx5IGlnbm9yZSBpbiBjbGFzcyBTcGFtCiAgICAgICAgICAgICAlaWdub3JlICAqOjpmb287ICAgICAvLyBJZ25vcmUgaW4gYWxsIGNsYXNzZXMKCiAgICAgICAgICAgJWlnbm9yZSBjYW4gYWxzbyBiZSBwYXJhbWV0ZXJpemVkLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgJWlnbm9yZSBmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgOjpmb28oaW50KTsKICAgICAgICAgICAgICVpZ25vcmUgU3BhbTo6Zm9vKGludCk7CiAgICAgICAgICAgICAlaWdub3JlICo6OmZvbyhpbnQpOwoKICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCiAgICAgICAgICAgIAoKOS8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBbSmF2YV0gc2hhZG93Y29kZSBwcmFnbWEgbW9kaWZpZWQgc28gdGhhdCB0aGUgY29kZSB0aGF0IGlzIG91dHB1dCAKICAgICAgICAgICBpbiB0aGUgc2hhZG93IGZpbGUgaXMgcGxhY2VkIHJlbGF0aXZlIHRvIHdoZXJlIGl0IGlzIHBsYWNlZCBpbiB0aGUgCiAgICAgICAgICAgYy9jKysgY29kZS4gVGhpcyBhbGxvd3Mgc3VwcG9ydCBmb3IgSmF2YURvYyBmdW5jdGlvbiBjb21tZW50cy4gCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBGaXhlZCBTRiBQYXRjaCBbICM0NDc3OTEgXSBGaXggZm9yIHB5dGhvbiAtaW50ZXJmYWNlIG9wdGlvbi4KICAgICAgICAgICBTdWJtaXR0ZWQgYnkgVGFybiBXZWlzbmVyIEJ1cnRvbi4KCjkvMDEvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycwogICAgICAgICAgIGZvciBhIGNsYXNzIGlmIGl0IG9ubHkgZGVmaW5lcyBhIHByaXZhdGUvcHJvdGVjdGVkIGNvbnN0cnVjdG9yCiAgICAgICAgICAgb3IgZGVzdHJ1Y3RvciBvciBpZiBhbnkgb25lIG9mIGl0cyBiYXNlIGNsYXNzZXMgb25seSBoYXMKICAgICAgICAgICBwcml2YXRlIGNvbnN0cnVjdG9ycy9kZXN0cnVjdG9ycy4gIFRoaXMgd2FzIHJlcG9ydGVkIGluCiAgICAgICAgICAgU0YgUGF0Y2ggWyAjNDQ0MjgxIF0gbm9ucHVibGljL2RlZmF1bHQvaW5oZXJldGVkIGN0b3IvZHRvcgogICAgICAgICAgIGJ5IE1hcmNlbG8gTWF0dXMuCgo5LzAxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXRjaCB0byBQZXJsNSBtb2R1bGUgdGhhdCBhbGxvd3MgY29uc3RhbnRzIHRvIGJlCiAgICAgICAgICAgd3JhcHBlZCBhcyBjb25zdGFudHMgdGhhdCBkb24ndCByZXF1aXJlIHRoZSBsZWFkaW5nICQuCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQgdXNpbmcgdGhlIC1jb25zdCBvcHRpb24uCiAgICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgUmljaCBXYWxlcy4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBwYXJzaW5nIHN1cHBvcnQgZm9yIHRoZSAndm9sYXRpbGUnIHR5cGUgcXVhbGlmaWVyLgogICAgICAgICAgIHZvbGF0aWxlIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyB0byBTV0lHLCBidXQgaXQgaXMKICAgICAgICAgICBuZWVkZWQgdG8gcHJvcGVybHkgZ2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgZGVjbGFyYXRpb25zCiAgICAgICAgICAgdGhhdCB1c2UgaXQuICBJdCdzIGFsc28gYmVlbiBhZGRlZCB0byBtYWtlIHRoZSBTV0lHIHR5cGUKICAgICAgICAgICBzeXN0ZW0gbW9yZSBjb21wbGV0ZS4KICAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCBzdXBwb3J0IGZvciBwYXJhbWV0ZXJpemVkICVyZW5hbWUgZGlyZWN0aXZlLiAgKioqIFRoaXMKICAgICAgICAgICBuZXcgZmVhdHVyZSBjYW4gYmUgdXNlZCB0byBncmVhdGx5IHNpbXBsaWZ5IHRoZSB0YXNrIG9mCiAgICAgICAgICAgcmVzb2x2aW5nIG92ZXJsb2FkZWQgbWV0aG9kcyBhbmQgZnVuY3Rpb25zLiAqKioKICAgICAgICAgICAKICAgICAgICAgICBJbiBwcmlvciB2ZXJzaW9ucyBvZiBTV0lHLCB0aGUgJXJlbmFtZSBkaXJlY3RpdmUgd2FzCiAgICAgICAgICAgdXNlZCB0byBjb25zaXN0ZW50bHkgYXBwbHkgYW4gaWRlbnRpZmllciByZW5hbWluZy4gRm9yIAogICAgICAgICAgIGV4YW1wbGUsIGlmIHlvdSBzYWlkIHRoaXM6CgogICAgICAgICAgICAgICAgJXJlbmFtZSBmb28gYmFyOwoKICAgICAgICAgICBFdmVyeSBvY2N1cnJlbmNlIG9mICdmb28nIHdvdWxkIGJlIHJlbmFtZWQgdG8gJ2JhcicuIAogICAgICAgICAgIEFsdGhvdWdoIHRoaXMgd29ya3MgZmluZSBmb3IgcmVzb2x2aW5nIGEgY29uZmxpY3Qgd2l0aCBhCiAgICAgICAgICAgdGFyZ2V0IGxhbmd1YWdlIHJlc2VydmVkIHdvcmQsIGl0IGlzIHVzZWxlc3MgZm9yCiAgICAgICAgICAgZm9yIGRlYWxpbmcgd2l0aCBvdmVybG9hZGVkIG1ldGhvZHMuICAgIFRoaXMgaXMgYmVjYXVzZQogICAgICAgICAgIGFsbCBtZXRob2RzIGFyZSBzaW1wbHkgcmVuYW1lZCB0byB0aGUgc2FtZSB0aGluZyAKICAgICAgICAgICAoZ2VuZXJhdGluZyB0aGUgc2FtZSBjb25mbGljdCBhcyBiZWZvcmUpLgoKICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBvbmx5IHdheSB0byBkZWFsIHdpdGggb3ZlcmxvYWRlZCBtZXRob2RzCiAgICAgICAgICAgd2FzIHRvIGdvIHRocm91Z2ggYW5kIGluZGl2aWR1YWxseSByZW5hbWUgdGhlbSBhbGwgdXNpbmcKICAgICAgICAgICAlbmFtZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgIGNsYXNzIEZvbyB7CiAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJhcih2b2lkKTsKICAgICAgICAgICAgICAgICAlbmFtZShiYXJfaSkgdmlydHVhbCB2b2lkIGJhcihpbnQpOwogICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgfTsKCiAgICAgICAgICAgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlLCB5b3UgaGFkIHRvIGRvIHRoaXMgZm9yIGFsbAogICAgICAgICAgIGRlcml2ZWQgY2xhc3NlcyB0b28uCgogICAgICAgICAgICAgY2xhc3MgU3BhbSA6IHB1YmxpYyBGb28gewogICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiYXIodm9pZCk7CiAgICAgICAgICAgICAgICAgJW5hbWUoYmFyX2kpIHZpcnR1YWwgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgIH07CgogICAgICAgICAgIE5lZWRsZXNzIHRvIHNheSwgdGhpcyBtYWtlcyBpdCBleHRyZW1lbHkgaGFyZCB0byByZXNvbHZlCiAgICAgICAgICAgb3ZlcmxvYWRpbmcgd2l0aG91dCBhIGxvdCBvZiB3b3JrIGFuZCBtYWtlcyBpdCBhbG1vc3QKICAgICAgICAgICBpbXBvc3NpYmxlIHRvIHVzZSBTV0lHIG9uIHJhdyBDKysgLmggZmlsZXMuCgogICAgICAgICAgIFRvIGZpeCB0aGlzLCAlcmVuYW1lIG5vdyBhY2NlcHRzIHBhcmFtZXRlciBkZWNsYXJhdG9ycy4KICAgICAgICAgICBUaGUgc3ludGF4IGhhcyBhbHNvIGJlZW4gY2hhbmdlZCBzbGlnaHRseS4gIEZvciBleGFtcGxlLAogICAgICAgICAgIHRoZSBmb2xsb3dpbmcgZGVjbGFyYXRpb24gcmVuYW1lcyBhbGwgb2NjdXJyZW5jZXMgb2YgJ2JhcihpbnQpJwogICAgICAgICAgIHRvICdiYXJfaScsIGxlYXZpbmcgYW55IG90aGVyIG9jY3VycmVuY2Ugb2YgJ2JhcicgYWxvbmUuCgogICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgYmFyKGludCk7CgogICAgICAgICAgIFVzaW5nIHRoaXMgZmVhdHVyZSwgeW91IGNhbiBub3cgc2VsZWN0aXZlbHkgcmVuYW1lIAogICAgICAgICAgIGNlcnRhaW4gZGVjbGFyYXRpb25zIGluIGFkdmFuY2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSBiYXIoaW50KTsKICAgICAgICAgICAgICVyZW5hbWUoYmFyX2QpIGJhcihkb3VibGUpOwoKICAgICAgICAgICAgIC8vIEluY2x1ZGUgcmF3IEMrKyBoZWFkZXIgICAgCiAgICAgICAgICAgICAlaW5jbHVkZSAiaGVhZGVyLmgiCgogICAgICAgICAgIFdoZW4gJXJlbmFtZSBpcyB1c2VkIGluIHRoaXMgbWFubmVyLCBhbGwgb2NjdXJyZW5jZSBvZiBiYXIoaW50KQogICAgICAgICAgIGFyZSByZW5hbWVkIHdoZXJldmVyIHRoZXkgbWlnaHQgb2NjdXIuICBNb3JlIGNvbnRyb2wgaXMgb2J0YWluZWQKICAgICAgICAgICB0aHJvdWdoIGV4cGxpY2l0IHF1YWxpZmljYXRpb24uIEZvciBleGFtcGxlLAoKICAgICAgICAgICAgICAlcmVuYW1lKGJhcl9pKSA6OmJhcihpbnQpOwoKICAgICAgICAgICBvbmx5IGFwcGxpZXMgdGhlIHJlbmFtaW5nIGlmIGJhcihpbnQpIGlzIGRlZmluZWQgaW4gdGhlIGdsb2JhbCBzY29wZS4KICAgICAgICAgICBUaGUgZGVjbGFyYXRpb24sCiAgICAgCiAgICAgICAgICAgICAgJXJlbmFtZShiYXJfaSkgRm9vOjpiYXIoaW50KTsKCiAgICAgICAgICAgYXBwbGllcyB0aGUgcmVuYW1pbmcgaWYgYmFyKGludCkgaXMgZGVmaW5lZCBpbiBhIGNsYXNzIEZvby4KICAgICAgICAgICBUaGlzIGxhdHRlciBmb3JtIGFsc28gc3VwcG9ydHMgaW5oZXJpdGFuY2UuICBUaGVyZWZvcmUsIGlmIHlvdQogICAgICAgICAgIGhhZCBhIGNsYXNzIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgIGNsYXNzIFNwYW0gOiBwdWJsaWMgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgdm9pZCBiYXIoaW50KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgICBUaGUgU3BhbTo6YmFyKGludCkgbWV0aG9kIHdvdWxkIGFsc28gYmUgcmVuYW1lZCAoc2luY2UgU3BhbSAKICAgICAgICAgICBpcyBhIHN1YmNsYXNzIG9mIEZvbykuICAgVGhpcyBsYXR0ZXIgZmVhdHVyZSBtYWtlcyBpdCBlYXN5CiAgICAgICAgICAgZm9yIFNXSUcgdG8gYXBwbHkgYSBjb25zaXN0ZW50IHJlbmFtaW5nIGFjcm9zcyBhbiBlbnRpcmUKICAgICAgICAgICBjbGFzcyBoaWVyYXJjaHkgc2ltcGx5IGJ5IHNwZWNpZnlpbmcgcmVuYW1pbmcgcnVsZXMgZm9yCiAgICAgICAgICAgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgIEEgY2xhc3Mgd2lsZGNhcmQgb2YgKiBjYW4gYmUgdXNlZCBpZiB5b3Ugd2FudCB0byByZW5hbWluZwogICAgICAgICAgIGFsbCBtYXRjaGluZyBtZW1iZXJzIG9mIGFsbCBjbGFzc2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVyZW5hbWUoYmFyX2kpICo6OmJhcihpbnQpOwoKICAgICAgICAgICB3aWxsIHJlbmFtZSBhbGwgbWVtYmVycyBiYXIoaW50KSB0aGF0IGFyZSBkZWZpbmVkIGluIGNsYXNzZXMuCiAgICAgICAgICAgSXQgd2lsbCBub3QgcmVuYW1lZCBkZWZpbml0aW9ucyBvZiBiYXIoaW50KSBpbiB0aGUgZ2xvYmFsCiAgICAgICAgICAgc2NvcGUuCgogICAgICAgICAgIFRoZSBvbGQgdXNlIG9mICVyZW5hbWUgaXMgc3RpbGwgc3VwcG9ydGVkLCBidXQgaXMgc29tZXdoYXQKICAgICAgICAgICBlbmhhbmNlZC4gIAoKICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgYmFyOyAgICAgIC8vIFJlbmFtZXMgYWxsIG9jY3VycmVuY2VzIG9mICdiYXInLgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSA6OmJhcjsgICAgLy8gUmVuYW1lIGFsbCAnYmFyJyBpbiBnbG9iYWwgc2NvcGUgb25seS4KICAgICAgICAgICAgICAlcmVuYW1lKGZvbykgKjo6YmFyOyAgIC8vIFJlbmFtZSBhbGwgJ2JhcicgaW4gY2xhc3NlcyBvbmx5LgogICAgICAgICAgICAgICVyZW5hbWUoZm9vKSBGb286OmJhcjsgLy8gUmVuYW1lIGFsbCAnYmFyJyBkZWZpbmVkIGluIGNsYXNzIEZvby4KCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGF0YS1tZW1iZXIgdG8gbWVtYmVyLWZ1bmN0aW9uIAogICAgICAgICAgIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsIHN1cHBvc2UgeW91IGhhZCBhCiAgICAgICAgICAgc3RydWN0dXJlIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICBzdHJ1Y3QgVmVjdG9yIHsKICAgICAgICAgICAgICAgICAgICBkb3VibGUgeCx5OwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgTm93IHN1cHBvc2UgdGhhdCB5b3Ugd2FudGVkIHRvIGFjY2VzcyB4IGFuZCB5IAogICAgICAgICAgIHRocm91Z2ggYSBtZW1iZXIgZnVuY3Rpb24gaW50ZXJmYWNlIGluc3RlYWQgCiAgICAgICAgICAgb2YgdGhlIHVzdWFsIFNXSUcgYmVoYXZpb3IuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBmLnNldF94KDMuNCkgICAgICAjIGluc3RlYWQgb2YgZi54ID0gMy40CiAgICAgICAgICAgICAgeCA9IGYuZ2V0X3goKSAgICAgIyBpbnN0ZWFkIG9mIHggPSBmLngKCiAgICAgICAgICAgVG8gZG8gdGhpcywgc2ltcGx5IHVzZSB0aGUgbmV3ICVhdHRyaWJ1dGVmdW5jCiAgICAgICAgICAgZGlyZWN0aXZlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldF8lcyxzZXRfJXMpCiAgICAgICAgICAgICAgc3RydWN0IFZlY3RvciB7CiAgICAgICAgICAgICAgICAgZG91YmxlIHgseTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICVub2F0dHJpYnV0ZWZ1bmMKCiAgICAgICAgICAgVGhlIGFyZ3VtZW50cyB0byAlYXR0cmlidXRlZnVuYyBhcmUgQy1zdHlsZSBwcmludGYKICAgICAgICAgICBmb3JtYXQgc3RyaW5ncyB0aGF0IGRldGVybWluZSB0aGUgbmFtaW5nIGNvbnZlbnRpb24KICAgICAgICAgICB0byB1c2UuICAlcyBpcyByZXBsYWNlZCB3aXRoIHRoZSBhY3R1YWwgbmFtZSBvZiB0aGUKICAgICAgICAgICBkYXRhIG1lbWJlci4gU1dJRyBwcm92aWRlcyBhIG51bWJlciBvZiBwcmludGYKICAgICAgICAgICBleHRlbnNpb25zIHRoYXQgbWlnaHQgaGVscC4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgICB3YW50ZWQgdG8gdGl0bGUgY2FzZSBhbGwgb2YgdGhlIGF0dHJpYnV0ZXMsIHlvdQogICAgICAgICAgIGNvdWxkIGRvIHRoaXM6CgogICAgICAgICAgICAgICVhdHRyaWJ1dGVmdW5jKGdldCUodGl0bGUpcyxzZXQlKHRpdGxlKXMpOwoKICAgICAgICAgICBUaGlzIHdpbGwgdHVybiBhbiBhdHRyaWJ1dGUgJ2JhcicgdG8gJ2dldEJhcigpJyBhbmQgJ3NldEJhcigpJy4KCiAgICAgICAgICAgKHNvbWVvbmUgcmVxdWVzdGVkIHRoaXMgbG9uZyBhZ28sIGJ1dCBJIGZpbmFsbHkgZmlndXJlZAogICAgICAgICAgIGhvdyB0byBpbXBsZW1lbnQgaXQgaW4gYSBzdHJhaWdodGZvcndhcmQgbWFubmVyKS4KICAgICAgICAgICAqKiogRVhQRVJJTUVOVEFMIE5FVyBGRUFUVVJFICoqKgogICAgICAgICAgIAo4LzMwLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBkZWZhdWx0IGNvbnN0cnVjdG9ycwogICAgICAgICAgIGFuZCBkZXN0cnVjdG9ycyBpZiBub25lIGFyZSBkZWZpbmVkLiAgVGhpcyB1c2VkIHRvIGJlCiAgICAgICAgICAgZW5hYmxlZCB3aXRoIGEgY29tbWFuZCBsaW5lIHN3aXRjaCAtbWFrZV9kZWZhdWx0LCBidXQKICAgICAgICAgICBtb3N0IHBlb3BsZSB3YW50IHRoZXNlIGZ1bmN0aW9ucyBhbnl3YXlzLiAgVG8gdHVybgogICAgICAgICAgIG9mZiB0aGlzIGJlaGF2aW9yIHVzZSB0aGUgLW5vX2RlZmF1bHQgb3B0aW9uIG9yIGluY2x1ZGUKICAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbiB0aGUgaW50ZXJmYWNlIGZpbGU6CiAKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQ7CiAgCiAgICAgICAgICAgVGhpcyBtYXkgYnJlYWsgY2VydGFpbiBpbnRlcmZhY2VzIHRoYXQgZGVmaW5lZCB0aGVpcgogICAgICAgICAgIG93biBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnMgdXNpbmcgdGhlIHNhbWUgbmFtaW5nCiAgICAgICAgICAgY29udmVudGlvbiBhcyBTV0lHLiAgSWYgc28sIHlvdSB3aWxsIGdldCBkdXBsaWNhdGUKICAgICAgICAgICBzeW1ib2xzIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gUGVybDUgc2hhZG93IGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIEl0ZXJhdG9ycwogICAgICAgICAgIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIChGSVJTVEtFWSwgTkVYVEtFWSkuICBBbHNvLCBhdHRyaWJ1dGUKICAgICAgICAgICBhY2Nlc3MgaGFzIGJlZW4gY2hhbmdlZCB0byByZWx5IG9uIGluaGVyaXRhbmNlIGluIG9yZGVyCiAgICAgICAgICAgdG8gcHJvdmlkZSBiZXR0ZXIgYmVoYXZpb3IgYWNyb3NzIG1vZHVsZXMuICAKCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIFZhcmlvdXMgb2JzY3VyZSBpbXByb3ZlbWVudHMgdG8gdGhlIHR5cGUgc3lzdGVtIGFuZCBjbGFzc2VzLgogICAgICAgICAgIFN0cmFuZ2UgZGVjbGFyYXRpb25zIGxpa2UgdGhpcyBhcmUgbm93IHdyYXBwZWQgY29ycmVjdGx5CiAgICAgICAgICAgKGkuZS4sIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIGRvZXNuJ3QgY2F1c2UgdGhlIEMrKwogICAgICAgICAgICBjb21waWxlciB0byBkaWUgd2l0aCBhIHR5cGUgZXJyb3IpLgoKICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIFJlYWw7CiAgICAgICAgICAgICAgICAgUmVhbCBmb28oUmVhbCAoKm9wKShSZWFsLFJlYWwpLCBSZWFsIHgsIFJlYWwgeSk7CiAgICAgICAgICAgIH07CgogICAgICAgICAgIEluaGVyaXRhbmNlIG9mIHR5cGVzIGlzIGFsc28gaGFuZGxlZCBjb3JyZWN0bHkuCiAgICAgICAgICAgCjgvMjgvMjAwMTogYmVhemxleQogICAgICAgICAgIENoYW5nZXMgdG8gY2xhc3Mgd3JhcHBlcnMuICAgV2hlbiBTV0lHIHNlZXMgdHdvIGNsYXNzZXMgbGlrZSB0aGlzLAogCiAgICAgICAgICAgY2xhc3MgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBmb28oKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGNsYXNzIFkgOiBwdWJsaWMgWCB7CiAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgdm9pZCBiYXIoKTsKICAgICAgICAgICAgIC4uLgogICAgICAgICAgIH0KIAogICAgICAgICAgIGl0IG5vdyBvbmx5IGdlbmVyYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnM6CiAKICAgICAgICAgICAgIFhfZm9vKFggKngpIHsgeC0+Zm9vKCk7IH0KICAgICAgICAgICAgIFlfYmFyKFkgKnkpIHsgeS0+YmFyKCk7IH0KIAogICAgICAgICAgIFVubGlrZSBTV0lHMS4xNSwgdGhlIGZvbygpIG1ldGhvZCBkb2VzICpub3QqIHByb3BhZ2F0ZSB0byBhIHdyYXBwZXIKICAgICAgICAgICBmdW5jdGlvbiBZX2ZvbygpLiBJbnN0ZWFkLCB0aGUgYmFzZSBjbGFzcyBtZXRob2QgWF9mb28oKSBtdXN0IGJlCiAgICAgICAgICAgdXNlZC4KCiAgICAgICAgICAgVGhpcyBjaGFuZ2Ugc2hvdWxkIG5vdCBhZmZlY3QgbW9kdWxlcyB0aGF0IHVzZSBzaGFkb3cgY2xhc3NlcywgYnV0CiAgICAgICAgICAgaXQgbWlnaHQgYnJlYWsgbW9kdWxlcyB0aGF0IGRpcmVjdGx5IHVzZSB0aGUgbG93LWxldmVsIEMgd3JhcHBlcnMuCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgaXMgYmVpbmcgbWFkZSBmb3IgYSBudW1iZXIgb2YgcmVhc29uczoKCiAgICAgICAgICAgICAgIC0gIEl0IGdyZWF0bHkgc2ltcGxpZmllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgU1dJRy0tZXNwZWNpYWxseQogICAgICAgICAgICAgICAgICB3aXRoIGFudGljaXBhdGVkIGZ1dHVyZSBjaGFuZ2VzIHN1Y2ggYXMgb3ZlcmxvYWRlZCBtZXRob2RzLgoKICAgICAgICAgICAgICAgLSAgSXQgcmVzdWx0cyBpbiBzdWJzdGFudGlhbGx5IGxlc3Mgd3JhcHBlciBjb2RlLS1lc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgIGZvciBiaWcgQysrIGNsYXNzIGhpZXJhcmNoaWVzIChpbmhlcml0ZWQgZGVjbGFyYXRpb25zCiAgICAgICAgICAgICAgICAgIGFyZSBubyBsb25nZXIgY29waWVkIGludG8gZXZlcnkgc2luZ2xlIGRlcml2ZWQgY2xhc3MpLgoKICAgICAgICAgICAgICAgLSAgSXQgYWxsb3dzIGZvciBiZXR0ZXIgY29kZSBnZW5lcmF0aW9uIGFjcm9zcyBtdWx0aXBsZQogICAgICAgICAgICAgICAgICBTV0lHIGdlbmVyYXRlZCBtb2R1bGVzIChjb2RlIGlzbid0IHJlcGxpY2F0ZWQgaW4KICAgICAgICAgICAgICAgICAgZXZlcnkgc2luZ2xlIG1vZHVsZSkuCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICBQcm92aWRlZCBzb21lIFdpbmRvd3MgZG9jdW1lbnRhdGlvbiBpbiB0aGUgV2luIGRpcmVjdG9yeSBhbmQgc29tZQogICAgICAgICAgIFZpc3VhbCBDKysgcHJvamVjdCBmaWxlcyBmb3IgcnVubmluZyBleGFtcGxlcyBvbiBXaW5kb3dzLgoKOC8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSByZW5hbWVkIG92ZXJsb2FkZWQgZnVuY3Rpb25zIHByb3Blcmx5OwoJICAgdGhhbmtzIHRvIE1hcmMgWm9uem9uIDxNYXJjLlpvbnpvbkB1bml2LXJlbm5lczEuZnI+IGZvciB0aGUKCSAgIHBhdGNoLiAgU2VlIHRoZSBuZXcgdGVzdCBjYXNlIG5hbWVfY3h4LgoKOC8yNy8yMDAxOiBta29lcHBlCgkgICBbVGNsXSBSZW1vdmVkIGxvdHMgb2Ygd2FybmluZ3MgaXNzdWVkIGJ5IHRoZSBTdW4gRm9ydGUKCSAgIGNvbXBpbGVycywgd2hpY2ggd2VyZSBjYXVzZWQgYnkgbWl4aW5nIGZ1bmN0aW9uIHBvaW50ZXJzCgkgICBvZiBkaWZmZXJlbnQgbGlua2FnZXMgKEMrKy9DKS4gCgo4LzIzLzIwMDE6IG1rb2VwcGUKCSAgIEltcHJvdmVkIHRoZSBNelNjaGVtZSBtb2R1bGUgYnkgcG9ydGluZyBHdWlsZSdzIHBvaW50ZXIKCSAgIHR5cGUgY2hlY2tpbmcgc3lzdGVtIGFuZCBtYWtpbmcgdHlwZSBkaXNwYXRjaAoJICAgdHlwZW1hcC1kcml2ZW4uIAoKOC8yMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRW50aXJlbHkgbmV3IHN5bWJvbCB0YWJsZSBwcm9jZXNzaW5nLiAgIFNXSUcgc2hvdWxkIGJlIGFibGUgdG8KICAgICAgICAgICByZXBvcnQgbXVjaCBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMgZm9yIG11bHRpcGxlIGRlY2xhcmF0aW9ucy4gCiAgICAgICAgICAgQWxzbywgdGhlIG5ldyBzeW1ib2wgdGFibGUgYWxsb3dzIGZvciBvdmVybG9hZGVkIGZ1bmN0aW9ucwogICAgICAgICAgIChhbHRob3VnaCBvdmVybG9hZGluZyBpc24ndCBxdWl0ZSBzdXBwb3J0ZWQgaW4gdGhlIGxhbmd1YWdlCiAgICAgICAgICAgbW9kdWxlcyB5ZXQpLgoKOC8yMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIFtKYXZhXSAlbmV3IHN1cHBvcnQgYWRkZWQuCiAgICAgICAgICAgKiBbSmF2YV0gUGFja2FnZSBKTkkgbmFtZSByZWZpeGVkIQoKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUHl0aG9uIG1vZHVsZSBtb2RpZmllZCB0byBzdXBwb3J0IHBvaW50ZXJzIHRvIEMrKyBtZW1iZXJzLiAgVGhpcwogICAgICAgICAgIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKICAgICAKOC8xOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbGltaXRlZCBwYXJzaW5nIGFuZCBmdWxsIHR5cGUtc3lzdGVtIHN1cHBvcnQgZm9yIHBvaW50ZXJzIHRvCiAgICAgICAgICAgbWVtYmVycy4gTm9uZSBvZiBTV0lHJ3MgbGFuZ3VhZ2UgbW9kdWxlcyByZWFsbHkga25vdyBob3cgdG8gZGVhbCB3aXRoCiAgICAgICAgICAgdGhpcyBzbyB0aGlzIGlzIHJlYWxseSBvbmx5IHByb3ZpZGVkIGZvciBjb21wbGV0ZW5lc3MgYW5kIGZ1dHVyZQogICAgICAgICAgIGV4cGFuc2lvbi4gIE5vdGU6IFNXSUcgZG9lcyBub3Qgc3VwcG9ydCBwb2ludGVycyB0byBtZW1iZXJzIHdoaWNoIAogICAgICAgICAgIGFyZSB0aGVtc2VsdmVzIHBvaW50ZXJzIHRvIG1lbWJlcnMsIHJlZmVyZW5jZXMgdG8gcG9pbnRlcnMgdG8gbWVtYmVycywKICAgICAgICAgICBvciBvdGhlciBjb21wbGljYXRlZCBkZWNsYXJhdGlvbnMgbGlrZSB0aGlzLgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMTkvMjAwMTogYmVhemxleQogICAgICAgICAgIFNXSUcgaXMgbXVjaCBiZXR0ZXIgYXQgcGFyc2luZyBjZXJ0YWluIEMrKyBkZWNsYXJhdGlvbnMuIE9wZXJhdG9ycyBhbmQKICAgICAgICAgICBmcmllbmRzIGdlbmVyYWxseSBkb24ndCBjYXVzZSBhbnltb3JlIHN5bnRheCBlcnJvcnMuICBIb3dldmVyLCBuZWl0aGVyCiAgICAgICAgICAgYXJlIHJlYWxseSBzdXBwb3J0ZWQuCgo4LzE4LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBBZGRlZCAqaGlnaGx5KiBleHBlcmltZW50YWwgc3VwcG9ydCBmb3Igd3JhcHBpbmcgb2YgQysrCiAgICAgICAgICAgdGVtcGxhdGUgZGVjbGFyYXRpb25zLiAgU2luY2UgQysrIHRlbXBsYXRlcyBhcmUgZXNzZW50aWFsbHkKICAgICAgICAgICBnbG9yaWZpZWQgbWFjcm9zIGFuZCBTV0lHIGhhcyBhIGZ1bGx5IG9wZXJhdGlvbmFsIEMgCiAgICAgICAgICAgcHJlcHJvY2Vzc29yIHdpdGggbWFjcm8gc3VwcG9ydCwgdGhlIHBhcnNlciBub3cgY29udmVydHMKICAgICAgICAgICB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMgdG8gbWFjcm9zLiAgRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24KICAgICAgICAgICB0ZW1wbGF0ZSBsaWtlIHRoaXMKCiAgICAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIFQ+IFQgbWF4KFQgYSwgVCBiKTsKCiAgICAgICAgICAgaXMgaW50ZXJuYWxseSBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICVkZWZpbmUgJV90ZW1wbGF0ZV9tYXgoX19uYW1lLFQpCiAgICAgICAgICAgICAgICVuYW1lKF9fbmFtZSkgVCBtYXgoVCBhLCBUIGIpOwogICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIFRvIGluc3RhbnRpYXRlIGEgdmVyc2lvbiBvZiB0aGUgdGVtcGxhdGUsIGEgc3BlY2lhbCAldGVtcGxhdGUgZGVjbGFyYXRpb24KICAgICAgICAgICBpcyB1c2VkIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgICV0ZW1wbGF0ZShtYXhpbnQpIG1heDxpbnQ+OyAgICAgICAgICAKICAgICAgICAgICAgICAgJXRlbXBsYXRlKG1heGRvdWJsZSkgbWF4PGRvdWJsZT47CgogICAgICAgICAgIFRoZSBwYXJhbWV0ZXIgdG8gdGhlICV0ZW1wbGF0ZSBkaXJlY3RpdmUgbXVzdCBiZSBwcm9wZXIgQyBpZGVudGlmaWVyIHRoYXQncwogICAgICAgICAgIHVzZWQgdG8gdW5pcXVlbHkgbmFtZSB0aGUgcmVzdWx0aW5nIGluc3RhbnRpYXRpb24uICAgV2hlbiB1c2VkLCB0aGUKICAgICAgICAgICB0aGUgZXhwYW5kZWQgbWFjcm8gbG9va3MgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICAlbmFtZShtYXhpbnQpIGludCBtYXgoaW50IGEsIGludCBiKTsKICAgICAgICAgICAgICAlbmFtZShtYXhkb3VibGUpIGRvdWJsZSBtYXgoZG91YmxlIGEsIGRvdWJsZSBiKTsKCiAgICAgICAgICAgQSBzaW1pbGFyIHRlY2huaXF1ZSBpcyB1c2VkIGZvciB0ZW1wbGF0ZSBjbGFzc2VzLiAgIEZvciBpbnN0YW5jZToKCiAgICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgdmVjdG9yIHsKICAgICAgICAgICAgICAgICBUICpkYXRhOwogICAgICAgICAgICAgICAgIGludCBzejsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgdmVjdG9yKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgIFQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgR2V0cyBjb252ZXJ0ZWQgaW50byBhIG1hY3JvIGxpa2UgdGhpczoKCiAgICAgICAgICAgICAgJWRlZmluZSAlX3RlbXBsYXRlX3ZlY3RvcihfX25hbWUsIFQpCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxUPiBfX25hbWU7CiAgICAgICAgICAgICAgJX0KICAgICAgICAgICAgICBjbGFzcyBfX25hbWUgewogICAgICAgICAgICAgICAgIFQgKmRhdGE7CiAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICBfX25hbWUoaW50IG5pdGVtcyk7CiAgICAgICAgICAgICAgICAgVCAqZ2V0KGludCBuKTsKICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIHR5cGVkZWYgX19uYW1lIHZlY3RvcjxUPjsKICAgICAgICAgICAgICAlZW5kZGVmCgogICAgICAgICAgIEEgc3BlY2lmaWMgaW5zdGFudGlhdGlvbiBpcyBjcmVhdGVkIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5OgoKICAgICAgICAgICAgICV0ZW1wbGF0ZShpbnR2ZWMpIHZlY3RvcjxpbnQ+OwoKICAgICAgICAgICBUaGUgcmVzdWx0aW5nIGNvZGUgcGFyc2VkIGJ5IFNXSUcgaXMgdGhlbjoKCiAgICAgICAgICAgICAgJXsKICAgICAgICAgICAgICB0eXBlZGVmIHZlY3RvcjxpbnQ+IGludHZlYzsKICAgICAgICAgICAgICAlfQogICAgICAgICAgICAgIGNsYXNzIGludHZlYyB7CiAgICAgICAgICAgICAgICAgIGludCAqZGF0YTsKICAgICAgICAgICAgICAgICAgaW50IHN6OwogICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgaW50dmVjKGludCBuaXRlbXMpOwogICAgICAgICAgICAgICAgICBpbnQgKmdldChpbnQgbik7CiAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgdHlwZWRlZiBpbnR2ZWMgdmVjdG9yPGludD47CgogICAgICAgICAgIE5vdGU6IHRoZSBsYXN0IHR5cGVkZWYgaXMgbm9uLXN0YW5kYXJkIEMgYW5kIGlzIHVzZWQgYnkgU1dJRyB0byBwcm92aWRlCiAgICAgICAgICAgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgbmFtZSAiaW50dmVjIiBhbmQgdGhlIHRlbXBsYXRlIHR5cGUgCiAgICAgICAgICAgInZlY3RvcjxpbnQ+Ii4KCiAgICAgICAgICAgQ0FVVElPTjogIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUgYW5kIHRoZSBmaXJzdCB0aW1lIFNXSUcgaGFzCiAgICAgICAgICAgc3VwcG9ydGVkIEMrKyB0ZW1wbGF0ZXMuICAgRXJyb3IgcmVwb3J0aW5nIGlzIGVzc2VudGlhbCBub24tZXhpc3RlbnQuCiAgICAgICAgICAgSXQgd2lsbCBwcm9iYWJseSBicmVhayBpbiBjZXJ0YWluIGNhc2VzLgogICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgTkVXIEZFQVRVUkUgKioqKgoKOC8xNS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQ2hhbmdlIHRvIHdyYXBwaW5nIG9mIG11bHRpLWRpbWVuc2lvbmFsIGFycmF5cy4gIEFycmF5cwogICAgICAgICAgIGFyZSBub3cgcHJvcGVybHkgbWFwcGVkIHRvIGEgcG9pbnRlciB0byBhbiBhcnJheSBvZgogICAgICAgICAgIG9uZSBsZXNzIGRpbWVuc2lvbi4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgIGludCBbMTBdOyAgICAgICAgICAgICAgLS0+ICBpbnQgKgogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdOyAgICAgICAgICAtLT4gIGludCAoKilbMjBdOwogICAgICAgICAgICAgICAgaW50IFsxMF1bMjBdWzMwXTsgICAgICAtLT4gIGludCAoKilbMjBdWzMwXTsKCiAgICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGNlcnRhaW4gU1dJRyBleHRlbnNpb25zIGJlY2F1c2UKICAgICAgICAgICBvbGRlciB2ZXJzaW9ucyBzaW1wbHkgbWFwcGVkIGFsbCBhcnJheXMgaW50byBhIHNpbmdsZQogICAgICAgICAgIHBvaW50ZXIgc3VjaCBhcyAiaW50ICoiLiAgIEFsdGhvdWdoIHBvc3NpYmx5IHVudXN1YWwsIAogICAgICAgICAgIHRoZSBuZXcgdmVyc2lvbiBpcyBjb3JyZWN0IGluIHRlcm1zIG9mIHRoZSBDIHR5cGUgc3lzdGVtLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgCjgvMDYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCiAgICAgICAgICAgKiBbSmF2YV0gQXJyYXkgc2V0dGVycyBnZW5lcmF0ZWQgZm9yIHN0cnVjdC9jbGFzcyBhcnJheSBtZW1iZXJzLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgTWFueSBpbXByb3ZlbWVudHMgdG8gVGNsL1BlcmwvUHl0aG9uIG1vZHVsZXMgdG8gYmV0dGVyCiAgICAgICAgICAgd29yayB3aXRoIG11bHRpcGxlIGludGVyZmFjZSBmaWxlcyBhbmQgdGhlICVpbXBvcnQgZGlyZWN0aXZlLgoKOC8xMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIGJlaGF2aW9yIG9mICVpbXBvcnQgaW4gdGhlIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICAgU1dJRyBubyBsb25nZXIgcG9sbHV0ZXMgdGhlIG1vZHVsZSBuYW1lc3BhY2UgYnkgdXNpbmcKICAgICAgICAgICAnZnJvbSBtb2R1bGUgaW1wb3J0IConIHRvIHJlZmVyIHRvIHRoZSBvdGhlciBtb2R1bGUuIAogICAgICAgICAgIEluc3RlYWQsIGl0IGRvZXMgYSBwcm9wZXIgJ2ltcG9ydCBtb2R1bGUnLiAgIEFsc28sIFNXSUcKICAgICAgICAgICBtYXkgd29yayBhIGxvdCBiZXR0ZXIgd2hlbiBpbXBvcnRpbmcgbW9kdWxlcyB0aGF0IGluY2x1ZGUKICAgICAgICAgICByZWZlcmVuY2VzIHRvIG90aGVyIGltcG9ydGVkIG1vZHVsZXMuCgo4LzEzLzIwMDE6IG1rb2VwcGUKCSAgIEFkZGVkIG5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbnMsIGdlbmVyYWxpemluZyB0aG9zZSBvZiB0aGUKCSAgIEd1aWxlLXNwZWNpZmljIDUvMjcvMjAwMSBjaGFuZ2VzOiAKCSAgICogJGRlc2NyaXB0b3IgaXMgdGhlIHNhbWUgYXMgU1dJR1RZUEUkbWFuZ2xlLCBidXQgYWxzbwoJICAgICBlbnN1cmVzIHRoYXQgdGhlIHR5cGUgZGVzY3JpcHRvciBvZiB0aGlzIG5hbWUgZ2V0cwoJICAgICBkZWZpbmVkLgoJICAgKiAkKnR5cGUsICQqbHR5cGUsICQqbWFuZ2xlLCAkKmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IHN0YXIsIGJ1dCB0aGV5IFJFTU9WRSBvbmUgbGV2ZWwgb2YKCSAgICAgcG9pbnRlcnMgZnJvbSB0aGUgdHlwZS4gKFRoaXMgaXMgb25seSB2YWxpZCBmb3IgcG9pbnRlciAKCSAgICAgdHlwZXMuKQoJICAgKiAkJnR5cGUsICQmbHR5cGUsICQmbWFuZ2xlLCAkJmRlc2NyaXB0b3IgYXJlIHRoZSBzYW1lIGFzCgkgICAgIHRoZSB2YXJpYW50cyB3aXRob3V0IGFtcGVyc2FuZCwgYnV0IHRoZXkgQUREIG9uZSBsZXZlbCBvZgoJICAgICBwb2ludGVycyB0byB0aGUgdHlwZS4KCSAgIFRoZSBHdWlsZS1zcGVjaWZpYyBzdWJzdGl0dXRpb24gJGJhc2VkZXNjcmlwdG9yIHdhcyByZW1vdmVkCgkgICBiZWNhdXNlIGl0IHdhcyB1c2VsZXNzLgoKOC8xMi8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgVGhlICVleHRlcm4gZGlyZWN0aXZlIGlzIG5vdyBkZXByZWNhdGVkIGFuZCB3aXRoZHJhd24uICBUaGUKICAgICAgICAgICBwdXJwb3NlIG9mIHRoaXMgZGlyZWN0aXZlIHdhcyB0byBpbXBvcnQgc2VsZWN0ZWQgZGVmaW5pdGlvbnMKICAgICAgICAgICBmcm9tIG90aGVyIGludGVyZmFjZSBmaWxlcyBhbmQgaGVhZGVycy4gIEhvd2V2ZXIsIHRoZSBzYW1lCiAgICAgICAgICAgZnVuY3Rpb25hbGl0eSBpcyBiZXR0ZXIgaGFuZGxlZCB0aHJvdWdoICVpbXBvcnQuICAgVGhpcwogICAgICAgICAgIGxlYXZlcyBTV0lHIHdpdGggdHdvIGZpbGUgaW5jbHVzaW9uIGRpcmVjdGl2ZXM6CgogICAgICAgICAgICAgICVpbmNsdWRlIGZpbGVuYW1lICAgICAtIEluc2VydHMgaW50byBjdXJyZW50IGludGVyZmFjZQogICAgICAgICAgICAgICVpbXBvcnQgZmlsZW5hbWUgICAgICAtIEltcG9ydCB0eXBlcyBhbmQgY2xhc3NlcyBmcm9tIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgbW9kdWxlCgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgQWRkZWQgbmV3IHN1cHBvcnQgZm9yIHdyYXBwaW5nIEMvQysrIGNhbGxiYWNrIGZ1bmN0aW9ucy4gCiAgICAgICAgICAgQSBjb21tb24gcHJvYmxlbSB3aXRoIHNvbWUgQyBsaWJyYXJpZXMgaXMgdGhhdCBtYW55CiAgICAgICAgICAgZnVuY3Rpb25zIHRha2UgYSBmdW5jdGlvbiBwb2ludGVyIGFzIGFuIGFyZ3VtZW50LiBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgaW50ICgqb3ApKGludCxpbnQpLCAuLi4pOwoKICAgICAgICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgb25seSB3YXkgdG8gY2FsbCBzdWNoIGEgZnVuY3Rpb24gaXMgdG8KICAgICAgICAgICBwYXNzIGl0IGEgZnVuY3Rpb24gcG9pbnRlciBvZiBzb21lIGNvbXBhdGlibGUgdHlwZS4gIEluCiAgICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMgb2YgU1dJRywgeW91IGhhZCB0byBzb2x2ZSB0aGlzIHByb2JsZW0KICAgICAgICAgICB3aXRoIHNvbWUgcmVhbGx5IGdyb3NzIGhhY2tzLiAgRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50ZWQgdG8KICAgICAgICAgICB1c2UgdGhlIGZvbGxvd2luZyBmdW5jdGlvbiBhcyBhIGNhbGxiYWNrLAoKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsIGludCk7CgogICAgICAgICAgIHlvdSBoYWQgdG8gaW5zdGFsbCBhIHBvaW50ZXIgdG8gaXQgYXMgYSBjb25zdGFudC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNvbnN0YW50IGludCAoKkZPTykoaW50LGludCkgPSBmb287CgogICAgICAgICAgIG9yIAoKICAgICAgICAgICAgICAgY29uc3QgaW50ICgqRk9PKShpbnQsaW50KSA9IGZvbzsKCiAgICAgICAgICAgb3IgaWYgeW91IGhhZCBhIHJlYWxseSBvbGQgU1dJRyB2ZXJzaW9uOgoKICAgICAgICAgICAgICAgdHlwZWRlZiBpbnQgKCpPUF9GVU5DKShpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGRvX29wKC4uLiwgT1BfRlVOQywgLi4uKTsKICAgICAgICAgICAgICAgY29uc3QgT1BfRlVOQyBGT08gPSBmb287CgogICAgICAgICAgIAogICAgICAgICAgIE5vdywgeW91IGNhbiBkbyBvbmUgb2YgdHdvIHRoaW5nczoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgZm9vKGludCxpbnQpOwoKICAgICAgICAgICBUaGlzIGNyZWF0ZXMgYSBjb25zdGFudCAnZm9vJyBvZiB0eXBlIGludCAoKikoaW50LGludCkuCiAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlcyIpOwogICAgICAgICAgICAgICBpbnQgZm9vKGludCxpbnQpOwogICAgICAgICAgICAgICBpbnQgYmFyKGludCxpbnQpOwogICAgICAgICAgICAgICAlbm9jYWxsYmFjazsKCiAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgZnVuY3Rpb25zIGFyZSBpbnN0YWxsZWQgYXMgY29uc3RhbnRzIHdoZXJlCiAgICAgICAgICAgdGhlIG5hbWUgaXMgZGVmaW5lZCBieSB0aGUgZm9ybWF0IHN0cmluZyBnaXZlbiB0byAlY2FsbGJhY2soKS4KICAgICAgICAgICBJZiB0aGUgbmFtZXMgZ2VuZXJhdGVkIGJ5IHRoZSBmb3JtYXQgc3RyaW5nIGRpZmZlciBmcm9tIHRoZQogICAgICAgICAgIGFjdHVhbCBmdW5jdGlvbiBuYW1lLCBib3RoIGEgZnVuY3Rpb24gd3JhcHBlciBhbmQgYSBjYWxsYmFjayAKICAgICAgICAgICBjb25zdGFudCBhcmUgY3JlYXRlZC4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgJWNhbGxiYWNrKCIlKHVwcGVyKXMiKTsKICAgICAgICAgICAgICAgaW50IGZvbyhpbnQsaW50KTsKICAgICAgICAgICAgICAgaW50IGJhcihpbnQsaW50KTsKICAgICAgICAgICAgICAgJW5vY2FsbGJhY2s7CiAgICAgICAgICAgCiAgICAgICAgICAgQ3JlYXRlcyB0d28gd3JhcHBlciBmdW5jdGlvbnMgJ2ZvbycsICdiYXInIGFuZCBhZGRpdGlvbmFsbHkKICAgICAgICAgICBjcmVhdGVzIHR3byBjYWxsYmFjayBjb25zdGFudHMgJ0ZPTycsICdCQVInLgoKICAgICAgICAgICBOb3RlOiBTV0lHIHN0aWxsIGRvZXMgbm90IHByb3ZpZGUgYXV0b21hdGljIHN1cHBvcnQgZm9yIAogICAgICAgICAgIHdyaXRpbmcgY2FsbGJhY2sgZnVuY3Rpb25zIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UuCiAgICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8wNi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKICAgICAgICAgICAqIHN0cnVjdCBuZXN0aW5nIGZpeGVzIGFzIHBlciBTRiBidWcgIzQ0NzQ4OC4KCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIFRoZSAlbmFtZSBkaXJlY3RpdmUgbm93IGFwcGxpZXMgdG8gY29uc3RhbnRzIGNyZWF0ZWQgd2l0aAogICAgICAgICAgICNkZWZpbmUgYW5kICVjb25zdGFudC4gIEhvd2V2ZXIsIG1vc3QgbGFuZ3VhZ2UgbW9kdWxlcwogICAgICAgICAgIHdlcmUgbmV2ZXIgd3JpdHRlbiB0byBzdXBwb3J0IHRoaXMgYW5kIHdpbGwgaGF2ZSB0byBiZQogICAgICAgICAgIG1vZGlmaWVkIHRvIG1ha2UgaXQgd29yay4gIFRjbCwgUHl0aG9uLCBhbmQgUGVybCBtb2R1bGVzCiAgICAgICAgICAgYXJlIHdvcmtpbmcgbm93LgogICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMDMvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hc3NpdmUgY2hhbmdlcyBhbmQgc2ltcGxpZmljYXRpb24gb2YgQyBkZWNsYXJhdGlvbiBwYXJzaW5nLgogICAgICAgICAgIEFsdGhvdWdoIFNXSUcgaXMgc3RpbGwgbm90IGEgZnVsbCBDIHBhcnNlciwgaXRzIGFiaWxpdHkKICAgICAgICAgICB0byBoYW5kbGUgY29tcGxleCBkYXRhdHlwZXMgaW5jbHVkaW5nIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucwogICAgICAgICAgIGFuZCBwb2ludGVycyB0byBhcnJheXMgaGFzIGJlZW4gdmFzdGx5IGltcHJvdmVkLiAgCgo4LzAzLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQogICAgICAgICAgICogRGlzdHJpYnV0aW9uIGZpeGVzOiBhdXRvY29uZiBubyBsb25nZXIgbmVlZGVkIHRvIGluc3RhbGwgU1dJRy4KCjgvMDIvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgdHdvIHVuZG9jdW1lbnRlZCBwYXJzaW5nIGZlYXR1cmVzLiAgU1dJRyBubyBsb25nZXIKICAgICAgICAgICBzdXBwb3J0cyBvdXQtb2YtY2xhc3Mgc3RhdGljIGZ1bmN0aW9uIG9yIHZhcmlhYmxlCiAgICAgICAgICAgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgc3RhdGljIGludCBGb286OmJhcjsKCiAgICAgICAgICAgVGhpcyBmZWF0dXJlIG1heSByZXR1cm4gaWYgdGhlcmUgaXMgc3VmZmljaWVudCBkZW1hbmQuIAogICAgICAgICAgIEhvd2V2ZXIsIHNpbmNlIFNXSUcgaXMgbW9zdCBvZnRlbiB1c2VkIHdpdGggaGVhZGVyIGZpbGVzLAogICAgICAgICAgIGl0IGlzIG1vcmUgbGlrZWx5IGZvciB0aGVzZSBkZWZpbml0aW9ucyB0byBiZSBpbmNsdWRlZAogICAgICAgICAgIGluIHRoZSBjbGFzcyBkZWZpbml0aW9uLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOC8wMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogQ2xlYW51cCBvZiB0aGUgR0lGUGxvdCBleGFtcGxlcy4gVXBncmFkZWQgSmF2YSBHSUZQbG90IGV4YW1wbGUuCgo4LzAxLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gRWZmaWNpZW5jeSBjaGFuZ2VzOiBfY1B0ciB1c2VkIHdoZXJlIHBvc3NpYmxlIHJhdGhlciB0aGFuCgkgICAgIGdldENQdHIoKS4gQnVnIGZpeGVzIGZvciBpbmhlcml0YW5jZSAtIGRlcml2ZWQgY2xhc3Mgc29tZXRpbWVzCgkgICAgIGRpZG4ndCBkZWxldGUgdGhlIGMgbWVtb3J5IHdoZW4gX2RlbGV0ZSgpIHdhcyBjYWxsZWQuCgkgICAqIFtKYXZhXSBBYnN0cmFjdCBjKysgY2xhc3NlcyBhcmUgd3JhcHBlZCB3aXRoIGEgamF2YSBhYnN0cmFjdCBzaGFkb3cKCSAgICAgY2xhc3MuIEFsc28gYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24gaXMgbWFwcGVkIHdpdGggYW4gYWJzdHJhY3QgbWV0aG9kLgoJICAgKiBUaGUgZGVmYXVsdCBvdXRwdXQgZmlsZSBoYXMgYWx3YXlzIGJlZW4gPG1vZHVsZT5fd3JhcC5jLiBJdCBpcyBub3cKCSAgICAgPG1vZHVsZT5fd3JhcC5jeHggaWYgdGhlIC1jKysgY29tbWFuZGxpbmUgb3B0aW9uIGlzIHBhc3NlZCB0byBzd2lnLgoJICAgICBUaGlzIGhhcyBiZWVuIGRvbmUgYXMgb3RoZXJ3aXNlIGMrKyBjb2RlIHdvdWxkIGFwcGVhciBpbiBhIGMgZmlsZS4KICAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKiogCgo3LzMxLzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNb2RpZmllZCB0aGUgJWNvbnN0YW50IGRpcmVjdGl2ZSB0byBiZSBtb3JlIEMtbGlrZSBpbiBzeW50YXguCiAgICAgICAgICAgVGhlIHN5bnRheCBpcyBub3c6CgogICAgICAgICAgICAgICAgJWNvbnN0YW50IE5BTUUgPSBWQUxVRTsKICAgICAgICAgICAgICAgICVjb25zdGFudCBUWVBFIE5BTUUgPSBWQUxVRTsKIAogICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICVjb25zdGFudCBGb28gKkJhciA9ICZTcGFtOwoKICAgICAgICAgICBBIG1vcmUgc3VidGxlIGNhc2UgaXMgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVjb25zdGFudCBpbnQgKCpGT08pKGludCxpbnQpID0gYmxhaDsKCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqICBNb2R1bGVzIHRoYXQgd2VyZSB1c2luZwogICAgICAgICAgIHRoZSAlY29uc3RhbnQgZGlyZWN0aXZlIGRpcmVjdGx5IHdpbGwgbmVlZCB0byBiZSBtb2RpZmllZC4KICAgICAgCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgb2JzY3VyZSBhbmQgdW5kb2N1bWVudGVkIGZvcm0gb2YgdGhlICVpbmxpbmUgZGlyZWN0aXZlOgoKICAgICAgICAgICAgICAgJWlubGluZSBpbnQgYmxhaChpbnQgYSwgaW50IGIpIHsKICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqIAogICAgICAgICAgIChub3RlOiB0aGlzIGZlYXR1cmUgd2FzIG5ldmVyIGRvY3VtZW50ZWQgYW5kIGlzIHdpdGhkcmF3bikKCjcvMzAvMjAwMTogYmVhemxleQogICAgICAgICAgIFJlbW92ZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gZXhwbGljaXRseSBkZWNsYXJlZAogICAgICAgICAgIHJldHVybiB0eXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICBmb28oaW50KTsKCiAgICAgICAgICAgSW4gQywgc3VjaCBmdW5jdGlvbnMgd2VyZSBpbXBsaWNpdGx5IGFzc3VtZWQgdG8gcmV0dXJuIGFuICdpbnQnLgogICAgICAgICAgIEluIEMrKywgdGhpcyBpcyBpbGxlZ2FsLiAgRWl0aGVyIHdheSwgaXQncyBjb25zaWRlcmVkIGJhZAogICAgICAgICAgIHN0eWxlLiAgUmVtb3Zpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbiBTV0lHIHdpbGwgc2ltcGxpZnkKICAgICAgICAgICBjZXJ0YWluIGlzc3VlcyBpbiBwYXJzaW5nLgogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8zMC8yMDAxOiBta29lcHBlCgkgICAqIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rLiAgVGhlIFNvdXJjZS9ET0ggZGlyZWN0b3J5CgkgICAgIGFuZCBtb3N0IG9mIHRoZSBTb3VyY2UvU3dpZyBkaXJlY3RvcnkgaXMgdXAtdG8tZGF0ZSBub3cuCgkgICAqIFtHdWlsZV0gJXNjaGVtZSBpcyBub3cgYSBtYWNybyBmb3IgJWluc2VydCgic2NoZW1lIikuICAKCSAgICAgTmV3IHN5bnRheDogICVzY2hlbWUgIkZJTEVOQU1FIjsgCgkgICAgIE5ldyBzeW50YXg6ICAlc2NoZW1lICV7IFNDSEVNRS1DT0RFICV9CgkgICAgIE5ldyBtYWNyb3MgJW11bHRpcGxlX3ZhbHVlcywgJXZhbHVlc19hc19saXN0LAoJICAgICAldmFsdWVzX2FzX3ZlY3Rvci4gCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICAlcmVhZG9ubHkgYW5kICVyZWFkd3JpdGUgaGF2ZSBiZWVuIHR1cm5lZCBpbnRvIFNXSUcgcHJhZ21hcy4KICAgICAgICAgICAlcHJhZ21hKHN3aWcpIHJlYWRvbmx5IGFuZCAlcHJhZ21hKHN3aWcpIHJlYWR3cml0ZS4gIE1hY3JvcwogICAgICAgICAgIGFyZSB1c2VkIHRvIHByb3ZpZGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBNaW5vciBjaGFuZ2VzIHRvICVwcmFnbWEgZGlyZWN0aXZlLiAgJXByYWdtYSBtdXN0IGFsd2F5cwogICAgICAgICAgIGJlIGRpcmVjdGVkIHRvIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgJXByYWdtYShzd2lnKSBtYWtlX2RlZmF1bHQ7CiAgICAgICAgICAgICAgJXByYWdtYShwZXJsNSkgaW5jbHVkZSA9ICJibGFoLmkiOwoKICAgICAgICAgICBBbHNvIGV4dGVuZGVkIHRoZSBwcmFnbWEgZGlyZWN0aXZlIHRvIGFsbG93IGNvZGUgYmxvY2tzCiAKICAgICAgICAgICAgICAlcHJhZ21hKGZvbykgY29kZSA9ICV7CiAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGNvZGUgLi4uCiAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDaGFuZ2UgdG8gdGhlIHdheSAnY29uc3QnIHZhcmlhYmxlcyBhcmUgd3JhcHBlZC4gIEluIAogICAgICAgICAgIHByZXZpb3VzIHZlcnNpb25zIG9mIFNXSUcsIGEgJ2NvbnN0JyB2YXJpYWJsZSB3YXMKICAgICAgICAgICB3cmFwcGVkIGFzIGEgY29uc3RhbnQuICAgTm93LCAnY29uc3QnIHZhcmlhYmxlcyBhcmUKICAgICAgICAgICB3cmFwcGVkIGFzIHJlYWQtb25seSB2YXJpYWJsZXMuICBUaGVyZSBhcmUgc2V2ZXJhbAogICAgICAgICAgIHJlYXNvbnMgZm9yIG1ha2luZyB0aGlzIGNoYW5nZSwgbW9zdGx5IHBlcnRhaW5pbmcgdG8KICAgICAgICAgICBzdWJ0bGUgZGV0YWlscyBvZiBob3cgJ2NvbnN0JyBhY3R1YWxseSB3b3Jrcy4gCgogICAgICAgICAgIFRoaXMgd2lsbCBwcm9iYWJseSBicmVhayBvbGQgaW50ZXJmYWNlcyB0aGF0IHVzZWQgJ2NvbnN0JwogICAgICAgICAgIHRvIGNyZWF0ZSBjb25zdGFudHMuICAgQXMgYSByZXBsYWNlbWVudCwgY29uc2lkZXIgdXNpbmcgdGhpczoKCiAgICAgICAgICAgY29uc3QgaW50IGEgPSA0OyAgID09PT4gICAlY29uc3RhbnQgaW50IGEgPSA0OwogICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVvcmdhbml6YXRpb24gYW5kIHNpbXBsaWZpY2F0aW9uIG9mIHR5cGUgcGFyc2luZy4KICAgICAgICAgICBUeXBlcyB3aXRoICdjb25zdCcgc2hvdWxkIHdvcmsgY29ycmVjdGx5IG5vdy4KCjcvMjkvMjAwMTogYmVhemxleQogICAgICAgICAgIE1vc3Qgc3dpZyBkaXJlY3RpdmVzIHJlbGF0ZWQgdG8gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCiAgICAgICAgICAgYXJlIG5vdyBkZXByZWNhdGVkLgoKNy8yOS8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgUmVtb3ZlZCBzdXBwb3J0IGZvciBPYmplY3RpdmUtQyBpbiBvcmRlciB0byBzaW1wbGlmeQogICAgICAgICAgIHBhcnNlciByZWNvbnN0cnVjdGlvbi4gIFdpbGwgcmV0dXJuIGlmIHRoZXJlIGlzIHN1ZmZpY2llbnQKICAgICAgICAgICBkZW1hbmQuCiAgICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBDb2RlIGluY2x1c2lvbiBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgcGFyc2VyLiAgQSBjb21tb24KICAgICAgICAgICBkaXJlY3RpdmUgJWluc2VydCBpcyBub3cgdXNlZCBmb3IgZXZlcnl0aGluZy4gIFRoaXMKICAgICAgICAgICBpbnNlcnRzIGEgZmlsZSBpbnRvIHRoZSBvdXRwdXQ6CgogICAgICAgICAgICAgICAlaW5zZXJ0KGhlYWRlcikgImZvby5zd2ciCgogICAgICAgICAgIFRoaXMgaW5zZXJ0cyBzb21lIGlubGluZSBjb2RlIGludG8gdGhlIG91dHB1dAoKICAgICAgICAgICAgICAgJWluc2VydChoZWFkZXIpICV7CiAgICAgICAgICAgICAgICAgICAuLi4gc29tZSBjb2RlIC4uLiAKICAgICAgICAgICAgICAgJX0KCiAgICAgICAgICAgVGhlcmUgYXJlIGZpdmUgcHJlZGVmaW5lZCB0YXJnZXRzIGZvciB0aGUgaW5zZXJ0IGRpcmVjdGl2ZToKCiAgICAgICAgICAgICAgICJoZWFkZXIiICAgIC0gSGVhZGVyIHNlY3Rpb24gb2Ygd3JhcHBlciBmaWxlCiAgICAgICAgICAgICAgICJydW50aW1lIiAgIC0gUnVudGltZSBzZWN0aW9uIG9mIHdyYXBwZXIgZmlsZQogICAgICAgICAgICAgICAid3JhcHBlciIgICAtIFdyYXBwZXIgc2VjdGlvbgogICAgICAgICAgICAgICAiaW5pdCIgICAgICAtIEluaXRpYWxpemF0aW9uIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICJudWxsIiAgICAgIC0gTm90aGluZy4gRGlzY2FyZC4KCiAgICAgICAgICAgVGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzIGFyZSBzdGlsbCBzdXBwb3J0ZWQsIGJ1dCBhcmUKICAgICAgICAgICBub3cgZGVmaW5lZCBpbiB0ZXJtcyBvZiBtYWNyb3M6CgogICAgICAgICAgICAgICAleyAuLi4gJX0gICAgICAgICAgIC0+ICVpbnNlcnQoaGVhZGVyKSAgJXsgLi4uICV9CiAgICAgICAgICAgICAgICVpbml0ICV7IC4uLiAlfSAgICAgLT4gJWluc2VydChpbml0KSAgICAleyAuLi4gJX0KICAgICAgICAgICAgICAgJXdyYXBwZXIgJXsgLi4uICV9ICAtPiAlaW5zZXJ0KHdyYXBwZXIpICV7IC4uLiAlfQogICAgICAgICAgICAgICAlcnVudGltZSAleyAuLi4gJX0gIC0+ICVpbnNlcnQocnVudGltZSkgJXsgLi4uICV9CgogICAgICAgICAgIExhbmd1YWdlIG1vZHVsZXMgY2FuIGRlZmluZSBuZXcgbmFtZWQgdGFyZ2V0cyBieSB1c2luZyB0aGUKICAgICAgICAgICBDIEFQSSBmdW5jdGlvbiBTd2lnX3JlZ2lzdGVyX2ZpbGVieW5hbWUoKSAoc2VlIG1haW4uY3h4KS4KICAgICAgICAgICBGb3IgZXhhbXBsZSwgaWYgeW91IHdhbnRlZCB0byBleHBvc2UgYSBzaGFkb3cgY2xhc3MgZmlsZSwKICAgICAgICAgICB5b3UgY291bGQgZG8gdGhpczoKCiAgICAgICAgICAgICAgU3dpZ19yZWdpc3Rlcl9maWxlYnluYW1lKCJzaGFkb3ciLCBmX3NoYWRvdyk7CgogICAgICAgICAgIFRoZW4gaW4gdGhlIGludGVyZmFjZSBmaWxlOgoKICAgICAgICAgICAgICAlaW5zZXJ0KHNoYWRvdykgJXsgLi4uICV9CgogICAgICAgICAgIE5vdGU6IHRoaXMgY2hhbmdlIHNob3VsZCBub3QgYWZmZWN0IGFueSBvbGQgaW50ZXJmYWNlcywgYnV0CiAgICAgICAgICAgZG9lcyBvcGVuIHVwIG5ldyBwb3NzaWJpbGl0aWVzIGZvciBlbmhhbmNlbWVudHMuCgo3LzI5LzIwMDE6IGJlYXpsZXkKICAgICAgICAgICBTV0lHIG5vdyBhbHdheXMgaW5jbHVkZXMgYSBzdGFuZGFyZCBsaWJyYXJ5IGZpbGUgJ3N3aWcuc3dnJy4KICAgICAgICAgICBUaGlzIGZpbGUgZGVmaW5lcyBhIGxhcmdlIG51bWJlciBvZiBtYWNybyBkZWZpbml0aW9ucwogICAgICAgICAgIHRoYXQgZGVmaW5lIHRoZSBiZWhhdmlvciBvZiB2YXJpb3VzIFNXSUcgZGlyZWN0aXZlcy4KICAgICAgICAgICBQcmV2aW91c2x5LCBhbGwgU1dJRyBkaXJlY3RpdmVzIHdlcmUgaGFuZGxlZCBhcyBzcGVjaWFsCiAgICAgICAgICAgY2FzZXMgaW4gdGhlIHBhcnNlci4gIFRoaXMgbWFkZSB0aGUgcGFyc2VyIGEgbGFyZ2UgCiAgICAgICAgICAgYmxvYXRlZCBtZXNzLiAgTm93LCB0aGUgcGFyc2VyIGlzIHN0cmlwcGVkIGRvd24gdG8gYSBmZXcKICAgICAgICAgICBzaW1wbGUgZGlyZWN0aXZlcyBhbmQgbWFjcm9zIGFyZSB1c2VkIHRvIGhhbmRsZSBldmVyeXRoaW5nIGVsc2UuCgo3LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBGaXhlcyBmb3IgU291cmNlZm9yZ2UgYnVnICM0NDQ3NDggLSBuZXcgdGVzdGNhc2UgY3BwX3N0YXRpYzoKCSAgICAgW1RDTF0gQ2xhc3Mgd2l0aCBqdXN0IHN0YXRpYyBtZW1iZXIgdmFyaWFibGUvZnVuY3Rpb24gZml4CgkgICAgIFtKYXZhXSBGaXhlZCBzdGF0aWMgdmFyaWFibGVzIHN1cHBvcnQKCSAgICAgW1J1YnldIFN0YXRpYyB2YXJpYWJsZXMgd29ya2Fyb3VuZCByZW1vdmVkCgo3LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogc3R5cGUuYyAoU3dpZ1R5cGVfZGVmYXVsdCk6IFN0cmlwIHF1YWxpZmllcnMgZmlyc3QuIFRoZQoJICAgICBkZWZhdWx0IHR5cGUgb2YgImludCAqIGNvbnN0IiBpcyBub3cgIlNXSUdQT0lOVEVSICoiLgoJICAgKiBtYWluLmN4eDogRGVmaW5lICJfX2NwbHVzcGx1cyIgaW4gU1dJRydzIHByZXByb2Nlc3NvciBpZgoJICAgICBpbiBDKysgbW9kZS4KCSAgICogW0d1aWxlXTogQWRkZWQgc29tZSBzdXBwb3J0IGZvciBhcnJheXMgYW5kIEMrKwoJICAgICByZWZlcmVuY2VzLCBmaXhpbmcgdGhlICJjb25zdGFudF9wb2ludGVycyIgdGVzdCBjYXNlLgoJICAgKiBNb3ZlZCBtb3N0IHRlc3RzIGZyb20gdGhlIG9sZCBHdWlsZS1zcGVjaWZpYyB0ZXN0LXN1aXRlCgkgICAgIHRvIHRoZSBuZXcgdGVzdC1zdWl0ZS4gIEFsc28gbW92ZWQgcGVybDUvcG9pbnRlci1jeHgKCSAgICAgZXhhbXBsZSB0aGVyZS4KCjcvMjYvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFRlc3Qtc3VpdGUgYWRkZWQuCgkgICAqIEluaXRpYWwgdGVzdGNhc2VzOiBjb25zdGFudF9wb2ludGVycyBjcHBfZW51bSBkZWZpbmVzCgkgICAgIHNpemVvZl9wb2ludGVycyB1bmlvbnMgdmlydHVhbF9kZXN0cnVjdG9yCgkgICAqIE1ha2UgY2xlYW4gaW1wcm92ZW1lbnRzLgoKNy8yNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogW0phdmFdIFVuZGVyc2NvcmVzIGluIHRoZSBwYWNrYWdlIG5hbWUgYW5kL29yIG1vZHVsZSBuYW1lCgkgICBubyBsb25nZXIgZ2l2ZSBsaW5raW5nIHByb2JsZW1zLgoKNy8xNy8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgICogTW9yZSBwYXJzZXIgYnVnIGZpeGVzIGZvciBjb25zdGFudCBwb2ludGVycwoKNy8xOS8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV0gQWVzdGhldGljIGltcHJvdmVtZW50IGluIHZhcmlhYmxlIHdyYXBwZXJzLgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBGaXhlZCBjb3JlLWR1bXAgcHJvYmxlbSBpbiBwb2ludGVyIGxpYnJhcnkgd2hlbiAKICAgICAgICAgICAgIGZyZWVpbmcgY2hhcmFjdGVyIGFycmF5cy4KICAgICAgICAgICAgIFNGIEJ1ZyBbICM0MTU4MzcgXSBwb2ludGVyIGxpYiBjb3JlIGR1bXAKCjcvMTgvMjAwMTogYmVhemxleQogICAgICAgICAgICogRml4ZWQgcHJvYmxlbSB3aXRoIGRlZmF1bHQgZGVzdHJ1Y3RvcnMgYW5kIHNoYWRvdwogICAgICAgICAgICAgY2xhc3Nlcy4gIFNGIGJ1ZyAjMjIxMTI4LgoKNy8xOC8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgKiBUbyBwcm92aWRlIGJldHRlciBsaW5lLW51bWJlciB0cmFja2luZyBpbiBpbnRlcmZhY2VzCiAgICAgICAgICAgICB3aXRoIGxvdHMgb2YgbWFjcm9zLCBzcGVjaWFsIGxvY2F0b3IgY29tbWVudHMgYXJlCiAgICAgICAgICAgICBub3cgZ2VuZXJhdGVkIGJ5IHRoZSBTV0lHIHByZXByb2Nlc3Nvci4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAvKkBmb28uaSw0MixCTEFIQCovZXhwYW5kZWQgbWFjcm8vKkBAKi8KCiAgICAgICAgICAgICBUaGUgZmlyc3QgLypALi4uQCovIHNlcXVlbmNlIHNldHMgdGhlIGNvbnRleHQKICAgICAgICAgICAgIHRvIHBvaW50IHRvIHRoZSBtYWNybyBjb2RlLiAgVGhlIC8qQEAqLyBjb21tZW50CiAgICAgICAgICAgICB0ZXJtaW5hdGVzIHRoZSBjb250ZXh0LiAgVGhlIFNXSUcgcGFyc2VyIHNob3VsZAogICAgICAgICAgICAgaWdub3JlIGFsbCBvZiB0aGUgbG9jYXRvciBjb21tZW50cyBhcyBzaG91bGQKICAgICAgICAgICAgIHRoZSBDIGNvbXBpbGVyIChzaG91bGQgc3VjaCBjb21tZW50cyBlbmQgdXAKICAgICAgICAgICAgIGluIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUpLgoKNy8xOC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IGhhbmRsZXMgc2V2ZXJlbHkgY29uc3RpZmllZCB0eXBlcyBpbgoJICAgdHlwZW1hcHMuICBUaGlzIGludHJvZHVjZWQgYSBuZXcgc2hpZnQvcmVkdWNlIGNvbmZsaWN0LCBidXQKCSAgIG9ubHkgd2l0aCBhIGhldXJpc3RpYyBmdW5jdGlvbi1wb2ludGVyIGNhdGNoLWFsbCBydWxlLiAgCgkgICAqIFtHdWlsZV06IEFkZGVkIHR5cGVtYXBzIGZvciBzZXZlcmVseSBjb25zdGlmaWVkIHR5cGVzLiAKCSAgICogRml4ZWQgdGhlICJ0ZW1wbGF0ZS13aGl0ZXNwYWNlIiBwcm9ibGVtIGJ5IGNhbm9uaWNhbGl6aW5nCgkgICAgIHdoaXRlc3BhY2UsIGVzcGVjaWFsbHkgYXJvdW5kIGFuZ2xlIGJyYWNrZXRzIGFuZCBjb21tYXMuIAoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IEEgU2NoZW1lIGZpbGUgaXMgZW1pdHRlZCBpZiB0aGUgLXNjbXN0dWIgRklMRS5TQ00KCSAgIGNvbW1hbmQtbGluZSBvcHRpb24gaXMgdXNlZC4gIFRoZSAlc2NoZW1lIGRpcmVjdGl2ZQoJICAgKGltcGxlbWVudGVkIGFzIGEgbWFjcm8gZm9yIGEgcHJhZ21hKSBhbGxvd3MgdG8gaW5zZXJ0CgkgICBhcmJpdHJhcnkgY29kZSBoZXJlLiAgSW4gInNpbXBsZSIgYW5kICJwYXNzaXZlIiBsaW5rYWdlLAoJICAgdGhlIGZpbGUgZ2V0cyBmaWxsZWQgd2l0aCBkZWZpbmUtbW9kdWxlIGFuZCBleHBvcnQKCSAgIGRlY2xhcmF0aW9ucy4KCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFBhcnNlciBidWcgZml4IHRvIHN1cHBvcnQgY29uc3RhbnQgcG9pbnRlcnMsIGVnIGludCogY29uc3QgcHRyLgoJICAgRml4ZWQgZXZlcnl3aGVyZSAtIHZhcmlhYmxlcywgcGFyYW1ldGVycywgcmV0dXJuIHR5cGVzIGV0Yy4gTm90ZSB0aGF0CgkgICB3aGVuIHdyYXBwaW5nIGEgY29uc3RhbnQgcG9pbnRlciB2YXJpYWJsZSBvbmx5IHRoZSBnZXR0ZXIgaXMgZ2VuZXJhdGVkLgoKNy8xNy8yMDAxOiBta29lcHBlCgkgICAqIEZpeGVkIFNGIGJ1ZyAjNDQxNDcwICgjZGVmaW5lIFggIi8vIiB3b3VsZCBub3QgYmUgcGFyc2VkLAoJICAgICBzZWUgdGVzdC1zdWl0ZSBlbnRyeSAicHJlcHJvYy0xIiksIHJlcG9ydGVkIGJ5IFQuIFcuIEJ1cnRvbgoJICAgICA8dHdidXJ0b25AdXNlcnMuc2YubmV0Pi4KCSAgICogQ2hhbmdlZCB0aGUgdHlwZSBvZiBjaGFyYWN0ZXIgY29uc3RhbnRzIHRvICJjaGFyIiwgcmF0aGVyCgkgICAgIHRoYW4gImNoYXIgKiIuICBDaGFuZ2VkIHRoZSBpbmRpdmlkdWFsIGxhbmd1YWdlIG1vZHVsZXMKCSAgICAgdG8ga2VlcCB0aGUgb2xkIGJlaGF2aW91ciwgZXhjZXB0IGZvciB0aGUgR3VpbGUgbW9kdWxlLAoJICAgICB3aGVyZSBpdCBpcyBkZXNpcmVkIHRvIG1ha2UgdGhlbSBTY2hlbWUgY2hhcmFjdGVycy4gIFRoaXMKCSAgICAgZml4ZXMgU0YgYnVnICMyMzE0MDksIHRlc3Qtc3VpdGUgZW50cnkgImNoYXItY29uc3RhbnQiLgoJICAgKiBBcHBsaWVkIHBhdGNoIGZvciBET0gvRG9oL21lbW9yeS5jIGJ5IExlcyBTY2hhZmZlcgoJICAgICA8c2NoYWZmZXJAb3B0b25saW5lLm5ldD4gKGF2b2lkIHJlcXVpcmVkIHNpZGUgZWZmZWN0cyBpbgoJICAgICBhc3NlcnQpLiAKCjcvMTcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEJ1ZyBmaXggaW4gcGFyc2VyIGZvciB2aXJ0dWFsIGRlc3RydWN0b3Igd2l0aCB2b2lkIGFzIHBhcmFtZXRlcgoJICAgKiBCdWcgZml4IGluIHBhcnNlciAjZGVmaW5lcyBlbWJlZGRlZCB3aXRoaW4gY2xhc3Nlcy9zdHJ1Y3RzL3VuaW9ucwoJICAgQ29uc2VxdWVudGx5ICVjb25zdGFudCBjYW4gbm93IGFsc28gYmUgcGxhY2VkIHdpdGhpbiBhIHN0cnVjdC9jbGFzcy91bmlvbi4KCSAgICogQnVnIGZpeCBpbiBwYXJzZXIgdG8gYWxsb3cgc2l6ZW9mKCpJX2FtX2FfcG9pbnRlcikgd2l0aGluIGEgI2RlZmluZQoKNy8xNi8yMDAxOiBta29lcHBlCgkgICAqIEFkZGVkIGNoYW5nZXMgZm9yIHRoZSBNYWNpbnRvc2ggY29udHJpYnV0ZWQgYnkgTHVpZ2kKCSAgIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4gCgkgICAqIFNvbWUgImNvbnN0IiBmaXhlcyBpbiB0aGUgY29kZS4KCSAgICogW0d1aWxlXTogTWFkZSB0aGUgY29uc3RhbnQtd3JhcHBlciBmdW5jdGlvbnMgbXVjaCBzaG9ydGVyLgoKNy8xMy8yMDAxOiBta29lcHBlCgkgICAqIFtHdWlsZV06IFNvbWUgImNvbnN0IiBmaXhlcyBmb3IgR3VpbGUgdmVyc2lvbiAxLjMuNC4KCSAgICogSGFuZGxlIGFub255bW91cyBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgc3RhdGljCgkgICAgIGFycmF5IG1lbWJlcnMgb2YgY2xhc3Nlcy4gIEJvdGggYnVncyByZXBvcnRlZCBieSBBbm5hbGlzYSBUZXJyYWNpbmEKCSAgICAgPGFubmFsaXNhLnRlcnJhY2luYUBkYXRhbWF0Lml0Pjsgc2VlIHRoZSBmaWxlcwoJICAgICBFeGFtcGxlcy9ndWlsZS90ZXN0LXN1aXRlL3N0YXRpYy1hcnJheS1tZW1iZXIuaSBhbmQKCSAgICAgYW5vbnltb3VzLWFyZy5pLgoKVmVyc2lvbiAxLjMuNiAgKEp1bHkgOSwgMjAwMSkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjcvMDkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IEZPUkVHUk9VTkQgYW5kIEJBQ0tHUk9VTkQgZGVmaW5pdGlvbiBtaXNzaW5nIAoJICAgYWZ0ZXIgVFJBTlNQQVJFTlQgI2RlZmluZSBmaXggaW4gR0lGUGxvdAoKNy8wMy8yMDAxOiBiZWF6bGV5CiAgICAgICAgICAgRml4ZWQgdXAgdGhlIHZlcnNpb24gbnVtYmVycyBzbyB0aGF0IHRoZSByZWxlYXNlIGlzIGtub3duCiAgICAgICAgICAgYXMgMS4zLjYuICBBbGwgZnV0dXJlIHJlbGVhc2VzIHNob3VsZCBoYXZlIGEgc2ltaWxhcgogICAgICAgICAgIHZlcnNpb24gZm9ybWF0LgoKNy8wMi8yMDAxOiBta29lcHBlCgkgICAqIFtQeXRob25dOiBQcmV2ZW50IHRoZSBwcm9ibGVtIG9mIHNlbGYudGhpc293biBub3QgYmVpbmcKCSAgIGRlZmluZWQgaWYgdGhlIEMrKyBjbGFzcyBjb25zdHJ1Y3RvciByYWlzZWQgYW4gZXhjZXB0aW9uLgoJICAgVGhhbmtzIHRvIEx1aWdpIEJhbGxhYmlvIDxiYWxsYWJpb0BtYWMuY29tPi4KCjYvMjkvMjAwMTogbWtvZXBwZQoJICAgKiBNb3JlIHBvcnRhYmlsaXR5IGZpeGVzOyBmaXhlZCAiZ2NjIC1XYWxsIiB3YXJuaW5ncy4KCjYvMjkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIEdJRlBsb3QgZXhhbXBsZXM6IFRSQU5TUEFSRU5UICNkZWZpbmUgbXVsdGlwbGUgdGltZXMgb24gU29sYXJpcyAKCSAgIChjbGFzaGVzIHdpdGggc3RyZWFtLmgpLgoJICAgKiBNdWx0aXBsZSBkZWZpbml0aW9uIGJ1ZyBmaXggZm9yIHNoYWRvdyBjbGFzc2VzLiBUaGUgcGVybCBhbmQgcHl0aG9uIAoJICAgbW9kdWxlcyBoYWQgd29ya2Fyb3VuZHMgd2hpY2ggaGF2ZSBiZWVuIHJlcGxhY2VkIHdpdGggZml4ZXMgaW4gCgkgICB0aGUgY29yZS4gTWFueSBvZiB0aGUgTGFuZ3VhZ2U6OmNwcF94eHh4IGZ1bmN0aW9ucyBub3cgc2V0IGEgCgkgICBmbGFnIHdoaWNoIHRoZSBkZXJpdmVkIGNsYXNzZXMgY2FuIGFjY2VzcyB0aHJvdWdoIAoJICAgaXNfbXVsdGlwbGVfZGVmaW5pdGlvbigpIHRvIHNlZSB3aGV0aGVyIG9yIG5vdCBjb2RlIHNob3VsZCBiZSAKCSAgIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGJlbG93IHdvdWxkIGhhdmUgcHJvZHVjZWQgdmFyeWluZyBkZWdyZWVzIAoJICAgb2YgaW5jb3JyZWN0IHNoYWRvdyBjbGFzcyBjb2RlIGZvciB0aGUgdmFyaW91cyBtb2R1bGVzOgoJICAgY2xhc3MgVGVzdENsYXNzCgkgICB7CgkgICBwdWJsaWM6CgkgICAgIFRlc3RDbGFzcygpIHt9CgkgICAgIFRlc3RDbGFzcyhpbnQgYSkge30KCSAgICAgflRlc3RDbGFzcygpIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KHNob3J0IGspIHt9CgkgICAgIHVuc2lnbmVkIGxvbmcgeHl6KGludCBuKSB7fQoJICAgICBzdGF0aWMgdm9pZCBzdGF0aWNfZnVuYygpIHt9CgkgICAgIHN0YXRpYyB2b2lkIHN0YXRpY19mdW5jKGludCBhKSB7fQoJICAgfTsKCSAgIHZvaWQgZGVsZXRlX1Rlc3RDbGFzcyhpbnQgYSk7Cgo2LzI3LzIwMDE6IG1rb2VwcGUKCSAgICogW1BlcmxdIEFub3RoZXIgY29uc3QtcmVsYXRlZCBwb3J0YWJpbGl0eSBmaXguCgo2LzI2LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBbSmF2YV0gQWRkZWQgaW4gY3BwX3ByYWdtYSgpIHN1cHBvcnQgd2l0aCBhIGhvc3Qgb2YgbmV3IHByYWdtYXMgLSBzZWUgCgkgICBqc3dpZy5odG1sLiBUaGVzZSBhcmUgZGVzaWduZWQgZm9yIGJldHRlciBtaXhpbmcgb2YgSmF2YSBhbmQgYysrLiBJdCAKCSAgIGVuYWJsZXMgdGhlIHVzZXIgdG8gc3BlY2lmeSBwdXJlIEphdmEgY2xhc3NlcyBhcyBiYXNlcyBhbmQvb3IgaW50ZXJmYWNlcyAKCSAgIGZvciB0aGUgd3JhcHBlZCBjL2MrKy4KCSAgICogW0phdmFdIE9sZCBwcmFnbWFzIHJlbmFtZWQuIFdhcm5pbmcgZ2l2ZW4gZm9yIHRoZSBtb21lbnQgaWYgdXNlZC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCjYvMjUvMjAwMTogbWtvZXBwZQoJICAgKiBJbmNvcnBvcmF0ZWQgbW9yZSBidWlsZCBjaGFuZ2VzIGNvbnRyaWJ1dGVkIGJ5IFd5c3MgQ2xlbWVucwoJICAgPFdZU0BoZWxibGluZy5jaD4gZm9yIHN3aWcvcnVieSBvbiBjeWd3aW4uCgo2LzIwLzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgKiBNYWtlZmlsZSBtb2RzIHNvIHRoYXQgJ21ha2UgY2hlY2snIHVzZXMgdGhlIHN3aWcgb3B0aW9ucyBpbiB0aGUgbWFrZWZpbGVzCgkgICAqIFtKYXZhXSBSZW1vdmVkIEdlbmVyYXRpbmcgd3JhcHBlcnMgbWVzc2FnZQoJICAgKiBbSmF2YV0gTlVMTCBwb2ludGVyIGJ1ZyBmaXgKCSAgICogW0phdmFdIEJ1ZyBmaXggZm9yIEthZmZlIEpWTQoKNi8yMC8yMDAxOiBta29lcHBlCgkgICAqIFNXSUdfVHlwZVF1ZXJ5IGZyb20gY29tbW9uLnN3ZyBub3cgcmV0dXJucyBhCgkgICBzd2lnX3R5cGVfaW5mbyogcmF0aGVyIHRoYW4gYSB2b2lkKi4gIFRoaXMgZml4ZXMgYSBwcm9ibGVtCgkgICB3aGVuIHVzaW5nIHBvaW50ZXIuaSBhbmQgQysrLCBhcyBpbGx1c3RyYXRlZCBieSB0aGUgbmV3CgkgICB0ZXN0LXN1aXRlIGV4YW1wbGUgcGVybDUvcG9pbnRlci1jeHguCgkgICAqIFBvcnRhYmlsaXR5IGZpeGVzIChjb25zdCBjaGFyICopLiAKCSAgICogSW5jb3Jwb3JhdGVkIGJ1aWxkIGNoYW5nZXMgY29udHJpYnV0ZWQgYnkgV3lzcyBDbGVtZW5zCgkgICA8V1lTQGhlbGJsaW5nLmNoPiwgd2hpY2ggbWFrZSBzd2lnIHJ1bm5hYmxlIG9uIGN5Z3dpbi4KCjYvMTkvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICAqIFtKYXZhXSBCdWcgZml4IGZvciBTRiBidWcgIzIxMTE0NC4gVGhpcyBmaXggaXMgYSB3b3JrYXJvdW5kIAoJICAgICB1bnRpbCBmaXhlZCBpbiB0aGUgY29yZS4KCjYvMTkvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBQb3J0YWJpbGl0eSBmaXhlcyBmb3IgdXNlIHdpdGggdGhlIFN1biBGb3J0ZQoJICAgY29tcGlsZXJzLiAKCSAgICogW1RjbF06IFBvcnRhYmlsaXR5IGZpeCAoY29uc3QgY2hhciAqKS4KCSAgICogW1RjbF06IENvbmZpZ3VyZSBub3cgZmlyc3QgdHJpZXMgdG8gZmluZCBhIHRjbENvbmZpZy5zaAoJICAgZmlsZSBpbiBvcmRlciB0byBmaW5kIHRoZSBUY2wgaW5jbHVkZSBkaXJlY3RvcnksIGxpYnJhcnkKCSAgIGxvY2F0aW9uIGFuZCBsaWJyYXJ5IG5hbWUuCgkgICAqIFtQeXRob25dOiBBZGRlZCBhIGZldyBwb3NzaWJsZSBsaWJyYXJ5IGxvY2F0aW9ucy4KCjYvMTgvMjAwMTogbWtvZXBwZQoJICAgKiBbR3VpbGVdOiBEb24ndCBjYWxsIHNjbV9jX2V4cG9ydCBpZiBub3RoaW5nIGlzIHRvIGJlCgkgICAgIGV4cG9ydGVkLiAgRG9uJ3Qgd2FybiBvbiAlbW9kdWxlIGlmIG1vZHVsZSBoYXMgYmVlbiBzZXQKCSAgICAgYWxyZWFkeSAodGhpcyBmcmVxdWVudGx5IG9jY3VycyB3aGVuICVpbXBvcnQgaXMgdXNlZCkuCgo2LzE2LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogTmV3ICJwYXNzaXZlIiBsaW5rYWdlLCB3aGljaCBpcyBhcHByb3ByaWF0ZSBmb3IKCSAgICAgbXVsdGktbW9kdWxlIGV4dGVuc2lvbnMgd2l0aG91dCBHdWlsZSBtb2R1bGUgbWFnaWMuCgo2LzE1LzIwMDE6IG1rb2VwcGUKCSAgICogW0d1aWxlXTogRml4ZWQgcHJpbnRpbmcgb2Ygc21vYnMgKHNwYWNlIGFuZCBhbmdsZSB3ZXJlCgkgICAgIG1pc3NpbmcpLiAKCSAgICogUHJvcGVybHkgZ2VuZXJhdGUgdHlwZSBpbmZvcm1hdGlvbiBmb3IgYmFzZSBjbGFzc2VzCgkgICAgIGltcG9ydGVkIHdpdGggdGhlICVpbXBvcnQgZGlyZWN0aXZlLiAgVGhhbmtzIHRvIE1hcmNlbG8KCSAgICAgTWF0dXMgPG1tYXR1c0BhY21zLmFyaXpvbmEuZWR1PiBmb3IgdGhlIHJlcG9ydCBhbmQgdGhlCgkgICAgIHBhdGNoOyB0aGlzIGNsb3NlcyBTRiBidWcgIzIzMTYxOTsgc2VlIGFsc28KCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9pbXBvcnQqLiAKCSAgICogW0d1aWxlXTogRml4IGNhc3RpbmcgYmV0d2VlbiBjbGFzcyBhbmQgYmFzZSBjbGFzczsgdGhlCgkgICAgIHJ1bnRpbWUgdHlwZSBzeXN0ZW0gaGFkIGl0IHRoZSB3cm9uZyB3YXkgYXJvdW5kOyBzZWUKCSAgICAgRXhhbXBsZXMvZ3VpbGUvdGVzdC1zdWl0ZS9jYXN0cy5pCgkgICAqIE1ha2UgdHlwZW1hcHMgZm9yIFNXSUdQT0lOVEVSICogd2l0aCBhcmcgbmFtZSB0YWtlCgkgICAgIHByZWNlZGVuY2Ugb3ZlciB0aG9zZSB3aXRob3V0IGFyZyBuYW1lLCB0byBtYXRjaCBub3JtYWwKCSAgICAgdHlwZW1hcCBwcmVjZWRlbmNlIHJ1bGVzLgoJICAgKiBGaXhlZCB0aGUgcmFuZG9tLWxpbmUtbnVtYmVycyBwcm9ibGVtIHJlcG9ydGVkIGFzIFNGIGJ1ZwoJICAgICAjMjE3MzEwOyB0aGFua3MgdG8gTWljaGFlbCBTY2hhcmYgPHNjaGFyZkB1c2Vycy5zZi5uZXQ+LgoJICAgKiBbR3VpbGVdOiBIYW5kbGUgdGhlICVuYW1lIGFuZCAlcmVuYW1lIGRpcmVjdGl2ZXMuCgkgICAqIE5ldyBzeW50YXg6ICVuYW1lIGFuZCAlcmVuYW1lIG5vdyBvcHRpb25hbGx5IHRha2UgZG91YmxlCgkgICAgIHF1b3RlcyBhcm91bmQgdGhlIHNjcmlwdGluZyBuYW1lLiAgVGhpcyBpcyB0byBhbGxvdyBzY3JpcHRpbmcKCSAgICAgbmFtZXMgdGhhdCBhcmVuJ3QgdmFsaWQgQyBpZGVudGlmaWVycy4KCjYvMTQvMjAwMTogYmVhemxleQogICAgICAgICAgIE1hZGUgYSBtaW5vciBjaGFuZ2UgdG8gdGhlIHdheSBmaWxlcyBhcmUgbG9hZGVkIGluCiAgICAgICAgICAgb3JkZXIgdG8gZ2V0IGZpbGUvbGluZSBudW1iZXIgcmVwb3J0aW5nIGNvcnJlY3QgaW4KICAgICAgICAgICB0aGUgcHJlcHJvY2Vzc29yLgoKNi8xNC8yMDAxOiBta29lcHBlCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIHRoZSAobm9uLXN0YW5kYXJkKSAibG9uZyBsb25nIgoJICAgICB0eXBlcy4gSXQgaXMgdXAgdG8gdGhlIGluZGl2aWR1YWwgbGFuZ3VhZ2UgbW9kdWxlcyB0bwoJICAgICBwcm92aWRlIHR5cGVtYXBzIGlmIG5lZWRlZC4gUmVwb3J0ZWQgYnkgU2FtIFN0ZWluZ29sZCwgU0YKCSAgICAgYnVnICM0MjkxNzYuCgkgICAqIFRoZSBwYXJzZXIgbm93IHVuZGVyc3RhbmRzIGFyZ3VtZW50cyBsaWtlICJjb25zdCBpbnQgKgoJICAgICBjb25zdCBpIi4gVGhpcyBmaXhlcyBTRiBidWcgIzIxNTY0OS4KCSAgICogRml4ZWQgdGhlIEd1aWxlIHRlc3Qtc3VpdGUuCgo2LzEzLzIwMDE6IG1rb2VwcGUKCSAgIFBhcnRpYWwgbWVyZ2UgZnJvbSB0aGUgQ1ZTIHRydW5rIGF0IHRhZwoJICAgIm1rb2VwcGUtbWVyZ2UtMSIuIFRoaXMgY292ZXJzIHRoZSBmb2xsb3dpbmcgY2hhbmdlczoKCnwgMDEvMTYvMDE6IHR0bgp8CSAgIFdyb3RlIHRhYmxlIG9mIGNvbnRlbnRzIGZvciBEb2MvZW5naW5lZXJpbmcuaHRtbC4gIEFkZGVkIHNlY3Rpb24KfAkgICBvbiBDVlMgdGFnZ2luZyBjb252ZW50aW9ucy4gIEFkZGVkIGNvcHlyaWdodCB0byBvdGhlciBkb2NzLgp8IDkvMjUvMDAgOiBiZWF6bGV5CnwgCSAgIE1vZGlmaWVkIHRoZSBwcmVwcm9jZXNzb3Igc28gdGhhdCBtYWNybyBuYW1lcyBjYW4gc3RhcnQgd2l0aCBhICclJy4KfCAJICAgVGhpcyBtYXkgYWxsb3cgbmV3IFNXSUcgImRpcmVjdGl2ZXMiIHRvIGJlIGRlZmluZWQgYXMgbWFjcm9zIGluc3RlYWQKfCAJICAgb2YgaGF2aW5nIHRvIGJlIGhhcmQtY29kZWQgaW50byB0aGUgcGFyc2VyLiAgCnwKfCAqKiogQWxzbyBhIHlldC10by1iZS1kb2N1bWVudGVkIHF1b3RpbmcgbWVjaGFuaXNtIHdpdGggYmFja3F1b3Rlcwp8ICoqKiBoYXMgYmVlbiBpbXBsZW1lbnRlZD8KCjYvMTMvMjAwMTogbWtvZXBwZQoJICogV2hlbiBjb25maWd1cmUgZG9lcyBub3QgZmluZCBhIGxhbmd1YWdlLCBkb24ndCB1c2UgZGVmYXVsdAoJICAgcGF0aHMgbGlrZSAvdXNyL2xvY2FsL2luY2x1ZGU7IHRoaXMgb25seSBjYXVzZXMgYnVpbGQKCSAgIHByb2JsZW1zLgoJICogTmV3IGRpcmVjdG9yeTogRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZSwgd2hlcmUgYSBmZXcKCSAgIGJ1Z3MgaW4gMS4zYTUgYXJlIGRlbW9uc3RyYXRlZC4gCgkgKiBIYW5kbGUgQysrIG1ldGhvZHMgdGhhdCBoYXZlIGJvdGggYSAiY29uc3QiIGFuZCBhICJ0aHJvdyIKCSAgIGRpcmVjdGl2ZSAoc2VlIEV4YW1wbGVzL0d1aWxlL3Rlc3Qtc3VpdGUvY3BsdXNwbHVzLXRocm93LmkpOyAKCSAgIHRoYW5rcyB0byBTY290dCBCLiBEcnVtbW9uZHMgZm9yIHRoZSByZXBvcnQgYW5kIHRoZSBmaXguIAoJICogSGFuZGxlIEMrKyBwb2ludGVyLXJlZmVyZW5jZSBhcmd1bWVudHMgKGxpa2UgImludCAqJiBhcmciKSAKCSAgIChzZWUgRXhhbXBsZXMvR3VpbGUvdGVzdC1zdWl0ZS9wb2ludGVyLXJlZmVyZW5jZS5pLAoJICAgcmVwb3J0ZWQgYXMgU0YgYnVnICM0MzIyMjQpLgoJICogW1J1YnldIEZpeGVkIHR5cG8gaW4gcnVieWRlYy5zd2c7IHRoYW5rcyB0byBMeWxlIEpvaG5zb24hCgkgKiBEb24ndCBzdG9wIHRlc3Rpbmcgd2hlbiBvbmUgdGVzdCBmYWlscy4KCSAqIFtHdWlsZSwgTXpTY2hlbWVdIERvbid0IHByaW50ICJHZW5lcmF0aW5nIHdyYXBwZXJzLi4uIi4KCjYvMTIvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBWRUNUT1JMRU5JTlBVVCBhbmQgTElTVExFTklOUFVUIG5vdyBoYXZlIHNlcGFyYXRlCgkgICBsaXN0IGxlbmd0aCB2YXJpYWJsZXMuIFRZUEVNQVBfUE9JTlRFUl9JTlBVVF9PVVRQVVQKCSAgIGF0dGFjaGVzIGFyZ3VtZW50IGRvY3VtZW50YXRpb24gaW52b2x2aW5nIFNDTV9UWVBFIHRvIHRoZQoJICAgc3RhbmRhcmQgcG9pbnRlciB0eXBlbWFwcy4gSU5PVVQgaXMgbm93IGFuIGFsaWFzIGZvciBCT1RILgoKNi8xMi8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFNvbWUgSmF2YSBkb2N1bWVudGF0aW9uIGFkZGVkLgoJICAgW0phdmFdIEZpeGVkIGJ1Z3MgaW4gaW1wb3J0IHByYWdtYSBhbmQgc2hhZG93IHByYWdtYS4gCgo2LzEyLzIwMDE6IG1rb2VwcGUKCSAgIEZpeCBkZWNsYXJhdGlvbnMgb2YgU1dJR19kZWZpbmVfY2xhc3MKCSAgIChMaWIvcnVieS9ydWJ5ZGVjLnN3ZykgYW5kIFNXSUdfVHlwZVF1ZXJ5CgkgICAoTGliL2NvbW1vbi5zd2cpLiBUaGFua3MgdG8gTHlsZSBKb2huc29uCgkgICA8bGpvaG5zb25AcmVzZ2VuLmNvbT4gZm9yIHRoZSBwYXRjaGVzLgoKNi8xMS8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIFVzZSBsb25nIGluc3RlYWQgb2Ygc2NtX2JpdHNfdDsgdGhpcyBtYWtlcyB0aGUKCSAgIGdlbmVyYXRlZCB3cmFwcGVyIGNvZGUgY29tcGF0aWJsZSB3aXRoIEd1aWxlIDEuMy40CgkgICBhZ2Fpbi4gVGhhbmtzIHRvIE1hc2FraSBGdWt1c2hpbWEgZm9yIHBvaW50aW5nIHRoaXMgb3V0LgoKNi8xMS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFRoZSBnZW5lcmljIElOU1RBTEwgZmlsZSBmcm9tIGF1dG9jb25mIGFkZGVkLiBGZXcgY2hhbmdlcyB0byBSRUFETUUgZmlsZS4KCjYvMTEvMjAwMTogbWtvZXBwZQoJICAgRml4ZWQgdHlwbyBpbiBNYWtlZmlsZS5pbjsgdGhhbmtzIHRvIEdyZWcgVHJveGVsCgkgICA8Z2R0QGlyLmJibi5jb20+LiAKCjYvMDgvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBtYWtlIGNoZWNrIHdvcmtzIGFnYWluLiBFeGFtcGxlcy9HSUZQbG90IGNvbmZpZ3VyZSBnZW5lcmF0ZWQgYnkKCSAgIHRvcCBsZXZlbCBhdXRvY29uZiBub3cuCgo2LzA4LzIwMDE6IG1rb2VwcGUKCSAgIEFub3RoZXIgYnVpbGQgY2hhbmdlOiBUaGUgbmV3IHNjcmlwdCBhdXRvZ2VuLnNoIHJ1bnMKCSAgIGF1dG9jb25mIGluIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3Rvcmllcy4gIFRoZSB0b3AtbGV2ZWwKCSAgIGNvbmZpZ3VyZSBhbHNvIGNvbmZpZ3VyZXMgaW4gRXhhbXBsZXMvR0lGUGxvdC4KCjYvMDcvMjAwMTogbWtvZXBwZQoJICAgTWFkZSB0aGUgTWFrZWZpbGUgd29yayB3aXRoIG5vbi1HTlUgbWFrZSBhZ2Fpbi4KCjYvMDcvMjAwMTogY2hlZXRhaCAod2lsbGlhbSBmdWx0b24pCgkgICBbSmF2YV0gQ2xhc3Mvc3RydWN0IG1lbWJlcnMgdGhhdCBhcmUgYXJyYXlzIG9mIHBvaW50ZXJzIHRvIGNsYXNzZXMvc3RydWN0cyAtCgkgICBTaGFkb3cgY2xhc3MncyBnZXQvc2V0IGFjY2Vzc29ycyBub3cgdXNlIEphdmEgY2xhc3NlcyBpbnN0ZWFkIG9mIGxvbmdzIChwb2ludGVycykuCgkgICBbSmF2YV0gU2hhZG93IGNsYXNzZXMgd2lsbCBub3cgY2xlYW4gdXAgbWVtb3J5IGlmIGZ1bmN0aW9uIHJldHVybiB0eXBlIAoJICAgaXMgYSBjbGFzcy9zdHJ1Y3QuCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIHJlZmVyZW5jZSBiYXNlZCBvbiB0aGUgc2FtZSBleGFtcGxlIGZyb20gb3RoZXIgbW9kdWxlcy4KCjYvMDYvMjAwMTogbWtvZXBwZQoJICAgTmV3IGNvbmZpZ3VyZSBvcHRpb24gLS13aXRoLXJlbGVhc2Utc3VmZml4IGFsbG93cyBmb3IKCSAgIGF0dGFjaGluZyBhIHN1ZmZpeCB0byB0aGUgc3dpZyBiaW5hcnkgYW5kIHRoZSBzd2lnIHJ1bnRpbWUKCSAgIGxpYnJhcmllcy4gIE1pbm9yIGNoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbS4gICJzd2lnCgkgICAtc3dpZ2xpYiIgd29ya3MgYWdhaW4uICBJZiBpbnZva2VkIHdpdGggdGhlIG5ldyBvcHRpb24KCSAgICItbGRmbGFncyIsIFNXSUcgcHJpbnRzIGEgbGluZSBvZiBsaW5rZXIgZmxhZ3MgbmVlZGVkIHRvCgkgICBsaW5rIHdpdGggdGhlIHJ1bnRpbWUgbGlicmFyeSBvZiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UKCSAgIG1vZHVsZS4gCgo2LzA2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gZ3N3aWdfbGlzdF9wIGlzIGFuIGludCwgbm90IGEgU0NNLiAgVGhpcyB0eXBvCgkgICBjYXVzZWQgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gSW4gSU5QVVQgYW5kIEJPVEggdHlwZW1hcHMKCSAgIGdlbmVyYXRlZCBieSB0aGUgU0lNUExFX01BUCBtYWNybywgdXNlIHRoZSBTQ01fVE9fQwoJICAgZnVuY3Rpb24gdG8gY29udmVydCBmcm9tIEd1aWxlIHRvIEMgKHJhdGhlciB0aGFuIENfVE9fU0NNKS4KCSAgIFVzZSBzY21faW50cHJpbnQgdG8gcHJpbnQgcG9pbnRlcnMgKHJhdGhlciB0aGFuCgkgICBzcHJpbnRmKS4gQWxsb3cgdXNpbmcgIi1saW5rYWdlIiBpbnN0ZWFkIG9mICItTGlua2FnZSIuIAoKNi8wNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBNb2RzIGZvciB1c2luZyBpbmhlcml0ZWQgYysrIGNsYXNzZXMgZnJvbSBKYXZhCgkgICBbSmF2YV0gTmV3IGV4YW1wbGUgY2FsbGVkIGNsYXNzIGJhc2VkIG9uIHRoZSBzYW1lIGV4YW1wbGUgZnJvbSBvdGhlciBtb2R1bGVzCgo2LzA1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIGRlc3RydWN0b3IgKF9kZWxldGUoKSkgd2FzIG5vdCBhd2FyZSBvZiAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBub3Qga25vdyBhYm91dCAlbmFtZSByZW5hbWluZwoJICAgW0phdmFdIGV4dGVuZHMgYmFzZWNsYXNzIGRpZCBleHRlbmQgZXZlbiB3aGVuIHRoZSBiYXNlY2xhc3Mgd2FzIG5vdCBrbm93biB0byBzd2lnCgkgICBbSmF2YV0gc29tZXRpbWVzIGVudW0tZGVjbGFyYXRpb25zIG9jY3VycmVkIGJlZm9yZSB0aGUgSmF2YSBjbGFzcyBkZWNsYXJhdGlvbgoJICAgW0phdmFdIHVucmVsYXRlZCBlbnVtIGluaXRpYWxpc2F0aW9ucyBubyBsb25nZXIgYXBwZWFyIGluIEphdmEgY2xhc3MKCSAgIFtKYXZhXSBpZiBtb2R1bGUgZW5kcyBpbiAnXycgY29ycmVjdCBKTkkgbmFtZXMgYXJlIG5vdyBwcm9kdWNlZAoKNi8wNC8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTaGFkb3cgY2xhc3MgbW9kcyAtIE1vZGlmaWVkIGNvbnN0cnVjdG9yIHJlcGxhY2VzCgkgICBuZXdJbnN0YW5jZSgpLiBfZGVsZXRlKCkgbm93IHRocmVhZCBzYWZlLiBnZXRDUHRyKCkgcmVwbGFjZXMKCSAgIF9zZWxmLiBfc2VsZkNsYXNzKCkgcmVtb3ZlZCBhcyBub3cgcmVkdW5kYW50LiAKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZIEZPUiBKQVZBIE1PRFVMRSAqKioKCgkgICBbSmF2YV0gTm90IGFsbCBvdXRwdXQgamF2YSBmaWxlcyBoYWQgU1dJRyBiYW5uZXIuIE5ldyBiYW5uZXIuCgoJICAgW0phdmFdIFNoYWRvdyBjbGFzcyBmaW5hbGl6ZXJzIGFyZSBvdXRwdXQgYnkgZGVmYXVsdDogQ29tbWFuZAoJICAgbGluZSBvcHRpb24gLWZpbmFsaXplIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIHdpdGggLW5vZmluYWxpemUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSBGT1IgSkFWQSBNT0RVTEUgKioqCgo2LyAxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gQ2FzdCBTQ01fQ0FSKCkgdG8gc2NtX2JpdHNfdCBiZWZvcmUgc2hpZnRpbmcgaXQuCgkgICBUaGlzIGlzIHJlcXVpcmVkIGZvciBjb21waWxpbmcgd2l0aCBhIEd1aWxlIGNvbmZpZ3VyZWQgd2l0aAoJICAgc3RyaWN0IEMgdHlwZSBjaGVja2luZy4gIAoKNi8gMS8yMDAxOiBta29lcHBlCgkgICBBZGRlZCBjb25maWd1cmUgb3B0aW9uICItLXdpdGgtc3dpZ2xpYmRpciIuCgo1LzMxLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gU3VwcG9ydCBtdWx0aXBsZSBwYXJhbGxlbCBsaXN0cyBvciB2ZWN0b3JzIGluCgkgICB0aGUgdHlwZW1hcHMgcHJvdmlkZWQgYnkgbGlzdC12ZWN0b3IuaS4gIE5ldyB0eXBlbWFwcyBmaWxlLAoJICAgcG9pbnRlci1pbi1vdXQuaS4gCgo1LzI1LzIwMDE6IGNoZWV0YWggKHdpbGxpYW0gZnVsdG9uKQoJICAgW0phdmFdIEhUTUwgdXBkYXRlIGZvciBleGFtcGxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgTWlub3IgY2hhbmdlcyB0byB0aGUgYnVpbGQgc3lzdGVtLiAgQWRkZWQgc3ViZGlyZWN0b3J5IGZvcgoJICAgRGViaWFuIHBhY2thZ2UgY29udHJvbCBmaWxlcy4KCjUvMjgvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBCdWlsZCBhIHJ1bnRpbWUgbGlicmFyeSwgbGlic3dpZ2d1aWxlLgoKNS8yOC8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIE5ldyB0eXBlbWFwIHN1YnN0aXR1dGlvbiAkKmRlc2NyaXB0b3IuICBVc2UgdGhlIHt9CgkgICBzeW50YXgsIHJhdGhlciB0aGFuIHRoZSAiIiBzeW50YXggZm9yIHRoZSBzdGFuZGFyZAoJICAgdHlwZW1hcHMsIGluIG9yZGVyIHRvIHdvcmsgYXJvdW5kIHN0cmFuZ2UgbWFjcm8tZXhwYW5zaW9uCgkgICBiZWhhdmlvciBvZiB0aGUgU1dJRyBwcmVwcm9jZXNzb3IuICBUaGlzIGludHJvZHVjZXMgc29tZQoJICAgZXh0cmEgYnJhY2VzLgoKNS8yNy8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEhhbmRsZSBwb2ludGVyIHR5cGVzIHdpdGggdHlwZW1hcHMsIHJhdGhlciB0aGFuCgkgICBoYXJkLWNvZGVkLiBOZXcgdHlwZW1hcCBzdWJzdGl0dXRpb25zICRkZXNjcmlwdG9yLAoJICAgJGJhc2VkZXNjcmlwdG9yOyBzZWUgZG9jdW1lbnRhdGlvbi4gU29tZSBjbGVhbi11cCBpbiB0aGUKCSAgIHZhcmlhYmxlL2NvbnN0YW50cyB3cmFwcGVyIGdlbmVyYXRvciBjb2RlLiAgTmV3IGNvbnZlbmllbmNlCgkgICBtYWNybyBTV0lHX0d1aWxlX011c3RHZXRQdHIsIHdoaWNoIGFsbG93cyBnZXR0aW5nIHBvaW50ZXJzCgkgICBmcm9tIHNtb2JzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gIE5ldyB0eXBlbWFwIGZpbGUKCSAgICJsaXN0LXZlY3Rvci5pIiwgcHJvdmlkaW5nIG1hY3JvcyB0aGF0IGRlZmluZSB0eXBlbWFwcyBmb3IKCSAgIGNvbnZlcnRpbmcgYmV0d2VlbiBDIGFycmF5cyBhbmQgU2NoZW1lIGxpc3RzIGFuZCB2ZWN0b3JzLgoKNS8yNS8yMDAxOiBjaGVldGFoICh3aWxsaWFtIGZ1bHRvbikKCSAgIFtKYXZhXSBTVEwgc3RyaW5nIG1vdmVkIGludG8gaXRzIG93biB0eXBlbWFwIGFzIGl0IGlzIGMrKyBjb2RlIGFuZCAKCSAgIGl0IGJyZWFrIGFueSBjIGNvZGUgdXNpbmcgdGhlIHR5cGVtYXBzLmkgZmlsZS4KCSAgIC0gRml4ZXMgZm9yIHdyYXBwZXJzIGFyb3VuZCBnbG9iYWwgdmFyaWFibGVzIC0gYXBwbGllcyB0byBwcmltaXRpdmUgCgkgICB0eXBlcyBhbmQgdXNlciB0eXBlcyAoY2xhc3Mvc3RydWN0KSBhbmQgcG9pbnRlcnMgdG8gdGhlc2UuCgkgICAtIFN0cnVjdHVyZSBtZW1iZXIgdmFyaWFibGVzIGFuZCBjbGFzcyBwdWJsaWMgbWVtYmVyIHZhcmlhYmxlcyBnZXR0ZXJzIAoJICAgYW5kIHNldHRlcnMgcGFzcyBhIHBvaW50ZXIgdG8gdGhlIG1lbWJlciBhcyB3YXMgaW4gMS4zYTMgYW5kIDEuMSAKCSAgICgxLjNhNSB3YXMgcGFzc2luZyBieSB2YWx1ZSkKCSAgIC0gUGFyYW1ldGVycyB0aGF0IHdlcmUgYXJyYXlzIGFuZCByZXR1cm4gdHlwZXMgd2VyZSBpbmNvcnJlY3RseSAKCSAgIGJlaW5nIHBhc3NlZCB0byBjcmVhdGVfZnVuY3Rpb24oKSBhcyBwb2ludGVycy4KCSAgIC0gRml4IGZvciBhcnJheXMgb2YgZW51bXMuIAoJICAgW0phdmFdIFVwZGF0ZWQgamF2YSBleGFtcGxlcyBhbmQgYWRkZWQgdHdvIG1vcmUuCgkgICBbSmF2YV0gSmF2YSBtb2R1bGUgdXBkYXRlZCBmcm9tIFNXSUcxLjNhMyBpbmNsdWRpbmcgY29kZSBjbGVhbnVwIGV0Yy4KCSAgIFtKYXZhXSBlbnVtIHN1cHBvcnQgYWRkZWQuCgkgICBbSmF2YV0gQXJyYXkgc3VwcG9ydCBpbXBsZW1lbnRlZAoJICAgW0phdmFdIFNoYWRvdyBjbGFzc2VzIGltcHJvdmVkIC0gSmF2YSBvYmplY3RzIHVzZWQgcmF0aGVyIHRoYW4gCgkgICBsb25ncyBob2xkaW5nIHRoZSBjIHBvaW50ZXIgdG8gdGhlIHdyYXBwZWQgc3RydWN0dXJlL2MrK2NsYXNzCgo1LzIyLzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgZXh0ZXJuICJDIiBkZWNsYXJhdGlvbnMgaW4gQysrIG1vZGUuIFRoYW5rcwoJICAgdG8gR3JlZyBUcm94ZWwgPGdkdEBpci5iYm4uY29tPi4KCjUvMjEvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOZXcgbGlua2FnZSAibW9kdWxlIiBmb3IgY3JlYXRpbmcgR3VpbGUgbW9kdWxlcyBmb3IKCSAgIEd1aWxlIHZlcnNpb25zID49IDEuNS4wLiAKCjQvMTgvMjAwMTogbWtvZXBwZQoJICAgW016U2NoZW1lXSBBZGRlZCB0eXBlbWFwcyBmb3IgcGFzc2luZyB0aHJvdWdoIFNjaGVtZV9PYmplY3QKCSAgIHBvaW50ZXJzLiAKCjQvOS8yMDAxIDogbWtvZXBwZSAKCSAgIFtNelNjaGVtZV0gQWRkZWQgdHlwZW1hcHMgZm9yIGBib29sJy4gIEluY2x1c2lvbiBvZiBoZWFkZXJzCgkgICBhbmQgc3VwcG9ydCByb3V0aW5lcyBpcyBub3cgZGF0YS1kcml2ZW4gdmlhIG16c2NoZW1lLmkuCgkgICBIZWFkZXJzIGNvbWUgZnJvbSB0aGUgbmV3IGZpbGUgbXpzY2hlbWRlYy5zd2cuICBEb24ndCBhYm9ydAoJICAgaW1tZWRpYXRlbHkgd2hlbiBhIHR5cGUtaGFuZGxpbmcgZXJyb3IgaXMgcmVwb3J0ZWQuICBXaGVuCgkgICBzZWFyY2hpbmcgZm9yIHR5cGVtYXBzIGZvciBlbnVtcywgZmFsbCBiYWNrIHRvIHVzaW5nIGludCwKCSAgIGxpa2UgdGhlIEd1aWxlIGJhY2tlbmQgZG9lcy4gIFN1cHBvcnQgY2hhciBjb25zdGFudHMuICBFbWl0CgkgICBjb3JyZWN0IHdyYXBwZXIgY29kZSBmb3IgdmFyaWFibGVzLgoKMy8xMi8yMDAxOiBta29lcHBlCgkgICBbR3VpbGVdIEZpeGVkIHR5cGVtYXBzIGZvciBjaGFyICoqT1VUUFVULCBjaGFyICoqQk9USC4KCjMvMi8yMDAxIDogbWtvZXBwZSAKCSAgIFtHdWlsZV0gRXZlcnkgd3JhcHBlciBmdW5jdGlvbiBub3cgZ2V0cyBhIGJvb2xlYW4gdmFyaWFibGUKCSAgIGdzd2lnX2xpc3RfcCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciBtdWx0aXBsZSB2YWx1ZXMgYXJlCgkgICBwcmVzZW50LiBUaGUgbWFjcm9zIEdVSUxFX0FQUEVORF9SRVNVTFQsIEdVSUxFX01BWUJFX1ZBTFVFUwoJICAgYW5kIEdVSUxFX01BWUJFX1ZFQ1RPUiB1c2UgdGhpcyB2YXJpYWJsZSwgcmF0aGVyIHRoYW4KCSAgIGNoZWNraW5nIHdoZXRoZXIgdGhlIGN1cnJlbnQgcmV0dXJuIHZhbHVlIGlzIGEgbGlzdC4gVGhpcwoJICAgYWxsb3dzIGZvciB0eXBlbWFwcyByZXR1cm5pbmcgYSBsaXN0IGFzIGEgc2luZ2xlIHZhbHVlIChhCgkgICBsaXN0IHdhcyBlcnJvbmVvdXNseSBjb252ZXJ0ZWQgaW50byBhIHZlY3RvciBvciBhCgkgICBtdWx0aXBsZS12YWx1ZSBvYmplY3QgaW4gdGhpcyBjYXNlKS4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBzdXBwb3J0IGZvciByZXR1cm5pbmcgbXVsdGlwbGUgdmFsdWVzIGFzCgkgICB2ZWN0b3JzLCBvciBwYXNzaW5nIHRoZW0gdG8gYSBtdWxpcGxlLXZhbHVlCgkgICBjb250aW51YXRpb24uIEJ5IGRlZmF1bHQsIG11bHRpcGxlIHZhbHVlcyBzdGlsbCBnZXQKCSAgIHJldHVybmVkIGFzIGEgbGlzdC4KCjMvMS8yMDAxIDogbWtvZXBwZQoJICAgW0d1aWxlXSBBZGRlZCBhICJiZWZvcmVyZXR1cm4iIHByYWdtYS4gVGhlIHZhbHVlIG9mIHRoaXMKCSAgIHByYWdtYSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSBldmVyeSByZXR1cm4gc3RhdGVtZW50LgoKMy8xLzIwMDEgOiBta29lcHBlCgkgICBbR3VpbGVdIEFkZGVkIHN1cHBvcnQgZm9yIEd1aWxlIDEuNC4xIHByb2NlZHVyZQoJICAgZG9jdW1lbnRhdGlvbiBmb3JtYXRzLCBzZWUgaW50ZXJuYWxzLmh0bWwuCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gTWFkZSB0aGUgd3JhcHBlciBjb2RlIGNvbXBpbGUgd2l0aCBDKysgaWYgdGhlCgkgICAiLWMrKyIgY29tbWFuZC1saW5lIHN3aXRjaCBpcyBnaXZlbi4gIFRoYW5rcyB0bwoJICAgPG1vbmtleWlxQGRpbmdvYmx1ZS5uZXQuYXU+LiAKCjIvMjYvMjAwMTogbWtvZXBwZQoJICAgW0d1aWxlXSBOb3cgdHdvIHR5cGUgdGFibGVzLCBzd2lnX3R5cGVzIGFuZAoJICAgc3dpZ190eXBlc19pbml0aWFsLCBhcmUgdXNlZCwgYXMgYWxsIG90aGVyIFNXSUcgbGFuZ3VhZ2UKCSAgIG1vZHVsZXMgZG8uICBUaGlzIHJlbW92ZXMgdGhlIG5lZWQgZm9yIHRoZSB0cmlja3kKCSAgIGNvbnN0cnVjdGlvbiB1c2VkIGJlZm9yZSB0aGF0IHRoZSBicm9rZW4gUmVkaGF0IDcuMCBnY2MKCSAgIGRvZXNuJ3QgcGFyc2UuIFJlcG9ydGVkIGJ5IDxtb25rZXlpcUBkaW5nb2JsdWUubmV0LmF1Pi4gCgoyLzI2LzIwMDE6IG1rb2VwcGUKCSAgIFtHdWlsZV0gRml4ZWQgdHlwZW1hcHMgZm9yIGNoYXIgKk9VVFBVVCwgY2hhciAqQk9USDsgYSBiYWQKCSAgIGZyZWUoKSB3b3VsZCBiZSBlbWl0dGVkLiAgQWRkZWQgdHlwZW1hcCBmb3IgU0NNLgoKClZlcnNpb24gMS4zIEFscGhhIDUgCj09PT09PT09PT09PT09PT09PT0KCjkvMTkvMDAgOiBiZWF6bGV5CiAgICAgICAgICBbUHl0aG9uXSBQeXRob24gbW9kdWxlIGdlbmVyYXRlcyBtb3JlIGVmZmljaWVudCBjb2RlIGZvcgogICAgICAgICAgY3JlYXRpbmcgdGhlIHJldHVybiB2YWx1ZSBvZiBhIHdyYXBwZXIgZnVuY3Rpb24uIE1vZGlmaWNhdGlvbgogICAgICAgICAgc3VnZ2VzdGVkIGJ5IEpvbiBUcmF2aXMuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgTGlicmFyeSBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUgLWwgb3B0aW9uIGFyZSBub3cgaW5jbHVkZWQgYXQgdGhlCiAgICAgICAgICBlbmQgb2YgdGhlIGludGVyZmFjZSBmaWxlIChyZXZlcnRpbmcgdG8gdGhlIG9sZCBiZWhhdmlvcikuCgo5LzE5LzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBwcm9ibGVtcyB3aXRoIGVudW0gaGFuZGxpbmcuICBlbnVtcyBhcmUgbm93IG1hbmlwdWxhdGVkIGFzCiAgICAgICAgICAnaW50JywgYnV0IGNhc3QgaW50byB0aGUgZW51bSB0eXBlIHdoZW4gdmFsdWVzIGFyZSBwYXNzZWQgdG8gdGhlIAogICAgICAgICAgY29ycmVzcG9uZGluZyBDIGZ1bmN0aW9uLgoKOS8xOS8wMCA6IG1rb2VwcGUKCSAgW0d1aWxlXSBSZW1vdmVkICItd2l0aC1zbW9icyIgY29tbWFuZC1saW5lIG9wdGlvbiwgYXMgdGhpcyBpcyB0aGUKCSAgZGVmYXVsdCBub3cuICBBZGRlZCAiLWVtaXQtc2V0dGVycyIgY29tbWFuZC1saW5lIG9wdGlvbiwKCSAgd2hpY2ggdHVybnMgb24gZ2VuZXJhdGluZyBwcm9jZWR1cmVzLXdpdGgtc2V0dGVyczsgc2VlCgkgIGludGVybmFscy5odG1sLgoKOS8xOC8wMCA6IG1rb2VwcGUKCSAgSW5jb3Jwb3JhdGVkIHBhdGNoICMxMDE0MzAsIGZpeGluZyBidWdzIGluIHRoZSBHdWlsZSBtb2R1bGU6IAoJICAxLiBTb21lIGFyZ3VtZW50cyB3ZXJlIGVycm9uZW91c2x5IHRha2VuIGFzICpvcHRpb25hbCogYXJndW1lbnRzIHdoZW4KCSAgICAgaWdub3JlZCBhcmd1bWVudHMgd2VyZSBwcmVzZW50LiAKCSAgMi4gR3VpbGUgMS4zLjQgd2FzIG5vdCBzdXBwb3J0ZWQgc2luY2UgZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gR3VpbGUKCSAgICAgIDEuNCB3ZXJlIHVzZWQuCSAgCgkgIDMuIEFkZGVkIGhhbmRsaW5nIG9mIGBjb25zdCBjaGFyIConLgoKOS8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHByb2JsZW0gd2l0aCBmYWlsZWQgYXNzZXJ0aW9uIGFuZCBsYXJnZSBmaWxlcy4KCjkvMTcvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBwcm9ibGVtIHdpdGggdGhlICclJyBjaGFyYWN0ZXIgYXBwZWFyaW5nIGluIGFkZGVkIG1ldGhvZHMKICAgICAgICAgIGFuZCBmdW5jdGlvbiBib2RpZXMuICBQcmVwcm9jZXNzb3IgYnVnLgoKVmVyc2lvbiAxLjMgQWxwaGEgNCAoU2VwdGVtYmVyIDQsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKOS8zLzAwICA6IHR0bgogICAgICAgICAgQWRkZWQgaW5zdHJ1Y3Rpb25zIGZvciBtYWludGFpbmVycyBpbiBFeGFtcGxlcy9SRUFETUUgb24gaG93CiAgICAgICAgICB0byBtYWtlIGV4YW1wbGVzIGFsc28gYmUgdXNlZnVsIGluIHRoZSB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAgICAgIEFsc28sICJtYWtlIGNoZWNrIiBub3cgdXNlcyAuL0xpYiBieSB2aWEgZW52IHZhciBgU1dJR19MSUInLgogICAgICAgICAgVGhpcyBpcyBvdmVycmlkYWJsZSBsaWtlIHNvOgogICAgICAgICAgICAgbWFrZSBjaGstc3dpZ2xpYj0vbXkvZXhwZXJpbWVudGFsL3N3aWcvTGliIGNoZWNrCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgQWRkZWQgJHR5cGVtYXAgdmFyaWFibGUgdG8gdHlwZW1hcHMuICBUaGlzIGdldHMgcmVwbGFjZWQgd2l0aAogICAgICAgICAgYSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgdHlwZW1hcCB0aGF0IGlzIGFwcGxpZWQuICBGZWF0dXJlCiAgICAgICAgICByZXF1ZXN0IGZyb20gcnNhbHouCgo5LzMvMDAgIDogYmVhemxleQogICAgICAgICAgRXhwZXJpbWVudGFsIG9wdGltaXphdGlvbiB0byBjb2RlIGdlbmVyYXRpb24gZm9yIHZpcnR1YWwKICAgICAgICAgIG1lbWJlciBmdW5jdGlvbnMuICBJZiB5b3UgaGF2ZSB0d28gY2xhc3NlcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgIGNsYXNzIEEoKSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICBjbGFzcyBCKCkgOiBwdWJsaWMgQSB7CiAgICAgICAgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgZm9vKCk7CiAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFN3aWcgbm93IHdpbGwgZ2VuZXJhdGUgYSBzaW5nbGUgd3JhcHBlciBmdW5jdGlvbiBmb3IgdGhpcwoKICAgICAgICAgICAgICAgIEFfZm9vKEEgKmEpIHsKICAgICAgICAgICAgICAgICAgICBhLT5mb28oKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBhbmQgdXNlIGl0IGFzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBib3RoIEFfZm9vKCkgYW5kIEJfZm9vKCkuCiAgICAgICAgICBUaGlzIG9wdGltaXphdGlvbiBvbmx5IHRha2VzIHBsYWNlIGlmIGJvdGggbWV0aG9kcyBhcmUgZGVjbGFyZWQKICAgICAgICAgIGFzIHZpcnR1YWwgYW5kIGJvdGggdGFrZSBpZGVudGljYWwgcGFyYW1ldGVycy4KICAgICAgICAgICoqKiBFWFBFUklNRU5UQUwgRkVBVFVSRSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBSZXN0b3JlZCB0aGUgIm1lbWJlcmluIiB0eXBlbWFwIGZvciBzZXR0aW5nIHN0cnVjdHVyZSBtZW1iZXJzLgogICAgICAgICAgVW5saWtlIHRoZSBvbGQgdmVyc2lvbiwgdGhlIG5ldyB2ZXJzaW9uIGlzIGV4cGFuZGVkIGlubGluZSBpbiB0aGUKICAgICAgICAgIHdyYXBwZXIgZnVuY3Rpb24gYWxsb3dpbmcgYWNjZXNzIHRvIHNjcmlwdGluZyBsYW5ndWFnZQogICAgICAgICAgaW50ZXJuYWxzIChhIHNvbWV0aW1lcyByZXF1ZXN0ZWQgZmVhdHVyZSkuIFRoZSAibWVtYmVyb3V0IiB0eXBlbWFwCiAgICAgICAgICBpcyBnb25lLiBVc2UgdGhlICJvdXQiIHR5cGVtYXBzIGluc3RlYWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMy8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBBdHRyaWJ1dGUgc2V0IG1ldGhvZHMgbm8gbG9uZ2VyIHJldHVybiB0aGUgdmFsdWUgb2YgYSBtZW1iZXIuCiAgICAgICAgICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgIGludCB4OwogICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICB9CgogICAgICAgICAgbm93IGdldHMgc2V0IGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgIHZvaWQgRm9vX3hfc2V0KEZvbyAqZiwgaW50IHgpIHsKICAgICAgICAgICAgICAgICAgICBmLT54ID0geDsKICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gU1dJRzEuMSBpdCB1c2VkIHRvIGJlIHRoaXM6CgogICAgICAgICAgICAgIGludCBGb29feF9zZXQoRm9vICpmLCBpbnQgeCkgewogICAgICAgICAgICAgICAgICAgcmV0dXJuIChmLT54ID0geCk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRoaXMgaGFzIGJlZW4gY2hhbmdlZCBkdWUgdG8gdGhlIGNvbXBsZXhpdHkgY3JlYXRlZCBieSB0cnlpbmcKICAgICAgICAgIHRvIGRvIHRoaXMgd2l0aCBtb3JlIGV4b3RpYyBkYXRhdHlwZXMgc3VjaCBhcyBhcnJheXMuICBJdCBhbHNvCiAgICAgICAgICBjb21wbGljYXRlcyBpbmxpbmluZyBhbmQgaGFuZGxpbmcgb2YgdGhlICJtZW1iZXJpbiIgdHlwZW1hcC4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIHB0cmNhc3QoKSBhbmQgcHRybWFwKCkgZnVuY3Rpb25zIGZyb20gdGhlCiAgICAgICAgICBwb2ludGVyLmkgbGlicmFyeSBmaWxlLiAgT2xkIGltcGxlbWVudGF0aW9uIGlzIGluY29tcGF0aWJsZQogICAgICAgICAgd2l0aCBuZXcgdHlwZSBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjkvMi8wMCAgOiBiZWF6bGV5CiAgICAgICAgICBOZXcgcnVudGltZSBmdW5jdGlvbiBTV0lHX1R5cGVRdWVyeShjb25zdCBjaGFyICpuYW1lKSBhZGRlZC4KICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCB0aGUgdHlwZSBpbmZvIHN0cnVjdHVyZQogICAgICAgICAgdGhhdCBpcyB1c2VkIGZvciB0eXBlLWNoZWNraW5nLiAgSXQgd29ya3Mgd2l0aCBlaXRoZXIgdGhlCiAgICAgICAgICBuaWNlIEMgbmFtZSBvciBtYW5nbGVkIHZlcnNpb24gb2YgYSBkYXRhdHlwZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiaW50ICoiKTsKICAgICAgICAgICAgICBzd2lnX3R5cGVfaW5mbyAqdHkgPSBTd2lnX1R5cGVRdWVyeSgiX3BfaW50Iik7CgogICAgICAgICAgVGhpcyBpcyBhbiBhZHZhbmNlZCBmZWF0dXJlIHRoYXQgaGFzIGJlZW4gYWRkZWQgdG8gc3VwcG9ydCBzb21lCiAgICAgICAgICBleG90aWMgZXh0ZW5zaW9uIG1vZHVsZXMgdGhhdCBuZWVkIHRvIGRpcmVjdGx5IG1hbmlwdWxhdGUKICAgICAgICAgIHNjcmlwdGluZyBsYW5ndWFnZSBvYmplY3RzLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOS8yLzAwICA6IGJlYXpsZXkKICAgICAgICAgIE5ldyBkaXJlY3RpdmUgJXR5cGVzKCkgYWRkZWQuICBUaGlzIGlzIHVzZWQgdG8KICAgICAgICAgIGV4cGxpY2l0bHkgbGlzdCBkYXRhdHlwZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4KICAgICAgICAgIHRoZSBydW50aW1lIHR5cGUtY2hlY2tpbmcgY29kZS4gTm9ybWFsbHkgaXQgaXMgbmV2ZXIKICAgICAgICAgIG5lY2Vzc2FyeSB0byB1c2UgdGhpcyBidXQgc29tZXRpbWVzIGFkdmFuY2VkIGV4dGVuc2lvbnMKICAgICAgICAgIChzdWNoIGFzIHRoZSBwb2ludGVyLmkgbGlicmFyeSkgbWF5IG5lZWQgdG8gbWFudWFsbHkKICAgICAgICAgIGFkZCB0eXBlcyB0byB0aGUgdHlwZS1jaGVja2VyLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8zMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEltcHJvdmVkIGhhbmRsaW5nIG9mIHN0cmluZyBhcnJheSB2YXJpYWJsZXMuIEZvciBleGFtcGxlLAogICAgICAgICAgYSBnbG9iYWwgdmFyaWFibGUgb2YgdGhlIGZvcm0gImNoYXIgbmFtZVs2NF0iIGlzIGF1dG9tYXRpY2FsbHkKICAgICAgICAgIG1hbmFnZWQgYXMgYSA2NCBjaGFyYWN0ZXIgc3RyaW5nLiAgUHJldmlvdXNseSB0aGlzIGRpZG4ndAogICAgICAgICAgd29yayBhdCBhbGwgb3IgcmVxdWlyZWQgdGhlIHVzZSBvZiBhIHNwZWNpYWwgdHlwZW1hcC4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAoVGNsLCBQZXJsLCBQeXRob24pICoqKgoKOC8zMS8wMCA6IHR0bgoJICBBZGRlZCBNYWtlZmlsZSB0YXJnZXQgYGNoZWNrLWMrKy1leGFtcGxlcycsIHdoaWNoIHVzZXMgbmV3CgkgIGZpbGVzIHVuZGVyIEV4YW1wbGVzL0MrKyBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLiAgTm93ICJtYWtlCgkgIGNoZWNrIiBhbHNvIGRvZXMgIm1ha2UgY2hlY2stYysrLWV4YW1wbGVzIi4gIEFsc28sIGV4cGFuZGVkCgkgIGFjdGlvbnMgaW4gYGNoZWNrLWdpZnBsb3QtZXhhbXBsZScgYW5kIGBjaGVjay1hbGl2ZW5lc3MnLgoKOC8zMC8wMCA6IG1rb2VwcGUKCSAgTWFqb3IgY2xlYW4tdXAgaW4gdGhlIEd1aWxlIG1vZHVsZS4gQWRkZWQgdHlwZW1hcC1kcml2ZW4KCSAgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uIENoYW5nZWQgdG8gaGFuZGxlIG1vcmUgdGhhbiAxMAoJICBhcmdzLiBVcGRhdGVkIGFuZCBleHRlbmRlZCBleGFtcGxlcy4KCSAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlaW5zZXJ0IGRpcmVjdGl2ZSB0aGF0IGluc2VydHMgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZQogICAgICAgICAgaW50byBhIHBvcnRpb24gb2YgdGhlIG91dHB1dCB3cmFwcGVyIGZpbGUuICBUaGlzIGlzIG9ubHkgaW50ZW5kZWQKICAgICAgICAgIGZvciB1c2UgYnkgd3JpdGVycyBvZiBsYW5ndWFnZSBtb2R1bGVzLiAgV29ya3MgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICVpbnNlcnQoaGVhZGVycykgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQocnVudGltZSkgICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQod3JhcHBlcnMpICJmaWxlLnN3ZyI7CiAgICAgICAgICAgICAgICVpbnNlcnQoaW5pdCkgICAgICJmaWxlLnN3ZyI7CgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKOC8yOS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIG5ldyAlcnVudGltZSBkaXJlY3RpdmUgd2hpY2ggaW5jbHVkZXMgY29kZSBpbnRvIHRoZSBydW50aW1lCiAgICAgICAgICBwb3J0aW9uIG9mIHRoZSB3cmFwcGVyIGNvZGUuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAlcnVudGltZSAlewogICAgICAgICAgICAgICAgICAgIC4uLiBzb21lIGludGVybmFsIHJ1bnRpbWUgY29kZSAuLi4KICAgICAgICAgICAgICAlfQoKICAgICAgICAgIFRoZXJlIGlzIG5vIHByYWN0aWNhbCByZWFzb24gZm9yIG9yZGluYXJ5IHVzZXJzIHRvIHVzZSB0aGlzCiAgICAgICAgICBmZWF0dXJlIChhbG1vc3QgZXZlcnl0aGluZyBjYW4gYmUgZG9uZSB1c2luZyAleyAuLi4gJX0KICAgICAgICAgIGluc3RlYWQpLiAgIEhvd2V2ZXIsIHdyaXRlcnMgb2YgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkgd2FudCB0bwogICAgICAgICAgdXNlIHRoaXMgaW4gbGFuZ3VhZ2UgY29uZmlndXJhdGlvbiBmaWxlcy4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjgvMjgvMDAgOiBiZWF6bGV5CiAgICAgICAgICBUeXBlbWFwcyBjYW4gbm93IGJlIHNwZWNpZmllZCB1c2luZyBzdHJpbmcgbGl0ZXJhbHMgbGlrZQogICAgICAgICAgdGhpczoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCAiJHRhcmdldCA9IFN2SVYoJHNvdXJjZSk7IjsKCiAgICAgICAgICBXaGVuIGNvZGUgaXMgc3BlY2lmaWVkIGxpa2UgdGhpcywgaXQgaXMgKk5PVCogZW5jbG9zZWQKICAgICAgICAgIGluc2lkZSBhIGxvY2FsIHNjb3BlIChhcyB3aXRoIG9sZGVyIHR5cGVtYXAgZGVjbGFyYXRpb25zKS4KICAgICAgICAgIE5vdGU6IGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzIGFyZSBpbnRlcnByZXRlZCBpbiB0aGUKICAgICAgICAgIGNvZGUgc3RyaW5nIHNvIGlmIHlvdSB3YW50IHRvIGluY2x1ZGUgYSBxdW90ZSBvciBzb21lCiAgICAgICAgICBvdGhlciBzcGVjaWFsIGNoYXJhY3RlciwgbWFrZSBzdXJlIHlvdSB1c2UgYSAoXCkuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo4LzI3LzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGZvbGxvdyB0eXBlZGVmIGRlY2xhcmF0aW9ucy4KICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSB0aGlzOgoKICAgICAgICAgICAgICB0eXBlZGVmIGludCBOdW1iZXI7CgogICAgICAgICAgICAgICV0eXBlbWFwKGluKSBpbnQgewogICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBpbnRlZ2VyIC4uLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgdm9pZCBmb28oTnVtYmVyIGEpOwoKICAgICAgICAgIFRoZSB0eXBlbWFwIGZvciAnaW50JyB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGFyZ3VtZW50ICdOdW1iZXIgYScuCiAgICAgICAgICBPZiBjb3Vyc2UsIGlmIHlvdSBzcGVjaWZ5IGEgdHlwZW1hcCBmb3IgJ051bWJlcicgaXQgd2lsbCB0YWtlCiAgICAgICAgICBwcmVjZWRlbmNlIChub3Igd2lsbCBpdCBldmVyIGJlIGFwcGxpZWQgdG8gYW4gJ2ludCcpLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo4LzI3LzAwIDogYmVhemxleQogICAgICAgICAgRGVmYXVsdCB0eXBlbWFwIHNwZWNpZmljYXRpb24gaGFzIGNoYW5nZWQuICAgSW4gb2xkZXIKICAgICAgICAgIHZlcnNpb25zIG9mIHN3aWcsIHlvdSBjb3VsZCBkbyB0aGlzOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGludCBTV0lHX0RFRkFVTFRfVFlQRSB7CiAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgaGFuZGxpbmcgb2YgYSBkYXRhdHlwZS4gICBOb3cgdGhhdAogICAgICAgICAgU1dJRyBmb2xsb3dzIHR5cGVkZWYgZGVjbGFyYXRpb25zLCB0aGlzIGlzIHVubmVjZXNzYXJ5LgogICAgICAgICAgU2ltcGx5IHNwZWNpZnlpbmcgYSB0eXBlbWFwIGZvciAnaW50JyB3aWxsIHdvcmsgZm9yIGFsbAogICAgICAgICAgdmFyaWF0aW9ucyBvZiBpbnRlZ2VycyB0aGF0IGFyZSB0eXBlZGVmJ2QgdG8gJ2ludCcuCgogICAgICAgICAgQ2F2ZWF0LCBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBwb2ludGVycywKICAgICAgICAgIHJlZmVyZW5jZXMsIGFycmF5cywgYW5kIHVzZXIgZGVmaW5lZCB0eXBlcyBpcyBhIGxpdHRsZQogICAgICAgICAgZGlmZmVyZW50LiAgVGhpcyBtdXN0IGJlIGRvbmUgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1BPSU5URVIgKiB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSBwb2ludGVyIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICV0eXBlbWFwKCkgU1dJR1JFRkVSRU5DRSAmIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBhIHJlZmVyZW5jZSAuLi4KICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAldHlwZW1hcCgpIFNXSUdBUlJBWSBbXSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYW4gYXJyYXkgLi4uCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgJXR5cGVtYXAoKSBTV0lHVFlQRSB7CiAgICAgICAgICAgICAgICAgICAgICAuLi4gYSB1c2VyLWRlZmluZWQgdHlwZSAoYnkgdmFsdWUpIC4uLgogICAgICAgICAgICAgICB9CiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMTUvMDAgOiBkdXN0aW4KICAgICAgICAgIFRoZSBmaWxlIHN3aWctMS4zYTEtMS5zcGVjIGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBUb29scyBkaXJlY3RvcnkuCiAgICAgICAgICBJdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhIHJlZGhhdCBwYWNrYWdlIGZvciBTV0lHLCBhbHRob3VnaCBpdAogICAgICAgICAgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgZm9yIHRoZSBuZXh0IHB1YmxpYyByZWxlYXNlLgoKOC8xNS8wMCA6IGJlYXpsZXkKICAgICAgICAgIFR5cGVtYXBzIGhhdmUgYmVlbiBjb21wbGV0ZWx5IHJld3JpdHRlbi4gIEV2ZW50dWFsbHkgdGhleSBtYXkgYmUKICAgICAgICAgIHJlcGxhY2VkIHdpdGggc29tZXRoaW5nIGJldHRlciwgYnV0IGZvciBub3cgdGhleSBzdGF5LiAgSG93ZXZlciwKICAgICAgICAgIHRoZXJlIGFyZSBhIG51bWJlciBvZiBhIHNpZ25pZmljYW50IGNoYW5nZXMgdGhhdCBtYXkgdHJpcCBzb21lCiAgICAgICAgICBwZW9wbGUgdXA6CgogICAgICAgICAgMS4gIFR5cGVtYXAgc2NvcGluZyBpcyBjdXJyZW50bHkgYnJva2VuLiAgQmVjYXVzZSBvZiB0aGlzLCB0aGUKICAgICAgICAgICAgICBmb2xsb3dpbmcgY29kZSB3b24ndCB3b3JrLgoKICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAqIHsKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjbGFzcyBGb28gewogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICBpbnQgYmFyKGJsYWggKngpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAldHlwZW1hcChpbikgYmxhaCAqOyAgIC8qIENsZWFyIHR5cGVtYXAgKi8KCiAgICAgICAgICAgICAgKHRoaXMgYnJlYWtzIGJlY2F1c2UgdGhlIGNvZGUgZm9yIHRoZSBjbGFzcyBGb28gaXMgYWN0dWFsbHkKICAgICAgICAgICAgICBnZW5lcmF0ZWQgYWZ0ZXIgdGhlIGVudGlyZSBpbnRlcmZhY2UgZmlsZSBoYXMgYmVlbiBwcm9jZXNzZWQpLgogICAgICAgICAgICAgIFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBidWcuCgogICAgICAgICAgMi4gIEluIFNXSUcxLjEsIHRoZSAlYXBwbHkgZGlyZWN0aXZlIHdvcmtlZCBieSBwZXJmb3JtaW5nIGEKICAgICAgICAgICAgICB2ZXJ5IGNvbXBsZXggdHlwZS1hbGlhc2luZyBwcm9jZWR1cmUuICBGcm9tIHRoaXMgcG9pbnQgb24sCiAgICAgICAgICAgICAgJWFwcGx5IGlzIHNpbXBseSBhIGdlbmVyYWxpemVkIHR5cGVtYXAgY29weSBvcGVyYXRpb24uCiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsCgogICAgICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKngsIGRvdWJsZSAqeSB9OwoKICAgICAgICAgICAgICBDb3BpZXMgKkFMTCogY3VycmVudGx5IGRlZmluZWQgdHlwZW1hcHMgZm9yICdkb3VibGUgKk9VVFBVVCcgYW5kCiAgICAgICAgICAgICAgY29waWVzIHRoZW0gdG8gJ2RvdWJsZSAqeCcgYW5kICdkb3VibGUgKnknLgoKICAgICAgICAgICAgICBNb3N0IHBlb3BsZSBwcm9iYWJseSB3b24ndCBldmVuIG5vdGljZSB0aGlzIGNoYW5nZSBpbgogICAgICAgICAgICAgICVhcHBseS4gIEhvd2V2ZXIsIHdoZXJlIGl0IHdpbGwgYnJlYWsgdGhpbmdzIGlzIGluIGNvZGUgbGlrZQogICAgICAgICAgICAgIHRoaXM6CgogICAgICAgICAgICAgICAgICAlYXBwbHkgZG91YmxlICpPVVRQVVQgeyBkb3VibGUgKnggfTsKICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqT1VUUFVUIHsKICAgICAgICAgICAgICAgICAgICAgICAuLi4gd2hhdGV2ZXIgLi4uCiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgIHZvaWQgZm9vKGRvdWJsZSAqeCk7CgogICAgICAgICAgICAgIEluIFNXSUcxLjEsIHlvdSB3aWxsIGZpbmQgdGhhdCAnZm9vJyB1c2VzIHRoZSAnZG91YmxlICpPVVRQVVQnIHJ1bGUKICAgICAgICAgICAgICBldmVuIHRob3VnaCBpdCB3YXMgZGVmaW5lZCBhZnRlciB0aGUgJWFwcGx5IGRpcmVjdGl2ZSAodGhpcyBpcwogICAgICAgICAgICAgIHRoZSB3ZWlyZCBhbGlhc2luZyBzY2hlbWUgYXQgd29yaykuICBJbiBTV0lHMS4zIGFuZCBsYXRlciwKICAgICAgICAgICAgICB0aGUgJ2RvdWJsZSAqT1VUUFVUJyBydWxlIGlzIGlnbm9yZWQgYmVjYXVzZSBpdCBpcyBkZWZpbmVkCiAgICAgICAgICAgICAgYWZ0ZXIgdGhlICVhcHBseSBkaXJlY3RpdmUuCgogICAgICAgICAgMy4gIFRoZSAlY2xlYXIgZGlyZWN0aXZlIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGVyYXNlIGFsbCBjdXJyZW50bHkKICAgICAgICAgICAgICBkZWZpbmVkIHR5cGVtYXBzIGZvciBhIHBhcnRpY3VsYXIgdHlwZS4gIFRoaXMgZGlmZmVycyBmcm9tCiAgICAgICAgICAgICAgU1dJRzEuMSB3aGVyZSAlY2xlYXIgb25seSByZW1vdmVkIHJ1bGVzIHRoYXQgd2VyZSBhZGRlZCB1c2luZwogICAgICAgICAgICAgIHRoZSAlYXBwbHkgZGlyZWN0aXZlLgoKICAgICAgICAgIDQuICBUeXBlbWFwIG1hdGNoaW5nIGlzIG5vdyBwZXJmb3JtZWQgdXNpbmcgKmV4YWN0KiB0eXBlcy4KICAgICAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgdGhpbmdzIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBjaGFyICogeyB9CiAgICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgY29uc3QgY2hhciAqIHsgfQoKICAgICAgICAgICAgICBhcmUgZGlmZmVyZW50IHR5cGVtYXBzLiAgICBBIHNpbWlsYXIgcnVsZSBhcHBsaWVzIGZvciBwb2ludGVycywKICAgICAgICAgICAgICBhcnJheXMsIGFuZCByZWZlcmVuY2VzLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqIHsgfQoKICAgICAgICAgICAgICB1c2VkIHRvIGFwcGx5IHRvICdkb3VibGUgJicsICdkb3VibGUgW10nLCAgTm93LCBpdCBvbmx5IGFwcGxpZXMKICAgICAgICAgICAgICB0byAnZG91YmxlIConLiAgSWYgeW91IHdhbnQgYSAnZG91YmxlICYnLCB5b3UnbGwgbmVlZCB0byBoYW5kbGUKICAgICAgICAgICAgICB0aGF0IHNlcGFyYXRlbHkuCgogICAgICAgICAgNS4gIEFycmF5IG1hdGNoaW5nIGhhcyBiZWVuIHNpbXBsZmllZC4gIEluIFNXSUcxLjEsIGFycmF5IG1hdGNoaW5nCiAgICAgICAgICAgICAgd2FzIHBlcmZvcm1lZCBieSB0cnlpbmcgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgZGltZW5zaW9ucy4KICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgJ2RvdWJsZSBhWzEwXVsyMF0nIHdhcyBtYXRjaGVkIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAgICAgICAgZG91YmxlIFsxMF1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bMjBdCiAgICAgICAgICAgICAgICAgICBkb3VibGUgWzEwXVtBTlldCiAgICAgICAgICAgICAgICAgICBkb3VibGUgW0FOWV1bQU5ZXQoKICAgICAgICAgICAgICBJbiBTV0lHMS4zLCBvbmx5IHRoZSBmb2xsb3dpbmcgbWF0Y2hlcyBhcmUgYXR0ZW1wdGVkOgoKICAgICAgICAgICAgICAgICAgIGRvdWJsZSBbMTBdWzIwXQogICAgICAgICAgICAgICAgICAgZG91YmxlIFtBTlldW0FOWV0KCiAgICAgICAgICBPbiB0aGUgcG9zaXRpdmUgc2lkZSwgdHlwZW1hcCBtYXRjaGluZyBpcyBub3cgKnNpZ25pZmljYW50bHkqIGZhc3RlcgogICAgICAgICAgdGhhbiBiZWZvcmUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjgvMTUvMDAgOiBiZWF6bGV5CiAgICAgICAgICBTZWNyZXQgZGV2ZWxvcGVyIGZlYXR1cmUuICBTaW5jZSBkYXRhdHlwZXMgYXJlIG5vdyByZXByZXNlbnRlZCBhcyAKICAgICAgICAgIHN0cmluZ3MgaW50ZXJuYWxseSwgeW91IGNhbiBieXBhc3MgbGltaXRhdGlvbnMgb2YgdGhlIHBhcnNlciBhbmQKICAgICAgICAgIGNyZWF0ZSBhIHdpbGQgZGF0YXR5cGUgYnkgc2ltcGx5IGVuY2xvc2luZyB0aGUgcmF3IHN0cmluZyBlbmNvZGluZwogICAgICAgICAgaW4gYmFja3RpY2tzIChgYCkgYW5kIHN0aWNraW5nIGl0IGluIHRoZSBpbnRlcmZhY2UgZmlsZSBhbnl3aGVyZSBhCiAgICAgICAgICB0eXBlIGlzIGV4cGVjdGVkLiAgRm9yIGV4YW1wbGUsIGBhKDIwKS5hKDEwKS5wLmYoaW50LGludClgLiAgVGhpcyAKICAgICAgICAgIGZlYXR1cmUgaXMgb25seSBpbnRlbmRlZCBmb3IgdGVzdGluZyAoaS5lLiwgeW91IHdhbnQgdG8gc2VlIHdoYXQKICAgICAgICAgIGhhcHBlbnMgdG8geW91ciBsYW5ndWFnZSBtb2R1bGUgaWYgaXQgZ2V0cyBhIHJlZmVyZW5jZSB0byBhIHBvaW50ZXIKICAgICAgICAgIHRvIGFuIGFycmF5IG9mIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBvciBzb21ldGhpbmcpLiAKICAgICAgICAgICoqKiBTSUNLIEhBQ0sgKioqCgo4LzE0LzAwIDogYmVhemxleQogICAgICAgICAgQ29tcGxldGVseSBuZXcgdHlwZS1zeXN0ZW0gYWRkZWQgdG8gdGhlIGltcGxlbWVudGF0aW9uLgogICAgICAgICAgTW9yZSBkZXRhaWxzIGxhdGVyLgoKOC8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIENsZWFuZWQgdXAgc29tZSBvZiB0aGUgSS9PIGhhbmRsaW5nLiAgU1dJRyBubyBsb25nZXIgZ2VuZXJhdGVzCiAgICAgICAgICBhbnkgdGVtcG9yYXJ5IGZpbGVzIHN1Y2ggYXMgX3dyYXAud3JhcCwgX3dyYXAuaWksIF93cmFwLmluaXQuCiAgICAgICAgICBJbnN0ZWFkLCB0aGVzZSAiZmlsZXMiIGFyZSBrZXB0IGFyb3VuZCBpbiBtZW1vcnkgYXMgc3RyaW5ncwogICAgICAgICAgKGFsdGhvdWdoIHRoaXMgaXMgdHJhbnNwYXJlbnQgdG8gbGFuZ3VhZ2UgbW9kdWxlcykuCgo4LzQvMDAgIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCAiY2hlY2siIGFuZCB2YXJpYW50cy4KCSAgVGhpcyBjYW4gYmUgdXNlZCBsaWtlICJtYWtlIGNoZWNrIiBvciwgdG8gZXhwbGljaXRseSBza2lwIGEKCSAgbGFuZ3VhZ2UgTEFORzogIm1ha2Ugc2tpcC1MQU5HPXRydWUgY2hlY2siLiAgTEFORyBpcyBza2lwcGVkCgkgIGF1dG9tYXRpY2FsbHkgaWYgLi9jb25maWd1cmUgZGV0ZXJtaW5lcyB0aGF0IExBTkcgc3VwcG9ydCBpcwoJICBpbnN1ZmZpY2llbnQuCgoJICBDdXJyZW50bHksIHRoZSBjaGVjayBpcyBsaW1pdGVkIHRvIGRvaW5nIHRoZSBlcXVpdmFsZW50IG9mCgkgICJtYWtlIGFsbCIgaW4gc29tZSBvZiB0aGUgRXhhbXBsZXMgZGlyZWN0b3JpZXMuICBUaGlzIHNob3VsZAoJICBiZSBleHBhbmRlZCBib3RoIGhvcml6b250YWxseSAoZGlmZmVyZW50IHR5cGVzIG9mIHRlc3RzKSBhbmQKCSAgdmVydGljYWxseSAoYWZ0ZXIgIm1ha2UgYWxsIiBpbiBhbiBFeGFtcGxlcyBzdWJkaXIgc3VjY2VlZHMsCgkgIGRvIHNvbWUgYWRkaXRpb25hbCB0ZXN0cyB3aXRoIHRoZSByZXN1bHRpbmcgaW50ZXJwcmV0ZXIsIGV0YykuCgo4LzQvMDAgIDogdHRuCgkgIEFkZGVkIE1ha2VmaWxlIHRhcmdldCAiZGlzdGNsZWFuIiwgd2hpY2ggZGVsZXRlcyBhbGwgdGhlCgkgIGZpbGVzIC4vY29uZmlndXJlIGNyZWF0ZXMsIGluY2x1ZGluZyBjb25maWcuc3RhdHVzIGFuZCBmcmllbmRzLgoKOC8zLzAwICA6IGhhcmNvaAoJICBqYXZhIGNoYW5nZXM/Pz8gW3RvZG86IGRvY3VtZW50IGNoYW5nZXNdCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVHlwZW1hcHMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGtleSBvZmYgb2YgdGhlIHJlYWwgZGF0YXR5cGVzCiAgICAgICAgICB1c2VkIGluIHRoZSBpbnRlcmZhY2UgZmlsZS4gIFRoaXMgbWVhbnMgdGhhdCB0eXBlbWFwcyBmb3IKICAgICAgICAgICJjb25zdCBjaGFyICoiIGFuZCAiY2hhciAqIiB3aWxsIGJlIGRpZmZlcmVuY2UgYXMgd2lsbCB0eXBlbWFwcwogICAgICAgICAgZm9yICJWZWN0b3IiIGFuZCAiVmVjdG9yICouIgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBUaGlzIGlzIGxpa2VseSB0byBicmVhayBpbnRlcmZhY2VzIHRoYXQgcmVseSBvbiB0aGUgb2RkIHR5cGUKICAgICAgICAgIGhhbmRsaW5nIGJlaGF2aW9yIG9mIHR5cGVtYXBzIGluIFNXSUcxLjEtLWVzcGVjaWFsbHkgd2l0aAogICAgICAgICAgcmVzcGVjdCB0byBpbnRlcmZhY2VzIGludm9sdmluZyBwYXNzLWJ5LXZhbHVlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIE5ldyAlY29uc3RhbnQgZGlyZWN0aXZlLiAgVGhpcyBkaXJlY3RpdmUgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIGNyZWF0ZSB0cnVlIGNvbnN0YW50cyBpbiB0aGUgdGFyZ2V0IHNjcmlwdGluZyBsYW5ndWFnZS4KICAgICAgICAgIEl0J3MgbW9zdCBzaW1wbGUgZm9ybSBpcyBzb21ldGhpbmcgbGlrZSB0aGlzOgoKICAgICAgICAgICAgICVjb25zdGFudCBGT08gNDI7CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdHlwZSBpcyBpbmZlcnJlZCBmcm9tIHRoZSBzeW50YXggb2YgdGhlCiAgICAgICAgICB2YWx1ZSAoaW4gcmVhbGl0eSwgYWxsICNkZWZpbmUgbWFjcm9zIGFyZSB0cmFuc2xhdGVkIGludG8KICAgICAgICAgIGRpcmVjdGl2ZXMgb2YgdGhpcyBmb3JtKS4KCiAgICAgICAgICBBbiBleHBhbmRlZCB2ZXJzaW9uIGlzIGFzIGZvbGxvd3M6CgogICAgICAgICAgICAlY29uc3RhbnQoRm9vICopIEZPTyA9ICZGb29PYmo7CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCBhbiBleHBsaWNpdCB0eXBlIGNhbiBiZSBzcGVjaWZpZWQuICBUaGlzCiAgICAgICAgICBsYXR0ZXIgZm9ybSBtYXkgYmUgdXNlZnVsIGZvciBjcmVhdGluZyBjb25zdGFudHMgdGhhdAogICAgICAgICAgdXNlZCB0byBiZSBzcGVjaWZpZWQgYXMKCiAgICAgICAgICAgICBjb25zdCBGb28gKkZPTyA9ICZGb29PYmo7CgogICAgICAgICAgKHdoaWNoIGFyZSBub3cgdHJlYXRlZCBhcyB2YXJpYWJsZXMpLgogICAgICAgICAgKioqIEVYUEVSSU1FTlRBTCBGRUFUVVJFICoqKiBUaGUgc3ludGF4IG1heSBjaGFuZ2UgaW4KICAgICAgICAgIHRoZSBmaW5hbCByZWxlYXNlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIE1vZGlmaWVkIHRoZSBwYXJzZXIgc28gdGhhdCB2YXJpYWJsZSBkZWNsYXJhdGlvbnMgb2YgdGhlIGZvcm0KICAgICAgICAgICJjb25zdCB0eXBlICphIiBhcmUgaGFuZGxlZCBhcyB2YXJpYWJsZXMsIG5vdCBjb25zdGFudHMuCiAgICAgICAgICBOb3RlOiBTV0lHMS4xIGhhbmRsZWQgdGhpcyBjYXNlIGVycm9uZW91c2x5IGJlY2F1c2UKICAgICAgICAgIGNvbnN0IGNoYXIgKmEgaXMgYSBwb2ludGVyIHZhcmlhYmxlIHRoYXQgY2FuIGJlIHJlYXNzaWduZWQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIE5vdGU6IGp1c3QgYmVjYXVzZSB0aGlzIGlzIHRoZSAicmlnaHQiIHdheSB0byBkbyB0aGluZ3MsCiAgICAgICAgICBkb2Vzbid0IG1lYW4gaXQncyB0aGUgbW9zdCBhcHByb3ByaWF0ZSBpbnRlcnByZXRhdGlvbi4KICAgICAgICAgIEkgc3VzcGVjdCB0aGF0IG1hbnkgQyBwcm9ncmFtbWVycyBtaWdodCB1c2UgJ2NvbnN0IGNoYXIgKicKICAgICAgICAgIHdpdGggdGhlIGludGVudCBvZiBjcmVhdGluZyBhIGNvbnN0YW50LCB3aXRob3V0IHJlYWxpemluZwogICAgICAgICAgdGhhdCB0aGV5J3ZlIGNyZWF0ZWQgYSByZWFzc2lnbmFibGUgZ2xvYmFsIHZhcmlhYmxlLgoKNy8yMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIFRoZSBDL0MrKyB3cmFwcGluZyBsYXllciBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlZGVzaWduZWQgYW5kCiAgICAgICAgICByZWltcGxlbWVudGVkLiAgVGhpcyBjaGFuZ2Ugc2hvdWxkIGlyb24gb3V0IGEgZmV3IHJvdWdoCiAgICAgICAgICBzcG90cyB3aXRoIHRoZSBoYW5kbGluZyBvZiBkYXRhdHlwZXMuICBJbiBhZGRpdGlvbiwgdGhlCiAgICAgICAgICB3cmFwcGVyIGNvZGUgaXMgc29tZXdoYXQgY2xlYW5lci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgogICAgICAgICAgVGhpcyBjaGFuZ2UgbWF5IGJyZWFrIGludGVyZmFjZXMgdGhhdCBpbnZvbHZlCiAgICAgICAgICBzdWJ0bGUgY29ybmVyLWNhc2VzIHdpdGggdHlwZW1hcHMgYW5kIHRoZSAlYWRkbWV0aG9kcwogICAgICAgICAgZGlyZWN0aXZlIHNpbmNlIHNvbWUgb2YgdGhlc2UgZmVhdHVyZXMgaGFkIHNvbWV3aGF0CiAgICAgICAgICB0eXBlIGhhbmRsaW5nIGJlaGF2aW9yIGluIFNXSUcxLjEuCgo3LzIzLzAwIDogYmVhemxleQogICAgICAgICAgVGhlICJtZW1iZXJpbiIgYW5kICJtZW1iZXJvdXQiIHR5cGVtYXBzIGFyZSBnb25lIGZvciB0aGUKICAgICAgICAgIG1vbWVudCwgYnV0IHRoZXkgbWlnaHQgcmV0dXJuIGFzIHNvb24gYXMgSSBmaWd1cmUgb3V0CiAgICAgICAgICBob3cgdG8gaW50ZWdyYXRlIHRoZW0gd2l0aCBzb21lIG9mIHRoZSBzdHJlYW1saW5lZCBDIHdyYXBwZXIKICAgICAgICAgIGZ1bmN0aW9ucy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBvbGQgdHlwZSBoYW5kbGluZyBmdW5jdGlvbnMgc3VjaCBhcyBwcmludF90eXBlKCksCiAgICAgICAgICBwcmludF9mdWxsKCksIHByaW50X21hbmdsZSgpLCBldGMuLi4gYXJlIGdvbmUgYW5kIGhhdmUgYmVlbgogICAgICAgICAgcmVwbGFjZWQgd2l0aCBhIHNtYWxsZXIgc2V0IG9mIGZ1bmN0aW9ucy4gIFNlZSB0aGUgZmlsZQogICAgICAgICAgRG9jL2ludGVybmFscy5odG1sIGZvciBkZXRhaWxzLiAgVGhpcyB3aWxsIGJyZWFrIGFsbCB0aGlyZAogICAgICAgICAgcGFydHkgbGFuZ3VhZ2UgbW9kdWxlcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8yMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlcHJlY2F0ZWQgdGhlICV2YWwgYW5kICVvdXQgZGlyZWN0aXZlcy4gIFRoZXNlIGRpcmVjdGl2ZXMKICAgICAgICAgIHNob3VsZG4ndCByZWFsbHkgYmUgbmVjZXNzYXJ5IHNpbmNlIHR5cGVtYXBzIGNhbiBiZSB1c2VkCiAgICAgICAgICB0byBhY2hpZXZlIHNpbWlsYXIgcmVzdWx0cy4gICBUaGlzIGFsc28gY2xlYW5zIHVwIHRoZQogICAgICAgICAgaGFuZGxpbmcgb2YgdHlwZXMgYW5kIHBhcmFtZXRlcnMgcXVpdGUgYSBiaXQuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjcvMjAvMDAgOiB0dG4KCSAgRml4ZWQgdW5zcGVjaWZpZWQtbW9kdWxlIGJ1ZyBpbiBHdWlsZSBzdXBwb3J0IGFuZCByZW1vdmVkCgkgIG1vcmUgbm9uLSJ3aXRoLXNtb2JzIiBmdW5jdGlvbmFsaXR5IHVzaW5nIHBhdGNoZXMgc3VibWl0dGVkCgkgIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCgkgIFJlLWVuYWJsZSByZWNvZ25pdGlvbiBvZiAiLXdpdGgtc21vYnMiICh3aXRoIG5vIGVmZmVjdCBzaW5jZQoJICB3ZSB1c2Ugc21vYnMgYnkgZGVmYXVsdCBub3cpIGZvciB0aGUgdGltZSBiZWluZy4gIEFmdGVyIHRoZQoJICAxLjNhNCByZWxlYXNlLCB0aGlzIG9wdGlvbiB3aWxsIHNpZ25hbCBhbiBlcnJvci4KCjcvMTcvMDAgOiB0dG4KCSAgRml4ZWQgTlVMTC1pbnB1dCBidWcgaW4gcGFyYW1ldGVyIGxpc3QgaGFuZGxpbmcuCgkgIFJlcG9ydGVkIGJ5IE1hdHRoaWFzIEtvZXBwZS4KCjcvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBtZW1vcnkgbGVhayBpbiBQeXRob24gdHlwZS1jaGVja2luZyBjb2RlLiBSZXBvcnRlZCBieQogICAgICAgICAgS2VpdGggRGF2aWRzb24uICBCdWcgIzEwOTM3OS4KCjcvMTAvMDAgOiBiZWF6bGV5CiAgICAgICAgICBDaGFuZ2VkIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyByZWxhdGVkIHRvIGZ1bmN0aW9uIHBhcmFtZXRlcnMuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgc29tZSBidWdzIHJlbGF0ZWQgdG8gdGhlIGhhbmRsaW5nIG9mIHRoZSAlbmFtZSgpIGRpcmVjdGl2ZQogICAgICAgICAgYW5kIGNsYXNzZXMgaW4gdGhlIFRjbCBtb2R1bGUuIFByb2JsZW0gcmVwb3J0ZWQgYnkgSmFtZXMgQmFpbGV5LgoKNy8xMC8wMCA6IGJlYXpsZXkKICAgICAgICAgIEZpeGVkIHBhcnNpbmcgYW5kIGVudW0gaGFuZGxpbmcgcHJvYmxlbXMgd2l0aCBjaGFyYWN0ZXIgY29uc3RhbnRzLgogICAgICAgICAgUmVwb3J0ZWQgYnkgR3JlZyBLb2NoYW5za2kuCgo3LzEwLzAwIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCBXcmFwcGVyRnVuY3Rpb24gY2xhc3MgZnJvbSB0aGUgY29yZSBhbmQgdXBkYXRlZCB0aGUgbGFuZ3VhZ2UKICAgICAgICAgIG1vZHVsZS4gIFRoaXMgd2lsbCBicmVhayB0aGlyZCBwYXJ0eSBtb2R1bGVzLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzkvMDAgIDogYmVhemxleQogICAgICAgICAgSW1wbGVtZW50YXRpb24gb2YgU1dJRyBubyBsb25nZXIgbWFrZXMgdXNlIG9mIEMrKyBvcGVyYXRvciBvdmVybG9hZGluZy4KICAgICAgICAgIFRoaXMgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJyZWFrICphbGwqIHRoaXJkIHBhcnR5IGxhbmd1YWdlIG1vZHVsZXMKICAgICAgICAgIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIHRoZSBtYWluIFNXSUcgQ1ZTIHRyZWUuIFNvcnJ5LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo3LzgvMDAgIDogYmVhemxleQogICAgICAgICAgUmVtb3ZlZCB0aGUgZXhwZXJpbWVudGFsIGFuZCB1bmRvY3VtZW50ZWQgImJ1aWxkIiB0eXBlbWFwIHRoYXQKICAgICAgICAgIHdhcyBpbnRlbmRlZCB0byB3b3JrIHdpdGggbXVsdGlwbGUgYXJndW1lbnRzLiBTaW1wbHkgdG9vIHdlaXJkCiAgICAgICAgICB0byBrZWVwIGFyb3VuZC4gIEJlc2lkZXMsIGEgYmV0dGVyIHJlcGxhY2VtZW50IGlzIGluIHRoZSB3b3Jrcy4KCjcvNi8wMCAgOiB0dG4KICAgICAgICAgIFJlbW92ZWQgbm9uLSJ3aXRoLXNtb2JzIiBmdW5jdGlvbmFsaXR5IChHdWlsZSBzdXBwb3J0KSwgaS5lLiwKICAgICAgICAgICItd2l0aC1zbW9icyIgaXMgbm93IHRoZSBkZWZhdWx0IGFuZCBubyBsb25nZXIgbmVlZHMgdG8gYmUKCSAgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kLWxpbmUuCgo3LzUvMDAgIDogdHRuCiAgICAgICAgICBJbmNvcnBvcmF0ZWQgUnVieSBzdXBwb3J0IGNvbnRyaWJ1dGVkIGJ5IE1hc2FraSBGdWt1c2hpbWEuCgo2LzI4LzAwIDogdHRuCiAgICAgICAgICBBcHBsaWVkIG1vcmUtdGhhbi0xMC1hcmdzIGJ1Z2ZpeCBwYXRjaCBjb250cmlidXRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgo2LzI3LzAwIDogYmVhemxleQogICAgICAgICAgUmV3cm90ZSBzb21lIG9mIHRoZSBzdHJpbmcgaGFuZGxpbmcgYW5kIGVsaW1pbmF0ZWQgdGhlIEMrKwogICAgICAgICAgaW1wbGVtZW50YXRpb24gKHdoaWNoIGlzIG5vdyBqdXN0IGEgd3JhcHBlcikuCgo2LzI3LzAwIDogdHRuCiAgICAgICAgICBBZGRlZCBEb2MvaW5kZXguaHRtbCBhbmQgRG9jL2ludGVybmFscy5odG1sLiAgVGhlIHRhcmdldAogICAgICAgICAgYXVkaWVuY2UgZm9yIHRoZSBsYXR0ZXIgaXMgbmV3IFNXSUcgZGV2ZWxvcGVycy4KCgpWZXJzaW9uIDEuMyBBbHBoYSAzIChKdW5lIDE4LCAyMDAwKQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNi8xOC8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIG5hbWluZy5jeHgsIGhhc2guY3h4LCBhbmQgc3ltYm9sLmN4eCBmaWxlcyBmcm9tCiAgICAgICAgICB0aGUgU1dJRzEuMSBkaXJlY3RvcnkuICAgQ29udGludWVkIHRvIG1pZ3JhdGUgdGhpbmdzIGF3YXkKICAgICAgICAgIGZyb20gdGhlIEMrKyBiYXNlIChhbHRob3VnaCB0aGVyZSdzIHN0aWxsIGEgbG90IG9mIHdvcmsgdG8gZG8pLgoKNi8xNy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIGEgZmV3IG1vcmUgZXhhbXBsZXMgdG8gdGhlIEV4YW1wbGVzIGRpcmVjdG9yeS4gIFN0aWxsCiAgICAgICAgICBuZWVkIHRvIGRvIGEgbG90IG9mIHdvcmsgb24gdGhpcy4KCjYvMTYvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCAtaW5jbHVkZWFsbCB0byBmb2xsb3cgYWxsICNpbmNsdWRlIHN0YXRlbWVudHMgaW4gdGhlCiAgICAgICAgICBwcmVwcm9jZXNzb3IuCgo2LzE1LzAwIDogYmVhemxleQogICAgICAgICAgVHJpZWQgdG8gZml4IGFzIG1hbnkgQysrIHdhcm5pbmdzIGFzIHBvc3NpYmxlIHdoZW4gY29tcGlsaW5nCiAgICAgICAgICB3aXRoIHRoZSBTdW4gV29ya3Nob3AgQysrIGNvbXBpbGVyLiAgVW5mb3J0dW5hdGVseSwgdGhpcyBtZWFucwogICAgICAgICAgdGhhdCB0aGVyZSBhcmUgYSBsb3Qgb2Ygc3RhdGVtZW50cyB0aGF0IGNvbnRhaW4gc3RyaW5nIGxpdGVyYWxzCiAgICAgICAgICBvZiB0aGUgZm9ybSAoY2hhciopIkJsYWgiLgoKNi8xNS8wMDogIGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBjbGVhbnVwIGFuZCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gaW4gdGhlCiAgICAgICAgICBsb3ctbGV2ZWwgRE9IIGxpYnJhcnkuICAgVGhpcyBzZWVtcyB0byByZXN1bHQgaW4gYSBzcGVlZHVwCiAgICAgICAgICBvZiA1MC0xMDAlIGZvciBwcmVwcm9jZXNzaW5nIGFuZCBvdGhlciByZWxhdGVkIHRhc2tzLgoKNS8xMC8wMCA6IHR0bgoJICBBcHBsaWVkIHZhcmlhYmxlLXdyYXBwaW5nIGJ1Z2ZpeCBwYXRjaCBjb250cmlidXRlZAoJICBieSBNYXR0aGlhcyBLb2VwcGUuCgo0LzE3LzAwIDogdHRuCgkgIFVwZGF0ZWQgTXpTY2hlbWUgc3VwcG9ydCBjb250cmlidXRlZCBieSBPbGVnIFRvbG1hdGNldi4KCSAgV2Ugbm93IHVzZSBhIGBTY2hlbWVfVHlwZSctYmFzZWQgc3RydWN0dXJlIHRvIHdyYXAgcG9pbnRlcnMuCgo0LzExLzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBmdXJ0aGVyIEd1aWxlLXN1cHBvcnQgcGF0Y2ggYnkgTWF0dGhpYXMgS29lcHBlLgoJICBUeXBlbWFwcyBwcmV2aW91c2x5IGRlbGV0ZWQgaGF2ZSBiZWVuIHJlLWFkZGVkLiAgVGhlcmUgaXMgbm93CgkgIGV4Y2VwdGlvbiBoYW5kbGluZyAoc2VlIERvYy9lbmdpbmVlcmluZy5odG1sKS4gIGBTV0lHX2luaXQnIGlzIG5vdwoJICBkZWNsYXJlZCBleHRlcm4gb25seSBmb3Igc2ltcGxlIGxpbmthZ2UuICBTb21lIGJ1Z3Mgd2VyZSBmaXhlZC4KCjQvMDYvMDAgOiB0dG4KCSAgSW5jb3Jwb3JhdGVkIE16U2NoZW1lIHN1cHBvcnQgY29udHJpYnV0ZWQgYnkgT2xlZyBUb2xtYXRjZXYuCgkgIFRoaXMgaW5jbHVkZXMgbmV3IGRpcmVjdG9yaWVzIExpYi9tenNjaGVtZSBhbmQgRXhhbXBsZXMvbXpzY2hlbWUuCgo0LzAzLzAwIDogdHRuCgkgIEFkZGVkIEV4YW1wbGVzL2d1aWxlIGFuZCBjaGlsZHJlbi4gIFRoaXMgaXMgYW4gYWRhcHRhdGlvbiBvZgoJICB0aGUgc2FtZS1uYW1lZCBkaXJlY3RvcnkgZnJvbSB0aGUgU1dJRy0xLjFwNSBkaXN0cmlidXRpb24uCgkgIEFkZGVkIEd1aWxlLXNwZWNpZmljIHNlY3Rpb24gdG8gRG9jL2VuZ2luZWVyaW5nLmh0bWwuCgo0LzAyLzAwIDogdHRuCgkgIEluY29ycG9yYXRlZCBuZXcgZ3VpbGVtYWluLmkgYnkgTWFydGluIEZyb2VobGljaC4KCSAgSW5jb3Jwb3JhdGVkIEd1aWxlLXN1cHBvcnQgcmV3cml0ZSBwYXRjaCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFRoZSBjb21tYW5kIGxpbmUgb3B0aW9uICItd2l0aC1zbW9icyIgZW5hYmxlcyBpbXBsZW1lbnRhdGlvbiBvZgoJICBwb2ludGVyIHR5cGUgaGFuZGxpbmcgdXNpbmcgc21vYnMsIHRoZSBjYW5vbmljYWwgbWVjaGFuaXNtIGZvcgoJICBkZWZpbmluZyBuZXcgdHlwZXMgaW4gR3VpbGUuICBQcmV2aW91cyBpbXBsZW1lbnRhdGlvbiAodXNpbmcKCSAgc3RyaW5ncykgaXMgYXQgdGhlIG1vbWVudCBzdGlsbCBzdXBwb3J0ZWQgYnV0IGRlcHJlY2F0ZWQuICBBdAoJICBzb21lIHBvaW50LCAiLXdpdGgtc21vYnMiIHdpbGwgYmUgdGhlIGRlZmF1bHQgYW5kIG5vIGxvbmdlcgoJICByZXF1aXJlZC4KCjMvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBwdXJpZnkgcGF0Y2hlcyBzdWJtaXR0ZWQgYnkgUmFtIEJoYW1pZGlwYXR5LgoKMy8wMi8wMCA6IHR0bgogICAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgZGlmZmVyZW50IEd1aWxlICJsaW5rYWdlIiBzY2hlbWVzLgoJICBDdXJyZW50bHksICItTGlua2FnZSBob2JiaXQiIHdvcmtzLgoKClZlcnNpb24gMS4zIEFscGhhIDIgKE1hcmNoIDEsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoyLzI5LzAwIDogYmVhemxleQogICAgICAgICAgTWFkZSBTV0lHIGlnbm9yZSB0aGUgJ211dGFibGUnIGtleXdvcmQuCgoyLzI5LzAwIDogYmVhemxleQogICAgICAgICAgSW5jb3Jwb3JhdGVkIHNvbWUgcGF0Y2hlcyB0byB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8KICAgICAgICAgIHRoZSAtaGlkZSBvcHRpb24gYW5kIHRoZSBkZXN0cnVjdGlvbiBvZiBvYmplY3RzLgogICAgICAgICAgUGF0Y2ggc3VibWl0dGVkIGJ5IEthcmwgRm9ybmVyLgoKMi8yNy8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUgc3VwcG9ydCBjb250cmlidXRlZCBieSBNYXR0aGlhcyBLb2VwcGUuCgkgIFRoaXMgaW5jbHVkZXMgYSBjcHAgbWFjcm8gaW4gTGliL2d1aWxlL2d1aWxlLnN3ZyBhbmQgdGhlCgkgIGVudGlyZSBmaWxlIExpYi9ndWlsZS90eXBlbWFwcy5pLgoKMi8yNS8wMCA6IHR0bgoJICBNb2RpZmllZCBjb25maWd1cmUuaW4gYW5kIE1ha2VmaWxlLmluIGZpbGVzIHRvIHN1cHBvcnQKCSAgbm9uLWxvY2FsIGJ1aWxkICh1c2VmdWwgaW4gbXVsdGktYXJjaCBlbnZpcm9ubWVudHMpLgoKMi8yNC8wMCA6IHR0bgoJICBJbmNvcnBvcmF0ZWQgR3VpbGUgc3VwcG9ydCBjb250cmlidXRlZCBieSBDbGFyayBNY0dyZXcuCgkgIFRoaXMgd29ya3Mgd2l0aCBHdWlsZSAxLjMsIGJ1dCBzaW5jZSBpdCBkZXBlbmRzIGhlYXZpbHkKCSAgb24gdGhlIGdoXyBpbnRlcmZhY2UsIGl0IHNob3VsZCB3b3JrIGZvciBhbGwgbGF0ZXIgdmVyc2lvbnMuCgkgIEl0IGhhcyBub3QgYmVlbiB0ZXN0ZWQgd2l0aCB2ZXJzaW9ucyBiZWZvcmUgMS4zLgoJICBXQVJOSU5HOiBDb2RlIGlzIHVuc3RhYmxlIGR1ZSB0byBleHBlcmltZW50YXRpb24gYnkgdHRuLgoKMi8xNi8wMCA6IGJlYXpsZXkKICAgICAgICAgIEEgdmFyaWV0eSBvZiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzIGNvZGUgZ2VuZXJhdGlvbi4gIE1hbnkgb2YgdGhlc2UgcmVzdWx0IGluIHN1YnN0YW50aWFsCiAgICAgICAgICBydW50aW1lIHBlcmZvcm1hbmNlIGdhaW5zLiAgSG93ZXZlciwgdGhlc2UgaGF2ZSBjb21lIGF0CiAgICAgICAgICBhIGNvc3Qgb2YgcmVxdWlyaW5nIHRoZSB1c2Ugb2YgUHl0aG9uIDEuNS4yLiAgRm9yIG9sZGVyCiAgICAgICAgICB2ZXJzaW9ucywgdXNlICdzd2lnIC1ub29wdCAtcHl0aG9uJyB0byB0dXJuIG9mZiB0aGVzZQogICAgICAgICAgb3B0aW1pemF0aW9uIGZlYXR1cmVzLgoKVmVyc2lvbiAxLjMgQWxwaGEgMSAoRmVicnVhcnkgMTEsIDIwMDApCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi8xMS8wMCA6IEFkZGVkICd2b2lkJyB0byBwcm90b3R5cGUgb2YgUHl0aG9uIG1vZHVsZSBpbml0aWFsaXplci4KICAgICAgICAgIFJlcG9ydGVkIGJ5IE1hcmsgSG93c29uICgxLzIwLzAwKS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgUHl0aG9uIHNoYWRvdyBjbGFzcyBjb2RlIHRvIGRpc2NhcmQgb3duZXJzaGlwIG9mIGFuCiAgICAgICAgICBvYmplY3Qgd2hlbmV2ZXIgaXQgaXMgYXNzaWduZWQgdG8gYSBtZW1iZXIgb2YgYW5vdGhlciBvYmplY3QuCiAgICAgICAgICBUaGlzIHByb2JsZW0gaGFzIGJlZW4gYXJvdW5kIGZvciBhd2hpbGUsIGJ1dCB3YXMgbW9zdCByZWNlbnRseQogICAgICAgICAgcmVwb3J0ZWQgYnkgQnVya2hhcmQgS2xvc3MgKDEyLzMwLzk5KS4KCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBicmFjZXMgYXJvdW5kIG1hY3JvcyBpbiB0aGUgZXhjZXB0aW9uLmkgbGlicmFyeS4gIFJlcG9ydGVkCiAgICAgICAgICBieSBCdWNrIEhvZGdlcyAoMTIvMTkvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgRml4ZWQgYnVnIGluIHRoZSBjb25zdHJhaW50cy5pIGxpYnJhcnkuIFJlcG9ydGVkIGJ5IEJ1Y2sKICAgICAgICAgIEhvZGdlcyAoMTIvMTQvOTkpCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgVGhlICVuYXRpdmUgZGlyZWN0aXZlIG5vdyBnZW5lcmF0ZXMgVGNsOCBvYmplY3Qtc3R5bGUgY29tbWFuZCBjYWxscy4KICAgICAgICAgIEEgZnVsbCBzb2x1dGlvbiBmb3IgVGNsNyBhbmQgVGNsOCBpcyBzdGlsbCBuZWVkZWQuIFBhdGNoIHN1Z2dlc3RlZAogICAgICAgICAgYnkgTWlrZSBXZWlibGVuICgxMS8yOS85OSkKCjIvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgdHlwZW1hcCBjb2RlIHRvIGluY2x1ZGUgdGhlICRuZGltIHZhcmlhYmxlIGZvciBhcnJheXMuCiAgICAgICAgICBQYXRjaCBwcm92aWRlZCBieSBNaWNoZWwgU2FubmVyICgxMS8xMi85OSkuCgoyLzExLzAwIDogYmVhemxleQogICAgICAgICAgTW9kaWZpZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gcmFpc2UgYSBSdW50aW1lIGVycm9yIGlmIGFuIGF0dGVtcHQKICAgICAgICAgIGlzIG1hZGUgdG8gc2V0IGEgcmVhZC1vbmx5IG1lbWJlciBvZiBhIHNoYWRvdyBjbGFzcy4gIFJlcG9ydGVkIGJ5CiAgICAgICAgICBNaWNoZWwgU2FubmVyICgxMS81Lzk5KS4KCjIvMTAvMDAgOiBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gcmVtb3ZlZC4gSG93ZXZlciwgaXQgaXMgbGlrZWx5CiAgICAgICAgICB0byByZXR1cm4gYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgoKMi8xLzAwICA6IEFkZGVkIGEgbnVtYmVyIG9mIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cyB0byB0aGUgUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3NpbmcgYW5kIHR5cGUtY2hlY2tpbmcgY29kZS4gIENvbnRyaWJ1dGVkIGJ5IFZhZGltIENodWd1bm92LgoKICAgICAgICAgIDEuIFJlbW92ZSBfa3dhcmdzIGFyZ3VtZW50IGZyb20gdGhlIHNoYWRvdyB3cmFwcGVycyB3aGVuIC1rZXl3b3JkCiAgICAgICAgICAgICBvcHRpb24gaXMgbm90IHNwZWNpZmllZC4gVGhpcyBzYXZlcyB1cyBhIGNvbnN0cnVjdGlvbiBvZiBrZXl3b3JkCiAgICAgICAgICAgICBkaWN0aW9uYXJ5IG9uIGVhY2ggbWV0aG9kIGNhbGwuCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzLCAqKl9rd2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MsIF9rd2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgICAgIGJlY29tZXMKCiAgICAgICAgICAgICBkZWYgbWV0aG9kMShzZWxmLCAqX2FyZ3MpOgogICAgICAgICAgICAgICAgIHZhbCA9IGFwcGx5KHRlc3QyYy5QeUNsYXNzMV9tZXRob2QxLCAoc2VsZiwpICsgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIDIuIEluY29ycG9yYXRlIHNlbGYgaW50byB0aGUgX2FyZ3MgdHVwbGUuICBUaGlzIHNhdmVzIGF0IGxlYXN0IG9uZSB0dXBsZQogICAgICAgICAgICAgYWxsb2NhdGlvbiBwZXIgbWV0aG9kIGNhbGwuCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoc2VsZiwgKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgKHNlbGYsKSArIF9hcmdzKQogICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICAgICBiZWNvbWVzCgogICAgICAgICAgICAgZGVmIG1ldGhvZDEoKl9hcmdzKToKICAgICAgICAgICAgICAgICB2YWwgPSBhcHBseSh0ZXN0MmMuUHlDbGFzczFfbWV0aG9kMSwgX2FyZ3MpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbAoKICAgICAgICAgIDMuIFJlbW92ZSAqUHRyIGNsYXNzZXMuCiAgICAgICAgICAgICBBc3N1bWUgdGhhdCB3ZSBhcmUgU1dJR2dpbmcgYSBjKysgY2xhc3MgQ3BwQ2xhc3MuCiAgICAgICAgICAgICBDdXJyZW50bHkgU1dJRyB3aWxsIGdlbmVyYXRlIGJvdGggQ3BwQ2xhc3NQdHIgY2xhc3MKICAgICAgICAgICAgIHRoYXQgaG9zdHMgYWxsIG1ldGhvZHMgYW5kIGFsc28gQ3BwQ2xhc3MgdGhhdCBpcyBkZXJpdmVkCiAgICAgICAgICAgICBmcm9tIHRoZSBmb3JtZXIgYW5kIGNvbnRhaW5zIGp1c3QgdGhlIGNvbnN0cnVjdG9yLgogICAgICAgICAgICAgV2hlbiBDcHBDbGFzcyBtZXRob2QgaXMgY2FsbGVkLCB0aGUgaW50ZXJwcmV0ZXIgd2lsbCB0cnkKICAgICAgICAgICAgIHRvIGZpbmQgaXQgaW4gdGhlIENwcENsYXNzJ3MgZGljdGlvbmFyeSBmaXJzdCwgYW5kIG9ubHkgdGhlbgogICAgICAgICAgICAgY2hlY2sgdGhlIGJhc2UgY2xhc3MuCgogICAgICAgICAgICAgQ3BwQ2xhc3NQdHIgZnVuY3Rpb25hbGl0eSBtYXkgYmUgZW11bGF0ZWQgd2l0aDoKCiAgICAgICAgICAgICBpbXBvcnQgbmV3CiAgICAgICAgICAgICBfbmV3X2luc3RhbmNlID0gbmV3Lmluc3RhbmNlCiAgICAgICAgICAgICBkZWYgQ3BwQ2xhc3NQdHIodGhpcyk6CiAgICAgICAgICAgICAgICAgIHJldHVybiBfbmV3X2luc3RhbmNlKENwcENsYXNzLCB7InRoaXMiOnRoaXMsInRoaXNvd24iOjB9KQoKICAgICAgICAgICAgIFRoaXMgc2F2ZXMgdXMgb25lIGRpY3Rpb25hcnkgbG9va3VwIHBlciBjYWxsLgoKICAgICAgICAgICAgIDxEQj5UaGUgbmV3IG1vZHVsZSB3YXMgZmlyc3QgYWRkZWQgaW4gUHl0aG9uLTEuNS4yIHNvIGl0CiAgICAgICAgICAgICB3b24ndCB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMuICBJJ3ZlIGltcGxlbWVudGVkIGFuCiAgICAgICAgICAgICBhbHRlcm5hdGl2ZSB0aGF0IGFjaGlldmVzIHRoZSBzYW1lIHRoaW5nPC9EQj4KCiAgICAgICAgICA0LiBVc2UgQ09iamVjdHMgaW5zdGVhZCBvZiBzdHJpbmdzIGZvciBwb2ludGVycy4KCiAgICAgICAgICBEYXZlOiBUaGlzIGVuaGFuY2VtZW50cyByZXN1bHQgaW4gc3BlZWR1cHMgb2YgdXAgdG8gNTAlIGluIHNvbWUKICAgICAgICAgIG9mIHRoZSBwcmVsaW1pbmFyeSB0ZXN0cyBJIHJhbi4KCjIvMS8wMCAgOiBVcGdyYWRlZCB0aGUgUHl0aG9uIG1vZHVsZSB0byB1c2UgYSBuZXcgdHlwZS1jaGVja2luZyBzY2hlbWUgdGhhdAogICAgICAgICAgaXMgbW9yZSBtZW1vcnkgZWZmaWNpZW50LCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UsIGFuZAogICAgICAgICAgaXMgbGVzcyBlcnJvciBwcm9uZS4gVW5mb3J0dW5hdGVseSwgaXQgd2lsbCBicmVhayBhbGwgY29kZSB0aGF0CiAgICAgICAgICBkZXBlbmRzIG9uIHRoZSBTV0lHX0dldFB0cigpIGZ1bmN0aW9uIGNhbGwgaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGNoYW5nZWQgYXMgZm9sbG93czoKCiAgICAgICAgICAgICAgICBpZiAoU1dJR19HZXRQdHIoc3RyaW5nLCZwdHIsIl9Gb29fcCIpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgYmVjb21lcwoKICAgICAgICAgICAgICAgIGlmIChTV0lHX0NvbnZlcnRQdHIocHlvYmosICZwdHIsIFNXSUdfVFlQRV9Gb29fcCkgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBOb3RlOiBJbiB0aGUgbmV3IGltcGxlbWVudGF0aW9uIFNXSUdfVFlQRV9Gb29fcCBpcyBubyBsb25nZXIKICAgICAgICAgIGEgdHlwZS1zaWduYXR1cmUgc3RyaW5nLCBidXQgcmF0aGVyIGFuIGluZGV4IGludG8gYSB0eXBlCiAgICAgICAgICBlbmNvZGluZyB0YWJsZSB0aGF0IGNvbnRhaW5zIHR5cGUgaW5mb3JtYXRpb24uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMzAvMDAgOiBsb2ljCgkgIENvbmRpdGlvbmFsbHkgY29tcGlsZSBleHBlcmltZW50YWwgY29kZSB3aXRoIC0tZW5hYmxlLWV4cGVyaW1lbnQKCSAgY29uZmlndXJlIGZsYWcuCgkgIEZpeCAuY3ZzaWdub3JlIHRvIGlnbm9yZSBjb25maWd1cmUgJiB5YWNjIGdlbmVyYXRlZCBmaWxlcwoKMS8yOC8wMCA6IGxvaWMKCSAgQXBwbHkgYXV0b21ha2UgZXZlcnl3aGVyZQoJICBLZWVwIGNvbmZpZ3VyZSBzY3JpcHRzIHNvIHRoYXQgcGVvcGxlIGFyZSBub3QgKmZvcmNlZCogdG8gYXV0b2NvbmYKICAgICAgICAgIEtlZXAgc291cmNlcyBnZW5lcmF0ZWQgYnkgeWFjYyBzbyB0aGF0IGNvbXBpbGF0aW9uIHdpdGhvdXQgeWFjYwoJICBpcyBwb3NzaWJsZS4KCSAgU291cmNlL0xQYXJzZS9jc2Nhbm5lci5jOiBjaGFuZ2UgbHlhY2MuaCBpbnRvIHBhcnNlci5oIHRvIHBsZWFzZQoJICBkZWZhdWx0IHlhY2MgZ2VuZXJhdGlvbiBydWxlcy4KCSAgVXNlIEFDX0NPTkZJR19TVUJESVJTIGluIGNvbmZpZ3VyZS5pbiBpbnN0ZWFkIG9mIGhhbmQgbWFkZSBzY3JpcHQuCgkgIFVwZGF0ZSBhbGwgcmVsZXZhbnQgLmN2c2lnbm9yZSB0byBpbmNsdWRlIC5kZXBzCgkgIEZpeGVkIG1pc3NpbmcgOyBsaW5lIDEzNiBTb3VyY2UvU3dpZy9zd2lnLmgKCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBGaXhlZCBhIG51bWJlciBvZiBtaW5vciBlbmQtb2YtZmlsZSBwYXJzaW5nIHByb2JsZW1zIGluIHRoZQogICAgICAgICAgcHJlcHJvY2Vzc29yLgoKMS8xMy8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIC1mcmVlemUgb3B0aW9uIHRoYXQgZm9yY2VzIFNXSUcgdG8gZnJlZXplIHVwb24gZXhpdC4KICAgICAgICAgIFRoaXMgaXMgb25seSB1c2VkIGFzIGEgZGVidWdnaW5nIHRvb2wgc28gdGhhdCBJIGNhbiBtb3JlCiAgICAgICAgICBlYXNpbHkgZXhhbWluZSBTV0lHJ3MgbWVtb3J5IGZvb3RwcmludC4KCjEvMTMvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBwYXRjaCB0byBndWlsZSBtb2R1bGUgZm9yIHN1cHBvcnRpbmcgb3B0aW9uYWwgYXJndW1lbnRzCiAgICAgICAgICBQYXRjaCBjb250cmlidXRlZCBieSBEaWV0ZXIgQmFyb24uCgoxLzEzLzAwIDogbG9pYwoJICBBZGRlZCAuY3ZzaWdub3JlLCBFeGFtcGxlcy8uY3ZzaWdub3JlLCBTb3VyY2UvRE9IL0RvaC8uY3ZzaWdub3JlCgkgIFNvdXJjZS9TV0lHMS4xL21haW4uY3h4OiBGaXhlZCAtSSBoYW5kbGluZyBidWcKCSAgU291cmNlL01vZHVsZXMxLjEvamF2YS5jeHg6IGZpeGVkIGNoYXIqIC0+IGNvbnN0IGNoYXIqIHdhcm5pbmdzIHRoYXQgYXJlCgkgIGVycm9ycyB3aGVuIGNvbXBpbGluZyB3aXRoIGdjYy0yLjk1LjIKCSAgU291cmNlL1NXSUcxLjEvbWFpbi5jeHg6IGNhc3QgY29uc3QgY2hhciogdG8gY2hhciogZm9yIFN0cmluZ19yZXBsYWNlCgkgIHRva2VuIGFuZCByZXAgc2hvdWxkIHJlYWxseSBiZSBjb25zdC4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBBZGRlZCBIYXJjbydzIEphdmEgbW9kdWxlcy4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZXZva2VkIHRoZSAlaWZkZWYsICVpZm5kZWYsICVlbmRpZiwgJWlmLCAlZWxpZiwgYW5kICVlbHNlCiAgICAgICAgICBkaXJlY3RpdmVzLiAgVGhlc2UgYXJlIG5vIGxvbmdlciBuZWVkZWQgYXMgU1dJRyBub3cgaGFzIGEgcmVhbAogICAgICAgICAgcHJlcHJvY2Vzc29yLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxLzEyLzAwIDogYmVhemxleQogICAgICAgICAgTW92ZWQgdGhlIGRvY3VtZW50YXRpb24gbW9kdWxlcyBmcm9tIHRoZSBTV0lHIGRpcmVjdG9yeQogICAgICAgICAgdG8gdGhlIE1vZHVsZXMgZGlyZWN0b3J5ICh3aGVyZSB0aGV5IHJlYWxseSBzaG91bGQgaGF2ZSBiZWVuCiAgICAgICAgICB0byBiZWdpbiB3aXRoKS4KCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtc3RhdCBvcHRpb24gZm9yIHByaW50aW5nIHN0YXRpc3RpY3MuIFRoZQogICAgICAgICAgc3RhdGlzdGljcyByZXBvcnRpbmcgd2FzIGluYWRlcXVhdGUgYW5kIG1vc3RseSBicm9rZW4KICAgICAgICAgIGFueXdheS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlIC10IG9wdGlvbiBmb3IgcmVhZGluZyBhIHR5cGVtYXAgZmlsZS4gIE1vcmUKICAgICAgICAgIHRyb3VibGUgdGhhbiBpdCdzIHdvcnRoLiAgSnVzdCBpbmNsdWRlIHR5cGVtYXBzIGF0IHRoZSB0b3AKICAgICAgICAgIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMS8xMi8wMCA6IGJlYXpsZXkKICAgICAgICAgIFJlbW92ZWQgdGhlICVjaGVja291dCBkaXJlY3RpdmUuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTIvMDAgOiBiZWF6bGV5CiAgICAgICAgICBSZW1vdmVkIHRoZSAtY2kgb3B0aW9uIGZvciBmaWxlIGNoZWNraW4uICAgVG9vIHByb2JsZW1hdGljCiAgICAgICAgICB0byBpbXBsZW1lbnQuICBQcm9iYWJseSBiZXR0ZXIgdG8ganVzdCBwdXQgeW91ciBTV0lHIGxpYnJhcnkKICAgICAgICAgIHVuZGVyIENWUyBpbnN0ZWFkLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqLgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIERlbGV0ZWQgdGhlIExBVEVYIG1vZHVsZS4gIFNvcnJ5Li4uIERpZG4ndCBrbm93IGFueW9uZQogICAgICAgICAgd2hvIHdhcyB1c2luZyBpdC4gIEJlc2lkZXMsIEknbSBsb29raW5nIHRvIHNpbXBsaWZ5CiAgICAgICAgICB0aGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjEvMTEvMDAgOiBiZWF6bGV5CiAgICAgICAgICBNb2RpZmllZCB0aGUgQVNDSUkgZG9jdW1lbnRhdGlvbiBtb2R1bGUgdG8gdXNlIGEgLnR4dAogICAgICAgICAgc3VmZml4IGZvciBpdHMgb3V0cHV0IGZpbGUgaW5zdGVhZCBvZiAuZG9jLgoKMS8xMS8wMCA6IGJlYXpsZXkKICAgICAgICAgIEFkZGVkIHRoZSBsb25nLWxvc3QgU1dJRyBwcmVwcm9jZXNzb3IgYmFjayB0byB0aGUgc3lzdGVtLgogICAgICAgICAgSXQgc2hvdWxkIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4gIFJhdyBwcmVwcm9jZXNzZWQgb3V0cHV0CiAgICAgICAgICBjYW4gYmUgdmlld2VkIHVzaW5nIHN3aWcgLUUgZmlsZS5pLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKMS8xMS8wMCA6IGJlYXpsZXkgYW5kIGRqbWl0Y2hlCiAgICAgICAgICBDb21wbGV0ZWx5IHJlb3JnYW5pemVkIHRoZSBTV0lHIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuICBUaGUKICAgICAgICAgIGJhc2ljIG9yZ2FuaXphdGlvbiBpcyBub3c6CgogICAgICAgICAgICAgICAgU291cmNlLyAgICAgICAgIFNXSUcgc291cmNlIGNvZGUKICAgICAgICAgICAgICAgIExpYi8gICAgICAgICAgICBTV0lHIGxpYnJhcnkgZmlsZXMgKHN3aWdfbGliKQogICAgICAgICAgICAgICAgRG9jLyAgICAgICAgICAgIERvY3VtZW50YXRpb24KICAgICAgICAgICAgICAgIEV4YW1wbGVzLyAgICAgICBFeGFtcGxlcwoKICAgICAgICAgIE1vcmUgZGlyZWN0b3JpZXMgd2lsbCBiZSBhZGRlZCBhcyBuZWVkZWQuCgoxMi8wOC85OTogTG9pYyBEYWNoYXJ5IChsb2ljQHNlbmdhLm9yZykKCSAgRW5oYW5jZWQgcGFja2FnZSBoYW5kbGluZyBmb3IgcGVybDUgYW5kIGMrKy4KCgkgIFdpdGggbmV3IG9wdGlvbiAtaGlkZSBGb286OkJhciwgZXZlcnkgcGVybDUgb2JqZWN0IChGcm9iKSBpcwoJICBxdWFsaWZpZWQgYnkgRm9vOjpCYXI6OkZyb2IuIFRoZSBwYWNrYWdlIG5hbWUgaXMgc29sZWx5IHVzZWQKCSAgdG8gZW5jYXBzdWxhdGUgQy9DKysgd3JhcHBlcnMgb3V0cHV0IGluIDxtb2R1bGU+X3dyYXAuYyBhbmQgdGhlCgkgIGNvcnJlc3BvbmRpbmcgcGVybCBwYWNrYWdlIGluIDxtb2R1bGU+LnBtLiBOb3RlIHRoYXQgYSBwYWNrYWdlCgkgIG5hbWUgbWF5IGNvbnRhaW4gOjogKEZyb2I6Ok5pdHopIGFuZCB3aWxsIGJlIHJlbGF0aXZlIHRvIHRoZQoJICBwYWNrYWdlIG5hbWUgcHJvdmlkZWQgYnkgLWhpZGUgKEZvbzo6QmFyOjpGcm9iOjpOaXR6KS4KCgkgIEluICpfd3JhcC5jLCBTV0lHX2luaXQgbWFjcm8gaXMgdXNlZC4gV2FzIHByZXZpb3VzbHkgZGVmaW5lZAoJICBidXQgbm90IHVzZWQgYW5kIHNpbXBsaWZpZXMgY29kZS4KCgkgIEFkZGVkIHR5cGVtYXAocGVybDUscGVybDVpbikgYW5kIHR5cGVtYXAocGVybDUscGVybDVvdXQpIHRoYXQKCSAgZG8gdGhlIGVxdWl2YWxlbnQgb2YgdHlwZW1hcChwZXJsNSxpbikgYW5kIHR5cGVtYXAocGVybDUsb3V0KQoJICBidXQgY29udGFpbiBwZXJsIGNvZGUgYW5kIGFwcGxpZXMgdG8gd3JhcHBlcnMgZ2VuZXJhdGVkIGJ5CgkgIC1zaGFkb3cuCgoJICBMYWNraW5nIHByb3BlciByZWdyZXNzaW9uIHRlc3RzIEkgdXNlZAoJICBFeGFtcGxlcy9wZXJsNS97YysrLGNvbnN0cmFpbnQsZGVmYXJnLGV4Y2VwdCwKCSAgZ3JhcGgvZ3JhcGhbMTIzNF0sbXVsdGluaGVyaXQsbmVzdGVkLHNoYWRvdyxzaW1wbGUsdHJlZSwKCSAgdHlwZW1hcHMve2FyZ3YsYXJndjIsYXJyYXltZW1iZXIsZGF0YWJhc2UsZmlsZSxpZ25vcmUsaW50ZWdlciwKCSAgb3V0cHV0LHBhc3NyZWYscmVmZXJlbmNlLHJldHVybn19Ly4gSSByYW4gc3dpZyB3aXRoIGFuZCB3aXRob3V0CgkgIHRoZSBwYXRjaGVzLCBkaWZmIHRoZSBnZW5lcmF0ZWRzb3VyY2VzLCBydW4gdGhlIC5wbCBmaWxlcwoJICBhbmQgY2hlY2tlZCB0aGF0IHRoZSByZXN1bHRzIGFyZSBpZGVudGljYWwuIEluIGFsbCB0aG9zZSBleGFtcGxlcwoJICBJIGhhZCBubyBlcnJvci4KCjExLzIxLzk5OiBNb2RpZmllZCB0aGUgVGNsIG1vZHVsZSB0byBwcm92aWRlIGZ1bGwgdmFyaWFibGUgbGlua2luZyBjYXBhYmlsaXRpZXMKICAgICAgICAgIHRvIGFsbCBkYXRhdHlwZXMuICAgSW4gcHJldmlvdXMgdmVyc2lvbnMsIGEgcGFpciBvZiBhY2Nlc3NvciBmdW5jdGlvbnMKICAgICAgICAgIHdlcmUgY3JlYXRlZCBmb3IgZGF0YXR5cGVzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBUY2xfTGlua1ZhcigpIGZ1bmN0aW9uLgogICAgICAgICAgTm93LCB3ZSBzaW1wbHkgdXNlIHZhcmlhYmxlIHRyYWNlcyB0byBzdXBwb3J0IGV2ZXJ5dGhpbmcuIFRoaXMgbWF5CiAgICAgICAgICBicmVhayBzY3JpcHRzIHRoYXQgcmVseSB1cG9uIHRoZSBvbGRlciBiZWhhdmlvci4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKMTEvMjEvOTk6IEFkZGVkIHNsaWdodCB0d2VhayB0byB3cmFwcGVyIGdlbmVyYXRvciB0byBjb2xsZWN0IGxvY2FsIHZhcmlhYmxlcwogICAgICAgICAgb2Ygc2ltaWxhciB0eXBlLiAgUHJvZHVjZXMgc29tZXdoYXQgbW9yZSBjb21wYWN0IHdyYXBwZXIgY29kZS4KCjExLzIwLzk5OiBNb2RpZmllZCB0aGUgVGNsIG1vZHVsZSB0byB1c2UgU1dJR19HZXRBcmdzKCkgdG8gcGFyc2UKICAgICAgICAgIGFyZ3VtZW50cy4gICAgVGhpcyBpcyBhIHRlY2huaXF1ZSBib3Jyb3dlZCBmcm9tIFB5dGhvbiBpbiB3aGljaAogICAgICAgICAgYXJndW1lbnRzIGFyZSBjb252ZXJ0ZWQgdXNpbmcgYSBmb3JtYXQgc3RyaW5nIGNvbnZlbnRpb24gc2ltaWxpYXIKICAgICAgICAgIHRvIGZwcmludGYoKS4gICBUaGlzIHJlc3VsdHMgaW4gYSAqc3Vic3RhbnRpYWwqIHJlZHVjdGlvbiBpbiB0aGUKICAgICAgICAgIHNpemUgb2YgdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUgd2l0aCBvbmx5IGEgbW9kZXN0IHJ1bnRpbWUgb3ZlcmhlYWQKICAgICAgICAgIGluIGdvaW5nIHRocm91Z2ggdGhlIGV4dHJhIGNvbnZlcnNpb24gZnVuY3Rpb24uCgoxMS8xMy85OTogQ29tcGxldGVseSByZXdyb3RlIHRoZSBjbGFzcy9zdHJ1Y3R1cmUgZ2VuZXJhdGlvbiBjb2RlIGZvciB0aGUKICAgICAgICAgIFRjbCBtb2R1bGUuICBOb3csIGEgc21hbGwgc2V0IG9mIHJ1bnRpbWUgZnVuY3Rpb25zIGFyZSB1c2VkCiAgICAgICAgICB0byBpbXBsZW1lbnQgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIGFsbCBjbGFzc2VzIChpbnN0ZWFkIG9mIGEKICAgICAgICAgIG1hc3NpdmUgYW1vdW50IG9mIHJ1bnRpbWUgY29kZSBiZWluZyBnZW5lcmF0ZWQgZm9yIGVhY2ggY2xhc3MpLgogICAgICAgICAgQ2xhc3Mgc3BlY2lmaWMgaW5mb3JtYXRpb24gaXMgc2ltcGx5IGVuY29kZWQgaW4gYSBzZXJpZXMgb2YKICAgICAgICAgIHN0YXRpYyB0YWJsZXMuICAgVGhpcyByZXN1bHRzIGluIGEgKkhVR0UqIHJlZHVjdGlvbiBpbiB3cmFwcGVyCiAgICAgICAgICBjb2RlIHNpemUtLWVzcGVjaWFsbHkgZm9yIEMrKy4KCjExLzEzLzk5OiBSZW1vdmVkIHRoZSAtdGNsIChUY2wgNy54KSBtb2R1bGUuICBUY2wgOC4wIGlzIG5vdyBzZXZlcmFsCiAgICAgICAgICB5ZWFycyBvbGQgYW5kIHRoZSBkZWZhY3RvIHN0YW5kYXJkLS1ubyByZWFsIHJlYXNvbiB0byBrZWVwCiAgICAgICAgICBzdXBwb3J0aW5nIHRoZSBvbGQgdmVyc2lvbiBhdCB0aGlzIHBvaW50LgoKMTEvMTMvOTk6IENsZWFuZWQgdXAgLWMgb3B0aW9uIGZvciBQeXRob24gbW9kdWxlLiAgVGhlIHB5ZXhwLnN3ZyBmaWxlCiAgICAgICAgICBpcyBub3cgZ29uZS4KCjExLzEzLzk5OiBGaXhlZCBleHRlcm5hbCBkZWNsYXJhdGlvbnMgdG8gd29yayBiZXR0ZXIgd2l0aCBzdGF0aWMgbGlua2luZwogICAgICAgICAgb24gV2luZG93cy4gIFN0YXRpYyBsaW5raW5nIHNob3VsZCBub3cgYmUgcG9zc2libGUgYnkgZGVmaW5pbmcKICAgICAgICAgIHRoZSAtRFNUQVRJQ19MSU5LIG9wdGlvbiBvbiB0aGUgY29tbWFuZCBsaW5lLiAgUGF0Y2ggY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IEFsYmVydG8gRm9uc2VjYS4KCjExLzUvOTkgOiBGaXhlZCBhbiBvYnNjdXJlIGNvZGUgZ2VuZXJhdGlvbiBidWcgcmVsYXRlZCB0byB0aGUgZ2VuZXJhdGlvbgogICAgICAgICAgb2YgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuICAgQnVnIHJlcG9ydGVkIGJ5IEJyYWQgQ2xlbWVudHMuCgoxMS81Lzk5IDogRml4ZWQgYSBmZXcgbWVtb3J5IHByb2JsZW1zIGZvdW5kIGJ5IHB1cmlmeS4KCjExLzUvOTkgOiBPZmZpY2lhbGx5IGRlcHJlY2F0ZWQgdGhlIC1odGNsLCAtaHRrLCBhbmQgLXBsdWdpbiBvcHRpb25zCiAgICAgICAgICBmcm9tIHRoZSBUY2wgYW5kIFRjbDggbW9kdWxlcy4KCjEwLzI2Lzk5OiBSZW1vdmVkIHVudXNlZCB2YXJpYWJsZSBmcm9tIHB5dGhvbi90eXBlbWFwcy5pLiAgUGF0Y2gKICAgICAgICAgIGNvbnRyaWJ1dGVkIGJ5IEtlaXRoIERhdmlkc29uLgoKOC8xNi85OSA6IEFkZGVkIF9XSU4zMiBzeW1ib2wgdG8gbGlicmFyaWVzIHRvIGJldHRlciBzdXBwb3J0IFdpbmRvd3MuCgo4LzE2Lzk5IDogRGVwcmVjYXRlZCB0aGUgUGVybDQgbW9kdWxlLiAgIEl0IGlzIG5vIGxvbmdlciBpbmNsdWRlZCBpbiB0aGUKICAgICAgICAgIGRpc3RyaWJ1dGlvbiBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIEluIHRoZSBlbnRpcmUgMyB5ZWFycyBTV0lHCiAgICAgICAgICBoYXMgYmVlbiBhcm91bmQgSSBuZXZlciByZWNlaXZlZCBhIHNpbmdsZSBjb21tZW50IGFib3V0IGl0IHNvIEknbQogICAgICAgICAgYXNzdW1pbmcgbm8gb25lIHdpbGwgbWlzcyBpdC4uLgoKOC8xNi85OSA6IE1vZGlmaWVkIHRoZSB0eXBlLWNoZWNraW5nIGNvZGUgdG8gcmVnaXN0ZXIgdHlwZSBtYXBwaW5ncyB1c2luZyBhCiAgICAgICAgICB0YWJsZSBpbnN0ZWFkIG9mIHJlcGVhdGVkIGNhbGxzIHRvIFNXSUdfUmVnaXN0ZXJNYXBwaW5nKCkuICBUaGlzCiAgICAgICAgICByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gc29tZXdoYXQuCgo4LzE1Lzk5IDogQ2xlYW5lZCB1cCB0aGUgcG9pbnRlciB0eXBlLWNoZWNraW5nIGNvZGUgaW4gdGhlIFRjbCBtb2R1bGUuCgo4LzE1Lzk5IDogTWFueSBjaGFuZ2VzIHRvIHRoZSBsaWJyYXJpZXMgdG8gc3VwcG9ydCBydW50aW1lIGxpYnJhcmllcy4KCjgvMTMvOTkgOiBFbGltaW5hdGVkIEMrKyBjb21waWxlciB3YXJuaW5nIG1lc3NhZ2VzIGFib3V0IGV4dGVybiAiQyIgbGlua2FnZS4KCjgvMTMvOTkgOiBTb21lIGNsZWFudXAgb2YgUHl0aG9uIC5zd2cgZmlsZXMgdG8gYmV0dGVyIHN1cHBvcnQgcnVudGltZSBsaWJyYXJpZXMKICAgICAgICAgIG9uIFdpbmRvd3MuCgo4LzEzLzk5IDogTW9kaWZpZWQgdGhlICVwcmFnbWEgZGlyZWN0aXZlIHRvIGF0dGFjaCBwcmFnbWFzIGRlY2xhcmVkIGluc2lkZQogICAgICAgICAgYSBjbGFzcyBkZWZpbml0aW9uIHRvIHRoZSBjbGFzcyBpdHNlbGYuIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgY2xhc3MgZm9vIHsKICAgICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAgICAlcHJhZ21hKHB5dGhvbikgYWRkdG9tZXRob2QgPSAiaW5zZXJ0OnByaW50IGBoZWxsbyB3b3JsZCciCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBNb3N0IHBlb3BsZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGhvdyB0aGlzIHdvcmtzLiAgRm9yIHBlb3BsZQogICAgICAgICAgd3JpdGluZyBiYWNrZW5kIG1vZHVsZXMsIGNsYXNzLWJhc2VkIHByYWdtYXMgd29yayBsaWtlIHRoaXM6CgogICAgICAgICAgICAgIGxhbmctPmNwcF9vcGVuX2NsYXNzKCkgICAgICAgICAgICAgLy8gT3BlbiBhIGNsYXNzCiAgICAgICAgICAgICAgbGFuZy0+Y3BwX3ByYWdtYSgpICAgICAgICAgICAgICAgICAvLyBTdXBwbHkgcHJhZ21hcwogICAgICAgICAgICAgIC4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCBtZW1iZXJzCgogICAgICAgICAgICAgIGxhbmctPmNwcF9jbG9zZV9jbGFzcygpICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIGNsYXNzCgogICAgICAgICAgQWxsIG9mIHRoZSBwcmFnbWFzIGFyZSBwYXNzZWQgZmlyc3Qgc2luY2UgdGhleSBtaWdodCBiZSB1c2VkIHRvCiAgICAgICAgICBhZmZlY3QgdGhlIGNvZGUgZ2VuZXJhdGlvbiBvZiBvdGhlciBtZW1iZXJzLiAgIFBsZWFzZSBzZWUKICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlIGZvciBhbiBleGFtcGxlLiAgIFBhdGNoZXMgY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IFJvYmluIER1bm4uCgo4LzEzLzk5IDogUGF0Y2ggdG8gUHl0aG9uIHNoYWRvdyBjbGFzc2VzIHRvIGVsaW1pbmF0ZSBpZ25vcmVkCiAgICAgICAgICBleGNlcHRpb24gZXJyb3JzIGluIGRlc3RydWN0b3JzLiAgUGF0Y2ggY29udHJpYnV0ZWQKICAgICAgICAgIGJ5IFJvYmluIER1bm4uCgo4LzExLzk5IDogTWlub3IgcGF0Y2ggdG8gc3dpZ19saWIvcHl0aG9uL3N3aWdwdHIuc3dnICAoYWRkZWQgU1dJR1NUQVRJQwogICAgICAgICAgZGVjbGFyYXRpb24pLiAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgTHlsZSBKb2huc29uLgoKOC8xMS85OSA6IEFkZGVkIEZJUlNUS0VZL05FWFRLRVkgbWV0aG9kcyB0byBQZXJsNSBzaGFkb3cgY2xhc3NlcwogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgRGVubmlzIE1hcnNhLgoKOC8xMS85OSA6IE1vZGlmaWVkIFB5dGhvbiBtb2R1bGUgc28gdGhhdCBOVUxMIHBvaW50ZXJzIGFyZSByZXR1cm5lZAogICAgICAgICAgYW5kIHBhc3NlZCBhcyAnTm9uZS4nICBQYXRjaCBjb250cmlidXRlZCBieSBUYWwgU2hhbGlmLgoKOC8xMC85OSA6IEZpeGVkIG1pc3NpbmcgJ2ludCcgc3BlY2lmaWVycyBpbiB2YXJpb3VzIHBsYWNlcy4KCjgvMTAvOTkgOiBBZGRlZCBXaW5kb3dzIG1ha2VmaWxlIGZvciBSdW50aW1lIGxpYnJhcmllcy4gIENvbnRyaWJ1dGVkCiAgICAgICAgICBieSBCb2IgVGVjaGVudGluLgoKOC8xMC85OSA6IEZpeGVkIG1pbm9yIHByb2JsZW0gaW4gUHl0aG9uIHJ1bnRpbWUgbWFrZWZpbGUgaW50cm9kdWNlZAogICAgICAgICAgYnkga2V5d29yZCBhcmd1bWVudHMuCgo4LzgvOTkgIDogQ2hhbmdlZCAkdGFyZ2V0IG9mIHBlcmw1KG91dCkgdHlwZW1hcCBmcm9tIFNUKDApIHRvCiAgICAgICAgICBTVChhcmd2aSkuICBQYXRjaCBjb250cmlidXRlZCBieSBHZW9mZnJleSBIb3J0LgoKOC84Lzk5ICA6IEZpeGVkIGJ1ZyBpbiB0eXBlbWFwIGNoZWNraW5nIHJlbGF0ZWQgdG8gdGhlIEFOWSBrZXl3b3JkCiAgICAgICAgICBpbiBhcnJheXMgYW5kIGlnbm9yZWQgYXJndW1lbnRzLiAgRXJyb3IgcmVwb3J0ZWQgYnkKICAgICAgICAgIEdlb2ZmcmV5IEhvcnQuCgo4LzgvOTkgIDogJWVuYWJsZWRvYyBhbmQgJWRpc2FibGVkb2MgZGlyZWN0aXZlcyBjYW4gbm93IGJlIHVzZWQKICAgICAgICAgIGluc2lkZSBjbGFzcy9zdHJ1Y3R1cmUgZGVmaW5pdGlvbnMuICAgSG93ZXZlciwgbm8gY2hlY2sKICAgICAgICAgIGlzIG1hZGUgdG8gc2VlIGlmIHRoZXkgYXJlIGJhbGFuY2VkIChpLmUuLCBhICVkaXNhYmxlZG9jCiAgICAgICAgICBkaXJlY3RpdmUgaW5zaWRlIGEgY2xhc3MgZG9lcyBub3QgaGF2ZSB0byBoYXZlIGEgbWF0Y2hpbmcKICAgICAgICAgICVlbmFibGVkb2MgaW4gdGhlIHNhbWUgY2xhc3MpLgoKOC84Lzk5ICA6IEtleXdvcmQgYXJndW1lbnQgaGFuZGxpbmcgaXMgbm93IHN1cHBvcnRlZCBpbiB0aGUgUHl0aG9uCiAgICAgICAgICBtb2R1bGUuICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICBpbnQgZm9vKGNoYXIgKmJhciwgaW50IHNwYW0sIGRvdWJsZSB4KTsKCiAgICAgICAgICBDYW4gYmUgY2FsbGVkIGZyb20gUHl0aG9uIGFzCgogICAgICAgICAgICAgICBmb28oeCA9IDMuNCwgYmFyPSJoZWxsbyIsIHNwYW09NDIpCgogICAgICAgICAgVG8gZW5hYmxlIHRoaXMgZmVhdHVyZSwgcnVuIFNXSUcgd2l0aCB0aGUgJy1rZXl3b3JkJyBjb21tYW5kCiAgICAgICAgICBsaW5lIG9wdGlvbi4gICAgTWl4aW5nIGtleXdvcmQgYW5kIGRlZmF1bHQgYXJndW1lbnRzCiAgICAgICAgICBzaG91bGQgd29yayBhcyB3ZWxsLiAgIFVubmFtZWQgYXJndW1lbnRzIGFyZSBhc3NpZ25lZCBuYW1lcwogICAgICAgICAgc3VjaCBhcyAiYXJnMSIsICJhcmcyIiwgZXRjLi4uCgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCiAgICAgICAgICBGdW5jdGlvbnMgd2l0aCBkdXBsaWNhdGUgYXJndW1lbnQgbmFtZXMgc3VjaCBhcwogICAgICAgICAgYmFyKGludCAqT1VUUFVULCBpbnQgKk9VVFBVVCkgd2lsbCBsaWtlbHkgY2F1c2UgcHJvYmxlbWF0aWMKICAgICAgICAgIHdyYXBwZXIgY29kZSB0byBiZSBnZW5lcmF0ZWQuICAgVG8gZml4IHRoaXMsICB1c2UgZGlmZmVyZW50CiAgICAgICAgICBuYW1lcyBvciB1c2UgJWFwcGx5IHRvIG1hcCB0eXBlbWFwcyB0byBhbHRlcm5hdGUgbmFtZXMuCgo4LzgvOTkgIDogSGFuZGxpbmcgb2YgdGhlICd0aGlzJyBwb2ludGVyIGhhcyBiZWVuIGNoYW5nZWQgaW4gUHl0aG9uIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gIFByZXZpb3VzbHksIGRlcmVmZXJlbmNpbmcgb2YgJy50aGlzJyBvY2N1cnJlZCBpbiB0aGUKICAgICAgICAgIFB5dGhvbiBzaGFkb3cgY2xhc3MgaXRzZWxmLiAgIE5vdywgdGhpcyBzdGVwIG9jY3VycyBpbiB0aGUgQwogICAgICAgICAgd3JhcHBlcnMgdXNpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlvbjoKCiAgICAgICAgICAgICAgICBTV0lHX0dldFB0ck9iaihQeU9iamVjdCAqLCB2b2lkICoqcHRyLCBjaGFyICp0eXBlKQoKICAgICAgICAgIFRoaXMgZnVuY3Rpb24gY2FuIGFjY2VwdCBlaXRoZXIgYSBzdHJpbmcgY29udGFpbmluZyBhIHBvaW50ZXIKICAgICAgICAgIG9yIGEgc2hhZG93IGNsYXNzIGluc3RhbmNlIHdpdGggYSAnLnRoaXMnIGF0dHJpYnV0ZSBvZgogICAgICAgICAgYXBwcm9wcmlhdGUgdHlwZS4gIFRoaXMgY2hhbmdlIGFsbG93cyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgIDEuICBUaGUgcmVhbCBzaGFkb3cgY2xhc3MgaW5zdGFuY2UgZm9yIGFuIG9iamVjdCBpcwogICAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgQyB3cmFwcGVycyB3aGVyZSBpdCBjYW4gYmUgZXhhbWluZWQvbW9kaWZpZWQKICAgICAgICAgICAgICBieSB0eXBlbWFwcy4KCiAgICAgICAgICAyLiAgSGFuZGxpbmcgb2YgZGVmYXVsdC9rZXl3b3JkIGFyZ3VtZW50cyBpcyBub3cgZ3JlYXRseQogICAgICAgICAgICAgIHNpbXBsaWZpZWQuCgogICAgICAgICAgMy4gIFRoZSBQeXRob24gd3JhcHBlciBjb2RlIGlzIG11Y2ggbW9yZSBzaW1wbGUuCgogICAgICAgICAgUGx1cywgaXQgZWxpbWluYXRlZCBtb3JlIHRoYW4gMzAwIGxpbmVzIG9mIEMrKyBjb2RlIGluIHRoZQogICAgICAgICAgUHl0aG9uIG1vZHVsZS4KCiAgICAgICAgICAqKiogQ0FWRUFUIDogVGhpcyByZXF1aXJlcyB0aGUgYWJzdHJhY3Qgb2JqZWN0IGludGVyZmFjZS4KICAgICAgICAgIEl0IHNob3VsZCB3b3JrIHdpdGggUHl0aG9uIDEuNCwgYnV0IHByb2JhYmx5IG5vdGhpbmcgb2xkZXIKICAgICAgICAgIHRoYW4gdGhhdC4KCgo4LzgvOTkgIDogRml4ZWQgaGFuZGxpbmcgb2YgImNvbnN0IiBhbmQgcG9pbnRlcnMgaW4gY2xhc3Nlcy4gIEluIHBhcnRpY3VsYXIsCiAgICAgICAgICBkZWNsYXJhdGlvbnMgc3VjaCBhcwoKICAgICAgICAgICBjbGFzcyBmb28gewogICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptc2c7CiAgICAgICAgICAgICBjb25zdCBpbnQgICppcHRyOwogICAgICAgICAgfQoKICAgICAgICAgIGFyZSBoYW5kbGVkIGFzIGFzc2lnbmFibGUgdmFyaWFibGVzIGFzIG9wcG9zZWQgdG8gY29uc3RhbnQKICAgICAgICAgIHZhbHVlcyAodGhpcyBpcyB0aGUgY29ycmVjdCBiZWhhdmlvciBpbiBDL0MrKykuICAgTm90ZToKICAgICAgICAgIGRlY2xhcmF0aW9ucyBzdWNoIGFzICJjaGFyICpjb25zdCBtc2ciIGFyZSBzdGlsbCB1bnN1cHBvcnRlZC4KICAgICAgICAgIENvbnN0YW50cyBkZWNsYXJlZCBhdCB0aGUgZ2xvYmFsIGxldmVsIHVzaW5nIGNvbnN0IGFyZSBhbHNvCiAgICAgICAgICBicm9rZW4gKGJlY2F1c2UgSSBoYXZlIGEgbnVtYmVyIG9mIGludGVyZmFjZXMgdGhhdCByZWx5IHVwb24KICAgICAgICAgIHRoaXMgYmVoYXZpb3IpLgoKICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKiAgVGhpcyBtYXkgYnJlYWsgaW50ZXJmYWNlcyB0aGF0CiAgICAgICAgICBtaXN0YWtlbmx5IHRyZWF0ICdjb25zdCBjaGFyIConIHR5cGVzIGFzIGNvbnN0YW50IHZhbHVlcy4KCjgvOC85OSAgOiBNb2RpZmllZCB0aGUgcGFyc2VyIHRvIHN1cHBvcnQgYml0LWZpZWxkcy4gICAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgdHlwZWRlZiBzdHJ1Y3QgewogICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpc19rZXl3b3JkIDogMTsKICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXNfZXh0ZXJuICA6IDE7CiAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlzX3N0YXRpYyAgOiAxOwogICAgICAgICAgfSBmbGFnczsKCiAgICAgICAgICBCaXQtZmllbGRzIGNhbiBvbmx5IGJlIGFwcGxpZWQgdG8gaW50ZWdlciB0eXBlcyBhbmQgdGhlaXIKICAgICAgICAgIGFyZSBvdGhlciByZXN0cmljdGlvbnMuICBTV0lHIHBlcmZvcm1zIG5vIHN1Y2ggdHlwZS1jaGVja2luZwogICAgICAgICAgKGFsdGhvdWdoIHRoZSBDIGNvbXBpbGVyIHdpbGwgY2F0Y2ggcHJvYmxlbXMgd2hlbiBpdCB0cmllcyB0bwogICAgICAgICAgY29tcGlsZSB0aGUgd3JhcHBlciBjb2RlKS4KCjgvOC85OSAgOiBSZW1vdmVkIHRyYWlsaW5nIHNwYWNlIG9mICRiYXNldHlwZSBzdWJzdGl0dXRpb24gaW4gdHlwZW1hcHMuCiAgICAgICAgICBUaGlzIGlzIHRvIGFsbG93IHRoaW5ncyBsaWtlIHRoaXM6CgogICAgICAgICAgJXR5cGVtYXAocHl0aG9uLCBhcmdvdXQpIHNwYW0qKiBPVVRQVVR7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgY2hhciogYSA9ICIkYmFzZXR5cGVfcCI7CiAgICAgICAgICAgICAgLi4uCiAgICAgICAgICB9CgogICAgICAgICAgKFBhdGNoIHN1Z2dlc3RlZCBieSBOYXRoYW4gRHVuZmllbGQpLgoKNi8yMi85OSA6IE1hZGUgYSB2ZXJ5IHNsaWdodCB0d2VhayB0byB0aGUgUGVybDUgc2hhZG93IGNsYXNzCiAgICAgICAgICBjb2RlIHRoYXQgYWxsb3dzIHR5cGVtYXBzIHRvIGFsdGVyIHRoZSByZXR1cm4gdHlwZQogICAgICAgICAgb2Ygb2JqZWN0cyAodG8gc3VwcG9ydCBwb2x5bW9ycGhpYyB0eXBlcykuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgRHJha2UgRGllZHJpY2guCgo0LzgvOTkgIDogRml4ZWQgbnVsbCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsIG1vZHVsZS4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjMvMTcvOTkgOiBGaXhlZCBidWcgaW4gcGVybDVwdHIuc3dnIGZvciBBY3RpdmVTdGF0ZSBQZXJsLgogICAgICAgICAgUGF0Y2ggY29udHJpYnV0ZWQgYnkgR3JlZyBBbmRlcnNvbi4KCjIvMjcvOTkgOiBFbGltaW5hdGVkIHNlZ21lbnRhdGlvbiBmYXVsdCB3aGVuIFN3aWcgcnVucyBvbgogICAgICAgICAgZW1wdHkgZmlsZXMuCgoyLzI3Lzk5IDogQWRkZWQgcGF0Y2ggdG8gR3VpbGUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB1bnVzZWQKICAgICAgICAgIHZhcmlhYmxlcy4gICBDb250cmlidXRlZCBieSBNaWtlIFNpbW9ucy4KCjIvMjcvOTkgOiBGaXhlZCBwcm9ibGVtIHdpdGggJWFkZG1ldGhvZHMgcmV0dXJuaW5nIHJlZmVyZW5jZXMuCgoyLzI3Lzk5IDogRml4ZWQgUnVudGltZS9NYWtlZmlsZS4gUGF0Y2ggY29udHJpYnV0ZWQgYnkKICAgICAgICAgIE1pa2UgUm9tYmVyZy4KCjIvMjcvOTkgOiBJbmNvcnBvcmF0ZWQgcGF0Y2hlcyB0byB0aGUgdHlwZS1jaGVja2VyLgoKMi8yNy85OSA6IEZpeGVkIHByb2JsZW0gd2l0aCAtZXhwb3J0YWxsIHN3aXRjaCBhbmQgc2hhZG93IGNsYXNzZXMKICAgICAgICAgIGluIFBlcmw1IG1vZHVsZS4gIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IERlbm5pcyBNYXJzYS4KCjIvMjcvOTkgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgdG8gcmVjb2duaXplICd1bmRlZicgYXMgYSBOVUxMIGNoYXIgKi4KICAgICAgICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IEp1bmlvIEhhbWFuby4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgUGVybDUgbW9kdWxlIHRvIHN1cHBvcnQgdGhlIG5ld2VyIHZlcnNpb25zIG9mCiAgICAgICAgICBBY3RpdmVTdGF0ZSBQZXJsIGZvciBXaW4zMi4KCjIvMjcvOTkgOiBGaXhlZCB0aGUgaW5jbHVkZSBvcmRlciBvZiBmaWxlcyBzcGVjaWZpZWQgd2l0aCB0aGUKICAgICAgICAgIC1JIG9wdGlvbi4KCjIvNS85OC0gOiBEYXZlIGZpbmlzaGVzIGhpcyBkaXNzZXJ0YXRpb24sIGdvZXMgam9iIGh1bnRpbmcsIG1vdmVzIHRvCjIvNS85OSAgICBDaGljYWdvIGFuZCBnZW5lcmFsbHkgdGhyYXNoZXMgYWJvdXQuCgpWZXJzaW9uIDEuMSBQYXRjaCA1IChGZWJydWFyeSA1LCAxOTk4KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMi80Lzk4ICA6IEZpeGVkIGEgYnVnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdoZW4gZGlmZmVyZW50IHBhY2thZ2UKICAgICAgICAgIGxvY2F0aW9ucyBhcmUgc3BlY2lmaWVkICgtLXdpdGgtdGNsaW5jbCwgZXRjLi4uKS4KCjIvMi85OCAgOiBGaXhlZCBuYW1lLWNsYXNoIGJ1ZyByZWxhdGVkIHRvIHRoZSBzd2l0Y2ggdG8gQyBtYWNyb3MgZm9yIGFjY2Vzc29yCiAgICAgICAgICBmdW5jdGlvbnMuICBUaGUgbmV3IHNjaGVtZSBkaWQgbm90IHdvcmsgY29ycmVjdGx5IGZvciBvYmplY3RzCiAgICAgICAgICB3aXRoIG1lbWJlcnMgc3VjaCBhcyAnb2JqJywgJ3ZhbCcsIGV0Yy4uLiAgIEZpeGVkIHRoZSBidWcgYnkKICAgICAgICAgIGFwcGVuZGluZyB0aGUgd29yZCAnc3dpZycgdG8gbWFjcm8gYXJndW1lbnQgbmFtZXMuICBQYXRjaAogICAgICAgICAgY29udHJpYnV0ZWQgYnkgUnVkeSBBbGJhY2h0ZW4uCgoyLzIvOTggIDogU2xpZ2h0IGZpeCB0byB0aGUgUGVybDUgbW9kdWxlIHRvIGVsaW1pbmF0ZSB3YXJuaW5nIG1lc3NhZ2VzCiAgICAgICAgICBhYm91dCAndmFybmFtZSB1c2VkIG9ubHkgb25jZSA6IHBvc3NpYmxlIHR5cG8nLiAgRml4CiAgICAgICAgICBjb250cmlidXRlZCBieSBSdWR5IEFsYmFjaHRlbi4KCjEvOS85OCAgOiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUGVybCA1IG1vZHVsZSByZWxhdGVkIHRvIHRoZSBjcmVhdGlvbiBvZgogICAgICAgICAgY29uc3RhbnRzIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjEvOS85OCAgOiBGaXhlZCBsaW5raW5nIGJ1ZyB3aXRoIFB5dGhvbiAxLjUgZW1iZWQuaSBsaWJyYXJ5IGZpbGUuCgpWZXJzaW9uIDEuMSBQYXRjaCA0IChKYW51YXJ5IDQsIDE5OTgpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEvNC85OCAgOiBDaGFuZ2VkIHN0cnVjdHVyZWQgb2YgdGhlIEV4YW1wbGVzIGRpcmVjdG9yeSB0byBiZSBtb3JlIGZyaWVuZGx5CiAgICAgICAgICB0byBCb3JsYW5kIEMrKy4KCjEvNC85OCAgOiBBZGRlZCB0aGUgZnVuY3Rpb24gTWFrZWZpbGUud2luLmJjIGZvciBjb21waWxpbmcgdGhlIGV4YW1wbGVzCiAgICAgICAgICB1bmRlciBCb3JsYW5kIDUuMi4KCjEvNC85OCAgOiBTbGlnaHQgY2hhbmdlIHRvIHRoZSBwZXJsNSBtb2R1bGUgYW5kIEMrKyBjb21waWxhdGlvbi4gIFRoZQogICAgICAgICAgPG1hdGguaD4gbGlicmFyeSBpcyBub3cgaW5jbHVkZWQgYmVmb3JlIGFueSBQZXJsIGhlYWRlcnMKICAgICAgICAgIGJlY2F1c2UgUGVybCB0aGUgZXh0ZXJuICJDIiBsaW5rYWdlIG9mIG1hdGguaCBzY3Jld3MgYWxvdAogICAgICAgICAgb2YgdGhpbmdzIHVwIChlc3BlY2lhbGx5IG9uIFdpbmRvd3MpLgoKMS8yLzk4ICA6IENoYW5nZSB0byB0aGUgUHl0aG9uIG1vZHVsZSB0aGF0IHJlZHVjZXMgdGhlIG51bWJlciBvZiBjb25zdGFudHMKICAgICAgICAgIGNyZWF0ZWQgYnkgQysrIGNsYXNzZXMsIGluaGVyaXRhbmNlLCBhbmQgc2hhZG93IGNsYXNzZXMuICAgVGhpcwogICAgICAgICAgbW9kaWZpY2F0aW9uIG1heSBpbnRyb2R1Y2UgYSBmZXcgc2xpZ2h0IGluY29tcGF0aWJpbGl0aWVzIGlmCiAgICAgICAgICB5b3UgYXR0ZW1wdCB0byB1c2UgdGhlIG5vbi1zaGFkb3cgY2xhc3MgaW50ZXJmYWNlIHdpdGggc2hhZG93CiAgICAgICAgICBjbGFzc2VzIGVuYWJsZWQuICAgIFBhdGNoIGNvbnRyaWJ1dGVkIGJ5IE1pa2UgUm9tYmVyZy4KCjEvMi85OCAgOiBTdXBwb3J0IGZvciBUY2wgOC4wIG5hbWVzcGFjZXMgaGFzIGJlZW4gYWRkZWQuICAgVGhpcyAqcmVwbGFjZXMqCiAgICAgICAgICB0aGUgb3JpZ2luYWwgU1dJRyBtZWNoYW5pc20gdGhhdCBhc3N1bWVkIFtpbmNyIFRjbF0gbmFtZXNwYWNlcy4KICAgICAgICAgIFRvIHVzZSBuYW1lc3BhY2VzLCBzaW1wbHkgcnVuIFNXSUcgd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnMKCiAgICAgICAgICAgICBzd2lnIC10Y2wgLW5hbWVzcGFjZSAgZm9vLmkKCiAgICAgICAgICAgICAgICAgICAgVGhpcyBwbGFjZXMgZXZlcnl0aGluZyBpbiBhIG5hbWVzcGFjZSB0aGF0IG1hdGNoZXMKICAgICAgICAgICAgICAgICAgICB0aGUgbW9kdWxlIG5hbWUKCiAgICAgICAgICAgICBzd2lnIC10Y2wgLW5hbWVzcGFjZSAtcHJlZml4IGJhciBmb28uaQoKICAgICAgICAgICAgICAgICAgICBUaGlzIHBsYWNlcyBldmVyeXRoaW5nIGluIHRoZSBuYW1lc3BhY2UgJ2JhcicKCiAgICAgICAgICBUaGUgdXNlIG9mIG5hbWVzcGFjZXMgaXMgbmV3IGluIFRjbCA4LjAuICBIb3dldmVyLCB0aGUgd3JhcHBlciBjb2RlCiAgICAgICAgICBnZW5lcmF0ZWQgYnkgU1dJRyB3aWxsIHN0aWxsIHdvcmsgd2l0aCBhbGwgdmVyc2lvbnMgb2YgVGNsIG5ld2VyCiAgICAgICAgICB0aGFuIGFuZCBpbmNsdWRpbmcgVGNsIDcuMy9UazMuNiBldmVuIGlmIHRoZSAtbmFtZXNwYWNlIG9wdGlvbiBpcwogICAgICAgICAgdXNlZC4KCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKICAgICAgICAgIFRoaXMgY2hhbmdlIG1heSBicmVhayBleGlzdGluZyBhcHBsaWNhdGlvbnMgdGhhdCByZWxpZWQgb24gdGhlCiAgICAgICAgICAtcHJlZml4IGFuZCAtbmFtZXNwYWNlIG9wdGlvbnMuCgoxLzIvOTggIDogQWRkZWQgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgdG8gdGhlIFRjbCB3cmFwcGVyIGNvZGUKCiAgICAgICAgICAgICAgICAgU1dJR19uYW1lICAgICAgLSBOYW1lIG9mIHRoZSBTV0lHIG1vZHVsZQogICAgICAgICAgICAgICAgIFNXSUdfcHJlZml4ICAgIC0gUHJlZml4L25hbWVzcGFjZSBhcHBlbmRlZCB0byBjb21tYW5kIG5hbWVzCiAgICAgICAgICAgICAgICAgU1dJR19uYW1lc3BhY2UgLSBOYW1lIG9mIHRoZSBuYW1lc3BhY2UKCiAgICAgICAgICBTV0lHIGxpYnJhcnkgd3JpdGVycyBjYW4gdXNlIHRoZXNlIHRvIHRoZWlyIGFkdmFudGFnZXMuCgoxLzIvOTggIDogRml4ZWQgYSBidWcgaW4gdGhlIFRjbDggbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGNyZWF0aW9uIG9mCiAgICAgICAgICBwb2ludGVyIGNvbnN0YW50cyAodGhlIGZ1bmN0aW9uIFNXSUdfTWFrZVB0ciB3YXMgbWlzc2luZyBmcm9tCiAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlKS4KCjEvMi85OCAgOiBBZGRlZCB0aGUgY29uc3RoYXNoLmkgbGlicmFyeSBmaWxlIHRvIHRoZSBUY2wgYW5kIFRjbDggbW9kdWxlcy4KCjEvMS85OCAgOiBDaGFuZ2VkIGFuZCBjbGVhbmVkIHVwIHRoZSBQeXRob24gdHlwZW1hcHMuaSBmaWxlLiAgIFRoZSBmb2xsb3dpbmcKICAgICAgICAgIHNpZ25pZmljYW50IGNoYW5nZXMgd2VyZSBtYWRlIDoKCiAgICAgICAgICAgICAgICAxLiAgVGhlIE9VVFBVVCB0eXBlbWFwIG5vdyByZXR1cm5zIFB5dGhvbiB0dXBsZXMgaW5zdGVhZCBvZgogICAgICAgICAgICAgICAgICAgIGxpc3RzLiAgIExpc3RzIGNhbiBiZSByZXR1cm5lZCBhcyBiZWZvcmUgYnkgdXNpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgTF9PVVRQVVQgdHlwZS4gICAgSWYgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHZlcnNpb25zCiAgICAgICAgICAgICAgICAgICAgaXMgbmVlZGVkLCBydW4gU1dJRyB3aXRoIHRoZSAtRE9VVFBVVF9MSVNUIG9wdGlvbi4KCiAgICAgICAgICAgICAgICAyLiAgVGhlIEJPVEggdHlwZW1hcCBoYXMgYmVlbiByZW5hbWVkIHRvIElOT1VULiAgRm9yIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgIGNvbXBhdGliaWxpdHksIHRoZSAiQk9USCIgbWV0aG9kIHN0aWxsIGV4aXN0cyBob3dldmVyLgoKICAgICAgICAgICAgICAgIDMuICBPdXRwdXQgdHlwZW1hcHMgbm93IGdlbmVyYXRlIGxlc3MgY29kZSB0aGFuIGJlZm9yZS4KCiAgICAgICAgICBDaGFuZ2VzIHRvIHR5cGVtYXBzLmkgbWF5IGJyZWFrIGV4aXN0aW5nIFB5dGhvbiBzY3JpcHRzIHRoYXQgYXNzdW1lCiAgICAgICAgICBvdXRwdXQgaW4gdGhlIGZvcm0gb2YgYSBsaXN0LgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgoxMi8zMS85NzogRml4ZWQgbG9uZyBvdmVyZHVlIHByb2JsZW1zIHdpdGggdGhlIHRlc3Rpbmcgc2NyaXB0cyBhbmQgY2VydGFpbgogICAgICAgICAgbWFrZWZpbGVzIHRoYXQgcmVxdWlyZWQgdGhlIHVzZSBvZiB0aGUgYmFzaCBzaGVsbC4gICBFdmVyeXRoaW5nIHNob3VsZAogICAgICAgICAgd29yayBwcm9wZXJseSB3aXRoIHRoZSBzdGFuZGFyZCBCb3VybmUgc2hlbGwgKHNoKSBub3cuCgoxMi8zMS85NzogTW9kaWZpZWQgdHlwZW1hcHMgdG8gYWxsb3cgJGJhc2V0eXBlIGFzIGEgdmFsaWQgbG9jYWwgdmFyaWFibGUuCiAgICAgICAgICBUaGlzIGFsbG93cyBmb3IgYWxsIHNvcnRzIG9mIGJpemFycmUgaGFja2lzaCB0eXBlbWFwcyB0aGF0CiAgICAgICAgICBkbyBjb29sIHRoaW5ncy4gICBQYXRjaCBjb250cmlidXRlZCBieSBEb21pbmlxdWUgRHVtb250LgoKMTIvMzEvOTc6IFN3aXRjaGVkIGFjY2Vzc29yIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIG1lbWJlciBkYXRhIHRvCiAgICAgICAgICBDIHByZXByb2Nlc3NvciBtYWNyb3MgKGV4Y2VwdCBpbiBjYXNlcyBpbnZvbHZpbmcgdHlwZW1hcHMKICAgICAgICAgIG9yIGNoYXIgKikuCgoxMi8zMS85NzogRml4ZWQgYSBidWcgcmVsYXRlZCB0byBDKysgbWVtYmVyIGRhdGEgaW52b2x2aW5nIHJlZmVyZW5jZXMuCgoxMi8zMS85NzogQ2hhbmdlZCBhY2Nlc3NvciBmdW5jdGlvbnMgZm9yIEMrKyBtZW1iZXIgZnVuY3Rpb25zIHRvCiAgICAgICAgICBwcmVwcm9jZXNzb3IgbWFjcm9zLiAgIFRoaXMgY2xlYW5zIHVwIHRoZSB3cmFwcGVyIGNvZGUKICAgICAgICAgIGFuZCByZXN1bHRzIGluIGZld2VyIGZ1bmN0aW9uIGRlZmluaXRpb25zLgoKMTIvMzEvOTc6IENoYW5nZWQgdGhlIGRlZmF1bHQgQyBjb25zdHJ1Y3RvciB0byB1c2UgY2FsbG9jKCkgaW5zdGVhZAogICAgICAgICAgb2YgbWFsbG9jKCkKCjEyLzMwLzk3OiBDaGFuZ2VkIHRoZSBjcmVhdGlvbiBvZiBjb25zdGFudHMgaW4gdGhlIFBlcmw1IG1vZHVsZS4KICAgICAgICAgIEZvciBhbGwgcHJhY3RpY2FsIHB1cnBvc2VzLCB0aGV5IHNob3VsZCB3b3JrIGluIGV4YWN0bHkgdGhlCiAgICAgICAgICBzYW1lIHdheSBhcyBiZWZvcmUgZXhjZXB0IHRoYXQgdGhleSBub3cgcmVxdWlyZSBtdWNoIGxlc3MKICAgICAgICAgIHdyYXBwZXIgY29kZS4gICBNb2R1bGVzIGNvbnRhaW5pbmcgbGFyZ2UgbnVtYmVycyBvZgogICAgICAgICAgY29uc3RhbnRzIG1heSBzZWUgZ3JlYXRlciB0aGFuIGEgNTAlIHJlZHVjdGlvbiBpbiB3cmFwcGVyCiAgICAgICAgICBjb2RlIHNpemUuCgoxMi8zMC85NzogTW9kaWZpZWQgdGhlIFB5dGhvbiBtb2R1bGUgdG8gYmUgbW9yZSBpbnRlbGxpZ2VudCBhYm91dCB0aGUKICAgICAgICAgIGNyZWF0aW9uIG9mIGNvbnN0YW50cy4gIFNXSUcgbm8gbG9uZ2VyIGdlbmVyYXRlcyByZWR1bmRhbnQKICAgICAgICAgIGdsb2JhbCB2YXJpYWJsZXMgYW5kIHRoZSBzaXplIG9mIHRoZSBtb2R1bGUgaW5pdGlhbGl6YXRpb24KICAgICAgICAgIGZ1bmN0aW9uIHNob3VsZCBiZSByZWR1Y2VkLiAgIChNYW55IHRoYW5rcyB0byBKaW0gRnVsdG9uKS4KCjEyLzI5Lzk3OiBGaXhlZCBhIGJ1ZyBpbiBDKysgY29kZSBnZW5lcmF0aW9uIHJlbGF0ZWQgdG8gbWVtYmVyIGZ1bmN0aW9ucywKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzLCBhbmQgcmVmZXJlbmNlcy4KCjEyLzI5Lzk3OiBGaXhlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBhIGZldyBtYWtlZmlsZXMgdG8gc3VwcG9ydCBQeXRob24gMS41CgoxMi8yOS85NzogQWRkZWQgJ2VtYmVkMTUuaScgbGlicmFyeSBmaWxlLiAgVGhpcyBmaWxlIHNob3VsZCBiZSB1c2VkIHRvCiAgICAgICAgICBzdGF0aWNhbGx5IGxpbmsgdmVyc2lvbnMgb2YgUHl0aG9uIDEuNS4gICAgVG8gbWFrZSBpdCB0aGUgZGVmYXVsdCwKICAgICAgICAgIHNpbXBseSBjb3B5ICdzd2lnX2xpYi9weXRob24vZW1iZWQxNS5pJyB0byAnc3dpZ19saWIvcHl0aG9uL2VtYmVkLmknCgpWZXJzaW9uIDEuMSBQYXRjaCAzIChOb3ZlbWJlciAyNCwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2l0aCBzaGFkb3cgY2xhc3NlcyBhbmQKICAgICAgICAgIHN0YXRpYyBjbGFzcyBmdW5jdGlvbnMgdGhhdCByZXR1cm4gY2xhc3MgaW5zdGFuY2VzLgogICAgICAgICAgTm90ZSA6IFRoZSBmaXggZm9yIHRoaXMgYnVnIHJlcXVpcmVzIGEgc2xpZ2h0IHJlc3RydWN0dXJpbmcgb2YKICAgICAgICAgIG9mIHRoZSAucG0gZmlsZXMgY3JlYXRlZCBieSBTV0lHLgoKMTEvMjMvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBUY2wvVGNsOCBtb2R1bGVzIHJlbGF0ZWQgdG8gdmFyaWFibGUgbGlua2luZwogICAgICAgICAgb2YgY2hhcmFjdGVyIGFycmF5cy4gIElmIHlvdSBkZWNsYXJlZCBhIGdsb2JhbCB2YXJpYWJsZSAnY2hhciBmb29bMTBdJywKICAgICAgICAgIHRoZSBnZW5lcmF0ZWQgd3JhcHBlciBjb2RlIHdvdWxkIGVpdGhlciBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdAogICAgICAgICAgaW1tZWRpYXRlbHkgdXBvbiBsb2FkaW5nIG9yIHdlaXJkIG1lbW9yeSBjb3JydXB0aW9uIGVsc2V3aGVyZS4KICAgICAgICAgIFRoaXMgc2hvdWxkIG5vdyBiZSBmaXhlZCBhbHRob3VnaCBjaGFyYWN0ZXIgYXJyYXlzIGNhbiBvbmx5IGJlCiAgICAgICAgICByZWFkLW9ubHkuCgoxMS8yMy85NzogRml4ZWQgYSBidWcgd2l0aCB0aGUgJWltcG9ydCBkaXJlY3RpdmUgdGhhdCBjYXVzZWQgaXQgdG8KICAgICAgICAgIGZhaWwgaWYgZmlsZXMgd2VyZSBpbXBvcnRlZCBmcm9tIGRpcmVjdG9yaWVzIG90aGVyIHRoYW4KICAgICAgICAgIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgoKMTEvMjMvOTc6IEZpeGVkIGluY29ycmVjdCBkaWFnbm9zdGljIG1lc3NhZ2UgaW4gdGhlIEFTQ0lJIGRvY3VtZW50YXRpb24KICAgICAgICAgIG1vZHVsZS4KCjExLzIzLzk3OiBDaGFuZ2VkIHRoZSBiZWhhdmlvciBvZiB0aGUgLW8gb3B0aW9uIHdoZW4gdXNlZCB3aXRoIHNoYWRvdwogICAgICAgICAgY2xhc3Nlcy4gSWYgLW8gd2FzIHVzZWQgdG8gc3BlY2lmeSBib3RoIHRoZSBwYXRobmFtZSBhbmQgZmlsZW5hbWUKICAgICAgICAgIG9mIFNXSUcncyBvdXRwdXQgc3VjaCBhcwoKICAgICAgICAgICAgICAgICBzd2lnIC1vIC9ob21lL3N3aWcvd3JhcHBlci5jIC1zaGFkb3cgLXBlcmw1IGZvby5pCgogICAgICAgICAgVGhlIHdyYXBwZXIgY29kZSB3b3VsZCBiZSBwbGFjZWQgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggLW8sCiAgICAgICAgICBidXQgdGhlIC5wbSBmaWxlIGFuZCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlIHBsYWNlZCBpbiB0aGUKICAgICAgICAgIGRpcmVjdG9yeSB3aGVyZSBTV0lHIHdhcyBydW4uICAgTm93LCB0aGVzZSBmaWxlcyBhcmUgcGxhY2VkCiAgICAgICAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkgYXMgdGhlIGZpbGUgc3BlY2lmaWVkIHdpdGggdGhlIC1vIG9wdGlvbi4KICAgICAgICAgIFRoaXMgY2hhbmdlIGlzIGFsc28gbmVlZGVkIGZvciBwcm9wZXIgb3BlcmF0aW9uIG9uIHRoZQogICAgICAgICAgTWFjaW50b3NoLgoKMTEvMjMvOTc6IEFkZGVkIGEgJ3RoaXMoKScgbWV0aG9kIHRvIFBlcmw1IHNoYWRvdyBjbGFzc2VzLiAgIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIHJldHVybiB0aGUgbm9ybWFsIHBvaW50ZXIgdmFsdWUgZnJvbSBhIHNoYWRvdwogICAgICAgICAgY2xhc3MgdGhhdCBpcyByZXByZXNlbnRlZCBhcyBhIHRpZWQgaGFzaC4gICBUbyB1c2UganVzdAogICAgICAgICAgaW52b2tlIGFzIGEgbWV0aG9kIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgICRsID0gbmV3IExpc3Q7ICAgICAgICMgQ3JlYXRlIGFuIG9iamVjdAogICAgICAgICAgICAgICRwdHIgPSAkbC0+dGhpcygpOyAgICMgR2V0IHRoZSBub3JtYWwgcG9pbnRlciB2YWx1ZQoKICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjExLzIzLzk3OiBGaXhlZCB0aGUgVGNsIDggcG9pbnRlci5pIGxpYnJhcnkgZmlsZSAod2hpY2ggd2FzIGNvbXBsZXRlbHkKICAgICAgICAgIGJyb2tlbiBpbiAxLjFwMikuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIFBlcmw1IHR5cGUtY2hlY2tlciB0byBmaXggYSBmZXcgcHJvYmxlbXMKICAgICAgICAgIHdpdGggZ2xvYmFsIHZhcmlhYmxlcyBvZiBwb2ludGVyIHR5cGVzIGFuZCB0byBhbGxvdwogICAgICAgICAgdGllZCBoYXNoZXMgdG8gYmUgdXNlZCBpbnRlcmNoYW5nYWJseSB3aXRoIG5vcm1hbAogICAgICAgICAgcG9pbnRlciB2YWx1ZXMuCgoxMS8yMy85NzogTW9kaWZpZWQgdGhlIHR5cGVtYXAgbWVjaGFuaXNtIHRvIGFsbG93IG91dHB1dAogICAgICAgICAgdHlwZW1hcHMgb2YgdHlwZSAndm9pZCcuICAgVGhlc2Ugd2VyZSBpZ25vcmVkIHByZXZpb3VzbHksCiAgICAgICAgICBidXQgbm93IGlmIHlvdSBzcGVjaWZ5LAoKICAgICAgICAgICAgICAgICV0eXBlbWFwKGxhbmcsb3V0KSB2b2lkIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiByZXR1cm4gYSB2b2lkIC4uLgogICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFlvdSBjYW4gY2hhbmdlIG9yIGFzc2lnbiBhIHJldHVybiB2YWx1ZSB0byB0aGUgZnVuY3Rpb24uCgoxMS8yMy85NzogRml4ZWQgcHJvY2Vzc2luZyBvZiAnYm9vbCcgZGF0YXR5cGVzIGluIHRoZSBQeXRob24gbW9kdWxlLgoKMTEvMjMvOTc6IEZpeGVkIG1pbm9yIHBhcnNpbmcgZXJyb3Igd2l0aCBDKysgaW5pdGlhbGl6ZXJzLiBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgY2xhc3MgQiA6IHB1YmxpYyBBIHsKICAgICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgQigpIDogQSgpIHsgLi4uIH07CiAgICAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgfQoKMTEvMjMvOTc6IEZpeGVkIHRoZSBUY2w4IG1vZHVsZSBzbyB0aGF0IEMgZnVuY3Rpb25zIHRoYXQgY2FsbCBiYWNrIGludG8KICAgICAgICAgIFRjbCBkb24ndCBjb3JydXB0IHRoZSByZXR1cm4gcmVzdWx0IG9iamVjdCAoU1dJRyB3YXMgZ2F0aGVyaW5nCiAgICAgICAgICB0aGUgcmVzdWx0IG9iamVjdCB0b28gZWFybHkgd2hpY2ggbGVhZHMgdG8gcHJvYmxlbXMgaWYgc3Vic2VxdWVudAogICAgICAgICAgVGNsIGNhbGxzIGFyZSBtYWRlKS4KCjExLzIzLzk3OiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgaW4gdGhlIFB5dGhvbiBtb2R1bGUgd2hlbiB0d28gb3IKICAgICAgICAgIG1vcmUgb3V0cHV0IHBhcmFtZXRlcnMgd2VyZSB1c2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudHMgb2YgYQogICAgICAgICAgZnVuY3Rpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICVpbmNsdWRlIHR5cGVtYXBzLmkKICAgICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKk9VVFBVVCwgZG91YmxlICpPVVRQVVQsIGRvdWJsZSBhKTsKCiAgICAgICAgICBQcmV2aW91c2x5LCBkb2luZyB0aGlzIHJlc3VsdGVkIGluIHRoZSBjcmVhdGlvbiBvZiBhbgogICAgICAgICAgZXh0cmFuZW91cyBjb21tYSBpbiB0aGUgb3V0cHV0LCByZXN1bHRpbmcgaW4gYSBDIHN5bnRheCBlcnJvci4KCjExLzIyLzk3OiBGaXhlZCBhIGJ1ZyB3aGVuIHRlbXBsYXRlIGhhbmRsaW5nIHRoYXQgd2FzIHN0cmlwcGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICBhcm91bmQgbmVzdGVkIHRlbXBsYXRlcy4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIEZvbzxCYXI8ZG91YmxlPiA+CgogICAgICAgICAgd2FzIGdldHRpbmcgbXVuZ2VkIGludG8gRm9vPEJhcj4+IHdoaWNoIGlzIGEgc3ludGF4IGVycm9yIGluCiAgICAgICAgICBpbiB0aGUgQysrIGNvbXBpbGVyLgoKMTEvMjIvOTc6IEZpeGVkIGJ1Z3MgaW4gdGhlIEJvcmxhbmQgQysrIG1ha2VmaWxlcy4KCjExLzIyLzk3OiBGaXhlZCBtZW1vcnkgY29ycnVwdGlvbiBidWcgd2hlbiBwcm9jZXNzaW5nIGludGVnZXIKICAgICAgICAgIGFyZ3VtZW50cyBpbiBUY2w4IG1vZHVsZS4KCjExLzIxLzk3OiBGaXhlZCBhIGJ1ZyBpbiB0aGUgUnVudGltZS9NYWtlZmlsZSByZWxhdGVkIHRvIFRjbCA4LgoKMTEvMjEvOTc6IEZpeGVkIGEgYnVnIHdpdGggdGhlICVuZXcgZGlyZWN0aXZlIGFuZCBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE5vIGxvbmdlciBnZW5lcmF0ZXMgYSBwZXJsIHN5bnRheCBlcnJvci4KCjExLzkvOTcgOiBDaGFuZ2VkIGEgc3RybmNweSgpIHRvIHN0cmNweSgpIGluIHRoZSBwb2ludGVyIHR5cGUtY2hlY2tlci4KICAgICAgICAgIFRoaXMgcmVzdWx0cyBpbiBhIHN1YnN0YW50aWFsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IGluCiAgICAgICAgICB0eXBlLWNoZWNraW5nLgoKMTAvMjkvOTc6IEZpeGVkIGEgYnVnIGluIHRoZSBjb2RlIGdlbmVyYXRpb24gb2YgZGVmYXVsdCBhcmd1bWVudHMgYW5kCiAgICAgICAgICB1c2VyLWRlZmluZWQgdHlwZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgIHZvaWQgZm9vKFZlY3RvciBhLCBWZWN0b3IgYiA9IGQpOwoKICAgICAgICAgIHNob3VsZCBub3cgd29yayBwcm9wZXJseS4KClZlcnNpb24gMS4xIFBhdGNoIDIgKFNlcHRlbWJlciA0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjkvNC85NyAgOiBGaXhlZCBwcm9ibGVtIHdpdGggaGFuZGxpbmcgb2YgdmlydHVhbCBmdW5jdGlvbnMgdGhhdAogICAgICAgICAgd2FzIGludHJvZHVjZWQgYnkgc29tZSBjaGFuZ2VzIGluIHRoZSBDKysgbW9kdWxlLgoKVmVyc2lvbiAxLjEgUGF0Y2ggMSAoQXVndXN0IDI3LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgo4LzI2Lzk3IDogRml4ZWQgY29tcGlsYXRpb24gYW5kIHJ1bi10aW1lIGJ1Z3Mgd2l0aCBUY2wgOC4wIGZpbmFsLgoKOC8yMS85NyA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2l0aCBhcnJheXMgYXBwZWFyaW5nIGFzIGFyZ3VtZW50cwogICAgICAgICAgdG8gQysrIG1lbWJlciBmdW5jdGlvbnMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgQmFyKGludCBhWzIwXVsyMF0pOwogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB1c2luZyBhcnJheXMgd2l0aCBhZGRlZCBtZXRob2RzCiAgICAgICAgICBob3dldmVyLgoKOC8yMC85NyA6IEZpeGVkIGEgYnVnIHdpdGggZ2VuZXJhdGluZyB0aGUgY29kZSBmb3IgYWRkZWQgbWV0aG9kcwogICAgICAgICAgaW52b2x2aW5nIHBhc3MtYnktdmFsdWUuCgo4LzE5Lzk3IDogTW9kaWZpZWQgdGhlIHR5cGVtYXBwZXIgdG8gc3Vic3RpdHV0ZSB0aGUgJyRhcmcnIHZhbHVlCiAgICAgICAgICB3aGVuIGRlY2xhcmluZyBsb2NhbCB2YXJpYWJsZXMuICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSAqIChkb3VibGUgdGVtcF8kYXJnKSB7CiAgICAgICAgICAgICAgICAgICAgLi4uIGRvIHNvbWV0aGluZyAuLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV2hlbiBhcHBsaWVkIHRvIGEgcmVhbCBmdW5jdGlvbiBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICB2b2lkIGZvbyhkb3VibGUgKmEsIGRvdWJsZSAqYiwgZG91YmxlICpyZXN1bHQpOwoKICAgICAgICAgIHRocmVlIGxvY2FsIHZhcmlhYmxlcyB3aWxsIGJlIGNyZWF0ZWQgYXMgZm9sbG93cyA6CgogICAgICAgICAgICAgIGRvdWJsZSB0ZW1wX2E7CiAgICAgICAgICAgICAgZG91YmxlIHRlbXBfYjsKICAgICAgICAgICAgICBkb3VibGUgdGVtcF9yZXN1bHQ7CgogICAgICAgICAgVGhpcyBjYW4gYmUgdXNlZCB3aGVuIHdyaXRpbmcgbXVsdGlwbGUgdHlwZW1hcHMgdGhhdCBuZWVkCiAgICAgICAgICB0byBhY2Nlc3MgdGhlIHNhbWUgbG9jYWwgdmFyaWFibGVzLgoKCjcvMjcvOTcgOiBGaXhlZCBhIHZhcmlldHkgb2YgcHJvYmxlbXMgd2l0aCB0aGUgJWFwcGx5IGRpcmVjdGl2ZSBhbmQgYXJyYXlzLgogICAgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlcyBvZiBkZWNsYXJhdGlvbnMgc2hvdWxkIG5vdyB3b3JrIDoKCiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgW0FOWV0geyBSZWFsIFtBTlldIH07CiAgICAgICAgICAgICAgICVhcHBseSBkb3VibGUgWzRdIHsgZG91YmxlIFsxMF0gfTsKCiAgICAgICAgICBBIGdlbmVyaWMgdmVyc2lvbiBvZiBhcHBseSBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJWFwcGx5IGRvdWJsZSB7IFJlYWwgfTsKCiAgICAgICAgICBzaG91bGQgbm93IHdvcmstLWV2ZW4gaWYgYXJyYXlzIGludm9sdmluZyBkb3VibGVzIGFuZCBSZWFscyBhcmUKICAgICAgICAgIHVzZWQgbGF0ZXIuCgo3LzI3Lzk3IDogQ2hhbmdlZCB3YXJuaW5nIG1lc3NhZ2UgYWJvdXQgIkFycmF5IFggaGFzIGJlZW4gY29udmVydGVkIHRvIFkiIHRvCiAgICAgICAgICBvbmx5IGFwcGVhciBpZiBydW5uaW5nIFNXSUcgaW4gdmVyYm9zZSBtb2RlLgoKNy8yNy85NyA6IEFkZGVkIHRoZSB2YXJpYWJsZXMgJHBhcm1uYW1lIGFuZCAkYmFzZW1hbmdsZSB0byB0aGUgdHlwZW1hcAogICAgICAgICAgZ2VuZXJhdG9yLiAgICAkcGFybW5hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB1c2VkCiAgICAgICAgICB3aGVuIHRoZSB0eXBlbWFwIHdhcyBtYXRjaGVkLiAgSXQgbWF5IGJlICIiIGlmIG5vIHBhcmFtZXRlcgogICAgICAgICAgd2FzIHVzZWQuICAgJGJhc2VtYW5nbGUgaXMgYSBtYW5nbGVkIHZlcnNpb24gb2YgdGhlIGJhc2UKICAgICAgICAgIGRhdGF0eXBlLiAgICBTb21ldGltZXMgdXNlZCBmb3IgYXJyYXkgaGFuZGxpbmcuCgo3LzI3Lzk3IDogQ2hhbmdlZCB0aGUgYmVoYXZpb3Igb2Ygb3V0cHV0IGFyZ3VtZW50cyB3aXRoIFB5dGhvbiBzaGFkb3cgY2xhc3Nlcy4KICAgICAgICAgIE9yaWdpbmFsbHksIGlmIGEgZnVuY3Rpb24gcmV0dXJuZWQgYW4gb2JqZWN0ICdGb28nLCB0aGUgc2hhZG93IGNsYXNzCiAgICAgICAgICBtZWNoYW5pc20gd291bGQgY3JlYXRlIGNvZGUgbGlrZSB0aGlzIDoKCiAgICAgICAgICAgICAgICBkZWYgcmV0dXJuX2ZvbygpOgogICAgICAgICAgICAgICAgICAgICAgdmFsID0gRm9vUHRyKHNoYWRvd2MucmV0dXJuX2ZvbygpKQogICAgICAgICAgICAgICAgICAgICAgdmFsLnRoaXMgPSAxCiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsCgogICAgICAgICAgVGhlIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgdHlwZW1hcHMgYWxsb3cgYSB1c2VyIHRvIHJlZGVmaW5lCiAgICAgICAgICB0aGUgb3V0cHV0IGJlaGF2aW9yIG9mIGEgZnVuY3Rpb24tLWFzIGEgcmVzdWx0LCB3ZSBjYW4gbm8gbG9uZ2VyCiAgICAgICAgICBtYWtlIGFueSBhc3N1bXB0aW9ucyBhYm91dCB0aGUgcmV0dXJuIHR5cGUgYmVpbmcgYSBwb2ludGVyIG9yCiAgICAgICAgICBldmVuIGJlaW5nIGEgc2luZ2xlIHZhbHVlIGZvciB0aGF0IG1hdHRlciAoaXQgY291bGQgYmUgYSBsaXN0LAogICAgICAgICAgdHVwbGUsIGV0Yy4uLikuICAgSWYgU1dJRyBkZXRlY3RzIHRoZSB1c2Ugb2Ygb3V0cHV0IHR5cGVtYXBzCiAgICAgICAgICAoZWl0aGVyICJvdXQiIG9yICJhcmdvdXQiKSBpdCByZXR1cm5zIHRoZSByZXN1bHQgdW5tb2RpZmllZCBsaWtlCiAgICAgICAgICB0aGlzIDoKCiAgICAgICAgICAgICAgICBkZWYgcmV0dXJuX2ZvbygpOgogICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2hhZG93Yy5yZXR1cm5fZm9vKCkKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWwKCiAgICAgICAgICBJbiB0aGlzIGNhc2UsIGl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkbwogICAgICAgICAgd2l0aCB0aGUgcmV0dXJuIHZhbHVlIChpbmNsdWRpbmcgdGhlIHBvc3NpYmlsaXR5IG9mIGNvbnZlcnRpbmcgaXQKICAgICAgICAgIGludG8gYSBQeXRob24gY2xhc3MpLgoKNy8yNi85NyA6IEZpeGVkIGEgcGFyc2luZyBwcm9ibGVtIHdpdGggdHlwZXMgbGlrZSAndW5zaWduZWQgbG9uZyBpbnQnLAogICAgICAgICAgJ3Vuc2lnbmVkIHNob3J0IGludCcsIGV0Yy4uLgoKNy8yNC85NyA6IE1pbm9yIGJ1ZyBmaXggdG8gVGNsIDggbW9kdWxlIHRvIHBhcnNlIGVudW1zIHByb3Blcmx5LiAgQWxzbwogICAgICAgICAgZml4ZWQgYSBtZW1vcnkgY29ycnVwdGlvbiBwcm9ibGVtIGluIHRoZSB0eXBlLWNoZWNrZXIuCiAgICAgICAgICAocGF0Y2ggY29udHJpYnV0ZWQgYnkgSGVucnkgUm93bGV5LgoKNy8yNC85NyA6IEFkZGVkIFB5dGhvbi10dXBsZSB0eXBlbWFwcyBjb250cmlidXRlZCBieSBSb2JpbiBEdW5uLgoKNy8yNC85NyA6IEluY29ycG9yYXRlZCBzb21lIGNoYW5nZXMgdG8gdGhlIFB5dGhvbiBtb2R1bGUgaW4gc3VwcG9ydCBvZgogICAgICAgICAgTWFyayBIYW1tb25kJ3MgQ09NIHN1cHBvcnQuICBJJ20gbm90IGVudGlyZWx5IHN1cmUgdGhleQogICAgICAgICAgd29yayB5ZXQgaG93ZXZlci4gIE5lZWRzIGRvY3VtZW50YXRpb24gYW5kIHRlc3RpbmcuCgo3LzI0Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2hlbiBzdHJ1Y3R1cmVzIGhhZCBhcnJheSBtZW1iZXJzCiAgICAgICAgICBhbmQgdHlwZW1hcHMgd2VyZSB1c2VkLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAldHlwZW1hcChtZW1iZXJpbikgZG91YmxlIFsyMF1bMjBdIHsKICAgICAgICAgICAgICAgICAgICAgIC4uLiBnZXQgYSBkb3VibGUgWzIwXVsyMF0gLi4uCiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0cnVjdCBGb28gewogICAgICAgICAgICAgICAgICAgICBkb3VibGUgYVsyMF1bMjBdOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICBPcmlnaW5hbGx5LCB0aGlzIHdvdWxkIGdlbmVyYXRlIGEgY29tcGlsZXItdHlwZSBlcnJvciB3aGVuCiAgICAgICAgICB0aGUgd3JhcHBlciBjb2RlIHdhcyBjb21waWxlZC4gICBOb3csIGEgaGVscGVyIGZ1bmN0aW9uIGxpa2UKICAgICAgICAgIHRoaXMgaXMgZ2VuZXJhdGVkIDoKCiAgICAgICAgICAgICAgICBkb3VibGUgKkZvb19hX3NldChGb28gKmEsIGRvdWJsZSB2YWxbMjBdWzIwXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLi4uIG1lbWJlcmluIHR5cGVtYXAgaGVyZSAuLi4KICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZG91YmxlICopIHZhbDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBXaGVuIHdyaXRpbmcgdHlwZW1hcHMsIG9uZSBjYW4gYXNzdW1lIHRoYXQgdGhlIHNvdXJjZSB2YXJpYWJsZQogICAgICAgICAgaXMgYW4gYXJyYXkgb2YgdGhlICpzYW1lKiB0eXBlIGFzIHRoZSBzdHJ1Y3R1cmUgbWVtYmVyLiBUaGlzCiAgICAgICAgICBtYXkgYnJlYWsgc29tZSBjb2RlcyB0aGF0IG1hbmFnZWQgdG8gd29yayBhcm91bmQgdGhlIGFycmF5IGJ1Zy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNy8xMy85NyA6IEZpeGVkIGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbiB1c2luZyBDIGdsb2JhbCB2YXJpYWJsZXMgdGhhdAogICAgICAgICAgYXJlIHBvaW50ZXJzLiAgV2hlbiB1c2VkIGluIGZ1bmN0aW9uIGNhbGxzIGFuZCBvdGhlciBvcGVyYXRpb25zLAogICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBwb2ludGVyIHdvdWxkIGJlIGludmFsaWQtLS1jYXVzaW5nIGNvcmUKICAgICAgICAgIGR1bXBzIGFuZCBvdGhlciBwcm9ibGVtcy4gIFNXSUcgaW1wbGVtZW50cyBnbG9iYWwgdmFyaWFibGVzCiAgICAgICAgICB1c2luZyBQZXJsIG1hZ2ljIHZhcmlhYmxlcy4gIEFzIGl0IHR1cm5zIG91dCwgdGhlIGVycm9yCiAgICAgICAgICB3YXMgY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHBvaW50ZXItZXh0cmFjdGlvbiBjb2RlCiAgICAgICAgICB3YXMgc29tZWhvdyBieXBhc3NpbmcgdGhlIHByb2NlZHVyZSB1c2VkIHRvIHJlc29sdmUgbWFnaWNhbAogICAgICAgICAgdmFyaWFibGVzIChoZW5jZSwgbGVhdmluZyB0aGUgdmFsdWUgdW5kZWZpbmVkKS4gIFRvIGZpeAogICAgICAgICAgdGhlIHByb2JsZW0sIFNXSUcgbm93IGV4cGxpY2l0bHkgcmVzb2x2ZXMgbWFnaWMgYmVmb3JlCiAgICAgICAgICBleHRyYWN0aW5nIHBvaW50ZXIgdmFsdWVzLgoKNy8xMi85NyA6IEVsaW1pbmF0ZWQgdGhlIGxhc3QgcmVtbmFudHMgb2YgZnJlZSgpIGFuZCBtYWxsb2MoKSBmcm9tCiAgICAgICAgICB0aGUgU1dJRyBjb21waWxlci4KCjcvMTIvOTcgOiBGaXhlZCBwYXJzaW5nIHByb2JsZW1zIHdpdGggdHlwZW1hcHMgaW52b2x2aW5nIGFycmF5cyBhbmQKICAgICAgICAgIHRlbXBvcmFyeSB2YXJpYWJsZXMgb2YgYXJyYXlzLiAgICBBbHNvIG1hZGUgaXQgcG9zc2libGUgZm9yCiAgICAgICAgICBTV0lHIHRvIGhhbmRsZSB0eXBlbWFwcyBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgICAldHlwZW1hcChpbikgZG91YmxlIFtBTlldIChkb3VibGUgdGVtcFskZGltMF0pIHsKCQkgICAgICAuLi4gc3RvcmUgZGF0YSBpbiB0ZW1wWyRkaW0wXSAuLi4KICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgTm90IG9ubHkgZG9lcyB0aGlzIHR5cGVtYXAgbWF0Y2ggYW55IGRvdWJsZSBbXSBhcnJheSwgaXQKICAgICAgICAgIGNyZWF0ZXMgYSBsb2NhbCB2YXJpYWJsZSB3aXRoIHByZWNpc2VseSB0aGUgcmlnaHQgZGltZW5zaW9ucy4KICAgICAgICAgIChpZS4gJGRpbTAgZ2V0cyBmaWxsZWQgaW4gd2l0aCB0aGUgcmVhbCBudW1iZXIgb2YgZGltZW5zaW9ucykuCiAgICAgICAgICBPZiBjb3Vyc2UsIG9mZiB0aGUgcmVjb3JkLCB0aGlzIHdpbGwgYmUgYSB3YXkgdG8gYWRkIG1vcmUKICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgdG8gdGhlIHR5cGVtYXBzLmkgbGlicmFyaWVzLgoKNy85Lzk3ICA6IEZpeGVkIHNvbWUgcHJvYmxlbXMgd2l0aCBQZXJsNSwgc3RhdGljIGxpbmtpbmcsIGFuZCBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICBXaGVuIHN0YXRpY2FsbHkgbGlua2luZyBtdWx0aXBsZSBtb2R1bGVzIHRvZ2V0aGVyLCB3cml0ZQogICAgICAgICAgYSB0b3AtbGV2ZWwgaW50ZXJmYWNlIGZpbGUgbGlrZSB0aGlzIHdoZW4gc2hhZG93IGNsYXNzZXMgYXJlIG5vdAogICAgICAgICAgdXNlZCA6CgogICAgICAgICAgICAgICAgICVtb2R1bGUgc3dpZywgZm9vLCBiYXIsIGdsb2I7CiAgICAgICAgICAgICAgICAgJWluY2x1ZGUgcGVybG1haW4uaQoKICAgICAgICAgIFdoZW4gc2hhZG93IGNsYXNzZXMgYXJlIHVzZWQsIHRoZSBtb2R1bGUgbmFtZXMgaGF2ZSBhbiBleHRyYSAnYycKICAgICAgICAgIGFwcGVuZGVkIHNvIGl0IHNob3VsZCByZWFkIGFzIDoKCiAgICAgICAgICAgICAgICAgJW1vZHVsZSBzd2lnLCBmb29jLCBiYXJjLCBnbG9iYzsKICAgICAgICAgICAgICAgICAlaW5jbHVkZSBwZXJsbWFpbi5pCgogICAgICAgICAgV2hlbiBsaW5raW5nIG11bHRpcGxlIG1vZHVsZXMsIGNvbnNpZGVyIHVzaW5nIHRoZSBTV0lHIHJ1bnRpbWUKICAgICAgICAgIGxpYnJhcnkuCgo3LzgvOTcgIDogSW5jb3Jwb3JhdGVkIGZpeGVkIHZlcnNpb25zIG9mIHRoZSBCb3JsYW5kIEMrKyBNYWtlZmlsZXMuCgo3LzgvOTcgIDogRmlyc3QgY3V0IGF0IHRyeWluZyB0byBlbGltaW5hdGUgZXhjZXNzaXZlIGNvbXBpbGVyIHdhcm5pbmdzLgogICAgICAgICAgQXMgaXQgdHVybnMgb3V0LCBhbG90IG9mIHdhcm5pbmdzIGdvIGF3YXkgaWYgeW91IGp1c3QgbWFrZQogICAgICAgICAgZGVjbGFyYXRpb25zIGxpa2UgdGhpcwoKICAgICAgICAgICAgICAgICAgY2xpZW50RGF0YSA9IGNsaWVudERhdGE7CgogICAgICAgICAgaW4gdGhlIHJlc3VsdGluZyB3cmFwcGVyIGNvZGUuICBNb3N0IGNvbXBpbGVycyBzaG91bGQganVzdAogICAgICAgICAgaWdub3JlIHRoaXMgY29kZSAoYXQgbGVhc3Qgd291bGQgY2FuIGhvcGUpLgoKNy84Lzk3ICA6IEZpeGVkIGJpemFycmUgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aXRoIHR5cGVtYXBzIGFuZCBDKysgY2xhc3Nlcy4KICAgICAgICAgIEluIHNvbWUgY2FzZXMsIHR5cGVtYXBzIGNvbnRhaW5pbmcgcHJpbnRmIGZvcm1hdHRpbmcgc3RyaW5ncyBzdWNoIGFzCgogICAgICAgICAgICAgICAgICAldHlwZW1hcChtZW1iZXJvdXQpIGludCAqIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJWQiLDQyKTsKICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFdvdWxkIGdlbmVyYXRlIGNvbXBsZXRlbHkgYm9ndXMgY29kZSB3aXRoIGdhcmJhZ2UgcmVwbGFjaW5nCiAgICAgICAgICB0aGUgJyVkJy4gICBDYXVzZWQgYnkgb25lIGZhdWx0eSB1c2Ugb2YgcHJpbnRmICh3YXNuJ3QgYWJsZSB0byBmaW5kCiAgICAgICAgICBhbnkgb3RoZXIgb2NjdXJyZW5jZXMpLgoKNy83Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gc2hhZG93IGNsYXNzIGdlbmVyYXRpb24gd2l0aCBub24tbWVtYmVyCiAgICAgICAgICBmdW5jdGlvbnMgdGhhdCBhcmUgcmV0dXJuaW5nIG1vcmUgdGhhbiBvbmUgdmFsdWUuCgo3LzcvOTcgIDogSW5jb3Jwb3JhdGVkIG1vZGlmaWNhdGlvbnMgdG8gbWFrZSBTV0lHIHdvcmsgd2l0aCBHdWlsZSAxLjIuCiAgICAgICAgICBTdGlsbCBuZWVkIHRvIHRlc3QgaXQgb3V0LCBidXQgaXQgaXMgcnVtb3JlZCB0byB3b3JrLgoKNy8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyByZWxhdGVkIHRvIG91dHB1dCBhcmd1bWVudHMgYW5kIFB5dGhvbiBzaGFkb3cKICAgICAgICAgIGNsYXNzZXMuICAgIElmIGFuIG91dHB1dCBhcmd1bWVudCBpcyBkZXRlY3RlZCwgU1dJRyBhc3N1bWVzCiAgICAgICAgICB0aGF0IHRoZSByZXN1bHQgaXMgYSBsaXN0IGFuZCBoYW5kbGVzIGl0IGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICBJZiB0aGUgbm9ybWFsIHJldHVybiB0eXBlIG9mIGFuIGZ1bmN0aW9uIGlzIGFuIG9iamVjdCwKICAgICAgICAgIGl0IHdpbGwgYmUgY29udmVydGVkIGludG8gYSBzaGFkb3cgY2xhc3MgYXMgYmVmb3JlLCBidXQKICAgICAgICAgIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudCBvZiBhCiAgICAgICAgICBsaXN0LiAgKioqIE5PVEUgOiBUaGlzIGJlaGF2aW9yIGhhcyBiZWVuIHN1YnNlcXVlbnRseSBjaGFuZ2VkICoqKgoKNi8yOS85NyA6IENoYW5nZWQgRVhQT1JUIHRvIFNXSUdFWFBPUlQgaW4gYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzLgogICAgICAgICAgU2hvdWxkIHByb3ZpZGUgYmV0dGVyIGNvbXBhdGliaWxpdHkgd2l0aCBXaW5kb3dzLgoKNi8yOS85NyA6IE1vZGlmaWVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyBzbyB0aGF0IG91dHB1dCBhcmd1bWVudHMKICAgICAgICAgIHdvcmsgY29ycmVjdGx5ICh3aGVuIHR5cGVtYXBzIGFyZSB1c2VkKS4KClZlcnNpb24gMS4xIChKdW5lIDI0LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjYvMjQvOTcgOiBGaXhlZCBPYmplY3RpdmUtQyBjb25zdHJ1Y3RvciBidWcgd2hlbiB3b3JraW5nIHdpdGggUGVybDUKICAgICAgICAgIHNoYWRvdyBjbGFzc2VzLgoKNi8yMy85NyA6IEZpeGVkIHNvbWUgcGFyc2luZyBwcm9ibGVtcyB3aXRoIE9iamVjdGl2ZS1DLiAgRGVjbGFyYXRpb25zCiAgICAgICAgICBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgbm93IDoKCiAgICAgICAgICAgICAgIC0gZm9vIDogKGludCkgYSB3aXRoOiAoaW50KSBiOwoKNi8yMi85NyA6IEFkZGVkIFNXSUcgUnVudGltZSBsaWJyYXJ5LiAgIFRoaXMgbGlicmFyeSBjb250YWlucwogICAgICAgICAgdGhlIFNXSUcgcG9pbnRlciB0eXBlLWNoZWNrZXIgYW5kIHN1cHBvcnQgZnVuY3Rpb25zCiAgICAgICAgICB0aGF0IGFyZSBub3JtYWxseSBpbmNsdWRlZCBpbiBldmVyeSBtb2R1bGUuICBCeSB1c2luZwogICAgICAgICAgdGhlIGxpYnJhcnksIGl0IGlzIGVhc2llciB0byB3b3JrIHdpdGggbXVsdGlwbGUgU1dJRwogICAgICAgICAgZ2VuZXJhdGVkIG1vZHVsZXMuCgo2LzIyLzk3IDogRml4ZWQgbWlub3IgYnVnIGluIFBlcmw1IG1vZHVsZSByZWxhdGVkIHRvIHN0YXRpYyBsaW5raW5nCiAgICAgICAgICBvZiBtdWx0aXBsZSBtb2R1bGVzLgoKNi8yMi85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIHRoZSAlaW1wb3J0IGRpcmVjdGl2ZS4gV2hlbiB1c2VkIHdpdGgKICAgICAgICAgIFBlcmw1IHNoYWRvdyBjbGFzc2VzLCB0aGlzIGdlbmVyYXRlcyBhICdyZXF1aXJlJyBzdGF0ZW1lbnQKICAgICAgICAgIHRvIGxvYWQgaW4gZXh0ZXJuYWwgbW9kdWxlcy4KCjYvMjIvOTcgOiBBZGRlZCAtc3dpZ2xpYiBvcHRpb24uICBUaGlzIHByaW50cyBvdXQgdGhlIGxvY2F0aW9uIG9mIHRoZQogICAgICAgICAgU1dJRyBsaWJyYXJ5IGFuZCBleGl0cy4gIFRoaXMgb3B0aW9uIGlzIG9ubHkgcmVhbGx5IHVzZWZ1bCB0bwogICAgICAgICAgY29uZmlndXJhdGlvbiB0b29scyB0aGF0IGFyZSBsb29raW5nIGZvciBTV0lHIGFuZCBpdHMgbGlicmFyeQogICAgICAgICAgbG9jYXRpb24gKGUuZy4gYXV0b2NvbmYsIGNvbmZpZ3VyZSwgZXRjLi4uKS4KCjYvMjEvOTcgOiBGaXhlZCBleHBvcnQgYnVnIHdpdGggUGVybDUuMDA0IG9uIFdpbmRvd3MtTlQuCgo2LzIwLzk3IDogTWlub3IgY2hhbmdlIHRvIGNvZGUgZ2VuZXJhdGlvbiBvZiBjbGFzcy9zdHJ1Y3R1cmUgbWVtYmVycyBpbgogICAgICAgICAgb3JkZXIgdG8gd29yayBiZXR0ZXIgd2l0aCB0eXBlbWFwcy4gU2hvdWxkIGhhdmUgbm8gbm90aWNhYmxlCiAgICAgICAgICBpbXBhY3Qgb24gZXhpc3RpbmcgU1dJRyBtb2R1bGVzLgoKNi8xOS85NyA6IEFkZGVkIC10IG9wdGlvbi4gVGhpcyBhbGxvd3MgU1dJRyB0byBsb2FkIGEgdHlwZW1hcCBmaWxlIGJlZm9yZQogICAgICAgICAgcHJvY2Vzc2luZyBhbnkgZGVjbGFyYXRpb25zLiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICBzd2lnIC10IHR5cGVtYXBzLmkgLXB5dGhvbiBleGFtcGxlLmkKCiAgICAgICAgICBBdCBtb3N0LCBvbmx5IG9uZSB0eXBlbWFwIGZpbGUgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIG1hbm5lci4KICAgICAgICAgICoqKiBORVcgRkVBVFVSRSAqKioKCjYvMTgvOTcgOiBOZWVkIGEgTWFrZWZpbGUgZmFzdD8gVHlwZQoKICAgICAgICAgICAgICAgICBzd2lnIFstdGNsLCAtcGVybDUsIC1weXRob25dIC1jbyBNYWtlZmlsZQoKICAgICAgICAgIGFuZCB5b3Ugd2lsbCBnZXQgYSBNYWtlZmlsZSBzcGVjaWZpYyB0byB0aGF0IHRhcmdldCBsYW5ndWFnZS4KICAgICAgICAgIFlvdSBqdXN0IG5lZWQgdG8gbW9kaWZ5IGl0IGZvciB5b3VyIGFwcGxpY2F0aW9uIGFuZCB5b3UncmUKICAgICAgICAgIHJlYWR5IHRvIHJ1bi4KCjYvMTgvOTcgOiBDb21wbGV0ZWQgdGhlIC1jaSBvcHRpb24uICBUaGlzIG9wdGlvbiBjaGVja3MgYSBmaWxlIGludG8gdGhlCiAgICAgICAgICBTV0lHIGxpYnJhcnkuICAgSXQgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhCiAgICAgICAgICBsYW5ndWFnZSBvcHRpb24uIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgIHN3aWcgLXRjbCAtY2kgZm9vYmFyLmkKCiAgICAgICAgICBDaGVja3MgdGhlIGZpbGUgZm9vYmFyLmkgaW50byB0aGUgVGNsIHBhcnQgb2YgdGhlIGxpYnJhcnkuCiAgICAgICAgICBJbiBvcmRlciB0byBjaGVjayBhIGZpbGUgaW50byB0aGUgZ2VuZXJhbCBsaWJyYXJ5IChhY2Nlc3NpYmxlCiAgICAgICAgICB0byBhbGwgbGFuZ3VhZ2VzIG1vZHVsZXMpLCBkbyB0aGUgZm9sbG93aW5nCgogICAgICAgICAgICAgICAgICBzd2lnIC1jaSAtbyAuLi9mb29iYXIuaSBmb29iYXIuaQoKICAgICAgICAgIChBZG1pdHRlZGx5IHRoaXMgbG9va3MgYSBsaXR0bGUgc3RyYW5nZSBidXQgaXMgdW5hdm9pZGFibGUpLgogICAgICAgICAgVGhlIGNoZWNrLWluIG9wdGlvbiBpcyBwcmltYXJpbHkgZGVzaWduZWQgZm9yIFNXSUcgbWFpbnRlbmFuY2UKICAgICAgICAgIGFuZCBsaWJyYXJ5IGRldmVsb3BtZW50LiBUaGUgY29tbWFuZCB3aWxsIGZhaWwgaWYgdGhlIHVzZXIgZG9lcwogICAgICAgICAgbm90IGhhdmUgd3JpdGUgcGVybWlzc2lvbiB0byB0aGUgU1dJRyBsaWJyYXJ5LiAgVGhpcmQgcGFydHkgbGlicmFyeQogICAgICAgICAgZXh0ZW5zaW9ucyBjYW4gZWFzaWx5IGluc3RhbGwgdGhlbXNlbHZlcyBieSBzaW1wbHkgcHJvdmlkaW5nCiAgICAgICAgICBhIHNoZWxsIHNjcmlwdCB0aGF0IHVzZXMgJ3N3aWcgLWNpJyB0byBpbnN0YWxsIHRoZSBhcHByb3ByaWF0ZQogICAgICAgICAgbGlicmFyeSBmaWxlcy4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8ga25vdyB3aGVyZSB0aGUgU1dJRyBsaWJyYXJ5CiAgICAgICAgICBpcyBsb2NhdGVkIGlmIHlvdSB1c2UgdGhpcyBtZWNoYW5pc20uCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE2Lzk3IDogRml4ZWQgYSBidWcgaW4gc2hhZG93IGNsYXNzIGdlbmVyYXRpb24gd2hlbiAlbmFtZSgpIHdhcyBhcHBsaWVkCiAgICAgICAgICB0byBhIGNsYXNzIGRlZmluaXRpb24uICAgVW5mb3J0dW5hdGVseSwgZml4aW5nIHRoZSBidWcgcmVxdWlyZWQKICAgICAgICAgIGEgY2hhbmdlIGluIHRoZSBMYW5ndWFnZSBDIEFQSSBieSBhZGRpbmcgYW4gZXh0cmEgYXJndW1lbnQgdG8KICAgICAgICAgIHRoZSBMYW5ndWFnZTo6Y3BwX2NsYXNzX2RlY2woKSBmdW5jdGlvbi4gIFRoaXMgbWF5IGJyZWFrCiAgICAgICAgICBTV0lHIEMrKyBleHRlbnNpb25zLgogICAgICAgICAgKioqIFBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkgKioqCgo2LzE1Lzk3IDogQWRkZWQgYSB3YXJuaW5nIG1lc3NhZ2UgaWYgbm8gbW9kdWxlIG5hbWUgaXMgc3BlY2lmaWVkIHdpdGggdGhlCiAgICAgICAgICAlbW9kdWxlIGRpcmVjdGl2ZSBvciAtbW9kdWxlIG9wdGlvbi4KCjYvMTUvOTcgOiBGaXhlZCBsaW5lIG51bWJlciBidWcgd2hlbiByZXBvcnRpbmcgZXJyb3JzIGZvciB1bmRlZmluZWQKICAgICAgICAgIGJhc2UgY2xhc3Nlcy4KCjYvMTUvOTcgOiBBZGRlZCBuZXcgJXJlbmFtZSBkaXJlY3RpdmUuICBUaGlzIGFsbG93cyB0aGUgZm9yd2FyZCBkZWNsYXJhdGlvbgogICAgICAgICAgb2YgYSByZW5hbWluZy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXJlbmFtZSBPbGROYW1lIE5ld05hbWU7CgogICAgICAgICAgICAgICAgIC4uLi4gbGF0ZXIgLi4uCiAgICAgICAgICAgICAgICAgaW50IE9sZE5hbWUoaW50KTsKCiAgICAgICAgICBVbmxpa2UgJW5hbWUsICVyZW5hbWUgd2lsbCByZW5hbWUgYW55IG9jY3VycmVuY2Ugb2YgdGhlIG9sZCBuYW1lLgogICAgICAgICAgVGhpcyBhcHBsaWVzIHRvIGZ1bmN0aW9ucywgdmFyaWFibGVzLCBjbGFzcyBtZW1iZXJzIGFuZCBzbyBmb3J0aC4KICAgICAgICAgIFRoZXJlIGlzIG5vIHdheSB0byBkaXNhYmxlICVyZW5hbWUgb25jZSBzZXQsIGJ1dCB5b3UgY2FuIGNoYW5nZSB0aGUKICAgICAgICAgIG5hbWUgYnkgcmVkZWNsYXJpbmcgaXQgdG8gc29tZXRoaW5nIGVsc2UuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo2LzE1Lzk3IDogSW1wcm92ZWQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgc28gdGhhdCBpdAogICAgICAgICAgY291bGQgYmUgdXNlZCB3aXRoIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIDoKCiAgICAgICAgICAgICAgICAgICAgI2lmZGVmIFNXSUcKICAgICAgICAgICAgICAgICAgICAlbmFtZShOZXdOYW1lKQogICAgICAgICAgICAgICAgICAgICNlbmRpZgogICAgICAgICAgICAgICAgICAgIGludCBPbGROYW1lKGludCk7Cgo2LzE1Lzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgZnVuY3Rpb25zIHdpdGggbm8gcmV0dXJuIGRhdGF0eXBlLiAgSW4gdGhpcyBjYXNlLAogICAgICAgICAgU1dJRyBhc3N1bWVzIGEgcmV0dXJuIHR5cGUgb2YgJ2ludCcuCgo2LzExLzk3IDogSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5nIGluIHRoZSBwYXJzZXIuICBJdCBzaG91bGQgYmUgYSBsaXR0bGUKICAgICAgICAgIGxlc3Mgc2Vuc2l0aXZlIHRvIGVycm9ycyB0aGF0IG9jY3VyIGluc2lkZSBjbGFzcyBkZWZpbml0aW9ucwogICAgICAgICAgbm93LiAgQWxzbyByZXBvcnRzIGVycm9ycyBmb3IgZnVuY3Rpb24gcG9pbnRlcnMuCgo2LzExLzk3IDogTWFkZSAnJCcgYSBsZWdhbCBzeW1ib2wgaW4gaWRlbnRpZmllcnMuICBUaGlzIGlzIHRvIHN1cHBvcnQKICAgICAgICAgIHNvbWUgT2JqZWN0aXZlLUMgbGlicmFyaWVzLiAgU29tZSBjb21waWxlcnMgKHN1Y2ggYXMgZ2NjKSBtYXkgYWxzbwogICAgICAgICAgYWxsb3cgaWRlbnRpZmllcnMgdG8gY29udGFpbiBhICQgaW4gQy9DKysgY29kZSBhcyB3ZWxsICh0aGlzIGlzCiAgICAgICAgICBhbiBvYnNjdXJlIGZlYXR1cmUgb2YgQykuIFdoZW4gJyQnIGFwcGVhcnMgaW4gaWRlbnRpZmllciwgU1dJRwogICAgICAgICAgcmVtYXBzIGl0IHRvIHRoZSBzdHJpbmcgJ19TXycgd2hlbiBjcmVhdGluZyB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlCiAgICAgICAgICBmdW5jdGlvbi4gVGh1cyBhIGZ1bmN0aW9uICdmb28kYmFyJyB3b3VsZCBiZSBjYWxsZWQgJ2Zvb19TX2JhcicuCgo2LzExLzk3IDogRml4ZWQgYnVnIGluIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB3aXRoIF9fcmVwcl9fIG1ldGhvZC4gIElmCiAgICAgICAgICBzdXBwbGllZCBieSB0aGUgdXNlciwgaXQgd2FzIGlnbm9yZWQsIGJ1dCBub3cgaXQgc2hvdWxkIHdvcmsuCgo2LzkvOTcgIDogRml4ZWQgdGhlIFRjbCA4LjAgbW9kdWxlIHRvIHdvcmsgd2l0aCBUY2wgOC4wYjEuICAgU1dJRyBpcyBubwogICAgICAgICAgbG9uZ2VyIGNvbXBhdGlibGUgd2l0aCAqYW55KiBhbHBoYSByZWxlYXNlIG9mIFRjbCA4LjAuCiAgICAgICAgICAqKiogUE9URU5USUFMIElOQ09NUEFUSUJJTElUWSAqKioKCjYvNy85NyAgOiBQdXQgYSBtYXhpbWFsIGVycm9yIGNvdW50IGluIChjdXJyZW50bHkgc2V0IHRvIDIwKS4gU1dJRyB3aWxsIGJhaWwgb3V0CiAgICAgICAgICBpZiBpdCBnZW5lcmF0ZXMgbW9yZSBlcnJvcnMgdGhhbiB0aGlzICh1c2VmdWwgZm9yIHByZXZlbnRpbmcgU1dJRwogICAgICAgICAgZnJvbSBwcmludGluZyA0MDAwIHN5bnRheCBlcnJvcnMgd2hlbiBpdCBnZXRzIGNvbmZ1c2VkKS4KCjYvNy85NyAgOiBGaXhlZCBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBwYXJzaW5nIHZhcmlhYmxlIGxlbmd0aCBhcmd1bWVudHMuCgo2LzcvOTcgIDogTWlub3IgY2hhbmdlIHRvIFBlcmw1IG1vZHVsZS4gIEMrKyBzdGF0aWMgZnVuY3Rpb25zIGFyZSBub3cKICAgICAgICAgIHB1dCBpbiB0aGUgc2FtZSBwYWNrYWdlIGFzIHRoZWlyIGNsYXNzIHdoZW4gdXNpbmcgc2hhZG93IGNsYXNzZXMuCgo2LzcvOTcgIDogQ2VudHJhbGl6ZWQgdGhlIG5hbWluZyBvZiBmdW5jdGlvbnMsIG1lbWJlcnMsIHdyYXBwZXJzIGV0Yy4uLiBCeQogICAgICAgICAgY2VudHJhbGl6aW5nIHRoZSBuYW1pbmcgc2NoZW1lLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gbWFrZQogICAgICAgICAgc29tZSBtdWx0aS1maWxlIG9wdGltaXphdGlvbnMuICBBbHNvLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8KICAgICAgICAgIGNoYW5nZSBTV0lHJ3MgbmFtaW5nIHNjaGVtZSAocGVyaGFwcyBhIG5ldyBmZWF0dXJlIHRvIGJlIGFkZGVkCiAgICAgICAgICBsYXRlcikuCgo2LzIvOTcgIDogQWRkZWQgJ2FyZ2luaXQnIHR5cGVtYXAuICAgVGhpcyBjYW4gYmUgdXNlZCB0byBhc3NpZ24gaW5pdGlhbCB2YWx1ZXMKICAgICAgICAgIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cy4gIERvaW5nIHNvIG1ha2VzIGl0IHNvbWV3aGF0IGVhc2llciB0byBkZXRlY3QKICAgICAgICAgIGltcHJvcGVyIGFyZ3VtZW50IHBhc3Npbmcgd2hlbiB3b3JraW5nIHdpdGggb3RoZXIgdHlwZW1hcHMuCgo2LzIvOTcgIDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHJlYWQtb25seSB2YXJpYWJsZXMgd2VyZSBpbmhlcml0ZWQKICAgICAgICAgIGludG8gb3RoZXIgY2xhc3Nlcy4gIFVuZGVyIGluaGVyaXRhbmNlLCB0aGUgdmFyaWFibGVzIHdvdWxkCiAgICAgICAgICBiZWNvbWUgd3JpdGFibGUsIGJ1dCB0aGlzIGhhcyBub3cgYmVlbiBjb3JyZWN0ZWQuCgo1LzMwLzk3IDogQW4gZW1wdHkgJW5hbWUoKSBkaXJlY3RpdmUgaXMgbm8gbG9uZ2VyIGFsbG93ZWQgb3Igc3VwcG9ydGVkLgogICAgICAgICAgVGhpcyBkaXJlY3RpdmUgd2FzIG9yaWdpbmFsbHkgdXNlZCB0byBzdHJpcCB0aGUgcHJlZml4CiAgICAgICAgICBvZmYgb2YgYSBjbGFzcyBvciBzdHJ1Y3R1cmUuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIG5ldmVyIHJlYWxseQogICAgICAgICAgc2VlbWVkIHRvIHdvcmsgcmlnaHQgYW5kIGl0IGNvbXBsaWNhdGVkIHRoZSBDKysgY29kZSBnZW5lcmF0b3IKICAgICAgICAgIHNpZ25pZmljYW50bHkuICAgQXMgZmFyIGFzIEkgY2FuIHRlbGwgbm8gb25lIHVzZXMgaXQsIHNvIGl0CiAgICAgICAgICBpcyBub3cgaGlzdG9yeS4gICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS8yOC85NyA6IEZpeGVkIGEgcGFyc2luZyBidWcgd2l0aCAjZGVmaW5lIGFuZCBDKysgY29tbWVudHMuICBEZWNsYXJhdGlvbnMKICAgICAgICAgIHN1Y2ggYXMgdGhlIGZvbGxvd2luZyBub3cgd29yayBwcm9wZXJseSA6CgogICAgICAgICAgICAgICAgICAgI2RlZmluZSBDT05TVCAgIDQgICAgIC8vIEEgQ29tbWVudAoKNS8yOC85NyA6IE1hZGUgc29tZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdG8gdGhlIFNXSUcgU3RyaW5nIGNsYXNzLgogICAgICAgICAgKG9ubHkgYWZmZWN0cyB0aGUgU1dJRyBjb21waWxlciBpdHNlbGYpLgoKNS8yOC85NyA6IE1vZGlmaWVkIHRoZSBwYXJzZXIgdG8gc2tpcCB0ZW1wbGF0ZSBkZWZpbml0aW9ucyBhbmQgaXNzdWUgYQogICAgICAgICAgd2FybmluZyBtZXNzYWdlLgoKNS8yOC85NyA6IFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIHBhcmFtZXRlcml6ZWQgdHlwZXMgYWRkZWQgKGllLiB0ZW1wbGF0ZXMpLgogICAgICAgICAgVHlwZXMgc3VjaCBhcyB0aGUgZm9sbG93aW5nIHNob3VsZCBwYXNzIHRocm91Z2ggdGhlIFNXSUcgY29tcGlsZXIKCiAgICAgICAgICAgICAgICAgICAgdm9pZCBmb28odmVjdG9yPGNvbXBsZXg+ICphLCB2ZWN0b3I8ZG91YmxlPiAqYik7CgogICAgICAgICAgV2hlbiB1c2VkLCB0aGUgZW50aXJlIG5hbWUgJ3ZlY3Rvcjxjb21wbGV4PicgYmVjb21lcyB0aGUgbmFtZQogICAgICAgICAgb2YgdGhlIGRhdGF0eXBlLiAgICAgIER1ZSB0byBzcGFjZSBsaW1pdGF0aW9ucyBpbiBkYXRhdHlwZQogICAgICAgICAgcmVwcmVzZW50YXRpb25zLCB0aGUgbmFtZSBzaG91bGQgbm90IGV4Y2VlZCA5NiBjaGFyYWN0ZXJzLgoKICAgICAgICAgIE5vdGUgOiBUaGlzIGlzIG9ubHkgcGFydCBvZiB3aGF0IGlzIG5lZWRlZCBmb3IgdGVtcGxhdGUgc3VwcG9ydC4KICAgICAgICAgIFRlbXBsYXRlIGNsYXNzIGRlZmluaXRpb25zIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBieSBTV0lHLgoKICAgICAgICAgIFRoZSB0ZW1wbGF0ZSBub3RhdGlvbiBhYm92ZSBtYXkgYWxzbyBiZSB1c2VkIHdoZW4gc3BlY2lmeWluZwogICAgICAgICAgT2JqZWN0aXZlLUMgcHJvdG9jb2wgbGlzdHMuCiAgICAgICAgICAqKiogTkVXIEZFQVRVUkUgKioqCgo1LzI0Lzk3IDogRmlyc3QgY3V0IGF0IE9iamVjdGl2ZS1DIHN1cHBvcnQgYWRkZWQuICAgQXMgaXQgdHVybnMgb3V0LCBhbG1vc3QKICAgICAgICAgIGV2ZXJ5dGhpbmcgY2FuIGJlIGhhbmRsZWQgd2l0aCBvbmx5IGEgZmV3IG1pbm9yIG1vZGlmaWNhdGlvbnMgdG8KICAgICAgICAgIHRoZSBDKysgbW9kdWxlLgogICAgICAgICAgKioqIE5FVyBGRUFUVVJFICoqKgoKNS8yMy85NyA6IEZpeGVkIHJlcGVhdGVkIGRlZmluaXRpb24gYnVnIGluIG11bHRpcGxlIGluaGVyaXRhbmNlIGhhbmRsaW5nCiAgICAgICAgICB3aGVuIG11bHRpcGxlIGJhc2UgY2xhc3NlcyBzaGFyZSBhIGNvbW1vbiBiYXNlIGNsYXNzIChpZS4KICAgICAgICAgIHRoZSBldmlsIGRpYW1vbmQpLgoKNS8yMS85NyA6IEZpeGVkIHJhdGhlciBlbWJhcnJhc3NpbmcgdHlwbyB0aGF0IHdvcmtlZCBpdHMgd2F5IGludG8gdGhlCiAgICAgICAgICBUZXN0cy9CdWlsZCBkaXJlY3RvcnkuCgo1LzE5Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyB3aGVuIHVzaW5nIG5hdGl2ZSBtZXRob2RzIGFuZAogICAgICAgICAgc2hhZG93IGNsYXNzZXMgd2l0aCBQeXRob24gYW5kIFBlcmw1IG1vZHVsZXMuCgo1LzE5Lzk3IDogTW9kaWZpZWQgdGhlICVhcHBseSBkaXJlY3RpdmUgc2xpZ2h0bHkgc28gdGhhdCBpdCB3b3VsZCB3b3JrCiAgICAgICAgICB3aXRoIHBvaW50ZXJzIGEgbGl0dGxlIGJldHRlci4gRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICAgJWFwcGx5IHVuc2lnbmVkIGxvbmcgeyBEV09SRCB9OwoKICAgICAgICAgIEFwcGxpZXMgKmFsbCogdHlwZW1hcHMgYXNzb2NpYXRlZCB3aXRoICJ1bnNpZ25lZCBsb25nIiB0bwogICAgICAgICAgIkRXT1JEIi4gICBUaGlzIG5vdyBpbmNsdWRlcyBwb2ludGVycyB0byB0aGUgdHdvIGRhdGF0eXBlcy4KICAgICAgICAgIEZvciBleGFtcGxlLCBhIHR5cGVtYXAgYXBwbGllZCB0byAidW5zaWduZWQgbG9uZyAqKiIgd291bGQKICAgICAgICAgIGFsc28gYmUgYXBwbGllZCB0byBhbnkgb2NjdXJyZW5jZSBvZiAiRFdPUkQgKioiIGFzIHdlbGwuCgo1LzE5Lzk3IDogRml4ZWQgYW4gb3duZXJzaGlwIGFzc2lnbm1lbnQgYnVnIGluIHRoZSBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgY2xhc3MgbWVtYmVycyB3ZXJlIHJldHVybmluZyBuZXcgb2JqZWN0cyBiZWxvbmdpbmcgdG8KICAgICAgICAgIGRpZmZlcmVudCBjbGFzc2VzLgoKNS8xNy85NyA6IEFkZGVkIGEgZmV3IG1vcmUgdHlwZW1hcCB2YXJpYWJsZXMuCgogICAgICAgICAgICAgICAgICAkbmFtZSAgICAgICAgICAtIE5hbWUgb2YgZnVuY3Rpb24vdmFyaWFibGUvbWVtYmVyCiAgICAgICAgICAgICAgICAgICRiYXNldHlwZSAgICAgIC0gQmFzZSBkYXRhdHlwZSAodHlwZSB3aXRob3V0IHBvaW50ZXJzKQogICAgICAgICAgICAgICAgICAkYXJnbnVtICAgICAgICAtIEFyZ3VtZW50IG51bWJlcgoKNS8xNi85NyA6IEZpeGVkIGVtYmFycmFzc2luZyB1bmRlcnNjb3JlIGVycm9yIGluIGxvY2FsIHZhcmlhYmxlCiAgICAgICAgICBhbGxvY2F0b3IuCgo1LzE2Lzk3IDogRml4ZWQgbmFtZXNwYWNlIGNsYXNoIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzCiAgICAgICAgICB3aGVuIGNyZWF0aW5nIGFycmF5cyBhcyBuZXcgbG9jYWwgdmFyaWFibGVzLgoKNS8xNS85NyA6IEZpeGVkIHNvbWUgYnVncyB3aXRoIGluaGVyaXRhbmNlIG9mIGFkZGVkIG1ldGhvZHMgYWNyb3NzCiAgICAgICAgICBtdWx0aXBsZSBmaWxlcy4gICBTV0lHIG5vdyB1c2VzIG5hbWVzIG9mIGJhc2UgY2xhc3NlcwogICAgICAgICAgd2hlbiBnZW5lcmF0aW5nIHN1Y2ggZnVuY3Rpb25zLgoKNS8xNC85NyA6IEZpbmlzaGVkIHN1cHBvcnQgZm9yIGRlZmF1bHQgdHlwZW1hcHMuICBQcmltYXJpbHkgdXNlZAogICAgICAgICAgaW50ZXJuYWxseSwgdGhleSBjYW4gYmUgdXNlZCB0byBtYXRjaCB0aGUgYmFzaWMKICAgICAgICAgIGJ1aWx0LWluIGRhdGF0eXBlcyB1c2VkIGluc2lkZSBvZiBTV0lHLiAgIFlvdSBjYW4KICAgICAgICAgIHNwZWNpZnkgdGhlbSBpbiBpbnRlcmZhY2UgZmlsZXMgYXMgd2VsbCBsaWtlIHRoaXMgOgoKICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgU1dJR19ERUZBVUxUX1RZUEUgewogICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0ID0gYXRvaSgkdGFyZ2V0KTsKICAgICAgICAgICAgICAgfQoKICAgICAgICAgIFVubGlrZSBub3JtYWwgdHlwZW1hcHMsIHRoaXMgZGVmYXVsdCBtYXAgd2lsbCBnZXQgYXBwbGllZAogICAgICAgICAgdG8gKmFsbCogaW50ZWdlciBkYXRhdHlwZXMgZW5jb3VudGVyZWQsIGluY2x1ZGluZyB0aG9zZQogICAgICAgICAgcmVuYW1lZCB3aXRoIHR5cGVkZWYsIGV0Yy4uLgoKNS8xMy85NyA6IEZpeGVkIHN1YnN0cmluZyBidWcgaW4gdHlwZSBjaGVja2VyLgoKNS8xMi85NyA6IEZpeGVkIGJ1ZyBpbiBwYXJhbWV0ZXJpemVkIHR5cGVtYXBzIHdoZW4gZGVjbGFyaW5nIGxvY2FsCiAgICAgICAgICB2YXJpYWJsZXMgb2Ygc3RydWN0dXJlcy4KClZlcnNpb24gMS4xIEJldGE2IChNYXkgOSwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKNS85Lzk3ICA6IEZpeGVkIGJpemFycmUgTlVMTCBwb2ludGVyIGhhbmRsaW5nIGJ1ZyBpbiBQZXJsNSBtb2R1bGUuCgo1LzgvOTcgIDogRml4ZWQgbXlzdGVyaW91cyBzZWdtZW50YXRpb24gZmF1bHQgd2hlbiBydW5uaW5nIFNXSUcgb24gYW4KICAgICAgICAgIGVtcHR5IGZpbGUuCgo1LzcvOTcgIDogVGhlIGNvZGUgZ2VuZXJhdG9yIHdpbGwgbm93IHJlcGxhY2UgdGhlIHNwZWNpYWwgc3ltYm9sICIkY2xlYW51cCIKICAgICAgICAgIHdpdGggdGhlIGNsZWFudXAgY29kZSBzcGVjaWZpZWQgd2l0aCB0aGUgImZyZWVhcmciIHR5cGVtYXAuCiAgICAgICAgICBUaGlzIGNoYW5nZSBuZWVkZWQgdG8gcHJvcGVybHkgbWFuYWdlIG1lbW9yeSBhbmQgZXhjZXB0aW9ucy4KCjUvNS85NyAgOiBBZGRlZCB0aGUgJ3R5cGVtYXBzLmknIGxpYnJhcnkgZmlsZS4gIFRoaXMgY29udGFpbnMgYQogICAgICAgICAgdmFyaWV0eSBvZiBjb21tb24gdHlwZW1hcHMgZm9yIGlucHV0IHZhbHVlcywgcG9pbnRlcnMsCiAgICAgICAgICBhbmQgc28gb24uCgo1LzUvOTcgIDogQ2hhbmdlZCBiZWhhdmlvciBvZiAiYXJnb3V0IiB0eXBlbWFwIGluIFB5dGhvbiBtb2R1bGUuCiAgICAgICAgICBPbGQgdmVyc2lvbnMgYXV0b21hdGljYWxseSB0dXJuZWQgdGhlIHJlc3VsdCBpbnRvIGEKICAgICAgICAgIFB5dGhvbiBsaXN0LiAgVGhlIG5ldyB2ZXJzaW9uIGRvZXMgbm90aGluZywgbGVhdmluZyB0aGUKICAgICAgICAgIGltcGxlbWVudGF0aW9uIHVwIHRvIHRoZSB1c2VyLiAgVGhpcyBwcm92aWRlcyBtb3JlIGZsZXhpYmlsaXR5CiAgICAgICAgICBidXQgbWF5IGJyZWFrIG9sZGVyIGNvZGVzIHRoYXQgcmVseSBvbiB0eXBlbWFwcy4KICAgICAgICAgICoqKiBQT1RFTlRJQUwgSU5DT01QQVRJQklMSVRZICoqKgoKNS81Lzk3ICA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHJlbGF0ZWQgdG8gdGhlIGludGVyYWN0aW9uIG9mCiAgICAgICAgICAiYXJnb3V0IiBhbmQgImlnbm9yZSIgdHlwZW1hcHMuCgo1LzUvOTcgIDogRml4ZWQgYnVnIGluIFB5dGhvbiBtb2R1bGUgdGhhdCB3b3VsZCBnZW5lcmF0ZSBpbmNvcnJlY3QgY29kZQogICAgICAgICAgaWYgYWxsIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgImlnbm9yZWQiLgoKNS80Lzk3ICA6IEFkZGVkICVhcHBseSBhbmQgJWNsZWFyIGRpcmVjdGl2ZXMuICAgVGhlc2UgZm9ybSBhIGhpZ2hlciBsZXZlbAogICAgICAgICAgaW50ZXJmYWNlIHRvIHRoZSB0eXBlbWFwIG1lY2hhbmlzbS4gIEluIGEgbnV0c2hlbGwsIHRoZXkKICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgcHJvY2Vzc2luZyBvZiB2YXJpb3VzIGRhdGF0eXBlcyB3aXRob3V0CiAgICAgICAgICBldmVyIGhhdmluZyB0byB3cml0ZSBhIHR5cGVtYXAuICBTZWUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbgogICAgICAgICAgZm9yIG1vcmUgZGV0YWlscy4gICoqIE5FVyBGRUFUVVJFICoqCgo1LzQvOTcgIDogQWRkZWQgYSBsb2NhbCB2YXJpYWJsZSBleHRlbnNpb24gdG8gdGhlIHR5cGVtYXAgaGFuZGxlci4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgKihkb3VibGUgdGVtcCkgewoJCSAgICAgICAgdGVtcCA9IGF0b2YoJHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICR0YXJnZXQgPSAmdGVtcDsKICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgSW4gdGhpcyBjYXNlLCAndGVtcCcgaXMgYSBsb2NhbCB2YXJpYWJsZSB0aGF0IGV4aXN0cwogICAgICAgICAgaW4gdGhlIGVudGlyZSB3cmFwcGVyIGZ1bmN0aW9uIChub3QganVzdCB0aGUgdHlwZW1hcAogICAgICAgICAgY29kZSkuICBUaGlzIG1lY2hhbmlzbSBwcm92aWRlcyBiZXR0ZXIgc3VwcG9ydCBmb3IKICAgICAgICAgIGNlcnRhaW4gdHlwZXMgb2YgYXJndW1lbnQgaGFuZGxpbmcgYW5kIGFsc28gbWFrZXMgaXQKICAgICAgICAgIHBvc3NpYmxlIHRvIHdyaXRlIHRocmVhZC1zYWZlIHR5cGVtYXBzLiAgQW55IG51bWJlcgogICAgICAgICAgbG9jYWwgdmFyaWFibGVzIGNhbiBiZSBkZWNsYXJlZCBieSBzdXBwbHlpbmcgYSBjb21tYQogICAgICAgICAgc2VwYXJhdGVkIGxpc3QuICAgTG9jYWwgdmFyaWFibGVzIGFyZSBndWFyYW50ZWVkIHRvIGJlCiAgICAgICAgICB1bmlxdWUsIGV2ZW4gaWYgdGhlIHNhbWUgdHlwZW1hcCBpcyBhcHBsaWVkIG1hbnkgdGltZXMKICAgICAgICAgIGluIGEgZ2l2ZW4gZnVuY3Rpb24uCiAgICAgICAgICAqKiBOb3QgY3VycmVudGx5IHN1cHBvcnRlZCBpbiBQZXJsNCBvciBHdWlsZSBtb2R1bGVzLgoKNS8yLzk3ICA6IEZpeGVkIHByb2Nlc3Npbmcgb2YgJWlmZGVmLCAlZW5kaWYsICVpZiwgZXRjLi4uICAoVGhlc2UgYXJlCiAgICAgICAgICBTV0lHIGVxdWl2YWxlbnRzIG9mIHRoZSBDIHByZXByb2Nlc3NvciBkaXJlY3RpdmVzIHRoYXQKICAgICAgICAgIGNhbiBwYXNzIHRocm91Z2ggdGhlIEMgcHJlcHJvY2Vzc29yIHdpdGhvdXQgbW9kaWZpY2F0aW9uKS4KCjUvMi85NyAgOiBGaXhlZCBtYWpvciAoYnV0IHN1YnRsZSkgYnVnIGluIHRoZSBydW4tdGltZSB0eXBlIGNoZWNrZXIKICAgICAgICAgIHJlbGF0ZWQgdG8gc2VhcmNoaW5nIGFuZCB0eXBlLWNoZWNraW5nIGZvciBDKysgaW5oZXJpdGFuY2UuCiAgICAgICAgICBUbyBtYWtlIGEgbG9uZyBzdG9yeSBzaG9ydCwgaWYgeW91IGhhZCB0d28gY2xhc3NlcyBuYW1lZAogICAgICAgICAgIkZvbyIgYW5kICJGb29PYmplY3QiIHRoZSB0eXBlIGNoZWNrZXIgd291bGQgc29tZXRpbWVzCiAgICAgICAgICBnZXQgY29uZnVzZWQgYW5kIGJlIHVuYWJsZSB0byBsb2NhdGUgIkZvbyIgaW4gYW4gaW50ZXJuYWwKICAgICAgICAgIHRhYmxlLgoKNS8yLzk3ICA6IEZpeGVkIHNvbWUgYnVncyBpbiB0aGUgLWNvIG9wdGlvbi4KCjQvMjQvOTcgOiBQb2ludGVyIGxpYnJhcnkgYWRkZWQgdG8gdGhlIFNXSUcgbGlicmFyeS4KCjQvMTkvOTcgOiBBZGRlZCB0aGUgJW5ldyBkaXJlY3RpdmUuICAgVGhpcyBpcyBhICJoaW50IiB0aGF0IGNhbiBiZSB1c2VkCiAgICAgICAgICB0byB0ZWxsIFNXSUcgdGhhdCBhIGZ1bmN0aW9uIGlzIHJldHVybmluZyBhIG5ldyBvYmplY3QuIEZvcgogICAgICAgICAgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAlbmV3IEZvbyAqY3JlYXRlX2ZvbygpOwoKICAgICAgICAgIFRoaXMgdGVsbHMgU1dJRyB0aGF0IGNyZWF0ZV9mb28oKSBpcyBjcmVhdGluZyBhIG5ldyBvYmplY3QKICAgICAgICAgIGFuZCByZXR1cm5pbmcgYSBwb2ludGVyIHRvIGl0LiAgIE1hbnkgbGFuZ3VhZ2UgbW9kdWxlcyBtYXkKICAgICAgICAgIGNob29zZSB0byBpZ25vcmUgdGhlIGhpbnQsIGJ1dCB3aGVuIHdvcmtpbmcgd2l0aCBzaGFkb3cgY2xhc3NlcywKICAgICAgICAgIHRoZSAlbmV3IGlzIHVzZWQgdG8gaGFuZGxlIHByb3BlciBvd25lcnNoaXAgb2Ygb2JqZWN0cy4KCiAgICAgICAgICAlbmV3IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgc3RyaW5ncy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAgICVuZXcgY2hhciAqY3JlYXRlX3N0cmluZygpOwoKICAgICAgICAgIFdoZW4gdXNlZCwgYWxsIG9mIHRoZSBsYW5ndWFnZSBtb2R1bGVzIHdpbGwgYXV0b21hdGljYWxseSBjbGVhbnVwCiAgICAgICAgICB0aGUgcmV0dXJuZWQgc3RyaW5nLS1lbGltaW5hdGluZyBtZW1vcnkgbGVha3MuCiAgICAgICAgICAqKiBORVcgRkVBVFVSRSAqKgoKNC8xOS85NyA6IEFkZGVkIGEgbmV3IHR5cGVtYXAgIm5ld2ZyZWUiLiAgIFRoaXMgaXMgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCiAgICAgICAgICB0aGUgJW5ldyBkaXJlY3RpdmUgYW5kIGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgbWV0aG9kIGJ5IHdoaWNoCiAgICAgICAgICBhIG5ldyBvYmplY3QgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbiBpcyBkZWxldGVkLgoKNC8xOS85NyA6IFRoZSBzeW1ib2wgIl9fY3BsdXNwbHVzIiBpcyBub3cgZGVmaW5lZCBpbiB0aGUgU1dJRyBpbnRlcnByZXRlcgogICAgICAgICAgd2hlbiBydW5uaW5nIHdpdGggdGhlIC1jKysgb3B0aW9uLgoKNC8xNy85NyA6IEFkZGVkIHN1cHBvcnQgZm9yIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb25zIHdoZW4gdXNlZCBpbnNpZGUgdGhlCiAgICAgICAgICAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgo0LzE1Lzk3IDogQWRkZWQgYSBzcGVjaWFsIHR5cGVtYXAgc3ltYm9sIFBSRVZJT1VTIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgIHJlc3RvcmUgYSBwcmV2aW91cyB0eXBlbWFwLiBGb3IgZXhhbXBsZSA6CgoJICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBpbnQgKiA9IFBSRVZJT1VTOwoKICAgICAgICAgIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWQgaW4gbGlicmFyeSBmaWxlcy4KCjQvMTMvOTcgOiBBZGRlZCAlcHJhZ21hIGRpcmVjdGl2ZSBmb3IgUGVybDUgbW9kdWxlLiAgIFR3byBuZXcgcHJhZ21hcyBhcmUKICAgICAgICAgIGF2YWlsYWJsZSA6CgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGNvZGUgPSAic3RyaW5nIgogICAgICAgICAgICAgICAgICVwcmFnbWEocGVybDUpIGluY2x1ZGUgPSAiZmlsZS5wbCIKCiAgICAgICAgICBCb3RoIGluc2VydCBjb2RlIGludG8gdGhlIC5wbSBmaWxlIGNyZWF0ZWQgYnkgU1dJRy4gIFRoaXMgY2FuCiAgICAgICAgICBiZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgY3VzdG9taXplIHRoZSAucG0gZmlsZSBjcmVhdGVkIGJ5IFNXSUcuCgo0LzEzLzk3IDogU2Nhbm5lciBtb2RpZmllZCB0byBvbmx5IHJlY29nbml6ZSBDKysga2V5d29yZHMgd2hlbiB0aGUgLWMrKwogICAgICAgICAgb3B0aW9uIGhhcyBiZWVuIHNwZWNpZmllZC4gIFRoaXMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgQyBwcm9ncmFtcwogICAgICAgICAgdGhhdCBtYWtlIHVzZSBvZiB0aGVzZSBrZXl3b3JkcyBmb3IgaWRlbnRpZmllcnMuCiAgICAgICAgICBTV0lHIG1heSBuZWVkIHRvIGJlIGV4cGxpY2l0bHkgcnVuIHdpdGggdGhlIC1jKysgb3B0aW9uIHdoZW4KICAgICAgICAgIGNvbXBpbGluZyBDKysgY29kZSAodGhpcyB3YXMgYWxsb3dlZCwgYnV0IG5vdCByZWNvbW1lbmRlZCBpbgogICAgICAgICAgcHJldmlvdXMgdmVyc2lvbnMpLiAqKlBPVEVOVElBTCBJTkNPTVBBVElCSUxJVFkqKgoKNC8xMS85NyA6IEZpeGVkIGEgcmF0aGVyIG5hc3R5IGJ1ZyBpbiB0aGUgUGVybDUgbW9kdWxlIHJlbGF0ZWQgdG8gdXNpbmcKICAgICAgICAgIHZhcmlhYmxlIGxpbmtpbmcgd2l0aCBjb21wbGV4IGRhdGF0eXBlcyBhbmQgcG9pbnRlcnMuICAgT24gVW5peCwKICAgICAgICAgIGNvZGUgd291bGQgd29yayAoc29tZWhvdyksIGJ1dCB3b3VsZCBjYXVzZSBhbiBhY2Nlc3MgdmlvbGF0aW9uCiAgICAgICAgICB1bmRlciBXaW5kb3dzLU5ULiAgVGhlIGZpeCBzaG91bGQgY29ycmVjdCB0aGUgcHJvYmxlbSwKICAgICAgICAgIGJ1dCB0aGVyZSBtYXkgc3RpbGwgYmUgYSBwcm9ibGVtIHVzaW5nIGdsb2JhbCB2YXJpYWJsZXMgb2YKICAgICAgICAgIGNvbXBsZXggZGF0YXR5cGVzIGluIGNvbmp1bmN0aW9uIHdpdGggc2hhZG93IGNsYXNzZXMuICBGb3J0dW5hdGVseSwKICAgICAgICAgIHRoaXMgc29ydCBvZiB0aGluZyBzZWVtcyB0byBiZSByZWxhdGl2ZWx5IHJhcmUgKGNvbnNpZGVyaW5nCiAgICAgICAgICB0aGF0IHRoZSBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBtb3JlIHRoYW4gYSB5ZWFyIC0geWlrZXMhKS4KCjQvMTEvOTcgOiBGaXhlZCBiaXphcnJlIGNvbnN0YW50IGV2YWx1YXRpb24gYnVnIGluIFBlcmw1IGNvZGUgZ2VuZXJhdGlvbgogICAgICAgICAgd2hlbiBydW5uaW5nIHVuZGVyIFdpbmRvd3MtTlQuCgo0LzgvOTcgIDogQnVnIHdoZW4gdXNpbmcgZGVmYXVsdCBhcmd1bWVudHMgYW5kIEMrKyByZWZlcmVuY2VzIGZpeGVkLgoKNC84Lzk3ICA6IEZpeGVkIGNvZGUgZ2VuZXJhdGlvbiBidWdzIGluIFB5dGhvbiBhbmQgUGVybDUgbW9kdWxlcyByZWxhdGVkIHRvCiAgICAgICAgICB1c2luZyBjbGFzcyByZW5hbWluZyAoYXBwbHlpbmcgdGhlICVuYW1lIGRpcmVjdGl2ZSB0byBhIGNsYXNzCiAgICAgICAgICBkZWZpbml0aW9uKSBhbmQgc2hhZG93IGNsYXNzZXMuCgo0LzcvOTcgIDogRml4ZWQgbWlub3IgYnVncyBpbiBzd2lncHRyLnN3ZywgdGNsOHB0ci5zd2csIGFuZCBwZXJsNXB0ci5zd2cgdG8KICAgICAgICAgIHByZXZlbnQgaW5maW5pdGUgbG9vcHMgd2hlbiB3ZWlyZCBkYXRhdHlwZXMgYXJlIHBhc3NlZC4KCjMvMjkvOTcgOiAnTWFrZWZpbGUud2luJyBhZGRlZC4gICBUaGlzIGlzIHVzZWQgdG8gYnVpbGQgbW9zdCBvZiB0aGUgZXhhbXBsZXMKICAgICAgICAgIGluIHRoZSBFeGFtcGxlcyBkaXJlY3RvcnkgdW5kZXIgV2luZG93cyBOVC85NS4KCjMvMjcvOTcgOiBGaXhlcyB0byBTV0lHJ3MgZXJyb3IgcmV0dXJuIGNvZGVzLiAgIFNXSUcgbm93IHJldHVybnMgbm9uLXplcm8KICAgICAgICAgIGV4aXQgY29kZXMgZm9yIGNlcnRhaW4ga2luZHMgb2YgZXJyb3JzICh3aGljaCBtYWtlcyBpdCBtb3JlCiAgICAgICAgICBmcmllbmRseSB0byBtYWtlZmlsZXMpLiAgICAgQW4gb3ZlcmhhdWwgb2YgdGhlIGVycm9yIGhhbmRsaW5nCiAgICAgICAgICBpcyBvbiB0aGUgdG8tZG8gbGlzdCBhbmQgd2lsbCBwcm9iYWJseSBzaG93IHVwIGluIGEgbGF0ZXIgcmVsZWFzZS4KCjMvMjUvOTcgOiBCdWcgZml4LiAgImZyZWVhcmciIGFuZCAiYXJnb3V0IiB0eXBlbWFwcyBoYXZlIGJlZW4gZml4ZWQgaW4KICAgICAgICAgIHRoZSBQZXJsNSBtb2R1bGUuICBJbiBwcmV2aW91cyB2ZXJzaW9ucywgZnVuY3Rpb24gaW5wdXQgcGFyYW1ldGVycwogICAgICAgICAgYW5kIGZ1bmN0aW9uIG91dHB1dCBwYXJhbWV0ZXJzIHNoYXJlZCB0aGUgc2FtZSBtZW1vcnkgc3BhY2UtLWNhdXNpbmcKICAgICAgICAgIGFsbCBzb3J0cyBvZiBuYXN0eSBwcm9ibGVtcyB3aGVuIHRyeWluZyB0byBwYXNzIHBlcmwgdmFsdWVzIGJ5CiAgICAgICAgICByZWZlcmVuY2UuICAgU1dJRyBub3cgaW50ZXJuYWxseSBtYWtlcyBhICJjb3B5IiAod2hpY2ggaXMgcmVhbGx5CiAgICAgICAgICBqdXN0IGEgcG9pbnRlcikgb2YgYWZmZWN0ZWQgcGFyYW1ldGVycyBhbmQgdXNlcyB0aGF0LiAgIFRoaXMKICAgICAgICAgIGlzIGRvbmUgdHJhbnNwYXJlbnRseSBzbyB0aGVyZSBpcyBubyBub3RpY2FibGUgaW1wYWN0IG9uIGFueQogICAgICAgICAgU1dJRyBnZW5lcmF0ZWQgbW9kdWxlcy4gICBUaGlzIGNoYW5nZSBpcyBwcm9iYWJseSBvbmx5IG5vdGljYWJsZQogICAgICAgICAgdG8gZXhwZXJ0IHVzZXJzLgoKMy8yNS85NyA6IEFkZGVkIHR5cGUtY2hlY2sgdG8gdmVyYm9zZSBhbmQgc3RhdCBtb2RlLiAgU1dJRyB3aWxsIG5vdyBnZW5lcmF0ZSBhIGxpc3QKICAgICAgICAgIG9mIGFsbCBkYXRhdHlwZXMgdGhhdCB3ZXJlIHVzZWQgYnV0IHVuZGVmaW5lZCAodXNlZnVsIGZvciB0cmFja2luZwogICAgICAgICAgZG93biB3ZWlyZCBidWdzKS4gICBUaGlzIGlzIGVuYWJsZWQgd2l0aCB0aGUgLXYgb3B0aW9uICh3aGljaAogICAgICAgICAgaXMgbm93IG9mZmljaWFsbHkga25vd24gYXMgIm92ZXJseSB2ZXJib3NlIiBtb2RlKSBvciB0aGUgLXN0YXQgb3B0aW9uLgoKMy8yNS85NyA6IFNsaWdodCBjaGFuZ2UgdG8gdGhlIHBhcnNlciB0byBtYWtlIGluY2x1ZGUgZ3VhcmRzIHdvcmsgY29ycmVjdGx5LgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgICNpZm5kZWYgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICNkZWZpbmUgSU5URVJGQUNFX0kKICAgICAgICAgICAgICAgICVtb2R1bGUgZm9vYmFyLmkKICAgICAgICAgICAgICAgIC4uLiBkZWNsYXJhdGlvbnMgLi4uCiAgICAgICAgICAgICAgICAjZW5kaWYKCjMvMjQvOTcgOiAlY2hlY2tvdXQgZGlyZWN0aXZlIGFkZGVkLiAgIFRoaXMgYWxsb3dzIGFuIGludGVyZmFjZSBmaWxlIHRvCiAgICAgICAgICBleHRyYWN0IGZpbGVzIGZyb20gdGhlIFNXSUcgbGlicmFyeSBhbmQgcGxhY2UgdGhlbSBpbiB0aGUKICAgICAgICAgIGN1cnJlbnQgZGlyZWN0b3J5LiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gZXh0cmFjdCBzY3JpcHRzIGFuZAogICAgICAgICAgb3RoZXIgaGVscGVyIGNvZGUgdGhhdCBtaWdodCBiZSBhc3NvY2lhdGVkIHdpdGggbGlicmFyeSBmaWxlcy4KICAgICAgICAgIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAlY2hlY2tvdXQgYXJyYXkudGNsCgogICAgICAgICAgV2lsbCBsb29rIGZvciBhIGZpbGUgImFycmF5LnRjbCIgaW4gdGhlIGxpYnJhcnkgYW5kIGNvcHkgaXQKICAgICAgICAgIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4gICAgSWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgaW4gdGhlCiAgICAgICAgICBkaXJlY3RvcnksIHRoaXMgZGlyZWN0aXZlIGRvZXMgbm90aGluZyAoaXQgd2lsbCBub3Qgb3ZlcndyaXRlIGFuCiAgICAgICAgICBleGlzdGluZyBmaWxlKS4gIFRoaXMgb25seSBhbiBleHBlcmltZW50YWwgZmVhdHVyZSBmb3Igbm93LgoKMy8yNC85NyA6IFNXSUcgd2lsbCBub3cgbG9vayBpbiB0aGUgU1dJRyBMaWJyYXJ5IGZvciBhIGZpbGUgaWYgaXQgY2FuJ3QKICAgICAgICAgIGZpbmQgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgQXMgYSByZXN1bHQsIGl0IGlzIGVhc3kgdG8KICAgICAgICAgIG1ha2UgbW9kdWxlcyBmcm9tIFNXSUcgbGlicmFyeSBmaWxlcy4gIEZvciBleGFtcGxlLCBpZiB5b3UKICAgICAgICAgIHdhbnQgdG8gbWFrZSBhIFB5dGhvbiBtb2R1bGUgZnJvbSB0aGUgU1dJRyB0aW1lcnMgbGlicmFyeSwganVzdAogICAgICAgICAgdHlwZSB0aGlzIGluIGFueSBkaXJlY3RvcnkgOgoKICAgICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiB0aW1lcnMuaQoKICAgICAgICAgIFlvdSB3aWxsIGdldCB0aGUgZmlsZXMgdGltZXJzX3dyYXAuYyBhbmQgdGltZXJzX3dyYXAuZG9jIGluCiAgICAgICAgICB0aGUgY3VycmVudCBkaXJlY3RvcnkgdGhhdCB5b3UgY2FuIG5vdyBjb21waWxlLiAgIFRoZSBmaWxlCiAgICAgICAgICByZW1haW5zIGluIHRoZSBTV0lHIGxpYnJhcnkgKGFsdGhvdWdoIHlvdSBjYW4gY2hlY2sgaXQgb3V0CiAgICAgICAgICB1c2luZyB0aGUgLWNvIG9wdGlvbikuICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogLWNvIG9wdGlvbiBhZGRlZCB0byBTV0lHIHRvIGFsbG93IGVhc3kgYWNjZXNzIHRvIHRoZSBTV0lHIGxpYnJhcnkuCiAgICAgICAgICBXaGVuIHVzZWQsIHRoaXMgaW5zdHJ1Y3RzIFNXSUcgdG8gY2hlY2sgb3V0IGEgbGlicmFyeSBmaWxlIGFuZAogICAgICAgICAgcGxhY2UgaXQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgIHVuaXggPiBzd2lnIC1jbyBhcnJheS5pCiAgICAgICAgICAgICAgICBhcnJheS5pIGNoZWNrZWQgb3V0IGZyb20gdGhlIFNXSUcgbGlicmFyeQogICAgICAgICAgICAgICAgdW5peCA+CgogICAgICAgICAgT25jZSBpbiB5b3VyIGRpcmVjdG9yeSB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgZmlsZSB0byBzdWl0IHlvdXIKICAgICAgICAgIHBhcnRpY3VsYXIgcHVycG9zZXMuICBUaGUgY2hlY2tvdXQgb3B0aW9uIG1ha2VzIGl0IGVhc3kgdG8KICAgICAgICAgIGdyYWIgbGlicmFyeSBmaWxlcyB3aXRob3V0IGtub3dpbmcgYW55dGhpbmcgYWJvdXQgdGhlIFNXSUcKICAgICAgICAgIGluc3RhbGxhdGlvbiwgYnV0IGl0IGFsc28gbWFrZXMgaXQgcG9zc2libGUgdG8gc3RhcnQKICAgICAgICAgIGluY2x1ZGluZyBzY3JpcHRzLCBDIGNvZGUsIGFuZCBvdGhlciBtaXNjZWxsYW5lb3VzIGZpbGVzCiAgICAgICAgICBpbiB0aGUgbGlicmFyeS4gIEZvciBleGFtcGxlLCB5b3UgY291bGQgcHV0IGEgY29vbCBzY3JpcHQKICAgICAgICAgIGluIHRoZSBsaWJyYXJ5IGFuZCBjaGVjayBpdCBvdXQgd2hlbmV2ZXIgeW91IHdhbnRlZCB0byB1c2UgaXQuCiAgICAgICAgICAqKiogTmV3IEZlYXR1cmUgKioqCgozLzI0Lzk3IDogI3ByYWdtYSBleHBvcnQgZGlyZWN0aXZlcyBhZGRlZCB0byBUY2wgb3V0cHV0IGZvciBjb21waWxpbmcKICAgICAgICAgIHNoYXJlZCBsaWJyYXJpZXMgb24gdGhlIE1hYy4KCjMvMjQvOTcgOiBNaW5vciBjaGFuZ2VzIHRvIHdpc2guaSBhbmQgdGNsc2guaSBsaWJyYXJ5IGZpbGVzIHRvIHByb3ZpZGUKICAgICAgICAgIHN1cHBvcnQgZm9yIHRoZSBNYWNpbnRvc2guCgozLzE5Lzk3IDogU1dJRydzIHBvbGljeSB0b3dhcmRzIE5VTEwgcG9pbnRlcnMgaGFzIGJlZW4gcmVsYXhlZC4gIFRoZQogICAgICAgICAgcG9saWN5IG9mIHJlcXVpcmluZyBhIHNwZWNpYWwgY29tcGlsZXIgZGlyZWN0aXZlIC1EQUxMT1dfTlVMTAogICAgICAgICAgdG8gdXNlIE5VTEwgcG9pbnRlcnMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIFdoaWxlIHRoaXMgbWF5CiAgICAgICAgICBzZWVtICJ1bnNhZmUiLCBpdCB0dXJucyBvdXQgdGhhdCB5b3UgY2FuIHVzZSBhICJjaGVjayIKICAgICAgICAgIHR5cGVtYXAgdG8gYWNoaWV2ZSBzb21lIHNhZmV0eS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIE5vZGUgKiB7CiAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGFyZ2V0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIk5VTEwgUG9pbnRlcnMgbm90IGFsbG93ZWQuIik7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyBwcmV2ZW50cyBhbnkgTlVMTCB2YWx1ZSBvZiBhICJOb2RlICoiIHBvaW50ZXIgdG8gYmUKICAgICAgICAgIHBhc3NlZCB0byBhIGZ1bmN0aW9uLiAgIChJIHRoaW5rIHRoaXMgaXMgbXVjaCBjbGVhbmVyCiAgICAgICAgICB0aGFuIHRoZSBvbGQgLURBTExPV19OVUxMIGhhY2sgYW55d2F5cykuCgozLzE5Lzk3IDogRml4ZWQgcG9pbnRlciBoYW5kbGluZyBlcnJvcnMgaW4gUGVybDUgbW9kdWxlLiAgTW9kdWxlcyBubwogICAgICAgICAgbG9uZ2VyIGNvcmUgZHVtcCB3aGVuIGEgUGVybCByZWZlcmVuY2UgaXMgaW5hZHZlcnRlbnRseQogICAgICAgICAgcGFzc2VkIGluIGFzIGEgQyBwb2ludGVyLgoKMy8xOC85NyA6IEFkZGVkIGEgImNoZWNrIiB0eXBlbWFwLiAgIFRoaXMgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdGhlCiAgICAgICAgICB2YWxpZGl0eSBvZiBmdW5jdGlvbiBpbnB1dCB2YWx1ZXMuICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgJXR5cGVtYXAocGVybDUsY2hlY2spIGludCBwb3NpbnQgewogICAgICAgICAgICAgICAgICAgICAgIGlmICgkdGFyZ2V0IDwgMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvYWsoIkFyZ3VtZW50IGlzIG5vdCBhIHBvc2l0aXZlIGludGVnZXIiKTsKICAgICAgICAgICAgICAgIH0KCjMvMTgvOTcgOiBBZGRlZCBhbiAkYXJnIHZhcmlhYmxlIHRvIFRjbCB0eXBlbWFwcy4gICBUaGlzIG1ha2VzIGl0IGVhc2llcgogICAgICAgICAgdG8gcmV0dXJuIGFyZ3VtZW50IHZhbHVlcyBieSAicmVmZXJlbmNlIi4KCjMvMTgvOTcgOiBGaXhlZCBhIGNvZGUgZ2VuZXJhdGlvbiBidWcgd2hlbiB1c2luZyBDKysgcmVmZXJlbmNlcyBhbmQKICAgICAgICAgIHRoZSAlYWRkbWV0aG9kcyBkaXJlY3RpdmUuCgozLzE4Lzk3IDogRml4ZWQgYSBmZXcgZ2xpdGNoZXMgaW4gdGhlIHR5cGVtYXAgbW9kdWxlIHdpdGggcmVzcGVjdCB0bwogICAgICAgICAgY2hhaW5pbmcuIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGludCB7CiAgICAgICAgICAgICAgICAgICAgICAgJGluICAgICAgICAgICAgICAgIC8vIEluc2VydHMgcHJleGlzdGluZyB0eXBlbWFwCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJSZWNlaXZlZCBhICVkXG4iLCAkdGFyZ2V0KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICBUaGlzIGhhcyBiZWVuIGFsbG93ZWQgZm9yIHF1aXRlIHNvbWUgdGltZSwgYnV0IGRpZG4ndCB3b3JrCiAgICAgICAgICBpZiBubyBleGlzdGluZyB0eXBlbWFwIHdhcyBkZWZpbmVkLiAgTm93LCBpdCBzdGlsbCBkb2Vzbid0CiAgICAgICAgICB3b3JrIGlmIG5vIGV4aXN0aW5nIHR5cGVtYXAgaXMgZGVmaW5lZCwgYnV0IGl0IGlzc3VlcyBhCiAgICAgICAgICB3YXJuaW5nIG1lc3NhZ2UuICAgVGhlcmUgaXMgc29tZSBzdXBwb3J0IHVzaW5nIGRlZmF1bHQgdHlwZW1hcHMsCiAgICAgICAgICBidXQgbm9uZSBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyB0YWtlIGFkdmFudGFnZSBvZiBpdC4gIFRoaXMKICAgICAgICAgIHNob3VsZCBiZSBjb25zaWRlcmVkIGV4cGVyaW1lbnRhbCBhdCB0aGlzIHRpbWUuCgpWZXJzaW9uIDEuMWI1IFBhdGNoIDEgKE1hcmNoIDE2LCAxOTk3KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKMy8xNi85NyA6IEZpeGVkIHJlZmVyZW5jZXMgYnVnIHdpdGggQysrIGNvZGUgZ2VuZXJhdGlvbi4KCjMvMTYvOTcgOiBGaXhlZCBpbml0aWFsaXphdGlvbiBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIHRoYXQKICAgICAgICAgIHdhcyBjYXVzaW5nIHdlaXJkIHByb2JsZW1zLgoKMy8xNi85NyA6IEZpeGVkIGZhdGFsIGJ1ZyB3aXRoIC1jIG9wdGlvbiBpbiB0aGUgUHl0aG9uIG1vZHVsZS4KCjMvMTMvOTcgOiBGaXhlZCBidWcgaW4gdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtIGludm9sdmluZyB0aGUgJXRleHQgZGlyZWN0aXZlCiAgICAgICAgICBhbmQgc29ydGluZy4gSW4gdGhlIG9sZCBzeXN0ZW0sICV0ZXh0IGVudHJpZXMgd291bGQgZmxvYXQgdG8gdGhlCiAgICAgICAgICB0b3Agb2YgYSBzZWN0aW9uIGJlY2F1c2UgdGhleSB3ZXJlICJuYW1lbGVzcyIuICAgTm93IHRoZXkgYXJlCiAgICAgICAgICBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMgZGVjbGFyYXRpb24gYW5kIHdpbGwgc3RheSBpbiB0aGUgcHJvcGVyCiAgICAgICAgICBsb2NhdGlvbiByZWxhdGl2ZSB0byB0aGUgcHJldmlvdXMgZW50cnkuCgpWZXJzaW9uIDEuMWI1IChNYXJjaCAxMiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgozLzExLzk3IDogRml4ZWQgY29tcGlsYXRpb24gcHJvYmxlbXMgaW50cm9kdWNlZCBieSBUY2wvVGsgOC4wYTIuCiAgICAgICAgICAqKiogSU5DT01QQVRJQklMSVRZICoqKiBTV0lHIG5vIGxvbmdlciB3b3JrcyB3aXRoIFRjbC9UayA4LjBhMS4KCjMvMTAvOTcgOiBGaXhlZCBidWcgd2l0aCBpZ25vcmVkIGFyZ3VtZW50cyBhbmQgQysrIG1lbWJlciBmdW5jdGlvbnMgaW4KICAgICAgICAgIHRoZSBQeXRob24gbW9kdWxlLgoKMy85Lzk3ICA6IFBhcnNpbmcgYnVncyB3aXRoIG5lc3RlZCBjbGFzcyBkZWZpbml0aW9ucyBhbmQgcHJpdmF0ZWx5CiAgICAgICAgICBkZWNsYXJlZCBuZXN0ZWQgY2xhc3MgZGVmaW5pdGlvbnMgZml4ZWQuCgozLzkvOTcgIDogRml4ZWQgYSBmZXcgbWlub3IgY29kZSBnZW5lcmF0aW9uIGJ1Z3Mgd2l0aCBDKysgY2xhc3NlcyBhbmQKICAgICAgICAgIGNvbnN0cnVjdG9ycy4gICBJbiBzb21lIGNhc2VzLCB0aGUgcmVzdWx0aW5nIHdyYXBwZXIgY29kZQogICAgICAgICAgd291bGQgbm90IGNvbXBpbGUgcHJvcGVybHkuICAgU1dJRyBub3cgYXR0ZW1wdHMgdG8gdXNlCiAgICAgICAgICB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGluc3RlYWQuCgozLzgvOTcgIDogQWRkZWQgYSAtbCBvcHRpb24gdG8gU1dJRyB0aGF0IGFsbG93cyBhZGRpdGlvbmFsIFNXSUcgbGlicmFyeSBmaWxlcwogICAgICAgICAgdG8gYmUgZ3JhYmJlZCB3aXRob3V0IGhhdmluZyB0aGVtIHNwZWNpZmllZCBpbiB0aGUgaW50ZXJmYWNlIGZpbGUuCiAgICAgICAgICBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBrZWVwIHRoZSBpbnRlcmZhY2UgZmlsZSBjbGVhbiBhbmQgbW92ZSBjZXJ0YWluCiAgICAgICAgICBvcHRpb25zIGludG8gYSBNYWtlZmlsZS4gICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgIHN3aWcgLXRjbCBleGFtcGxlLmkgICAgICAgICAgICAgICMgIEJ1aWxkIGEgbm9ybWFsIFRjbCBleHRlbnNpb24KICAgICAgICAgICAgICBzd2lnIC10Y2wgLWx3aXNoLmkgZXhhbXBsZS5pICAgICAjICBCdWlsZCBpdCBhcyBhIHdpc2ggZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgYnkgaW5jbHVkaW5nIHRoZSAnd2lzaC5pJyBmaWxlLgoKICAgICAgICAgICAgICBzd2lnIC1weXRob24gZXhhbXBsZS5pICAgICAgICAgICAjIEJ1aWxkIGEgZHluYW1pY2FsbHkgbG9hZGVkIGV4dGVuc2lvbgogICAgICAgICAgICAgIHN3aWcgLXB5dGhvbiAtbGVtYmVkLmkgZXhhbXBsZS5pICMgQnVpbGQgYSBzdGF0aWMgZXh0ZW5zaW9uCgogICAgICAgICAgVGhlc2Uga2luZHMgb2Ygb3B0aW9ucyBjb3VsZCBwcmV2aW91c2x5IGJlIGFjY29tcGxpc2hlZCB3aXRoCiAgICAgICAgICBjb25kaXRpb25hbCBjb21waWxhdGlvbiBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgICAgICAlbW9kdWxlIGV4YW1wbGUKICAgICAgICAgICAgICAgICAgIC4uLgogICAgICAgICAgICAgICAgICAgI2lmZGVmIFNUQVRJQwogICAgICAgICAgICAgICAgICAgJWluY2x1ZGUgZW1iZWQuaQogICAgICAgICAgICAgICAgICAgI2VuZGlmCgozLzgvOTcgIDogSW5jb3Jwb3JhdGVkIGNoYW5nZXMgdG8gR3VpbGUgbW9kdWxlIHRvIHVzZSB0aGUgbmV3IGdoIGludGVyZmFjZQogICAgICAgICAgaW4gRlNGIEd1aWxlIDEuMC4gICAgVGhlIG9sZGVyIGdzY20gaW50ZXJmYWNlIHVzZWQgaW4gQ3lnbnVzCiAgICAgICAgICBHdWlsZSByZWxlYXNlcyBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGJ5IFNXSUcuCgozLzgvOTcgIDogQ2xlYW5lZCB1cCB0aGUgVGNsIE5ldHNjYXBlIHBsdWdpbiBleGFtcGxlLiAgIEl0IHNob3VsZCB3b3JrIHdpdGgKICAgICAgICAgIHZlcnNpb24gMS4xIG9mIHRoZSBwbHVnaW4gbm93LgoKMy84Lzk3ICA6IEFkZGVkIGJldHRlciBhcnJheSBzdXBwb3J0IHRvIHRoZSB0eXBlbWFwIG1vZHVsZS4gIFRoZSBrZXl3b3JkCiAgICAgICAgICBBTlkgY2FuIG5vdyBiZSB1c2VkIHRvIG1hdGNoIGFueSBhcnJheSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uIGdldCBhbiBhcnJheSAuLi4KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgVGhpcyB3aWxsIG1hdGNoIGFueSBzaW5nbGUtZGltZW5zaW9uYWwgZG91YmxlIGFycmF5LiAgIFRoZSBhcnJheQogICAgICAgICAgZGltZW5zaW9uIGlzIHBhc3NlZCBpbiB0aGUgdmFyaWFibGVzICRkaW0wLCAkZGltMSwgLi4uICRkaW05LiAgRm9yCiAgICAgICAgICBleGFtcGxlIDoKCgkJICAgICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFtBTlldW0FOWV1bQU5ZXSB7CgkJCXByaW50ZigiUmVjZWl2ZWQgYSBkb3VibGVbJWRdWyVkXVslZF1cbiIsJGRpbTAsJGRpbTEsJGRpbTIpOwoJICAgICAgICAgICAgfQoKICAgICAgICAgIEFueSB0eXBlbWFwIGludm9sdmluZyBhIHNwZWNpZmljIGFycmF5IGRpbWVuc2lvbiB3aWxsIG92ZXJyaWRlIGFueQogICAgICAgICAgc3BlY2lmaWVkIHdpdGggdGhlIEFOWSB0YWcuICBUaHVzLCBhICV0eXBlbWFwKHRjbCxpbikgZG91YmxlIFs1XVs0XVtBTlldIHt9CiAgICAgICAgICB3b3VsZCBvdmVycmlkZSBhIGRvdWJsZSBbQU5ZXVtBTlldW0FOWV0uICBIb3dldmVyLCBvdmVydXNlIG9mIHRoZSBBTlkKICAgICAgICAgIHRhZyBpbiBhcnJheXMgb2YgaGlnaC1kaW1lbnNpb25zIG1heSBub3Qgd29yayBhcyB5b3UgZXhwZWN0IGR1ZSB0bwogICAgICAgICAgdGhlIHBhdHRlcm4gbWF0Y2hpbmcgcnVsZSB1c2VkLiBGb3IgZXhhbXBsZSwgd2hpY2ggb2YgdGhlIGZvbGxvd2luZwogICAgICAgICAgdHlwZW1hcHMgaGFzIHByZWNlZGVuY2U/CgogICAgICAgICAgICAgICAgICAgICAgJXR5cGVtYXAoaW4pIGRvdWJsZSBbQU5ZXVs1XSB7fSAgICAgLy8gQXZvaWQgdGhpcyEKICAgICAgICAgICAgICAgICAgICAgICV0eXBlbWFwKGluKSBkb3VibGUgWzVdW0FOWV0ge30KCjMvNy85NyAgOiBGaXhlZCBhIG51bWJlciBvZiBidWdzIHJlbGF0ZWQgdG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgaGFuZGxpbmcuCiAgICAgICAgICBUeXBlZGVmcyBpbnZvbHZpbmcgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIG5vdyB3b3JrcyBjb3JyZWN0bHkuCiAgICAgICAgICBGb3IgZXhhbXBsZSA6CgogICAgICAgICAgICAgICAgICAgIHR5cGVkZWYgZG91YmxlIE1BVFJJWFs0XVs0XTsKCiAgICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICAgZXh0ZXJuIGRvdWJsZSBmb28oTUFUUklYIGEpOwoKICAgICAgICAgIFR5cGVjYXN0aW5nIG9mIHBvaW50ZXJzIGludG8gbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzIGlzIG5vdwogICAgICAgICAgaW1wbGVtZW50ZWQgcHJvcGVybHkgd2hlbiBtYWtpbmcgQy9DKysgZnVuY3Rpb24gY2FsbHMuCgozLzYvOTcgIDogRml4ZWQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGJ1ZyBpbiB0aGUgVGNsIE9iamVjdC1vcmllbnRlZAogICAgICAgICAgaW50ZXJmYWNlLiAgV2VsbCwgYWN0dWFsbHksIGRpZG4ndCBmaXggaXQgYnV0IGlzc3VlZCBhCiAgICAgICAgICBUY2wgZXJyb3IgaW5zdGVhZC4gICBUaGUgYnVnIHdvdWxkIG1hbmlmZXN0IGl0c2VsZiBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAlIHNldCBsIFtMaXN0XSAgICAgICAgICAgIyBDcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgJSBzZXQgbSBbTGlzdCAtdGhpcyAkbF0gICMgTWFrZSAkbSBpbnRvIGFuIG9iamVjdCBhc3N1bWluZyAkbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbnRhaW5zIGEgcG9pbnRlci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBTaW5jZSAkbSA9PSAkbCwgJGwgZ2V0cyBkZXN0cm95ZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAoc2luY2UgaXRzIHRoZSBzYW1lIGNvbW1hbmQgbmFtZSkKICAgICAgICAgICAgICAgICAlICRtIGluc2VydCBGb28KICAgICAgICAgICAgICAgICBTZWdtZW50YXRpb24gZmF1bHQgICAgICAgIyBOb3RlIDogdGhlIGxpc3Qgbm8gbG9uZ2VyIGV4aXN0cyEKCiAgICAgICAgICBOb3csIGFuIGVycm9yIHdpbGwgYmUgZ2VuZXJhdGVkIGluc3RlYWQgb2YgcmVkZWZpbmluZyB0aGUgY29tbWFuZC4KICAgICAgICAgIEFzIGluIDoKCiAgICAgICAgICAgICAgICAgJSBzZXQgbCBbTGlzdF0KICAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgICAgICAlIHNldCBtIFtMaXN0IC10aGlzICRsXQogICAgICAgICAgICAgICAgIE9iamVjdCBuYW1lIGFscmVhZHkgZXhpc3RzIQoKICAgICAgICAgIFVzZSBjYXRjaHt9IHRvIGlnbm9yZSB0aGUgZXJyb3IuCgozLzMvOTcgIDogQmV0dGVyIHN1cHBvcnQgZm9yIGVudW1zIGFkZGVkLiAgIERhdGF0eXBlcyBvZiAnZW51bSBNeUVudW0nCiAgICAgICAgICBhbmQgdHlwZWRlZnMgc3VjaCBhcyAndHlwZWRlZiBlbnVtIE15RW51bSBGb287JyBub3cgd29yay4KCjMvMy85NyAgOiBQYXJzZXIgbW9kaWZpZWQgdG8gaWdub3JlIGNvbnN0cnVjdG9yIGluaXRpYWxpemVycyBzdWNoIGFzIDoKCiAgICAgICAgICAgICAgIGNsYXNzIEZvbyA6IHB1YmxpYyBCYXIgewogICAgICAgICAgICAgICBpbnQgYSxiOwogICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgIEZvbyhpbnQgaSkgOiBhKDApLCBiKGkpLCBCYXIoaSwwKSB7IH07CiAgICAgICAgICAgICAgIH07CgozLzMvOTcgIDogTW9kaWZpZWQgcGFyc2VyIHRvIGlnbm9yZSBDKysgZXhjZXB0aW9uIHNwZWNpZmljYXRpb25zIHN1Y2ggYXMgOgoKICAgICAgICAgICAgICAgaW50IGZvbyhkb3VibGUpIHRocm93KFgsWSk7CgozLzMvOTcgIDogQWRkZWQgJWltcG9ydCBkaXJlY3RpdmUuICBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSAlZXh0ZXJuCiAgICAgICAgICBleGNlcHQgaXQgdGVsbHMgdGhlIGxhbmd1YWdlIG1vZHVsZSB0aGF0IHRoZSBkZWNsYXJhdGlvbnMgYXJlCiAgICAgICAgICBjb21pbmcgZnJvbSBhIHNlcGFyYXRlIG1vZHVsZS4gICBUaGlzIGlzIHVzdWFsbHkgb25seQogICAgICAgICAgbmVlZGVkIHdoZW4gd29ya2luZyB3aXRoIHNoYWRvdyBjbGFzc2VzLgoKMy8yLzk3ICA6IENoYW5nZWQgcG9pbnRlciB0eXBlLWNoZWNrZXIgdG8gYmUgc2lnbmlmaWNhbnRseSBtb3JlCiAgICAgICAgICBlZmZpY2llbnQgd2hlbiB3b3JraW5nIHdpdGggZGVyaXZlZCBkYXRhdHlwZXMuICBUaGlzCiAgICAgICAgICBoYXMgYmVlbiBhY2NvbXBsaXNoZWQgYnkgc3RvcmluZyB0eXBlLW1hcHBpbmdzIGluIHNvcnRlZAogICAgICAgICAgb3JkZXIsIHVzaW5nIGJpbmFyeSBzZWFyY2ggc2NoZW1lcywgYW5kIGNhY2hpbmcgcmVjZW50bHkKICAgICAgICAgIHVzZWQgZGF0YXR5cGVzLiAgIEZvciBTV0lHIGdlbmVyYXRlZCBDKysgbW9kdWxlcyB0aGF0CiAgICAgICAgICBtYWtlIGEgbGFyZ2UgbnVtYmVyIG9mIEMgZnVuY3Rpb24gY2FsbHMgd2l0aCBkZXJpdmVkIHR5cGVzLAogICAgICAgICAgdGhpcyBjb3VsZCByZXN1bHQgaW4gc3BlZWR1cHMgb2YgYmV0d2VlbiAxMDAgYW5kIDUwMDAwIHBlcmNlbnQuCiAgICAgICAgICBIb3dldmVyLCBkdWUgdG8gdGhlIHJlcXVpcmVkIHNvcnRpbmcgb3BlcmF0aW9uLCBtb2R1bGUKICAgICAgICAgIGxvYWRpbmcgdGltZSBtYXkgaW5jcmVhc2VkIHNsaWdodGx5IHdoZW4gdGhlcmUgYXJlIGxvdHMgb2YKICAgICAgICAgIGRhdGF0eXBlcy4KCjMvMi85NyAgOiBGaXhlZCBzb21lIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtcyB3aXRoIFB5dGhvbgogICAgICAgICAgZW1iZWQuaSBsaWJyYXJ5IGZpbGVzLgoKMi8yNy85NyA6IFNsaWdodCBjaGFuZ2UgdG8gQysrIGNvZGUgZ2VuZXJhdGlvbiB0byB1c2UgY29weSBjb25zdHJ1Y3RvcnMKICAgICAgICAgIHdoZW4gcmV0dXJuaW5nIGNvbXBsZXggZGF0YSB0eXBlIGJ5IHZhbHVlLgoKMi8yNi85NyA6IEZpeGVkIGJ1ZyBpbiBQeXRob24gbW9kdWxlIHdpdGggLWMgb3B0aW9uLgoKMi8yNi85NyA6IFNsaWdodCB0d2VhayBvZiBwYXJzZXIgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bWVyYXRpb25zCiAgICAgICAgICBzdWNoIGFzCgogICAgICAgICAgICAgICAgZW51bSBWYWx1ZSAoQUxFLCBTVE9VVCwgTEFHRVIsIH07CgoyLzI1Lzk3IDogRml4ZWQgY29kZSBnZW5lcmF0aW9uIGJ1ZyBpbiBUY2wgbW9kdWxlIHdoZW4gdXNpbmcgdGhlCiAgICAgICAgICAlbmFtZSgpIGRpcmVjdGl2ZSBvbiBhIGNsYXNzbmFtZS4KCjIvMjUvOTcgOiBGaW5pc2hlZCBjb2RlLXNpemUgb3B0aW1pemF0aW9uIG9mIEMrKyBjb2RlIGdlbmVyYXRpb24gd2l0aAogICAgICAgICAgaW5oZXJpdGFuY2Ugb2YgYXR0cmlidXRlcy4gICAgSW5oZXJpdGVkIGF0dHJpYnV0ZXMgbm93CiAgICAgICAgICBvbmx5IGdlbmVyYXRlIG9uZSBzZXQgb2Ygd3JhcHBlciBmdW5jdGlvbnMgdGhhdCBhcmUgcmUtdXNlZAogICAgICAgICAgaW4gYW55IGRlcml2ZWQgY2xhc3Nlcy4gICBUaGlzIGNvdWxkIHByb3ZpZGUgYmlnIGNvZGUKICAgICAgICAgIHNpemUgaW1wcm92ZW1lbnRzIGluIHNvbWUgc2NyaXB0aW5nIGxhbmd1YWdlIGludGVyZmFjZXMuCgoyLzI1Lzk3IDogUGVybDUgbW9kdWxlIG1vZGlmaWVkIHRvIHN1cHBvcnQgYm90aCB0aGUgVW5peCBhbmQgV2luZG93cwogICAgICAgICAgdmVyc2lvbnMuICBUaGUgd2luZG93cyB2ZXJzaW9uIGhhcyBiZWVuIHRlc3RlZCB3aXRoIHRoZQogICAgICAgICAgQWN0aXZld2FyZSBwb3J0IG9mIFBlcmwgNS4wMDMgcnVubmluZyB1bmRlciBXaW5kb3dzIDk1LgogICAgICAgICAgVGhlIEMgc291cmNlIGdlbmVyYXRlZCBieSBTV0lHIHNob3VsZCBjb21waWxlIHdpdGhvdXQKICAgICAgICAgIG1vZGlmaWNhdGlvbiB1bmRlciBib3RoIHZlcnNpb25zIG9mIFBlcmwsIGJ1dCBpcyBub3cKICAgICAgICAgIGV2ZW4gbW9yZSBoaWRlb3VzIHRoYW4gYmVmb3JlLgoKMi8yNS85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBzY29wZSByZXNvbHV0aW9uIG9wZXJhdGlvbiB0bwogICAgICAgICAgYXBwZWFyIGluIGV4cHJlc3Npb25zIGFuZCBkZWZhdWx0IGFyZ3VtZW50cyBhcyBpbiA6CgogICAgICAgICAgICAgICAgdm9pZCBmb28oaW50IGEgPSAgQmFyOjpkZWZ2YWx1ZSk7CgoyLzI1Lzk3IDogRml4ZWQgYnVnIHdoZW4gcmVzb2x2aW5nIHN5bWJvbHMgaW5zaWRlIEMrKyBjbGFzc2VzLgogICAgICAgICAgRm9yIGV4YW1wbGUgOgoKICAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgICAgICAgZW51bSBWYWx1ZSB7QUxFLCBTVE9VVCwgTEFHRVJ9OwogICAgICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgICAgICAgICB2b2lkIGRlZmFyZyhWYWx1ZSB2ID0gU1RPVVQpOwoKICAgICAgICAgICAgICB9OwoKMi8yNC85NyA6IEZpeGVkIGJ1ZyB3aXRoIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjIvMjMvOTcgOiBNb2RpZmllZCBQeXRob24gbW9kdWxlIHRvIGJlIGJldHRlciBiZWhhdmVkIHVuZGVyIFdpbmRvd3MKCiAgICAgICAgICAgIC0gIE1vZHVsZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBpcyBub3cgcHJvcGVybHkgZXhwb3J0ZWQuCiAgICAgICAgICAgICAgIEl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHRvIGV4cGxpY2l0bHkgZXhwb3J0IHRoaXMgZnVuY3Rpb24KICAgICAgICAgICAgICAgeW91cnNlbGYuCgogICAgICAgICAgICAtICBCaXphcnJlIGNvbXBpbGF0aW9uIHByb2JsZW1zIHdoZW4gY29tcGlsaW5nIHRoZSBTV0lHIHdyYXBwZXIKICAgICAgICAgICAgICAgY29kZSBhcyBBTlNJIEMgdW5kZXIgVmlzdWFsIEMrKyA0LnggZml4ZWQuCgogICAgICAgICAgICAtICBUZXN0ZWQgd2l0aCBib3RoIHRoZSBzdG9jayBQeXRob24tMS40IGRpc3RyaWJ1dGlvbiBhbmQgUHl0aG9ud2luCiAgICAgICAgICAgICAgIHJ1bm5pbmcgdW5kZXIgV2luOTUuCgoyLzE5Lzk3IDogRml4ZWQgdHlwZWRlZiBoYW5kbGluZyBidWcgaW4gUGVybDUgc2hhZG93IGNsYXNzZXMuCgoyLzE5Lzk3IDogQWRkZWQgZXhjZXB0aW9uIHN1cHBvcnQuICBUbyB1c2UgaXQsIGRvIHRoZSBmb2xsb3dpbmcgOgoKICAgICAgICAgICAgICAlZXhjZXB0KGxhbmcpIHsKICAgICAgICAgICAgICAgICAgLi4uIHRyeSBwYXJ0IG9mIHRoZSBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgICAgICRmdW5jdGlvbgogICAgICAgICAgICAgICAgICAuLi4gY2F0Y2ggcGFydCBvZiBleGNlcHRpb24gLi4uCiAgICAgICAgICAgICAgfQoKICAgICAgICAgICRmdW5jdGlvbiBpcyBhIFNXSUcgdmFyaWFibGUgdGhhdCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZQogICAgICAgICAgYWN0dWFsIEMvQysrIGZ1bmN0aW9uIGNhbGwgaW4gYSB3cmFwcGVyIGZ1bmN0aW9uLiAgVGh1cywKICAgICAgICAgIGEgcmVhbCBleGNlcHRpb24gc3BlY2lmaWNhdGlvbiBtaWdodCBsb29rIGxpa2UgdGhpcyA6CgogICAgICAgICAgICAgJWV4Y2VwdChwZXJsNSkgewogICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAkZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoY2hhciAqJiBzeikgewogICAgICAgICAgICAgICAgICAgIC4uLiBwcm9jZXNzIGFuIGV4Y2VwdGlvbiAuLi4KICAgICAgICAgICAgICAgICAgfSBjYXRjaCguLi4pIHsKICAgICAgICAgICAgICAgICAgICBjcm9haygiVW5rbm93biBleGNlcHRpb24uIEJhaWxpbmcgb3V0Li4uIik7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KCjIvMTkvOTcgOiBBZGRlZCBzdXBwb3J0IGZvciBtYW5hZ2luZyBnZW5lcmljIGNvZGUgZnJhZ21lbnRzIChuZWVkZWQKICAgICAgICAgIGZvciBleGNlcHRpb25zKS4KCjIvMTkvOTcgOiBGaXhlZCBzb21lIHJlYWxseSBvYnNjdXJlIHR5cGVtYXAgc2NvcGluZyBidWdzIGluIHRoZSBDKysKICAgICAgICAgIGhhbmRsZXIuCgoyLzE4Lzk3IDogQ2xlYW5lZCB1cCBwZXJsbWFpbi5pIGZpbGUgYnkgcmVtb3Zpbmcgc29tZSBwcm9ibGVtYXRpYywKICAgICAgICAgIGJ1dCBzZWVtaW5nbHkgdW5uZWNlc3NhcnkgZGVjbGFyYXRpb25zLgoKMi8xOC85NyA6IE9wdGltaXplZCBoYW5kbGluZyBvZiBtZW1iZXIgZnVuY3Rpb25zIHVuZGVyIGluaGVyaXRhbmNlLgogICAgICAgICAgU1dJRyBjYW4gbm93IHVzZSB3cmFwcGVyIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgZm9yIGEKICAgICAgICAgIGJhc2UgY2xhc3MgaW5zdGVhZCBvZiByZWdlbmVyYXRpbmcgd3JhcHBlcnMgZm9yCiAgICAgICAgICB0aGUgc2FtZSBmdW5jdGlvbnMgaW4gYSBkZXJpdmVkIGNsYXNzLiAgICBUaGlzIGNvdWxkCiAgICAgICAgICBtYWtlIGEgZHJhc3RpYyByZWR1Y3Rpb24gaW4gd3JhcHBlciBjb2RlIHNpemUgZm9yIEMrKwogICAgICAgICAgYXBwbGljYXRpb25zIHdpdGggZGVlcCBpbmhlcml0YW5jZSBoaWVyYXJjaGllcyBhbmQKICAgICAgICAgIGxvdHMgb2YgZnVuY3Rpb25zLgoKMi8xOC85NyA6IEFkZGl0aW9uYWwgbWV0aG9kcyBzcGVjaWZpZWQgd2l0aCAlYWRkbWV0aG9kcyBjYW4gbm93CiAgICAgICAgICBiZSBpbmhlcml0ZWQgYWxvbmcgd2l0aCBub3JtYWwgQysrIG1lbWJlciBmdW5jdGlvbnMuCgoyLzE4Lzk3IDogTWlub3IgaW50ZXJuYWwgZml4ZXMgdG8gbWFrZSBTV0lHJ3Mgc3RyaW5nIGhhbmRsaW5nIGEgbGl0dGxlCiAgICAgICAgICBzYWZlci4KCjIvMTYvOTcgOiBNb3ZlZCBzb21lIGNvZGUgZ2VuZXJhdGlvbiBvZiBUY2wgc2hhZG93IGNsYXNzZXMgdG8KICAgICAgICAgIGxpYnJhcnkgZmlsZXMuCgoyLzE2Lzk3IDogRml4ZWQgZG9jdW1lbnRhdGlvbiBlcnJvciBvZiAnLWNvbmZpZ3VyZScgbWV0aG9kIGluCiAgICAgICAgICBUY2wgbW9kdWxlcy4KCjIvMTYvOTcgOiBNb2RpZmllZCBQZXJsNSBtb2R1bGUgc2xpZ2h0bHkgdG8gYWxsb3cgdHlwZW1hcHMKICAgICAgICAgIHRvIHVzZSBQZXJsIHJlZmVyZW5jZXMuCgoyLzEyLzk3IDogRml4ZWQgYXJndW1lbnQgY2hlY2tpbmcgYnVnIHRoYXQgd2FzIGludHJvZHVjZWQgYnkKICAgICAgICAgIGRlZmF1bHQgYXJndW1lbnRzIChmdW5jdGlvbiBjYWxscyB3aXRoIHRvbyBtYW55CiAgICAgICAgICBhcmd1bWVudHMgd291bGQgc3RpbGwgYmUgZXhlY3V0ZWQpLiAgRnVuY3Rpb25zIG5vdwogICAgICAgICAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBhcmd1bWVudHMgYXMgQyB2ZXJzaW9uCiAgICAgICAgICAod2l0aCBwb3NzaWJpbGl0eSBvZiBkZWZhdWx0L29wdGlvbmFsIGFyZ3VtZW50cwogICAgICAgICAgc3RpbGwgc3VwcG9ydGVkKS4KCjIvMTIvOTcgOiBGaXhlZCBkZWZhdWx0IGFyZ3VtZW50IGJ1ZyBpbiBQZXJsNSBtb2R1bGUgd2hlbgogICAgICAgICAgZ2VuZXJhdGluZyB3cmFwcGVyIGZ1bmN0aW9ucyBpbnZvbHZpbmcgZGVmYXVsdAogICAgICAgICAgYXJndW1lbnRzIG9mIGNvbXBsZXggZGF0YXR5cGVzLgoKMi8xMi85NyA6IEZpeGVkIHR5cGVtYXAgc2NvcGluZyBwcm9ibGVtcy4gIEZvciBleGFtcGxlIDoKCiAgICAgICAgICAgICAgJXR5cGVtYXAodGNsLGluKSBkb3VibGUgewogICAgICAgICAgICAgICAgICAgIC4uIGdldCBhIGRvdWJsZSAuLgogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY2xhc3MgRm9vIHsKICAgICAgICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICBkb3VibGUgYmFyKGRvdWJsZSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAldHlwZW1hcCh0Y2wsaW4pIGRvdWJsZSB7CiAgICAgICAgICAgICAgICAgICAgLi4gbmV3IGdldCBkb3VibGUgLi4KICAgICAgICAgICAgICB9CgogICAgICAgICAgV291bGQgYXBwbHkgdGhlIHNlY29uZCB0eXBlbWFwIHRvIGFsbCBmdW5jdGlvbnMgaW4gRm9vCiAgICAgICAgICBkdWUgdG8gZGVsYXllZCBnZW5lcmF0aW9uIG9mIEMrKyB3cmFwcGVyIGNvZGUgKGNsZWFybHkgdGhpcwogICAgICAgICAgaXMgbm90IHRoZSBkZXNpcmVkIGVmZmVjdCkuICAgUHJvYmxlbSBoYXMgYmVlbiBmaXhlZCBieQogICAgICAgICAgYXNzaWduaW5nIHVuaXF1ZSBudW1lcmljYWwgaWRlbnRpZmllcnMgdG8gZXZlcnkgZGF0YXR5cGUgaW4KICAgICAgICAgIGFuIGludGVyZmFjZSBmaWxlIGFuZCByZWNvcmRpbmcgdGhlICJyYW5nZSBvZiBlZmZlY3QiIG9mIGVhY2gKICAgICAgICAgIHR5cGVtYXAuCgoyLzExLzk3IDogQWRkZWQgc3VwcG9ydCBmb3IgImlnbm9yZSIgYW5kICJkZWZhdWx0IiB0eXBlbWFwcy4gIE9ubHkgdXNlCiAgICAgICAgICBpZiB5b3UgYWJzb2x1dGVseSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLgoKMi85Lzk3ICA6IEFkZGVkIGF1dG9tYXRpYyBjcmVhdGlvbiBvZiBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvcgogICAgICAgICAgQyBzdHJ1Y3RzIGFuZCBDKysgY2xhc3NlcyB0aGF0IGRvIG5vdCBzcGVjaWZ5IGFueSBzb3J0IG9mCiAgICAgICAgICBjb25zdHJ1Y3RvciBvciBkZXN0cnVjdG9yLiAgIFRoaXMgZmVhdHVyZSBjYW4gYmUgZW5hYmxlZCBieQogICAgICAgICAgcnVubmluZyBTV0lHIHdpdGggdGhlICctbWFrZV9kZWZhdWx0JyBvcHRpb24gb3IgYnkgaW5zZXJ0aW5nCiAgICAgICAgICB0aGUgZm9sbG93aW5nIHByYWdtYSBpbnRvIGFuIGludGVyZmFjZSBmaWxlIDoKCiAgICAgICAgICAgICAgICAgJXByYWdtYSBtYWtlX2RlZmF1bHQKCiAgICAgICAgICBUaGUgZm9sbG93aW5nIHByYWdtYSBkaXNhYmxlcyBhdXRvbWF0aWMgY29uc3RydWN0b3IgZ2VuZXJhdGlvbgoKICAgICAgICAgICAgICAgICAlcHJhZ21hIG5vX2RlZmF1bHQKCjIvOS85NyAgOiBBZGRlZCAtbWFrZV9kZWZhdWx0IG9wdGlvbiBmb3IgcHJvZHVjaW5nIGRlZmF1bHQgY29uc3RydWN0b3JzCiAgICAgICAgICBhbmQgZGVzdHJ1Y3RvcnMgZm9yIGNsYXNzZXMgd2l0aG91dCB0aGVtLgoKMi85Lzk3ICA6IENoYW5nZWQgdGhlIHN5bnRheCBvZiB0aGUgU1dJRyAlcHJhZ21hIGRpcmVjdGl2ZSB0bwogICAgICAgICAgJXByYWdtYSBvcHRpb249dmFsdWUgb3IgJXByYWdtYShsYW5nKSBvcHRpb249dmFsdWUuCiAgICAgICAgICBUaGlzIGNoYW5nZSBtYWtlcyB0aGUgc3ludGF4IGEgbGl0dGxlIG1vcmUgY29uc2lzdGVudAogICAgICAgICAgYmV0d2VlbiBnZW5lcmFsIHByYWdtYXMgYW5kIGxhbmd1YWdlLXNwZWNpZmljIHByYWdtYXMuCiAgICAgICAgICBUaGUgb2xkIHN5bnRheCBzdGlsbCB3b3JrcywgYnV0IHdpbGwgcHJvYmFibHkgYmUgcGhhc2VkCiAgICAgICAgICBvdXQgKGEgd2FybmluZyBtZXNzYWdlIGlzIGN1cnJlbnRseSBwcmludGVkKS4KCjIvOS85NyAgOiBJbXByb3ZlZCBUY2wgc3VwcG9ydCBvZiBnbG9iYWwgdmFyaWFibGVzIHRoYXQgYXJlIG9mCiAgICAgICAgICBzdHJ1Y3R1cmVzLCBjbGFzc2VzLCBhbmQgdW5pb25zLgoKMi85Lzk3ICA6IEZpeGVkIEMrKyBjb21waWxhdGlvbiBwcm9ibGVtIGluIFB5dGhvbiAnZW1iZWQuaScgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIG1pc3NpbmcgcmV0dXJuIHZhbHVlIGluIHBlcmxtYWluLmkgbGlicmFyeSBmaWxlLgoKMi85Lzk3ICA6IEZpeGVkIFB5dGhvbiBzaGFkb3cgY2xhc3NlcyB0byByZXR1cm4gYW4gQXR0cmlidXRlRXJyb3Igd2hlbgogICAgICAgICAgdW5kZWZpbmVkIGF0dHJpYnV0ZXMgYXJlIGFjY2Vzc2VkIChvbGRlciB2ZXJzaW9ucyByZXR1cm5lZAogICAgICAgICAgYSBOYW1lRXJyb3IpLgoKMi85Lzk3ICA6IEZpeGVkIGJ1ZyB3aGVuICVhZGRtZXRob2RzIGlzIHVzZWQgYWZ0ZXIgYSBjbGFzcyBkZWZpbml0aW9uIHdob3NlCiAgICAgICAgICBsYXN0IHNlY3Rpb24gaXMgcHJvdGVjdGVkIG9yIHByaXZhdGUuCgoyLzgvOTcgIDogTWFkZSBzbGlnaHQgY2hhbmdlcyBpbiBpbmNsdWRlIGZpbGUgcHJvY2Vzc2luZyB0byBzdXBwb3J0CiAgICAgICAgICB0aGUgTWFjaW50b3NoLgoKMi84Lzk3ICA6IEV4dGVuZGVkIHN3aWdtYWluLmN4eCB0byBwcm92aWRlIGEgcnVkaW1lbnRhcnkgTWFjaW50b3NoIGludGVyZmFjZS4KICAgICAgICAgIEl0J3MgYSByZWFsbHkgYmFkIGludGVyZmFjZSwgYnV0IHdvcmtzIHVudGlsIHNvbWV0aGluZyBiZXR0ZXIKICAgICAgICAgIGlzIHdyaXR0ZW4uCgoxLzI5Lzk3IDogRml4ZWQgdHlwZS1jYXN0aW5nIGJ1ZyBpbnRyb2R1Y2VkIGJ5IDEuMWI0IHdoZW4gc2V0dGluZy9nZXR0aW5nIHRoZQogICAgICAgICAgdmFsdWUgb2YgZ2xvYmFsIHZhcmlhYmxlcyBpbnZvbHZpbmcgY29tcGxleCBkYXRhIHR5cGVzLgoKMS8yOS85NyA6IFJlbW92ZWQgZXJyb25lb3VzIHdoaXRlIHNwYWNlIGJlZm9yZSBhbiAjZW5kaWYgaW4gdGhlIGNvZGUgZ2VuZXJhdGVkCiAgICAgICAgICBieSB0aGUgUHl0aG9uIG1vZHVsZSAod2FzIGNhdXNpbmcgZXJyb3JzIG9uIERFQyBBbHBoYSBjb21waWxlcnMpLgoKMS8yNi85NyA6IEZpeGVkIGVycm9ycyB3aGVuIHVzaW5nIGRlZmF1bHQvb3B0aW9uYWwgYXJndW1lbnRzIGluIFB5dGhvbiBzaGFkb3cKCSAgc2hhZG93IGNsYXNzZXMuCgoxLzIzLzk3IDogRml4ZWQgYnVnIHdpdGggbmVzdGVkICVleHRlcm4gZGVjbGFyYXRpb25zLgoKMS8yMS85NyA6IEZpeGVkIHByb2JsZW0gd2l0aCB0eXBlZGVmIGludm9sdmluZyBjb25zdCBkYXRhdHlwZXMuCgoxLzIxLzk3IDogU29tZXdoYXQgb2JzY3VyZSwgYnV0IHNlcmlvdXMgYnVnIHdpdGggaGF2aW5nIG11bHRpcGxlIGxldmVscwogICAgICAgICAgb2YgdHlwZWRlZnMgZml4ZWQuICBGb3IgZXhhbXBsZSA6CgoJCXR5cGVkZWYgY2hhciAqU3RyaW5nOwogICAgICAgICAgICAgICAgdHlwZWRlZiBTdHJpbmcgIE5hbWU7CgpWZXJzaW9uIDEuMSBCZXRhNCAoSmFudWFyeSAxNiwgMTk5NykKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogU1dJRyAxLjFiMyBjcmFzaGVkIGFuZCBidXJuZWQgc2hvcnRseSBhZnRlciB0YWtlIG9mZiBkdWUKdG8gYSBmZXcgbWFqb3IgcnVuLXRpbWUgcHJvYmxlbXMgdGhhdCBzdXJmYWNlZCBhZnRlciByZWxlYXNlLgpUaGlzIHJlbGVhc2Ugc2hvdWxkIGZpeCBtb3N0LCBpZiBub3QgYWxsLCBvZiB0aG9zZSBwcm9ibGVtcy4KCjEvMTYvOTcgOiBGaXhlZCBtYWpvciBtZW1vcnkgbWFuYWdlbWVudCBidWcgb24gTGludXgKCjEvMTQvOTcgOiBGaXhlZCBidWcgaW4gZnVuY3Rpb25zIHJldHVybmluZyBjb25zdGFudCBDKysgcmVmZXJlbmNlcy4KCjEvMTQvOTcgOiBNb2RpZmllZCBDKysgbW9kdWxlIHRvIGhhbmRsZSBkYXRhdHlwZXMgYmV0dGVyLgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyBhICpzaW5nbGUqIHNjb3BlIHJlc29sdXRpb24KICAgICAgICAgIG9wZXJhdG9yIGluIGRhdGF0eXBlcy4gIEllIDogRm9vOjpiYXIuICAgU1dJRyBkb2Vzbid0CiAgICAgICAgICB5ZXQgaGFuZGxlIG5lc3RlZCBjbGFzc2VzLCBzbyB0aGlzIHNob3VsZCBiZQogICAgICAgICAgc3VmZmljaWVudCBmb3Igbm93LgoKMS8xNC85NyA6IE1vZGlmaWVkIHBhcnNlciB0byBhbGxvdyB0eXBlZGVmIGluc2lkZSBhIEMrKyBjbGFzcy4KCjEvMTQvOTcgOiBGaXhlZCBzb21lIHByb2JsZW1zIHJlbGF0ZWQgdG8gZGF0YXR5cGVzIGRlZmluZWQgaW5zaWRlCiAgICAgICAgICBhIEMrKyBjbGFzcy4gIFNXSUcgd2FzIG5vdCBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZSwKICAgICAgICAgIGJ1dCBhIG5ldyBzY29waW5nIG1lY2hhbmlzbSBhbmQgbWV0aG9kIGZvciBoYW5kbGluZwogICAgICAgICAgZGF0YXR5cGVzIGluc2lkZSBhIEMrKyBjbGFzcyBoYXZlIGJlZW4gYWRkZWQuCgoxLzE0Lzk3IDogQ2hhbmdlZCBlbnVtZXJhdGlvbnMgdG8gdXNlIHRoZSB2YWx1ZSBuYW1lIGluc3RlYWQKICAgICAgICAgIG9mIGFueSB2YWx1ZXMgdGhhdCBtaWdodCBoYXZlIGFwcGVhcmVkIGluIHRoZSBpbnRlcmZhY2UKICAgICAgICAgIGZpbGUuICBUaGlzIG1ha2VzIHRoZSBjb2RlIGEgbGl0dGxlIG1vcmUgZnJpZW5kbHkgdG8KICAgICAgICAgIEMrKyBjb21waWxlcnMuCgoxLzE0Lzk3IDogUmVtb3ZlZCB0eXBlZGVmIGJ1ZyB0aGF0IG1hZGUgYWxsIGVudW1lcmF0aW9ucwogICAgICAgICAgZXF1aXZhbGVudCB0byBlYWNoIG90aGVyIGluIHRoZSB0eXBlIGNoZWNrZXIgKHNpbmNlCiAgICAgICAgICBpdCBnZW5lcmF0ZWQgYWxvdCBvZiB1bm5lY2Vzc2FyeSBjb2RlKS4KClZlcnNpb24gMS4xIEJldGEzIChKYW51YXJ5IDksIDE5OTcpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpOb3RlIDogQSAqaHVnZSogbnVtYmVyIG9mIGNoYW5nZXMgcmVsYXRlZCB0byBvbmdvaW5nIG1vZGlmaWNhdGlvbnMuCgoxLiAgU3VwcG9ydCBmb3IgQysrIG11bHRpcGxlIGluaGVyaXRhbmNlIGFkZGVkLgoKMi4gIFR5cGVtYXBzIGFkZGVkLgoKMy4gIFNvbWUgc3VwcG9ydCBmb3IgbmVzdGVkIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBhZGRlZC4KCjQuICBEZWZhdWx0IGFyZ3VtZW50IGhhbmRsaW5nIGFkZGVkLgoKNS4gIC1jIG9wdGlvbiBhZGRlZCBmb3IgYnVpbGRpbmcgYmFyZSB3cmFwcGVyIGNvZGUgbW9kdWxlcy4KCjYuICBSZXdyb3RlIFBvaW50ZXIgdHlwZS1jaGVja2luZyB0byBzdXBwb3J0IG11bHRpcGxlIGluaGVyaXRhbmNlCiAgICBjb3JyZWN0bHkuCgo3LiAgVGNsIDguMCBtb2R1bGUgYWRkZWQuCgo4LiAgUGVybDQgYW5kIEd1aWxlIG1vZHVsZXMgcmVzdXJyZWN0ZWQgZnJvbSB0aGUgZGVhZCAod2VsbCwgdGhleQogICAgYXQgbGVhc3Qgd29yayBhZ2FpbikuCgo5LiAgTmV3IE9iamVjdCBPcmllbnRlZCBUY2wgaW50ZXJmYWNlIGFkZGVkLgoKMTAuIEJ1ZyBmaXhlcyB0byBQZXJsNSBzaGFkb3cgY2xhc3Nlcy4KCjExLiBDbGVhbmVkIHVwIG1hbnkgb2YgdGhlIGludGVybmFsIG1vZHVsZXMgb2YgdGhlIHBhcnNlci4KCjEyLiBUb25zIG9mIGV4YW1wbGVzIGFuZCB0ZXN0aW5nIG1vZHVsZXMgYWRkZWQuCgoxMy4gRml4ZWQgYnVncyByZWxhdGVkIHRvIHVzZSBvZiAiY29uc3QiIHJldHVybiB2YWx1ZXMuCgoxNC4gRml4ZWQgYnVnIHdpdGggQysrIG1lbWJlciBmdW5jdGlvbnMgcmV0dXJuaW5nIHZvaWQgKi4KCjE1LiBDaGFuZ2VkIFNXSUcgY29uZmlndXJhdGlvbiBzY3JpcHQuCgpWZXJzaW9uIDEuMSBCZXRhMiAoRGVjZW1iZXIgMywgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBDb21wbGV0ZWx5IHJld3JvdGUgdGhlIFNXSUcgZG9jdW1lbnRhdGlvbiBzeXN0ZW0uICBUaGUgY2hhbmdlcwogICBpbnZvbHZlZCBhcmUgdG9vIG51bWVyb3VzIHRvIG1lbnRpb24uICBCYXNpY2FsbHksIHRha2UgZXZlcnl0aGluZwogICB5b3Uga25ldyBhYm91dCB0aGUgb2xkIHN5c3RlbSwgdGhyb3cgdGhlbSBvdXQsIGFuZCByZWFkIHRoZQogICBmaWxlIERvYy9kb2MucHMuCgoyLiBMaW1pdGVkIHN1cHBvcnQgZm9yICNpZiBkZWZpbmVkKCkgYWRkZWQuCgozLiBUeXBlIGNhc3RzIGFyZSBub3cgYWxsb3dlZCBpbiBjb25zdGFudCBleHByZXNzaW9ucy4gIGllCgogICAgICAgICAjZGVmaW5lICBBICAgKGludCkgMwoKNC4gQWRkZWQgc3VwcG9ydCBmb3IgdHlwZWRlZiBsaXN0cy4gIEZvciBleGFtcGxlIDoKCgl0eXBlZGVmIHN0cnVjdCB7CgkgICAgICAgIGRvdWJsZSB4LHksejsKICAgICAgICB9IFZlY3RvciwgKlZlY3RvclB0cjsKCjUuIE5ldyBTV0lHIGRpcmVjdGl2ZXMgKHJlbGF0ZWQgdG8gZG9jdW1lbnRhdGlvbiBzeXN0ZW0pCgoJJXN0eWxlCgklbG9jYWxzdHlsZQoJJXN1YnNlY3Rpb24KCSVzdWJzdWJzZWN0aW9uCgo2LiBSZW9yZ2FuaXplZCB0aGUgQysrIGhhbmRsaW5nIGFuZCBtYWRlIGl0IGEgbGl0dGxlIGVhc2llciB0bwogICB3b3JrIHdpdGggaW50ZXJuYWxseS4KCjcuICBGaXhlZCBwcm9ibGVtIHdpdGggaW5oZXJpdGluZyBkYXRhIG1lbWJlcnMgaW4gUHl0aG9uCiAgICBzaGFkb3cgY2xhc3Nlcy4KCjguICBGaXhlZCBzeW1ib2wgdGFibGUgcHJvYmxlbXMgd2l0aCBzaGFkb3cgY2xhc3NlcyBpbiBib3RoCiAgICBQeXRob24gYW5kIFBlcmwuCgo5LiAgRml4ZWQgYW5ub3lpbmcgc2VnbWVudGF0aW9uIGZhdWx0IGJ1ZyBpbiB3cmFwcGVyIGNvZGUKICAgIGdlbmVyYXRlZCBmb3IgUGVybDUuCgoxMC4gRml4ZWQgYnVnIHdpdGggJWFkZG1ldGhvZHMgZGlyZWN0aXZlLiAgTm93IGl0IGNhbiBiZSBwbGFjZWQKICAgIGFueXdoZXJlIGluIGEgY2xhc3MuCgoxMS4gTW9yZSB0ZXN0IGNhc2VzIGFkZGVkIHRvIHRoZSBTV0lHIHNlbGYtdGVzdC4gICBEb2N1bWVudGF0aW9uCiAgICB0ZXN0cyBhcmUgbm93IHBlcmZvcm1lZCBhbG9uZyB3aXRoIG90aGVyIHRoaW5ncy4KCjEyLiBSZW9yZ2FuaXplZCB0aGUgU1dJRyBsaWJyYXJ5IGEgbGl0dGxlIGJpdCBhbmQgc2V0IGl0IHVwIHRvCiAgICBzZWxmLWRvY3VtZW50IGl0c2VsZiB1c2luZyBTV0lHLgoKMTMuIExvdHMgYW5kIGxvdHMgb2YgbWlub3IgYnVnIGZpeGVzIChtb3N0bHkgb2JzY3VyZSwgYnV0IGJ1Z3MKICAgIG5vbmV0aGVsZXNzKS4KCgpWZXJzaW9uIDEuMSBCZXRhMSAoT2N0b2JlciAzMCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBBZGRlZCBuZXcgJWV4dGVybiBkaXJlY3RpdmUgZm9yIGhhbmRsaW5nIG11bHRpcGxlIGZpbGVzCgoyLiBQZXJsNSBzaGFkb3cgY2xhc3NlcyBhZGRlZAoKMy4gUmV3cm90ZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB0byB3b3JrIGJldHRlcgoKNC4gQWRkZWQgJ2Jvb2wnIGRhdGF0eXBlCgo1LiAleywlfSBibG9jayBpcyBub3cgb3B0aW9uYWwuCgo2LiBGaXhlZCBzb21lIGJ1Z3MgaW4gdGhlIFB5dGhvbiBzaGFkb3cgY2xhc3MgbW9kdWxlCgo3LiBSZXdyb3RlIGFsbCBvZiB0aGUgU1dJRyB0ZXN0cyB0byBiZSBtb3JlIGluZm9ybWF0aXZlCiAgIChhbmQgbGVzcyBzY2FyeSkuCgo4LiBSZXdyb3RlIHBhcmFtZXRlciBsaXN0IGhhbmRsaW5nIHRvIGJlIG1vcmUgbWVtb3J5CiAgIGVmZmljaWVudCBhbmQgZmxleGlibGUuCgo5LiBDaGFuZ2VkIHBhcnNlciB0byBpZ25vcmUgJ3N0YXRpYycgZGVjbGFyYXRpb25zLgoKMTAuIEluaXRpYWxpemVycyBhcmUgbm93IGlnbm9yZWQuICBGb3IgZXhhbXBsZSA6CgoJc3RydWN0IEZvb0JhciBhID0gezMsNCw1fTsKCjExLiBTb21ld2hhdCBiZXR0ZXIgcGFyc2luZyBvZiBhcnJheXMgKGFsdGhvdWdoIGl0J3MKICAgIHVzdWFsbHkganVzdCBhIGJldHRlciBlcnJvciBtZXNzYWdlIG5vdykuCgoxMi4gTG90J3Mgb2YgbWlub3IgYnVnIGZpeGVzLgoKClZlcnNpb24gMS4wIEZpbmFsIChBdWd1c3QgMzEsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLiBGaXhlZCBtaW5vciBidWcgaW4gQysrIG1vZHVsZQoKMi4gRml4ZWQgbWlub3IgYnVnIGluIHBvaW50ZXIgdHlwZS1jaGVja2VyIHdoZW4gdXNpbmcKICAgLURBTExPV19OVUxMLgoKMy4gRml4ZWQgY29uZmlndXJlIHNjcmlwdCB0byB3b3JrIHdpdGggUHl0aG9uIDEuNGJldGEzCgo0LiBDaGFuZ2VkIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aG91dAogICB5YWNjIG9yIGJpc29uLgoKVmVyc2lvbiAxLjAgRmluYWwgKEF1Z3VzdCAyOCwgMTk5NikKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBDaGFuZ2VkIHBhcnNlciB0byBzdXBwb3J0IG1vcmUgQy9DKysgZGF0YXR5cGVzICh3ZWxsLAogICAgbW9yZSB2YXJpYW50cykuICAgVHlwZXMgbGlrZSAidW5zaWduZWQiLCAic2hvcnQgaW50IiwKICAgICJsb25nIGludCIsIGV0Yy4uLiBub3cgd29yay4KCjIuICAidW5pb25zIiBhZGRlZCB0byBwYXJzZXIuCgozLiAgVXNlIG9mICJ0eXBlZGVmIiBhcyBpbiA6CgoJdHlwZWRlZiBzdHJ1Y3QgewoJICAgICBkb3VibGUgeCx5LHo7Cgl9IFZlY3RvcjsKCiAgICBOb3cgd29ya3MgY29ycmVjdGx5LiAgIFRoZSBuYW1lIG9mIHRoZSB0eXBlZGVmIGlzIHVzZWQgYXMKICAgIHRoZSBzdHJ1Y3R1cmUgbmFtZS4KCjQuICBDb25kaXRpb25hbCBjb21waWxhdGlvbiB3aXRoICNpZmRlZiwgI2Vsc2UsICNlbmRpZiwgZXRjLi4uCiAgICBhZGRlZC4KCjUuICBOZXcgJWRpc2FibGVkb2MsICVlbmFibGVkb2MgZGlyZWN0aXZlcyBhbGxvdyBkb2N1bWVudGF0aW9uCiAgICB0byBzZWxlY3RpdmVseSBiZSBkaXNhYmxlZCBmb3IgY2VydGFpbiBwYXJ0cyBvZiBhIHdyYXBwZXIKICAgIGZpbGUuCgo2LiAgTmV3IFB5dGhvbiBtb2R1bGUgc3VwcG9ydHMgYmV0dGVyIHZhcmlhYmxlIGxpbmtpbmcsIGNvbnN0YW50cywKICAgIGFuZCBzaGFkb3cgY2xhc3Nlcy4KCjcuICBQZXJsNSBtb2R1bGUgaW1wcm92ZWQgd2l0aCBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIFhTCiAgICBhbmQgeHN1YnBwLiAgIFNXSUcgcG9pbnRlcnMgYW5kIG5vdyBjcmVhdGVkIHNvIHRoYXQgdGhleQogICAgYXJlIGNvbXBhdGlibGUgd2l0aCB4c3VicHAgcG9pbnRlcnMuCgo4LiAgU3VwcG9ydCBmb3IgW2luY3IgVGNsXSBuYW1lc3BhY2VzIGFkZGVkIHRvIFRjbCBtb2R1bGUuCgo5LiAgJXByYWdtYSBkaXJlY3RpdmUgYWRkZWQuCgoxMC4gJWFkZG1ldGhvZHMgZGlyZWN0aXZlIGFkZGVkLgoKMTEuICVuYXRpdmUgZGlyZWN0aXZlIGFkZGVkIHRvIGFsbG93IHByZS1leGlzdGluZyB3cmFwcGVyIGZ1bmN0aW9ucwogICAgdG8gYmUgdXNlZC4KCjEyLiBXcm90ZSBjb25maWd1cmUgc2NyaXB0IGZvciBTV0lHIGluc3RhbGxhdGlvbi4KCjEzLiBGdW5jdGlvbiBwb2ludGVycyBub3cgYWxsb3dlZCB3aXRoIHR5cGVkZWYgc3RhdGVtZW50cy4KCjE0LiAldHlwZWRlZiBtb2RpZmllZCB0byBpbnNlcnQgYSBjb3JyZXNwb25kaW5nIEMgdHlwZWRlZiBpbnRvCiAgICB0aGUgb3V0cHV0IGZpbGUuCgoxNS4gRml4ZWQgc29tZSBwcm9ibGVtcyByZWxhdGVkIHRvIEMrKyByZWZlcmVuY2VzLgoKMTYuIE5ldyBTdHJpbmcgYW5kIFdyYXBwZXJGdW5jdGlvbiBjbGFzc2VzIGFkZCB0byBtYWtlIGdlbmVyYXRpbmcKICAgIHdyYXBwZXIgY29kZSBlYXNpZXIuCgoxNy4gRml4ZWQgY29tbWFuZCBsaW5lIG9wdGlvbiBwcm9jZXNzaW5nIHRvIGVsaW1pbmF0ZSBjb3JlIGR1bXBzCiAgICBhbmQgdG8gYWxsb3cgaGVscCBtZXNzYWdlcy4KCjE4LiBMb3QncyBvZiBtaW5vciBidWcgZml4ZXMgdG8gYWxtb3N0IGFsbCBjb2RlIG1vZHVsZXMKCgpWZXJzaW9uIDEuMCBCZXRhIDMgKFBhdGNoIDEpIEp1bHkgMTcsIDE5OTYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoxLjAgRmluYWwgaXMgbm90IHF1aXRlIHJlYWR5IHlldCwgYnV0IHRoaXMgcmVsZWFzZSBmaXhlcyBhCm51bWJlciBvZiBpbW1lZGlhdGUgcHJvYmxlbXMgOgoKMS4gIENvbXBpbGVyIGVycm9ycyB3aGVuIHVzaW5nIC1zdHJpY3QgMSB0eXBlIGNoZWNraW5nIGhhdmUgYmVlbiBmaXhlZC4KCjIuICBQb2ludGVyIHR5cGUgY2hlY2tlciBub3cgcmVjb2duaXplcyBwb2ludGVycyBvZiB0aGUgZm9ybQogICAgXzBfVHlwZSBjb3JyZWN0bHkuCgozLiAgQSBmZXcgbWlub3IgZml4ZXMgd2VyZSBtYWRlIGluIHRoZSBNYWtlZmlsZQoKVmVyc2lvbiAxLjAgQmV0YSAzIChKdW5lIDE0LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKVGhlcmUgYXJlIGxvdHMgb2YgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2UgOgoKMS4gIFNXSUcgaXMgbm93IGludm9rZWQgdXNpbmcgdGhlICJzd2lnIiBjb21tYW5kIGluc3RlYWQgb2YgIndyYXAiLgogICAgSGV5LCBzd2lnIHNvdW5kcyBjb29sZXIuCgoyLiAgVGhlIFNXSUdfTElCIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSBzZXQgdG8gY2hhbmdlIHRoZQogICAgbG9jYXRpb24gd2hlcmUgU1dJRyBsb29rcyBmb3IgbGlicmFyeSBmaWxlcy4KCjMuICBDKysgc3VwcG9ydCBoYXMgYmVlbiBhZGRlZC4gICBZb3Ugc2hvdWxkIHVzZSB0aGUgLWMrKyBvcHRpb24KICAgIHRvIGVuYWJsZSBpdC4KCjQuICBUaGUgJWluaXQgZGlyZWN0aXZlIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IHRoZSAlbW9kdWxlIGRpcmVjdGl2ZS4KICAgICVtb2R1bGUgY29uc3RydWN0cyBhIHZhbGlkIG5hbWUgZm9yIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgogICAgZm9yIHdoYXRldmVyIHRhcmdldCBsYW5ndWFnZSB5b3UncmUgdXNpbmcgKGFjdHVhbGx5IHRoaXMgbWFrZXMKICAgIFNXSUcgZmlsZXMgYSBsaXR0bGUgY2xlYW5lcikuICBUaGUgb2xkICVpbml0IGRpcmVjdGl2ZSBzdGlsbCB3b3Jrcy4KCjUuICBUaGUgc3ludGF4IG9mIHRoZSAlbmFtZSBkaXJlY3RpdmUgaGFzIGJlZW4gY2hhbmdlZC4gICBVc2Ugb2YgdGhlCiAgICBvbGQgb25lIHNob3VsZCBnZW5lcmF0ZSBhIHdhcm5pbmcgbWVzc2FnZSwgYnV0IG1heSBzdGlsbCB3b3JrLgoKNi4gIFRvIHN1cHBvcnQgVGNsL1RrIG9uIG5vbi11bml4IHBsYXRmb3JtcywgU1dJRyBpbXBvcnRzIGEgZmlsZSBjYWxsZWQKICAgIHN3aWd0Y2wuY2ZnIGZyb20gdGhlICQoU1dJR19MSUIpL3RjbCBkaXJlY3RvcnkuICAgSSBkb24ndCBoYXZlIGFjY2VzcwogICAgdG8gYW4gTlQgbWFjaGluZSwgYnV0IHRoaXMgZmlsZSBpcyBzdXBwb3NlZGx5IGFsbG93cyBTV0lHIHRvCiAgICBwcm9kdWNlIHdyYXBwZXIgY29kZSB0aGF0IGNvbXBpbGVzIG9uIGJvdGggVU5JWCBhbmQgbm9uIFVOSVggbWFjaGluZXMuCiAgICBJZiB0aGlzIGRvZXNuJ3Qgd29yaywgeW91J2xsIGhhdmUgdG8gZWRpdCB0aGUgZmlsZSBzd2lndGNsLmNmZy4gUGxlYXNlCiAgICBsZXQgbWUga25vdyBpZiB0aGlzIGRvZXNuJ3Qgd29yayBzbyBJIGNhbiB1cGRhdGUgdGhlIGZpbGUgYXMKICAgIG5lY2Vzc2FyeS4KCjcuICBUaGUgU1dJRyBydW4tdGltZSB0eXBlY2hlY2tlciBoYXMgYmVlbiBpbXByb3ZlZC4gICAgWW91IGNhbiBhbHNvCiAgICBub3cgcmVkZWZpbmUgaG93IGl0IHdvcmtzIGJ5IHN1cHBseWluZyBhIGZpbGUgY2FsbGVkICJzd2lncHRyLmNmZyIKICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBhcyB5b3VyIFNXSUcgaW50ZXJmYWNlIGZpbGVzLiAgIEJ5IGRlZmF1bHQsCiAgICBTV0lHIHJlYWRzIHRoaXMgZmlsZSBmcm9tICQoU1dJR19MSUIpL2NvbmZpZy4KCjguICBUaGUgZG9jdW1lbnRhdGlvbiBzeXN0ZW0gaGFzIGJlZW4gY2hhbmdlZCB0byBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgOgoKCS0gIERvY3VtZW50YXRpb24gb3JkZXIgaXMgcHJpbnRlZCBpbiBpbnRlcmZhY2UgZmlsZSBvcmRlciBieQogICAgICAgICAgIGRlZmF1bHQuICAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwdXR0aW5nIGFuICVhbHBoYQogICAgICAgICAgIGRpcmVjdGl2ZSBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnRlcmZhY2UgZmlsZS4KCiAgICAgICAgLSAgWW91IGNhbiBzdXBwbHkgYWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIHRleHQgdXNpbmcKCiAgICAgICAgICAgJXRleHQgJXsgcHV0IHlvdXIgdGV4dCBoZXJlICV9CgogICAgICAgIC0gIEEgZmV3IG1pbm9yIGJ1Z3Mgd2VyZSBmaXhlZC4KCjkuICBBIGZldyBpbXByb3ZlbWVudHMgaGF2ZSBiZWVuIG1hZGUgdG8gdGhlIGhhbmRsaW5nIG9mIGNvbW1hbmQgbGluZQogICAgb3B0aW9ucyAoYnV0IGl0J3Mgc3RpbGwgbm90IGZpbmlzaGVkKS4KCjEwLiAgTG90cyBvZiBtaW5vciBidWcgZml4ZXMgaW4gbW9zdCBvZiB0aGUgbGFuZ3VhZ2UgbW9kdWxlcyBoYXZlIGJlZW4KICAgICBtYWRlLgoKMTEuIEZpbGVuYW1lcyBoYXZlIGJlZW4gY2hhbmdlZCB0byA4LjMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBhIFNXSUcKICAgIHBvcnQgdG8gbm9uLXVuaXggcGxhdGZvcm1zICh3b3JrIGluIHByb2dyZXNzKS4KCjEyLiBDKysgZmlsZSBzdWZmaXggaXMgbm93IC5jeHggKGZvciBzYW1lIHJlYXNvbikuCgoxMy4gVGhlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBncmFkZWQgc2lnbmlmaWNhbnRseSBhbmQgaXMgbm93CiAgICBhcm91bmQgMTAwIHBhZ2VzLiAgICBJIGFkZGVkIG5ldyBleGFtcGxlcyBhbmQgYSBzZWN0aW9uIG9uCiAgICBDKysuICBUaGUgZG9jdW1lbnRhdGlvbiBub3cgaW5jbHVkZXMgYSBUYWJsZSBvZiBDb250ZW50cy4KCjE0LiBUaGUgU1dJRyBFeGFtcGxlcyBkaXJlY3RvcnkgaXMgc3RpbGwgd29lZnVsbHkgc3BhcnNlLCBidXQgaXMKICAgIGdldHRpbmcgYmV0dGVyLgoKU3BlY2lhbCBub3RpY2UgYWJvdXQgQysrCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaGlzIGlzIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIFNXSUcgdG8gc3VwcG9ydCBDKysgcGFyc2luZy4gIEN1cnJlbnRseQp0aGUgQysrIGlzIGZhciBmcm9tIGNvbXBsZXRlLCBidXQgc2VlbXMgdG8gd29yayBmb3Igc2ltcGxlIGNhc2VzLgpObyB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gYWRkIHNwZWNpYWwgQysrIHByb2Nlc3NpbmcgdG8gYW55IG9mCnRoZSB0YXJnZXQgbGFuZ3VhZ2VzLiAgIFNlZSB0aGUgdXNlciBtYW51YWwgZm9yIGRldGFpbHMgYWJvdXQgaG93CkMrKyBpcyBoYW5kbGVkLiAgIElmIHlvdSBmaW5kIHByb2JsZW1zIHdpdGggdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwKcGxlYXNlIGxldCBtZSBrbm93LiAgRXhwZWN0IG1ham9yIGltcHJvdmVtZW50cyBpbiB0aGlzIGFyZWEuCgpOb3RlIDogSSBoYXZlIG9ubHkgc3VjY2Vzc2Z1bGx5IHVzZWQgU1dJRyBhbmQgQysrIHdpdGggVGNsIGFuZApQeXRob24uCgpOb3RpY2UgYWJvdXQgVmVyc2lvbiAxLjBGaW5hbAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVmVyc2lvbiAxLjBCMyBpcyB0aGUgbGFzdCBCZXRhIHJlbGVhc2UgYmVmb3JlIHZlcnNpb24gMS4wIEZpbmFsIGlzCnJlbGVhc2VkLiAgSSBoYXZlIGZyb3plbiB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgaW4gdmVyc2lvbiAxLjAKYW5kIHdpbGwgb25seSBmaXggYnVncyBhcyB0aGV5IHNob3cgdXAuICBXb3JrIG9uIFNXSUcgdmVyc2lvbiAyLjAgaXMKYWxyZWFkeSBpbiBwcm9ncmVzcywgYnV0IGlzIGdvaW5nIHRvIHJlc3VsdCBpbiByYXRoZXIgc2lnbmlmaWNhbnQKY2hhbmdlcyB0byBTV0lHJ3MgaW50ZXJuYWwgc3RydWN0dXJlIChob3BlZnVsbHkgZm9yIHRoZSBiZXR0ZXIpLiAgTm8KYW50aWNpcGF0ZWQgZGF0ZSBmb3IgdmVyc2lvbiAyLjAgaXMgc2V0LCBidXQgaWYgeW91J3ZlIGdvdCBhbiBpZGVhLApsZXQgbWUga25vdy4KClZlcnNpb24gMS4wIEJldGEgMiAoQXByaWwgMjYsIDE5OTYpCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpUaGlzIHJlbGVhc2UgaXMgaWRlbnRpY2FsIHRvIEJldGExIGV4Y2VwdCBhIGZldyBtaW5vciBidWdzIGFyZQpmaXhlZCBhbmQgdGhlIFNXSUcgbGlicmFyeSBoYXMgYmVlbiB1cGRhdGVkIHRvIHdvcmsgd2l0aCBUY2wgNy41L1RrIDQuMS4KQSB0Y2w3LjUgZXhhbXBsZXMgZGlyZWN0b3J5IGlzIG5vdyBpbmNsdWRlZC4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIE1ha2VmaWxlIHRoYXQgZGlkbid0IGluc3RhbGwgdGhlIGxpYnJhcmllcwogIGNvcnJlY3RseS4KCi0gU1dJRyBMaWJyYXJ5IGZpbGVzIGFyZSBub3cgdXBkYXRlZCB0byB3b3JrIHdpdGggVGNsIDcuNSBhbmQgVGsgNC4xLgoKLSBNaW5vciBidWcgZml4ZXMgaW4gb3RoZXIgbW9kdWxlcy4KCgpWZXJzaW9uIDEuMCBCZXRhIDEgIChBcHJpbCAxMCwgMTk5NikuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgaXMgdGhlIGZpcnN0ICJzZW1pLW9mZmljaWFsIiByZWxlYXNlIG9mIFNXSUcuICAgIEl0IGhhcyBhCm51bWJlciBvZiBzdWJzdGFudGlhbCBpbXByb3ZlbWVudHMgb3ZlciB0aGUgQWxwaGEgcmVsZWFzZS4gICBUaGVzZQpub3RlcyBhcmUgaW4gbm8gcGFydGljdWxhciBvcmRlci0taG9wZSBJIHJlbWVtYmVyZWQgZXZlcnl0aGluZy4uLi4KCjEuICBUY2wvVGsKClNXSUcgaXMga25vd24gdG8gd29yayB3aXRoIFRjbDcuMywgVGszLjYgYW5kIGxhdGVyIHZlcnNpb25zLgpJJ3ZlIGFsc28gdGVzdGVkIFNXSUcgd2l0aCBleHBlY3QtNS4xOS4KCk5vcm1hbGx5IFNXSUcgZXhwZWN0cyB0byB1c2UgdGhlIGhlYWRlciBmaWxlcyAidGNsLmgiIGFuZCAidGsuaCIuCk5ld2VyIHZlcnNpb25zIG9mIFRjbC9UayB1c2UgdmVyc2lvbiBudW1iZXJzLiAgIFlvdSBjYW4gc3BlY2lmeSB0aGVzZQppbiBTV0lHIGFzIGZvbGxvd3MgOgoKICAgICAgICAlIHdyYXAgLWh0Y2wgdGNsNy40LmggLWh0ayB0azQuMC5oIGV4YW1wbGUuaQoKT2YgY291cnNlLCBJIHByZWZlciB0byBzaW1wbHkgc2V0IHVwIHN5bWJvbGljIGxpbmtzIGJldHdlZW4gInRjbC5oIiBhbmQKdGhlIG1vc3QgcmVjZW50IHN0YWJsZSB2ZXJzaW9uIG9uIHRoZSBtYWNoaW5lLgoKMi4gIFBlcmw0CgpUaGlzIGltcGxlbWVudGF0aW9uIGhhcyBiZWVuIGJhc2VkIG9uIFBlcmwtNC4wMzUuICBTV0lHJ3MgaW50ZXJmYWNlIHRvClBlcmw0IGlzIGJhc2VkIG9uIHRoZSBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGluIHRoZSAiUHJvZ3JhbW1pbmcgUGVybCIKYm9vayBieSBMYXJyeSBXYWxsLCBhbmQgZmlsZXMgbG9jYXRlZCBpbiB0aGUgInVzdWIiIGRpcmVjdG9yeSBvZiB0aGUKUGVybDQgZGlzdHJpYnV0aW9uLgoKSW4gb3JkZXIgdG8gY29tcGlsZSB3aXRoIFBlcmw0LCB5b3UnbGwgbmVlZCB0byBsaW5rIHdpdGggdGhlIHVwZXJsLm8KZmlsZSBmb3VuZCBpbiB0aGUgUGVybDQgc291cmNlIGRpcmVjdG9yeS4gIFlvdSBtYXkgd2FudCB0byBtb3ZlIHRoaXMKZmlsZSB0byBhIG1vcmUgY29udmVuaWVudCBsb2NhdGlvbi4KCjMuICBQZXJsNQoKVGhpcyBpcyBhIHNvbWV3aGF0IGV4cGVyaW1lbnRhbCBpbXBsZW1lbnRhdGlvbiwgYnV0IGlzIGFsb3QgbGVzcwpidWdneSB0aGFuIHRoZSBhbHBoYSByZWxlYXNlLiAgICAgU1dJRyBvcGVyYXRlcyBpbmRlcGVuZGVudGx5IG9mCnRoZSBYUyBsYW5ndWFnZSBhbmQgeHN1YnBwIHN1cHBsaWVkIHdpdGggUGVybDUuICBDdXJyZW50bHkgU1dJRwpwcm9kdWNlcyB0aGUgbmVjZXNzYXJ5IEMgY29kZSBhbmQgLnBtIGZpbGUgbmVlZGVkIHRvIGR5bmFtaWNhbGx5CmxvYWQgYSBtb2R1bGUgaW50byBQZXJsNS4KClRvIHN1cHBvcnQgUGVybDUncyBub3Rpb24gb2YgbW9kdWxlcyBhbmQgcGFja2FnZXMgKGFzIHdpdGggeHN1YnBwKSwKeW91IGNhbiB1c2UgdGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgb3B0aW9ucyA6CgogICAgICAgICUgd3JhcCAtcGVybDUgLW1vZHVsZSBNeU1vZHVsZSAtcGFja2FnZSBNeVBhY2thZ2UgZXhhbXBsZS5pCgpOb3RlIDogSW4gb3JkZXIgZm9yIGR5bmFtaWMgbG9hZGluZyB0byBiZSBlZmZlY3RpdmUsIHlvdSBuZWVkIHRvIGJlCmNhcmVmdWwgYWJvdXQgbmFtaW5nLiAgICBGb3IgYSBtb2R1bGUgbmFtZWQgIk15TW9kdWxlIiwgeW91J2xsIG5lZWQgdG8KY3JlYXRlIGEgc2hhcmVkIG9iamVjdCBmaWxlIGNhbGxlZCAiTXlNb2R1bGUuc28iIHVzaW5nIHNvbWV0aGluZyBsaWtlCgogICAgICAgICUgbGQgLXNoYXJlZCBteV9vYmoubyAtbyBNeU1vZHVsZS5zbwoKVGhlIHVzZSBvZiB0aGUgJWluaXQgZGlyZWN0aXZlIG11c3QgbWF0Y2ggdGhlIG1vZHVsZSBuYW1lIHNpbmNlIFBlcmw1CmNhbGxzIGEgZnVuY3Rpb24gImJvb3RfTW9kdWxlTmFtZSIgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGluZ3MuClNlZSB0aGUgRXhhbXBsZXMgZGlyZWN0b3J5IGZvciBzb21lIGV4YW1wbGVzIG9mIGhvdyB0byBnZXQgdGhpbmdzCnRvIHdvcmsuCgo0LiAgUHl0aG9uMS4zCgpUaGlzIGlzIHRoZSBmaXJzdCByZWxlYXNlIHN1cHBvcnRpbmcgUHl0aG9uLiAgICBUaGUgUHl0aG9uIHBvcnQgaXMKZXhwZXJpbWVudGFsIGFuZCBtYXkgYmUgcmV3cml0dGVuLiAgIFZhcmlhYmxlIGxpbmthZ2UgaXMgZG9uZSB0aHJvdWdoCmZ1bmN0aW9ucyB3aGljaCBpcyBzb3J0IG9mIGEga2x1ZGdlLiAgSSBhbHNvIHRoaW5rIGl0IHdvdWxkIGJlIG5pY2UKdG8gaW1wb3J0IFNXSUcgcG9pbnRlcnMgaW50byBQeXRob24gYXMgYSBuZXcgb2JqZWN0IChpbnN0ZWFkIG9mIHN0cmluZ3MpLgpPZiBjb3Vyc2UsIHRoaXMgbmVlZHMgYSBsaXR0bGUgbW9yZSB3b3JrLgoKNS4gIEd1aWxlMwoKSWYgeW91IHJlYWxseSB3YW50IHRvIGxpdmUgb24gdGhlIGVkZ2UsIHBpY2sgdXAgYSBjb3B5IG9mIEd1aWxlLWlpaSBhbmQKcGxheSBhcm91bmQgd2l0aCB0aGlzLiAgICAgIFRoaXMgaXMgaGlnaGx5IGV4cGVyaW1lbnRhbC0tLWVzcGVjaWFsbHkgc2luY2UKSSdtIG5vdCBzdXJlIHdoYXQgdGhlIG9mZmljaWFsIHN0YXRlIG9mIEd1aWxlIGlzIHRoZXNlIGRheXMuICBUaGlzCmltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UgYXQgYW55IHRpbWUgc2hvdWxkIEkgc3VkZGVubHkgZmlndXJlIG91dCBiZXR0ZXIKd2F5cyB0byBkbyB0aGluZ3MuCgo2LiAgRXh0ZW5kaW5nIFNXSUcKClNXSUcgaXMgd3JpdHRlbiBpbiBDKysgYWx0aG91Z2ggSSB0ZW5kIHRvIHRoaW5rIG9mIHRoZSBjb2RlIGFzIG1vc3RseQpiZWluZyBBTlNJIEMgd2l0aCBhIGxpdHRsZSBpbmhlcml0YW5jZSB0aHJvd24gaW4uICAgRWFjaCB0YXJnZXQgbGFuZ3VhZ2UKaXMgaW1wbGVtZW50ZWQgYXMgYSBDKysgY2xhc3MgdGhhdCBjYW4gYmUgcGx1Z2dlZCBpbnRvIHRoZSBzeXN0ZW0uCklmIHlvdSB3YW50IHRvIGFkZCB5b3VyIG93biBtb2RpZmljYXRpb25zLCBzZWUgQXBwZW5kaXggQyBvZiB0aGUgdXNlcgptYW51YWwuICAgVGhlbiB0YWtlIGEgbG9vayBhdCB0aGUgInVzZXIiIGRpcmVjdG9yeSB3aGljaCBjb250YWlucyBzb21lCmNvZGUgZm9yIGJ1aWxkaW5nIHlvdXIgb3duIGV4dGVuaW9ucy4KCjcuIFRoZSBTV0lHIGxpYnJhcnkKClRoZSBTV0lHIGxpYnJhcnkgaXMgc3RpbGwgaW5jb21wbGV0ZS4gIFNvbWUgb2YgdGhlIGZpbGVzIG1lbnRpb25lZCBpbgp0aGUgdXNlciBtYW51YWwgYXJlIHVuYXZhaWxhYmxlLiAgICBUaGVzZSBmaWxlcyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlCndoZW4gdGhleSBhcmUgcmVhZHkuICAgU3Vic2NyaWJlIHRvIHRoZSBTV0lHIG1haWxpbmcgbGlzdCBmb3IgYW5ub3VuY2VtZW50cwphbmQgdXBkYXRlcy4KCjguIFNXSUcgRG9jdW1lbnRhdGlvbgoKSSBoYXZlIHNvbWV0aW1lcyBleHBlcmllbmNlZCBwcm9ibGVtcyB2aWV3aW5nIHRoZSBTV0lHIGRvY3VtZW50YXRpb24gaW4Kc29tZSBwb3N0c2NyaXB0IHZpZXdlcnMuICAgSG93ZXZlciwgdGhlIGRvY3VtZW50YXRpb24gc2VlbXMgdG8gcHJpbnQKbm9ybWFsbHkuICAgIEknbSB3b3JraW5nIG9uIG1ha2luZyBtdWNoIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9ubGluZSwKYnV0IHRoaXMgdGFrZXMgdGltZS4KClZlcnNpb24gMC4xIEFscGhhIChGZWJydWFyeSA5LCAxOTk2KQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCjEuICBSdW4tdGltZSB0eXBlLWNoZWNraW5nIG9mIFNXSUcgcG9pbnRlcnMuICAgUG9pbnRlcnMgYXJlIG5vdyByZXByZXNlbnRlZAogICAgYXMgc3RyaW5ncyB3aXRoIGJvdGggbnVtZXJpYyBhbmQgZW5jb2RlZCB0eXBlIGluZm9ybWF0aW9uLiAgICBUaGlzIG1ha2VzCiAgICBpdCBhIGxpdHRsZSBoYXJkZXIgdG8gc2hvb3QgeW91cnNlbGYgaW4gdGhlIGZvb3QgKGFuZCBpdCBlbGltaW5hdGVzCiAgICBzb21lIHNlZ21lbnRhdGlvbiBmYXVsdHMgYW5kIG90aGVyIG9kZGl0aWVzKS4KCjIuICBQeXRob24gMS4zIG5vdyBzdXBwb3J0ZWQuCgozLiAgI2RlZmluZSBhbmQgZW51bSBjYW4gYmUgdXNlZCB0byBpbnN0YWxsIGNvbnN0YW50cy4KCjQuICBDb21wbGV0ZWx5IHJld3JvdGUgdGhlICVpbmNsdWRlIGRpcmVjdGl2ZSBhbmQgbWFkZSBpdCBhbG90IG1vcmUgcG93ZXJmdWwuCgo1LiAgUmVzdHJ1Y3R1cmVkIHRoZSBTV0lHIGxpYnJhcnkgdG8gbWFrZSBpdCB3b3JrIGJldHRlci4KCjYuICBWYXJpb3VzIGJ1ZyBmaXhlcyB0byBUY2wsIFBlcmw0LCBQZXJsNSwgYW5kIEd1aWxlIGltcGxlbWVudGF0aW9ucy4KCjcuICBCZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YgJXR5cGVkZWYgZGlyZWN0aXZlLgoKOC4gIE1hZGUgc29tZSBjaGFuZ2VzIHRvIFNXSUcncyBjbGFzcyBzdHJ1Y3R1cmUgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZXhwYW5kLgogICAgU1dJRyBpcyBub3cgYnVpbHQgaW50byBhIGxpYnJhcnkgZmlsZSB0aGF0IHlvdSBjYW4gdXNlIHRvIG1ha2UgeW91cgogICAgb3duIGV4dGVuaW9ucy4KCjkuICBNYWRlIGV4dGVuc2l2ZSBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudGF0aW9uLgoKMTAuIE1pbm9yIGNoYW5nZXMgdG8gdGhlIFNXSUcgcGFyc2VyIHRvIG1ha2UgaXQgdXNlIGxlc3MgbWVtb3J5LgogICAgQWxzbyB0b29rIG91dCBzb21lIGV4dHJhbmVvdXMgcnVsZXMgdGhhdCB3ZXJlIHVuZG9jdW1lbnRlZCBhbmQKICAgIGRpZG4ndCB3b3JrIGluIHRoZSBmaXJzdCBwbGFjZS4KCjExLiBUaGUgU1dJRyBsaWJyYXJ5IGZpbGVzICJ0Y2xzaCIsICJ3aXNoIiwgImV4cGVjdCIsIGV0Yy4uLiBpbiB0aGUgZmlyc3QKICAgIHJlbGVhc2UgaGF2ZSBiZWVuIHJlc3RydWN0dXJlZCBhbmQgcmVuYW1lZCB0byAidGNsc2guaSIsICJ3aXNoLmkiLAogICAgYW5kIHNvIG9uLgo=